ZGlmZiAtLWdpdCBhL0JVSUxEIGIvQlVJTEQKaW5kZXggN2Y4ZDhhNDIuLmZjNGRmZTggMTAwNjQ0Ci0tLSBhL0JVSUxECisrKyBiL0JVSUxECkBAIC00MSw2NyArNDEsODIgQEAKIAogCiAKKwogY2NfbGlicmFyeSgKICAgbmFtZSA9ICJncHIiLAogICBzcmNzID0gWwotICAgICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oIiwKLSAgICAic3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIiwKLSAgICAic3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2F2bC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2NtZGxpbmUuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvY3B1X2lwaG9uZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvY3B1X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2NwdV93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9lbnZfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvZW52X3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvZy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2dfYW5kcm9pZC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2dfbGludXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvZ193aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zbGljZV9idWZmZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3luYy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N5bmNfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGhkLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aGRfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX2ludGVybmFsLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvYmFzaWNfdGltZXJzLmMiLAorICAgICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9hbGxvYy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvYXZsLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jbWRsaW5lLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfaXBob25lLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfbGludXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9saW51eC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2hpc3RvZ3JhbS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvaG9zdF9wb3J0LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19saW51eC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aGQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3Rsc19wdGhyZWFkLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC93cmFwX21lbWNweS5jIiwKICAgXSwKICAgaGRycyA9IFsKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L2FsbG9jLmgiLAogICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG0uaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bV9nY2NfYXRvbWljLmgiLApAQCAtMTMwLDIwICsxNDUsNiBAQAogICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfbXN2Yy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvdGxzX3B0aHJlYWQuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L3VzZWZ1bC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCIsCiAgIF0sCiAgIGluY2x1ZGVzID0gWwogICAgICJpbmNsdWRlIiwKQEAgLTE1NCwzMjkgKzE1NSwzMjMgQEAKICkKIAogCisKIGNjX2xpYnJhcnkoCiAgIG5hbWUgPSAiZ3JwYyIsCiAgIHNyY3MgPSBbCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29udGV4dC5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCIsCi0gICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiwKLSAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIiwKLSAgICAic3JjL2NvcmUvZGVidWcvdHJhY2UuaCIsCi0gICAgInNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIsCi0gICAgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIiwKLSAgICAic3JjL2NvcmUvaHR0cC9wYXJzZXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgiLAotICAgICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiLAotICAgICJzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgiLAotICAgICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbi5oIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX2NvbW1vbi5oIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oIiwKLSAgICAic3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiLAotICAgICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIsCi0gICAgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvaW5pdC5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWUuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHR0cDJfZXJyb3JzLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2I2NC5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIiwKLSAgICAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLAotICAgICJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIiwKLSAgICAic3JjL2NvcmUvdHNpL3NzbF90eXBlcy5oIiwKLSAgICAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIiwKLSAgICAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL21sb2cuaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGIuaCIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uaCIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuaCIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwKLSAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMiLAotICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMiLAotICAgICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmMiLAotICAgICJzcmMvY29yZS9odHRwL3BhcnNlci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmMiLAotICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9pb21nci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbi5jIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5jIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5jIiwKLSAgICAic3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2FsYXJtLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3ZlcnNpb24uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX2xpc3RzLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvd3JpdGluZy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2luaXRfc2VjdXJlLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIiwKLSAgICAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMiLAotICAgICJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKLSAgICAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2NvbnRleHQuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL29wZXJhdGlvbi5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL3RyYWNpbmcuYyIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uYyIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuYyIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odHRwMl9lcnJvcnMuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvcnBjX21ldHJpY19pZC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb24uaCIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmgiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiLAorICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvc2VydmVyX2NodHRwMi5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL3NlY3VyZS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvcGFyc2luZy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX2xpc3RzLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC93cml0aW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19jb250ZXh0LmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2luaXRpYWxpemUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvcGxhY2Vob2xkZXJzLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmMiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS92ZXJzaW9uLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyIsCiAgIF0sCiAgIGhkcnMgPSBbCi0gICAgImluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmgiLAogICAgICJpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXIuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9jZW5zdXMuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9jb21wcmVzc2lvbi5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2dycGMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9zdGF0dXMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAotICAgICJpbmNsdWRlL2dycGMvY2Vuc3VzLmgiLAorICAgICJpbmNsdWRlL2dycGMvc3RhdHVzLmgiLAogICBdLAogICBpbmNsdWRlcyA9IFsKICAgICAiaW5jbHVkZSIsCkBAIC00ODYsNiArNDgxLDcgQEAKICAgICAiLy9leHRlcm5hbDpsaWJzc2wiLAogICAgICIvL2V4dGVybmFsOnpsaWIiLAogICAgICI6Z3ByIiwKKyAgICAiLy9leHRlcm5hbDpuYW5vcGIiLAogICBdLAogICBjb3B0cyA9IFsKICAgICAiLXN0ZD1nbnU5OSIsCkBAIC00OTMsNiArNDg5LDcgQEAKICkKIAogCisKIGNjX2xpYnJhcnkoCiAgIG5hbWUgPSAiZ3JwY19jb2RlZ2VuX2xpYiIsCiAgIHNyY3MgPSBbCkBAIC01MDMsMjEgKzUwMCwyMSBAQAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2Nfc3luYy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYnl0ZV9idWZmZXIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29ubmVjdGl2aXR5X3N0YXRlLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2dycGNfdHlwZXMuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmMuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY193aW4zMi5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAogICBdLAogICBpbmNsdWRlcyA9IFsKICAgICAiaW5jbHVkZSIsCkBAIC01MjksMjk0ICs1MjYsMjg4IEBACiApCiAKIAorCiBjY19saWJyYXJ5KAogICBuYW1lID0gImdycGNfdW5zZWN1cmUiLAogICBzcmNzID0gWwotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiLAotICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsCi0gICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsCi0gICAgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiLAotICAgICJzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLAotICAgICJzcmMvY29yZS9odHRwL2h0dHBjbGkuaCIsCi0gICAgInNyYy9jb3JlL2h0dHAvcGFyc2VyLmgiLAotICAgICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmgiLAotICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9pb21nci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmgiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlLmgiLAotICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9qc29uL2pzb24uaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCIsCi0gICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiwKLSAgICAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLAotICAgICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2luaXQuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgiLAotICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsCi0gICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYi5oIiwKLSAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5oIiwKLSAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5oIiwKLSAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2VuY29kZS5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0X3Vuc2VjdXJlLmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyIsCi0gICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwKLSAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIiwKLSAgICAic3JjL2NvcmUvZGVidWcvdHJhY2UuYyIsCi0gICAgInNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIsCi0gICAgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9wYXJzZXIuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9leGVjdXRvci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9qc29uL2pzb24uYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYyIsCi0gICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvaW5pdC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyX2NodHRwMi5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL21sb2cuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmMiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmMiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZW5jb2RlLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29udGV4dC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLAorICAgICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX2NvbW1vbi5oIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiLAorICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9pbnNlY3VyZS9zZXJ2ZXJfY2h0dHAyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL29wZXJhdGlvbi5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvdHJhY2luZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMiLAorICAgICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMiLAorICAgICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmMiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbi5jIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYWxhcm0uYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdF91bnNlY3VyZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS92ZXJzaW9uLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIsCiAgIF0sCiAgIGhkcnMgPSBbCiAgICAgImluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlci5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2J5dGVfYnVmZmVyX3JlYWRlci5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2NlbnN1cy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2NvbXByZXNzaW9uLmgiLAogICAgICJpbmNsdWRlL2dycGMvZ3JwYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL3N0YXR1cy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ieXRlX2J1ZmZlci5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb21wcmVzc2lvbl90eXBlcy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb25uZWN0aXZpdHlfc3RhdGUuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vZ3JwY190eXBlcy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wcm9wYWdhdGlvbl9iaXRzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2NlbnN1cy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL3N0YXR1cy5oIiwKICAgXSwKICAgaW5jbHVkZXMgPSBbCiAgICAgImluY2x1ZGUiLApAQCAtODI0LDYgKzgxNSw3IEBACiAgIF0sCiAgIGRlcHMgPSBbCiAgICAgIjpncHIiLAorICAgICIvL2V4dGVybmFsOm5hbm9wYiIsCiAgIF0sCiAgIGNvcHRzID0gWwogICAgICItc3RkPWdudTk5IiwKQEAgLTgzMSwxMSArODIzLDEyIEBACiApCiAKIAorCiBjY19saWJyYXJ5KAogICBuYW1lID0gImdycGNfem9va2VlcGVyIiwKICAgc3JjcyA9IFsKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvem9va2VlcGVyX3Jlc29sdmVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYyIsCiAgIF0sCiAgIGhkcnMgPSBbCiAgICAgImluY2x1ZGUvZ3JwYy9ncnBjX3pvb2tlZXBlci5oIiwKQEAgLTg1MSwyNCArODQ0LDE4IEBACiApCiAKIAorCiBjY19saWJyYXJ5KAogICBuYW1lID0gImdycGMrKyIsCiAgIHNyY3MgPSBbCisgICAgInNyYy9jcHAvY2xpZW50L2NyZWF0ZV9jaGFubmVsX2ludGVybmFsLmgiLAogICAgICJzcmMvY3BwL2NsaWVudC9zZWN1cmVfY3JlZGVudGlhbHMuaCIsCiAgICAgInNyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5oIiwKLSAgICAic3JjL2NwcC9jb21tb24vc2VjdXJlX2F1dGhfY29udGV4dC5oIiwKLSAgICAic3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5oIiwKLSAgICAic3JjL2NwcC9jbGllbnQvY3JlYXRlX2NoYW5uZWxfaW50ZXJuYWwuaCIsCi0gICAgInNyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5oIiwKICAgICAic3JjL2NwcC9jb21tb24vY3JlYXRlX2F1dGhfY29udGV4dC5oIiwKKyAgICAic3JjL2NwcC9jb21tb24vc2VjdXJlX2F1dGhfY29udGV4dC5oIiwKICAgICAic3JjL2NwcC9zZXJ2ZXIvZHluYW1pY190aHJlYWRfcG9vbC5oIiwKKyAgICAic3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5oIiwKICAgICAic3JjL2NwcC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfaW50ZXJmYWNlLmgiLAotICAgICJzcmMvY3BwL2NsaWVudC9zZWN1cmVfY3JlZGVudGlhbHMuY2MiLAotICAgICJzcmMvY3BwL2NvbW1vbi9hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yLmNjIiwKLSAgICAic3JjL2NwcC9jb21tb24vc2VjdXJlX2F1dGhfY29udGV4dC5jYyIsCi0gICAgInNyYy9jcHAvY29tbW9uL3NlY3VyZV9jaGFubmVsX2FyZ3VtZW50cy5jYyIsCi0gICAgInNyYy9jcHAvY29tbW9uL3NlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIiwKLSAgICAic3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5jYyIsCiAgICAgInNyYy9jcHAvY2xpZW50L2NoYW5uZWwuY2MiLAogICAgICJzcmMvY3BwL2NsaWVudC9jbGllbnRfY29udGV4dC5jYyIsCiAgICAgInNyYy9jcHAvY2xpZW50L2NyZWF0ZV9jaGFubmVsLmNjIiwKQEAgLTg3NiwxNCArODYzLDIxIEBACiAgICAgInNyYy9jcHAvY2xpZW50L2NyZWRlbnRpYWxzLmNjIiwKICAgICAic3JjL2NwcC9jbGllbnQvZ2VuZXJpY19zdHViLmNjIiwKICAgICAic3JjL2NwcC9jbGllbnQvaW5zZWN1cmVfY3JlZGVudGlhbHMuY2MiLAorICAgICJzcmMvY3BwL2NsaWVudC9zZWN1cmVfY3JlZGVudGlhbHMuY2MiLAorICAgICJzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIiwKKyAgICAic3JjL2NwcC9jb21tb24vYXV0aF9wcm9wZXJ0eV9pdGVyYXRvci5jYyIsCiAgICAgInNyYy9jcHAvY29tbW9uL2NoYW5uZWxfYXJndW1lbnRzLmNjIiwKICAgICAic3JjL2NwcC9jb21tb24vY29tcGxldGlvbl9xdWV1ZS5jYyIsCiAgICAgInNyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5jYyIsCiAgICAgInNyYy9jcHAvY29tbW9uL3JwY19tZXRob2QuY2MiLAorICAgICJzcmMvY3BwL2NvbW1vbi9zZWN1cmVfYXV0aF9jb250ZXh0LmNjIiwKKyAgICAic3JjL2NwcC9jb21tb24vc2VjdXJlX2NoYW5uZWxfYXJndW1lbnRzLmNjIiwKKyAgICAic3JjL2NwcC9jb21tb24vc2VjdXJlX2NyZWF0ZV9hdXRoX2NvbnRleHQuY2MiLAogICAgICJzcmMvY3BwL3NlcnZlci9hc3luY19nZW5lcmljX3NlcnZpY2UuY2MiLAogICAgICJzcmMvY3BwL3NlcnZlci9jcmVhdGVfZGVmYXVsdF90aHJlYWRfcG9vbC5jYyIsCiAgICAgInNyYy9jcHAvc2VydmVyL2R5bmFtaWNfdGhyZWFkX3Bvb2wuY2MiLAogICAgICJzcmMvY3BwL3NlcnZlci9pbnNlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MiLAorICAgICJzcmMvY3BwL3NlcnZlci9zZWN1cmVfc2VydmVyX2NyZWRlbnRpYWxzLmNjIiwKICAgICAic3JjL2NwcC9zZXJ2ZXIvc2VydmVyLmNjIiwKICAgICAic3JjL2NwcC9zZXJ2ZXIvc2VydmVyX2J1aWxkZXIuY2MiLAogICAgICJzcmMvY3BwL3NlcnZlci9zZXJ2ZXJfY29udGV4dC5jYyIsCkBAIC04OTMsNyArODg3LDYgQEAKICAgICAic3JjL2NwcC91dGlsL3N0YXR1cy5jYyIsCiAgICAgInNyYy9jcHAvdXRpbC9zdHJpbmdfcmVmLmNjIiwKICAgICAic3JjL2NwcC91dGlsL3RpbWUuY2MiLAotICAgICJzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIiwKICAgXSwKICAgaGRycyA9IFsKICAgICAiaW5jbHVkZS9ncnBjKysvYWxhcm0uaCIsCkBAIC05MDYsNiArODk5LDM3IEBACiAgICAgImluY2x1ZGUvZ3JwYysrL2dycGMrKy5oIiwKICAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jYWxsLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NsaWVudF91bmFyeV9jYWxsLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfdW5hcnlfY2FsbC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGwuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jaGFubmVsX2ludGVyZmFjZS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF9jb250ZXh0LmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb21wbGV0aW9uX3F1ZXVlLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29tcGxldGlvbl9xdWV1ZV90YWcuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWdfcHJvdG9idWYuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb3JlX2NvZGVnZW5faW50ZXJmYWNlLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vbWV0aG9kX2hhbmRsZXJfaW1wbC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3Byb3RvX3V0aWxzLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3JwY19zZXJ2aWNlX21ldGhvZC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlY3VyaXR5L2F1dGhfY29udGV4dC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmVyX2NvbnRleHQuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfaW50ZXJmYWNlLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdHViX29wdGlvbnMuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfbm9fY3h4MTEuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCIsCiAgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvZ3JwY19saWJyYXJ5LmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL21ldGhvZF9oYW5kbGVyX2ltcGwuaCIsCiAgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvcHJvdG9fdXRpbHMuaCIsCkBAIC05NDAsMzcgKzk2NCw2IEBACiAgICAgImluY2x1ZGUvZ3JwYysrL3N1cHBvcnQvc3R1Yl9vcHRpb25zLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N5bmNfc3RyZWFtLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3RpbWUuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY19zdHJlYW0uaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2FsbC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGxfaG9vay5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X2NvbnRleHQuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jbGllbnRfdW5hcnlfY2FsbC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb21wbGV0aW9uX3F1ZXVlX3RhZy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvcmVfY29kZWdlbl9pbnRlcmZhY2UuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9ncnBjX2xpYnJhcnkuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcHJvdG9fdXRpbHMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9ycGNfbWV0aG9kLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VjdXJpdHkvYXV0aF9jb250ZXh0LmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VyaWFsaXphdGlvbl90cmFpdHMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZlcl9pbnRlcmZhY2UuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2aWNlX3R5cGUuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RyaW5nX3JlZi5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX2N4eDExLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vdGltZS5oIiwKICAgXSwKICAgaW5jbHVkZXMgPSBbCiAgICAgImluY2x1ZGUiLApAQCAtOTg0LDMyICs5NzcsMTMgQEAKICkKIAogCisKIGNjX2xpYnJhcnkoCiAgIG5hbWUgPSAiZ3JwYysrX2NvZGVnZW5fbGliIiwKICAgc3JjcyA9IFsKICAgICAic3JjL2NwcC9jb2RlZ2VuL2NvZGVnZW5faW5pdC5jYyIsCiAgIF0sCiAgIGhkcnMgPSBbCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYWxsb2MuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2Nfc3luYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY193aW4zMi5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfdW5hcnlfY2FsbC5oIiwKICAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGwuaCIsCkBAIC0xMDQxLDE2ICsxMDE1LDM4IEBACiAgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX25vX2N4eDExLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19zdHJlYW0uaCIsCiAgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi90aW1lLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oIiwKICAgXSwKICAgaW5jbHVkZXMgPSBbCiAgICAgImluY2x1ZGUiLAogICAgICIuIiwKICAgXSwKICAgZGVwcyA9IFsKKyAgICAiLy9leHRlcm5hbDpwcm90b2J1Zl9jbGliIiwKICAgXSwKICkKIAogCisKIGNjX2xpYnJhcnkoCiAgIG5hbWUgPSAiZ3JwYysrX3Vuc2VjdXJlIiwKICAgc3JjcyA9IFsKQEAgLTEwNTksNyArMTA1NSw2IEBACiAgICAgInNyYy9jcHAvY29tbW9uL2NyZWF0ZV9hdXRoX2NvbnRleHQuaCIsCiAgICAgInNyYy9jcHAvc2VydmVyL2R5bmFtaWNfdGhyZWFkX3Bvb2wuaCIsCiAgICAgInNyYy9jcHAvc2VydmVyL3RocmVhZF9wb29sX2ludGVyZmFjZS5oIiwKLSAgICAic3JjL2NwcC9jb21tb24vaW5zZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyIsCiAgICAgInNyYy9jcHAvY2xpZW50L2NoYW5uZWwuY2MiLAogICAgICJzcmMvY3BwL2NsaWVudC9jbGllbnRfY29udGV4dC5jYyIsCiAgICAgInNyYy9jcHAvY2xpZW50L2NyZWF0ZV9jaGFubmVsLmNjIiwKQEAgLTEwNjcsOSArMTA2MiwxMSBAQAogICAgICJzcmMvY3BwL2NsaWVudC9jcmVkZW50aWFscy5jYyIsCiAgICAgInNyYy9jcHAvY2xpZW50L2dlbmVyaWNfc3R1Yi5jYyIsCiAgICAgInNyYy9jcHAvY2xpZW50L2luc2VjdXJlX2NyZWRlbnRpYWxzLmNjIiwKKyAgICAic3JjL2NwcC9jb2RlZ2VuL2NvZGVnZW5faW5pdC5jYyIsCiAgICAgInNyYy9jcHAvY29tbW9uL2NoYW5uZWxfYXJndW1lbnRzLmNjIiwKICAgICAic3JjL2NwcC9jb21tb24vY29tcGxldGlvbl9xdWV1ZS5jYyIsCiAgICAgInNyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5jYyIsCisgICAgInNyYy9jcHAvY29tbW9uL2luc2VjdXJlX2NyZWF0ZV9hdXRoX2NvbnRleHQuY2MiLAogICAgICJzcmMvY3BwL2NvbW1vbi9ycGNfbWV0aG9kLmNjIiwKICAgICAic3JjL2NwcC9zZXJ2ZXIvYXN5bmNfZ2VuZXJpY19zZXJ2aWNlLmNjIiwKICAgICAic3JjL2NwcC9zZXJ2ZXIvY3JlYXRlX2RlZmF1bHRfdGhyZWFkX3Bvb2wuY2MiLApAQCAtMTA4NCw3ICsxMDgxLDYgQEAKICAgICAic3JjL2NwcC91dGlsL3N0YXR1cy5jYyIsCiAgICAgInNyYy9jcHAvdXRpbC9zdHJpbmdfcmVmLmNjIiwKICAgICAic3JjL2NwcC91dGlsL3RpbWUuY2MiLAotICAgICJzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIiwKICAgXSwKICAgaGRycyA9IFsKICAgICAiaW5jbHVkZS9ncnBjKysvYWxhcm0uaCIsCkBAIC0xMDk3LDYgKzEwOTMsMzcgQEAKICAgICAiaW5jbHVkZS9ncnBjKysvZ3JwYysrLmgiLAogICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NhbGwuaCIsCiAgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY2xpZW50X3VuYXJ5X2NhbGwuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY19zdHJlYW0uaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2FsbC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGxfaG9vay5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X2NvbnRleHQuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jbGllbnRfdW5hcnlfY2FsbC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb21wbGV0aW9uX3F1ZXVlX3RhZy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvcmVfY29kZWdlbl9pbnRlcmZhY2UuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9ncnBjX2xpYnJhcnkuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcHJvdG9fdXRpbHMuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9ycGNfbWV0aG9kLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VjdXJpdHkvYXV0aF9jb250ZXh0LmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VyaWFsaXphdGlvbl90cmFpdHMuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZlcl9pbnRlcmZhY2UuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2aWNlX3R5cGUuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RyaW5nX3JlZi5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmMuaCIsCisgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX2N4eDExLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmgiLAorICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vdGltZS5oIiwKICAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9ncnBjX2xpYnJhcnkuaCIsCiAgICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvbWV0aG9kX2hhbmRsZXJfaW1wbC5oIiwKICAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9wcm90b191dGlscy5oIiwKQEAgLTExMzEsMzcgKzExNTgsNiBAQAogICAgICJpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N0dWJfb3B0aW9ucy5oIiwKICAgICAiaW5jbHVkZS9ncnBjKysvc3VwcG9ydC9zeW5jX3N0cmVhbS5oIiwKICAgICAiaW5jbHVkZS9ncnBjKysvc3VwcG9ydC90aW1lLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfdW5hcnlfY2FsbC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGwuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jaGFubmVsX2ludGVyZmFjZS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF9jb250ZXh0LmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb21wbGV0aW9uX3F1ZXVlLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29tcGxldGlvbl9xdWV1ZV90YWcuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWdfcHJvdG9idWYuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb3JlX2NvZGVnZW5faW50ZXJmYWNlLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vbWV0aG9kX2hhbmRsZXJfaW1wbC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3Byb3RvX3V0aWxzLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3JwY19zZXJ2aWNlX21ldGhvZC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlY3VyaXR5L2F1dGhfY29udGV4dC5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmVyX2NvbnRleHQuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfaW50ZXJmYWNlLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdHViX29wdGlvbnMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jLmgiLAotICAgICJpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfbm9fY3h4MTEuaCIsCi0gICAgImluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCIsCiAgIF0sCiAgIGluY2x1ZGVzID0gWwogICAgICJpbmNsdWRlIiwKQEAgLTExNzUsNiArMTE3MSw3IEBACiApCiAKIAorCiBjY19saWJyYXJ5KAogICBuYW1lID0gImdycGNfcGx1Z2luX3N1cHBvcnQiLAogICBzcmNzID0gWwpAQCAtMTIyNiw2ICsxMjIzLDcgQEAKICkKIAogCisKIGNjX2xpYnJhcnkoCiAgIG5hbWUgPSAiZ3JwY19jc2hhcnBfZXh0IiwKICAgc3JjcyA9IFsKQEAgLTEyNDUsNTUgKzEyNDMsNzAgQEAKIAogCiAKKwogb2JqY19saWJyYXJ5KAogICBuYW1lID0gImdwcl9vYmpjIiwKICAgc3JjcyA9IFsKLSAgICAic3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIiwKLSAgICAic3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2F2bC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2NtZGxpbmUuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvY3B1X2lwaG9uZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvY3B1X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2NwdV93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9lbnZfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvZW52X3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvZy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2dfYW5kcm9pZC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2dfbGludXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvZ193aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zbGljZV9idWZmZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3luYy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N5bmNfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGhkLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aGRfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvc3RhcF90aW1lcnMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2FsbG9jLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2NtZGxpbmUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9saW51eC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X2xpbnV4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvaGlzdG9ncmFtLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9ob3N0X3BvcnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfYW5kcm9pZC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ193aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3dyYXBfbWVtY3B5LmMiLAogICBdLAogICBoZHJzID0gWworICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvYWxsb2MuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvYXRtX2djY19hdG9taWMuaCIsCkBAIC0xMzIyLDMyICsxMzM1LDE4IEBACiAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19tc3ZjLmgiLAogICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfcHRocmVhZC5oIiwKICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oIiwKLSAgICAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiLAogICBdLAogICBpbmNsdWRlcyA9IFsKICAgICAiaW5jbHVkZSIsCkBAIC0xMzU4LDMyOSArMTM1NywzMjMgQEAKICkKIAogCisKIG9iamNfbGlicmFyeSgKICAgbmFtZSA9ICJncnBjX29iamMiLAogICBzcmNzID0gWwotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyIsCi0gICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwKLSAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIiwKLSAgICAic3JjL2NvcmUvZGVidWcvdHJhY2UuYyIsCi0gICAgInNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIsCi0gICAgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9wYXJzZXIuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9leGVjdXRvci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9qc29uL2pzb24uYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYyIsCi0gICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvaW5pdC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyX2NodHRwMi5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIsCi0gICAgInNyYy9jb3JlL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2I2NC5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYyIsCi0gICAgInNyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKLSAgICAic3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyIsCi0gICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL21sb2cuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmMiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmMiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZW5jb2RlLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvc2VydmVyX2NodHRwMi5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL3NlY3VyZS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvcGFyc2luZy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX2xpc3RzLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC93cml0aW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19jb250ZXh0LmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2luaXRpYWxpemUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvcGxhY2Vob2xkZXJzLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmMiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS92ZXJzaW9uLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyIsCiAgIF0sCiAgIGhkcnMgPSBbCi0gICAgImluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmgiLAogICAgICJpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXIuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9jZW5zdXMuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9jb21wcmVzc2lvbi5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2dycGMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9zdGF0dXMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLAotICAgICJpbmNsdWRlL2dycGMvY2Vuc3VzLmgiLAotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiLAotICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsCi0gICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsCi0gICAgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiLAotICAgICJzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLAotICAgICJzcmMvY29yZS9odHRwL2h0dHBjbGkuaCIsCi0gICAgInNyYy9jb3JlL2h0dHAvcGFyc2VyLmgiLAotICAgICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiLAotICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmgiLAotICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9pb21nci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmgiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlLmgiLAotICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9qc29uL2pzb24uaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCIsCi0gICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiwKLSAgICAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLAotICAgICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2luaXQuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9iNjQuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIsCi0gICAgInNyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIiwKLSAgICAic3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIsCi0gICAgInNyYy9jb3JlL3RzaS9zc2xfdHlwZXMuaCIsCi0gICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIsCi0gICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiLAotICAgICJzcmMvY29yZS9jZW5zdXMvYWdncmVnYXRpb24uaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9tbG9nLmgiLAotICAgICJzcmMvY29yZS9jZW5zdXMvcnBjX21ldHJpY19pZC5oIiwKLSAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiLmgiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmgiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmgiLAotICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZW5jb2RlLmgiLAorICAgICJpbmNsdWRlL2dycGMvc3RhdHVzLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29udGV4dC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLAorICAgICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX2NvbW1vbi5oIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL3NzbF90eXBlcy5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIiwKICAgXSwKICAgaW5jbHVkZXMgPSBbCiAgICAgImluY2x1ZGUiLApAQCAtMTY4OSw2ICsxNjgyLDcgQEAKICAgZGVwcyA9IFsKICAgICAiOmdwcl9vYmpjIiwKICAgICAiLy9leHRlcm5hbDpsaWJzc2xfb2JqYyIsCisgICAgIi8vZXh0ZXJuYWw6bmFub3BiIiwKICAgXSwKICAgc2RrX2R5bGlicyA9IFsibGlieiJdLAogKQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCA2YzEwMGY2Li4yMjg2YWJlIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtOTUsNiArOTUsMTYgQEAKIENQUEZMQUdTX29wdCA9IC1PMgogREVGSU5FU19vcHQgPSBOREVCVUcKIAorVkFMSURfQ09ORklHX2FzYW4tdHJhY2UtY21wID0gMQorUkVRVUlSRV9DVVNUT01fTElCUkFSSUVTX2FzYW4tdHJhY2UtY21wID0gMQorQ0NfYXNhbi10cmFjZS1jbXAgPSBjbGFuZworQ1hYX2FzYW4tdHJhY2UtY21wID0gY2xhbmcrKworTERfYXNhbi10cmFjZS1jbXAgPSBjbGFuZworTERYWF9hc2FuLXRyYWNlLWNtcCA9IGNsYW5nKysKK0NQUEZMQUdTX2FzYW4tdHJhY2UtY21wID0gLU8wIC1mc2FuaXRpemUtY292ZXJhZ2U9ZWRnZSAtZnNhbml0aXplLWNvdmVyYWdlPXRyYWNlLWNtcCAtZnNhbml0aXplPWFkZHJlc3MgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLVduby11bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtZW50IC1ER1BSX05PX0RJUkVDVF9TWVNDQUxMUworTERGTEFHU19hc2FuLXRyYWNlLWNtcCA9IC1mc2FuaXRpemU9YWRkcmVzcworREVGSU5FU19hc2FuLXRyYWNlLWNtcCArPSBHUlBDX1RFU1RfU0xPV0RPV05fQlVJTERfRkFDVE9SPTMKKwogVkFMSURfQ09ORklHX2RiZyA9IDEKIENDX2RiZyA9ICQoREVGQVVMVF9DQykKIENYWF9kYmcgPSAkKERFRkFVTFRfQ1hYKQpAQCAtMTA5LDcgKzExOSw3IEBACiBDWFhfZWFzYW4gPSBjbGFuZysrCiBMRF9lYXNhbiA9IGNsYW5nCiBMRFhYX2Vhc2FuID0gY2xhbmcrKwotQ1BQRkxBR1NfZWFzYW4gPSAtTzAgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKK0NQUEZMQUdTX2Vhc2FuID0gLU8wIC1mc2FuaXRpemUtY292ZXJhZ2U9ZWRnZSAtZnNhbml0aXplPWFkZHJlc3MgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLVduby11bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtZW50IC1ER1BSX05PX0RJUkVDVF9TWVNDQUxMUwogTERGTEFHU19lYXNhbiA9IC1mc2FuaXRpemU9YWRkcmVzcwogREVGSU5FU19lYXNhbiA9IF9ERUJVRyBERUJVRyBHUlBDX0VYRUNVVElPTl9DT05URVhUX1NBTklUSVpFUgogREVGSU5FU19lYXNhbiArPSBHUlBDX1RFU1RfU0xPV0RPV05fQlVJTERfRkFDVE9SPTMKQEAgLTEyMCw3ICsxMzAsNyBAQAogQ1hYX2FzYW4gPSBjbGFuZysrCiBMRF9hc2FuID0gY2xhbmcKIExEWFhfYXNhbiA9IGNsYW5nKysKLUNQUEZMQUdTX2FzYW4gPSAtTzAgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKK0NQUEZMQUdTX2FzYW4gPSAtTzAgLWZzYW5pdGl6ZS1jb3ZlcmFnZT1lZGdlIC1mc2FuaXRpemU9YWRkcmVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQgLURHUFJfTk9fRElSRUNUX1NZU0NBTExTCiBMREZMQUdTX2FzYW4gPSAtZnNhbml0aXplPWFkZHJlc3MKIERFRklORVNfYXNhbiArPSBHUlBDX1RFU1RfU0xPV0RPV05fQlVJTERfRkFDVE9SPTMKIApAQCAtMTMwLDcgKzE0MCw3IEBACiBDWFhfbXNhbiA9IGNsYW5nKysKIExEX21zYW4gPSBjbGFuZwogTERYWF9tc2FuID0gY2xhbmcrKwotQ1BQRkxBR1NfbXNhbiA9IC1PMCAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1ER1RFU1RfSEFTX1RSMV9UVVBMRT0wIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MSAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQgLWZQSUUgLXBpZSAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKK0NQUEZMQUdTX21zYW4gPSAtTzAgLWZzYW5pdGl6ZS1jb3ZlcmFnZT1lZGdlIC1mc2FuaXRpemU9bWVtb3J5IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLURHVEVTVF9IQVNfVFIxX1RVUExFPTAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAtZlBJRSAtcGllIC1ER1BSX05PX0RJUkVDVF9TWVNDQUxMUwogTERGTEFHU19tc2FuID0gLWZzYW5pdGl6ZT1tZW1vcnkgLURHVEVTVF9IQVNfVFIxX1RVUExFPTAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xIC1mUElFIC1waWUgJChpZiAkKEpFTktJTlNfQlVJTEQpLC1XbCQoY29tbWEpLVR0ZXh0LXNlZ21lbnQ9MHg3ZTAwMDAwMDAwMDAsKQogREVGSU5FU19tc2FuID0gTkRFQlVHCiBERUZJTkVTX21zYW4gKz0gR1JQQ19URVNUX1NMT1dET1dOX0JVSUxEX0ZBQ1RPUj00CkBAIC0xNTksNyArMTY5LDcgQEAKIENYWF9hc2FuLW5vbGVha3MgPSBjbGFuZysrCiBMRF9hc2FuLW5vbGVha3MgPSBjbGFuZwogTERYWF9hc2FuLW5vbGVha3MgPSBjbGFuZysrCi1DUFBGTEFHU19hc2FuLW5vbGVha3MgPSAtTzAgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKK0NQUEZMQUdTX2FzYW4tbm9sZWFrcyA9IC1PMCAtZnNhbml0aXplLWNvdmVyYWdlPWVkZ2UgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKIExERkxBR1NfYXNhbi1ub2xlYWtzID0gLWZzYW5pdGl6ZT1hZGRyZXNzCiBERUZJTkVTX2FzYW4tbm9sZWFrcyArPSBHUlBDX1RFU1RfU0xPV0RPV05fQlVJTERfRkFDVE9SPTMKIApAQCAtMTc3LDcgKzE4Nyw3IEBACiBDWFhfdWJzYW4gPSBjbGFuZysrCiBMRF91YnNhbiA9IGNsYW5nCiBMRFhYX3Vic2FuID0gY2xhbmcrKwotQ1BQRkxBR1NfdWJzYW4gPSAtTzEgLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLVduby11bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtZW50CitDUFBGTEFHU191YnNhbiA9IC1PMSAtZnNhbml0aXplLWNvdmVyYWdlPWVkZ2UgLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLVduby11bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtZW50CiBMREZMQUdTX3Vic2FuID0gLWZzYW5pdGl6ZT11bmRlZmluZWQKIERFRklORVNfdWJzYW4gPSBOREVCVUcKIERFRklORVNfdWJzYW4gKz0gR1JQQ19URVNUX1NMT1dET1dOX0JVSUxEX0ZBQ1RPUj0xLjUKQEAgLTkyNSwxNCArOTM1LDE3IEBACiBncnBjX3ByaW50X2dvb2dsZV9kZWZhdWx0X2NyZWRzX3Rva2VuOiAkKEJJTkRJUikvJChDT05GSUcpL2dycGNfcHJpbnRfZ29vZ2xlX2RlZmF1bHRfY3JlZHNfdG9rZW4KIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdGVzdAogZ3JwY192ZXJpZnlfand0OiAkKEJJTkRJUikvJChDT05GSUcpL2dycGNfdmVyaWZ5X2p3dAoraHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0OiAkKEJJTkRJUikvJChDT05GSUcpL2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdAogaHBhY2tfcGFyc2VyX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvaHBhY2tfcGFyc2VyX3Rlc3QKIGhwYWNrX3RhYmxlX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvaHBhY2tfdGFibGVfdGVzdAoraHR0cF9mdXp6ZXJfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS9odHRwX2Z1enplcl90ZXN0CiBodHRwX3BhcnNlcl90ZXN0OiAkKEJJTkRJUikvJChDT05GSUcpL2h0dHBfcGFyc2VyX3Rlc3QKIGh0dHBjbGlfZm9ybWF0X3JlcXVlc3RfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS9odHRwY2xpX2Zvcm1hdF9yZXF1ZXN0X3Rlc3QKIGh0dHBjbGlfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS9odHRwY2xpX3Rlc3QKIGh0dHBzY2xpX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvaHR0cHNjbGlfdGVzdAogaW5pdF90ZXN0OiAkKEJJTkRJUikvJChDT05GSUcpL2luaXRfdGVzdAogaW52YWxpZF9jYWxsX2FyZ3VtZW50X3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvaW52YWxpZF9jYWxsX2FyZ3VtZW50X3Rlc3QKK2pzb25fZnV6emVyX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvanNvbl9mdXp6ZXJfdGVzdAoganNvbl9yZXdyaXRlOiAkKEJJTkRJUikvJChDT05GSUcpL2pzb25fcmV3cml0ZQoganNvbl9yZXdyaXRlX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvanNvbl9yZXdyaXRlX3Rlc3QKIGpzb25fc3RyZWFtX2Vycm9yX3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvanNvbl9zdHJlYW1fZXJyb3JfdGVzdApAQCAtOTY2LDYgKzk3OSw3IEBACiB0cmFuc3BvcnRfbWV0YWRhdGFfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS90cmFuc3BvcnRfbWV0YWRhdGFfdGVzdAogdHJhbnNwb3J0X3NlY3VyaXR5X3Rlc3Q6ICQoQklORElSKS8kKENPTkZJRykvdHJhbnNwb3J0X3NlY3VyaXR5X3Rlc3QKIHVkcF9zZXJ2ZXJfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS91ZHBfc2VydmVyX3Rlc3QKK3VyaV9mdXp6ZXJfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS91cmlfZnV6emVyX3Rlc3QKIHVyaV9wYXJzZXJfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS91cmlfcGFyc2VyX3Rlc3QKIHdvcmtxdWV1ZV90ZXN0OiAkKEJJTkRJUikvJChDT05GSUcpL3dvcmtxdWV1ZV90ZXN0CiBhbGFybV9jcHBfdGVzdDogJChCSU5ESVIpLyQoQ09ORklHKS9hbGFybV9jcHBfdGVzdApAQCAtMjI2OCw1MiArMjI4Miw2NiBAQAogCiAKIExJQkdQUl9TUkMgPSBcCi0gICAgc3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIFwKLSAgICBzcmMvY29yZS9wcm9maWxpbmcvc3RhcF90aW1lcnMuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2F2bC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvY3B1X2lwaG9uZS5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2NwdV9saW51eC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2NwdV93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvZW52X2xpbnV4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvZW52X3dpbjMyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvaGlzdG9ncmFtLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbG9nLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9sb2dfbGludXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9sb2dfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3NsaWNlLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3luYy5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3N5bmNfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGhkLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGhkX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGltZS5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3RpbWVfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC90aW1lX3dpbjMyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3dyYXBfbWVtY3B5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9wcm9maWxpbmcvYmFzaWNfdGltZXJzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9wcm9maWxpbmcvc3RhcF90aW1lcnMuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvYWxsb2MuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvYXZsLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfaXBob25lLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9saW51eC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X2xpbnV4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfd2luMzIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvaGlzdG9ncmFtLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19saW51eC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90aGQuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF93aW4zMi5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfd2luMzIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3dyYXBfbWVtY3B5LmMgXAogCiBQVUJMSUNfSEVBREVSU19DICs9IFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmggXAogICAgIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L2FsbG9jLmggXAogICAgIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bS5oIFwKICAgICBpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG1fZ2NjX2F0b21pYy5oIFwKQEAgLTIzNDIsMjAgKzIzNzAsNiBAQAogICAgIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19tc3ZjLmggXAogICAgIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19wdGhyZWFkLmggXAogICAgIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L3VzZWZ1bC5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmggXAogCiBMSUJHUFJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkdQUl9TUkMpKSkpCiAKQEAgLTIzOTcsNiArMjQxMSw3IEBACiBMSUJHUFJfVEVTVF9VVElMX1NSQyA9IFwKICAgICB0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkdQUl9URVNUX1VUSUxfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkdQUl9URVNUX1VUSUxfU1JDKSkpKQogCkBAIC0yNDE5LDE4NSArMjQzNCwxODUgQEAKIAogCiBMSUJHUlBDX1NSQyA9IFwKLSAgICBzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyBcCi0gICAgc3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMgXAotICAgIHNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyBcCi0gICAgc3JjL2NvcmUvZGVidWcvdHJhY2UuYyBcCi0gICAgc3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIFwKLSAgICBzcmMvY29yZS9odHRwL2h0dHBjbGkuYyBcCi0gICAgc3JjL2NvcmUvaHR0cC9wYXJzZXIuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jIFwKLSAgICBzcmMvY29yZS9pb21nci9lbmRwb2ludC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9leGVjX2N0eC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9leGVjdXRvci5jIFwKLSAgICBzcmMvY29yZS9pb21nci9mZF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RpbWVyLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5jIFwKLSAgICBzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jIFwKLSAgICBzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jIFwKLSAgICBzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2pzb24vanNvbi5jIFwKLSAgICBzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmMgXAotICAgIHNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyBcCi0gICAgc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5jIFwKLSAgICBzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2FsbC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvaW5pdC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbGlzdHMuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIFwKLSAgICBzcmMvY29yZS9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgXAotICAgIHNyYy9jb3JlL3NlY3VyaXR5L2I2NC5jIFwKLSAgICBzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMgXAotICAgIHNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMgXAotICAgIHNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jIFwKLSAgICBzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jIFwKLSAgICBzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIFwKLSAgICBzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCi0gICAgc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCi0gICAgc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvY29udGV4dC5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvbWxvZy5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvb3BlcmF0aW9uLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyBcCi0gICAgc3JjL2NvcmUvY2Vuc3VzL3RyYWNpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L2luc2VjdXJlL2NoYW5uZWxfY3JlYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9pbnNlY3VyZS9zZXJ2ZXJfY2h0dHAyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvd3JpdGluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIFwKKyAgICBzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIFwKKyAgICBzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMgXAorICAgIHNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9pb21nci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90aW1lci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2pzb24vanNvbi5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jIFwKKyAgICBzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgXAorICAgIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMgXAorICAgIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyBcCisgICAgc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIFwKKyAgICBzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCisgICAgc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCiAgICAgdGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5jIFwKICAgICB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmMgXAogICAgIHRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuYyBcCiAKIFBVQkxJQ19IRUFERVJTX0MgKz0gXAotICAgIGluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmggXAogICAgIGluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlci5oIFwKICAgICBpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXJfcmVhZGVyLmggXAorICAgIGluY2x1ZGUvZ3JwYy9jZW5zdXMuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2NvbXByZXNzaW9uLmggXAogICAgIGluY2x1ZGUvZ3JwYy9ncnBjLmggXAotICAgIGluY2x1ZGUvZ3JwYy9zdGF0dXMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2dycGNfc2VjdXJpdHkuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ieXRlX2J1ZmZlci5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29ubmVjdGl2aXR5X3N0YXRlLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vZ3JwY190eXBlcy5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2NlbnN1cy5oIFwKKyAgICBpbmNsdWRlL2dycGMvc3RhdHVzLmggXAogCiBMSUJHUlBDX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJHUlBDX1NSQykpKSkKIApAQCAtMjY1OSwyMSArMjY3NCwyMSBAQAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ieXRlX2J1ZmZlci5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29ubmVjdGl2aXR5X3N0YXRlLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vZ3JwY190eXBlcy5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wcm9wYWdhdGlvbl9iaXRzLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYnl0ZV9idWZmZXIuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb21wcmVzc2lvbl90eXBlcy5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2dycGNfdHlwZXMuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wcm9wYWdhdGlvbl9iaXRzLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmggXAogCiBMSUJHUlBDX0NPREVHRU5fTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJHUlBDX0NPREVHRU5fTElCX1NSQykpKSkKIApAQCAtMjY5NiwxMyArMjcxMSwxMyBAQAogCiAKIExJQkdSUENfVEVTVF9VVElMX1NSQyA9IFwKKyAgICB0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5jIFwKICAgICB0ZXN0L2NvcmUvZW5kMmVuZC9kYXRhL3NlcnZlcjFfY2VydC5jIFwKICAgICB0ZXN0L2NvcmUvZW5kMmVuZC9kYXRhL3NlcnZlcjFfa2V5LmMgXAogICAgIHRlc3QvY29yZS9lbmQyZW5kL2RhdGEvdGVzdF9yb290X2NlcnQuYyBcCi0gICAgdGVzdC9jb3JlL3NlY3VyaXR5L29hdXRoMl91dGlscy5jIFwKLSAgICB0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5jIFwKICAgICB0ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9wcm94eS5jIFwKICAgICB0ZXN0L2NvcmUvaW9tZ3IvZW5kcG9pbnRfdGVzdHMuYyBcCisgICAgdGVzdC9jb3JlL3NlY3VyaXR5L29hdXRoMl91dGlscy5jIFwKICAgICB0ZXN0L2NvcmUvdXRpbC9ncnBjX3Byb2ZpbGVyLmMgXAogICAgIHRlc3QvY29yZS91dGlsL3BhcnNlX2hleHN0cmluZy5jIFwKICAgICB0ZXN0L2NvcmUvdXRpbC9wb3J0X3Bvc2l4LmMgXApAQCAtMjc4MCwxNDcgKzI3OTUsMTQ3IEBACiAKIAogTElCR1JQQ19VTlNFQ1VSRV9TUkMgPSBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9pbml0X3Vuc2VjdXJlLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYyBcCi0gICAgc3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIFwKLSAgICBzcmMvY29yZS9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyBcCi0gICAgc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIFwKLSAgICBzcmMvY29yZS9kZWJ1Zy90cmFjZS5jIFwKLSAgICBzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMgXAotICAgIHNyYy9jb3JlL2h0dHAvaHR0cGNsaS5jIFwKLSAgICBzcmMvY29yZS9odHRwL3BhcnNlci5jIFwKLSAgICBzcmMvY29yZS9pb21nci9jbG9zdXJlLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9pb21nci5jIFwKLSAgICBzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGltZXIuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5jIFwKLSAgICBzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIFwKLSAgICBzcmMvY29yZS9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jIFwKLSAgICBzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvanNvbi9qc29uLmMgXAotICAgIHNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYyBcCi0gICAgc3JjL2NvcmUvanNvbi9qc29uX3N0cmluZy5jIFwKLSAgICBzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmMgXAotICAgIHNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2FsYXJtLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9pbml0LmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL3ZlcnNpb24uYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvd3JpdGluZy5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9tbG9nLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYyBcCi0gICAgc3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvdHJhY2luZy5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvd3JpdGluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIFwKKyAgICBzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIFwKKyAgICBzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMgXAorICAgIHNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9pb21nci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90aW1lci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2pzb24vanNvbi5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2FsYXJtLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfdW5zZWN1cmUuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYyBcCisgICAgc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMgXAorICAgIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYyBcCisgICAgc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuYyBcCisgICAgc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMgXAogICAgIHRoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uYyBcCiAgICAgdGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5jIFwKICAgICB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZW5jb2RlLmMgXApAQCAtMjkyOCwxNiArMjk0MywxNiBAQAogUFVCTElDX0hFQURFUlNfQyArPSBcCiAgICAgaW5jbHVkZS9ncnBjL2J5dGVfYnVmZmVyLmggXAogICAgIGluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaCBcCisgICAgaW5jbHVkZS9ncnBjL2NlbnN1cy5oIFwKICAgICBpbmNsdWRlL2dycGMvY29tcHJlc3Npb24uaCBcCiAgICAgaW5jbHVkZS9ncnBjL2dycGMuaCBcCi0gICAgaW5jbHVkZS9ncnBjL3N0YXR1cy5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb25uZWN0aXZpdHlfc3RhdGUuaCBcCiAgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmggXAogICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIFwKICAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIFwKLSAgICBpbmNsdWRlL2dycGMvY2Vuc3VzLmggXAorICAgIGluY2x1ZGUvZ3JwYy9zdGF0dXMuaCBcCiAKIExJQkdSUENfVU5TRUNVUkVfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkdSUENfVU5TRUNVUkVfU1JDKSkpKQogCkBAIC0yOTc3LDcgKzI5OTIsNyBAQAogCiAKIExJQkdSUENfWk9PS0VFUEVSX1NSQyA9IFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5jIFwKIAogUFVCTElDX0hFQURFUlNfQyArPSBcCiAgICAgaW5jbHVkZS9ncnBjL2dycGNfem9va2VlcGVyLmggXApAQCAtMzAyMiw2ICszMDM3LDcgQEAKIExJQlJFQ09OTkVDVF9TRVJWRVJfU1JDID0gXAogICAgIHRlc3QvY29yZS91dGlsL3JlY29ubmVjdF9zZXJ2ZXIuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJSRUNPTk5FQ1RfU0VSVkVSX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJSRUNPTk5FQ1RfU0VSVkVSX1NSQykpKSkKIApAQCAtMzA2MCw2ICszMDc2LDcgQEAKIExJQlRFU1RfVENQX1NFUlZFUl9TUkMgPSBcCiAgICAgdGVzdC9jb3JlL3V0aWwvdGVzdF90Y3Bfc2VydmVyLmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCVEVTVF9UQ1BfU0VSVkVSX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJURVNUX1RDUF9TRVJWRVJfU1JDKSkpKQogCkBAIC0zMDk2LDEyICszMTEzLDYgQEAKIAogCiBMSUJHUlBDKytfU1JDID0gXAotICAgIHNyYy9jcHAvY2xpZW50L3NlY3VyZV9jcmVkZW50aWFscy5jYyBcCi0gICAgc3JjL2NwcC9jb21tb24vYXV0aF9wcm9wZXJ0eV9pdGVyYXRvci5jYyBcCi0gICAgc3JjL2NwcC9jb21tb24vc2VjdXJlX2F1dGhfY29udGV4dC5jYyBcCi0gICAgc3JjL2NwcC9jb21tb24vc2VjdXJlX2NoYW5uZWxfYXJndW1lbnRzLmNjIFwKLSAgICBzcmMvY3BwL2NvbW1vbi9zZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyBcCi0gICAgc3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5jYyBcCiAgICAgc3JjL2NwcC9jbGllbnQvY2hhbm5lbC5jYyBcCiAgICAgc3JjL2NwcC9jbGllbnQvY2xpZW50X2NvbnRleHQuY2MgXAogICAgIHNyYy9jcHAvY2xpZW50L2NyZWF0ZV9jaGFubmVsLmNjIFwKQEAgLTMxMDksMTQgKzMxMjAsMjEgQEAKICAgICBzcmMvY3BwL2NsaWVudC9jcmVkZW50aWFscy5jYyBcCiAgICAgc3JjL2NwcC9jbGllbnQvZ2VuZXJpY19zdHViLmNjIFwKICAgICBzcmMvY3BwL2NsaWVudC9pbnNlY3VyZV9jcmVkZW50aWFscy5jYyBcCisgICAgc3JjL2NwcC9jbGllbnQvc2VjdXJlX2NyZWRlbnRpYWxzLmNjIFwKKyAgICBzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIFwKKyAgICBzcmMvY3BwL2NvbW1vbi9hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yLmNjIFwKICAgICBzcmMvY3BwL2NvbW1vbi9jaGFubmVsX2FyZ3VtZW50cy5jYyBcCiAgICAgc3JjL2NwcC9jb21tb24vY29tcGxldGlvbl9xdWV1ZS5jYyBcCiAgICAgc3JjL2NwcC9jb21tb24vY29yZV9jb2RlZ2VuLmNjIFwKICAgICBzcmMvY3BwL2NvbW1vbi9ycGNfbWV0aG9kLmNjIFwKKyAgICBzcmMvY3BwL2NvbW1vbi9zZWN1cmVfYXV0aF9jb250ZXh0LmNjIFwKKyAgICBzcmMvY3BwL2NvbW1vbi9zZWN1cmVfY2hhbm5lbF9hcmd1bWVudHMuY2MgXAorICAgIHNyYy9jcHAvY29tbW9uL3NlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIFwKICAgICBzcmMvY3BwL3NlcnZlci9hc3luY19nZW5lcmljX3NlcnZpY2UuY2MgXAogICAgIHNyYy9jcHAvc2VydmVyL2NyZWF0ZV9kZWZhdWx0X3RocmVhZF9wb29sLmNjIFwKICAgICBzcmMvY3BwL3NlcnZlci9keW5hbWljX3RocmVhZF9wb29sLmNjIFwKICAgICBzcmMvY3BwL3NlcnZlci9pbnNlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MgXAorICAgIHNyYy9jcHAvc2VydmVyL3NlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MgXAogICAgIHNyYy9jcHAvc2VydmVyL3NlcnZlci5jYyBcCiAgICAgc3JjL2NwcC9zZXJ2ZXIvc2VydmVyX2J1aWxkZXIuY2MgXAogICAgIHNyYy9jcHAvc2VydmVyL3NlcnZlcl9jb250ZXh0LmNjIFwKQEAgLTMxMjYsNyArMzE0NCw2IEBACiAgICAgc3JjL2NwcC91dGlsL3N0YXR1cy5jYyBcCiAgICAgc3JjL2NwcC91dGlsL3N0cmluZ19yZWYuY2MgXAogICAgIHNyYy9jcHAvdXRpbC90aW1lLmNjIFwKLSAgICBzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIFwKIAogUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKICAgICBpbmNsdWRlL2dycGMrKy9hbGFybS5oIFwKQEAgLTMxMzksNiArMzE1NiwzNyBAQAogICAgIGluY2x1ZGUvZ3JwYysrL2dycGMrKy5oIFwKICAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NhbGwuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jbGllbnRfdW5hcnlfY2FsbC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jbGllbnRfY29udGV4dC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWVfdGFnLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9wcm90b191dGlscy5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZWN1cml0eS9hdXRoX2NvbnRleHQuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmVyX2ludGVyZmFjZS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0YXR1c19jb2RlX2VudW0uaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luYy5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19zdHJlYW0uaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9ncnBjX2xpYnJhcnkuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvcHJvdG9fdXRpbHMuaCBcCkBAIC0zMTczLDM3ICszMjIxLDYgQEAKICAgICBpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N0dWJfb3B0aW9ucy5oIFwKICAgICBpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N5bmNfc3RyZWFtLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL3N1cHBvcnQvdGltZS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jbGllbnRfY29udGV4dC5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWVfdGFnLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9wcm90b191dGlscy5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZWN1cml0eS9hdXRoX2NvbnRleHQuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmVyX2ludGVyZmFjZS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0YXR1c19jb2RlX2VudW0uaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luYy5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19zdHJlYW0uaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiAKIExJQkdSUEMrK19PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCR1JQQysrX1NSQykpKSkKIApAQCAtMzI3MiwyNiArMzI4OSw2IEBACiAgICAgc3JjL2NwcC9jb2RlZ2VuL2NvZGVnZW5faW5pdC5jYyBcCiAKIFBVQkxJQ19IRUFERVJTX0NYWCArPSBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb25uZWN0aXZpdHlfc3RhdGUuaCBcCi0gICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmggXAotICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIFwKLSAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIFwKICAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsLmggXApAQCAtMzMyMyw2ICszMzIwLDI2IEBACiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfbm9fY3h4MTEuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi90aW1lLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYWxsb2MuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2Nfc3luYy5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb25uZWN0aXZpdHlfc3RhdGUuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCBcCisgICAgaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmggXAorICAgIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY193aW4zMi5oIFwKKyAgICBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiAKIExJQkdSUEMrK19DT0RFR0VOX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCR1JQQysrX0NPREVHRU5fTElCX1NSQykpKSkKIApAQCAtMzM3Niw2ICszMzkzLDcgQEAKIExJQkdSUEMrK19URVNUX0NPTkZJR19TUkMgPSBcCiAgICAgdGVzdC9jcHAvdXRpbC90ZXN0X2NvbmZpZy5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkdSUEMrK19URVNUX0NPTkZJR19PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCR1JQQysrX1RFU1RfQ09ORklHX1NSQykpKSkKIApAQCAtMzQyMiw5ICszNDQwLDkgQEAKIAogCiBMSUJHUlBDKytfVEVTVF9VVElMX1NSQyA9IFwKLSAgICAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYyBcCi0gICAgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuY2MgXAogICAgICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYyBcCisgICAgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuY2MgXAorICAgICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5ncnBjLnBiLmNjIFwKICAgICB0ZXN0L2NwcC9lbmQyZW5kL3Rlc3Rfc2VydmljZV9pbXBsLmNjIFwKICAgICB0ZXN0L2NwcC91dGlsL2J5dGVfYnVmZmVyX3Byb3RvX2hlbHBlci5jYyBcCiAgICAgdGVzdC9jcHAvdXRpbC9jbGlfY2FsbC5jYyBcCkBAIC0zNDMzLDYgKzM0NTEsNyBAQAogICAgIHRlc3QvY3BwL3V0aWwvc3VicHJvY2Vzcy5jYyBcCiAgICAgdGVzdC9jcHAvdXRpbC90ZXN0X2NyZWRlbnRpYWxzX3Byb3ZpZGVyLmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCR1JQQysrX1RFU1RfVVRJTF9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCR1JQQysrX1RFU1RfVVRJTF9TUkMpKSkpCiAKQEAgLTM0NzYsMTcgKzM0OTUsMTYgQEAKIC1pbmNsdWRlICQoTElCR1JQQysrX1RFU1RfVVRJTF9PQkpTOi5vPS5kZXApCiBlbmRpZgogZW5kaWYKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvZW5kMmVuZC90ZXN0X3NlcnZpY2VfaW1wbC5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLmdycGMucGIuY2MKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvdXRpbC9ieXRlX2J1ZmZlcl9wcm90b19oZWxwZXIubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmNjCi0kKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3V0aWwvY2xpX2NhbGwubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmNjCi0kKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3V0aWwvY3JlYXRlX3Rlc3RfY2hhbm5lbC5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLmdycGMucGIuY2MKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvdXRpbC9zdHJpbmdfcmVmX2hlbHBlci5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLmdycGMucGIuY2MKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvdXRpbC9zdWJwcm9jZXNzLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8ucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYwotJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC91dGlsL3Rlc3RfY3JlZGVudGlhbHNfcHJvdmlkZXIubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL2VuZDJlbmQvdGVzdF9zZXJ2aWNlX2ltcGwubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8ucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3V0aWwvYnl0ZV9idWZmZXJfcHJvdG9faGVscGVyLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC91dGlsL2NsaV9jYWxsLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC91dGlsL2NyZWF0ZV90ZXN0X2NoYW5uZWwubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8ucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3V0aWwvc3RyaW5nX3JlZl9oZWxwZXIubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8ucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3V0aWwvc3VicHJvY2Vzcy5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZHVwbGljYXRlL2VjaG9fZHVwbGljYXRlLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNob19tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLmdycGMucGIuY2MKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvdXRpbC90ZXN0X2NyZWRlbnRpYWxzX3Byb3ZpZGVyLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvX21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYwogCiAKIExJQkdSUEMrK19VTlNFQ1VSRV9TUkMgPSBcCi0gICAgc3JjL2NwcC9jb21tb24vaW5zZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyBcCiAgICAgc3JjL2NwcC9jbGllbnQvY2hhbm5lbC5jYyBcCiAgICAgc3JjL2NwcC9jbGllbnQvY2xpZW50X2NvbnRleHQuY2MgXAogICAgIHNyYy9jcHAvY2xpZW50L2NyZWF0ZV9jaGFubmVsLmNjIFwKQEAgLTM0OTQsOSArMzUxMiwxMSBAQAogICAgIHNyYy9jcHAvY2xpZW50L2NyZWRlbnRpYWxzLmNjIFwKICAgICBzcmMvY3BwL2NsaWVudC9nZW5lcmljX3N0dWIuY2MgXAogICAgIHNyYy9jcHAvY2xpZW50L2luc2VjdXJlX2NyZWRlbnRpYWxzLmNjIFwKKyAgICBzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIFwKICAgICBzcmMvY3BwL2NvbW1vbi9jaGFubmVsX2FyZ3VtZW50cy5jYyBcCiAgICAgc3JjL2NwcC9jb21tb24vY29tcGxldGlvbl9xdWV1ZS5jYyBcCiAgICAgc3JjL2NwcC9jb21tb24vY29yZV9jb2RlZ2VuLmNjIFwKKyAgICBzcmMvY3BwL2NvbW1vbi9pbnNlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIFwKICAgICBzcmMvY3BwL2NvbW1vbi9ycGNfbWV0aG9kLmNjIFwKICAgICBzcmMvY3BwL3NlcnZlci9hc3luY19nZW5lcmljX3NlcnZpY2UuY2MgXAogICAgIHNyYy9jcHAvc2VydmVyL2NyZWF0ZV9kZWZhdWx0X3RocmVhZF9wb29sLmNjIFwKQEAgLTM1MTEsNyArMzUzMSw2IEBACiAgICAgc3JjL2NwcC91dGlsL3N0YXR1cy5jYyBcCiAgICAgc3JjL2NwcC91dGlsL3N0cmluZ19yZWYuY2MgXAogICAgIHNyYy9jcHAvdXRpbC90aW1lLmNjIFwKLSAgICBzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIFwKIAogUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKICAgICBpbmNsdWRlL2dycGMrKy9hbGFybS5oIFwKQEAgLTM1MjQsNiArMzU0MywzNyBAQAogICAgIGluY2x1ZGUvZ3JwYysrL2dycGMrKy5oIFwKICAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NhbGwuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jbGllbnRfdW5hcnlfY2FsbC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jbGllbnRfY29udGV4dC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWVfdGFnLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9wcm90b191dGlscy5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZWN1cml0eS9hdXRoX2NvbnRleHQuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmVyX2ludGVyZmFjZS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmggXAorICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0YXR1c19jb2RlX2VudW0uaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luYy5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKKyAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19zdHJlYW0uaCBcCisgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9ncnBjX2xpYnJhcnkuaCBcCiAgICAgaW5jbHVkZS9ncnBjKysvaW1wbC9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvcHJvdG9fdXRpbHMuaCBcCkBAIC0zNTU4LDM3ICszNjA4LDYgQEAKICAgICBpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N0dWJfb3B0aW9ucy5oIFwKICAgICBpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N5bmNfc3RyZWFtLmggXAogICAgIGluY2x1ZGUvZ3JwYysrL3N1cHBvcnQvdGltZS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jbGllbnRfY29udGV4dC5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWVfdGFnLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9wcm90b191dGlscy5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZWN1cml0eS9hdXRoX2NvbnRleHQuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmVyX2ludGVyZmFjZS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmggXAotICAgIGluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0YXR1c19jb2RlX2VudW0uaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luYy5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKLSAgICBpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19zdHJlYW0uaCBcCi0gICAgaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiAKIExJQkdSUEMrK19VTlNFQ1VSRV9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCR1JQQysrX1VOU0VDVVJFX1NSQykpKSkKIApAQCAtMzY5Nyw2ICszNzE2LDcgQEAKICAgICAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjIFwKICAgICB0ZXN0L2NwcC9pbnRlcm9wL2NsaWVudF9oZWxwZXIuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJJTlRFUk9QX0NMSUVOVF9IRUxQRVJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQklOVEVST1BfQ0xJRU5UX0hFTFBFUl9TUkMpKSkpCiAKQEAgLTM3NTAsNiArMzc3MCw3IEBACiAgICAgdGVzdC9jcHAvaW50ZXJvcC9jbGllbnQuY2MgXAogICAgIHRlc3QvY3BwL2ludGVyb3AvaW50ZXJvcF9jbGllbnQuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJJTlRFUk9QX0NMSUVOVF9NQUlOX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJJTlRFUk9QX0NMSUVOVF9NQUlOX1NSQykpKSkKIApAQCAtMzgwMCw2ICszODIxLDcgQEAKIExJQklOVEVST1BfU0VSVkVSX0hFTFBFUl9TUkMgPSBcCiAgICAgdGVzdC9jcHAvaW50ZXJvcC9zZXJ2ZXJfaGVscGVyLmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCSU5URVJPUF9TRVJWRVJfSEVMUEVSX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJJTlRFUk9QX1NFUlZFUl9IRUxQRVJfU1JDKSkpKQogCkBAIC0zODUxLDYgKzM4NzMsNyBAQAogICAgICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3Rlc3QucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvdGVzdC5ncnBjLnBiLmNjIFwKICAgICB0ZXN0L2NwcC9pbnRlcm9wL3NlcnZlcl9tYWluLmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCSU5URVJPUF9TRVJWRVJfTUFJTl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCSU5URVJPUF9TRVJWRVJfTUFJTl9TUkMpKSkpCiAKQEAgLTM4OTgsMTIgKzM5MjEsMTIgQEAKIAogCiBMSUJRUFNfU1JDID0gXAorICAgICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjIFwKICAgICAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjIFwKICAgICAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjIFwKLSAgICAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjIFwKLSAgICAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyBcCi0gICAgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyBcCiAgICAgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MgXAorICAgICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgXAorICAgICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MgXAogICAgIHRlc3QvY3BwL3Fwcy9jbGllbnRfYXN5bmMuY2MgXAogICAgIHRlc3QvY3BwL3Fwcy9jbGllbnRfc3luYy5jYyBcCiAgICAgdGVzdC9jcHAvcXBzL2RyaXZlci5jYyBcCkBAIC0zOTE2LDYgKzM5MzksNyBAQAogICAgIHRlc3QvY3BwL3Fwcy91c2FnZV90aW1lci5jYyBcCiAgICAgdGVzdC9jcHAvdXRpbC9iZW5jaG1hcmtfY29uZmlnLmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCUVBTX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJRUFNfU1JDKSkpKQogCkBAIC0zOTU5LDIyICszOTgzLDIzIEBACiAtaW5jbHVkZSAkKExJQlFQU19PQkpTOi5vPS5kZXApCiBlbmRpZgogZW5kaWYKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvcXBzL2NsaWVudF9hc3luYy5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjCi0kKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3Fwcy9jbGllbnRfc3luYy5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjCi0kKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3Fwcy9kcml2ZXIubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYwotJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvbGltaXRfY29yZXMubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYwotJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvcGVyZl9kYl9jbGllbnQubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYwotJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvcXBzX3dvcmtlci5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjCi0kKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3Fwcy9yZXBvcnQubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYwotJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvc2VydmVyX2FzeW5jLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvcXBzL3NlcnZlcl9zeW5jLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvcXBzL3VzYWdlX3RpbWVyLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MKLSQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvdXRpbC9iZW5jaG1hcmtfY29uZmlnLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvcXBzL2NsaWVudF9hc3luYy5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3Fwcy9jbGllbnRfc3luYy5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3Fwcy9kcml2ZXIubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvbGltaXRfY29yZXMubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvcGVyZl9kYl9jbGllbnQubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvcXBzX3dvcmtlci5vOiAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BheWxvYWRzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zdGF0cy5ncnBjLnBiLmNjCiskKE9CSkRJUikvJChDT05GSUcpL3Rlc3QvY3BwL3Fwcy9yZXBvcnQubzogJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9jb250cm9sLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvbWVzc2FnZXMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wYXlsb2Fkcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGVyZl9kYi5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc3RhdHMuZ3JwYy5wYi5jYworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NwcC9xcHMvc2VydmVyX2FzeW5jLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvcXBzL3NlcnZlcl9zeW5jLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvcXBzL3VzYWdlX3RpbWVyLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jcHAvdXRpbC9iZW5jaG1hcmtfY29uZmlnLm86ICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2NvbnRyb2wucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvY29udHJvbC5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL21lc3NhZ2VzLmdycGMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMucGIuY2MgJChHRU5ESVIpL3NyYy9wcm90by9ncnBjL3Rlc3RpbmcvcGF5bG9hZHMuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9wZXJmX2RiLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3BlcmZfZGIuZ3JwYy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5wYi5jYyAkKEdFTkRJUikvc3JjL3Byb3RvL2dycGMvdGVzdGluZy9zZXJ2aWNlcy5ncnBjLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLnBiLmNjICQoR0VORElSKS9zcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3N0YXRzLmdycGMucGIuY2MKIAogCiBMSUJHUlBDX0NTSEFSUF9FWFRfU1JDID0gXAogICAgIHNyYy9jc2hhcnAvZXh0L2dycGNfY3NoYXJwX2V4dC5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkdSUENfQ1NIQVJQX0VYVF9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCR1JQQ19DU0hBUlBfRVhUX1NSQykpKSkKIApAQCAtNDMyNCw2ICs0MzQ5LDcgQEAKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3NsL3QxX2xpYi5jIFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3NsL3Rsc19yZWNvcmQuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJCT1JJTkdTU0xfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9TUkMpKSkpCiAKQEAgLTQzNTIsNiArNDM3OCw3IEBACiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by90ZXN0L21hbGxvYy5jYyBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by90ZXN0L3Rlc3RfdXRpbC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9URVNUX1VUSUxfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9URVNUX1VUSUxfU1JDKSkpKQogCkBAIC00Mzg5LDYgKzQ0MTYsNyBAQAogTElCQk9SSU5HU1NMX0FFU19URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9hZXMvYWVzX3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfQUVTX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfQUVTX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNDQyNiw2ICs0NDU0LDcgQEAKIExJQkJPUklOR1NTTF9BU04xX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2FzbjEvYXNuMV90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0FTTjFfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9BU04xX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNDQ2Myw2ICs0NDkyLDcgQEAKIExJQkJPUklOR1NTTF9CQVNFNjRfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vYmFzZTY0L2Jhc2U2NF90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0JBU0U2NF9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0JBU0U2NF9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ1MDAsNiArNDUzMCw3IEBACiBMSUJCT1JJTkdTU0xfQklPX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2Jpby9iaW9fdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9CSU9fVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9CSU9fVEVTVF9MSUJfU1JDKSkpKQogCkBAIC00NTM3LDYgKzQ1NjgsNyBAQAogTElCQk9SSU5HU1NMX0JOX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2JuL2JuX3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfQk5fVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9CTl9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ1NzQsNiArNDYwNiw3IEBACiBMSUJCT1JJTkdTU0xfQllURVNUUklOR19URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9ieXRlc3RyaW5nL2J5dGVzdHJpbmdfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9CWVRFU1RSSU5HX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfQllURVNUUklOR19URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ2MTEsNiArNDY0NCw3IEBACiBMSUJCT1JJTkdTU0xfQUVBRF9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9jaXBoZXIvYWVhZF90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0FFQURfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9BRUFEX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNDY0OCw2ICs0NjgyLDcgQEAKIExJQkJPUklOR1NTTF9DSVBIRVJfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vY2lwaGVyL2NpcGhlcl90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0NJUEhFUl9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0NJUEhFUl9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ2ODUsNiArNDcyMCw3IEBACiBMSUJCT1JJTkdTU0xfQ01BQ19URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9jbWFjL2NtYWNfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9DTUFDX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfQ01BQ19URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ3MjIsNiArNDc1OCw3IEBACiBMSUJCT1JJTkdTU0xfQ09OU1RBTlRfVElNRV9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9jb25zdGFudF90aW1lX3Rlc3QuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJCT1JJTkdTU0xfQ09OU1RBTlRfVElNRV9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0NPTlNUQU5UX1RJTUVfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC00NzQ4LDYgKzQ3ODUsNyBAQAogTElCQk9SSU5HU1NMX0VEMjU1MTlfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vY3VydmUyNTUxOS9lZDI1NTE5X3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfRUQyNTUxOV9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0VEMjU1MTlfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC00Nzg1LDYgKzQ4MjMsNyBAQAogTElCQk9SSU5HU1NMX1gyNTUxOV9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9jdXJ2ZTI1NTE5L3gyNTUxOV90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX1gyNTUxOV9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX1gyNTUxOV9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ4MjIsNiArNDg2MSw3IEBACiBMSUJCT1JJTkdTU0xfREhfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vZGgvZGhfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9ESF9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0RIX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNDg1OSw2ICs0ODk5LDcgQEAKIExJQkJPUklOR1NTTF9ESUdFU1RfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vZGlnZXN0L2RpZ2VzdF90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0RJR0VTVF9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0RJR0VTVF9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ4OTYsNiArNDkzNyw3IEBACiBMSUJCT1JJTkdTU0xfRFNBX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2RzYS9kc2FfdGVzdC5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkJPUklOR1NTTF9EU0FfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9EU0FfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC00OTIyLDYgKzQ5NjQsNyBAQAogTElCQk9SSU5HU1NMX0VDX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2VjL2VjX3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfRUNfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9FQ19URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTQ5NTksNiArNTAwMiw3IEBACiBMSUJCT1JJTkdTU0xfRVhBTVBMRV9NVUxfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2VjL2V4YW1wbGVfbXVsLmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCQk9SSU5HU1NMX0VYQU1QTEVfTVVMX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0VYQU1QTEVfTVVMX0xJQl9TUkMpKSkpCiAKQEAgLTQ5ODUsNiArNTAyOSw3IEBACiBMSUJCT1JJTkdTU0xfRUNEU0FfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vZWNkc2EvZWNkc2FfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9FQ0RTQV9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0VDRFNBX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTAyMiw2ICs1MDY3LDcgQEAKIExJQkJPUklOR1NTTF9FUlJfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vZXJyL2Vycl90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0VSUl9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX0VSUl9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTUwNTksNiArNTEwNSw3IEBACiBMSUJCT1JJTkdTU0xfRVZQX0VYVFJBX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2V2cC9ldnBfZXh0cmFfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9FVlBfRVhUUkFfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9FVlBfRVhUUkFfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC01MDk2LDYgKzUxNDMsNyBAQAogTElCQk9SSU5HU1NMX0VWUF9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9ldnAvZXZwX3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfRVZQX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfRVZQX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTEzMyw2ICs1MTgxLDcgQEAKIExJQkJPUklOR1NTTF9QQktERl9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9ldnAvcGJrZGZfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9QQktERl9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX1BCS0RGX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTE3MCw2ICs1MjE5LDcgQEAKIExJQkJPUklOR1NTTF9IS0RGX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2hrZGYvaGtkZl90ZXN0LmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCQk9SSU5HU1NMX0hLREZfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9IS0RGX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTE5Niw2ICs1MjQ2LDcgQEAKIExJQkJPUklOR1NTTF9ITUFDX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL2htYWMvaG1hY190ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX0hNQUNfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9ITUFDX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTIzMyw2ICs1Mjg0LDcgQEAKIExJQkJPUklOR1NTTF9MSEFTSF9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9saGFzaC9saGFzaF90ZXN0LmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCQk9SSU5HU1NMX0xIQVNIX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfTEhBU0hfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC01MjU5LDYgKzUzMTEsNyBAQAogTElCQk9SSU5HU1NMX0dDTV9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9tb2Rlcy9nY21fdGVzdC5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkJPUklOR1NTTF9HQ01fVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9HQ01fVEVTVF9MSUJfU1JDKSkpKQogCkBAIC01Mjg1LDYgKzUzMzgsNyBAQAogTElCQk9SSU5HU1NMX1BLQ1MxMl9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9wa2NzOC9wa2NzMTJfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9QS0NTMTJfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9QS0NTMTJfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC01MzIyLDYgKzUzNzYsNyBAQAogTElCQk9SSU5HU1NMX1BLQ1M4X1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL3BrY3M4L3BrY3M4X3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfUEtDUzhfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9QS0NTOF9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTUzNTksNiArNTQxNCw3IEBACiBMSUJCT1JJTkdTU0xfUE9MWTEzMDVfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfdGVzdC5jYyBcCiAKK1BVQkxJQ19IRUFERVJTX0NYWCArPSBcCiAKIExJQkJPUklOR1NTTF9QT0xZMTMwNV9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX1BPTFkxMzA1X1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTM5Niw2ICs1NDUyLDcgQEAKIExJQkJPUklOR1NTTF9SRUZDT1VOVF9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9yZWZjb3VudF90ZXN0LmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCQk9SSU5HU1NMX1JFRkNPVU5UX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfUkVGQ09VTlRfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC01NDIyLDYgKzU0NzksNyBAQAogTElCQk9SSU5HU1NMX1JTQV9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9yc2EvcnNhX3Rlc3QuY2MgXAogCitQVUJMSUNfSEVBREVSU19DWFggKz0gXAogCiBMSUJCT1JJTkdTU0xfUlNBX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfUlNBX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTQ1OSw2ICs1NTE3LDcgQEAKIExJQkJPUklOR1NTTF9USFJFQURfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8vdGhyZWFkX3Rlc3QuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJCT1JJTkdTU0xfVEhSRUFEX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfVEhSRUFEX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTQ4NSw2ICs1NTQ0LDcgQEAKIExJQkJPUklOR1NTTF9QS0NTN19URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by94NTA5L3BrY3M3X3Rlc3QuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJCT1JJTkdTU0xfUEtDUzdfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9QS0NTN19URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTU1MTEsNiArNTU3MSw3IEBACiBMSUJCT1JJTkdTU0xfVEFCX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvY3J5cHRvL3g1MDl2My90YWJfdGVzdC5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkJPUklOR1NTTF9UQUJfVEVTVF9MSUJfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkJPUklOR1NTTF9UQUJfVEVTVF9MSUJfU1JDKSkpKQogCkBAIC01NTM3LDYgKzU1OTgsNyBAQAogTElCQk9SSU5HU1NMX1YzTkFNRV9URVNUX0xJQl9TUkMgPSBcCiAgICAgdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by94NTA5djMvdjNuYW1lX3Rlc3QuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJCT1JJTkdTU0xfVjNOQU1FX1RFU1RfTElCX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCT1JJTkdTU0xfVjNOQU1FX1RFU1RfTElCX1NSQykpKSkKIApAQCAtNTU2Myw2ICs1NjI1LDcgQEAKIExJQkJPUklOR1NTTF9QUVVFVUVfVEVTVF9MSUJfU1JDID0gXAogICAgIHRoaXJkX3BhcnR5L2JvcmluZ3NzbC9zc2wvcHF1ZXVlL3BxdWV1ZV90ZXN0LmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCQk9SSU5HU1NMX1BRVUVVRV9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX1BRVUVVRV9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTU1ODksNiArNTY1Miw3IEBACiBMSUJCT1JJTkdTU0xfU1NMX1RFU1RfTElCX1NSQyA9IFwKICAgICB0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3NsL3NzbF90ZXN0LmNjIFwKIAorUFVCTElDX0hFQURFUlNfQ1hYICs9IFwKIAogTElCQk9SSU5HU1NMX1NTTF9URVNUX0xJQl9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQk9SSU5HU1NMX1NTTF9URVNUX0xJQl9TUkMpKSkpCiAKQEAgLTU2NDAsNiArNTcwNCw3IEBACiAgICAgdGhpcmRfcGFydHkvemxpYi91bmNvbXByLmMgXAogICAgIHRoaXJkX3BhcnR5L3psaWIvenV0aWwuYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJaX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJaX1NSQykpKSkKIApAQCAtNTY2NSw2ICs1NzMwLDcgQEAKIExJQkJBRF9DTElFTlRfVEVTVF9TUkMgPSBcCiAgICAgdGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkJBRF9DTElFTlRfVEVTVF9PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCQkFEX0NMSUVOVF9URVNUX1NSQykpKSkKIApAQCAtNTcwMyw2ICs1NzY5LDcgQEAKIExJQkJBRF9TU0xfVEVTVF9TRVJWRVJfU1JDID0gXAogICAgIHRlc3QvY29yZS9iYWRfc3NsL3NlcnZlcl9jb21tb24uYyBcCiAKK1BVQkxJQ19IRUFERVJTX0MgKz0gXAogCiBMSUJCQURfU1NMX1RFU1RfU0VSVkVSX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChMSUJCQURfU1NMX1RFU1RfU0VSVkVSX1NSQykpKSkKIApAQCAtNTc3Nyw2ICs1ODQ0LDcgQEAKICAgICB0ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9zaW1wbGVfcmVxdWVzdC5jIFwKICAgICB0ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy90cmFpbGluZ19tZXRhZGF0YS5jIFwKIAorUFVCTElDX0hFQURFUlNfQyArPSBcCiAKIExJQkVORDJFTkRfVEVTVFNfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKExJQkVORDJFTkRfVEVTVFNfU1JDKSkpKQogCkBAIC01ODUwLDYgKzU5MTgsNyBAQAogICAgIHRlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3NpbXBsZV9yZXF1ZXN0LmMgXAogICAgIHRlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3RyYWlsaW5nX21ldGFkYXRhLmMgXAogCitQVUJMSUNfSEVBREVSU19DICs9IFwKIAogTElCRU5EMkVORF9OT1NFQ19URVNUU19PQkpTID0gJChhZGRwcmVmaXggJChPQkpESVIpLyQoQ09ORklHKS8sICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoTElCRU5EMkVORF9OT1NFQ19URVNUU19TUkMpKSkpCiAKQEAgLTc3MzEsNiArNzgwMCwzOCBAQAogZW5kaWYKIAogCitIUEFDS19QQVJTRVJfRlVaWkVSX1RFU1RfU1JDID0gXAorICAgIHRlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdC5jIFwKKworSFBBQ0tfUEFSU0VSX0ZVWlpFUl9URVNUX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChIUEFDS19QQVJTRVJfRlVaWkVSX1RFU1RfU1JDKSkpKQoraWZlcSAoJChOT19TRUNVUkUpLHRydWUpCisKKyMgWW91IGNhbid0IGJ1aWxkIHNlY3VyZSB0YXJnZXRzIGlmIHlvdSBkb24ndCBoYXZlIE9wZW5TU0wuCisKKyQoQklORElSKS8kKENPTkZJRykvaHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0OiBvcGVuc3NsX2RlcF9lcnJvcgorCitlbHNlCisKKworCiskKEJJTkRJUikvJChDT05GSUcpL2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdDogJChIUEFDS19QQVJTRVJfRlVaWkVSX1RFU1RfT0JKUykgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwYy5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByLmEKKwkkKEUpICJbTERdICAgICAgTGlua2luZyAkQCIKKwkkKFEpIG1rZGlyIC1wIGBkaXJuYW1lICRAYAorCSQoUSkgJChMRFhYKSAkKExERkxBR1MpICQoSFBBQ0tfUEFSU0VSX0ZVWlpFUl9URVNUX09CSlMpICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwY190ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGMuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwcl90ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwci5hICQoTERMSUJTKSAkKExETElCU19TRUNVUkUpIC1sRnV6emVyIC1vICQoQklORElSKS8kKENPTkZJRykvaHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0CisKK2VuZGlmCisKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0Lm86ICAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGNfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHJfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHIuYQorCitkZXBzX2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdDogJChIUEFDS19QQVJTRVJfRlVaWkVSX1RFU1RfT0JKUzoubz0uZGVwKQorCitpZm5lcSAoJChOT19TRUNVUkUpLHRydWUpCitpZm5lcSAoJChOT19ERVBTKSx0cnVlKQorLWluY2x1ZGUgJChIUEFDS19QQVJTRVJfRlVaWkVSX1RFU1RfT0JKUzoubz0uZGVwKQorZW5kaWYKK2VuZGlmCisKKwogSFBBQ0tfUEFSU0VSX1RFU1RfU1JDID0gXAogICAgIHRlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl90ZXN0LmMgXAogCkBAIC03Nzk1LDYgKzc4OTYsMzggQEAKIGVuZGlmCiAKIAorSFRUUF9GVVpaRVJfVEVTVF9TUkMgPSBcCisgICAgdGVzdC9jb3JlL2h0dHAvZnV6emVyLmMgXAorCitIVFRQX0ZVWlpFUl9URVNUX09CSlMgPSAkKGFkZHByZWZpeCAkKE9CSkRJUikvJChDT05GSUcpLywgJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChIVFRQX0ZVWlpFUl9URVNUX1NSQykpKSkKK2lmZXEgKCQoTk9fU0VDVVJFKSx0cnVlKQorCisjIFlvdSBjYW4ndCBidWlsZCBzZWN1cmUgdGFyZ2V0cyBpZiB5b3UgZG9uJ3QgaGF2ZSBPcGVuU1NMLgorCiskKEJJTkRJUikvJChDT05GSUcpL2h0dHBfZnV6emVyX3Rlc3Q6IG9wZW5zc2xfZGVwX2Vycm9yCisKK2Vsc2UKKworCisKKyQoQklORElSKS8kKENPTkZJRykvaHR0cF9mdXp6ZXJfdGVzdDogJChIVFRQX0ZVWlpFUl9URVNUX09CSlMpICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwY190ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGMuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwcl90ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwci5hCisJJChFKSAiW0xEXSAgICAgIExpbmtpbmcgJEAiCisJJChRKSBta2RpciAtcCBgZGlybmFtZSAkQGAKKwkkKFEpICQoTERYWCkgJChMREZMQUdTKSAkKEhUVFBfRlVaWkVSX1RFU1RfT0JKUykgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwYy5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByLmEgJChMRExJQlMpICQoTERMSUJTX1NFQ1VSRSkgLWxGdXp6ZXIgLW8gJChCSU5ESVIpLyQoQ09ORklHKS9odHRwX2Z1enplcl90ZXN0CisKK2VuZGlmCisKKyQoT0JKRElSKS8kKENPTkZJRykvdGVzdC9jb3JlL2h0dHAvZnV6emVyLm86ICAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGNfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHJfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHIuYQorCitkZXBzX2h0dHBfZnV6emVyX3Rlc3Q6ICQoSFRUUF9GVVpaRVJfVEVTVF9PQkpTOi5vPS5kZXApCisKK2lmbmVxICgkKE5PX1NFQ1VSRSksdHJ1ZSkKK2lmbmVxICgkKE5PX0RFUFMpLHRydWUpCistaW5jbHVkZSAkKEhUVFBfRlVaWkVSX1RFU1RfT0JKUzoubz0uZGVwKQorZW5kaWYKK2VuZGlmCisKKwogSFRUUF9QQVJTRVJfVEVTVF9TUkMgPSBcCiAgICAgdGVzdC9jb3JlL2h0dHAvcGFyc2VyX3Rlc3QuYyBcCiAKQEAgLTc5ODcsNiArODEyMCwzOCBAQAogZW5kaWYKIAogCitKU09OX0ZVWlpFUl9URVNUX1NSQyA9IFwKKyAgICB0ZXN0L2NvcmUvanNvbi9mdXp6ZXIuYyBcCisKK0pTT05fRlVaWkVSX1RFU1RfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKEpTT05fRlVaWkVSX1RFU1RfU1JDKSkpKQoraWZlcSAoJChOT19TRUNVUkUpLHRydWUpCisKKyMgWW91IGNhbid0IGJ1aWxkIHNlY3VyZSB0YXJnZXRzIGlmIHlvdSBkb24ndCBoYXZlIE9wZW5TU0wuCisKKyQoQklORElSKS8kKENPTkZJRykvanNvbl9mdXp6ZXJfdGVzdDogb3BlbnNzbF9kZXBfZXJyb3IKKworZWxzZQorCisKKworJChCSU5ESVIpLyQoQ09ORklHKS9qc29uX2Z1enplcl90ZXN0OiAkKEpTT05fRlVaWkVSX1RFU1RfT0JKUykgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwYy5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByLmEKKwkkKEUpICJbTERdICAgICAgTGlua2luZyAkQCIKKwkkKFEpIG1rZGlyIC1wIGBkaXJuYW1lICRAYAorCSQoUSkgJChMRFhYKSAkKExERkxBR1MpICQoSlNPTl9GVVpaRVJfVEVTVF9PQkpTKSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGNfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHJfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHIuYSAkKExETElCUykgJChMRExJQlNfU0VDVVJFKSAtbEZ1enplciAtbyAkKEJJTkRJUikvJChDT05GSUcpL2pzb25fZnV6emVyX3Rlc3QKKworZW5kaWYKKworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NvcmUvanNvbi9mdXp6ZXIubzogICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwY190ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGMuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwcl90ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwci5hCisKK2RlcHNfanNvbl9mdXp6ZXJfdGVzdDogJChKU09OX0ZVWlpFUl9URVNUX09CSlM6Lm89LmRlcCkKKworaWZuZXEgKCQoTk9fU0VDVVJFKSx0cnVlKQoraWZuZXEgKCQoTk9fREVQUyksdHJ1ZSkKKy1pbmNsdWRlICQoSlNPTl9GVVpaRVJfVEVTVF9PQkpTOi5vPS5kZXApCitlbmRpZgorZW5kaWYKKworCiBKU09OX1JFV1JJVEVfU1JDID0gXAogICAgIHRlc3QvY29yZS9qc29uL2pzb25fcmV3cml0ZS5jIFwKIApAQCAtOTA0Myw2ICs5MjA4LDM4IEBACiBlbmRpZgogCiAKK1VSSV9GVVpaRVJfVEVTVF9TUkMgPSBcCisgICAgdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2Z1enplcl90ZXN0LmMgXAorCitVUklfRlVaWkVSX1RFU1RfT0JKUyA9ICQoYWRkcHJlZml4ICQoT0JKRElSKS8kKENPTkZJRykvLCAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKFVSSV9GVVpaRVJfVEVTVF9TUkMpKSkpCitpZmVxICgkKE5PX1NFQ1VSRSksdHJ1ZSkKKworIyBZb3UgY2FuJ3QgYnVpbGQgc2VjdXJlIHRhcmdldHMgaWYgeW91IGRvbid0IGhhdmUgT3BlblNTTC4KKworJChCSU5ESVIpLyQoQ09ORklHKS91cmlfZnV6emVyX3Rlc3Q6IG9wZW5zc2xfZGVwX2Vycm9yCisKK2Vsc2UKKworCisKKyQoQklORElSKS8kKENPTkZJRykvdXJpX2Z1enplcl90ZXN0OiAkKFVSSV9GVVpaRVJfVEVTVF9PQkpTKSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGNfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHJfdGVzdF91dGlsLmEgJChMSUJESVIpLyQoQ09ORklHKS9saWJncHIuYQorCSQoRSkgIltMRF0gICAgICBMaW5raW5nICRAIgorCSQoUSkgbWtkaXIgLXAgYGRpcm5hbWUgJEBgCisJJChRKSAkKExEWFgpICQoTERGTEFHUykgJChVUklfRlVaWkVSX1RFU1RfT0JKUykgJChMSUJESVIpLyQoQ09ORklHKS9saWJncnBjX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwYy5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByX3Rlc3RfdXRpbC5hICQoTElCRElSKS8kKENPTkZJRykvbGliZ3ByLmEgJChMRExJQlMpICQoTERMSUJTX1NFQ1VSRSkgLWxGdXp6ZXIgLW8gJChCSU5ESVIpLyQoQ09ORklHKS91cmlfZnV6emVyX3Rlc3QKKworZW5kaWYKKworJChPQkpESVIpLyQoQ09ORklHKS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfZnV6emVyX3Rlc3QubzogICQoTElCRElSKS8kKENPTkZJRykvbGliZ3JwY190ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdycGMuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwcl90ZXN0X3V0aWwuYSAkKExJQkRJUikvJChDT05GSUcpL2xpYmdwci5hCisKK2RlcHNfdXJpX2Z1enplcl90ZXN0OiAkKFVSSV9GVVpaRVJfVEVTVF9PQkpTOi5vPS5kZXApCisKK2lmbmVxICgkKE5PX1NFQ1VSRSksdHJ1ZSkKK2lmbmVxICgkKE5PX0RFUFMpLHRydWUpCistaW5jbHVkZSAkKFVSSV9GVVpaRVJfVEVTVF9PQkpTOi5vPS5kZXApCitlbmRpZgorZW5kaWYKKworCiBVUklfUEFSU0VSX1RFU1RfU1JDID0gXAogICAgIHRlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXJfdGVzdC5jIFwKIApAQCAtMTM0MTYsMjcgKzEzNjEzLDI3IEBACiAjIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSBlbWJlZGRlZCBPcGVuU1NMIGlzIGJ1aWx0IGJlZm9yZWhhbmQsIHByb3Blcmx5CiAjIGluc3RhbGxpbmcgaGVhZGVycyB0byB0aGVpciBmaW5hbCBkZXN0aW5hdGlvbiBvbiB0aGUgZHJpdmUuIFdlIG5lZWQgdGhpcwogIyBvdGhlcndpc2UgcGFyYWxsZWwgY29tcGlsYXRpb24gd2lsbCBmYWlsIGlmIGEgc291cmNlIGlzIGNvbXBpbGVkIGZpcnN0Lgotc3JjL2NvcmUvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jOiAkKE9QRU5TU0xfREVQKQotc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYzogJChPUEVOU1NMX0RFUCkKLXNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jOiAkKE9QRU5TU0xfREVQKQotc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYzogJChPUEVOU1NMX0RFUCkKLXNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jOiAkKE9QRU5TU0xfREVQKQotc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYzogJChPUEVOU1NMX0RFUCkKLXNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jOiAkKE9QRU5TU0xfREVQKQotc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYzogJChPUEVOU1NMX0RFUCkKLXNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zdXJmYWNlL2luaXRfc2VjdXJlLmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jOiAkKE9QRU5TU0xfREVQKQotc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmM6ICQoT1BFTlNTTF9ERVApCi1zcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jOiAkKE9QRU5TU0xfREVQKQotc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jOiAkKE9QRU5TU0xfREVQKQorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L3NlY3VyZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jOiAkKE9QRU5TU0xfREVQKQorc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jOiAkKE9QRU5TU0xfREVQKQorc3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jOiAkKE9QRU5TU0xfREVQKQorc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYzogJChPUEVOU1NMX0RFUCkKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jOiAkKE9QRU5TU0xfREVQKQorc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jOiAkKE9QRU5TU0xfREVQKQorc3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmM6ICQoT1BFTlNTTF9ERVApCitzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jOiAkKE9QRU5TU0xfREVQKQogc3JjL2NwcC9jbGllbnQvc2VjdXJlX2NyZWRlbnRpYWxzLmNjOiAkKE9QRU5TU0xfREVQKQogc3JjL2NwcC9jb21tb24vYXV0aF9wcm9wZXJ0eV9pdGVyYXRvci5jYzogJChPUEVOU1NMX0RFUCkKIHNyYy9jcHAvY29tbW9uL3NlY3VyZV9hdXRoX2NvbnRleHQuY2M6ICQoT1BFTlNTTF9ERVApCmRpZmYgLS1naXQgYS9QWVRIT04tTUFOSUZFU1QuaW4gYi9QWVRIT04tTUFOSUZFU1QuaW4KaW5kZXggMjVhYmE4Ny4uNTM0ZjRjMSAxMDA2NDQKLS0tIGEvUFlUSE9OLU1BTklGRVNULmluCisrKyBiL1BZVEhPTi1NQU5JRkVTVC5pbgpAQCAtMiw4ICsyLDEwIEBACiByZWN1cnNpdmUtZXhjbHVkZSBzcmMvcHl0aG9uL2dycGNpby9ncnBjL19jeXRob24gKi5zbyAqLnB5ZAogZ3JhZnQgc3JjL3B5dGhvbi9ncnBjaW8vdGVzdHMKIGdyYWZ0IHNyYy9jb3JlCitncmFmdCBzcmMvYm9yaW5nc3NsCiBncmFmdCBpbmNsdWRlL2dycGMKIGdyYWZ0IHRoaXJkX3BhcnR5L2JvcmluZ3NzbAorZ3JhZnQgdGhpcmRfcGFydHkvbmFub3BiCiBncmFmdCB0aGlyZF9wYXJ0eS96bGliCiBpbmNsdWRlIHNyYy9weXRob24vZ3JwY2lvL2NvbW1hbmRzLnB5CiBpbmNsdWRlIHNyYy9weXRob24vZ3JwY2lvL2dycGNfdmVyc2lvbi5weQpkaWZmIC0tZ2l0IGEvYmluZGluZy5neXAgYi9iaW5kaW5nLmd5cAppbmRleCAyZWUzODNhLi5hMWNkZjJlIDEwMDY0NAotLS0gYS9iaW5kaW5nLmd5cAorKysgYi9iaW5kaW5nLmd5cApAQCAtNDkyLDUwICs0OTIsNTAgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICBdLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdzcmMvY29yZS9wcm9maWxpbmcvYmFzaWNfdGltZXJzLmMnLAotICAgICAgICAnc3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvYXZsLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9jcHVfaXBob25lLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvY3B1X3dpbmRvd3MuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9lbnZfd2luMzIuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2xvZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2xvZ19saW51eC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L211cm11cl9oYXNoLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90aGQuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3RpbWVfd2luMzIuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9wcm9maWxpbmcvYmFzaWNfdGltZXJzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2FsbG9jLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYXZsLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NtZGxpbmUuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfaXBob25lLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2xpbnV4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3dpbmRvd3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfbGludXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfd2luMzIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9oaXN0b2dyYW0uYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9ob3N0X3BvcnQuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9sb2cuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfYW5kcm9pZC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19saW51eC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ193aW4zMi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc2xpY2UuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ19wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY19wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfd2luMzIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aGQuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfd2luMzIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfd2luMzIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90bHNfcHRocmVhZC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvd3JhcF9tZW1jcHkuYycsCiAgICAgICBdLAogICAgICAgImNvbmRpdGlvbnMiOiBbCiAgICAgICAgIFsnT1MgPT0gIm1hYyInLCB7CkBAIC01NTgsMTY3ICs1NTgsMTY3IEBACiAgICAgICAgICdncHInLAogICAgICAgXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL2dycGNfY29udGV4dC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYycsCi0gICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYycsCi0gICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYycsCi0gICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMnLAotICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMnLAotICAgICAgICAnc3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMnLAotICAgICAgICAnc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2RlYnVnL3RyYWNlLmMnLAotICAgICAgICAnc3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2h0dHAvcGFyc2VyLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9mZF9wb3NpeC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci90Y3BfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGltZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMnLAotICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9qc29uL2pzb25fc3RyaW5nLmMnLAotICAgICAgICAnc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvYWxhcm0uYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2FsbC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY3JlYXRlLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2luaXQuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMnLAotICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvdmVyc2lvbi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMnLAotICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvcGFyc2luZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMnLAotICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi93cml0aW5nLmMnLAotICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMnLAotICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmMnLAotICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMnLAotICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuYycsCi0gICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYycsCi0gICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9iNjQuYycsCi0gICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMnLAotICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYycsCi0gICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMnLAotICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMnLAotICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYycsCi0gICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYycsCi0gICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvaW5pdF9zZWN1cmUuYycsCi0gICAgICAgICdzcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMnLAotICAgICAgICAnc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMnLAotICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL2luaXRpYWxpemUuYycsCi0gICAgICAgICdzcmMvY29yZS9jZW5zdXMvbWxvZy5jJywKLSAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYycsCi0gICAgICAgICdzcmMvY29yZS9jZW5zdXMvcGxhY2Vob2xkZXJzLmMnLAotICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL3RyYWNpbmcuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9pbnNlY3VyZS9zZXJ2ZXJfY2h0dHAyLmMnLAorICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL3NlY3VyZS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmMnLAorICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmMnLAorICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMnLAorICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvcGFyc2luZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYycsCisgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmMnLAorICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC93cml0aW5nLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9jb250ZXh0LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvb3BlcmF0aW9uLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb21nci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl93aW5kb3dzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguYycsCisgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvanNvbi9qc29uLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvYWxhcm0uYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdF9zZWN1cmUuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYycsCisgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS92ZXJzaW9uLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYycsCisgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMnLAorICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jJywKKyAgICAgICAgJ3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMnLAogICAgICAgICAndGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5jJywKICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuYycsCiAgICAgICAgICd0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZW5jb2RlLmMnLApkaWZmIC0tZ2l0IGEvYnVpbGQueWFtbCBiL2J1aWxkLnlhbWwKaW5kZXggZmMxNzBjYy4uNDNkM2M2OCAxMDA2NDQKLS0tIGEvYnVpbGQueWFtbAorKysgYi9idWlsZC55YW1sCkBAIC0xMywxNiArMTMsMTYgQEAKICAgcHVibGljX2hlYWRlcnM6CiAgIC0gaW5jbHVkZS9ncnBjL2NlbnN1cy5oCiAgIGhlYWRlcnM6Ci0gIC0gc3JjL2NvcmUvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgKLSAgLSBzcmMvY29yZS9jZW5zdXMvbWxvZy5oCi0gIC0gc3JjL2NvcmUvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaAorICAtIHNyYy9jb3JlL2xpYi9jZW5zdXMvYWdncmVnYXRpb24uaAorICAtIHNyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5oCisgIC0gc3JjL2NvcmUvbGliL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgKICAgc3JjOgotICAtIHNyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMKLSAgLSBzcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jCi0gIC0gc3JjL2NvcmUvY2Vuc3VzL21sb2cuYwotICAtIHNyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYwotICAtIHNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYwotICAtIHNyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMKKyAgLSBzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYworICAtIHNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jCisgIC0gc3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMKKyAgLSBzcmMvY29yZS9saWIvY2Vuc3VzL29wZXJhdGlvbi5jCisgIC0gc3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYworICAtIHNyYy9jb3JlL2xpYi9jZW5zdXMvdHJhY2luZy5jCiAtIG5hbWU6IGdwcgogICBwdWJsaWNfaGVhZGVyczoKICAgLSBpbmNsdWRlL2dycGMvc3VwcG9ydC9hbGxvYy5oCkBAIC01NCw2MyArNTQsNjMgQEAKICAgLSBpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfcHRocmVhZC5oCiAgIC0gaW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmgKICAgaGVhZGVyczoKLSAgLSBzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaAotICAtIHNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaAotICAtIHNyYy9jb3JlL3N1cHBvcnQvZW52LmgKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaAotICAtIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuaAotICAtIHNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oCisgIC0gc3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaAorICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaAorICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaAorICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaAorICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaAorICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5oCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX2ludGVybmFsLmgKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaAorICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGUuaAogICBzcmM6Ci0gIC0gc3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jCi0gIC0gc3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2F2bC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2NtZGxpbmUuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvY3B1X2lwaG9uZS5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvY3B1X3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2NwdV93aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9lbnZfcG9zaXguYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvZW52X3dpbjMyLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2xvZy5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9sb2dfYW5kcm9pZC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9sb2dfbGludXguYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L2xvZ193aW4zMi5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zbGljZV9idWZmZXIuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3N0cmluZ19wb3NpeC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvc3luYy5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3N5bmNfd2luMzIuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvdGhkLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC90aGRfd2luMzIuYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvdGltZS5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC90aW1lX3dpbjMyLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMKLSAgLSBzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYwotICAtIHNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jCi0gIC0gc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jCisgIC0gc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYworICAtIHNyYy9jb3JlL2xpYi9wcm9maWxpbmcvc3RhcF90aW1lcnMuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2FsbG9jLmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NtZGxpbmUuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9saW51eC5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3Bvc2l4LmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X2xpbnV4LmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvaGlzdG9ncmFtLmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9ob3N0X3BvcnQuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nLmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfYW5kcm9pZC5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ193aW4zMi5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlLmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ19wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfd2luMzIuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3Bvc2l4LmMKKyAgLSBzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfd2luMzIuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jCisgIC0gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGxzX3B0aHJlYWQuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYworICAtIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3dyYXBfbWVtY3B5LmMKIC0gbmFtZTogZ3ByX2NvZGVnZW4KICAgcHVibGljX2hlYWRlcnM6CiAgIC0gaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oCkBAIC0yNDcsMjYxICsyNDcsMjE3IEBACiAgIC0gaW5jbHVkZS9ncnBjL2dycGMuaAogICAtIGluY2x1ZGUvZ3JwYy9zdGF0dXMuaAogICBoZWFkZXJzOgotICAtIHNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oCi0gIC0gc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgKLSAgLSBzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgKLSAgLSBzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaAotICAtIHNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaAotICAtIHNyYy9jb3JlL2NoYW5uZWwvY29udGV4dC5oCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaAotICAtIHNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgKLSAgLSBzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaAotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaAotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaAotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaAotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaAotICAtIHNyYy9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oCi0gIC0gc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oCi0gIC0gc3JjL2NvcmUvZGVidWcvdHJhY2UuaAotICAtIHNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuaAotICAtIHNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oCi0gIC0gc3JjL2NvcmUvaHR0cC9wYXJzZXIuaAotICAtIHNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuaAotICAtIHNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgKLSAgLSBzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgKLSAgLSBzcmMvY29yZS9pb21nci9leGVjX2N0eC5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaAotICAtIHNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgKLSAgLSBzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaAotICAtIHNyYy9jb3JlL2lvbWdyL2lvbWdyLmgKLSAgLSBzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaAotICAtIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaAotICAtIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaAotICAtIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgKLSAgLSBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgKLSAgLSBzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaAotICAtIHNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgKLSAgLSBzcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oCi0gIC0gc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaAotICAtIHNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgKLSAgLSBzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaAotICAtIHNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgKLSAgLSBzcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgKLSAgLSBzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaAotICAtIHNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaAotICAtIHNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmgKLSAgLSBzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgKLSAgLSBzcmMvY29yZS9pb21nci90aW1lci5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgKLSAgLSBzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5oCi0gIC0gc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgKLSAgLSBzcmMvY29yZS9pb21nci93b3JrcXVldWUuaAotICAtIHNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oCi0gIC0gc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaAotICAtIHNyYy9jb3JlL2pzb24vanNvbi5oCi0gIC0gc3JjL2NvcmUvanNvbi9qc29uX2NvbW1vbi5oCi0gIC0gc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oCi0gIC0gc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oCi0gIC0gc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgKLSAgLSBzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaAotICAtIHNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaAotICAtIHNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaAotICAtIHNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuaAotICAtIHNyYy9jb3JlL3N1cmZhY2UvaW5pdC5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaAotICAtIHNyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWUuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHR0cDJfZXJyb3JzLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaAotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgKKyAgLSBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgKKyAgLSBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmgKKyAgLSBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaAorICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaAorICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oCisgIC0gc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaAorICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oCisgIC0gc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaAorICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbnRleHQuaAorICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oCisgIC0gc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgKKyAgLSBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaAorICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaAorICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaAorICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaAorICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgKKyAgLSBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgKKyAgLSBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oCisgIC0gc3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgKKyAgLSBzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5oCisgIC0gc3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oCisgIC0gc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXQuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXIuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWUuaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguaAorICAtIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5oCisgIC0gc3JjL2NvcmUvbGliL2pzb24vanNvbi5oCisgIC0gc3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaAorICAtIHNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmgKKyAgLSBzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oCisgIC0gc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oCisgIC0gc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oCisgIC0gc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaAorICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaAorICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuaAorICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oCisgIC0gc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oCisgIC0gc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaAorICAtIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaAorICAtIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaAorICAtIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgKKyAgLSBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oCisgIC0gc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oCiAgIHNyYzoKLSAgLSBzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMKLSAgLSBzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYwotICAtIHNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYwotICAtIHNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYwotICAtIHNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYwotICAtIHNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMKLSAgLSBzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMKLSAgLSBzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jCi0gIC0gc3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYwotICAtIHNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYwotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYwotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYwotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jCi0gIC0gc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYwotICAtIHNyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jCi0gIC0gc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jCi0gIC0gc3JjL2NvcmUvZGVidWcvdHJhY2UuYwotICAtIHNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYwotICAtIHNyYy9jb3JlL2h0dHAvaHR0cGNsaS5jCi0gIC0gc3JjL2NvcmUvaHR0cC9wYXJzZXIuYwotICAtIHNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYwotICAtIHNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMKLSAgLSBzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYwotICAtIHNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMKLSAgLSBzcmMvY29yZS9pb21nci9leGVjdXRvci5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguYwotICAtIHNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYwotICAtIHNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYwotICAtIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYwotICAtIHNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jCi0gIC0gc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jCi0gIC0gc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMKLSAgLSBzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYwotICAtIHNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYwotICAtIHNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdGltZXIuYwotICAtIHNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYwotICAtIHNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYwotICAtIHNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jCi0gIC0gc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYwotICAtIHNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMKLSAgLSBzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMKLSAgLSBzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jCi0gIC0gc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMKLSAgLSBzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguYwotICAtIHNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMKLSAgLSBzcmMvY29yZS9qc29uL2pzb24uYwotICAtIHNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYwotICAtIHNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYwotICAtIHNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYwotICAtIHNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2NhbGwuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYwotICAtIHNyYy9jb3JlL3N1cmZhY2UvaW5pdC5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYwotICAtIHNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyX2NodHRwMi5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jCi0gIC0gc3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYwotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYwotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYwotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYwotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYwotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMKLSAgLSBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYwotICAtIHNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jCi0gIC0gc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYworICAtIHNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19jb250ZXh0LmMKKyAgLSBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmMKKyAgLSBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMKKyAgLSBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYworICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suYworICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jCisgIC0gc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYworICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jCisgIC0gc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYworICAtIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jCisgIC0gc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMKKyAgLSBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMKKyAgLSBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYworICAtIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYworICAtIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMKKyAgLSBzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuYworICAtIHNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMKKyAgLSBzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMKKyAgLSBzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci90aW1lci5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMKKyAgLSBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYworICAtIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jCisgIC0gc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMKKyAgLSBzcmMvY29yZS9saWIvanNvbi9qc29uLmMKKyAgLSBzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jCisgIC0gc3JjL2NvcmUvbGliL2pzb24vanNvbl9zdHJpbmcuYworICAtIHNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMKKyAgLSBzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYworICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3BpbmcuYworICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMKKyAgLSBzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYworICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5jCisgIC0gc3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYworICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYworICAtIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYworICAtIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMKKyAgLSBzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMKKyAgLSBzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMKKyAgLSBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jCisgIC0gc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuYworICAtIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jCiAtIG5hbWU6IGdycGNfY29kZWdlbgogICBwdWJsaWNfaGVhZGVyczoKICAgLSBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgKQEAgLTUxMiw0MiArNDY4LDQwIEBACiAgIC0gaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zdGF0dXMuaAogLSBuYW1lOiBncnBjX3NlY3VyZQogICBoZWFkZXJzOgotICAtIHNyYy9jb3JlL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmgKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmgKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaAotICAtIHNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgKLSAgLSBzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaAotICAtIHNyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgKLSAgLSBzcmMvY29yZS90c2kvc3NsX3R5cGVzLmgKLSAgLSBzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgKLSAgLSBzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgKKyAgLSBzcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmgKKyAgLSBzcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaAorICAtIHNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaAorICAtIHNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oCisgIC0gc3JjL2NvcmUvbGliL3RzaS9zc2xfdHlwZXMuaAorICAtIHNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgKKyAgLSBzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaAogICBzcmM6Ci0gIC0gc3JjL2NvcmUvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYwotICAtIHNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYwotICAtIHNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYwotICAtIHNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jCi0gIC0gc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMKLSAgLSBzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYwotICAtIHNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2luaXRfc2VjdXJlLmMKLSAgLSBzcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jCi0gIC0gc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMKLSAgLSBzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jCi0gIC0gc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jCisgIC0gc3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYworICAtIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuYworICAtIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYworICAtIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5jCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMKKyAgLSBzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYworICAtIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMKKyAgLSBzcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmMKKyAgLSBzcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5jCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jCisgIC0gc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYworICAtIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYworICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfc2VjdXJlLmMKKyAgLSBzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMKKyAgLSBzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYworICAtIHNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMKIC0gbmFtZTogZ3JwY190ZXN0X3V0aWxfYmFzZQogICBoZWFkZXJzOgogICAtIHRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgKQEAgLTU2OCw2ICs1MjIsNzcgQEAKICAgLSB0ZXN0L2NvcmUvdXRpbC9wb3J0X3NlcnZlcl9jbGllbnQuYwogICAtIHRlc3QvY29yZS91dGlsL3BvcnRfd2luZG93cy5jCiAgIC0gdGVzdC9jb3JlL3V0aWwvc2xpY2Vfc3BsaXR0ZXIuYworLSBuYW1lOiBncnBjX3RyYW5zcG9ydF9jaHR0cDIKKyAgaGVhZGVyczoKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuaAorICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuaAorICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuaAorICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uaAorICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmgKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oCisgIHNyYzoKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmMKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYworICAtIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmMKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jCisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYworICB1c2VzOgorICAtIGdycGNfYmFzZQorLSBuYW1lOiBncnBjX3RyYW5zcG9ydF9jaHR0cDJfY2xpZW50X2luc2VjdXJlCisgIHNyYzoKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYworICB1c2VzOgorICAtIGdycGNfdHJhbnNwb3J0X2NodHRwMgorICAtIGdycGNfYmFzZQorLSBuYW1lOiBncnBjX3RyYW5zcG9ydF9jaHR0cDJfY2xpZW50X3NlY3VyZQorICBzcmM6CisgIC0gc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L3NlY3VyZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYworICB1c2VzOgorICAtIGdycGNfdHJhbnNwb3J0X2NodHRwMgorICAtIGdycGNfYmFzZQorLSBuYW1lOiBncnBjX3RyYW5zcG9ydF9jaHR0cDJfc2VydmVyX2luc2VjdXJlCisgIHNyYzoKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvc2VydmVyX2NodHRwMi5jCisgIHVzZXM6CisgIC0gZ3JwY190cmFuc3BvcnRfY2h0dHAyCisgIC0gZ3JwY19iYXNlCistIG5hbWU6IGdycGNfdHJhbnNwb3J0X2NodHRwMl9zZXJ2ZXJfc2VjdXJlCisgIHNyYzoKKyAgLSBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvc2VjdXJlL3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMKKyAgdXNlczoKKyAgLSBncnBjX3RyYW5zcG9ydF9jaHR0cDIKKyAgLSBncnBjX2Jhc2UKIC0gbmFtZTogbmFub3BiCiAgIGhlYWRlcnM6CiAgIC0gdGhpcmRfcGFydHkvbmFub3BiL3BiLmgKQEAgLTYxMCw2ICs2MzUsMTAgQEAKICAgZGxsOiB0cnVlCiAgIGZpbGVncm91cHM6CiAgIC0gZ3JwY19iYXNlCisgIC0gZ3JwY190cmFuc3BvcnRfY2h0dHAyX3NlcnZlcl9zZWN1cmUKKyAgLSBncnBjX3RyYW5zcG9ydF9jaHR0cDJfY2xpZW50X3NlY3VyZQorICAtIGdycGNfdHJhbnNwb3J0X2NodHRwMl9zZXJ2ZXJfaW5zZWN1cmUKKyAgLSBncnBjX3RyYW5zcG9ydF9jaHR0cDJfY2xpZW50X2luc2VjdXJlCiAgIC0gZ3JwY19zZWN1cmUKICAgLSBncnBjX2NvZGVnZW4KICAgLSBjZW5zdXMKQEAgLTY4Myw3ICs3MTIsNyBAQAogICBidWlsZDogYWxsCiAgIGxhbmd1YWdlOiBjCiAgIHNyYzoKLSAgLSBzcmMvY29yZS9zdXJmYWNlL2luaXRfdW5zZWN1cmUuYworICAtIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfdW5zZWN1cmUuYwogICBkZXBzOgogICAtIGdwcgogICBiYXNlbGliOiB0cnVlCkBAIC02OTEsNiArNzIwLDggQEAKICAgZGxsOiB0cnVlCiAgIGZpbGVncm91cHM6CiAgIC0gZ3JwY19iYXNlCisgIC0gZ3JwY190cmFuc3BvcnRfY2h0dHAyX3NlcnZlcl9pbnNlY3VyZQorICAtIGdycGNfdHJhbnNwb3J0X2NodHRwMl9jbGllbnRfaW5zZWN1cmUKICAgLSBncnBjX2NvZGVnZW4KICAgLSBjZW5zdXMKICAgLSBuYW5vcGIKQEAgLTcwMiw5ICs3MzMsOSBAQAogICBwdWJsaWNfaGVhZGVyczoKICAgLSBpbmNsdWRlL2dycGMvZ3JwY196b29rZWVwZXIuaAogICBoZWFkZXJzOgotICAtIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oCisgIC0gc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oCiAgIHNyYzoKLSAgLSBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYworICAtIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYwogICBkZXBzOgogICAtIGdwcgogICAtIGdycGMKQEAgLTE1NDMsNiArMTU3NCwxOCBAQAogICAtIGdycGMKICAgLSBncHJfdGVzdF91dGlsCiAgIC0gZ3ByCistIG5hbWU6IGhwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdAorICBidWlsZDogZnV6emVyCisgIGxhbmd1YWdlOiBjCisgIHNyYzoKKyAgLSB0ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfZnV6emVyX3Rlc3QuYworICBkZXBzOgorICAtIGdycGNfdGVzdF91dGlsCisgIC0gZ3JwYworICAtIGdwcl90ZXN0X3V0aWwKKyAgLSBncHIKKyAgY29ycHVzX2RpcnM6CisgIC0gdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cwogLSBuYW1lOiBocGFja19wYXJzZXJfdGVzdAogICBidWlsZDogdGVzdAogICBsYW5ndWFnZTogYwpAQCAtMTU2Myw2ICsxNjA2LDE4IEBACiAgIC0gZ3JwYwogICAtIGdwcl90ZXN0X3V0aWwKICAgLSBncHIKKy0gbmFtZTogaHR0cF9mdXp6ZXJfdGVzdAorICBidWlsZDogZnV6emVyCisgIGxhbmd1YWdlOiBjCisgIHNyYzoKKyAgLSB0ZXN0L2NvcmUvaHR0cC9mdXp6ZXIuYworICBkZXBzOgorICAtIGdycGNfdGVzdF91dGlsCisgIC0gZ3JwYworICAtIGdwcl90ZXN0X3V0aWwKKyAgLSBncHIKKyAgY29ycHVzX2RpcnM6CisgIC0gdGVzdC9jb3JlL2h0dHAvY29ycHVzCiAtIG5hbWU6IGh0dHBfcGFyc2VyX3Rlc3QKICAgYnVpbGQ6IHRlc3QKICAgbGFuZ3VhZ2U6IGMKQEAgLTE2MzEsNiArMTY4NiwxOCBAQAogICAtIGdycGMKICAgLSBncHJfdGVzdF91dGlsCiAgIC0gZ3ByCistIG5hbWU6IGpzb25fZnV6emVyX3Rlc3QKKyAgYnVpbGQ6IGZ1enplcgorICBsYW5ndWFnZTogYworICBzcmM6CisgIC0gdGVzdC9jb3JlL2pzb24vZnV6emVyLmMKKyAgZGVwczoKKyAgLSBncnBjX3Rlc3RfdXRpbAorICAtIGdycGMKKyAgLSBncHJfdGVzdF91dGlsCisgIC0gZ3ByCisgIGNvcnB1c19kaXJzOgorICAtIHRlc3QvY29yZS9qc29uL2NvcnB1cwogLSBuYW1lOiBqc29uX3Jld3JpdGUKICAgYnVpbGQ6IHRlc3QKICAgcnVuOiBmYWxzZQpAQCAtMTk5NCw2ICsyMDYxLDE4IEBACiAgIC0gbWFjCiAgIC0gbGludXgKICAgLSBwb3NpeAorLSBuYW1lOiB1cmlfZnV6emVyX3Rlc3QKKyAgYnVpbGQ6IGZ1enplcgorICBsYW5ndWFnZTogYworICBzcmM6CisgIC0gdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2Z1enplcl90ZXN0LmMKKyAgZGVwczoKKyAgLSBncnBjX3Rlc3RfdXRpbAorICAtIGdycGMKKyAgLSBncHJfdGVzdF91dGlsCisgIC0gZ3ByCisgIGNvcnB1c19kaXJzOgorICAtIHRlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMKIC0gbmFtZTogdXJpX3BhcnNlcl90ZXN0CiAgIGJ1aWxkOiB0ZXN0CiAgIGxhbmd1YWdlOiBjCkBAIC0yNzc1LDggKzI4NTQsOCBAQAogY29uZmlnczoKICAgYXNhbjoKICAgICBDQzogY2xhbmcKLSAgICBDUFBGTEFHUzogLU8wIC1mc2FuaXRpemU9YWRkcmVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQKLSAgICAgIC1ER1BSX05PX0RJUkVDVF9TWVNDQUxMUworICAgIENQUEZMQUdTOiAtTzAgLWZzYW5pdGl6ZS1jb3ZlcmFnZT1lZGdlIC1mc2FuaXRpemU9YWRkcmVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlcgorICAgICAgLVduby11bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtZW50IC1ER1BSX05PX0RJUkVDVF9TWVNDQUxMUwogICAgIENYWDogY2xhbmcrKwogICAgIExEOiBjbGFuZwogICAgIExERkxBR1M6IC1mc2FuaXRpemU9YWRkcmVzcwpAQCAtMjc4OCw4ICsyODY3LDggQEAKICAgICB0aW1lb3V0X211bHRpcGxpZXI6IDMKICAgYXNhbi1ub2xlYWtzOgogICAgIENDOiBjbGFuZwotICAgIENQUEZMQUdTOiAtTzAgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudAotICAgICAgLURHUFJfTk9fRElSRUNUX1NZU0NBTExTCisgICAgQ1BQRkxBR1M6IC1PMCAtZnNhbml0aXplLWNvdmVyYWdlPWVkZ2UgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCisgICAgICAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQgLURHUFJfTk9fRElSRUNUX1NZU0NBTExTCiAgICAgQ1hYOiBjbGFuZysrCiAgICAgTEQ6IGNsYW5nCiAgICAgTERGTEFHUzogLWZzYW5pdGl6ZT1hZGRyZXNzCkBAIC0yNzk4LDYgKzI4NzcsMTkgQEAKICAgICB0ZXN0X2Vudmlyb246CiAgICAgICBBU0FOX09QVElPTlM6IGRldGVjdF9sZWFrcz0wOmNvbG9yPWFsd2F5cwogICAgIHRpbWVvdXRfbXVsdGlwbGllcjogMworICBhc2FuLXRyYWNlLWNtcDoKKyAgICBDQzogY2xhbmcKKyAgICBDUFBGTEFHUzogLU8wIC1mc2FuaXRpemUtY292ZXJhZ2U9ZWRnZSAtZnNhbml0aXplLWNvdmVyYWdlPXRyYWNlLWNtcCAtZnNhbml0aXplPWFkZHJlc3MKKyAgICAgIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKKyAgICBDWFg6IGNsYW5nKysKKyAgICBMRDogY2xhbmcKKyAgICBMREZMQUdTOiAtZnNhbml0aXplPWFkZHJlc3MKKyAgICBMRFhYOiBjbGFuZysrCisgICAgY29tcGlsZV90aGVfd29ybGQ6IHRydWUKKyAgICB0ZXN0X2Vudmlyb246CisgICAgICBBU0FOX09QVElPTlM6IGRldGVjdF9sZWFrcz0xOmNvbG9yPWFsd2F5cworICAgICAgTFNBTl9PUFRJT05TOiBzdXBwcmVzc2lvbnM9dG9vbHMvbHNhbl9zdXBwcmVzc2lvbnMudHh0OnJlcG9ydF9vYmplY3RzPTEKKyAgICB0aW1lb3V0X211bHRpcGxpZXI6IDMKICAgYmFzaWNwcm9mOgogICAgIENQUEZMQUdTOiAtTzIgLURHUlBDX0JBU0lDX1BST0ZJTEVSIC1ER1JQQ19USU1FUlNfUkRUU0MKICAgICBERUZJTkVTOiBOREVCVUcKQEAgLTI4MDYsOCArMjg5OCw4IEBACiAgICAgREVGSU5FUzogX0RFQlVHIERFQlVHCiAgIGVhc2FuOgogICAgIENDOiBjbGFuZwotICAgIENQUEZMQUdTOiAtTzAgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudAotICAgICAgLURHUFJfTk9fRElSRUNUX1NZU0NBTExTCisgICAgQ1BQRkxBR1M6IC1PMCAtZnNhbml0aXplLWNvdmVyYWdlPWVkZ2UgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCisgICAgICAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQgLURHUFJfTk9fRElSRUNUX1NZU0NBTExTCiAgICAgQ1hYOiBjbGFuZysrCiAgICAgREVGSU5FUzogX0RFQlVHIERFQlVHIEdSUENfRVhFQ1VUSU9OX0NPTlRFWFRfU0FOSVRJWkVSCiAgICAgTEQ6IGNsYW5nCkBAIC0yODU2LDkgKzI5NDgsOSBAQAogICAgIHZhbGdyaW5kOiAtLXRvb2w9bWVtY2hlY2sgLS1sZWFrLWNoZWNrPWZ1bGwKICAgbXNhbjoKICAgICBDQzogY2xhbmcKLSAgICBDUFBGTEFHUzogLU8wIC1mc2FuaXRpemU9bWVtb3J5IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKLSAgICAgIC1ER1RFU1RfSEFTX1RSMV9UVVBMRT0wIC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MSAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQKLSAgICAgIC1mUElFIC1waWUgLURHUFJfTk9fRElSRUNUX1NZU0NBTExTCisgICAgQ1BQRkxBR1M6IC1PMCAtZnNhbml0aXplLWNvdmVyYWdlPWVkZ2UgLWZzYW5pdGl6ZT1tZW1vcnkgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucworICAgICAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLURHVEVTVF9IQVNfVFIxX1RVUExFPTAgLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xCisgICAgICAtV25vLXVudXNlZC1jb21tYW5kLWxpbmUtYXJndW1lbnQgLWZQSUUgLXBpZSAtREdQUl9OT19ESVJFQ1RfU1lTQ0FMTFMKICAgICBDWFg6IGNsYW5nKysKICAgICBERUZJTkVTOiBOREVCVUcKICAgICBMRDogY2xhbmcKQEAgLTI4OTEsNyArMjk4Myw4IEBACiAgICAgdGltZW91dF9tdWx0aXBsaWVyOiA1CiAgIHVic2FuOgogICAgIENDOiBjbGFuZwotICAgIENQUEZMQUdTOiAtTzEgLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLVduby11bnVzZWQtY29tbWFuZC1saW5lLWFyZ3VtZW50CisgICAgQ1BQRkxBR1M6IC1PMSAtZnNhbml0aXplLWNvdmVyYWdlPWVkZ2UgLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKyAgICAgIC1Xbm8tdW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudAogICAgIENYWDogY2xhbmcrKwogICAgIERFRklORVM6IE5ERUJVRwogICAgIExEOiBjbGFuZwpkaWZmIC0tZ2l0IGEvY29uZmlnLm00IGIvY29uZmlnLm00CmluZGV4IDhhNWIyMzkuLjY1M2IyODcgMTAwNjQ0Ci0tLSBhL2NvbmZpZy5tNAorKysgYi9jb25maWcubTQKQEAgLTM2LDIxMSArMzYsMjExIEBACiAgICAgc3JjL3BocC9leHQvZ3JwYy9zZXJ2ZXIuYyBcCiAgICAgc3JjL3BocC9leHQvZ3JwYy9zZXJ2ZXJfY3JlZGVudGlhbHMuYyBcCiAgICAgc3JjL3BocC9leHQvZ3JwYy90aW1ldmFsLmMgXAotICAgIHNyYy9jb3JlL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyBcCi0gICAgc3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvYWxsb2MuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9hdmwuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvY21kbGluZS5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2NwdV9pcGhvbmUuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9jcHVfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9jcHVfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2Vudl9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2hvc3RfcG9ydC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2xvZy5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L2xvZ19hbmRyb2lkLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbG9nX3dpbjMyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3N5bmMuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvc3luY193aW4zMi5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3RoZC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3RoZF93aW4zMi5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3RpbWUuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdGltZV93aW4zMi5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMgXAotICAgIHNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyBcCi0gICAgc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMgXAotICAgIHNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyBcCi0gICAgc3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIFwKLSAgICBzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyBcCi0gICAgc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMgXAotICAgIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIFwKLSAgICBzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyBcCi0gICAgc3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMgXAotICAgIHNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyBcCi0gICAgc3JjL2NvcmUvZGVidWcvdHJhY2UuYyBcCi0gICAgc3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIFwKLSAgICBzcmMvY29yZS9odHRwL2h0dHBjbGkuYyBcCi0gICAgc3JjL2NvcmUvaHR0cC9wYXJzZXIuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jIFwKLSAgICBzcmMvY29yZS9pb21nci9lbmRwb2ludC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9leGVjX2N0eC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9leGVjdXRvci5jIFwKLSAgICBzcmMvY29yZS9pb21nci9mZF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIFwKLSAgICBzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jIFwKLSAgICBzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RpbWVyLmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5jIFwKLSAgICBzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jIFwKLSAgICBzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jIFwKLSAgICBzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMgXAotICAgIHNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMgXAotICAgIHNyYy9jb3JlL2pzb24vanNvbi5jIFwKLSAgICBzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmMgXAotICAgIHNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyBcCi0gICAgc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5jIFwKLSAgICBzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2FsbC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvaW5pdC5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMgXAotICAgIHNyYy9jb3JlL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbGlzdHMuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMgXAotICAgIHNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIFwKLSAgICBzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIFwKLSAgICBzcmMvY29yZS9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgXAotICAgIHNyYy9jb3JlL3NlY3VyaXR5L2I2NC5jIFwKLSAgICBzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMgXAotICAgIHNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMgXAotICAgIHNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jIFwKLSAgICBzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jIFwKLSAgICBzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyBcCi0gICAgc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyBcCi0gICAgc3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jIFwKLSAgICBzcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIFwKLSAgICBzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCi0gICAgc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCi0gICAgc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvY29udGV4dC5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvbWxvZy5jIFwKLSAgICBzcmMvY29yZS9jZW5zdXMvb3BlcmF0aW9uLmMgXAotICAgIHNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyBcCi0gICAgc3JjL2NvcmUvY2Vuc3VzL3RyYWNpbmcuYyBcCisgICAgc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyBcCisgICAgc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9hbGxvYy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9jbWRsaW5lLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2xpbnV4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfbGludXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9oaXN0b2dyYW0uYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvaG9zdF9wb3J0LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2cuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfd2luMzIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc2xpY2UuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3dpbjMyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3dpbjMyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90bHNfcHRocmVhZC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cHBvcnQvd3JhcF9tZW1jcHkuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L2luc2VjdXJlL2NoYW5uZWxfY3JlYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9pbnNlY3VyZS9zZXJ2ZXJfY2h0dHAyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMgXAorICAgIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYyBcCisgICAgc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIFwKKyAgICBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvd3JpdGluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIFwKKyAgICBzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyBcCisgICAgc3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMgXAorICAgIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyBcCisgICAgc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIFwKKyAgICBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMgXAorICAgIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIFwKKyAgICBzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIFwKKyAgICBzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMgXAorICAgIHNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9pb21nci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci90aW1lci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmMgXAorICAgIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyBcCisgICAgc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyBcCisgICAgc3JjL2NvcmUvbGliL2pzb24vanNvbi5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jIFwKKyAgICBzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jIFwKKyAgICBzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYyBcCisgICAgc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMgXAorICAgIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIFwKKyAgICBzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgXAorICAgIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMgXAorICAgIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuYyBcCisgICAgc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIFwKKyAgICBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyBcCisgICAgc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIFwKKyAgICBzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCisgICAgc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCiAgICAgdGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5jIFwKICAgICB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmMgXAogICAgIHRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuYyBcCkBAIC01NDYsMjQgKzU0NiwyOCBAQAogICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9waHAvZXh0L2dycGMpCiAKICAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvYm9yaW5nc3NsKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL2NlbnN1cykKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9jaGFubmVsKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL2NsaWVudF9jb25maWcpCi0gIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcykKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycykKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9jb21wcmVzc2lvbikKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9kZWJ1ZykKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9odHRwKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL2lvbWdyKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL2pzb24pCi0gIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvcHJvZmlsaW5nKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjApCi0gIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvc2VjdXJpdHkpCi0gIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvc3VwcG9ydCkKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9zdXJmYWNlKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL3RyYW5zcG9ydCkKLSAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyKQotICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL3RzaSkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L3NlY3VyZSkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL3NlY3VyZSkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL2NlbnN1cykKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvY2hhbm5lbCkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZykKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcykKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uKQorICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3NyYy9jb3JlL2xpYi9kZWJ1ZykKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvaHR0cCkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvaW9tZ3IpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL2pzb24pCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL3Byb2ZpbGluZykKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MCkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvc2VjdXJpdHkpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL3N1cHBvcnQpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL3N1cmZhY2UpCisgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvc3JjL2NvcmUvbGliL3RyYW5zcG9ydCkKKyAgUEhQX0FERF9CVUlMRF9ESVIoJGV4dF9idWlsZGRpci9zcmMvY29yZS9saWIvdHNpKQogICBQSFBfQUREX0JVSUxEX0RJUigkZXh0X2J1aWxkZGlyL3RoaXJkX3BhcnR5L2JvcmluZ3NzbC9jcnlwdG8pCiAgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9hZXMpCiAgIFBIUF9BRERfQlVJTERfRElSKCRleHRfYnVpbGRkaXIvdGhpcmRfcGFydHkvYm9yaW5nc3NsL2NyeXB0by9hc24xKQpkaWZmIC0tZ2l0IGEvZG9jL2ludGVyb3AtdGVzdC1kZXNjcmlwdGlvbnMubWQgYi9kb2MvaW50ZXJvcC10ZXN0LWRlc2NyaXB0aW9ucy5tZAppbmRleCAzYmViMWQxLi42Mjk3YjVjIDEwMDY0NAotLS0gYS9kb2MvaW50ZXJvcC10ZXN0LWRlc2NyaXB0aW9ucy5tZAorKysgYi9kb2MvaW50ZXJvcC10ZXN0LWRlc2NyaXB0aW9ucy5tZApAQCAtMjcsNyArMjcsNyBAQAogICAgICogV2hldGhlciB0byB1c2UgYSBwbGFpbnRleHQgb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb24KICogLS11c2VfdGVzdF9jYT1CT09MRUFOCiAgICAgKiBXaGV0aGVyIHRvIHJlcGxhY2UgcGxhdGZvcm0gcm9vdCBDQXMgd2l0aAotICAgICAgW2NhLnBlbV0oaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL21hc3Rlci9zcmMvY29yZS90c2kvdGVzdF9jcmVkcy9jYS5wZW0pCisgICAgICBbY2EucGVtXShodHRwczovL2dpdGh1Yi5jb20vZ3JwYy9ncnBjL2Jsb2IvbWFzdGVyL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9jYS5wZW0pCiAgICAgICBhcyB0aGUgQ0Egcm9vdAogKiAtLWRlZmF1bHRfc2VydmljZV9hY2NvdW50PUFDQ09VTlRfRU1BSUwKICAgICAqIEVtYWlsIG9mIHRoZSBHQ0UgZGVmYXVsdCBzZXJ2aWNlIGFjY291bnQuIE9ubHkgYXBwbGljYWJsZQpAQCAtOTIwLDcgKzkyMCw3IEBACiAgICAgKiBXaGV0aGVyIHRvIHVzZSBhIHBsYWludGV4dCBvciBlbmNyeXB0ZWQgY29ubmVjdGlvbgogCiBTZXJ2ZXJzIG11c3Qgc3VwcG9ydCBUTFMgd2l0aCBBTFBOLiBUaGV5IHNob3VsZCB1c2UKLVtzZXJ2ZXIxLnBlbV0oaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL21hc3Rlci9zcmMvY29yZS90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIxLnBlbSkKK1tzZXJ2ZXIxLnBlbV0oaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL21hc3Rlci9zcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS5wZW0pCiBmb3IgdGhlaXIgY2VydGlmaWNhdGUuCiAKICMjIyBFbXB0eUNhbGwKZGlmZiAtLWdpdCBhL2dSUEMucG9kc3BlYyBiL2dSUEMucG9kc3BlYwppbmRleCAyYTNlZDE1Li4wODMzMGViIDEwMDY0NAotLS0gYS9nUlBDLnBvZHNwZWMKKysrIGIvZ1JQQy5wb2RzcGVjCkBAIC02MywxOCArNjMsMzIgQEAKIAogICAjIENvcmUgY3Jvc3MtcGxhdGZvcm0gZ1JQQyBsaWJyYXJ5LCB3cml0dGVuIGluIEMuCiAgIHMuc3Vic3BlYyAnQy1Db3JlJyBkbyB8c3N8Ci0gICAgc3Muc291cmNlX2ZpbGVzID0gJ3NyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9lbnYuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L211cm11cl9oYXNoLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGhkX2ludGVybmFsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlLmgnLAorICAgIHNzLnNvdXJjZV9maWxlcyA9ICdzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9zdXBwb3J0L2FsbG9jLmgnLAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG0uaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bV9nY2NfYXRvbWljLmgnLApAQCAtMTAzLDUzMiArMTE3LDUxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfbXN2Yy5oJywKICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL3N1cHBvcnQvdGxzX3B0aHJlYWQuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9zdXBwb3J0L3VzZWZ1bC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9hdmwuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2NwdV9pcGhvbmUuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvY3B1X2xpbnV4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9jcHVfd2luZG93cy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9lbnZfbGludXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9oaXN0b2dyYW0uYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9sb2cuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L2xvZ19wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc2xpY2UuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N5bmMuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3luY19wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3RoZC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90aGRfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3RpbWUuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGltZV9wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGltZV93aW4zMi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90bHNfcHRocmVhZC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvd3JhcF9tZW1jcHkuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY29udGV4dC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZGVidWcvdHJhY2UuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaHR0cC9wYXJzZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9leGVjX2N0eC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90aW1lci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvanNvbi9qc29uX2NvbW1vbi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2FsbC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvaW5pdC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHR0cDJfZXJyb3JzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2I2NC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHNpL3NzbF90eXBlcy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9hZ2dyZWdhdGlvbi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL21sb2cuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYWxsb2MuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2F2bC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2lwaG9uZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2xpbnV4LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfcG9zaXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV93aW5kb3dzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfbGludXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X3dpbjMyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9oaXN0b2dyYW0uYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9sb2cuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfbGludXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc2xpY2UuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luYy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY19wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfcG9zaXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF93aW4zMi5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3dpbjMyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90bHNfcHRocmVhZC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvd3JhcF9tZW1jcHkuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odHRwMl9lcnJvcnMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvcnBjX21ldHJpY19pZC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb21nci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb24uaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgnLAogICAgICAgICAgICAgICAgICAgICAgICd0aGlyZF9wYXJ0eS9uYW5vcGIvcGIuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmgnLAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXIuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9jZW5zdXMuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9jb21wcmVzc2lvbi5oJywKICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2dycGMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9zdGF0dXMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmgnLAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgnLAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmgnLAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oJywKICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgnLAogICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvY2Vuc3VzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZGVidWcvdHJhY2UuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaHR0cC9wYXJzZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9leGVjdXRvci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGltZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9qc29uL2pzb24uYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NhbGwuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvaW5pdC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyX2NodHRwMi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2I2NC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMnLAotICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jJywKLSAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL21sb2cuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYycsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlL2dycGMvc3RhdHVzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvc2VydmVyX2NodHRwMi5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL3NlY3VyZS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvcGFyc2luZy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX2xpc3RzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC93cml0aW5nLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19jb250ZXh0LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2luaXRpYWxpemUuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvcGxhY2Vob2xkZXJzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90aW1lci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvanNvbi9qc29uLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl9zdHJpbmcuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3BpbmcuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS92ZXJzaW9uLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMnLAorICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYycsCisgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYycsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uYycsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuYycsCiAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuYycKIAotICAgIHNzLnByaXZhdGVfaGVhZGVyX2ZpbGVzID0gJ3NyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9lbnYuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGhkX2ludGVybmFsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2hhbm5lbC9jb250ZXh0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9kZWJ1Zy90cmFjZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9odHRwL3BhcnNlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9jbG9zdXJlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90aW1lci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2UvaW5pdC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L2I2NC5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS90c2kvc3NsX3R5cGVzLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9tbG9nLmgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgnLAorICAgIHNzLnByaXZhdGVfaGVhZGVyX2ZpbGVzID0gJ3NyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odHRwMl9lcnJvcnMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9hZ2dyZWdhdGlvbi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvcnBjX21ldHJpY19pZC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbnRleHQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9pb21nci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb24uaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS9zc2xfdHlwZXMuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYi5oJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuaCcsCmRpZmYgLS1naXQgYS9ncnBjLmdlbXNwZWMgYi9ncnBjLmdlbXNwZWMKaW5kZXggZWVkYTAzNS4uYzUxNmY1MiAxMDA3NTUKLS0tIGEvZ3JwYy5nZW1zcGVjCisrKyBiL2dycGMuZ2Vtc3BlYwpAQCAtNDYsNiArNDYsMjAgQEAKIAogICBzLmV4dGVuc2lvbnMgPSAldyhzcmMvcnVieS9leHQvZ3JwYy9leHRjb25mLnJiKQogCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYWxsb2MuaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmggKQorICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmggKQorICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2Nfc3luYy5oICkKKyAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmggKQorICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmggKQorICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmMuaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmggKQorICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY193aW4zMi5oICkKKyAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvc3VwcG9ydC9hbGxvYy5oICkKICAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL3N1cHBvcnQvYXRtLmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG1fZ2NjX2F0b21pYy5oICkKQEAgLTc0LDM5MSArODgsMzc3IEBACiAgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19tc3ZjLmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfcHRocmVhZC5oICkKICAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oICkKLSAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oICkKLSAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCApCi0gIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oICkKLSAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oICkKLSAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oICkKLSAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2Vudi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9hdmwuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2NwdV9pcGhvbmUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvY3B1X2xpbnV4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9jcHVfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9lbnZfbGludXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9oaXN0b2dyYW0uYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9sb2cuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L2xvZ19wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc2xpY2UuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3N5bmMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvc3luY19wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3RoZC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC90aGRfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3RpbWUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvdGltZV9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvdGltZV93aW4zMi5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC90bHNfcHRocmVhZC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cHBvcnQvd3JhcF9tZW1jcHkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9wcm9maWxpbmcvc3RhcF90aW1lcnMuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2FsbG9jLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NtZGxpbmUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9saW51eC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3Bvc2l4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X2xpbnV4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvaGlzdG9ncmFtLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9ob3N0X3BvcnQuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfYW5kcm9pZC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ193aW4zMi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ19wb3NpeC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfd2luMzIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3Bvc2l4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfd2luMzIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3dyYXBfbWVtY3B5LmMgKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXIuaCApCiAgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9jZW5zdXMuaCApCiAgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9jb21wcmVzc2lvbi5oICkKICAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2dycGMuaCApCi0gIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9zdGF0dXMuaCApCisgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oICkKICAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmggKQogICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCApCiAgIHMuZmlsZXMgKz0gJXcoIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmggKQotICBzLmZpbGVzICs9ICV3KCBpbmNsdWRlL2dycGMvY2Vuc3VzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2RlYnVnL3RyYWNlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9odHRwL2h0dHBjbGkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2h0dHAvcGFyc2VyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9jbG9zdXJlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9lbmRwb2ludC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9pb21nci5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9wb2xsc2V0LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9zb2NrYWRkci5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGltZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9qc29uL2pzb24uaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2luaXQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9iNjQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RzaS9zc2xfdHlwZXMuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvYWdncmVnYXRpb24uaCApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NlbnN1cy9tbG9nLmggKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvcnBjX21ldHJpY19pZC5oICkKKyAgcy5maWxlcyArPSAldyggaW5jbHVkZS9ncnBjL3N0YXR1cy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h0dHAyX2Vycm9ycy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jZW5zdXMvYWdncmVnYXRpb24uaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NlbnN1cy9ycGNfbWV0cmljX2lkLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbnRleHQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWUuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2pzb24vanNvbi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3RzaS9zc2xfdHlwZXMuaCApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmggKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCApCiAgIHMuZmlsZXMgKz0gJXcoIHRoaXJkX3BhcnR5L25hbm9wYi9wYi5oICkKICAgcy5maWxlcyArPSAldyggdGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5oICkKICAgcy5maWxlcyArPSAldyggdGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5oICkKICAgcy5maWxlcyArPSAldyggdGhpcmRfcGFydHkvbmFub3BiL3BiX2VuY29kZS5oICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2Vuc3VzL2dycGNfY29udGV4dC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2RlYnVnL3RyYWNlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9odHRwL2h0dHBjbGkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2h0dHAvcGFyc2VyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9jbG9zdXJlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9lbmRwb2ludC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9leGVjX2N0eC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL2lvbWdyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci90Y3BfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3RpbWVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvanNvbi9qc29uLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9qc29uL2pzb25fc3RyaW5nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvYWxhcm0uYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NhbGxfZGV0YWlscy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY3JlYXRlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL2luaXQuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvdmVyc2lvbi5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvcGFyc2luZy5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbGlzdHMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi93cml0aW5nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9iNjQuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2UvaW5pdF9zZWN1cmUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3N1cmZhY2Uvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvY29udGV4dC5jICkKLSAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvY2Vuc3VzL2luaXRpYWxpemUuYyApCi0gIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2NlbnN1cy9tbG9nLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvb3BlcmF0aW9uLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvcGxhY2Vob2xkZXJzLmMgKQotICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9jZW5zdXMvdHJhY2luZy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L2luc2VjdXJlL2NoYW5uZWxfY3JlYXRlLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9saXN0cy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvd3JpdGluZy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NlbnN1cy9jb250ZXh0LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfY29udGV4dC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NlbnN1cy9pbml0aWFsaXplLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jZW5zdXMvb3BlcmF0aW9uLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2Vuc3VzL3BsYWNlaG9sZGVycy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9pb21ncl93aW5kb3dzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2pzb24vanNvbi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9qc29uL2pzb25fc3RyaW5nLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvYWxhcm0uYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdF9zZWN1cmUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5jICkKKyAgcy5maWxlcyArPSAldyggc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMgKQorICBzLmZpbGVzICs9ICV3KCBzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyApCisgIHMuZmlsZXMgKz0gJXcoIHNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMgKQogICBzLmZpbGVzICs9ICV3KCB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmMgKQogICBzLmZpbGVzICs9ICV3KCB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmMgKQogICBzLmZpbGVzICs9ICV3KCB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZW5jb2RlLmMgKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggYi9pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaAppbmRleCBlZDQ4NDExLi42MDc1MTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaAorKysgYi9pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaApAQCAtMTM0LDYgKzEzNCw4IEBACiAjZGVmaW5lIEdQUl9HRVRQSURfSU5fVU5JU1REX0ggMQogI2RlZmluZSBHUFJfSEFWRV9NU0dfTk9TSUdOQUwgMQogI2RlZmluZSBHUFJfSEFWRV9VTklYX1NPQ0tFVCAxCisjZGVmaW5lIEdQUl9IQVZFX0lQX1BLVElORk8gMQorI2RlZmluZSBHUFJfSEFWRV9JUFY2X1JFQ1ZQS1RJTkZPIDEKICNlbGlmIGRlZmluZWQoX19saW51eF9fKQogI2RlZmluZSBHUFJfUE9TSVhfQ1JBU0hfSEFORExFUiAxCiAjZGVmaW5lIEdQUl9QTEFURk9STV9TVFJJTkcgImxpbnV4IgpAQCAtMTU2LDYgKzE1OCw4IEBACiAjZGVmaW5lIEdQUl9QT1NJWF9TT0NLRVQgMQogI2RlZmluZSBHUFJfUE9TSVhfU09DS0VUQUREUiAxCiAjZGVmaW5lIEdQUl9IQVZFX1VOSVhfU09DS0VUIDEKKyNkZWZpbmUgR1BSX0hBVkVfSVBfUEtUSU5GTyAxCisjZGVmaW5lIEdQUl9IQVZFX0lQVjZfUkVDVlBLVElORk8gMQogI2lmZGVmIF9fR0xJQkNfUFJFUkVRCiAjaWYgX19HTElCQ19QUkVSRVEoMiwgOSkKICNkZWZpbmUgR1BSX0xJTlVYX0VWRU5URkQgMQpAQCAtMjE3LDYgKzIyMSw3IEBACiAjZGVmaW5lIEdQUl9HRVRQSURfSU5fVU5JU1REX0ggMQogI2RlZmluZSBHUFJfSEFWRV9TT19OT1NJR1BJUEUgMQogI2RlZmluZSBHUFJfSEFWRV9VTklYX1NPQ0tFVCAxCisjZGVmaW5lIEdQUl9IQVZFX0lQX1BLVElORk8gMQogI2lmZGVmIF9MUDY0CiAjZGVmaW5lIEdQUl9BUkNIXzY0IDEKICNlbHNlIC8qIF9MUDY0ICovCkBAIC0yNDYsNiArMjUxLDggQEAKICNkZWZpbmUgR1BSX0dFVFBJRF9JTl9VTklTVERfSCAxCiAjZGVmaW5lIEdQUl9IQVZFX1NPX05PU0lHUElQRSAxCiAjZGVmaW5lIEdQUl9IQVZFX1VOSVhfU09DS0VUIDEKKyNkZWZpbmUgR1BSX0hBVkVfSVBfUEtUSU5GTyAxCisjZGVmaW5lIEdQUl9IQVZFX0lQVjZfUkVDVlBLVElORk8gMQogI2lmZGVmIF9MUDY0CiAjZGVmaW5lIEdQUl9BUkNIXzY0IDEKICNlbHNlIC8qIF9MUDY0ICovCmRpZmYgLS1naXQgYS9wYWNrYWdlLmpzb24gYi9wYWNrYWdlLmpzb24KaW5kZXggZmUwODU3Ny4uNGRhN2M3MCAxMDA2NDQKLS0tIGEvcGFja2FnZS5qc29uCisrKyBiL3BhY2thZ2UuanNvbgpAQCAtMjcsNiArMjcsNyBAQAogICB9LAogICAiYnVuZGxlZERlcGVuZGVuY2llcyI6IFsibm9kZS1wcmUtZ3lwIl0sCiAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImFyZ3VlanMiOiAiXjAuMi4zIiwKICAgICAibG9kYXNoIjogIl4zLjkuMyIsCiAgICAgIm5hbiI6ICJeMi4wLjAiLAogICAgICJwcm90b2J1ZmpzIjogIl40LjAuMCIKQEAgLTg2LDMyMSArODcsMzIxIEBACiAgICAgInNyYy9ub2RlL3NyYy9ncnBjX2V4dGVuc2lvbi5qcyIsCiAgICAgInNyYy9ub2RlL3NyYy9tZXRhZGF0YS5qcyIsCiAgICAgInNyYy9ub2RlL3NyYy9zZXJ2ZXIuanMiLAotICAgICJpbmNsdWRlL2dycGMvZ3JwY19zZWN1cml0eS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2J5dGVfYnVmZmVyLmgiLAogICAgICJpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXJfcmVhZGVyLmgiLAorICAgICJpbmNsdWRlL2dycGMvY2Vuc3VzLmgiLAogICAgICJpbmNsdWRlL2dycGMvY29tcHJlc3Npb24uaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9ncnBjLmgiLAotICAgICJpbmNsdWRlL2dycGMvc3RhdHVzLmgiLAorICAgICJpbmNsdWRlL2dycGMvZ3JwY19zZWN1cml0eS5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ieXRlX2J1ZmZlci5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb21wcmVzc2lvbl90eXBlcy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb25uZWN0aXZpdHlfc3RhdGUuaCIsCiAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vZ3JwY190eXBlcy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wcm9wYWdhdGlvbl9iaXRzLmgiLAogICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2NlbnN1cy5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgiLAotICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jb250ZXh0LmgiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwKLSAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiLAotICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLAotICAgICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5oIiwKLSAgICAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIiwKLSAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiLAotICAgICJzcmMvY29yZS9odHRwL3BhcnNlci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9leGVjdXRvci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLAotICAgICJzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXQuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgiLAotICAgICJzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmgiLAotICAgICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguaCIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZS5oIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLAotICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5oIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uLmgiLAotICAgICJzcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmgiLAotICAgICJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmgiLAotICAgICJzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmgiLAotICAgICJzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIsCi0gICAgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIiwKLSAgICAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmgiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmgiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiLAotICAgICJzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaCIsCi0gICAgInNyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLAotICAgICJzcmMvY29yZS90c2kvc3NsX3R5cGVzLmgiLAotICAgICJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiLAotICAgICJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgiLAotICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5oIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9zdGF0dXMuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odHRwMl9lcnJvcnMuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmgiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvcnBjX21ldHJpY19pZC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb24uaCIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmgiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiLAorICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIsCisgICAgInNyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmgiLAorICAgICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiLAogICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGIuaCIsCiAgICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uaCIsCiAgICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9kZWNvZGUuaCIsCiAgICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuaCIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMiLAotICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIiwKLSAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIiwKLSAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMiLAotICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyIsCi0gICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwKLSAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMiLAotICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMiLAotICAgICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmMiLAotICAgICJzcmMvY29yZS9odHRwL3BhcnNlci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmMiLAotICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9pb21nci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiLAotICAgICJzcmMvY29yZS9pb21nci90aW1lci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMiLAotICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyIsCi0gICAgInNyYy9jb3JlL2pzb24vanNvbi5jIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5jIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5jIiwKLSAgICAic3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2FsYXJtLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuYyIsCi0gICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5jIiwKLSAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3ZlcnNpb24uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX2xpc3RzLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvd3JpdGluZy5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYyIsCi0gICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmMiLAotICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jIiwKLSAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiLAotICAgICJzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyIsCi0gICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL2luaXRfc2VjdXJlLmMiLAotICAgICJzcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIiwKLSAgICAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMiLAotICAgICJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKLSAgICAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL2NvbnRleHQuYyIsCi0gICAgInNyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMiLAotICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL29wZXJhdGlvbi5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIiwKLSAgICAic3JjL2NvcmUvY2Vuc3VzL3RyYWNpbmcuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9pbnNlY3VyZS9jaGFubmVsX2NyZWF0ZS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L3NlY3VyZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9pbnNlY3VyZS9zZXJ2ZXJfY2h0dHAyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvc2VjdXJlL3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYyIsCisgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmMiLAorICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIiwKKyAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMiLAorICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL29wZXJhdGlvbi5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvdHJhY2luZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMiLAorICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMiLAorICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMiLAorICAgICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMiLAorICAgICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmMiLAorICAgICJzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5jIiwKKyAgICAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYyIsCisgICAgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jIiwKKyAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb24uYyIsCisgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmMiLAorICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmMiLAorICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FsYXJtLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfc2VjdXJlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYyIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMiLAorICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuYyIsCisgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMiLAorICAgICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIiwKICAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5jIiwKICAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5jIiwKICAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2VuY29kZS5jIiwKQEAgLTgzMSw2ICs4MzIsMjAgQEAKICAgICAidGhpcmRfcGFydHkvYm9yaW5nc3NsL3NzbC90MV9lbmMuYyIsCiAgICAgInRoaXJkX3BhcnR5L2JvcmluZ3NzbC9zc2wvdDFfbGliLmMiLAogICAgICJ0aGlyZF9wYXJ0eS9ib3Jpbmdzc2wvc3NsL3Rsc19yZWNvcmQuYyIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYWxsb2MuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2Nfc3luYy5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmMuaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmgiLAorICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCIsCisgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY193aW4zMi5oIiwKKyAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmgiLAogICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC9hbGxvYy5oIiwKICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvYXRtLmgiLAogICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG1fZ2NjX2F0b21pYy5oIiwKQEAgLTg1OSw3NiArODc0LDYyIEBACiAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19tc3ZjLmgiLAogICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfcHRocmVhZC5oIiwKICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oIiwKLSAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmgiLAotICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCIsCi0gICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oIiwKLSAgICAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCIsCi0gICAgInNyYy9jb3JlL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyIsCi0gICAgInNyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9hdmwuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2NwdV9pcGhvbmUuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvY3B1X2xpbnV4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9jcHVfd2luZG93cy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9lbnZfbGludXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9oaXN0b2dyYW0uYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2cuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L2xvZ19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc2xpY2UuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3N5bmMuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvc3luY19wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RoZC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aGRfcG9zaXguYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RpbWUuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZV9wb3NpeC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZV93aW4zMi5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90bHNfcHRocmVhZC5jIiwKLSAgICAic3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMiLAotICAgICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyIsCi0gICAgInNyYy9jb3JlL3N1cHBvcnQvd3JhcF9tZW1jcHkuYyIsCisgICAgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiLAorICAgICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvYWxsb2MuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2F2bC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2lwaG9uZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2xpbnV4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV93aW5kb3dzLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfbGludXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9oaXN0b2dyYW0uYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2cuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfbGludXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc2xpY2UuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luYy5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY19wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfcG9zaXguYyIsCisgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF93aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZS5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3dpbjMyLmMiLAorICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90bHNfcHRocmVhZC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jIiwKKyAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvd3JhcF9tZW1jcHkuYyIsCiAgICAgImJpbmRpbmcuZ3lwIgogICBdLAogICAibWFpbiI6ICJzcmMvbm9kZS9pbmRleC5qcyIsCmRpZmYgLS1naXQgYS9wYWNrYWdlLnhtbCBiL3BhY2thZ2UueG1sCmluZGV4IDRhOTk5MjIuLmE0MGNkMTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UueG1sCisrKyBiL3BhY2thZ2UueG1sCkBAIC01MCw2ICs1MCwyMCBAQAogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvcGhwL2V4dC9ncnBjL3NlcnZlci5oIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9waHAvZXh0L2dycGMvc2VydmVyX2NyZWRlbnRpYWxzLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL3BocC9leHQvZ3JwYy90aW1ldmFsLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL3N1cHBvcnQvYWxsb2MuaCIgcm9sZT0ic3JjIiAvPgogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG0uaCIgcm9sZT0ic3JjIiAvPgogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvc3VwcG9ydC9hdG1fZ2NjX2F0b21pYy5oIiByb2xlPSJzcmMiIC8+CkBAIC03OCwzOTEgKzkyLDM3NyBAQAogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfbXN2Yy5oIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19wdGhyZWFkLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hbGxvYy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX2F0b21pYy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19zeW5jLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fd2luMzIuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2xvZy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcG9ydF9wbGF0Zm9ybS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2UuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlX2J1ZmZlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luYy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19nZW5lcmljLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX3dpbjMyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi90aW1lLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9wcm9maWxpbmcvc3RhcF90aW1lcnMuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9hdmwuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2NtZGxpbmUuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2NwdV9pcGhvbmUuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2NwdV9saW51eC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvY3B1X3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9jcHVfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvZW52X2xpbnV4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9lbnZfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvaGlzdG9ncmFtLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvbG9nLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9sb2dfYW5kcm9pZC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9sb2dfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L2xvZ193aW4zMi5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3NsaWNlLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9zbGljZV9idWZmZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ19wb3NpeC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3N5bmMuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3N5bmNfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3N5bmNfd2luMzIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RoZC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvdGhkX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VwcG9ydC90aGRfd2luMzIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RpbWUuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RpbWVfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvdGltZV93aW4zMi5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXBwb3J0L3dyYXBfbWVtY3B5LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2dycGNfc2VjdXJpdHkuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvYWxsb2MuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfbGludXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9saW51eC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2hpc3RvZ3JhbS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF93aW4zMi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3Rsc19wdGhyZWFkLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VwcG9ydC93cmFwX21lbWNweS5jIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlci5oIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvY2Vuc3VzLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2NvbXByZXNzaW9uLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2dycGMuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvc3RhdHVzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2dycGNfc2VjdXJpdHkuaCIgcm9sZT0ic3JjIiAvPgogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2J5dGVfYnVmZmVyLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9jb21wcmVzc2lvbl90eXBlcy5oIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9ImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29ubmVjdGl2aXR5X3N0YXRlLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ncnBjX3R5cGVzLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wcm9wYWdhdGlvbl9iaXRzLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zdGF0dXMuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJpbmNsdWRlL2dycGMvY2Vuc3VzLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2h0dHAvcGFyc2VyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXQuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci90aW1lci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2pzb24vanNvbi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvaW5pdC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2I2NC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RzaS9zc2xfdHlwZXMuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jZW5zdXMvYWdncmVnYXRpb24uaCIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jZW5zdXMvbWxvZy5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0iaW5jbHVkZS9ncnBjL3N0YXR1cy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbnRleHQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3RzaS9zc2xfdHlwZXMuaCIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InRoaXJkX3BhcnR5L25hbm9wYi9wYi5oIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InRoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uaCIgcm9sZT0ic3JjIiAvPgogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmgiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0idGhpcmRfcGFydHkvbmFub3BiL3BiX2VuY29kZS5oIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9kZWJ1Zy90cmFjZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9odHRwL2h0dHBjbGkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9odHRwL3BhcnNlci5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9lbmRwb2ludC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9leGVjX2N0eC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9pb21nci5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3RpbWVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9qc29uL2pzb24uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvanNvbi9qc29uX3N0cmluZy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2FsYXJtLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2NhbGwuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9pbml0LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyX2NodHRwMi5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL3ZlcnNpb24uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbGlzdHMuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvd3JpdGluZy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9zdXJmYWNlL2luaXRfc2VjdXJlLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jZW5zdXMvY29udGV4dC5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2Vuc3VzL21sb2cuYyIgcm9sZT0ic3JjIiAvPgotICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9jZW5zdXMvb3BlcmF0aW9uLmMiIHJvbGU9InNyYyIgLz4KLSAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIiByb2xlPSJzcmMiIC8+Ci0gICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L2luc2VjdXJlL2NoYW5uZWxfY3JlYXRlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L3NlY3VyZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvc2VydmVyX2NodHRwMi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX2xpc3RzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvd3JpdGluZy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19jb250ZXh0LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2Vuc3VzL2luaXRpYWxpemUuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2Vuc3VzL29wZXJhdGlvbi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jZW5zdXMvcGxhY2Vob2xkZXJzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2pzb24vanNvbi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL2pzb24vanNvbl9zdHJpbmcuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL2FsYXJtLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfc2VjdXJlLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMiIHJvbGU9InNyYyIgLz4KKyAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0ic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIiByb2xlPSJzcmMiIC8+CisgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyIgcm9sZT0ic3JjIiAvPgorICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIiByb2xlPSJzcmMiIC8+CiAgICAgPGZpbGUgYmFzZWluc3RhbGxkaXI9Ii8iIG5hbWU9InRoaXJkX3BhcnR5L25hbm9wYi9wYl9jb21tb24uYyIgcm9sZT0ic3JjIiAvPgogICAgIDxmaWxlIGJhc2VpbnN0YWxsZGlyPSIvIiBuYW1lPSJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmMiIHJvbGU9InNyYyIgLz4KICAgICA8ZmlsZSBiYXNlaW5zdGFsbGRpcj0iLyIgbmFtZT0idGhpcmRfcGFydHkvbmFub3BiL3BiX2VuY29kZS5jIiByb2xlPSJzcmMiIC8+CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jZW5zdXMvYWdncmVnYXRpb24uaCBiL3NyYy9jb3JlL2NlbnN1cy9hZ2dyZWdhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGVmOTYzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NlbnN1cy9hZ2dyZWdhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaWZuZGVmIEdSUENfQ09SRV9DRU5TVVNfQUdHUkVHQVRJT05fSAotI2RlZmluZSBHUlBDX0NPUkVfQ0VOU1VTX0FHR1JFR0FUSU9OX0gKLQotLyoqIFN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGFuIGFnZ3JlZ2F0aW9uIHR5cGUuICovCi1zdHJ1Y3QgY2Vuc3VzX2FnZ3JlZ2F0aW9uX29wcyB7Ci0gIC8qIENyZWF0ZSBhIG5ldyBhZ2dyZWdhdGlvbi4gVGhlIHBvaW50ZXIgcmV0dXJuZWQgY2FuIGJlIHVzZWQgaW4gZnV0dXJlIGNhbGxzCi0gICAgIHRvIGNsb25lKCksIGZyZWUoKSwgcmVjb3JkKCksIGRhdGEoKSBhbmQgcmVzZXQoKS4gKi8KLSAgdm9pZCAqKCpjcmVhdGUpKGNvbnN0IHZvaWQgKmNyZWF0ZV9hcmcpOwotICAvKiBNYWtlIGEgY29weSBvZiBhbiBhZ2dyZWdhdGlvbiBjcmVhdGVkIGJ5IGNyZWF0ZSgpICovCi0gIHZvaWQgKigqY2xvbmUpKGNvbnN0IHZvaWQgKmFnZ3JlZ2F0aW9uKTsKLSAgLyogRGVzdHJveSBhbiBhZ2dyZWdhdGlvbiBjcmVhdGVkIGJ5IGNyZWF0ZSgpICovCi0gIHZvaWQgKCpmcmVlKSh2b2lkICphZ2dyZWdhdGlvbik7Ci0gIC8qIFJlY29yZCBhIG5ldyB2YWx1ZSBhZ2FpbnN0IGFnZ3JlZ2F0aW9uLiAqLwotICB2b2lkICgqcmVjb3JkKSh2b2lkICphZ2dyZWdhdGlvbiwgZG91YmxlIHZhbHVlKTsKLSAgLyogUmV0dXJuIGN1cnJlbnQgYWdncmVnYXRpb24gZGF0YS4gVGhlIGNhbGxlciBtdXN0IGNhc3QgdGhpcyBvYmplY3QgaW50bwotICAgICB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgYWdncmVnYXRpb24gcmVzdWx0LiBUaGUgb2JqZWN0IHJldHVybmVkIGNhbiBiZQotICAgICBmcmVlZCBieSB1c2luZyBmcmVlX2RhdGEoKS4gKi8KLSAgdm9pZCAqKCpkYXRhKShjb25zdCB2b2lkICphZ2dyZWdhdGlvbik7Ci0gIC8qIGZyZWUgZGF0YSByZXR1cm5lZCBieSBkYXRhKCkgKi8KLSAgdm9pZCAoKmZyZWVfZGF0YSkodm9pZCAqZGF0YSk7Ci0gIC8qIFJlc2V0IGFuIGFnZ3JlZ2F0aW9uIHRvIGRlZmF1bHQgKHplcm8pIHZhbHVlcy4gKi8KLSAgdm9pZCAoKnJlc2V0KSh2b2lkICphZ2dyZWdhdGlvbik7Ci0gIC8qIE1lcmdlICdmcm9tJyBhZ2dyZWdhdGlvbiBpbnRvICd0bycuIEJvdGggYWdncmVnYXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSAqLwotICB2b2lkICgqbWVyZ2UpKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tKTsKLSAgLyogRmlsbCBidWZmZXIgd2l0aCBwcmludGFibGUgc3RyaW5nIHZlcnNpb24gb2YgYWdncmVnYXRpb24gY29udGVudHMuIEZvcgotICAgICBkZWJ1Z2dpbmcgb25seS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIHRvIGJ1ZmZlciAoYSB2YWx1ZSA9PSBuCi0gICAgIGltcGxpZXMgdGhlIGJ1ZmZlciB3YXMgb2YgaW5zdWZmaWNpZW50IHNpemUpLiAqLwotICBzaXplX3QgKCpwcmludCkoY29uc3Qgdm9pZCAqYWdncmVnYXRpb24sIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG4pOwotfTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DRU5TVVNfQUdHUkVHQVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2Vuc3VzL2NvbnRleHQuYyBiL3NyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YjhlZTAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2Vuc3VzL2NvbnRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLS8vIEZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgc3VwcG9ydCB0aGUgcHVibGljIGNvbnRleHQgQVBJLCBpbmNsdWRpbmcKLS8vIGVuY29kaW5nL2RlY29kaW5nIGFzIHBhcnQgb2YgY29udGV4dCBwcm9wYWdhdGlvbiBhY3Jvc3MgUlBDJ3MuIFRoZSBvdmVyYWxsCi0vLyByZXF1aXJlbWVudHMgKGluIGFwcHJveGltYXRlIHByaW9yaXR5IG9yZGVyKSBmb3IgdGhlCi0vLyBjb250ZXh0IHJlcHJlc2VudGF0aW9uOgotLy8gMS4gRWZmaWNpZW50IGNvbnZlcnNpb24gdG8vZnJvbSB3aXJlIGZvcm1hdAotLy8gMi4gTWluaW1hbCBieXRlcyB1c2VkIG9uLXdpcmUKLS8vIDMuIEVmZmljaWVudCBjb250ZXh0IGNyZWF0aW9uCi0vLyA0LiBFZmZpY2llbnQgbG9va3VwIG9mIHRhZyB2YWx1ZSBmb3IgYSBrZXkKLS8vIDUuIEVmZmljaWVudCBpdGVyYXRpb24gb3ZlciB0YWdzCi0vLyA2LiBNaW5pbWFsIG1lbW9yeSBmb290cHJpbnQKLS8vCi0vLyBOb3RlcyBvbiB0cmFkZW9mZnMvZGVjaXNpb25zOgotLy8gKiB0YWcgaW5jbHVkZXMgMSBieXRlIGxlbmd0aCBvZiBrZXksIGFzIHdlbGwgYXMgbmlsLXRlcm1pbmF0aW5nIGJ5dGUuIFRoZXNlCi0vLyAgIGFyZSB0byBhaWQgaW4gZWZmaWNpZW50IHBhcnNpbmcgYW5kIHRoZSBhYmlsaXR5IHRvIGRpcmVjdGx5IHJldHVybiBrZXkKLS8vICAgc3RyaW5ncy4gVGhpcyBpcyBtb3JlIGltcG9ydGFudCB0aGFuIHNhdmluZyBhIHNpbmdsZSBieXRlL3RhZyBvbiB0aGUgd2lyZS4KLS8vICogVGhlIHdpcmUgZW5jb2RpbmcgdXNlcyBvbmx5IHNpbmdsZSBieXRlIHZhbHVlcy4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkCi0vLyAgIHRvIGhhbmRsZSBlbmRpYW4tbmVzcyBjb252ZXJzaW9ucy4gSXQgYWxzbyBtZWFucyB0aGVyZSBpcyBhIGhhcmQgdXBwZXIKLS8vICAgbGltaXQgb2YgMjU1IGZvciBib3RoIENFTlNVU19NQVhfVEFHX0tWX0xFTiBhbmQgQ0VOU1VTX01BWF9QUk9QQUdBVEVEX1RBR1MuCi0vLyAqIEtlZXAgYWxsIHRhZyBpbmZvcm1hdGlvbiAoa2V5cy92YWx1ZXMvZmxhZ3MpIGluIGEgc2luZ2xlIG1lbW9yeSBidWZmZXIsCi0vLyAgIHRoYXQgY2FuIGJlIGRpcmVjdGx5IGNvcGllZCB0byB0aGUgd2lyZS4KLQotLy8gbWluIGFuZCBtYXggdmFsaWQgY2hhcnMgaW4gdGFnIGtleXMgYW5kIHZhbHVlcy4gQWxsIHByaW50YWJsZSBBU0NJSSBpcyBPSy4KLSNkZWZpbmUgTUlOX1ZBTElEX1RBR19DSEFSIDMyICAgLy8gJyAnCi0jZGVmaW5lIE1BWF9WQUxJRF9UQUdfQ0hBUiAxMjYgIC8vICd+JwotCi0vLyBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc2V0IG9mIHRhZ3MuIEVzc2VudGlhbGx5IGEgY291bnQgb2YgbnVtYmVyIG9mIHRhZ3MKLS8vIHByZXNlbnQsIGFuZCBwb2ludGVyIHRvIGEgY2h1bmsgb2YgbWVtb3J5IHRoYXQgY29udGFpbnMgdGhlIHBlci10YWcgZGV0YWlscy4KLXN0cnVjdCB0YWdfc2V0IHsKLSAgaW50IG50YWdzOyAgICAgICAgLy8gbnVtYmVyIG9mIHRhZ3MuCi0gIGludCBudGFnc19hbGxvYzsgIC8vIG50YWdzICsgbnVtYmVyIG9mIGRlbGV0ZWQgdGFncyAodG90YWwgbnVtYmVyIG9mIHRhZ3MKLSAgLy8gaW4gYWxsIG9mIGt2bSkuIFRoaXMgd2lsbCBhbHdheXMgYmUgPT0gbnRhZ3MsIGV4Y2VwdCBkdXJpbmcgdGhlIHByb2Nlc3MKLSAgLy8gb2YgYnVpbGRpbmcgYSBuZXcgdGFnIHNldC4KLSAgc2l6ZV90IGt2bV9zaXplOyAgLy8gbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3Iga2V5L3ZhbHVlIHN0b3JhZ2UuCi0gIHNpemVfdCBrdm1fdXNlZDsgIC8vIG51bWJlciBvZiBieXRlcyBvZiB1c2VkIGtleS92YWx1ZSBtZW1vcnkKLSAgY2hhciAqa3ZtOyAgICAgICAgLy8ga2V5L3ZhbHVlIG1lbW9yeS4gQ29uc2lzdHMgb2YgcmVwZWF0ZWQgZW50cmllcyBvZjoKLSAgLy8gICBPZmZzZXQgIFNpemUgIERlc2NyaXB0aW9uCi0gIC8vICAgICAwICAgICAgMSAgICBLZXkgbGVuZ3RoLCBpbmNsdWRpbmcgdHJhaWxpbmcgMC4gKEspCi0gIC8vICAgICAxICAgICAgMSAgICBWYWx1ZSBsZW5ndGgsIGluY2x1ZGluZyB0cmFpbGluZyAwIChWKQotICAvLyAgICAgMiAgICAgIDEgICAgRmxhZ3MKLSAgLy8gICAgIDMgICAgICBLICAgIEtleSBieXRlcwotICAvLyAgICAgMyArIEsgIFYgICAgVmFsdWUgYnl0ZXMKLSAgLy8KLSAgLy8gV2UgcmVmZXIgdG8gdGhlIGZpcnN0IDMgZW50cmllcyBhcyB0aGUgJ3RhZyBoZWFkZXInLiBJZiBleHRyYSB2YWx1ZXMgYXJlCi0gIC8vIGludHJvZHVjZWQgaW4gdGhlIGhlYWRlciwgeW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhlIFRBR19IRUFERVJfU0laRQotICAvLyBjb25zdGFudCwgdGhlIHJhd190YWcgc3RydWN0dXJlIChhbmQgZXZlcnl0aGluZyB0aGF0IHVzZXMgaXQpIGFuZCB0aGUKLSAgLy8gZW5jb2RlL2RlY29kZSBmdW5jdGlvbnMgYXBwcm9wcmlhdGVseS4KLX07Ci0KLS8vIE51bWJlciBvZiBieXRlcyBpbiB0YWcgaGVhZGVyLgotI2RlZmluZSBUQUdfSEVBREVSX1NJWkUgMyAgLy8ga2V5IGxlbmd0aCAoMSkgKyB2YWx1ZSBsZW5ndGggKDEpICsgZmxhZ3MgKDEpCi0vLyBPZmZzZXRzIHRvIHRhZyBoZWFkZXIgZW50cmllcy4KLSNkZWZpbmUgS0VZX0xFTl9PRkZTRVQgMAotI2RlZmluZSBWQUxVRV9MRU5fT0ZGU0VUIDEKLSNkZWZpbmUgRkxBR19PRkZTRVQgMgotCi0vLyByYXdfdGFnIHJlcHJlc2VudHMgdGhlIHJhdy1zdG9yYWdlIGZvcm0gb2YgYSB0YWcgaW4gdGhlIGt2bSBvZiBhIHRhZ19zZXQuCi1zdHJ1Y3QgcmF3X3RhZyB7Ci0gIHVpbnQ4X3Qga2V5X2xlbjsKLSAgdWludDhfdCB2YWx1ZV9sZW47Ci0gIHVpbnQ4X3QgZmxhZ3M7Ci0gIGNoYXIgKmtleTsKLSAgY2hhciAqdmFsdWU7Ci19OwotCi0vLyBVc2UgYSByZXNlcnZlZCBmbGFnIGJpdCBmb3IgaW5kaWNhdGlvbiBvZiBkZWxldGVkIHRhZy4KLSNkZWZpbmUgQ0VOU1VTX1RBR19ERUxFVEVEIENFTlNVU19UQUdfUkVTRVJWRUQKLSNkZWZpbmUgQ0VOU1VTX1RBR19JU19ERUxFVEVEKGZsYWdzKSAoZmxhZ3MgJiBDRU5TVVNfVEFHX0RFTEVURUQpCi0KLS8vIFByaW1hcnkgcmVwcmVzZW50YXRpb24gb2YgYSBjb250ZXh0LiBDb21wb3NlZCBvZiAyIHVuZGVybHlpbmcgdGFnX3NldAotLy8gc3RydWN0cywgb25lIGVhY2ggZm9yIHByb3BhZ2F0ZWQgYW5kIGxvY2FsIChub24tcHJvcGFnYXRlZCkgdGFncy4gVGhpcyBpcwotLy8gdG8gZWZmaWNpZW50bHkgc3VwcG9ydCB0YWcgZW5jb2RpbmcvZGVjb2RpbmcuCi0vLyBUT0RPKGF2ZWl0Y2gpOiBuZWVkIHRvIGFkZCB0cmFjaW5nIGlkJ3Mvc3RydWN0dXJlLgotc3RydWN0IGNlbnN1c19jb250ZXh0IHsKLSAgc3RydWN0IHRhZ19zZXQgdGFnc1syXTsKLSAgY2Vuc3VzX2NvbnRleHRfc3RhdHVzIHN0YXR1czsKLX07Ci0KLS8vIEluZGljZXMgaW50byB0aGUgdGFncyBtZW1iZXIgb2YgY2Vuc3VzX2NvbnRleHQKLSNkZWZpbmUgUFJPUEFHQVRFRF9UQUdTIDAKLSNkZWZpbmUgTE9DQUxfVEFHUyAxCi0KLS8vIFZhbGlkYXRlIChjaGVjayBhbGwgY2hhcmFjdGVycyBhcmUgaW4gcmFuZ2UgYW5kIHNpemUgaXMgbGVzcyB0aGFuIGxpbWl0KSBhCi0vLyBrZXkgb3IgdmFsdWUgc3RyaW5nLiBSZXR1cm5zIDAgaWYgdGhlIHN0cmluZyBpcyBpbnZhbGlkLCBvciB0aGUgbGVuZ3RoCi0vLyAoaW5jbHVkaW5nIHRlcm1pbmF0b3IpIGlmIHZhbGlkLgotc3RhdGljIHNpemVfdCB2YWxpZGF0ZV90YWcoY29uc3QgY2hhciAqa3YpIHsKLSAgc2l6ZV90IGxlbiA9IDE7Ci0gIGNoYXIgY2g7Ci0gIHdoaWxlICgoY2ggPSAqa3YrKykgIT0gMCkgewotICAgIGlmIChjaCA8IE1JTl9WQUxJRF9UQUdfQ0hBUiB8fCBjaCA+IE1BWF9WQUxJRF9UQUdfQ0hBUikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGxlbisrOwotICB9Ci0gIGlmIChsZW4gPiBDRU5TVVNfTUFYX1RBR19LVl9MRU4pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbGVuOwotfQotCi0vLyBFeHRyYWN0IGEgcmF3IHRhZyBnaXZlbiBhIHBvaW50ZXIgKHJhdykgdG8gdGhlIHRhZyBoZWFkZXIuIEFsbG93IGZvciBzb21lCi0vLyBleHRyYSBieXRlcyBpbiB0aGUgdGFnIGhlYWRlciAoc2VlIGVuY29kZS9kZWNvZGUgZnVuY3Rpb25zIGZvciB1c2FnZTogdGhpcwotLy8gYWxsb3dzIGZvciBmdXR1cmUgZXhwYW5zaW9uIG9mIHRoZSB0YWcgaGVhZGVyKS4KLXN0YXRpYyBjaGFyICpkZWNvZGVfdGFnKHN0cnVjdCByYXdfdGFnICp0YWcsIGNoYXIgKmhlYWRlciwgaW50IG9mZnNldCkgewotICB0YWctPmtleV9sZW4gPSAodWludDhfdCkoKmhlYWRlcisrKTsKLSAgdGFnLT52YWx1ZV9sZW4gPSAodWludDhfdCkoKmhlYWRlcisrKTsKLSAgdGFnLT5mbGFncyA9ICh1aW50OF90KSgqaGVhZGVyKyspOwotICBoZWFkZXIgKz0gb2Zmc2V0OwotICB0YWctPmtleSA9IGhlYWRlcjsKLSAgaGVhZGVyICs9IHRhZy0+a2V5X2xlbjsKLSAgdGFnLT52YWx1ZSA9IGhlYWRlcjsKLSAgcmV0dXJuIGhlYWRlciArIHRhZy0+dmFsdWVfbGVuOwotfQotCi0vLyBNYWtlIGEgY29weSAoaW4gJ3RvJykgb2YgYW4gZXhpc3RpbmcgdGFnX3NldC4KLXN0YXRpYyB2b2lkIHRhZ19zZXRfY29weShzdHJ1Y3QgdGFnX3NldCAqdG8sIGNvbnN0IHN0cnVjdCB0YWdfc2V0ICpmcm9tKSB7Ci0gIG1lbWNweSh0bywgZnJvbSwgc2l6ZW9mKHN0cnVjdCB0YWdfc2V0KSk7Ci0gIHRvLT5rdm0gPSBncHJfbWFsbG9jKHRvLT5rdm1fc2l6ZSk7Ci0gIG1lbWNweSh0by0+a3ZtLCBmcm9tLT5rdm0sIGZyb20tPmt2bV91c2VkKTsKLX0KLQotLy8gRGVsZXRlIGEgdGFnIGZyb20gYSB0YWdfc2V0LCBpZiBpdCBleGlzdHMgKHJldHVybnMgdHJ1ZSBpZiBpdCBkaWQpLgotc3RhdGljIGJvb2wgdGFnX3NldF9kZWxldGVfdGFnKHN0cnVjdCB0YWdfc2V0ICp0YWdzLCBjb25zdCBjaGFyICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9sZW4pIHsKLSAgY2hhciAqa3ZwID0gdGFncy0+a3ZtOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MtPm50YWdzX2FsbG9jOyBpKyspIHsKLSAgICB1aW50OF90ICpmbGFncyA9ICh1aW50OF90ICopKGt2cCArIEZMQUdfT0ZGU0VUKTsKLSAgICBzdHJ1Y3QgcmF3X3RhZyB0YWc7Ci0gICAga3ZwID0gZGVjb2RlX3RhZygmdGFnLCBrdnAsIDApOwotICAgIGlmIChDRU5TVVNfVEFHX0lTX0RFTEVURUQodGFnLmZsYWdzKSkgY29udGludWU7Ci0gICAgaWYgKChrZXlfbGVuID09IHRhZy5rZXlfbGVuKSAmJiAobWVtY21wKGtleSwgdGFnLmtleSwga2V5X2xlbikgPT0gMCkpIHsKLSAgICAgICpmbGFncyB8PSBDRU5TVVNfVEFHX0RFTEVURUQ7Ci0gICAgICB0YWdzLT5udGFncy0tOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gRGVsZXRlIGEgdGFnIGZyb20gYSBjb250ZXh0LCByZXR1cm4gdHJ1ZSBpZiBpdCBleGlzdGVkLgotc3RhdGljIGJvb2wgY29udGV4dF9kZWxldGVfdGFnKGNlbnN1c19jb250ZXh0ICpjb250ZXh0LCBjb25zdCBjZW5zdXNfdGFnICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9sZW4pIHsKLSAgcmV0dXJuICgKLSAgICAgIHRhZ19zZXRfZGVsZXRlX3RhZygmY29udGV4dC0+dGFnc1tMT0NBTF9UQUdTXSwgdGFnLT5rZXksIGtleV9sZW4pIHx8Ci0gICAgICB0YWdfc2V0X2RlbGV0ZV90YWcoJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSwgdGFnLT5rZXksIGtleV9sZW4pKTsKLX0KLQotLy8gQWRkIGEgdGFnIHRvIGEgdGFnX3NldC4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgdGhlIHRhZyBjb3VsZAotLy8gbm90IGJlIGFkZGVkIGJlY2F1c2Ugb2YgY29uc3RyYWludHMgb24gdGFnIHNldCBzaXplLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAotLy8gbm90IGJlIGNhbGxlZCBpZiB0aGUgdGFnIG1heSBhbHJlYWR5IGV4aXN0IChpbiBhIG5vbi1kZWxldGVkIHN0YXRlKSBpbgotLy8gdGhlIHRhZ19zZXQsIGFzIHRoYXQgd291bGQgcmVzdWx0IGluIHR3byB0YWdzIHdpdGggdGhlIHNhbWUga2V5Lgotc3RhdGljIGJvb2wgdGFnX3NldF9hZGRfdGFnKHN0cnVjdCB0YWdfc2V0ICp0YWdzLCBjb25zdCBjZW5zdXNfdGFnICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9sZW4sIHNpemVfdCB2YWx1ZV9sZW4pIHsKLSAgaWYgKHRhZ3MtPm50YWdzID09IENFTlNVU19NQVhfUFJPUEFHQVRFRF9UQUdTKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IHNpemVfdCB0YWdfc2l6ZSA9IGtleV9sZW4gKyB2YWx1ZV9sZW4gKyBUQUdfSEVBREVSX1NJWkU7Ci0gIGlmICh0YWdzLT5rdm1fdXNlZCArIHRhZ19zaXplID4gdGFncy0+a3ZtX3NpemUpIHsKLSAgICAvLyBhbGxvY2F0ZSBuZXcgbWVtb3J5IGlmIG5lZWRlZAotICAgIHRhZ3MtPmt2bV9zaXplICs9IDIgKiBDRU5TVVNfTUFYX1RBR19LVl9MRU4gKyBUQUdfSEVBREVSX1NJWkU7Ci0gICAgY2hhciAqbmV3X2t2bSA9IGdwcl9tYWxsb2ModGFncy0+a3ZtX3NpemUpOwotICAgIG1lbWNweShuZXdfa3ZtLCB0YWdzLT5rdm0sIHRhZ3MtPmt2bV91c2VkKTsKLSAgICBncHJfZnJlZSh0YWdzLT5rdm0pOwotICAgIHRhZ3MtPmt2bSA9IG5ld19rdm07Ci0gIH0KLSAgY2hhciAqa3ZwID0gdGFncy0+a3ZtICsgdGFncy0+a3ZtX3VzZWQ7Ci0gICprdnArKyA9IChjaGFyKWtleV9sZW47Ci0gICprdnArKyA9IChjaGFyKXZhbHVlX2xlbjsKLSAgLy8gZW5zdXJlIHJlc2VydmVkIGZsYWdzIGFyZSBub3QgdXNlZC4KLSAgKmt2cCsrID0gKGNoYXIpKHRhZy0+ZmxhZ3MgJiAoQ0VOU1VTX1RBR19QUk9QQUdBVEUgfCBDRU5TVVNfVEFHX1NUQVRTKSk7Ci0gIG1lbWNweShrdnAsIHRhZy0+a2V5LCBrZXlfbGVuKTsKLSAga3ZwICs9IGtleV9sZW47Ci0gIG1lbWNweShrdnAsIHRhZy0+dmFsdWUsIHZhbHVlX2xlbik7Ci0gIHRhZ3MtPmt2bV91c2VkICs9IHRhZ19zaXplOwotICB0YWdzLT5udGFncysrOwotICB0YWdzLT5udGFnc19hbGxvYysrOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQWRkL21vZGlmeS9kZWxldGUgYSB0YWcgdG8vaW4gYSBjb250ZXh0LiBDYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGF0IHRhZyBrZXkKLS8vIGV0Yy4gYXJlIHZhbGlkLgotc3RhdGljIHZvaWQgY29udGV4dF9tb2RpZnlfdGFnKGNlbnN1c19jb250ZXh0ICpjb250ZXh0LCBjb25zdCBjZW5zdXNfdGFnICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9sZW4sIHNpemVfdCB2YWx1ZV9sZW4pIHsKLSAgLy8gRmlyc3QgZGVsZXRlIHRoZSB0YWcgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgotICBib29sIGRlbGV0ZWQgPSBjb250ZXh0X2RlbGV0ZV90YWcoY29udGV4dCwgdGFnLCBrZXlfbGVuKTsKLSAgYm9vbCBhZGRlZCA9IGZhbHNlOwotICBpZiAoQ0VOU1VTX1RBR19JU19QUk9QQUdBVEVEKHRhZy0+ZmxhZ3MpKSB7Ci0gICAgYWRkZWQgPSB0YWdfc2V0X2FkZF90YWcoJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSwgdGFnLCBrZXlfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2xlbik7Ci0gIH0gZWxzZSB7Ci0gICAgYWRkZWQgPQotICAgICAgICB0YWdfc2V0X2FkZF90YWcoJmNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10sIHRhZywga2V5X2xlbiwgdmFsdWVfbGVuKTsKLSAgfQotCi0gIGlmIChkZWxldGVkKSB7Ci0gICAgY29udGV4dC0+c3RhdHVzLm5fbW9kaWZpZWRfdGFncysrOwotICB9IGVsc2UgewotICAgIGlmIChhZGRlZCkgewotICAgICAgY29udGV4dC0+c3RhdHVzLm5fYWRkZWRfdGFncysrOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb250ZXh0LT5zdGF0dXMubl9pZ25vcmVkX3RhZ3MrKzsKLSAgICB9Ci0gIH0KLX0KLQotLy8gUmVtb3ZlIG1lbW9yeSB1c2VkIGZvciBkZWxldGVkIHRhZ3MgZnJvbSBhIHRhZyBzZXQuIEJhc2ljIGFsZ29yaXRobToKLS8vIDEpIFdhbGsgdGhyb3VnaCB0YWcgc2V0IHRvIGZpbmQgZmlyc3QgZGVsZXRlZCB0YWcuIFJlY29yZCB3aGVyZSBpdCBpcy4KLS8vIDIpIEZpbmQgdGhlIG5leHQgbm90LWRlbGV0ZWQgdGFnLiBDb3B5IGFsbCBvZiBrdm0gZnJvbSB0aGVyZSB0byB0aGUgZW5kCi0vLyAgICAib3ZlciIgdGhlIGRlbGV0ZWQgdGFncwotLy8gMykgcmVwZWF0ICMxIGFuZCAjMiB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIHRhZ3MKLS8vIDQpIGlmIHdlIGFyZSBzdGlsbCBsb29raW5nIGZvciBhIG5vdC1kZWxldGVkIHRhZywgdGhlbiBhbGwgdGhlIGVuZCBwb3J0aW9uCi0vLyAgICBvZiB0aGUga3ZtIGlzIGRlbGV0ZWQuIEp1c3QgcmVkdWNlIHRoZSB1c2VkIGFtb3VudCBvZiBtZW1vcnkgYnkgdGhlCi0vLyAgICBhcHByb3ByaWF0ZSBhbW91bnQuCi1zdGF0aWMgdm9pZCB0YWdfc2V0X2ZsYXR0ZW4oc3RydWN0IHRhZ19zZXQgKnRhZ3MpIHsKLSAgaWYgKHRhZ3MtPm50YWdzID09IHRhZ3MtPm50YWdzX2FsbG9jKSByZXR1cm47Ci0gIGJvb2wgZm91bmRfZGVsZXRlZCA9IGZhbHNlOyAgLy8gZm91bmQgYSBkZWxldGVkIHRhZy4KLSAgY2hhciAqa3ZwID0gdGFncy0+a3ZtOwotICBjaGFyICpkYmFzZSA9IE5VTEw7ICAvLyByZWNvcmQgbG9jYXRpb24gb2YgZGVsZXRlZCB0YWcKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLT5udGFnc19hbGxvYzsgaSsrKSB7Ci0gICAgc3RydWN0IHJhd190YWcgdGFnOwotICAgIGNoYXIgKm5leHRfa3ZwID0gZGVjb2RlX3RhZygmdGFnLCBrdnAsIDApOwotICAgIGlmIChmb3VuZF9kZWxldGVkKSB7Ci0gICAgICBpZiAoIUNFTlNVU19UQUdfSVNfREVMRVRFRCh0YWcuZmxhZ3MpKSB7Ci0gICAgICAgIHB0cmRpZmZfdCByZWR1Y2UgPSBrdnAgLSBkYmFzZTsgIC8vICNieXRlcyBpbiBkZWxldGVkIHRhZ3MKLSAgICAgICAgR1BSX0FTU0VSVChyZWR1Y2UgPiAwKTsKLSAgICAgICAgcHRyZGlmZl90IGNvcHlfc2l6ZSA9IHRhZ3MtPmt2bSArIHRhZ3MtPmt2bV91c2VkIC0ga3ZwOwotICAgICAgICBHUFJfQVNTRVJUKGNvcHlfc2l6ZSA+IDApOwotICAgICAgICBtZW1tb3ZlKGRiYXNlLCBrdnAsIChzaXplX3QpY29weV9zaXplKTsKLSAgICAgICAgdGFncy0+a3ZtX3VzZWQgLT0gKHNpemVfdClyZWR1Y2U7Ci0gICAgICAgIG5leHRfa3ZwIC09IHJlZHVjZTsKLSAgICAgICAgZm91bmRfZGVsZXRlZCA9IGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoQ0VOU1VTX1RBR19JU19ERUxFVEVEKHRhZy5mbGFncykpIHsKLSAgICAgICAgZGJhc2UgPSBrdnA7Ci0gICAgICAgIGZvdW5kX2RlbGV0ZWQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBrdnAgPSBuZXh0X2t2cDsKLSAgfQotICBpZiAoZm91bmRfZGVsZXRlZCkgewotICAgIEdQUl9BU1NFUlQoZGJhc2UgPiB0YWdzLT5rdm0pOwotICAgIHRhZ3MtPmt2bV91c2VkID0gKHNpemVfdCkoZGJhc2UgLSB0YWdzLT5rdm0pOwotICB9Ci0gIHRhZ3MtPm50YWdzX2FsbG9jID0gdGFncy0+bnRhZ3M7Ci19Ci0KLWNlbnN1c19jb250ZXh0ICpjZW5zdXNfY29udGV4dF9jcmVhdGUoY29uc3QgY2Vuc3VzX2NvbnRleHQgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnN1c190YWcgKnRhZ3MsIGludCBudGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Vuc3VzX2NvbnRleHRfc3RhdHVzIGNvbnN0ICoqc3RhdHVzKSB7Ci0gIGNlbnN1c19jb250ZXh0ICpjb250ZXh0ID0gZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX2NvbnRleHQpKTsKLSAgLy8gSWYgd2UgYXJlIGdpdmVuIGEgYmFzZSwgY29weSBpdCBpbnRvIG91ciBuZXcgdGFnIHNldC4gT3RoZXJ3aXNlIHNldCBpdAotICAvLyB0byB6ZXJvL05VTEwgZXZlcnl0aGluZy4KLSAgaWYgKGJhc2UgPT0gTlVMTCkgewotICAgIG1lbXNldChjb250ZXh0LCAwLCBzaXplb2YoY2Vuc3VzX2NvbnRleHQpKTsKLSAgfSBlbHNlIHsKLSAgICB0YWdfc2V0X2NvcHkoJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSwgJmJhc2UtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSk7Ci0gICAgdGFnX3NldF9jb3B5KCZjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLCAmYmFzZS0+dGFnc1tMT0NBTF9UQUdTXSk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LT5zdGF0dXMsIDAsIHNpemVvZihjb250ZXh0LT5zdGF0dXMpKTsKLSAgfQotICAvLyBXYWxrIG92ZXIgdGhlIGFkZGl0aW9uYWwgdGFncyBhbmQsIGZvciB0aG9zZSB0aGF0IGFyZW4ndCBpbnZhbGlkLCBtb2RpZnkKLSAgLy8gdGhlIGNvbnRleHQgdG8gYWRkL3JlcGxhY2UvZGVsZXRlIGFzIHJlcXVpcmVkLgotICBmb3IgKGludCBpID0gMDsgaSA8IG50YWdzOyBpKyspIHsKLSAgICBjb25zdCBjZW5zdXNfdGFnICp0YWcgPSAmdGFnc1tpXTsKLSAgICBzaXplX3Qga2V5X2xlbiA9IHZhbGlkYXRlX3RhZyh0YWctPmtleSk7Ci0gICAgLy8gaWdub3JlIHRoZSB0YWcgaWYgaXQgaXMgaW52YWxpZCBvciB0b28gc2hvcnQuCi0gICAgaWYgKGtleV9sZW4gPD0gMSkgewotICAgICAgY29udGV4dC0+c3RhdHVzLm5faW52YWxpZF90YWdzKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh0YWctPnZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgc2l6ZV90IHZhbHVlX2xlbiA9IHZhbGlkYXRlX3RhZyh0YWctPnZhbHVlKTsKLSAgICAgICAgaWYgKHZhbHVlX2xlbiAhPSAwKSB7Ci0gICAgICAgICAgY29udGV4dF9tb2RpZnlfdGFnKGNvbnRleHQsIHRhZywga2V5X2xlbiwgdmFsdWVfbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb250ZXh0LT5zdGF0dXMubl9pbnZhbGlkX3RhZ3MrKzsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGNvbnRleHRfZGVsZXRlX3RhZyhjb250ZXh0LCB0YWcsIGtleV9sZW4pKSB7Ci0gICAgICAgICAgY29udGV4dC0+c3RhdHVzLm5fZGVsZXRlZF90YWdzKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gUmVtb3ZlIGFueSBkZWxldGVkIHRhZ3MsIHVwZGF0ZSBzdGF0dXMgaWYgbmVlZGVkLCBhbmQgcmV0dXJuLgotICB0YWdfc2V0X2ZsYXR0ZW4oJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSk7Ci0gIHRhZ19zZXRfZmxhdHRlbigmY29udGV4dC0+dGFnc1tMT0NBTF9UQUdTXSk7Ci0gIGNvbnRleHQtPnN0YXR1cy5uX3Byb3BhZ2F0ZWRfdGFncyA9IGNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXS5udGFnczsKLSAgY29udGV4dC0+c3RhdHVzLm5fbG9jYWxfdGFncyA9IGNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10ubnRhZ3M7Ci0gIGlmIChzdGF0dXMpIHsKLSAgICAqc3RhdHVzID0gJmNvbnRleHQtPnN0YXR1czsKLSAgfQotICByZXR1cm4gY29udGV4dDsKLX0KLQotY29uc3QgY2Vuc3VzX2NvbnRleHRfc3RhdHVzICpjZW5zdXNfY29udGV4dF9nZXRfc3RhdHVzKAotICAgIGNvbnN0IGNlbnN1c19jb250ZXh0ICpjb250ZXh0KSB7Ci0gIHJldHVybiAmY29udGV4dC0+c3RhdHVzOwotfQotCi12b2lkIGNlbnN1c19jb250ZXh0X2Rlc3Ryb3koY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQpIHsKLSAgZ3ByX2ZyZWUoY29udGV4dC0+dGFnc1tQUk9QQUdBVEVEX1RBR1NdLmt2bSk7Ci0gIGdwcl9mcmVlKGNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10ua3ZtKTsKLSAgZ3ByX2ZyZWUoY29udGV4dCk7Ci19Ci0KLXZvaWQgY2Vuc3VzX2NvbnRleHRfaW5pdGlhbGl6ZV9pdGVyYXRvcihjb25zdCBjZW5zdXNfY29udGV4dCAqY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5zdXNfY29udGV4dF9pdGVyYXRvciAqaXRlcmF0b3IpIHsKLSAgaXRlcmF0b3ItPmNvbnRleHQgPSBjb250ZXh0OwotICBpdGVyYXRvci0+aW5kZXggPSAwOwotICBpZiAoY29udGV4dC0+dGFnc1tQUk9QQUdBVEVEX1RBR1NdLm50YWdzICE9IDApIHsKLSAgICBpdGVyYXRvci0+YmFzZSA9IFBST1BBR0FURURfVEFHUzsKLSAgICBpdGVyYXRvci0+a3ZtID0gY29udGV4dC0+dGFnc1tQUk9QQUdBVEVEX1RBR1NdLmt2bTsKLSAgfSBlbHNlIGlmIChjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLm50YWdzICE9IDApIHsKLSAgICBpdGVyYXRvci0+YmFzZSA9IExPQ0FMX1RBR1M7Ci0gICAgaXRlcmF0b3ItPmt2bSA9IGNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10ua3ZtOwotICB9IGVsc2UgewotICAgIGl0ZXJhdG9yLT5iYXNlID0gLTE7Ci0gIH0KLX0KLQotaW50IGNlbnN1c19jb250ZXh0X25leHRfdGFnKGNlbnN1c19jb250ZXh0X2l0ZXJhdG9yICppdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5zdXNfdGFnICp0YWcpIHsKLSAgaWYgKGl0ZXJhdG9yLT5iYXNlIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHN0cnVjdCByYXdfdGFnIHJhdzsKLSAgaXRlcmF0b3ItPmt2bSA9IGRlY29kZV90YWcoJnJhdywgaXRlcmF0b3ItPmt2bSwgMCk7Ci0gIHRhZy0+a2V5ID0gcmF3LmtleTsKLSAgdGFnLT52YWx1ZSA9IHJhdy52YWx1ZTsKLSAgdGFnLT5mbGFncyA9IHJhdy5mbGFnczsKLSAgaWYgKCsraXRlcmF0b3ItPmluZGV4ID09IGl0ZXJhdG9yLT5jb250ZXh0LT50YWdzW2l0ZXJhdG9yLT5iYXNlXS5udGFncykgewotICAgIGRvIHsKLSAgICAgIGlmIChpdGVyYXRvci0+YmFzZSA9PSBMT0NBTF9UQUdTKSB7Ci0gICAgICAgIGl0ZXJhdG9yLT5iYXNlID0gLTE7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0gd2hpbGUgKGl0ZXJhdG9yLT5jb250ZXh0LT50YWdzWysraXRlcmF0b3ItPmJhc2VdLm50YWdzID09IDApOwotICAgIGl0ZXJhdG9yLT5pbmRleCA9IDA7Ci0gICAgaXRlcmF0b3ItPmt2bSA9IGl0ZXJhdG9yLT5jb250ZXh0LT50YWdzW2l0ZXJhdG9yLT5iYXNlXS5rdm07Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIEZpbmQgYSB0YWcgaW4gYSB0YWdfc2V0IGJ5IGtleS4gUmV0dXJuIHRydWUgaWYgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KLXN0YXRpYyBib29sIHRhZ19zZXRfZ2V0X3RhZyhjb25zdCBzdHJ1Y3QgdGFnX3NldCAqdGFncywgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuLCBjZW5zdXNfdGFnICp0YWcpIHsKLSAgY2hhciAqa3ZwID0gdGFncy0+a3ZtOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MtPm50YWdzOyBpKyspIHsKLSAgICBzdHJ1Y3QgcmF3X3RhZyByYXc7Ci0gICAga3ZwID0gZGVjb2RlX3RhZygmcmF3LCBrdnAsIDApOwotICAgIGlmIChrZXlfbGVuID09IHJhdy5rZXlfbGVuICYmIG1lbWNtcChyYXcua2V5LCBrZXksIGtleV9sZW4pID09IDApIHsKLSAgICAgIHRhZy0+a2V5ID0gcmF3LmtleTsKLSAgICAgIHRhZy0+dmFsdWUgPSByYXcudmFsdWU7Ci0gICAgICB0YWctPmZsYWdzID0gcmF3LmZsYWdzOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50IGNlbnN1c19jb250ZXh0X2dldF90YWcoY29uc3QgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQsIGNvbnN0IGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnN1c190YWcgKnRhZykgewotICBzaXplX3Qga2V5X2xlbiA9IHN0cmxlbihrZXkpICsgMTsKLSAgaWYgKGtleV9sZW4gPT0gMSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICh0YWdfc2V0X2dldF90YWcoJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSwga2V5LCBrZXlfbGVuLCB0YWcpIHx8Ci0gICAgICB0YWdfc2V0X2dldF90YWcoJmNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10sIGtleSwga2V5X2xlbiwgdGFnKSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLyBDb250ZXh0IGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbnMuCi0vLwotLy8gV2lyZSBmb3JtYXQgZm9yIHRhZ19zZXQncyBvbiB0aGUgd2lyZToKLS8vCi0vLyBGaXJzdCwgYSB0YWcgc2V0IGhlYWRlcjoKLS8vCi0vLyBvZmZzZXQgICBieXRlcyAgZGVzY3JpcHRpb24KLS8vICAgMCAgICAgICAgMSAgICB2ZXJzaW9uIG51bWJlcgotLy8gICAxICAgICAgICAxICAgIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIGhlYWRlci4gVGhpcyBhbGxvd3MgZm9yIGZ1dHVyZQotLy8gICAgICAgICAgICAgICAgIGV4cGFuc2lvbi4KLS8vICAgMiAgICAgICAgMSAgICBudW1iZXIgb2YgYnl0ZXMgaW4gZWFjaCB0YWcgaGVhZGVyLgotLy8gICAzICAgICAgICAxICAgIG50YWdzIHZhbHVlIGZyb20gdGFnIHNldC4KLS8vCi0vLyAgIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIGtleS92YWx1ZSBtZW1vcnkgZnJvbSBzdHJ1Y3QgdGFnX3NldC4KLQotI2RlZmluZSBFTkNPREVEX1ZFUlNJT04gMCAgICAgIC8vIFZlcnNpb24gbnVtYmVyCi0jZGVmaW5lIEVOQ09ERURfSEVBREVSX1NJWkUgNCAgLy8gc2l6ZSBvZiB0YWcgc2V0IGhlYWRlcgotCi0vLyBFbmNvZGUgYSB0YWcgc2V0LiBSZXR1cm5zIDAgaWYgYnVmZmVyIGlzIHRvbyBzbWFsbC4KLXN0YXRpYyBzaXplX3QgdGFnX3NldF9lbmNvZGUoY29uc3Qgc3RydWN0IHRhZ19zZXQgKnRhZ3MsIGNoYXIgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplKSB7Ci0gIGlmIChidWZfc2l6ZSA8IEVOQ09ERURfSEVBREVSX1NJWkUgKyB0YWdzLT5rdm1fdXNlZCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGJ1Zl9zaXplIC09IEVOQ09ERURfSEVBREVSX1NJWkU7Ci0gICpidWZmZXIrKyA9IChjaGFyKUVOQ09ERURfVkVSU0lPTjsKLSAgKmJ1ZmZlcisrID0gKGNoYXIpRU5DT0RFRF9IRUFERVJfU0laRTsKLSAgKmJ1ZmZlcisrID0gKGNoYXIpVEFHX0hFQURFUl9TSVpFOwotICAqYnVmZmVyKysgPSAoY2hhcil0YWdzLT5udGFnczsKLSAgaWYgKHRhZ3MtPm50YWdzID09IDApIHsKLSAgICByZXR1cm4gRU5DT0RFRF9IRUFERVJfU0laRTsKLSAgfQotICBtZW1jcHkoYnVmZmVyLCB0YWdzLT5rdm0sIHRhZ3MtPmt2bV91c2VkKTsKLSAgcmV0dXJuIEVOQ09ERURfSEVBREVSX1NJWkUgKyB0YWdzLT5rdm1fdXNlZDsKLX0KLQotc2l6ZV90IGNlbnN1c19jb250ZXh0X2VuY29kZShjb25zdCBjZW5zdXNfY29udGV4dCAqY29udGV4dCwgY2hhciAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUpIHsKLSAgcmV0dXJuIHRhZ19zZXRfZW5jb2RlKCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sIGJ1ZmZlciwgYnVmX3NpemUpOwotfQotCi0vLyBEZWNvZGUgYSB0YWcgc2V0Lgotc3RhdGljIHZvaWQgdGFnX3NldF9kZWNvZGUoc3RydWN0IHRhZ19zZXQgKnRhZ3MsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7Ci0gIHVpbnQ4X3QgdmVyc2lvbiA9ICh1aW50OF90KSgqYnVmZmVyKyspOwotICB1aW50OF90IGhlYWRlcl9zaXplID0gKHVpbnQ4X3QpKCpidWZmZXIrKyk7Ci0gIHVpbnQ4X3QgdGFnX2hlYWRlcl9zaXplID0gKHVpbnQ4X3QpKCpidWZmZXIrKyk7Ci0gIHRhZ3MtPm50YWdzID0gdGFncy0+bnRhZ3NfYWxsb2MgPSAoaW50KSgqYnVmZmVyKyspOwotICBpZiAodGFncy0+bnRhZ3MgPT0gMCkgewotICAgIHRhZ3MtPm50YWdzX2FsbG9jID0gMDsKLSAgICB0YWdzLT5rdm1fc2l6ZSA9IDA7Ci0gICAgdGFncy0+a3ZtX3VzZWQgPSAwOwotICAgIHRhZ3MtPmt2bSA9IE5VTEw7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChoZWFkZXJfc2l6ZSAhPSBFTkNPREVEX0hFQURFUl9TSVpFKSB7Ci0gICAgR1BSX0FTU0VSVCh2ZXJzaW9uICE9IEVOQ09ERURfVkVSU0lPTik7Ci0gICAgR1BSX0FTU0VSVChFTkNPREVEX0hFQURFUl9TSVpFIDwgaGVhZGVyX3NpemUpOwotICAgIGJ1ZmZlciArPSAoaGVhZGVyX3NpemUgLSBFTkNPREVEX0hFQURFUl9TSVpFKTsKLSAgfQotICB0YWdzLT5rdm1fdXNlZCA9IHNpemUgLSBoZWFkZXJfc2l6ZTsKLSAgdGFncy0+a3ZtX3NpemUgPSB0YWdzLT5rdm1fdXNlZCArIENFTlNVU19NQVhfVEFHX0tWX0xFTjsKLSAgdGFncy0+a3ZtID0gZ3ByX21hbGxvYyh0YWdzLT5rdm1fc2l6ZSk7Ci0gIGlmICh0YWdfaGVhZGVyX3NpemUgIT0gVEFHX0hFQURFUl9TSVpFKSB7Ci0gICAgLy8gc29tZXRoaW5nIG5ldyBpbiB0aGUgdGFnIGluZm9ybWF0aW9uLiBJIGRvbid0IHVuZGVyc3RhbmQgaXQsIHNvCi0gICAgLy8gZG9uJ3QgY29weSBpdCBvdmVyLgotICAgIEdQUl9BU1NFUlQodmVyc2lvbiAhPSBFTkNPREVEX1ZFUlNJT04pOwotICAgIEdQUl9BU1NFUlQodGFnX2hlYWRlcl9zaXplID4gVEFHX0hFQURFUl9TSVpFKTsKLSAgICBjaGFyICprdnAgPSB0YWdzLT5rdm07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLT5udGFnczsgaSsrKSB7Ci0gICAgICBtZW1jcHkoa3ZwLCBidWZmZXIsIFRBR19IRUFERVJfU0laRSk7Ci0gICAgICBrdnAgKz0gaGVhZGVyX3NpemU7Ci0gICAgICBzdHJ1Y3QgcmF3X3RhZyByYXc7Ci0gICAgICBidWZmZXIgPQotICAgICAgICAgIGRlY29kZV90YWcoJnJhdywgKGNoYXIgKilidWZmZXIsIHRhZ19oZWFkZXJfc2l6ZSAtIFRBR19IRUFERVJfU0laRSk7Ci0gICAgICBtZW1jcHkoa3ZwLCByYXcua2V5LCAoc2l6ZV90KXJhdy5rZXlfbGVuICsgcmF3LnZhbHVlX2xlbik7Ci0gICAgICBrdnAgKz0gcmF3LmtleV9sZW4gKyByYXcudmFsdWVfbGVuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtZW1jcHkodGFncy0+a3ZtLCBidWZmZXIsIHRhZ3MtPmt2bV91c2VkKTsKLSAgfQotfQotCi1jZW5zdXNfY29udGV4dCAqY2Vuc3VzX2NvbnRleHRfZGVjb2RlKGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQgPSBncHJfbWFsbG9jKHNpemVvZihjZW5zdXNfY29udGV4dCkpOwotICBtZW1zZXQoJmNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10sIDAsIHNpemVvZihzdHJ1Y3QgdGFnX3NldCkpOwotICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICBtZW1zZXQoJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSwgMCwgc2l6ZW9mKHN0cnVjdCB0YWdfc2V0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgdGFnX3NldF9kZWNvZGUoJmNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXSwgYnVmZmVyLCBzaXplKTsKLSAgfQotICBtZW1zZXQoJmNvbnRleHQtPnN0YXR1cywgMCwgc2l6ZW9mKGNvbnRleHQtPnN0YXR1cykpOwotICBjb250ZXh0LT5zdGF0dXMubl9wcm9wYWdhdGVkX3RhZ3MgPSBjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10ubnRhZ3M7Ci0gIHJldHVybiBjb250ZXh0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2Vuc3VzL2dycGNfY29udGV4dC5jIGIvc3JjL2NvcmUvY2Vuc3VzL2dycGNfY29udGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjYxMzgyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIgotCi12b2lkIGdycGNfY2Vuc3VzX2NhbGxfc2V0X2NvbnRleHQoZ3JwY19jYWxsICpjYWxsLCBjZW5zdXNfY29udGV4dCAqY29udGV4dCkgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jZW5zdXNfY2FsbF9zZXRfY29udGV4dChjYWxsPSVwLCBjZW5zdXNfY29udGV4dD0lcCkiLCAyLAotICAgICAgICAgICAgICAgICAoY2FsbCwgY29udGV4dCkpOwotICBpZiAoY2Vuc3VzX2VuYWJsZWQoKSA9PSBDRU5TVVNfRkVBVFVSRV9OT05FKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjb250ZXh0ICE9IE5VTEwpIHsKLSAgICBncnBjX2NhbGxfY29udGV4dF9zZXQoY2FsbCwgR1JQQ19DT05URVhUX1RSQUNJTkcsIGNvbnRleHQsIE5VTEwpOwotICB9Ci19Ci0KLWNlbnN1c19jb250ZXh0ICpncnBjX2NlbnN1c19jYWxsX2dldF9jb250ZXh0KGdycGNfY2FsbCAqY2FsbCkgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jZW5zdXNfY2FsbF9nZXRfY29udGV4dChjYWxsPSVwKSIsIDEsIChjYWxsKSk7Ci0gIHJldHVybiAoY2Vuc3VzX2NvbnRleHQgKilncnBjX2NhbGxfY29udGV4dF9nZXQoY2FsbCwgR1JQQ19DT05URVhUX1RSQUNJTkcpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmMgYi9zcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExMjBhMi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgY2FsbF9kYXRhIHsKLSAgY2Vuc3VzX29wX2lkIG9wX2lkOwotICBjZW5zdXNfY29udGV4dCAqY3R4dDsKLSAgZ3ByX3RpbWVzcGVjIHN0YXJ0X3RzOwotICBpbnQgZXJyb3I7Ci0KLSAgLyogcmVjdiBjYWxsYmFjayAqLwotICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gIGdycGNfY2xvc3VyZSAqb25fZG9uZV9yZWN2OwotICBncnBjX2Nsb3N1cmUgZmluaXNoX3JlY3Y7Ci19IGNhbGxfZGF0YTsKLQotdHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9kYXRhIHsgdWludDhfdCB1bnVzZWQ7IH0gY2hhbm5lbF9kYXRhOwotCi1zdGF0aWMgdm9pZCBleHRyYWN0X2FuZF9hbm5vdGF0ZV9tZXRob2RfdGFnKGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX2RhdGEgKmNhbGxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2RhdGEgKmNoYW5kKSB7Ci0gIGdycGNfbGlua2VkX21kZWxlbSAqbTsKLSAgZm9yIChtID0gbWQtPmxpc3QuaGVhZDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkgewotICAgIGlmIChtLT5tZC0+a2V5ID09IEdSUENfTURTVFJfUEFUSCkgewotICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICIlcyIsCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopR1BSX1NMSUNFX1NUQVJUX1BUUihtLT5tZC0+dmFsdWUtPnNsaWNlKSk7Ci0gICAgICAvKiBBZGQgbWV0aG9kIHRhZyBoZXJlICovCi0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaWVudF9tdXRhdGVfb3AoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEpIHsKLSAgICBleHRyYWN0X2FuZF9hbm5vdGF0ZV9tZXRob2RfdGFnKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsIGNhbGxkLCBjaGFuZCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY2xpZW50X3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgY2xpZW50X211dGF0ZV9vcChlbGVtLCBvcCk7Ci0gIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlcnZlcl9vbl9kb25lX3JlY3YoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gcHRyOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBpZiAoc3VjY2VzcykgewotICAgIGV4dHJhY3RfYW5kX2Fubm90YXRlX21ldGhvZF90YWcoY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSwgY2FsbGQsIGNoYW5kKTsKLSAgfQotICBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYihleGVjX2N0eCwgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2JfYXJnLCBzdWNjZXNzKTsKLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX211dGF0ZV9vcChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSkgewotICAgIC8qIHN1YnN0aXR1dGUgb3VyIGNhbGxiYWNrIGZvciB0aGUgb3AgY2FsbGJhY2sgKi8KLSAgICBjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBjYWxsZC0+b25fZG9uZV9yZWN2ID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKLSAgICBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID0gJmNhbGxkLT5maW5pc2hfcmVjdjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfc3RhcnRfdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgewotICAvKiBUT0RPKGN0aWxsZXIpOiB0aGlzIGNvZGUgZmFpbHMuIEkgZG9uJ3Qga25vdyB3aHkuIEkgZXhwZWN0IGl0J3MKLSAgICAgICAgICAgICAgICAgICAgaW5jb21wbGV0ZSwgYW5kIHNvbWVvbmUgc2hvdWxkIGxvb2sgYXQgaXQgc29vbi4KLQotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBHUFJfQVNTRVJUKChjYWxsZC0+b3BfaWQudXBwZXIgIT0gMCkgfHwgKGNhbGxkLT5vcF9pZC5sb3dlciAhPSAwKSk7ICovCi0gIHNlcnZlcl9tdXRhdGVfb3AoZWxlbSwgb3ApOwotICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgZWxlbSwgb3ApOwotfQotCi1zdGF0aWMgdm9pZCBjbGllbnRfaW5pdF9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncykgewotICBjYWxsX2RhdGEgKmQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIEdQUl9BU1NFUlQoZCAhPSBOVUxMKTsKLSAgbWVtc2V0KGQsIDAsIHNpemVvZigqZCkpOwotICBkLT5zdGFydF90cyA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKLX0KLQotc3RhdGljIHZvaWQgY2xpZW50X2Rlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNhbGxfZGF0YSAqZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgR1BSX0FTU0VSVChkICE9IE5VTEwpOwotICAvKiBUT0RPKGhvbmd5dSk6IHJlY29yZCBycGMgY2xpZW50IHN0YXRzIGFuZCBjZW5zdXNfcnBjX2VuZF9vcCBoZXJlICovCi19Ci0KLXN0YXRpYyB2b2lkIHNlcnZlcl9pbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7Ci0gIGNhbGxfZGF0YSAqZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgR1BSX0FTU0VSVChkICE9IE5VTEwpOwotICBtZW1zZXQoZCwgMCwgc2l6ZW9mKCpkKSk7Ci0gIGQtPnN0YXJ0X3RzID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOwotICAvKiBUT0RPKGhvbmd5dSk6IGNhbGwgY2Vuc3VzX3RyYWNpbmdfc3RhcnRfb3AgaGVyZS4gKi8KLSAgZ3JwY19jbG9zdXJlX2luaXQoJmQtPmZpbmlzaF9yZWN2LCBzZXJ2ZXJfb25fZG9uZV9yZWN2LCBlbGVtKTsKLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX2Rlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNhbGxfZGF0YSAqZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgR1BSX0FTU0VSVChkICE9IE5VTEwpOwotICAvKiBUT0RPKGhvbmd5dSk6IHJlY29yZCBycGMgc2VydmVyIHN0YXRzIGFuZCBjZW5zdXNfdHJhY2luZ19lbmRfb3AgaGVyZSAqLwotfQotCi1zdGF0aWMgdm9pZCBpbml0X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJncyAqYXJncykgewotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBHUFJfQVNTRVJUKGNoYW5kICE9IE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIEdQUl9BU1NFUlQoY2hhbmQgIT0gTlVMTCk7Ci19Ci0KLWNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19jbGllbnRfY2Vuc3VzX2ZpbHRlciA9IHsKLSAgICBjbGllbnRfc3RhcnRfdHJhbnNwb3J0X29wLAotICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAotICAgIHNpemVvZihjYWxsX2RhdGEpLAotICAgIGNsaWVudF9pbml0X2NhbGxfZWxlbSwKLSAgICBncnBjX2NhbGxfc3RhY2tfaWdub3JlX3NldF9wb2xsc2V0LAotICAgIGNsaWVudF9kZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKLSAgICBpbml0X2NoYW5uZWxfZWxlbSwKLSAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKLSAgICBncnBjX2NhbGxfbmV4dF9nZXRfcGVlciwKLSAgICAiY2Vuc3VzLWNsaWVudCJ9OwotCi1jb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfc2VydmVyX2NlbnN1c19maWx0ZXIgPSB7Ci0gICAgc2VydmVyX3N0YXJ0X3RyYW5zcG9ydF9vcCwKLSAgICBncnBjX2NoYW5uZWxfbmV4dF9vcCwKLSAgICBzaXplb2YoY2FsbF9kYXRhKSwKLSAgICBzZXJ2ZXJfaW5pdF9jYWxsX2VsZW0sCi0gICAgZ3JwY19jYWxsX3N0YWNrX2lnbm9yZV9zZXRfcG9sbHNldCwKLSAgICBzZXJ2ZXJfZGVzdHJveV9jYWxsX2VsZW0sCi0gICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCi0gICAgaW5pdF9jaGFubmVsX2VsZW0sCi0gICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCi0gICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsCi0gICAgImNlbnN1cy1zZXJ2ZXIifTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oIGIvc3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTllNGQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DRU5TVVNfR1JQQ19GSUxURVJfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0VOU1VTX0dSUENfRklMVEVSX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotCi0vKiBDZW5zdXMgZmlsdGVyczogcHJvdmlkZXMgdHJhY2luZyBhbmQgc3RhdHMgY29sbGVjdGlvbiBmdW5jdGlvbmFsaXRpZXMuIEl0Ci0gICBuZWVkcyB0byByZXNpZGUgcmlnaHQgYmVsb3cgdGhlIHN1cmZhY2UgZmlsdGVyIGluIHRoZSBjaGFubmVsIHN0YWNrLiAqLwotZXh0ZXJuIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19jbGllbnRfY2Vuc3VzX2ZpbHRlcjsKLWV4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfc2VydmVyX2NlbnN1c19maWx0ZXI7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0VOU1VTX0dSUENfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5jIGIvc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYTk0MDAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgiCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPGdycGMvY2Vuc3VzLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCi0KLXN0YXRpYyBib29sIG1heWJlX2FkZF9jZW5zdXNfZmlsdGVyKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnX211c3RfYmVfbnVsbCkgewotICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncyA9Ci0gICAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9nZXRfY2hhbm5lbF9hcmd1bWVudHMoYnVpbGRlcik7Ci0gIGlmIChncnBjX2NoYW5uZWxfYXJnc19pc19jZW5zdXNfZW5hYmxlZChhcmdzKSkgewotICAgIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKLSAgICAgICAgYnVpbGRlciwgJmdycGNfY2xpZW50X2NlbnN1c19maWx0ZXIsIE5VTEwsIE5VTEwpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIGNlbnN1c19ncnBjX3BsdWdpbl9pbml0KHZvaWQpIHsKLSAgLyogT25seSBpbml0aWFsaXplIGNlbnN1cyBpZiBubyBvbmUgZWxzZSBoYXMgYW5kIHNvbWUgZmVhdHVyZXMgYXJlCi0gICAqIGF2YWlsYWJsZS4gKi8KLSAgaWYgKGNlbnN1c19lbmFibGVkKCkgPT0gQ0VOU1VTX0ZFQVRVUkVfTk9ORSAmJgotICAgICAgY2Vuc3VzX3N1cHBvcnRlZCgpICE9IENFTlNVU19GRUFUVVJFX05PTkUpIHsKLSAgICBpZiAoY2Vuc3VzX2luaXRpYWxpemUoY2Vuc3VzX3N1cHBvcnRlZCgpKSkgeyAvKiBlbmFibGUgYWxsIGZlYXR1cmVzLiAqLwotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBjZW5zdXMuIik7Ci0gICAgfQotICB9Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX0NIQU5ORUwsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX2FkZF9jZW5zdXNfZmlsdGVyLCBOVUxMKTsKLSAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19TRVJWRVJfQ0hBTk5FTCwgSU5UX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVfYWRkX2NlbnN1c19maWx0ZXIsIE5VTEwpOwotfQotCi12b2lkIGNlbnN1c19ncnBjX3BsdWdpbl9kZXN0cm95KHZvaWQpIHsgY2Vuc3VzX3NodXRkb3duKCk7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5oIGIvc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjFjMmMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DRU5TVVNfR1JQQ19QTFVHSU5fSAotI2RlZmluZSBHUlBDX0NPUkVfQ0VOU1VTX0dSUENfUExVR0lOX0gKLQotdm9pZCBjZW5zdXNfZ3JwY19wbHVnaW5faW5pdCh2b2lkKTsKLXZvaWQgY2Vuc3VzX2dycGNfcGx1Z2luX2Rlc3Ryb3kodm9pZCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0VOU1VTX0dSUENfUExVR0lOX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9tbG9nLmMgYi9zcmMvY29yZS9jZW5zdXMvbWxvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmNjNDZkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NlbnN1cy9tbG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLy8gSW1wbGVtZW50cyBhbiBlZmZpY2llbnQgaW4tbWVtb3J5IGxvZywgb3B0aW1pemVkIGZvciBtdWx0aXBsZSB3cml0ZXJzIGFuZAotLy8gYSBzaW5nbGUgcmVhZGVyLiBBdmFpbGFibGUgbG9nIHNwYWNlIGlzIGRpdmlkZWQgdXAgaW4gYmxvY2tzIG9mCi0vLyBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIGJ5dGVzLiBBIGJsb2NrIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZwotLy8gdGhyZWUgZGF0YSBzdHJ1Y3R1cmVzOgotLy8gLSBGcmVlIGJsb2NrcyAoZnJlZV9ibG9ja19saXN0KQotLy8gLSBCbG9ja3Mgd2l0aCB1bnJlYWQgZGF0YSAoZGlydHlfYmxvY2tfbGlzdCkKLS8vIC0gQmxvY2tzIGN1cnJlbnRseSBhdHRhY2hlZCB0byBjb3JlcyAoY29yZV9sb2NhbF9ibG9ja3NbXSkKLS8vCi0vLyBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgbW92ZXMgYSBibG9jayBmcm9tIGNvcmVfbG9jYWxfYmxvY2tzW10gdG8gdGhlIGVuZCBvZgotLy8gZGlydHlfYmxvY2tfbGlzdCB3aGVuIGJsb2NrOgotLy8gLSBpcyBvdXQtb2Ytc3BhY2UgT1IKLS8vIC0gaGFzIGFuIGluY29tcGxldGUgcmVjb3JkIChhbiBpbmNvbXBsZXRlIHJlY29yZCBvY2N1cnMgd2hlbiBhIHRocmVhZCBjYWxscwotLy8gICBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgYW5kIGlzIGNvbnRleHQtc3dpdGNoZWQgYmVmb3JlIGNhbGxpbmcKLS8vICAgY2Vuc3VzX2xvZ19lbmRfd3JpdGUoKQotLy8gU28sIGJsb2NrcyBpbiBkaXJ0eV9ibG9ja19saXN0IGFyZSBvcmRlcmVkLCBmcm9tIG9sZGVzdCB0byBuZXdlc3QsIGJ5IHRoZQotLy8gdGltZSB3aGVuIGJsb2NrIGlzIGRldGFjaGVkIGZyb20gdGhlIGNvcmUuCi0vLwotLy8gY2Vuc3VzX2xvZ19yZWFkX25leHQoKSBmaXJzdCBpdGVyYXRlcyBvdmVyIGRpcnR5X2Jsb2NrX2xpc3QgYW5kIHRoZW4KLS8vIGNvcmVfbG9jYWxfYmxvY2tzW10uIEl0IG1vdmVzIGNvbXBsZXRlbHkgcmVhZCBibG9ja3MgZnJvbSBkaXJ0eV9ibG9ja19saXN0Ci0vLyB0byBmcmVlX2Jsb2NrX2xpc3QuIEJsb2NrcyBpbiBjb3JlX2xvY2FsX2Jsb2Nrc1tdIGFyZSBub3QgZnJlZWQsIGV2ZW4gd2hlbgotLy8gY29tcGxldGVseSByZWFkLgotLy8KLS8vIElmIHRoZSBsb2cgaXMgY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZCByZWNvcmRzIGFuZCBmcmVlX2Jsb2NrX2xpc3QgaXMgZW1wdHksCi0vLyBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgaXRlcmF0ZXMgb3ZlciBkaXJ0eV9ibG9ja19saXN0IHRvIGFsbG9jYXRlIGEKLS8vIG5ldyBibG9jay4gSXQgbW92ZXMgdGhlIG9sZGVzdCBhdmFpbGFibGUgYmxvY2sgKG5vIHBlbmRpbmcgcmVhZC93cml0ZSkgdG8KLS8vIGNvcmVfbG9jYWxfYmxvY2tzW10uCi0vLwotLy8gY29yZV9sb2NhbF9ibG9ja19zdHJ1Y3QgaXMgdXNlZCB0byBpbXBsZW1lbnQgYSBtYXAgZnJvbSBjb3JlIGlkIHRvIHRoZSBibG9jawotLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgY29yZS4gVGhpcyBtYXBwaW5nIGlzIGFkdmlzb3J5LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZQotLy8gYmxvY2sgcmV0dXJuZWQgYnkgdGhpcyBtYXBwaW5nIGlzIG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBjb3JlLiBUaGlzCi0vLyBtYXBwaW5nIGlzIHVwZGF0ZWQsIGxhemlseSwgYnkgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpLgotLy8KLS8vIExvY2tpbmcgaW4gYmxvY2sgc3RydWN0OgotLy8KLS8vIEV4Y2x1c2l2ZSBnX2xvZy5sb2NrIG11c3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb25zIG9wZXJhdGluZyBvbgotLy8gYmxvY2sgc3RydWN0cyBleGNlcHQgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpIGFuZCBjZW5zdXNfbG9nX2VuZF93cml0ZSgpLgotLy8KLS8vIFdyaXRlcyB0byBhIGJsb2NrIGFyZSBzZXJpYWxpemVkIHZpYSB3cml0ZXJfbG9jay4gY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpCi0vLyBhY3F1aXJlcyB0aGlzIGxvY2sgYW5kIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkgcmVsZWFzZXMgaXQuIE9uIGZhaWx1cmUgdG8KLS8vIGFjcXVpcmUgdGhlIGxvY2ssIHdyaXRlciBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgZm9yIHRoZSBjdXJyZW50IGNvcmUgYW5kCi0vLyB1cGRhdGVzIGNvcmVfbG9jYWxfYmxvY2sgYWNjb3JkaW5nbHkuCi0vLwotLy8gU2ltdWx0YW5lb3VzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyBhbGxvd2VkLiBSZWFkZXJzIGNhbiBzYWZlbHkgcmVhZCB1cCB0bwotLy8gY29tbWl0dGVkIGJ5dGVzIChieXRlc19jb21taXR0ZWQpLgotLy8KLS8vIHJlYWRlcl9sb2NrIHByb3RlY3RzIHRoZSBibG9jaywgY3VycmVudGx5IGJlaW5nIHJlYWQsIGZyb20gZ2V0dGluZyByZWN5Y2xlZC4KLS8vIHN0YXJ0X3JlYWQoKSBhY3F1aXJlcyByZWFkZXJfbG9jayBhbmQgZW5kX3JlYWQoKSByZWxlYXNlcyB0aGUgbG9jay4KLS8vCi0vLyBSZWFkL3dyaXRlIGFjY2VzcyB0byBhIGJsb2NrIGlzIGRpc2FibGVkIHZpYSB0cnlfZGlzYWJsZV9hY2Nlc3MoKS4gSXQgcmV0dXJucwotLy8gd2l0aCBib3RoIHdyaXRlcl9sb2NrIGFuZCByZWFkZXJfbG9jayBoZWxkLiBUaGVzZSBsb2NrcyBhcmUgc3Vic2VxdWVudGx5Ci0vLyByZWxlYXNlZCBieSBlbmFibGVfYWNjZXNzKCkgdG8gZW5hYmxlIGFjY2VzcyB0byB0aGUgYmxvY2suCi0vLwotLy8gQSBub3RlIG9uIG5hbWluZzogTW9zdCBmdW5jdGlvbi9zdHJ1Y3QgbmFtZXMgYXJlIHByZXBlbmRlZCBieSBjbF8KLS8vIChzaG9ydGhhbmQgZm9yIGNlbnN1c19sb2cpLiBGdXJ0aGVyLCBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlIHN0cnVjdHVyZXMKLS8vIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0Ci0vLyBhcmd1bWVudC4gRS5nLiBjbF9ibG9ja19pbml0aWFsaXplKCkgd2lsbCBpbml0aWFsaXplIGEgY2xfYmxvY2suCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jZW5zdXMvbWxvZy5oIgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvY3B1Lmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLy8gRW5kIG9mIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUKLQotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9ja19saXN0X3N0cnVjdCB7Ci0gIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrX2xpc3Rfc3RydWN0KiBuZXh0OwotICBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9ja19saXN0X3N0cnVjdCogcHJldjsKLSAgc3RydWN0IGNlbnN1c19sb2dfYmxvY2sqIGJsb2NrOwotfSBjbF9ibG9ja19saXN0X3N0cnVjdDsKLQotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9jayB7Ci0gIC8vIFBvaW50ZXIgdG8gdW5kZXJseWluZyBidWZmZXIuCi0gIGNoYXIqIGJ1ZmZlcjsKLSAgZ3ByX2F0bSB3cml0ZXJfbG9jazsKLSAgZ3ByX2F0bSByZWFkZXJfbG9jazsKLSAgLy8gS2VlcHMgY29tcGxldGVseSB3cml0dGVuIGJ5dGVzLiBEZWNsYXJlZCBhdG9taWMgYmVjYXVzZSBhY2Nlc3NlZAotICAvLyBzaW11bHRhbmVvdXNseSBieSByZWFkZXIgYW5kIHdyaXRlci4KLSAgZ3ByX2F0bSBieXRlc19jb21taXR0ZWQ7Ci0gIC8vIEJ5dGVzIGFscmVhZHkgcmVhZC4KLSAgc2l6ZV90IGJ5dGVzX3JlYWQ7Ci0gIC8vIExpbmtzIGZvciBsaXN0LgotICBjbF9ibG9ja19saXN0X3N0cnVjdCBsaW5rOwotLy8gV2Ugd2FudCB0aGlzIHN0cnVjdHVyZSB0byBiZSBjYWNoZWxpbmUgYWxpZ25lZC4gV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcKLS8vIHNpemVzIGZvciB0aGUgdmFyaW91cyBwYXJ0cyBvbiAzMi82NGJpdCBzeXN0ZW1zOgotLy8gdHlwZSAgICAgICAgICAgICAgICAgMzJiIHNpemUgICAgNjRiIHNpemUKLS8vIGNoYXIqICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgIDgKLS8vIDN4IGdwcl9hdG0gICAgICAgICAgICAgMTIgICAgICAgICAgMjQKLS8vIHNpemVfdCAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgIDgKLS8vIGNsX2Jsb2NrX2xpc3Rfc3RydWN0ICAgMTIgICAgICAgICAgMjQKLS8vIFRPVEFMICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgNjQKLS8vCi0vLyBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2Ygb3VyIGNhY2hlbGluZSBhbmQgdGhlIGFyY2hpdGVjdHVyZSwgd2UKLS8vIHNlbGVjdGl2ZWx5IGFkZCBjaGFyIGJ1ZmZlcmluZyB0byB0aGlzIHN0cnVjdHVyZS4gVGhlIHNpemUgaXMgY2hlY2tlZAotLy8gdmlhIGFzc2VydCBpbiBjZW5zdXNfbG9nX2luaXRpYWxpemUoKS4KLSNpZiBkZWZpbmVkKEdQUl9BUkNIXzY0KQotI2RlZmluZSBDTF9CTE9DS19QQURfU0laRSAoR1BSX0NBQ0hFTElORV9TSVpFIC0gNjQpCi0jZWxzZQotI2lmIGRlZmluZWQoR1BSX0FSQ0hfMzIpCi0jZGVmaW5lIENMX0JMT0NLX1BBRF9TSVpFIChHUFJfQ0FDSEVMSU5FX1NJWkUgLSAzMikKLSNlbHNlCi0jZXJyb3IgIlVua25vd24gYXJjaGl0ZWN0dXJlIgotI2VuZGlmCi0jZW5kaWYKLSNpZiBDTF9CTE9DS19QQURfU0laRSA+IDAKLSAgY2hhciBwYWRkaW5nW0NMX0JMT0NLX1BBRF9TSVpFXTsKLSNlbmRpZgotfSBjbF9ibG9jazsKLQotLy8gQSBsaXN0IG9mIGNsX2Jsb2NrcywgZG91Ymx5LWxpbmtlZCB0aHJvdWdoIGNsX2Jsb2NrOjpsaW5rLgotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9ja19saXN0IHsKLSAgaW50MzJfdCBjb3VudDsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgaXRlbXMgaW4gbGlzdC4KLSAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3QgaHQ7ICAvLyBoZWFkL3RhaWwgb2YgbGlua2VkIGxpc3QuCi19IGNsX2Jsb2NrX2xpc3Q7Ci0KLS8vIENhY2hlbGluZSBhbGlnbmVkIGJsb2NrIHBvaW50ZXJzIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcuIEJsb2NrIHBvaW50ZXIgbXVzdAotLy8gYmUgaW5pdGlhbGl6ZWQgdmlhIHNldF9ibG9jaygpLCBiZWZvcmUgY2FsbGluZyBvdGhlciBmdW5jdGlvbnMKLXR5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfY29yZV9sb2NhbF9ibG9jayB7Ci0gIGdwcl9hdG0gYmxvY2s7Ci0vLyBFbnN1cmUgY2FjaGxpbmUgYWxpZ25tZW50OiB3ZSBhc3N1bWUgc2l6ZW9mKGdwcl9hdG0pID09IDQgb3IgOAotI2lmIGRlZmluZWQoR1BSX0FSQ0hfNjQpCi0jZGVmaW5lIENMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDgpCi0jZWxzZQotI2lmIGRlZmluZWQoR1BSX0FSQ0hfMzIpCi0jZGVmaW5lIENMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDQpCi0jZWxzZQotI2Vycm9yICJVbmtub3duIGFyY2hpdGVjdHVyZSIKLSNlbmRpZgotI2VuZGlmCi0jaWYgQ0xfQ09SRV9MT0NBTF9CTE9DS19QQURfU0laRSA+IDAKLSAgY2hhciBwYWRkaW5nW0NMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkVdOwotI2VuZGlmCi19IGNsX2NvcmVfbG9jYWxfYmxvY2s7Ci0KLXN0cnVjdCBjZW5zdXNfbG9nIHsKLSAgaW50IGRpc2NhcmRfb2xkX3JlY29yZHM7Ci0gIC8vIE51bWJlciBvZiBjb3JlcyAoYWthIGhhcmR3YXJlLWNvbnRleHRzKQotICB1bnNpZ25lZCBudW1fY29yZXM7Ci0gIC8vIG51bWJlciBvZiBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIGJsb2NrcyBpbiBsb2cKLSAgdWludDMyX3QgbnVtX2Jsb2NrczsKLSAgY2xfYmxvY2sqIGJsb2NrczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbG9jayBtZXRhZGF0YS4KLSAgY2xfY29yZV9sb2NhbF9ibG9jayogY29yZV9sb2NhbF9ibG9ja3M7ICAvLyBLZWVwcyBjb3JlIHRvIGJsb2NrIG1hcHBpbmdzLgotICBncHJfbXUgbG9jazsKLSAgaW50IGluaXRpYWxpemVkOyAgLy8gaGFzIGxvZyBiZWVuIGluaXRpYWxpemVkPwotICAvLyBLZWVwcyB0aGUgc3RhdGUgb2YgdGhlIHJlYWRlciBpdGVyYXRvci4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0Ci0gIC8vIGl0ZXJhdG9yIGhhcyByZWFjaGVkIHRoZSBlbmQuIGNlbnN1c19sb2dfaW5pdF9yZWFkZXIoKSByZXNldHMgdGhlIHZhbHVlCi0gIC8vIHRvIG51bV9jb3JlIHRvIHJlc3RhcnQgaXRlcmF0aW9uLgotICB1aW50MzJfdCByZWFkX2l0ZXJhdG9yX3N0YXRlOwotICAvLyBQb2ludHMgdG8gdGhlIGJsb2NrIGJlaW5nIHJlYWQuIElmIG5vbi1OVUxMLCB0aGUgYmxvY2sgaXMgbG9ja2VkIGZvcgotICAvLyByZWFkaW5nKGJsb2NrX2JlaW5nX3JlYWRfLT5yZWFkZXJfbG9jayBpcyBoZWxkKS4KLSAgY2xfYmxvY2sqIGJsb2NrX2JlaW5nX3JlYWQ7Ci0gIGNoYXIqIGJ1ZmZlcjsKLSAgY2xfYmxvY2tfbGlzdCBmcmVlX2Jsb2NrX2xpc3Q7Ci0gIGNsX2Jsb2NrX2xpc3QgZGlydHlfYmxvY2tfbGlzdDsKLSAgZ3ByX2F0bSBvdXRfb2Zfc3BhY2VfY291bnQ7Ci19OwotCi0vLyBTaW5nbGUgaW50ZXJuYWwgbG9nLgotc3RhdGljIHN0cnVjdCBjZW5zdXNfbG9nIGdfbG9nOwotCi0vLyBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGFuIGF0b21pYyBtZW1vcnkgbG9jYXRpb24gdXNlZCBhcyBhIGxvY2suCi0KLS8vIFJldHVybnMgbm9uLXplcm8gaWYgbG9jayBpcyBhY3F1aXJlZC4KLXN0YXRpYyBpbnQgY2xfdHJ5X2xvY2soZ3ByX2F0bSogbG9jaykgeyByZXR1cm4gZ3ByX2F0bV9hY3FfY2FzKGxvY2ssIDAsIDEpOyB9Ci0KLXN0YXRpYyB2b2lkIGNsX3VubG9jayhncHJfYXRtKiBsb2NrKSB7IGdwcl9hdG1fcmVsX3N0b3JlKGxvY2ssIDApOyB9Ci0KLS8vIEZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gY2xfY29yZV9sb2NhbF9ibG9jaydzLgotCi1zdGF0aWMgdm9pZCBjbF9jb3JlX2xvY2FsX2Jsb2NrX3NldF9ibG9jayhjbF9jb3JlX2xvY2FsX2Jsb2NrKiBjbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ibG9jayogYmxvY2spIHsKLSAgZ3ByX2F0bV9yZWxfc3RvcmUoJmNsYi0+YmxvY2ssIChncHJfYXRtKWJsb2NrKTsKLX0KLQotc3RhdGljIGNsX2Jsb2NrKiBjbF9jb3JlX2xvY2FsX2Jsb2NrX2dldF9ibG9jayhjbF9jb3JlX2xvY2FsX2Jsb2NrKiBjbGIpIHsKLSAgcmV0dXJuIChjbF9ibG9jayopZ3ByX2F0bV9hY3FfbG9hZCgmY2xiLT5ibG9jayk7Ci19Ci0KLS8vIEZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gY2xfYmxvY2tfbGlzdF9zdHJ1Y3Qncy4KLQotc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9zdHJ1Y3RfaW5pdGlhbGl6ZShjbF9ibG9ja19saXN0X3N0cnVjdCogYmxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ibG9jayogYmxvY2spIHsKLSAgYmxzLT5uZXh0ID0gYmxzLT5wcmV2ID0gYmxzOwotICBibHMtPmJsb2NrID0gYmxvY2s7Ci19Ci0KLS8vIEZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gY2xfYmxvY2tfbGlzdCdzLgotCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X2luaXRpYWxpemUoY2xfYmxvY2tfbGlzdCogbGlzdCkgewotICBsaXN0LT5jb3VudCA9IDA7Ci0gIGNsX2Jsb2NrX2xpc3Rfc3RydWN0X2luaXRpYWxpemUoJmxpc3QtPmh0LCBOVUxMKTsKLX0KLQotLy8gUmV0dXJucyBoZWFkIG9mICp0aGlzLCBvciBOVUxMIGlmIGVtcHR5Lgotc3RhdGljIGNsX2Jsb2NrKiBjbF9ibG9ja19saXN0X2hlYWQoY2xfYmxvY2tfbGlzdCogbGlzdCkgewotICByZXR1cm4gbGlzdC0+aHQubmV4dC0+YmxvY2s7Ci19Ci0KLS8vIEluc2VydCBlbGVtZW50ICplIGFmdGVyICpwb3MuCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X2luc2VydChjbF9ibG9ja19saXN0KiBsaXN0LCBjbF9ibG9ja19saXN0X3N0cnVjdCogcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3QqIGUpIHsKLSAgbGlzdC0+Y291bnQrKzsKLSAgZS0+bmV4dCA9IHBvcy0+bmV4dDsKLSAgZS0+cHJldiA9IHBvczsKLSAgZS0+bmV4dC0+cHJldiA9IGU7Ci0gIGUtPnByZXYtPm5leHQgPSBlOwotfQotCi0vLyBJbnNlcnQgYmxvY2sgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QKLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X2hlYWQoY2xfYmxvY2tfbGlzdCogbGlzdCwgY2xfYmxvY2sqIGJsb2NrKSB7Ci0gIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0KGxpc3QsICZsaXN0LT5odCwgJmJsb2NrLT5saW5rKTsKLX0KLQotLy8gSW5zZXJ0IGJsb2NrIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0Lgotc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfdGFpbChjbF9ibG9ja19saXN0KiBsaXN0LCBjbF9ibG9jayogYmxvY2spIHsKLSAgY2xfYmxvY2tfbGlzdF9pbnNlcnQobGlzdCwgbGlzdC0+aHQucHJldiwgJmJsb2NrLT5saW5rKTsKLX0KLQotLy8gUmVtb3ZlcyBibG9jayAqYi4gUmVxdWlyZXMgKmIgYmUgaW4gdGhlIGxpc3QuCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X3JlbW92ZShjbF9ibG9ja19saXN0KiBsaXN0LCBjbF9ibG9jayogYikgewotICBsaXN0LT5jb3VudC0tOwotICBiLT5saW5rLm5leHQtPnByZXYgPSBiLT5saW5rLnByZXY7Ci0gIGItPmxpbmsucHJldi0+bmV4dCA9IGItPmxpbmsubmV4dDsKLX0KLQotLy8gRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBjbF9ibG9jaydzCi0KLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX2luaXRpYWxpemUoY2xfYmxvY2sqIGJsb2NrLCBjaGFyKiBidWZmZXIpIHsKLSAgYmxvY2stPmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgZ3ByX2F0bV9yZWxfc3RvcmUoJmJsb2NrLT53cml0ZXJfbG9jaywgMCk7Ci0gIGdwcl9hdG1fcmVsX3N0b3JlKCZibG9jay0+cmVhZGVyX2xvY2ssIDApOwotICBncHJfYXRtX3JlbF9zdG9yZSgmYmxvY2stPmJ5dGVzX2NvbW1pdHRlZCwgMCk7Ci0gIGJsb2NrLT5ieXRlc19yZWFkID0gMDsKLSAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3RfaW5pdGlhbGl6ZSgmYmxvY2stPmxpbmssIGJsb2NrKTsKLX0KLQotLy8gR3VhcmRzIGFnYWluc3QgZXhwb3NpbmcgcGFydGlhbGx5IHdyaXR0ZW4gYnVmZmVyIHRvIHRoZSByZWFkZXIuCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19zZXRfYnl0ZXNfY29tbWl0dGVkKGNsX2Jsb2NrKiBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzX2NvbW1pdHRlZCkgewotICBncHJfYXRtX3JlbF9zdG9yZSgmYmxvY2stPmJ5dGVzX2NvbW1pdHRlZCwgKGdwcl9hdG0pYnl0ZXNfY29tbWl0dGVkKTsKLX0KLQotc3RhdGljIHNpemVfdCBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGNsX2Jsb2NrKiBibG9jaykgewotICByZXR1cm4gKHNpemVfdClncHJfYXRtX2FjcV9sb2FkKCZibG9jay0+Ynl0ZXNfY29tbWl0dGVkKTsKLX0KLQotLy8gVHJpZXMgdG8gZGlzYWJsZSBmdXR1cmUgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhpcyBibG9jay4gU3VjY2VlZHMgaWY6Ci0vLyAtIG5vIGluLXByb2dyZXNzIHdyaXRlIEFORAotLy8gLSBubyBpbi1wcm9ncmVzcyByZWFkIEFORAotLy8gLSAnZGlzY2FyZF9kYXRhJyBzZXQgdG8gdHJ1ZSBPUiBubyB1bnJlYWQgZGF0YQotLy8gT24gc3VjY2VzcywgY2xlYXJzIHRoZSBibG9jayBzdGF0ZSBhbmQgcmV0dXJucyB3aXRoIHdyaXRlcl9sb2NrXyBhbmQKLS8vIHJlYWRlcl9sb2NrXyBoZWxkLiBUaGVzZSBsb2NrcyBhcmUgcmVsZWFzZWQgYnkgYSBzdWJzZXF1ZW50Ci0vLyBjbF9ibG9ja19hY2Nlc3NfZW5hYmxlKCkgY2FsbC4KLXN0YXRpYyBib29sIGNsX2Jsb2NrX3RyeV9kaXNhYmxlX2FjY2VzcyhjbF9ibG9jayogYmxvY2ssIGludCBkaXNjYXJkX2RhdGEpIHsKLSAgaWYgKCFjbF90cnlfbG9jaygmYmxvY2stPndyaXRlcl9sb2NrKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWNsX3RyeV9sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spKSB7Ci0gICAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWRpc2NhcmRfZGF0YSAmJgotICAgICAgKGJsb2NrLT5ieXRlc19yZWFkICE9IGNsX2Jsb2NrX2dldF9ieXRlc19jb21taXR0ZWQoYmxvY2spKSkgewotICAgIGNsX3VubG9jaygmYmxvY2stPnJlYWRlcl9sb2NrKTsKLSAgICBjbF91bmxvY2soJmJsb2NrLT53cml0ZXJfbG9jayk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNsX2Jsb2NrX3NldF9ieXRlc19jb21taXR0ZWQoYmxvY2ssIDApOwotICBibG9jay0+Ynl0ZXNfcmVhZCA9IDA7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19lbmFibGVfYWNjZXNzKGNsX2Jsb2NrKiBibG9jaykgewotICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7Ci0gIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKLX0KLQotLy8gUmV0dXJucyB3aXRoIHdyaXRlcl9sb2NrIGhlbGQuCi1zdGF0aWMgdm9pZCogY2xfYmxvY2tfc3RhcnRfd3JpdGUoY2xfYmxvY2sqIGJsb2NrLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoIWNsX3RyeV9sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgc2l6ZV90IGJ5dGVzX2NvbW1pdHRlZCA9IGNsX2Jsb2NrX2dldF9ieXRlc19jb21taXR0ZWQoYmxvY2spOwotICBpZiAoYnl0ZXNfY29tbWl0dGVkICsgc2l6ZSA+IENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKSB7Ci0gICAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBibG9jay0+YnVmZmVyICsgYnl0ZXNfY29tbWl0dGVkOwotfQotCi0vLyBSZWxlYXNlcyB3cml0ZXJfbG9jayBhbmQgaW5jcmVtZW50cyBjb21taXR0ZWQgYnl0ZXMgYnkgJ2J5dGVzX3dyaXR0ZW4nLgotLy8gJ2J5dGVzX3dyaXR0ZW4nIG11c3QgYmUgPD0gJ3NpemUnIHNwZWNpZmllZCBpbiB0aGUgY29ycmVzcG9uZGluZwotLy8gU3RhcnRXcml0ZSgpIGNhbGwuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUuCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19lbmRfd3JpdGUoY2xfYmxvY2sqIGJsb2NrLCBzaXplX3QgYnl0ZXNfd3JpdHRlbikgewotICBjbF9ibG9ja19zZXRfYnl0ZXNfY29tbWl0dGVkKAotICAgICAgYmxvY2ssIGNsX2Jsb2NrX2dldF9ieXRlc19jb21taXR0ZWQoYmxvY2spICsgYnl0ZXNfd3JpdHRlbik7Ci0gIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKLX0KLQotLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHVucmVhZCBieXRlIGluIGJ1ZmZlci4gVGhlIG51bWJlciBvZiBieXRlcwotLy8gYXZhaWxhYmxlIGFyZSByZXR1cm5lZCBpbiAnYnl0ZXNfYXZhaWxhYmxlJy4gQWNxdWlyZXMgcmVhZGVyIGxvY2sgdGhhdCBpcwotLy8gcmVsZWFzZWQgYnkgYSBzdWJzZXF1ZW50IGNsX2Jsb2NrX2VuZF9yZWFkKCkgY2FsbC4gUmV0dXJucyBOVUxMIGlmOgotLy8gLSByZWFkIGluIHByb2dyZXNzCi0vLyAtIG5vIGRhdGEgYXZhaWxhYmxlCi1zdGF0aWMgdm9pZCogY2xfYmxvY2tfc3RhcnRfcmVhZChjbF9ibG9jayogYmxvY2ssIHNpemVfdCogYnl0ZXNfYXZhaWxhYmxlKSB7Ci0gIGlmICghY2xfdHJ5X2xvY2soJmJsb2NrLT5yZWFkZXJfbG9jaykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAvLyBieXRlc19jb21taXR0ZWQgbWF5IGNoYW5nZSBmcm9tIHVuZGVyIHVzLiBVc2UgYnl0ZXNfYXZhaWxhYmxlIHRvIHVwZGF0ZQotICAvLyBieXRlc19yZWFkIGJlbG93LgotICBzaXplX3QgYnl0ZXNfY29tbWl0dGVkID0gY2xfYmxvY2tfZ2V0X2J5dGVzX2NvbW1pdHRlZChibG9jayk7Ci0gIEdQUl9BU1NFUlQoYnl0ZXNfY29tbWl0dGVkID49IGJsb2NrLT5ieXRlc19yZWFkKTsKLSAgKmJ5dGVzX2F2YWlsYWJsZSA9IGJ5dGVzX2NvbW1pdHRlZCAtIGJsb2NrLT5ieXRlc19yZWFkOwotICBpZiAoKmJ5dGVzX2F2YWlsYWJsZSA9PSAwKSB7Ci0gICAgY2xfdW5sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHZvaWQqIHJlY29yZCA9IGJsb2NrLT5idWZmZXIgKyBibG9jay0+Ynl0ZXNfcmVhZDsKLSAgYmxvY2stPmJ5dGVzX3JlYWQgKz0gKmJ5dGVzX2F2YWlsYWJsZTsKLSAgcmV0dXJuIHJlY29yZDsKLX0KLQotc3RhdGljIHZvaWQgY2xfYmxvY2tfZW5kX3JlYWQoY2xfYmxvY2sqIGJsb2NrKSB7Ci0gIGNsX3VubG9jaygmYmxvY2stPnJlYWRlcl9sb2NrKTsKLX0KLQotLy8gSW50ZXJuYWwgZnVuY3Rpb25zIG9wZXJhdGluZyBvbiBnX2xvZwotCi0vLyBBbGxvY2F0ZXMgYSBuZXcgZnJlZSBibG9jayAob3IgcmVjeWNsZXMgYW4gYXZhaWxhYmxlIGRpcnR5IGJsb2NrIGlmIGxvZyBpcwotLy8gY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZCByZWNvcmRzKS4gUmV0dXJucyBOVUxMIGlmIG91dC1vZi1zcGFjZS4KLXN0YXRpYyBjbF9ibG9jayogY2xfYWxsb2NhdGVfYmxvY2sodm9pZCkgewotICBjbF9ibG9jayogYmxvY2sgPSBjbF9ibG9ja19saXN0X2hlYWQoJmdfbG9nLmZyZWVfYmxvY2tfbGlzdCk7Ci0gIGlmIChibG9jayAhPSBOVUxMKSB7Ci0gICAgY2xfYmxvY2tfbGlzdF9yZW1vdmUoJmdfbG9nLmZyZWVfYmxvY2tfbGlzdCwgYmxvY2spOwotICAgIHJldHVybiBibG9jazsKLSAgfQotICBpZiAoIWdfbG9nLmRpc2NhcmRfb2xkX3JlY29yZHMpIHsKLSAgICAvLyBObyBmcmVlIGJsb2NrIGFuZCBsb2cgaXMgY29uZmlndXJlZCB0byBrZWVwIG9sZCByZWNvcmRzLgotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIC8vIFJlY3ljbGUgZGlydHkgYmxvY2suIFN0YXJ0IGZyb20gdGhlIG9sZGVzdC4KLSAgZm9yIChibG9jayA9IGNsX2Jsb2NrX2xpc3RfaGVhZCgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCk7IGJsb2NrICE9IE5VTEw7Ci0gICAgICAgYmxvY2sgPSBibG9jay0+bGluay5uZXh0LT5ibG9jaykgewotICAgIGlmIChjbF9ibG9ja190cnlfZGlzYWJsZV9hY2Nlc3MoYmxvY2ssIDEgLyogZGlzY2FyZCBkYXRhICovKSkgewotICAgICAgY2xfYmxvY2tfbGlzdF9yZW1vdmUoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QsIGJsb2NrKTsKLSAgICAgIHJldHVybiBibG9jazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIEFsbG9jYXRlcyBhIG5ldyBibG9jayBhbmQgdXBkYXRlcyBjb3JlIGlkID0+IGJsb2NrIG1hcHBpbmcuICdvbGRfYmxvY2snCi0vLyBwb2ludHMgdG8gdGhlIGJsb2NrIHRoYXQgdGhlIGNhbGxlciB0aGlua3MgaXMgYXR0YWNoZWQgdG8KLS8vICdjb3JlX2lkJy4gJ29sZF9ibG9jaycgbWF5IGJlIE5VTEwuIFJldHVybnMgdHJ1ZSBpZjoKLS8vIC0gYWxsb2NhdGVkIGEgbmV3IGJsb2NrIE9SCi0vLyAtICdjb3JlX2lkJyA9PiAnb2xkX2Jsb2NrJyBtYXBwaW5nIGNoYW5nZWQgKGFub3RoZXIgdGhyZWFkIGFsbG9jYXRlZCBhCi0vLyAgIGJsb2NrIGJlZm9yZSBsb2NrIHdhcyBhY3F1aXJlZCkuCi1zdGF0aWMgYm9vbCBjbF9hbGxvY2F0ZV9jb3JlX2xvY2FsX2Jsb2NrKHVpbnQzMl90IGNvcmVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2Jsb2NrKiBvbGRfYmxvY2spIHsKLSAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgbG9jaywgY2hlY2sgaWYgY29yZS1sb2NhbCBtYXBwaW5nIGhhcyBjaGFuZ2VkLgotICBjbF9jb3JlX2xvY2FsX2Jsb2NrKiBjb3JlX2xvY2FsX2Jsb2NrID0gJmdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzW2NvcmVfaWRdOwotICBjbF9ibG9jayogYmxvY2sgPSBjbF9jb3JlX2xvY2FsX2Jsb2NrX2dldF9ibG9jayhjb3JlX2xvY2FsX2Jsb2NrKTsKLSAgaWYgKChibG9jayAhPSBOVUxMKSAmJiAoYmxvY2sgIT0gb2xkX2Jsb2NrKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChibG9jayAhPSBOVUxMKSB7Ci0gICAgY2xfY29yZV9sb2NhbF9ibG9ja19zZXRfYmxvY2soY29yZV9sb2NhbF9ibG9jaywgTlVMTCk7Ci0gICAgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfdGFpbCgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCwgYmxvY2spOwotICB9Ci0gIGJsb2NrID0gY2xfYWxsb2NhdGVfYmxvY2soKTsKLSAgaWYgKGJsb2NrID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY2xfY29yZV9sb2NhbF9ibG9ja19zZXRfYmxvY2soY29yZV9sb2NhbF9ibG9jaywgYmxvY2spOwotICBjbF9ibG9ja19lbmFibGVfYWNjZXNzKGJsb2NrKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjbF9ibG9jayogY2xfZ2V0X2Jsb2NrKHZvaWQqIHJlY29yZCkgewotICB1aW50cHRyX3QgcCA9ICh1aW50cHRyX3QpKChjaGFyKilyZWNvcmQgLSBnX2xvZy5idWZmZXIpOwotICB1aW50cHRyX3QgaW5kZXggPSBwID4+IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkU7Ci0gIHJldHVybiAmZ19sb2cuYmxvY2tzW2luZGV4XTsKLX0KLQotLy8gR2V0cyB0aGUgbmV4dCBibG9jayB0byByZWFkIGFuZCB0cmllcyB0byBmcmVlICdwcmV2JyBibG9jayAoaWYgbm90IE5VTEwpLgotLy8gUmV0dXJucyBOVUxMIGlmIHJlYWNoZWQgdGhlIGVuZC4KLXN0YXRpYyBjbF9ibG9jayogY2xfbmV4dF9ibG9ja190b19yZWFkKGNsX2Jsb2NrKiBwcmV2KSB7Ci0gIGNsX2Jsb2NrKiBibG9jayA9IE5VTEw7Ci0gIGlmIChnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlID09IGdfbG9nLm51bV9jb3JlcykgewotICAgIC8vIFdlIGFyZSB0cmF2ZXJzaW5nIGRpcnR5IGxpc3Q7IGZpbmQgdGhlIG5leHQgZGlydHkgYmxvY2suCi0gICAgaWYgKHByZXYgIT0gTlVMTCkgewotICAgICAgLy8gVHJ5IHRvIGZyZWUgdGhlIHByZXZpb3VzIGJsb2NrIGlmIHRoZXJlIGlzIG5vIHVucmVhZCBkYXRhLiBUaGlzCi0gICAgICAvLyBibG9jawotICAgICAgLy8gbWF5IGhhdmUgdW5yZWFkIGRhdGEgaWYgcHJldmlvdXNseSBpbmNvbXBsZXRlIHJlY29yZCBjb21wbGV0ZWQKLSAgICAgIC8vIGJldHdlZW4KLSAgICAgIC8vIHJlYWRfbmV4dCgpIGNhbGxzLgotICAgICAgYmxvY2sgPSBwcmV2LT5saW5rLm5leHQtPmJsb2NrOwotICAgICAgaWYgKGNsX2Jsb2NrX3RyeV9kaXNhYmxlX2FjY2VzcyhwcmV2LCAwIC8qIGRvIG5vdCBkaXNjYXJkIGRhdGEgKi8pKSB7Ci0gICAgICAgIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0LCBwcmV2KTsKLSAgICAgICAgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfaGVhZCgmZ19sb2cuZnJlZV9ibG9ja19saXN0LCBwcmV2KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYmxvY2sgPSBjbF9ibG9ja19saXN0X2hlYWQoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QpOwotICAgIH0KLSAgICBpZiAoYmxvY2sgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLSAgICAvLyBXZSBhcmUgZG9uZSB3aXRoIHRoZSBkaXJ0eSBsaXN0OyBtb3Zpbmcgb24gdG8gY29yZS1sb2NhbCBibG9ja3MuCi0gIH0KLSAgd2hpbGUgKGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUgPiAwKSB7Ci0gICAgZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZS0tOwotICAgIGJsb2NrID0gY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soCi0gICAgICAgICZnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrc1tnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlXSk7Ci0gICAgaWYgKGJsb2NrICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBibG9jazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgQ0xfTE9HXzJfTUIgMjAgIC8vIDJeMjAgPSAxTUIKLQotLy8gRXh0ZXJuYWwgZnVuY3Rpb25zOiBwcmltYXJ5IHN0YXRzX2xvZyBpbnRlcmZhY2UKLXZvaWQgY2Vuc3VzX2xvZ19pbml0aWFsaXplKHNpemVfdCBzaXplX2luX21iLCBpbnQgZGlzY2FyZF9vbGRfcmVjb3JkcykgewotICAvLyBDaGVjayBjYWNoZWxpbmUgYWxpZ25tZW50LgotICBHUFJfQVNTRVJUKHNpemVvZihjbF9ibG9jaykgJSBHUFJfQ0FDSEVMSU5FX1NJWkUgPT0gMCk7Ci0gIEdQUl9BU1NFUlQoc2l6ZW9mKGNsX2NvcmVfbG9jYWxfYmxvY2spICUgR1BSX0NBQ0hFTElORV9TSVpFID09IDApOwotICBHUFJfQVNTRVJUKCFnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGdfbG9nLmRpc2NhcmRfb2xkX3JlY29yZHMgPSBkaXNjYXJkX29sZF9yZWNvcmRzOwotICBnX2xvZy5udW1fY29yZXMgPSBncHJfY3B1X251bV9jb3JlcygpOwotICAvLyBFbnN1cmUgdGhhdCB3ZSB3aWxsIG5vdCBnZXQgYW55IG92ZXJmbG93IGluIGNhbGFjdWxhdGluZyBudW1fYmxvY2tzCi0gIEdQUl9BU1NFUlQoQ0xfTE9HXzJfTUIgPj0gQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRSk7Ci0gIEdQUl9BU1NFUlQoc2l6ZV9pbl9tYiA8IDEwMDApOwotICAvLyBFbnN1cmUgYXQgbGVhc3QgMnggYXMgbWFueSBibG9ja3MgYXMgdGhlcmUgYXJlIGNvcmVzLgotICBnX2xvZy5udW1fYmxvY2tzID0KLSAgICAgICh1aW50MzJfdClHUFJfTUFYKDIgKiBnX2xvZy5udW1fY29yZXMsIChzaXplX2luX21iIDw8IENMX0xPR18yX01CKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUpOwotICBncHJfbXVfaW5pdCgmZ19sb2cubG9jayk7Ci0gIGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUgPSAwOwotICBnX2xvZy5ibG9ja19iZWluZ19yZWFkID0gTlVMTDsKLSAgZ19sb2cuY29yZV9sb2NhbF9ibG9ja3MgPSAoY2xfY29yZV9sb2NhbF9ibG9jayopZ3ByX21hbGxvY19hbGlnbmVkKAotICAgICAgZ19sb2cubnVtX2NvcmVzICogc2l6ZW9mKGNsX2NvcmVfbG9jYWxfYmxvY2spLCBHUFJfQ0FDSEVMSU5FX1NJWkVfTE9HKTsKLSAgbWVtc2V0KGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzLCAwLAotICAgICAgICAgZ19sb2cubnVtX2NvcmVzICogc2l6ZW9mKGNsX2NvcmVfbG9jYWxfYmxvY2spKTsKLSAgZ19sb2cuYmxvY2tzID0gKGNsX2Jsb2NrKilncHJfbWFsbG9jX2FsaWduZWQoCi0gICAgICBnX2xvZy5udW1fYmxvY2tzICogc2l6ZW9mKGNsX2Jsb2NrKSwgR1BSX0NBQ0hFTElORV9TSVpFX0xPRyk7Ci0gIG1lbXNldChnX2xvZy5ibG9ja3MsIDAsIGdfbG9nLm51bV9ibG9ja3MgKiBzaXplb2YoY2xfYmxvY2spKTsKLSAgZ19sb2cuYnVmZmVyID0gZ3ByX21hbGxvYyhnX2xvZy5udW1fYmxvY2tzICogQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUpOwotICBtZW1zZXQoZ19sb2cuYnVmZmVyLCAwLCBnX2xvZy5udW1fYmxvY2tzICogQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUpOwotICBjbF9ibG9ja19saXN0X2luaXRpYWxpemUoJmdfbG9nLmZyZWVfYmxvY2tfbGlzdCk7Ci0gIGNsX2Jsb2NrX2xpc3RfaW5pdGlhbGl6ZSgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBnX2xvZy5udW1fYmxvY2tzOyArK2kpIHsKLSAgICBjbF9ibG9jayogYmxvY2sgPSBnX2xvZy5ibG9ja3MgKyBpOwotICAgIGNsX2Jsb2NrX2luaXRpYWxpemUoYmxvY2ssIGdfbG9nLmJ1ZmZlciArIChDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSAqIGkpKTsKLSAgICBjbF9ibG9ja190cnlfZGlzYWJsZV9hY2Nlc3MoYmxvY2ssIDEgLyogZGlzY2FyZCBkYXRhICovKTsKLSAgICBjbF9ibG9ja19saXN0X2luc2VydF9hdF90YWlsKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QsIGJsb2NrKTsKLSAgfQotICBncHJfYXRtX3JlbF9zdG9yZSgmZ19sb2cub3V0X29mX3NwYWNlX2NvdW50LCAwKTsKLSAgZ19sb2cuaW5pdGlhbGl6ZWQgPSAxOwotfQotCi12b2lkIGNlbnN1c19sb2dfc2h1dGRvd24odm9pZCkgewotICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKLSAgZ3ByX211X2Rlc3Ryb3koJmdfbG9nLmxvY2spOwotICBncHJfZnJlZV9hbGlnbmVkKGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzKTsKLSAgZ19sb2cuY29yZV9sb2NhbF9ibG9ja3MgPSBOVUxMOwotICBncHJfZnJlZV9hbGlnbmVkKGdfbG9nLmJsb2Nrcyk7Ci0gIGdfbG9nLmJsb2NrcyA9IE5VTEw7Ci0gIGdwcl9mcmVlKGdfbG9nLmJ1ZmZlcik7Ci0gIGdfbG9nLmJ1ZmZlciA9IE5VTEw7Ci0gIGdfbG9nLmluaXRpYWxpemVkID0gMDsKLX0KLQotdm9pZCogY2Vuc3VzX2xvZ19zdGFydF93cml0ZShzaXplX3Qgc2l6ZSkgewotICAvLyBVc2VkIHRvIGJvdW5kIG51bWJlciBvZiB0aW1lcyBibG9jayBhbGxvY2F0aW9uIGlzIGF0dGVtcHRlZC4KLSAgR1BSX0FTU0VSVChzaXplID4gMCk7Ci0gIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOwotICBpZiAoc2l6ZSA+IENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgdWludDMyX3QgYXR0ZW1wdHNfcmVtYWluaW5nID0gZ19sb2cubnVtX2Jsb2NrczsKLSAgdWludDMyX3QgY29yZV9pZCA9IGdwcl9jcHVfY3VycmVudF9jcHUoKTsKLSAgZG8gewotICAgIHZvaWQqIHJlY29yZCA9IE5VTEw7Ci0gICAgY2xfYmxvY2sqIGJsb2NrID0KLSAgICAgICAgY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soJmdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzW2NvcmVfaWRdKTsKLSAgICBpZiAoYmxvY2sgJiYgKHJlY29yZCA9IGNsX2Jsb2NrX3N0YXJ0X3dyaXRlKGJsb2NrLCBzaXplKSkpIHsKLSAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgfQotICAgIC8vIE5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2suIFdlIGFyZSBoZXJlIGlmOgotICAgIC8vIC0gTm8gYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JlIE9SCi0gICAgLy8gLSBXcml0ZSBpbi1wcm9ncmVzcyBvbiB0aGUgYmxvY2sgT1IKLSAgICAvLyAtIGJsb2NrIGlzIG91dCBvZiBzcGFjZQotICAgIGdwcl9tdV9sb2NrKCZnX2xvZy5sb2NrKTsKLSAgICBib29sIGFsbG9jYXRlZCA9IGNsX2FsbG9jYXRlX2NvcmVfbG9jYWxfYmxvY2soY29yZV9pZCwgYmxvY2spOwotICAgIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOwotICAgIGlmICghYWxsb2NhdGVkKSB7Ci0gICAgICBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZnX2xvZy5vdXRfb2Zfc3BhY2VfY291bnQsIDEpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9IHdoaWxlIChhdHRlbXB0c19yZW1haW5pbmctLSk7Ci0gIC8vIEdpdmUgdXAuCi0gIGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCwgMSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIGNlbnN1c19sb2dfZW5kX3dyaXRlKHZvaWQqIHJlY29yZCwgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4pIHsKLSAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGNsX2Jsb2NrX2VuZF93cml0ZShjbF9nZXRfYmxvY2socmVjb3JkKSwgYnl0ZXNfd3JpdHRlbik7Ci19Ci0KLXZvaWQgY2Vuc3VzX2xvZ19pbml0X3JlYWRlcih2b2lkKSB7Ci0gIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOwotICBncHJfbXVfbG9jaygmZ19sb2cubG9jayk7Ci0gIC8vIElmIGEgYmxvY2sgaXMgbG9ja2VkIGZvciByZWFkaW5nIHVubG9jayBpdC4KLSAgaWYgKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgIT0gTlVMTCkgewotICAgIGNsX2Jsb2NrX2VuZF9yZWFkKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQpOwotICAgIGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgPSBOVUxMOwotICB9Ci0gIGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUgPSBnX2xvZy5udW1fY29yZXM7Ci0gIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOwotfQotCi1jb25zdCB2b2lkKiBjZW5zdXNfbG9nX3JlYWRfbmV4dChzaXplX3QqIGJ5dGVzX2F2YWlsYWJsZSkgewotICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKLSAgZ3ByX211X2xvY2soJmdfbG9nLmxvY2spOwotICBpZiAoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCAhPSBOVUxMKSB7Ci0gICAgY2xfYmxvY2tfZW5kX3JlYWQoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCk7Ci0gIH0KLSAgZG8gewotICAgIGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgPSBjbF9uZXh0X2Jsb2NrX3RvX3JlYWQoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCk7Ci0gICAgaWYgKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgIT0gTlVMTCkgewotICAgICAgdm9pZCogcmVjb3JkID0KLSAgICAgICAgICBjbF9ibG9ja19zdGFydF9yZWFkKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQsIGJ5dGVzX2F2YWlsYWJsZSk7Ci0gICAgICBpZiAocmVjb3JkICE9IE5VTEwpIHsKLSAgICAgICAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7Ci0gICAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgICB9Ci0gICAgfQotICB9IHdoaWxlIChnX2xvZy5ibG9ja19iZWluZ19yZWFkICE9IE5VTEwpOwotICBncHJfbXVfdW5sb2NrKCZnX2xvZy5sb2NrKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXNpemVfdCBjZW5zdXNfbG9nX3JlbWFpbmluZ19zcGFjZSh2b2lkKSB7Ci0gIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOwotICBzaXplX3Qgc3BhY2UgPSAwOwotICBncHJfbXVfbG9jaygmZ19sb2cubG9jayk7Ci0gIGlmIChnX2xvZy5kaXNjYXJkX29sZF9yZWNvcmRzKSB7Ci0gICAgLy8gUmVtYWluaW5nIHNwYWNlIGlzIG5vdCBtZWFuaW5nZnVsOyBqdXN0IHJldHVybiB0aGUgZW50aXJlIGxvZyBzcGFjZS4KLSAgICBzcGFjZSA9IGdfbG9nLm51bV9ibG9ja3MgPDwgQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRTsKLSAgfSBlbHNlIHsKLSAgICBHUFJfQVNTRVJUKGdfbG9nLmZyZWVfYmxvY2tfbGlzdC5jb3VudCA+PSAwKTsKLSAgICBzcGFjZSA9IChzaXplX3QpZ19sb2cuZnJlZV9ibG9ja19saXN0LmNvdW50ICogQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkU7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7Ci0gIHJldHVybiBzcGFjZTsKLX0KLQotaW50NjRfdCBjZW5zdXNfbG9nX291dF9vZl9zcGFjZV9jb3VudCh2b2lkKSB7Ci0gIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOwotICByZXR1cm4gZ3ByX2F0bV9hY3FfbG9hZCgmZ19sb2cub3V0X29mX3NwYWNlX2NvdW50KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9tbG9nLmggYi9zcmMvY29yZS9jZW5zdXMvbWxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZlYWVhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NlbnN1cy9tbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0vKiBBIHZlcnkgZmFzdCBpbi1tZW1vcnkgbG9nLCBvcHRpbWl6ZWQgZm9yIG11bHRpcGxlIHdyaXRlcnMuICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NFTlNVU19NTE9HX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NFTlNVU19NTE9HX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIE1heGltdW0gcmVjb3JkIHNpemUsIGluIGJ5dGVzLiAqLwotI2RlZmluZSBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIDE0IC8qIDJeMTQgPSAxNktCICovCi0jZGVmaW5lIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFICgxIDw8IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUpCi0KLS8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgbG9nZ2luZyBzdWJzeXN0ZW0gd2l0aCB0aGUgZ2l2ZW4gbG9nIHNpemUuIEEgbG9nCi0gICBzaXplIG9mIDAgd2lsbCByZXN1bHQgaW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGxvZyBmb3IgdGhlIHBsYXRmb3JtCi0gICAoYXBwcm94aW1hdGVseSBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSAqIGdwcl9jcHVfbnVtX2NvcmVzKCkpLiBJZgotICAgZGlzY2FyZF9vbGRfcmVjb3JkcyBpcyBub24temVybywgdGhlbiBuZXcgcmVjb3JkcyB3aWxsIGRpc3BsYWNlIG9sZGVyIG9uZXMKLSAgIHdoZW4gdGhlIGxvZyBpcyBmdWxsLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIKLSAgIGNlbnN1c19sb2cgZnVuY3Rpb25zLgotKi8KLXZvaWQgY2Vuc3VzX2xvZ19pbml0aWFsaXplKHNpemVfdCBzaXplX2luX21iLCBpbnQgZGlzY2FyZF9vbGRfcmVjb3Jkcyk7Ci0KLS8qIFNodXRkb3duIHRoZSBsb2dnaW5nIHN1YnN5c3RlbS4gQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQ6Ci0gICAtIG5vIGluIHByb2dyZXNzIG9yIGZ1dHVyZSBjYWxsIHRvIGFueSBjZW5zdXNfbG9nIGZ1bmN0aW9ucwotICAgLSBubyBpbmNvbXBsZXRlIHJlY29yZHMKLSovCi12b2lkIGNlbnN1c19sb2dfc2h1dGRvd24odm9pZCk7Ci0KLS8qIEFsbG9jYXRlcyBhbmQgcmV0dXJucyBhICdzaXplJyBieXRlcyByZWNvcmQgYW5kIG1hcmtzIGl0IGluIHVzZS4gQQotICAgc3Vic2VxdWVudCBjZW5zdXNfbG9nX2VuZF93cml0ZSgpIG1hcmtzIHRoZSByZWNvcmQgY29tcGxldGUuIFRoZQotICAgJ2J5dGVzX3dyaXR0ZW4nIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkgYXJndW1lbnQgbXVzdCBiZSA8PQotICAgJ3NpemUnLiBSZXR1cm5zIE5VTEwgaWYgb3V0LW9mLXNwYWNlIEFORDoKLSAgICAgICAtIGxvZyBpcyBjb25maWd1cmVkIHRvIGtlZXAgb2xkIHJlY29yZHMgT1IKLSAgICAgICAtIGFsbCBibG9ja3MgYXJlIHBpbm5lZCBieSBpbmNvbXBsZXRlIHJlY29yZHMuCi0qLwotdm9pZCogY2Vuc3VzX2xvZ19zdGFydF93cml0ZShzaXplX3Qgc2l6ZSk7Ci0KLXZvaWQgY2Vuc3VzX2xvZ19lbmRfd3JpdGUodm9pZCogcmVjb3JkLCBzaXplX3QgYnl0ZXNfd3JpdHRlbik7Ci0KLXZvaWQgY2Vuc3VzX2xvZ19pbml0X3JlYWRlcih2b2lkKTsKLQotLyogY2Vuc3VzX2xvZ19yZWFkX25leHQoKSBpdGVyYXRlcyBvdmVyIGJsb2NrcyB3aXRoIGRhdGEgYW5kIGZvciBlYWNoIGJsb2NrCi0gICByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgdW5yZWFkIGJ5dGUuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUKLSAgIHJlYWQgYXJlIHJldHVybmVkIGluICdieXRlc19hdmFpbGFibGUnLiBSZWFkZXIgaXMgZXhwZWN0ZWQgdG8gcmVhZCBhbGwKLSAgIGF2YWlsYWJsZSBkYXRhLiBSZWFkaW5nIHRoZSBkYXRhIGNvbnN1bWVzIGl0IGkuZS4gaXQgY2Fubm90IGJlIHJlYWQgYWdhaW4uCi0gICBjZW5zdXNfbG9nX3JlYWRfbmV4dCgpIHJldHVybnMgTlVMTCBpZiB0aGUgZW5kIGlzIHJlYWNoZWQgaS5lIGxhc3QgYmxvY2sKLSAgIGlzIHJlYWQuIGNlbnN1c19sb2dfaW5pdF9yZWFkZXIoKSBzdGFydHMgdGhlIGl0ZXJhdGlvbiBvciBhYm9ydHMgdGhlCi0gICBjdXJyZW50IGl0ZXJhdGlvbi4KLSovCi1jb25zdCB2b2lkKiBjZW5zdXNfbG9nX3JlYWRfbmV4dChzaXplX3QqIGJ5dGVzX2F2YWlsYWJsZSk7Ci0KLS8qIFJldHVybnMgZXN0aW1hdGVkIHJlbWFpbmluZyBzcGFjZSBhY3Jvc3MgYWxsIGJsb2NrcywgaW4gYnl0ZXMuIElmIGxvZyBpcwotICAgY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZCByZWNvcmRzLCByZXR1cm5zIHRvdGFsIGxvZyBzcGFjZS4gT3RoZXJ3aXNlLAotICAgcmV0dXJucyBzcGFjZSBhdmFpbGFibGUgaW4gZW1wdHkgYmxvY2tzIChwYXJ0aWFsbHkgZmlsbGVkIGJsb2NrcyBhcmUKLSAgIHRyZWF0ZWQgYXMgZnVsbCkuCi0qLwotc2l6ZV90IGNlbnN1c19sb2dfcmVtYWluaW5nX3NwYWNlKHZvaWQpOwotCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZXMgZ3ByY19zdGF0c19sb2dfc3RhcnRfd3JpdGUoKSBmYWlsZWQgZHVlIHRvCi0gICBvdXQtb2Ytc3BhY2UuICovCi1pbnQ2NF90IGNlbnN1c19sb2dfb3V0X29mX3NwYWNlX2NvdW50KHZvaWQpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NFTlNVU19NTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYyBiL3NyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1ODcwNC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jZW5zdXMvb3BlcmF0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KLQotLyogVE9ETyhhdmVpdGNoKTogVGhlc2UgYXJlIGFsbCBwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbnMuICovCi0KLWNlbnN1c190aW1lc3RhbXAgY2Vuc3VzX3N0YXJ0X3JwY19vcF90aW1lc3RhbXAodm9pZCkgewotICBjZW5zdXNfdGltZXN0YW1wIGN0OwotICAvKiBUT0RPKGF2ZWl0Y2gpOiBhc3N1bWVzIGdwcl90aW1lc3BlYyBpbXBsZW1lbnRhdGlvbiBvZiBjZW5zdXNfdGltZXN0YW1wLiAqLwotICBjdC50cyA9IGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQyk7Ci0gIHJldHVybiBjdDsKLX0KLQotY2Vuc3VzX2NvbnRleHQgKmNlbnN1c19zdGFydF9jbGllbnRfcnBjX29wKAotICAgIGNvbnN0IGNlbnN1c19jb250ZXh0ICpjb250ZXh0LCBpbnQ2NF90IHJwY19uYW1lX2lkLAotICAgIGNvbnN0IGNlbnN1c19ycGNfbmFtZV9pbmZvICpycGNfbmFtZV9pbmZvLCBjb25zdCBjaGFyICpwZWVyLCBpbnQgdHJhY2VfbWFzaywKLSAgICBjb25zdCBjZW5zdXNfdGltZXN0YW1wICpzdGFydF90aW1lKSB7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jZW5zdXNfY29udGV4dCAqY2Vuc3VzX3N0YXJ0X3NlcnZlcl9ycGNfb3AoCi0gICAgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQ2NF90IHJwY19uYW1lX2lkLAotICAgIGNvbnN0IGNlbnN1c19ycGNfbmFtZV9pbmZvICpycGNfbmFtZV9pbmZvLCBjb25zdCBjaGFyICpwZWVyLCBpbnQgdHJhY2VfbWFzaywKLSAgICBjZW5zdXNfdGltZXN0YW1wICpzdGFydF90aW1lKSB7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jZW5zdXNfY29udGV4dCAqY2Vuc3VzX3N0YXJ0X29wKGNlbnN1c19jb250ZXh0ICpjb250ZXh0LCBjb25zdCBjaGFyICpmYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCB0cmFjZV9tYXNrKSB7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIGNlbnN1c19lbmRfb3AoY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQsIGludCBzdGF0dXMpIHt9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jZW5zdXMvcnBjX21ldHJpY19pZC5oIGIvc3JjL2NvcmUvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkOGRhZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jZW5zdXMvcnBjX21ldHJpY19pZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0VOU1VTX1JQQ19NRVRSSUNfSURfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0VOU1VTX1JQQ19NRVRSSUNfSURfSAotCi0vKiBNZXRyaWMgSUQncyB1c2VkIGZvciBSUEMgbWVhc3VyZW1lbnRzLiAqLwotLyogQ291bnQgb2YgY2xpZW50IHJlcXVlc3RzIHNlbnQuICovCi0jZGVmaW5lIENFTlNVU19NRVRSSUNfUlBDX0NMSUVOVF9SRVFVRVNUUyAoKHVpbnQzMl90KTApCi0vKiBDb3VudCBvZiBzZXJ2ZXIgcmVxdWVzdHMgc2VudC4gKi8KLSNkZWZpbmUgQ0VOU1VTX01FVFJJQ19SUENfU0VSVkVSX1JFUVVFU1RTICgodWludDMyX3QpMSkKLS8qIENsaWVudCBlcnJvciBjb3VudHMuICovCi0jZGVmaW5lIENFTlNVU19NRVRSSUNfUlBDX0NMSUVOVF9FUlJPUlMgKCh1aW50MzJfdCkyKQotLyogU2VydmVyIGVycm9yIGNvdW50cy4gKi8KLSNkZWZpbmUgQ0VOU1VTX01FVFJJQ19SUENfU0VSVkVSX0VSUk9SUyAoKHVpbnQzMl90KTMpCi0vKiBDbGllbnQgc2lkZSByZXF1ZXN0IGxhdGVuY3kuICovCi0jZGVmaW5lIENFTlNVU19NRVRSSUNfUlBDX0NMSUVOVF9MQVRFTkNZICgodWludDMyX3QpNCkKLS8qIFNlcnZlciBzaWRlIHJlcXVlc3QgbGF0ZW5jeS4gKi8KLSNkZWZpbmUgQ0VOU1VTX01FVFJJQ19SUENfU0VSVkVSX0xBVEVOQ1kgKCh1aW50MzJfdCk1KQotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NFTlNVU19SUENfTUVUUklDX0lEX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMgYi9zcmMvY29yZS9jZW5zdXMvdHJhY2luZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjVkNmRhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvY2Vuc3VzLmg+Ci0KLS8qIFRPRE8oYXZlaXRjaCk6IFRoZXNlIGFyZSBhbGwgcGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb25zLiAqLwotCi1pbnQgY2Vuc3VzX3RyYWNlX21hc2soY29uc3QgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQpIHsKLSAgcmV0dXJuIENFTlNVU19UUkFDRV9NQVNLX05PTkU7Ci19Ci0KLXZvaWQgY2Vuc3VzX3NldF90cmFjZV9tYXNrKGludCB0cmFjZV9tYXNrKSB7fQotCi12b2lkIGNlbnN1c190cmFjZV9wcmludChjZW5zdXNfY29udGV4dCAqY29udGV4dCwgdWludDMyX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG4pIHt9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jIGIvc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzODJmYS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgotI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxncnBjL2NlbnN1cy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIGdycGNfYXJnIGNvcHlfYXJnKGNvbnN0IGdycGNfYXJnICpzcmMpIHsKLSAgZ3JwY19hcmcgZHN0OwotICBkc3QudHlwZSA9IHNyYy0+dHlwZTsKLSAgZHN0LmtleSA9IGdwcl9zdHJkdXAoc3JjLT5rZXkpOwotICBzd2l0Y2ggKGRzdC50eXBlKSB7Ci0gICAgY2FzZSBHUlBDX0FSR19TVFJJTkc6Ci0gICAgICBkc3QudmFsdWUuc3RyaW5nID0gZ3ByX3N0cmR1cChzcmMtPnZhbHVlLnN0cmluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfQVJHX0lOVEVHRVI6Ci0gICAgICBkc3QudmFsdWUuaW50ZWdlciA9IHNyYy0+dmFsdWUuaW50ZWdlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1JQQ19BUkdfUE9JTlRFUjoKLSAgICAgIGRzdC52YWx1ZS5wb2ludGVyID0gc3JjLT52YWx1ZS5wb2ludGVyOwotICAgICAgZHN0LnZhbHVlLnBvaW50ZXIucCA9Ci0gICAgICAgICAgc3JjLT52YWx1ZS5wb2ludGVyLnZ0YWJsZS0+Y29weShzcmMtPnZhbHVlLnBvaW50ZXIucCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZHN0OwotfQotCi1ncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfYXJnICp0b19hZGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fdG9fYWRkKSB7Ci0gIGdycGNfY2hhbm5lbF9hcmdzICpkc3QgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2NoYW5uZWxfYXJncykpOwotICBzaXplX3QgaTsKLSAgc2l6ZV90IHNyY19udW1fYXJncyA9IChzcmMgPT0gTlVMTCkgPyAwIDogc3JjLT5udW1fYXJnczsKLSAgaWYgKCFzcmMgJiYgIXRvX2FkZCkgewotICAgIGRzdC0+bnVtX2FyZ3MgPSAwOwotICAgIGRzdC0+YXJncyA9IE5VTEw7Ci0gICAgcmV0dXJuIGRzdDsKLSAgfQotICBkc3QtPm51bV9hcmdzID0gc3JjX251bV9hcmdzICsgbnVtX3RvX2FkZDsKLSAgZHN0LT5hcmdzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19hcmcpICogZHN0LT5udW1fYXJncyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzcmNfbnVtX2FyZ3M7IGkrKykgewotICAgIGRzdC0+YXJnc1tpXSA9IGNvcHlfYXJnKCZzcmMtPmFyZ3NbaV0pOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fdG9fYWRkOyBpKyspIHsKLSAgICBkc3QtPmFyZ3NbaSArIHNyY19udW1fYXJnc10gPSBjb3B5X2FyZygmdG9fYWRkW2ldKTsKLSAgfQotICByZXR1cm4gZHN0OwotfQotCi1ncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29weShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqc3JjKSB7Ci0gIHJldHVybiBncnBjX2NoYW5uZWxfYXJnc19jb3B5X2FuZF9hZGQoc3JjLCBOVUxMLCAwKTsKLX0KLQotZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX21lcmdlKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpiKSB7Ci0gIHJldHVybiBncnBjX2NoYW5uZWxfYXJnc19jb3B5X2FuZF9hZGQoYSwgYi0+YXJncywgYi0+bnVtX2FyZ3MpOwotfQotCi1zdGF0aWMgaW50IGNtcF9hcmcoY29uc3QgZ3JwY19hcmcgKmEsIGNvbnN0IGdycGNfYXJnICpiKSB7Ci0gIGludCBjID0gR1BSX0lDTVAoYS0+dHlwZSwgYi0+dHlwZSk7Ci0gIGlmIChjICE9IDApIHJldHVybiBjOwotICBjID0gc3RyY21wKGEtPmtleSwgYi0+a2V5KTsKLSAgaWYgKGMgIT0gMCkgcmV0dXJuIGM7Ci0gIHN3aXRjaCAoYS0+dHlwZSkgewotICAgIGNhc2UgR1JQQ19BUkdfU1RSSU5HOgotICAgICAgcmV0dXJuIHN0cmNtcChhLT52YWx1ZS5zdHJpbmcsIGItPnZhbHVlLnN0cmluZyk7Ci0gICAgY2FzZSBHUlBDX0FSR19JTlRFR0VSOgotICAgICAgcmV0dXJuIEdQUl9JQ01QKGEtPnZhbHVlLmludGVnZXIsIGItPnZhbHVlLmludGVnZXIpOwotICAgIGNhc2UgR1JQQ19BUkdfUE9JTlRFUjoKLSAgICAgIGMgPSBHUFJfSUNNUChhLT52YWx1ZS5wb2ludGVyLnAsIGItPnZhbHVlLnBvaW50ZXIucCk7Ci0gICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMgPSBHUFJfSUNNUChhLT52YWx1ZS5wb2ludGVyLnZ0YWJsZSwgYi0+dmFsdWUucG9pbnRlci52dGFibGUpOwotICAgICAgICBpZiAoYyA9PSAwKSB7Ci0gICAgICAgICAgYyA9IGEtPnZhbHVlLnBvaW50ZXIudnRhYmxlLT5jbXAoYS0+dmFsdWUucG9pbnRlci5wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPnZhbHVlLnBvaW50ZXIucCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjOwotICB9Ci0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKLX0KLQotLyogc3RhYmlsaXppbmcgY29tcGFyaXNvbiBmdW5jdGlvbjogc2luY2UgY2hhbm5lbF9hcmdzIG9yZGVyaW5nIG1hdHRlcnMgZm9yCi0gKiBrZXlzIHdpdGggdGhlIHNhbWUgbmFtZSwgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IG9yZGVyaW5nICovCi1zdGF0aWMgaW50IGNtcF9rZXlfc3RhYmxlKGNvbnN0IHZvaWQgKmFwLCBjb25zdCB2b2lkICpicCkgewotICBjb25zdCBncnBjX2FyZyAqY29uc3QgKmEgPSBhcDsKLSAgY29uc3QgZ3JwY19hcmcgKmNvbnN0ICpiID0gYnA7Ci0gIGludCBjID0gc3RyY21wKCgqYSktPmtleSwgKCpiKS0+a2V5KTsKLSAgaWYgKGMgPT0gMCkgYyA9IEdQUl9JQ01QKCphLCAqYik7Ci0gIHJldHVybiBjOwotfQotCi1ncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3Nfbm9ybWFsaXplKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphKSB7Ci0gIGdycGNfYXJnICoqYXJncyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfYXJnICopICogYS0+bnVtX2FyZ3MpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGEtPm51bV9hcmdzOyBpKyspIHsKLSAgICBhcmdzW2ldID0gJmEtPmFyZ3NbaV07Ci0gIH0KLSAgcXNvcnQoYXJncywgYS0+bnVtX2FyZ3MsIHNpemVvZihncnBjX2FyZyAqKSwgY21wX2tleV9zdGFibGUpOwotCi0gIGdycGNfY2hhbm5lbF9hcmdzICpiID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jaGFubmVsX2FyZ3MpKTsKLSAgYi0+bnVtX2FyZ3MgPSBhLT5udW1fYXJnczsKLSAgYi0+YXJncyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfYXJnKSAqIGItPm51bV9hcmdzKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhLT5udW1fYXJnczsgaSsrKSB7Ci0gICAgYi0+YXJnc1tpXSA9IGNvcHlfYXJnKGFyZ3NbaV0pOwotICB9Ci0KLSAgZ3ByX2ZyZWUoYXJncyk7Ci0gIHJldHVybiBiOwotfQotCi12b2lkIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koZ3JwY19jaGFubmVsX2FyZ3MgKmEpIHsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhLT5udW1fYXJnczsgaSsrKSB7Ci0gICAgc3dpdGNoIChhLT5hcmdzW2ldLnR5cGUpIHsKLSAgICAgIGNhc2UgR1JQQ19BUkdfU1RSSU5HOgotICAgICAgICBncHJfZnJlZShhLT5hcmdzW2ldLnZhbHVlLnN0cmluZyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHUlBDX0FSR19JTlRFR0VSOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19BUkdfUE9JTlRFUjoKLSAgICAgICAgYS0+YXJnc1tpXS52YWx1ZS5wb2ludGVyLnZ0YWJsZS0+ZGVzdHJveShhLT5hcmdzW2ldLnZhbHVlLnBvaW50ZXIucCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBncHJfZnJlZShhLT5hcmdzW2ldLmtleSk7Ci0gIH0KLSAgZ3ByX2ZyZWUoYS0+YXJncyk7Ci0gIGdwcl9mcmVlKGEpOwotfQotCi1pbnQgZ3JwY19jaGFubmVsX2FyZ3NfaXNfY2Vuc3VzX2VuYWJsZWQoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEpIHsKLSAgc2l6ZV90IGk7Ci0gIGlmIChhID09IE5VTEwpIHJldHVybiAwOwotICBmb3IgKGkgPSAwOyBpIDwgYS0+bnVtX2FyZ3M7IGkrKykgewotICAgIGlmICgwID09IHN0cmNtcChhLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfRU5BQkxFX0NFTlNVUykpIHsKLSAgICAgIHJldHVybiBhLT5hcmdzW2ldLnZhbHVlLmludGVnZXIgIT0gMCAmJiBjZW5zdXNfZW5hYmxlZCgpOwotICAgIH0KLSAgfQotICByZXR1cm4gY2Vuc3VzX2VuYWJsZWQoKTsKLX0KLQotZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gZ3JwY19jaGFubmVsX2FyZ3NfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKLSAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSkgewotICBzaXplX3QgaTsKLSAgaWYgKGEgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBhLT5udW1fYXJnczsgKytpKSB7Ci0gICAgaWYgKGEtPmFyZ3NbaV0udHlwZSA9PSBHUlBDX0FSR19JTlRFR0VSICYmCi0gICAgICAgICFzdHJjbXAoR1JQQ19DT01QUkVTU0lPTl9BTEdPUklUSE1fQVJHLCBhLT5hcmdzW2ldLmtleSkpIHsKLSAgICAgIHJldHVybiAoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0pYS0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBHUlBDX0NPTVBSRVNTX05PTkU7Ci19Ci0KLWdycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19zZXRfY29tcHJlc3Npb25fYWxnb3JpdGhtKAotICAgIGdycGNfY2hhbm5lbF9hcmdzICphLCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pIHsKLSAgZ3JwY19hcmcgdG1wOwotICB0bXAudHlwZSA9IEdSUENfQVJHX0lOVEVHRVI7Ci0gIHRtcC5rZXkgPSBHUlBDX0NPTVBSRVNTSU9OX0FMR09SSVRITV9BUkc7Ci0gIHRtcC52YWx1ZS5pbnRlZ2VyID0gYWxnb3JpdGhtOwotICByZXR1cm4gZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKGEsICZ0bXAsIDEpOwotfQotCi0vKiogUmV0dXJucyAxIGlmIHRoZSBhcmd1bWVudCBmb3IgY29tcHJlc3Npb24gYWxnb3JpdGhtJ3MgZW5hYmxlZCBzdGF0ZXMgYml0c2V0Ci0gKiB3YXMgZm91bmQgaW4gXGEgYSwgcmV0dXJuaW5nIHRoZSBhcmcncyB2YWx1ZSBpbiBcYSBzdGF0ZXMuIE90aGVyd2lzZSwgcmV0dXJucwotICogMC4gKi8KLXN0YXRpYyBpbnQgZmluZF9jb21wcmVzc2lvbl9hbGdvcml0aG1fc3RhdGVzX2JpdHNldChjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKipzdGF0ZXNfYXJnKSB7Ci0gIGlmIChhICE9IE5VTEwpIHsKLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYS0+bnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGEtPmFyZ3NbaV0udHlwZSA9PSBHUlBDX0FSR19JTlRFR0VSICYmCi0gICAgICAgICAgIXN0cmNtcChHUlBDX0NPTVBSRVNTSU9OX0FMR09SSVRITV9TVEFURV9BUkcsIGEtPmFyZ3NbaV0ua2V5KSkgewotICAgICAgICAqc3RhdGVzX2FyZyA9ICZhLT5hcmdzW2ldLnZhbHVlLmludGVnZXI7Ci0gICAgICAgIHJldHVybiAxOyAvKiBHUFJfVFJVRSAqLwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMDsgLyogR1BSX0ZBTFNFICovCi19Ci0KLWdycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19jb21wcmVzc2lvbl9hbGdvcml0aG1fc2V0X3N0YXRlKAotICAgIGdycGNfY2hhbm5lbF9hcmdzICoqYSwgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLCBpbnQgc3RhdGUpIHsKLSAgaW50ICpzdGF0ZXNfYXJnOwotICBncnBjX2NoYW5uZWxfYXJncyAqcmVzdWx0ID0gKmE7Ci0gIGNvbnN0IGludCBzdGF0ZXNfYXJnX2ZvdW5kID0KLSAgICAgIGZpbmRfY29tcHJlc3Npb25fYWxnb3JpdGhtX3N0YXRlc19iaXRzZXQoKmEsICZzdGF0ZXNfYXJnKTsKLQotICBpZiAoc3RhdGVzX2FyZ19mb3VuZCkgewotICAgIGlmIChzdGF0ZSAhPSAwKSB7Ci0gICAgICBHUFJfQklUU0VUKCh1bnNpZ25lZCAqKXN0YXRlc19hcmcsIGFsZ29yaXRobSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdQUl9CSVRDTEVBUigodW5zaWduZWQgKilzdGF0ZXNfYXJnLCBhbGdvcml0aG0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBjcmVhdGUgYSBuZXcgYXJnICovCi0gICAgZ3JwY19hcmcgdG1wOwotICAgIHRtcC50eXBlID0gR1JQQ19BUkdfSU5URUdFUjsKLSAgICB0bXAua2V5ID0gR1JQQ19DT01QUkVTU0lPTl9BTEdPUklUSE1fU1RBVEVfQVJHOwotICAgIC8qIGFsbCBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KLSAgICB0bXAudmFsdWUuaW50ZWdlciA9ICgxdSA8PCBHUlBDX0NPTVBSRVNTX0FMR09SSVRITVNfQ09VTlQpIC0gMTsKLSAgICBpZiAoc3RhdGUgIT0gMCkgewotICAgICAgR1BSX0JJVFNFVCgodW5zaWduZWQgKikmdG1wLnZhbHVlLmludGVnZXIsIGFsZ29yaXRobSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdQUl9CSVRDTEVBUigodW5zaWduZWQgKikmdG1wLnZhbHVlLmludGVnZXIsIGFsZ29yaXRobSk7Ci0gICAgfQotICAgIHJlc3VsdCA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHlfYW5kX2FkZCgqYSwgJnRtcCwgMSk7Ci0gICAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveSgqYSk7Ci0gICAgKmEgPSByZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGdycGNfY2hhbm5lbF9hcmdzX2NvbXByZXNzaW9uX2FsZ29yaXRobV9nZXRfc3RhdGVzKAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphKSB7Ci0gIGludCAqc3RhdGVzX2FyZzsKLSAgaWYgKGZpbmRfY29tcHJlc3Npb25fYWxnb3JpdGhtX3N0YXRlc19iaXRzZXQoYSwgJnN0YXRlc19hcmcpKSB7Ci0gICAgcmV0dXJuICpzdGF0ZXNfYXJnOwotICB9IGVsc2UgewotICAgIHJldHVybiAoMXUgPDwgR1JQQ19DT01QUkVTU19BTEdPUklUSE1TX0NPVU5UKSAtIDE7IC8qIEFsbCBhbGdzLiBlbmFibGVkICovCi0gIH0KLX0KLQotaW50IGdycGNfY2hhbm5lbF9hcmdzX2NvbXBhcmUoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYikgewotICBpbnQgYyA9IEdQUl9JQ01QKGEtPm51bV9hcmdzLCBiLT5udW1fYXJncyk7Ci0gIGlmIChjICE9IDApIHJldHVybiBjOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGEtPm51bV9hcmdzOyBpKyspIHsKLSAgICBjID0gY21wX2FyZygmYS0+YXJnc1tpXSwgJmItPmFyZ3NbaV0pOwotICAgIGlmIChjICE9IDApIHJldHVybiBjOwotICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCBiL3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTQ0MGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NIQU5ORUxfQ0hBTk5FTF9BUkdTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NIQU5ORUxfQ0hBTk5FTF9BUkdTX0gKLQotI2luY2x1ZGUgPGdycGMvY29tcHJlc3Npb24uaD4KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLQotLyogQ29weSBzb21lIGFyZ3VtZW50cyAqLwotZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX2NvcHkoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKnNyYyk7Ci0KLS8qIENvcHkgc29tZSBhcmd1bWVudHMsIHN0YWJseSBzb3J0aW5nIGtleXMgKi8KLWdycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19ub3JtYWxpemUoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEpOwotCi0vKiogQ29weSBzb21lIGFyZ3VtZW50cyBhbmQgYWRkIHRoZSB0b19hZGQgcGFyYW1ldGVyIGluIHRoZSBlbmQuCi0gICBJZiB0b19hZGQgaXMgTlVMTCwgaXQgaXMgZXF1aXZhbGVudCB0byBjYWxsIGdycGNfY2hhbm5lbF9hcmdzX2NvcHkuICovCi1ncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfYXJnICp0b19hZGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fdG9fYWRkKTsKLQotLyoqIENvcHkgYXJncyBmcm9tIGEgdGhlbiBhcmdzIGZyb20gYiBpbnRvIGEgbmV3IGNoYW5uZWwgYXJncyAqLwotZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX21lcmdlKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpiKTsKLQotLyoqIERlc3Ryb3kgYXJndW1lbnRzIGNyZWF0ZWQgYnkgZ3JwY19jaGFubmVsX2FyZ3NfY29weSAqLwotdm9pZCBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGdycGNfY2hhbm5lbF9hcmdzICphKTsKLQotLyoqIFJlYWRzIGNlbnN1c19lbmFibGVkIHNldHRpbmdzIGZyb20gY2hhbm5lbCBhcmdzLiBSZXR1cm5zIDEgaWYgY2Vuc3VzX2VuYWJsZWQKLSAqIGlzIHNwZWNpZmllZCBpbiBjaGFubmVsIGFyZ3MsIG90aGVyd2lzZSByZXR1cm5zIDAuICovCi1pbnQgZ3JwY19jaGFubmVsX2FyZ3NfaXNfY2Vuc3VzX2VuYWJsZWQoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEpOwotCi0vKiogUmV0dXJucyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIHNldCBpbiBcYSBhLiAqLwotZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gZ3JwY19jaGFubmVsX2FyZ3NfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKLSAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSk7Ci0KLS8qKiBSZXR1cm5zIGEgY2hhbm5lbCBhcmcgaW5zdGFuY2Ugd2l0aCBjb21wcmVzc2lvbiBlbmFibGVkLiBJZiBcYSBhIGlzCi0gKiBub24tTlVMTCwgaXRzIGFyZ3MgYXJlIGNvcGllZC4gTi5CLiBHUlBDX0NPTVBSRVNTX05PTkUgZGlzYWJsZXMgY29tcHJlc3Npb24KLSAqIGZvciB0aGUgY2hhbm5lbC4gKi8KLWdycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19zZXRfY29tcHJlc3Npb25fYWxnb3JpdGhtKAotICAgIGdycGNfY2hhbm5lbF9hcmdzICphLCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pOwotCi0vKiogU2V0cyB0aGUgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gQnkgZGVmYXVsdCwgYWxsCi0gKiBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGFyZSBlbmFibGVkLiBJdCdzIGFuIGVycm9yIHRvIGRpc2FibGUgYW4gYWxnb3JpdGhtIHNldAotICogYnkgZ3JwY19jaGFubmVsX2FyZ3Nfc2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobS4KLSAqCi0gKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIHVwZGF0ZWQgYWxnb3JpdGhtIHN0YXRlcy4gVGhlIFxhIGEgcG9pbnRlciBpcwotICogbW9kaWZpZWQgdG8gcG9pbnQgdG8gdGhlIHJldHVybmVkIGluc3RhbmNlICh3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlCi0gKiBpbnB1dCB2YWx1ZSBvZiBcYSBhKS4gKi8KLWdycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19jb21wcmVzc2lvbl9hbGdvcml0aG1fc2V0X3N0YXRlKAotICAgIGdycGNfY2hhbm5lbF9hcmdzICoqYSwgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLCBpbnQgZW5hYmxlZCk7Ci0KLS8qKiBSZXR1cm5zIHRoZSBiaXRzZXQgcmVwcmVzZW50aW5nIHRoZSBzdXBwb3J0IHN0YXRlICh0cnVlIGZvciBlbmFibGVkLCBmYWxzZQotICogZm9yIGRpc2FibGVkKSBmb3IgY29tcHJlc3Npb24gYWxnb3JpdGhtcy4KLSAqCi0gKiBUaGUgaS10aCBiaXQgb2YgdGhlIHJldHVybmVkIGJpdHNldCBjb3JyZXNwb25kcyB0byB0aGUgaS10aCBlbnRyeSBpbiB0aGUKLSAqIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGVudW0uICovCi1pbnQgZ3JwY19jaGFubmVsX2FyZ3NfY29tcHJlc3Npb25fYWxnb3JpdGhtX2dldF9zdGF0ZXMoCi0gICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEpOwotCi1pbnQgZ3JwY19jaGFubmVsX2FyZ3NfY29tcGFyZShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpiKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DSEFOTkVMX0NIQU5ORUxfQVJHU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyBiL3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTYxNjg4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWludCBncnBjX3RyYWNlX2NoYW5uZWwgPSAwOwotCi0vKiBNZW1vcnkgbGF5b3V0cy4KLQotICAgQ2hhbm5lbCBzdGFjayBpcyBsYWlkIG91dCBhczogewotICAgICBncnBjX2NoYW5uZWxfc3RhY2sgc3RrOwotICAgICBwYWRkaW5nIHRvIEdQUl9NQVhfQUxJR05NRU5UCi0gICAgIGdycGNfY2hhbm5lbF9lbGVtZW50W3N0ay5jb3VudF07Ci0gICAgIHBlci1maWx0ZXIgbWVtb3J5LCBhbGlnbmVkIHRvIEdQUl9NQVhfQUxJR05NRU5UCi0gICB9Ci0KLSAgIENhbGwgc3RhY2sgaXMgbGFpZCBvdXQgYXM6IHsKLSAgICAgZ3JwY19jYWxsX3N0YWNrIHN0azsKLSAgICAgcGFkZGluZyB0byBHUFJfTUFYX0FMSUdOTUVOVAotICAgICBncnBjX2NhbGxfZWxlbWVudFtzdGsuY291bnRdOwotICAgICBwZXItZmlsdGVyIG1lbW9yeSwgYWxpZ25lZCB0byBHUFJfTUFYX0FMSUdOTUVOVAotICAgfSAqLwotCi0vKiBHaXZlbiBhIHNpemUsIHJvdW5kIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIHNpemVvZih2b2lkKikgKi8KLSNkZWZpbmUgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoeCkgXAotICAoKCh4KSArIEdQUl9NQVhfQUxJR05NRU5UIC0gMXUpICYgfihHUFJfTUFYX0FMSUdOTUVOVCAtIDF1KSkKLQotc2l6ZV90IGdycGNfY2hhbm5lbF9zdGFja19zaXplKGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmaWx0ZXJfY291bnQpIHsKLSAgLyogYWx3YXlzIG5lZWQgdGhlIGhlYWRlciwgYW5kIHNpemUgZm9yIHRoZSBjaGFubmVsIGVsZW1lbnRzICovCi0gIHNpemVfdCBzaXplID0KLSAgICAgIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKHNpemVvZihncnBjX2NoYW5uZWxfc3RhY2spKSArCi0gICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShmaWx0ZXJfY291bnQgKiBzaXplb2YoZ3JwY19jaGFubmVsX2VsZW1lbnQpKTsKLSAgc2l6ZV90IGk7Ci0KLSAgR1BSX0FTU0VSVCgoR1BSX01BWF9BTElHTk1FTlQgJiAoR1BSX01BWF9BTElHTk1FTlQgLSAxKSkgPT0gMCAmJgotICAgICAgICAgICAgICJHUFJfTUFYX0FMSUdOTUVOVCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIik7Ci0KLSAgLyogYWRkIHRoZSBzaXplIGZvciBlYWNoIGZpbHRlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2NvdW50OyBpKyspIHsKLSAgICBzaXplICs9IFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKGZpbHRlcnNbaV0tPnNpemVvZl9jaGFubmVsX2RhdGEpOwotICB9Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLSNkZWZpbmUgQ0hBTk5FTF9FTEVNU19GUk9NX1NUQUNLKHN0aykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChncnBjX2NoYW5uZWxfZWxlbWVudCAqKSgoY2hhciAqKShzdGspICsgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihncnBjX2NoYW5uZWxfc3RhY2spKSkpCi0KLSNkZWZpbmUgQ0FMTF9FTEVNU19GUk9NX1NUQUNLKHN0aykgICAgICAgXAotICAoKGdycGNfY2FsbF9lbGVtZW50ICopKChjaGFyICopKHN0aykgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoc2l6ZW9mKGdycGNfY2FsbF9zdGFjaykpKSkKLQotZ3JwY19jaGFubmVsX2VsZW1lbnQgKmdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KAotICAgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjaywgc2l6ZV90IGluZGV4KSB7Ci0gIHJldHVybiBDSEFOTkVMX0VMRU1TX0ZST01fU1RBQ0soY2hhbm5lbF9zdGFjaykgKyBpbmRleDsKLX0KLQotZ3JwY19jaGFubmVsX2VsZW1lbnQgKmdycGNfY2hhbm5lbF9zdGFja19sYXN0X2VsZW1lbnQoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrKSB7Ci0gIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudChjaGFubmVsX3N0YWNrLCBjaGFubmVsX3N0YWNrLT5jb3VudCAtIDEpOwotfQotCi1ncnBjX2NhbGxfZWxlbWVudCAqZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoZ3JwY19jYWxsX3N0YWNrICpjYWxsX3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleCkgewotICByZXR1cm4gQ0FMTF9FTEVNU19GUk9NX1NUQUNLKGNhbGxfc3RhY2spICsgaW5kZXg7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2luaXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludCBpbml0aWFsX3JlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaW9tZ3JfY2JfZnVuYyBkZXN0cm95LCB2b2lkICpkZXN0cm95X2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqKmZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmaWx0ZXJfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGdycGNfY2hhbm5lbF9zdGFjayAqc3RhY2spIHsKLSAgc2l6ZV90IGNhbGxfc2l6ZSA9Ci0gICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShzaXplb2YoZ3JwY19jYWxsX3N0YWNrKSkgKwotICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoZmlsdGVyX2NvdW50ICogc2l6ZW9mKGdycGNfY2FsbF9lbGVtZW50KSk7Ci0gIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtczsKLSAgZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJncyBhcmdzOwotICBjaGFyICp1c2VyX2RhdGE7Ci0gIHNpemVfdCBpOwotCi0gIHN0YWNrLT5jb3VudCA9IGZpbHRlcl9jb3VudDsKLSAgR1JQQ19TVFJFQU1fUkVGX0lOSVQoJnN0YWNrLT5yZWZjb3VudCwgaW5pdGlhbF9yZWZzLCBkZXN0cm95LCBkZXN0cm95X2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIGVsZW1zID0gQ0hBTk5FTF9FTEVNU19GUk9NX1NUQUNLKHN0YWNrKTsKLSAgdXNlcl9kYXRhID0KLSAgICAgICgoY2hhciAqKWVsZW1zKSArCi0gICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShmaWx0ZXJfY291bnQgKiBzaXplb2YoZ3JwY19jaGFubmVsX2VsZW1lbnQpKTsKLQotICAvKiBpbml0IHBlci1maWx0ZXIgZGF0YSAqLwotICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2NvdW50OyBpKyspIHsKLSAgICBhcmdzLmNoYW5uZWxfc3RhY2sgPSBzdGFjazsKLSAgICBhcmdzLmNoYW5uZWxfYXJncyA9IGNoYW5uZWxfYXJnczsKLSAgICBhcmdzLmlzX2ZpcnN0ID0gaSA9PSAwOwotICAgIGFyZ3MuaXNfbGFzdCA9IGkgPT0gKGZpbHRlcl9jb3VudCAtIDEpOwotICAgIGVsZW1zW2ldLmZpbHRlciA9IGZpbHRlcnNbaV07Ci0gICAgZWxlbXNbaV0uY2hhbm5lbF9kYXRhID0gdXNlcl9kYXRhOwotICAgIGVsZW1zW2ldLmZpbHRlci0+aW5pdF9jaGFubmVsX2VsZW0oZXhlY19jdHgsICZlbGVtc1tpXSwgJmFyZ3MpOwotICAgIHVzZXJfZGF0YSArPSBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShmaWx0ZXJzW2ldLT5zaXplb2ZfY2hhbm5lbF9kYXRhKTsKLSAgICBjYWxsX3NpemUgKz0gUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoZmlsdGVyc1tpXS0+c2l6ZW9mX2NhbGxfZGF0YSk7Ci0gIH0KLQotICBHUFJfQVNTRVJUKHVzZXJfZGF0YSA+IChjaGFyICopc3RhY2spOwotICBHUFJfQVNTRVJUKCh1aW50cHRyX3QpKHVzZXJfZGF0YSAtIChjaGFyICopc3RhY2spID09Ci0gICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX3NpemUoZmlsdGVycywgZmlsdGVyX2NvdW50KSk7Ci0KLSAgc3RhY2stPmNhbGxfc3RhY2tfc2l6ZSA9IGNhbGxfc2l6ZTsKLX0KLQotdm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrICpzdGFjaykgewotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqY2hhbm5lbF9lbGVtcyA9IENIQU5ORUxfRUxFTVNfRlJPTV9TVEFDSyhzdGFjayk7Ci0gIHNpemVfdCBjb3VudCA9IHN0YWNrLT5jb3VudDsKLSAgc2l6ZV90IGk7Ci0KLSAgLyogZGVzdHJveSBwZXItZmlsdGVyIGRhdGEgKi8KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBjaGFubmVsX2VsZW1zW2ldLmZpbHRlci0+ZGVzdHJveV9jaGFubmVsX2VsZW0oZXhlY19jdHgsICZjaGFubmVsX2VsZW1zW2ldKTsKLSAgfQotfQotCi12b2lkIGdycGNfY2FsbF9zdGFja19pbml0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2ssIGludCBpbml0aWFsX3JlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaW9tZ3JfY2JfZnVuYyBkZXN0cm95LCB2b2lkICpkZXN0cm95X2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudCAqY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdHJhbnNwb3J0X3NlcnZlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2spIHsKLSAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmNoYW5uZWxfZWxlbXMgPSBDSEFOTkVMX0VMRU1TX0ZST01fU1RBQ0soY2hhbm5lbF9zdGFjayk7Ci0gIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgYXJnczsKLSAgc2l6ZV90IGNvdW50ID0gY2hhbm5lbF9zdGFjay0+Y291bnQ7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICpjYWxsX2VsZW1zOwotICBjaGFyICp1c2VyX2RhdGE7Ci0gIHNpemVfdCBpOwotCi0gIGNhbGxfc3RhY2stPmNvdW50ID0gY291bnQ7Ci0gIEdSUENfU1RSRUFNX1JFRl9JTklUKCZjYWxsX3N0YWNrLT5yZWZjb3VudCwgaW5pdGlhbF9yZWZzLCBkZXN0cm95LAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X2FyZywgIkNBTExfU1RBQ0siKTsKLSAgY2FsbF9lbGVtcyA9IENBTExfRUxFTVNfRlJPTV9TVEFDSyhjYWxsX3N0YWNrKTsKLSAgdXNlcl9kYXRhID0gKChjaGFyICopY2FsbF9lbGVtcykgKwotICAgICAgICAgICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShjb3VudCAqIHNpemVvZihncnBjX2NhbGxfZWxlbWVudCkpOwotCi0gIC8qIGluaXQgcGVyLWZpbHRlciBkYXRhICovCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgYXJncy5jYWxsX3N0YWNrID0gY2FsbF9zdGFjazsKLSAgICBhcmdzLnNlcnZlcl90cmFuc3BvcnRfZGF0YSA9IHRyYW5zcG9ydF9zZXJ2ZXJfZGF0YTsKLSAgICBhcmdzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIGNhbGxfZWxlbXNbaV0uZmlsdGVyID0gY2hhbm5lbF9lbGVtc1tpXS5maWx0ZXI7Ci0gICAgY2FsbF9lbGVtc1tpXS5jaGFubmVsX2RhdGEgPSBjaGFubmVsX2VsZW1zW2ldLmNoYW5uZWxfZGF0YTsKLSAgICBjYWxsX2VsZW1zW2ldLmNhbGxfZGF0YSA9IHVzZXJfZGF0YTsKLSAgICBjYWxsX2VsZW1zW2ldLmZpbHRlci0+aW5pdF9jYWxsX2VsZW0oZXhlY19jdHgsICZjYWxsX2VsZW1zW2ldLCAmYXJncyk7Ci0gICAgdXNlcl9kYXRhICs9Ci0gICAgICAgIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKGNhbGxfZWxlbXNbaV0uZmlsdGVyLT5zaXplb2ZfY2FsbF9kYXRhKTsKLSAgfQotfQotCi12b2lkIGdycGNfY2FsbF9zdGFja19zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9zdGFjayAqY2FsbF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBzaXplX3QgY291bnQgPSBjYWxsX3N0YWNrLT5jb3VudDsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmNhbGxfZWxlbXM7Ci0gIGNoYXIgKnVzZXJfZGF0YTsKLSAgc2l6ZV90IGk7Ci0KLSAgY2FsbF9lbGVtcyA9IENBTExfRUxFTVNfRlJPTV9TVEFDSyhjYWxsX3N0YWNrKTsKLSAgdXNlcl9kYXRhID0gKChjaGFyICopY2FsbF9lbGVtcykgKwotICAgICAgICAgICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShjb3VudCAqIHNpemVvZihncnBjX2NhbGxfZWxlbWVudCkpOwotCi0gIC8qIGluaXQgcGVyLWZpbHRlciBkYXRhICovCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgY2FsbF9lbGVtc1tpXS5maWx0ZXItPnNldF9wb2xsc2V0KGV4ZWNfY3R4LCAmY2FsbF9lbGVtc1tpXSwgcG9sbHNldCk7Ci0gICAgdXNlcl9kYXRhICs9Ci0gICAgICAgIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKGNhbGxfZWxlbXNbaV0uZmlsdGVyLT5zaXplb2ZfY2FsbF9kYXRhKTsKLSAgfQotfQotCi12b2lkIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7fQotCi12b2lkIGdycGNfY2FsbF9zdGFja19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfc3RhY2sgKnN0YWNrKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtcyA9IENBTExfRUxFTVNfRlJPTV9TVEFDSyhzdGFjayk7Ci0gIHNpemVfdCBjb3VudCA9IHN0YWNrLT5jb3VudDsKLSAgc2l6ZV90IGk7Ci0KLSAgLyogZGVzdHJveSBwZXItZmlsdGVyIGRhdGEgKi8KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBlbGVtc1tpXS5maWx0ZXItPmRlc3Ryb3lfY2FsbF9lbGVtKGV4ZWNfY3R4LCAmZWxlbXNbaV0pOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jYWxsX25leHRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICpuZXh0X2VsZW0gPSBlbGVtICsgMTsKLSAgbmV4dF9lbGVtLT5maWx0ZXItPnN0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AoZXhlY19jdHgsIG5leHRfZWxlbSwgb3ApOwotfQotCi1jaGFyICpncnBjX2NhbGxfbmV4dF9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICpuZXh0X2VsZW0gPSBlbGVtICsgMTsKLSAgcmV0dXJuIG5leHRfZWxlbS0+ZmlsdGVyLT5nZXRfcGVlcihleGVjX2N0eCwgbmV4dF9lbGVtKTsKLX0KLQotdm9pZCBncnBjX2NoYW5uZWxfbmV4dF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCkgewotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqbmV4dF9lbGVtID0gZWxlbSArIDE7Ci0gIG5leHRfZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfb3AoZXhlY19jdHgsIG5leHRfZWxlbSwgb3ApOwotfQotCi1ncnBjX2NoYW5uZWxfc3RhY2sgKmdycGNfY2hhbm5lbF9zdGFja19mcm9tX3RvcF9lbGVtZW50KAotICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7Ci0gIHJldHVybiAoZ3JwY19jaGFubmVsX3N0YWNrICopKChjaGFyICopKGVsZW0pLVJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKAotICAgICAgc2l6ZW9mKGdycGNfY2hhbm5lbF9zdGFjaykpKTsKLX0KLQotZ3JwY19jYWxsX3N0YWNrICpncnBjX2NhbGxfc3RhY2tfZnJvbV90b3BfZWxlbWVudChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgewotICByZXR1cm4gKGdycGNfY2FsbF9zdGFjayAqKSgoY2hhciAqKShlbGVtKS1ST1VORF9VUF9UT19BTElHTk1FTlRfU0laRSgKLSAgICAgIHNpemVvZihncnBjX2NhbGxfc3RhY2spKSk7Ci19Ci0KLXZvaWQgZ3JwY19jYWxsX2VsZW1lbnRfc2VuZF9jYW5jZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICpjdXJfZWxlbSkgewotICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Agb3A7Ci0gIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOwotICBvcC5jYW5jZWxfd2l0aF9zdGF0dXMgPSBHUlBDX1NUQVRVU19DQU5DRUxMRUQ7Ci0gIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBjdXJfZWxlbSwgJm9wKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIGIvc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzYyZjAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0hBTk5FTF9DSEFOTkVMX1NUQUNLX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NIQU5ORUxfQ0hBTk5FTF9TVEFDS19ICi0KLS8qIEEgY2hhbm5lbCBmaWx0ZXIgZGVmaW5lcyBob3cgb3BlcmF0aW9ucyBvbiBhIGNoYW5uZWwgYXJlIGltcGxlbWVudGVkLgotICAgQ2hhbm5lbCBmaWx0ZXJzIGFyZSBjaGFpbmVkIHRvZ2V0aGVyIHRvIGNyZWF0ZSBmdWxsIGNoYW5uZWxzLCBhbmQgaWYgdGhvc2UKLSAgIGNoYWlucyBhcmUgbGluZWFyLCB0aGVuIGNoYW5uZWwgc3RhY2tzIHByb3ZpZGUgYSBtZWNoYW5pc20gdG8gbWluaW1pemUKLSAgIGFsbG9jYXRpb25zIGZvciB0aGF0IGNoYWluLgotICAgQ2FsbCBzdGFja3MgYXJlIGNyZWF0ZWQgYnkgY2hhbm5lbCBzdGFja3MgYW5kIHJlcHJlc2VudCB0aGUgcGVyLWNhbGwgZGF0YQotICAgZm9yIHRoYXQgc3RhY2suICovCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaGFubmVsX2VsZW1lbnQgZ3JwY19jaGFubmVsX2VsZW1lbnQ7Ci10eXBlZGVmIHN0cnVjdCBncnBjX2NhbGxfZWxlbWVudCBncnBjX2NhbGxfZWxlbWVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaGFubmVsX3N0YWNrIGdycGNfY2hhbm5lbF9zdGFjazsKLXR5cGVkZWYgc3RydWN0IGdycGNfY2FsbF9zdGFjayBncnBjX2NhbGxfc3RhY2s7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrOwotICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqY2hhbm5lbF9hcmdzOwotICBpbnQgaXNfZmlyc3Q7Ci0gIGludCBpc19sYXN0OwotfSBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9zdGFjayAqY2FsbF9zdGFjazsKLSAgY29uc3Qgdm9pZCAqc2VydmVyX3RyYW5zcG9ydF9kYXRhOwotICBncnBjX2NhbGxfY29udGV4dF9lbGVtZW50ICpjb250ZXh0OwotfSBncnBjX2NhbGxfZWxlbWVudF9hcmdzOwotCi0vKiBDaGFubmVsIGZpbHRlcnMgc3BlY2lmeToKLSAgIDEuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCBpbiB0aGUgY2hhbm5lbCAmIGNhbGwgKHZpYSB0aGUgc2l6ZW9mX1hYWAotICAgICAgbWVtYmVycykKLSAgIDIuIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZCBkZXN0cm95IGNoYW5uZWwgJiBjYWxsIGRhdGEKLSAgICAgIChpbml0X1hYWCwgZGVzdHJveV9YWFgpCi0gICAzLiBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGNhbGwgb3BlcmF0aW9ucyBhbmQgY2hhbm5lbCBvcGVyYXRpb25zIChjYWxsX29wLAotICAgICAgY2hhbm5lbF9vcCkKLSAgIDQuIGEgbmFtZSwgd2hpY2ggaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nCi0KLSAgIE1lbWJlcnMgYXJlIGxhaWQgb3V0IGluIGFwcHJveGltYXRlIGZyZXF1ZW5jeSBvZiB1c2Ugb3JkZXIuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIENhbGxlZCB0byBlZy4gc2VuZC9yZWNlaXZlIGRhdGEgb24gYSBjYWxsLgotICAgICBTZWUgZ3JwY19jYWxsX25leHRfb3Agb24gaG93IHRvIGNhbGwgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RhY2sgKi8KLSAgdm9pZCAoKnN0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3ApKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKLSAgLyogQ2FsbGVkIHRvIGhhbmRsZSBjaGFubmVsIGxldmVsIG9wZXJhdGlvbnMgLSBlLmcuIG5ldyBjYWxscywgb3IgdHJhbnNwb3J0Ci0gICAgIGNsb3N1cmUuCi0gICAgIFNlZSBncnBjX2NoYW5uZWxfbmV4dF9vcCBvbiBob3cgdG8gY2FsbCB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBzdGFjayAqLwotICB2b2lkICgqc3RhcnRfdHJhbnNwb3J0X29wKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sIGdycGNfdHJhbnNwb3J0X29wICpvcCk7Ci0KLSAgLyogc2l6ZW9mKHBlciBjYWxsIGRhdGEpICovCi0gIHNpemVfdCBzaXplb2ZfY2FsbF9kYXRhOwotICAvKiBJbml0aWFsaXplIHBlciBjYWxsIGRhdGEuCi0gICAgIGVsZW0gaXMgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjYWxsLCBhbmQgZWxlbS0+Y2FsbF9kYXRhIGlzIHdoYXQKLSAgICAgbmVlZHMgaW5pdGlhbGl6aW5nLgotICAgICBUaGUgZmlsdGVyIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55IGNoYWluaW5nLgotICAgICBzZXJ2ZXJfdHJhbnNwb3J0X2RhdGEgaXMgYW4gb3BhcXVlIHBvaW50ZXIuIElmIGl0IGlzIE5VTEwsIHRoaXMgY2FsbCBpcwotICAgICBvbiBhIGNsaWVudDsgaWYgaXQgaXMgbm9uLU5VTEwsIHRoZW4gaXQgcG9pbnRzIHRvIG1lbW9yeSBvd25lZCBieSB0aGUKLSAgICAgdHJhbnNwb3J0IGFuZCBpcyBvbiB0aGUgc2VydmVyLiBNb3N0IGZpbHRlcnMgd2FudCB0byBpZ25vcmUgdGhpcwotICAgICBhcmd1bWVudC4gKi8KLSAgdm9pZCAoKmluaXRfY2FsbF9lbGVtKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncyk7Ci0gIHZvaWQgKCpzZXRfcG9sbHNldCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Ci0gIC8qIERlc3Ryb3kgcGVyIGNhbGwgZGF0YS4KLSAgICAgVGhlIGZpbHRlciBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueSBjaGFpbmluZyAqLwotICB2b2lkICgqZGVzdHJveV9jYWxsX2VsZW0pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSk7Ci0KLSAgLyogc2l6ZW9mKHBlciBjaGFubmVsIGRhdGEpICovCi0gIHNpemVfdCBzaXplb2ZfY2hhbm5lbF9kYXRhOwotICAvKiBJbml0aWFsaXplIHBlci1jaGFubmVsIGRhdGEuCi0gICAgIGVsZW0gaXMgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjYWxsLCBhbmQgZWxlbS0+Y2hhbm5lbF9kYXRhIGlzCi0gICAgIHdoYXQgbmVlZHMgaW5pdGlhbGl6aW5nLgotICAgICBpc19maXJzdCwgaXNfbGFzdCBkZXNpZ25hdGUgdGhpcyBlbGVtZW50cyBwb3NpdGlvbiBpbiB0aGUgc3RhY2ssIGFuZCBhcmUKLSAgICAgdXNlZnVsIGZvciBhc3NlcnRpbmcgY29ycmVjdCBjb25maWd1cmF0aW9uIGJ5IHVwcGVyIGxheWVyIGNvZGUuCi0gICAgIFRoZSBmaWx0ZXIgZG9lcyBub3QgbmVlZCB0byBkbyBhbnkgY2hhaW5pbmcgKi8KLSAgdm9pZCAoKmluaXRfY2hhbm5lbF9lbGVtKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJncyAqYXJncyk7Ci0gIC8qIERlc3Ryb3kgcGVyIGNoYW5uZWwgZGF0YS4KLSAgICAgVGhlIGZpbHRlciBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueSBjaGFpbmluZyAqLwotICB2b2lkICgqZGVzdHJveV9jaGFubmVsX2VsZW0pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKTsKLQotICAvKiBJbXBsZW1lbnQgZ3JwY19jYWxsX2dldF9wZWVyKCkgKi8KLSAgY2hhciAqKCpnZXRfcGVlcikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGlzIGZpbHRlciAqLwotICBjb25zdCBjaGFyICpuYW1lOwotfSBncnBjX2NoYW5uZWxfZmlsdGVyOwotCi0vKiBBIGNoYW5uZWxfZWxlbWVudCB0cmFja3MgaXRzIGZpbHRlciBhbmQgdGhlIGZpbHRlciByZXF1ZXN0ZWQgbWVtb3J5IHdpdGhpbgotICAgYSBjaGFubmVsIGFsbG9jYXRpb24gKi8KLXN0cnVjdCBncnBjX2NoYW5uZWxfZWxlbWVudCB7Ci0gIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlcjsKLSAgdm9pZCAqY2hhbm5lbF9kYXRhOwotfTsKLQotLyogQSBjYWxsX2VsZW1lbnQgdHJhY2tzIGl0cyBmaWx0ZXIsIHRoZSBmaWx0ZXIgcmVxdWVzdGVkIG1lbW9yeSB3aXRoaW4KLSAgIGEgY2hhbm5lbCBhbGxvY2F0aW9uLCBhbmQgdGhlIGZpbHRlciByZXF1ZXN0ZWQgbWVtb3J5IHdpdGhpbiBhIGNhbGwKLSAgIGFsbG9jYXRpb24gKi8KLXN0cnVjdCBncnBjX2NhbGxfZWxlbWVudCB7Ci0gIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlcjsKLSAgdm9pZCAqY2hhbm5lbF9kYXRhOwotICB2b2lkICpjYWxsX2RhdGE7Ci19OwotCi0vKiBBIGNoYW5uZWwgc3RhY2sgdHJhY2tzIGEgc2V0IG9mIHJlbGF0ZWQgZmlsdGVycyBmb3Igb25lIGNoYW5uZWwsIGFuZAotICAgZ3VhcmFudGVlcyB0aGV5IGxpdmUgd2l0aGluIGEgc2luZ2xlIG1hbGxvYygpIGFsbG9jYXRpb24gKi8KLXN0cnVjdCBncnBjX2NoYW5uZWxfc3RhY2sgewotICBncnBjX3N0cmVhbV9yZWZjb3VudCByZWZjb3VudDsKLSAgc2l6ZV90IGNvdW50OwotICAvKiBNZW1vcnkgcmVxdWlyZWQgZm9yIGEgY2FsbCBzdGFjayAoY29tcHV0ZWQgYXQgY2hhbm5lbCBzdGFjawotICAgICBpbml0aWFsaXphdGlvbikgKi8KLSAgc2l6ZV90IGNhbGxfc3RhY2tfc2l6ZTsKLX07Ci0KLS8qIEEgY2FsbCBzdGFjayB0cmFja3MgYSBzZXQgb2YgcmVsYXRlZCBmaWx0ZXJzIGZvciBvbmUgY2FsbCwgYW5kIGd1YXJhbnRlZXMKLSAgIHRoZXkgbGl2ZSB3aXRoaW4gYSBzaW5nbGUgbWFsbG9jKCkgYWxsb2NhdGlvbiAqLwotc3RydWN0IGdycGNfY2FsbF9zdGFjayB7Ci0gIC8qIHNoYXJlZCByZWZjb3VudCBmb3IgdGhpcyBjaGFubmVsIHN0YWNrLgotICAgICBNVVNUIGJlIHRoZSBmaXJzdCBlbGVtZW50OiB0aGUgdW5kZXJseWluZyBjb2RlIGNhbGxzIGRlc3Ryb3kKLSAgICAgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVmY291bnQsIGJ1dCBoaWdoZXIgbGF5ZXJzIHByZWZlciB0byB0aGluawotICAgICBhYm91dCB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbCBzdGFjayBpdHNlbGYuICovCi0gIGdycGNfc3RyZWFtX3JlZmNvdW50IHJlZmNvdW50OwotICBzaXplX3QgY291bnQ7Ci19OwotCi0vKiBHZXQgYSBjaGFubmVsIGVsZW1lbnQgZ2l2ZW4gYSBjaGFubmVsIHN0YWNrIGFuZCBpdHMgaW5kZXggKi8KLWdycGNfY2hhbm5lbF9lbGVtZW50ICpncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudChncnBjX2NoYW5uZWxfc3RhY2sgKnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpKTsKLS8qIEdldCB0aGUgbGFzdCBjaGFubmVsIGVsZW1lbnQgaW4gYSBjaGFubmVsIHN0YWNrICovCi1ncnBjX2NoYW5uZWxfZWxlbWVudCAqZ3JwY19jaGFubmVsX3N0YWNrX2xhc3RfZWxlbWVudCgKLSAgICBncnBjX2NoYW5uZWxfc3RhY2sgKnN0YWNrKTsKLS8qIEdldCBhIGNhbGwgc3RhY2sgZWxlbWVudCBnaXZlbiBhIGNhbGwgc3RhY2sgYW5kIGFuIGluZGV4ICovCi1ncnBjX2NhbGxfZWxlbWVudCAqZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoZ3JwY19jYWxsX3N0YWNrICpzdGFjaywgc2l6ZV90IGkpOwotCi0vKiBEZXRlcm1pbmUgbWVtb3J5IHJlcXVpcmVkIGZvciBhIGNoYW5uZWwgc3RhY2sgY29udGFpbmluZyBhIHNldCBvZiBmaWx0ZXJzICovCi1zaXplX3QgZ3JwY19jaGFubmVsX3N0YWNrX3NpemUoY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqKmZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZpbHRlcl9jb3VudCk7Ci0vKiBJbml0aWFsaXplIGEgY2hhbm5lbCBzdGFjayBnaXZlbiBzb21lIGZpbHRlcnMgKi8KLXZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2luaXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludCBpbml0aWFsX3JlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaW9tZ3JfY2JfZnVuYyBkZXN0cm95LCB2b2lkICpkZXN0cm95X2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqKmZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmaWx0ZXJfY291bnQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBncnBjX2NoYW5uZWxfc3RhY2sgKnN0YWNrKTsKLS8qIERlc3Ryb3kgYSBjaGFubmVsIHN0YWNrICovCi12b2lkIGdycGNfY2hhbm5lbF9zdGFja19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc3RhY2sgKnN0YWNrKTsKLQotLyogSW5pdGlhbGl6ZSBhIGNhbGwgc3RhY2sgZ2l2ZW4gYSBjaGFubmVsIHN0YWNrLiB0cmFuc3BvcnRfc2VydmVyX2RhdGEgaXMKLSAgIGV4cGVjdGVkIHRvIGJlIE5VTEwgb24gYSBjbGllbnQsIG9yIGFuIG9wYXF1ZSB0cmFuc3BvcnQgb3duZWQgcG9pbnRlciBvbiB0aGUKLSAgIHNlcnZlci4gKi8KLXZvaWQgZ3JwY19jYWxsX3N0YWNrX2luaXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjaywgaW50IGluaXRpYWxfcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGRlc3Ryb3ksIHZvaWQgKmRlc3Ryb3lfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfY29udGV4dF9lbGVtZW50ICpjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0cmFuc3BvcnRfc2VydmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9zdGFjayAqY2FsbF9zdGFjayk7Ci0vKiBTZXQgYSBwb2xsc2V0IGZvciBhIGNhbGwgc3RhY2s6IG11c3Qgb2NjdXIgYmVmb3JlIHRoZSBmaXJzdCBvcCBpcyBzdGFydGVkICovCi12b2lkIGdycGNfY2FsbF9zdGFja19zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9zdGFjayAqY2FsbF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBHUlBDX0NBTExfU1RBQ0tfUkVGKGNhbGxfc3RhY2ssIHJlYXNvbikgXAotICBncnBjX3N0cmVhbV9yZWYoJihjYWxsX3N0YWNrKS0+cmVmY291bnQsIHJlYXNvbikKLSNkZWZpbmUgR1JQQ19DQUxMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBjYWxsX3N0YWNrLCByZWFzb24pIFwKLSAgZ3JwY19zdHJlYW1fdW5yZWYoZXhlY19jdHgsICYoY2FsbF9zdGFjayktPnJlZmNvdW50LCByZWFzb24pCi0jZGVmaW5lIEdSUENfQ0hBTk5FTF9TVEFDS19SRUYoY2hhbm5lbF9zdGFjaywgcmVhc29uKSBcCi0gIGdycGNfc3RyZWFtX3JlZigmKGNoYW5uZWxfc3RhY2spLT5yZWZjb3VudCwgcmVhc29uKQotI2RlZmluZSBHUlBDX0NIQU5ORUxfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIGNoYW5uZWxfc3RhY2ssIHJlYXNvbikgXAotICBncnBjX3N0cmVhbV91bnJlZihleGVjX2N0eCwgJihjaGFubmVsX3N0YWNrKS0+cmVmY291bnQsIHJlYXNvbikKLSNlbHNlCi0jZGVmaW5lIEdSUENfQ0FMTF9TVEFDS19SRUYoY2FsbF9zdGFjaywgcmVhc29uKSBcCi0gIGdycGNfc3RyZWFtX3JlZigmKGNhbGxfc3RhY2spLT5yZWZjb3VudCkKLSNkZWZpbmUgR1JQQ19DQUxMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBjYWxsX3N0YWNrLCByZWFzb24pIFwKLSAgZ3JwY19zdHJlYW1fdW5yZWYoZXhlY19jdHgsICYoY2FsbF9zdGFjayktPnJlZmNvdW50KQotI2RlZmluZSBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKGNoYW5uZWxfc3RhY2ssIHJlYXNvbikgXAotICBncnBjX3N0cmVhbV9yZWYoJihjaGFubmVsX3N0YWNrKS0+cmVmY291bnQpCi0jZGVmaW5lIEdSUENfQ0hBTk5FTF9TVEFDS19VTlJFRihleGVjX2N0eCwgY2hhbm5lbF9zdGFjaywgcmVhc29uKSBcCi0gIGdycGNfc3RyZWFtX3VucmVmKGV4ZWNfY3R4LCAmKGNoYW5uZWxfc3RhY2spLT5yZWZjb3VudCkKLSNlbmRpZgotCi0vKiBEZXN0cm95IGEgY2FsbCBzdGFjayAqLwotdm9pZCBncnBjX2NhbGxfc3RhY2tfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX3N0YWNrICpzdGFjayk7Ci0KLS8qIElnbm9yZSBzZXQgcG9sbHNldCAtIHVzZWQgYnkgZmlsdGVycyB0byBpbXBsZW1lbnQgdGhlIHNldF9wb2xsc2V0IG1ldGhvZAotICAgaWYgdGhleSBkb24ndCBjYXJlIGFib3V0IHBvbGxzZXRzIGF0IGFsbC4gRG9lcyBub3RoaW5nLiAqLwotdm9pZCBncnBjX2NhbGxfc3RhY2tfaWdub3JlX3NldF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Ci0vKiBDYWxsIHRoZSBuZXh0IG9wZXJhdGlvbiBpbiBhIGNhbGwgc3RhY2sgKi8KLXZvaWQgZ3JwY19jYWxsX25leHRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKLS8qIENhbGwgdGhlIG5leHQgb3BlcmF0aW9uIChkZXBlbmRpbmcgb24gY2FsbCBkaXJlY3Rpb25hbGl0eSkgaW4gYSBjaGFubmVsCi0gICBzdGFjayAqLwotdm9pZCBncnBjX2NoYW5uZWxfbmV4dF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCk7Ci0vKiBQYXNzIHRocm91Z2ggYSByZXF1ZXN0IHRvIGdldF9wZWVyIHRvIHRoZSBuZXh0IGNoaWxkIGVsZW1lbnQgKi8KLWNoYXIgKmdycGNfY2FsbF9uZXh0X2dldF9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSk7Ci0KLS8qIEdpdmVuIHRoZSB0b3AgZWxlbWVudCBvZiBhIGNoYW5uZWwgc3RhY2ssIGdldCB0aGUgY2hhbm5lbCBzdGFjayBpdHNlbGYgKi8KLWdycGNfY2hhbm5lbF9zdGFjayAqZ3JwY19jaGFubmVsX3N0YWNrX2Zyb21fdG9wX2VsZW1lbnQoCi0gICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pOwotLyogR2l2ZW4gdGhlIHRvcCBlbGVtZW50IG9mIGEgY2FsbCBzdGFjaywgZ2V0IHRoZSBjYWxsIHN0YWNrIGl0c2VsZiAqLwotZ3JwY19jYWxsX3N0YWNrICpncnBjX2NhbGxfc3RhY2tfZnJvbV90b3BfZWxlbWVudChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSk7Ci0KLXZvaWQgZ3JwY19jYWxsX2xvZ19vcChjaGFyICpmaWxlLCBpbnQgbGluZSwgZ3ByX2xvZ19zZXZlcml0eSBzZXZlcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7Ci0KLXZvaWQgZ3JwY19jYWxsX2VsZW1lbnRfc2VuZF9jYW5jZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICpjdXJfZWxlbSk7Ci0KLWV4dGVybiBpbnQgZ3JwY190cmFjZV9jaGFubmVsOwotCi0jZGVmaW5lIEdSUENfQ0FMTF9MT0dfT1Aoc2V2LCBlbGVtLCBvcCkgXAotICBpZiAoZ3JwY190cmFjZV9jaGFubmVsKSBncnBjX2NhbGxfbG9nX29wKHNldiwgZWxlbSwgb3ApCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0hBTk5FTF9DSEFOTkVMX1NUQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMgYi9zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjEwMDRlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLQotaW50IGdycGNfdHJhY2VfY2hhbm5lbF9zdGFja19idWlsZGVyID0gMDsKLQotdHlwZWRlZiBzdHJ1Y3QgZmlsdGVyX25vZGUgewotICBzdHJ1Y3QgZmlsdGVyX25vZGUgKm5leHQ7Ci0gIHN0cnVjdCBmaWx0ZXJfbm9kZSAqcHJldjsKLSAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyOwotICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgaW5pdDsKLSAgdm9pZCAqaW5pdF9hcmc7Ci19IGZpbHRlcl9ub2RlOwotCi1zdHJ1Y3QgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgewotICAvLyBzZW50aW5lbCBub2RlcyBmb3IgZmlsdGVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZAotICBmaWx0ZXJfbm9kZSBiZWdpbjsKLSAgZmlsdGVyX25vZGUgZW5kOwotICAvLyB2YXJpb3VzIHNldC9nZXQtYWJsZSBwYXJhbWV0ZXJzCi0gIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzOwotICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RydWN0IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yIHsKLSAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXI7Ci0gIGZpbHRlcl9ub2RlICpub2RlOwotfTsKLQotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2NyZWF0ZSh2b2lkKSB7Ci0gIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpiID0gZ3ByX21hbGxvYyhzaXplb2YoKmIpKTsKLSAgbWVtc2V0KGIsIDAsIHNpemVvZigqYikpOwotCi0gIGItPmJlZ2luLmZpbHRlciA9IE5VTEw7Ci0gIGItPmVuZC5maWx0ZXIgPSBOVUxMOwotICBiLT5iZWdpbi5uZXh0ID0gJmItPmVuZDsKLSAgYi0+YmVnaW4ucHJldiA9ICZiLT5lbmQ7Ci0gIGItPmVuZC5uZXh0ID0gJmItPmJlZ2luOwotICBiLT5lbmQucHJldiA9ICZiLT5iZWdpbjsKLQotICByZXR1cm4gYjsKLX0KLQotc3RhdGljIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICpjcmVhdGVfaXRlcmF0b3JfYXRfZmlsdGVyX25vZGUoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsIGZpbHRlcl9ub2RlICpub2RlKSB7Ci0gIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCppdCkpOwotICBpdC0+YnVpbGRlciA9IGJ1aWxkZXI7Ci0gIGl0LT5ub2RlID0gbm9kZTsKLSAgcmV0dXJuIGl0OwotfQotCi12b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yX2Rlc3Ryb3koCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0KSB7Ci0gIGdwcl9mcmVlKGl0KTsKLX0KLQotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKgotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlX2l0ZXJhdG9yX2F0X2ZpcnN0KAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKSB7Ci0gIHJldHVybiBjcmVhdGVfaXRlcmF0b3JfYXRfZmlsdGVyX25vZGUoYnVpbGRlciwgJmJ1aWxkZXItPmJlZ2luKTsKLX0KLQotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKgotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlX2l0ZXJhdG9yX2F0X2xhc3QoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpIHsKLSAgcmV0dXJuIGNyZWF0ZV9pdGVyYXRvcl9hdF9maWx0ZXJfbm9kZShidWlsZGVyLCAmYnVpbGRlci0+ZW5kKTsKLX0KLQotYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9tb3ZlX25leHQoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yKSB7Ci0gIGlmIChpdGVyYXRvci0+bm9kZSA9PSAmaXRlcmF0b3ItPmJ1aWxkZXItPmVuZCkgcmV0dXJuIGZhbHNlOwotICBpdGVyYXRvci0+bm9kZSA9IGl0ZXJhdG9yLT5ub2RlLT5uZXh0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9tb3ZlX3ByZXYoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yKSB7Ci0gIGlmIChpdGVyYXRvci0+bm9kZSA9PSAmaXRlcmF0b3ItPmJ1aWxkZXItPmJlZ2luKSByZXR1cm4gZmFsc2U7Ci0gIGl0ZXJhdG9yLT5ub2RlID0gaXRlcmF0b3ItPm5vZGUtPnByZXY7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX21vdmVfcHJldigKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IpOwotCi12b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3NldF9uYW1lKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7Ci0gIEdQUl9BU1NFUlQoYnVpbGRlci0+bmFtZSA9PSBOVUxMKTsKLSAgYnVpbGRlci0+bmFtZSA9IG5hbWU7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X2NoYW5uZWxfYXJndW1lbnRzKAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncykgewotICBHUFJfQVNTRVJUKGJ1aWxkZXItPmFyZ3MgPT0gTlVMTCk7Ci0gIGJ1aWxkZXItPmFyZ3MgPSBhcmdzOwotfQotCi12b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3NldF90cmFuc3BvcnQoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpIHsKLSAgR1BSX0FTU0VSVChidWlsZGVyLT50cmFuc3BvcnQgPT0gTlVMTCk7Ci0gIGJ1aWxkZXItPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLX0KLQotZ3JwY190cmFuc3BvcnQgKmdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF90cmFuc3BvcnQoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpIHsKLSAgcmV0dXJuIGJ1aWxkZXItPnRyYW5zcG9ydDsKLX0KLQotY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF9jaGFubmVsX2FyZ3VtZW50cygKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcikgewotICByZXR1cm4gYnVpbGRlci0+YXJnczsKLX0KLQotYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9hcHBlbmRfZmlsdGVyKAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXIsCi0gICAgZ3JwY19wb3N0X2ZpbHRlcl9jcmVhdGVfaW5pdF9mdW5jIHBvc3RfaW5pdF9mdW5jLCB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ID0KLSAgICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2NyZWF0ZV9pdGVyYXRvcl9hdF9sYXN0KGJ1aWxkZXIpOwotICBib29sIG9rID0gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfYWRkX2ZpbHRlcl9iZWZvcmUoCi0gICAgICBpdCwgZmlsdGVyLCBwb3N0X2luaXRfZnVuYywgdXNlcl9kYXRhKTsKLSAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3JfZGVzdHJveShpdCk7Ci0gIHJldHVybiBvazsKLX0KLQotYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyLAotICAgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBwb3N0X2luaXRfZnVuYywgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdCA9Ci0gICAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9jcmVhdGVfaXRlcmF0b3JfYXRfZmlyc3QoYnVpbGRlcik7Ci0gIGJvb2wgb2sgPSBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9hZGRfZmlsdGVyX2FmdGVyKAotICAgICAgaXQsIGZpbHRlciwgcG9zdF9pbml0X2Z1bmMsIHVzZXJfZGF0YSk7Ci0gIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yX2Rlc3Ryb3koaXQpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9hZnRlcihmaWx0ZXJfbm9kZSAqYmVmb3JlLCBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb3N0X2ZpbHRlcl9jcmVhdGVfaW5pdF9mdW5jIHBvc3RfaW5pdF9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBmaWx0ZXJfbm9kZSAqbmV3ID0gZ3ByX21hbGxvYyhzaXplb2YoKm5ldykpOwotICBuZXctPm5leHQgPSBiZWZvcmUtPm5leHQ7Ci0gIG5ldy0+cHJldiA9IGJlZm9yZTsKLSAgbmV3LT5uZXh0LT5wcmV2ID0gbmV3LT5wcmV2LT5uZXh0ID0gbmV3OwotICBuZXctPmZpbHRlciA9IGZpbHRlcjsKLSAgbmV3LT5pbml0ID0gcG9zdF9pbml0X2Z1bmM7Ci0gIG5ldy0+aW5pdF9hcmcgPSB1c2VyX2RhdGE7Ci19Ci0KLWJvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfYWRkX2ZpbHRlcl9iZWZvcmUoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yLAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlciwKLSAgICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgcG9zdF9pbml0X2Z1bmMsIHZvaWQgKnVzZXJfZGF0YSkgewotICBpZiAoaXRlcmF0b3ItPm5vZGUgPT0gJml0ZXJhdG9yLT5idWlsZGVyLT5iZWdpbikgcmV0dXJuIGZhbHNlOwotICBhZGRfYWZ0ZXIoaXRlcmF0b3ItPm5vZGUtPnByZXYsIGZpbHRlciwgcG9zdF9pbml0X2Z1bmMsIHVzZXJfZGF0YSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FkZF9maWx0ZXJfYWZ0ZXIoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yLAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlciwKLSAgICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgcG9zdF9pbml0X2Z1bmMsIHZvaWQgKnVzZXJfZGF0YSkgewotICBpZiAoaXRlcmF0b3ItPm5vZGUgPT0gJml0ZXJhdG9yLT5idWlsZGVyLT5lbmQpIHJldHVybiBmYWxzZTsKLSAgYWRkX2FmdGVyKGl0ZXJhdG9yLT5ub2RlLCBmaWx0ZXIsIHBvc3RfaW5pdF9mdW5jLCB1c2VyX2RhdGEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9kZXN0cm95KGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKSB7Ci0gIGZpbHRlcl9ub2RlICpwID0gYnVpbGRlci0+YmVnaW4ubmV4dDsKLSAgd2hpbGUgKHAgIT0gJmJ1aWxkZXItPmVuZCkgewotICAgIGZpbHRlcl9ub2RlICpuZXh0ID0gcC0+bmV4dDsKLSAgICBncHJfZnJlZShwKTsKLSAgICBwID0gbmV4dDsKLSAgfQotICBncHJfZnJlZShidWlsZGVyKTsKLX0KLQotdm9pZCAqZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZmluaXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcmVmaXhfYnl0ZXMsIGludCBpbml0aWFsX3JlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGRlc3Ryb3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGVzdHJveV9hcmcpIHsKLSAgLy8gY291bnQgdGhlIG51bWJlciBvZiBmaWx0ZXJzCi0gIHNpemVfdCBudW1fZmlsdGVycyA9IDA7Ci0gIGZvciAoZmlsdGVyX25vZGUgKnAgPSBidWlsZGVyLT5iZWdpbi5uZXh0OyBwICE9ICZidWlsZGVyLT5lbmQ7IHAgPSBwLT5uZXh0KSB7Ci0gICAgbnVtX2ZpbHRlcnMrKzsKLSAgfQotCi0gIC8vIGNyZWF0ZSBhbiBhcnJheSBvZiBmaWx0ZXJzCi0gIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzID0KLSAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKCpmaWx0ZXJzKSAqIG51bV9maWx0ZXJzKTsKLSAgc2l6ZV90IGkgPSAwOwotICBmb3IgKGZpbHRlcl9ub2RlICpwID0gYnVpbGRlci0+YmVnaW4ubmV4dDsgcCAhPSAmYnVpbGRlci0+ZW5kOyBwID0gcC0+bmV4dCkgewotICAgIGZpbHRlcnNbaSsrXSA9IHAtPmZpbHRlcjsKLSAgfQotCi0gIC8vIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY2hhbm5lbCBzdGFjawotICBzaXplX3QgY2hhbm5lbF9zdGFja19zaXplID0gZ3JwY19jaGFubmVsX3N0YWNrX3NpemUoZmlsdGVycywgbnVtX2ZpbHRlcnMpOwotCi0gIC8vIGFsbG9jYXRlIG1lbW9yeSwgd2l0aCBwcmVmaXhfYnl0ZXMgZm9sbG93ZWQgYnkgY2hhbm5lbF9zdGFja19zaXplCi0gIGNoYXIgKnJlc3VsdCA9IGdwcl9tYWxsb2MocHJlZml4X2J5dGVzICsgY2hhbm5lbF9zdGFja19zaXplKTsKLSAgLy8gZmV0Y2ggYSBwb2ludGVyIHRvIHRoZSBjaGFubmVsIHN0YWNrCi0gIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjayA9Ci0gICAgICAoZ3JwY19jaGFubmVsX3N0YWNrICopKHJlc3VsdCArIHByZWZpeF9ieXRlcyk7Ci0gIC8vIGFuZCBpbml0aWFsaXplIGl0Ci0gIGdycGNfY2hhbm5lbF9zdGFja19pbml0KGV4ZWNfY3R4LCBpbml0aWFsX3JlZnMsIGRlc3Ryb3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfYXJnID09IE5VTEwgPyByZXN1bHQgOiBkZXN0cm95X2FyZywgZmlsdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2ZpbHRlcnMsIGJ1aWxkZXItPmFyZ3MsIGJ1aWxkZXItPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfc3RhY2spOwotCi0gIC8vIHJ1biBwb3N0LWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwotICBpID0gMDsKLSAgZm9yIChmaWx0ZXJfbm9kZSAqcCA9IGJ1aWxkZXItPmJlZ2luLm5leHQ7IHAgIT0gJmJ1aWxkZXItPmVuZDsgcCA9IHAtPm5leHQpIHsKLSAgICBpZiAocC0+aW5pdCAhPSBOVUxMKSB7Ci0gICAgICBwLT5pbml0KGNoYW5uZWxfc3RhY2ssIGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KGNoYW5uZWxfc3RhY2ssIGkpLAotICAgICAgICAgICAgICBwLT5pbml0X2FyZyk7Ci0gICAgfQotICAgIGkrKzsKLSAgfQotCi0gIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2Rlc3Ryb3koYnVpbGRlcik7Ci0gIGdwcl9mcmVlKChncnBjX2NoYW5uZWxfZmlsdGVyICoqKWZpbHRlcnMpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIGIvc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmMzk1ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DSEFOTkVMX0NIQU5ORUxfU1RBQ0tfQlVJTERFUl9ICi0jZGVmaW5lIEdSUENfQ09SRV9DSEFOTkVMX0NIQU5ORUxfU1RBQ0tfQlVJTERFUl9ICi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotCi0vLy8gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgb2ZmZXJzIGEgcHJvZ3JhbW1hdGljIGludGVyZmFjZSB0byBzZWxlY3RlZAotLy8vIGFuZCBvcmRlciBjaGFubmVsIGZpbHRlcnMKLXR5cGVkZWYgc3RydWN0IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyOwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvcjsKLQotLy8vIENyZWF0ZSBhIG5ldyBjaGFubmVsIHN0YWNrIGJ1aWxkZXIKLWdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9jcmVhdGUodm9pZCk7Ci0KLS8vLyBBc3NpZ24gYSBuYW1lIHRvIHRoZSBjaGFubmVsIHN0YWNrOiBcYSBuYW1lIG11c3QgYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQKLXZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X25hbWUoZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0vLy8gQXR0YWNoIFxhIHRyYW5zcG9ydCB0byB0aGUgYnVpbGRlciAoZG9lcyBub3QgdGFrZSBvd25lcnNoaXApCi12b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3NldF90cmFuc3BvcnQoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpOwotCi0vLy8gRmV0Y2ggYXR0YWNoZWQgdHJhbnNwb3J0Ci1ncnBjX3RyYW5zcG9ydCAqZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZ2V0X3RyYW5zcG9ydCgKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcik7Ci0KLS8vLyBTZXQgY2hhbm5lbCBhcmd1bWVudHM6IFxhIGFyZ3MgbXVzdCBjb250aW51ZSB0byBleGlzdCB1bnRpbCBhZnRlcgotLy8vIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2ZpbmlzaCByZXR1cm5zCi12b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3NldF9jaGFubmVsX2FyZ3VtZW50cygKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpOwotCi0vLy8gUmV0dXJuIGEgYm9ycm93ZWQgcG9pbnRlciB0byB0aGUgY2hhbm5lbCBhcmd1bWVudHMKLWNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9nZXRfY2hhbm5lbF9hcmd1bWVudHMoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpOwotCi0vLy8gQmVnaW4gaXRlcmF0aW5nIG92ZXIgYWxyZWFkeSBkZWZpbmVkIGZpbHRlcnMgaW4gdGhlIGJ1aWxkZXIgYXQgdGhlIGJlZ2lubmluZwotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKgotZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlX2l0ZXJhdG9yX2F0X2ZpcnN0KAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKTsKLQotLy8vIEJlZ2luIGl0ZXJhdGluZyBvdmVyIGFscmVhZHkgZGVmaW5lZCBmaWx0ZXJzIGluIHRoZSBidWlsZGVyIGF0IHRoZSBlbmQKLWdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICoKLWdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2NyZWF0ZV9pdGVyYXRvcl9hdF9sYXN0KAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKTsKLQotLy8vIElzIGFuIGl0ZXJhdG9yIGF0IHRoZSBmaXJzdCBlbGVtZW50PwotYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvcl9pc19maXJzdCgKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IpOwotCi0vLy8gSXMgYW4gaXRlcmF0b3IgYXQgdGhlIGVuZD8KLWJvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3JfaXNfZW5kKAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvcik7Ci0KLS8vLyBNb3ZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGl0ZW0KLWJvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfbW92ZV9uZXh0KAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvcik7Ci0KLS8vLyBNb3ZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBwcmV2aW91cyBpdGVtCi1ib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX21vdmVfcHJldigKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IpOwotCi10eXBlZGVmIHZvaWQgKCpncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMpKAotICAgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjaywgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sIHZvaWQgKmFyZyk7Ci0KLS8vLyBBZGQgXGEgZmlsdGVyIHRvIHRoZSBzdGFjaywgYWZ0ZXIgXGEgaXRlcmF0b3IuCi0vLy8gQ2FsbCBcYSBwb3N0X2luaXRfZnVuYyguLi4sIFxhIHVzZXJfZGF0YSkgb25jZSB0aGUgY2hhbm5lbCBzdGFjayBpcwotLy8vIGNyZWF0ZWQuCi1ib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FkZF9maWx0ZXJfYWZ0ZXIoCi0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yLAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlciwKLSAgICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgcG9zdF9pbml0X2Z1bmMsCi0gICAgdm9pZCAqdXNlcl9kYXRhKSBHUlBDX01VU1RfVVNFX1JFU1VMVDsKLQotLy8vIEFkZCBcYSBmaWx0ZXIgdG8gdGhlIHN0YWNrLCBiZWZvcmUgXGEgaXRlcmF0b3IuCi0vLy8gQ2FsbCBcYSBwb3N0X2luaXRfZnVuYyguLi4sIFxhIHVzZXJfZGF0YSkgb25jZSB0aGUgY2hhbm5lbCBzdGFjayBpcwotLy8vIGNyZWF0ZWQuCi1ib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FkZF9maWx0ZXJfYmVmb3JlKAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvciwKLSAgICBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXIsCi0gICAgZ3JwY19wb3N0X2ZpbHRlcl9jcmVhdGVfaW5pdF9mdW5jIHBvc3RfaW5pdF9mdW5jLAotICAgIHZvaWQgKnVzZXJfZGF0YSkgR1JQQ19NVVNUX1VTRV9SRVNVTFQ7Ci0KLS8vLyBBZGQgXGEgZmlsdGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbHRlciBsaXN0LgotLy8vIENhbGwgXGEgcG9zdF9pbml0X2Z1bmMoLi4uLCBcYSB1c2VyX2RhdGEpIG9uY2UgdGhlIGNoYW5uZWwgc3RhY2sgaXMKLS8vLyBjcmVhdGVkLgotYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyLAotICAgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBwb3N0X2luaXRfZnVuYywKLSAgICB2b2lkICp1c2VyX2RhdGEpIEdSUENfTVVTVF9VU0VfUkVTVUxUOwotCi0vLy8gQWRkIFxhIGZpbHRlciB0byB0aGUgZW5kIG9mIHRoZSBmaWx0ZXIgbGlzdC4KLS8vLyBDYWxsIFxhIHBvc3RfaW5pdF9mdW5jKC4uLiwgXGEgdXNlcl9kYXRhKSBvbmNlIHRoZSBjaGFubmVsIHN0YWNrIGlzCi0vLy8gY3JlYXRlZC4KLWJvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfYXBwZW5kX2ZpbHRlcigKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyLAotICAgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBwb3N0X2luaXRfZnVuYywKLSAgICB2b2lkICp1c2VyX2RhdGEpIEdSUENfTVVTVF9VU0VfUkVTVUxUOwotCi0vLy8gVGVybWluYXRlIGl0ZXJhdGlvbiBhbmQgZGVzdHJveSBcYSBpdGVyYXRvcgotdm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvcl9kZXN0cm95KAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvcik7Ci0KLS8vLyBEZXN0cm95IHRoZSBidWlsZGVyLCByZXR1cm4gdGhlIGZyZXNobHkgbWludGVkIGNoYW5uZWwgc3RhY2sKLS8vLyBBbGxvY2F0ZXMgXGEgcHJlZml4X2J5dGVzIGJ5dGVzIGJlZm9yZSB0aGUgY2hhbm5lbCBzdGFjawotLy8vIFJldHVybnMgdGhlIGJhc2UgcG9pbnRlciBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrCi0vLy8gXGEgaW5pdGlhbF9yZWZzLCBcYSBkZXN0cm95LCBcYSBkZXN0cm95X2FyZyBhcmUgYXMgcGVyCi0vLy8gZ3JwY19jaGFubmVsX3N0YWNrX2luaXQKLXZvaWQgKmdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2ZpbmlzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlZml4X2J5dGVzLCBpbnQgaW5pdGlhbF9yZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaW9tZ3JfY2JfZnVuYyBkZXN0cm95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRlc3Ryb3lfYXJnKTsKLQotLy8vIERlc3Ryb3kgdGhlIGJ1aWxkZXIgd2l0aG91dCBjcmVhdGluZyBhIGNoYW5uZWwgc3RhY2sKLXZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZGVzdHJveShncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcik7Ci0KLWV4dGVybiBpbnQgZ3JwY190cmFjZV9jaGFubmVsX3N0YWNrX2J1aWxkZXI7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0hBTk5FTF9DSEFOTkVMX1NUQUNLX0JVSUxERVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIGIvc3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFkZWQ5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgotCi0vKiBDbGllbnQgY2hhbm5lbCBpbXBsZW1lbnRhdGlvbiAqLwotCi10eXBlZGVmIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciBjYWxsX2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IGNsaWVudF9jaGFubmVsX2NoYW5uZWxfZGF0YSB7Ci0gIC8qKiByZXNvbHZlciBmb3IgdGhpcyBjaGFubmVsICovCi0gIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyOwotICAvKiogaGF2ZSB3ZSBzdGFydGVkIHJlc29sdmluZyB0aGlzIGNoYW5uZWwgKi8KLSAgaW50IHN0YXJ0ZWRfcmVzb2x2aW5nOwotCi0gIC8qKiBtdXRleCBwcm90ZWN0aW5nIGNsaWVudCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgYWxsCi0gICAgICB2YXJpYWJsZXMgYmVsb3cgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZSAqLwotICBncHJfbXUgbXVfY29uZmlnOwotICAvKiogY3VycmVudGx5IGFjdGl2ZSBsb2FkIGJhbGFuY2VyIC0gZ3VhcmRlZCBieSBtdV9jb25maWcgKi8KLSAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeTsKLSAgLyoqIGluY29taW5nIGNvbmZpZ3VyYXRpb24gLSBzZXQgYnkgcmVzb2x2ZXIubmV4dAotICAgICAgZ3VhcmRlZCBieSBtdV9jb25maWcgKi8KLSAgZ3JwY19jbGllbnRfY29uZmlnICppbmNvbWluZ19jb25maWd1cmF0aW9uOwotICAvKiogYSBsaXN0IG9mIGNsb3N1cmVzIHRoYXQgYXJlIGFsbCB3YWl0aW5nIGZvciBjb25maWcgdG8gY29tZSBpbiAqLwotICBncnBjX2Nsb3N1cmVfbGlzdCB3YWl0aW5nX2Zvcl9jb25maWdfY2xvc3VyZXM7Ci0gIC8qKiByZXNvbHZlciBjYWxsYmFjayAqLwotICBncnBjX2Nsb3N1cmUgb25fY29uZmlnX2NoYW5nZWQ7Ci0gIC8qKiBjb25uZWN0aXZpdHkgc3RhdGUgYmVpbmcgdHJhY2tlZCAqLwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyIHN0YXRlX3RyYWNrZXI7Ci0gIC8qKiB3aGVuIGFuIGxiX3BvbGljeSBhcnJpdmVzLCBzaG91bGQgd2UgdHJ5IHRvIGV4aXQgaWRsZSAqLwotICBpbnQgZXhpdF9pZGxlX3doZW5fbGJfcG9saWN5X2Fycml2ZXM7Ci0gIC8qKiBvd25pbmcgc3RhY2sgKi8KLSAgZ3JwY19jaGFubmVsX3N0YWNrICpvd25pbmdfc3RhY2s7Ci0gIC8qKiBpbnRlcmVzdGVkIHBhcnRpZXMgKG93bmVkKSAqLwotICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXM7Ci19IGNoYW5uZWxfZGF0YTsKLQotLyoqIFdlIGNyZWF0ZSBvbmUgd2F0Y2hlciBmb3IgZWFjaCBuZXcgbGJfcG9saWN5IHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBhCi0gICByZXNvbHZlciwKLSAgICB0byB3YXRjaCBmb3Igc3RhdGUgY2hhbmdlcyBmcm9tIHRoZSBsYl9wb2xpY3kuIFdoZW4gYSBzdGF0ZSBjaGFuZ2UgaXMgc2VlbiwKLSAgIHdlCi0gICAgdXBkYXRlIHRoZSBjaGFubmVsLCBhbmQgY3JlYXRlIGEgbmV3IHdhdGNoZXIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZDsKLSAgZ3JwY19jbG9zdXJlIG9uX2NoYW5nZWQ7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0YXRlOwotICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5OwotfSBsYl9wb2xpY3lfY29ubmVjdGl2aXR5X3dhdGNoZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jbG9zdXJlIGNsb3N1cmU7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtOwotfSB3YWl0aW5nX2NhbGw7Ci0KLXN0YXRpYyBjaGFyICpjY19nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKLSAgcmV0dXJuIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9nZXRfcGVlcihleGVjX2N0eCwgZWxlbS0+Y2FsbF9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgY2Nfc3RhcnRfdHJhbnNwb3J0X3N0cmVhbV9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgR1JQQ19DQUxMX0xPR19PUChHUFJfSU5GTywgZWxlbSwgb3ApOwotICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcChleGVjX2N0eCwgZWxlbS0+Y2FsbF9kYXRhLCBvcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhdGNoX2xiX3BvbGljeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY2hhbm5lbF9kYXRhICpjaGFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGN1cnJlbnRfc3RhdGUpOwotCi1zdGF0aWMgdm9pZCBvbl9sYl9wb2xpY3lfc3RhdGVfY2hhbmdlZF9sb2NrZWQoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGxiX3BvbGljeV9jb25uZWN0aXZpdHlfd2F0Y2hlciAqdykgewotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBwdWJsaXNoX3N0YXRlID0gdy0+c3RhdGU7Ci0gIC8qIGNoZWNrIGlmIHRoZSBub3RpZmljYXRpb24gaXMgZm9yIGEgc3RhbGUgcG9saWN5ICovCi0gIGlmICh3LT5sYl9wb2xpY3kgIT0gdy0+Y2hhbmQtPmxiX3BvbGljeSkgcmV0dXJuOwotCi0gIGlmIChwdWJsaXNoX3N0YXRlID09IEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFICYmCi0gICAgICB3LT5jaGFuZC0+cmVzb2x2ZXIgIT0gTlVMTCkgewotICAgIHB1Ymxpc2hfc3RhdGUgPSBHUlBDX0NIQU5ORUxfVFJBTlNJRU5UX0ZBSUxVUkU7Ci0gICAgZ3JwY19yZXNvbHZlcl9jaGFubmVsX3Nhd19lcnJvcihleGVjX2N0eCwgdy0+Y2hhbmQtPnJlc29sdmVyKTsKLSAgICBHUlBDX0xCX1BPTElDWV9VTlJFRihleGVjX2N0eCwgdy0+Y2hhbmQtPmxiX3BvbGljeSwgImNoYW5uZWwiKTsKLSAgICB3LT5jaGFuZC0+bGJfcG9saWN5ID0gTlVMTDsKLSAgfQotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZ3LT5jaGFuZC0+c3RhdGVfdHJhY2tlciwgcHVibGlzaF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYl9jaGFuZ2VkIik7Ci0gIGlmICh3LT5zdGF0ZSAhPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSkgewotICAgIHdhdGNoX2xiX3BvbGljeShleGVjX2N0eCwgdy0+Y2hhbmQsIHctPmxiX3BvbGljeSwgdy0+c3RhdGUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2xiX3BvbGljeV9zdGF0ZV9jaGFuZ2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKLSAgbGJfcG9saWN5X2Nvbm5lY3Rpdml0eV93YXRjaGVyICp3ID0gYXJnOwotCi0gIGdwcl9tdV9sb2NrKCZ3LT5jaGFuZC0+bXVfY29uZmlnKTsKLSAgb25fbGJfcG9saWN5X3N0YXRlX2NoYW5nZWRfbG9ja2VkKGV4ZWNfY3R4LCB3KTsKLSAgZ3ByX211X3VubG9jaygmdy0+Y2hhbmQtPm11X2NvbmZpZyk7Ci0KLSAgR1JQQ19DSEFOTkVMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCB3LT5jaGFuZC0+b3duaW5nX3N0YWNrLCAid2F0Y2hfbGJfcG9saWN5Iik7Ci0gIGdwcl9mcmVlKHcpOwotfQotCi1zdGF0aWMgdm9pZCB3YXRjaF9sYl9wb2xpY3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGNoYW5uZWxfZGF0YSAqY2hhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBjdXJyZW50X3N0YXRlKSB7Ci0gIGxiX3BvbGljeV9jb25uZWN0aXZpdHlfd2F0Y2hlciAqdyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp3KSk7Ci0gIEdSUENfQ0hBTk5FTF9TVEFDS19SRUYoY2hhbmQtPm93bmluZ19zdGFjaywgIndhdGNoX2xiX3BvbGljeSIpOwotCi0gIHctPmNoYW5kID0gY2hhbmQ7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZ3LT5vbl9jaGFuZ2VkLCBvbl9sYl9wb2xpY3lfc3RhdGVfY2hhbmdlZCwgdyk7Ci0gIHctPnN0YXRlID0gY3VycmVudF9zdGF0ZTsKLSAgdy0+bGJfcG9saWN5ID0gbGJfcG9saWN5OwotICBncnBjX2xiX3BvbGljeV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKGV4ZWNfY3R4LCBsYl9wb2xpY3ksICZ3LT5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdy0+b25fY2hhbmdlZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNjX29uX2NvbmZpZ19jaGFuZ2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGFyZzsKLSAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeSA9IE5VTEw7Ci0gIGdycGNfbGJfcG9saWN5ICpvbGRfbGJfcG9saWN5OwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdGF0ZSA9IEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRTsKLSAgaW50IGV4aXRfaWRsZSA9IDA7Ci0KLSAgaWYgKGNoYW5kLT5pbmNvbWluZ19jb25maWd1cmF0aW9uICE9IE5VTEwpIHsKLSAgICBsYl9wb2xpY3kgPSBncnBjX2NsaWVudF9jb25maWdfZ2V0X2xiX3BvbGljeShjaGFuZC0+aW5jb21pbmdfY29uZmlndXJhdGlvbik7Ci0gICAgaWYgKGxiX3BvbGljeSAhPSBOVUxMKSB7Ci0gICAgICBHUlBDX0xCX1BPTElDWV9SRUYobGJfcG9saWN5LCAiY2hhbm5lbCIpOwotICAgICAgR1JQQ19MQl9QT0xJQ1lfUkVGKGxiX3BvbGljeSwgImNvbmZpZ19jaGFuZ2UiKTsKLSAgICAgIHN0YXRlID0gZ3JwY19sYl9wb2xpY3lfY2hlY2tfY29ubmVjdGl2aXR5KGV4ZWNfY3R4LCBsYl9wb2xpY3kpOwotICAgIH0KLQotICAgIGdycGNfY2xpZW50X2NvbmZpZ191bnJlZihleGVjX2N0eCwgY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24pOwotICB9Ci0KLSAgY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24gPSBOVUxMOwotCi0gIGlmIChsYl9wb2xpY3kgIT0gTlVMTCkgewotICAgIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXRfc2V0KGV4ZWNfY3R4LCBsYl9wb2xpY3ktPmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZC0+aW50ZXJlc3RlZF9wYXJ0aWVzKTsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgb2xkX2xiX3BvbGljeSA9IGNoYW5kLT5sYl9wb2xpY3k7Ci0gIGNoYW5kLT5sYl9wb2xpY3kgPSBsYl9wb2xpY3k7Ci0gIGlmIChsYl9wb2xpY3kgIT0gTlVMTCB8fCBjaGFuZC0+cmVzb2x2ZXIgPT0gTlVMTCAvKiBkaXNjb25uZWN0ZWQgKi8pIHsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChleGVjX2N0eCwgJmNoYW5kLT53YWl0aW5nX2Zvcl9jb25maWdfY2xvc3VyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIH0KLSAgaWYgKGxiX3BvbGljeSAhPSBOVUxMICYmIGNoYW5kLT5leGl0X2lkbGVfd2hlbl9sYl9wb2xpY3lfYXJyaXZlcykgewotICAgIEdSUENfTEJfUE9MSUNZX1JFRihsYl9wb2xpY3ksICJleGl0X2lkbGUiKTsKLSAgICBleGl0X2lkbGUgPSAxOwotICAgIGNoYW5kLT5leGl0X2lkbGVfd2hlbl9sYl9wb2xpY3lfYXJyaXZlcyA9IDA7Ci0gIH0KLQotICBpZiAoaW9tZ3Jfc3VjY2VzcyAmJiBjaGFuZC0+cmVzb2x2ZXIpIHsKLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZjaGFuZC0+c3RhdGVfdHJhY2tlciwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdfbGIrcmVzb2x2ZXIiKTsKLSAgICBpZiAobGJfcG9saWN5ICE9IE5VTEwpIHsKLSAgICAgIHdhdGNoX2xiX3BvbGljeShleGVjX2N0eCwgY2hhbmQsIGxiX3BvbGljeSwgc3RhdGUpOwotICAgIH0KLSAgICBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKGNoYW5kLT5vd25pbmdfc3RhY2ssICJyZXNvbHZlciIpOwotICAgIGdycGNfcmVzb2x2ZXJfbmV4dChleGVjX2N0eCwgY2hhbmQtPnJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAmY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+b25fY29uZmlnX2NoYW5nZWQpOwotICAgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOwotICB9IGVsc2UgewotICAgIGlmIChjaGFuZC0+cmVzb2x2ZXIgIT0gTlVMTCkgewotICAgICAgZ3JwY19yZXNvbHZlcl9zaHV0ZG93bihleGVjX2N0eCwgY2hhbmQtPnJlc29sdmVyKTsKLSAgICAgIEdSUENfUkVTT0xWRVJfVU5SRUYoZXhlY19jdHgsIGNoYW5kLT5yZXNvbHZlciwgImNoYW5uZWwiKTsKLSAgICAgIGNoYW5kLT5yZXNvbHZlciA9IE5VTEw7Ci0gICAgfQotICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJmNoYW5kLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSwgInJlc29sdmVyX2dvbmUiKTsKLSAgICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgfQotCi0gIGlmIChleGl0X2lkbGUpIHsKLSAgICBncnBjX2xiX3BvbGljeV9leGl0X2lkbGUoZXhlY19jdHgsIGxiX3BvbGljeSk7Ci0gICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGxiX3BvbGljeSwgImV4aXRfaWRsZSIpOwotICB9Ci0KLSAgaWYgKG9sZF9sYl9wb2xpY3kgIT0gTlVMTCkgewotICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KAotICAgICAgICBleGVjX2N0eCwgb2xkX2xiX3BvbGljeS0+aW50ZXJlc3RlZF9wYXJ0aWVzLCBjaGFuZC0+aW50ZXJlc3RlZF9wYXJ0aWVzKTsKLSAgICBHUlBDX0xCX1BPTElDWV9VTlJFRihleGVjX2N0eCwgb2xkX2xiX3BvbGljeSwgImNoYW5uZWwiKTsKLSAgfQotCi0gIGlmIChsYl9wb2xpY3kgIT0gTlVMTCkgewotICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBsYl9wb2xpY3ksICJjb25maWdfY2hhbmdlIik7Ci0gIH0KLQotICBHUlBDX0NIQU5ORUxfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIGNoYW5kLT5vd25pbmdfc3RhY2ssICJyZXNvbHZlciIpOwotfQotCi1zdGF0aWMgdm9pZCBjY19zdGFydF90cmFuc3BvcnRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKSB7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0KLSAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBvcC0+b25fY29uc3VtZWQsIHRydWUsIE5VTEwpOwotCi0gIEdQUl9BU1NFUlQob3AtPnNldF9hY2NlcHRfc3RyZWFtID09IGZhbHNlKTsKLSAgaWYgKG9wLT5iaW5kX3BvbGxzZXQgIT0gTlVMTCkgewotICAgIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXQoZXhlY19jdHgsIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+YmluZF9wb2xsc2V0KTsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgaWYgKG9wLT5vbl9jb25uZWN0aXZpdHlfc3RhdGVfY2hhbmdlICE9IE5VTEwpIHsKLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgICAgICBleGVjX2N0eCwgJmNoYW5kLT5zdGF0ZV90cmFja2VyLCBvcC0+Y29ubmVjdGl2aXR5X3N0YXRlLAotICAgICAgICBvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSk7Ci0gICAgb3AtPm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UgPSBOVUxMOwotICAgIG9wLT5jb25uZWN0aXZpdHlfc3RhdGUgPSBOVUxMOwotICB9Ci0KLSAgaWYgKG9wLT5zZW5kX3BpbmcgIT0gTlVMTCkgewotICAgIGlmIChjaGFuZC0+bGJfcG9saWN5ID09IE5VTEwpIHsKLSAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb3AtPnNlbmRfcGluZywgZmFsc2UsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX2xiX3BvbGljeV9waW5nX29uZShleGVjX2N0eCwgY2hhbmQtPmxiX3BvbGljeSwgb3AtPnNlbmRfcGluZyk7Ci0gICAgICBvcC0+YmluZF9wb2xsc2V0ID0gTlVMTDsKLSAgICB9Ci0gICAgb3AtPnNlbmRfcGluZyA9IE5VTEw7Ci0gIH0KLQotICBpZiAob3AtPmRpc2Nvbm5lY3QgJiYgY2hhbmQtPnJlc29sdmVyICE9IE5VTEwpIHsKLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZjaGFuZC0+c3RhdGVfdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUsICJkaXNjb25uZWN0Iik7Ci0gICAgZ3JwY19yZXNvbHZlcl9zaHV0ZG93bihleGVjX2N0eCwgY2hhbmQtPnJlc29sdmVyKTsKLSAgICBHUlBDX1JFU09MVkVSX1VOUkVGKGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIsICJjaGFubmVsIik7Ci0gICAgY2hhbmQtPnJlc29sdmVyID0gTlVMTDsKLSAgICBpZiAoY2hhbmQtPmxiX3BvbGljeSAhPSBOVUxMKSB7Ci0gICAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0X3NldChleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5sYl9wb2xpY3ktPmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMpOwotICAgICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGNoYW5kLT5sYl9wb2xpY3ksICJjaGFubmVsIik7Ci0gICAgICBjaGFuZC0+bGJfcG9saWN5ID0gTlVMTDsKLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmY2hhbmQtPm11X2NvbmZpZyk7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqaW5pdGlhbF9tZXRhZGF0YTsKLSAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKmNvbm5lY3RlZF9zdWJjaGFubmVsOwotICBncnBjX2Nsb3N1cmUgKm9uX3JlYWR5OwotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbTsKLSAgZ3JwY19jbG9zdXJlIGNsb3N1cmU7Ci19IGNvbnRpbnVlX3BpY2tpbmdfYXJnczsKLQotc3RhdGljIGludCBjY19waWNrX3N1YmNoYW5uZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmluaXRpYWxfbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqY29ubmVjdGVkX3N1YmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX3JlYWR5KTsKLQotc3RhdGljIHZvaWQgY29udGludWVfcGlja2luZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKLSAgY29udGludWVfcGlja2luZ19hcmdzICpjcGEgPSBhcmc7Ci0gIGlmICghc3VjY2VzcykgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY3BhLT5vbl9yZWFkeSwgZmFsc2UsIE5VTEwpOwotICB9IGVsc2UgaWYgKGNwYS0+Y29ubmVjdGVkX3N1YmNoYW5uZWwgPT0gTlVMTCkgewotICAgIC8qIGNhbmNlbGxlZCwgZG8gbm90aGluZyAqLwotICB9IGVsc2UgaWYgKGNjX3BpY2tfc3ViY2hhbm5lbChleGVjX2N0eCwgY3BhLT5lbGVtLCBjcGEtPmluaXRpYWxfbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwYS0+Y29ubmVjdGVkX3N1YmNoYW5uZWwsIGNwYS0+b25fcmVhZHkpKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjcGEtPm9uX3JlYWR5LCB0cnVlLCBOVUxMKTsKLSAgfQotICBncHJfZnJlZShjcGEpOwotfQotCi1zdGF0aWMgaW50IGNjX3BpY2tfc3ViY2hhbm5lbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZWxlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKmNvbm5lY3RlZF9zdWJjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9yZWFkeSkgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IGVsZW1wOwotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjb250aW51ZV9waWNraW5nX2FyZ3MgKmNwYTsKLSAgZ3JwY19jbG9zdXJlICpjbG9zdXJlOwotCi0gIEdQUl9BU1NFUlQoY29ubmVjdGVkX3N1YmNoYW5uZWwpOwotCi0gIGdwcl9tdV9sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgaWYgKGluaXRpYWxfbWV0YWRhdGEgPT0gTlVMTCkgewotICAgIGlmIChjaGFuZC0+bGJfcG9saWN5ICE9IE5VTEwpIHsKLSAgICAgIGdycGNfbGJfcG9saWN5X2NhbmNlbF9waWNrKGV4ZWNfY3R4LCBjaGFuZC0+bGJfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkX3N1YmNoYW5uZWwpOwotICAgIH0KLSAgICBmb3IgKGNsb3N1cmUgPSBjaGFuZC0+d2FpdGluZ19mb3JfY29uZmlnX2Nsb3N1cmVzLmhlYWQ7IGNsb3N1cmUgIT0gTlVMTDsKLSAgICAgICAgIGNsb3N1cmUgPSBncnBjX2Nsb3N1cmVfbmV4dChjbG9zdXJlKSkgewotICAgICAgY3BhID0gY2xvc3VyZS0+Y2JfYXJnOwotICAgICAgaWYgKGNwYS0+Y29ubmVjdGVkX3N1YmNoYW5uZWwgPT0gY29ubmVjdGVkX3N1YmNoYW5uZWwpIHsKLSAgICAgICAgY3BhLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCA9IE5VTEw7Ci0gICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY3BhLT5vbl9yZWFkeSwgZmFsc2UsIE5VTEwpOwotICAgICAgfQotICAgIH0KLSAgICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAoY2hhbmQtPmxiX3BvbGljeSAhPSBOVUxMKSB7Ci0gICAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeSA9IGNoYW5kLT5sYl9wb2xpY3k7Ci0gICAgaW50IHI7Ci0gICAgR1JQQ19MQl9QT0xJQ1lfUkVGKGxiX3BvbGljeSwgImNjX3BpY2tfc3ViY2hhbm5lbCIpOwotICAgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOwotICAgIHIgPSBncnBjX2xiX3BvbGljeV9waWNrKGV4ZWNfY3R4LCBsYl9wb2xpY3ksIGNhbGxkLT5wb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfbWV0YWRhdGEsIGNvbm5lY3RlZF9zdWJjaGFubmVsLCBvbl9yZWFkeSk7Ci0gICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGxiX3BvbGljeSwgImNjX3BpY2tfc3ViY2hhbm5lbCIpOwotICAgIHJldHVybiByOwotICB9Ci0gIGlmIChjaGFuZC0+cmVzb2x2ZXIgIT0gTlVMTCAmJiAhY2hhbmQtPnN0YXJ0ZWRfcmVzb2x2aW5nKSB7Ci0gICAgY2hhbmQtPnN0YXJ0ZWRfcmVzb2x2aW5nID0gMTsKLSAgICBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKGNoYW5kLT5vd25pbmdfc3RhY2ssICJyZXNvbHZlciIpOwotICAgIGdycGNfcmVzb2x2ZXJfbmV4dChleGVjX2N0eCwgY2hhbmQtPnJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAmY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+b25fY29uZmlnX2NoYW5nZWQpOwotICB9Ci0gIGNwYSA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjcGEpKTsKLSAgY3BhLT5pbml0aWFsX21ldGFkYXRhID0gaW5pdGlhbF9tZXRhZGF0YTsKLSAgY3BhLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCA9IGNvbm5lY3RlZF9zdWJjaGFubmVsOwotICBjcGEtPm9uX3JlYWR5ID0gb25fcmVhZHk7Ci0gIGNwYS0+ZWxlbSA9IGVsZW07Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZjcGEtPmNsb3N1cmUsIGNvbnRpbnVlX3BpY2tpbmcsIGNwYSk7Ci0gIGdycGNfY2xvc3VyZV9saXN0X2FkZCgmY2hhbmQtPndhaXRpbmdfZm9yX2NvbmZpZ19jbG9zdXJlcywgJmNwYS0+Y2xvc3VyZSwgMSk7Ci0gIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOwotICByZXR1cm4gMDsKLX0KLQotLyogQ29uc3RydWN0b3IgZm9yIGNhbGxfZGF0YSAqLwotc3RhdGljIHZvaWQgaW5pdF9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncykgewotICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfaW5pdChlbGVtLT5jYWxsX2RhdGEsIGNjX3BpY2tfc3ViY2hhbm5lbCwgZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+Y2FsbF9zdGFjayk7Ci19Ci0KLS8qIERlc3RydWN0b3IgZm9yIGNhbGxfZGF0YSAqLwotc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgewotICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfZGVzdHJveShleGVjX2N0eCwgZWxlbS0+Y2FsbF9kYXRhKTsKLX0KLQotLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLwotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLQotICBtZW1zZXQoY2hhbmQsIDAsIHNpemVvZigqY2hhbmQpKTsKLQotICBHUFJfQVNTRVJUKGFyZ3MtPmlzX2xhc3QpOwotICBHUFJfQVNTRVJUKGVsZW0tPmZpbHRlciA9PSAmZ3JwY19jbGllbnRfY2hhbm5lbF9maWx0ZXIpOwotCi0gIGdwcl9tdV9pbml0KCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmNoYW5kLT5vbl9jb25maWdfY2hhbmdlZCwgY2Nfb25fY29uZmlnX2NoYW5nZWQsIGNoYW5kKTsKLSAgY2hhbmQtPm93bmluZ19zdGFjayA9IGFyZ3MtPmNoYW5uZWxfc3RhY2s7Ci0KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfaW5pdCgmY2hhbmQtPnN0YXRlX3RyYWNrZXIsIEdSUENfQ0hBTk5FTF9JRExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRfY2hhbm5lbCIpOwotICBjaGFuZC0+aW50ZXJlc3RlZF9wYXJ0aWVzID0gZ3JwY19wb2xsc2V0X3NldF9jcmVhdGUoKTsKLX0KLQotLyogRGVzdHJ1Y3RvciBmb3IgY2hhbm5lbF9kYXRhICovCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0KLSAgaWYgKGNoYW5kLT5yZXNvbHZlciAhPSBOVUxMKSB7Ci0gICAgZ3JwY19yZXNvbHZlcl9zaHV0ZG93bihleGVjX2N0eCwgY2hhbmQtPnJlc29sdmVyKTsKLSAgICBHUlBDX1JFU09MVkVSX1VOUkVGKGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIsICJjaGFubmVsIik7Ci0gIH0KLSAgaWYgKGNoYW5kLT5sYl9wb2xpY3kgIT0gTlVMTCkgewotICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KGV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5sYl9wb2xpY3ktPmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZC0+aW50ZXJlc3RlZF9wYXJ0aWVzKTsKLSAgICBHUlBDX0xCX1BPTElDWV9VTlJFRihleGVjX2N0eCwgY2hhbmQtPmxiX3BvbGljeSwgImNoYW5uZWwiKTsKLSAgfQotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGV4ZWNfY3R4LCAmY2hhbmQtPnN0YXRlX3RyYWNrZXIpOwotICBncnBjX3BvbGxzZXRfc2V0X2Rlc3Ryb3koY2hhbmQtPmludGVyZXN0ZWRfcGFydGllcyk7Ci0gIGdwcl9tdV9kZXN0cm95KCZjaGFuZC0+bXVfY29uZmlnKTsKLX0KLQotc3RhdGljIHZvaWQgY2Nfc2V0X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNhbGxkLT5wb2xsc2V0ID0gcG9sbHNldDsKLX0KLQotY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlciA9IHsKLSAgICBjY19zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wLAotICAgIGNjX3N0YXJ0X3RyYW5zcG9ydF9vcCwKLSAgICBzaXplb2YoY2FsbF9kYXRhKSwKLSAgICBpbml0X2NhbGxfZWxlbSwKLSAgICBjY19zZXRfcG9sbHNldCwKLSAgICBkZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKLSAgICBpbml0X2NoYW5uZWxfZWxlbSwKLSAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKLSAgICBjY19nZXRfcGVlciwKLSAgICAiY2xpZW50LWNoYW5uZWwiLAotfTsKLQotdm9pZCBncnBjX2NsaWVudF9jaGFubmVsX3NldF9yZXNvbHZlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgewotICAvKiBwb3N0IGNvbnN0cnVjdGlvbiBpbml0aWFsaXphdGlvbjogc2V0IHRoZSB0cmFuc3BvcnQgc2V0dXAgcG9pbnRlciAqLwotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSA9IGdycGNfY2hhbm5lbF9zdGFja19sYXN0X2VsZW1lbnQoY2hhbm5lbF9zdGFjayk7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGdwcl9tdV9sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLSAgR1BSX0FTU0VSVCghY2hhbmQtPnJlc29sdmVyKTsKLSAgY2hhbmQtPnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gIEdSUENfUkVTT0xWRVJfUkVGKHJlc29sdmVyLCAiY2hhbm5lbCIpOwotICBpZiAoIWdycGNfY2xvc3VyZV9saXN0X2VtcHR5KGNoYW5kLT53YWl0aW5nX2Zvcl9jb25maWdfY2xvc3VyZXMpIHx8Ci0gICAgICBjaGFuZC0+ZXhpdF9pZGxlX3doZW5fbGJfcG9saWN5X2Fycml2ZXMpIHsKLSAgICBjaGFuZC0+c3RhcnRlZF9yZXNvbHZpbmcgPSAxOwotICAgIEdSUENfQ0hBTk5FTF9TVEFDS19SRUYoY2hhbmQtPm93bmluZ19zdGFjaywgInJlc29sdmVyIik7Ci0gICAgZ3JwY19yZXNvbHZlcl9uZXh0KGV4ZWNfY3R4LCByZXNvbHZlciwgJmNoYW5kLT5pbmNvbWluZ19jb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAmY2hhbmQtPm9uX2NvbmZpZ19jaGFuZ2VkKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLX0KLQotZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19jbGllbnRfY2hhbm5lbF9jaGVja19jb25uZWN0aXZpdHlfc3RhdGUoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLCBpbnQgdHJ5X3RvX2Nvbm5lY3QpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgb3V0OwotICBncHJfbXVfbG9jaygmY2hhbmQtPm11X2NvbmZpZyk7Ci0gIG91dCA9IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2NoZWNrKCZjaGFuZC0+c3RhdGVfdHJhY2tlcik7Ci0gIGlmIChvdXQgPT0gR1JQQ19DSEFOTkVMX0lETEUgJiYgdHJ5X3RvX2Nvbm5lY3QpIHsKLSAgICBpZiAoY2hhbmQtPmxiX3BvbGljeSAhPSBOVUxMKSB7Ci0gICAgICBncnBjX2xiX3BvbGljeV9leGl0X2lkbGUoZXhlY19jdHgsIGNoYW5kLT5sYl9wb2xpY3kpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjaGFuZC0+ZXhpdF9pZGxlX3doZW5fbGJfcG9saWN5X2Fycml2ZXMgPSAxOwotICAgICAgaWYgKCFjaGFuZC0+c3RhcnRlZF9yZXNvbHZpbmcgJiYgY2hhbmQtPnJlc29sdmVyICE9IE5VTEwpIHsKLSAgICAgICAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihjaGFuZC0+b3duaW5nX3N0YWNrLCAicmVzb2x2ZXIiKTsKLSAgICAgICAgY2hhbmQtPnN0YXJ0ZWRfcmVzb2x2aW5nID0gMTsKLSAgICAgICAgZ3JwY19yZXNvbHZlcl9uZXh0KGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbmQtPm9uX2NvbmZpZ19jaGFuZ2VkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmY2hhbmQtPm11X2NvbmZpZyk7Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZDsKLSAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OwotICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlOwotICBncnBjX2Nsb3N1cmUgbXlfY2xvc3VyZTsKLX0gZXh0ZXJuYWxfY29ubmVjdGl2aXR5X3dhdGNoZXI7Ci0KLXN0YXRpYyB2b2lkIG9uX2V4dGVybmFsX3dhdGNoX2NvbXBsZXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKLSAgZXh0ZXJuYWxfY29ubmVjdGl2aXR5X3dhdGNoZXIgKncgPSBhcmc7Ci0gIGdycGNfY2xvc3VyZSAqZm9sbG93X3VwID0gdy0+b25fY29tcGxldGU7Ci0gIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXQoZXhlY19jdHgsIHctPmNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+cG9sbHNldCk7Ci0gIEdSUENfQ0hBTk5FTF9TVEFDS19VTlJFRihleGVjX2N0eCwgdy0+Y2hhbmQtPm93bmluZ19zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlcm5hbF9jb25uZWN0aXZpdHlfd2F0Y2hlciIpOwotICBncHJfZnJlZSh3KTsKLSAgZm9sbG93X3VwLT5jYihleGVjX2N0eCwgZm9sbG93X3VwLT5jYl9hcmcsIGlvbWdyX3N1Y2Nlc3MpOwotfQotCi12b2lkIGdycGNfY2xpZW50X2NoYW5uZWxfd2F0Y2hfY29ubmVjdGl2aXR5X3N0YXRlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpzdGF0ZSwgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSkgewotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBleHRlcm5hbF9jb25uZWN0aXZpdHlfd2F0Y2hlciAqdyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp3KSk7Ci0gIHctPmNoYW5kID0gY2hhbmQ7Ci0gIHctPnBvbGxzZXQgPSBwb2xsc2V0OwotICB3LT5vbl9jb21wbGV0ZSA9IG9uX2NvbXBsZXRlOwotICBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGV4ZWNfY3R4LCBjaGFuZC0+aW50ZXJlc3RlZF9wYXJ0aWVzLCBwb2xsc2V0KTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnctPm15X2Nsb3N1cmUsIG9uX2V4dGVybmFsX3dhdGNoX2NvbXBsZXRlLCB3KTsKLSAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRih3LT5jaGFuZC0+b3duaW5nX3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlcm5hbF9jb25uZWN0aXZpdHlfd2F0Y2hlciIpOwotICBncHJfbXVfbG9jaygmY2hhbmQtPm11X2NvbmZpZyk7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCi0gICAgICBleGVjX2N0eCwgJmNoYW5kLT5zdGF0ZV90cmFja2VyLCBzdGF0ZSwgJnctPm15X2Nsb3N1cmUpOwotICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCBiL3NyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyZjdmOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DSEFOTkVMX0NMSUVOVF9DSEFOTkVMX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NIQU5ORUxfQ0xJRU5UX0NIQU5ORUxfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIgotCi0vKiBBIGNsaWVudCBjaGFubmVsIGlzIGEgY2hhbm5lbCB0aGF0IGJlZ2lucyBkaXNjb25uZWN0ZWQsIGFuZCBjYW4gY29ubmVjdAotICAgdG8gc29tZSBlbmRwb2ludCBvbiBkZW1hbmQuIElmIHRoYXQgZW5kcG9pbnQgZGlzY29ubmVjdHMsIGl0IHdpbGwgYmUKLSAgIGNvbm5lY3RlZCB0byBhZ2FpbiBsYXRlci4KLQotICAgQ2FsbHMgb24gYSBkaXNjb25uZWN0ZWQgY2xpZW50IGNoYW5uZWwgYXJlIHF1ZXVlZCB1bnRpbCBhIGNvbm5lY3Rpb24gaXMKLSAgIGVzdGFibGlzaGVkLiAqLwotCi1leHRlcm4gY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlcjsKLQotLyogcG9zdC1jb25zdHJ1Y3Rpb24gaW5pdGlhbGl6ZXIgdG8gbGV0IHRoZSBjbGllbnQgY2hhbm5lbCBrbm93IHdoaWNoCi0gICB0cmFuc3BvcnQgc2V0dXAgaXQgc2hvdWxkIGNhbmNlbCB1cG9uIGRlc3RydWN0aW9uLCBvciBpbml0aWF0ZSB3aGVuIGl0IG5lZWRzCi0gICBhIGNvbm5lY3Rpb24gKi8KLXZvaWQgZ3JwY19jbGllbnRfY2hhbm5lbF9zZXRfcmVzb2x2ZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpOwotCi1ncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBncnBjX2NsaWVudF9jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sIGludCB0cnlfdG9fY29ubmVjdCk7Ci0KLXZvaWQgZ3JwY19jbGllbnRfY2hhbm5lbF93YXRjaF9jb25uZWN0aXZpdHlfc3RhdGUoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DSEFOTkVMX0NMSUVOVF9DSEFOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMgYi9zcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjVhOTc0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9jb21wcmVzc2lvbi5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgY2FsbF9kYXRhIHsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBzbGljZXM7IC8qKjwgQnVmZmVycyB1cCBpbnB1dCBzbGljZXMgdG8gYmUgY29tcHJlc3NlZCAqLwotICBncnBjX2xpbmtlZF9tZGVsZW0gY29tcHJlc3Npb25fYWxnb3JpdGhtX3N0b3JhZ2U7Ci0gIGdycGNfbGlua2VkX21kZWxlbSBhY2NlcHRfZW5jb2Rpbmdfc3RvcmFnZTsKLSAgdWludDMyX3QgcmVtYWluaW5nX3NsaWNlX2J5dGVzOwotICAvKiogQ29tcHJlc3Npb24gYWxnb3JpdGhtIHdlJ2xsIHRyeSB0byB1c2UuIEl0IG1heSBiZSBnaXZlbiBieSBpbmNvbWluZwotICAgKiBtZXRhZGF0YSwgb3IgYnkgdGhlIGNoYW5uZWwncyBkZWZhdWx0IGNvbXByZXNzaW9uIHNldHRpbmdzLiAqLwotICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBjb21wcmVzc2lvbl9hbGdvcml0aG07Ci0gIC8qKiBJZiB0cnVlLCBjb250ZW50cyBvZiBcYSBjb21wcmVzc2lvbl9hbGdvcml0aG0gYXJlIGF1dGhvcml0YXRpdmUgKi8KLSAgaW50IGhhc19jb21wcmVzc2lvbl9hbGdvcml0aG07Ci0KLSAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIHNlbmRfb3A7Ci0gIHVpbnQzMl90IHNlbmRfbGVuZ3RoOwotICB1aW50MzJfdCBzZW5kX2ZsYWdzOwotICBncHJfc2xpY2UgaW5jb21pbmdfc2xpY2U7Ci0gIGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbSByZXBsYWNlbWVudF9zdHJlYW07Ci0gIGdycGNfY2xvc3VyZSAqcG9zdF9zZW5kOwotICBncnBjX2Nsb3N1cmUgc2VuZF9kb25lOwotICBncnBjX2Nsb3N1cmUgZ290X3NsaWNlOwotfSBjYWxsX2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IGNoYW5uZWxfZGF0YSB7Ci0gIC8qKiBUaGUgZGVmYXVsdCwgY2hhbm5lbC1sZXZlbCwgY29tcHJlc3Npb24gYWxnb3JpdGhtICovCi0gIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtOwotICAvKiogQ29tcHJlc3Npb24gb3B0aW9ucyBmb3IgdGhlIGNoYW5uZWwgKi8KLSAgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zIGNvbXByZXNzaW9uX29wdGlvbnM7Ci0gIC8qKiBTdXBwb3J0ZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtcyAqLwotICB1aW50MzJfdCBzdXBwb3J0ZWRfY29tcHJlc3Npb25fYWxnb3JpdGhtczsKLX0gY2hhbm5lbF9kYXRhOwotCi0vKiogRm9yIGVhY2ggXGEgbWQgZWxlbWVudCBmcm9tIHRoZSBpbmNvbWluZyBtZXRhZGF0YSwgZmlsdGVyIG91dCB0aGUgZW50cnkgZm9yCi0gKiAiZ3JwYy1lbmNvZGluZyIsIHVzaW5nIGl0cyB2YWx1ZSB0byBwb3B1bGF0ZSB0aGUgY2FsbCBkYXRhJ3MKLSAqIGNvbXByZXNzaW9uX2FsZ29yaXRobSBmaWVsZC4gKi8KLXN0YXRpYyBncnBjX21kZWxlbSAqY29tcHJlc3Npb25fbWRfZmlsdGVyKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gdXNlcl9kYXRhOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotCi0gIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19JTlRFUk5BTF9FTkNPRElOR19SRVFVRVNUKSB7Ci0gICAgY29uc3QgY2hhciAqbWRfY19zdHIgPSBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKG1kLT52YWx1ZSk7Ci0gICAgaWYgKCFncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9wYXJzZShtZF9jX3N0ciwgc3RybGVuKG1kX2Nfc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtKSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgICAgICJJbnZhbGlkIGNvbXByZXNzaW9uIGFsZ29yaXRobTogJyVzJyAodW5rbm93bikuIElnbm9yaW5nLiIsCi0gICAgICAgICAgICAgIG1kX2Nfc3RyKTsKLSAgICAgIGNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBHUlBDX0NPTVBSRVNTX05PTkU7Ci0gICAgfQotICAgIGlmIChncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfaXNfYWxnb3JpdGhtX2VuYWJsZWQoCi0gICAgICAgICAgICAmY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMsIGNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG0pID09Ci0gICAgICAgIDApIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgICAiSW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG06ICclcycgKHByZXZpb3VzbHkgZGlzYWJsZWQpLiAiCi0gICAgICAgICAgICAgICJJZ25vcmluZy4iLAotICAgICAgICAgICAgICBtZF9jX3N0cik7Ci0gICAgICBjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtID0gR1JQQ19DT01QUkVTU19OT05FOwotICAgIH0KLSAgICBjYWxsZC0+aGFzX2NvbXByZXNzaW9uX2FsZ29yaXRobSA9IDE7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gbWQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2tpcF9jb21wcmVzc2lvbihncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBpZiAoY2FsbGQtPmhhc19jb21wcmVzc2lvbl9hbGdvcml0aG0pIHsKLSAgICBpZiAoY2FsbGQtPmNvbXByZXNzaW9uX2FsZ29yaXRobSA9PSBHUlBDX0NPTVBSRVNTX05PTkUpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsgLyogd2UgaGF2ZSBhbiBhY3R1YWwgY2FsbC1zcGVjaWZpYyBhbGdvcml0aG0gKi8KLSAgfQotICAvKiBubyBwZXItY2FsbCBjb21wcmVzc2lvbiBvdmVycmlkZSAqLwotICByZXR1cm4gY2hhbm5lbGQtPmRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtID09IEdSUENfQ09NUFJFU1NfTk9ORTsKLX0KLQotLyoqIEZpbHRlciBpbml0aWFsIG1ldGFkYXRhICovCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NlbmRfaW5pdGlhbF9tZXRhZGF0YSgKLSAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwgZ3JwY19tZXRhZGF0YV9iYXRjaCAqaW5pdGlhbF9tZXRhZGF0YSkgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICAvKiBQYXJzZSBpbmNvbWluZyByZXF1ZXN0IGZvciBjb21wcmVzc2lvbi4gSWYgYW55LCBpdCdsbCBiZSBhdmFpbGFibGUKLSAgICogYXQgY2FsbGQtPmNvbXByZXNzaW9uX2FsZ29yaXRobSAqLwotICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihpbml0aWFsX21ldGFkYXRhLCBjb21wcmVzc2lvbl9tZF9maWx0ZXIsIGVsZW0pOwotICBpZiAoIWNhbGxkLT5oYXNfY29tcHJlc3Npb25fYWxnb3JpdGhtKSB7Ci0gICAgLyogSWYgbm8gYWxnb3JpdGhtIHdhcyBmb3VuZCBpbiB0aGUgbWV0YWRhdGEgYW5kIHdlIGFyZW4ndAotICAgICAqIGV4Y2VwdGlvbmFsbHkgc2tpcHBpbmcgY29tcHJlc3Npb24sIGZhbGwgYmFjayB0byB0aGUgY2hhbm5lbAotICAgICAqIGRlZmF1bHQgKi8KLSAgICBjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtID0gY2hhbm5lbGQtPmRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtOwotICAgIGNhbGxkLT5oYXNfY29tcHJlc3Npb25fYWxnb3JpdGhtID0gMTsgLyogR1BSX1RSVUUgKi8KLSAgfQotICAvKiBoaW50IGNvbXByZXNzaW9uIGFsZ29yaXRobSAqLwotICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF90YWlsKAotICAgICAgaW5pdGlhbF9tZXRhZGF0YSwgJmNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG1fc3RvcmFnZSwKLSAgICAgIGdycGNfY29tcHJlc3Npb25fZW5jb2RpbmdfbWRlbGVtKGNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG0pKTsKLQotICAvKiBjb252ZXkgc3VwcG9ydGVkIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgKi8KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfdGFpbChpbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+YWNjZXB0X2VuY29kaW5nX3N0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fQUNDRVBUX0VOQ09ESU5HX0ZPUl9BTEdPUklUSE1TKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsZC0+c3VwcG9ydGVkX2NvbXByZXNzaW9uX2FsZ29yaXRobXMpKTsKLX0KLQotc3RhdGljIHZvaWQgY29udGludWVfc2VuZF9tZXNzYWdlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKTsKLQotc3RhdGljIHZvaWQgc2VuZF9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICplbGVtcCwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gZWxlbXA7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKCZjYWxsZC0+c2xpY2VzKTsKLSAgY2FsbGQtPnBvc3Rfc2VuZC0+Y2IoZXhlY19jdHgsIGNhbGxkLT5wb3N0X3NlbmQtPmNiX2FyZywgc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmlzaF9zZW5kX21lc3NhZ2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGludCBkaWRfY29tcHJlc3M7Ci0gIGdwcl9zbGljZV9idWZmZXIgdG1wOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJnRtcCk7Ci0gIGRpZF9jb21wcmVzcyA9Ci0gICAgICBncnBjX21zZ19jb21wcmVzcyhjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtLCAmY2FsbGQtPnNsaWNlcywgJnRtcCk7Ci0gIGlmIChkaWRfY29tcHJlc3MpIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX3N3YXAoJmNhbGxkLT5zbGljZXMsICZ0bXApOwotICAgIGNhbGxkLT5zZW5kX2ZsYWdzIHw9IEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1M7Ci0gIH0KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZ0bXApOwotCi0gIGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbV9pbml0KCZjYWxsZC0+cmVwbGFjZW1lbnRfc3RyZWFtLCAmY2FsbGQtPnNsaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGQtPnNlbmRfZmxhZ3MpOwotICBjYWxsZC0+c2VuZF9vcC5zZW5kX21lc3NhZ2UgPSAmY2FsbGQtPnJlcGxhY2VtZW50X3N0cmVhbS5iYXNlOwotICBjYWxsZC0+cG9zdF9zZW5kID0gY2FsbGQtPnNlbmRfb3Aub25fY29tcGxldGU7Ci0gIGNhbGxkLT5zZW5kX29wLm9uX2NvbXBsZXRlID0gJmNhbGxkLT5zZW5kX2RvbmU7Ci0KLSAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sICZjYWxsZC0+c2VuZF9vcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdvdF9zbGljZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZWxlbXAsIGJvb2wgc3VjY2VzcykgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IGVsZW1wOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmY2FsbGQtPnNsaWNlcywgY2FsbGQtPmluY29taW5nX3NsaWNlKTsKLSAgaWYgKGNhbGxkLT5zZW5kX2xlbmd0aCA9PSBjYWxsZC0+c2xpY2VzLmxlbmd0aCkgewotICAgIGZpbmlzaF9zZW5kX21lc3NhZ2UoZXhlY19jdHgsIGVsZW0pOwotICB9IGVsc2UgewotICAgIGNvbnRpbnVlX3NlbmRfbWVzc2FnZShleGVjX2N0eCwgZWxlbSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY29udGludWVfc2VuZF9tZXNzYWdlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIHdoaWxlIChncnBjX2J5dGVfc3RyZWFtX25leHQoZXhlY19jdHgsIGNhbGxkLT5zZW5kX29wLnNlbmRfbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGQtPmluY29taW5nX3NsaWNlLCB+KHNpemVfdCkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+Z290X3NsaWNlKSkgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZjYWxsZC0+c2xpY2VzLCBjYWxsZC0+aW5jb21pbmdfc2xpY2UpOwotICAgIGlmIChjYWxsZC0+c2VuZF9sZW5ndGggPT0gY2FsbGQtPnNsaWNlcy5sZW5ndGgpIHsKLSAgICAgIGZpbmlzaF9zZW5kX21lc3NhZ2UoZXhlY19jdHgsIGVsZW0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbXByZXNzX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJjb21wcmVzc19zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wIiwgMCk7Ci0KLSAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEpIHsKLSAgICBwcm9jZXNzX3NlbmRfaW5pdGlhbF9tZXRhZGF0YShlbGVtLCBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKTsKLSAgfQotICBpZiAob3AtPnNlbmRfbWVzc2FnZSAhPSBOVUxMICYmICFza2lwX2NvbXByZXNzaW9uKGVsZW0pICYmCi0gICAgICAwID09IChvcC0+c2VuZF9tZXNzYWdlLT5mbGFncyAmIEdSUENfV1JJVEVfTk9fQ09NUFJFU1MpKSB7Ci0gICAgY2FsbGQtPnNlbmRfb3AgPSAqb3A7Ci0gICAgY2FsbGQtPnNlbmRfbGVuZ3RoID0gb3AtPnNlbmRfbWVzc2FnZS0+bGVuZ3RoOwotICAgIGNhbGxkLT5zZW5kX2ZsYWdzID0gb3AtPnNlbmRfbWVzc2FnZS0+ZmxhZ3M7Ci0gICAgY29udGludWVfc2VuZF9tZXNzYWdlKGV4ZWNfY3R4LCBlbGVtKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXNzIGNvbnRyb2wgZG93biB0aGUgc3RhY2sgKi8KLSAgICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgZWxlbSwgb3ApOwotICB9Ci0KLSAgR1BSX1RJTUVSX0VORCgiY29tcHJlc3Nfc3RhcnRfdHJhbnNwb3J0X3N0cmVhbV9vcCIsIDApOwotfQotCi0vKiBDb25zdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCi1zdGF0aWMgdm9pZCBpbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7Ci0gIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2FsbCBlbGVtZW50ICovCi0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0KLSAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCi0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmY2FsbGQtPnNsaWNlcyk7Ci0gIGNhbGxkLT5oYXNfY29tcHJlc3Npb25fYWxnb3JpdGhtID0gMDsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5nb3Rfc2xpY2UsIGdvdF9zbGljZSwgZWxlbSk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsZC0+c2VuZF9kb25lLCBzZW5kX2RvbmUsIGVsZW0pOwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKLSAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjYWxsIGVsZW1lbnQgKi8KLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZjYWxsZC0+c2xpY2VzKTsKLX0KLQotLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLwotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFubmVsZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb19pZHg7Ci0KLSAgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zX2luaXQoJmNoYW5uZWxkLT5jb21wcmVzc2lvbl9vcHRpb25zKTsKLSAgY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMuZW5hYmxlZF9hbGdvcml0aG1zX2JpdHNldCA9Ci0gICAgICAodWludDMyX3QpZ3JwY19jaGFubmVsX2FyZ3NfY29tcHJlc3Npb25fYWxnb3JpdGhtX2dldF9zdGF0ZXMoCi0gICAgICAgICAgYXJncy0+Y2hhbm5lbF9hcmdzKTsKLQotICBjaGFubmVsZC0+ZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0gPQotICAgICAgZ3JwY19jaGFubmVsX2FyZ3NfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobShhcmdzLT5jaGFubmVsX2FyZ3MpOwotICAvKiBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgaXNuJ3QgZGlzYWJsZWQuICovCi0gIEdQUl9BU1NFUlQoZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zX2lzX2FsZ29yaXRobV9lbmFibGVkKAotICAgICAgJmNoYW5uZWxkLT5jb21wcmVzc2lvbl9vcHRpb25zLCBjaGFubmVsZC0+ZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0pKTsKLSAgY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMuZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0gPQotICAgICAgY2hhbm5lbGQtPmRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtOwotCi0gIGNoYW5uZWxkLT5zdXBwb3J0ZWRfY29tcHJlc3Npb25fYWxnb3JpdGhtcyA9IDA7Ci0gIGZvciAoYWxnb19pZHggPSAwOyBhbGdvX2lkeCA8IEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDsgKythbGdvX2lkeCkgewotICAgIC8qIHNraXAgZGlzYWJsZWQgYWxnb3JpdGhtcyAqLwotICAgIGlmIChncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfaXNfYWxnb3JpdGhtX2VuYWJsZWQoCi0gICAgICAgICAgICAmY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMsIGFsZ29faWR4KSA9PSAwKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgY2hhbm5lbGQtPnN1cHBvcnRlZF9jb21wcmVzc2lvbl9hbGdvcml0aG1zIHw9IDF1IDw8IGFsZ29faWR4OwotICB9Ci0KLSAgR1BSX0FTU0VSVCghYXJncy0+aXNfbGFzdCk7Ci19Ci0KLS8qIERlc3RydWN0b3IgZm9yIGNoYW5uZWwgZGF0YSAqLwotc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkge30KLQotY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2NvbXByZXNzX2ZpbHRlciA9IHsKLSAgICBjb21wcmVzc19zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wLAotICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAotICAgIHNpemVvZihjYWxsX2RhdGEpLAotICAgIGluaXRfY2FsbF9lbGVtLAotICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCi0gICAgZGVzdHJveV9jYWxsX2VsZW0sCi0gICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCi0gICAgaW5pdF9jaGFubmVsX2VsZW0sCi0gICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCi0gICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsCi0gICAgImNvbXByZXNzIn07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIGIvc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyMDhhYy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0hBTk5FTF9DT01QUkVTU19GSUxURVJfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0hBTk5FTF9DT01QUkVTU19GSUxURVJfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0KLSNkZWZpbmUgR1JQQ19DT01QUkVTU19SRVFVRVNUX0FMR09SSVRITV9LRVkgImdycGMtaW50ZXJuYWwtZW5jb2RpbmctcmVxdWVzdCIKLQotLyoqIENvbXByZXNzaW9uIGZpbHRlciBmb3Igb3V0Z29pbmcgZGF0YS4KLSAqCi0gKiBTZWUgPGdycGMvY29tcHJlc3Npb24uaD4gZm9yIHRoZSBhdmFpbGFibGUgY29tcHJlc3Npb24gc2V0dGluZ3MuCi0gKgotICogQ29tcHJlc3Npb24gc2V0dGluZ3MgbWF5IGNvbWUgZnJvbToKLSAqICAtIENoYW5uZWwgY29uZmlndXJhdGlvbiwgYXMgZXN0YWJsaXNoZWQgYXQgY2hhbm5lbCBjcmVhdGlvbiB0aW1lLgotICogIC0gVGhlIG1ldGFkYXRhIGFjY29tcGFueWluZyB0aGUgb3V0Z29pbmcgZGF0YSB0byBiZSBjb21wcmVzc2VkLiBUaGlzIGlzCi0gKiAgICB0YWtlbiBhcyBhIHJlcXVlc3Qgb25seS4gV2UgbWF5IGNob29zZSBub3QgdG8gaG9ub3IgaXQuIFRoZSBtZXRhZGF0YSBrZXkKLSAqICAgIGlzIGdpdmVuIGJ5IFxhIEdSUENfQ09NUFJFU1NfUkVRVUVTVF9BTEdPUklUSE1fS0VZLgotICoKLSAqIENvbXByZXNzaW9uIGNhbiBiZSBkaXNhYmxlZCBmb3IgY29uY3JldGUgbWVzc2FnZXMgKGZvciBpbnN0YW5jZSBpbiBvcmRlciB0bwotICogcHJldmVudCBDUklNRS9CRUFTVCB0eXBlIGF0dGFja3MpIGJ5IGhhdmluZyB0aGUgR1JQQ19XUklURV9OT19DT01QUkVTUyBzZXQgaW4KLSAqIHRoZSBCRUdJTl9NRVNTQUdFIGZsYWdzLgotICoKLSAqIFRoZSBhdHRlbXB0ZWQgY29tcHJlc3Npb24gbWVjaGFuaXNtIGlzIGFkZGVkIHRvIHRoZSByZXN1bHRpbmcgaW5pdGlhbAotICogbWV0YWRhdGEgdW5kZXIgdGhlJ2dycGMtZW5jb2RpbmcnIGtleS4KLSAqCi0gKiBJZiBjb21wcmVzc2lvbiBpcyBhY3R1YWxseSBwZXJmb3JtZWQsIEJFR0lOX01FU1NBR0UncyBmbGFnIGlzIG1vZGlmaWVkIHRvCi0gKiBpbmNvcnBvcmF0ZSBHUlBDX1dSSVRFX0lOVEVSTkFMX0NPTVBSRVNTLiBPdGhlcndpc2UsIGFuZCByZWdhcmRsZXNzIG9mIHRoZQotICogYWZvcmVtZW50aW9uZWQgJ2dycGMtZW5jb2RpbmcnIG1ldGFkYXRhIHZhbHVlLCBkYXRhIHdpbGwgcGFzcyB0aHJvdWdoCi0gKiB1bmNvbXByZXNzZWQuICovCi0KLWV4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfY29tcHJlc3NfZmlsdGVyOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NIQU5ORUxfQ09NUFJFU1NfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyBiL3NyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxMWQ1NC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL2J5dGVfYnVmZmVyLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCi0KLSNkZWZpbmUgTUFYX0JVRkZFUl9MRU5HVEggODE5MgotCi10eXBlZGVmIHN0cnVjdCBjb25uZWN0ZWRfY2hhbm5lbF9jaGFubmVsX2RhdGEgewotICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwotfSBjaGFubmVsX2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IGNvbm5lY3RlZF9jaGFubmVsX2NhbGxfZGF0YSB7IHZvaWQgKnVudXNlZDsgfSBjYWxsX2RhdGE7Ci0KLS8qIFdlIHBlcmZvcm0gYSBzbWFsbCBoYWNrIHRvIGxvY2F0ZSB0cmFuc3BvcnQgZGF0YSBhbG9uZ3NpZGUgdGhlIGNvbm5lY3RlZAotICAgY2hhbm5lbCBkYXRhIGluIGNhbGwgYWxsb2NhdGlvbnMsIHRvIGFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcHVsbGVkIGluIG1pbmltYWwKLSAgIGNhY2hlIGxpbmUgcmVxdWVzdHMgKi8KLSNkZWZpbmUgVFJBTlNQT1JUX1NUUkVBTV9GUk9NX0NBTExfREFUQShjYWxsZCkgKChncnBjX3N0cmVhbSAqKSgoY2FsbGQpICsgMSkpCi0jZGVmaW5lIENBTExfREFUQV9GUk9NX1RSQU5TUE9SVF9TVFJFQU0odHJhbnNwb3J0X3N0cmVhbSkgXAotICAoKChjYWxsX2RhdGEgKikodHJhbnNwb3J0X3N0cmVhbSkpIC0gMSkKLQotLyogSW50ZXJjZXB0IGEgY2FsbCBvcGVyYXRpb24gYW5kIGVpdGhlciBwdXNoIGl0IGRpcmVjdGx5IHVwIG9yIHRyYW5zbGF0ZSBpdAotICAgaW50byB0cmFuc3BvcnQgc3RyZWFtIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyB2b2lkIGNvbl9zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIEdSUENfQ0FMTF9MT0dfT1AoR1BSX0lORk8sIGVsZW0sIG9wKTsKLQotICBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX3N0cmVhbV9vcChleGVjX2N0eCwgY2hhbmQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NUUkVBTV9GUk9NX0NBTExfREFUQShjYWxsZCksIG9wKTsKLX0KLQotc3RhdGljIHZvaWQgY29uX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCkgewotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGV4ZWNfY3R4LCBjaGFuZC0+dHJhbnNwb3J0LCBvcCk7Ci19Ci0KLS8qIENvbnN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgaW50IHI7Ci0KLSAgciA9IGdycGNfdHJhbnNwb3J0X2luaXRfc3RyZWFtKAotICAgICAgZXhlY19jdHgsIGNoYW5kLT50cmFuc3BvcnQsIFRSQU5TUE9SVF9TVFJFQU1fRlJPTV9DQUxMX0RBVEEoY2FsbGQpLAotICAgICAgJmFyZ3MtPmNhbGxfc3RhY2stPnJlZmNvdW50LCBhcmdzLT5zZXJ2ZXJfdHJhbnNwb3J0X2RhdGEpOwotICBHUFJfQVNTRVJUKHIgPT0gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldChleGVjX2N0eCwgY2hhbmQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NUUkVBTV9GUk9NX0NBTExfREFUQShjYWxsZCksIHBvbGxzZXQpOwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgZ3JwY190cmFuc3BvcnRfZGVzdHJveV9zdHJlYW0oZXhlY19jdHgsIGNoYW5kLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TVFJFQU1fRlJPTV9DQUxMX0RBVEEoY2FsbGQpKTsKLX0KLQotLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLwotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjZCA9IChjaGFubmVsX2RhdGEgKillbGVtLT5jaGFubmVsX2RhdGE7Ci0gIEdQUl9BU1NFUlQoYXJncy0+aXNfbGFzdCk7Ci0gIGNkLT50cmFuc3BvcnQgPSBOVUxMOwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjaGFubmVsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHsKLSAgY2hhbm5lbF9kYXRhICpjZCA9IChjaGFubmVsX2RhdGEgKillbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3koZXhlY19jdHgsIGNkLT50cmFuc3BvcnQpOwotfQotCi1zdGF0aWMgY2hhciAqY29uX2dldF9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgewotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICByZXR1cm4gZ3JwY190cmFuc3BvcnRfZ2V0X3BlZXIoZXhlY19jdHgsIGNoYW5kLT50cmFuc3BvcnQpOwotfQotCi1zdGF0aWMgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBjb25uZWN0ZWRfY2hhbm5lbF9maWx0ZXIgPSB7Ci0gICAgY29uX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AsCi0gICAgY29uX3N0YXJ0X3RyYW5zcG9ydF9vcCwKLSAgICBzaXplb2YoY2FsbF9kYXRhKSwKLSAgICBpbml0X2NhbGxfZWxlbSwKLSAgICBzZXRfcG9sbHNldCwKLSAgICBkZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKLSAgICBpbml0X2NoYW5uZWxfZWxlbSwKLSAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKLSAgICBjb25fZ2V0X3BlZXIsCi0gICAgImNvbm5lY3RlZCIsCi19OwotCi1zdGF0aWMgdm9pZCBiaW5kX3RyYW5zcG9ydChncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwgdm9pZCAqdCkgewotICBjaGFubmVsX2RhdGEgKmNkID0gKGNoYW5uZWxfZGF0YSAqKWVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgR1BSX0FTU0VSVChlbGVtLT5maWx0ZXIgPT0gJmNvbm5lY3RlZF9jaGFubmVsX2ZpbHRlcik7Ci0gIEdQUl9BU1NFUlQoY2QtPnRyYW5zcG9ydCA9PSBOVUxMKTsKLSAgY2QtPnRyYW5zcG9ydCA9IHQ7Ci0KLSAgLyogSEFDSyhjdGlsbGVyKTogaW5jcmVhc2UgY2FsbCBzdGFjayBzaXplIGZvciB0aGUgY2hhbm5lbCB0byBtYWtlIHNwYWNlCi0gICAgIGZvciBjaGFubmVsIGRhdGEuIFdlIG5lZWQgYSBjbGVhbmVyIChidXQgcGVyZm9ybWFudCkgd2F5IHRvIGRvIHRoaXMsCi0gICAgIGFuZCBJJ20gbm90IHN1cmUgd2hhdCB0aGF0IGlzIHlldC4KLSAgICAgVGhpcyBpcyBvbmx5ICJzYWZlIiBiZWNhdXNlIGNhbGwgc3RhY2tzIHBsYWNlIG5vIGFkZGl0aW9uYWwgZGF0YSBhZnRlcgotICAgICB0aGUgbGFzdCBjYWxsIGVsZW1lbnQsIGFuZCB0aGUgbGFzdCBjYWxsIGVsZW1lbnQgTVVTVCBiZSB0aGUgY29ubmVjdGVkCi0gICAgIGNoYW5uZWwuICovCi0gIGNoYW5uZWxfc3RhY2stPmNhbGxfc3RhY2tfc2l6ZSArPSBncnBjX3RyYW5zcG9ydF9zdHJlYW1fc2l6ZSh0KTsKLX0KLQotYm9vbCBncnBjX2FkZF9jb25uZWN0ZWRfZmlsdGVyKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZ19tdXN0X2JlX251bGwpIHsKLSAgR1BSX0FTU0VSVChhcmdfbXVzdF9iZV9udWxsID09IE5VTEwpOwotICBncnBjX3RyYW5zcG9ydCAqdCA9IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF90cmFuc3BvcnQoYnVpbGRlcik7Ci0gIEdQUl9BU1NFUlQodCAhPSBOVUxMKTsKLSAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FwcGVuZF9maWx0ZXIoCi0gICAgICBidWlsZGVyLCAmY29ubmVjdGVkX2NoYW5uZWxfZmlsdGVyLCBiaW5kX3RyYW5zcG9ydCwgdCk7Ci19Ci0KLWdycGNfc3RyZWFtICpncnBjX2Nvbm5lY3RlZF9jaGFubmVsX2dldF9zdHJlYW0oZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgcmV0dXJuIFRSQU5TUE9SVF9TVFJFQU1fRlJPTV9DQUxMX0RBVEEoY2FsbGQpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIGIvc3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBjODM1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NIQU5ORUxfQ09OTkVDVEVEX0NIQU5ORUxfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0hBTk5FTF9DT05ORUNURURfQ0hBTk5FTF9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIgotCi1ib29sIGdycGNfYWRkX2Nvbm5lY3RlZF9maWx0ZXIoZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnX211c3RfYmVfbnVsbCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0hBTk5FTF9DT05ORUNURURfQ0hBTk5FTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCBiL3NyYy9jb3JlL2NoYW5uZWwvY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjIxN2RjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0hBTk5FTF9DT05URVhUX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NIQU5ORUxfQ09OVEVYVF9ICi0KLS8qIENhbGwgb2JqZWN0IGNvbnRleHQgcG9pbnRlcnMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEdSUENfQ09OVEVYVF9TRUNVUklUWSA9IDAsCi0gIEdSUENfQ09OVEVYVF9UUkFDSU5HLAotICBHUlBDX0NPTlRFWFRfQ09VTlQKLX0gZ3JwY19jb250ZXh0X2luZGV4OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKnZhbHVlOwotICB2b2lkICgqZGVzdHJveSkodm9pZCAqKTsKLX0gZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudDsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DSEFOTkVMX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyBiL3NyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjQyN2QuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCi0KLXR5cGVkZWYgc3RydWN0IGNhbGxfZGF0YSB7Ci0gIGdycGNfbGlua2VkX21kZWxlbSBtZXRob2Q7Ci0gIGdycGNfbGlua2VkX21kZWxlbSBzY2hlbWU7Ci0gIGdycGNfbGlua2VkX21kZWxlbSBhdXRob3JpdHk7Ci0gIGdycGNfbGlua2VkX21kZWxlbSB0ZV90cmFpbGVyczsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIGNvbnRlbnRfdHlwZTsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIHVzZXJfYWdlbnQ7Ci0KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl9pbml0aWFsX21ldGFkYXRhOwotCi0gIC8qKiBDbG9zdXJlIHRvIGNhbGwgd2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBoY19vbl9yZWN2IGhvb2sgKi8KLSAgZ3JwY19jbG9zdXJlICpvbl9kb25lX3JlY3Y7Ci0gIC8qKiBSZWNlaXZlIGNsb3N1cmVzIGFyZSBjaGFpbmVkOiB3ZSBpbmplY3QgdGhpcyBjbG9zdXJlIGFzIHRoZSBvbl9kb25lX3JlY3YKLSAgICAgIHVwLWNhbGwgb24gdHJhbnNwb3J0X29wLCBhbmQgcmVtZW1iZXIgdG8gY2FsbCBvdXIgb25fZG9uZV9yZWN2IG1lbWJlcgotICAgICAgYWZ0ZXIgaGFuZGxpbmcgaXQuICovCi0gIGdycGNfY2xvc3VyZSBoY19vbl9yZWN2OwotfSBjYWxsX2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IGNoYW5uZWxfZGF0YSB7Ci0gIGdycGNfbWRlbGVtICpzdGF0aWNfc2NoZW1lOwotICBncnBjX21kZWxlbSAqdXNlcl9hZ2VudDsKLX0gY2hhbm5lbF9kYXRhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtOwotICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eDsKLX0gY2xpZW50X3JlY3ZfZmlsdGVyX2FyZ3M7Ci0KLXN0YXRpYyBncnBjX21kZWxlbSAqY2xpZW50X3JlY3ZfZmlsdGVyKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKSB7Ci0gIGNsaWVudF9yZWN2X2ZpbHRlcl9hcmdzICphID0gdXNlcl9kYXRhOwotICBpZiAobWQgPT0gR1JQQ19NREVMRU1fU1RBVFVTXzIwMCkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9TVEFUVVMpIHsKLSAgICBncnBjX2NhbGxfZWxlbWVudF9zZW5kX2NhbmNlbChhLT5leGVjX2N0eCwgYS0+ZWxlbSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0NPTlRFTlRfVFlQRSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBtZDsKLX0KLQotc3RhdGljIHZvaWQgaGNfb25fcmVjdihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLCBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSB1c2VyX2RhdGE7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNsaWVudF9yZWN2X2ZpbHRlcl9hcmdzIGE7Ci0gIGEuZWxlbSA9IGVsZW07Ci0gIGEuZXhlY19jdHggPSBleGVjX2N0eDsKLSAgZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIoY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSwgY2xpZW50X3JlY3ZfZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYSk7Ci0gIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiKGV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYl9hcmcsIHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgZ3JwY19tZGVsZW0gKmNsaWVudF9zdHJpcF9maWx0ZXIodm9pZCAqdXNlcl9kYXRhLCBncnBjX21kZWxlbSAqbWQpIHsKLSAgLyogZWF0IHRoZSB0aGluZ3Mgd2UnZCBsaWtlIHRvIHNldCBvdXJzZWx2ZXMgKi8KLSAgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9NRVRIT0QpIHJldHVybiBOVUxMOwotICBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX1NDSEVNRSkgcmV0dXJuIE5VTEw7Ci0gIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfVEUpIHJldHVybiBOVUxMOwotICBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0NPTlRFTlRfVFlQRSkgcmV0dXJuIE5VTEw7Ci0gIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfVVNFUl9BR0VOVCkgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBtZDsKLX0KLQotc3RhdGljIHZvaWQgaGNfbXV0YXRlX29wKGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjYWxsIGVsZW1lbnQgKi8KLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2hhbm5lbF9kYXRhICpjaGFubmVsZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgewotICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsIGNsaWVudF9zdHJpcF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgLyogU2VuZCA6IHByZWZpeGVkIGhlYWRlcnMsIHdoaWNoIGhhdmUgdG8gYmUgYmVmb3JlIGFueSBhcHBsaWNhdGlvbgotICAgICAgIGxheWVyIGhlYWRlcnMuICovCi0gICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfaGVhZChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhLCAmY2FsbGQtPm1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURFTEVNX01FVEhPRF9QT1NUKTsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF9oZWFkKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsICZjYWxsZC0+c2NoZW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbGQtPnN0YXRpY19zY2hlbWUpOwotICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwgJmNhbGxkLT50ZV90cmFpbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURFTEVNX1RFX1RSQUlMRVJTKTsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF90YWlsKAotICAgICAgICBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhLCAmY2FsbGQtPmNvbnRlbnRfdHlwZSwKLSAgICAgICAgR1JQQ19NREVMRU1fQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX1NMQVNIX0dSUEMpOwotICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwgJmNhbGxkLT51c2VyX2FnZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fUkVGKGNoYW5uZWxkLT51c2VyX2FnZW50KSk7Ci0gIH0KLQotICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgLyogc3Vic3RpdHV0ZSBvdXIgY2FsbGJhY2sgZm9yIHRoZSBoaWdoZXIgY2FsbGJhY2sgKi8KLSAgICBjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBjYWxsZC0+b25fZG9uZV9yZWN2ID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKLSAgICBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID0gJmNhbGxkLT5oY19vbl9yZWN2OwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhjX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIEdQUl9USU1FUl9CRUdJTigiaGNfc3RhcnRfdHJhbnNwb3J0X29wIiwgMCk7Ci0gIEdSUENfQ0FMTF9MT0dfT1AoR1BSX0lORk8sIGVsZW0sIG9wKTsKLSAgaGNfbXV0YXRlX29wKGVsZW0sIG9wKTsKLSAgR1BSX1RJTUVSX0VORCgiaGNfc3RhcnRfdHJhbnNwb3J0X29wIiwgMCk7Ci0gIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Ci19Ci0KLS8qIENvbnN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2FsbGQtPm9uX2RvbmVfcmVjdiA9IE5VTEw7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsZC0+aGNfb25fcmVjdiwgaGNfb25fcmVjdiwgZWxlbSk7Ci19Ci0KLS8qIERlc3RydWN0b3IgZm9yIGNhbGxfZGF0YSAqLwotc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkge30KLQotc3RhdGljIGdycGNfbWRlbGVtICpzY2hlbWVfZnJvbV9hcmdzKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKSB7Ci0gIHVuc2lnbmVkIGk7Ci0gIHNpemVfdCBqOwotICBncnBjX21kZWxlbSAqdmFsaWRfc2NoZW1lc1tdID0ge0dSUENfTURFTEVNX1NDSEVNRV9IVFRQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURFTEVNX1NDSEVNRV9IVFRQU307Ci0gIGlmIChhcmdzICE9IE5VTEwpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGFyZ3MtPmFyZ3NbaV0udHlwZSA9PSBHUlBDX0FSR19TVFJJTkcgJiYKLSAgICAgICAgICBzdHJjbXAoYXJncy0+YXJnc1tpXS5rZXksIEdSUENfQVJHX0hUVFAyX1NDSEVNRSkgPT0gMCkgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgR1BSX0FSUkFZX1NJWkUodmFsaWRfc2NoZW1lcyk7IGorKykgewotICAgICAgICAgIGlmICgwID09IHN0cmNtcChncnBjX21kc3RyX2FzX2Nfc3RyaW5nKHZhbGlkX3NjaGVtZXNbal0tPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+YXJnc1tpXS52YWx1ZS5zdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsaWRfc2NoZW1lc1tqXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEdSUENfTURFTEVNX1NDSEVNRV9IVFRQOwotfQotCi1zdGF0aWMgZ3JwY19tZHN0ciAqdXNlcl9hZ2VudF9mcm9tX2FyZ3MoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpIHsKLSAgZ3ByX3N0cnZlYyB2OwotICBzaXplX3QgaTsKLSAgaW50IGlzX2ZpcnN0ID0gMTsKLSAgY2hhciAqdG1wOwotICBncnBjX21kc3RyICpyZXN1bHQ7Ci0KLSAgZ3ByX3N0cnZlY19pbml0KCZ2KTsKLQotICBmb3IgKGkgPSAwOyBhcmdzICYmIGkgPCBhcmdzLT5udW1fYXJnczsgaSsrKSB7Ci0gICAgaWYgKDAgPT0gc3RyY21wKGFyZ3MtPmFyZ3NbaV0ua2V5LCBHUlBDX0FSR19QUklNQVJZX1VTRVJfQUdFTlRfU1RSSU5HKSkgewotICAgICAgaWYgKGFyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19TVFJJTkcpIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDaGFubmVsIGFyZ3VtZW50ICclcycgc2hvdWxkIGJlIGEgc3RyaW5nIiwKLSAgICAgICAgICAgICAgICBHUlBDX0FSR19QUklNQVJZX1VTRVJfQUdFTlRfU1RSSU5HKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghaXNfZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZ2LCBncHJfc3RyZHVwKCIgIikpOwotICAgICAgICBpc19maXJzdCA9IDA7Ci0gICAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZ2LCBncHJfc3RyZHVwKGFyZ3MtPmFyZ3NbaV0udmFsdWUuc3RyaW5nKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZ3ByX2FzcHJpbnRmKCZ0bXAsICIlc2dycGMtYy8lcyAoJXMpIiwgaXNfZmlyc3QgPyAiIiA6ICIgIiwKLSAgICAgICAgICAgICAgIGdycGNfdmVyc2lvbl9zdHJpbmcoKSwgR1BSX1BMQVRGT1JNX1NUUklORyk7Ci0gIGlzX2ZpcnN0ID0gMDsKLSAgZ3ByX3N0cnZlY19hZGQoJnYsIHRtcCk7Ci0KLSAgZm9yIChpID0gMDsgYXJncyAmJiBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgewotICAgIGlmICgwID09IHN0cmNtcChhcmdzLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfU0VDT05EQVJZX1VTRVJfQUdFTlRfU1RSSU5HKSkgewotICAgICAgaWYgKGFyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19TVFJJTkcpIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDaGFubmVsIGFyZ3VtZW50ICclcycgc2hvdWxkIGJlIGEgc3RyaW5nIiwKLSAgICAgICAgICAgICAgICBHUlBDX0FSR19TRUNPTkRBUllfVVNFUl9BR0VOVF9TVFJJTkcpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFpc19maXJzdCkgZ3ByX3N0cnZlY19hZGQoJnYsIGdwcl9zdHJkdXAoIiAiKSk7Ci0gICAgICAgIGlzX2ZpcnN0ID0gMDsKLSAgICAgICAgZ3ByX3N0cnZlY19hZGQoJnYsIGdwcl9zdHJkdXAoYXJncy0+YXJnc1tpXS52YWx1ZS5zdHJpbmcpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB0bXAgPSBncHJfc3RydmVjX2ZsYXR0ZW4oJnYsIE5VTEwpOwotICBncHJfc3RydmVjX2Rlc3Ryb3koJnYpOwotICByZXN1bHQgPSBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHRtcCk7Ci0gIGdwcl9mcmVlKHRtcCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLwotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgR1BSX0FTU0VSVCghYXJncy0+aXNfbGFzdCk7Ci0gIGNoYW5kLT5zdGF0aWNfc2NoZW1lID0gc2NoZW1lX2Zyb21fYXJncyhhcmdzLT5jaGFubmVsX2FyZ3MpOwotICBjaGFuZC0+dXNlcl9hZ2VudCA9IGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncygKLSAgICAgIEdSUENfTURTVFJfVVNFUl9BR0VOVCwgdXNlcl9hZ2VudF9mcm9tX2FyZ3MoYXJncy0+Y2hhbm5lbF9hcmdzKSk7Ci19Ci0KLS8qIERlc3RydWN0b3IgZm9yIGNoYW5uZWwgZGF0YSAqLwotc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkgewotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBHUlBDX01ERUxFTV9VTlJFRihjaGFuZC0+dXNlcl9hZ2VudCk7Ci19Ci0KLWNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19odHRwX2NsaWVudF9maWx0ZXIgPSB7Ci0gICAgaGNfc3RhcnRfdHJhbnNwb3J0X29wLAotICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAotICAgIHNpemVvZihjYWxsX2RhdGEpLAotICAgIGluaXRfY2FsbF9lbGVtLAotICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCi0gICAgZGVzdHJveV9jYWxsX2VsZW0sCi0gICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCi0gICAgaW5pdF9jaGFubmVsX2VsZW0sCi0gICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCi0gICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsCi0gICAgImh0dHAtY2xpZW50In07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIGIvc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2MTliYi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0hBTk5FTF9IVFRQX0NMSUVOVF9GSUxURVJfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0hBTk5FTF9IVFRQX0NMSUVOVF9GSUxURVJfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0KLS8qIFByb2Nlc3NlcyBtZXRhZGF0YSBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIEhUVFAyIHRyYW5zcG9ydHMgKi8KLWV4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfaHR0cF9jbGllbnRfZmlsdGVyOwotCi0jZGVmaW5lIEdSUENfQVJHX0hUVFAyX1NDSEVNRSAiZ3JwYy5odHRwMl9zY2hlbWUiCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0hBTk5FTF9IVFRQX0NMSUVOVF9GSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyBiL3NyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMmUwYzUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgotCi10eXBlZGVmIHN0cnVjdCBjYWxsX2RhdGEgewotICB1aW50OF90IHNlZW5fcGF0aDsKLSAgdWludDhfdCBzZWVuX3Bvc3Q7Ci0gIHVpbnQ4X3Qgc2VudF9zdGF0dXM7Ci0gIHVpbnQ4X3Qgc2Vlbl9zY2hlbWU7Ci0gIHVpbnQ4X3Qgc2Vlbl90ZV90cmFpbGVyczsKLSAgdWludDhfdCBzZWVuX2F1dGhvcml0eTsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIHN0YXR1czsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIGNvbnRlbnRfdHlwZTsKLQotICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gIC8qKiBDbG9zdXJlIHRvIGNhbGwgd2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBoc19vbl9yZWN2IGhvb2sgKi8KLSAgZ3JwY19jbG9zdXJlICpvbl9kb25lX3JlY3Y7Ci0gIC8qKiBSZWNlaXZlIGNsb3N1cmVzIGFyZSBjaGFpbmVkOiB3ZSBpbmplY3QgdGhpcyBjbG9zdXJlIGFzIHRoZSBvbl9kb25lX3JlY3YKLSAgICAgIHVwLWNhbGwgb24gdHJhbnNwb3J0X29wLCBhbmQgcmVtZW1iZXIgdG8gY2FsbCBvdXIgb25fZG9uZV9yZWN2IG1lbWJlcgotICAgICAgYWZ0ZXIgaGFuZGxpbmcgaXQuICovCi0gIGdycGNfY2xvc3VyZSBoc19vbl9yZWN2OwotfSBjYWxsX2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IGNoYW5uZWxfZGF0YSB7IHVpbnQ4X3QgdW51c2VkOyB9IGNoYW5uZWxfZGF0YTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbTsKLSAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHg7Ci19IHNlcnZlcl9maWx0ZXJfYXJnczsKLQotc3RhdGljIGdycGNfbWRlbGVtICpzZXJ2ZXJfZmlsdGVyKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKSB7Ci0gIHNlcnZlcl9maWx0ZXJfYXJncyAqYSA9IHVzZXJfZGF0YTsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSBhLT5lbGVtOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotCi0gIC8qIENoZWNrIGlmIGl0IGlzIG9uZSBvZiB0aGUgaGVhZGVycyB3ZSBjYXJlIGFib3V0LiAqLwotICBpZiAobWQgPT0gR1JQQ19NREVMRU1fVEVfVFJBSUxFUlMgfHwgbWQgPT0gR1JQQ19NREVMRU1fTUVUSE9EX1BPU1QgfHwKLSAgICAgIG1kID09IEdSUENfTURFTEVNX1NDSEVNRV9IVFRQIHx8IG1kID09IEdSUENfTURFTEVNX1NDSEVNRV9IVFRQUyB8fAotICAgICAgbWQgPT0gR1JQQ19NREVMRU1fQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX1NMQVNIX0dSUEMpIHsKLSAgICAvKiBzd2FsbG93IGl0ICovCi0gICAgaWYgKG1kID09IEdSUENfTURFTEVNX01FVEhPRF9QT1NUKSB7Ci0gICAgICBjYWxsZC0+c2Vlbl9wb3N0ID0gMTsKLSAgICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9TQ0hFTUUpIHsKLSAgICAgIGNhbGxkLT5zZWVuX3NjaGVtZSA9IDE7Ci0gICAgfSBlbHNlIGlmIChtZCA9PSBHUlBDX01ERUxFTV9URV9UUkFJTEVSUykgewotICAgICAgY2FsbGQtPnNlZW5fdGVfdHJhaWxlcnMgPSAxOwotICAgIH0KLSAgICAvKiBUT0RPKGtsZW1wbmVyKTogVHJhY2sgdGhhdCB3ZSd2ZSBzZWVuIGFsbCB0aGUgaGVhZGVycyB3ZSBzaG91bGQKLSAgICAgICByZXF1aXJlICovCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0NPTlRFTlRfVFlQRSkgewotICAgIGlmIChzdHJuY21wKGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSwgImFwcGxpY2F0aW9uL2dycGMrIiwgMTcpID09Ci0gICAgICAgIDApIHsKLSAgICAgIC8qIEFsdGhvdWdoIHRoZSBDIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgKGN1cnJlbnRseSkgZ2VuZXJhdGUgdGhlbSwKLSAgICAgICAgIGFueSBjdXN0b20gKy1zdWZmaXggaXMgZXhwbGljaXRseSB2YWxpZC4gKi8KLSAgICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBXZSBzaG91bGQgY29uc2lkZXIgcHJlYWxsb2NhdGluZyBjb21tb24gdmFsdWVzIHN1Y2gKLSAgICAgICAgIGFzICtwcm90byBvciAranNvbiwgb3IgYXQgbGVhc3Qgc3Rhc2hpbmcgdGhlbSBpZiB3ZSBzZWUgdGhlbS4gKi8KLSAgICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBTaG91bGQgd2UgYmUgc3VyZmFjaW5nIHRoaXMgdG8gYXBwbGljYXRpb24gY29kZT8gKi8KLSAgICB9IGVsc2UgewotICAgICAgLyogVE9ETyhrbGVtcG5lcik6IFdlJ3JlIGN1cnJlbnRseSBhbGxvd2luZyB0aGlzLCBidXQgd2Ugc2hvdWxkbid0Ci0gICAgICAgICBzZWUgaXQgd2l0aG91dCBhIHByb3h5IHNvIGxvZyBmb3Igbm93LiAqLwotICAgICAgZ3ByX2xvZyhHUFJfSU5GTywgIlVuZXhwZWN0ZWQgY29udGVudC10eXBlICVzIiwKLSAgICAgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX1RFIHx8IG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9NRVRIT0QgfHwKLSAgICAgICAgICAgICBtZC0+a2V5ID09IEdSUENfTURTVFJfU0NIRU1FKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkICVzOiBoZWFkZXI6ICclcyciLAotICAgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+a2V5KSwgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpKTsKLSAgICAvKiBzd2FsbG93IGl0IGFuZCBlcnJvciBldmVyeXRoaW5nIG91dC4gKi8KLSAgICAvKiBUT0RPKGtsZW1wbmVyKTogV2Ugb3VnaHQgdG8gZ2VuZXJhdGUgbW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlcwotICAgICAgIG9uIHRoZSB3aXJlIGhlcmUuICovCi0gICAgZ3JwY19jYWxsX2VsZW1lbnRfc2VuZF9jYW5jZWwoYS0+ZXhlY19jdHgsIGVsZW0pOwotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9QQVRIKSB7Ci0gICAgaWYgKGNhbGxkLT5zZWVuX3BhdGgpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiUmVjZWl2ZWQgOnBhdGggdHdpY2UiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjYWxsZC0+c2Vlbl9wYXRoID0gMTsKLSAgICByZXR1cm4gbWQ7Ci0gIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0FVVEhPUklUWSkgewotICAgIGNhbGxkLT5zZWVuX2F1dGhvcml0eSA9IDE7Ci0gICAgcmV0dXJuIG1kOwotICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9IT1NUKSB7Ci0gICAgLyogdHJhbnNsYXRlIGhvc3QgdG8gOmF1dGhvcml0eSBzaW5jZSA6YXV0aG9yaXR5IG1heSBiZQotICAgICAgIG9taXR0ZWQgKi8KLSAgICBncnBjX21kZWxlbSAqYXV0aG9yaXR5ID0gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKAotICAgICAgICBHUlBDX01EU1RSX0FVVEhPUklUWSwgR1JQQ19NRFNUUl9SRUYobWQtPnZhbHVlKSk7Ci0gICAgY2FsbGQtPnNlZW5fYXV0aG9yaXR5ID0gMTsKLSAgICByZXR1cm4gYXV0aG9yaXR5OwotICB9IGVsc2UgewotICAgIHJldHVybiBtZDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoc19vbl9yZWN2KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2VzcykgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IHVzZXJfZGF0YTsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBzZXJ2ZXJfZmlsdGVyX2FyZ3MgYTsKLSAgICBhLmVsZW0gPSBlbGVtOwotICAgIGEuZXhlY19jdHggPSBleGVjX2N0eDsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhLCBzZXJ2ZXJfZmlsdGVyLCAmYSk7Ci0gICAgLyogSGF2ZSB3ZSBzZWVuIHRoZSByZXF1aXJlZCBodHRwMiB0cmFuc3BvcnQgaGVhZGVycz8KLSAgICAgICAoOm1ldGhvZCwgOnNjaGVtZSwgY29udGVudC10eXBlLCB3aXRoIDpwYXRoIGFuZCA6YXV0aG9yaXR5IGNvdmVyZWQKLSAgICAgICBhdCB0aGUgY2hhbm5lbCBsZXZlbCByaWdodCBub3cpICovCi0gICAgaWYgKGNhbGxkLT5zZWVuX3Bvc3QgJiYgY2FsbGQtPnNlZW5fc2NoZW1lICYmIGNhbGxkLT5zZWVuX3RlX3RyYWlsZXJzICYmCi0gICAgICAgIGNhbGxkLT5zZWVuX3BhdGggJiYgY2FsbGQtPnNlZW5fYXV0aG9yaXR5KSB7Ci0gICAgICAvKiBkbyBub3RoaW5nICovCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghY2FsbGQtPnNlZW5fcGF0aCkgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgOnBhdGggaGVhZGVyIik7Ci0gICAgICB9Ci0gICAgICBpZiAoIWNhbGxkLT5zZWVuX2F1dGhvcml0eSkgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgOmF1dGhvcml0eSBoZWFkZXIiKTsKLSAgICAgIH0KLSAgICAgIGlmICghY2FsbGQtPnNlZW5fcG9zdCkgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgOm1ldGhvZCBoZWFkZXIiKTsKLSAgICAgIH0KLSAgICAgIGlmICghY2FsbGQtPnNlZW5fc2NoZW1lKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTWlzc2luZyA6c2NoZW1lIGhlYWRlciIpOwotICAgICAgfQotICAgICAgaWYgKCFjYWxsZC0+c2Vlbl90ZV90cmFpbGVycykgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgdGUgdHJhaWxlcnMgaGVhZGVyIik7Ci0gICAgICB9Ci0gICAgICAvKiBFcnJvciB0aGlzIGNhbGwgb3V0ICovCi0gICAgICBzdWNjZXNzID0gMDsKLSAgICAgIGdycGNfY2FsbF9lbGVtZW50X3NlbmRfY2FuY2VsKGV4ZWNfY3R4LCBlbGVtKTsKLSAgICB9Ci0gIH0KLSAgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2IoZXhlY19jdHgsIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiX2FyZywgc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhzX211dGF0ZV9vcChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2FsbCBlbGVtZW50ICovCi0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0KLSAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCAmJiAhY2FsbGQtPnNlbnRfc3RhdHVzKSB7Ci0gICAgY2FsbGQtPnNlbnRfc3RhdHVzID0gMTsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF9oZWFkKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsICZjYWxsZC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fU1RBVFVTXzIwMCk7Ci0gICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfdGFpbCgKLSAgICAgICAgb3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwgJmNhbGxkLT5jb250ZW50X3R5cGUsCi0gICAgICAgIEdSUENfTURFTEVNX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9TTEFTSF9HUlBDKTsKLSAgfQotCi0gIGlmIChvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhKSB7Ci0gICAgLyogc3Vic3RpdHV0ZSBvdXIgY2FsbGJhY2sgZm9yIHRoZSBoaWdoZXIgY2FsbGJhY2sgKi8KLSAgICBjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBjYWxsZC0+b25fZG9uZV9yZWN2ID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKLSAgICBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID0gJmNhbGxkLT5oc19vbl9yZWN2OwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhzX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIEdSUENfQ0FMTF9MT0dfT1AoR1BSX0lORk8sIGVsZW0sIG9wKTsKLSAgR1BSX1RJTUVSX0JFR0lOKCJoc19zdGFydF90cmFuc3BvcnRfb3AiLCAwKTsKLSAgaHNfbXV0YXRlX29wKGVsZW0sIG9wKTsKLSAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sIG9wKTsKLSAgR1BSX1RJTUVSX0VORCgiaHNfc3RhcnRfdHJhbnNwb3J0X29wIiwgMCk7Ci19Ci0KLS8qIENvbnN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjYWxsIGVsZW1lbnQgKi8KLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCi0gIG1lbXNldChjYWxsZCwgMCwgc2l6ZW9mKCpjYWxsZCkpOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbGQtPmhzX29uX3JlY3YsIGhzX29uX3JlY3YsIGVsZW0pOwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHt9Ci0KLS8qIENvbnN0cnVjdG9yIGZvciBjaGFubmVsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzICphcmdzKSB7Ci0gIEdQUl9BU1NFUlQoIWFyZ3MtPmlzX2xhc3QpOwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjaGFubmVsIGRhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHt9Ci0KLWNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19odHRwX3NlcnZlcl9maWx0ZXIgPSB7Ci0gICAgaHNfc3RhcnRfdHJhbnNwb3J0X29wLAotICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAotICAgIHNpemVvZihjYWxsX2RhdGEpLAotICAgIGluaXRfY2FsbF9lbGVtLAotICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCi0gICAgZGVzdHJveV9jYWxsX2VsZW0sCi0gICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCi0gICAgaW5pdF9jaGFubmVsX2VsZW0sCi0gICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCi0gICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsCi0gICAgImh0dHAtc2VydmVyIn07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIGIvc3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4Yzg2NC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0hBTk5FTF9IVFRQX1NFUlZFUl9GSUxURVJfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0hBTk5FTF9IVFRQX1NFUlZFUl9GSUxURVJfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0KLS8qIFByb2Nlc3NlcyBtZXRhZGF0YSBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIEhUVFAyIHRyYW5zcG9ydHMgKi8KLWV4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfaHR0cF9zZXJ2ZXJfZmlsdGVyOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NIQU5ORUxfSFRUUF9TRVJWRVJfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIGIvc3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDg3ZGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0KLSNkZWZpbmUgR0VUX0NBTEwoaG9sZGVyKSBcCi0gICgoZ3JwY19zdWJjaGFubmVsX2NhbGwgKikoZ3ByX2F0bV9hY3FfbG9hZCgmKGhvbGRlciktPnN1YmNoYW5uZWxfY2FsbCkpKQotCi0jZGVmaW5lIENBTkNFTExFRF9DQUxMICgoZ3JwY19zdWJjaGFubmVsX2NhbGwgKikxKQotCi1zdGF0aWMgdm9pZCBzdWJjaGFubmVsX3JlYWR5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpob2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7Ci1zdGF0aWMgdm9pZCByZXRyeV9vcHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnJldHJ5X29wc19hcmdzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7Ci0KLXN0YXRpYyB2b2lkIGFkZF93YWl0aW5nX2xvY2tlZChncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKLXN0YXRpYyB2b2lkIGZhaWxfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIpOwotc3RhdGljIHZvaWQgcmV0cnlfd2FpdGluZ19sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcik7Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX2luaXQoCi0gICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIsCi0gICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BpY2tfc3ViY2hhbm5lbCBwaWNrX3N1YmNoYW5uZWwsCi0gICAgdm9pZCAqcGlja19zdWJjaGFubmVsX2FyZywgZ3JwY19jYWxsX3N0YWNrICpvd25pbmdfY2FsbCkgewotICBncHJfYXRtX3JlbF9zdG9yZSgmaG9sZGVyLT5zdWJjaGFubmVsX2NhbGwsIDApOwotICBob2xkZXItPnBpY2tfc3ViY2hhbm5lbCA9IHBpY2tfc3ViY2hhbm5lbDsKLSAgaG9sZGVyLT5waWNrX3N1YmNoYW5uZWxfYXJnID0gcGlja19zdWJjaGFubmVsX2FyZzsKLSAgZ3ByX211X2luaXQoJmhvbGRlci0+bXUpOwotICBob2xkZXItPmNvbm5lY3RlZF9zdWJjaGFubmVsID0gTlVMTDsKLSAgaG9sZGVyLT53YWl0aW5nX29wcyA9IE5VTEw7Ci0gIGhvbGRlci0+d2FpdGluZ19vcHNfY291bnQgPSAwOwotICBob2xkZXItPndhaXRpbmdfb3BzX2NhcGFjaXR5ID0gMDsKLSAgaG9sZGVyLT5jcmVhdGlvbl9waGFzZSA9IEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9OT1RfQ1JFQVRJTkc7Ci0gIGhvbGRlci0+b3duaW5nX2NhbGwgPSBvd25pbmdfY2FsbDsKLX0KLQotdm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIpIHsKLSAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGwgPSBHRVRfQ0FMTChob2xkZXIpOwotICBpZiAoY2FsbCAhPSBOVUxMICYmIGNhbGwgIT0gQ0FOQ0VMTEVEX0NBTEwpIHsKLSAgICBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9VTlJFRihleGVjX2N0eCwgY2FsbCwgImhvbGRlciIpOwotICB9Ci0gIEdQUl9BU1NFUlQoaG9sZGVyLT5jcmVhdGlvbl9waGFzZSA9PQotICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9OT1RfQ1JFQVRJTkcpOwotICBncHJfbXVfZGVzdHJveSgmaG9sZGVyLT5tdSk7Ci0gIEdQUl9BU1NFUlQoaG9sZGVyLT53YWl0aW5nX29wc19jb3VudCA9PSAwKTsKLSAgZ3ByX2ZyZWUoaG9sZGVyLT53YWl0aW5nX29wcyk7Ci19Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIC8qIHRyeSB0byAoYXRvbWljYWxseSkgZ2V0IHRoZSBjYWxsICovCi0gIGdycGNfc3ViY2hhbm5lbF9jYWxsICpjYWxsID0gR0VUX0NBTEwoaG9sZGVyKTsKLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcCIsIDApOwotICBpZiAoY2FsbCA9PSBDQU5DRUxMRURfQ0FMTCkgewotICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9maW5pc2hfd2l0aF9mYWlsdXJlKGV4ZWNfY3R4LCBvcCk7Ci0gICAgR1BSX1RJTUVSX0VORCgiZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AiLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGNhbGwgIT0gTlVMTCkgewotICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX3Byb2Nlc3Nfb3AoZXhlY19jdHgsIGNhbGwsIG9wKTsKLSAgICBHUFJfVElNRVJfRU5EKCJncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcCIsIDApOwotICAgIHJldHVybjsKLSAgfQotICAvKiB3ZSBmYWlsZWQ7IGxvY2sgYW5kIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyAqLwotICBncHJfbXVfbG9jaygmaG9sZGVyLT5tdSk7Ci1yZXRyeToKLSAgLyogbmVlZCB0byByZWNoZWNrIHRoYXQgYW5vdGhlciB0aHJlYWQgaGFzbid0IHNldCB0aGUgY2FsbCAqLwotICBjYWxsID0gR0VUX0NBTEwoaG9sZGVyKTsKLSAgaWYgKGNhbGwgPT0gQ0FOQ0VMTEVEX0NBTEwpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZob2xkZXItPm11KTsKLSAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZShleGVjX2N0eCwgb3ApOwotICAgIEdQUl9USU1FUl9FTkQoImdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9wZXJmb3JtX29wIiwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjYWxsICE9IE5VTEwpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZob2xkZXItPm11KTsKLSAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9wcm9jZXNzX29wKGV4ZWNfY3R4LCBjYWxsLCBvcCk7Ci0gICAgR1BSX1RJTUVSX0VORCgiZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AiLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogaWYgdGhpcyBpcyBhIGNhbmNlbGxhdGlvbiwgdGhlbiB3ZSBjYW4gcmFpc2Ugb3VyIGNhbmNlbGxlZCBmbGFnICovCi0gIGlmIChvcC0+Y2FuY2VsX3dpdGhfc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7Ci0gICAgaWYgKCFncHJfYXRtX3JlbF9jYXMoJmhvbGRlci0+c3ViY2hhbm5lbF9jYWxsLCAwLCAxKSkgewotICAgICAgZ290byByZXRyeTsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChob2xkZXItPmNyZWF0aW9uX3BoYXNlKSB7Ci0gICAgICAgIGNhc2UgR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX05PVF9DUkVBVElORzoKLSAgICAgICAgICBmYWlsX2xvY2tlZChleGVjX2N0eCwgaG9sZGVyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfUElDS0lOR19TVUJDSEFOTkVMOgotICAgICAgICAgIGhvbGRlci0+cGlja19zdWJjaGFubmVsKGV4ZWNfY3R4LCBob2xkZXItPnBpY2tfc3ViY2hhbm5lbF9hcmcsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvbGRlci0+Y29ubmVjdGVkX3N1YmNoYW5uZWwsIE5VTEwpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZ3ByX211X3VubG9jaygmaG9sZGVyLT5tdSk7Ci0gICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZShleGVjX2N0eCwgb3ApOwotICAgICAgR1BSX1RJTUVSX0VORCgiZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AiLCAwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIHN1YmNoYW5uZWwsIHRyeSB0byBnZXQgb25lICovCi0gIGlmIChob2xkZXItPmNyZWF0aW9uX3BoYXNlID09IEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9OT1RfQ1JFQVRJTkcgJiYKLSAgICAgIGhvbGRlci0+Y29ubmVjdGVkX3N1YmNoYW5uZWwgPT0gTlVMTCAmJgotICAgICAgb3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgaG9sZGVyLT5jcmVhdGlvbl9waGFzZSA9IEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9QSUNLSU5HX1NVQkNIQU5ORUw7Ci0gICAgZ3JwY19jbG9zdXJlX2luaXQoJmhvbGRlci0+bmV4dF9zdGVwLCBzdWJjaGFubmVsX3JlYWR5LCBob2xkZXIpOwotICAgIEdSUENfQ0FMTF9TVEFDS19SRUYoaG9sZGVyLT5vd25pbmdfY2FsbCwgInBpY2tfc3ViY2hhbm5lbCIpOwotICAgIGlmIChob2xkZXItPnBpY2tfc3ViY2hhbm5lbCgKLSAgICAgICAgICAgIGV4ZWNfY3R4LCBob2xkZXItPnBpY2tfc3ViY2hhbm5lbF9hcmcsIG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsCi0gICAgICAgICAgICAmaG9sZGVyLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgJmhvbGRlci0+bmV4dF9zdGVwKSkgewotICAgICAgaG9sZGVyLT5jcmVhdGlvbl9waGFzZSA9IEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9OT1RfQ1JFQVRJTkc7Ci0gICAgICBHUlBDX0NBTExfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIGhvbGRlci0+b3duaW5nX2NhbGwsICJwaWNrX3N1YmNoYW5uZWwiKTsKLSAgICB9Ci0gIH0KLSAgLyogaWYgd2UndmUgZ290IGEgc3ViY2hhbm5lbCwgdGhlbiBsZXQncyBhc2sgaXQgdG8gY3JlYXRlIGEgY2FsbCAqLwotICBpZiAoaG9sZGVyLT5jcmVhdGlvbl9waGFzZSA9PSBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfTk9UX0NSRUFUSU5HICYmCi0gICAgICBob2xkZXItPmNvbm5lY3RlZF9zdWJjaGFubmVsICE9IE5VTEwpIHsKLSAgICBncHJfYXRtX3JlbF9zdG9yZSgKLSAgICAgICAgJmhvbGRlci0+c3ViY2hhbm5lbF9jYWxsLAotICAgICAgICAoZ3ByX2F0bSkodWludHB0cl90KWdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfY3JlYXRlX2NhbGwoCi0gICAgICAgICAgICBleGVjX2N0eCwgaG9sZGVyLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgaG9sZGVyLT5wb2xsc2V0KSk7Ci0gICAgcmV0cnlfd2FpdGluZ19sb2NrZWQoZXhlY19jdHgsIGhvbGRlcik7Ci0gICAgZ290byByZXRyeTsKLSAgfQotICAvKiBub3RoaW5nIHRvIGJlIGRvbmUgYnV0IHdhaXQgKi8KLSAgYWRkX3dhaXRpbmdfbG9ja2VkKGhvbGRlciwgb3ApOwotICBncHJfbXVfdW5sb2NrKCZob2xkZXItPm11KTsKLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AiLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9yZWFkeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIgPSBhcmc7Ci0gIGdwcl9tdV9sb2NrKCZob2xkZXItPm11KTsKLSAgR1BSX0FTU0VSVChob2xkZXItPmNyZWF0aW9uX3BoYXNlID09Ci0gICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX1BJQ0tJTkdfU1VCQ0hBTk5FTCk7Ci0gIGhvbGRlci0+Y3JlYXRpb25fcGhhc2UgPSBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfTk9UX0NSRUFUSU5HOwotICBpZiAoaG9sZGVyLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCA9PSBOVUxMKSB7Ci0gICAgZmFpbF9sb2NrZWQoZXhlY19jdHgsIGhvbGRlcik7Ci0gIH0gZWxzZSBpZiAoMSA9PSBncHJfYXRtX2FjcV9sb2FkKCZob2xkZXItPnN1YmNoYW5uZWxfY2FsbCkpIHsKLSAgICAvKiBhbHJlYWR5IGNhbmNlbGxlZCBiZWZvcmUgc3ViY2hhbm5lbCBiZWNhbWUgcmVhZHkgKi8KLSAgICBmYWlsX2xvY2tlZChleGVjX2N0eCwgaG9sZGVyKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfYXRtX3JlbF9zdG9yZSgKLSAgICAgICAgJmhvbGRlci0+c3ViY2hhbm5lbF9jYWxsLAotICAgICAgICAoZ3ByX2F0bSkodWludHB0cl90KWdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfY3JlYXRlX2NhbGwoCi0gICAgICAgICAgICBleGVjX2N0eCwgaG9sZGVyLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgaG9sZGVyLT5wb2xsc2V0KSk7Ci0gICAgcmV0cnlfd2FpdGluZ19sb2NrZWQoZXhlY19jdHgsIGhvbGRlcik7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmaG9sZGVyLT5tdSk7Ci0gIEdSUENfQ0FMTF9TVEFDS19VTlJFRihleGVjX2N0eCwgaG9sZGVyLT5vd25pbmdfY2FsbCwgInBpY2tfc3ViY2hhbm5lbCIpOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3BzOwotICBzaXplX3Qgbm9wczsKLSAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGw7Ci19IHJldHJ5X29wc19hcmdzOwotCi1zdGF0aWMgdm9pZCByZXRyeV93YWl0aW5nX2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyKSB7Ci0gIHJldHJ5X29wc19hcmdzICphID0gZ3ByX21hbGxvYyhzaXplb2YoKmEpKTsKLSAgYS0+b3BzID0gaG9sZGVyLT53YWl0aW5nX29wczsKLSAgYS0+bm9wcyA9IGhvbGRlci0+d2FpdGluZ19vcHNfY291bnQ7Ci0gIGEtPmNhbGwgPSBHRVRfQ0FMTChob2xkZXIpOwotICBpZiAoYS0+Y2FsbCA9PSBDQU5DRUxMRURfQ0FMTCkgewotICAgIGdwcl9mcmVlKGEpOwotICAgIGZhaWxfbG9ja2VkKGV4ZWNfY3R4LCBob2xkZXIpOwotICAgIHJldHVybjsKLSAgfQotICBob2xkZXItPndhaXRpbmdfb3BzID0gTlVMTDsKLSAgaG9sZGVyLT53YWl0aW5nX29wc19jb3VudCA9IDA7Ci0gIGhvbGRlci0+d2FpdGluZ19vcHNfY2FwYWNpdHkgPSAwOwotICBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9SRUYoYS0+Y2FsbCwgInJldHJ5X29wcyIpOwotICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGdycGNfY2xvc3VyZV9jcmVhdGUocmV0cnlfb3BzLCBhKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCByZXRyeV9vcHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZ3MsIGJvb2wgc3VjY2VzcykgewotICByZXRyeV9vcHNfYXJncyAqYSA9IGFyZ3M7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgYS0+bm9wczsgaSsrKSB7Ci0gICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfcHJvY2Vzc19vcChleGVjX2N0eCwgYS0+Y2FsbCwgJmEtPm9wc1tpXSk7Ci0gIH0KLSAgR1JQQ19TVUJDSEFOTkVMX0NBTExfVU5SRUYoZXhlY19jdHgsIGEtPmNhbGwsICJyZXRyeV9vcHMiKTsKLSAgZ3ByX2ZyZWUoYS0+b3BzKTsKLSAgZ3ByX2ZyZWUoYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF93YWl0aW5nX2xvY2tlZChncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIEdQUl9USU1FUl9CRUdJTigiYWRkX3dhaXRpbmdfbG9ja2VkIiwgMCk7Ci0gIGlmIChob2xkZXItPndhaXRpbmdfb3BzX2NvdW50ID09IGhvbGRlci0+d2FpdGluZ19vcHNfY2FwYWNpdHkpIHsKLSAgICBob2xkZXItPndhaXRpbmdfb3BzX2NhcGFjaXR5ID0gR1BSX01BWCgzLCAyICogaG9sZGVyLT53YWl0aW5nX29wc19jYXBhY2l0eSk7Ci0gICAgaG9sZGVyLT53YWl0aW5nX29wcyA9Ci0gICAgICAgIGdwcl9yZWFsbG9jKGhvbGRlci0+d2FpdGluZ19vcHMsIGhvbGRlci0+d2FpdGluZ19vcHNfY2FwYWNpdHkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpob2xkZXItPndhaXRpbmdfb3BzKSk7Ci0gIH0KLSAgaG9sZGVyLT53YWl0aW5nX29wc1tob2xkZXItPndhaXRpbmdfb3BzX2NvdW50KytdID0gKm9wOwotICBHUFJfVElNRVJfRU5EKCJhZGRfd2FpdGluZ19sb2NrZWQiLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgZmFpbF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcikgewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGhvbGRlci0+d2FpdGluZ19vcHNfY291bnQ7IGkrKykgewotICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9maW5pc2hfd2l0aF9mYWlsdXJlKGV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob2xkZXItPndhaXRpbmdfb3BzW2ldKTsKLSAgfQotICBob2xkZXItPndhaXRpbmdfb3BzX2NvdW50ID0gMDsKLX0KLQotY2hhciAqZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX2dldF9wZWVyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcikgewotICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqc3ViY2hhbm5lbF9jYWxsID0gR0VUX0NBTEwoaG9sZGVyKTsKLQotICBpZiAoc3ViY2hhbm5lbF9jYWxsKSB7Ci0gICAgcmV0dXJuIGdycGNfc3ViY2hhbm5lbF9jYWxsX2dldF9wZWVyKGV4ZWNfY3R4LCBzdWJjaGFubmVsX2NhbGwpOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCBiL3NyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI0NjU3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0hBTk5FTF9TVUJDSEFOTkVMX0NBTExfSE9MREVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NIQU5ORUxfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKLQotLyoqIFBpY2sgYSBzdWJjaGFubmVsIGZvciBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXI7Ci0gICAgUmV0dXJuIDEgaWYgc3ViY2hhbm5lbCBpcyBhdmFpbGFibGUgaW1tZWRpYXRlbHkgKGluIHdoaWNoIGNhc2Ugb25fcmVhZHkKLSAgICBzaG91bGQgbm90IGJlIGNhbGxlZCksIG9yIDAgb3RoZXJ3aXNlIChpbiB3aGljaCBjYXNlIG9uX3JlYWR5IHNob3VsZCBiZQotICAgIGNhbGxlZCB3aGVuIHRoZSBzdWJjaGFubmVsIGlzIGF2YWlsYWJsZSkgKi8KLXR5cGVkZWYgaW50ICgqZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BpY2tfc3ViY2hhbm5lbCkoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgZ3JwY19tZXRhZGF0YV9iYXRjaCAqaW5pdGlhbF9tZXRhZGF0YSwKLSAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqY29ubmVjdGVkX3N1YmNoYW5uZWwsIGdycGNfY2xvc3VyZSAqb25fcmVhZHkpOwotCi10eXBlZGVmIGVudW0gewotICBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfTk9UX0NSRUFUSU5HLAotICBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfUElDS0lOR19TVUJDSEFOTkVMCi19IGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9jcmVhdGlvbl9waGFzZTsKLQotLyoqIFdyYXBwZXIgZm9yIGhvbGRpbmcgYSBwb2ludGVyIHRvIGdycGNfc3ViY2hhbm5lbF9jYWxsLCBhbmQgdGhlCi0gICAgYXNzb2NpYXRlZCBtYWNoaW5lcnkgdG8gY3JlYXRlIHN1Y2ggYSBwb2ludGVyLgotICAgIEhhbmRsZXMgcXVldWVpbmcgb2Ygc3RyZWFtIG9wcyB1bnRpbCBhIGNhbGwgb2JqZWN0IGlzIHJlYWR5LCB3YWl0aW5nCi0gICAgZm9yIGluaXRpYWwgbWV0YWRhdGEgYmVmb3JlIHRyeWluZyB0byBjcmVhdGUgYSBjYWxsIG9iamVjdCwKLSAgICBhbmQgaGFuZGxpbmcgY2FuY2VsbGF0aW9uIGdyYWNlZnVsbHkuCi0KLSAgICBUaGUgY2hhbm5lbCBmaWx0ZXIgdXNlcyB0aGlzIGFzIHRoZWlyIGNhbGxfZGF0YS4gKi8KLXR5cGVkZWYgc3RydWN0IGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciB7Ci0gIC8qKiBlaXRoZXIgMCBmb3Igbm8gY2FsbCwgMSBmb3IgY2FuY2VsbGVkLCBvciBhIHBvaW50ZXIgdG8gYQotICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKi8KLSAgZ3ByX2F0bSBzdWJjaGFubmVsX2NhbGw7Ci0gIC8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hvb3NlIHRoZSBzdWJjaGFubmVsIG9uIHdoaWNoIHRvIGNyZWF0ZQotICAgICAgdGhlIGNhbGwgb2JqZWN0LiBDaGFubmVsIGZpbHRlciBkZWxlZ2F0ZXMgdG8gdGhlIGxvYWQKLSAgICAgIGJhbGFuY2luZyBwb2xpY3kgKG9uY2UgaXQncyByZWFkeSkuICovCi0gIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9waWNrX3N1YmNoYW5uZWwgcGlja19zdWJjaGFubmVsOwotICB2b2lkICpwaWNrX3N1YmNoYW5uZWxfYXJnOwotCi0gIGdwcl9tdSBtdTsKLQotICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfY3JlYXRpb25fcGhhc2UgY3JlYXRpb25fcGhhc2U7Ci0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbm5lY3RlZF9zdWJjaGFubmVsOwotICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7Ci0KLSAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICp3YWl0aW5nX29wczsKLSAgc2l6ZV90IHdhaXRpbmdfb3BzX2NvdW50OwotICBzaXplX3Qgd2FpdGluZ19vcHNfY2FwYWNpdHk7Ci0KLSAgZ3JwY19jbG9zdXJlIG5leHRfc3RlcDsKLQotICBncnBjX2NhbGxfc3RhY2sgKm93bmluZ19jYWxsOwotfSBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXI7Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX2luaXQoCi0gICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIsCi0gICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BpY2tfc3ViY2hhbm5lbCBwaWNrX3N1YmNoYW5uZWwsCi0gICAgdm9pZCAqcGlja19zdWJjaGFubmVsX2FyZywgZ3JwY19jYWxsX3N0YWNrICpvd25pbmdfY2FsbCk7Ci12b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcik7Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKLWNoYXIgKmdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0hBTk5FTF9TVUJDSEFOTkVMX0NBTExfSE9MREVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDBhZjIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotCi1zdHJ1Y3QgZ3JwY19jbGllbnRfY29uZmlnIHsKLSAgZ3ByX3JlZmNvdW50IHJlZnM7Ci0gIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3k7Ci19OwotCi1ncnBjX2NsaWVudF9jb25maWcgKmdycGNfY2xpZW50X2NvbmZpZ19jcmVhdGUoKSB7Ci0gIGdycGNfY2xpZW50X2NvbmZpZyAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLSAgZ3ByX3JlZl9pbml0KCZjLT5yZWZzLCAxKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLXZvaWQgZ3JwY19jbGllbnRfY29uZmlnX3JlZihncnBjX2NsaWVudF9jb25maWcgKmMpIHsgZ3ByX3JlZigmYy0+cmVmcyk7IH0KLQotdm9pZCBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2xpZW50X2NvbmZpZyAqYykgewotICBpZiAoZ3ByX3VucmVmKCZjLT5yZWZzKSkgewotICAgIGlmIChjLT5sYl9wb2xpY3kgIT0gTlVMTCkgewotICAgICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGMtPmxiX3BvbGljeSwgImNsaWVudF9jb25maWciKTsKLSAgICB9Ci0gICAgZ3ByX2ZyZWUoYyk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX2NsaWVudF9jb25maWdfc2V0X2xiX3BvbGljeShncnBjX2NsaWVudF9jb25maWcgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3kpIHsKLSAgR1BSX0FTU0VSVChjLT5sYl9wb2xpY3kgPT0gTlVMTCk7Ci0gIGlmIChsYl9wb2xpY3kpIHsKLSAgICBHUlBDX0xCX1BPTElDWV9SRUYobGJfcG9saWN5LCAiY2xpZW50X2NvbmZpZyIpOwotICB9Ci0gIGMtPmxiX3BvbGljeSA9IGxiX3BvbGljeTsKLX0KLQotZ3JwY19sYl9wb2xpY3kgKmdycGNfY2xpZW50X2NvbmZpZ19nZXRfbGJfcG9saWN5KGdycGNfY2xpZW50X2NvbmZpZyAqYykgewotICByZXR1cm4gYy0+bGJfcG9saWN5OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzN2ZkYy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfQ0xJRU5UX0NPTkZJR19ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0NMSUVOVF9DT05GSUdfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIKLQotLyoqIFRvdGFsIGNvbmZpZ3VyYXRpb24gZm9yIGEgY2xpZW50LiBQcm92aWRlZCwgYW5kIHVwZGF0ZWQsIGJ5Ci0gICAgZ3JwY19yZXNvbHZlciAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jbGllbnRfY29uZmlnIGdycGNfY2xpZW50X2NvbmZpZzsKLQotZ3JwY19jbGllbnRfY29uZmlnICpncnBjX2NsaWVudF9jb25maWdfY3JlYXRlKCk7Ci12b2lkIGdycGNfY2xpZW50X2NvbmZpZ19yZWYoZ3JwY19jbGllbnRfY29uZmlnICpjbGllbnRfY29uZmlnKTsKLXZvaWQgZ3JwY19jbGllbnRfY29uZmlnX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbGllbnRfY29uZmlnICpjbGllbnRfY29uZmlnKTsKLQotdm9pZCBncnBjX2NsaWVudF9jb25maWdfc2V0X2xiX3BvbGljeShncnBjX2NsaWVudF9jb25maWcgKmNsaWVudF9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3kpOwotZ3JwY19sYl9wb2xpY3kgKmdycGNfY2xpZW50X2NvbmZpZ19nZXRfbGJfcG9saWN5KAotICAgIGdycGNfY2xpZW50X2NvbmZpZyAqY2xpZW50X2NvbmZpZyk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19DTElFTlRfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMgYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM0YWE3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCIKLQotZ3JwY19jb25uZWN0b3IqIGdycGNfY29ubmVjdG9yX3JlZihncnBjX2Nvbm5lY3RvciogY29ubmVjdG9yKSB7Ci0gIGNvbm5lY3Rvci0+dnRhYmxlLT5yZWYoY29ubmVjdG9yKTsKLSAgcmV0dXJuIGNvbm5lY3RvcjsKLX0KLQotdm9pZCBncnBjX2Nvbm5lY3Rvcl91bnJlZihncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IqIGNvbm5lY3RvcikgewotICBjb25uZWN0b3ItPnZ0YWJsZS0+dW5yZWYoZXhlY19jdHgsIGNvbm5lY3Rvcik7Ci19Ci0KLXZvaWQgZ3JwY19jb25uZWN0b3JfY29ubmVjdChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IqIGNvbm5lY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2Nvbm5lY3RfaW5fYXJncyogaW5fYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MqIG91dF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSogbm90aWZ5KSB7Ci0gIGNvbm5lY3Rvci0+dnRhYmxlLT5jb25uZWN0KGV4ZWNfY3R4LCBjb25uZWN0b3IsIGluX2FyZ3MsIG91dF9hcmdzLCBub3RpZnkpOwotfQotCi12b2lkIGdycGNfY29ubmVjdG9yX3NodXRkb3duKGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RvciogY29ubmVjdG9yKSB7Ci0gIGNvbm5lY3Rvci0+dnRhYmxlLT5zaHV0ZG93bihleGVjX2N0eCwgY29ubmVjdG9yKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzI0OGZjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0NPTk5FQ1RPUl9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0NPTk5FQ1RPUl9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jb25uZWN0b3IgZ3JwY19jb25uZWN0b3I7Ci10eXBlZGVmIHN0cnVjdCBncnBjX2Nvbm5lY3Rvcl92dGFibGUgZ3JwY19jb25uZWN0b3JfdnRhYmxlOwotCi1zdHJ1Y3QgZ3JwY19jb25uZWN0b3IgewotICBjb25zdCBncnBjX2Nvbm5lY3Rvcl92dGFibGUgKnZ0YWJsZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHNldCBvZiBwb2xsc2V0cyBpbnRlcmVzdGVkIGluIHRoaXMgY29ubmVjdGlvbiAqLwotICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXM7Ci0gIC8qKiBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gKi8KLSAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyOwotICBzaXplX3QgYWRkcl9sZW47Ci0gIC8qKiBpbml0aWFsIGNvbm5lY3Qgc3RyaW5nIHRvIHNlbmQgKi8KLSAgZ3ByX3NsaWNlIGluaXRpYWxfY29ubmVjdF9zdHJpbmc7Ci0gIC8qKiBkZWFkbGluZSBmb3IgY29ubmVjdGlvbiAqLwotICBncHJfdGltZXNwZWMgZGVhZGxpbmU7Ci0gIC8qKiBjaGFubmVsIGFyZ3VtZW50cyAodG8gYmUgcGFzc2VkIHRvIHRyYW5zcG9ydCkgKi8KLSAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmNoYW5uZWxfYXJnczsKLX0gZ3JwY19jb25uZWN0X2luX2FyZ3M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIHRoZSBjb25uZWN0ZWQgdHJhbnNwb3J0ICovCi0gIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0KLSAgLyoqIGNoYW5uZWwgYXJndW1lbnRzICh0byBiZSBwYXNzZWQgdG8gdGhlIGZpbHRlcnMpICovCi0gIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3M7Ci19IGdycGNfY29ubmVjdF9vdXRfYXJnczsKLQotc3RydWN0IGdycGNfY29ubmVjdG9yX3Z0YWJsZSB7Ci0gIHZvaWQgKCpyZWYpKGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IpOwotICB2b2lkICgqdW5yZWYpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKLSAgLyoqIEltcGxlbWVudGF0aW9uIG9mIGdycGNfY29ubmVjdG9yX3NodXRkb3duICovCi0gIHZvaWQgKCpzaHV0ZG93bikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IpOwotICAvKiogSW1wbGVtZW50YXRpb24gb2YgZ3JwY19jb25uZWN0b3JfY29ubmVjdCAqLwotICB2b2lkICgqY29ubmVjdCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2Nvbm5lY3RfaW5fYXJncyAqaW5fYXJncywKLSAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdF9vdXRfYXJncyAqb3V0X2FyZ3MsIGdycGNfY2xvc3VyZSAqbm90aWZ5KTsKLX07Ci0KLWdycGNfY29ubmVjdG9yICpncnBjX2Nvbm5lY3Rvcl9yZWYoZ3JwY19jb25uZWN0b3IgKmNvbm5lY3Rvcik7Ci12b2lkIGdycGNfY29ubmVjdG9yX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKLS8qKiBDb25uZWN0IHVzaW5nIHRoZSBjb25uZWN0b3I6IG1heCBvbmUgb3V0c3RhbmRpbmcgY2FsbCBhdCBhIHRpbWUgKi8KLXZvaWQgZ3JwY19jb25uZWN0b3JfY29ubmVjdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2Nvbm5lY3RfaW5fYXJncyAqaW5fYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MgKm91dF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KTsKLS8qKiBDYW5jZWwgYW55IHBlbmRpbmcgY29ubmVjdGlvbiAqLwotdm9pZCBncnBjX2Nvbm5lY3Rvcl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3Rvcik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19DT05ORUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGUyM2UuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCIKLQotdm9pZCBncnBjX3NldF9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcoc3RydWN0IHNvY2thZGRyICoqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWRkcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKmluaXRpYWxfc3RyKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZmExNi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotZXh0ZXJuIHZvaWQgZ3JwY19zZXRfZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKHN0cnVjdCBzb2NrYWRkciAqKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphZGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKmluaXRpYWxfc3RyKTsKLQotc3RhdGljIGdycGNfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfZnVuYyBnX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX2Z1bmMgPQotICAgIGdycGNfc2V0X2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZzsKLQotdm9pZCBncnBjX3Rlc3Rfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfZnVuY3Rpb24oCi0gICAgZ3JwY19zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ19mdW5jIGZ1bmMpIHsKLSAgZ19zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ19mdW5jID0gZnVuYzsKLX0KLQotdm9pZCBncnBjX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKHN0cnVjdCBzb2NrYWRkciAqKmFkZHIsIHNpemVfdCAqYWRkcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICppbml0aWFsX3N0cikgewotICBnX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX2Z1bmMoYWRkciwgYWRkcl9sZW4sIGluaXRpYWxfc3RyKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDJkOGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0lOSVRJQUxfQ09OTkVDVF9TVFJJTkdfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19JTklUSUFMX0NPTk5FQ1RfU1RSSU5HX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0KLXR5cGVkZWYgdm9pZCAoKmdycGNfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfZnVuYykoc3RydWN0IHNvY2thZGRyICoqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphZGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICppbml0aWFsX3N0cik7Ci12b2lkIGdycGNfdGVzdF9zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ19mdW5jdGlvbigKLSAgICBncnBjX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX2Z1bmMgZnVuYyk7Ci0KLS8qKiBTZXQgYSBzdHJpbmcgdG8gYmUgc2VudCBvbmNlIGNvbm5lY3RlZC4gT3B0aW9uYWxseSByZXNldCBhZGRyLiAqLwotdm9pZCBncnBjX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKHN0cnVjdCBzb2NrYWRkciAqKmFkZHIsIHNpemVfdCAqYWRkcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpjb25uZWN0X3N0cmluZyk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19JTklUSUFMX0NPTk5FQ1RfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiNTc4NS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotCi10eXBlZGVmIHN0cnVjdCBkZWNvZGVfc2VydmVybGlzdF9hcmcgewotICBpbnQgZmlyc3RfcGFzczsKLSAgaW50IGk7Ci0gIHNpemVfdCBudW1fc2VydmVyczsKLSAgZ3JwY19ncnBjbGJfc2VydmVyICoqc2VydmVyczsKLX0gZGVjb2RlX3NlcnZlcmxpc3RfYXJnOwotCi0vKiBpbnZva2VkIG9uY2UgZm9yIGV2ZXJ5IFNlcnZlciBpbiBTZXJ2ZXJMaXN0ICovCi1zdGF0aWMgYm9vbCBkZWNvZGVfc2VydmVybGlzdChwYl9pc3RyZWFtX3QgKnN0cmVhbSwgY29uc3QgcGJfZmllbGRfdCAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJnKSB7Ci0gIGRlY29kZV9zZXJ2ZXJsaXN0X2FyZyAqZGVjX2FyZyA9ICphcmc7Ci0gIGlmIChkZWNfYXJnLT5maXJzdF9wYXNzICE9IDApIHsgLyogZmlyc3QgcGFzcyAqLwotICAgIGdycGNfZ3JwY2xiX3NlcnZlciBzZXJ2ZXI7Ci0gICAgaWYgKCFwYl9kZWNvZGUoc3RyZWFtLCBncnBjX2xiX3YwX1NlcnZlcl9maWVsZHMsICZzZXJ2ZXIpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGRlY19hcmctPm51bV9zZXJ2ZXJzKys7Ci0gIH0gZWxzZSB7IC8qIHNlY29uZCBwYXNzICovCi0gICAgZ3JwY19ncnBjbGJfc2VydmVyICpzZXJ2ZXIgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9zZXJ2ZXIpKTsKLSAgICBHUFJfQVNTRVJUKGRlY19hcmctPm51bV9zZXJ2ZXJzID4gMCk7Ci0gICAgaWYgKGRlY19hcmctPmkgPT0gMCkgeyAvKiBmaXJzdCBpdGVyYXRpb24gb2Ygc2Vjb25kIHBhc3MgKi8KLSAgICAgIGRlY19hcmctPnNlcnZlcnMgPQotICAgICAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfZ3JwY2xiX3NlcnZlciAqKSAqIGRlY19hcmctPm51bV9zZXJ2ZXJzKTsKLSAgICB9Ci0gICAgaWYgKCFwYl9kZWNvZGUoc3RyZWFtLCBncnBjX2xiX3YwX1NlcnZlcl9maWVsZHMsIHNlcnZlcikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZGVjX2FyZy0+c2VydmVyc1tkZWNfYXJnLT5pKytdID0gc2VydmVyOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWdycGNfZ3JwY2xiX3JlcXVlc3QgKmdycGNfZ3JwY2xiX3JlcXVlc3RfY3JlYXRlKGNvbnN0IGNoYXIgKmxiX3NlcnZpY2VfbmFtZSkgewotICBncnBjX2dycGNsYl9yZXF1ZXN0ICpyZXEgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9yZXF1ZXN0KSk7Ci0KLSAgcmVxLT5oYXNfY2xpZW50X3N0YXRzID0gMDsgLyogVE9ETyhkZ3EpOiBhZGQgc3VwcG9ydCBmb3Igc3RhdHMgb25jZSBkZWZpbmVkICovCi0gIHJlcS0+aGFzX2luaXRpYWxfcmVxdWVzdCA9IDE7Ci0gIHJlcS0+aW5pdGlhbF9yZXF1ZXN0Lmhhc19uYW1lID0gMTsKLSAgc3RybmNweShyZXEtPmluaXRpYWxfcmVxdWVzdC5uYW1lLCBsYl9zZXJ2aWNlX25hbWUsCi0gICAgICAgICAgR1JQQ19HUlBDTEJfU0VSVklDRV9OQU1FX01BWF9MRU5HVEgpOwotICByZXR1cm4gcmVxOwotfQotCi1ncHJfc2xpY2UgZ3JwY19ncnBjbGJfcmVxdWVzdF9lbmNvZGUoY29uc3QgZ3JwY19ncnBjbGJfcmVxdWVzdCAqcmVxdWVzdCkgewotICBzaXplX3QgZW5jb2RlZF9sZW5ndGg7Ci0gIHBiX29zdHJlYW1fdCBzaXplc3RyZWFtOwotICBwYl9vc3RyZWFtX3Qgb3V0cHV0c3RyZWFtOwotICBncHJfc2xpY2Ugc2xpY2U7Ci0gIG1lbXNldCgmc2l6ZXN0cmVhbSwgMCwgc2l6ZW9mKHBiX29zdHJlYW1fdCkpOwotICBwYl9lbmNvZGUoJnNpemVzdHJlYW0sIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0X2ZpZWxkcywgcmVxdWVzdCk7Ci0gIGVuY29kZWRfbGVuZ3RoID0gc2l6ZXN0cmVhbS5ieXRlc193cml0dGVuOwotCi0gIHNsaWNlID0gZ3ByX3NsaWNlX21hbGxvYyhlbmNvZGVkX2xlbmd0aCk7Ci0gIG91dHB1dHN0cmVhbSA9Ci0gICAgICBwYl9vc3RyZWFtX2Zyb21fYnVmZmVyKEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpLCBlbmNvZGVkX2xlbmd0aCk7Ci0gIEdQUl9BU1NFUlQocGJfZW5jb2RlKCZvdXRwdXRzdHJlYW0sIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0X2ZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCkgIT0gMCk7Ci0gIHJldHVybiBzbGljZTsKLX0KLQotdm9pZCBncnBjX2dycGNsYl9yZXF1ZXN0X2Rlc3Ryb3koZ3JwY19ncnBjbGJfcmVxdWVzdCAqcmVxdWVzdCkgewotICBncHJfZnJlZShyZXF1ZXN0KTsKLX0KLQotZ3JwY19ncnBjbGJfcmVzcG9uc2UgKmdycGNfZ3JwY2xiX3Jlc3BvbnNlX3BhcnNlKGdwcl9zbGljZSBlbmNvZGVkX3Jlc3BvbnNlKSB7Ci0gIGJvb2wgc3RhdHVzOwotICBwYl9pc3RyZWFtX3Qgc3RyZWFtID0KLSAgICAgIHBiX2lzdHJlYW1fZnJvbV9idWZmZXIoR1BSX1NMSUNFX1NUQVJUX1BUUihlbmNvZGVkX3Jlc3BvbnNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChlbmNvZGVkX3Jlc3BvbnNlKSk7Ci0gIGdycGNfZ3JwY2xiX3Jlc3BvbnNlICpyZXMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9yZXNwb25zZSkpOwotICBtZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOwotICBzdGF0dXMgPSBwYl9kZWNvZGUoJnN0cmVhbSwgZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlc3BvbnNlX2ZpZWxkcywgcmVzKTsKLSAgR1BSX0FTU0VSVChzdGF0dXMgPT0gdHJ1ZSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWdycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKmdycGNfZ3JwY2xiX3Jlc3BvbnNlX3BhcnNlX3NlcnZlcmxpc3QoCi0gICAgZ3ByX3NsaWNlIGVuY29kZWRfcmVzcG9uc2UpIHsKLSAgZ3JwY19ncnBjbGJfc2VydmVybGlzdCAqc2wgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9zZXJ2ZXJsaXN0KSk7Ci0gIGJvb2wgc3RhdHVzOwotICBkZWNvZGVfc2VydmVybGlzdF9hcmcgYXJnOwotICBwYl9pc3RyZWFtX3Qgc3RyZWFtID0KLSAgICAgIHBiX2lzdHJlYW1fZnJvbV9idWZmZXIoR1BSX1NMSUNFX1NUQVJUX1BUUihlbmNvZGVkX3Jlc3BvbnNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChlbmNvZGVkX3Jlc3BvbnNlKSk7Ci0gIHBiX2lzdHJlYW1fdCBzdHJlYW1fYXRfc3RhcnQgPSBzdHJlYW07Ci0gIGdycGNfZ3JwY2xiX3Jlc3BvbnNlICpyZXMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9yZXNwb25zZSkpOwotICBtZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOwotICBtZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGRlY29kZV9zZXJ2ZXJsaXN0X2FyZykpOwotCi0gIHJlcy0+c2VydmVyX2xpc3Quc2VydmVycy5mdW5jcy5kZWNvZGUgPSBkZWNvZGVfc2VydmVybGlzdDsKLSAgcmVzLT5zZXJ2ZXJfbGlzdC5zZXJ2ZXJzLmFyZyA9ICZhcmc7Ci0gIGFyZy5maXJzdF9wYXNzID0gMTsKLSAgc3RhdHVzID0gcGJfZGVjb2RlKCZzdHJlYW0sIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZV9maWVsZHMsIHJlcyk7Ci0gIEdQUl9BU1NFUlQoc3RhdHVzID09IHRydWUpOwotICBHUFJfQVNTRVJUKGFyZy5udW1fc2VydmVycyA+IDApOwotCi0gIGFyZy5maXJzdF9wYXNzID0gMDsKLSAgc3RhdHVzID0KLSAgICAgIHBiX2RlY29kZSgmc3RyZWFtX2F0X3N0YXJ0LCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2VfZmllbGRzLCByZXMpOwotICBHUFJfQVNTRVJUKHN0YXR1cyA9PSB0cnVlKTsKLSAgR1BSX0FTU0VSVChhcmcuc2VydmVycyAhPSBOVUxMKTsKLQotICBzbC0+bnVtX3NlcnZlcnMgPSBhcmcubnVtX3NlcnZlcnM7Ci0gIHNsLT5zZXJ2ZXJzID0gYXJnLnNlcnZlcnM7Ci0gIGlmIChyZXMtPnNlcnZlcl9saXN0Lmhhc19leHBpcmF0aW9uX2ludGVydmFsKSB7Ci0gICAgc2wtPmV4cGlyYXRpb25faW50ZXJ2YWwgPSByZXMtPnNlcnZlcl9saXN0LmV4cGlyYXRpb25faW50ZXJ2YWw7Ci0gIH0KLSAgZ3JwY19ncnBjbGJfcmVzcG9uc2VfZGVzdHJveShyZXMpOwotICByZXR1cm4gc2w7Ci19Ci0KLXZvaWQgZ3JwY19ncnBjbGJfZGVzdHJveV9zZXJ2ZXJsaXN0KGdycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKnNlcnZlcmxpc3QpIHsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJsaXN0LT5udW1fc2VydmVyczsgaSsrKSB7Ci0gICAgZ3ByX2ZyZWUoc2VydmVybGlzdC0+c2VydmVyc1tpXSk7Ci0gIH0KLSAgZ3ByX2ZyZWUoc2VydmVybGlzdC0+c2VydmVycyk7Ci0gIGdwcl9mcmVlKHNlcnZlcmxpc3QpOwotfQotCi12b2lkIGdycGNfZ3JwY2xiX3Jlc3BvbnNlX2Rlc3Ryb3koZ3JwY19ncnBjbGJfcmVzcG9uc2UgKnJlc3BvbnNlKSB7Ci0gIGdwcl9mcmVlKHJlc3BvbnNlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhNGM5Yy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19MT0FEX0JBTEFOQ0VSX0FQSV9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0xCX1BPTElDSUVTX0xPQURfQkFMQU5DRVJfQVBJX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIEdSUENfR1JQQ0xCX1NFUlZJQ0VfTkFNRV9NQVhfTEVOR1RIIDEyOAotCi10eXBlZGVmIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0IGdycGNfZ3JwY2xiX3JlcXVlc3Q7Ci10eXBlZGVmIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSBncnBjX2dycGNsYl9yZXNwb25zZTsKLXR5cGVkZWYgZ3JwY19sYl92MF9TZXJ2ZXIgZ3JwY19ncnBjbGJfc2VydmVyOwotdHlwZWRlZiBncnBjX2xiX3YwX0R1cmF0aW9uIGdycGNfZ3JwY2xiX2R1cmF0aW9uOwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19ncnBjbGJfc2VydmVybGlzdCB7Ci0gIGdycGNfZ3JwY2xiX3NlcnZlciAqKnNlcnZlcnM7Ci0gIHNpemVfdCBudW1fc2VydmVyczsKLSAgZ3JwY19ncnBjbGJfZHVyYXRpb24gZXhwaXJhdGlvbl9pbnRlcnZhbDsKLX0gZ3JwY19ncnBjbGJfc2VydmVybGlzdDsKLQotLyoqIENyZWF0ZSBhIHJlcXVlc3QgZm9yIGEgZ1JQQyBMQiBzZXJ2aWNlIHVuZGVyIFxhIGxiX3NlcnZpY2VfbmFtZSAqLwotZ3JwY19ncnBjbGJfcmVxdWVzdCAqZ3JwY19ncnBjbGJfcmVxdWVzdF9jcmVhdGUoY29uc3QgY2hhciAqbGJfc2VydmljZV9uYW1lKTsKLQotLyoqIFByb3RvY29sIEJ1ZmZlcnMgdjMtZW5jb2RlIFxhIHJlcXVlc3QgKi8KLWdwcl9zbGljZSBncnBjX2dycGNsYl9yZXF1ZXN0X2VuY29kZShjb25zdCBncnBjX2dycGNsYl9yZXF1ZXN0ICpyZXF1ZXN0KTsKLQotLyoqIERlc3Ryb3kgXGEgcmVxdWVzdCAqLwotdm9pZCBncnBjX2dycGNsYl9yZXF1ZXN0X2Rlc3Ryb3koZ3JwY19ncnBjbGJfcmVxdWVzdCAqcmVxdWVzdCk7Ci0KLS8qKiBQYXJzZSAoaWUsIGRlY29kZSkgdGhlIGJ5dGVzIGluIFxhIGVuY29kZWRfcmVzcG9uc2UgYXMgYSBcYQotICogZ3JwY19ncnBjbGJfcmVzcG9uc2UgKi8KLWdycGNfZ3JwY2xiX3Jlc3BvbnNlICpncnBjX2dycGNsYl9yZXNwb25zZV9wYXJzZShncHJfc2xpY2UgZW5jb2RlZF9yZXNwb25zZSk7Ci0KLS8qKiBEZXN0cm95IFxhIHNlcnZlcmxpc3QgKi8KLXZvaWQgZ3JwY19ncnBjbGJfZGVzdHJveV9zZXJ2ZXJsaXN0KGdycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKnNlcnZlcmxpc3QpOwotCi0vKiogUGFyc2UgdGhlIGxpc3Qgb2Ygc2VydmVycyBmcm9tIGFuIGVuY29kZWQgXGEgZ3JwY19ncnBjbGJfcmVzcG9uc2UgKi8KLWdycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKmdycGNfZ3JwY2xiX3Jlc3BvbnNlX3BhcnNlX3NlcnZlcmxpc3QoCi0gICAgZ3ByX3NsaWNlIGVuY29kZWRfcmVzcG9uc2UpOwotCi0vKiogRGVzdHJveSBcYSByZXNwb25zZSAqLwotdm9pZCBncnBjX2dycGNsYl9yZXNwb25zZV9kZXN0cm95KGdycGNfZ3JwY2xiX3Jlc3BvbnNlICpyZXNwb25zZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19MT0FEX0JBTEFOQ0VSX0FQSV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODMzZjExLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgcGVuZGluZ19waWNrIHsKLSAgc3RydWN0IHBlbmRpbmdfcGljayAqbmV4dDsKLSAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OwotICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0OwotICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlOwotfSBwZW5kaW5nX3BpY2s7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIGJhc2UgcG9saWN5OiBtdXN0IGJlIGZpcnN0ICovCi0gIGdycGNfbGJfcG9saWN5IGJhc2U7Ci0gIC8qKiBhbGwgb3VyIHN1YmNoYW5uZWxzICovCi0gIGdycGNfc3ViY2hhbm5lbCAqKnN1YmNoYW5uZWxzOwotICBzaXplX3QgbnVtX3N1YmNoYW5uZWxzOwotCi0gIGdycGNfY2xvc3VyZSBjb25uZWN0aXZpdHlfY2hhbmdlZDsKLQotICAvKiogdGhlIHNlbGVjdGVkIGNoYW5uZWwgKGEgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCkgKi8KLSAgZ3ByX2F0bSBzZWxlY3RlZDsKLQotICAvKiogbXV0ZXggcHJvdGVjdGluZyByZW1haW5pbmcgbWVtYmVycyAqLwotICBncHJfbXUgbXU7Ci0gIC8qKiBoYXZlIHdlIHN0YXJ0ZWQgcGlja2luZz8gKi8KLSAgaW50IHN0YXJ0ZWRfcGlja2luZzsKLSAgLyoqIGFyZSB3ZSBzaHV0IGRvd24/ICovCi0gIGludCBzaHV0ZG93bjsKLSAgLyoqIHdoaWNoIHN1YmNoYW5uZWwgYXJlIHdlIHdhdGNoaW5nPyAqLwotICBzaXplX3QgY2hlY2tpbmdfc3ViY2hhbm5lbDsKLSAgLyoqIHdoYXQgaXMgdGhlIGNvbm5lY3Rpdml0eSBvZiB0aGF0IGNoYW5uZWw/ICovCi0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGNoZWNraW5nX2Nvbm5lY3Rpdml0eTsKLSAgLyoqIGxpc3Qgb2YgcGlja3MgdGhhdCBhcmUgd2FpdGluZyBvbiBjb25uZWN0aXZpdHkgKi8KLSAgcGVuZGluZ19waWNrICpwZW5kaW5nX3BpY2tzOwotCi0gIC8qKiBvdXIgY29ubmVjdGl2aXR5IHN0YXRlIHRyYWNrZXIgKi8KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciBzdGF0ZV90cmFja2VyOwotfSBwaWNrX2ZpcnN0X2xiX3BvbGljeTsKLQotI2RlZmluZSBHRVRfU0VMRUNURUQocCkgXAotICAoKGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKilncHJfYXRtX2FjcV9sb2FkKCYocCktPnNlbGVjdGVkKSkKLQotdm9pZCBwZl9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sKSB7Ci0gIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOwotICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpzZWxlY3RlZCA9IEdFVF9TRUxFQ1RFRChwKTsKLSAgc2l6ZV90IGk7Ci0gIEdQUl9BU1NFUlQocC0+cGVuZGluZ19waWNrcyA9PSBOVUxMKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm51bV9zdWJjaGFubmVsczsgaSsrKSB7Ci0gICAgR1JQQ19TVUJDSEFOTkVMX1VOUkVGKGV4ZWNfY3R4LCBwLT5zdWJjaGFubmVsc1tpXSwgInBpY2tfZmlyc3QiKTsKLSAgfQotICBpZiAoc2VsZWN0ZWQgIT0gTlVMTCkgewotICAgIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfVU5SRUYoZXhlY19jdHgsIHNlbGVjdGVkLCAicGlja2VkX2ZpcnN0Iik7Ci0gIH0KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfZGVzdHJveShleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIpOwotICBncHJfZnJlZShwLT5zdWJjaGFubmVscyk7Ci0gIGdwcl9tdV9kZXN0cm95KCZwLT5tdSk7Ci0gIGdwcl9mcmVlKHApOwotfQotCi12b2lkIHBmX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sKSB7Ci0gIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOwotICBwZW5kaW5nX3BpY2sgKnBwOwotICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpzZWxlY3RlZDsKLSAgZ3ByX211X2xvY2soJnAtPm11KTsKLSAgc2VsZWN0ZWQgPSBHRVRfU0VMRUNURUQocCk7Ci0gIHAtPnNodXRkb3duID0gMTsKLSAgcHAgPSBwLT5wZW5kaW5nX3BpY2tzOwotICBwLT5wZW5kaW5nX3BpY2tzID0gTlVMTDsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFLCAic2h1dGRvd24iKTsKLSAgLyogY2FuY2VsIHN1YnNjcmlwdGlvbiAqLwotICBpZiAoc2VsZWN0ZWQgIT0gTlVMTCkgewotICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgICAgZXhlY19jdHgsIHNlbGVjdGVkLCBOVUxMLCBOVUxMLCAmcC0+Y29ubmVjdGl2aXR5X2NoYW5nZWQpOwotICB9IGVsc2UgewotICAgIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgICAgICBleGVjX2N0eCwgcC0+c3ViY2hhbm5lbHNbcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbF0sIE5VTEwsIE5VTEwsCi0gICAgICAgICZwLT5jb25uZWN0aXZpdHlfY2hhbmdlZCk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotICB3aGlsZSAocHAgIT0gTlVMTCkgewotICAgIHBlbmRpbmdfcGljayAqbmV4dCA9IHBwLT5uZXh0OwotICAgICpwcC0+dGFyZ2V0ID0gTlVMTDsKLSAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGV4ZWNfY3R4LCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwLT5wb2xsc2V0KTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBwLT5vbl9jb21wbGV0ZSwgdHJ1ZSwgTlVMTCk7Ci0gICAgZ3ByX2ZyZWUocHApOwotICAgIHBwID0gbmV4dDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBwZl9jYW5jZWxfcGljayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKip0YXJnZXQpIHsKLSAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSAocGlja19maXJzdF9sYl9wb2xpY3kgKilwb2w7Ci0gIHBlbmRpbmdfcGljayAqcHA7Ci0gIGdwcl9tdV9sb2NrKCZwLT5tdSk7Ci0gIHBwID0gcC0+cGVuZGluZ19waWNrczsKLSAgcC0+cGVuZGluZ19waWNrcyA9IE5VTEw7Ci0gIHdoaWxlIChwcCAhPSBOVUxMKSB7Ci0gICAgcGVuZGluZ19waWNrICpuZXh0ID0gcHAtPm5leHQ7Ci0gICAgaWYgKHBwLT50YXJnZXQgPT0gdGFyZ2V0KSB7Ci0gICAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGV4ZWNfY3R4LCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAtPnBvbGxzZXQpOwotICAgICAgKnRhcmdldCA9IE5VTEw7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBwLT5vbl9jb21wbGV0ZSwgZmFsc2UsIE5VTEwpOwotICAgICAgZ3ByX2ZyZWUocHApOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcC0+bmV4dCA9IHAtPnBlbmRpbmdfcGlja3M7Ci0gICAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHA7Ci0gICAgfQotICAgIHBwID0gbmV4dDsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X3BpY2tpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwKSB7Ci0gIHAtPnN0YXJ0ZWRfcGlja2luZyA9IDE7Ci0gIHAtPmNoZWNraW5nX3N1YmNoYW5uZWwgPSAwOwotICBwLT5jaGVja2luZ19jb25uZWN0aXZpdHkgPSBHUlBDX0NIQU5ORUxfSURMRTsKLSAgR1JQQ19MQl9QT0xJQ1lfV0VBS19SRUYoJnAtPmJhc2UsICJwaWNrX2ZpcnN0X2Nvbm5lY3Rpdml0eSIpOwotICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgIGV4ZWNfY3R4LCBwLT5zdWJjaGFubmVsc1twLT5jaGVja2luZ19zdWJjaGFubmVsXSwKLSAgICAgIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLCAmcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5LAotICAgICAgJnAtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkKTsKLX0KLQotdm9pZCBwZl9leGl0X2lkbGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wpIHsKLSAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSAocGlja19maXJzdF9sYl9wb2xpY3kgKilwb2w7Ci0gIGdwcl9tdV9sb2NrKCZwLT5tdSk7Ci0gIGlmICghcC0+c3RhcnRlZF9waWNraW5nKSB7Ci0gICAgc3RhcnRfcGlja2luZyhleGVjX2N0eCwgcCk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotfQotCi1pbnQgcGZfcGljayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqaW5pdGlhbF9tZXRhZGF0YSwKLSAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKip0YXJnZXQsIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpIHsKLSAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSAocGlja19maXJzdF9sYl9wb2xpY3kgKilwb2w7Ci0gIHBlbmRpbmdfcGljayAqcHA7Ci0KLSAgLyogQ2hlY2sgYXRvbWljYWxseSBmb3IgYSBzZWxlY3RlZCBjaGFubmVsICovCi0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKnNlbGVjdGVkID0gR0VUX1NFTEVDVEVEKHApOwotICBpZiAoc2VsZWN0ZWQgIT0gTlVMTCkgewotICAgICp0YXJnZXQgPSBzZWxlY3RlZDsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8qIE5vIHN1YmNoYW5uZWwgc2VsZWN0ZWQgeWV0LCBzbyBhY3F1aXJlIGxvY2sgYW5kIHRoZW4gYXR0ZW1wdCBhZ2FpbiAqLwotICBncHJfbXVfbG9jaygmcC0+bXUpOwotICBzZWxlY3RlZCA9IEdFVF9TRUxFQ1RFRChwKTsKLSAgaWYgKHNlbGVjdGVkKSB7Ci0gICAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotICAgICp0YXJnZXQgPSBzZWxlY3RlZDsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoIXAtPnN0YXJ0ZWRfcGlja2luZykgewotICAgICAgc3RhcnRfcGlja2luZyhleGVjX2N0eCwgcCk7Ci0gICAgfQotICAgIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXQoZXhlY19jdHgsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLCBwb2xsc2V0KTsKLSAgICBwcCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpwcCkpOwotICAgIHBwLT5uZXh0ID0gcC0+cGVuZGluZ19waWNrczsKLSAgICBwcC0+cG9sbHNldCA9IHBvbGxzZXQ7Ci0gICAgcHAtPnRhcmdldCA9IHRhcmdldDsKLSAgICBwcC0+b25fY29tcGxldGUgPSBvbl9jb21wbGV0ZTsKLSAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHA7Ci0gICAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc3ViY2hhbm5lbHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdWNjZXNzKSB7Ci0gIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gYXJnOwotICBzaXplX3QgaTsKLSAgc2l6ZV90IG51bV9zdWJjaGFubmVscyA9IHAtPm51bV9zdWJjaGFubmVsczsKLSAgZ3JwY19zdWJjaGFubmVsICoqc3ViY2hhbm5lbHM7Ci0KLSAgZ3ByX211X2xvY2soJnAtPm11KTsKLSAgc3ViY2hhbm5lbHMgPSBwLT5zdWJjaGFubmVsczsKLSAgcC0+bnVtX3N1YmNoYW5uZWxzID0gMDsKLSAgcC0+c3ViY2hhbm5lbHMgPSBOVUxMOwotICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci0gIEdSUENfTEJfUE9MSUNZX1dFQUtfVU5SRUYoZXhlY19jdHgsICZwLT5iYXNlLCAiZGVzdHJveV9zdWJjaGFubmVscyIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ViY2hhbm5lbHM7IGkrKykgewotICAgIEdSUENfU1VCQ0hBTk5FTF9VTlJFRihleGVjX2N0eCwgc3ViY2hhbm5lbHNbaV0sICJwaWNrX2ZpcnN0Iik7Ci0gIH0KLQotICBncHJfZnJlZShzdWJjaGFubmVscyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBmX2Nvbm5lY3Rpdml0eV9jaGFuZ2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKLSAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSBhcmc7Ci0gIGdycGNfc3ViY2hhbm5lbCAqc2VsZWN0ZWRfc3ViY2hhbm5lbDsKLSAgcGVuZGluZ19waWNrICpwcDsKLSAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqc2VsZWN0ZWQ7Ci0KLSAgZ3ByX211X2xvY2soJnAtPm11KTsKLQotICBzZWxlY3RlZCA9IEdFVF9TRUxFQ1RFRChwKTsKLQotICBpZiAocC0+c2h1dGRvd24pIHsKLSAgICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci0gICAgR1JQQ19MQl9QT0xJQ1lfV0VBS19VTlJFRihleGVjX2N0eCwgJnAtPmJhc2UsICJwaWNrX2ZpcnN0X2Nvbm5lY3Rpdml0eSIpOwotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChzZWxlY3RlZCAhPSBOVUxMKSB7Ci0gICAgaWYgKHAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSA9PSBHUlBDX0NIQU5ORUxfVFJBTlNJRU5UX0ZBSUxVUkUpIHsKLSAgICAgIC8qIGlmIHRoZSBzZWxlY3RlZCBjaGFubmVsIGdvZXMgYmFkLCB3ZSdyZSBkb25lICovCi0gICAgICBwLT5jaGVja2luZ19jb25uZWN0aXZpdHkgPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRTsKLSAgICB9Ci0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5LCAic2VsZWN0ZWRfY2hhbmdlZCIpOwotICAgIGlmIChwLT5jaGVja2luZ19jb25uZWN0aXZpdHkgIT0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUpIHsKLSAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgICAgICBleGVjX2N0eCwgc2VsZWN0ZWQsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLAotICAgICAgICAgICZwLT5jaGVja2luZ19jb25uZWN0aXZpdHksICZwLT5jb25uZWN0aXZpdHlfY2hhbmdlZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdSUENfTEJfUE9MSUNZX1dFQUtfVU5SRUYoZXhlY19jdHgsICZwLT5iYXNlLCAicGlja19maXJzdF9jb25uZWN0aXZpdHkiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gIGxvb3A6Ci0gICAgc3dpdGNoIChwLT5jaGVja2luZ19jb25uZWN0aXZpdHkpIHsKLSAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX1JFQURZOgotICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1JFQURZLCAiY29ubmVjdGluZ19yZWFkeSIpOwotICAgICAgICBzZWxlY3RlZF9zdWJjaGFubmVsID0gcC0+c3ViY2hhbm5lbHNbcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbF07Ci0gICAgICAgIHNlbGVjdGVkID0KLSAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9nZXRfY29ubmVjdGVkX3N1YmNoYW5uZWwoc2VsZWN0ZWRfc3ViY2hhbm5lbCk7Ci0gICAgICAgIEdQUl9BU1NFUlQoc2VsZWN0ZWQgIT0gTlVMTCk7Ci0gICAgICAgIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfUkVGKHNlbGVjdGVkLCAicGlja2VkX2ZpcnN0Iik7Ci0gICAgICAgIC8qIGRyb3AgdGhlIHBpY2sgbGlzdDogd2UgYXJlIGNvbm5lY3RlZCBub3cgKi8KLSAgICAgICAgR1JQQ19MQl9QT0xJQ1lfV0VBS19SRUYoJnAtPmJhc2UsICJkZXN0cm95X3N1YmNoYW5uZWxzIik7Ci0gICAgICAgIGdwcl9hdG1fcmVsX3N0b3JlKCZwLT5zZWxlY3RlZCwgKGdwcl9hdG0pc2VsZWN0ZWQpOwotICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoCi0gICAgICAgICAgICBleGVjX2N0eCwgZ3JwY19jbG9zdXJlX2NyZWF0ZShkZXN0cm95X3N1YmNoYW5uZWxzLCBwKSwgdHJ1ZSwgTlVMTCk7Ci0gICAgICAgIC8qIHVwZGF0ZSBhbnkgY2FsbHMgdGhhdCB3ZXJlIHdhaXRpbmcgZm9yIGEgcGljayAqLwotICAgICAgICB3aGlsZSAoKHBwID0gcC0+cGVuZGluZ19waWNrcykpIHsKLSAgICAgICAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHAtPm5leHQ7Ci0gICAgICAgICAgKnBwLT50YXJnZXQgPSBzZWxlY3RlZDsKLSAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGV4ZWNfY3R4LCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwLT5wb2xsc2V0KTsKLSAgICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBwLT5vbl9jb21wbGV0ZSwgdHJ1ZSwgTlVMTCk7Ci0gICAgICAgICAgZ3ByX2ZyZWUocHApOwotICAgICAgICB9Ci0gICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgICAgICAgIGV4ZWNfY3R4LCBzZWxlY3RlZCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAmcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5LCAmcC0+Y29ubmVjdGl2aXR5X2NoYW5nZWQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFOgotICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RpbmdfdHJhbnNpZW50X2ZhaWx1cmUiKTsKLSAgICAgICAgcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbCA9Ci0gICAgICAgICAgICAocC0+Y2hlY2tpbmdfc3ViY2hhbm5lbCArIDEpICUgcC0+bnVtX3N1YmNoYW5uZWxzOwotICAgICAgICBwLT5jaGVja2luZ19jb25uZWN0aXZpdHkgPSBncnBjX3N1YmNoYW5uZWxfY2hlY2tfY29ubmVjdGl2aXR5KAotICAgICAgICAgICAgcC0+c3ViY2hhbm5lbHNbcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbF0pOwotICAgICAgICBpZiAocC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5ID09IEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRSkgewotICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgICAgICAgICAgICBleGVjX2N0eCwgcC0+c3ViY2hhbm5lbHNbcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbF0sCi0gICAgICAgICAgICAgIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLCAmcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5LAotICAgICAgICAgICAgICAmcC0+Y29ubmVjdGl2aXR5X2NoYW5nZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gbG9vcDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX0NPTk5FQ1RJTkc6Ci0gICAgICBjYXNlIEdSUENfQ0hBTk5FTF9JRExFOgotICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGluZ19jaGFuZ2VkIik7Ci0gICAgICAgIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgICAgICAgICAgZXhlY19jdHgsIHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdLAotICAgICAgICAgICAgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsICZwLT5jaGVja2luZ19jb25uZWN0aXZpdHksCi0gICAgICAgICAgICAmcC0+Y29ubmVjdGl2aXR5X2NoYW5nZWQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU6Ci0gICAgICAgIHAtPm51bV9zdWJjaGFubmVscy0tOwotICAgICAgICBHUFJfU1dBUChncnBjX3N1YmNoYW5uZWwgKiwgcC0+c3ViY2hhbm5lbHNbcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbF0sCi0gICAgICAgICAgICAgICAgIHAtPnN1YmNoYW5uZWxzW3AtPm51bV9zdWJjaGFubmVsc10pOwotICAgICAgICBHUlBDX1NVQkNIQU5ORUxfVU5SRUYoZXhlY19jdHgsIHAtPnN1YmNoYW5uZWxzW3AtPm51bV9zdWJjaGFubmVsc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlja19maXJzdCIpOwotICAgICAgICBpZiAocC0+bnVtX3N1YmNoYW5uZWxzID09IDApIHsKLSAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vX21vcmVfY2hhbm5lbHMiKTsKLSAgICAgICAgICB3aGlsZSAoKHBwID0gcC0+cGVuZGluZ19waWNrcykpIHsKLSAgICAgICAgICAgIHAtPnBlbmRpbmdfcGlja3MgPSBwcC0+bmV4dDsKLSAgICAgICAgICAgICpwcC0+dGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcHAtPm9uX2NvbXBsZXRlLCB0cnVlLCBOVUxMKTsKLSAgICAgICAgICAgIGdwcl9mcmVlKHBwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgR1JQQ19MQl9QT0xJQ1lfV0VBS19VTlJFRihleGVjX2N0eCwgJnAtPmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlja19maXJzdF9jb25uZWN0aXZpdHkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfVFJBTlNJRU5UX0ZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJjaGFubmVsX2ZhaWxlZCIpOwotICAgICAgICAgIHAtPmNoZWNraW5nX3N1YmNoYW5uZWwgJT0gcC0+bnVtX3N1YmNoYW5uZWxzOwotICAgICAgICAgIHAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSA9IGdycGNfc3ViY2hhbm5lbF9jaGVja19jb25uZWN0aXZpdHkoCi0gICAgICAgICAgICAgIHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdKTsKLSAgICAgICAgICBnb3RvIGxvb3A7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci19Ci0KLXN0YXRpYyBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBwZl9jaGVja19jb25uZWN0aXZpdHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2wpIHsKLSAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSAocGlja19maXJzdF9sYl9wb2xpY3kgKilwb2w7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0OwotICBncHJfbXVfbG9jaygmcC0+bXUpOwotICBzdCA9IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2NoZWNrKCZwLT5zdGF0ZV90cmFja2VyKTsKLSAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotICByZXR1cm4gc3Q7Ci19Ci0KLXZvaWQgcGZfbm90aWZ5X29uX3N0YXRlX2NoYW5nZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm5vdGlmeSkgewotICBwaWNrX2ZpcnN0X2xiX3BvbGljeSAqcCA9IChwaWNrX2ZpcnN0X2xiX3BvbGljeSAqKXBvbDsKLSAgZ3ByX211X2xvY2soJnAtPm11KTsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbm90aWZ5X29uX3N0YXRlX2NoYW5nZShleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCwgbm90aWZ5KTsKLSAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotfQotCi12b2lkIHBmX3Bpbmdfb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sLAotICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKLSAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSAocGlja19maXJzdF9sYl9wb2xpY3kgKilwb2w7Ci0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKnNlbGVjdGVkID0gR0VUX1NFTEVDVEVEKHApOwotICBpZiAoc2VsZWN0ZWQpIHsKLSAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3BpbmcoZXhlY19jdHgsIHNlbGVjdGVkLCBjbG9zdXJlKTsKLSAgfSBlbHNlIHsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIGZhbHNlLCBOVUxMKTsKLSAgfQotfQotCi1zdGF0aWMgY29uc3QgZ3JwY19sYl9wb2xpY3lfdnRhYmxlIHBpY2tfZmlyc3RfbGJfcG9saWN5X3Z0YWJsZSA9IHsKLSAgICBwZl9kZXN0cm95LAotICAgIHBmX3NodXRkb3duLAotICAgIHBmX3BpY2ssCi0gICAgcGZfY2FuY2VsX3BpY2ssCi0gICAgcGZfcGluZ19vbmUsCi0gICAgcGZfZXhpdF9pZGxlLAotICAgIHBmX2NoZWNrX2Nvbm5lY3Rpdml0eSwKLSAgICBwZl9ub3RpZnlfb25fc3RhdGVfY2hhbmdlfTsKLQotc3RhdGljIHZvaWQgcGlja19maXJzdF9mYWN0b3J5X3JlZihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KSB7fQotCi1zdGF0aWMgdm9pZCBwaWNrX2ZpcnN0X2ZhY3RvcnlfdW5yZWYoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSkge30KLQotc3RhdGljIGdycGNfbGJfcG9saWN5ICpjcmVhdGVfcGlja19maXJzdChncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeV9hcmdzICphcmdzKSB7Ci0gIGlmIChhcmdzLT5udW1fc3ViY2hhbm5lbHMgPT0gMCkgcmV0dXJuIE5VTEw7Ci0gIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gZ3ByX21hbGxvYyhzaXplb2YoKnApKTsKLSAgbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwotICBncnBjX2xiX3BvbGljeV9pbml0KCZwLT5iYXNlLCAmcGlja19maXJzdF9sYl9wb2xpY3lfdnRhYmxlKTsKLSAgcC0+c3ViY2hhbm5lbHMgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zdWJjaGFubmVsICopICogYXJncy0+bnVtX3N1YmNoYW5uZWxzKTsKLSAgcC0+bnVtX3N1YmNoYW5uZWxzID0gYXJncy0+bnVtX3N1YmNoYW5uZWxzOwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9pbml0KCZwLT5zdGF0ZV90cmFja2VyLCBHUlBDX0NIQU5ORUxfSURMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlja19maXJzdCIpOwotICBtZW1jcHkocC0+c3ViY2hhbm5lbHMsIGFyZ3MtPnN1YmNoYW5uZWxzLAotICAgICAgICAgc2l6ZW9mKGdycGNfc3ViY2hhbm5lbCAqKSAqIGFyZ3MtPm51bV9zdWJjaGFubmVscyk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZwLT5jb25uZWN0aXZpdHlfY2hhbmdlZCwgcGZfY29ubmVjdGl2aXR5X2NoYW5nZWQsIHApOwotICBncHJfbXVfaW5pdCgmcC0+bXUpOwotICByZXR1cm4gJnAtPmJhc2U7Ci19Ci0KLXN0YXRpYyBjb25zdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3Z0YWJsZSBwaWNrX2ZpcnN0X2ZhY3RvcnlfdnRhYmxlID0gewotICAgIHBpY2tfZmlyc3RfZmFjdG9yeV9yZWYsIHBpY2tfZmlyc3RfZmFjdG9yeV91bnJlZiwgY3JlYXRlX3BpY2tfZmlyc3QsCi0gICAgInBpY2tfZmlyc3QifTsKLQotc3RhdGljIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgcGlja19maXJzdF9sYl9wb2xpY3lfZmFjdG9yeSA9IHsKLSAgICAmcGlja19maXJzdF9mYWN0b3J5X3Z0YWJsZX07Ci0KLWdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmdycGNfcGlja19maXJzdF9sYl9mYWN0b3J5X2NyZWF0ZSgpIHsKLSAgcmV0dXJuICZwaWNrX2ZpcnN0X2xiX3BvbGljeV9mYWN0b3J5OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZjE5NS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNJRVNfUElDS19GSVJTVF9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0xCX1BPTElDSUVTX1BJQ0tfRklSU1RfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIgotCi0vKiogUmV0dXJucyBhIGxvYWQgYmFsYW5jaW5nIGZhY3RvcnkgZm9yIHRoZSBwaWNrIGZpcnN0IHBvbGljeSwgd2hpY2ggcGlja3MgdXAKLSAqIHRoZSBmaXJzdCBzdWJjaGFubmVsIGZyb20gXGEgc3ViY2hhbm5lbHMgdG8gc3VjY2VzZnVsbHkgY29ubmVjdCAqLwotZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZ3JwY19waWNrX2ZpcnN0X2xiX2ZhY3RvcnlfY3JlYXRlKCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19QSUNLX0ZJUlNUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ZWNlNi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgotCi10eXBlZGVmIHN0cnVjdCByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgcm91bmRfcm9iaW5fbGJfcG9saWN5OwotCi1pbnQgZ3JwY19sYl9yb3VuZF9yb2Jpbl90cmFjZSA9IDA7Ci0KLS8qKiBMaXN0IG9mIGVudGl0aWVzIHdhaXRpbmcgZm9yIGEgcGljay4KLSAqCi0gKiBPbmNlIGEgcGljayBpcyBhdmFpbGFibGUsIFxhIHRhcmdldCBpcyB1cGRhdGVkIGFuZCBcYSBvbl9jb21wbGV0ZSBjYWxsZWQuICovCi10eXBlZGVmIHN0cnVjdCBwZW5kaW5nX3BpY2sgewotICBzdHJ1Y3QgcGVuZGluZ19waWNrICpuZXh0OwotICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7Ci0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKip0YXJnZXQ7Ci0gIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGU7Ci19IHBlbmRpbmdfcGljazsKLQotLyoqIExpc3Qgb2Ygc3ViY2hhbm5lbHMgaW4gYSBjb25uZWN0aXZpdHkgUkVBRFkgc3RhdGUgKi8KLXR5cGVkZWYgc3RydWN0IHJlYWR5X2xpc3QgewotICBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWw7Ci0gIHN0cnVjdCByZWFkeV9saXN0ICpuZXh0OwotICBzdHJ1Y3QgcmVhZHlfbGlzdCAqcHJldjsKLX0gcmVhZHlfbGlzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogaW5kZXggd2l0aGluIHBvbGljeS0+c3ViY2hhbm5lbHMgKi8KLSAgc2l6ZV90IGluZGV4OwotICAvKiogYmFja3BvaW50ZXIgdG8gb3duaW5nIHBvbGljeSAqLwotICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnBvbGljeTsKLSAgLyoqIHN1YmNoYW5uZWwgaXRzZWxmICovCi0gIGdycGNfc3ViY2hhbm5lbCAqc3ViY2hhbm5lbDsKLSAgLyoqIG5vdGlmaWNhdGlvbiB0aGF0IGNvbm5lY3Rpdml0eSBoYXMgY2hhbmdlZCBvbiBzdWJjaGFubmVsICovCi0gIGdycGNfY2xvc3VyZSBjb25uZWN0aXZpdHlfY2hhbmdlZF9jbG9zdXJlOwotICAvKiogdGhpcyBzdWJjaGFubmVscyBjdXJyZW50IHBvc2l0aW9uIGluIHN1YmNoYW5uZWwtPnJlYWR5X2xpc3QgKi8KLSAgcmVhZHlfbGlzdCAqcmVhZHlfbGlzdF9ub2RlOwotICAvKiogbGFzdCBvYnNlcnZlZCBjb25uZWN0aXZpdHkgKi8KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgY29ubmVjdGl2aXR5X3N0YXRlOwotfSBzdWJjaGFubmVsX2RhdGE7Ci0KLXN0cnVjdCByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgewotICAvKiogYmFzZSBwb2xpY3k6IG11c3QgYmUgZmlyc3QgKi8KLSAgZ3JwY19sYl9wb2xpY3kgYmFzZTsKLQotICAvKiogYWxsIG91ciBzdWJjaGFubmVscyAqLwotICBzaXplX3QgbnVtX3N1YmNoYW5uZWxzOwotICBzdWJjaGFubmVsX2RhdGEgKipzdWJjaGFubmVsczsKLQotICAvKiogbXV0ZXggcHJvdGVjdGluZyByZW1haW5pbmcgbWVtYmVycyAqLwotICBncHJfbXUgbXU7Ci0gIC8qKiBoYXZlIHdlIHN0YXJ0ZWQgcGlja2luZz8gKi8KLSAgaW50IHN0YXJ0ZWRfcGlja2luZzsKLSAgLyoqIGFyZSB3ZSBzaHV0dGluZyBkb3duPyAqLwotICBpbnQgc2h1dGRvd247Ci0gIC8qKiBMaXN0IG9mIHBpY2tzIHRoYXQgYXJlIHdhaXRpbmcgb24gY29ubmVjdGl2aXR5ICovCi0gIHBlbmRpbmdfcGljayAqcGVuZGluZ19waWNrczsKLQotICAvKiogb3VyIGNvbm5lY3Rpdml0eSBzdGF0ZSB0cmFja2VyICovCi0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgc3RhdGVfdHJhY2tlcjsKLQotICAvKiogKER1bW15KSByb290IG9mIHRoZSBkb3VibHkgbGlua2VkIGxpc3QgY29udGFpbmluZyBSRUFEWSBzdWJjaGFubmVscyAqLwotICByZWFkeV9saXN0IHJlYWR5X2xpc3Q7Ci0gIC8qKiBMYXN0IHBpY2sgZnJvbSB0aGUgcmVhZHkgbGlzdC4gKi8KLSAgcmVhZHlfbGlzdCAqcmVhZHlfbGlzdF9sYXN0X3BpY2s7Ci19OwotCi0vKiogUmV0dXJucyB0aGUgbmV4dCBzdWJjaGFubmVsIGZyb20gdGhlIGNvbm5lY3RlZCBsaXN0IG9yIE5VTEwgaWYgdGhlIGxpc3QgaXMKLSAqIGVtcHR5LgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgKm5vdCogYWR2YW5jZSBwLT5yZWFkeV9saXN0X2xhc3RfcGljay4gVXNlIFxhCi0gKiBhZHZhbmNlX2xhc3RfcGlja2VkX2xvY2tlZCgpIGZvciB0aGF0LiAqLwotc3RhdGljIHJlYWR5X2xpc3QgKnBlZWtfbmV4dF9jb25uZWN0ZWRfbG9ja2VkKGNvbnN0IHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCkgewotICByZWFkeV9saXN0ICpzZWxlY3RlZDsKLSAgc2VsZWN0ZWQgPSBwLT5yZWFkeV9saXN0X2xhc3RfcGljay0+bmV4dDsKLQotICB3aGlsZSAoc2VsZWN0ZWQgIT0gTlVMTCkgewotICAgIGlmIChzZWxlY3RlZCA9PSAmcC0+cmVhZHlfbGlzdCkgewotICAgICAgR1BSX0FTU0VSVChzZWxlY3RlZC0+c3ViY2hhbm5lbCA9PSBOVUxMKTsKLSAgICAgIC8qIHNraXAgZHVtbXkgcm9vdCAqLwotICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZC0+bmV4dDsKLSAgICB9IGVsc2UgewotICAgICAgR1BSX0FTU0VSVChzZWxlY3RlZC0+c3ViY2hhbm5lbCAhPSBOVUxMKTsKLSAgICAgIHJldHVybiBzZWxlY3RlZDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKiBBZHZhbmNlIHRoZSBcYSByZWFkeV9saXN0IHBpY2tpbmcgaGVhZC4gKi8KLXN0YXRpYyB2b2lkIGFkdmFuY2VfbGFzdF9waWNrZWRfbG9ja2VkKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCkgewotICBpZiAocC0+cmVhZHlfbGlzdF9sYXN0X3BpY2stPm5leHQgIT0gTlVMTCkgeyAvKiBub24tZW1wdHkgbGlzdCAqLwotICAgIHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrID0gcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2stPm5leHQ7Ci0gICAgaWYgKHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrID09ICZwLT5yZWFkeV9saXN0KSB7Ci0gICAgICAvKiBza2lwIGR1bW15IHJvb3QgKi8KLSAgICAgIHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrID0gcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2stPm5leHQ7Ci0gICAgfQotICB9IGVsc2UgeyAvKiBzaG91bGQgYmUgYW4gZW1wdHkgbGlzdCAqLwotICAgIEdQUl9BU1NFUlQocC0+cmVhZHlfbGlzdF9sYXN0X3BpY2sgPT0gJnAtPnJlYWR5X2xpc3QpOwotICB9Ci0KLSAgaWYgKGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2UpIHsKLSAgICBncHJfbG9nKEdQUl9ERUJVRywgIltSRUFEWUxJU1RdIEFEVkFOQ0VEIExBU1QgUElDSy4gTk9XIEFUIE5PREUgJXAgKFNDICVwKSIsCi0gICAgICAgICAgICBwLT5yZWFkeV9saXN0X2xhc3RfcGljaywgcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2stPnN1YmNoYW5uZWwpOwotICB9Ci19Ci0KLS8qKiBQcmVwZW5kcyAocmVsYXRpdmUgdG8gdGhlIHJvb3QgYXQgcC0+cmVhZHlfbGlzdCkgdGhlIGNvbm5lY3RlZCBzdWJjaGFubmVsIFxhCi0gKiBjc2MgdG8gdGhlIGxpc3Qgb2YgcmVhZHkgc3ViY2hhbm5lbHMuICovCi1zdGF0aWMgcmVhZHlfbGlzdCAqYWRkX2Nvbm5lY3RlZF9zY19sb2NrZWQocm91bmRfcm9iaW5fbGJfcG9saWN5ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqc2MpIHsKLSAgcmVhZHlfbGlzdCAqbmV3X2VsZW0gPSBncHJfbWFsbG9jKHNpemVvZihyZWFkeV9saXN0KSk7Ci0gIG5ld19lbGVtLT5zdWJjaGFubmVsID0gc2M7Ci0gIGlmIChwLT5yZWFkeV9saXN0LnByZXYgPT0gTlVMTCkgewotICAgIC8qIGZpcnN0IGVsZW1lbnQgKi8KLSAgICBuZXdfZWxlbS0+bmV4dCA9ICZwLT5yZWFkeV9saXN0OwotICAgIG5ld19lbGVtLT5wcmV2ID0gJnAtPnJlYWR5X2xpc3Q7Ci0gICAgcC0+cmVhZHlfbGlzdC5uZXh0ID0gbmV3X2VsZW07Ci0gICAgcC0+cmVhZHlfbGlzdC5wcmV2ID0gbmV3X2VsZW07Ci0gIH0gZWxzZSB7Ci0gICAgbmV3X2VsZW0tPm5leHQgPSAmcC0+cmVhZHlfbGlzdDsKLSAgICBuZXdfZWxlbS0+cHJldiA9IHAtPnJlYWR5X2xpc3QucHJldjsKLSAgICBwLT5yZWFkeV9saXN0LnByZXYtPm5leHQgPSBuZXdfZWxlbTsKLSAgICBwLT5yZWFkeV9saXN0LnByZXYgPSBuZXdfZWxlbTsKLSAgfQotICBpZiAoZ3JwY19sYl9yb3VuZF9yb2Jpbl90cmFjZSkgewotICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiW1JFQURZTElTVF0gQURESU5HIE5PREUgJXAgKFNDICVwKSIsIG5ld19lbGVtLCBzYyk7Ci0gIH0KLSAgcmV0dXJuIG5ld19lbGVtOwotfQotCi0vKiogUmVtb3ZlcyBcYSBub2RlIGZyb20gdGhlIGxpc3Qgb2YgY29ubmVjdGVkIHN1YmNoYW5uZWxzICovCi1zdGF0aWMgdm9pZCByZW1vdmVfZGlzY29ubmVjdGVkX3NjX2xvY2tlZChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeV9saXN0ICpub2RlKSB7Ci0gIGlmIChub2RlID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG5vZGUgPT0gcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2spIHsKLSAgICAvKiBJZiByZW1vdmluZyB0aGUgbGFzdGx5IHBpY2tlZCBub2RlLCByZXNldCB0aGUgbGFzdCBwaWNrIHBvaW50ZXIgdG8gdGhlCi0gICAgICogZHVtbXkgcm9vdCBvZiB0aGUgbGlzdCAqLwotICAgIHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrID0gJnAtPnJlYWR5X2xpc3Q7Ci0gIH0KLQotICAvKiByZW1vdmluZyBsYXN0IGl0ZW0gKi8KLSAgaWYgKG5vZGUtPm5leHQgPT0gJnAtPnJlYWR5X2xpc3QgJiYgbm9kZS0+cHJldiA9PSAmcC0+cmVhZHlfbGlzdCkgewotICAgIEdQUl9BU1NFUlQocC0+cmVhZHlfbGlzdC5uZXh0ID09IG5vZGUpOwotICAgIEdQUl9BU1NFUlQocC0+cmVhZHlfbGlzdC5wcmV2ID09IG5vZGUpOwotICAgIHAtPnJlYWR5X2xpc3QubmV4dCA9IE5VTEw7Ci0gICAgcC0+cmVhZHlfbGlzdC5wcmV2ID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKLSAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKLSAgfQotCi0gIGlmIChncnBjX2xiX3JvdW5kX3JvYmluX3RyYWNlKSB7Ci0gICAgZ3ByX2xvZyhHUFJfREVCVUcsICJbUkVBRFlMSVNUXSBSRU1PVkVEIE5PREUgJXAgKFNDICVwKSIsIG5vZGUsCi0gICAgICAgICAgICBub2RlLT5zdWJjaGFubmVsKTsKLSAgfQotCi0gIG5vZGUtPm5leHQgPSBOVUxMOwotICBub2RlLT5wcmV2ID0gTlVMTDsKLSAgbm9kZS0+c3ViY2hhbm5lbCA9IE5VTEw7Ci0KLSAgZ3ByX2ZyZWUobm9kZSk7Ci19Ci0KLXZvaWQgcnJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCkgewotICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAgPSAocm91bmRfcm9iaW5fbGJfcG9saWN5ICopcG9sOwotICBzaXplX3QgaTsKLSAgcmVhZHlfbGlzdCAqZWxlbTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm51bV9zdWJjaGFubmVsczsgaSsrKSB7Ci0gICAgc3ViY2hhbm5lbF9kYXRhICpzZCA9IHAtPnN1YmNoYW5uZWxzW2ldOwotICAgIEdSUENfU1VCQ0hBTk5FTF9VTlJFRihleGVjX2N0eCwgc2QtPnN1YmNoYW5uZWwsICJyb3VuZF9yb2JpbiIpOwotICAgIGdwcl9mcmVlKHNkKTsKLSAgfQotCi0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2Rlc3Ryb3koZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyKTsKLSAgZ3ByX2ZyZWUocC0+c3ViY2hhbm5lbHMpOwotICBncHJfbXVfZGVzdHJveSgmcC0+bXUpOwotCi0gIGVsZW0gPSBwLT5yZWFkeV9saXN0Lm5leHQ7Ci0gIHdoaWxlIChlbGVtICE9IE5VTEwgJiYgZWxlbSAhPSAmcC0+cmVhZHlfbGlzdCkgewotICAgIHJlYWR5X2xpc3QgKnRtcDsKLSAgICB0bXAgPSBlbGVtLT5uZXh0OwotICAgIGVsZW0tPm5leHQgPSBOVUxMOwotICAgIGVsZW0tPnByZXYgPSBOVUxMOwotICAgIGVsZW0tPnN1YmNoYW5uZWwgPSBOVUxMOwotICAgIGdwcl9mcmVlKGVsZW0pOwotICAgIGVsZW0gPSB0bXA7Ci0gIH0KLSAgZ3ByX2ZyZWUocCk7Ci19Ci0KLXZvaWQgcnJfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wpIHsKLSAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqKXBvbDsKLSAgcGVuZGluZ19waWNrICpwcDsKLSAgc2l6ZV90IGk7Ci0KLSAgZ3ByX211X2xvY2soJnAtPm11KTsKLQotICBwLT5zaHV0ZG93biA9IDE7Ci0gIHdoaWxlICgocHAgPSBwLT5wZW5kaW5nX3BpY2tzKSkgewotICAgIHAtPnBlbmRpbmdfcGlja3MgPSBwcC0+bmV4dDsKLSAgICAqcHAtPnRhcmdldCA9IE5VTEw7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIGZhbHNlLCBOVUxMKTsKLSAgICBncHJfZnJlZShwcCk7Ci0gIH0KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFLCAic2h1dGRvd24iKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm51bV9zdWJjaGFubmVsczsgaSsrKSB7Ci0gICAgc3ViY2hhbm5lbF9kYXRhICpzZCA9IHAtPnN1YmNoYW5uZWxzW2ldOwotICAgIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKGV4ZWNfY3R4LCBzZC0+c3ViY2hhbm5lbCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2QtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkX2Nsb3N1cmUpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnAtPm11KTsKLX0KLQotc3RhdGljIHZvaWQgcnJfY2FuY2VsX3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0KSB7Ci0gIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCA9IChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKilwb2w7Ci0gIHBlbmRpbmdfcGljayAqcHA7Ci0gIGdwcl9tdV9sb2NrKCZwLT5tdSk7Ci0gIHBwID0gcC0+cGVuZGluZ19waWNrczsKLSAgcC0+cGVuZGluZ19waWNrcyA9IE5VTEw7Ci0gIHdoaWxlIChwcCAhPSBOVUxMKSB7Ci0gICAgcGVuZGluZ19waWNrICpuZXh0ID0gcHAtPm5leHQ7Ci0gICAgaWYgKHBwLT50YXJnZXQgPT0gdGFyZ2V0KSB7Ci0gICAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGV4ZWNfY3R4LCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAtPnBvbGxzZXQpOwotICAgICAgKnRhcmdldCA9IE5VTEw7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBwLT5vbl9jb21wbGV0ZSwgZmFsc2UsIE5VTEwpOwotICAgICAgZ3ByX2ZyZWUocHApOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcC0+bmV4dCA9IHAtPnBlbmRpbmdfcGlja3M7Ci0gICAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHA7Ci0gICAgfQotICAgIHBwID0gbmV4dDsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X3BpY2tpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCkgewotICBzaXplX3QgaTsKLSAgcC0+c3RhcnRlZF9waWNraW5nID0gMTsKLQotICBncHJfbG9nKEdQUl9ERUJVRywgIkxCX1BPTElDWTogcD0lcCBudW1fc3ViY2hhbm5lbHM9JWQiLCBwLAotICAgICAgICAgIHAtPm51bV9zdWJjaGFubmVscyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHAtPm51bV9zdWJjaGFubmVsczsgaSsrKSB7Ci0gICAgc3ViY2hhbm5lbF9kYXRhICpzZCA9IHAtPnN1YmNoYW5uZWxzW2ldOwotICAgIHNkLT5jb25uZWN0aXZpdHlfc3RhdGUgPSBHUlBDX0NIQU5ORUxfSURMRTsKLSAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgICAgZXhlY19jdHgsIHNkLT5zdWJjaGFubmVsLCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgJnNkLT5jb25uZWN0aXZpdHlfc3RhdGUsICZzZC0+Y29ubmVjdGl2aXR5X2NoYW5nZWRfY2xvc3VyZSk7Ci0gICAgR1JQQ19MQl9QT0xJQ1lfV0VBS19SRUYoJnAtPmJhc2UsICJyb3VuZF9yb2Jpbl9jb25uZWN0aXZpdHkiKTsKLSAgfQotfQotCi12b2lkIHJyX2V4aXRfaWRsZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCkgewotICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAgPSAocm91bmRfcm9iaW5fbGJfcG9saWN5ICopcG9sOwotICBncHJfbXVfbG9jaygmcC0+bXUpOwotICBpZiAoIXAtPnN0YXJ0ZWRfcGlja2luZykgewotICAgIHN0YXJ0X3BpY2tpbmcoZXhlY19jdHgsIHApOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnAtPm11KTsKLX0KLQotaW50IHJyX3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmluaXRpYWxfbWV0YWRhdGEsCi0gICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7Ci0gIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCA9IChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKilwb2w7Ci0gIHBlbmRpbmdfcGljayAqcHA7Ci0gIHJlYWR5X2xpc3QgKnNlbGVjdGVkOwotICBncHJfbXVfbG9jaygmcC0+bXUpOwotICBpZiAoKHNlbGVjdGVkID0gcGVla19uZXh0X2Nvbm5lY3RlZF9sb2NrZWQocCkpKSB7Ci0gICAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotICAgICp0YXJnZXQgPSBncnBjX3N1YmNoYW5uZWxfZ2V0X2Nvbm5lY3RlZF9zdWJjaGFubmVsKHNlbGVjdGVkLT5zdWJjaGFubmVsKTsKLSAgICBpZiAoZ3JwY19sYl9yb3VuZF9yb2Jpbl90cmFjZSkgewotICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsCi0gICAgICAgICAgICAgICJbUlIgUElDS10gVEFSR0VUIDwtLSBDT05ORUNURUQgU1VCQ0hBTk5FTCAlcCAoTk9ERSAlcCkiLAotICAgICAgICAgICAgICBzZWxlY3RlZC0+c3ViY2hhbm5lbCwgc2VsZWN0ZWQpOwotICAgIH0KLSAgICAvKiBvbmx5IGFkdmFuY2UgdGhlIGxhc3QgcGlja2VkIHBvaW50ZXIgaWYgdGhlIHNlbGVjdGlvbiB3YXMgdXNlZCAqLwotICAgIGFkdmFuY2VfbGFzdF9waWNrZWRfbG9ja2VkKHApOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIGlmICghcC0+c3RhcnRlZF9waWNraW5nKSB7Ci0gICAgICBzdGFydF9waWNraW5nKGV4ZWNfY3R4LCBwKTsKLSAgICB9Ci0gICAgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldChleGVjX2N0eCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsIHBvbGxzZXQpOwotICAgIHBwID0gZ3ByX21hbGxvYyhzaXplb2YoKnBwKSk7Ci0gICAgcHAtPm5leHQgPSBwLT5wZW5kaW5nX3BpY2tzOwotICAgIHBwLT5wb2xsc2V0ID0gcG9sbHNldDsKLSAgICBwcC0+dGFyZ2V0ID0gdGFyZ2V0OwotICAgIHBwLT5vbl9jb21wbGV0ZSA9IG9uX2NvbXBsZXRlOwotICAgIHAtPnBlbmRpbmdfcGlja3MgPSBwcDsKLSAgICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcnJfY29ubmVjdGl2aXR5X2NoYW5nZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgewotICBzdWJjaGFubmVsX2RhdGEgKnNkID0gYXJnOwotICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAgPSBzZC0+cG9saWN5OwotICBwZW5kaW5nX3BpY2sgKnBwOwotICByZWFkeV9saXN0ICpzZWxlY3RlZDsKLQotICBpbnQgdW5yZWYgPSAwOwotCi0gIGdwcl9tdV9sb2NrKCZwLT5tdSk7Ci0KLSAgaWYgKHAtPnNodXRkb3duKSB7Ci0gICAgdW5yZWYgPSAxOwotICB9IGVsc2UgewotICAgIHN3aXRjaCAoc2QtPmNvbm5lY3Rpdml0eV9zdGF0ZSkgewotICAgICAgY2FzZSBHUlBDX0NIQU5ORUxfUkVBRFk6Ci0gICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfUkVBRFksICJjb25uZWN0aW5nX3JlYWR5Iik7Ci0gICAgICAgIC8qIGFkZCB0aGUgbmV3bHkgY29ubmVjdGVkIHN1YmNoYW5uZWwgdG8gdGhlIGxpc3Qgb2YgY29ubmVjdGVkIG9uZXMuCi0gICAgICAgICAqIE5vdGUgdGhhdCBpdCBnb2VzIHRvIHRoZSAiZW5kIG9mIHRoZSBsaW5lIi4gKi8KLSAgICAgICAgc2QtPnJlYWR5X2xpc3Rfbm9kZSA9IGFkZF9jb25uZWN0ZWRfc2NfbG9ja2VkKHAsIHNkLT5zdWJjaGFubmVsKTsKLSAgICAgICAgLyogYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZXJlJ3MgYXQgbGVhc3Qgb25lIHN1aXRhYmxlIHN1YmNoYW5uZWwuIEdvCi0gICAgICAgICAqIGFoZWFkIGFuZCBwaWNrIG9uZSBhbmQgbm90aWZ5IHRoZSBwZW5kaW5nIHN1aXRvcnMgaW4KLSAgICAgICAgICogcC0+cGVuZGluZ19waWNrcy4gVGhpcyBwcmVlbXRpdmVseSByZXBsaWNhdGVzIHJyX3BpY2soKSdzIGFjdGlvbnMuICovCi0gICAgICAgIHNlbGVjdGVkID0gcGVla19uZXh0X2Nvbm5lY3RlZF9sb2NrZWQocCk7Ci0gICAgICAgIGlmIChwLT5wZW5kaW5nX3BpY2tzICE9IE5VTEwpIHsKLSAgICAgICAgICAvKiBpZiB0aGUgc2VsZWN0ZWQgc3ViY2hhbm5lbCBpcyBnb2luZyB0byBiZSB1c2VkIGZvciB0aGUgcGVuZGluZwotICAgICAgICAgICAqIHBpY2tzLCB1cGRhdGUgdGhlIGxhc3QgcGlja2VkIHBvaW50ZXIgKi8KLSAgICAgICAgICBhZHZhbmNlX2xhc3RfcGlja2VkX2xvY2tlZChwKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoKHBwID0gcC0+cGVuZGluZ19waWNrcykpIHsKLSAgICAgICAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHAtPm5leHQ7Ci0gICAgICAgICAgKnBwLT50YXJnZXQgPQotICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfZ2V0X2Nvbm5lY3RlZF9zdWJjaGFubmVsKHNlbGVjdGVkLT5zdWJjaGFubmVsKTsKLSAgICAgICAgICBpZiAoZ3JwY19sYl9yb3VuZF9yb2Jpbl90cmFjZSkgewotICAgICAgICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgICJbUlIgQ09OTiBDSEFOR0VEXSBUQVJHRVQgPC0tIFNVQkNIQU5ORUwgJXAgKE5PREUgJXApIiwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQtPnN1YmNoYW5uZWwsIHNlbGVjdGVkKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChleGVjX2N0eCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcC0+cG9sbHNldCk7Ci0gICAgICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIHRydWUsIE5VTEwpOwotICAgICAgICAgIGdwcl9mcmVlKHBwKTsKLSAgICAgICAgfQotICAgICAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgICAgICAgIGV4ZWNfY3R4LCBzZC0+c3ViY2hhbm5lbCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAmc2QtPmNvbm5lY3Rpdml0eV9zdGF0ZSwgJnNkLT5jb25uZWN0aXZpdHlfY2hhbmdlZF9jbG9zdXJlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfQ0hBTk5FTF9DT05ORUNUSU5HOgotICAgICAgY2FzZSBHUlBDX0NIQU5ORUxfSURMRToKLSAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLT5jb25uZWN0aXZpdHlfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGluZ19jaGFuZ2VkIik7Ci0gICAgICAgIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgICAgICAgICAgZXhlY19jdHgsIHNkLT5zdWJjaGFubmVsLCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICZzZC0+Y29ubmVjdGl2aXR5X3N0YXRlLCAmc2QtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkX2Nsb3N1cmUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFOgotICAgICAgICAvKiByZW5ldyBzdGF0ZSBub3RpZmljYXRpb24gKi8KLSAgICAgICAgZ3JwY19zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCi0gICAgICAgICAgICBleGVjX2N0eCwgc2QtPnN1YmNoYW5uZWwsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLAotICAgICAgICAgICAgJnNkLT5jb25uZWN0aXZpdHlfc3RhdGUsICZzZC0+Y29ubmVjdGl2aXR5X2NoYW5nZWRfY2xvc3VyZSk7Ci0KLSAgICAgICAgLyogcmVtb3ZlIGZyb20gcmVhZHkgbGlzdCBpZiBzdGlsbCBwcmVzZW50ICovCi0gICAgICAgIGlmIChzZC0+cmVhZHlfbGlzdF9ub2RlICE9IE5VTEwpIHsKLSAgICAgICAgICByZW1vdmVfZGlzY29ubmVjdGVkX3NjX2xvY2tlZChwLCBzZC0+cmVhZHlfbGlzdF9ub2RlKTsKLSAgICAgICAgICBzZC0+cmVhZHlfbGlzdF9ub2RlID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RpbmdfdHJhbnNpZW50X2ZhaWx1cmUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFOgotICAgICAgICBpZiAoc2QtPnJlYWR5X2xpc3Rfbm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcmVtb3ZlX2Rpc2Nvbm5lY3RlZF9zY19sb2NrZWQocCwgc2QtPnJlYWR5X2xpc3Rfbm9kZSk7Ci0gICAgICAgICAgc2QtPnJlYWR5X2xpc3Rfbm9kZSA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBwLT5udW1fc3ViY2hhbm5lbHMtLTsKLSAgICAgICAgR1BSX1NXQVAoc3ViY2hhbm5lbF9kYXRhICosIHAtPnN1YmNoYW5uZWxzW3NkLT5pbmRleF0sCi0gICAgICAgICAgICAgICAgIHAtPnN1YmNoYW5uZWxzW3AtPm51bV9zdWJjaGFubmVsc10pOwotICAgICAgICBHUlBDX1NVQkNIQU5ORUxfVU5SRUYoZXhlY19jdHgsIHNkLT5zdWJjaGFubmVsLCAicm91bmRfcm9iaW4iKTsKLSAgICAgICAgcC0+c3ViY2hhbm5lbHNbc2QtPmluZGV4XS0+aW5kZXggPSBzZC0+aW5kZXg7Ci0gICAgICAgIGdwcl9mcmVlKHNkKTsKLQotICAgICAgICB1bnJlZiA9IDE7Ci0gICAgICAgIGlmIChwLT5udW1fc3ViY2hhbm5lbHMgPT0gMCkgewotICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9fbW9yZV9jaGFubmVscyIpOwotICAgICAgICAgIHdoaWxlICgocHAgPSBwLT5wZW5kaW5nX3BpY2tzKSkgewotICAgICAgICAgICAgcC0+cGVuZGluZ19waWNrcyA9IHBwLT5uZXh0OwotICAgICAgICAgICAgKnBwLT50YXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIHRydWUsIE5VTEwpOwotICAgICAgICAgICAgZ3ByX2ZyZWUocHApOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfVFJBTlNJRU5UX0ZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJjaGFubmVsX2ZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfSAvKiBzd2l0Y2ggKi8KLSAgfSAgIC8qICF1bnJlZiAqLwotCi0gIGdwcl9tdV91bmxvY2soJnAtPm11KTsKLQotICBpZiAodW5yZWYpIHsKLSAgICBHUlBDX0xCX1BPTElDWV9XRUFLX1VOUkVGKGV4ZWNfY3R4LCAmcC0+YmFzZSwgInJvdW5kX3JvYmluX2Nvbm5lY3Rpdml0eSIpOwotICB9Ci19Ci0KLXN0YXRpYyBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBycl9jaGVja19jb25uZWN0aXZpdHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2wpIHsKLSAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqKXBvbDsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3Q7Ci0gIGdwcl9tdV9sb2NrKCZwLT5tdSk7Ci0gIHN0ID0gZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfY2hlY2soJnAtPnN0YXRlX3RyYWNrZXIpOwotICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Ci0gIHJldHVybiBzdDsKLX0KLQotc3RhdGljIHZvaWQgcnJfbm90aWZ5X29uX3N0YXRlX2NoYW5nZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3kgKnBvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKmN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KSB7Ci0gIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCA9IChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKilwb2w7Ci0gIGdwcl9tdV9sb2NrKCZwLT5tdSk7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsIG5vdGlmeSk7Ci0gIGdwcl9tdV91bmxvY2soJnAtPm11KTsKLX0KLQotc3RhdGljIHZvaWQgcnJfcGluZ19vbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKLSAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqKXBvbDsKLSAgcmVhZHlfbGlzdCAqc2VsZWN0ZWQ7Ci0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKnRhcmdldDsKLSAgZ3ByX211X2xvY2soJnAtPm11KTsKLSAgaWYgKChzZWxlY3RlZCA9IHBlZWtfbmV4dF9jb25uZWN0ZWRfbG9ja2VkKHApKSkgewotICAgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKLSAgICB0YXJnZXQgPSBncnBjX3N1YmNoYW5uZWxfZ2V0X2Nvbm5lY3RlZF9zdWJjaGFubmVsKHNlbGVjdGVkLT5zdWJjaGFubmVsKTsKLSAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3BpbmcoZXhlY19jdHgsIHRhcmdldCwgY2xvc3VyZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX211X3VubG9jaygmcC0+bXUpOwotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2xvc3VyZSwgZmFsc2UsIE5VTEwpOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBncnBjX2xiX3BvbGljeV92dGFibGUgcm91bmRfcm9iaW5fbGJfcG9saWN5X3Z0YWJsZSA9IHsKLSAgICBycl9kZXN0cm95LAotICAgIHJyX3NodXRkb3duLAotICAgIHJyX3BpY2ssCi0gICAgcnJfY2FuY2VsX3BpY2ssCi0gICAgcnJfcGluZ19vbmUsCi0gICAgcnJfZXhpdF9pZGxlLAotICAgIHJyX2NoZWNrX2Nvbm5lY3Rpdml0eSwKLSAgICBycl9ub3RpZnlfb25fc3RhdGVfY2hhbmdlfTsKLQotc3RhdGljIHZvaWQgcm91bmRfcm9iaW5fZmFjdG9yeV9yZWYoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSkge30KLQotc3RhdGljIHZvaWQgcm91bmRfcm9iaW5fZmFjdG9yeV91bnJlZihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KSB7fQotCi1zdGF0aWMgZ3JwY19sYl9wb2xpY3kgKmNyZWF0ZV9yb3VuZF9yb2JpbihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3lfYXJncyAqYXJncykgewotICBzaXplX3QgaTsKLSAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gZ3ByX21hbGxvYyhzaXplb2YoKnApKTsKLSAgR1BSX0FTU0VSVChhcmdzLT5udW1fc3ViY2hhbm5lbHMgPiAwKTsKLSAgbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwotICBncnBjX2xiX3BvbGljeV9pbml0KCZwLT5iYXNlLCAmcm91bmRfcm9iaW5fbGJfcG9saWN5X3Z0YWJsZSk7Ci0gIHAtPm51bV9zdWJjaGFubmVscyA9IGFyZ3MtPm51bV9zdWJjaGFubmVsczsKLSAgcC0+c3ViY2hhbm5lbHMgPSBncHJfbWFsbG9jKHNpemVvZigqcC0+c3ViY2hhbm5lbHMpICogcC0+bnVtX3N1YmNoYW5uZWxzKTsKLSAgbWVtc2V0KHAtPnN1YmNoYW5uZWxzLCAwLCBzaXplb2YoKnAtPnN1YmNoYW5uZWxzKSAqIHAtPm51bV9zdWJjaGFubmVscyk7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2luaXQoJnAtPnN0YXRlX3RyYWNrZXIsIEdSUENfQ0hBTk5FTF9JRExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZF9yb2JpbiIpOwotCi0gIGdwcl9tdV9pbml0KCZwLT5tdSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhcmdzLT5udW1fc3ViY2hhbm5lbHM7IGkrKykgewotICAgIHN1YmNoYW5uZWxfZGF0YSAqc2QgPSBncHJfbWFsbG9jKHNpemVvZigqc2QpKTsKLSAgICBtZW1zZXQoc2QsIDAsIHNpemVvZigqc2QpKTsKLSAgICBwLT5zdWJjaGFubmVsc1tpXSA9IHNkOwotICAgIHNkLT5wb2xpY3kgPSBwOwotICAgIHNkLT5pbmRleCA9IGk7Ci0gICAgc2QtPnN1YmNoYW5uZWwgPSBhcmdzLT5zdWJjaGFubmVsc1tpXTsKLSAgICBncnBjX2Nsb3N1cmVfaW5pdCgmc2QtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkX2Nsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgcnJfY29ubmVjdGl2aXR5X2NoYW5nZWQsIHNkKTsKLSAgfQotCi0gIC8qIFRoZSAoZHVtbXkgbm9kZSkgcm9vdCBvZiB0aGUgcmVhZHkgbGlzdCAqLwotICBwLT5yZWFkeV9saXN0LnN1YmNoYW5uZWwgPSBOVUxMOwotICBwLT5yZWFkeV9saXN0LnByZXYgPSBOVUxMOwotICBwLT5yZWFkeV9saXN0Lm5leHQgPSBOVUxMOwotICBwLT5yZWFkeV9saXN0X2xhc3RfcGljayA9ICZwLT5yZWFkeV9saXN0OwotCi0gIHJldHVybiAmcC0+YmFzZTsKLX0KLQotc3RhdGljIGNvbnN0IGdycGNfbGJfcG9saWN5X2ZhY3RvcnlfdnRhYmxlIHJvdW5kX3JvYmluX2ZhY3RvcnlfdnRhYmxlID0gewotICAgIHJvdW5kX3JvYmluX2ZhY3RvcnlfcmVmLCByb3VuZF9yb2Jpbl9mYWN0b3J5X3VucmVmLCBjcmVhdGVfcm91bmRfcm9iaW4sCi0gICAgInJvdW5kX3JvYmluIn07Ci0KLXN0YXRpYyBncnBjX2xiX3BvbGljeV9mYWN0b3J5IHJvdW5kX3JvYmluX2xiX3BvbGljeV9mYWN0b3J5ID0gewotICAgICZyb3VuZF9yb2Jpbl9mYWN0b3J5X3Z0YWJsZX07Ci0KLWdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmdycGNfcm91bmRfcm9iaW5fbGJfZmFjdG9yeV9jcmVhdGUoKSB7Ci0gIHJldHVybiAmcm91bmRfcm9iaW5fbGJfcG9saWN5X2ZhY3Rvcnk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmYxNzYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19ST1VORF9ST0JJTl9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0xCX1BPTElDSUVTX1JPVU5EX1JPQklOX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgiCi0KLWV4dGVybiBpbnQgZ3JwY19sYl9yb3VuZF9yb2Jpbl90cmFjZTsKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIKLQotLyoqIFJldHVybnMgYSBsb2FkIGJhbGFuY2luZyBmYWN0b3J5IGZvciB0aGUgcm91bmQgcm9iaW4gcG9saWN5ICovCi1ncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpncnBjX3JvdW5kX3JvYmluX2xiX2ZhY3RvcnlfY3JlYXRlKCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19ST1VORF9ST0JJTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4YjAwNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIgotCi0jZGVmaW5lIFdFQUtfUkVGX0JJVFMgMTYKLQotdm9pZCBncnBjX2xiX3BvbGljeV9pbml0KGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19sYl9wb2xpY3lfdnRhYmxlICp2dGFibGUpIHsKLSAgcG9saWN5LT52dGFibGUgPSB2dGFibGU7Ci0gIGdwcl9hdG1fbm9fYmFycmllcl9zdG9yZSgmcG9saWN5LT5yZWZfcGFpciwgMSA8PCBXRUFLX1JFRl9CSVRTKTsKLSAgcG9saWN5LT5pbnRlcmVzdGVkX3BhcnRpZXMgPSBncnBjX3BvbGxzZXRfc2V0X2NyZWF0ZSgpOwotfQotCi0jaWZkZWYgR1JQQ19MQl9QT0xJQ1lfUkVGQ09VTlRfREVCVUcKLSNkZWZpbmUgUkVGX0ZVTkNfRVhUUkFfQVJHUyAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpyZWFzb24KLSNkZWZpbmUgUkVGX01VVEFURV9FWFRSQV9BUkdTIFJFRl9GVU5DX0VYVFJBX0FSR1MsIGNvbnN0IGNoYXIgKnB1cnBvc2UKLSNkZWZpbmUgUkVGX0ZVTkNfUEFTU19BUkdTKG5ld19yZWFzb24pICwgZmlsZSwgbGluZSwgbmV3X3JlYXNvbgotI2RlZmluZSBSRUZfTVVUQVRFX1BBU1NfQVJHUyhwdXJwb3NlKSAsIGZpbGUsIGxpbmUsIHJlYXNvbiwgcHVycG9zZQotI2Vsc2UKLSNkZWZpbmUgUkVGX0ZVTkNfRVhUUkFfQVJHUwotI2RlZmluZSBSRUZfTVVUQVRFX0VYVFJBX0FSR1MKLSNkZWZpbmUgUkVGX0ZVTkNfUEFTU19BUkdTKG5ld19yZWFzb24pCi0jZGVmaW5lIFJFRl9NVVRBVEVfUEFTU19BUkdTKHgpCi0jZW5kaWYKLQotc3RhdGljIGdwcl9hdG0gcmVmX211dGF0ZShncnBjX2xiX3BvbGljeSAqYywgZ3ByX2F0bSBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhcnJpZXIgUkVGX01VVEFURV9FWFRSQV9BUkdTKSB7Ci0gIGdwcl9hdG0gb2xkX3ZhbCA9IGJhcnJpZXIgPyBncHJfYXRtX2Z1bGxfZmV0Y2hfYWRkKCZjLT5yZWZfcGFpciwgZGVsdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZjLT5yZWZfcGFpciwgZGVsdGEpOwotI2lmZGVmIEdSUENfTEJfUE9MSUNZX1JFRkNPVU5UX0RFQlVHCi0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKLSAgICAgICAgICAiTEJfUE9MSUNZOiAlcCAlIDEycyAweCUwOHggLT4gMHglMDh4IFslc10iLCBjLCBwdXJwb3NlLCBvbGRfdmFsLAotICAgICAgICAgIG9sZF92YWwgKyBkZWx0YSwgcmVhc29uKTsKLSNlbmRpZgotICByZXR1cm4gb2xkX3ZhbDsKLX0KLQotdm9pZCBncnBjX2xiX3BvbGljeV9yZWYoZ3JwY19sYl9wb2xpY3kgKnBvbGljeSBSRUZfRlVOQ19FWFRSQV9BUkdTKSB7Ci0gIHJlZl9tdXRhdGUocG9saWN5LCAxIDw8IFdFQUtfUkVGX0JJVFMsIDAgUkVGX01VVEFURV9QQVNTX0FSR1MoIlNUUk9OR19SRUYiKSk7Ci19Ci0KLXZvaWQgZ3JwY19sYl9wb2xpY3lfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2xpY3kgUkVGX0ZVTkNfRVhUUkFfQVJHUykgewotICBncHJfYXRtIG9sZF92YWwgPQotICAgICAgcmVmX211dGF0ZShwb2xpY3ksIChncHJfYXRtKTEgLSAoZ3ByX2F0bSkoMSA8PCBXRUFLX1JFRl9CSVRTKSwKLSAgICAgICAgICAgICAgICAgMSBSRUZfTVVUQVRFX1BBU1NfQVJHUygiU1RST05HX1VOUkVGIikpOwotICBncHJfYXRtIG1hc2sgPSB+KGdwcl9hdG0pKCgxIDw8IFdFQUtfUkVGX0JJVFMpIC0gMSk7Ci0gIGdwcl9hdG0gY2hlY2sgPSAxIDw8IFdFQUtfUkVGX0JJVFM7Ci0gIGlmICgob2xkX3ZhbCAmIG1hc2spID09IGNoZWNrKSB7Ci0gICAgcG9saWN5LT52dGFibGUtPnNodXRkb3duKGV4ZWNfY3R4LCBwb2xpY3kpOwotICB9Ci0gIGdycGNfbGJfcG9saWN5X3dlYWtfdW5yZWYoZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5IFJFRl9GVU5DX1BBU1NfQVJHUygic3Ryb25nLXVucmVmIikpOwotfQotCi12b2lkIGdycGNfbGJfcG9saWN5X3dlYWtfcmVmKGdycGNfbGJfcG9saWN5ICpwb2xpY3kgUkVGX0ZVTkNfRVhUUkFfQVJHUykgewotICByZWZfbXV0YXRlKHBvbGljeSwgMSwgMCBSRUZfTVVUQVRFX1BBU1NfQVJHUygiV0VBS19SRUYiKSk7Ci19Ci0KLXZvaWQgZ3JwY19sYl9wb2xpY3lfd2Vha191bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqcG9saWN5IFJFRl9GVU5DX0VYVFJBX0FSR1MpIHsKLSAgZ3ByX2F0bSBvbGRfdmFsID0KLSAgICAgIHJlZl9tdXRhdGUocG9saWN5LCAtKGdwcl9hdG0pMSwgMSBSRUZfTVVUQVRFX1BBU1NfQVJHUygiV0VBS19VTlJFRiIpKTsKLSAgaWYgKG9sZF92YWwgPT0gMSkgewotICAgIGdycGNfcG9sbHNldF9zZXRfZGVzdHJveShwb2xpY3ktPmludGVyZXN0ZWRfcGFydGllcyk7Ci0gICAgcG9saWN5LT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIHBvbGljeSk7Ci0gIH0KLX0KLQotaW50IGdycGNfbGJfcG9saWN5X3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpIHsKLSAgcmV0dXJuIHBvbGljeS0+dnRhYmxlLT5waWNrKGV4ZWNfY3R4LCBwb2xpY3ksIHBvbGxzZXQsIGluaXRpYWxfbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIG9uX2NvbXBsZXRlKTsKLX0KLQotdm9pZCBncnBjX2xiX3BvbGljeV9jYW5jZWxfcGljayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCkgewotICBwb2xpY3ktPnZ0YWJsZS0+Y2FuY2VsX3BpY2soZXhlY19jdHgsIHBvbGljeSwgdGFyZ2V0KTsKLX0KLQotdm9pZCBncnBjX2xiX3BvbGljeV9leGl0X2lkbGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpIHsKLSAgcG9saWN5LT52dGFibGUtPmV4aXRfaWRsZShleGVjX2N0eCwgcG9saWN5KTsKLX0KLQotdm9pZCBncnBjX2xiX3BvbGljeV9waW5nX29uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIHBvbGljeS0+dnRhYmxlLT5waW5nX29uZShleGVjX2N0eCwgcG9saWN5LCBjbG9zdXJlKTsKLX0KLQotdm9pZCBncnBjX2xiX3BvbGljeV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgewotICBwb2xpY3ktPnZ0YWJsZS0+bm90aWZ5X29uX3N0YXRlX2NoYW5nZShleGVjX2N0eCwgcG9saWN5LCBzdGF0ZSwgY2xvc3VyZSk7Ci19Ci0KLWdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGdycGNfbGJfcG9saWN5X2NoZWNrX2Nvbm5lY3Rpdml0eSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSkgewotICByZXR1cm4gcG9saWN5LT52dGFibGUtPmNoZWNrX2Nvbm5lY3Rpdml0eShleGVjX2N0eCwgcG9saWN5KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmViYzJhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ1lfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ1lfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgotCi0vKiogQSBsb2FkIGJhbGFuY2luZyBwb2xpY3k6IHNwZWNpZmllZCBieSBhIHZ0YWJsZSBhbmQgYSBzdHJ1Y3QgKHdoaWNoCi0gICAgaXMgZXhwZWN0ZWQgdG8gYmUgZXh0ZW5kZWQgdG8gY29udGFpbiBzb21lIHBhcmFtZXRlcnMpICovCi10eXBlZGVmIHN0cnVjdCBncnBjX2xiX3BvbGljeSBncnBjX2xiX3BvbGljeTsKLXR5cGVkZWYgc3RydWN0IGdycGNfbGJfcG9saWN5X3Z0YWJsZSBncnBjX2xiX3BvbGljeV92dGFibGU7Ci0KLXR5cGVkZWYgdm9pZCAoKmdycGNfbGJfY29tcGxldGlvbikodm9pZCAqY2JfYXJnLCBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLCBjb25zdCBjaGFyICplcnJtc2cpOwotCi1zdHJ1Y3QgZ3JwY19sYl9wb2xpY3kgewotICBjb25zdCBncnBjX2xiX3BvbGljeV92dGFibGUgKnZ0YWJsZTsKLSAgZ3ByX2F0bSByZWZfcGFpcjsKLSAgLyogb3duZWQgcG9pbnRlciB0byBpbnRlcmVzdGVkIHBhcnRpZXMgaW4gbG9hZCBiYWxhbmNpbmcgZGVjaXNpb25zICovCi0gIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllczsKLX07Ci0KLXN0cnVjdCBncnBjX2xiX3BvbGljeV92dGFibGUgewotICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwotCi0gIHZvaWQgKCpzaHV0ZG93bikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwotCi0gIC8qKiBpbXBsZW1lbnQgZ3JwY19sYl9wb2xpY3lfcGljayAqLwotICBpbnQgKCpwaWNrKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKLSAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKLSAgdm9pZCAoKmNhbmNlbF9waWNrKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0KTsKLQotICB2b2lkICgqcGluZ19vbmUpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAotICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7Ci0KLSAgLyoqIHRyeSB0byBlbnRlciBhIFJFQURZIGNvbm5lY3Rpdml0eSBzdGF0ZSAqLwotICB2b2lkICgqZXhpdF9pZGxlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSk7Ci0KLSAgLyoqIGNoZWNrIHRoZSBjdXJyZW50IGNvbm5lY3Rpdml0eSBvZiB0aGUgbGJfcG9saWN5ICovCi0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICgqY2hlY2tfY29ubmVjdGl2aXR5KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwotCi0gIC8qKiBjYWxsIG5vdGlmeSB3aGVuIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBjaGFubmVsIGNoYW5nZXMgZnJvbSAqc3RhdGUuCi0gICAgICBVcGRhdGVzICpzdGF0ZSB3aXRoIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHBvbGljeSAqLwotICB2b2lkICgqbm90aWZ5X29uX3N0YXRlX2NoYW5nZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLX07Ci0KLS8qI2RlZmluZSBHUlBDX0xCX1BPTElDWV9SRUZDT1VOVF9ERUJVRyovCi0jaWZkZWYgR1JQQ19MQl9QT0xJQ1lfUkVGQ09VTlRfREVCVUcKLSNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfUkVGKHAsIHIpIFwKLSAgZ3JwY19sYl9wb2xpY3lfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi0jZGVmaW5lIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBwLCByKSBcCi0gIGdycGNfbGJfcG9saWN5X3VucmVmKChleGVjX2N0eCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi0jZGVmaW5lIEdSUENfTEJfUE9MSUNZX1dFQUtfUkVGKHAsIHIpIFwKLSAgZ3JwY19sYl9wb2xpY3lfd2Vha19yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLSNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfV0VBS19VTlJFRihleGVjX2N0eCwgcCwgcikgXAotICBncnBjX2xiX3BvbGljeV93ZWFrX3VucmVmKChleGVjX2N0eCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi12b2lkIGdycGNfbGJfcG9saWN5X3JlZihncnBjX2xiX3BvbGljeSAqcG9saWN5LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci12b2lkIGdycGNfbGJfcG9saWN5X3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKTsKLXZvaWQgZ3JwY19sYl9wb2xpY3lfd2Vha19yZWYoZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci12b2lkIGdycGNfbGJfcG9saWN5X3dlYWtfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci0jZWxzZQotI2RlZmluZSBHUlBDX0xCX1BPTElDWV9SRUYocCwgcikgZ3JwY19sYl9wb2xpY3lfcmVmKChwKSkKLSNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoY2wsIHAsIHIpIGdycGNfbGJfcG9saWN5X3VucmVmKChjbCksIChwKSkKLSNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfV0VBS19SRUYocCwgcikgZ3JwY19sYl9wb2xpY3lfd2Vha19yZWYoKHApKQotI2RlZmluZSBHUlBDX0xCX1BPTElDWV9XRUFLX1VOUkVGKGNsLCBwLCByKSBncnBjX2xiX3BvbGljeV93ZWFrX3VucmVmKChjbCksIChwKSkKLXZvaWQgZ3JwY19sYl9wb2xpY3lfcmVmKGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwotdm9pZCBncnBjX2xiX3BvbGljeV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSk7Ci12b2lkIGdycGNfbGJfcG9saWN5X3dlYWtfcmVmKGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwotdm9pZCBncnBjX2xiX3BvbGljeV93ZWFrX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5KTsKLSNlbmRpZgotCi0vKiogY2FsbGVkIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyB0byBpbml0aWFsaXplIHRoZSBiYXNlIHN0cnVjdCAqLwotdm9pZCBncnBjX2xiX3BvbGljeV9pbml0KGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19sYl9wb2xpY3lfdnRhYmxlICp2dGFibGUpOwotCi0vKiogR2l2ZW4gaW5pdGlhbCBtZXRhZGF0YSBpbiBcYSBpbml0aWFsX21ldGFkYXRhLCBmaW5kIGFuIGFwcHJvcHJpYXRlCi0gICAgdGFyZ2V0IGZvciB0aGlzIHJwYywgYW5kICdyZXR1cm4nIGl0IGJ5IGNhbGxpbmcgXGEgb25fY29tcGxldGUgYWZ0ZXIgc2V0dGluZwotICAgIFxhIHRhcmdldC4KLSAgICBQaWNraW5nIGNhbiBiZSBhc3luY2hyb25vdXMuIEFueSBJTyBzaG91bGQgYmUgZG9uZSB1bmRlciBcYSBwb2xsc2V0LiAqLwotaW50IGdycGNfbGJfcG9saWN5X3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpOwotCi12b2lkIGdycGNfbGJfcG9saWN5X3Bpbmdfb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOwotCi12b2lkIGdycGNfbGJfcG9saWN5X2NhbmNlbF9waWNrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0KTsKLQotdm9pZCBncnBjX2xiX3BvbGljeV9leGl0X2lkbGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwotCi12b2lkIGdycGNfbGJfcG9saWN5X25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLQotZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19sYl9wb2xpY3lfY2hlY2tfY29ubmVjdGl2aXR5KAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0xCX1BPTElDWV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMgYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWRlNTQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiCi0KLXZvaWQgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV9yZWYoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSogZmFjdG9yeSkgewotICBmYWN0b3J5LT52dGFibGUtPnJlZihmYWN0b3J5KTsKLX0KLQotdm9pZCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3VucmVmKGdycGNfbGJfcG9saWN5X2ZhY3RvcnkqIGZhY3RvcnkpIHsKLSAgZmFjdG9yeS0+dnRhYmxlLT51bnJlZihmYWN0b3J5KTsKLX0KLQotZ3JwY19sYl9wb2xpY3kqIGdycGNfbGJfcG9saWN5X2ZhY3RvcnlfY3JlYXRlX2xiX3BvbGljeSgKLSAgICBncnBjX2xiX3BvbGljeV9mYWN0b3J5KiBmYWN0b3J5LCBncnBjX2xiX3BvbGljeV9hcmdzKiBhcmdzKSB7Ci0gIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBOVUxMOwotICByZXR1cm4gZmFjdG9yeS0+dnRhYmxlLT5jcmVhdGVfbGJfcG9saWN5KGZhY3RvcnksIGFyZ3MpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJiYTk2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNZX0ZBQ1RPUllfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ1lfRkFDVE9SWV9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5IGdycGNfbGJfcG9saWN5X2ZhY3Rvcnk7Ci10eXBlZGVmIHN0cnVjdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3Z0YWJsZSBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3Z0YWJsZTsKLQotLyoqIGdycGNfbGJfcG9saWN5IHByb3ZpZGVzIGdycGNfY2xpZW50X2NvbmZpZyBvYmplY3RzIHRvIGdycGNfY2hhbm5lbAotICAgIG9iamVjdHMgKi8KLXN0cnVjdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5IHsKLSAgY29uc3QgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV92dGFibGUgKnZ0YWJsZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfbGJfcG9saWN5X2FyZ3MgewotICBncnBjX3N1YmNoYW5uZWwgKipzdWJjaGFubmVsczsKLSAgc2l6ZV90IG51bV9zdWJjaGFubmVsczsKLX0gZ3JwY19sYl9wb2xpY3lfYXJnczsKLQotc3RydWN0IGdycGNfbGJfcG9saWN5X2ZhY3RvcnlfdnRhYmxlIHsKLSAgdm9pZCAoKnJlZikoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSk7Ci0gIHZvaWQgKCp1bnJlZikoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSk7Ci0KLSAgLyoqIEltcGxlbWVudGF0aW9uIG9mIGdycGNfbGJfcG9saWN5X2ZhY3RvcnlfY3JlYXRlX2xiX3BvbGljeSAqLwotICBncnBjX2xiX3BvbGljeSAqKCpjcmVhdGVfbGJfcG9saWN5KShncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeV9hcmdzICphcmdzKTsKLQotICAvKiogTmFtZSBmb3IgdGhlIExCIHBvbGljeSB0aGlzIGZhY3RvcnkgaW1wbGVtZW50cyAqLwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotdm9pZCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3JlZihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKLXZvaWQgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV91bnJlZihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKLQotLyoqIENyZWF0ZSBhIGxiX3BvbGljeSBpbnN0YW5jZS4gKi8KLWdycGNfbGJfcG9saWN5ICpncnBjX2xiX3BvbGljeV9mYWN0b3J5X2NyZWF0ZV9sYl9wb2xpY3koCi0gICAgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSwgZ3JwY19sYl9wb2xpY3lfYXJncyAqYXJncyk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ1lfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzMDJlOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTUFYX1BPTElDSUVTIDEwCi0KLXN0YXRpYyBncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpnX2FsbF9vZl90aGVfbGJfcG9saWNpZXNbTUFYX1BPTElDSUVTXTsKLXN0YXRpYyBpbnQgZ19udW1iZXJfb2ZfbGJfcG9saWNpZXMgPSAwOwotCi1zdGF0aWMgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZ19kZWZhdWx0X2xiX3BvbGljeV9mYWN0b3J5OwotCi12b2lkIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X2luaXQoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZGVmYXVsdF9mYWN0b3J5KSB7Ci0gIGdfbnVtYmVyX29mX2xiX3BvbGljaWVzID0gMDsKLSAgZ19kZWZhdWx0X2xiX3BvbGljeV9mYWN0b3J5ID0gZGVmYXVsdF9mYWN0b3J5OwotfQotCi12b2lkIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X3NodXRkb3duKHZvaWQpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBnX251bWJlcl9vZl9sYl9wb2xpY2llczsgaSsrKSB7Ci0gICAgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV91bnJlZihnX2FsbF9vZl90aGVfbGJfcG9saWNpZXNbaV0pOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19yZWdpc3Rlcl9sYl9wb2xpY3koZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX2xiX3BvbGljaWVzOyBpKyspIHsKLSAgICBHUFJfQVNTRVJUKDAgIT0gc3RyY21wKGZhY3RvcnktPnZ0YWJsZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfYWxsX29mX3RoZV9sYl9wb2xpY2llc1tpXS0+dnRhYmxlLT5uYW1lKSk7Ci0gIH0KLSAgR1BSX0FTU0VSVChnX251bWJlcl9vZl9sYl9wb2xpY2llcyAhPSBNQVhfUE9MSUNJRVMpOwotICBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3JlZihmYWN0b3J5KTsKLSAgZ19hbGxfb2ZfdGhlX2xiX3BvbGljaWVzW2dfbnVtYmVyX29mX2xiX3BvbGljaWVzKytdID0gZmFjdG9yeTsKLX0KLQotc3RhdGljIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmxvb2t1cF9mYWN0b3J5KGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgaW50IGk7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX2xiX3BvbGljaWVzOyBpKyspIHsKLSAgICBpZiAoMCA9PSBzdHJjbXAobmFtZSwgZ19hbGxfb2ZfdGhlX2xiX3BvbGljaWVzW2ldLT52dGFibGUtPm5hbWUpKSB7Ci0gICAgICByZXR1cm4gZ19hbGxfb2ZfdGhlX2xiX3BvbGljaWVzW2ldOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1ncnBjX2xiX3BvbGljeSAqZ3JwY19sYl9wb2xpY3lfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5X2FyZ3MgKmFyZ3MpIHsKLSAgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSA9IGxvb2t1cF9mYWN0b3J5KG5hbWUpOwotICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5ID0KLSAgICAgIGdycGNfbGJfcG9saWN5X2ZhY3RvcnlfY3JlYXRlX2xiX3BvbGljeShmYWN0b3J5LCBhcmdzKTsKLSAgcmV0dXJuIGxiX3BvbGljeTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2EwOGEzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0xCX1BPTElDWV9SRUdJU1RSWV9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX0xCX1BPTElDWV9SRUdJU1RSWV9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiCi0KLS8qKiBJbml0aWFsaXplIHRoZSByZWdpc3RyeSBhbmQgc2V0IFxhIGRlZmF1bHRfZmFjdG9yeSBhcyB0aGUgZmFjdG9yeSB0byBiZQotICogcmV0dXJuZWQgd2hlbiBubyBuYW1lIGlzIHByb3ZpZGVkIGluIGEgbG9va3VwICovCi12b2lkIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X2luaXQoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZGVmYXVsdF9mYWN0b3J5KTsKLXZvaWQgZ3JwY19sYl9wb2xpY3lfcmVnaXN0cnlfc2h1dGRvd24odm9pZCk7Ci0KLS8qKiBSZWdpc3RlciBhIExCIHBvbGljeSBmYWN0b3J5LiAqLwotdm9pZCBncnBjX3JlZ2lzdGVyX2xiX3BvbGljeShncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKLQotLyoqIENyZWF0ZSBhIFxhIGdycGNfbGJfcG9saWN5IGluc3RhbmNlLgotICoKLSAqIElmIFxhIG5hbWUgaXMgTlVMTCwgdGhlIGRlZmF1bHQgZmFjdG9yeSBmcm9tIFxhIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X2luaXQKLSAqIHdpbGwgYmUgcmV0dXJuZWQuICovCi1ncnBjX2xiX3BvbGljeSAqZ3JwY19sYl9wb2xpY3lfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5X2FyZ3MgKmFyZ3MpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNZX1JFR0lTVFJZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMDFlNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIKLQotdm9pZCBncnBjX3Jlc29sdmVyX2luaXQoZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX3Jlc29sdmVyX3Z0YWJsZSAqdnRhYmxlKSB7Ci0gIHJlc29sdmVyLT52dGFibGUgPSB2dGFibGU7Ci0gIGdwcl9yZWZfaW5pdCgmcmVzb2x2ZXItPnJlZnMsIDEpOwotfQotCi0jaWZkZWYgR1JQQ19SRVNPTFZFUl9SRUZDT1VOVF9ERUJVRwotdm9pZCBncnBjX3Jlc29sdmVyX3JlZihncnBjX3Jlc29sdmVyICpyZXNvbHZlciwgZ3JwY19jbG9zdXJlX2xpc3QgKmNsb3N1cmVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJSRVNPTFZFUjolcCAgIHJlZiAlZCAtPiAlZCAlcyIsCi0gICAgICAgICAgcmVzb2x2ZXIsIChpbnQpcmVzb2x2ZXItPnJlZnMuY291bnQsIChpbnQpcmVzb2x2ZXItPnJlZnMuY291bnQgKyAxLAotICAgICAgICAgIHJlYXNvbik7Ci0jZWxzZQotdm9pZCBncnBjX3Jlc29sdmVyX3JlZihncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgewotI2VuZGlmCi0gIGdwcl9yZWYoJnJlc29sdmVyLT5yZWZzKTsKLX0KLQotI2lmZGVmIEdSUENfUkVTT0xWRVJfUkVGQ09VTlRfREVCVUcKLXZvaWQgZ3JwY19yZXNvbHZlcl91bnJlZihncnBjX3Jlc29sdmVyICpyZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmVfbGlzdCAqY2xvc3VyZV9saXN0LCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpyZWFzb24pIHsKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiUkVTT0xWRVI6JXAgdW5yZWYgJWQgLT4gJWQgJXMiLAotICAgICAgICAgIHJlc29sdmVyLCAoaW50KXJlc29sdmVyLT5yZWZzLmNvdW50LCAoaW50KXJlc29sdmVyLT5yZWZzLmNvdW50IC0gMSwKLSAgICAgICAgICByZWFzb24pOwotI2Vsc2UKLXZvaWQgZ3JwY19yZXNvbHZlcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKLSNlbmRpZgotICBpZiAoZ3ByX3VucmVmKCZyZXNvbHZlci0+cmVmcykpIHsKLSAgICByZXNvbHZlci0+dnRhYmxlLT5kZXN0cm95KGV4ZWNfY3R4LCByZXNvbHZlcik7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3Jlc29sdmVyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgewotICByZXNvbHZlci0+dnRhYmxlLT5zaHV0ZG93bihleGVjX2N0eCwgcmVzb2x2ZXIpOwotfQotCi12b2lkIGdycGNfcmVzb2x2ZXJfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKLSAgcmVzb2x2ZXItPnZ0YWJsZS0+Y2hhbm5lbF9zYXdfZXJyb3IoZXhlY19jdHgsIHJlc29sdmVyKTsKLX0KLQotdm9pZCBncnBjX3Jlc29sdmVyX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbGllbnRfY29uZmlnICoqdGFyZ2V0X2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpIHsKLSAgcmVzb2x2ZXItPnZ0YWJsZS0+bmV4dChleGVjX2N0eCwgcmVzb2x2ZXIsIHRhcmdldF9jb25maWcsIG9uX2NvbXBsZXRlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmODhmZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1JFU09MVkVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlciBncnBjX3Jlc29sdmVyOwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlcl92dGFibGUgZ3JwY19yZXNvbHZlcl92dGFibGU7Ci0KLS8qKiBncnBjX3Jlc29sdmVyIHByb3ZpZGVzIGdycGNfY2xpZW50X2NvbmZpZyBvYmplY3RzIHRvIGdycGNfY2hhbm5lbAotICAgIG9iamVjdHMgKi8KLXN0cnVjdCBncnBjX3Jlc29sdmVyIHsKLSAgY29uc3QgZ3JwY19yZXNvbHZlcl92dGFibGUgKnZ0YWJsZTsKLSAgZ3ByX3JlZmNvdW50IHJlZnM7Ci19OwotCi1zdHJ1Y3QgZ3JwY19yZXNvbHZlcl92dGFibGUgewotICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKTsKLSAgdm9pZCAoKnNodXRkb3duKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpOwotICB2b2lkICgqY2hhbm5lbF9zYXdfZXJyb3IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7Ci0gIHZvaWQgKCpuZXh0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKLX07Ci0KLSNpZmRlZiBHUlBDX1JFU09MVkVSX1JFRkNPVU5UX0RFQlVHCi0jZGVmaW5lIEdSUENfUkVTT0xWRVJfUkVGKHAsIHIpIGdycGNfcmVzb2x2ZXJfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi0jZGVmaW5lIEdSUENfUkVTT0xWRVJfVU5SRUYoY2wsIHAsIHIpIFwKLSAgZ3JwY19yZXNvbHZlcl91bnJlZigoY2wpLCAocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQotdm9pZCBncnBjX3Jlc29sdmVyX3JlZihncnBjX3Jlc29sdmVyICpwb2xpY3ksIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwotdm9pZCBncnBjX3Jlc29sdmVyX3VucmVmKGdycGNfcmVzb2x2ZXIgKnBvbGljeSwgZ3JwY19jbG9zdXJlX2xpc3QgKmNsb3N1cmVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKTsKLSNlbHNlCi0jZGVmaW5lIEdSUENfUkVTT0xWRVJfUkVGKHAsIHIpIGdycGNfcmVzb2x2ZXJfcmVmKChwKSkKLSNkZWZpbmUgR1JQQ19SRVNPTFZFUl9VTlJFRihjbCwgcCwgcikgZ3JwY19yZXNvbHZlcl91bnJlZigoY2wpLCAocCkpCi12b2lkIGdycGNfcmVzb2x2ZXJfcmVmKGdycGNfcmVzb2x2ZXIgKnBvbGljeSk7Ci12b2lkIGdycGNfcmVzb2x2ZXJfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnBvbGljeSk7Ci0jZW5kaWYKLQotdm9pZCBncnBjX3Jlc29sdmVyX2luaXQoZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX3Jlc29sdmVyX3Z0YWJsZSAqdnRhYmxlKTsKLQotdm9pZCBncnBjX3Jlc29sdmVyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7Ci0KLS8qKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgY2hhbm5lbCBoYXMgc2VlbiBhbiBlcnJvciBvbiBzb21lIGFkZHJlc3MuCi0gICAgQ2FuIGJlIHVzZWQgYXMgYSBoaW50IHRoYXQgcmUtcmVzb2x1dGlvbiBpcyBkZXNpcmFibGUgc29vbi4gKi8KLXZvaWQgZ3JwY19yZXNvbHZlcl9jaGFubmVsX3Nhd19lcnJvcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7Ci0KLS8qKiBHZXQgdGhlIG5leHQgY2xpZW50IGNvbmZpZy4gQ2FsbGVkIGJ5IHRoZSBjaGFubmVsIHRvIGZldGNoIGEgbmV3Ci0gICAgY29uZmlndXJhdGlvbi4gRXhwZWN0ZWQgdG8gc2V0ICp0YXJnZXRfY29uZmlnIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbiwKLSAgICBhbmQgdGhlbiBzY2hlZHVsZSBvbl9jb21wbGV0ZSBmb3IgZXhlY3V0aW9uLgotCi0gICAgSWYgcmVzb2x1dGlvbiBpcyBmYXRhbGx5IGJyb2tlbiwgc2V0ICp0YXJnZXRfY29uZmlnIHRvIE5VTEwgYW5kCi0gICAgc2NoZWR1bGUgb25fY29tcGxldGUuICovCi12b2lkIGdycGNfcmVzb2x2ZXJfbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U5MTk2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIKLQotdm9pZCBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfcmVmKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSogZmFjdG9yeSkgewotICBmYWN0b3J5LT52dGFibGUtPnJlZihmYWN0b3J5KTsKLX0KLQotdm9pZCBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfdW5yZWYoZ3JwY19yZXNvbHZlcl9mYWN0b3J5KiBmYWN0b3J5KSB7Ci0gIGZhY3RvcnktPnZ0YWJsZS0+dW5yZWYoZmFjdG9yeSk7Ci19Ci0KLS8qKiBDcmVhdGUgYSByZXNvbHZlciBpbnN0YW5jZSBmb3IgYSBuYW1lICovCi1ncnBjX3Jlc29sdmVyKiBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyKAotICAgIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSogZmFjdG9yeSwgZ3JwY19yZXNvbHZlcl9hcmdzKiBhcmdzKSB7Ci0gIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBOVUxMOwotICByZXR1cm4gZmFjdG9yeS0+dnRhYmxlLT5jcmVhdGVfcmVzb2x2ZXIoZmFjdG9yeSwgYXJncyk7Ci19Ci0KLWNoYXIqIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9nZXRfZGVmYXVsdF9hdXRob3JpdHkoCi0gICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5KiBmYWN0b3J5LCBncnBjX3VyaSogdXJpKSB7Ci0gIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBOVUxMOwotICByZXR1cm4gZmFjdG9yeS0+dnRhYmxlLT5nZXRfZGVmYXVsdF9hdXRob3JpdHkoZmFjdG9yeSwgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3N2Y4ZGIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1JFU09MVkVSX0ZBQ1RPUllfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUl9GQUNUT1JZX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgZ3JwY19yZXNvbHZlcl9mYWN0b3J5OwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZSBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfdnRhYmxlOwotCi0vKiogZ3JwY19yZXNvbHZlciBwcm92aWRlcyBncnBjX2NsaWVudF9jb25maWcgb2JqZWN0cyB0byBncnBjX2NoYW5uZWwKLSAgICBvYmplY3RzICovCi1zdHJ1Y3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5IHsKLSAgY29uc3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZSAqdnRhYmxlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlcl9hcmdzIHsKLSAgZ3JwY191cmkgKnVyaTsKLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnN1YmNoYW5uZWxfZmFjdG9yeTsKLX0gZ3JwY19yZXNvbHZlcl9hcmdzOwotCi1zdHJ1Y3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZSB7Ci0gIHZvaWQgKCpyZWYpKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSk7Ci0gIHZvaWQgKCp1bnJlZikoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5KTsKLQotICAvKiogSW1wbGVtZW50YXRpb24gb2YgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZV9yZXNvbHZlciAqLwotICBncnBjX3Jlc29sdmVyICooKmNyZWF0ZV9yZXNvbHZlcikoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlcl9hcmdzICphcmdzKTsKLQotICAvKiogSW1wbGVtZW50YXRpb24gb2YgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X2dldF9kZWZhdWx0X2F1dGhvcml0eSAqLwotICBjaGFyICooKmdldF9kZWZhdWx0X2F1dGhvcml0eSkoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LCBncnBjX3VyaSAqdXJpKTsKLQotICAvKiogVVJJIHNjaGVtZSB0aGF0IHRoaXMgZmFjdG9yeSBpbXBsZW1lbnRzICovCi0gIGNvbnN0IGNoYXIgKnNjaGVtZTsKLX07Ci0KLXZvaWQgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3JlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKnJlc29sdmVyKTsKLXZvaWQgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3VucmVmKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqcmVzb2x2ZXIpOwotCi0vKiogQ3JlYXRlIGEgcmVzb2x2ZXIgaW5zdGFuY2UgZm9yIGEgbmFtZSAqLwotZ3JwY19yZXNvbHZlciAqZ3JwY19yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZV9yZXNvbHZlcigKLSAgICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnksIGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncyk7Ci0KLS8qKiBSZXR1cm4gYSAoZnJlc2hseSBhbGxvY2F0ZWQgd2l0aCBncHJfbWFsbG9jKSBzdHJpbmcgcmVwcmVzZW50aW5nCi0gICAgdGhlIGRlZmF1bHQgYXV0aG9yaXR5IHRvIHVzZSBmb3IgdGhpcyBzY2hlbWUuICovCi1jaGFyICpncnBjX3Jlc29sdmVyX2ZhY3RvcnlfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KAotICAgIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwgZ3JwY191cmkgKnVyaSk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUl9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhOTQ1Yy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2RlZmluZSBNQVhfUkVTT0xWRVJTIDEwCi0KLXN0YXRpYyBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdfYWxsX29mX3RoZV9yZXNvbHZlcnNbTUFYX1JFU09MVkVSU107Ci1zdGF0aWMgaW50IGdfbnVtYmVyX29mX3Jlc29sdmVycyA9IDA7Ci0KLXN0YXRpYyBjaGFyICpnX2RlZmF1bHRfcmVzb2x2ZXJfcHJlZml4OwotCi12b2lkIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfaW5pdChjb25zdCBjaGFyICpkZWZhdWx0X3Jlc29sdmVyX3ByZWZpeCkgewotICBnX251bWJlcl9vZl9yZXNvbHZlcnMgPSAwOwotICBnX2RlZmF1bHRfcmVzb2x2ZXJfcHJlZml4ID0gZ3ByX3N0cmR1cChkZWZhdWx0X3Jlc29sdmVyX3ByZWZpeCk7Ci19Ci0KLXZvaWQgZ3JwY19yZXNvbHZlcl9yZWdpc3RyeV9zaHV0ZG93bih2b2lkKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgZ19udW1iZXJfb2ZfcmVzb2x2ZXJzOyBpKyspIHsKLSAgICBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfdW5yZWYoZ19hbGxfb2ZfdGhlX3Jlc29sdmVyc1tpXSk7Ci0gIH0KLSAgZ3ByX2ZyZWUoZ19kZWZhdWx0X3Jlc29sdmVyX3ByZWZpeCk7Ci19Ci0KLXZvaWQgZ3JwY19yZWdpc3Rlcl9yZXNvbHZlcl90eXBlKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX3Jlc29sdmVyczsgaSsrKSB7Ci0gICAgR1BSX0FTU0VSVCgwICE9IHN0cmNtcChmYWN0b3J5LT52dGFibGUtPnNjaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfYWxsX29mX3RoZV9yZXNvbHZlcnNbaV0tPnZ0YWJsZS0+c2NoZW1lKSk7Ci0gIH0KLSAgR1BSX0FTU0VSVChnX251bWJlcl9vZl9yZXNvbHZlcnMgIT0gTUFYX1JFU09MVkVSUyk7Ci0gIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9yZWYoZmFjdG9yeSk7Ci0gIGdfYWxsX29mX3RoZV9yZXNvbHZlcnNbZ19udW1iZXJfb2ZfcmVzb2x2ZXJzKytdID0gZmFjdG9yeTsKLX0KLQotc3RhdGljIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqbG9va3VwX2ZhY3RvcnkoZ3JwY191cmkgKnVyaSkgewotICBpbnQgaTsKLQotICAvKiBoYW5kbGluZyBOVUxMIHVyaSdzIGhlcmUgc2ltcGxpZmllcyBncnBjX3Jlc29sdmVyX2NyZWF0ZSAqLwotICBpZiAoIXVyaSkgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX3Jlc29sdmVyczsgaSsrKSB7Ci0gICAgaWYgKDAgPT0gc3RyY21wKHVyaS0+c2NoZW1lLCBnX2FsbF9vZl90aGVfcmVzb2x2ZXJzW2ldLT52dGFibGUtPnNjaGVtZSkpIHsKLSAgICAgIHJldHVybiBnX2FsbF9vZl90aGVfcmVzb2x2ZXJzW2ldOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpyZXNvbHZlX2ZhY3RvcnkoY29uc3QgY2hhciAqdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdXJpICoqdXJpKSB7Ci0gIGNoYXIgKnRtcDsKLSAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5ID0gTlVMTDsKLQotICBHUFJfQVNTRVJUKHVyaSAhPSBOVUxMKTsKLSAgKnVyaSA9IGdycGNfdXJpX3BhcnNlKHRhcmdldCwgMSk7Ci0gIGZhY3RvcnkgPSBsb29rdXBfZmFjdG9yeSgqdXJpKTsKLSAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgewotICAgIGlmIChnX2RlZmF1bHRfcmVzb2x2ZXJfcHJlZml4ICE9IE5VTEwpIHsKLSAgICAgIGdycGNfdXJpX2Rlc3Ryb3koKnVyaSk7Ci0gICAgICBncHJfYXNwcmludGYoJnRtcCwgIiVzJXMiLCBnX2RlZmF1bHRfcmVzb2x2ZXJfcHJlZml4LCB0YXJnZXQpOwotICAgICAgKnVyaSA9IGdycGNfdXJpX3BhcnNlKHRtcCwgMSk7Ci0gICAgICBmYWN0b3J5ID0gbG9va3VwX2ZhY3RvcnkoKnVyaSk7Ci0gICAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSB7Ci0gICAgICAgIGdycGNfdXJpX2Rlc3Ryb3koZ3JwY191cmlfcGFyc2UodGFyZ2V0LCAwKSk7Ci0gICAgICAgIGdycGNfdXJpX2Rlc3Ryb3koZ3JwY191cmlfcGFyc2UodG1wLCAwKSk7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZG9uJ3Qga25vdyBob3cgdG8gcmVzb2x2ZSAnJXMnIG9yICclcyciLCB0YXJnZXQsCi0gICAgICAgICAgICAgICAgdG1wKTsKLSAgICAgIH0KLSAgICAgIGdwcl9mcmVlKHRtcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdycGNfdXJpX2Rlc3Ryb3koZ3JwY191cmlfcGFyc2UodGFyZ2V0LCAwKSk7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImRvbid0IGtub3cgaG93IHRvIHJlc29sdmUgJyVzJyIsIHRhcmdldCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWN0b3J5OwotfQotCi1ncnBjX3Jlc29sdmVyICpncnBjX3Jlc29sdmVyX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICp0YXJnZXQsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzdWJjaGFubmVsX2ZhY3RvcnkpIHsKLSAgZ3JwY191cmkgKnVyaSA9IE5VTEw7Ci0gIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSA9IHJlc29sdmVfZmFjdG9yeSh0YXJnZXQsICZ1cmkpOwotICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcjsKLSAgZ3JwY19yZXNvbHZlcl9hcmdzIGFyZ3M7Ci0gIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLSAgYXJncy51cmkgPSB1cmk7Ci0gIGFyZ3Muc3ViY2hhbm5lbF9mYWN0b3J5ID0gc3ViY2hhbm5lbF9mYWN0b3J5OwotICByZXNvbHZlciA9IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIoZmFjdG9yeSwgJmFyZ3MpOwotICBncnBjX3VyaV9kZXN0cm95KHVyaSk7Ci0gIHJldHVybiByZXNvbHZlcjsKLX0KLQotY2hhciAqZ3JwY19nZXRfZGVmYXVsdF9hdXRob3JpdHkoY29uc3QgY2hhciAqdGFyZ2V0KSB7Ci0gIGdycGNfdXJpICp1cmkgPSBOVUxMOwotICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkgPSByZXNvbHZlX2ZhY3RvcnkodGFyZ2V0LCAmdXJpKTsKLSAgY2hhciAqYXV0aG9yaXR5ID0gZ3JwY19yZXNvbHZlcl9mYWN0b3J5X2dldF9kZWZhdWx0X2F1dGhvcml0eShmYWN0b3J5LCB1cmkpOwotICBncnBjX3VyaV9kZXN0cm95KHVyaSk7Ci0gIHJldHVybiBhdXRob3JpdHk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGNlYmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUl9SRUdJU1RSWV9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1JFU09MVkVSX1JFR0lTVFJZX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgotCi12b2lkIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfaW5pdChjb25zdCBjaGFyICpkZWZhdWx0X3ByZWZpeCk7Ci12b2lkIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfc2h1dGRvd24odm9pZCk7Ci0KLS8qKiBSZWdpc3RlciBhIHJlc29sdmVyIHR5cGUuCi0gICAgVVJJJ3Mgb2YgXGEgc2NoZW1lIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgZ2l2ZW4gcmVzb2x2ZXIuCi0gICAgSWYgXGEgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZW4gdGhlIHJlc29sdmVyIHdpbGwgYmUgZWxpZ2libGUKLSAgICB0byByZXNvbHZlIG5hbWVzIHRoYXQgYXJlIHBhc3NlZCBpbiB3aXRoIG5vIHNjaGVtZS4gSGlnaGVyIHByaW9yaXR5Ci0gICAgcmVzb2x2ZXJzIHdpbGwgYmUgdHJpZWQgYmVmb3JlIGxvd2VyIHByaW9yaXR5IHNjaGVtZXMuICovCi12b2lkIGdycGNfcmVnaXN0ZXJfcmVzb2x2ZXJfdHlwZShncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpOwotCi0vKiogQ3JlYXRlIGEgcmVzb2x2ZXIgZ2l2ZW4gXGEgdGFyZ2V0LgotICAgIEZpcnN0IHRyaWVzIHRvIHBhcnNlIFxhIHRhcmdldCBhcyBhIFVSSS4gSWYgdGhpcyBzdWNjZWVkcywgdHJpZXMKLSAgICB0byBsb2NhdGUgYSByZWdpc3RlcmVkIHJlc29sdmVyIGZhY3RvcnkgYmFzZWQgb24gdGhlIFVSSSBzY2hlbWUuCi0gICAgSWYgcGFyc2luZyBvciBsb2NhdGlvbiBmYWlscywgcHJlZml4ZXMgZGVmYXVsdF9wcmVmaXggZnJvbQotICAgIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfaW5pdCB0byB0YXJnZXQsIGFuZCB0cmllcyBhZ2FpbiAoaWYgZGVmYXVsdF9wcmVmaXgKLSAgICB3YXMgbm90IE5VTEwpLgotICAgIElmIGEgcmVzb2x2ZXIgZmFjdG9yeSB3YXMgZm91bmQsIHVzZSBpdCB0byBpbnN0YW50aWF0ZSBhIHJlc29sdmVyIGFuZAotICAgIHJldHVybiBpdC4KLSAgICBJZiBhIHJlc29sdmVyIGZhY3Rvcnkgd2FzIG5vdCBmb3VuZCwgcmV0dXJuIE5VTEwuICovCi1ncnBjX3Jlc29sdmVyICpncnBjX3Jlc29sdmVyX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICp0YXJnZXQsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzdWJjaGFubmVsX2ZhY3RvcnkpOwotCi0vKiogR2l2ZW4gYSB0YXJnZXQsIHJldHVybiBhIChmcmVzaGx5IGFsbG9jYXRlZCB3aXRoIGdwcl9tYWxsb2MpIHN0cmluZwotICAgIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBhdXRob3JpdHkgdG8gcGFzcyBmcm9tIGEgY2xpZW50LiAqLwotY2hhciAqZ3JwY19nZXRfZGVmYXVsdF9hdXRob3JpdHkoY29uc3QgY2hhciAqdGFyZ2V0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1JFU09MVkVSX1JFR0lTVFJZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMmVlOTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotI2RlZmluZSBCQUNLT0ZGX01VTFRJUExJRVIgMS42Ci0jZGVmaW5lIEJBQ0tPRkZfSklUVEVSIDAuMgotI2RlZmluZSBCQUNLT0ZGX01JTl9TRUNPTkRTIDEKLSNkZWZpbmUgQkFDS09GRl9NQVhfU0VDT05EUyAxMjAKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogYmFzZSBjbGFzczogbXVzdCBiZSBmaXJzdCAqLwotICBncnBjX3Jlc29sdmVyIGJhc2U7Ci0gIC8qKiByZWZjb3VudCAqLwotICBncHJfcmVmY291bnQgcmVmczsKLSAgLyoqIG5hbWUgdG8gcmVzb2x2ZSAqLwotICBjaGFyICpuYW1lOwotICAvKiogZGVmYXVsdCBwb3J0IHRvIHVzZSAqLwotICBjaGFyICpkZWZhdWx0X3BvcnQ7Ci0gIC8qKiBzdWJjaGFubmVsIGZhY3RvcnkgKi8KLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnN1YmNoYW5uZWxfZmFjdG9yeTsKLSAgLyoqIGxvYWQgYmFsYW5jaW5nIHBvbGljeSBuYW1lICovCi0gIGNoYXIgKmxiX3BvbGljeV9uYW1lOwotCi0gIC8qKiBtdXRleCBndWFyZGluZyB0aGUgcmVzdCBvZiB0aGUgc3RhdGUgKi8KLSAgZ3ByX211IG11OwotICAvKiogYXJlIHdlIGN1cnJlbnRseSByZXNvbHZpbmc/ICovCi0gIGludCByZXNvbHZpbmc7Ci0gIC8qKiB3aGljaCB2ZXJzaW9uIG9mIHJlc29sdmVkX2NvbmZpZyBoYXZlIHdlIHB1Ymxpc2hlZD8gKi8KLSAgaW50IHB1Ymxpc2hlZF92ZXJzaW9uOwotICAvKiogd2hpY2ggdmVyc2lvbiBvZiByZXNvbHZlZF9jb25maWcgaXMgY3VycmVudD8gKi8KLSAgaW50IHJlc29sdmVkX3ZlcnNpb247Ci0gIC8qKiBwZW5kaW5nIG5leHQgY29tcGxldGlvbiwgb3IgTlVMTCAqLwotICBncnBjX2Nsb3N1cmUgKm5leHRfY29tcGxldGlvbjsKLSAgLyoqIHRhcmdldCBjb25maWcgYWRkcmVzcyBmb3IgbmV4dCBjb21wbGV0aW9uICovCi0gIGdycGNfY2xpZW50X2NvbmZpZyAqKnRhcmdldF9jb25maWc7Ci0gIC8qKiBjdXJyZW50IChmdWxseSByZXNvbHZlZCkgY29uZmlnICovCi0gIGdycGNfY2xpZW50X2NvbmZpZyAqcmVzb2x2ZWRfY29uZmlnOwotICAvKiogcmV0cnkgdGltZXIgKi8KLSAgYm9vbCBoYXZlX3JldHJ5X3RpbWVyOwotICBncnBjX3RpbWVyIHJldHJ5X3RpbWVyOwotICAvKiogcmV0cnkgYmFja29mZiBzdGF0ZSAqLwotICBncHJfYmFja29mZiBiYWNrb2ZmX3N0YXRlOwotfSBkbnNfcmVzb2x2ZXI7Ci0KLXN0YXRpYyB2b2lkIGRuc19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyKTsKLQotc3RhdGljIHZvaWQgZG5zX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQoZG5zX3Jlc29sdmVyICpyKTsKLXN0YXRpYyB2b2lkIGRuc19tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuc19yZXNvbHZlciAqcik7Ci0KLXN0YXRpYyB2b2lkIGRuc19zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcik7Ci1zdGF0aWMgdm9pZCBkbnNfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnIpOwotc3RhdGljIHZvaWQgZG5zX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnIsCi0gICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSk7Ci0KLXN0YXRpYyBjb25zdCBncnBjX3Jlc29sdmVyX3Z0YWJsZSBkbnNfcmVzb2x2ZXJfdnRhYmxlID0gewotICAgIGRuc19kZXN0cm95LCBkbnNfc2h1dGRvd24sIGRuc19jaGFubmVsX3Nhd19lcnJvciwgZG5zX25leHR9OwotCi1zdGF0aWMgdm9pZCBkbnNfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7Ci0gIGRuc19yZXNvbHZlciAqciA9IChkbnNfcmVzb2x2ZXIgKilyZXNvbHZlcjsKLSAgZ3ByX211X2xvY2soJnItPm11KTsKLSAgaWYgKHItPmhhdmVfcmV0cnlfdGltZXIpIHsKLSAgICBncnBjX3RpbWVyX2NhbmNlbChleGVjX2N0eCwgJnItPnJldHJ5X3RpbWVyKTsKLSAgfQotICBpZiAoci0+bmV4dF9jb21wbGV0aW9uICE9IE5VTEwpIHsKLSAgICAqci0+dGFyZ2V0X2NvbmZpZyA9IE5VTEw7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCByLT5uZXh0X2NvbXBsZXRpb24sIHRydWUsIE5VTEwpOwotICAgIHItPm5leHRfY29tcGxldGlvbiA9IE5VTEw7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmci0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCBkbnNfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKLSAgZG5zX3Jlc29sdmVyICpyID0gKGRuc19yZXNvbHZlciAqKXJlc29sdmVyOwotICBncHJfbXVfbG9jaygmci0+bXUpOwotICBpZiAoIXItPnJlc29sdmluZykgewotICAgIGdwcl9iYWNrb2ZmX3Jlc2V0KCZyLT5iYWNrb2ZmX3N0YXRlKTsKLSAgICBkbnNfc3RhcnRfcmVzb2x2aW5nX2xvY2tlZChyKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRuc19uZXh0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xpZW50X2NvbmZpZyAqKnRhcmdldF9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7Ci0gIGRuc19yZXNvbHZlciAqciA9IChkbnNfcmVzb2x2ZXIgKilyZXNvbHZlcjsKLSAgZ3ByX211X2xvY2soJnItPm11KTsKLSAgR1BSX0FTU0VSVCghci0+bmV4dF9jb21wbGV0aW9uKTsKLSAgci0+bmV4dF9jb21wbGV0aW9uID0gb25fY29tcGxldGU7Ci0gIHItPnRhcmdldF9jb25maWcgPSB0YXJnZXRfY29uZmlnOwotICBpZiAoci0+cmVzb2x2ZWRfdmVyc2lvbiA9PSAwICYmICFyLT5yZXNvbHZpbmcpIHsKLSAgICBncHJfYmFja29mZl9yZXNldCgmci0+YmFja29mZl9zdGF0ZSk7Ci0gICAgZG5zX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7Ci0gIH0gZWxzZSB7Ci0gICAgZG5zX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChleGVjX2N0eCwgcik7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmci0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCBkbnNfb25fcmV0cnlfdGltZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZG5zX3Jlc29sdmVyICpyID0gYXJnOwotCi0gIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gIHItPmhhdmVfcmV0cnlfdGltZXIgPSBmYWxzZTsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBpZiAoIXItPnJlc29sdmluZykgewotICAgICAgZG5zX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7Ci0gICAgfQotICB9Ci0gIGdwcl9tdV91bmxvY2soJnItPm11KTsKLQotICBHUlBDX1JFU09MVkVSX1VOUkVGKGV4ZWNfY3R4LCAmci0+YmFzZSwgInJldHJ5LXRpbWVyIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRuc19vbl9yZXNvbHZlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRyZXNzZXMpIHsKLSAgZG5zX3Jlc29sdmVyICpyID0gYXJnOwotICBncnBjX2NsaWVudF9jb25maWcgKmNvbmZpZyA9IE5VTEw7Ci0gIGdycGNfc3ViY2hhbm5lbCAqKnN1YmNoYW5uZWxzOwotICBncnBjX3N1YmNoYW5uZWxfYXJncyBhcmdzOwotICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5OwotICBzaXplX3QgaTsKLSAgZ3ByX211X2xvY2soJnItPm11KTsKLSAgR1BSX0FTU0VSVChyLT5yZXNvbHZpbmcpOwotICByLT5yZXNvbHZpbmcgPSAwOwotICBpZiAoYWRkcmVzc2VzICE9IE5VTEwpIHsKLSAgICBncnBjX2xiX3BvbGljeV9hcmdzIGxiX3BvbGljeV9hcmdzOwotICAgIGNvbmZpZyA9IGdycGNfY2xpZW50X2NvbmZpZ19jcmVhdGUoKTsKLSAgICBzdWJjaGFubmVscyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc3ViY2hhbm5lbCAqKSAqIGFkZHJlc3Nlcy0+bmFkZHJzKTsKLSAgICBzaXplX3QgbmFkZHJzID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzc2VzLT5uYWRkcnM7IGkrKykgewotICAgICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotICAgICAgYXJncy5hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKShhZGRyZXNzZXMtPmFkZHJzW2ldLmFkZHIpOwotICAgICAgYXJncy5hZGRyX2xlbiA9IChzaXplX3QpYWRkcmVzc2VzLT5hZGRyc1tpXS5sZW47Ci0gICAgICBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWwgPSBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbCgKLSAgICAgICAgICBleGVjX2N0eCwgci0+c3ViY2hhbm5lbF9mYWN0b3J5LCAmYXJncyk7Ci0gICAgICBpZiAoc3ViY2hhbm5lbCAhPSBOVUxMKSB7Ci0gICAgICAgIHN1YmNoYW5uZWxzW25hZGRycysrXSA9IHN1YmNoYW5uZWw7Ci0gICAgICB9Ci0gICAgfQotICAgIG1lbXNldCgmbGJfcG9saWN5X2FyZ3MsIDAsIHNpemVvZihsYl9wb2xpY3lfYXJncykpOwotICAgIGxiX3BvbGljeV9hcmdzLnN1YmNoYW5uZWxzID0gc3ViY2hhbm5lbHM7Ci0gICAgbGJfcG9saWN5X2FyZ3MubnVtX3N1YmNoYW5uZWxzID0gbmFkZHJzOwotICAgIGxiX3BvbGljeSA9IGdycGNfbGJfcG9saWN5X2NyZWF0ZShyLT5sYl9wb2xpY3lfbmFtZSwgJmxiX3BvbGljeV9hcmdzKTsKLSAgICBpZiAobGJfcG9saWN5ICE9IE5VTEwpIHsKLSAgICAgIGdycGNfY2xpZW50X2NvbmZpZ19zZXRfbGJfcG9saWN5KGNvbmZpZywgbGJfcG9saWN5KTsKLSAgICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBsYl9wb2xpY3ksICJjb25zdHJ1Y3Rpb24iKTsKLSAgICB9Ci0gICAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXNfZGVzdHJveShhZGRyZXNzZXMpOwotICAgIGdwcl9mcmVlKHN1YmNoYW5uZWxzKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfdGltZXNwZWMgbm93ID0gZ3ByX25vdyhHUFJfQ0xPQ0tfTU9OT1RPTklDKTsKLSAgICBncHJfdGltZXNwZWMgbmV4dF90cnkgPSBncHJfYmFja29mZl9zdGVwKCZyLT5iYWNrb2ZmX3N0YXRlLCBub3cpOwotICAgIGdwcl90aW1lc3BlYyB0aW1lb3V0ID0gZ3ByX3RpbWVfc3ViKG5leHRfdHJ5LCBub3cpOwotICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiZG5zIHJlc29sdXRpb24gZmFpbGVkOiByZXRyeWluZyBpbiAlZC4lMDlkIHNlY29uZHMiLAotICAgICAgICAgICAgdGltZW91dC50dl9zZWMsIHRpbWVvdXQudHZfbnNlYyk7Ci0gICAgR1BSX0FTU0VSVCghci0+aGF2ZV9yZXRyeV90aW1lcik7Ci0gICAgci0+aGF2ZV9yZXRyeV90aW1lciA9IHRydWU7Ci0gICAgR1JQQ19SRVNPTFZFUl9SRUYoJnItPmJhc2UsICJyZXRyeS10aW1lciIpOwotICAgIGdycGNfdGltZXJfaW5pdChleGVjX2N0eCwgJnItPnJldHJ5X3RpbWVyLCBuZXh0X3RyeSwgZG5zX29uX3JldHJ5X3RpbWVyLCByLAotICAgICAgICAgICAgICAgICAgICBub3cpOwotICB9Ci0gIGlmIChyLT5yZXNvbHZlZF9jb25maWcpIHsKLSAgICBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZXhlY19jdHgsIHItPnJlc29sdmVkX2NvbmZpZyk7Ci0gIH0KLSAgci0+cmVzb2x2ZWRfY29uZmlnID0gY29uZmlnOwotICByLT5yZXNvbHZlZF92ZXJzaW9uKys7Ci0gIGRuc19tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZXhlY19jdHgsIHIpOwotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci0KLSAgR1JQQ19SRVNPTFZFUl9VTlJFRihleGVjX2N0eCwgJnItPmJhc2UsICJkbnMtcmVzb2x2aW5nIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRuc19zdGFydF9yZXNvbHZpbmdfbG9ja2VkKGRuc19yZXNvbHZlciAqcikgewotICBHUlBDX1JFU09MVkVSX1JFRigmci0+YmFzZSwgImRucy1yZXNvbHZpbmciKTsKLSAgR1BSX0FTU0VSVCghci0+cmVzb2x2aW5nKTsKLSAgci0+cmVzb2x2aW5nID0gMTsKLSAgZ3JwY19yZXNvbHZlX2FkZHJlc3Moci0+bmFtZSwgci0+ZGVmYXVsdF9wb3J0LCBkbnNfb25fcmVzb2x2ZWQsIHIpOwotfQotCi1zdGF0aWMgdm9pZCBkbnNfbWF5YmVfZmluaXNoX25leHRfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNfcmVzb2x2ZXIgKnIpIHsKLSAgaWYgKHItPm5leHRfY29tcGxldGlvbiAhPSBOVUxMICYmCi0gICAgICByLT5yZXNvbHZlZF92ZXJzaW9uICE9IHItPnB1Ymxpc2hlZF92ZXJzaW9uKSB7Ci0gICAgKnItPnRhcmdldF9jb25maWcgPSByLT5yZXNvbHZlZF9jb25maWc7Ci0gICAgaWYgKHItPnJlc29sdmVkX2NvbmZpZykgewotICAgICAgZ3JwY19jbGllbnRfY29uZmlnX3JlZihyLT5yZXNvbHZlZF9jb25maWcpOwotICAgIH0KLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHItPm5leHRfY29tcGxldGlvbiwgdHJ1ZSwgTlVMTCk7Ci0gICAgci0+bmV4dF9jb21wbGV0aW9uID0gTlVMTDsKLSAgICByLT5wdWJsaXNoZWRfdmVyc2lvbiA9IHItPnJlc29sdmVkX3ZlcnNpb247Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZG5zX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKmdyKSB7Ci0gIGRuc19yZXNvbHZlciAqciA9IChkbnNfcmVzb2x2ZXIgKilncjsKLSAgZ3ByX211X2Rlc3Ryb3koJnItPm11KTsKLSAgaWYgKHItPnJlc29sdmVkX2NvbmZpZykgewotICAgIGdycGNfY2xpZW50X2NvbmZpZ191bnJlZihleGVjX2N0eCwgci0+cmVzb2x2ZWRfY29uZmlnKTsKLSAgfQotICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV91bnJlZihleGVjX2N0eCwgci0+c3ViY2hhbm5lbF9mYWN0b3J5KTsKLSAgZ3ByX2ZyZWUoci0+bmFtZSk7Ci0gIGdwcl9mcmVlKHItPmRlZmF1bHRfcG9ydCk7Ci0gIGdwcl9mcmVlKHItPmxiX3BvbGljeV9uYW1lKTsKLSAgZ3ByX2ZyZWUocik7Ci19Ci0KLXN0YXRpYyBncnBjX3Jlc29sdmVyICpkbnNfY3JlYXRlKGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxiX3BvbGljeV9uYW1lKSB7Ci0gIGRuc19yZXNvbHZlciAqcjsKLSAgY29uc3QgY2hhciAqcGF0aCA9IGFyZ3MtPnVyaS0+cGF0aDsKLQotICBpZiAoMCAhPSBzdHJjbXAoYXJncy0+dXJpLT5hdXRob3JpdHksICIiKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiYXV0aG9yaXR5IGJhc2VkIGRucyB1cmkncyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAocGF0aFswXSA9PSAnLycpICsrcGF0aDsKLQotICByID0gZ3ByX21hbGxvYyhzaXplb2YoZG5zX3Jlc29sdmVyKSk7Ci0gIG1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKLSAgZ3ByX3JlZl9pbml0KCZyLT5yZWZzLCAxKTsKLSAgZ3ByX211X2luaXQoJnItPm11KTsKLSAgZ3JwY19yZXNvbHZlcl9pbml0KCZyLT5iYXNlLCAmZG5zX3Jlc29sdmVyX3Z0YWJsZSk7Ci0gIHItPm5hbWUgPSBncHJfc3RyZHVwKHBhdGgpOwotICByLT5kZWZhdWx0X3BvcnQgPSBncHJfc3RyZHVwKGRlZmF1bHRfcG9ydCk7Ci0gIHItPnN1YmNoYW5uZWxfZmFjdG9yeSA9IGFyZ3MtPnN1YmNoYW5uZWxfZmFjdG9yeTsKLSAgZ3ByX2JhY2tvZmZfaW5pdCgmci0+YmFja29mZl9zdGF0ZSwgQkFDS09GRl9NVUxUSVBMSUVSLCBCQUNLT0ZGX0pJVFRFUiwKLSAgICAgICAgICAgICAgICAgICBCQUNLT0ZGX01JTl9TRUNPTkRTICogMTAwMCwgQkFDS09GRl9NQVhfU0VDT05EUyAqIDEwMDApOwotICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9yZWYoci0+c3ViY2hhbm5lbF9mYWN0b3J5KTsKLSAgci0+bGJfcG9saWN5X25hbWUgPSBncHJfc3RyZHVwKGxiX3BvbGljeV9uYW1lKTsKLSAgcmV0dXJuICZyLT5iYXNlOwotfQotCi0vKgotICogRkFDVE9SWQotICovCi0KLXN0YXRpYyB2b2lkIGRuc19mYWN0b3J5X3JlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHt9Ci0KLXN0YXRpYyB2b2lkIGRuc19mYWN0b3J5X3VucmVmKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSkge30KLQotc3RhdGljIGdycGNfcmVzb2x2ZXIgKmRuc19mYWN0b3J5X2NyZWF0ZV9yZXNvbHZlcigKLSAgICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnksIGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncykgewotICByZXR1cm4gZG5zX2NyZWF0ZShhcmdzLCAiaHR0cHMiLCAicGlja19maXJzdCIpOwotfQotCi1jaGFyICpkbnNfZmFjdG9yeV9nZXRfZGVmYXVsdF9ob3N0X25hbWUoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdXJpICp1cmkpIHsKLSAgY29uc3QgY2hhciAqcGF0aCA9IHVyaS0+cGF0aDsKLSAgaWYgKHBhdGhbMF0gPT0gJy8nKSArK3BhdGg7Ci0gIHJldHVybiBncHJfc3RyZHVwKHBhdGgpOwotfQotCi1zdGF0aWMgY29uc3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZSBkbnNfZmFjdG9yeV92dGFibGUgPSB7Ci0gICAgZG5zX2ZhY3RvcnlfcmVmLCBkbnNfZmFjdG9yeV91bnJlZiwgZG5zX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyLAotICAgIGRuc19mYWN0b3J5X2dldF9kZWZhdWx0X2hvc3RfbmFtZSwgImRucyJ9Owotc3RhdGljIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSBkbnNfcmVzb2x2ZXJfZmFjdG9yeSA9IHsmZG5zX2ZhY3RvcnlfdnRhYmxlfTsKLQotZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpncnBjX2Ruc19yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSgpIHsKLSAgcmV0dXJuICZkbnNfcmVzb2x2ZXJfZmFjdG9yeTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDI4MGIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1JFU09MVkVSU19ETlNfUkVTT0xWRVJfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfRE5TX1JFU09MVkVSX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgotCi0vKiogQ3JlYXRlIGEgZG5zIHJlc29sdmVyIGZhY3RvcnkgKi8KLWdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZ3JwY19kbnNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUodm9pZCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfRE5TX1JFU09MVkVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMgYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I3ZDc5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9ob3N0X3BvcnQuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogYmFzZSBjbGFzczogbXVzdCBiZSBmaXJzdCAqLwotICBncnBjX3Jlc29sdmVyIGJhc2U7Ci0gIC8qKiByZWZjb3VudCAqLwotICBncHJfcmVmY291bnQgcmVmczsKLSAgLyoqIHN1YmNoYW5uZWwgZmFjdG9yeSAqLwotICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc3ViY2hhbm5lbF9mYWN0b3J5OwotICAvKiogbG9hZCBiYWxhbmNpbmcgcG9saWN5IG5hbWUgKi8KLSAgY2hhciAqbGJfcG9saWN5X25hbWU7Ci0KLSAgLyoqIHRoZSBhZGRyZXNzZXMgdGhhdCB3ZSd2ZSAncmVzb2x2ZWQnICovCi0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyczsKLSAgLyoqIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aCBvZiB0aGUgYWRkcmVzc2VzICovCi0gIHNpemVfdCAqYWRkcnNfbGVuOwotICAvKiogaG93IG1hbnkgZWxlbWVudHMgaW4gXGEgYWRkcnMgKi8KLSAgc2l6ZV90IG51bV9hZGRyczsKLQotICAvKiogbXV0ZXggZ3VhcmRpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlICovCi0gIGdwcl9tdSBtdTsKLSAgLyoqIGhhdmUgd2UgcHVibGlzaGVkPyAqLwotICBpbnQgcHVibGlzaGVkOwotICAvKiogcGVuZGluZyBuZXh0IGNvbXBsZXRpb24sIG9yIE5VTEwgKi8KLSAgZ3JwY19jbG9zdXJlICpuZXh0X2NvbXBsZXRpb247Ci0gIC8qKiB0YXJnZXQgY29uZmlnIGFkZHJlc3MgZm9yIG5leHQgY29tcGxldGlvbiAqLwotICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnOwotfSBzb2NrYWRkcl9yZXNvbHZlcjsKLQotc3RhdGljIHZvaWQgc29ja2FkZHJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcik7Ci0KLXN0YXRpYyB2b2lkIHNvY2thZGRyX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrYWRkcl9yZXNvbHZlciAqcik7Ci0KLXN0YXRpYyB2b2lkIHNvY2thZGRyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyKTsKLXN0YXRpYyB2b2lkIHNvY2thZGRyX2NoYW5uZWxfc2F3X2Vycm9yKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcik7Ci1zdGF0aWMgdm9pZCBzb2NrYWRkcl9uZXh0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKLQotc3RhdGljIGNvbnN0IGdycGNfcmVzb2x2ZXJfdnRhYmxlIHNvY2thZGRyX3Jlc29sdmVyX3Z0YWJsZSA9IHsKLSAgICBzb2NrYWRkcl9kZXN0cm95LCBzb2NrYWRkcl9zaHV0ZG93biwgc29ja2FkZHJfY2hhbm5lbF9zYXdfZXJyb3IsCi0gICAgc29ja2FkZHJfbmV4dH07Ci0KLXN0YXRpYyB2b2lkIHNvY2thZGRyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKLSAgc29ja2FkZHJfcmVzb2x2ZXIgKnIgPSAoc29ja2FkZHJfcmVzb2x2ZXIgKilyZXNvbHZlcjsKLSAgZ3ByX211X2xvY2soJnItPm11KTsKLSAgaWYgKHItPm5leHRfY29tcGxldGlvbiAhPSBOVUxMKSB7Ci0gICAgKnItPnRhcmdldF9jb25maWcgPSBOVUxMOwotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgci0+bmV4dF9jb21wbGV0aW9uLCB0cnVlLCBOVUxMKTsKLSAgICByLT5uZXh0X2NvbXBsZXRpb24gPSBOVUxMOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnItPm11KTsKLX0KLQotc3RhdGljIHZvaWQgc29ja2FkZHJfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgewotICBzb2NrYWRkcl9yZXNvbHZlciAqciA9IChzb2NrYWRkcl9yZXNvbHZlciAqKXJlc29sdmVyOwotICBncHJfbXVfbG9jaygmci0+bXUpOwotICByLT5wdWJsaXNoZWQgPSAwOwotICBzb2NrYWRkcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZXhlY19jdHgsIHIpOwotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvY2thZGRyX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7Ci0gIHNvY2thZGRyX3Jlc29sdmVyICpyID0gKHNvY2thZGRyX3Jlc29sdmVyICopcmVzb2x2ZXI7Ci0gIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gIEdQUl9BU1NFUlQoIXItPm5leHRfY29tcGxldGlvbik7Ci0gIHItPm5leHRfY29tcGxldGlvbiA9IG9uX2NvbXBsZXRlOwotICByLT50YXJnZXRfY29uZmlnID0gdGFyZ2V0X2NvbmZpZzsKLSAgc29ja2FkZHJfbWF5YmVfZmluaXNoX25leHRfbG9ja2VkKGV4ZWNfY3R4LCByKTsKLSAgZ3ByX211X3VubG9jaygmci0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCBzb2NrYWRkcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2FkZHJfcmVzb2x2ZXIgKnIpIHsKLSAgZ3JwY19jbGllbnRfY29uZmlnICpjZmc7Ci0gIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3k7Ci0gIGdycGNfbGJfcG9saWN5X2FyZ3MgbGJfcG9saWN5X2FyZ3M7Ci0gIGdycGNfc3ViY2hhbm5lbCAqKnN1YmNoYW5uZWxzOwotICBncnBjX3N1YmNoYW5uZWxfYXJncyBhcmdzOwotCi0gIGlmIChyLT5uZXh0X2NvbXBsZXRpb24gIT0gTlVMTCAmJiAhci0+cHVibGlzaGVkKSB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgY2ZnID0gZ3JwY19jbGllbnRfY29uZmlnX2NyZWF0ZSgpOwotICAgIHN1YmNoYW5uZWxzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zdWJjaGFubmVsICopICogci0+bnVtX2FkZHJzKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgci0+bnVtX2FkZHJzOyBpKyspIHsKLSAgICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLSAgICAgIGFyZ3MuYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmci0+YWRkcnNbaV07Ci0gICAgICBhcmdzLmFkZHJfbGVuID0gci0+YWRkcnNfbGVuW2ldOwotICAgICAgc3ViY2hhbm5lbHNbaV0gPSBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbCgKLSAgICAgICAgICBleGVjX2N0eCwgci0+c3ViY2hhbm5lbF9mYWN0b3J5LCAmYXJncyk7Ci0gICAgfQotICAgIG1lbXNldCgmbGJfcG9saWN5X2FyZ3MsIDAsIHNpemVvZihsYl9wb2xpY3lfYXJncykpOwotICAgIGxiX3BvbGljeV9hcmdzLnN1YmNoYW5uZWxzID0gc3ViY2hhbm5lbHM7Ci0gICAgbGJfcG9saWN5X2FyZ3MubnVtX3N1YmNoYW5uZWxzID0gci0+bnVtX2FkZHJzOwotICAgIGxiX3BvbGljeSA9IGdycGNfbGJfcG9saWN5X2NyZWF0ZShyLT5sYl9wb2xpY3lfbmFtZSwgJmxiX3BvbGljeV9hcmdzKTsKLSAgICBncHJfZnJlZShzdWJjaGFubmVscyk7Ci0gICAgZ3JwY19jbGllbnRfY29uZmlnX3NldF9sYl9wb2xpY3koY2ZnLCBsYl9wb2xpY3kpOwotICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBsYl9wb2xpY3ksICJzb2NrYWRkciIpOwotICAgIHItPnB1Ymxpc2hlZCA9IDE7Ci0gICAgKnItPnRhcmdldF9jb25maWcgPSBjZmc7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCByLT5uZXh0X2NvbXBsZXRpb24sIHRydWUsIE5VTEwpOwotICAgIHItPm5leHRfY29tcGxldGlvbiA9IE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc29ja2FkZHJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqZ3IpIHsKLSAgc29ja2FkZHJfcmVzb2x2ZXIgKnIgPSAoc29ja2FkZHJfcmVzb2x2ZXIgKilncjsKLSAgZ3ByX211X2Rlc3Ryb3koJnItPm11KTsKLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoZXhlY19jdHgsIHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7Ci0gIGdwcl9mcmVlKHItPmFkZHJzKTsKLSAgZ3ByX2ZyZWUoci0+YWRkcnNfbGVuKTsKLSAgZ3ByX2ZyZWUoci0+bGJfcG9saWN5X25hbWUpOwotICBncHJfZnJlZShyKTsKLX0KLQotc3RhdGljIGNoYXIgKmlwX2dldF9kZWZhdWx0X2F1dGhvcml0eShncnBjX3VyaSAqdXJpKSB7Ci0gIGNvbnN0IGNoYXIgKnBhdGggPSB1cmktPnBhdGg7Ci0gIGlmIChwYXRoWzBdID09ICcvJykgKytwYXRoOwotICByZXR1cm4gZ3ByX3N0cmR1cChwYXRoKTsKLX0KLQotc3RhdGljIGNoYXIgKmlwdjRfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7Ci0gIHJldHVybiBpcF9nZXRfZGVmYXVsdF9hdXRob3JpdHkodXJpKTsKLX0KLQotc3RhdGljIGNoYXIgKmlwdjZfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7Ci0gIHJldHVybiBpcF9nZXRfZGVmYXVsdF9hdXRob3JpdHkodXJpKTsKLX0KLQotc3RhdGljIGludCBwYXJzZV9pcHY0KGdycGNfdXJpICp1cmksIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbGVuKSB7Ci0gIGNvbnN0IGNoYXIgKmhvc3RfcG9ydCA9IHVyaS0+cGF0aDsKLSAgY2hhciAqaG9zdDsKLSAgY2hhciAqcG9ydDsKLSAgaW50IHBvcnRfbnVtOwotICBpbnQgcmVzdWx0ID0gMDsKLSAgc3RydWN0IHNvY2thZGRyX2luICppbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwotCi0gIGlmICgqaG9zdF9wb3J0ID09ICcvJykgKytob3N0X3BvcnQ7Ci0gIGlmICghZ3ByX3NwbGl0X2hvc3RfcG9ydChob3N0X3BvcnQsICZob3N0LCAmcG9ydCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIG1lbXNldChpbiwgMCwgc2l6ZW9mKCppbikpOwotICAqbGVuID0gc2l6ZW9mKCppbik7Ci0gIGluLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgaWYgKGluZXRfcHRvbihBRl9JTkVULCBob3N0LCAmaW4tPnNpbl9hZGRyKSA9PSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIGlwdjQgYWRkcmVzczogJyVzJyIsIGhvc3QpOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIGlmIChwb3J0ICE9IE5VTEwpIHsKLSAgICBpZiAoc3NjYW5mKHBvcnQsICIlZCIsICZwb3J0X251bSkgIT0gMSB8fCBwb3J0X251bSA8IDAgfHwKLSAgICAgICAgcG9ydF9udW0gPiA2NTUzNSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIGlwdjQgcG9ydDogJyVzJyIsIHBvcnQpOwotICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBpbi0+c2luX3BvcnQgPSBodG9ucygodWludDE2X3QpcG9ydF9udW0pOwotICB9IGVsc2UgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAibm8gcG9ydCBnaXZlbiBmb3IgaXB2NCBzY2hlbWUiKTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLQotICByZXN1bHQgPSAxOwotZG9uZToKLSAgZ3ByX2ZyZWUoaG9zdCk7Ci0gIGdwcl9mcmVlKHBvcnQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IHBhcnNlX2lwdjYoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW4pIHsKLSAgY29uc3QgY2hhciAqaG9zdF9wb3J0ID0gdXJpLT5wYXRoOwotICBjaGFyICpob3N0OwotICBjaGFyICpwb3J0OwotICBpbnQgcG9ydF9udW07Ci0gIGludCByZXN1bHQgPSAwOwotICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7Ci0KLSAgaWYgKCpob3N0X3BvcnQgPT0gJy8nKSArK2hvc3RfcG9ydDsKLSAgaWYgKCFncHJfc3BsaXRfaG9zdF9wb3J0KGhvc3RfcG9ydCwgJmhvc3QsICZwb3J0KSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgbWVtc2V0KGluNiwgMCwgc2l6ZW9mKCppbjYpKTsKLSAgKmxlbiA9IHNpemVvZigqaW42KTsKLSAgaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0LCAmaW42LT5zaW42X2FkZHIpID09IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgImludmFsaWQgaXB2NiBhZGRyZXNzOiAnJXMnIiwgaG9zdCk7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgaWYgKHBvcnQgIT0gTlVMTCkgewotICAgIGlmIChzc2NhbmYocG9ydCwgIiVkIiwgJnBvcnRfbnVtKSAhPSAxIHx8IHBvcnRfbnVtIDwgMCB8fAotICAgICAgICBwb3J0X251bSA+IDY1NTM1KSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImludmFsaWQgaXB2NiBwb3J0OiAnJXMnIiwgcG9ydCk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIGluNi0+c2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KXBvcnRfbnVtKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm5vIHBvcnQgZ2l2ZW4gZm9yIGlwdjYgc2NoZW1lIik7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgcmVzdWx0ID0gMTsKLWRvbmU6Ci0gIGdwcl9mcmVlKGhvc3QpOwotICBncHJfZnJlZShwb3J0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgZG9fbm90aGluZyh2b2lkICppZ25vcmVkKSB7fQotCi1zdGF0aWMgZ3JwY19yZXNvbHZlciAqc29ja2FkZHJfY3JlYXRlKAotICAgIGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncywgY29uc3QgY2hhciAqZGVmYXVsdF9sYl9wb2xpY3lfbmFtZSwKLSAgICBpbnQgcGFyc2UoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmRzdCwgc2l6ZV90ICpsZW4pKSB7Ci0gIHNpemVfdCBpOwotICBpbnQgZXJyb3JzX2ZvdW5kID0gMDsgLyogR1BSX0ZBTFNFICovCi0gIHNvY2thZGRyX3Jlc29sdmVyICpyOwotICBncHJfc2xpY2UgcGF0aF9zbGljZTsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBwYXRoX3BhcnRzOwotCi0gIGlmICgwICE9IHN0cmNtcChhcmdzLT51cmktPmF1dGhvcml0eSwgIiIpKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJhdXRob3JpdHkgYmFzZWQgdXJpJ3Mgbm90IHN1cHBvcnRlZCBieSB0aGUgJXMgc2NoZW1lIiwKLSAgICAgICAgICAgIGFyZ3MtPnVyaS0+c2NoZW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHIgPSBncHJfbWFsbG9jKHNpemVvZihzb2NrYWRkcl9yZXNvbHZlcikpOwotICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7Ci0KLSAgci0+bGJfcG9saWN5X25hbWUgPSBOVUxMOwotICBpZiAoMCAhPSBzdHJjbXAoYXJncy0+dXJpLT5xdWVyeSwgIiIpKSB7Ci0gICAgZ3ByX3NsaWNlIHF1ZXJ5X3NsaWNlOwotICAgIGdwcl9zbGljZV9idWZmZXIgcXVlcnlfcGFydHM7Ci0KLSAgICBxdWVyeV9zbGljZSA9Ci0gICAgICAgIGdwcl9zbGljZV9uZXcoYXJncy0+dXJpLT5xdWVyeSwgc3RybGVuKGFyZ3MtPnVyaS0+cXVlcnkpLCBkb19ub3RoaW5nKTsKLSAgICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJnF1ZXJ5X3BhcnRzKTsKLSAgICBncHJfc2xpY2Vfc3BsaXQocXVlcnlfc2xpY2UsICI9IiwgJnF1ZXJ5X3BhcnRzKTsKLSAgICBHUFJfQVNTRVJUKHF1ZXJ5X3BhcnRzLmNvdW50ID09IDIpOwotICAgIGlmICgwID09IGdwcl9zbGljZV9zdHJfY21wKHF1ZXJ5X3BhcnRzLnNsaWNlc1swXSwgImxiX3BvbGljeSIpKSB7Ci0gICAgICByLT5sYl9wb2xpY3lfbmFtZSA9IGdwcl9kdW1wX3NsaWNlKHF1ZXJ5X3BhcnRzLnNsaWNlc1sxXSwgR1BSX0RVTVBfQVNDSUkpOwotICAgIH0KLSAgICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnF1ZXJ5X3BhcnRzKTsKLSAgICBncHJfc2xpY2VfdW5yZWYocXVlcnlfc2xpY2UpOwotICB9Ci0gIGlmIChyLT5sYl9wb2xpY3lfbmFtZSA9PSBOVUxMKSB7Ci0gICAgci0+bGJfcG9saWN5X25hbWUgPSBncHJfc3RyZHVwKGRlZmF1bHRfbGJfcG9saWN5X25hbWUpOwotICB9Ci0KLSAgcGF0aF9zbGljZSA9Ci0gICAgICBncHJfc2xpY2VfbmV3KGFyZ3MtPnVyaS0+cGF0aCwgc3RybGVuKGFyZ3MtPnVyaS0+cGF0aCksIGRvX25vdGhpbmcpOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJnBhdGhfcGFydHMpOwotCi0gIGdwcl9zbGljZV9zcGxpdChwYXRoX3NsaWNlLCAiLCIsICZwYXRoX3BhcnRzKTsKLSAgci0+bnVtX2FkZHJzID0gcGF0aF9wYXJ0cy5jb3VudDsKLSAgci0+YWRkcnMgPSBncHJfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkgKiByLT5udW1fYWRkcnMpOwotICByLT5hZGRyc19sZW4gPSBncHJfbWFsbG9jKHNpemVvZigqci0+YWRkcnNfbGVuKSAqIHItPm51bV9hZGRycyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHItPm51bV9hZGRyczsgaSsrKSB7Ci0gICAgZ3JwY191cmkgaXRoX3VyaSA9ICphcmdzLT51cmk7Ci0gICAgY2hhciAqcGFydF9zdHIgPSBncHJfZHVtcF9zbGljZShwYXRoX3BhcnRzLnNsaWNlc1tpXSwgR1BSX0RVTVBfQVNDSUkpOwotICAgIGl0aF91cmkucGF0aCA9IHBhcnRfc3RyOwotICAgIGlmICghcGFyc2UoJml0aF91cmksICZyLT5hZGRyc1tpXSwgJnItPmFkZHJzX2xlbltpXSkpIHsKLSAgICAgIGVycm9yc19mb3VuZCA9IDE7IC8qIEdQUl9UUlVFICovCi0gICAgfQotICAgIGdwcl9mcmVlKHBhcnRfc3RyKTsKLSAgICBpZiAoZXJyb3JzX2ZvdW5kKSBicmVhazsKLSAgfQotCi0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmcGF0aF9wYXJ0cyk7Ci0gIGdwcl9zbGljZV91bnJlZihwYXRoX3NsaWNlKTsKLSAgaWYgKGVycm9yc19mb3VuZCkgewotICAgIGdwcl9mcmVlKHItPmxiX3BvbGljeV9uYW1lKTsKLSAgICBncHJfZnJlZShyLT5hZGRycyk7Ci0gICAgZ3ByX2ZyZWUoci0+YWRkcnNfbGVuKTsKLSAgICBncHJfZnJlZShyKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGdwcl9yZWZfaW5pdCgmci0+cmVmcywgMSk7Ci0gIGdwcl9tdV9pbml0KCZyLT5tdSk7Ci0gIGdycGNfcmVzb2x2ZXJfaW5pdCgmci0+YmFzZSwgJnNvY2thZGRyX3Jlc29sdmVyX3Z0YWJsZSk7Ci0gIHItPnN1YmNoYW5uZWxfZmFjdG9yeSA9IGFyZ3MtPnN1YmNoYW5uZWxfZmFjdG9yeTsKLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfcmVmKHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7Ci0KLSAgcmV0dXJuICZyLT5iYXNlOwotfQotCi0vKgotICogRkFDVE9SWQotICovCi0KLXN0YXRpYyB2b2lkIHNvY2thZGRyX2ZhY3RvcnlfcmVmKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSkge30KLQotc3RhdGljIHZvaWQgc29ja2FkZHJfZmFjdG9yeV91bnJlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHt9Ci0KLSNkZWZpbmUgREVDTF9GQUNUT1JZKG5hbWUsIHByZWZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBncnBjX3Jlc29sdmVyICpuYW1lIyNfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIoICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LCBncnBjX3Jlc29sdmVyX2FyZ3MgKmFyZ3MpIHsgICAgICAgICAgIFwKLSAgICByZXR1cm4gc29ja2FkZHJfY3JlYXRlKGFyZ3MsICJwaWNrX2ZpcnN0IiwgcHJlZml4IyNwYXJzZV8jI25hbWUpOyAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZSBuYW1lIyNfZmFjdG9yeV92dGFibGUgPSB7ICAgICAgIFwKLSAgICAgIHNvY2thZGRyX2ZhY3RvcnlfcmVmLCBzb2NrYWRkcl9mYWN0b3J5X3VucmVmLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBuYW1lIyNfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIsIHByZWZpeCMjbmFtZSMjX2dldF9kZWZhdWx0X2F1dGhvcml0eSwgXAotICAgICAgI25hbWV9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSBuYW1lIyNfcmVzb2x2ZXJfZmFjdG9yeSA9IHsgICAgICAgICAgICAgICAgICBcCi0gICAgICAmbmFtZSMjX2ZhY3RvcnlfdnRhYmxlfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdycGNfIyNuYW1lIyNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUoKSB7ICAgICAgICAgIFwKLSAgICByZXR1cm4gJm5hbWUjI19yZXNvbHZlcl9mYWN0b3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2lmZGVmIEdQUl9IQVZFX1VOSVhfU09DS0VUCi1ERUNMX0ZBQ1RPUlkodW5peCwgZ3JwY18pCi0jZW5kaWYKLURFQ0xfRkFDVE9SWShpcHY0LCApIERFQ0xfRkFDVE9SWShpcHY2LCApCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1MDMyOS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfU09DS0FERFJfUkVTT0xWRVJfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfU09DS0FERFJfUkVTT0xWRVJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgotCi1ncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdycGNfaXB2NF9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSh2b2lkKTsKLQotZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpncnBjX2lwdjZfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUodm9pZCk7Ci0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0vKiogQ3JlYXRlIGEgdW5peCByZXNvbHZlciBmYWN0b3J5ICovCi1ncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdycGNfdW5peF9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSh2b2lkKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJTX1NPQ0tBRERSX1JFU09MVkVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvem9va2VlcGVyX3Jlc29sdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTE4NzkuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvem9va2VlcGVyX3Jlc29sdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgPGdycGMvZ3JwY196b29rZWVwZXIuaD4KLSNpbmNsdWRlIDx6b29rZWVwZXIvem9va2VlcGVyLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb24uaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0KLS8qKiBab29rZWVwZXIgc2Vzc2lvbiBleHBpcmF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIEdSUENfWk9PS0VFUEVSX1NFU1NJT05fVElNRU9VVCAxNTAwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBiYXNlIGNsYXNzOiBtdXN0IGJlIGZpcnN0ICovCi0gIGdycGNfcmVzb2x2ZXIgYmFzZTsKLSAgLyoqIHJlZmNvdW50ICovCi0gIGdwcl9yZWZjb3VudCByZWZzOwotICAvKiogbmFtZSB0byByZXNvbHZlICovCi0gIGNoYXIgKm5hbWU7Ci0gIC8qKiBzdWJjaGFubmVsIGZhY3RvcnkgKi8KLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnN1YmNoYW5uZWxfZmFjdG9yeTsKLSAgLyoqIGxvYWQgYmFsYW5jaW5nIHBvbGljeSBuYW1lICovCi0gIGNoYXIgKmxiX3BvbGljeV9uYW1lOwotCi0gIC8qKiBtdXRleCBndWFyZGluZyB0aGUgcmVzdCBvZiB0aGUgc3RhdGUgKi8KLSAgZ3ByX211IG11OwotICAvKiogYXJlIHdlIGN1cnJlbnRseSByZXNvbHZpbmc/ICovCi0gIGludCByZXNvbHZpbmc7Ci0gIC8qKiB3aGljaCB2ZXJzaW9uIG9mIHJlc29sdmVkX2NvbmZpZyBoYXZlIHdlIHB1Ymxpc2hlZD8gKi8KLSAgaW50IHB1Ymxpc2hlZF92ZXJzaW9uOwotICAvKiogd2hpY2ggdmVyc2lvbiBvZiByZXNvbHZlZF9jb25maWcgaXMgY3VycmVudD8gKi8KLSAgaW50IHJlc29sdmVkX3ZlcnNpb247Ci0gIC8qKiBwZW5kaW5nIG5leHQgY29tcGxldGlvbiwgb3IgTlVMTCAqLwotICBncnBjX2Nsb3N1cmUgKm5leHRfY29tcGxldGlvbjsKLSAgLyoqIHRhcmdldCBjb25maWcgYWRkcmVzcyBmb3IgbmV4dCBjb21wbGV0aW9uICovCi0gIGdycGNfY2xpZW50X2NvbmZpZyAqKnRhcmdldF9jb25maWc7Ci0gIC8qKiBjdXJyZW50IChmdWxseSByZXNvbHZlZCkgY29uZmlnICovCi0gIGdycGNfY2xpZW50X2NvbmZpZyAqcmVzb2x2ZWRfY29uZmlnOwotCi0gIC8qKiB6b29rZWVwZXIgaGFuZGxlICovCi0gIHpoYW5kbGVfdCAqem9va2VlcGVyX2hhbmRsZTsKLSAgLyoqIHpvb2tlZXBlciByZXNvbHZlZCBhZGRyZXNzZXMgKi8KLSAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKnJlc29sdmVkX2FkZHJzOwotICAvKiogdG90YWwgbnVtYmVyIG9mIGFkZHJlc3NlcyB0byBiZSByZXNvbHZlZCAqLwotICBpbnQgcmVzb2x2ZWRfdG90YWw7Ci0gIC8qKiBudW1iZXIgb2YgYWRkcmVzc2VzIHJlc29sdmVkICovCi0gIGludCByZXNvbHZlZF9udW07Ci19IHpvb2tlZXBlcl9yZXNvbHZlcjsKLQotc3RhdGljIHZvaWQgem9va2VlcGVyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnIpOwotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfc3RhcnRfcmVzb2x2aW5nX2xvY2tlZCh6b29rZWVwZXJfcmVzb2x2ZXIgKnIpOwotc3RhdGljIHZvaWQgem9va2VlcGVyX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9va2VlcGVyX3Jlc29sdmVyICpyKTsKLQotc3RhdGljIHZvaWQgem9va2VlcGVyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyKTsKLXN0YXRpYyB2b2lkIHpvb2tlZXBlcl9jaGFubmVsX3Nhd19lcnJvcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyKTsKLXN0YXRpYyB2b2lkIHpvb2tlZXBlcl9uZXh0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbGllbnRfY29uZmlnICoqdGFyZ2V0X2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpOwotCi1zdGF0aWMgY29uc3QgZ3JwY19yZXNvbHZlcl92dGFibGUgem9va2VlcGVyX3Jlc29sdmVyX3Z0YWJsZSA9IHsKLSAgICB6b29rZWVwZXJfZGVzdHJveSwgem9va2VlcGVyX3NodXRkb3duLCB6b29rZWVwZXJfY2hhbm5lbF9zYXdfZXJyb3IsCi0gICAgem9va2VlcGVyX25leHR9OwotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKLSAgem9va2VlcGVyX3Jlc29sdmVyICpyID0gKHpvb2tlZXBlcl9yZXNvbHZlciAqKXJlc29sdmVyOwotICBncnBjX2Nsb3N1cmUgKmNhbGwgPSBOVUxMOwotICBncHJfbXVfbG9jaygmci0+bXUpOwotICBpZiAoci0+bmV4dF9jb21wbGV0aW9uICE9IE5VTEwpIHsKLSAgICAqci0+dGFyZ2V0X2NvbmZpZyA9IE5VTEw7Ci0gICAgY2FsbCA9IHItPm5leHRfY29tcGxldGlvbjsKLSAgICByLT5uZXh0X2NvbXBsZXRpb24gPSBOVUxMOwotICB9Ci0gIHpvb2tlZXBlcl9jbG9zZShyLT56b29rZWVwZXJfaGFuZGxlKTsKLSAgZ3ByX211X3VubG9jaygmci0+bXUpOwotICBpZiAoY2FsbCAhPSBOVUxMKSB7Ci0gICAgY2FsbC0+Y2IoZXhlY19jdHgsIGNhbGwtPmNiX2FyZywgMSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgem9va2VlcGVyX2NoYW5uZWxfc2F3X2Vycm9yKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7Ci0gIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9ICh6b29rZWVwZXJfcmVzb2x2ZXIgKilyZXNvbHZlcjsKLSAgZ3ByX211X2xvY2soJnItPm11KTsKLSAgaWYgKHItPnJlc29sdmluZyA9PSAwKSB7Ci0gICAgem9va2VlcGVyX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmci0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSkgewotICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSAoem9va2VlcGVyX3Jlc29sdmVyICopcmVzb2x2ZXI7Ci0gIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gIEdQUl9BU1NFUlQoci0+bmV4dF9jb21wbGV0aW9uID09IE5VTEwpOwotICByLT5uZXh0X2NvbXBsZXRpb24gPSBvbl9jb21wbGV0ZTsKLSAgci0+dGFyZ2V0X2NvbmZpZyA9IHRhcmdldF9jb25maWc7Ci0gIGlmIChyLT5yZXNvbHZlZF92ZXJzaW9uID09IDAgJiYgci0+cmVzb2x2aW5nID09IDApIHsKLSAgICB6b29rZWVwZXJfc3RhcnRfcmVzb2x2aW5nX2xvY2tlZChyKTsKLSAgfSBlbHNlIHsKLSAgICB6b29rZWVwZXJfbWF5YmVfZmluaXNoX25leHRfbG9ja2VkKGV4ZWNfY3R4LCByKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci19Ci0KLS8qKiBab29rZWVwZXIgZ2xvYmFsIHdhdGNoZXIgZm9yIGNvbm5lY3Rpb24gbWFuYWdlbWVudAotICAgIFRPRE86IGJldHRlciBjb25uZWN0aW9uIG1hbmFnZW1lbnQgYmVzaWRlcyBsb2dzICovCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfZ2xvYmFsX3dhdGNoZXIoemhhbmRsZV90ICp6b29rZWVwZXJfaGFuZGxlLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUsIGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqd2F0Y2hlcl9jdHgpIHsKLSAgaWYgKHR5cGUgPT0gWk9PX1NFU1NJT05fRVZFTlQpIHsKLSAgICBpZiAoc3RhdGUgPT0gWk9PX0VYUElSRURfU0VTU0lPTl9TVEFURSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJab29rZWVwZXIgc2Vzc2lvbiBleHBpcmVkIik7Ci0gICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBaT09fQVVUSF9GQUlMRURfU1RBVEUpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiWm9va2VlcGVyIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCIpOwotICAgIH0KLSAgfQotfQotCi0vKiogWm9va2VlcGVyIHdhdGNoZXIgdHJpZ2dlcmVkIGJ5IGNoYW5nZXMgdG8gd2F0Y2hlZCBub2RlcwotICAgIE9uY2UgdHJpZ2dlcmVkLCBpdCB0cmllcyB0byByZXNvbHZlIGFnYWluIHRvIGdldCB1cGRhdGVkIGFkZHJlc3NlcyAqLwotc3RhdGljIHZvaWQgem9va2VlcGVyX3dhdGNoZXIoemhhbmRsZV90ICp6b29rZWVwZXJfaGFuZGxlLCBpbnQgdHlwZSwgaW50IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgdm9pZCAqd2F0Y2hlcl9jdHgpIHsKLSAgaWYgKHdhdGNoZXJfY3R4ICE9IE5VTEwpIHsKLSAgICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSAoem9va2VlcGVyX3Jlc29sdmVyICopd2F0Y2hlcl9jdHg7Ci0gICAgaWYgKHN0YXRlID09IFpPT19DT05ORUNURURfU1RBVEUpIHsKLSAgICAgIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gICAgICBpZiAoci0+cmVzb2x2aW5nID09IDApIHsKLSAgICAgICAgem9va2VlcGVyX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7Ci0gICAgICB9Ci0gICAgICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKiBDYWxsYmFjayBmdW5jdGlvbiBhZnRlciBnZXR0aW5nIGFsbCByZXNvbHZlZCBhZGRyZXNzZXMKLSAgICBDcmVhdGVzIGEgc3ViY2hhbm5lbCBmb3IgZWFjaCBhZGRyZXNzICovCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfb25fcmVzb2x2ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcmVzc2VzKSB7Ci0gIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9IGFyZzsKLSAgZ3JwY19jbGllbnRfY29uZmlnICpjb25maWcgPSBOVUxMOwotICBncnBjX3N1YmNoYW5uZWwgKipzdWJjaGFubmVsczsKLSAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgYXJnczsKLSAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeTsKLSAgc2l6ZV90IGk7Ci0gIGlmIChhZGRyZXNzZXMgIT0gTlVMTCkgewotICAgIGdycGNfbGJfcG9saWN5X2FyZ3MgbGJfcG9saWN5X2FyZ3M7Ci0gICAgY29uZmlnID0gZ3JwY19jbGllbnRfY29uZmlnX2NyZWF0ZSgpOwotICAgIHN1YmNoYW5uZWxzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zdWJjaGFubmVsICopICogYWRkcmVzc2VzLT5uYWRkcnMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBhZGRyZXNzZXMtPm5hZGRyczsgaSsrKSB7Ci0gICAgICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0gICAgICBhcmdzLmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKGFkZHJlc3Nlcy0+YWRkcnNbaV0uYWRkcik7Ci0gICAgICBhcmdzLmFkZHJfbGVuID0gYWRkcmVzc2VzLT5hZGRyc1tpXS5sZW47Ci0gICAgICBzdWJjaGFubmVsc1tpXSA9IGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X2NyZWF0ZV9zdWJjaGFubmVsKAotICAgICAgICAgIGV4ZWNfY3R4LCByLT5zdWJjaGFubmVsX2ZhY3RvcnksICZhcmdzKTsKLSAgICB9Ci0gICAgbGJfcG9saWN5X2FyZ3Muc3ViY2hhbm5lbHMgPSBzdWJjaGFubmVsczsKLSAgICBsYl9wb2xpY3lfYXJncy5udW1fc3ViY2hhbm5lbHMgPSBhZGRyZXNzZXMtPm5hZGRyczsKLSAgICBsYl9wb2xpY3kgPSBncnBjX2xiX3BvbGljeV9jcmVhdGUoci0+bGJfcG9saWN5X25hbWUsICZsYl9wb2xpY3lfYXJncyk7Ci0gICAgZ3JwY19jbGllbnRfY29uZmlnX3NldF9sYl9wb2xpY3koY29uZmlnLCBsYl9wb2xpY3kpOwotICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBsYl9wb2xpY3ksICJjb25zdHJ1Y3Rpb24iKTsKLSAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KGFkZHJlc3Nlcyk7Ci0gICAgZ3ByX2ZyZWUoc3ViY2hhbm5lbHMpOwotICB9Ci0gIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gIEdQUl9BU1NFUlQoci0+cmVzb2x2aW5nID09IDEpOwotICByLT5yZXNvbHZpbmcgPSAwOwotICBpZiAoci0+cmVzb2x2ZWRfY29uZmlnICE9IE5VTEwpIHsKLSAgICBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZXhlY19jdHgsIHItPnJlc29sdmVkX2NvbmZpZyk7Ci0gIH0KLSAgci0+cmVzb2x2ZWRfY29uZmlnID0gY29uZmlnOwotICByLT5yZXNvbHZlZF92ZXJzaW9uKys7Ci0gIHpvb2tlZXBlcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZXhlY19jdHgsIHIpOwotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci0KLSAgR1JQQ19SRVNPTFZFUl9VTlJFRihleGVjX2N0eCwgJnItPmJhc2UsICJ6b29rZWVwZXItcmVzb2x2aW5nIik7Ci19Ci0KLS8qKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBETlMgcmVzb2x2ZWQgYWRkcmVzcyAqLwotc3RhdGljIHZvaWQgem9va2VlcGVyX2Ruc19yZXNvbHZlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcmVzc2VzKSB7Ci0gIHNpemVfdCBpOwotICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSBhcmc7Ci0gIGludCByZXNvbHZlX2RvbmUgPSAwOwotCi0gIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gIHItPnJlc29sdmVkX251bSsrOwotICByLT5yZXNvbHZlZF9hZGRycy0+YWRkcnMgPQotICAgICAgZ3ByX3JlYWxsb2Moci0+cmVzb2x2ZWRfYWRkcnMtPmFkZHJzLAotICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzcykgKgotICAgICAgICAgICAgICAgICAgICAgIChyLT5yZXNvbHZlZF9hZGRycy0+bmFkZHJzICsgYWRkcmVzc2VzLT5uYWRkcnMpKTsKLSAgZm9yIChpID0gMDsgaSA8IGFkZHJlc3Nlcy0+bmFkZHJzOyBpKyspIHsKLSAgICBtZW1jcHkoci0+cmVzb2x2ZWRfYWRkcnMtPmFkZHJzW2kgKyByLT5yZXNvbHZlZF9hZGRycy0+bmFkZHJzXS5hZGRyLAotICAgICAgICAgICBhZGRyZXNzZXMtPmFkZHJzW2ldLmFkZHIsIGFkZHJlc3Nlcy0+YWRkcnNbaV0ubGVuKTsKLSAgICByLT5yZXNvbHZlZF9hZGRycy0+YWRkcnNbaSArIHItPnJlc29sdmVkX2FkZHJzLT5uYWRkcnNdLmxlbiA9Ci0gICAgICAgIGFkZHJlc3Nlcy0+YWRkcnNbaV0ubGVuOwotICB9Ci0KLSAgci0+cmVzb2x2ZWRfYWRkcnMtPm5hZGRycyArPSBhZGRyZXNzZXMtPm5hZGRyczsKLSAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXNfZGVzdHJveShhZGRyZXNzZXMpOwotCi0gIC8qKiBXYWl0IGZvciBhbGwgYWRkcmVzc2VzIHRvIGJlIHJlc29sdmVkICovCi0gIHJlc29sdmVfZG9uZSA9IChyLT5yZXNvbHZlZF9udW0gPT0gci0+cmVzb2x2ZWRfdG90YWwpOwotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci0gIGlmIChyZXNvbHZlX2RvbmUpIHsKLSAgICB6b29rZWVwZXJfb25fcmVzb2x2ZWQoZXhlY19jdHgsIHIsIHItPnJlc29sdmVkX2FkZHJzKTsKLSAgfQotfQotCi0vKiogUGFyc2VzIEpTT04gZm9ybWF0IGFkZHJlc3Mgb2YgYSB6b29rZWVwZXIgbm9kZSAqLwotc3RhdGljIGNoYXIgKnpvb2tlZXBlcl9wYXJzZV9hZGRyZXNzKGNvbnN0IGNoYXIgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKSB7Ci0gIGdycGNfanNvbiAqanNvbjsKLSAgZ3JwY19qc29uICpjdXI7Ci0gIGNvbnN0IGNoYXIgKmhvc3Q7Ci0gIGNvbnN0IGNoYXIgKnBvcnQ7Ci0gIGNoYXIgKmJ1ZmZlcjsKLSAgY2hhciAqYWRkcmVzcyA9IE5VTEw7Ci0KLSAgYnVmZmVyID0gZ3ByX21hbGxvYyh2YWx1ZV9sZW4pOwotICBtZW1jcHkoYnVmZmVyLCB2YWx1ZSwgdmFsdWVfbGVuKTsKLSAganNvbiA9IGdycGNfanNvbl9wYXJzZV9zdHJpbmdfd2l0aF9sZW4oYnVmZmVyLCB2YWx1ZV9sZW4pOwotICBpZiAoanNvbiAhPSBOVUxMKSB7Ci0gICAgaG9zdCA9IE5VTEw7Ci0gICAgcG9ydCA9IE5VTEw7Ci0gICAgZm9yIChjdXIgPSBqc29uLT5jaGlsZDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgewotICAgICAgaWYgKCFzdHJjbXAoY3VyLT5rZXksICJob3N0IikpIHsKLSAgICAgICAgaG9zdCA9IGN1ci0+dmFsdWU7Ci0gICAgICAgIGlmIChwb3J0ICE9IE5VTEwpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICghc3RyY21wKGN1ci0+a2V5LCAicG9ydCIpKSB7Ci0gICAgICAgIHBvcnQgPSBjdXItPnZhbHVlOwotICAgICAgICBpZiAoaG9zdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGhvc3QgIT0gTlVMTCAmJiBwb3J0ICE9IE5VTEwpIHsKLSAgICAgIGdwcl9hc3ByaW50ZigmYWRkcmVzcywgIiVzOiVzIiwgaG9zdCwgcG9ydCk7Ci0gICAgfQotICAgIGdycGNfanNvbl9kZXN0cm95KGpzb24pOwotICB9Ci0gIGdwcl9mcmVlKGJ1ZmZlcik7Ci0KLSAgcmV0dXJuIGFkZHJlc3M7Ci19Ci0KLXN0YXRpYyB2b2lkIHpvb2tlZXBlcl9nZXRfY2hpbGRyZW5fbm9kZV9jb21wbGV0aW9uKGludCByYywgY29uc3QgY2hhciAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFN0YXQgKnN0YXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICphcmcpIHsKLSAgY2hhciAqYWRkcmVzcyA9IE5VTEw7Ci0gIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9ICh6b29rZWVwZXJfcmVzb2x2ZXIgKilhcmc7Ci0gIGludCByZXNvbHZlX2RvbmUgPSAwOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotCi0gIGlmIChyYyAhPSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBpbiBnZXR0aW5nIGEgY2hpbGQgbm9kZSBvZiAlcyIsIHItPm5hbWUpOwotICAgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYWRkcmVzcyA9IHpvb2tlZXBlcl9wYXJzZV9hZGRyZXNzKHZhbHVlLCAoc2l6ZV90KXZhbHVlX2xlbik7Ci0gIGlmIChhZGRyZXNzICE9IE5VTEwpIHsKLSAgICAvKiogRnVydGhlciByZXNvbHZlcyBhZGRyZXNzIGJ5IEROUyAqLwotICAgIGdycGNfcmVzb2x2ZV9hZGRyZXNzKGFkZHJlc3MsIE5VTEwsIHpvb2tlZXBlcl9kbnNfcmVzb2x2ZWQsIHIpOwotICAgIGdwcl9mcmVlKGFkZHJlc3MpOwotICB9IGVsc2UgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRXJyb3IgaW4gcmVzb2x2aW5nIGEgY2hpbGQgbm9kZSBvZiAlcyIsIHItPm5hbWUpOwotICAgIGdwcl9tdV9sb2NrKCZyLT5tdSk7Ci0gICAgci0+cmVzb2x2ZWRfdG90YWwtLTsKLSAgICByZXNvbHZlX2RvbmUgPSAoci0+cmVzb2x2ZWRfbnVtID09IHItPnJlc29sdmVkX3RvdGFsKTsKLSAgICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci0gICAgaWYgKHJlc29sdmVfZG9uZSkgewotICAgICAgem9va2VlcGVyX29uX3Jlc29sdmVkKCZleGVjX2N0eCwgciwgci0+cmVzb2x2ZWRfYWRkcnMpOwotICAgIH0KLSAgfQotCi0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHpvb2tlZXBlcl9nZXRfY2hpbGRyZW5fY29tcGxldGlvbigKLSAgICBpbnQgcmMsIGNvbnN0IHN0cnVjdCBTdHJpbmdfdmVjdG9yICpjaGlsZHJlbiwgY29uc3Qgdm9pZCAqYXJnKSB7Ci0gIGNoYXIgKnBhdGg7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBpOwotICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSAoem9va2VlcGVyX3Jlc29sdmVyICopYXJnOwotCi0gIGlmIChyYyAhPSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBpbiBnZXR0aW5nIHpvb2tlZXBlciBjaGlsZHJlbiBvZiAlcyIsIHItPm5hbWUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjaGlsZHJlbi0+Y291bnQgPT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRXJyb3IgaW4gcmVzb2x2aW5nIHpvb2tlZXBlciBhZGRyZXNzICVzIiwgci0+bmFtZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgci0+cmVzb2x2ZWRfYWRkcnMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3Jlc29sdmVkX2FkZHJlc3NlcykpOwotICByLT5yZXNvbHZlZF9hZGRycy0+YWRkcnMgPSBOVUxMOwotICByLT5yZXNvbHZlZF9hZGRycy0+bmFkZHJzID0gMDsKLSAgci0+cmVzb2x2ZWRfdG90YWwgPSBjaGlsZHJlbi0+Y291bnQ7Ci0KLSAgLyoqIFRPRE86IFJlcGxhY2UgZXhwZW5zaXZlIGhlYXAgYWxsb2NhdGlvbiB3aXRoIHN0YWNrCi0gICAgICBpZiB3ZSBjYW4gZ2V0IG1heGltdW0gbGVuZ3RoIG9mIHpvb2tlZXBlciBwYXRoICovCi0gIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi0+Y291bnQ7IGkrKykgewotICAgIGdwcl9hc3ByaW50ZigmcGF0aCwgIiVzLyVzIiwgci0+bmFtZSwgY2hpbGRyZW4tPmRhdGFbaV0pOwotICAgIHN0YXR1cyA9IHpvb19hd2dldChyLT56b29rZWVwZXJfaGFuZGxlLCBwYXRoLCB6b29rZWVwZXJfd2F0Y2hlciwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgem9va2VlcGVyX2dldF9jaGlsZHJlbl9ub2RlX2NvbXBsZXRpb24sIHIpOwotICAgIGdwcl9mcmVlKHBhdGgpOwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBpbiBnZXR0aW5nIHpvb2tlZXBlciBub2RlICVzIiwgcGF0aCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHpvb2tlZXBlcl9nZXRfbm9kZV9jb21wbGV0aW9uKGludCByYywgY29uc3QgY2hhciAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFN0YXQgKnN0YXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICphcmcpIHsKLSAgaW50IHN0YXR1czsKLSAgY2hhciAqYWRkcmVzcyA9IE5VTEw7Ci0gIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9ICh6b29rZWVwZXJfcmVzb2x2ZXIgKilhcmc7Ci0gIHItPnJlc29sdmVkX2FkZHJzID0gTlVMTDsKLSAgci0+cmVzb2x2ZWRfdG90YWwgPSAwOwotICByLT5yZXNvbHZlZF9udW0gPSAwOwotCi0gIGlmIChyYyAhPSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBpbiBnZXR0aW5nIHpvb2tlZXBlciBub2RlICVzIiwgci0+bmFtZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyoqIElmIHpvb2tlZXBlciBub2RlIG9mIHBhdGggci0+bmFtZSBkb2VzIG5vdCBoYXZlIGFkZHJlc3MKLSAgICAgIChpLmUuIHNlcnZpY2Ugbm9kZSksIGdldCBpdHMgY2hpbGRyZW4gKi8KLSAgYWRkcmVzcyA9IHpvb2tlZXBlcl9wYXJzZV9hZGRyZXNzKHZhbHVlLCAoc2l6ZV90KXZhbHVlX2xlbik7Ci0gIGlmIChhZGRyZXNzICE9IE5VTEwpIHsKLSAgICByLT5yZXNvbHZlZF9hZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzKSk7Ci0gICAgci0+cmVzb2x2ZWRfYWRkcnMtPmFkZHJzID0gTlVMTDsKLSAgICByLT5yZXNvbHZlZF9hZGRycy0+bmFkZHJzID0gMDsKLSAgICByLT5yZXNvbHZlZF90b3RhbCA9IDE7Ci0gICAgLyoqIEZ1cnRoZXIgcmVzb2x2ZXMgYWRkcmVzcyBieSBETlMgKi8KLSAgICBncnBjX3Jlc29sdmVfYWRkcmVzcyhhZGRyZXNzLCBOVUxMLCB6b29rZWVwZXJfZG5zX3Jlc29sdmVkLCByKTsKLSAgICBncHJfZnJlZShhZGRyZXNzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0dXMgPSB6b29fYXdnZXRfY2hpbGRyZW4oci0+em9va2VlcGVyX2hhbmRsZSwgci0+bmFtZSwgem9va2VlcGVyX3dhdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCB6b29rZWVwZXJfZ2V0X2NoaWxkcmVuX2NvbXBsZXRpb24sIHIpOwotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVycm9yIGluIGdldHRpbmcgem9va2VlcGVyIGNoaWxkcmVuIG9mICVzIiwgci0+bmFtZSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgem9va2VlcGVyX3Jlc29sdmVfYWRkcmVzcyh6b29rZWVwZXJfcmVzb2x2ZXIgKnIpIHsKLSAgaW50IHN0YXR1czsKLSAgc3RhdHVzID0gem9vX2F3Z2V0KHItPnpvb2tlZXBlcl9oYW5kbGUsIHItPm5hbWUsIHpvb2tlZXBlcl93YXRjaGVyLCByLAotICAgICAgICAgICAgICAgICAgICAgem9va2VlcGVyX2dldF9ub2RlX2NvbXBsZXRpb24sIHIpOwotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVycm9yIGluIGdldHRpbmcgem9va2VlcGVyIG5vZGUgJXMiLCByLT5uYW1lKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfc3RhcnRfcmVzb2x2aW5nX2xvY2tlZCh6b29rZWVwZXJfcmVzb2x2ZXIgKnIpIHsKLSAgR1JQQ19SRVNPTFZFUl9SRUYoJnItPmJhc2UsICJ6b29rZWVwZXItcmVzb2x2aW5nIik7Ci0gIEdQUl9BU1NFUlQoci0+cmVzb2x2aW5nID09IDApOwotICByLT5yZXNvbHZpbmcgPSAxOwotICB6b29rZWVwZXJfcmVzb2x2ZV9hZGRyZXNzKHIpOwotfQotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfbWF5YmVfZmluaXNoX25leHRfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIpIHsKLSAgaWYgKHItPm5leHRfY29tcGxldGlvbiAhPSBOVUxMICYmCi0gICAgICByLT5yZXNvbHZlZF92ZXJzaW9uICE9IHItPnB1Ymxpc2hlZF92ZXJzaW9uKSB7Ci0gICAgKnItPnRhcmdldF9jb25maWcgPSByLT5yZXNvbHZlZF9jb25maWc7Ci0gICAgaWYgKHItPnJlc29sdmVkX2NvbmZpZyAhPSBOVUxMKSB7Ci0gICAgICBncnBjX2NsaWVudF9jb25maWdfcmVmKHItPnJlc29sdmVkX2NvbmZpZyk7Ci0gICAgfQotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgci0+bmV4dF9jb21wbGV0aW9uLCB0cnVlLCBOVUxMKTsKLSAgICByLT5uZXh0X2NvbXBsZXRpb24gPSBOVUxMOwotICAgIHItPnB1Ymxpc2hlZF92ZXJzaW9uID0gci0+cmVzb2x2ZWRfdmVyc2lvbjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqZ3IpIHsKLSAgem9va2VlcGVyX3Jlc29sdmVyICpyID0gKHpvb2tlZXBlcl9yZXNvbHZlciAqKWdyOwotICBncHJfbXVfZGVzdHJveSgmci0+bXUpOwotICBpZiAoci0+cmVzb2x2ZWRfY29uZmlnICE9IE5VTEwpIHsKLSAgICBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZXhlY19jdHgsIHItPnJlc29sdmVkX2NvbmZpZyk7Ci0gIH0KLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoZXhlY19jdHgsIHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7Ci0gIGdwcl9mcmVlKHItPm5hbWUpOwotICBncHJfZnJlZShyLT5sYl9wb2xpY3lfbmFtZSk7Ci0gIGdwcl9mcmVlKHIpOwotfQotCi1zdGF0aWMgZ3JwY19yZXNvbHZlciAqem9va2VlcGVyX2NyZWF0ZShncnBjX3Jlc29sdmVyX2FyZ3MgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYl9wb2xpY3lfbmFtZSkgewotICB6b29rZWVwZXJfcmVzb2x2ZXIgKnI7Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnBhdGggPSBhcmdzLT51cmktPnBhdGg7Ci0KLSAgaWYgKDAgPT0gc3RyY21wKGFyZ3MtPnVyaS0+YXV0aG9yaXR5LCAiIikpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk5vIGF1dGhvcml0eSBzcGVjaWZpZWQgaW4gem9va2VlcGVyIHVyaSIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLyoqIFJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIGV4aXN0cyAqLwotICBsZW5ndGggPSBzdHJsZW4ocGF0aCk7Ci0gIGlmIChsZW5ndGggPiAxICYmIHBhdGhbbGVuZ3RoIC0gMV0gPT0gJy8nKSB7Ci0gICAgcGF0aFtsZW5ndGggLSAxXSA9IDA7Ci0gIH0KLQotICByID0gZ3ByX21hbGxvYyhzaXplb2Yoem9va2VlcGVyX3Jlc29sdmVyKSk7Ci0gIG1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKLSAgZ3ByX3JlZl9pbml0KCZyLT5yZWZzLCAxKTsKLSAgZ3ByX211X2luaXQoJnItPm11KTsKLSAgZ3JwY19yZXNvbHZlcl9pbml0KCZyLT5iYXNlLCAmem9va2VlcGVyX3Jlc29sdmVyX3Z0YWJsZSk7Ci0gIHItPm5hbWUgPSBncHJfc3RyZHVwKHBhdGgpOwotCi0gIHItPnN1YmNoYW5uZWxfZmFjdG9yeSA9IGFyZ3MtPnN1YmNoYW5uZWxfZmFjdG9yeTsKLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfcmVmKHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7Ci0KLSAgci0+bGJfcG9saWN5X25hbWUgPSBncHJfc3RyZHVwKGxiX3BvbGljeV9uYW1lKTsKLQotICAvKiogSW5pdGlhbGl6ZXMgem9va2VlcGVyIGNsaWVudCAqLwotICB6b29fc2V0X2RlYnVnX2xldmVsKFpPT19MT0dfTEVWRUxfV0FSTik7Ci0gIHItPnpvb2tlZXBlcl9oYW5kbGUgPQotICAgICAgem9va2VlcGVyX2luaXQoYXJncy0+dXJpLT5hdXRob3JpdHksIHpvb2tlZXBlcl9nbG9iYWxfd2F0Y2hlciwKLSAgICAgICAgICAgICAgICAgICAgIEdSUENfWk9PS0VFUEVSX1NFU1NJT05fVElNRU9VVCwgMCwgMCwgMCk7Ci0gIGlmIChyLT56b29rZWVwZXJfaGFuZGxlID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBjb25uZWN0IHRvIHpvb2tlZXBlciBzZXJ2ZXIiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiAmci0+YmFzZTsKLX0KLQotc3RhdGljIHZvaWQgem9va2VlcGVyX3BsdWdpbl9pbml0KCkgewotICBncnBjX3JlZ2lzdGVyX3Jlc29sdmVyX3R5cGUoZ3JwY196b29rZWVwZXJfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUoKSk7Ci19Ci0KLXZvaWQgZ3JwY196b29rZWVwZXJfcmVnaXN0ZXIoKSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX3pvb2tlZXBlcl9yZWdpc3Rlcih2b2lkKSIsIDAsICgpKTsKLSAgZ3JwY19yZWdpc3Rlcl9wbHVnaW4oem9va2VlcGVyX3BsdWdpbl9pbml0LCBOVUxMKTsKLX0KLQotLyoKLSAqIEZBQ1RPUlkKLSAqLwotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfZmFjdG9yeV9yZWYoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5KSB7fQotCi1zdGF0aWMgdm9pZCB6b29rZWVwZXJfZmFjdG9yeV91bnJlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHt9Ci0KLXN0YXRpYyBjaGFyICp6b29rZWVwZXJfZmFjdG9yeV9nZXRfZGVmYXVsdF9ob3N0bmFtZSgKLSAgICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnksIGdycGNfdXJpICp1cmkpIHsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBncnBjX3Jlc29sdmVyICp6b29rZWVwZXJfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIoCi0gICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LCBncnBjX3Jlc29sdmVyX2FyZ3MgKmFyZ3MpIHsKLSAgcmV0dXJuIHpvb2tlZXBlcl9jcmVhdGUoYXJncywgInBpY2tfZmlyc3QiKTsKLX0KLQotc3RhdGljIGNvbnN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV92dGFibGUgem9va2VlcGVyX2ZhY3RvcnlfdnRhYmxlID0gewotICAgIHpvb2tlZXBlcl9mYWN0b3J5X3JlZiwgem9va2VlcGVyX2ZhY3RvcnlfdW5yZWYsCi0gICAgem9va2VlcGVyX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyLCB6b29rZWVwZXJfZmFjdG9yeV9nZXRfZGVmYXVsdF9ob3N0bmFtZSwKLSAgICAiem9va2VlcGVyIn07Ci0KLXN0YXRpYyBncnBjX3Jlc29sdmVyX2ZhY3Rvcnkgem9va2VlcGVyX3Jlc29sdmVyX2ZhY3RvcnkgPSB7Ci0gICAgJnpvb2tlZXBlcl9mYWN0b3J5X3Z0YWJsZX07Ci0KLWdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZ3JwY196b29rZWVwZXJfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUoKSB7Ci0gIHJldHVybiAmem9va2VlcGVyX3Jlc29sdmVyX2ZhY3Rvcnk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaCBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGJkM2NhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfWk9PS0VFUEVSX1JFU09MVkVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJTX1pPT0tFRVBFUl9SRVNPTFZFUl9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIKLQotLyoqIENyZWF0ZSBhIHpvb2tlZXBlciByZXNvbHZlciBmYWN0b3J5ICovCi1ncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdycGNfem9va2VlcGVyX3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlKHZvaWQpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJTX1pPT0tFRVBFUl9SRVNPTFZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNkNTA0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2F2bC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgotCi0jZGVmaW5lIElOVEVSTkFMX1JFRl9CSVRTIDE2Ci0jZGVmaW5lIFNUUk9OR19SRUZfTUFTSyAofihncHJfYXRtKSgoMSA8PCBJTlRFUk5BTF9SRUZfQklUUykgLSAxKSkKLQotI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfTUlOX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTIDIwCi0jZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9JTklUSUFMX0NPTk5FQ1RfQkFDS09GRl9TRUNPTkRTIDEKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1JFQ09OTkVDVF9CQUNLT0ZGX01VTFRJUExJRVIgMS42Ci0jZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUNPTk5FQ1RfTUFYX0JBQ0tPRkZfU0VDT05EUyAxMjAKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1JFQ09OTkVDVF9KSVRURVIgMC4yCi0KLSNkZWZpbmUgR0VUX0NPTk5FQ1RFRF9TVUJDSEFOTkVMKHN1YmNoYW5uZWwsIGJhcnJpZXIpICAgICAgXAotICAoKGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKikoZ3ByX2F0bV8jI2JhcnJpZXIjI19sb2FkKCBcCi0gICAgICAmKHN1YmNoYW5uZWwpLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCkpKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2xvc3VyZSBjbG9zdXJlOwotICBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWw7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGNvbm5lY3Rpdml0eV9zdGF0ZTsKLX0gc3RhdGVfd2F0Y2hlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlciB7Ci0gIGdycGNfc3ViY2hhbm5lbCAqc3ViY2hhbm5lbDsKLSAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQ7Ci0gIGdycGNfY2xvc3VyZSAqbm90aWZ5OwotICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKLSAgc3RydWN0IGV4dGVybmFsX3N0YXRlX3dhdGNoZXIgKm5leHQ7Ci0gIHN0cnVjdCBleHRlcm5hbF9zdGF0ZV93YXRjaGVyICpwcmV2OwotfSBleHRlcm5hbF9zdGF0ZV93YXRjaGVyOwotCi1zdHJ1Y3QgZ3JwY19zdWJjaGFubmVsIHsKLSAgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQotICAvKiogcmVmY291bnQKLSAgICAgIC0gbG93ZXIgSU5URVJOQUxfUkVGX0JJVFMgYml0cyBhcmUgZm9yIGludGVybmFsIHJlZmVyZW5jZXM6Ci0gICAgICAgIHRoZXNlIGRvIG5vdCBrZWVwIHRoZSBzdWJjaGFubmVsIG9wZW4uCi0gICAgICAtIHVwcGVyIHJlbWFpbmluZyBiaXRzIGFyZSBmb3IgcHVibGljIHJlZmVyZW5jZXM6IHRoZXNlIGRvCi0gICAgICAgIGtlZXAgdGhlIHN1YmNoYW5uZWwgb3BlbiAqLwotICBncHJfYXRtIHJlZl9wYWlyOwotCi0gIC8qKiBub24tdHJhbnNwb3J0IHJlbGF0ZWQgY2hhbm5lbCBmaWx0ZXJzICovCi0gIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzOwotICBzaXplX3QgbnVtX2ZpbHRlcnM7Ci0gIC8qKiBjaGFubmVsIGFyZ3VtZW50cyAqLwotICBncnBjX2NoYW5uZWxfYXJncyAqYXJnczsKLSAgLyoqIGFkZHJlc3MgdG8gY29ubmVjdCB0byAqLwotICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHI7Ci0gIHNpemVfdCBhZGRyX2xlbjsKLQotICBncnBjX3N1YmNoYW5uZWxfa2V5ICprZXk7Ci0KLSAgLyoqIGluaXRpYWwgc3RyaW5nIHRvIHNlbmQgdG8gcGVlciAqLwotICBncHJfc2xpY2UgaW5pdGlhbF9jb25uZWN0X3N0cmluZzsKLQotICAvKiogc2V0IGR1cmluZyBjb25uZWN0aW9uICovCi0gIGdycGNfY29ubmVjdF9vdXRfYXJncyBjb25uZWN0aW5nX3Jlc3VsdDsKLQotICAvKiogY2FsbGJhY2sgZm9yIGNvbm5lY3Rpb24gZmluaXNoaW5nICovCi0gIGdycGNfY2xvc3VyZSBjb25uZWN0ZWQ7Ci0KLSAgLyoqIHBvbGxzZXRfc2V0IHRyYWNraW5nIHdobydzIGludGVyZXN0ZWQgaW4gYSBjb25uZWN0aW9uCi0gICAgICBiZWluZyBzZXR1cCAqLwotICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldDsKLQotICAvKiogYWN0aXZlIGNvbm5lY3Rpb24sIG9yIG51bGw7IG9mIHR5cGUgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqLwotICBncHJfYXRtIGNvbm5lY3RlZF9zdWJjaGFubmVsOwotCi0gIC8qKiBtdXRleCBwcm90ZWN0aW5nIHJlbWFpbmluZyBlbGVtZW50cyAqLwotICBncHJfbXUgbXU7Ci0KLSAgLyoqIGhhdmUgd2Ugc2VlbiBhIGRpc2Nvbm5lY3Rpb24/ICovCi0gIGludCBkaXNjb25uZWN0ZWQ7Ci0gIC8qKiBhcmUgd2UgY29ubmVjdGluZyAqLwotICBpbnQgY29ubmVjdGluZzsKLSAgLyoqIGNvbm5lY3Rpdml0eSBzdGF0ZSB0cmFja2luZyAqLwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyIHN0YXRlX3RyYWNrZXI7Ci0KLSAgZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlciByb290X2V4dGVybmFsX3N0YXRlX3dhdGNoZXI7Ci0KLSAgLyoqIG5leHQgY29ubmVjdCBhdHRlbXB0IHRpbWUgKi8KLSAgZ3ByX3RpbWVzcGVjIG5leHRfYXR0ZW1wdDsKLSAgLyoqIGJhY2tvZmYgc3RhdGUgKi8KLSAgZ3ByX2JhY2tvZmYgYmFja29mZl9zdGF0ZTsKLSAgLyoqIGRvIHdlIGhhdmUgYW4gYWN0aXZlIGFsYXJtPyAqLwotICBpbnQgaGF2ZV9hbGFybTsKLSAgLyoqIG91ciBhbGFybSAqLwotICBncnBjX3RpbWVyIGFsYXJtOwotICAvKiogY3VycmVudCByYW5kb20gdmFsdWUgKi8KLSAgdWludDMyX3QgcmFuZG9tOwotfTsKLQotc3RydWN0IGdycGNfc3ViY2hhbm5lbF9jYWxsIHsKLSAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqY29ubmVjdGlvbjsKLX07Ci0KLSNkZWZpbmUgU1VCQ0hBTk5FTF9DQUxMX1RPX0NBTExfU1RBQ0soY2FsbCkgKChncnBjX2NhbGxfc3RhY2sgKikoKGNhbGwpICsgMSkpCi0jZGVmaW5lIENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGNvbikgKChncnBjX2NoYW5uZWxfc3RhY2sgKikoY29uKSkKLSNkZWZpbmUgQ0FMTFNUQUNLX1RPX1NVQkNIQU5ORUxfQ0FMTChjYWxsc3RhY2spIFwKLSAgKCgoZ3JwY19zdWJjaGFubmVsX2NhbGwgKikoY2FsbHN0YWNrKSkgLSAxKQotCi1zdGF0aWMgdm9pZCBzdWJjaGFubmVsX2Nvbm5lY3RlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqc3ViY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2Vzcyk7Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBSRUZfUkVBU09OIHJlYXNvbgotI2RlZmluZSBSRUZfTE9HKG5hbWUsIHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIiVzOiAlcCAgIHJlZiAlZCAtPiAlZCAlcyIsIFwKLSAgICAgICAgICAobmFtZSksIChwKSwgKHApLT5yZWZzLmNvdW50LCAocCktPnJlZnMuY291bnQgKyAxLCByZWFzb24pCi0jZGVmaW5lIFVOUkVGX0xPRyhuYW1lLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiJXM6ICVwIHVucmVmICVkIC0+ICVkICVzIiwgXAotICAgICAgICAgIChuYW1lKSwgKHApLCAocCktPnJlZnMuY291bnQsIChwKS0+cmVmcy5jb3VudCAtIDEsIHJlYXNvbikKLSNkZWZpbmUgUkVGX01VVEFURV9FWFRSQV9BUkdTIFwKLSAgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTLCBjb25zdCBjaGFyICpwdXJwb3NlCi0jZGVmaW5lIFJFRl9NVVRBVEVfUFVSUE9TRSh4KSAsIGZpbGUsIGxpbmUsIHJlYXNvbiwgeAotI2Vsc2UKLSNkZWZpbmUgUkVGX1JFQVNPTiAiIgotI2RlZmluZSBSRUZfTE9HKG5hbWUsIHApIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZGVmaW5lIFVOUkVGX0xPRyhuYW1lLCBwKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZGVmaW5lIFJFRl9NVVRBVEVfRVhUUkFfQVJHUwotI2RlZmluZSBSRUZfTVVUQVRFX1BVUlBPU0UoeCkKLSNlbmRpZgotCi0vKgotICogY29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbgotICovCi0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rpb25fZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjID0gYXJnOwotICBncnBjX2NoYW5uZWxfc3RhY2tfZGVzdHJveShleGVjX2N0eCwgQ0hBTk5FTF9TVEFDS19GUk9NX0NPTk5FQ1RJT04oYykpOwotICBncHJfZnJlZShjKTsKLX0KLQotdm9pZCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3JlZigKLSAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgewotICBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGMpLCBSRUZfUkVBU09OKTsKLX0KLQotdm9pZCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKSB7Ci0gIEdSUENfQ0hBTk5FTF9TVEFDS19VTlJFRihleGVjX2N0eCwgQ0hBTk5FTF9TVEFDS19GUk9NX0NPTk5FQ1RJT04oYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfUkVBU09OKTsKLX0KLQotLyoKLSAqIGdycGNfc3ViY2hhbm5lbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLXN0YXRpYyB2b2lkIHN1YmNoYW5uZWxfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX3N1YmNoYW5uZWwgKmMgPSBhcmc7Ci0gIGdwcl9mcmVlKCh2b2lkICopYy0+ZmlsdGVycyk7Ci0gIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koYy0+YXJncyk7Ci0gIGdwcl9mcmVlKGMtPmFkZHIpOwotICBncHJfc2xpY2VfdW5yZWYoYy0+aW5pdGlhbF9jb25uZWN0X3N0cmluZyk7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2Rlc3Ryb3koZXhlY19jdHgsICZjLT5zdGF0ZV90cmFja2VyKTsKLSAgZ3JwY19jb25uZWN0b3JfdW5yZWYoZXhlY19jdHgsIGMtPmNvbm5lY3Rvcik7Ci0gIGdycGNfcG9sbHNldF9zZXRfZGVzdHJveShjLT5wb2xsc2V0X3NldCk7Ci0gIGdycGNfc3ViY2hhbm5lbF9rZXlfZGVzdHJveShleGVjX2N0eCwgYy0+a2V5KTsKLSAgZ3ByX2ZyZWUoYyk7Ci19Ci0KLXN0YXRpYyBncHJfYXRtIHJlZl9tdXRhdGUoZ3JwY19zdWJjaGFubmVsICpjLCBncHJfYXRtIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFycmllciBSRUZfTVVUQVRFX0VYVFJBX0FSR1MpIHsKLSAgZ3ByX2F0bSBvbGRfdmFsID0gYmFycmllciA/IGdwcl9hdG1fZnVsbF9mZXRjaF9hZGQoJmMtPnJlZl9wYWlyLCBkZWx0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJmMtPnJlZl9wYWlyLCBkZWx0YSk7Ci0jaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAotICAgICAgICAgICJTVUJDSEFOTkVMOiAlcCAlIDEycyAweCUwOHggLT4gMHglMDh4IFslc10iLCBjLCBwdXJwb3NlLCBvbGRfdmFsLAotICAgICAgICAgIG9sZF92YWwgKyBkZWx0YSwgcmVhc29uKTsKLSNlbmRpZgotICByZXR1cm4gb2xkX3ZhbDsKLX0KLQotZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfcmVmKAotICAgIGdycGNfc3ViY2hhbm5lbCAqYyBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpIHsKLSAgZ3ByX2F0bSBvbGRfcmVmczsKLSAgb2xkX3JlZnMgPSByZWZfbXV0YXRlKGMsICgxIDw8IElOVEVSTkFMX1JFRl9CSVRTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAgUkVGX01VVEFURV9QVVJQT1NFKCJTVFJPTkdfUkVGIikpOwotICBHUFJfQVNTRVJUKChvbGRfcmVmcyAmIFNUUk9OR19SRUZfTUFTSykgIT0gMCk7Ci0gIHJldHVybiBjOwotfQotCi1ncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF93ZWFrX3JlZigKLSAgICBncnBjX3N1YmNoYW5uZWwgKmMgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKSB7Ci0gIGdwcl9hdG0gb2xkX3JlZnM7Ci0gIG9sZF9yZWZzID0gcmVmX211dGF0ZShjLCAxLCAwIFJFRl9NVVRBVEVfUFVSUE9TRSgiV0VBS19SRUYiKSk7Ci0gIEdQUl9BU1NFUlQob2xkX3JlZnMgIT0gMCk7Ci0gIHJldHVybiBjOwotfQotCi1ncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9yZWZfZnJvbV93ZWFrX3JlZigKLSAgICBncnBjX3N1YmNoYW5uZWwgKmMgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKSB7Ci0gIGlmICghYykgcmV0dXJuIE5VTEw7Ci0gIGZvciAoOzspIHsKLSAgICBncHJfYXRtIG9sZF9yZWZzID0gZ3ByX2F0bV9hY3FfbG9hZCgmYy0+cmVmX3BhaXIpOwotICAgIGlmIChvbGRfcmVmcyA+PSAoMSA8PCBJTlRFUk5BTF9SRUZfQklUUykpIHsKLSAgICAgIGdwcl9hdG0gbmV3X3JlZnMgPSBvbGRfcmVmcyArICgxIDw8IElOVEVSTkFMX1JFRl9CSVRTKTsKLSAgICAgIGlmIChncHJfYXRtX3JlbF9jYXMoJmMtPnJlZl9wYWlyLCBvbGRfcmVmcywgbmV3X3JlZnMpKSB7Ci0gICAgICAgIHJldHVybiBjOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZGlzY29ubmVjdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zdWJjaGFubmVsICpjKSB7Ci0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbjsKLSAgZ3JwY19zdWJjaGFubmVsX2luZGV4X3VucmVnaXN0ZXIoZXhlY19jdHgsIGMtPmtleSwgYyk7Ci0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIEdQUl9BU1NFUlQoIWMtPmRpc2Nvbm5lY3RlZCk7Ci0gIGMtPmRpc2Nvbm5lY3RlZCA9IDE7Ci0gIGdycGNfY29ubmVjdG9yX3NodXRkb3duKGV4ZWNfY3R4LCBjLT5jb25uZWN0b3IpOwotICBjb24gPSBHRVRfQ09OTkVDVEVEX1NVQkNIQU5ORUwoYywgbm9fYmFycmllcik7Ci0gIGlmIChjb24gIT0gTlVMTCkgewotICAgIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfVU5SRUYoZXhlY19jdHgsIGNvbiwgImNvbm5lY3Rpb24iKTsKLSAgICBncHJfYXRtX25vX2JhcnJpZXJfc3RvcmUoJmMtPmNvbm5lY3RlZF9zdWJjaGFubmVsLCAweGRlYWRiZWVmKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci19Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsICpjIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgewotICBncHJfYXRtIG9sZF9yZWZzOwotICBvbGRfcmVmcyA9IHJlZl9tdXRhdGUoYywgKGdwcl9hdG0pMSAtIChncHJfYXRtKSgxIDw8IElOVEVSTkFMX1JFRl9CSVRTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEgUkVGX01VVEFURV9QVVJQT1NFKCJTVFJPTkdfVU5SRUYiKSk7Ci0gIGlmICgob2xkX3JlZnMgJiBTVFJPTkdfUkVGX01BU0spID09ICgxIDw8IElOVEVSTkFMX1JFRl9CSVRTKSkgewotICAgIGRpc2Nvbm5lY3QoZXhlY19jdHgsIGMpOwotICB9Ci0gIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGV4ZWNfY3R4LCBjLCAic3Ryb25nLXVucmVmIik7Ci19Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX3dlYWtfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKSB7Ci0gIGdwcl9hdG0gb2xkX3JlZnM7Ci0gIG9sZF9yZWZzID0gcmVmX211dGF0ZShjLCAtKGdwcl9hdG0pMSwgMSBSRUZfTVVUQVRFX1BVUlBPU0UoIldFQUtfVU5SRUYiKSk7Ci0gIGlmIChvbGRfcmVmcyA9PSAxKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBncnBjX2Nsb3N1cmVfY3JlYXRlKHN1YmNoYW5uZWxfZGVzdHJveSwgYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIE5VTEwpOwotICB9Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCByYW5kb21fc2VlZCgpIHsKLSAgcmV0dXJuICh1aW50MzJfdCkoZ3ByX3RpbWVfdG9fbWlsbGlzKGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQykpKTsKLX0KLQotZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfY3JlYXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpIHsKLSAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5ID0gZ3JwY19zdWJjaGFubmVsX2tleV9jcmVhdGUoY29ubmVjdG9yLCBhcmdzKTsKLSAgZ3JwY19zdWJjaGFubmVsICpjID0gZ3JwY19zdWJjaGFubmVsX2luZGV4X2ZpbmQoZXhlY19jdHgsIGtleSk7Ci0gIGlmIChjKSB7Ci0gICAgZ3JwY19zdWJjaGFubmVsX2tleV9kZXN0cm95KGV4ZWNfY3R4LCBrZXkpOwotICAgIHJldHVybiBjOwotICB9Ci0KLSAgYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLSAgYy0+a2V5ID0ga2V5OwotICBncHJfYXRtX25vX2JhcnJpZXJfc3RvcmUoJmMtPnJlZl9wYWlyLCAxIDw8IElOVEVSTkFMX1JFRl9CSVRTKTsKLSAgYy0+Y29ubmVjdG9yID0gY29ubmVjdG9yOwotICBncnBjX2Nvbm5lY3Rvcl9yZWYoYy0+Y29ubmVjdG9yKTsKLSAgYy0+bnVtX2ZpbHRlcnMgPSBhcmdzLT5maWx0ZXJfY291bnQ7Ci0gIGlmIChjLT5udW1fZmlsdGVycyA+IDApIHsKLSAgICBjLT5maWx0ZXJzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jaGFubmVsX2ZpbHRlciAqKSAqIGMtPm51bV9maWx0ZXJzKTsKLSAgICBtZW1jcHkoKHZvaWQgKiljLT5maWx0ZXJzLCBhcmdzLT5maWx0ZXJzLAotICAgICAgICAgICBzaXplb2YoZ3JwY19jaGFubmVsX2ZpbHRlciAqKSAqIGMtPm51bV9maWx0ZXJzKTsKLSAgfSBlbHNlIHsKLSAgICBjLT5maWx0ZXJzID0gTlVMTDsKLSAgfQotICBjLT5hZGRyID0gZ3ByX21hbGxvYyhhcmdzLT5hZGRyX2xlbik7Ci0gIG1lbWNweShjLT5hZGRyLCBhcmdzLT5hZGRyLCBhcmdzLT5hZGRyX2xlbik7Ci0gIGMtPnBvbGxzZXRfc2V0ID0gZ3JwY19wb2xsc2V0X3NldF9jcmVhdGUoKTsKLSAgYy0+YWRkcl9sZW4gPSBhcmdzLT5hZGRyX2xlbjsKLSAgZ3JwY19zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZygmYy0+YWRkciwgJmMtPmFkZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKTsKLSAgYy0+YXJncyA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHkoYXJncy0+YXJncyk7Ci0gIGMtPnJhbmRvbSA9IHJhbmRvbV9zZWVkKCk7Ci0gIGMtPnJvb3RfZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlci5uZXh0ID0gYy0+cm9vdF9leHRlcm5hbF9zdGF0ZV93YXRjaGVyLnByZXYgPQotICAgICAgJmMtPnJvb3RfZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlcjsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmMtPmNvbm5lY3RlZCwgc3ViY2hhbm5lbF9jb25uZWN0ZWQsIGMpOwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9pbml0KCZjLT5zdGF0ZV90cmFja2VyLCBHUlBDX0NIQU5ORUxfSURMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ViY2hhbm5lbCIpOwotICBncHJfYmFja29mZl9pbml0KCZjLT5iYWNrb2ZmX3N0YXRlLAotICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUNPTk5FQ1RfQkFDS09GRl9NVUxUSVBMSUVSLAotICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUNPTk5FQ1RfSklUVEVSLAotICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9JTklUSUFMX0NPTk5FQ1RfQkFDS09GRl9TRUNPTkRTICogMTAwMCwKLSAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfUkVDT05ORUNUX01BWF9CQUNLT0ZGX1NFQ09ORFMgKiAxMDAwKTsKLSAgaWYgKGMtPmFyZ3MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGMtPmFyZ3MtPm51bV9hcmdzOyBpKyspIHsKLSAgICAgIGlmICgwID09IHN0cmNtcChjLT5hcmdzLT5hcmdzW2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAiZ3JwYy50ZXN0aW5nLmZpeGVkX3JlY29ubmVjdF9iYWNrb2ZmIikpIHsKLSAgICAgICAgR1BSX0FTU0VSVChjLT5hcmdzLT5hcmdzW2ldLnR5cGUgPT0gR1JQQ19BUkdfSU5URUdFUik7Ci0gICAgICAgIGdwcl9iYWNrb2ZmX2luaXQoJmMtPmJhY2tvZmZfc3RhdGUsIDEuMCwgMC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFyZ3MtPmFyZ3NbaV0udmFsdWUuaW50ZWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotICBncHJfbXVfaW5pdCgmYy0+bXUpOwotCi0gIHJldHVybiBncnBjX3N1YmNoYW5uZWxfaW5kZXhfcmVnaXN0ZXIoZXhlY19jdHgsIGtleSwgYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnRpbnVlX2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbCAqYykgewotICBncnBjX2Nvbm5lY3RfaW5fYXJncyBhcmdzOwotCi0gIGFyZ3MuaW50ZXJlc3RlZF9wYXJ0aWVzID0gYy0+cG9sbHNldF9zZXQ7Ci0gIGFyZ3MuYWRkciA9IGMtPmFkZHI7Ci0gIGFyZ3MuYWRkcl9sZW4gPSBjLT5hZGRyX2xlbjsKLSAgYXJncy5kZWFkbGluZSA9IGMtPm5leHRfYXR0ZW1wdDsKLSAgYXJncy5jaGFubmVsX2FyZ3MgPSBjLT5hcmdzOwotICBhcmdzLmluaXRpYWxfY29ubmVjdF9zdHJpbmcgPSBjLT5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nOwotCi0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJmMtPnN0YXRlX3RyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfQ09OTkVDVElORywgInN0YXRlX2NoYW5nZSIpOwotICBncnBjX2Nvbm5lY3Rvcl9jb25uZWN0KGV4ZWNfY3R4LCBjLT5jb25uZWN0b3IsICZhcmdzLCAmYy0+Y29ubmVjdGluZ19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmMtPmNvbm5lY3RlZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbCAqYykgewotICBjLT5uZXh0X2F0dGVtcHQgPQotICAgICAgZ3ByX2JhY2tvZmZfYmVnaW4oJmMtPmJhY2tvZmZfc3RhdGUsIGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQykpOwotICBjb250aW51ZV9jb25uZWN0KGV4ZWNfY3R4LCBjKTsKLX0KLQotZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19zdWJjaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eShncnBjX3N1YmNoYW5uZWwgKmMpIHsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGU7Ci0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIHN0YXRlID0gZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfY2hlY2soJmMtPnN0YXRlX3RyYWNrZXIpOwotICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gIHJldHVybiBzdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgb25fZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlcl9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7Ci0gIGV4dGVybmFsX3N0YXRlX3dhdGNoZXIgKncgPSBhcmc7Ci0gIGdycGNfY2xvc3VyZSAqZm9sbG93X3VwID0gdy0+bm90aWZ5OwotICBpZiAody0+cG9sbHNldF9zZXQgIT0gTlVMTCkgewotICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KGV4ZWNfY3R4LCB3LT5zdWJjaGFubmVsLT5wb2xsc2V0X3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5wb2xsc2V0X3NldCk7Ci0gIH0KLSAgZ3ByX211X2xvY2soJnctPnN1YmNoYW5uZWwtPm11KTsKLSAgdy0+bmV4dC0+cHJldiA9IHctPnByZXY7Ci0gIHctPnByZXYtPm5leHQgPSB3LT5uZXh0OwotICBncHJfbXVfdW5sb2NrKCZ3LT5zdWJjaGFubmVsLT5tdSk7Ci0gIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGV4ZWNfY3R4LCB3LT5zdWJjaGFubmVsLCAiZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlciIpOwotICBncHJfZnJlZSh3KTsKLSAgZm9sbG93X3VwLT5jYihleGVjX2N0eCwgZm9sbG93X3VwLT5jYl9hcmcsIHN1Y2Nlc3MpOwotfQotCi12b2lkIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWwgKmMsCi0gICAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzLCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqc3RhdGUsCi0gICAgZ3JwY19jbG9zdXJlICpub3RpZnkpIHsKLSAgZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlciAqdzsKLQotICBpZiAoc3RhdGUgPT0gTlVMTCkgewotICAgIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gICAgZm9yICh3ID0gYy0+cm9vdF9leHRlcm5hbF9zdGF0ZV93YXRjaGVyLm5leHQ7Ci0gICAgICAgICB3ICE9ICZjLT5yb290X2V4dGVybmFsX3N0YXRlX3dhdGNoZXI7IHcgPSB3LT5uZXh0KSB7Ci0gICAgICBpZiAody0+bm90aWZ5ID09IG5vdGlmeSkgewotICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgICAgICAgICAgZXhlY19jdHgsICZjLT5zdGF0ZV90cmFja2VyLCBOVUxMLCAmdy0+Y2xvc3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdwcl9tdV91bmxvY2soJmMtPm11KTsKLSAgfSBlbHNlIHsKLSAgICB3ID0gZ3ByX21hbGxvYyhzaXplb2YoKncpKTsKLSAgICB3LT5zdWJjaGFubmVsID0gYzsKLSAgICB3LT5wb2xsc2V0X3NldCA9IGludGVyZXN0ZWRfcGFydGllczsKLSAgICB3LT5ub3RpZnkgPSBub3RpZnk7Ci0gICAgZ3JwY19jbG9zdXJlX2luaXQoJnctPmNsb3N1cmUsIG9uX2V4dGVybmFsX3N0YXRlX3dhdGNoZXJfZG9uZSwgdyk7Ci0gICAgaWYgKGludGVyZXN0ZWRfcGFydGllcyAhPSBOVUxMKSB7Ci0gICAgICBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0X3NldChleGVjX2N0eCwgYy0+cG9sbHNldF9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGVkX3BhcnRpZXMpOwotICAgIH0KLSAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYoYywgImV4dGVybmFsX3N0YXRlX3dhdGNoZXIiKTsKLSAgICBncHJfbXVfbG9jaygmYy0+bXUpOwotICAgIHctPm5leHQgPSAmYy0+cm9vdF9leHRlcm5hbF9zdGF0ZV93YXRjaGVyOwotICAgIHctPnByZXYgPSB3LT5uZXh0LT5wcmV2OwotICAgIHctPm5leHQtPnByZXYgPSB3LT5wcmV2LT5uZXh0ID0gdzsKLSAgICBpZiAoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICAgICAgICAgIGV4ZWNfY3R4LCAmYy0+c3RhdGVfdHJhY2tlciwgc3RhdGUsICZ3LT5jbG9zdXJlKSkgewotICAgICAgYy0+Y29ubmVjdGluZyA9IDE7Ci0gICAgICAvKiByZWxlYXNlZCBieSBjb25uZWN0aW9uICovCi0gICAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYoYywgImNvbm5lY3RpbmciKTsKLSAgICAgIHN0YXJ0X2Nvbm5lY3QoZXhlY19jdHgsIGMpOwotICAgIH0KLSAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3Byb2Nlc3NfdHJhbnNwb3J0X29wKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb24sCi0gICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKSB7Ci0gIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjayA9IENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGNvbik7Ci0gIGdycGNfY2hhbm5lbF9lbGVtZW50ICp0b3BfZWxlbSA9IGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KGNoYW5uZWxfc3RhY2ssIDApOwotICB0b3BfZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfb3AoZXhlY19jdHgsIHRvcF9lbGVtLCBvcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1YmNoYW5uZWxfb25fY2hpbGRfc3RhdGVfY2hhbmdlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKLSAgc3RhdGVfd2F0Y2hlciAqc3cgPSBwOwotICBncnBjX3N1YmNoYW5uZWwgKmMgPSBzdy0+c3ViY2hhbm5lbDsKLSAgZ3ByX211ICptdSA9ICZjLT5tdTsKLQotICBncHJfbXVfbG9jayhtdSk7Ci0KLSAgLyogaWYgd2UgZmFpbGVkIGp1c3QgbGVhdmUgdGhpcyBjbG9zdXJlICovCi0gIGlmIChpb21ncl9zdWNjZXNzKSB7Ci0gICAgaWYgKHN3LT5jb25uZWN0aXZpdHlfc3RhdGUgPT0gR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFKSB7Ci0gICAgICAvKiBhbnkgZXJyb3JzIG9uIGEgc3ViY2hhbm5lbCA9PT4gd2UncmUgZG9uZSwgY3JlYXRlIGEgbmV3IG9uZSAqLwotICAgICAgc3ctPmNvbm5lY3Rpdml0eV9zdGF0ZSA9IEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFOwotICAgIH0KLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZjLT5zdGF0ZV90cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdy0+Y29ubmVjdGl2aXR5X3N0YXRlLCAicmVmbGVjdF9jaGlsZCIpOwotICAgIGlmIChzdy0+Y29ubmVjdGl2aXR5X3N0YXRlICE9IEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFKSB7Ci0gICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCi0gICAgICAgICAgZXhlY19jdHgsIEdFVF9DT05ORUNURURfU1VCQ0hBTk5FTChjLCBub19iYXJyaWVyKSwgTlVMTCwKLSAgICAgICAgICAmc3ctPmNvbm5lY3Rpdml0eV9zdGF0ZSwgJnN3LT5jbG9zdXJlKTsKLSAgICAgIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1JFRihjLCAic3RhdGVfd2F0Y2hlciIpOwotICAgICAgc3cgPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIGdwcl9tdV91bmxvY2sobXUpOwotICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgYywgInN0YXRlX3dhdGNoZXIiKTsKLSAgZ3ByX2ZyZWUoc3cpOwotfQotCi1zdGF0aWMgdm9pZCBjb25uZWN0ZWRfc3ViY2hhbm5lbF9zdGF0ZV9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgewotICBncnBjX3RyYW5zcG9ydF9vcCBvcDsKLSAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW07Ci0gIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOwotICBvcC5jb25uZWN0aXZpdHlfc3RhdGUgPSBzdGF0ZTsKLSAgb3Aub25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSA9IGNsb3N1cmU7Ci0gIG9wLmJpbmRfcG9sbHNldF9zZXQgPSBpbnRlcmVzdGVkX3BhcnRpZXM7Ci0gIGVsZW0gPSBncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudChDSEFOTkVMX1NUQUNLX0ZST01fQ09OTkVDVElPTihjb24pLCAwKTsKLSAgZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfb3AoZXhlY19jdHgsIGVsZW0sICZvcCk7Ci19Ci0KLXZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb24sCi0gICAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzLCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqc3RhdGUsCi0gICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIGNvbm5lY3RlZF9zdWJjaGFubmVsX3N0YXRlX29wKGV4ZWNfY3R4LCBjb24sIGludGVyZXN0ZWRfcGFydGllcywgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUpOwotfQotCi12b2lkIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfcGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgewotICBncnBjX3RyYW5zcG9ydF9vcCBvcDsKLSAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW07Ci0gIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOwotICBvcC5zZW5kX3BpbmcgPSBjbG9zdXJlOwotICBlbGVtID0gZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoQ0hBTk5FTF9TVEFDS19GUk9NX0NPTk5FQ1RJT04oY29uKSwgMCk7Ci0gIGVsZW0tPmZpbHRlci0+c3RhcnRfdHJhbnNwb3J0X29wKGV4ZWNfY3R4LCBlbGVtLCAmb3ApOwotfQotCi1zdGF0aWMgdm9pZCBwdWJsaXNoX3RyYW5zcG9ydF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsICpjKSB7Ci0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbjsKLSAgZ3JwY19jaGFubmVsX3N0YWNrICpzdGs7Ci0gIHN0YXRlX3dhdGNoZXIgKnN3X3N1YmNoYW5uZWw7Ci0KLSAgLyogY29uc3RydWN0IGNoYW5uZWwgc3RhY2sgKi8KLSAgY29uID0gZ3JwY19jaGFubmVsX2luaXRfY3JlYXRlX3N0YWNrKAotICAgICAgZXhlY19jdHgsIEdSUENfQ0xJRU5UX1NVQkNIQU5ORUwsIDAsIGMtPmNvbm5lY3RpbmdfcmVzdWx0LmNoYW5uZWxfYXJncywgMSwKLSAgICAgIGNvbm5lY3Rpb25fZGVzdHJveSwgTlVMTCwgYy0+Y29ubmVjdGluZ19yZXN1bHQudHJhbnNwb3J0KTsKLSAgc3RrID0gQ0hBTk5FTF9TVEFDS19GUk9NX0NPTk5FQ1RJT04oY29uKTsKLSAgbWVtc2V0KCZjLT5jb25uZWN0aW5nX3Jlc3VsdCwgMCwgc2l6ZW9mKGMtPmNvbm5lY3RpbmdfcmVzdWx0KSk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB3YXRjaGVyICovCi0gIHN3X3N1YmNoYW5uZWwgPSBncHJfbWFsbG9jKHNpemVvZigqc3dfc3ViY2hhbm5lbCkpOwotICBzd19zdWJjaGFubmVsLT5zdWJjaGFubmVsID0gYzsKLSAgc3dfc3ViY2hhbm5lbC0+Y29ubmVjdGl2aXR5X3N0YXRlID0gR1JQQ19DSEFOTkVMX1JFQURZOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmc3dfc3ViY2hhbm5lbC0+Y2xvc3VyZSwgc3ViY2hhbm5lbF9vbl9jaGlsZF9zdGF0ZV9jaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICBzd19zdWJjaGFubmVsKTsKLQotICBpZiAoYy0+ZGlzY29ubmVjdGVkKSB7Ci0gICAgZ3ByX2ZyZWUoc3dfc3ViY2hhbm5lbCk7Ci0gICAgZ3JwY19jaGFubmVsX3N0YWNrX2Rlc3Ryb3koZXhlY19jdHgsIHN0ayk7Ci0gICAgZ3ByX2ZyZWUoY29uKTsKLSAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgYywgImNvbm5lY3RpbmciKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBwdWJsaXNoICovCi0gIC8qIFRPRE8oY3RpbGxlcik6IHRoaXMgZnVsbCBiYXJyaWVyIHNlZW1zIHRvIGNsZWFyIHVwIGEgVFNBTiBmYWlsdXJlLgotICAgICAgICAgICAgICAgICAgICBJJ2QgaGF2ZSBleHBlY3RlZCB0aGUgcmVsX2NhcyBiZWxvdyB0byBiZSBlbm91Z2gsIGJ1dAotICAgICAgICAgICAgICAgICAgICBzZWVtaW5nbHkgaXQncyBub3QuCi0gICAgICAgICAgICAgICAgICAgIFJlLWV2YWx1YXRlIGlmIHdlIHJlYWxseSBuZWVkIHRoaXMuICovCi0gIGdwcl9hdG1fZnVsbF9iYXJyaWVyKCk7Ci0gIEdQUl9BU1NFUlQoZ3ByX2F0bV9yZWxfY2FzKCZjLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgMCwgKGdwcl9hdG0pY29uKSk7Ci0gIGMtPmNvbm5lY3RpbmcgPSAwOwotCi0gIC8qIHNldHVwIHN1YmNoYW5uZWwgd2F0Y2hpbmcgY29ubmVjdGVkIHN1YmNoYW5uZWwgZm9yIGNoYW5nZXM7IHN1YmNoYW5uZWwgcmVmCi0gICAgIGZvciBjb25uZWN0aW5nIGlzIGRvbmF0ZWQKLSAgICAgdG8gdGhlIHN0YXRlIHdhdGNoZXIgKi8KLSAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfUkVGKGMsICJzdGF0ZV93YXRjaGVyIik7Ci0gIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGV4ZWNfY3R4LCBjLCAiY29ubmVjdGluZyIpOwotICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCi0gICAgICBleGVjX2N0eCwgY29uLCBjLT5wb2xsc2V0X3NldCwgJnN3X3N1YmNoYW5uZWwtPmNvbm5lY3Rpdml0eV9zdGF0ZSwKLSAgICAgICZzd19zdWJjaGFubmVsLT5jbG9zdXJlKTsKLQotICAvKiBzaWduYWwgY29tcGxldGlvbiAqLwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZjLT5zdGF0ZV90cmFja2VyLCBHUlBDX0NIQU5ORUxfUkVBRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGVkIik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2FsYXJtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgaW9tZ3Jfc3VjY2VzcykgewotICBncnBjX3N1YmNoYW5uZWwgKmMgPSBhcmc7Ci0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIGMtPmhhdmVfYWxhcm0gPSAwOwotICBpZiAoYy0+ZGlzY29ubmVjdGVkKSB7Ci0gICAgaW9tZ3Jfc3VjY2VzcyA9IDA7Ci0gIH0KLSAgaWYgKGlvbWdyX3N1Y2Nlc3MpIHsKLSAgICBjLT5uZXh0X2F0dGVtcHQgPQotICAgICAgICBncHJfYmFja29mZl9zdGVwKCZjLT5iYWNrb2ZmX3N0YXRlLCBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLSAgICBjb250aW51ZV9jb25uZWN0KGV4ZWNfY3R4LCBjKTsKLSAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX211X3VubG9jaygmYy0+bXUpOwotICAgIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGV4ZWNfY3R4LCBjLCAiY29ubmVjdGluZyIpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHN1YmNoYW5uZWxfY29ubmVjdGVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKLSAgZ3JwY19zdWJjaGFubmVsICpjID0gYXJnOwotCi0gIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1JFRihjLCAiY29ubmVjdGVkIik7Ci0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIGlmIChjLT5jb25uZWN0aW5nX3Jlc3VsdC50cmFuc3BvcnQgIT0gTlVMTCkgewotICAgIHB1Ymxpc2hfdHJhbnNwb3J0X2xvY2tlZChleGVjX2N0eCwgYyk7Ci0gIH0gZWxzZSBpZiAoYy0+ZGlzY29ubmVjdGVkKSB7Ci0gICAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfVU5SRUYoZXhlY19jdHgsIGMsICJjb25uZWN0aW5nIik7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX3RpbWVzcGVjIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQyk7Ci0gICAgR1BSX0FTU0VSVCghYy0+aGF2ZV9hbGFybSk7Ci0gICAgYy0+aGF2ZV9hbGFybSA9IDE7Ci0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmYy0+c3RhdGVfdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdF9mYWlsZWQiKTsKLSAgICBncnBjX3RpbWVyX2luaXQoZXhlY19jdHgsICZjLT5hbGFybSwgYy0+bmV4dF9hdHRlbXB0LCBvbl9hbGFybSwgYywgbm93KTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGV4ZWNfY3R4LCBjLCAiY29ubmVjdGluZyIpOwotfQotCi0vKgotICogZ3JwY19zdWJjaGFubmVsX2NhbGwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1zdGF0aWMgdm9pZCBzdWJjaGFubmVsX2NhbGxfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqYyA9IGNhbGw7Ci0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19zdWJjaGFubmVsX2NhbGxfdW5yZWYuZGVzdHJveSIsIDApOwotICBncnBjX2NhbGxfc3RhY2tfZGVzdHJveShleGVjX2N0eCwgU1VCQ0hBTk5FTF9DQUxMX1RPX0NBTExfU1RBQ0soYykpOwotICBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1VOUkVGKGV4ZWNfY3R4LCBjLT5jb25uZWN0aW9uLCAic3ViY2hhbm5lbF9jYWxsIik7Ci0gIGdwcl9mcmVlKGMpOwotICBHUFJfVElNRVJfRU5EKCJncnBjX3N1YmNoYW5uZWxfY2FsbF91bnJlZi5kZXN0cm95IiwgMCk7Ci19Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfcmVmKAotICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpjIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgewotICBHUlBDX0NBTExfU1RBQ0tfUkVGKFNVQkNIQU5ORUxfQ0FMTF9UT19DQUxMX1NUQUNLKGMpLCBSRUZfUkVBU09OKTsKLX0KLQotdm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgewotICBHUlBDX0NBTExfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIFNVQkNIQU5ORUxfQ0FMTF9UT19DQUxMX1NUQUNLKGMpLCBSRUZfUkVBU09OKTsKLX0KLQotY2hhciAqZ3JwY19zdWJjaGFubmVsX2NhbGxfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqY2FsbCkgewotICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2sgPSBTVUJDSEFOTkVMX0NBTExfVE9fQ0FMTF9TVEFDSyhjYWxsKTsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKnRvcF9lbGVtID0gZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoY2FsbF9zdGFjaywgMCk7Ci0gIHJldHVybiB0b3BfZWxlbS0+ZmlsdGVyLT5nZXRfcGVlcihleGVjX2N0eCwgdG9wX2VsZW0pOwotfQotCi12b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX3Byb2Nlc3Nfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgewotICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2sgPSBTVUJDSEFOTkVMX0NBTExfVE9fQ0FMTF9TVEFDSyhjYWxsKTsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKnRvcF9lbGVtID0gZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoY2FsbF9zdGFjaywgMCk7Ci0gIHRvcF9lbGVtLT5maWx0ZXItPnN0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AoZXhlY19jdHgsIHRvcF9lbGVtLCBvcCk7Ci19Ci0KLWdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9nZXRfY29ubmVjdGVkX3N1YmNoYW5uZWwoCi0gICAgZ3JwY19zdWJjaGFubmVsICpjKSB7Ci0gIHJldHVybiBHRVRfQ09OTkVDVEVEX1NVQkNIQU5ORUwoYywgYWNxKTsKLX0KLQotZ3JwY19zdWJjaGFubmVsX2NhbGwgKmdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfY3JlYXRlX2NhbGwoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbiwKLSAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKLSAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFuc3RrID0gQ0hBTk5FTF9TVEFDS19GUk9NX0NPTk5FQ1RJT04oY29uKTsKLSAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGwgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zdWJjaGFubmVsX2NhbGwpICsgY2hhbnN0ay0+Y2FsbF9zdGFja19zaXplKTsKLSAgZ3JwY19jYWxsX3N0YWNrICpjYWxsc3RrID0gU1VCQ0hBTk5FTF9DQUxMX1RPX0NBTExfU1RBQ0soY2FsbCk7Ci0gIGNhbGwtPmNvbm5lY3Rpb24gPSBjb247Ci0gIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfUkVGKGNvbiwgInN1YmNoYW5uZWxfY2FsbCIpOwotICBncnBjX2NhbGxfc3RhY2tfaW5pdChleGVjX2N0eCwgY2hhbnN0aywgMSwgc3ViY2hhbm5lbF9jYWxsX2Rlc3Ryb3ksIGNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIGNhbGxzdGspOwotICBncnBjX2NhbGxfc3RhY2tfc2V0X3BvbGxzZXQoZXhlY19jdHgsIGNhbGxzdGssIHBvbGxzZXQpOwotICByZXR1cm4gY2FsbDsKLX0KLQotZ3JwY19jYWxsX3N0YWNrICpncnBjX3N1YmNoYW5uZWxfY2FsbF9nZXRfY2FsbF9zdGFjaygKLSAgICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqc3ViY2hhbm5lbF9jYWxsKSB7Ci0gIHJldHVybiBTVUJDSEFOTkVMX0NBTExfVE9fQ0FMTF9TVEFDSyhzdWJjaGFubmVsX2NhbGwpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMWM1OC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1NVQkNIQU5ORUxfSAotI2RlZmluZSBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19TVUJDSEFOTkVMX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgotCi0vKiogQSAoc3ViLSljaGFubmVsIHRoYXQga25vd3MgaG93IHRvIGNvbm5lY3QgdG8gZXhhY3RseSBvbmUgdGFyZ2V0Ci0gICAgYWRkcmVzcy4gUHJvdmlkZXMgYSB0YXJnZXQgZm9yIGxvYWQgYmFsYW5jaW5nLiAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19zdWJjaGFubmVsIGdycGNfc3ViY2hhbm5lbDsKLXR5cGVkZWYgc3RydWN0IGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbDsKLXR5cGVkZWYgc3RydWN0IGdycGNfc3ViY2hhbm5lbF9jYWxsIGdycGNfc3ViY2hhbm5lbF9jYWxsOwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2FyZ3MgZ3JwY19zdWJjaGFubmVsX2FyZ3M7Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfUkVGKHAsIHIpIFwKLSAgZ3JwY19zdWJjaGFubmVsX3JlZigocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQotI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfUkVGX0ZST01fV0VBS19SRUYocCwgcikgXAotICBncnBjX3N1YmNoYW5uZWxfcmVmX2Zyb21fd2Vha19yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1VOUkVGKGNsLCBwLCByKSBcCi0gIGdycGNfc3ViY2hhbm5lbF91bnJlZigoY2wpLCAocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQotI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYocCwgcikgXAotICBncnBjX3N1YmNoYW5uZWxfd2Vha19yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1dFQUtfVU5SRUYoY2wsIHAsIHIpIFwKLSAgZ3JwY19zdWJjaGFubmVsX3dlYWtfdW5yZWYoKGNsKSwgKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLSNkZWZpbmUgR1JQQ19DT05ORUNURURfU1VCQ0hBTk5FTF9SRUYocCwgcikgXAotICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3JlZigocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQotI2RlZmluZSBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1VOUkVGKGNsLCBwLCByKSBcCi0gIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfdW5yZWYoKGNsKSwgKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX0NBTExfUkVGKHAsIHIpIFwKLSAgZ3JwY19zdWJjaGFubmVsX2NhbGxfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi0jZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9DQUxMX1VOUkVGKGNsLCBwLCByKSBcCi0gIGdycGNfc3ViY2hhbm5lbF9jYWxsX3VucmVmKChjbCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi0jZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyBcCi0gICwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnJlYXNvbgotI2Vsc2UKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1JFRihwLCByKSBncnBjX3N1YmNoYW5uZWxfcmVmKChwKSkKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1JFRl9GUk9NX1dFQUtfUkVGKHAsIHIpIFwKLSAgZ3JwY19zdWJjaGFubmVsX3JlZl9mcm9tX3dlYWtfcmVmKChwKSkKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1VOUkVGKGNsLCBwLCByKSBncnBjX3N1YmNoYW5uZWxfdW5yZWYoKGNsKSwgKHApKQotI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYocCwgcikgZ3JwY19zdWJjaGFubmVsX3dlYWtfcmVmKChwKSkKLSNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1dFQUtfVU5SRUYoY2wsIHAsIHIpIFwKLSAgZ3JwY19zdWJjaGFubmVsX3dlYWtfdW5yZWYoKGNsKSwgKHApKQotI2RlZmluZSBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1JFRihwLCByKSBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3JlZigocCkpCi0jZGVmaW5lIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfVU5SRUYoY2wsIHAsIHIpIFwKLSAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF91bnJlZigoY2wpLCAocCkpCi0jZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9DQUxMX1JFRihwLCByKSBncnBjX3N1YmNoYW5uZWxfY2FsbF9yZWYoKHApKQotI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9VTlJFRihjbCwgcCwgcikgXAotICBncnBjX3N1YmNoYW5uZWxfY2FsbF91bnJlZigoY2wpLCAocCkpCi0jZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUwotI2VuZGlmCi0KLWdycGNfc3ViY2hhbm5lbCAqZ3JwY19zdWJjaGFubmVsX3JlZigKLSAgICBncnBjX3N1YmNoYW5uZWwgKmNoYW5uZWwgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKTsKLWdycGNfc3ViY2hhbm5lbCAqZ3JwY19zdWJjaGFubmVsX3JlZl9mcm9tX3dlYWtfcmVmKAotICAgIGdycGNfc3ViY2hhbm5lbCAqY2hhbm5lbCBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpOwotdm9pZCBncnBjX3N1YmNoYW5uZWxfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpOwotZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfd2Vha19yZWYoCi0gICAgZ3JwY19zdWJjaGFubmVsICpjaGFubmVsIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7Ci12b2lkIGdycGNfc3ViY2hhbm5lbF93ZWFrX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7Ci12b2lkIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfcmVmKAotICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNoYW5uZWwgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKTsKLXZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7Ci12b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX3JlZigKLSAgICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqY2FsbCBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpOwotdm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7Ci0KLS8qKiBjb25zdHJ1Y3QgYSBzdWJjaGFubmVsIGNhbGwgKi8KLWdycGNfc3ViY2hhbm5lbF9jYWxsICpncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX2NyZWF0ZV9jYWxsKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb25uZWN0ZWRfc3ViY2hhbm5lbCwKLSAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpOwotCi0vKiogcHJvY2VzcyBhIHRyYW5zcG9ydCBsZXZlbCBvcCAqLwotdm9pZCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3Byb2Nlc3NfdHJhbnNwb3J0X29wKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpzdWJjaGFubmVsLAotICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCk7Ci0KLS8qKiBwb2xsIHRoZSBjdXJyZW50IGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIGNoYW5uZWwgKi8KLWdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGdycGNfc3ViY2hhbm5lbF9jaGVja19jb25uZWN0aXZpdHkoCi0gICAgZ3JwY19zdWJjaGFubmVsICpjaGFubmVsKTsKLQotLyoqIGNhbGwgbm90aWZ5IHdoZW4gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIGNoYW5uZWwgY2hhbmdlcyBmcm9tICpzdGF0ZS4KLSAgICBVcGRhdGVzICpzdGF0ZSB3aXRoIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGNoYW5uZWwgKi8KLXZvaWQgZ3JwY19zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbCAqY2hhbm5lbCwKLSAgICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXMsIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpzdGF0ZSwKLSAgICBncnBjX2Nsb3N1cmUgKm5vdGlmeSk7Ci12b2lkIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqY2hhbm5lbCwKLSAgICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXMsIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpzdGF0ZSwKLSAgICBncnBjX2Nsb3N1cmUgKm5vdGlmeSk7Ci12b2lkIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfcGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm5vdGlmeSk7Ci0KLS8qKiByZXRyaWV2ZSB0aGUgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAtIG9yIE5VTEwgaWYgY2FsbGVkIGJlZm9yZQotICAgIHRoZSBzdWJjaGFubmVsIGJlY29tZXMgY29ubmVjdGVkICovCi1ncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfZ2V0X2Nvbm5lY3RlZF9zdWJjaGFubmVsKAotICAgIGdycGNfc3ViY2hhbm5lbCAqc3ViY2hhbm5lbCk7Ci0KLS8qKiBjb250aW51ZSBwcm9jZXNzaW5nIGEgdHJhbnNwb3J0IG9wICovCi12b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX3Byb2Nlc3Nfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKnN1YmNoYW5uZWxfY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKLQotLyoqIGNvbnRpbnVlIHF1ZXJ5aW5nIGZvciBwZWVyICovCi1jaGFyICpncnBjX3N1YmNoYW5uZWxfY2FsbF9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpzdWJjaGFubmVsX2NhbGwpOwotCi1ncnBjX2NhbGxfc3RhY2sgKmdycGNfc3ViY2hhbm5lbF9jYWxsX2dldF9jYWxsX3N0YWNrKAotICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpzdWJjaGFubmVsX2NhbGwpOwotCi1zdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2FyZ3MgewotICAvKiBXaGVuIHVwZGF0aW5nIHRoaXMgc3RydWN0LCBhbHNvIHVwZGF0ZSBzdWJjaGFubmVsX2luZGV4LmMgKi8KLQotICAvKiogQ2hhbm5lbCBmaWx0ZXJzIGZvciB0aGlzIGNoYW5uZWwgLSB3cmFwcGVkIGZhY3RvcmllcyB3aWxsIGxpa2VseQotICAgICAgd2FudCB0byBtdXRhdGUgdGhpcyAqLwotICBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICoqZmlsdGVyczsKLSAgLyoqIFRoZSBudW1iZXIgb2YgZmlsdGVycyBpbiB0aGUgYWJvdmUgYXJyYXkgKi8KLSAgc2l6ZV90IGZpbHRlcl9jb3VudDsKLSAgLyoqIENoYW5uZWwgYXJndW1lbnRzIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIGNoYW5uZWwgKi8KLSAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3M7Ci0gIC8qKiBBZGRyZXNzIHRvIGNvbm5lY3QgdG8gKi8KLSAgc3RydWN0IHNvY2thZGRyICphZGRyOwotICBzaXplX3QgYWRkcl9sZW47Ci19OwotCi0vKiogY3JlYXRlIGEgc3ViY2hhbm5lbCBnaXZlbiBhIGNvbm5lY3RvciAqLwotZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfY3JlYXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2NDIxOS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIgotCi12b2lkIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3JlZihncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSogZmFjdG9yeSkgewotICBmYWN0b3J5LT52dGFibGUtPnJlZihmYWN0b3J5KTsKLX0KLQotdm9pZCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV91bnJlZihncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkqIGZhY3RvcnkpIHsKLSAgZmFjdG9yeS0+dnRhYmxlLT51bnJlZihleGVjX2N0eCwgZmFjdG9yeSk7Ci19Ci0KLWdycGNfc3ViY2hhbm5lbCogZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfY3JlYXRlX3N1YmNoYW5uZWwoCi0gICAgZ3JwY19leGVjX2N0eCogZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5KiBmYWN0b3J5LAotICAgIGdycGNfc3ViY2hhbm5lbF9hcmdzKiBhcmdzKSB7Ci0gIHJldHVybiBmYWN0b3J5LT52dGFibGUtPmNyZWF0ZV9zdWJjaGFubmVsKGV4ZWNfY3R4LCBmYWN0b3J5LCBhcmdzKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmggYi9zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjM4ZjM3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1NVQkNIQU5ORUxfRkFDVE9SWV9ICi0jZGVmaW5lIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1NVQkNIQU5ORUxfRkFDVE9SWV9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgZ3JwY19zdWJjaGFubmVsX2ZhY3Rvcnk7Ci10eXBlZGVmIHN0cnVjdCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV92dGFibGUgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlOwotCi0vKiogQ29uc3RydWN0b3IgZm9yIG5ldyBjb25maWd1cmVkIGNoYW5uZWxzLgotICAgIENyZWF0aW5nIGRlY29yYXRvcnMgYXJvdW5kIHRoaXMgdHlwZSBpcyBlbmNvdXJhZ2VkIHRvIGFkYXB0IGJlaGF2aW9yLiAqLwotc3RydWN0IGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5IHsKLSAgY29uc3QgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlICp2dGFibGU7Ci19OwotCi1zdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlIHsKLSAgdm9pZCAoKnJlZikoZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKmZhY3RvcnkpOwotICB2b2lkICgqdW5yZWYpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqZmFjdG9yeSk7Ci0gIGdycGNfc3ViY2hhbm5lbCAqKCpjcmVhdGVfc3ViY2hhbm5lbCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpOwotfTsKLQotdm9pZCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9yZWYoZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKmZhY3RvcnkpOwotdm9pZCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKmZhY3RvcnkpOwotCi0vKiogQ3JlYXRlIGEgbmV3IGdycGNfc3ViY2hhbm5lbCAqLwotZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbCgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKmZhY3RvcnksCi0gICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Y2M3NmMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLy8KLS8vCi0vLyBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIgotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2F2bC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90bHMuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCi0KLS8vIGEgbWFwIG9mIHN1YmNoYW5uZWxfa2V5IC0tPiBzdWJjaGFubmVsLCB1c2VkIGZvciBkZXRlY3RpbmcgY29ubmVjdGlvbnMKLS8vIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIGluIG9yZGVyIHRvIHNoYXJlIHRoZW0KLXN0YXRpYyBncHJfYXZsIGdfc3ViY2hhbm5lbF9pbmRleDsKLQotc3RhdGljIGdwcl9tdSBnX211OwotCi1zdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2tleSB7Ci0gIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3I7Ci0gIGdycGNfc3ViY2hhbm5lbF9hcmdzIGFyZ3M7Ci19OwotCi1HUFJfVExTX0RFQ0woc3ViY2hhbm5lbF9pbmRleF9leGVjX2N0eCk7Ci0KLXN0YXRpYyB2b2lkIGVudGVyX2N0eChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkgewotICBHUFJfQVNTRVJUKGdwcl90bHNfZ2V0KCZzdWJjaGFubmVsX2luZGV4X2V4ZWNfY3R4KSA9PSAwKTsKLSAgZ3ByX3Rsc19zZXQoJnN1YmNoYW5uZWxfaW5kZXhfZXhlY19jdHgsIChpbnRwdHJfdClleGVjX2N0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxlYXZlX2N0eChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkgewotICBHUFJfQVNTRVJUKGdwcl90bHNfZ2V0KCZzdWJjaGFubmVsX2luZGV4X2V4ZWNfY3R4KSA9PSAoaW50cHRyX3QpZXhlY19jdHgpOwotICBncHJfdGxzX3NldCgmc3ViY2hhbm5lbF9pbmRleF9leGVjX2N0eCwgMCk7Ci19Ci0KLXN0YXRpYyBncnBjX2V4ZWNfY3R4ICpjdXJyZW50X2N0eCgpIHsKLSAgZ3JwY19leGVjX2N0eCAqYyA9IChncnBjX2V4ZWNfY3R4ICopZ3ByX3Rsc19nZXQoJnN1YmNoYW5uZWxfaW5kZXhfZXhlY19jdHgpOwotICBHUFJfQVNTRVJUKGMgIT0gTlVMTCk7Ci0gIHJldHVybiBjOwotfQotCi1zdGF0aWMgZ3JwY19zdWJjaGFubmVsX2tleSAqY3JlYXRlX2tleSgKLSAgICBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncywKLSAgICBncnBjX2NoYW5uZWxfYXJncyAqKCpjb3B5X2NoYW5uZWxfYXJncykoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpKSB7Ci0gIGdycGNfc3ViY2hhbm5lbF9rZXkgKmsgPSBncHJfbWFsbG9jKHNpemVvZigqaykpOwotICBrLT5jb25uZWN0b3IgPSBncnBjX2Nvbm5lY3Rvcl9yZWYoY29ubmVjdG9yKTsKLSAgay0+YXJncy5maWx0ZXJfY291bnQgPSBhcmdzLT5maWx0ZXJfY291bnQ7Ci0gIGstPmFyZ3MuZmlsdGVycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCprLT5hcmdzLmZpbHRlcnMpICogay0+YXJncy5maWx0ZXJfY291bnQpOwotICBtZW1jcHkoKGdycGNfY2hhbm5lbF9maWx0ZXIgKilrLT5hcmdzLmZpbHRlcnMsIGFyZ3MtPmZpbHRlcnMsCi0gICAgICAgICBzaXplb2YoKmstPmFyZ3MuZmlsdGVycykgKiBrLT5hcmdzLmZpbHRlcl9jb3VudCk7Ci0gIGstPmFyZ3MuYWRkcl9sZW4gPSBhcmdzLT5hZGRyX2xlbjsKLSAgay0+YXJncy5hZGRyID0gZ3ByX21hbGxvYyhhcmdzLT5hZGRyX2xlbik7Ci0gIG1lbWNweShrLT5hcmdzLmFkZHIsIGFyZ3MtPmFkZHIsIGstPmFyZ3MuYWRkcl9sZW4pOwotICBrLT5hcmdzLmFyZ3MgPSBjb3B5X2NoYW5uZWxfYXJncyhhcmdzLT5hcmdzKTsKLSAgcmV0dXJuIGs7Ci19Ci0KLWdycGNfc3ViY2hhbm5lbF9rZXkgKmdycGNfc3ViY2hhbm5lbF9rZXlfY3JlYXRlKGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncykgewotICByZXR1cm4gY3JlYXRlX2tleShjb25uZWN0b3IsIGFyZ3MsIGdycGNfY2hhbm5lbF9hcmdzX25vcm1hbGl6ZSk7Ci19Ci0KLXN0YXRpYyBncnBjX3N1YmNoYW5uZWxfa2V5ICpzdWJjaGFubmVsX2tleV9jb3B5KGdycGNfc3ViY2hhbm5lbF9rZXkgKmspIHsKLSAgcmV0dXJuIGNyZWF0ZV9rZXkoay0+Y29ubmVjdG9yLCAmay0+YXJncywgZ3JwY19jaGFubmVsX2FyZ3NfY29weSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3ViY2hhbm5lbF9rZXlfY29tcGFyZShncnBjX3N1YmNoYW5uZWxfa2V5ICphLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmIpIHsKLSAgaW50IGMgPSBHUFJfSUNNUChhLT5jb25uZWN0b3IsIGItPmNvbm5lY3Rvcik7Ci0gIGlmIChjICE9IDApIHJldHVybiBjOwotICBjID0gR1BSX0lDTVAoYS0+YXJncy5hZGRyX2xlbiwgYi0+YXJncy5hZGRyX2xlbik7Ci0gIGlmIChjICE9IDApIHJldHVybiBjOwotICBjID0gR1BSX0lDTVAoYS0+YXJncy5maWx0ZXJfY291bnQsIGItPmFyZ3MuZmlsdGVyX2NvdW50KTsKLSAgaWYgKGMgIT0gMCkgcmV0dXJuIGM7Ci0gIGMgPSBtZW1jbXAoYS0+YXJncy5hZGRyLCBiLT5hcmdzLmFkZHIsIGEtPmFyZ3MuYWRkcl9sZW4pOwotICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKLSAgYyA9IG1lbWNtcChhLT5hcmdzLmZpbHRlcnMsIGItPmFyZ3MuZmlsdGVycywKLSAgICAgICAgICAgICBhLT5hcmdzLmZpbHRlcl9jb3VudCAqIHNpemVvZigqYS0+YXJncy5maWx0ZXJzKSk7Ci0gIGlmIChjICE9IDApIHJldHVybiBjOwotICByZXR1cm4gZ3JwY19jaGFubmVsX2FyZ3NfY29tcGFyZShhLT5hcmdzLmFyZ3MsIGItPmFyZ3MuYXJncyk7Ci19Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2tleV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2tleSAqaykgewotICBncnBjX2Nvbm5lY3Rvcl91bnJlZihleGVjX2N0eCwgay0+Y29ubmVjdG9yKTsKLSAgZ3ByX2ZyZWUoay0+YXJncy5hZGRyKTsKLSAgZ3ByX2ZyZWUoKGdycGNfY2hhbm5lbF9hcmdzICopay0+YXJncy5maWx0ZXJzKTsKLSAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveSgoZ3JwY19jaGFubmVsX2FyZ3MgKilrLT5hcmdzLmFyZ3MpOwotICBncHJfZnJlZShrKTsKLX0KLQotc3RhdGljIHZvaWQgc2NrX2F2bF9kZXN0cm95KHZvaWQgKnApIHsKLSAgZ3JwY19zdWJjaGFubmVsX2tleV9kZXN0cm95KGN1cnJlbnRfY3R4KCksIHApOwotfQotCi1zdGF0aWMgdm9pZCAqc2NrX2F2bF9jb3B5KHZvaWQgKnApIHsgcmV0dXJuIHN1YmNoYW5uZWxfa2V5X2NvcHkocCk7IH0KLQotc3RhdGljIGxvbmcgc2NrX2F2bF9jb21wYXJlKHZvaWQgKmEsIHZvaWQgKmIpIHsKLSAgcmV0dXJuIHN1YmNoYW5uZWxfa2V5X2NvbXBhcmUoYSwgYik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjdl9hdmxfZGVzdHJveSh2b2lkICpwKSB7Ci0gIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGN1cnJlbnRfY3R4KCksIHAsICJzdWJjaGFubmVsX2luZGV4Iik7Ci19Ci0KLXN0YXRpYyB2b2lkICpzY3ZfYXZsX2NvcHkodm9pZCAqcCkgewotICBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYocCwgInN1YmNoYW5uZWxfaW5kZXgiKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBjb25zdCBncHJfYXZsX3Z0YWJsZSBzdWJjaGFubmVsX2F2bF92dGFibGUgPSB7Ci0gICAgLmRlc3Ryb3lfa2V5ID0gc2NrX2F2bF9kZXN0cm95LAotICAgIC5jb3B5X2tleSA9IHNja19hdmxfY29weSwKLSAgICAuY29tcGFyZV9rZXlzID0gc2NrX2F2bF9jb21wYXJlLAotICAgIC5kZXN0cm95X3ZhbHVlID0gc2N2X2F2bF9kZXN0cm95LAotICAgIC5jb3B5X3ZhbHVlID0gc2N2X2F2bF9jb3B5fTsKLQotdm9pZCBncnBjX3N1YmNoYW5uZWxfaW5kZXhfaW5pdCh2b2lkKSB7Ci0gIGdfc3ViY2hhbm5lbF9pbmRleCA9IGdwcl9hdmxfY3JlYXRlKCZzdWJjaGFubmVsX2F2bF92dGFibGUpOwotICBncHJfbXVfaW5pdCgmZ19tdSk7Ci0gIGdwcl90bHNfaW5pdCgmc3ViY2hhbm5lbF9pbmRleF9leGVjX2N0eCk7Ci19Ci0KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2luZGV4X3NodXRkb3duKHZvaWQpIHsKLSAgZ3ByX211X2Rlc3Ryb3koJmdfbXUpOwotICBncHJfYXZsX3VucmVmKGdfc3ViY2hhbm5lbF9pbmRleCk7Ci0gIGdwcl90bHNfZGVzdHJveSgmc3ViY2hhbm5lbF9pbmRleF9leGVjX2N0eCk7Ci19Ci0KLWdycGNfc3ViY2hhbm5lbCAqZ3JwY19zdWJjaGFubmVsX2luZGV4X2ZpbmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmtleSkgewotICBlbnRlcl9jdHgoZXhlY19jdHgpOwotCi0gIC8vIExvY2ssIGFuZCB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBzdWJjaGFubmVsIGluZGV4LgotICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIHRoZSBzZWFyY2ggdW5kZXIgYSBsb2NrIGFzIGF2bCdzIGFyZSBpbW11dGFibGUuCi0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgZ3ByX2F2bCBpbmRleCA9IGdwcl9hdmxfcmVmKGdfc3ViY2hhbm5lbF9pbmRleCk7Ci0gIGdwcl9tdV91bmxvY2soJmdfbXUpOwotCi0gIGdycGNfc3ViY2hhbm5lbCAqYyA9Ci0gICAgICBHUlBDX1NVQkNIQU5ORUxfUkVGX0ZST01fV0VBS19SRUYoZ3ByX2F2bF9nZXQoaW5kZXgsIGtleSksICJpbmRleF9maW5kIik7Ci0gIGdwcl9hdmxfdW5yZWYoaW5kZXgpOwotCi0gIGxlYXZlX2N0eChleGVjX2N0eCk7Ci0gIHJldHVybiBjOwotfQotCi1ncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9pbmRleF9yZWdpc3RlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqY29uc3RydWN0ZWQpIHsKLSAgZW50ZXJfY3R4KGV4ZWNfY3R4KTsKLQotICBncnBjX3N1YmNoYW5uZWwgKmMgPSBOVUxMOwotCi0gIHdoaWxlIChjID09IE5VTEwpIHsKLSAgICAvLyBDb21wYXJlIGFuZCBzd2FwIGxvb3A6Ci0gICAgLy8gLSB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluZGV4Ci0gICAgZ3ByX211X2xvY2soJmdfbXUpOwotICAgIGdwcl9hdmwgaW5kZXggPSBncHJfYXZsX3JlZihnX3N1YmNoYW5uZWxfaW5kZXgpOwotICAgIGdwcl9tdV91bmxvY2soJmdfbXUpOwotCi0gICAgLy8gLSBDaGVjayB0byBzZWUgaWYgYSBzdWJjaGFubmVsIGFscmVhZHkgZXhpc3RzCi0gICAgYyA9IGdwcl9hdmxfZ2V0KGluZGV4LCBrZXkpOwotICAgIGlmIChjICE9IE5VTEwpIHsKLSAgICAgIC8vIHllcyAtPiB3ZSdyZSBkb25lCi0gICAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgY29uc3RydWN0ZWQsICJpbmRleF9yZWdpc3RlciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBubyAtPiB1cGRhdGUgdGhlIGF2bCBhbmQgY29tcGFyZS9zd2FwCi0gICAgICBncHJfYXZsIHVwZGF0ZWQgPQotICAgICAgICAgIGdwcl9hdmxfYWRkKGdwcl9hdmxfcmVmKGluZGV4KSwgc3ViY2hhbm5lbF9rZXlfY29weShrZXkpLAotICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1JFRihjb25zdHJ1Y3RlZCwgImluZGV4X3JlZ2lzdGVyIikpOwotCi0gICAgICAvLyBpdCBtYXkgaGFwcGVuIChidXQgaXQncyBleHBlY3RlZCB0byBiZSB1bmxpa2VseSkKLSAgICAgIC8vIHRoYXQgc29tZSBvdGhlciB0aHJlYWQgaGFzIGNoYW5nZWQgdGhlIGluZGV4OgotICAgICAgLy8gY29tcGFyZS9zd2FwIGhlcmUgdG8gY2hlY2sgdGhhdCwgYW5kIHJldHJ5IGFzIG5lY2Vzc2FyeQotICAgICAgZ3ByX211X2xvY2soJmdfbXUpOwotICAgICAgaWYgKGluZGV4LnJvb3QgPT0gZ19zdWJjaGFubmVsX2luZGV4LnJvb3QpIHsKLSAgICAgICAgR1BSX1NXQVAoZ3ByX2F2bCwgdXBkYXRlZCwgZ19zdWJjaGFubmVsX2luZGV4KTsKLSAgICAgICAgYyA9IGNvbnN0cnVjdGVkOwotICAgICAgfQotICAgICAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0KLSAgICAgIGdwcl9hdmxfdW5yZWYodXBkYXRlZCk7Ci0gICAgfQotICAgIGdwcl9hdmxfdW5yZWYoaW5kZXgpOwotICB9Ci0KLSAgbGVhdmVfY3R4KGV4ZWNfY3R4KTsKLQotICByZXR1cm4gYzsKLX0KLQotdm9pZCBncnBjX3N1YmNoYW5uZWxfaW5kZXhfdW5yZWdpc3RlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmNvbnN0cnVjdGVkKSB7Ci0gIGVudGVyX2N0eChleGVjX2N0eCk7Ci0KLSAgYm9vbCBkb25lID0gZmFsc2U7Ci0gIHdoaWxlICghZG9uZSkgewotICAgIC8vIENvbXBhcmUgYW5kIHN3YXAgbG9vcDoKLSAgICAvLyAtIHRha2UgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5kZXgKLSAgICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gICAgZ3ByX2F2bCBpbmRleCA9IGdwcl9hdmxfcmVmKGdfc3ViY2hhbm5lbF9pbmRleCk7Ci0gICAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBrZXkgc3RpbGwgcmVmZXJzIHRvIHRoZSBwcmV2aW91c2x5Ci0gICAgLy8gcmVnaXN0ZXJlZCBzdWJjaGFubmVsCi0gICAgZ3JwY19zdWJjaGFubmVsICpjID0gZ3ByX2F2bF9nZXQoaW5kZXgsIGtleSk7Ci0gICAgaWYgKGMgIT0gY29uc3RydWN0ZWQpIHsKLSAgICAgIGdwcl9hdmxfdW5yZWYoaW5kZXgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyZSBhbmQgc3dhcCB0aGUgdXBkYXRlIChzb21lIG90aGVyIHRocmVhZCBtYXkgaGF2ZQotICAgIC8vIG11dGF0ZWQgdGhlIGluZGV4IGJlaGluZCB1cykKLSAgICBncHJfYXZsIHVwZGF0ZWQgPSBncHJfYXZsX3JlbW92ZShncHJfYXZsX3JlZihpbmRleCksIGtleSk7Ci0KLSAgICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gICAgaWYgKGluZGV4LnJvb3QgPT0gZ19zdWJjaGFubmVsX2luZGV4LnJvb3QpIHsKLSAgICAgIEdQUl9TV0FQKGdwcl9hdmwsIHVwZGF0ZWQsIGdfc3ViY2hhbm5lbF9pbmRleCk7Ci0gICAgICBkb25lID0gdHJ1ZTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0KLSAgICBncHJfYXZsX3VucmVmKHVwZGF0ZWQpOwotICAgIGdwcl9hdmxfdW5yZWYoaW5kZXgpOwotICB9Ci0KLSAgbGVhdmVfY3R4KGV4ZWNfY3R4KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDVkMTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19TVUJDSEFOTkVMX0lOREVYX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9JTkRFWF9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIgotCi0vKiogXGZpbGUgUHJvdmlkZXMgYW4gaW5kZXggb2YgYWN0aXZlIHN1YmNoYW5uZWxzIHNvIHRoYXQgdGhleSBjYW4gYmUKLSAgICBzaGFyZWQgYW1vbmdzdCBjaGFubmVscyAqLwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3N1YmNoYW5uZWxfa2V5IGdycGNfc3ViY2hhbm5lbF9rZXk7Ci0KLS8qKiBDcmVhdGUgYSBrZXkgdGhhdCBjYW4gYmUgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIHN1YmNoYW5uZWwgKi8KLWdycGNfc3ViY2hhbm5lbF9rZXkgKmdycGNfc3ViY2hhbm5lbF9rZXlfY3JlYXRlKGdycGNfY29ubmVjdG9yICpjb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncyk7Ci0KLS8qKiBEZXN0cm95IGEgc3ViY2hhbm5lbCBrZXkgKi8KLXZvaWQgZ3JwY19zdWJjaGFubmVsX2tleV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5KTsKLQotLyoqIEdpdmVuIGEgc3ViY2hhbm5lbCBrZXksIGZpbmQgdGhlIHN1YmNoYW5uZWwgcmVnaXN0ZXJlZCBmb3IgaXQuCi0gICAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggY2hhbm5lbCBleGlzdHMuCi0gICAgVGhyZWFkLXNhZmUuICovCi1ncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9pbmRleF9maW5kKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfa2V5ICprZXkpOwotCi0vKiogUmVnaXN0ZXIgYSBzdWJjaGFubmVsIGFnYWluc3QgYSBrZXkuCi0gICAgVGFrZXMgb3duZXJzaGlwIG9mIFxhIGNvbnN0cnVjdGVkLgotICAgIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgc3ViY2hhbm5lbC4gVGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20KLSAgICBcYSBjb25zdHJ1Y3RlZCBpbiB0aGUgY2FzZSBvZiBhIHJlZ2lzdHJhdGlvbiByYWNlLiAqLwotZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfaW5kZXhfcmVnaXN0ZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfa2V5ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmNvbnN0cnVjdGVkKTsKLQotLyoqIFJlbW92ZSBcYSBjb25zdHJ1Y3RlZCBhcyB0aGUgcmVnaXN0ZXJlZCBzdWJjaGFubmVsIGZvciBcYSBrZXkuICovCi12b2lkIGdycGNfc3ViY2hhbm5lbF9pbmRleF91bnJlZ2lzdGVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfa2V5ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqY29uc3RydWN0ZWQpOwotCi0vKiogSW5pdGlhbGl6ZSB0aGUgc3ViY2hhbm5lbCBpbmRleCAoZ2xvYmFsKSAqLwotdm9pZCBncnBjX3N1YmNoYW5uZWxfaW5kZXhfaW5pdCh2b2lkKTsKLS8qKiBTaHV0ZG93biB0aGUgc3ViY2hhbm5lbCBpbmRleCAoZ2xvYmFsKSAqLwotdm9pZCBncnBjX3N1YmNoYW5uZWxfaW5kZXhfc2h1dGRvd24odm9pZCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19TVUJDSEFOTkVMX0lOREVYX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIGIvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGZmZmMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0KLS8qKiBhIHNpemVfdCBkZWZhdWx0IHZhbHVlLi4uIG1hcHMgdG8gYWxsIDEncyAqLwotI2RlZmluZSBOT1RfU0VUICh+KHNpemVfdCkwKQotCi1zdGF0aWMgZ3JwY191cmkgKmJhZF91cmkoY29uc3QgY2hhciAqdXJpX3RleHQsIHNpemVfdCBwb3MsIGNvbnN0IGNoYXIgKnNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cHByZXNzX2Vycm9ycykgewotICBjaGFyICpsaW5lX3ByZWZpeDsKLSAgc2l6ZV90IHBmeF9sZW47Ci0KLSAgaWYgKCFzdXBwcmVzc19lcnJvcnMpIHsKLSAgICBncHJfYXNwcmludGYoJmxpbmVfcHJlZml4LCAiYmFkIHVyaS4lczogJyIsIHNlY3Rpb24pOwotICAgIHBmeF9sZW4gPSBzdHJsZW4obGluZV9wcmVmaXgpICsgcG9zOwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMlcyciLCBsaW5lX3ByZWZpeCwgdXJpX3RleHQpOwotICAgIGdwcl9mcmVlKGxpbmVfcHJlZml4KTsKLQotICAgIGxpbmVfcHJlZml4ID0gZ3ByX21hbGxvYyhwZnhfbGVuICsgMSk7Ci0gICAgbWVtc2V0KGxpbmVfcHJlZml4LCAnICcsIHBmeF9sZW4pOwotICAgIGxpbmVfcHJlZml4W3BmeF9sZW5dID0gMDsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzXiBoZXJlIiwgbGluZV9wcmVmaXgpOwotICAgIGdwcl9mcmVlKGxpbmVfcHJlZml4KTsKLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiogUmV0dXJucyBhIGNvcHkgb2YgXGEgc3JjW2JlZ2luLCBlbmQpICovCi1zdGF0aWMgY2hhciAqY29weV9jb21wb25lbnQoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIHsKLSAgY2hhciAqb3V0ID0gZ3ByX21hbGxvYyhlbmQgLSBiZWdpbiArIDEpOwotICBtZW1jcHkob3V0LCBzcmMgKyBiZWdpbiwgZW5kIC0gYmVnaW4pOwotICBvdXRbZW5kIC0gYmVnaW5dID0gMDsKLSAgcmV0dXJuIG91dDsKLX0KLQotLyoqIFJldHVybnMgaG93IG1hbnkgY2hhcnMgdG8gYWR2YW5jZSBpZiBcYSB1cmlfdGV4dFtpXSBiZWdpbnMgYSB2YWxpZCBcYSBwY2hhcgotICogcHJvZHVjdGlvbi4gSWYgXGEgdXJpX3RleHRbaV0gaW50cm9kdWNlcyBhbiBpbnZhbGlkIFxhIHBjaGFyIChzdWNoIGFzIHBlcmNlbnQKLSAqIHNpZ24gbm90IGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzKSwgTk9UX1NFVCBpcyByZXR1cm5lZC4gKi8KLXN0YXRpYyBzaXplX3QgcGFyc2VfcGNoYXIoY29uc3QgY2hhciAqdXJpX3RleHQsIHNpemVfdCBpKSB7Ci0gIC8qIHBjaGFyID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIgotICAgKiB1bnJlc2VydmVkID0gQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IgotICAgKiBwY3QtZW5jb2RlZCA9ICIlIiBIRVhESUcgSEVYRElHCi0gICAqIHN1Yi1kZWxpbXMgPSAiISIgLyAiJCIgLyAiJiIgLyAiJyIgLyAiKCIgLyAiKSIKLSAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iICovCi0gIGNoYXIgYyA9IHVyaV90ZXh0W2ldOwotICBpZiAoKChjID49ICdBJykgJiYgKGMgPD0gJ1onKSkgfHwgKChjID49ICdhJykgJiYgKGMgPD0gJ3onKSkgfHwKLSAgICAgICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHx8Ci0gICAgICAoYyA9PSAnLScgfHwgYyA9PSAnLicgfHwgYyA9PSAnXycgfHwgYyA9PSAnficpIHx8IC8qIHVucmVzZXJ2ZWQgKi8KLSAgICAgIChjID09ICchJyB8fCBjID09ICckJyB8fCBjID09ICcmJyB8fCBjID09ICdcJycgfHwgYyA9PSAnJCcgfHwgYyA9PSAnJicgfHwKLSAgICAgICBjID09ICcoJyB8fCBjID09ICcpJyB8fCBjID09ICcqJyB8fCBjID09ICcrJyB8fCBjID09ICcsJyB8fCBjID09ICc7JyB8fAotICAgICAgIGMgPT0gJz0nKSAvKiBzdWItZGVsaW1zICovKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKGMgPT0gJyUnKSB7IC8qIHBjdC1lbmNvZGVkICovCi0gICAgc2l6ZV90IGo7Ci0gICAgaWYgKHVyaV90ZXh0W2kgKyAxXSA9PSAwIHx8IHVyaV90ZXh0W2kgKyAyXSA9PSAwKSB7Ci0gICAgICByZXR1cm4gTk9UX1NFVDsKLSAgICB9Ci0gICAgZm9yIChqID0gaSArIDE7IGogPCAyOyBqKyspIHsKLSAgICAgIGMgPSB1cmlfdGV4dFtqXTsKLSAgICAgIGlmICghKCgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHx8ICgoYyA+PSAnYScpICYmIChjIDw9ICdmJykpIHx8Ci0gICAgICAgICAgICAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnRicpKSkpIHsKLSAgICAgICAgcmV0dXJuIE5PVF9TRVQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAyOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiAqKCBwY2hhciAvICI/IiAvICIvIiApICovCi1zdGF0aWMgaW50IHBhcnNlX2ZyYWdtZW50X29yX3F1ZXJ5KGNvbnN0IGNoYXIgKnVyaV90ZXh0LCBzaXplX3QgKmkpIHsKLSAgY2hhciBjOwotICB3aGlsZSAoKGMgPSB1cmlfdGV4dFsqaV0pICE9IDApIHsKLSAgICBjb25zdCBzaXplX3QgYWR2YW5jZSA9IHBhcnNlX3BjaGFyKHVyaV90ZXh0LCAqaSk7IC8qIHBjaGFyICovCi0gICAgc3dpdGNoIChhZHZhbmNlKSB7Ci0gICAgICBjYXNlIDA6IC8qIHVyaV90ZXh0W2ldIGlzbid0IGluIHBjaGFyICovCi0gICAgICAgIC8qIG1heWJlIGl0J3MgPyBvciAvICovCi0gICAgICAgIGlmICh1cmlfdGV4dFsqaV0gPT0gJz8nIHx8IHVyaV90ZXh0WyppXSA9PSAnLycpIHsKLSAgICAgICAgICAoKmkpKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuIDApOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgKCppKSArPSBhZHZhbmNlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTk9UX1NFVDogLyogdXJpX3RleHRbaV0gaW50cm9kdWNlcyBhbiBpbnZhbGlkIFVSSSAqLwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgLyogKmkgaXMgdGhlIGZpcnN0IHVyaV90ZXh0IHBvc2l0aW9uIHBhc3QgdGhlIFxhIHF1ZXJ5IHByb2R1Y3Rpb24sIG1heWJlIFwwICovCi0gIHJldHVybiAxOwotfQotCi1ncnBjX3VyaSAqZ3JwY191cmlfcGFyc2UoY29uc3QgY2hhciAqdXJpX3RleHQsIGludCBzdXBwcmVzc19lcnJvcnMpIHsKLSAgZ3JwY191cmkgKnVyaTsKLSAgc2l6ZV90IHNjaGVtZV9iZWdpbiA9IDA7Ci0gIHNpemVfdCBzY2hlbWVfZW5kID0gTk9UX1NFVDsKLSAgc2l6ZV90IGF1dGhvcml0eV9iZWdpbiA9IE5PVF9TRVQ7Ci0gIHNpemVfdCBhdXRob3JpdHlfZW5kID0gTk9UX1NFVDsKLSAgc2l6ZV90IHBhdGhfYmVnaW4gPSBOT1RfU0VUOwotICBzaXplX3QgcGF0aF9lbmQgPSBOT1RfU0VUOwotICBzaXplX3QgcXVlcnlfYmVnaW4gPSBOT1RfU0VUOwotICBzaXplX3QgcXVlcnlfZW5kID0gTk9UX1NFVDsKLSAgc2l6ZV90IGZyYWdtZW50X2JlZ2luID0gTk9UX1NFVDsKLSAgc2l6ZV90IGZyYWdtZW50X2VuZCA9IE5PVF9TRVQ7Ci0gIHNpemVfdCBpOwotCi0gIGZvciAoaSA9IHNjaGVtZV9iZWdpbjsgdXJpX3RleHRbaV0gIT0gMDsgaSsrKSB7Ci0gICAgaWYgKHVyaV90ZXh0W2ldID09ICc6JykgewotICAgICAgc2NoZW1lX2VuZCA9IGk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHVyaV90ZXh0W2ldID49ICdhJyAmJiB1cmlfdGV4dFtpXSA8PSAneicpIGNvbnRpbnVlOwotICAgIGlmICh1cmlfdGV4dFtpXSA+PSAnQScgJiYgdXJpX3RleHRbaV0gPD0gJ1onKSBjb250aW51ZTsKLSAgICBpZiAoaSAhPSBzY2hlbWVfYmVnaW4pIHsKLSAgICAgIGlmICh1cmlfdGV4dFtpXSA+PSAnMCcgJiYgdXJpX3RleHRbaV0gPD0gJzknKSBjb250aW51ZTsKLSAgICAgIGlmICh1cmlfdGV4dFtpXSA9PSAnKycpIGNvbnRpbnVlOwotICAgICAgaWYgKHVyaV90ZXh0W2ldID09ICctJykgY29udGludWU7Ci0gICAgICBpZiAodXJpX3RleHRbaV0gPT0gJy4nKSBjb250aW51ZTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHNjaGVtZV9lbmQgPT0gTk9UX1NFVCkgewotICAgIHJldHVybiBiYWRfdXJpKHVyaV90ZXh0LCBpLCAic2NoZW1lIiwgc3VwcHJlc3NfZXJyb3JzKTsKLSAgfQotCi0gIGlmICh1cmlfdGV4dFtzY2hlbWVfZW5kICsgMV0gPT0gJy8nICYmIHVyaV90ZXh0W3NjaGVtZV9lbmQgKyAyXSA9PSAnLycpIHsKLSAgICBhdXRob3JpdHlfYmVnaW4gPSBzY2hlbWVfZW5kICsgMzsKLSAgICBmb3IgKGkgPSBhdXRob3JpdHlfYmVnaW47IHVyaV90ZXh0W2ldICE9IDAgJiYgYXV0aG9yaXR5X2VuZCA9PSBOT1RfU0VUOwotICAgICAgICAgaSsrKSB7Ci0gICAgICBpZiAodXJpX3RleHRbaV0gPT0gJy8nIHx8IHVyaV90ZXh0W2ldID09ICc/JyB8fCB1cmlfdGV4dFtpXSA9PSAnIycpIHsKLSAgICAgICAgYXV0aG9yaXR5X2VuZCA9IGk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChhdXRob3JpdHlfZW5kID09IE5PVF9TRVQgJiYgdXJpX3RleHRbaV0gPT0gMCkgewotICAgICAgYXV0aG9yaXR5X2VuZCA9IGk7Ci0gICAgfQotICAgIGlmIChhdXRob3JpdHlfZW5kID09IE5PVF9TRVQpIHsKLSAgICAgIHJldHVybiBiYWRfdXJpKHVyaV90ZXh0LCBpLCAiYXV0aG9yaXR5Iiwgc3VwcHJlc3NfZXJyb3JzKTsKLSAgICB9Ci0gICAgLyogVE9ETyhjdGlsbGVyKTogcGFyc2UgdGhlIGF1dGhvcml0eSBjb3JyZWN0bHkgKi8KLSAgICBwYXRoX2JlZ2luID0gYXV0aG9yaXR5X2VuZDsKLSAgfSBlbHNlIHsKLSAgICBwYXRoX2JlZ2luID0gc2NoZW1lX2VuZCArIDE7Ci0gIH0KLQotICBmb3IgKGkgPSBwYXRoX2JlZ2luOyB1cmlfdGV4dFtpXSAhPSAwOyBpKyspIHsKLSAgICBpZiAodXJpX3RleHRbaV0gPT0gJz8nIHx8IHVyaV90ZXh0W2ldID09ICcjJykgewotICAgICAgcGF0aF9lbmQgPSBpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChwYXRoX2VuZCA9PSBOT1RfU0VUICYmIHVyaV90ZXh0W2ldID09IDApIHsKLSAgICBwYXRoX2VuZCA9IGk7Ci0gIH0KLSAgaWYgKHBhdGhfZW5kID09IE5PVF9TRVQpIHsKLSAgICByZXR1cm4gYmFkX3VyaSh1cmlfdGV4dCwgaSwgInBhdGgiLCBzdXBwcmVzc19lcnJvcnMpOwotICB9Ci0KLSAgaWYgKHVyaV90ZXh0W2ldID09ICc/JykgewotICAgIHF1ZXJ5X2JlZ2luID0gKytpOwotICAgIGlmICghcGFyc2VfZnJhZ21lbnRfb3JfcXVlcnkodXJpX3RleHQsICZpKSkgewotICAgICAgcmV0dXJuIGJhZF91cmkodXJpX3RleHQsIGksICJxdWVyeSIsIHN1cHByZXNzX2Vycm9ycyk7Ci0gICAgfSBlbHNlIGlmICh1cmlfdGV4dFtpXSAhPSAwICYmIHVyaV90ZXh0W2ldICE9ICcjJykgewotICAgICAgLyogV2UgbXVzdCBiZSBhdCB0aGUgZW5kIG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFnbWVudCAqLwotICAgICAgcmV0dXJuIGJhZF91cmkodXJpX3RleHQsIGksICJxdWVyeSIsIHN1cHByZXNzX2Vycm9ycyk7Ci0gICAgfQotICAgIHF1ZXJ5X2VuZCA9IGk7Ci0gIH0KLSAgaWYgKHVyaV90ZXh0W2ldID09ICcjJykgewotICAgIGZyYWdtZW50X2JlZ2luID0gKytpOwotICAgIGlmICghcGFyc2VfZnJhZ21lbnRfb3JfcXVlcnkodXJpX3RleHQsICZpKSkgewotICAgICAgcmV0dXJuIGJhZF91cmkodXJpX3RleHQsIGkgLSBmcmFnbWVudF9lbmQsICJmcmFnbWVudCIsIHN1cHByZXNzX2Vycm9ycyk7Ci0gICAgfSBlbHNlIGlmICh1cmlfdGV4dFtpXSAhPSAwKSB7Ci0gICAgICAvKiBXZSBtdXN0IGJlIGF0IHRoZSBlbmQgKi8KLSAgICAgIHJldHVybiBiYWRfdXJpKHVyaV90ZXh0LCBpLCAiZnJhZ21lbnQiLCBzdXBwcmVzc19lcnJvcnMpOwotICAgIH0KLSAgICBmcmFnbWVudF9lbmQgPSBpOwotICB9Ci0KLSAgdXJpID0gZ3ByX21hbGxvYyhzaXplb2YoKnVyaSkpOwotICBtZW1zZXQodXJpLCAwLCBzaXplb2YoKnVyaSkpOwotICB1cmktPnNjaGVtZSA9IGNvcHlfY29tcG9uZW50KHVyaV90ZXh0LCBzY2hlbWVfYmVnaW4sIHNjaGVtZV9lbmQpOwotICB1cmktPmF1dGhvcml0eSA9IGNvcHlfY29tcG9uZW50KHVyaV90ZXh0LCBhdXRob3JpdHlfYmVnaW4sIGF1dGhvcml0eV9lbmQpOwotICB1cmktPnBhdGggPSBjb3B5X2NvbXBvbmVudCh1cmlfdGV4dCwgcGF0aF9iZWdpbiwgcGF0aF9lbmQpOwotICB1cmktPnF1ZXJ5ID0gY29weV9jb21wb25lbnQodXJpX3RleHQsIHF1ZXJ5X2JlZ2luLCBxdWVyeV9lbmQpOwotICB1cmktPmZyYWdtZW50ID0gY29weV9jb21wb25lbnQodXJpX3RleHQsIGZyYWdtZW50X2JlZ2luLCBmcmFnbWVudF9lbmQpOwotCi0gIHJldHVybiB1cmk7Ci19Ci0KLXZvaWQgZ3JwY191cmlfZGVzdHJveShncnBjX3VyaSAqdXJpKSB7Ci0gIGlmICghdXJpKSByZXR1cm47Ci0gIGdwcl9mcmVlKHVyaS0+c2NoZW1lKTsKLSAgZ3ByX2ZyZWUodXJpLT5hdXRob3JpdHkpOwotICBncHJfZnJlZSh1cmktPnBhdGgpOwotICBncHJfZnJlZSh1cmktPnF1ZXJ5KTsKLSAgZ3ByX2ZyZWUodXJpLT5mcmFnbWVudCk7Ci0gIGdwcl9mcmVlKHVyaSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCBiL3NyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAxM2Q4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfQ0xJRU5UX0NPTkZJR19VUklfUEFSU0VSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NMSUVOVF9DT05GSUdfVVJJX1BBUlNFUl9ICi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqc2NoZW1lOwotICBjaGFyICphdXRob3JpdHk7Ci0gIGNoYXIgKnBhdGg7Ci0gIGNoYXIgKnF1ZXJ5OwotICBjaGFyICpmcmFnbWVudDsKLX0gZ3JwY191cmk7Ci0KLS8qKiBwYXJzZSBhIHVyaSwgcmV0dXJuIE5VTEwgb24gZmFpbHVyZSAqLwotZ3JwY191cmkgKmdycGNfdXJpX3BhcnNlKGNvbnN0IGNoYXIgKnVyaV90ZXh0LCBpbnQgc3VwcHJlc3NfZXJyb3JzKTsKLQotLyoqIGRlc3Ryb3kgYSB1cmkgKi8KLXZvaWQgZ3JwY191cmlfZGVzdHJveShncnBjX3VyaSAqdXJpKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DTElFTlRfQ09ORklHX1VSSV9QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmggYi9zcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYmYxZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0NPTVBSRVNTSU9OX0FMR09SSVRITV9NRVRBREFUQV9ICi0jZGVmaW5lIEdSUENfQ09SRV9DT01QUkVTU0lPTl9BTEdPUklUSE1fTUVUQURBVEFfSAotCi0jaW5jbHVkZSA8Z3JwYy9jb21wcmVzc2lvbi5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgotCi0vKiogUmV0dXJuIGNvbXByZXNzaW9uIGFsZ29yaXRobSBiYXNlZCBtZXRhZGF0YSB2YWx1ZSAqLwotZ3JwY19tZHN0ciAqZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fbWRzdHIoCi0gICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtKTsKLQotLyoqIFJldHVybiBjb21wcmVzc2lvbiBhbGdvcml0aG0gYmFzZWQgbWV0YWRhdGEgZWxlbWVudCAoZ3JwYy1lbmNvZGluZzogeHh4KSAqLwotZ3JwY19tZGVsZW0gKmdycGNfY29tcHJlc3Npb25fZW5jb2RpbmdfbWRlbGVtKAotICAgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSk7Ci0KLS8qKiBGaW5kIGNvbXByZXNzaW9uIGFsZ29yaXRobSBiYXNlZCBvbiBwYXNzZWQgaW4gbWRzdHIgLSByZXR1cm5zCi0gKiBHUlBDX0NPTVBSRVNTX0FMR09SSVRITV9DT1VOVCBvbiBmYWlsdXJlICovCi1ncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9mcm9tX21kc3RyKAotICAgIGdycGNfbWRzdHIgKnN0cik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfQ09NUFJFU1NJT05fQUxHT1JJVEhNX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIGIvc3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTBhMzguLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvY29tcHJlc3Npb24vY29tcHJlc3Npb25fYWxnb3JpdGhtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9jb21wcmVzc2lvbi5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgotCi1pbnQgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fcGFyc2UoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtICphbGdvcml0aG0pIHsKLSAgLyogd2UgdXNlIHN0cm5jbXAgbm90IG9ubHkgYmVjYXVzZSBpdCdzIHNhZmVyIChldmVuIHRob3VnaCBpbiB0aGlzIGNhc2UgaXQKLSAgICogZG9lc24ndCBtYXR0ZXIsIGdpdmVuIHRoYXQgd2UgYXJlIGNvbXBhcmluZyBhZ2FpbnN0IHN0cmluZyBsaXRlcmFscywgYnV0Ci0gICAqIGJlY2F1c2UgdGhpcyB3YXkgd2UgbmVlZG4ndCBoYXZlICJuYW1lIiBuaWwtdGVybWluYXRlZCAodXNlZnVsIGZvciBzbGljZQotICAgKiBkYXRhLCBmb3IgZXhhbXBsZSkgKi8KLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fcGFyc2UoIgotICAgICAgIm5hbWU9JSouKnMsIG5hbWVfbGVuZ3RoPSVsdSwgYWxnb3JpdGhtPSVwKSIsCi0gICAgICA1LCAoKGludCluYW1lX2xlbmd0aCwgKGludCluYW1lX2xlbmd0aCwgbmFtZSwgKHVuc2lnbmVkIGxvbmcpbmFtZV9sZW5ndGgsCi0gICAgICAgICAgYWxnb3JpdGhtKSk7Ci0gIGlmIChuYW1lX2xlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKHN0cm5jbXAobmFtZSwgImlkZW50aXR5IiwgbmFtZV9sZW5ndGgpID09IDApIHsKLSAgICAqYWxnb3JpdGhtID0gR1JQQ19DT01QUkVTU19OT05FOwotICB9IGVsc2UgaWYgKHN0cm5jbXAobmFtZSwgImd6aXAiLCBuYW1lX2xlbmd0aCkgPT0gMCkgewotICAgICphbGdvcml0aG0gPSBHUlBDX0NPTVBSRVNTX0daSVA7Ci0gIH0gZWxzZSBpZiAoc3RybmNtcChuYW1lLCAiZGVmbGF0ZSIsIG5hbWVfbGVuZ3RoKSA9PSAwKSB7Ci0gICAgKmFsZ29yaXRobSA9IEdSUENfQ09NUFJFU1NfREVGTEFURTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50IGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX25hbWUoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm5hbWUpIHsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX3BhcnNlKGFsZ29yaXRobT0lZCwgbmFtZT0lcCkiLCAyLAotICAgICAgICAgICAgICAgICAoKGludClhbGdvcml0aG0sIG5hbWUpKTsKLSAgc3dpdGNoIChhbGdvcml0aG0pIHsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfTk9ORToKLSAgICAgICpuYW1lID0gImlkZW50aXR5IjsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgR1JQQ19DT01QUkVTU19ERUZMQVRFOgotICAgICAgKm5hbWUgPSAiZGVmbGF0ZSI7Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfR1pJUDoKLSAgICAgICpuYW1lID0gImd6aXAiOwotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX0FMR09SSVRITVNfQ09VTlQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fZnJvbV9tZHN0cigKLSAgICBncnBjX21kc3RyICpzdHIpIHsKLSAgaWYgKHN0ciA9PSBHUlBDX01EU1RSX0lERU5USVRZKSByZXR1cm4gR1JQQ19DT01QUkVTU19OT05FOwotICBpZiAoc3RyID09IEdSUENfTURTVFJfREVGTEFURSkgcmV0dXJuIEdSUENfQ09NUFJFU1NfREVGTEFURTsKLSAgaWYgKHN0ciA9PSBHUlBDX01EU1RSX0daSVApIHJldHVybiBHUlBDX0NPTVBSRVNTX0daSVA7Ci0gIHJldHVybiBHUlBDX0NPTVBSRVNTX0FMR09SSVRITVNfQ09VTlQ7Ci19Ci0KLWdycGNfbWRzdHIgKmdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX21kc3RyKAotICAgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSkgewotICBzd2l0Y2ggKGFsZ29yaXRobSkgewotICAgIGNhc2UgR1JQQ19DT01QUkVTU19OT05FOgotICAgICAgcmV0dXJuIEdSUENfTURTVFJfSURFTlRJVFk7Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX0RFRkxBVEU6Ci0gICAgICByZXR1cm4gR1JQQ19NRFNUUl9ERUZMQVRFOwotICAgIGNhc2UgR1JQQ19DT01QUkVTU19HWklQOgotICAgICAgcmV0dXJuIEdSUENfTURTVFJfR1pJUDsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDoKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1ncnBjX21kZWxlbSAqZ3JwY19jb21wcmVzc2lvbl9lbmNvZGluZ19tZGVsZW0oCi0gICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtKSB7Ci0gIHN3aXRjaCAoYWxnb3JpdGhtKSB7Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX05PTkU6Ci0gICAgICByZXR1cm4gR1JQQ19NREVMRU1fR1JQQ19FTkNPRElOR19JREVOVElUWTsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfREVGTEFURToKLSAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX0VOQ09ESU5HX0RFRkxBVEU7Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX0daSVA6Ci0gICAgICByZXR1cm4gR1JQQ19NREVMRU1fR1JQQ19FTkNPRElOR19HWklQOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVE9ETyhkZ3EpOiBBZGQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBwYXJhbWV0ZXJzIHRvIHRoZSBpbmRpdmlkdWFsCi0gKiBjb21wcmVzc2lvbiBhbGdvcml0aG1zICovCi1ncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9mb3JfbGV2ZWwoCi0gICAgZ3JwY19jb21wcmVzc2lvbl9sZXZlbCBsZXZlbCwgdWludDMyX3QgYWNjZXB0ZWRfZW5jb2RpbmdzKSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9mb3JfbGV2ZWwobGV2ZWw9JWQpIiwgMSwKLSAgICAgICAgICAgICAgICAgKChpbnQpbGV2ZWwpKTsKLSAgaWYgKGxldmVsID4gR1JQQ19DT01QUkVTU19MRVZFTF9ISUdIKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmtub3duIGNvbXByZXNzaW9uIGxldmVsICVkLiIsIChpbnQpbGV2ZWwpOwotICAgIGFib3J0KCk7Ci0gIH0KLQotICBjb25zdCBzaXplX3QgbnVtX3N1cHBvcnRlZCA9Ci0gICAgICBHUFJfQklUQ09VTlQoYWNjZXB0ZWRfZW5jb2RpbmdzKSAtIDE7IC8qIGRpc2NhcmQgTk9ORSAqLwotICBpZiAobGV2ZWwgPT0gR1JQQ19DT01QUkVTU19MRVZFTF9OT05FIHx8IG51bV9zdXBwb3J0ZWQgPT0gMCkgewotICAgIHJldHVybiBHUlBDX0NPTVBSRVNTX05PTkU7Ci0gIH0KLQotICBHUFJfQVNTRVJUKGxldmVsID4gMCk7Ci0KLSAgLyogRXN0YWJsaXNoIGEgInJhbmtpbmciIG9yIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgaW4gaW5jcmVhc2luZyBvcmRlciBvZgotICAgKiBjb21wcmVzc2lvbi4KLSAgICogVGhpcyBpcyBzaW1wbGlzdGljIGFuZCB3ZSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gaW50cm9kdWNlIG90aGVyIGRpbWVuc2lvbnMKLSAgICogaW4gdGhlIGZ1dHVyZSAoY3B1L21lbW9yeSBjb3N0LCBldGMpLiAqLwotICBjb25zdCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvc19yYW5raW5nW10gPSB7R1JQQ19DT01QUkVTU19HWklQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DT01QUkVTU19ERUZMQVRFfTsKLQotICAvKiBpbnRlcnNlY3QgYWxnb3NfcmFua2luZyB3aXRoIHRoZSBzdXBwb3J0ZWQgb25lcyBrZWVwaW5nIHRoZSByYW5rZWQgb3JkZXIgKi8KLSAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0KLSAgICAgIHNvcnRlZF9zdXBwb3J0ZWRfYWxnb3NbR1JQQ19DT01QUkVTU19BTEdPUklUSE1TX0NPVU5UXTsKLSAgc2l6ZV90IGFsZ29zX3N1cHBvcnRlZF9pZHggPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEdQUl9BUlJBWV9TSVpFKGFsZ29zX3JhbmtpbmcpOyBpKyspIHsKLSAgICBjb25zdCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGcgPSBhbGdvc19yYW5raW5nW2ldOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnVtX3N1cHBvcnRlZDsgaisrKSB7Ci0gICAgICBpZiAoR1BSX0JJVEdFVChhY2NlcHRlZF9lbmNvZGluZ3MsIGFsZykgPT0gMSkgewotICAgICAgICAvKiBpZiBcYSBhbGcgaW4gc3VwcG9ydGVkICovCi0gICAgICAgIHNvcnRlZF9zdXBwb3J0ZWRfYWxnb3NbYWxnb3Nfc3VwcG9ydGVkX2lkeCsrXSA9IGFsZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChhbGdvc19zdXBwb3J0ZWRfaWR4ID09IG51bV9zdXBwb3J0ZWQpIGJyZWFrOwotICB9Ci0KLSAgc3dpdGNoIChsZXZlbCkgewotICAgIGNhc2UgR1JQQ19DT01QUkVTU19MRVZFTF9OT05FOgotICAgICAgYWJvcnQoKTsgLyogc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkgKi8KLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfTEVWRUxfTE9XOgotICAgICAgcmV0dXJuIHNvcnRlZF9zdXBwb3J0ZWRfYWxnb3NbMF07Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX0xFVkVMX01FRDoKLSAgICAgIHJldHVybiBzb3J0ZWRfc3VwcG9ydGVkX2FsZ29zW251bV9zdXBwb3J0ZWQgLyAyXTsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfTEVWRUxfSElHSDoKLSAgICAgIHJldHVybiBzb3J0ZWRfc3VwcG9ydGVkX2FsZ29zW251bV9zdXBwb3J0ZWQgLSAxXTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKLSAgfTsKLX0KLQotdm9pZCBncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfaW5pdChncnBjX2NvbXByZXNzaW9uX29wdGlvbnMgKm9wdHMpIHsKLSAgb3B0cy0+ZW5hYmxlZF9hbGdvcml0aG1zX2JpdHNldCA9ICgxdSA8PCBHUlBDX0NPTVBSRVNTX0FMR09SSVRITVNfQ09VTlQpIC0gMTsKLSAgb3B0cy0+ZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBHUlBDX0NPTVBSRVNTX05PTkU7Ci19Ci0KLXZvaWQgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zX2VuYWJsZV9hbGdvcml0aG0oCi0gICAgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zICpvcHRzLCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pIHsKLSAgR1BSX0JJVFNFVCgmb3B0cy0+ZW5hYmxlZF9hbGdvcml0aG1zX2JpdHNldCwgYWxnb3JpdGhtKTsKLX0KLQotdm9pZCBncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfZGlzYWJsZV9hbGdvcml0aG0oCi0gICAgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zICpvcHRzLCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pIHsKLSAgR1BSX0JJVENMRUFSKCZvcHRzLT5lbmFibGVkX2FsZ29yaXRobXNfYml0c2V0LCBhbGdvcml0aG0pOwotfQotCi1pbnQgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zX2lzX2FsZ29yaXRobV9lbmFibGVkKAotICAgIGNvbnN0IGdycGNfY29tcHJlc3Npb25fb3B0aW9ucyAqb3B0cywKLSAgICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pIHsKLSAgcmV0dXJuIEdQUl9CSVRHRVQob3B0cy0+ZW5hYmxlZF9hbGdvcml0aG1zX2JpdHNldCwgYWxnb3JpdGhtKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyBiL3NyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjMjFhOS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotI2luY2x1ZGUgPHpsaWIuaD4KLQotI2RlZmluZSBPVVRQVVRfQkxPQ0tfU0laRSAxMDI0Ci0KLXN0YXRpYyBpbnQgemxpYl9ib2R5KHpfc3RyZWFtKiB6cywgZ3ByX3NsaWNlX2J1ZmZlciogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgKCpmbGF0ZSkoel9zdHJlYW0qIHpzLCBpbnQgZmx1c2gpKSB7Ci0gIGludCByOwotICBpbnQgZmx1c2g7Ci0gIHNpemVfdCBpOwotICBncHJfc2xpY2Ugb3V0YnVmID0gZ3ByX3NsaWNlX21hbGxvYyhPVVRQVVRfQkxPQ0tfU0laRSk7Ci0gIGNvbnN0IHVJbnQgdWludF9tYXggPSB+KHVJbnQpMDsKLQotICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgob3V0YnVmKSA8PSB1aW50X21heCk7Ci0gIHpzLT5hdmFpbF9vdXQgPSAodUludClHUFJfU0xJQ0VfTEVOR1RIKG91dGJ1Zik7Ci0gIHpzLT5uZXh0X291dCA9IEdQUl9TTElDRV9TVEFSVF9QVFIob3V0YnVmKTsKLSAgZmx1c2ggPSBaX05PX0ZMVVNIOwotICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQtPmNvdW50OyBpKyspIHsKLSAgICBpZiAoaSA9PSBpbnB1dC0+Y291bnQgLSAxKSBmbHVzaCA9IFpfRklOSVNIOwotICAgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChpbnB1dC0+c2xpY2VzW2ldKSA8PSB1aW50X21heCk7Ci0gICAgenMtPmF2YWlsX2luID0gKHVJbnQpR1BSX1NMSUNFX0xFTkdUSChpbnB1dC0+c2xpY2VzW2ldKTsKLSAgICB6cy0+bmV4dF9pbiA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaW5wdXQtPnNsaWNlc1tpXSk7Ci0gICAgZG8gewotICAgICAgaWYgKHpzLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZF9pbmRleGVkKG91dHB1dCwgb3V0YnVmKTsKLSAgICAgICAgb3V0YnVmID0gZ3ByX3NsaWNlX21hbGxvYyhPVVRQVVRfQkxPQ0tfU0laRSk7Ci0gICAgICAgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChvdXRidWYpIDw9IHVpbnRfbWF4KTsKLSAgICAgICAgenMtPmF2YWlsX291dCA9ICh1SW50KUdQUl9TTElDRV9MRU5HVEgob3V0YnVmKTsKLSAgICAgICAgenMtPm5leHRfb3V0ID0gR1BSX1NMSUNFX1NUQVJUX1BUUihvdXRidWYpOwotICAgICAgfQotICAgICAgciA9IGZsYXRlKHpzLCBmbHVzaCk7Ci0gICAgICBpZiAociA8IDAgJiYgciAhPSBaX0JVRl9FUlJPUiAvKiBub3QgZmF0YWwgKi8pIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfSU5GTywgInpsaWIgZXJyb3IgKCVkKSIsIHIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgICAgfQotICAgIH0gd2hpbGUgKHpzLT5hdmFpbF9vdXQgPT0gMCk7Ci0gICAgaWYgKHpzLT5hdmFpbF9pbikgewotICAgICAgZ3ByX2xvZyhHUFJfSU5GTywgInpsaWI6IG5vdCBhbGwgaW5wdXQgY29uc3VtZWQiKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgR1BSX0FTU0VSVChvdXRidWYucmVmY291bnQpOwotICBvdXRidWYuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCAtPSB6cy0+YXZhaWxfb3V0OwotICBncHJfc2xpY2VfYnVmZmVyX2FkZF9pbmRleGVkKG91dHB1dCwgb3V0YnVmKTsKLQotICByZXR1cm4gMTsKLQotZXJyb3I6Ci0gIGdwcl9zbGljZV91bnJlZihvdXRidWYpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQqIHphbGxvY19ncHIodm9pZCogb3BhcXVlLCB1bnNpZ25lZCBpbnQgaXRlbXMsIHVuc2lnbmVkIGludCBzaXplKSB7Ci0gIHJldHVybiBncHJfbWFsbG9jKGl0ZW1zICogc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHpmcmVlX2dwcih2b2lkKiBvcGFxdWUsIHZvaWQqIGFkZHJlc3MpIHsgZ3ByX2ZyZWUoYWRkcmVzcyk7IH0KLQotc3RhdGljIGludCB6bGliX2NvbXByZXNzKGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd6aXApIHsKLSAgel9zdHJlYW0genM7Ci0gIGludCByOwotICBzaXplX3QgaTsKLSAgc2l6ZV90IGNvdW50X2JlZm9yZSA9IG91dHB1dC0+Y291bnQ7Ci0gIHNpemVfdCBsZW5ndGhfYmVmb3JlID0gb3V0cHV0LT5sZW5ndGg7Ci0gIG1lbXNldCgmenMsIDAsIHNpemVvZih6cykpOwotICB6cy56YWxsb2MgPSB6YWxsb2NfZ3ByOwotICB6cy56ZnJlZSA9IHpmcmVlX2dwcjsKLSAgciA9IGRlZmxhdGVJbml0MigmenMsIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgWl9ERUZMQVRFRCwgMTUgfCAoZ3ppcCA/IDE2IDogMCksCi0gICAgICAgICAgICAgICAgICAgOCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKLSAgR1BSX0FTU0VSVChyID09IFpfT0spOwotICByID0gemxpYl9ib2R5KCZ6cywgaW5wdXQsIG91dHB1dCwgZGVmbGF0ZSkgJiYgb3V0cHV0LT5sZW5ndGggPCBpbnB1dC0+bGVuZ3RoOwotICBpZiAoIXIpIHsKLSAgICBmb3IgKGkgPSBjb3VudF9iZWZvcmU7IGkgPCBvdXRwdXQtPmNvdW50OyBpKyspIHsKLSAgICAgIGdwcl9zbGljZV91bnJlZihvdXRwdXQtPnNsaWNlc1tpXSk7Ci0gICAgfQotICAgIG91dHB1dC0+Y291bnQgPSBjb3VudF9iZWZvcmU7Ci0gICAgb3V0cHV0LT5sZW5ndGggPSBsZW5ndGhfYmVmb3JlOwotICB9Ci0gIGRlZmxhdGVFbmQoJnpzKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyBpbnQgemxpYl9kZWNvbXByZXNzKGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3ppcCkgewotICB6X3N0cmVhbSB6czsKLSAgaW50IHI7Ci0gIHNpemVfdCBpOwotICBzaXplX3QgY291bnRfYmVmb3JlID0gb3V0cHV0LT5jb3VudDsKLSAgc2l6ZV90IGxlbmd0aF9iZWZvcmUgPSBvdXRwdXQtPmxlbmd0aDsKLSAgbWVtc2V0KCZ6cywgMCwgc2l6ZW9mKHpzKSk7Ci0gIHpzLnphbGxvYyA9IHphbGxvY19ncHI7Ci0gIHpzLnpmcmVlID0gemZyZWVfZ3ByOwotICByID0gaW5mbGF0ZUluaXQyKCZ6cywgMTUgfCAoZ3ppcCA/IDE2IDogMCkpOwotICBHUFJfQVNTRVJUKHIgPT0gWl9PSyk7Ci0gIHIgPSB6bGliX2JvZHkoJnpzLCBpbnB1dCwgb3V0cHV0LCBpbmZsYXRlKTsKLSAgaWYgKCFyKSB7Ci0gICAgZm9yIChpID0gY291bnRfYmVmb3JlOyBpIDwgb3V0cHV0LT5jb3VudDsgaSsrKSB7Ci0gICAgICBncHJfc2xpY2VfdW5yZWYob3V0cHV0LT5zbGljZXNbaV0pOwotICAgIH0KLSAgICBvdXRwdXQtPmNvdW50ID0gY291bnRfYmVmb3JlOwotICAgIG91dHB1dC0+bGVuZ3RoID0gbGVuZ3RoX2JlZm9yZTsKLSAgfQotICBpbmZsYXRlRW5kKCZ6cyk7Ci0gIHJldHVybiByOwotfQotCi1zdGF0aWMgaW50IGNvcHkoZ3ByX3NsaWNlX2J1ZmZlciogaW5wdXQsIGdwcl9zbGljZV9idWZmZXIqIG91dHB1dCkgewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGlucHV0LT5jb3VudDsgaSsrKSB7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQob3V0cHV0LCBncHJfc2xpY2VfcmVmKGlucHV0LT5zbGljZXNbaV0pKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBjb21wcmVzc19pbm5lcihncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQpIHsKLSAgc3dpdGNoIChhbGdvcml0aG0pIHsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfTk9ORToKLSAgICAgIC8qIHRoZSBmYWxsYmFjayBwYXRoIGFsd2F5cyBuZWVkcyB0byBiZSBzZW5kIHVuY29tcHJlc3NlZDogd2Ugc2ltcGx5Ci0gICAgICAgICByZWx5IG9uIHRoYXQgaGVyZSAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX0RFRkxBVEU6Ci0gICAgICByZXR1cm4gemxpYl9jb21wcmVzcyhpbnB1dCwgb3V0cHV0LCAwKTsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfR1pJUDoKLSAgICAgIHJldHVybiB6bGliX2NvbXByZXNzKGlucHV0LCBvdXRwdXQsIDEpOwotICAgIGNhc2UgR1JQQ19DT01QUkVTU19BTEdPUklUSE1TX0NPVU5UOgotICAgICAgYnJlYWs7Ci0gIH0KLSAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIGNvbXByZXNzaW9uIGFsZ29yaXRobSAlZCIsIGFsZ29yaXRobSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgZ3JwY19tc2dfY29tcHJlc3MoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQpIHsKLSAgaWYgKCFjb21wcmVzc19pbm5lcihhbGdvcml0aG0sIGlucHV0LCBvdXRwdXQpKSB7Ci0gICAgY29weShpbnB1dCwgb3V0cHV0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50IGdycGNfbXNnX2RlY29tcHJlc3MoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciogaW5wdXQsIGdwcl9zbGljZV9idWZmZXIqIG91dHB1dCkgewotICBzd2l0Y2ggKGFsZ29yaXRobSkgewotICAgIGNhc2UgR1JQQ19DT01QUkVTU19OT05FOgotICAgICAgcmV0dXJuIGNvcHkoaW5wdXQsIG91dHB1dCk7Ci0gICAgY2FzZSBHUlBDX0NPTVBSRVNTX0RFRkxBVEU6Ci0gICAgICByZXR1cm4gemxpYl9kZWNvbXByZXNzKGlucHV0LCBvdXRwdXQsIDApOwotICAgIGNhc2UgR1JQQ19DT01QUkVTU19HWklQOgotICAgICAgcmV0dXJuIHpsaWJfZGVjb21wcmVzcyhpbnB1dCwgb3V0cHV0LCAxKTsKLSAgICBjYXNlIEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG0gJWQiLCBhbGdvcml0aG0pOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCBiL3NyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiNzhjMC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9DT01QUkVTU0lPTl9NRVNTQUdFX0NPTVBSRVNTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0NPTVBSRVNTSU9OX01FU1NBR0VfQ09NUFJFU1NfSAotCi0jaW5jbHVkZSA8Z3JwYy9jb21wcmVzc2lvbi5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KLQotLyogY29tcHJlc3MgJ2lucHV0JyB0byAnb3V0cHV0JyB1c2luZyAnYWxnb3JpdGhtJy4KLSAgIE9uIHN1Y2Nlc3MsIGFwcGVuZHMgY29tcHJlc3NlZCBzbGljZXMgdG8gb3V0cHV0IGFuZCByZXR1cm5zIDEuCi0gICBPbiBmYWlsdXJlLCBhcHBlbmRzIHVuY29tcHJlc3NlZCBzbGljZXMgdG8gb3V0cHV0IGFuZCByZXR1cm5zIDAuICovCi1pbnQgZ3JwY19tc2dfY29tcHJlc3MoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQpOwotCi0vKiBkZWNvbXByZXNzICdpbnB1dCcgdG8gJ291dHB1dCcgdXNpbmcgJ2FsZ29yaXRobScuCi0gICBPbiBzdWNjZXNzLCBhcHBlbmRzIHNsaWNlcyB0byBvdXRwdXQgYW5kIHJldHVybnMgMS4KLSAgIE9uIGZhaWx1cmUsIG91dHB1dCBpcyB1bmNoYW5nZWQsIGFuZCByZXR1cm5zIDAuICovCi1pbnQgZ3JwY19tc2dfZGVjb21wcmVzcyhncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyKiBpbnB1dCwgZ3ByX3NsaWNlX2J1ZmZlciogb3V0cHV0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9DT01QUkVTU0lPTl9NRVNTQUdFX0NPTVBSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2RlYnVnL3RyYWNlLmMgYi9zcmMvY29yZS9kZWJ1Zy90cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjM1ZDgxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2RlYnVnL3RyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgdHJhY2VyIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50ICpmbGFnOwotICBzdHJ1Y3QgdHJhY2VyICpuZXh0OwotfSB0cmFjZXI7Ci1zdGF0aWMgdHJhY2VyICp0cmFjZXJzOwotCi12b2lkIGdycGNfcmVnaXN0ZXJfdHJhY2VyKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZmxhZykgewotICB0cmFjZXIgKnQgPSBncHJfbWFsbG9jKHNpemVvZigqdCkpOwotICB0LT5uYW1lID0gbmFtZTsKLSAgdC0+ZmxhZyA9IGZsYWc7Ci0gIHQtPm5leHQgPSB0cmFjZXJzOwotICAqZmxhZyA9IDA7Ci0gIHRyYWNlcnMgPSB0OwotfQotCi1zdGF0aWMgdm9pZCBhZGQoY29uc3QgY2hhciAqYmVnLCBjb25zdCBjaGFyICplbmQsIGNoYXIgKioqc3MsIHNpemVfdCAqbnMpIHsKLSAgc2l6ZV90IG4gPSAqbnM7Ci0gIHNpemVfdCBucCA9IG4gKyAxOwotICBjaGFyICpzOwotICBzaXplX3QgbGVuOwotICBHUFJfQVNTRVJUKGVuZCA+PSBiZWcpOwotICBsZW4gPSAoc2l6ZV90KShlbmQgLSBiZWcpOwotICBzID0gZ3ByX21hbGxvYyhsZW4gKyAxKTsKLSAgbWVtY3B5KHMsIGJlZywgbGVuKTsKLSAgc1tsZW5dID0gMDsKLSAgKnNzID0gZ3ByX3JlYWxsb2MoKnNzLCBzaXplb2YoY2hhciAqKikgKiBucCk7Ci0gICgqc3MpW25dID0gczsKLSAgKm5zID0gbnA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwbGl0KGNvbnN0IGNoYXIgKnMsIGNoYXIgKioqc3MsIHNpemVfdCAqbnMpIHsKLSAgY29uc3QgY2hhciAqYyA9IHN0cmNocihzLCAnLCcpOwotICBpZiAoYyA9PSBOVUxMKSB7Ci0gICAgYWRkKHMsIHMgKyBzdHJsZW4ocyksIHNzLCBucyk7Ci0gIH0gZWxzZSB7Ci0gICAgYWRkKHMsIGMsIHNzLCBucyk7Ci0gICAgc3BsaXQoYyArIDEsIHNzLCBucyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcGFyc2UoY29uc3QgY2hhciAqcykgewotICBjaGFyICoqc3RyaW5ncyA9IE5VTEw7Ci0gIHNpemVfdCBuc3RyaW5ncyA9IDA7Ci0gIHNpemVfdCBpOwotICBzcGxpdChzLCAmc3RyaW5ncywgJm5zdHJpbmdzKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnN0cmluZ3M7IGkrKykgewotICAgIGdycGNfdHJhY2VyX3NldF9lbmFibGVkKHN0cmluZ3NbaV0sIDEpOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5zdHJpbmdzOyBpKyspIHsKLSAgICBncHJfZnJlZShzdHJpbmdzW2ldKTsKLSAgfQotICBncHJfZnJlZShzdHJpbmdzKTsKLX0KLQotdm9pZCBncnBjX3RyYWNlcl9pbml0KGNvbnN0IGNoYXIgKmVudl92YXIpIHsKLSAgY2hhciAqZSA9IGdwcl9nZXRlbnYoZW52X3Zhcik7Ci0gIGlmIChlICE9IE5VTEwpIHsKLSAgICBwYXJzZShlKTsKLSAgICBncHJfZnJlZShlKTsKLSAgfQotfQotCi12b2lkIGdycGNfdHJhY2VyX3NodXRkb3duKHZvaWQpIHsKLSAgd2hpbGUgKHRyYWNlcnMpIHsKLSAgICB0cmFjZXIgKnQgPSB0cmFjZXJzOwotICAgIHRyYWNlcnMgPSB0LT5uZXh0OwotICAgIGdwcl9mcmVlKHQpOwotICB9Ci19Ci0KLWludCBncnBjX3RyYWNlcl9zZXRfZW5hYmxlZChjb25zdCBjaGFyICpuYW1lLCBpbnQgZW5hYmxlZCkgewotICB0cmFjZXIgKnQ7Ci0gIGlmICgwID09IHN0cmNtcChuYW1lLCAiYWxsIikpIHsKLSAgICBmb3IgKHQgPSB0cmFjZXJzOyB0OyB0ID0gdC0+bmV4dCkgewotICAgICAgKnQtPmZsYWcgPSAxOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbnQgZm91bmQgPSAwOwotICAgIGZvciAodCA9IHRyYWNlcnM7IHQ7IHQgPSB0LT5uZXh0KSB7Ci0gICAgICBpZiAoMCA9PSBzdHJjbXAobmFtZSwgdC0+bmFtZSkpIHsKLSAgICAgICAgKnQtPmZsYWcgPSBlbmFibGVkOwotICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biB0cmFjZSB2YXI6ICclcyciLCBuYW1lKTsKLSAgICAgIHJldHVybiAwOyAvKiBlYXJseSByZXR1cm4gKi8KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9kZWJ1Zy90cmFjZS5oIGIvc3JjL2NvcmUvZGVidWcvdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYzE0MC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9kZWJ1Zy90cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfREVCVUdfVFJBQ0VfSAotI2RlZmluZSBHUlBDX0NPUkVfREVCVUdfVFJBQ0VfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotdm9pZCBncnBjX3JlZ2lzdGVyX3RyYWNlcihjb25zdCBjaGFyICpuYW1lLCBpbnQgKmZsYWcpOwotdm9pZCBncnBjX3RyYWNlcl9pbml0KGNvbnN0IGNoYXIgKmVudl92YXJfbmFtZSk7Ci12b2lkIGdycGNfdHJhY2VyX3NodXRkb3duKHZvaWQpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0RFQlVHX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9pbnNlY3VyZS9SRUFETUUubWQgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTE0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEgQEAKK1BsdWdpbiBmb3IgY3JlYXRpbmcgaW5zZWN1cmUgY2hhbm5lbHMgdXNpbmcgY2h0dHAyCmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9pbnNlY3VyZS9jaGFubmVsX2NyZWF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOTg3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvaW5zZWN1cmUvY2hhbm5lbF9jcmVhdGUuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jb25uZWN0b3IgYmFzZTsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7CisKKyAgZ3JwY19jbG9zdXJlICpub3RpZnk7CisgIGdycGNfY29ubmVjdF9pbl9hcmdzIGFyZ3M7CisgIGdycGNfY29ubmVjdF9vdXRfYXJncyAqcmVzdWx0OworICBncnBjX2Nsb3N1cmUgaW5pdGlhbF9zdHJpbmdfc2VudDsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBpbml0aWFsX3N0cmluZ19idWZmZXI7CisKKyAgZ3JwY19lbmRwb2ludCAqdGNwOworCisgIGdycGNfY2xvc3VyZSBjb25uZWN0ZWQ7Cit9IGNvbm5lY3RvcjsKKworc3RhdGljIHZvaWQgY29ubmVjdG9yX3JlZihncnBjX2Nvbm5lY3RvciAqY29uKSB7CisgIGNvbm5lY3RvciAqYyA9IChjb25uZWN0b3IgKiljb247CisgIGdwcl9yZWYoJmMtPnJlZnMpOworfQorCitzdGF0aWMgdm9pZCBjb25uZWN0b3JfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb24pIHsKKyAgY29ubmVjdG9yICpjID0gKGNvbm5lY3RvciAqKWNvbjsKKyAgaWYgKGdwcl91bnJlZigmYy0+cmVmcykpIHsKKyAgICAvKiBjLT5pbml0aWFsX3N0cmluZ19idWZmZXIgZG9lcyBub3QgbmVlZCB0byBiZSBkZXN0cm95ZWQgKi8KKyAgICBncHJfZnJlZShjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBvbl9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX3NlbnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgY29ubmVjdG9yX3VucmVmKGV4ZWNfY3R4LCBhcmcpOworfQorCitzdGF0aWMgdm9pZCBjb25uZWN0ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7CisgIGNvbm5lY3RvciAqYyA9IGFyZzsKKyAgZ3JwY19jbG9zdXJlICpub3RpZnk7CisgIGdycGNfZW5kcG9pbnQgKnRjcCA9IGMtPnRjcDsKKyAgaWYgKHRjcCAhPSBOVUxMKSB7CisgICAgaWYgKCFHUFJfU0xJQ0VfSVNfRU1QVFkoYy0+YXJncy5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKSkgeworICAgICAgZ3JwY19jbG9zdXJlX2luaXQoJmMtPmluaXRpYWxfc3RyaW5nX3NlbnQsIG9uX2luaXRpYWxfY29ubmVjdF9zdHJpbmdfc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMpOworICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZjLT5pbml0aWFsX3N0cmluZ19idWZmZXIpOworICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFyZ3MuaW5pdGlhbF9jb25uZWN0X3N0cmluZyk7CisgICAgICBjb25uZWN0b3JfcmVmKGFyZyk7CisgICAgICBncnBjX2VuZHBvaW50X3dyaXRlKGV4ZWNfY3R4LCB0Y3AsICZjLT5pbml0aWFsX3N0cmluZ19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5pbml0aWFsX3N0cmluZ19zZW50KTsKKyAgICB9CisgICAgYy0+cmVzdWx0LT50cmFuc3BvcnQgPQorICAgICAgICBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KGV4ZWNfY3R4LCBjLT5hcmdzLmNoYW5uZWxfYXJncywgdGNwLCAxKTsKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfc3RhcnRfcmVhZGluZyhleGVjX2N0eCwgYy0+cmVzdWx0LT50cmFuc3BvcnQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgR1BSX0FTU0VSVChjLT5yZXN1bHQtPnRyYW5zcG9ydCk7CisgICAgYy0+cmVzdWx0LT5jaGFubmVsX2FyZ3MgPSBjLT5hcmdzLmNoYW5uZWxfYXJnczsKKyAgfSBlbHNlIHsKKyAgICBtZW1zZXQoYy0+cmVzdWx0LCAwLCBzaXplb2YoKmMtPnJlc3VsdCkpOworICB9CisgIG5vdGlmeSA9IGMtPm5vdGlmeTsKKyAgYy0+bm90aWZ5ID0gTlVMTDsKKyAgbm90aWZ5LT5jYihleGVjX2N0eCwgbm90aWZ5LT5jYl9hcmcsIDEpOworfQorCitzdGF0aWMgdm9pZCBjb25uZWN0b3Jfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb24pIHt9CisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rvcl9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jb25uZWN0X2luX2FyZ3MgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KSB7CisgIGNvbm5lY3RvciAqYyA9IChjb25uZWN0b3IgKiljb247CisgIEdQUl9BU1NFUlQoYy0+bm90aWZ5ID09IE5VTEwpOworICBHUFJfQVNTRVJUKG5vdGlmeS0+Y2IpOworICBjLT5ub3RpZnkgPSBub3RpZnk7CisgIGMtPmFyZ3MgPSAqYXJnczsKKyAgYy0+cmVzdWx0ID0gcmVzdWx0OworICBjLT50Y3AgPSBOVUxMOworICBncnBjX2Nsb3N1cmVfaW5pdCgmYy0+Y29ubmVjdGVkLCBjb25uZWN0ZWQsIGMpOworICBncnBjX3RjcF9jbGllbnRfY29ubmVjdChleGVjX2N0eCwgJmMtPmNvbm5lY3RlZCwgJmMtPnRjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+aW50ZXJlc3RlZF9wYXJ0aWVzLCBhcmdzLT5hZGRyLCBhcmdzLT5hZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+ZGVhZGxpbmUpOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19jb25uZWN0b3JfdnRhYmxlIGNvbm5lY3Rvcl92dGFibGUgPSB7CisgICAgY29ubmVjdG9yX3JlZiwgY29ubmVjdG9yX3VucmVmLCBjb25uZWN0b3Jfc2h1dGRvd24sIGNvbm5lY3Rvcl9jb25uZWN0fTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSBiYXNlOworICBncHJfcmVmY291bnQgcmVmczsKKyAgZ3JwY19jaGFubmVsX2FyZ3MgKm1lcmdlX2FyZ3M7CisgIGdycGNfY2hhbm5lbCAqbWFzdGVyOworfSBzdWJjaGFubmVsX2ZhY3Rvcnk7CisKK3N0YXRpYyB2b2lkIHN1YmNoYW5uZWxfZmFjdG9yeV9yZWYoZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnNjZikgeworICBzdWJjaGFubmVsX2ZhY3RvcnkgKmYgPSAoc3ViY2hhbm5lbF9mYWN0b3J5ICopc2NmOworICBncHJfcmVmKCZmLT5yZWZzKTsKK30KKworc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9mYWN0b3J5X3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzY2YpIHsKKyAgc3ViY2hhbm5lbF9mYWN0b3J5ICpmID0gKHN1YmNoYW5uZWxfZmFjdG9yeSAqKXNjZjsKKyAgaWYgKGdwcl91bnJlZigmZi0+cmVmcykpIHsKKyAgICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGYtPm1hc3RlciwgInN1YmNoYW5uZWxfZmFjdG9yeSIpOworICAgIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koZi0+bWVyZ2VfYXJncyk7CisgICAgZ3ByX2ZyZWUoZik7CisgIH0KK30KKworc3RhdGljIGdycGNfc3ViY2hhbm5lbCAqc3ViY2hhbm5lbF9mYWN0b3J5X2NyZWF0ZV9zdWJjaGFubmVsKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc2NmLAorICAgIGdycGNfc3ViY2hhbm5lbF9hcmdzICphcmdzKSB7CisgIHN1YmNoYW5uZWxfZmFjdG9yeSAqZiA9IChzdWJjaGFubmVsX2ZhY3RvcnkgKilzY2Y7CisgIGNvbm5lY3RvciAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7CisgIGdycGNfY2hhbm5lbF9hcmdzICpmaW5hbF9hcmdzID0KKyAgICAgIGdycGNfY2hhbm5lbF9hcmdzX21lcmdlKGFyZ3MtPmFyZ3MsIGYtPm1lcmdlX2FyZ3MpOworICBncnBjX3N1YmNoYW5uZWwgKnM7CisgIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKyAgYy0+YmFzZS52dGFibGUgPSAmY29ubmVjdG9yX3Z0YWJsZTsKKyAgZ3ByX3JlZl9pbml0KCZjLT5yZWZzLCAxKTsKKyAgYXJncy0+YXJncyA9IGZpbmFsX2FyZ3M7CisgIHMgPSBncnBjX3N1YmNoYW5uZWxfY3JlYXRlKGV4ZWNfY3R4LCAmYy0+YmFzZSwgYXJncyk7CisgIGdycGNfY29ubmVjdG9yX3VucmVmKGV4ZWNfY3R4LCAmYy0+YmFzZSk7CisgIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koZmluYWxfYXJncyk7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlIHN1YmNoYW5uZWxfZmFjdG9yeV92dGFibGUgPSB7CisgICAgc3ViY2hhbm5lbF9mYWN0b3J5X3JlZiwgc3ViY2hhbm5lbF9mYWN0b3J5X3VucmVmLAorICAgIHN1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbH07CisKKy8qIENyZWF0ZSBhIGNsaWVudCBjaGFubmVsOgorICAgQXN5bmNocm9ub3VzbHk6IC0gcmVzb2x2ZSB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAtIGNvbm5lY3QgdG8gaXQgKHRyeWluZyBhbHRlcm5hdGl2ZXMgYXMgcHJlc2VudGVkKQorICAgICAgICAgICAgICAgICAgIC0gcGVyZm9ybSBoYW5kc2hha2VzICovCitncnBjX2NoYW5uZWwgKmdycGNfaW5zZWN1cmVfY2hhbm5lbF9jcmVhdGUoY29uc3QgY2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisgIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyOworICBzdWJjaGFubmVsX2ZhY3RvcnkgKmY7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfaW5zZWN1cmVfY2hhbm5lbF9jcmVhdGUodGFyZ2V0PSVwLCBhcmdzPSVwLCByZXNlcnZlZD0lcCkiLCAzLAorICAgICAgKHRhcmdldCwgYXJncywgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOworCisgIGNoYW5uZWwgPQorICAgICAgZ3JwY19jaGFubmVsX2NyZWF0ZSgmZXhlY19jdHgsIHRhcmdldCwgYXJncywgR1JQQ19DTElFTlRfQ0hBTk5FTCwgTlVMTCk7CisKKyAgZiA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpmKSk7CisgIGYtPmJhc2UudnRhYmxlID0gJnN1YmNoYW5uZWxfZmFjdG9yeV92dGFibGU7CisgIGdwcl9yZWZfaW5pdCgmZi0+cmVmcywgMSk7CisgIGYtPm1lcmdlX2FyZ3MgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5KGFyZ3MpOworICBmLT5tYXN0ZXIgPSBjaGFubmVsOworICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGYtPm1hc3RlciwgInN1YmNoYW5uZWxfZmFjdG9yeSIpOworICByZXNvbHZlciA9IGdycGNfcmVzb2x2ZXJfY3JlYXRlKHRhcmdldCwgJmYtPmJhc2UpOworICBpZiAoIXJlc29sdmVyKSB7CisgICAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKCZleGVjX2N0eCwgZi0+bWFzdGVyLCAic3ViY2hhbm5lbF9mYWN0b3J5Iik7CisgICAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoJmV4ZWNfY3R4LCAmZi0+YmFzZSk7CisgICAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdycGNfY2xpZW50X2NoYW5uZWxfc2V0X3Jlc29sdmVyKAorICAgICAgJmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCksIHJlc29sdmVyKTsKKyAgR1JQQ19SRVNPTFZFUl9VTlJFRigmZXhlY19jdHgsIHJlc29sdmVyLCAiY3JlYXRlIik7CisgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3VucmVmKCZleGVjX2N0eCwgJmYtPmJhc2UpOworCisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisKKyAgcmV0dXJuIGNoYW5uZWw7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL1JFQURNRS5tZCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL1JFQURNRS5tZApAQCAtMCwwICsxIEBACitQbHVnaW4gZm9yIGNyZWF0aW5nIHNlY3VyZSBjaGFubmVscyB1c2luZyBjaHR0cDIKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzQ3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY29ubmVjdG9yIGJhc2U7CisgIGdwcl9yZWZjb3VudCByZWZzOworCisgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNlY3VyaXR5X2Nvbm5lY3RvcjsKKworICBncnBjX2Nsb3N1cmUgKm5vdGlmeTsKKyAgZ3JwY19jb25uZWN0X2luX2FyZ3MgYXJnczsKKyAgZ3JwY19jb25uZWN0X291dF9hcmdzICpyZXN1bHQ7CisgIGdycGNfY2xvc3VyZSBpbml0aWFsX3N0cmluZ19zZW50OworICBncHJfc2xpY2VfYnVmZmVyIGluaXRpYWxfc3RyaW5nX2J1ZmZlcjsKKworICBncHJfbXUgbXU7CisgIGdycGNfZW5kcG9pbnQgKmNvbm5lY3RpbmdfZW5kcG9pbnQ7CisgIGdycGNfZW5kcG9pbnQgKm5ld2x5X2Nvbm5lY3RpbmdfZW5kcG9pbnQ7CisKKyAgZ3JwY19jbG9zdXJlIGNvbm5lY3RlZF9jbG9zdXJlOworfSBjb25uZWN0b3I7CisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rvcl9yZWYoZ3JwY19jb25uZWN0b3IgKmNvbikgeworICBjb25uZWN0b3IgKmMgPSAoY29ubmVjdG9yICopY29uOworICBncHJfcmVmKCZjLT5yZWZzKTsKK30KKworc3RhdGljIHZvaWQgY29ubmVjdG9yX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29uKSB7CisgIGNvbm5lY3RvciAqYyA9IChjb25uZWN0b3IgKiljb247CisgIGlmIChncHJfdW5yZWYoJmMtPnJlZnMpKSB7CisgICAgLyogYy0+aW5pdGlhbF9zdHJpbmdfYnVmZmVyIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVzdHJveWVkICovCisgICAgZ3ByX2ZyZWUoYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgb25fc2VjdXJlX2hhbmRzaGFrZV9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0KSB7CisgIGNvbm5lY3RvciAqYyA9IGFyZzsKKyAgZ3JwY19jbG9zdXJlICpub3RpZnk7CisgIGdycGNfY2hhbm5lbF9hcmdzICphcmdzX2NvcHkgPSBOVUxMOworICBncHJfbXVfbG9jaygmYy0+bXUpOworICBpZiAoYy0+Y29ubmVjdGluZ19lbmRwb2ludCA9PSBOVUxMKSB7CisgICAgbWVtc2V0KGMtPnJlc3VsdCwgMCwgc2l6ZW9mKCpjLT5yZXN1bHQpKTsKKyAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7CisgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEdSUENfU0VDVVJJVFlfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNlY3VyZSBoYW5kc2hha2UgZmFpbGVkIHdpdGggZXJyb3IgJWQuIiwgc3RhdHVzKTsKKyAgICBtZW1zZXQoYy0+cmVzdWx0LCAwLCBzaXplb2YoKmMtPnJlc3VsdCkpOworICAgIGMtPmNvbm5lY3RpbmdfZW5kcG9pbnQgPSBOVUxMOworICAgIGdwcl9tdV91bmxvY2soJmMtPm11KTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2FyZyBhdXRoX2NvbnRleHRfYXJnOworICAgIGMtPmNvbm5lY3RpbmdfZW5kcG9pbnQgPSBOVUxMOworICAgIGdwcl9tdV91bmxvY2soJmMtPm11KTsKKyAgICBjLT5yZXN1bHQtPnRyYW5zcG9ydCA9IGdycGNfY3JlYXRlX2NodHRwMl90cmFuc3BvcnQoCisgICAgICAgIGV4ZWNfY3R4LCBjLT5hcmdzLmNoYW5uZWxfYXJncywgc2VjdXJlX2VuZHBvaW50LCAxKTsKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfc3RhcnRfcmVhZGluZyhleGVjX2N0eCwgYy0+cmVzdWx0LT50cmFuc3BvcnQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgYXV0aF9jb250ZXh0X2FyZyA9IGdycGNfYXV0aF9jb250ZXh0X3RvX2FyZyhhdXRoX2NvbnRleHQpOworICAgIGFyZ3NfY29weSA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHlfYW5kX2FkZChjLT5hcmdzLmNoYW5uZWxfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGhfY29udGV4dF9hcmcsIDEpOworICAgIGMtPnJlc3VsdC0+Y2hhbm5lbF9hcmdzID0gYXJnc19jb3B5OworICB9CisgIG5vdGlmeSA9IGMtPm5vdGlmeTsKKyAgYy0+bm90aWZ5ID0gTlVMTDsKKyAgLyogbG9vayBhdCBjLT5hcmdzIHdoaWNoIGFyZSBjb25uZWN0b3IgYXJncy4gKi8KKyAgbm90aWZ5LT5jYihleGVjX2N0eCwgbm90aWZ5LT5jYl9hcmcsIDEpOworICBpZiAoYXJnc19jb3B5ICE9IE5VTEwpIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koYXJnc19jb3B5KTsKK30KKworc3RhdGljIHZvaWQgb25faW5pdGlhbF9jb25uZWN0X3N0cmluZ19zZW50KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGNvbm5lY3RvciAqYyA9IGFyZzsKKyAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9kb19oYW5kc2hha2UoZXhlY19jdHgsIGMtPnNlY3VyaXR5X2Nvbm5lY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y29ubmVjdGluZ19lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fc2VjdXJlX2hhbmRzaGFrZV9kb25lLCBjKTsKK30KKworc3RhdGljIHZvaWQgY29ubmVjdGVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBjb25uZWN0b3IgKmMgPSBhcmc7CisgIGdycGNfY2xvc3VyZSAqbm90aWZ5OworICBncnBjX2VuZHBvaW50ICp0Y3AgPSBjLT5uZXdseV9jb25uZWN0aW5nX2VuZHBvaW50OworICBpZiAodGNwICE9IE5VTEwpIHsKKyAgICBncHJfbXVfbG9jaygmYy0+bXUpOworICAgIEdQUl9BU1NFUlQoYy0+Y29ubmVjdGluZ19lbmRwb2ludCA9PSBOVUxMKTsKKyAgICBjLT5jb25uZWN0aW5nX2VuZHBvaW50ID0gdGNwOworICAgIGdwcl9tdV91bmxvY2soJmMtPm11KTsKKyAgICBpZiAoIUdQUl9TTElDRV9JU19FTVBUWShjLT5hcmdzLmluaXRpYWxfY29ubmVjdF9zdHJpbmcpKSB7CisgICAgICBncnBjX2Nsb3N1cmVfaW5pdCgmYy0+aW5pdGlhbF9zdHJpbmdfc2VudCwgb25faW5pdGlhbF9jb25uZWN0X3N0cmluZ19zZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlcik7CisgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmYy0+aW5pdGlhbF9zdHJpbmdfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJncy5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKTsKKyAgICAgIGdycGNfZW5kcG9pbnRfd3JpdGUoZXhlY19jdHgsIHRjcCwgJmMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPmluaXRpYWxfc3RyaW5nX3NlbnQpOworICAgIH0gZWxzZSB7CisgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKKyAgICAgICAgICBleGVjX2N0eCwgYy0+c2VjdXJpdHlfY29ubmVjdG9yLCB0Y3AsIG9uX3NlY3VyZV9oYW5kc2hha2VfZG9uZSwgYyk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbXNldChjLT5yZXN1bHQsIDAsIHNpemVvZigqYy0+cmVzdWx0KSk7CisgICAgbm90aWZ5ID0gYy0+bm90aWZ5OworICAgIGMtPm5vdGlmeSA9IE5VTEw7CisgICAgbm90aWZ5LT5jYihleGVjX2N0eCwgbm90aWZ5LT5jYl9hcmcsIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rvcl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbikgeworICBjb25uZWN0b3IgKmMgPSAoY29ubmVjdG9yICopY29uOworICBncnBjX2VuZHBvaW50ICplcDsKKyAgZ3ByX211X2xvY2soJmMtPm11KTsKKyAgZXAgPSBjLT5jb25uZWN0aW5nX2VuZHBvaW50OworICBjLT5jb25uZWN0aW5nX2VuZHBvaW50ID0gTlVMTDsKKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICBpZiAoZXApIHsKKyAgICBncnBjX2VuZHBvaW50X3NodXRkb3duKGV4ZWNfY3R4LCBlcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgY29ubmVjdG9yX2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2Nvbm5lY3RfaW5fYXJncyAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdF9vdXRfYXJncyAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpub3RpZnkpIHsKKyAgY29ubmVjdG9yICpjID0gKGNvbm5lY3RvciAqKWNvbjsKKyAgR1BSX0FTU0VSVChjLT5ub3RpZnkgPT0gTlVMTCk7CisgIEdQUl9BU1NFUlQobm90aWZ5LT5jYik7CisgIGMtPm5vdGlmeSA9IG5vdGlmeTsKKyAgYy0+YXJncyA9ICphcmdzOworICBjLT5yZXN1bHQgPSByZXN1bHQ7CisgIGdwcl9tdV9sb2NrKCZjLT5tdSk7CisgIEdQUl9BU1NFUlQoYy0+Y29ubmVjdGluZ19lbmRwb2ludCA9PSBOVUxMKTsKKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmYy0+Y29ubmVjdGVkX2Nsb3N1cmUsIGNvbm5lY3RlZCwgYyk7CisgIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KAorICAgICAgZXhlY19jdHgsICZjLT5jb25uZWN0ZWRfY2xvc3VyZSwgJmMtPm5ld2x5X2Nvbm5lY3RpbmdfZW5kcG9pbnQsCisgICAgICBhcmdzLT5pbnRlcmVzdGVkX3BhcnRpZXMsIGFyZ3MtPmFkZHIsIGFyZ3MtPmFkZHJfbGVuLCBhcmdzLT5kZWFkbGluZSk7Cit9CisKK3N0YXRpYyBjb25zdCBncnBjX2Nvbm5lY3Rvcl92dGFibGUgY29ubmVjdG9yX3Z0YWJsZSA9IHsKKyAgICBjb25uZWN0b3JfcmVmLCBjb25uZWN0b3JfdW5yZWYsIGNvbm5lY3Rvcl9zaHV0ZG93biwgY29ubmVjdG9yX2Nvbm5lY3R9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5IGJhc2U7CisgIGdwcl9yZWZjb3VudCByZWZzOworICBncnBjX2NoYW5uZWxfYXJncyAqbWVyZ2VfYXJnczsKKyAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2VjdXJpdHlfY29ubmVjdG9yOworICBncnBjX2NoYW5uZWwgKm1hc3RlcjsKK30gc3ViY2hhbm5lbF9mYWN0b3J5OworCitzdGF0aWMgdm9pZCBzdWJjaGFubmVsX2ZhY3RvcnlfcmVmKGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzY2YpIHsKKyAgc3ViY2hhbm5lbF9mYWN0b3J5ICpmID0gKHN1YmNoYW5uZWxfZmFjdG9yeSAqKXNjZjsKKyAgZ3ByX3JlZigmZi0+cmVmcyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1YmNoYW5uZWxfZmFjdG9yeV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc2NmKSB7CisgIHN1YmNoYW5uZWxfZmFjdG9yeSAqZiA9IChzdWJjaGFubmVsX2ZhY3RvcnkgKilzY2Y7CisgIGlmIChncHJfdW5yZWYoJmYtPnJlZnMpKSB7CisgICAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoJmYtPnNlY3VyaXR5X2Nvbm5lY3Rvci0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ViY2hhbm5lbF9mYWN0b3J5Iik7CisgICAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBmLT5tYXN0ZXIsICJzdWJjaGFubmVsX2ZhY3RvcnkiKTsKKyAgICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGYtPm1lcmdlX2FyZ3MpOworICAgIGdwcl9mcmVlKGYpOworICB9Cit9CisKK3N0YXRpYyBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbCgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnNjZiwKKyAgICBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncykgeworICBzdWJjaGFubmVsX2ZhY3RvcnkgKmYgPSAoc3ViY2hhbm5lbF9mYWN0b3J5ICopc2NmOworICBjb25uZWN0b3IgKmMgPSBncHJfbWFsbG9jKHNpemVvZigqYykpOworICBncnBjX2NoYW5uZWxfYXJncyAqZmluYWxfYXJncyA9CisgICAgICBncnBjX2NoYW5uZWxfYXJnc19tZXJnZShhcmdzLT5hcmdzLCBmLT5tZXJnZV9hcmdzKTsKKyAgZ3JwY19zdWJjaGFubmVsICpzOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CisgIGMtPmJhc2UudnRhYmxlID0gJmNvbm5lY3Rvcl92dGFibGU7CisgIGMtPnNlY3VyaXR5X2Nvbm5lY3RvciA9IGYtPnNlY3VyaXR5X2Nvbm5lY3RvcjsKKyAgZ3ByX211X2luaXQoJmMtPm11KTsKKyAgZ3ByX3JlZl9pbml0KCZjLT5yZWZzLCAxKTsKKyAgYXJncy0+YXJncyA9IGZpbmFsX2FyZ3M7CisgIHMgPSBncnBjX3N1YmNoYW5uZWxfY3JlYXRlKGV4ZWNfY3R4LCAmYy0+YmFzZSwgYXJncyk7CisgIGdycGNfY29ubmVjdG9yX3VucmVmKGV4ZWNfY3R4LCAmYy0+YmFzZSk7CisgIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koZmluYWxfYXJncyk7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlIHN1YmNoYW5uZWxfZmFjdG9yeV92dGFibGUgPSB7CisgICAgc3ViY2hhbm5lbF9mYWN0b3J5X3JlZiwgc3ViY2hhbm5lbF9mYWN0b3J5X3VucmVmLAorICAgIHN1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbH07CisKKy8qIENyZWF0ZSBhIHNlY3VyZSBjbGllbnQgY2hhbm5lbDoKKyAgIEFzeW5jaHJvbm91c2x5OiAtIHJlc29sdmUgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgLSBjb25uZWN0IHRvIGl0ICh0cnlpbmcgYWx0ZXJuYXRpdmVzIGFzIHByZXNlbnRlZCkKKyAgICAgICAgICAgICAgICAgICAtIHBlcmZvcm0gaGFuZHNoYWtlcyAqLworZ3JwY19jaGFubmVsICpncnBjX3NlY3VyZV9jaGFubmVsX2NyZWF0ZShncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXNlcnZlZCkgeworICBncnBjX2NoYW5uZWwgKmNoYW5uZWw7CisgIGdycGNfYXJnIGNvbm5lY3Rvcl9hcmc7CisgIGdycGNfY2hhbm5lbF9hcmdzICphcmdzX2NvcHk7CisgIGdycGNfY2hhbm5lbF9hcmdzICpuZXdfYXJnc19mcm9tX2Nvbm5lY3RvcjsKKyAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2VjdXJpdHlfY29ubmVjdG9yOworICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcjsKKyAgc3ViY2hhbm5lbF9mYWN0b3J5ICpmOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworCisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfc2VjdXJlX2NoYW5uZWxfY3JlYXRlKGNyZWRzPSVwLCB0YXJnZXQ9JXMsIGFyZ3M9JXAsICIKKyAgICAgICJyZXNlcnZlZD0lcCkiLAorICAgICAgNCwgKGNyZWRzLCB0YXJnZXQsIGFyZ3MsIHJlc2VydmVkKSk7CisgIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7CisKKyAgaWYgKGdycGNfZmluZF9zZWN1cml0eV9jb25uZWN0b3JfaW5fYXJncyhhcmdzKSAhPSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDYW5ub3Qgc2V0IHNlY3VyaXR5IGNvbnRleHQgaW4gY2hhbm5lbCBhcmdzLiIpOworICAgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisgICAgcmV0dXJuIGdycGNfbGFtZV9jbGllbnRfY2hhbm5lbF9jcmVhdGUoCisgICAgICAgIHRhcmdldCwgR1JQQ19TVEFUVVNfSU5URVJOQUwsCisgICAgICAgICJTZWN1cml0eSBjb25uZWN0b3IgZXhpc3RzIGluIGNoYW5uZWwgYXJncy4iKTsKKyAgfQorCisgIGlmIChncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKKyAgICAgICAgICBjcmVkcywgdGFyZ2V0LCBhcmdzLCAmc2VjdXJpdHlfY29ubmVjdG9yLCAmbmV3X2FyZ3NfZnJvbV9jb25uZWN0b3IpICE9CisgICAgICBHUlBDX1NFQ1VSSVRZX09LKSB7CisgICAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgICByZXR1cm4gZ3JwY19sYW1lX2NsaWVudF9jaGFubmVsX2NyZWF0ZSgKKyAgICAgICAgdGFyZ2V0LCBHUlBDX1NUQVRVU19JTlRFUk5BTCwgIkZhaWxlZCB0byBjcmVhdGUgc2VjdXJpdHkgY29ubmVjdG9yLiIpOworICB9CisKKyAgY29ubmVjdG9yX2FyZyA9IGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3RvX2FyZygmc2VjdXJpdHlfY29ubmVjdG9yLT5iYXNlKTsKKyAgYXJnc19jb3B5ID0gZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKAorICAgICAgbmV3X2FyZ3NfZnJvbV9jb25uZWN0b3IgIT0gTlVMTCA/IG5ld19hcmdzX2Zyb21fY29ubmVjdG9yIDogYXJncywKKyAgICAgICZjb25uZWN0b3JfYXJnLCAxKTsKKworICBjaGFubmVsID0gZ3JwY19jaGFubmVsX2NyZWF0ZSgmZXhlY19jdHgsIHRhcmdldCwgYXJnc19jb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NMSUVOVF9DSEFOTkVMLCBOVUxMKTsKKworICBmID0gZ3ByX21hbGxvYyhzaXplb2YoKmYpKTsKKyAgZi0+YmFzZS52dGFibGUgPSAmc3ViY2hhbm5lbF9mYWN0b3J5X3Z0YWJsZTsKKyAgZ3ByX3JlZl9pbml0KCZmLT5yZWZzLCAxKTsKKyAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKCZzZWN1cml0eV9jb25uZWN0b3ItPmJhc2UsICJzdWJjaGFubmVsX2ZhY3RvcnkiKTsKKyAgZi0+c2VjdXJpdHlfY29ubmVjdG9yID0gc2VjdXJpdHlfY29ubmVjdG9yOworICBmLT5tZXJnZV9hcmdzID0gZ3JwY19jaGFubmVsX2FyZ3NfY29weShhcmdzX2NvcHkpOworICBmLT5tYXN0ZXIgPSBjaGFubmVsOworICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGNoYW5uZWwsICJzdWJjaGFubmVsX2ZhY3RvcnkiKTsKKyAgcmVzb2x2ZXIgPSBncnBjX3Jlc29sdmVyX2NyZWF0ZSh0YXJnZXQsICZmLT5iYXNlKTsKKyAgaWYgKHJlc29sdmVyKSB7CisgICAgZ3JwY19jbGllbnRfY2hhbm5lbF9zZXRfcmVzb2x2ZXIoCisgICAgICAgICZleGVjX2N0eCwgZ3JwY19jaGFubmVsX2dldF9jaGFubmVsX3N0YWNrKGNoYW5uZWwpLCByZXNvbHZlcik7CisgICAgR1JQQ19SRVNPTFZFUl9VTlJFRigmZXhlY19jdHgsIHJlc29sdmVyLCAiY3JlYXRlIik7CisgIH0KKyAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoJmV4ZWNfY3R4LCAmZi0+YmFzZSk7CisgIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1VOUkVGKCZzZWN1cml0eV9jb25uZWN0b3ItPmJhc2UsICJjaGFubmVsX2NyZWF0ZSIpOworICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGFyZ3NfY29weSk7CisgIGlmIChuZXdfYXJnc19mcm9tX2Nvbm5lY3RvciAhPSBOVUxMKSB7CisgICAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShuZXdfYXJnc19mcm9tX2Nvbm5lY3Rvcik7CisgIH0KKworICBpZiAoIXJlc29sdmVyKSB7CisgICAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKCZleGVjX2N0eCwgY2hhbm5lbCwgInN1YmNoYW5uZWxfZmFjdG9yeSIpOworICAgIGNoYW5uZWwgPSBOVUxMOworICB9CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisKKyAgcmV0dXJuIGNoYW5uZWw7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvUkVBRE1FLm1kIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBiYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL1JFQURNRS5tZApAQCAtMCwwICsxIEBACitQbHVnaW4gZm9yIGNyZWF0aW5nIGluc2VjdXJlIHNlcnZlcnMgdXNpbmcgY2h0dHAyCmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvaW5zZWN1cmUvc2VydmVyX2NodHRwMi5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNjZmJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgorCitzdGF0aWMgdm9pZCBzZXR1cF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KSB7CisgIGdycGNfc2VydmVyX3NldHVwX3RyYW5zcG9ydChleGVjX2N0eCwgc2VydmVyLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9nZXRfY2hhbm5lbF9hcmdzKHNlcnZlcikpOworfQorCitzdGF0aWMgdm9pZCBuZXdfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnRjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yICphY2NlcHRvcikgeworICAvKgorICAgKiBCZXdhcmUgdGhhdCB0aGUgY2FsbCB0byBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KCkgaGFzIHRvIGhhcHBlbiBiZWZvcmUKKyAgICogZ3JwY190Y3Bfc2VydmVyX2Rlc3Ryb3koKS4gVGhpcyBpcyBmaW5lIGhlcmUsIGJ1dCBzaW1pbGFyIGNvZGUKKyAgICogYXN5bmNocm9ub3VzbHkgZG9pbmcgYSBoYW5kc2hha2UgaW5zdGVhZCBvZiBjYWxsaW5nIGdycGNfdGNwX3NlcnZlcl9zdGFydCgpCisgICAqIChhcyBpbiBzZXJ2ZXJfc2VjdXJlX2NodHRwMi5jKSBuZWVkcyB0byBhZGQgc3luY2hyb25pemF0aW9uIHRvIGF2b2lkIHRoaXMKKyAgICogY2FzZS4KKyAgICovCisgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAorICAgICAgZXhlY19jdHgsIGdycGNfc2VydmVyX2dldF9jaGFubmVsX2FyZ3Moc2VydmVyKSwgdGNwLCAwKTsKKyAgc2V0dXBfdHJhbnNwb3J0KGV4ZWNfY3R4LCBzZXJ2ZXIsIHRyYW5zcG9ydCk7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9zdGFydF9yZWFkaW5nKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIE5VTEwsIDApOworfQorCisvKiBTZXJ2ZXIgY2FsbGJhY2s6IHN0YXJ0IGxpc3RlbmluZyBvbiBvdXIgcG9ydHMgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICp0Y3BwLAorICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50KSB7CisgIGdycGNfdGNwX3NlcnZlciAqdGNwID0gdGNwcDsKKyAgZ3JwY190Y3Bfc2VydmVyX3N0YXJ0KGV4ZWNfY3R4LCB0Y3AsIHBvbGxzZXRzLCBwb2xsc2V0X2NvdW50LCBuZXdfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyKTsKK30KKworLyogU2VydmVyIGNhbGxiYWNrOiBkZXN0cm95IHRoZSB0Y3AgbGlzdGVuZXIgKHNvIHdlIGRvbid0IGdlbmVyYXRlIGZ1cnRoZXIKKyAgIGNhbGxiYWNrcykgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKnRjcHAsCisgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqZGVzdHJveV9kb25lKSB7CisgIGdycGNfdGNwX3NlcnZlciAqdGNwID0gdGNwcDsKKyAgZ3JwY190Y3Bfc2VydmVyX3VucmVmKGV4ZWNfY3R4LCB0Y3ApOworICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGRlc3Ryb3lfZG9uZSwgdHJ1ZSwgTlVMTCk7Cit9CisKK2ludCBncnBjX3NlcnZlcl9hZGRfaW5zZWN1cmVfaHR0cDJfcG9ydChncnBjX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICphZGRyKSB7CisgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpyZXNvbHZlZCA9IE5VTEw7CisgIGdycGNfdGNwX3NlcnZlciAqdGNwID0gTlVMTDsKKyAgc2l6ZV90IGk7CisgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgaW50IHBvcnRfbnVtID0gLTE7CisgIGludCBwb3J0X3RlbXA7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX2FkZF9pbnNlY3VyZV9odHRwMl9wb3J0KHNlcnZlcj0lcCwgYWRkcj0lcykiLCAyLAorICAgICAgICAgICAgICAgICAoc2VydmVyLCBhZGRyKSk7CisKKyAgcmVzb2x2ZWQgPSBncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcyhhZGRyLCAiaHR0cCIpOworICBpZiAoIXJlc29sdmVkKSB7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHRjcCA9IGdycGNfdGNwX3NlcnZlcl9jcmVhdGUoTlVMTCk7CisgIEdQUl9BU1NFUlQodGNwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVzb2x2ZWQtPm5hZGRyczsgaSsrKSB7CisgICAgcG9ydF90ZW1wID0gZ3JwY190Y3Bfc2VydmVyX2FkZF9wb3J0KAorICAgICAgICB0Y3AsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVzb2x2ZWQtPmFkZHJzW2ldLmFkZHIsCisgICAgICAgIHJlc29sdmVkLT5hZGRyc1tpXS5sZW4pOworICAgIGlmIChwb3J0X3RlbXAgPiAwKSB7CisgICAgICBpZiAocG9ydF9udW0gPT0gLTEpIHsKKyAgICAgICAgcG9ydF9udW0gPSBwb3J0X3RlbXA7CisgICAgICB9IGVsc2UgeworICAgICAgICBHUFJfQVNTRVJUKHBvcnRfbnVtID09IHBvcnRfdGVtcCk7CisgICAgICB9CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICBpZiAoY291bnQgPT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTm8gYWRkcmVzcyBhZGRlZCBvdXQgb2YgdG90YWwgJWQgcmVzb2x2ZWQiLAorICAgICAgICAgICAgcmVzb2x2ZWQtPm5hZGRycyk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICBpZiAoY291bnQgIT0gcmVzb2x2ZWQtPm5hZGRycykgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiT25seSAlZCBhZGRyZXNzZXMgYWRkZWQgb3V0IG9mIHRvdGFsICVkIHJlc29sdmVkIiwKKyAgICAgICAgICAgIGNvdW50LCByZXNvbHZlZC0+bmFkZHJzKTsKKyAgfQorICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlc29sdmVkKTsKKworICAvKiBSZWdpc3RlciB3aXRoIHRoZSBzZXJ2ZXIgb25seSB1cG9uIHN1Y2Nlc3MgKi8KKyAgZ3JwY19zZXJ2ZXJfYWRkX2xpc3RlbmVyKCZleGVjX2N0eCwgc2VydmVyLCB0Y3AsIHN0YXJ0LCBkZXN0cm95KTsKKyAgZ290byBkb25lOworCisvKiBFcnJvciBwYXRoOiBjbGVhbnVwIGFuZCByZXR1cm4gKi8KK2Vycm9yOgorICBpZiAocmVzb2x2ZWQpIHsKKyAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlc29sdmVkKTsKKyAgfQorICBpZiAodGNwKSB7CisgICAgZ3JwY190Y3Bfc2VydmVyX3VucmVmKCZleGVjX2N0eCwgdGNwKTsKKyAgfQorICBwb3J0X251bSA9IDA7CisKK2RvbmU6CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisgIHJldHVybiBwb3J0X251bTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvUkVBRE1FLm1kIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL3NlY3VyZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkYTY5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEgQEAKK1BsdWdpbiBmb3IgY3JlYXRpbmcgc2VjdXJlIHNlcnZlcnMgdXNpbmcgY2h0dHAyCmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvc2VjdXJlL3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvc2VjdXJlL3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MzRmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZSB7CisgIGdycGNfc2VydmVyICpzZXJ2ZXI7CisgIGdycGNfdGNwX3NlcnZlciAqdGNwOworICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjOworICBncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHM7CisgIGludCBpc19zaHV0ZG93bjsKKyAgZ3ByX211IG11OworICBncHJfcmVmY291bnQgcmVmY291bnQ7CisgIGdycGNfY2xvc3VyZSBkZXN0cm95X2Nsb3N1cmU7CisgIGdycGNfY2xvc3VyZSAqZGVzdHJveV9jYWxsYmFjazsKK30gZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlOworCitzdGF0aWMgdm9pZCBzdGF0ZV9yZWYoZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSkgeworICBncHJfcmVmKCZzdGF0ZS0+cmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZCBzdGF0ZV91bnJlZihncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgKnN0YXRlKSB7CisgIGlmIChncHJfdW5yZWYoJnN0YXRlLT5yZWZjb3VudCkpIHsKKyAgICAvKiBlbnN1cmUgYWxsIHRocmVhZHMgaGF2ZSB1bmxvY2tlZCAqLworICAgIGdwcl9tdV9sb2NrKCZzdGF0ZS0+bXUpOworICAgIGdwcl9tdV91bmxvY2soJnN0YXRlLT5tdSk7CisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9VTlJFRigmc3RhdGUtPnNjLT5iYXNlLCAic2VydmVyIik7CisgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdW5yZWYoc3RhdGUtPmNyZWRzKTsKKyAgICBncHJfZnJlZShzdGF0ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dXBfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzdGF0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0KSB7CisgIGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZSAqc3RhdGUgPSBzdGF0ZXA7CisgIGdycGNfY2hhbm5lbF9hcmdzICphcmdzX2NvcHk7CisgIGdycGNfYXJnIGFyZ3NfdG9fYWRkWzJdOworICBhcmdzX3RvX2FkZFswXSA9IGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3RvX2FyZyhzdGF0ZS0+Y3JlZHMpOworICBhcmdzX3RvX2FkZFsxXSA9IGdycGNfYXV0aF9jb250ZXh0X3RvX2FyZyhhdXRoX2NvbnRleHQpOworICBhcmdzX2NvcHkgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5X2FuZF9hZGQoCisgICAgICBncnBjX3NlcnZlcl9nZXRfY2hhbm5lbF9hcmdzKHN0YXRlLT5zZXJ2ZXIpLCBhcmdzX3RvX2FkZCwKKyAgICAgIEdQUl9BUlJBWV9TSVpFKGFyZ3NfdG9fYWRkKSk7CisgIGdycGNfc2VydmVyX3NldHVwX3RyYW5zcG9ydChleGVjX2N0eCwgc3RhdGUtPnNlcnZlciwgdHJhbnNwb3J0LCBhcmdzX2NvcHkpOworICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGFyZ3NfY29weSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX3NlY3VyZV9oYW5kc2hha2VfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqc3RhdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgeworICBncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgKnN0YXRlID0gc3RhdGVwOworICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBpZiAoc3RhdHVzID09IEdSUENfU0VDVVJJVFlfT0spIHsKKyAgICBpZiAoc2VjdXJlX2VuZHBvaW50KSB7CisgICAgICBncHJfbXVfbG9jaygmc3RhdGUtPm11KTsKKyAgICAgIGlmICghc3RhdGUtPmlzX3NodXRkb3duKSB7CisgICAgICAgIHRyYW5zcG9ydCA9IGdycGNfY3JlYXRlX2NodHRwMl90cmFuc3BvcnQoCisgICAgICAgICAgICBleGVjX2N0eCwgZ3JwY19zZXJ2ZXJfZ2V0X2NoYW5uZWxfYXJncyhzdGF0ZS0+c2VydmVyKSwKKyAgICAgICAgICAgIHNlY3VyZV9lbmRwb2ludCwgMCk7CisgICAgICAgIHNldHVwX3RyYW5zcG9ydChleGVjX2N0eCwgc3RhdGUsIHRyYW5zcG9ydCwgYXV0aF9jb250ZXh0KTsKKyAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3N0YXJ0X3JlYWRpbmcoZXhlY19jdHgsIHRyYW5zcG9ydCwgTlVMTCwgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBuZWVkIHRvIGNvbnN1bWUgdGhpcyBoZXJlLCBiZWNhdXNlIHRoZSBzZXJ2ZXIgbWF5IGFscmVhZHkgaGF2ZQorICAgICAgICAgKiBnb25lIGF3YXkuICovCisgICAgICAgIGdycGNfZW5kcG9pbnRfZGVzdHJveShleGVjX2N0eCwgc2VjdXJlX2VuZHBvaW50KTsKKyAgICAgIH0KKyAgICAgIGdwcl9tdV91bmxvY2soJnN0YXRlLT5tdSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiU2VjdXJlIHRyYW5zcG9ydCBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIHN0YXR1cyk7CisgIH0KKyAgc3RhdGVfdW5yZWYoc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBvbl9hY2NlcHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnN0YXRlcCwgZ3JwY19lbmRwb2ludCAqdGNwLAorICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9hY2NlcHRvciAqYWNjZXB0b3IpIHsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSA9IHN0YXRlcDsKKyAgc3RhdGVfcmVmKHN0YXRlKTsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKKyAgICAgIGV4ZWNfY3R4LCBzdGF0ZS0+c2MsIGFjY2VwdG9yLCB0Y3AsIG9uX3NlY3VyZV9oYW5kc2hha2VfZG9uZSwgc3RhdGUpOworfQorCisvKiBTZXJ2ZXIgY2FsbGJhY2s6IHN0YXJ0IGxpc3RlbmluZyBvbiBvdXIgcG9ydHMgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICpzdGF0ZXAsCisgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKipwb2xsc2V0cywgc2l6ZV90IHBvbGxzZXRfY291bnQpIHsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSA9IHN0YXRlcDsKKyAgZ3JwY190Y3Bfc2VydmVyX3N0YXJ0KGV4ZWNfY3R4LCBzdGF0ZS0+dGNwLCBwb2xsc2V0cywgcG9sbHNldF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FjY2VwdCwgc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnN0YXRlcCwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZSAqc3RhdGUgPSBzdGF0ZXA7CisgIGlmIChzdGF0ZS0+ZGVzdHJveV9jYWxsYmFjayAhPSBOVUxMKSB7CisgICAgc3RhdGUtPmRlc3Ryb3lfY2FsbGJhY2stPmNiKGV4ZWNfY3R4LCBzdGF0ZS0+ZGVzdHJveV9jYWxsYmFjay0+Y2JfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKTsKKyAgfQorICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3Jfc2h1dGRvd24oZXhlY19jdHgsIHN0YXRlLT5zYyk7CisgIHN0YXRlX3VucmVmKHN0YXRlKTsKK30KKworLyogU2VydmVyIGNhbGxiYWNrOiBkZXN0cm95IHRoZSB0Y3AgbGlzdGVuZXIgKHNvIHdlIGRvbid0IGdlbmVyYXRlIGZ1cnRoZXIKKyAgIGNhbGxiYWNrcykgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKnN0YXRlcCwKKyAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjYWxsYmFjaykgeworICBncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgKnN0YXRlID0gc3RhdGVwOworICBncnBjX3RjcF9zZXJ2ZXIgKnRjcDsKKyAgZ3ByX211X2xvY2soJnN0YXRlLT5tdSk7CisgIHN0YXRlLT5pc19zaHV0ZG93biA9IDE7CisgIHN0YXRlLT5kZXN0cm95X2NhbGxiYWNrID0gY2FsbGJhY2s7CisgIHRjcCA9IHN0YXRlLT50Y3A7CisgIGdwcl9tdV91bmxvY2soJnN0YXRlLT5tdSk7CisgIGdycGNfdGNwX3NlcnZlcl91bnJlZihleGVjX2N0eCwgdGNwKTsKK30KKworaW50IGdycGNfc2VydmVyX2FkZF9zZWN1cmVfaHR0cDJfcG9ydChncnBjX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKnJlc29sdmVkID0gTlVMTDsKKyAgZ3JwY190Y3Bfc2VydmVyICp0Y3AgPSBOVUxMOworICBncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgKnN0YXRlID0gTlVMTDsKKyAgc2l6ZV90IGk7CisgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgaW50IHBvcnRfbnVtID0gLTE7CisgIGludCBwb3J0X3RlbXA7CisgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfRVJST1I7CisgIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MgPSBOVUxMOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworCisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfc2VydmVyX2FkZF9zZWN1cmVfaHR0cDJfcG9ydCgiCisgICAgICAic2VydmVyPSVwLCBhZGRyPSVzLCBjcmVkcz0lcCkiLAorICAgICAgMywgKHNlcnZlciwgYWRkciwgY3JlZHMpKTsKKworICAvKiBjcmVhdGUgc2VjdXJpdHkgY29udGV4dCAqLworICBpZiAoY3JlZHMgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgc3RhdHVzID0gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcihjcmVkcywgJnNjKTsKKyAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBzZWN1cmUgc2VydmVyIHdpdGggY3JlZGVudGlhbHMgb2YgdHlwZSAlcy4iLAorICAgICAgICAgICAgY3JlZHMtPnR5cGUpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgc2MtPmNoYW5uZWxfYXJncyA9IGdycGNfc2VydmVyX2dldF9jaGFubmVsX2FyZ3Moc2VydmVyKTsKKworICAvKiByZXNvbHZlIGFkZHJlc3MgKi8KKyAgcmVzb2x2ZWQgPSBncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcyhhZGRyLCAiaHR0cHMiKTsKKyAgaWYgKCFyZXNvbHZlZCkgeworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgc3RhdGUgPSBncHJfbWFsbG9jKHNpemVvZigqc3RhdGUpKTsKKyAgbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZzdGF0ZS0+ZGVzdHJveV9jbG9zdXJlLCBkZXN0cm95X2RvbmUsIHN0YXRlKTsKKyAgdGNwID0gZ3JwY190Y3Bfc2VydmVyX2NyZWF0ZSgmc3RhdGUtPmRlc3Ryb3lfY2xvc3VyZSk7CisgIGlmICghdGNwKSB7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHN0YXRlLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisgIHN0YXRlLT50Y3AgPSB0Y3A7CisgIHN0YXRlLT5zYyA9IHNjOworICBzdGF0ZS0+Y3JlZHMgPSBncnBjX3NlcnZlcl9jcmVkZW50aWFsc19yZWYoY3JlZHMpOworICBzdGF0ZS0+aXNfc2h1dGRvd24gPSAwOworICBncHJfbXVfaW5pdCgmc3RhdGUtPm11KTsKKyAgZ3ByX3JlZl9pbml0KCZzdGF0ZS0+cmVmY291bnQsIDEpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXNvbHZlZC0+bmFkZHJzOyBpKyspIHsKKyAgICBwb3J0X3RlbXAgPSBncnBjX3RjcF9zZXJ2ZXJfYWRkX3BvcnQoCisgICAgICAgIHRjcCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyZXNvbHZlZC0+YWRkcnNbaV0uYWRkciwKKyAgICAgICAgcmVzb2x2ZWQtPmFkZHJzW2ldLmxlbik7CisgICAgaWYgKHBvcnRfdGVtcCA+IDApIHsKKyAgICAgIGlmIChwb3J0X251bSA9PSAtMSkgeworICAgICAgICBwb3J0X251bSA9IHBvcnRfdGVtcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdQUl9BU1NFUlQocG9ydF9udW0gPT0gcG9ydF90ZW1wKTsKKyAgICAgIH0KKyAgICAgIGNvdW50Kys7CisgICAgfQorICB9CisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJObyBhZGRyZXNzIGFkZGVkIG91dCBvZiB0b3RhbCAlZCByZXNvbHZlZCIsCisgICAgICAgICAgICByZXNvbHZlZC0+bmFkZHJzKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIGlmIChjb3VudCAhPSByZXNvbHZlZC0+bmFkZHJzKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJPbmx5ICVkIGFkZHJlc3NlcyBhZGRlZCBvdXQgb2YgdG90YWwgJWQgcmVzb2x2ZWQiLAorICAgICAgICAgICAgY291bnQsIHJlc29sdmVkLT5uYWRkcnMpOworICAgIC8qIGlmIGl0J3MgYW4gZXJyb3IsIGRvbid0IHdlIHdhbnQgdG8gZ290byBlcnJvcjsgaGVyZSA/ICovCisgIH0KKyAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXNfZGVzdHJveShyZXNvbHZlZCk7CisKKyAgLyogUmVnaXN0ZXIgd2l0aCB0aGUgc2VydmVyIG9ubHkgdXBvbiBzdWNjZXNzICovCisgIGdycGNfc2VydmVyX2FkZF9saXN0ZW5lcigmZXhlY19jdHgsIHNlcnZlciwgc3RhdGUsIHN0YXJ0LCBkZXN0cm95KTsKKworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICByZXR1cm4gcG9ydF9udW07CisKKy8qIEVycm9yIHBhdGg6IGNsZWFudXAgYW5kIHJldHVybiAqLworZXJyb3I6CisgIGlmIChyZXNvbHZlZCkgeworICAgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzX2Rlc3Ryb3kocmVzb2x2ZWQpOworICB9CisgIGlmICh0Y3ApIHsKKyAgICBncnBjX3RjcF9zZXJ2ZXJfdW5yZWYoJmV4ZWNfY3R4LCB0Y3ApOworICB9IGVsc2UgeworICAgIGlmIChzYykgeworICAgICAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoJnNjLT5iYXNlLCAic2VydmVyIik7CisgICAgfQorICAgIGlmIChzdGF0ZSkgeworICAgICAgZ3ByX2ZyZWUoc3RhdGUpOworICAgIH0KKyAgfQorICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9SRUFETUUubWQgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODRlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNCBAQAorY2h0dHAyIHRyYW5zcG9ydCBwbHVnaW4gLSBpbXBsZW1lbnRzIGdycGMgb3ZlciBodHRwMgorCitVc2VkIGJ5IGNodHRwMi97Y2xpZW50LHNlcnZlcn0ve2luc2VjdXJlLHNlY3VyZX0gcGx1Z2lucyB0byBpbXBsZW1lbnQgbW9zdCBvZgordGhlaXIgZnVuY3Rpb25hbGl0eQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMTkwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworLyogaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHN1cHBvcnRlZF92ZXJzaW9uc1tdID0geyJoMiJ9OworCitpbnQgZ3JwY19jaHR0cDJfaXNfYWxwbl92ZXJzaW9uX3N1cHBvcnRlZChjb25zdCBjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IEdQUl9BUlJBWV9TSVpFKHN1cHBvcnRlZF92ZXJzaW9ucyk7IGkrKykgeworICAgIGlmICghc3RybmNtcCh2ZXJzaW9uLCBzdXBwb3J0ZWRfdmVyc2lvbnNbaV0sIHNpemUpKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc2l6ZV90IGdycGNfY2h0dHAyX251bV9hbHBuX3ZlcnNpb25zKHZvaWQpIHsKKyAgcmV0dXJuIEdQUl9BUlJBWV9TSVpFKHN1cHBvcnRlZF92ZXJzaW9ucyk7Cit9CisKK2NvbnN0IGNoYXIgKmdycGNfY2h0dHAyX2dldF9hbHBuX3ZlcnNpb25faW5kZXgoc2l6ZV90IGkpIHsKKyAgR1BSX0FTU0VSVChpIDwgR1BSX0FSUkFZX1NJWkUoc3VwcG9ydGVkX3ZlcnNpb25zKSk7CisgIHJldHVybiBzdXBwb3J0ZWRfdmVyc2lvbnNbaV07Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg0M2ExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfQUxQTl9ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfQUxQTl9ICisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogUmV0dW5zIDEgaWYgdGhlIHZlcnNpb24gaXMgc3VwcG9ydGVkLCAwIG90aGVyd2lzZS4gKi8KK2ludCBncnBjX2NodHRwMl9pc19hbHBuX3ZlcnNpb25fc3VwcG9ydGVkKGNvbnN0IGNoYXIgKnZlcnNpb24sIHNpemVfdCBzaXplKTsKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb3RvY29sIHZlcnNpb25zIHRvIGFkdmVydGlzZSAqLworc2l6ZV90IGdycGNfY2h0dHAyX251bV9hbHBuX3ZlcnNpb25zKHZvaWQpOworCisvKiBSZXR1cm5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGF0IGluZGV4IGkgKDAgPD0gaSA8CisgKiBncnBjX2NodHRwMl9udW1fYWxwbl92ZXJzaW9ucygpKSAqLworY29uc3QgY2hhciAqZ3JwY19jaHR0cDJfZ2V0X2FscG5fdmVyc2lvbl9pbmRleChzaXplX3QgaSk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0FMUE5fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzlmOTljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBhbHBoYWJldFtdID0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDE2X3QgYml0czsKKyAgdWludDhfdCBsZW5ndGg7Cit9IGI2NF9odWZmX3N5bTsKKworc3RhdGljIGNvbnN0IGI2NF9odWZmX3N5bSBodWZmX2FscGhhYmV0WzY0XSA9IHsKKyAgICB7MHgyMSwgNn0sIHsweDVkLCA3fSwgezB4NWUsIDd9LCAgIHsweDVmLCA3fSwgezB4NjAsIDd9LCB7MHg2MSwgN30sCisgICAgezB4NjIsIDd9LCB7MHg2MywgN30sIHsweDY0LCA3fSwgICB7MHg2NSwgN30sIHsweDY2LCA3fSwgezB4NjcsIDd9LAorICAgIHsweDY4LCA3fSwgezB4NjksIDd9LCB7MHg2YSwgN30sICAgezB4NmIsIDd9LCB7MHg2YywgN30sIHsweDZkLCA3fSwKKyAgICB7MHg2ZSwgN30sIHsweDZmLCA3fSwgezB4NzAsIDd9LCAgIHsweDcxLCA3fSwgezB4NzIsIDd9LCB7MHhmYywgOH0sCisgICAgezB4NzMsIDd9LCB7MHhmZCwgOH0sIHsweDMsIDV9LCAgICB7MHgyMywgNn0sIHsweDQsIDV9LCAgezB4MjQsIDZ9LAorICAgIHsweDUsIDV9LCAgezB4MjUsIDZ9LCB7MHgyNiwgNn0sICAgezB4MjcsIDZ9LCB7MHg2LCA1fSwgIHsweDc0LCA3fSwKKyAgICB7MHg3NSwgN30sIHsweDI4LCA2fSwgezB4MjksIDZ9LCAgIHsweDJhLCA2fSwgezB4NywgNX0sICB7MHgyYiwgNn0sCisgICAgezB4NzYsIDd9LCB7MHgyYywgNn0sIHsweDgsIDV9LCAgICB7MHg5LCA1fSwgIHsweDJkLCA2fSwgezB4NzcsIDd9LAorICAgIHsweDc4LCA3fSwgezB4NzksIDd9LCB7MHg3YSwgN30sICAgezB4N2IsIDd9LCB7MHgwLCA1fSwgIHsweDEsIDV9LAorICAgIHsweDIsIDV9LCAgezB4MTksIDZ9LCB7MHgxYSwgNn0sICAgezB4MWIsIDZ9LCB7MHgxYywgNn0sIHsweDFkLCA2fSwKKyAgICB7MHgxZSwgNn0sIHsweDFmLCA2fSwgezB4N2ZiLCAxMX0sIHsweDE4LCA2fX07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhaWxfeHRyYVszXSA9IHswLCAyLCAzfTsKKworZ3ByX3NsaWNlIGdycGNfY2h0dHAyX2Jhc2U2NF9lbmNvZGUoZ3ByX3NsaWNlIGlucHV0KSB7CisgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBHUFJfU0xJQ0VfTEVOR1RIKGlucHV0KTsKKyAgc2l6ZV90IGlucHV0X3RyaXBsZXRzID0gaW5wdXRfbGVuZ3RoIC8gMzsKKyAgc2l6ZV90IHRhaWxfY2FzZSA9IGlucHV0X2xlbmd0aCAlIDM7CisgIHNpemVfdCBvdXRwdXRfbGVuZ3RoID0gaW5wdXRfdHJpcGxldHMgKiA0ICsgdGFpbF94dHJhW3RhaWxfY2FzZV07CisgIGdwcl9zbGljZSBvdXRwdXQgPSBncHJfc2xpY2VfbWFsbG9jKG91dHB1dF9sZW5ndGgpOworICB1aW50OF90ICppbiA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaW5wdXQpOworICBjaGFyICpvdXQgPSAoY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIob3V0cHV0KTsKKyAgc2l6ZV90IGk7CisKKyAgLyogZW5jb2RlIGZ1bGwgdHJpcGxldHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGlucHV0X3RyaXBsZXRzOyBpKyspIHsKKyAgICBvdXRbMF0gPSBhbHBoYWJldFtpblswXSA+PiAyXTsKKyAgICBvdXRbMV0gPSBhbHBoYWJldFsoKGluWzBdICYgMHgzKSA8PCA0KSB8IChpblsxXSA+PiA0KV07CisgICAgb3V0WzJdID0gYWxwaGFiZXRbKChpblsxXSAmIDB4ZikgPDwgMikgfCAoaW5bMl0gPj4gNildOworICAgIG91dFszXSA9IGFscGhhYmV0W2luWzJdICYgMHgzZl07CisgICAgb3V0ICs9IDQ7CisgICAgaW4gKz0gMzsKKyAgfQorCisgIC8qIGVuY29kZSB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgIHN3aXRjaCAodGFpbF9jYXNlKSB7CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgb3V0WzBdID0gYWxwaGFiZXRbaW5bMF0gPj4gMl07CisgICAgICBvdXRbMV0gPSBhbHBoYWJldFsoaW5bMF0gJiAweDMpIDw8IDRdOworICAgICAgb3V0ICs9IDI7CisgICAgICBpbiArPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgb3V0WzBdID0gYWxwaGFiZXRbaW5bMF0gPj4gMl07CisgICAgICBvdXRbMV0gPSBhbHBoYWJldFsoKGluWzBdICYgMHgzKSA8PCA0KSB8IChpblsxXSA+PiA0KV07CisgICAgICBvdXRbMl0gPSBhbHBoYWJldFsoaW5bMV0gJiAweGYpIDw8IDJdOworICAgICAgb3V0ICs9IDM7CisgICAgICBpbiArPSAyOworICAgICAgYnJlYWs7CisgIH0KKworICBHUFJfQVNTRVJUKG91dCA9PSAoY2hhciAqKUdQUl9TTElDRV9FTkRfUFRSKG91dHB1dCkpOworICBHUFJfQVNTRVJUKGluID09IEdQUl9TTElDRV9FTkRfUFRSKGlucHV0KSk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK2dwcl9zbGljZSBncnBjX2NodHRwMl9odWZmbWFuX2NvbXByZXNzKGdwcl9zbGljZSBpbnB1dCkgeworICBzaXplX3QgbmJpdHM7CisgIHVpbnQ4X3QgKmluOworICB1aW50OF90ICpvdXQ7CisgIGdwcl9zbGljZSBvdXRwdXQ7CisgIHVpbnQzMl90IHRlbXAgPSAwOworICB1aW50MzJfdCB0ZW1wX2xlbmd0aCA9IDA7CisKKyAgbmJpdHMgPSAwOworICBmb3IgKGluID0gR1BSX1NMSUNFX1NUQVJUX1BUUihpbnB1dCk7IGluICE9IEdQUl9TTElDRV9FTkRfUFRSKGlucHV0KTsgKytpbikgeworICAgIG5iaXRzICs9IGdycGNfY2h0dHAyX2h1ZmZzeW1zWyppbl0ubGVuZ3RoOworICB9CisKKyAgb3V0cHV0ID0gZ3ByX3NsaWNlX21hbGxvYyhuYml0cyAvIDggKyAobmJpdHMgJSA4ICE9IDApKTsKKyAgb3V0ID0gR1BSX1NMSUNFX1NUQVJUX1BUUihvdXRwdXQpOworICBmb3IgKGluID0gR1BSX1NMSUNFX1NUQVJUX1BUUihpbnB1dCk7IGluICE9IEdQUl9TTElDRV9FTkRfUFRSKGlucHV0KTsgKytpbikgeworICAgIGludCBzeW0gPSAqaW47CisgICAgdGVtcCA8PD0gZ3JwY19jaHR0cDJfaHVmZnN5bXNbc3ltXS5sZW5ndGg7CisgICAgdGVtcCB8PSBncnBjX2NodHRwMl9odWZmc3ltc1tzeW1dLmJpdHM7CisgICAgdGVtcF9sZW5ndGggKz0gZ3JwY19jaHR0cDJfaHVmZnN5bXNbc3ltXS5sZW5ndGg7CisKKyAgICB3aGlsZSAodGVtcF9sZW5ndGggPiA4KSB7CisgICAgICB0ZW1wX2xlbmd0aCAtPSA4OworICAgICAgKm91dCsrID0gKHVpbnQ4X3QpKHRlbXAgPj4gdGVtcF9sZW5ndGgpOworICAgIH0KKyAgfQorCisgIGlmICh0ZW1wX2xlbmd0aCkgeworICAgIC8qIE5COiB0aGUgZm9sbG93aW5nIGludGVnZXIgYXJpdGhtZXRpYyBvcGVyYXRpb24gbmVlZHMgdG8gYmUgaW4gaXRzCisgICAgICogZXhwYW5kZWQgZm9ybSBkdWUgdG8gdGhlICJpbnRlZ3JhbCBwcm9tb3Rpb24iIHBlcmZvcm1lZCAoc2VlIHNlY3Rpb24KKyAgICAgKiAzLjIuMS4xIG9mIHRoZSBDODkgZHJhZnQgc3RhbmRhcmQpLiBBIGNhc3QgdG8gdGhlIHNtYWxsZXIgY29udGFpbmVyIHR5cGUKKyAgICAgKiBpcyB0aGVuIHJlcXVpcmVkIHRvIGF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5nICovCisgICAgKm91dCsrID0gKHVpbnQ4X3QpKCh1aW50OF90KSh0ZW1wIDw8ICg4dSAtIHRlbXBfbGVuZ3RoKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoMHhmZnUgPj4gdGVtcF9sZW5ndGgpKTsKKyAgfQorCisgIEdQUl9BU1NFUlQob3V0ID09IEdQUl9TTElDRV9FTkRfUFRSKG91dHB1dCkpOworCisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgdGVtcDsKKyAgdWludDMyX3QgdGVtcF9sZW5ndGg7CisgIHVpbnQ4X3QgKm91dDsKK30gaHVmZl9vdXQ7CisKK3N0YXRpYyB2b2lkIGVuY19mbHVzaF9zb21lKGh1ZmZfb3V0ICpvdXQpIHsKKyAgd2hpbGUgKG91dC0+dGVtcF9sZW5ndGggPiA4KSB7CisgICAgb3V0LT50ZW1wX2xlbmd0aCAtPSA4OworICAgICpvdXQtPm91dCsrID0gKHVpbnQ4X3QpKG91dC0+dGVtcCA+PiBvdXQtPnRlbXBfbGVuZ3RoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBlbmNfYWRkMihodWZmX291dCAqb3V0LCB1aW50OF90IGEsIHVpbnQ4X3QgYikgeworICBiNjRfaHVmZl9zeW0gc2EgPSBodWZmX2FscGhhYmV0W2FdOworICBiNjRfaHVmZl9zeW0gc2IgPSBodWZmX2FscGhhYmV0W2JdOworICBvdXQtPnRlbXAgPSAob3V0LT50ZW1wIDw8IChzYS5sZW5ndGggKyBzYi5sZW5ndGgpKSB8CisgICAgICAgICAgICAgICgodWludDMyX3Qpc2EuYml0cyA8PCBzYi5sZW5ndGgpIHwgc2IuYml0czsKKyAgb3V0LT50ZW1wX2xlbmd0aCArPSAodWludDMyX3Qpc2EubGVuZ3RoICsgKHVpbnQzMl90KXNiLmxlbmd0aDsKKyAgZW5jX2ZsdXNoX3NvbWUob3V0KTsKK30KKworc3RhdGljIHZvaWQgZW5jX2FkZDEoaHVmZl9vdXQgKm91dCwgdWludDhfdCBhKSB7CisgIGI2NF9odWZmX3N5bSBzYSA9IGh1ZmZfYWxwaGFiZXRbYV07CisgIG91dC0+dGVtcCA9IChvdXQtPnRlbXAgPDwgc2EubGVuZ3RoKSB8IHNhLmJpdHM7CisgIG91dC0+dGVtcF9sZW5ndGggKz0gc2EubGVuZ3RoOworICBlbmNfZmx1c2hfc29tZShvdXQpOworfQorCitncHJfc2xpY2UgZ3JwY19jaHR0cDJfYmFzZTY0X2VuY29kZV9hbmRfaHVmZm1hbl9jb21wcmVzcyhncHJfc2xpY2UgaW5wdXQpIHsKKyAgc2l6ZV90IGlucHV0X2xlbmd0aCA9IEdQUl9TTElDRV9MRU5HVEgoaW5wdXQpOworICBzaXplX3QgaW5wdXRfdHJpcGxldHMgPSBpbnB1dF9sZW5ndGggLyAzOworICBzaXplX3QgdGFpbF9jYXNlID0gaW5wdXRfbGVuZ3RoICUgMzsKKyAgc2l6ZV90IG91dHB1dF9zeW1zID0gaW5wdXRfdHJpcGxldHMgKiA0ICsgdGFpbF94dHJhW3RhaWxfY2FzZV07CisgIHNpemVfdCBtYXhfb3V0cHV0X2JpdHMgPSAxMSAqIG91dHB1dF9zeW1zOworICBzaXplX3QgbWF4X291dHB1dF9sZW5ndGggPSBtYXhfb3V0cHV0X2JpdHMgLyA4ICsgKG1heF9vdXRwdXRfYml0cyAlIDggIT0gMCk7CisgIGdwcl9zbGljZSBvdXRwdXQgPSBncHJfc2xpY2VfbWFsbG9jKG1heF9vdXRwdXRfbGVuZ3RoKTsKKyAgdWludDhfdCAqaW4gPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGlucHV0KTsKKyAgdWludDhfdCAqc3RhcnRfb3V0ID0gR1BSX1NMSUNFX1NUQVJUX1BUUihvdXRwdXQpOworICBodWZmX291dCBvdXQ7CisgIHNpemVfdCBpOworCisgIG91dC50ZW1wID0gMDsKKyAgb3V0LnRlbXBfbGVuZ3RoID0gMDsKKyAgb3V0Lm91dCA9IHN0YXJ0X291dDsKKworICAvKiBlbmNvZGUgZnVsbCB0cmlwbGV0cyAqLworICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRfdHJpcGxldHM7IGkrKykgeworICAgIGVuY19hZGQyKCZvdXQsIGluWzBdID4+IDIsICh1aW50OF90KSgoaW5bMF0gJiAweDMpIDw8IDQpIHwgKGluWzFdID4+IDQpKTsKKyAgICBlbmNfYWRkMigmb3V0LCAodWludDhfdCkoKGluWzFdICYgMHhmKSA8PCAyKSB8IChpblsyXSA+PiA2KSwKKyAgICAgICAgICAgICAodWludDhfdCkoaW5bMl0gJiAweDNmKSk7CisgICAgaW4gKz0gMzsKKyAgfQorCisgIC8qIGVuY29kZSB0aGUgcmVtYWluaW5nIGJ5dGVzICovCisgIHN3aXRjaCAodGFpbF9jYXNlKSB7CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZW5jX2FkZDIoJm91dCwgaW5bMF0gPj4gMiwgKHVpbnQ4X3QpKChpblswXSAmIDB4MykgPDwgNCkpOworICAgICAgaW4gKz0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGVuY19hZGQyKCZvdXQsIGluWzBdID4+IDIsCisgICAgICAgICAgICAgICAodWludDhfdCkoKGluWzBdICYgMHgzKSA8PCA0KSB8ICh1aW50OF90KShpblsxXSA+PiA0KSk7CisgICAgICBlbmNfYWRkMSgmb3V0LCAodWludDhfdCkoKGluWzFdICYgMHhmKSA8PCAyKSk7CisgICAgICBpbiArPSAyOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAob3V0LnRlbXBfbGVuZ3RoKSB7CisgICAgLyogTkI6IHRoZSBmb2xsb3dpbmcgaW50ZWdlciBhcml0aG1ldGljIG9wZXJhdGlvbiBuZWVkcyB0byBiZSBpbiBpdHMKKyAgICAgKiBleHBhbmRlZCBmb3JtIGR1ZSB0byB0aGUgImludGVncmFsIHByb21vdGlvbiIgcGVyZm9ybWVkIChzZWUgc2VjdGlvbgorICAgICAqIDMuMi4xLjEgb2YgdGhlIEM4OSBkcmFmdCBzdGFuZGFyZCkuIEEgY2FzdCB0byB0aGUgc21hbGxlciBjb250YWluZXIgdHlwZQorICAgICAqIGlzIHRoZW4gcmVxdWlyZWQgdG8gYXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAqb3V0Lm91dCsrID0gKHVpbnQ4X3QpKCh1aW50OF90KShvdXQudGVtcCA8PCAoOHUgLSBvdXQudGVtcF9sZW5ndGgpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoMHhmZnUgPj4gb3V0LnRlbXBfbGVuZ3RoKSk7CisgIH0KKworICBHUFJfQVNTRVJUKG91dC5vdXQgPD0gR1BSX1NMSUNFX0VORF9QVFIob3V0cHV0KSk7CisgIEdQUl9TTElDRV9TRVRfTEVOR1RIKG91dHB1dCwgb3V0Lm91dCAtIHN0YXJ0X291dCk7CisKKyAgR1BSX0FTU0VSVChpbiA9PSBHUFJfU0xJQ0VfRU5EX1BUUihpbnB1dCkpOworICByZXR1cm4gb3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWRhZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0JJTl9FTkNPREVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9CSU5fRU5DT0RFUl9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKworLyogYmFzZTY0IGVuY29kZSBhIHNsaWNlLiBSZXR1cm5zIGEgbmV3IHNsaWNlLCBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUKKyAgIGlucHV0ICovCitncHJfc2xpY2UgZ3JwY19jaHR0cDJfYmFzZTY0X2VuY29kZShncHJfc2xpY2UgaW5wdXQpOworCisvKiBDb21wcmVzcyBhIHNsaWNlIHdpdGggdGhlIHN0YXRpYyBodWZmbWFuIGVuY29kZXIgZGV0YWlsZWQgaW4gdGhlIGhwYWNrCisgICBzdGFuZGFyZC4gUmV0dXJucyBhIG5ldyBzbGljZSwgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGlucHV0ICovCitncHJfc2xpY2UgZ3JwY19jaHR0cDJfaHVmZm1hbl9jb21wcmVzcyhncHJfc2xpY2UgaW5wdXQpOworCisvKiBlcXVpdmFsZW50IHRvOgorICAgZ3ByX3NsaWNlIHggPSBncnBjX2NodHRwMl9iYXNlNjRfZW5jb2RlKGlucHV0KTsKKyAgIGdwcl9zbGljZSB5ID0gZ3JwY19jaHR0cDJfaHVmZm1hbl9jb21wcmVzcyh4KTsKKyAgIGdwcl9zbGljZV91bnJlZih4KTsKKyAgIHJldHVybiB5OyAqLworZ3ByX3NsaWNlIGdycGNfY2h0dHAyX2Jhc2U2NF9lbmNvZGVfYW5kX2h1ZmZtYW5fY29tcHJlc3MoZ3ByX3NsaWNlIGlucHV0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfQklOX0VOQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzMDdhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxNzg1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIgorCisjZGVmaW5lIERFRkFVTFRfV0lORE9XIDY1NTM1CisjZGVmaW5lIERFRkFVTFRfQ09OTkVDVElPTl9XSU5ET1dfVEFSR0VUICgxMDI0ICogMTAyNCkKKyNkZWZpbmUgTUFYX1dJTkRPVyAweDdmZmZmZmZmdQorCisjZGVmaW5lIE1BWF9DTElFTlRfU1RSRUFNX0lEIDB4N2ZmZmZmZmZ1CisKK2ludCBncnBjX2h0dHBfdHJhY2UgPSAwOworaW50IGdycGNfZmxvd2N0bF90cmFjZSA9IDA7CisKKyNkZWZpbmUgVFJBTlNQT1JUX0ZST01fV1JJVElORyh0dykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0dyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nKSkpCisKKyNkZWZpbmUgVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0dykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0dyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nKSkpCisKKyNkZWZpbmUgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0Zyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpKSkKKworI2RlZmluZSBTVFJFQU1fRlJPTV9HTE9CQUwoc2cpIFwKKyAgKChncnBjX2NodHRwMl9zdHJlYW0gKikoKGNoYXIgKikoc2cpLW9mZnNldG9mKGdycGNfY2h0dHAyX3N0cmVhbSwgZ2xvYmFsKSkpCisKKyNkZWZpbmUgU1RSRUFNX0ZST01fUEFSU0lORyhzZykgXAorICAoKGdycGNfY2h0dHAyX3N0cmVhbSAqKSgoY2hhciAqKShzZyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfc3RyZWFtLCBwYXJzaW5nKSkpCisKK3N0YXRpYyBjb25zdCBncnBjX3RyYW5zcG9ydF92dGFibGUgdnRhYmxlOworCitzdGF0aWMgdm9pZCBsb2NrKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCk7CitzdGF0aWMgdm9pZCB1bmxvY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCk7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHZhcmlvdXMgY2FsbGJhY2tzIHRoYXQgd2UnbGwgYnVpbGQgY2xvc3VyZXMgYXJvdW5kICovCitzdGF0aWMgdm9pZCB3cml0aW5nX2FjdGlvbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2Vzc19pZ25vcmVkKTsKKworLyoqIFNldCBhIHRyYW5zcG9ydCBsZXZlbCBzZXR0aW5nLCBhbmQgcHVzaCBpdCB0byBvdXIgcGVlciAqLworc3RhdGljIHZvaWQgcHVzaF9zZXR0aW5nKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwgZ3JwY19jaHR0cDJfc2V0dGluZ19pZCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7CisKKy8qKiBFbmRwb2ludCBjYWxsYmFjayB0byBwcm9jZXNzIGluY29taW5nIGRhdGEgKi8KK3N0YXRpYyB2b2lkIHJlY3ZfZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdHAsIGJvb2wgc3VjY2Vzcyk7CisKKy8qKiBTdGFydCBkaXNjb25uZWN0aW9uIGNoYWluICovCitzdGF0aWMgdm9pZCBkcm9wX2Nvbm5lY3Rpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCk7CisKKy8qKiBQZXJmb3JtIGEgdHJhbnNwb3J0X29wICovCitzdGF0aWMgdm9pZCBwZXJmb3JtX3N0cmVhbV9vcF9sb2NrZWQoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7CisKKy8qKiBDYW5jZWwgYSBzdHJlYW06IGNvbWluZyBmcm9tIHRoZSB0cmFuc3BvcnQgQVBJICovCitzdGF0aWMgdm9pZCBjYW5jZWxfZnJvbV9hcGkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzKTsKKworc3RhdGljIHZvaWQgY2xvc2VfZnJvbV9hcGkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpvcHRpb25hbF9tZXNzYWdlKTsKKworLyoqIEFkZCBlbmRwb2ludCBmcm9tIHRoaXMgdHJhbnNwb3J0IHRvIHBvbGxzZXQgKi8KK3N0YXRpYyB2b2lkIGFkZF90b19wb2xsc2V0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKK3N0YXRpYyB2b2lkIGFkZF90b19wb2xsc2V0X3NldF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpOworCisvKiogU3RhcnQgbmV3IHN0cmVhbXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBpZiB3ZSBjYW4gKi8KK3N0YXRpYyB2b2lkIG1heWJlX3N0YXJ0X3NvbWVfc3RyZWFtcygKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCk7CisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGUsIGNvbnN0IGNoYXIgKnJlYXNvbik7CisKK3N0YXRpYyB2b2lkIGNoZWNrX3JlYWRfb3BzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCk7CisKK3N0YXRpYyB2b2lkIGluY29taW5nX2J5dGVfc3RyZWFtX3VwZGF0ZV9mbG93X2NvbnRyb2woCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLCBzaXplX3QgbWF4X3NpemVfaGludCwKKyAgICBzaXplX3QgaGF2ZV9hbHJlYWR5KTsKKworc3RhdGljIHZvaWQgZmFpbF9wZW5kaW5nX3dyaXRlcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT05TVFJVQ1RJT04vREVTVFJVQ1RJT04vUkVGQ09VTlRJTkcKKyAqLworCitzdGF0aWMgdm9pZCBkZXN0cnVjdF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7CisgIHNpemVfdCBpOworCisgIGdwcl9tdV9sb2NrKCZ0LT5tdSk7CisKKyAgR1BSX0FTU0VSVCh0LT5lcCA9PSBOVUxMKTsKKworICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnQtPmdsb2JhbC5xYnVmKTsKKworICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnQtPndyaXRpbmcub3V0YnVmKTsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9kZXN0cm95KCZ0LT53cml0aW5nLmhwYWNrX2NvbXByZXNzb3IpOworCisgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmdC0+cGFyc2luZy5xYnVmKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZ0LT5yZWFkX2J1ZmZlcik7CisgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9kZXN0cm95KCZ0LT5wYXJzaW5nLmhwYWNrX3BhcnNlcik7CisgIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfZGVzdHJveSgmdC0+cGFyc2luZy5nb2F3YXlfcGFyc2VyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgU1RSRUFNX0xJU1RfQ09VTlQ7IGkrKykgeworICAgIEdQUl9BU1NFUlQodC0+bGlzdHNbaV0uaGVhZCA9PSBOVUxMKTsKKyAgICBHUFJfQVNTRVJUKHQtPmxpc3RzW2ldLnRhaWwgPT0gTlVMTCk7CisgIH0KKworICBHUFJfQVNTRVJUKGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfc2l6ZSgmdC0+cGFyc2luZ19zdHJlYW1fbWFwKSA9PSAwKTsKKyAgR1BSX0FTU0VSVChncnBjX2NodHRwMl9zdHJlYW1fbWFwX3NpemUoJnQtPm5ld19zdHJlYW1fbWFwKSA9PSAwKTsKKworICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2Rlc3Ryb3koJnQtPnBhcnNpbmdfc3RyZWFtX21hcCk7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVzdHJveSgmdC0+bmV3X3N0cmVhbV9tYXApOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGV4ZWNfY3R4LCAmdC0+Y2hhbm5lbF9jYWxsYmFjay5zdGF0ZV90cmFja2VyKTsKKworICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7CisgIGdwcl9tdV9kZXN0cm95KCZ0LT5tdSk7CisKKyAgLyogY2FsbGJhY2sgcmVtYWluaW5nIHBpbmdzOiB0aGV5J3JlIG5vdCBhbGxvd2VkIHRvIGNhbGwgaW50byB0aGUgdHJhbnNwb3QsCisgICAgIGFuZCBtYXliZSB0aGV5IGhvbGQgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBiZSBmcmVlZCAqLworICB3aGlsZSAodC0+Z2xvYmFsLnBpbmdzLm5leHQgIT0gJnQtPmdsb2JhbC5waW5ncykgeworICAgIGdycGNfY2h0dHAyX291dHN0YW5kaW5nX3BpbmcgKnBpbmcgPSB0LT5nbG9iYWwucGluZ3MubmV4dDsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBpbmctPm9uX3JlY3YsIGZhbHNlLCBOVUxMKTsKKyAgICBwaW5nLT5uZXh0LT5wcmV2ID0gcGluZy0+cHJldjsKKyAgICBwaW5nLT5wcmV2LT5uZXh0ID0gcGluZy0+bmV4dDsKKyAgICBncHJfZnJlZShwaW5nKTsKKyAgfQorCisgIGdwcl9mcmVlKHQtPnBlZXJfc3RyaW5nKTsKKyAgZ3ByX2ZyZWUodCk7Cit9CisKKyNpZmRlZiBSRUZDT1VOVElOR19ERUJVRworI2RlZmluZSBSRUZfVFJBTlNQT1JUKHQsIHIpIHJlZl90cmFuc3BvcnQodCwgciwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBVTlJFRl9UUkFOU1BPUlQoY2wsIHQsIHIpIHVucmVmX3RyYW5zcG9ydChjbCwgdCwgciwgX19GSUxFX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgdW5yZWZfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICBncHJfbG9nKEdQUl9ERUJVRywgImNodHRwMjp1bnJlZjolcCAlZC0+JWQgJXMgWyVzOiVkXSIsIHQsIHQtPnJlZnMuY291bnQsCisgICAgICAgICAgdC0+cmVmcy5jb3VudCAtIDEsIHJlYXNvbiwgZmlsZSwgbGluZSk7CisgIGlmICghZ3ByX3VucmVmKCZ0LT5yZWZzKSkgcmV0dXJuOworICBkZXN0cnVjdF90cmFuc3BvcnQoZXhlY19jdHgsIHQpOworfQorCitzdGF0aWMgdm9pZCByZWZfdHJhbnNwb3J0KGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwgY29uc3QgY2hhciAqcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICBncHJfbG9nKEdQUl9ERUJVRywgImNodHRwMjogIHJlZjolcCAlZC0+JWQgJXMgWyVzOiVkXSIsIHQsIHQtPnJlZnMuY291bnQsCisgICAgICAgICAgdC0+cmVmcy5jb3VudCArIDEsIHJlYXNvbiwgZmlsZSwgbGluZSk7CisgIGdwcl9yZWYoJnQtPnJlZnMpOworfQorI2Vsc2UKKyNkZWZpbmUgUkVGX1RSQU5TUE9SVCh0LCByKSByZWZfdHJhbnNwb3J0KHQpCisjZGVmaW5lIFVOUkVGX1RSQU5TUE9SVChjbCwgdCwgcikgdW5yZWZfdHJhbnNwb3J0KGNsLCB0KQorc3RhdGljIHZvaWQgdW5yZWZfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsKKyAgaWYgKCFncHJfdW5yZWYoJnQtPnJlZnMpKSByZXR1cm47CisgIGRlc3RydWN0X3RyYW5zcG9ydChleGVjX2N0eCwgdCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlZl90cmFuc3BvcnQoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7IGdwcl9yZWYoJnQtPnJlZnMpOyB9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaW5pdF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICplcCwgdWludDhfdCBpc19jbGllbnQpIHsKKyAgc2l6ZV90IGk7CisgIGludCBqOworCisgIEdQUl9BU1NFUlQoc3RybGVuKEdSUENfQ0hUVFAyX0NMSUVOVF9DT05ORUNUX1NUUklORykgPT0KKyAgICAgICAgICAgICBHUlBDX0NIVFRQMl9DTElFTlRfQ09OTkVDVF9TVFJMRU4pOworCisgIG1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKworICB0LT5iYXNlLnZ0YWJsZSA9ICZ2dGFibGU7CisgIHQtPmVwID0gZXA7CisgIC8qIG9uZSByZWYgaXMgZm9yIGRlc3Ryb3ksIHRoZSBvdGhlciBmb3Igd2hlbiBlcCBiZWNvbWVzIE5VTEwgKi8KKyAgZ3ByX3JlZl9pbml0KCZ0LT5yZWZzLCAyKTsKKyAgLyogcmVmIGlzIGRyb3BwZWQgYXQgdHJhbnNwb3J0IGNsb3NlKCkgKi8KKyAgZ3ByX3JlZl9pbml0KCZ0LT5zaHV0ZG93bl9lcF9yZWZzLCAxKTsKKyAgZ3ByX211X2luaXQoJnQtPm11KTsKKyAgdC0+cGVlcl9zdHJpbmcgPSBncnBjX2VuZHBvaW50X2dldF9wZWVyKGVwKTsKKyAgdC0+ZW5kcG9pbnRfcmVhZGluZyA9IDE7CisgIHQtPmdsb2JhbC5uZXh0X3N0cmVhbV9pZCA9IGlzX2NsaWVudCA/IDEgOiAyOworICB0LT5nbG9iYWwuaXNfY2xpZW50ID0gaXNfY2xpZW50OworICB0LT53cml0aW5nLm91dGdvaW5nX3dpbmRvdyA9IERFRkFVTFRfV0lORE9XOworICB0LT5wYXJzaW5nLmluY29taW5nX3dpbmRvdyA9IERFRkFVTFRfV0lORE9XOworICB0LT5nbG9iYWwuc3RyZWFtX2xvb2thaGVhZCA9IERFRkFVTFRfV0lORE9XOworICB0LT5nbG9iYWwuY29ubmVjdGlvbl93aW5kb3dfdGFyZ2V0ID0gREVGQVVMVF9DT05ORUNUSU9OX1dJTkRPV19UQVJHRVQ7CisgIHQtPmdsb2JhbC5waW5nX2NvdW50ZXIgPSAxOworICB0LT5nbG9iYWwucGluZ3MubmV4dCA9IHQtPmdsb2JhbC5waW5ncy5wcmV2ID0gJnQtPmdsb2JhbC5waW5nczsKKyAgdC0+cGFyc2luZy5pc19jbGllbnQgPSBpc19jbGllbnQ7CisgIHQtPnBhcnNpbmcuZGVmcmFtZV9zdGF0ZSA9CisgICAgICBpc19jbGllbnQgPyBHUlBDX0RUU19GSF8wIDogR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8wOworICB0LT53cml0aW5nLmlzX2NsaWVudCA9IGlzX2NsaWVudDsKKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfaW5pdCgKKyAgICAgICZ0LT5jaGFubmVsX2NhbGxiYWNrLnN0YXRlX3RyYWNrZXIsIEdSUENfQ0hBTk5FTF9SRUFEWSwKKyAgICAgIGlzX2NsaWVudCA/ICJjbGllbnRfdHJhbnNwb3J0IiA6ICJzZXJ2ZXJfdHJhbnNwb3J0Iik7CisKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT5nbG9iYWwucWJ1Zik7CisKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT53cml0aW5nLm91dGJ1Zik7CisgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3JfaW5pdCgmdC0+d3JpdGluZy5ocGFja19jb21wcmVzc29yKTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnQtPndyaXRpbmdfYWN0aW9uLCB3cml0aW5nX2FjdGlvbiwgdCk7CisKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT5wYXJzaW5nLnFidWYpOworICBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2luaXQoJnQtPnBhcnNpbmcuZ29hd2F5X3BhcnNlcik7CisgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9pbml0KCZ0LT5wYXJzaW5nLmhwYWNrX3BhcnNlcik7CisKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnQtPndyaXRpbmcuZG9uZV9jYiwgZ3JwY19jaHR0cDJfdGVybWluYXRlX3dyaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICZ0LT53cml0aW5nKTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnQtPnJlY3ZfZGF0YSwgcmVjdl9kYXRhLCB0KTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT5yZWFkX2J1ZmZlcik7CisKKyAgaWYgKGlzX2NsaWVudCkgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAorICAgICAgICAmdC0+Z2xvYmFsLnFidWYsCisgICAgICAgIGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcoR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSSU5HKSk7CisgIH0KKyAgLyogOCBpcyBhIHJhbmRvbSBzdGFiIGluIHRoZSBkYXJrIGFzIHRvIGEgZ29vZCBpbml0aWFsIHNpemU6IGl0J3Mgc21hbGwgZW5vdWdoCisgICAgIHRoYXQgaXQgc2hvdWxkbid0IHdhc3RlIG1lbW9yeSBmb3IgaW5mcmVxdWVudGx5IHVzZWQgY29ubmVjdGlvbnMsIHlldAorICAgICBsYXJnZSBlbm91Z2ggdGhhdCB0aGUgZXhwb25lbnRpYWwgZ3Jvd3RoIHNob3VsZCBoYXBwZW4gbmljZWx5IHdoZW4gaXQncworICAgICBuZWVkZWQuCisgICAgIFRPRE8oY3RpbGxlcik6IHR1bmUgdGhpcyAqLworICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2luaXQoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCwgOCk7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfaW5pdCgmdC0+bmV3X3N0cmVhbV9tYXAsIDgpOworCisgIC8qIGNvcHkgaW4gaW5pdGlhbCBzZXR0aW5ncyB0byBhbGwgc2V0dGluZyBzZXRzICovCisgIGZvciAoaSA9IDA7IGkgPCBHUlBDX0NIVFRQMl9OVU1fU0VUVElOR1M7IGkrKykgeworICAgIHQtPnBhcnNpbmcuc2V0dGluZ3NbaV0gPSBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJhbWV0ZXJzW2ldLmRlZmF1bHRfdmFsdWU7CisgICAgZm9yIChqID0gMDsgaiA8IEdSUENfTlVNX1NFVFRJTkdfU0VUUzsgaisrKSB7CisgICAgICB0LT5nbG9iYWwuc2V0dGluZ3Nbal1baV0gPQorICAgICAgICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcmFtZXRlcnNbaV0uZGVmYXVsdF92YWx1ZTsKKyAgICB9CisgIH0KKyAgdC0+Z2xvYmFsLmRpcnRpZWRfbG9jYWxfc2V0dGluZ3MgPSAxOworICAvKiBIYWNrOiBpdCdzIGNvbW1vbiBmb3IgaW1wbGVtZW50YXRpb25zIHRvIGFzc3VtZSA2NTUzNiBieXRlcyBpbml0aWFsIHNlbmQKKyAgICAgd2luZG93IC0tIHRoaXMgc2hvdWxkIGJ5IHJpZ2h0cyBiZSAwICovCisgIHQtPmdsb2JhbC5mb3JjZV9zZW5kX3NldHRpbmdzID0gMSA8PCBHUlBDX0NIVFRQMl9TRVRUSU5HU19JTklUSUFMX1dJTkRPV19TSVpFOworICB0LT5nbG9iYWwuc2VudF9sb2NhbF9zZXR0aW5ncyA9IDA7CisKKyAgLyogY29uZmlndXJlIGh0dHAyIHRoZSB3YXkgd2UgbGlrZSBpdCAqLworICBpZiAoaXNfY2xpZW50KSB7CisgICAgcHVzaF9zZXR0aW5nKHQsIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0VOQUJMRV9QVVNILCAwKTsKKyAgICBwdXNoX3NldHRpbmcodCwgR1JQQ19DSFRUUDJfU0VUVElOR1NfTUFYX0NPTkNVUlJFTlRfU1RSRUFNUywgMCk7CisgIH0KKyAgcHVzaF9zZXR0aW5nKHQsIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0lOSVRJQUxfV0lORE9XX1NJWkUsIERFRkFVTFRfV0lORE9XKTsKKworICBpZiAoY2hhbm5lbF9hcmdzKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxfYXJncy0+bnVtX2FyZ3M7IGkrKykgeworICAgICAgaWYgKDAgPT0KKyAgICAgICAgICBzdHJjbXAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykpIHsKKyAgICAgICAgaWYgKGlzX2NsaWVudCkgeworICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IGlzIGlnbm9yZWQgb24gdGhlIGNsaWVudCIsCisgICAgICAgICAgICAgICAgICBHUlBDX0FSR19NQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsX2FyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19JTlRFR0VSKSB7CisgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlczogbXVzdCBiZSBhbiBpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgICAgIEdSUENfQVJHX01BWF9DT05DVVJSRU5UX1NUUkVBTVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHB1c2hfc2V0dGluZyh0LCBHUlBDX0NIVFRQMl9TRVRUSU5HU19NQVhfQ09OQ1VSUkVOVF9TVFJFQU1TLAorICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNoYW5uZWxfYXJncy0+YXJnc1tpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX0lOSVRJQUxfU0VRVUVOQ0VfTlVNQkVSKSkgeworICAgICAgICBpZiAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfSU5URUdFUikgeworICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IG11c3QgYmUgYW4gaW50ZWdlciIsCisgICAgICAgICAgICAgICAgICBHUlBDX0FSR19IVFRQMl9JTklUSUFMX1NFUVVFTkNFX05VTUJFUik7CisgICAgICAgIH0gZWxzZSBpZiAoKHQtPmdsb2JhbC5uZXh0X3N0cmVhbV9pZCAmIDEpICE9CisgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyICYgMSkpIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBsb3cgYml0IG11c3QgYmUgJWQgb24gJXMiLAorICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfSU5JVElBTF9TRVFVRU5DRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICB0LT5nbG9iYWwubmV4dF9zdHJlYW1faWQgJiAxLAorICAgICAgICAgICAgICAgICAgaXNfY2xpZW50ID8gImNsaWVudCIgOiAic2VydmVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdC0+Z2xvYmFsLm5leHRfc3RyZWFtX2lkID0KKyAgICAgICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNoYW5uZWxfYXJncy0+YXJnc1tpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX1NUUkVBTV9MT09LQUhFQURfQllURVMpKSB7CisgICAgICAgIGlmIChjaGFubmVsX2FyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19JTlRFR0VSKSB7CisgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlczogbXVzdCBiZSBhbiBpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX1NUUkVBTV9MT09LQUhFQURfQllURVMpOworICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyIDw9IDUpIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBtdXN0IGJlIGF0IGxlYXN0IDUiLAorICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfU1RSRUFNX0xPT0tBSEVBRF9CWVRFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdC0+Z2xvYmFsLnN0cmVhbV9sb29rYWhlYWQgPQorICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfSFBBQ0tfVEFCTEVfU0laRV9ERUNPREVSKSkgeworICAgICAgICBpZiAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfSU5URUdFUikgeworICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IG11c3QgYmUgYW4gaW50ZWdlciIsCisgICAgICAgICAgICAgICAgICBHUlBDX0FSR19IVFRQMl9IUEFDS19UQUJMRV9TSVpFX0RFQ09ERVIpOworICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyIDwgMCkgeworICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwKKyAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX0hQQUNLX1RBQkxFX1NJWkVfREVDT0RFUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHVzaF9zZXR0aW5nKHQsIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0hFQURFUl9UQUJMRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNoYW5uZWxfYXJncy0+YXJnc1tpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX0hQQUNLX1RBQkxFX1NJWkVfRU5DT0RFUikpIHsKKyAgICAgICAgaWYgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS50eXBlICE9IEdSUENfQVJHX0lOVEVHRVIpIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBtdXN0IGJlIGFuIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfSFBBQ0tfVEFCTEVfU0laRV9FTkNPREVSKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsX2FyZ3MtPmFyZ3NbaV0udmFsdWUuaW50ZWdlciA8IDApIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsCisgICAgICAgICAgICAgICAgICBHUlBDX0FSR19IVFRQMl9IUEFDS19UQUJMRV9TSVpFX0VOQ09ERVIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF91c2FibGVfc2l6ZSgKKyAgICAgICAgICAgICAgJnQtPndyaXRpbmcuaHBhY2tfY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3RyYW5zcG9ydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKmd0KSB7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IChncnBjX2NodHRwMl90cmFuc3BvcnQgKilndDsKKworICBsb2NrKHQpOworICB0LT5kZXN0cm95aW5nID0gMTsKKyAgZHJvcF9jb25uZWN0aW9uKGV4ZWNfY3R4LCB0KTsKKyAgdW5sb2NrKGV4ZWNfY3R4LCB0KTsKKworICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJkZXN0cm95Iik7Cit9CisKKy8qKiBibG9jayBncnBjX2VuZHBvaW50X3NodXRkb3duIGJlaW5nIGNhbGxlZCB1bnRpbCBhIHBhaXJlZAorICAgIGFsbG93X2VuZHBvaW50X3NodXRkb3duIGlzIG1hZGUgKi8KK3N0YXRpYyB2b2lkIHByZXZlbnRfZW5kcG9pbnRfc2h1dGRvd24oZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7CisgIEdQUl9BU1NFUlQodC0+ZXApOworICBncHJfcmVmKCZ0LT5zaHV0ZG93bl9lcF9yZWZzKTsKK30KKworc3RhdGljIHZvaWQgYWxsb3dfZW5kcG9pbnRfc2h1dGRvd25fbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgeworICBpZiAoZ3ByX3VucmVmKCZ0LT5zaHV0ZG93bl9lcF9yZWZzKSkgeworICAgIGlmICh0LT5lcCkgeworICAgICAgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihleGVjX2N0eCwgdC0+ZXApOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBhbGxvd19lbmRwb2ludF9zaHV0ZG93bl91bmxvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgeworICBpZiAoZ3ByX3VucmVmKCZ0LT5zaHV0ZG93bl9lcF9yZWZzKSkgeworICAgIGdwcl9tdV9sb2NrKCZ0LT5tdSk7CisgICAgaWYgKHQtPmVwKSB7CisgICAgICBncnBjX2VuZHBvaW50X3NodXRkb3duKGV4ZWNfY3R4LCB0LT5lcCk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJnQtPm11KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2VuZHBvaW50KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsKKyAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCB0LT5lcCk7CisgIHQtPmVwID0gTlVMTDsKKyAgLyogc2FmZSBiZWNhdXNlIHdlJ2xsIHN0aWxsIGhhdmUgdGhlIHJlZiBmb3Igd3JpdGUgKi8KKyAgVU5SRUZfVFJBTlNQT1JUKGV4ZWNfY3R4LCB0LCAiZGlzY29ubmVjdCIpOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV90cmFuc3BvcnRfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsKKyAgaWYgKCF0LT5jbG9zZWQpIHsKKyAgICB0LT5jbG9zZWQgPSAxOworICAgIGNvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZ0LT5nbG9iYWwsIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsb3NlX3RyYW5zcG9ydCIpOworICAgIGlmICh0LT5lcCkgeworICAgICAgYWxsb3dfZW5kcG9pbnRfc2h1dGRvd25fbG9ja2VkKGV4ZWNfY3R4LCB0KTsKKyAgICB9CisKKyAgICAvKiBmbHVzaCB3cml0YWJsZSBzdHJlYW0gbGlzdCB0byBhdm9pZCBkYW5nbGluZyByZWZlcmVuY2VzICovCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmc7CisgICAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX3dyaXRhYmxlX3N0cmVhbSgKKyAgICAgICAgJnQtPmdsb2JhbCwgJnQtPndyaXRpbmcsICZzdHJlYW1fZ2xvYmFsLCAmc3RyZWFtX3dyaXRpbmcpKSB7CisgICAgICBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsICJjaHR0cDJfd3JpdGluZyIpOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX3JlZihncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBncnBjX3N0cmVhbV9yZWYoU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLT5yZWZjb3VudCwgcmVhc29uKTsKK30KK3ZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBncnBjX3N0cmVhbV91bnJlZihleGVjX2N0eCwgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLT5yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uKTsKK30KKyNlbHNlCit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9yZWYoZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgeworICBncnBjX3N0cmVhbV9yZWYoU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLT5yZWZjb3VudCk7Cit9Cit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKKyAgZ3JwY19zdHJlYW1fdW5yZWYoZXhlY19jdHgsIFNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKS0+cmVmY291bnQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9zdHJlYW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICpndCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW0gKmdzLCBncnBjX3N0cmVhbV9yZWZjb3VudCAqcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKSB7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IChncnBjX2NodHRwMl90cmFuc3BvcnQgKilndDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzID0gKGdycGNfY2h0dHAyX3N0cmVhbSAqKWdzOworCisgIG1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKworICBzLT5yZWZjb3VudCA9IHJlZmNvdW50OworICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKCZzLT5nbG9iYWwsICJjaHR0cDIiKTsKKworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMF0pOworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMV0pOworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgKKyAgICAgICZzLT5nbG9iYWwucmVjZWl2ZWRfaW5pdGlhbF9tZXRhZGF0YSk7CisgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9pbml0KAorICAgICAgJnMtPmdsb2JhbC5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSk7CisgIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2luaXQoJnMtPnBhcnNpbmcuZGF0YV9wYXJzZXIpOworICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJnMtPndyaXRpbmcuZmxvd19jb250cm9sbGVkX2J1ZmZlcik7CisKKyAgUkVGX1RSQU5TUE9SVCh0LCAic3RyZWFtIik7CisKKyAgbG9jayh0KTsKKyAgZ3JwY19jaHR0cDJfcmVnaXN0ZXJfc3RyZWFtKHQsIHMpOworICBpZiAoc2VydmVyX2RhdGEpIHsKKyAgICBHUFJfQVNTRVJUKHQtPnBhcnNpbmdfYWN0aXZlKTsKKyAgICBzLT5nbG9iYWwuaWQgPSAodWludDMyX3QpKHVpbnRwdHJfdClzZXJ2ZXJfZGF0YTsKKyAgICBzLT5wYXJzaW5nLmlkID0gcy0+Z2xvYmFsLmlkOworICAgIHMtPmdsb2JhbC5vdXRnb2luZ193aW5kb3cgPQorICAgICAgICB0LT5nbG9iYWwuc2V0dGluZ3NbR1JQQ19QRUVSX1NFVFRJTkdTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRV07CisgICAgcy0+cGFyc2luZy5pbmNvbWluZ193aW5kb3cgPSBzLT5nbG9iYWwubWF4X3JlY3ZfYnl0ZXMgPQorICAgICAgICB0LT5nbG9iYWwuc2V0dGluZ3NbR1JQQ19TRU5UX1NFVFRJTkdTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRV07CisgICAgKnQtPmFjY2VwdGluZ19zdHJlYW0gPSBzOworICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfYWRkKCZ0LT5wYXJzaW5nX3N0cmVhbV9tYXAsIHMtPmdsb2JhbC5pZCwgcyk7CisgICAgcy0+Z2xvYmFsLmluX3N0cmVhbV9tYXAgPSAxOworICB9CisgIHVubG9jayhleGVjX2N0eCwgdCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqZ3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqZ3MpIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OworICBncnBjX2NodHRwMl9zdHJlYW0gKnMgPSAoZ3JwY19jaHR0cDJfc3RyZWFtICopZ3M7CisgIGludCBpOworICBncnBjX2J5dGVfc3RyZWFtICpiczsKKworICBHUFJfVElNRVJfQkVHSU4oImRlc3Ryb3lfc3RyZWFtIiwgMCk7CisKKyAgZ3ByX211X2xvY2soJnQtPm11KTsKKworICBHUFJfQVNTRVJUKChzLT5nbG9iYWwud3JpdGVfY2xvc2VkICYmIHMtPmdsb2JhbC5yZWFkX2Nsb3NlZCkgfHwKKyAgICAgICAgICAgICBzLT5nbG9iYWwuaWQgPT0gMCk7CisgIEdQUl9BU1NFUlQoIXMtPmdsb2JhbC5pbl9zdHJlYW1fbWFwKTsKKyAgaWYgKGdycGNfY2h0dHAyX3VucmVnaXN0ZXJfc3RyZWFtKHQsIHMpICYmIHQtPmdsb2JhbC5zZW50X2dvYXdheSkgeworICAgIGNsb3NlX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIHQpOworICB9CisgIGlmICghdC0+cGFyc2luZ19hY3RpdmUgJiYgcy0+Z2xvYmFsLmlkKSB7CisgICAgR1BSX0FTU0VSVChncnBjX2NodHRwMl9zdHJlYW1fbWFwX2ZpbmQoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5nbG9iYWwuaWQpID09IE5VTEwpOworICB9CisKKyAgZ3JwY19jaHR0cDJfbGlzdF9yZW1vdmVfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgmdC0+Z2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5nbG9iYWwpOworICBncnBjX2NodHRwMl9saXN0X3JlbW92ZV9zdGFsbGVkX2J5X3RyYW5zcG9ydCgmdC0+Z2xvYmFsLCAmcy0+Z2xvYmFsKTsKKworICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7CisKKyAgZm9yIChpID0gMDsgaSA8IFNUUkVBTV9MSVNUX0NPVU5UOyBpKyspIHsKKyAgICBpZiAocy0+aW5jbHVkZWRbaV0pIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMgc3RyZWFtICVkIHN0aWxsIGluY2x1ZGVkIGluIGxpc3QgJWQiLAorICAgICAgICAgICAgICB0LT5nbG9iYWwuaXNfY2xpZW50ID8gImNsaWVudCIgOiAic2VydmVyIiwgcy0+Z2xvYmFsLmlkLCBpKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICB9CisKKyAgd2hpbGUgKAorICAgICAgKGJzID0gZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWVfcG9wKCZzLT5nbG9iYWwuaW5jb21pbmdfZnJhbWVzKSkpIHsKKyAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGJzKTsKKyAgfQorCisgIEdQUl9BU1NFUlQocy0+Z2xvYmFsLnNlbmRfaW5pdGlhbF9tZXRhZGF0YV9maW5pc2hlZCA9PSBOVUxMKTsKKyAgR1BSX0FTU0VSVChzLT5nbG9iYWwuc2VuZF9tZXNzYWdlX2ZpbmlzaGVkID09IE5VTEwpOworICBHUFJfQVNTRVJUKHMtPmdsb2JhbC5zZW5kX3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkID09IE5VTEwpOworICBHUFJfQVNTRVJUKHMtPmdsb2JhbC5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgPT0gTlVMTCk7CisgIEdQUl9BU1NFUlQocy0+Z2xvYmFsLnJlY3ZfbWVzc2FnZV9yZWFkeSA9PSBOVUxMKTsKKyAgR1BSX0FTU0VSVChzLT5nbG9iYWwucmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCA9PSBOVUxMKTsKKyAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfZGVzdHJveShleGVjX2N0eCwgJnMtPnBhcnNpbmcuZGF0YV9wYXJzZXIpOworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMF0pOworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMV0pOworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgKKyAgICAgICZzLT5nbG9iYWwucmVjZWl2ZWRfaW5pdGlhbF9tZXRhZGF0YSk7CisgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9kZXN0cm95KAorICAgICAgJnMtPmdsb2JhbC5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSk7CisgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmcy0+d3JpdGluZy5mbG93X2NvbnRyb2xsZWRfYnVmZmVyKTsKKworICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJzdHJlYW0iKTsKKworICBHUFJfVElNRVJfRU5EKCJkZXN0cm95X3N0cmVhbSIsIDApOworfQorCitncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqZ3JwY19jaHR0cDJfcGFyc2luZ19sb29rdXBfc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywgdWludDMyX3QgaWQpIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0cmFuc3BvcnRfcGFyc2luZyk7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqcyA9CisgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2ZpbmQoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCwgaWQpOworICByZXR1cm4gcyA/ICZzLT5wYXJzaW5nIDogTlVMTDsKK30KKworZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKmdycGNfY2h0dHAyX3BhcnNpbmdfYWNjZXB0X3N0cmVhbSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIHVpbnQzMl90IGlkKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqYWNjZXB0aW5nOworICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQgPSBUUkFOU1BPUlRfRlJPTV9QQVJTSU5HKHRyYW5zcG9ydF9wYXJzaW5nKTsKKyAgR1BSX0FTU0VSVCh0LT5hY2NlcHRpbmdfc3RyZWFtID09IE5VTEwpOworICB0LT5hY2NlcHRpbmdfc3RyZWFtID0gJmFjY2VwdGluZzsKKyAgdC0+Y2hhbm5lbF9jYWxsYmFjay5hY2NlcHRfc3RyZWFtKGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+Y2hhbm5lbF9jYWxsYmFjay5hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0LT5iYXNlLCAodm9pZCAqKSh1aW50cHRyX3QpaWQpOworICB0LT5hY2NlcHRpbmdfc3RyZWFtID0gTlVMTDsKKyAgcmV0dXJuICZhY2NlcHRpbmctPnBhcnNpbmc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMT0NLIE1BTkFHRU1FTlQKKyAqLworCisvKiBXZSB0YWtlIGEgZ3JwY19jaHR0cDJfdHJhbnNwb3J0LWdsb2JhbCBsb2NrIGluIHJlc3BvbnNlIHRvIGNhbGxzIGNvbWluZyBpbgorICAgZnJvbSBhYm92ZSwKKyAgIGFuZCBpbiByZXNwb25zZSB0byBkYXRhIGJlaW5nIHJlY2VpdmVkIGZyb20gYmVsb3cuIE5ldyBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAgIGlzIGFsd2F5cyBxdWV1ZWQsIGFzIGFyZSBjYWxsYmFja3MgdG8gcHJvY2VzcyBkYXRhLiBEdXJpbmcgdW5sb2NrKCkgd2UKKyAgIGNoZWNrIG91ciB0b2RvIGxpc3RzIGFuZCBpbml0aWF0ZSBjYWxsYmFja3MgYW5kIGZsdXNoIHdyaXRlcy4gKi8KKworc3RhdGljIHZvaWQgbG9jayhncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsgZ3ByX211X2xvY2soJnQtPm11KTsgfQorCitzdGF0aWMgdm9pZCB1bmxvY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgeworICBHUFJfVElNRVJfQkVHSU4oInVubG9jayIsIDApOworICBpZiAoIXQtPndyaXRpbmdfYWN0aXZlICYmICF0LT5jbG9zZWQgJiYKKyAgICAgIGdycGNfY2h0dHAyX3VubG9ja2luZ19jaGVja193cml0ZXMoZXhlY19jdHgsICZ0LT5nbG9iYWwsICZ0LT53cml0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5wYXJzaW5nX2FjdGl2ZSkpIHsKKyAgICB0LT53cml0aW5nX2FjdGl2ZSA9IDE7CisgICAgUkVGX1RSQU5TUE9SVCh0LCAid3JpdGluZyIpOworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJnQtPndyaXRpbmdfYWN0aW9uLCB0cnVlLCBOVUxMKTsKKyAgICBwcmV2ZW50X2VuZHBvaW50X3NodXRkb3duKHQpOworICB9CisgIGNoZWNrX3JlYWRfb3BzKGV4ZWNfY3R4LCAmdC0+Z2xvYmFsKTsKKworICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7CisgIEdQUl9USU1FUl9FTkQoInVubG9jayIsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT1VUUFVUIFBST0NFU1NJTkcKKyAqLworCit2b2lkIGdycGNfY2h0dHAyX2JlY29tZV93cml0YWJsZShncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgeworICBpZiAoIVRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKS0+Y2xvc2VkICYmCisgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF93cml0YWJsZV9zdHJlYW0odHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCkpIHsKKyAgICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKHN0cmVhbV9nbG9iYWwsICJjaHR0cDJfd3JpdGluZyIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfc2V0dGluZyhncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsIGdycGNfY2h0dHAyX3NldHRpbmdfaWQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIHsKKyAgY29uc3QgZ3JwY19jaHR0cDJfc2V0dGluZ19wYXJhbWV0ZXJzICpzcCA9CisgICAgICAmZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyYW1ldGVyc1tpZF07CisgIHVpbnQzMl90IHVzZV92YWx1ZSA9IEdQUl9DTEFNUCh2YWx1ZSwgc3AtPm1pbl92YWx1ZSwgc3AtPm1heF92YWx1ZSk7CisgIGlmICh1c2VfdmFsdWUgIT0gdmFsdWUpIHsKKyAgICBncHJfbG9nKEdQUl9JTkZPLCAiUmVxdWVzdGVkIHBhcmFtZXRlciAlcyBjbGFtcGVkIGZyb20gJWQgdG8gJWQiLCBzcC0+bmFtZSwKKyAgICAgICAgICAgIHZhbHVlLCB1c2VfdmFsdWUpOworICB9CisgIGlmICh1c2VfdmFsdWUgIT0gdC0+Z2xvYmFsLnNldHRpbmdzW0dSUENfTE9DQUxfU0VUVElOR1NdW2lkXSkgeworICAgIHQtPmdsb2JhbC5zZXR0aW5nc1tHUlBDX0xPQ0FMX1NFVFRJTkdTXVtpZF0gPSB1c2VfdmFsdWU7CisgICAgdC0+Z2xvYmFsLmRpcnRpZWRfbG9jYWxfc2V0dGluZ3MgPSAxOworICB9Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfdGVybWluYXRlX3dyaXRpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRyYW5zcG9ydF93cml0aW5nX3B0ciwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZyA9IHRyYW5zcG9ydF93cml0aW5nX3B0cjsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyk7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NodHRwMl90ZXJtaW5hdGVfd3JpdGluZyIsIDApOworCisgIGxvY2sodCk7CisKKyAgYWxsb3dfZW5kcG9pbnRfc2h1dGRvd25fbG9ja2VkKGV4ZWNfY3R4LCB0KTsKKworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBkcm9wX2Nvbm5lY3Rpb24oZXhlY19jdHgsIHQpOworICB9CisKKyAgZ3JwY19jaHR0cDJfY2xlYW51cF93cml0aW5nKGV4ZWNfY3R4LCAmdC0+Z2xvYmFsLCAmdC0+d3JpdGluZyk7CisKKyAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX2Nsb3NlZF93YWl0aW5nX2Zvcl93cml0aW5nKCZ0LT5nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbCkpIHsKKyAgICBmYWlsX3BlbmRpbmdfd3JpdGVzKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsKTsKKyAgICBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsICJmaW5pc2hfd3JpdGVzIik7CisgIH0KKworICAvKiBsZWF2ZSB0aGUgd3JpdGluZyBmbGFnIHVwIG9uIHNodXRkb3duIHRvIHByZXZlbnQgZnVydGhlciB3cml0ZXMgaW4gdW5sb2NrKCkKKyAgICAgZnJvbSBzdGFydGluZyAqLworICB0LT53cml0aW5nX2FjdGl2ZSA9IDA7CisgIGlmICh0LT5lcCAmJiAhdC0+ZW5kcG9pbnRfcmVhZGluZykgeworICAgIGRlc3Ryb3lfZW5kcG9pbnQoZXhlY19jdHgsIHQpOworICB9CisKKyAgdW5sb2NrKGV4ZWNfY3R4LCB0KTsKKworICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJ3cml0aW5nIik7CisKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19jaHR0cDJfdGVybWluYXRlX3dyaXRpbmciLCAwKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGluZ19hY3Rpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmd0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdWNjZXNzX2lnbm9yZWQpIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gZ3Q7CisgIEdQUl9USU1FUl9CRUdJTigid3JpdGluZ19hY3Rpb24iLCAwKTsKKyAgZ3JwY19jaHR0cDJfcGVyZm9ybV93cml0ZXMoZXhlY19jdHgsICZ0LT53cml0aW5nLCB0LT5lcCk7CisgIEdQUl9USU1FUl9FTkQoIndyaXRpbmdfYWN0aW9uIiwgMCk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfYWRkX2luY29taW5nX2dvYXdheSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICB1aW50MzJfdCBnb2F3YXlfZXJyb3IsIGdwcl9zbGljZSBnb2F3YXlfdGV4dCkgeworICBjaGFyICptc2cgPSBncHJfZHVtcF9zbGljZShnb2F3YXlfdGV4dCwgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpOworICBncHJfbG9nKEdQUl9ERUJVRywgImdvdCBnb2F3YXkgWyVkXTogJXMiLCBnb2F3YXlfZXJyb3IsIG1zZyk7CisgIGdwcl9mcmVlKG1zZyk7CisgIGdwcl9zbGljZV91bnJlZihnb2F3YXlfdGV4dCk7CisgIHRyYW5zcG9ydF9nbG9iYWwtPnNlZW5fZ29hd2F5ID0gMTsKKyAgY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvdF9nb2F3YXkiKTsKK30KKworc3RhdGljIHZvaWQgbWF5YmVfc3RhcnRfc29tZV9zdHJlYW1zKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7CisgIHVpbnQzMl90IHN0cmVhbV9pbmNvbWluZ193aW5kb3c7CisgIC8qIHN0YXJ0IHN0cmVhbXMgd2hlcmUgd2UgaGF2ZSBmcmVlIGdycGNfY2h0dHAyX3N0cmVhbSBpZHMgYW5kIGZyZWUKKyAgICogY29uY3VycmVuY3kgKi8KKyAgd2hpbGUgKHRyYW5zcG9ydF9nbG9iYWwtPm5leHRfc3RyZWFtX2lkIDw9IE1BWF9DTElFTlRfU1RSRUFNX0lEICYmCisgICAgICAgICB0cmFuc3BvcnRfZ2xvYmFsLT5jb25jdXJyZW50X3N0cmVhbV9jb3VudCA8CisgICAgICAgICAgICAgdHJhbnNwb3J0X2dsb2JhbAorICAgICAgICAgICAgICAgICAtPnNldHRpbmdzW0dSUENfUEVFUl9TRVRUSU5HU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHUlBDX0NIVFRQMl9TRVRUSU5HU19NQVhfQ09OQ1VSUkVOVF9TVFJFQU1TXSAmJgorICAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd2FpdGluZ19mb3JfY29uY3VycmVuY3kodHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1fZ2xvYmFsKSkgeworICAgIC8qIHNhZmUgc2luY2Ugd2UgY2FuJ3QgKGxlZ2FsbHkpIGJlIHBhcnNpbmcgdGhpcyBzdHJlYW0geWV0ICovCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nID0KKyAgICAgICAgJlNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKS0+cGFyc2luZzsKKyAgICBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKGdwcl9sb2coCisgICAgICAgIEdQUl9ERUJVRywgIkhUVFA6JXM6IEFsbG9jYXRpbmcgbmV3IGdycGNfY2h0dHAyX3N0cmVhbSAlcCB0byBpZCAlZCIsCisgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPmlzX2NsaWVudCA/ICJDTEkiIDogIlNWUiIsIHN0cmVhbV9nbG9iYWwsCisgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPm5leHRfc3RyZWFtX2lkKSk7CisKKyAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPmlkID09IDApOworICAgIHN0cmVhbV9nbG9iYWwtPmlkID0gc3RyZWFtX3BhcnNpbmctPmlkID0gdHJhbnNwb3J0X2dsb2JhbC0+bmV4dF9zdHJlYW1faWQ7CisgICAgdHJhbnNwb3J0X2dsb2JhbC0+bmV4dF9zdHJlYW1faWQgKz0gMjsKKworICAgIGlmICh0cmFuc3BvcnRfZ2xvYmFsLT5uZXh0X3N0cmVhbV9pZCA+PSBNQVhfQ0xJRU5UX1NUUkVBTV9JRCkgeworICAgICAgY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9fbW9yZV9zdHJlYW1faWRzIik7CisgICAgfQorCisgICAgc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93ID0KKyAgICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19QRUVSX1NFVFRJTkdTXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHUlBDX0NIVFRQMl9TRVRUSU5HU19JTklUSUFMX1dJTkRPV19TSVpFXTsKKyAgICBzdHJlYW1fcGFyc2luZy0+aW5jb21pbmdfd2luZG93ID0gc3RyZWFtX2luY29taW5nX3dpbmRvdyA9CisgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfU0VOVF9TRVRUSU5HU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRV07CisgICAgc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXMgPQorICAgICAgICBHUFJfTUFYKHN0cmVhbV9pbmNvbWluZ193aW5kb3csIHN0cmVhbV9nbG9iYWwtPm1heF9yZWN2X2J5dGVzKTsKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2FkZCgKKyAgICAgICAgJlRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKS0+bmV3X3N0cmVhbV9tYXAsCisgICAgICAgIHN0cmVhbV9nbG9iYWwtPmlkLCBTVFJFQU1fRlJPTV9HTE9CQUwoc3RyZWFtX2dsb2JhbCkpOworICAgIHN0cmVhbV9nbG9iYWwtPmluX3N0cmVhbV9tYXAgPSAxOworICAgIHRyYW5zcG9ydF9nbG9iYWwtPmNvbmN1cnJlbnRfc3RyZWFtX2NvdW50Kys7CisgICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOworICB9CisgIC8qIGNhbmNlbCBvdXQgc3RyZWFtcyB0aGF0IHdpbGwgbmV2ZXIgYmUgc3RhcnRlZCAqLworICB3aGlsZSAodHJhbnNwb3J0X2dsb2JhbC0+bmV4dF9zdHJlYW1faWQgPj0gTUFYX0NMSUVOVF9TVFJFQU1fSUQgJiYKKyAgICAgICAgIGdycGNfY2h0dHAyX2xpc3RfcG9wX3dhaXRpbmdfZm9yX2NvbmN1cnJlbmN5KHRyYW5zcG9ydF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbCkpIHsKKyAgICBjYW5jZWxfZnJvbV9hcGkoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgIEdSUENfU1RBVFVTX1VOQVZBSUxBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgZ3JwY19jbG9zdXJlICphZGRfY2xvc3VyZV9iYXJyaWVyKGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgeworICBjbG9zdXJlLT5maW5hbF9kYXRhICs9IDI7CisgIHJldHVybiBjbG9zdXJlOworfQorCit2b2lkIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqKnBjbG9zdXJlLCBpbnQgc3VjY2VzcykgeworICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUgPSAqcGNsb3N1cmU7CisgIGlmIChjbG9zdXJlID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgY2xvc3VyZS0+ZmluYWxfZGF0YSAtPSAyOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBjbG9zdXJlLT5maW5hbF9kYXRhIHw9IDE7CisgIH0KKyAgaWYgKGNsb3N1cmUtPmZpbmFsX2RhdGEgPCAyKSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCBjbG9zdXJlLT5maW5hbF9kYXRhID09IDAsIE5VTEwpOworICB9CisgICpwY2xvc3VyZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY29udGFpbnNfbm9uX29rX3N0YXR1cygKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKSB7CisgIGdycGNfbGlua2VkX21kZWxlbSAqbDsKKyAgZm9yIChsID0gYmF0Y2gtPmxpc3QuaGVhZDsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBpZiAobC0+bWQtPmtleSA9PSBHUlBDX01EU1RSX0dSUENfU1RBVFVTICYmCisgICAgICAgIGwtPm1kICE9IEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzApIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG9fbm90aGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHt9CisKK3N0YXRpYyB2b2lkIHBlcmZvcm1fc3RyZWFtX29wX2xvY2tlZCgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGU7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJwZXJmb3JtX3N0cmVhbV9vcF9sb2NrZWQiLCAwKTsKKworICBvbl9jb21wbGV0ZSA9IG9wLT5vbl9jb21wbGV0ZTsKKyAgaWYgKG9uX2NvbXBsZXRlID09IE5VTEwpIHsKKyAgICBvbl9jb21wbGV0ZSA9IGdycGNfY2xvc3VyZV9jcmVhdGUoZG9fbm90aGluZywgTlVMTCk7CisgIH0KKyAgLyogdXNlIGZpbmFsX2RhdGEgYXMgYSBiYXJyaWVyIHVudGlsIGVucXVldWUgdGltZTsgdGhlIGluaXRhbCBjb3VudGVyIGlzCisgICAgIGRyb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uICovCisgIG9uX2NvbXBsZXRlLT5maW5hbF9kYXRhID0gMjsKKworICBpZiAob3AtPmNhbmNlbF93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgeworICAgIGNhbmNlbF9mcm9tX2FwaShleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgb3AtPmNhbmNlbF93aXRoX3N0YXR1cyk7CisgIH0KKworICBpZiAob3AtPmNsb3NlX3dpdGhfc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7CisgICAgY2xvc2VfZnJvbV9hcGkoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgb3AtPmNsb3NlX3dpdGhfc3RhdHVzLCBvcC0+b3B0aW9uYWxfY2xvc2VfbWVzc2FnZSk7CisgIH0KKworICBpZiAob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGFfZmluaXNoZWQgPT0gTlVMTCk7CisgICAgc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhX2ZpbmlzaGVkID0KKyAgICAgICAgYWRkX2Nsb3N1cmVfYmFycmllcihvbl9jb21wbGV0ZSk7CisgICAgc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhID0gb3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YTsKKyAgICBpZiAoY29udGFpbnNfbm9uX29rX3N0YXR1cyh0cmFuc3BvcnRfZ2xvYmFsLCBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKSkgeworICAgICAgc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciA9IDE7CisgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgICB9CisgICAgaWYgKCFzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKKyAgICAgIGlmICh0cmFuc3BvcnRfZ2xvYmFsLT5pc19jbGllbnQpIHsKKyAgICAgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5pZCA9PSAwKTsKKyAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd2FpdGluZ19mb3JfY29uY3VycmVuY3kodHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbCk7CisgICAgICAgIG1heWJlX3N0YXJ0X3NvbWVfc3RyZWFtcyhleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPmlkICE9IDApOworICAgICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKKyAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YV9maW5pc2hlZCwgMCk7CisgICAgfQorICB9CisKKyAgaWYgKG9wLT5zZW5kX21lc3NhZ2UgIT0gTlVMTCkgeworICAgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlX2ZpbmlzaGVkID09IE5VTEwpOworICAgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlID09IE5VTEwpOworICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCA9IGFkZF9jbG9zdXJlX2JhcnJpZXIob25fY29tcGxldGUpOworICAgIGlmIChzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKKyAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKKyAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZSA9IG9wLT5zZW5kX21lc3NhZ2U7CisgICAgICBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgeworICAgICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG9wLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhICE9IE5VTEwpIHsKKyAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQgPT0gTlVMTCk7CisgICAgc3RyZWFtX2dsb2JhbC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCA9CisgICAgICAgIGFkZF9jbG9zdXJlX2JhcnJpZXIob25fY29tcGxldGUpOworICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgPSBvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YTsKKyAgICBpZiAoY29udGFpbnNfbm9uX29rX3N0YXR1cyh0cmFuc3BvcnRfZ2xvYmFsLCBvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSkpIHsKKyAgICAgIHN0cmVhbV9nbG9iYWwtPnNlZW5fZXJyb3IgPSAxOworICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgICAgfQorICAgIGlmIChzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKKyAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKKyAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQsCisgICAgICAgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9pc19lbXB0eShvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSkpOworICAgIH0gZWxzZSBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgeworICAgICAgLyogVE9ETyhjdGlsbGVyKTogY2hlY2sgaWYgdGhlcmUncyBmbG93IGNvbnRyb2wgZm9yIGFueSBvdXRzdGFuZGluZworICAgICAgICAgYnl0ZXMgYmVmb3JlIGdvaW5nIHdyaXRhYmxlICovCisgICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgICAgfQorICB9CisKKyAgaWYgKG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID09IE5VTEwpOworICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9CisgICAgICAgIG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7CisgICAgc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKKyAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgfQorCisgIGlmIChvcC0+cmVjdl9tZXNzYWdlICE9IE5VTEwpIHsKKyAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZV9yZWFkeSA9PSBOVUxMKTsKKyAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2VfcmVhZHkgPSBvcC0+cmVjdl9tZXNzYWdlX3JlYWR5OworICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZSA9IG9wLT5yZWN2X21lc3NhZ2U7CisgICAgaWYgKHN0cmVhbV9nbG9iYWwtPmlkICE9IDAgJiYKKyAgICAgICAgKHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy5oZWFkID09IE5VTEwgfHwKKyAgICAgICAgIHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy5oZWFkLT5pc190YWlsKSkgeworICAgICAgaW5jb21pbmdfYnl0ZV9zdHJlYW1fdXBkYXRlX2Zsb3dfY29udHJvbCgKKyAgICAgICAgICB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLCB0cmFuc3BvcnRfZ2xvYmFsLT5zdHJlYW1fbG9va2FoZWFkLAorICAgICAgICAgIDApOworICAgIH0KKyAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgfQorCisgIGlmIChvcC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkID09IE5VTEwpOworICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQgPQorICAgICAgICBhZGRfY2xvc3VyZV9iYXJyaWVyKG9uX2NvbXBsZXRlKTsKKyAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhID0gb3AtPnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGE7CisgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgIH0KKworICBncnBjX2NodHRwMl9jb21wbGV0ZV9jbG9zdXJlX3N0ZXAoZXhlY19jdHgsICZvbl9jb21wbGV0ZSwgMSk7CisKKyAgR1BSX1RJTUVSX0VORCgicGVyZm9ybV9zdHJlYW1fb3BfbG9ja2VkIiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZvcm1fc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqZ3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqZ3MsIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OworICBncnBjX2NodHRwMl9zdHJlYW0gKnMgPSAoZ3JwY19jaHR0cDJfc3RyZWFtICopZ3M7CisKKyAgbG9jayh0KTsKKyAgcGVyZm9ybV9zdHJlYW1fb3BfbG9ja2VkKGV4ZWNfY3R4LCAmdC0+Z2xvYmFsLCAmcy0+Z2xvYmFsLCBvcCk7CisgIHVubG9jayhleGVjX2N0eCwgdCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcGluZ19sb2NrZWQoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LCBncnBjX2Nsb3N1cmUgKm9uX3JlY3YpIHsKKyAgZ3JwY19jaHR0cDJfb3V0c3RhbmRpbmdfcGluZyAqcCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpwKSk7CisgIHAtPm5leHQgPSAmdC0+Z2xvYmFsLnBpbmdzOworICBwLT5wcmV2ID0gcC0+bmV4dC0+cHJldjsKKyAgcC0+cHJldi0+bmV4dCA9IHAtPm5leHQtPnByZXYgPSBwOworICBwLT5pZFswXSA9ICh1aW50OF90KSgodC0+Z2xvYmFsLnBpbmdfY291bnRlciA+PiA1NikgJiAweGZmKTsKKyAgcC0+aWRbMV0gPSAodWludDhfdCkoKHQtPmdsb2JhbC5waW5nX2NvdW50ZXIgPj4gNDgpICYgMHhmZik7CisgIHAtPmlkWzJdID0gKHVpbnQ4X3QpKCh0LT5nbG9iYWwucGluZ19jb3VudGVyID4+IDQwKSAmIDB4ZmYpOworICBwLT5pZFszXSA9ICh1aW50OF90KSgodC0+Z2xvYmFsLnBpbmdfY291bnRlciA+PiAzMikgJiAweGZmKTsKKyAgcC0+aWRbNF0gPSAodWludDhfdCkoKHQtPmdsb2JhbC5waW5nX2NvdW50ZXIgPj4gMjQpICYgMHhmZik7CisgIHAtPmlkWzVdID0gKHVpbnQ4X3QpKCh0LT5nbG9iYWwucGluZ19jb3VudGVyID4+IDE2KSAmIDB4ZmYpOworICBwLT5pZFs2XSA9ICh1aW50OF90KSgodC0+Z2xvYmFsLnBpbmdfY291bnRlciA+PiA4KSAmIDB4ZmYpOworICBwLT5pZFs3XSA9ICh1aW50OF90KSh0LT5nbG9iYWwucGluZ19jb3VudGVyICYgMHhmZik7CisgIHAtPm9uX3JlY3YgPSBvbl9yZWN2OworICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmdC0+Z2xvYmFsLnFidWYsIGdycGNfY2h0dHAyX3BpbmdfY3JlYXRlKDAsIHAtPmlkKSk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfYWNrX3BpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqb3BhcXVlXzhieXRlcykgeworICBncnBjX2NodHRwMl9vdXRzdGFuZGluZ19waW5nICpwaW5nOworICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQgPSBUUkFOU1BPUlRfRlJPTV9QQVJTSU5HKHRyYW5zcG9ydF9wYXJzaW5nKTsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCA9ICZ0LT5nbG9iYWw7CisgIGxvY2sodCk7CisgIGZvciAocGluZyA9IHRyYW5zcG9ydF9nbG9iYWwtPnBpbmdzLm5leHQ7IHBpbmcgIT0gJnRyYW5zcG9ydF9nbG9iYWwtPnBpbmdzOworICAgICAgIHBpbmcgPSBwaW5nLT5uZXh0KSB7CisgICAgaWYgKDAgPT0gbWVtY21wKG9wYXF1ZV84Ynl0ZXMsIHBpbmctPmlkLCA4KSkgeworICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwaW5nLT5vbl9yZWN2LCB0cnVlLCBOVUxMKTsKKyAgICAgIHBpbmctPm5leHQtPnByZXYgPSBwaW5nLT5wcmV2OworICAgICAgcGluZy0+cHJldi0+bmV4dCA9IHBpbmctPm5leHQ7CisgICAgICBncHJfZnJlZShwaW5nKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICB1bmxvY2soZXhlY19jdHgsIHQpOworfQorCitzdGF0aWMgdm9pZCBwZXJmb3JtX3RyYW5zcG9ydF9vcF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCkgeworICBib29sIGNsb3NlX3RyYW5zcG9ydCA9IGZhbHNlOworCisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb3AtPm9uX2NvbnN1bWVkLCB0cnVlLCBOVUxMKTsKKworICBpZiAob3AtPm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UgIT0gTlVMTCkgeworICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgIGV4ZWNfY3R4LCAmdC0+Y2hhbm5lbF9jYWxsYmFjay5zdGF0ZV90cmFja2VyLCBvcC0+Y29ubmVjdGl2aXR5X3N0YXRlLAorICAgICAgICBvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSk7CisgIH0KKworICBpZiAob3AtPnNlbmRfZ29hd2F5KSB7CisgICAgdC0+Z2xvYmFsLnNlbnRfZ29hd2F5ID0gMTsKKyAgICBncnBjX2NodHRwMl9nb2F3YXlfYXBwZW5kKAorICAgICAgICB0LT5nbG9iYWwubGFzdF9pbmNvbWluZ19zdHJlYW1faWQsCisgICAgICAgICh1aW50MzJfdClncnBjX2NodHRwMl9ncnBjX3N0YXR1c190b19odHRwMl9lcnJvcihvcC0+Z29hd2F5X3N0YXR1cyksCisgICAgICAgIGdwcl9zbGljZV9yZWYoKm9wLT5nb2F3YXlfbWVzc2FnZSksICZ0LT5nbG9iYWwucWJ1Zik7CisgICAgY2xvc2VfdHJhbnNwb3J0ID0gIWdycGNfY2h0dHAyX2hhc19zdHJlYW1zKHQpOworICB9CisKKyAgaWYgKG9wLT5zZXRfYWNjZXB0X3N0cmVhbSkgeworICAgIHQtPmNoYW5uZWxfY2FsbGJhY2suYWNjZXB0X3N0cmVhbSA9IG9wLT5zZXRfYWNjZXB0X3N0cmVhbV9mbjsKKyAgICB0LT5jaGFubmVsX2NhbGxiYWNrLmFjY2VwdF9zdHJlYW1fdXNlcl9kYXRhID0KKyAgICAgICAgb3AtPnNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YTsKKyAgfQorCisgIGlmIChvcC0+YmluZF9wb2xsc2V0KSB7CisgICAgYWRkX3RvX3BvbGxzZXRfbG9ja2VkKGV4ZWNfY3R4LCB0LCBvcC0+YmluZF9wb2xsc2V0KTsKKyAgfQorCisgIGlmIChvcC0+YmluZF9wb2xsc2V0X3NldCkgeworICAgIGFkZF90b19wb2xsc2V0X3NldF9sb2NrZWQoZXhlY19jdHgsIHQsIG9wLT5iaW5kX3BvbGxzZXRfc2V0KTsKKyAgfQorCisgIGlmIChvcC0+c2VuZF9waW5nKSB7CisgICAgc2VuZF9waW5nX2xvY2tlZCh0LCBvcC0+c2VuZF9waW5nKTsKKyAgfQorCisgIGlmIChvcC0+ZGlzY29ubmVjdCkgeworICAgIGNsb3NlX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIHQpOworICB9CisKKyAgaWYgKGNsb3NlX3RyYW5zcG9ydCkgeworICAgIGNsb3NlX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIHQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZvcm1fdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqZ3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3ApIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OworCisgIGxvY2sodCk7CisKKyAgLyogSWYgdGhlcmUncyBhIHNldF9hY2NlcHRfc3RyZWFtIGVuc3VyZSB0aGF0IHdlJ3JlIG5vdCBwYXJzaW5nCisgICAgIHRvIGF2b2lkIGNoYW5naW5nIHRoaW5ncyBvdXQgZnJvbSB1bmRlcm5lYXRoICovCisgIGlmICh0LT5wYXJzaW5nX2FjdGl2ZSAmJiBvcC0+c2V0X2FjY2VwdF9zdHJlYW0pIHsKKyAgICBHUFJfQVNTRVJUKHQtPnBvc3RfcGFyc2luZ19vcCA9PSBOVUxMKTsKKyAgICB0LT5wb3N0X3BhcnNpbmdfb3AgPSBncHJfbWFsbG9jKHNpemVvZigqb3ApKTsKKyAgICBtZW1jcHkodC0+cG9zdF9wYXJzaW5nX29wLCBvcCwgc2l6ZW9mKCpvcCkpOworICB9IGVsc2UgeworICAgIHBlcmZvcm1fdHJhbnNwb3J0X29wX2xvY2tlZChleGVjX2N0eCwgdCwgb3ApOworICB9CisKKyAgdW5sb2NrKGV4ZWNfY3R4LCB0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOUFVUIFBST0NFU1NJTkcKKyAqLworCitzdGF0aWMgdm9pZCBjaGVja19yZWFkX29wcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKKyAgZ3JwY19ieXRlX3N0cmVhbSAqYnM7CisgIHdoaWxlICgKKyAgICAgIGdycGNfY2h0dHAyX2xpc3RfcG9wX2NoZWNrX3JlYWRfb3BzKHRyYW5zcG9ydF9nbG9iYWwsICZzdHJlYW1fZ2xvYmFsKSkgeworICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgIT0gTlVMTCAmJgorICAgICAgICBzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfaW5pdGlhbF9tZXRhZGF0YSkgeworICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3B1Ymxpc2goCisgICAgICAgICAgJnN0cmVhbV9nbG9iYWwtPnJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGEsCisgICAgICAgICAgc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhKTsKKyAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZSgKKyAgICAgICAgICBleGVjX2N0eCwgc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5LCB0cnVlLCBOVUxMKTsKKyAgICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9IE5VTEw7CisgICAgfQorICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2VfcmVhZHkgIT0gTlVMTCkgeworICAgICAgd2hpbGUgKHN0cmVhbV9nbG9iYWwtPnNlZW5fZXJyb3IgJiYKKyAgICAgICAgICAgICAoYnMgPSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9wb3AoCisgICAgICAgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzKSkgIT0gTlVMTCkgeworICAgICAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGJzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMuaGVhZCAhPSBOVUxMKSB7CisgICAgICAgICpzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2UgPSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9wb3AoCisgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzKTsKKyAgICAgICAgR1BSX0FTU0VSVCgqc3RyZWFtX2dsb2JhbC0+cmVjdl9tZXNzYWdlICE9IE5VTEwpOworICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZV9yZWFkeSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2VfcmVhZHkgPSBOVUxMOworICAgICAgfSBlbHNlIGlmIChzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfdHJhaWxpbmdfbWV0YWRhdGEpIHsKKyAgICAgICAgKnN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZSA9IE5VTEw7CisgICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgc3RyZWFtX2dsb2JhbC0+cmVjdl9tZXNzYWdlX3JlYWR5LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZV9yZWFkeSA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkICE9IE5VTEwgJiYKKyAgICAgICAgc3RyZWFtX2dsb2JhbC0+cmVhZF9jbG9zZWQgJiYgc3RyZWFtX2dsb2JhbC0+d3JpdGVfY2xvc2VkKSB7CisgICAgICB3aGlsZSAoc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciAmJgorICAgICAgICAgICAgIChicyA9IGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlX3BvcCgKKyAgICAgICAgICAgICAgICAgICZzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMpKSAhPSBOVUxMKSB7CisgICAgICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShleGVjX2N0eCwgYnMpOworICAgICAgfQorICAgICAgaWYgKHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy5oZWFkID09IE5VTEwpIHsKKyAgICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3B1Ymxpc2goCisgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+cmVjZWl2ZWRfdHJhaWxpbmdfbWV0YWRhdGEsCisgICAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhKTsKKyAgICAgICAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKAorICAgICAgICAgICAgZXhlY19jdHgsICZzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkLCAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3N0cmVhbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCkgeworICBzaXplX3QgbmV3X3N0cmVhbV9jb3VudDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzID0KKyAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVsZXRlKCZ0LT5wYXJzaW5nX3N0cmVhbV9tYXAsIGlkKTsKKyAgaWYgKCFzKSB7CisgICAgcyA9IGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVsZXRlKCZ0LT5uZXdfc3RyZWFtX21hcCwgaWQpOworICB9CisgIEdQUl9BU1NFUlQocyk7CisgIHMtPmdsb2JhbC5pbl9zdHJlYW1fbWFwID0gMDsKKyAgaWYgKHQtPnBhcnNpbmcuaW5jb21pbmdfc3RyZWFtID09ICZzLT5wYXJzaW5nKSB7CisgICAgdC0+cGFyc2luZy5pbmNvbWluZ19zdHJlYW0gPSBOVUxMOworICAgIGdycGNfY2h0dHAyX3BhcnNpbmdfYmVjb21lX3NraXBfcGFyc2VyKGV4ZWNfY3R4LCAmdC0+cGFyc2luZyk7CisgIH0KKyAgaWYgKHMtPnBhcnNpbmcuZGF0YV9wYXJzZXIucGFyc2luZ19mcmFtZSAhPSBOVUxMKSB7CisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fZmluaXNoZWQoCisgICAgICAgIGV4ZWNfY3R4LCBzLT5wYXJzaW5nLmRhdGFfcGFyc2VyLnBhcnNpbmdfZnJhbWUsIDAsIDApOworICAgIHMtPnBhcnNpbmcuZGF0YV9wYXJzZXIucGFyc2luZ19mcmFtZSA9IE5VTEw7CisgIH0KKworICBpZiAoZ3JwY19jaHR0cDJfdW5yZWdpc3Rlcl9zdHJlYW0odCwgcykgJiYgdC0+Z2xvYmFsLnNlbnRfZ29hd2F5KSB7CisgICAgY2xvc2VfdHJhbnNwb3J0X2xvY2tlZChleGVjX2N0eCwgdCk7CisgIH0KKyAgaWYgKGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3dyaXRhYmxlX3N0cmVhbSgmdC0+Z2xvYmFsLCAmcy0+Z2xvYmFsKSkgeworICAgIEdSUENfQ0hUVFAyX1NUUkVBTV9VTlJFRihleGVjX2N0eCwgJnMtPmdsb2JhbCwgImNodHRwMl93cml0aW5nIik7CisgIH0KKworICBuZXdfc3RyZWFtX2NvdW50ID0gZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9zaXplKCZ0LT5wYXJzaW5nX3N0cmVhbV9tYXApICsKKyAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfc2l6ZSgmdC0+bmV3X3N0cmVhbV9tYXApOworICBHUFJfQVNTRVJUKG5ld19zdHJlYW1fY291bnQgPD0gVUlOVDMyX01BWCk7CisgIGlmIChuZXdfc3RyZWFtX2NvdW50ICE9IHQtPmdsb2JhbC5jb25jdXJyZW50X3N0cmVhbV9jb3VudCkgeworICAgIHQtPmdsb2JhbC5jb25jdXJyZW50X3N0cmVhbV9jb3VudCA9ICh1aW50MzJfdCluZXdfc3RyZWFtX2NvdW50OworICAgIG1heWJlX3N0YXJ0X3NvbWVfc3RyZWFtcyhleGVjX2N0eCwgJnQtPmdsb2JhbCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgY2FuY2VsX2Zyb21fYXBpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cykgeworICBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAorICAgICAgICAmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwKKyAgICAgICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUoCisgICAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5pZCwKKyAgICAgICAgICAgICh1aW50MzJfdClncnBjX2NodHRwMl9ncnBjX3N0YXR1c190b19odHRwMl9lcnJvcihzdGF0dXMpKSk7CisgIH0KKyAgZ3JwY19jaHR0cDJfZmFrZV9zdGF0dXMoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworfQorCit2b2lkIGdycGNfY2h0dHAyX2Zha2Vfc3RhdHVzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywgZ3ByX3NsaWNlICpzbGljZSkgeworICBpZiAoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7CisgICAgc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciA9IDE7CisgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgIH0KKyAgLyogc3RyZWFtX2dsb2JhbC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCBnaXZlcyB1cyBhCisgICAgIGxhc3QgY2hhbmNlIHJlcGxhY2VtZW50OiB3ZSd2ZSByZWNlaXZlZCB0cmFpbGluZyBtZXRhZGF0YSwKKyAgICAgYnV0IHNvbWV0aGluZyBtb3JlIGltcG9ydGFudCBoYXMgYmVjb21lIGF2YWlsYWJsZSB0byBzaWduYWwKKyAgICAgdG8gdGhlIHVwcGVyIGxheWVycyAtIGRyb3Agd2hhdCB3ZSd2ZSBnb3QsIGFuZCB0aGVuIHB1Ymxpc2gKKyAgICAgd2hhdCB3ZSB3YW50IC0gd2hpY2ggaXMgc2FmZSBiZWNhdXNlIHdlIGhhdmVuJ3QgdG9sZCBhbnlvbmUKKyAgICAgYWJvdXQgdGhlIG1ldGFkYXRhIHlldCAqLworICBpZiAoIXN0cmVhbV9nbG9iYWwtPnB1Ymxpc2hlZF90cmFpbGluZ19tZXRhZGF0YSB8fAorICAgICAgc3RyZWFtX2dsb2JhbC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCAhPSBOVUxMKSB7CisgICAgY2hhciBzdGF0dXNfc3RyaW5nW0dQUl9MVE9BX01JTl9CVUZTSVpFXTsKKyAgICBncHJfbHRvYShzdGF0dXMsIHN0YXR1c19zdHJpbmcpOworICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9hZGQoCisgICAgICAgICZzdHJlYW1fZ2xvYmFsLT5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSwKKyAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKAorICAgICAgICAgICAgR1JQQ19NRFNUUl9HUlBDX1NUQVRVUywgZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhzdGF0dXNfc3RyaW5nKSkpOworICAgIGlmIChzbGljZSkgeworICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2FkZCgKKyAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+cmVjZWl2ZWRfdHJhaWxpbmdfbWV0YWRhdGEsCisgICAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKAorICAgICAgICAgICAgICBHUlBDX01EU1RSX0dSUENfTUVTU0FHRSwKKyAgICAgICAgICAgICAgZ3JwY19tZHN0cl9mcm9tX3NsaWNlKGdwcl9zbGljZV9yZWYoKnNsaWNlKSkpKTsKKyAgICB9CisgICAgc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhID0gMTsKKyAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgfQorICBpZiAoc2xpY2UpIHsKKyAgICBncHJfc2xpY2VfdW5yZWYoKnNsaWNlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBmYWlsX3BlbmRpbmdfd3JpdGVzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSB7CisgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKKyAgICAgIGV4ZWNfY3R4LCAmc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhX2ZpbmlzaGVkLCAwKTsKKyAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKAorICAgICAgZXhlY19jdHgsICZzdHJlYW1fZ2xvYmFsLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkLCAwKTsKKyAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCwgMCk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbWFya19zdHJlYW1fY2xvc2VkKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwsIGludCBjbG9zZV9yZWFkcywKKyAgICBpbnQgY2xvc2Vfd3JpdGVzKSB7CisgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCAmJiBzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKKyAgICAvKiBhbHJlYWR5IGNsb3NlZCAqLworICAgIHJldHVybjsKKyAgfQorICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgaWYgKGNsb3NlX3JlYWRzICYmICFzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCkgeworICAgIHN0cmVhbV9nbG9iYWwtPnJlYWRfY2xvc2VkID0gMTsKKyAgICBzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfaW5pdGlhbF9tZXRhZGF0YSA9IDE7CisgICAgc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhID0gMTsKKyAgfQorICBpZiAoY2xvc2Vfd3JpdGVzICYmICFzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKKyAgICBzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQgPSAxOworICAgIGlmIChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCktPndyaXRpbmdfYWN0aXZlKSB7CisgICAgICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKHN0cmVhbV9nbG9iYWwsICJmaW5pc2hfd3JpdGVzIik7CisgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jbG9zZWRfd2FpdGluZ19mb3Jfd3JpdGluZyh0cmFuc3BvcnRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZhaWxfcGVuZGluZ193cml0ZXMoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwpOworICAgIH0KKyAgfQorICBpZiAoc3RyZWFtX2dsb2JhbC0+cmVhZF9jbG9zZWQgJiYgc3RyZWFtX2dsb2JhbC0+d3JpdGVfY2xvc2VkKSB7CisgICAgaWYgKHN0cmVhbV9nbG9iYWwtPmlkICE9IDAgJiYKKyAgICAgICAgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLT5wYXJzaW5nX2FjdGl2ZSkgeworICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcodHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9nbG9iYWwpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgeworICAgICAgICByZW1vdmVfc3RyZWFtKGV4ZWNfY3R4LCBUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbC0+aWQpOworICAgICAgfQorICAgICAgR1JQQ19DSFRUUDJfU1RSRUFNX1VOUkVGKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCAiY2h0dHAyIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX2Zyb21fYXBpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqb3B0aW9uYWxfbWVzc2FnZSkgeworICBncHJfc2xpY2UgaGRyOworICBncHJfc2xpY2Ugc3RhdHVzX2hkcjsKKyAgZ3ByX3NsaWNlIG1lc3NhZ2VfcGZ4OworICB1aW50OF90ICpwOworICB1aW50MzJfdCBsZW4gPSAwOworCisgIEdQUl9BU1NFUlQoc3RhdHVzID49IDAgJiYgKGludClzdGF0dXMgPCAxMDApOworCisgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCk7CisKKyAgLyogSGFuZCByb2xsIGEgaGVhZGVyIGJsb2NrLgorICAgICBUaGlzIGlzIHVubmVjZXNzYXJpbHkgdWdseSAtIGF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIGZpbmQgYSBtb3JlIGVsZWdhbnQKKyAgICAgc29sdXRpb24uCisgICAgIEl0J3MgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBvdXIgc2VuZCBtYWNoaW5lcnkgd291bGQgYmUgZGVhZCBieSB0aGUKKyAgICAgdGltZSB3ZSBnb3QgYXJvdW5kIHRvIHNlbmRpbmcgdGhpcywgc28gaW5zdGVhZCB3ZSBpZ25vcmUgSFBBQ0sgY29tcHJlc3Npb24KKyAgICAgYW5kIGp1c3Qgd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBieXRlcyBvbnRvIHRoZSB3aXJlLiAqLworICBzdGF0dXNfaGRyID0gZ3ByX3NsaWNlX21hbGxvYygxNSArIChzdGF0dXMgPj0gMTApKTsKKyAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc3RhdHVzX2hkcik7CisgICpwKysgPSAweDQwOyAvKiBsaXRlcmFsIGhlYWRlciAqLworICAqcCsrID0gMTE7ICAgLyogbGVuKGdycGMtc3RhdHVzKSAqLworICAqcCsrID0gJ2cnOworICAqcCsrID0gJ3InOworICAqcCsrID0gJ3AnOworICAqcCsrID0gJ2MnOworICAqcCsrID0gJy0nOworICAqcCsrID0gJ3MnOworICAqcCsrID0gJ3QnOworICAqcCsrID0gJ2EnOworICAqcCsrID0gJ3QnOworICAqcCsrID0gJ3UnOworICAqcCsrID0gJ3MnOworICBpZiAoc3RhdHVzIDwgMTApIHsKKyAgICAqcCsrID0gMTsKKyAgICAqcCsrID0gKHVpbnQ4X3QpKCcwJyArIHN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgKnArKyA9IDI7CisgICAgKnArKyA9ICh1aW50OF90KSgnMCcgKyAoc3RhdHVzIC8gMTApKTsKKyAgICAqcCsrID0gKHVpbnQ4X3QpKCcwJyArIChzdGF0dXMgJSAxMCkpOworICB9CisgIEdQUl9BU1NFUlQocCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihzdGF0dXNfaGRyKSk7CisgIGxlbiArPSAodWludDMyX3QpR1BSX1NMSUNFX0xFTkdUSChzdGF0dXNfaGRyKTsKKworICBpZiAob3B0aW9uYWxfbWVzc2FnZSkgeworICAgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSCgqb3B0aW9uYWxfbWVzc2FnZSkgPCAxMjcpOworICAgIG1lc3NhZ2VfcGZ4ID0gZ3ByX3NsaWNlX21hbGxvYygxNSk7CisgICAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIobWVzc2FnZV9wZngpOworICAgICpwKysgPSAweDQwOworICAgICpwKysgPSAxMjsgLyogbGVuKGdycGMtbWVzc2FnZSkgKi8KKyAgICAqcCsrID0gJ2cnOworICAgICpwKysgPSAncic7CisgICAgKnArKyA9ICdwJzsKKyAgICAqcCsrID0gJ2MnOworICAgICpwKysgPSAnLSc7CisgICAgKnArKyA9ICdtJzsKKyAgICAqcCsrID0gJ2UnOworICAgICpwKysgPSAncyc7CisgICAgKnArKyA9ICdzJzsKKyAgICAqcCsrID0gJ2EnOworICAgICpwKysgPSAnZyc7CisgICAgKnArKyA9ICdlJzsKKyAgICAqcCsrID0gKHVpbnQ4X3QpR1BSX1NMSUNFX0xFTkdUSCgqb3B0aW9uYWxfbWVzc2FnZSk7CisgICAgR1BSX0FTU0VSVChwID09IEdQUl9TTElDRV9FTkRfUFRSKG1lc3NhZ2VfcGZ4KSk7CisgICAgbGVuICs9ICh1aW50MzJfdClHUFJfU0xJQ0VfTEVOR1RIKG1lc3NhZ2VfcGZ4KTsKKyAgICBsZW4gKz0gKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgoKm9wdGlvbmFsX21lc3NhZ2UpOworICB9CisKKyAgaGRyID0gZ3ByX3NsaWNlX21hbGxvYyg5KTsKKyAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaGRyKTsKKyAgKnArKyA9ICh1aW50OF90KShsZW4gPj4gMTYpOworICAqcCsrID0gKHVpbnQ4X3QpKGxlbiA+PiA4KTsKKyAgKnArKyA9ICh1aW50OF90KShsZW4pOworICAqcCsrID0gR1JQQ19DSFRUUDJfRlJBTUVfSEVBREVSOworICAqcCsrID0gR1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9TVFJFQU0gfCBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX0hFQURFUlM7CisgICpwKysgPSAodWludDhfdCkoc3RyZWFtX2dsb2JhbC0+aWQgPj4gMjQpOworICAqcCsrID0gKHVpbnQ4X3QpKHN0cmVhbV9nbG9iYWwtPmlkID4+IDE2KTsKKyAgKnArKyA9ICh1aW50OF90KShzdHJlYW1fZ2xvYmFsLT5pZCA+PiA4KTsKKyAgKnArKyA9ICh1aW50OF90KShzdHJlYW1fZ2xvYmFsLT5pZCk7CisgIEdQUl9BU1NFUlQocCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihoZHIpKTsKKworICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwgaGRyKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF9nbG9iYWwtPnFidWYsIHN0YXR1c19oZHIpOworICBpZiAob3B0aW9uYWxfbWVzc2FnZSkgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZ0cmFuc3BvcnRfZ2xvYmFsLT5xYnVmLCBtZXNzYWdlX3BmeCk7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF9nbG9iYWwtPnFidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX3JlZigqb3B0aW9uYWxfbWVzc2FnZSkpOworICB9CisKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoCisgICAgICAmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwKKyAgICAgIGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fY3JlYXRlKHN0cmVhbV9nbG9iYWwtPmlkLCBHUlBDX0NIVFRQMl9OT19FUlJPUikpOworCisgIGlmIChvcHRpb25hbF9tZXNzYWdlKSB7CisgICAgZ3ByX3NsaWNlX3JlZigqb3B0aW9uYWxfbWVzc2FnZSk7CisgIH0KKyAgZ3JwY19jaHR0cDJfZmFrZV9zdGF0dXMoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbWVzc2FnZSk7CisgIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworfQorCitzdGF0aWMgdm9pZCBjYW5jZWxfc3RyZWFtX2NiKGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgeworICBjYW5jZWxfZnJvbV9hcGkodXNlcl9kYXRhLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgR1JQQ19TVEFUVVNfVU5BVkFJTEFCTEUpOworfQorCitzdGF0aWMgdm9pZCBlbmRfYWxsX3RoZV9jYWxscyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgeworICBncnBjX2NodHRwMl9mb3JfYWxsX3N0cmVhbXMoJnQtPmdsb2JhbCwgZXhlY19jdHgsIGNhbmNlbF9zdHJlYW1fY2IpOworfQorCitzdGF0aWMgdm9pZCBkcm9wX2Nvbm5lY3Rpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgeworICBjbG9zZV90cmFuc3BvcnRfbG9ja2VkKGV4ZWNfY3R4LCB0KTsKKyAgZW5kX2FsbF90aGVfY2FsbHMoZXhlY19jdHgsIHQpOworfQorCisvKiogdXBkYXRlIHdpbmRvdyBmcm9tIGEgc2V0dGluZ3MgY2hhbmdlICovCitzdGF0aWMgdm9pZCB1cGRhdGVfZ2xvYmFsX3dpbmRvdyh2b2lkICphcmdzLCB1aW50MzJfdCBpZCwgdm9pZCAqc3RyZWFtKSB7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IGFyZ3M7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqcyA9IHN0cmVhbTsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCA9ICZ0LT5nbG9iYWw7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwgPSAmcy0+Z2xvYmFsOworICBpbnQgd2FzX3plcm87CisgIGludCBpc196ZXJvOworICBpbnQ2NF90IGluaXRpYWxfd2luZG93X3VwZGF0ZSA9IHQtPnBhcnNpbmcuaW5pdGlhbF93aW5kb3dfdXBkYXRlOworCisgIHdhc196ZXJvID0gc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93IDw9IDA7CisgIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTSgic2V0dGluZ3MiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfd2luZG93LCBpbml0aWFsX3dpbmRvd191cGRhdGUpOworICBpc196ZXJvID0gc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93IDw9IDA7CisKKyAgaWYgKHdhc196ZXJvICYmICFpc196ZXJvKSB7CisgICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfZXJyb3JfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7CisgIHQtPmVuZHBvaW50X3JlYWRpbmcgPSAwOworICBpZiAoIXQtPndyaXRpbmdfYWN0aXZlICYmIHQtPmVwKSB7CisgICAgZGVzdHJveV9lbmRwb2ludChleGVjX2N0eCwgdCk7CisgIH0KK30KKworLyogdGNwIHJlYWQgY2FsbGJhY2sgKi8KK3N0YXRpYyB2b2lkIHJlY3ZfZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdHAsIGJvb2wgc3VjY2VzcykgeworICBzaXplX3QgaTsKKyAgaW50IGtlZXBfcmVhZGluZyA9IDA7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IHRwOworICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsID0gJnQtPmdsb2JhbDsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nID0gJnQtPnBhcnNpbmc7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJyZWN2X2RhdGEiLCAwKTsKKworICBsb2NrKHQpOworICBpID0gMDsKKyAgR1BSX0FTU0VSVCghdC0+cGFyc2luZ19hY3RpdmUpOworICBpZiAoIXQtPmNsb3NlZCkgeworICAgIHQtPnBhcnNpbmdfYWN0aXZlID0gMTsKKyAgICAvKiBtZXJnZSBzdHJlYW0gbGlzdHMgKi8KKyAgICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX21vdmVfaW50bygmdC0+bmV3X3N0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQtPnBhcnNpbmdfc3RyZWFtX21hcCk7CisgICAgZ3JwY19jaHR0cDJfcHJlcGFyZV90b19yZWFkKHRyYW5zcG9ydF9nbG9iYWwsIHRyYW5zcG9ydF9wYXJzaW5nKTsKKyAgICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7CisgICAgR1BSX1RJTUVSX0JFR0lOKCJyZWN2X2RhdGEucGFyc2UiLCAwKTsKKyAgICBmb3IgKDsgaSA8IHQtPnJlYWRfYnVmZmVyLmNvdW50ICYmCisgICAgICAgICAgIGdycGNfY2h0dHAyX3BlcmZvcm1fcmVhZChleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5yZWFkX2J1ZmZlci5zbGljZXNbaV0pOworICAgICAgICAgaSsrKQorICAgICAgOworICAgIEdQUl9USU1FUl9FTkQoInJlY3ZfZGF0YS5wYXJzZSIsIDApOworICAgIGdwcl9tdV9sb2NrKCZ0LT5tdSk7CisgICAgLyogY29weSBwYXJzaW5nIHFidWYgdG8gZ2xvYmFsIHFidWYgKi8KKyAgICBncHJfc2xpY2VfYnVmZmVyX21vdmVfaW50bygmdC0+cGFyc2luZy5xYnVmLCAmdC0+Z2xvYmFsLnFidWYpOworICAgIGlmIChpICE9IHQtPnJlYWRfYnVmZmVyLmNvdW50KSB7CisgICAgICB1bmxvY2soZXhlY19jdHgsIHQpOworICAgICAgbG9jayh0KTsKKyAgICAgIGRyb3BfY29ubmVjdGlvbihleGVjX2N0eCwgdCk7CisgICAgfQorICAgIC8qIG1lcmdlIHN0cmVhbSBsaXN0cyAqLworICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfbW92ZV9pbnRvKCZ0LT5uZXdfc3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdC0+cGFyc2luZ19zdHJlYW1fbWFwKTsKKyAgICB0cmFuc3BvcnRfZ2xvYmFsLT5jb25jdXJyZW50X3N0cmVhbV9jb3VudCA9CisgICAgICAgICh1aW50MzJfdClncnBjX2NodHRwMl9zdHJlYW1fbWFwX3NpemUoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCk7CisgICAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbml0aWFsX3dpbmRvd191cGRhdGUgIT0gMCkgeworICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9mb3JfZWFjaCgmdC0+cGFyc2luZ19zdHJlYW1fbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfZ2xvYmFsX3dpbmRvdywgdCk7CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5pdGlhbF93aW5kb3dfdXBkYXRlID0gMDsKKyAgICB9CisgICAgLyogaGFuZGxlIGhpZ2hlciBsZXZlbCB0aGluZ3MgKi8KKyAgICBncnBjX2NodHRwMl9wdWJsaXNoX3JlYWRzKGV4ZWNfY3R4LCB0cmFuc3BvcnRfZ2xvYmFsLCB0cmFuc3BvcnRfcGFyc2luZyk7CisgICAgdC0+cGFyc2luZ19hY3RpdmUgPSAwOworICAgIC8qIGhhbmRsZSBkZWxheWVkIHRyYW5zcG9ydCBvcHMgKGlmIHRoZXJlIGlzIG9uZSkgKi8KKyAgICBpZiAodC0+cG9zdF9wYXJzaW5nX29wKSB7CisgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3AgPSB0LT5wb3N0X3BhcnNpbmdfb3A7CisgICAgICB0LT5wb3N0X3BhcnNpbmdfb3AgPSBOVUxMOworICAgICAgcGVyZm9ybV90cmFuc3BvcnRfb3BfbG9ja2VkKGV4ZWNfY3R4LCB0LCBvcCk7CisgICAgICBncHJfZnJlZShvcCk7CisgICAgfQorICAgIC8qIGlmIGEgc3RyZWFtIGlzIGluIHRoZSBzdHJlYW0gbWFwLCBhbmQgZ2V0cyBjYW5jZWxsZWQsIHdlIG5lZWQgdG8gZW5zdXJlCisgICAgICogd2UgYXJlIG5vdCBwYXJzaW5nIGJlZm9yZSBjb250aW51aW5nIHRoZSBjYW5jZWxsYXRpb24gdG8ga2VlcCB0aGluZ3MgaW4KKyAgICAgKiBhIHNhbmUgc3RhdGUgKi8KKyAgICB3aGlsZSAoZ3JwY19jaHR0cDJfbGlzdF9wb3BfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcodHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9nbG9iYWwpKSB7CisgICAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPmluX3N0cmVhbV9tYXApOworICAgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpOworICAgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCk7CisgICAgICByZW1vdmVfc3RyZWFtKGV4ZWNfY3R4LCB0LCBzdHJlYW1fZ2xvYmFsLT5pZCk7CisgICAgICBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsICJjaHR0cDIiKTsKKyAgICB9CisgIH0KKyAgaWYgKCFzdWNjZXNzIHx8IGkgIT0gdC0+cmVhZF9idWZmZXIuY291bnQgfHwgdC0+Y2xvc2VkKSB7CisgICAgZHJvcF9jb25uZWN0aW9uKGV4ZWNfY3R4LCB0KTsKKyAgICByZWFkX2Vycm9yX2xvY2tlZChleGVjX2N0eCwgdCk7CisgIH0gZWxzZSBpZiAoIXQtPmNsb3NlZCkgeworICAgIGtlZXBfcmVhZGluZyA9IDE7CisgICAgUkVGX1RSQU5TUE9SVCh0LCAia2VlcF9yZWFkaW5nIik7CisgICAgcHJldmVudF9lbmRwb2ludF9zaHV0ZG93bih0KTsKKyAgfQorICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZigmdC0+cmVhZF9idWZmZXIpOworICB1bmxvY2soZXhlY19jdHgsIHQpOworCisgIGlmIChrZWVwX3JlYWRpbmcpIHsKKyAgICBncnBjX2VuZHBvaW50X3JlYWQoZXhlY19jdHgsIHQtPmVwLCAmdC0+cmVhZF9idWZmZXIsICZ0LT5yZWN2X2RhdGEpOworICAgIGFsbG93X2VuZHBvaW50X3NodXRkb3duX3VubG9ja2VkKGV4ZWNfY3R4LCB0KTsKKyAgICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJrZWVwX3JlYWRpbmciKTsKKyAgfSBlbHNlIHsKKyAgICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJyZWN2X2RhdGEiKTsKKyAgfQorCisgIEdQUl9USU1FUl9FTkQoInJlY3ZfZGF0YSIsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0FMTEJBQ0sgTE9PUAorICovCisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGUsIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKAorICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJzZXQgY29ubmVjdGl2aXR5X3N0YXRlPSVkIiwgc3RhdGUpKTsKKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KAorICAgICAgZXhlY19jdHgsCisgICAgICAmVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLT5jaGFubmVsX2NhbGxiYWNrLnN0YXRlX3RyYWNrZXIsCisgICAgICBzdGF0ZSwgcmVhc29uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBPTExTRVQgU1RVRkYKKyAqLworCitzdGF0aWMgdm9pZCBhZGRfdG9fcG9sbHNldF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgeworICBpZiAodC0+ZXApIHsKKyAgICBncnBjX2VuZHBvaW50X2FkZF90b19wb2xsc2V0KGV4ZWNfY3R4LCB0LT5lcCwgcG9sbHNldCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgYWRkX3RvX3BvbGxzZXRfc2V0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldCkgeworICBpZiAodC0+ZXApIHsKKyAgICBncnBjX2VuZHBvaW50X2FkZF90b19wb2xsc2V0X3NldChleGVjX2N0eCwgdC0+ZXAsIHBvbGxzZXRfc2V0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKmd0LAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW0gKmdzLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OworICBsb2NrKHQpOworICBhZGRfdG9fcG9sbHNldF9sb2NrZWQoZXhlY19jdHgsIHQsIHBvbGxzZXQpOworICB1bmxvY2soZXhlY19jdHgsIHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQllURSBTVFJFQU0KKyAqLworCitzdGF0aWMgdm9pZCBpbmNvbWluZ19ieXRlX3N0cmVhbV91cGRhdGVfZmxvd19jb250cm9sKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwgc2l6ZV90IG1heF9zaXplX2hpbnQsCisgICAgc2l6ZV90IGhhdmVfYWxyZWFkeSkgeworICB1aW50MzJfdCBtYXhfcmVjdl9ieXRlczsKKworICAvKiBjbGFtcCBtYXggcmVjdiBoaW50IHRvIGFuIGFsbG93YWJsZSBzaXplICovCisgIGlmIChtYXhfc2l6ZV9oaW50ID49IFVJTlQzMl9NQVggLSB0cmFuc3BvcnRfZ2xvYmFsLT5zdHJlYW1fbG9va2FoZWFkKSB7CisgICAgbWF4X3JlY3ZfYnl0ZXMgPSBVSU5UMzJfTUFYIC0gdHJhbnNwb3J0X2dsb2JhbC0+c3RyZWFtX2xvb2thaGVhZDsKKyAgfSBlbHNlIHsKKyAgICBtYXhfcmVjdl9ieXRlcyA9ICh1aW50MzJfdCltYXhfc2l6ZV9oaW50OworICB9CisKKyAgLyogYWNjb3VudCBmb3IgYnl0ZXMgYWxyZWFkeSByZWNlaXZlZCBidXQgdW5rbm93biB0byBoaWdoZXIgbGF5ZXJzICovCisgIGlmIChtYXhfcmVjdl9ieXRlcyA+PSBoYXZlX2FscmVhZHkpIHsKKyAgICBtYXhfcmVjdl9ieXRlcyAtPSAodWludDMyX3QpaGF2ZV9hbHJlYWR5OworICB9IGVsc2UgeworICAgIG1heF9yZWN2X2J5dGVzID0gMDsKKyAgfQorCisgIC8qIGFkZCBzb21lIHNtYWxsIGxvb2thaGVhZCB0byBrZWVwIHBpcGVsaW5lcyBmbG93aW5nICovCisgIEdQUl9BU1NFUlQobWF4X3JlY3ZfYnl0ZXMgPD0gVUlOVDMyX01BWCAtIHRyYW5zcG9ydF9nbG9iYWwtPnN0cmVhbV9sb29rYWhlYWQpOworICBtYXhfcmVjdl9ieXRlcyArPSB0cmFuc3BvcnRfZ2xvYmFsLT5zdHJlYW1fbG9va2FoZWFkOworICBpZiAoc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXMgPCBtYXhfcmVjdl9ieXRlcykgeworICAgIHVpbnQzMl90IGFkZF9tYXhfcmVjdl9ieXRlcyA9CisgICAgICAgIG1heF9yZWN2X2J5dGVzIC0gc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXM7CisgICAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfU1RSRUFNKCJvcCIsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9yZWN2X2J5dGVzLCBhZGRfbWF4X3JlY3ZfYnl0ZXMpOworICAgIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTSgib3AiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3BhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbWF4X3JlY3ZfYnl0ZXMpOworICAgIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTSgib3AiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3dyaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tYXhfcmVjdl9ieXRlcyk7CisgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSh0cmFuc3BvcnRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbCk7CisgICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOworICB9Cit9CisKK3N0YXRpYyBpbnQgaW5jb21pbmdfYnl0ZV9zdHJlYW1fbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKnNsaWNlLCBzaXplX3QgbWF4X3NpemVfaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7CisgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpicyA9CisgICAgICAoZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKilieXRlX3N0cmVhbTsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCA9ICZicy0+dHJhbnNwb3J0LT5nbG9iYWw7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwgPSAmYnMtPnN0cmVhbS0+Z2xvYmFsOworCisgIGxvY2soYnMtPnRyYW5zcG9ydCk7CisgIGlmIChicy0+aXNfdGFpbCkgeworICAgIGluY29taW5nX2J5dGVfc3RyZWFtX3VwZGF0ZV9mbG93X2NvbnRyb2wodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplX2hpbnQsIGJzLT5zbGljZXMubGVuZ3RoKTsKKyAgfQorICBpZiAoYnMtPnNsaWNlcy5jb3VudCA+IDApIHsKKyAgICAqc2xpY2UgPSBncHJfc2xpY2VfYnVmZmVyX3Rha2VfZmlyc3QoJmJzLT5zbGljZXMpOworICAgIHVubG9jayhleGVjX2N0eCwgYnMtPnRyYW5zcG9ydCk7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoYnMtPmZhaWxlZCkgeworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb25fY29tcGxldGUsIGZhbHNlLCBOVUxMKTsKKyAgICB1bmxvY2soZXhlY19jdHgsIGJzLT50cmFuc3BvcnQpOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGJzLT5vbl9uZXh0ID0gb25fY29tcGxldGU7CisgICAgYnMtPm5leHQgPSBzbGljZTsKKyAgICB1bmxvY2soZXhlY19jdHgsIGJzLT50cmFuc3BvcnQpOworICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluY29taW5nX2J5dGVfc3RyZWFtX3VucmVmKGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpicykgeworICBpZiAoZ3ByX3VucmVmKCZicy0+cmVmcykpIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJmJzLT5zbGljZXMpOworICAgIGdwcl9mcmVlKGJzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBpbmNvbWluZ19ieXRlX3N0cmVhbV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSkgeworICBpbmNvbWluZ19ieXRlX3N0cmVhbV91bnJlZigoZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKilieXRlX3N0cmVhbSk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fcHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIHNsaWNlKSB7CisgIGdwcl9tdV9sb2NrKCZicy0+dHJhbnNwb3J0LT5tdSk7CisgIGlmIChicy0+b25fbmV4dCAhPSBOVUxMKSB7CisgICAgKmJzLT5uZXh0ID0gc2xpY2U7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBicy0+b25fbmV4dCwgdHJ1ZSwgTlVMTCk7CisgICAgYnMtPm9uX25leHQgPSBOVUxMOworICB9IGVsc2UgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZicy0+c2xpY2VzLCBzbGljZSk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmYnMtPnRyYW5zcG9ydC0+bXUpOworfQorCit2b2lkIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2ZpbmlzaGVkKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqYnMsIGludCBzdWNjZXNzLAorICAgIGludCBmcm9tX3BhcnNpbmdfdGhyZWFkKSB7CisgIGlmICghc3VjY2VzcykgeworICAgIGlmIChmcm9tX3BhcnNpbmdfdGhyZWFkKSB7CisgICAgICBncHJfbXVfbG9jaygmYnMtPnRyYW5zcG9ydC0+bXUpOworICAgIH0KKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGJzLT5vbl9uZXh0LCBmYWxzZSwgTlVMTCk7CisgICAgYnMtPm9uX25leHQgPSBOVUxMOworICAgIGJzLT5mYWlsZWQgPSAxOworICAgIGlmIChmcm9tX3BhcnNpbmdfdGhyZWFkKSB7CisgICAgICBncHJfbXVfdW5sb2NrKCZicy0+dHJhbnNwb3J0LT5tdSk7CisgICAgfQorICB9IGVsc2UgeworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAoZnJvbV9wYXJzaW5nX3RocmVhZCkgeworICAgICAgZ3ByX211X2xvY2soJmJzLT50cmFuc3BvcnQtPm11KTsKKyAgICB9CisgICAgR1BSX0FTU0VSVChicy0+b25fbmV4dCA9PSBOVUxMKTsKKyAgICBpZiAoZnJvbV9wYXJzaW5nX3RocmVhZCkgeworICAgICAgZ3ByX211X3VubG9jaygmYnMtPnRyYW5zcG9ydC0+bXUpOworICAgIH0KKyNlbmRpZgorICB9CisgIGluY29taW5nX2J5dGVfc3RyZWFtX3VucmVmKGJzKTsKK30KKworZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKmdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2NyZWF0ZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgdWludDMyX3QgZnJhbWVfc2l6ZSwKKyAgICB1aW50MzJfdCBmbGFncywgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgKmFkZF90b19xdWV1ZSkgeworICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqaW5jb21pbmdfYnl0ZV9zdHJlYW0gPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoKmluY29taW5nX2J5dGVfc3RyZWFtKSk7CisgIGluY29taW5nX2J5dGVfc3RyZWFtLT5iYXNlLmxlbmd0aCA9IGZyYW1lX3NpemU7CisgIGluY29taW5nX2J5dGVfc3RyZWFtLT5iYXNlLmZsYWdzID0gZmxhZ3M7CisgIGluY29taW5nX2J5dGVfc3RyZWFtLT5iYXNlLm5leHQgPSBpbmNvbWluZ19ieXRlX3N0cmVhbV9uZXh0OworICBpbmNvbWluZ19ieXRlX3N0cmVhbS0+YmFzZS5kZXN0cm95ID0gaW5jb21pbmdfYnl0ZV9zdHJlYW1fZGVzdHJveTsKKyAgZ3ByX3JlZl9pbml0KCZpbmNvbWluZ19ieXRlX3N0cmVhbS0+cmVmcywgMik7CisgIGluY29taW5nX2J5dGVfc3RyZWFtLT5uZXh0X21lc3NhZ2UgPSBOVUxMOworICBpbmNvbWluZ19ieXRlX3N0cmVhbS0+dHJhbnNwb3J0ID0gVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0cmFuc3BvcnRfcGFyc2luZyk7CisgIGluY29taW5nX2J5dGVfc3RyZWFtLT5zdHJlYW0gPSBTVFJFQU1fRlJPTV9QQVJTSU5HKHN0cmVhbV9wYXJzaW5nKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZpbmNvbWluZ19ieXRlX3N0cmVhbS0+c2xpY2VzKTsKKyAgaW5jb21pbmdfYnl0ZV9zdHJlYW0tPm9uX25leHQgPSBOVUxMOworICBpbmNvbWluZ19ieXRlX3N0cmVhbS0+aXNfdGFpbCA9IDE7CisgIGluY29taW5nX2J5dGVfc3RyZWFtLT5mYWlsZWQgPSAwOworICBpZiAoYWRkX3RvX3F1ZXVlLT5oZWFkID09IE5VTEwpIHsKKyAgICBhZGRfdG9fcXVldWUtPmhlYWQgPSBpbmNvbWluZ19ieXRlX3N0cmVhbTsKKyAgfSBlbHNlIHsKKyAgICBhZGRfdG9fcXVldWUtPnRhaWwtPmlzX3RhaWwgPSAwOworICAgIGFkZF90b19xdWV1ZS0+dGFpbC0+bmV4dF9tZXNzYWdlID0gaW5jb21pbmdfYnl0ZV9zdHJlYW07CisgIH0KKyAgYWRkX3RvX3F1ZXVlLT50YWlsID0gaW5jb21pbmdfYnl0ZV9zdHJlYW07CisgIHJldHVybiBpbmNvbWluZ19ieXRlX3N0cmVhbTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRSQUNJTkcKKyAqLworCitzdGF0aWMgY2hhciAqZm9ybWF0X2Zsb3djdGxfY29udGV4dF92YXIoY29uc3QgY2hhciAqY29udGV4dCwgY29uc3QgY2hhciAqdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsLCB1aW50MzJfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqc2NvcGUpIHsKKyAgY2hhciAqdW5kZXJzY29yZV9wb3M7CisgIGNoYXIgKnJlc3VsdDsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkgeworICAgICpzY29wZSA9IE5VTEw7CisgICAgZ3ByX2FzcHJpbnRmKCZyZXN1bHQsICIlcyglbGxkKSIsIHZhciwgdmFsKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHVuZGVyc2NvcmVfcG9zID0gc3RyY2hyKGNvbnRleHQsICdfJyk7CisgICpzY29wZSA9IGdwcl9zdHJkdXAoY29udGV4dCk7CisgICgqc2NvcGUpW3VuZGVyc2NvcmVfcG9zIC0gY29udGV4dF0gPSAwOworICBpZiAoaWQgIT0gMCkgeworICAgIGNoYXIgKnRtcCA9ICpzY29wZTsKKyAgICBncHJfYXNwcmludGYoc2NvcGUsICIlc1slZF0iLCB0bXAsIGlkKTsKKyAgICBncHJfZnJlZSh0bXApOworICB9CisgIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAiJXMuJXMoJWxsZCkiLCB1bmRlcnNjb3JlX3BvcyArIDEsIHZhciwgdmFsKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBzYW1lc3RyKGNoYXIgKmEsIGNoYXIgKmIpIHsKKyAgaWYgKGEgPT0gTlVMTCkgeworICAgIHJldHVybiBiID09IE5VTEw7CisgIH0KKyAgaWYgKGIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwID09IHN0cmNtcChhLCBiKTsKK30KKwordm9pZCBncnBjX2NodHRwMl9mbG93Y3RsX3RyYWNlKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpwaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9mbG93Y3RsX29wIG9wLCBjb25zdCBjaGFyICpjb250ZXh0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXIxLCBjb25zdCBjaGFyICpjb250ZXh0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXIyLCBpbnQgaXNfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwgaW50NjRfdCB2YWwxLCBpbnQ2NF90IHZhbDIpIHsKKyAgY2hhciAqc2NvcGUxOworICBjaGFyICpzY29wZTI7CisgIGNoYXIgKmxhYmVsMSA9CisgICAgICBmb3JtYXRfZmxvd2N0bF9jb250ZXh0X3Zhcihjb250ZXh0MSwgdmFyMSwgdmFsMSwgc3RyZWFtX2lkLCAmc2NvcGUxKTsKKyAgY2hhciAqbGFiZWwyID0KKyAgICAgIGZvcm1hdF9mbG93Y3RsX2NvbnRleHRfdmFyKGNvbnRleHQyLCB2YXIyLCB2YWwyLCBzdHJlYW1faWQsICZzY29wZTIpOworICBjaGFyICpjbGlzdnIgPSBpc19jbGllbnQgPyAiY2xpZW50IiA6ICJzZXJ2ZXIiOworICBjaGFyICpwcmVmaXg7CisKKyAgZ3ByX2FzcHJpbnRmKCZwcmVmaXgsICJGTE9XICUgOHM6ICVzICUgMTFzICIsIHBoYXNlLCBjbGlzdnIsIHNjb3BlMSk7CisKKyAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgR1JQQ19DSFRUUDJfRkxPV0NUTF9NT1ZFOgorICAgICAgR1BSX0FTU0VSVChzYW1lc3RyKHNjb3BlMSwgc2NvcGUyKSk7CisgICAgICBpZiAodmFsMiAhPSAwKSB7CisgICAgICAgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKKyAgICAgICAgICAgICAgICAiJXNNT1ZFICAgJSA0MHMgPC0gJSA0MHMgZ2l2aW5nICVkIiwgcHJlZml4LCBsYWJlbDEsIGxhYmVsMiwKKyAgICAgICAgICAgICAgICB2YWwxICsgdmFsMik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0ZMT1dDVExfQ1JFRElUOgorICAgICAgR1BSX0FTU0VSVCh2YWwyID49IDApOworICAgICAgaWYgKHZhbDIgIT0gMCkgeworICAgICAgICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCisgICAgICAgICAgICAgICAgIiVzQ1JFRElUICUgNDBzIGJ5ICUgNDBzIGdpdmluZyAlZCIsIHByZWZpeCwgbGFiZWwxLCBsYWJlbDIsCisgICAgICAgICAgICAgICAgdmFsMSArIHZhbDIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9GTE9XQ1RMX0RFQklUOgorICAgICAgR1BSX0FTU0VSVCh2YWwyID49IDApOworICAgICAgaWYgKHZhbDIgIT0gMCkgeworICAgICAgICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCisgICAgICAgICAgICAgICAgIiVzREVCSVQgICUgNDBzIGJ5ICUgNDBzIGdpdmluZyAlZCIsIHByZWZpeCwgbGFiZWwxLCBsYWJlbDIsCisgICAgICAgICAgICAgICAgdmFsMSAtIHZhbDIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICBncHJfZnJlZShzY29wZTEpOworICBncHJfZnJlZShzY29wZTIpOworICBncHJfZnJlZShsYWJlbDEpOworICBncHJfZnJlZShsYWJlbDIpOworICBncHJfZnJlZShwcmVmaXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5URUdSQVRJT04gR0xVRQorICovCisKK3N0YXRpYyBjaGFyICpjaHR0cDJfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICp0KSB7CisgIHJldHVybiBncHJfc3RyZHVwKCgoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICopdCktPnBlZXJfc3RyaW5nKTsKK30KKworc3RhdGljIGNvbnN0IGdycGNfdHJhbnNwb3J0X3Z0YWJsZSB2dGFibGUgPSB7c2l6ZW9mKGdycGNfY2h0dHAyX3N0cmVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2h0dHAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3BvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtX3N0cmVhbV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1fdHJhbnNwb3J0X29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodHRwMl9nZXRfcGVlcn07CisKK2dycGNfdHJhbnNwb3J0ICpncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqY2hhbm5lbF9hcmdzLAorICAgIGdycGNfZW5kcG9pbnQgKmVwLCBpbnQgaXNfY2xpZW50KSB7CisgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY2h0dHAyX3RyYW5zcG9ydCkpOworICBpbml0X3RyYW5zcG9ydChleGVjX2N0eCwgdCwgY2hhbm5lbF9hcmdzLCBlcCwgaXNfY2xpZW50ICE9IDApOworICByZXR1cm4gJnQtPmJhc2U7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3N0YXJ0X3JlYWRpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqc2xpY2VzLCBzaXplX3QgbnNsaWNlcykgeworICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQgPSAoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICopdHJhbnNwb3J0OworICBSRUZfVFJBTlNQT1JUKHQsICJyZWN2X2RhdGEiKTsgLyogbWF0Y2hlcyB1bnJlZiBpbnNpZGUgcmVjdl9kYXRhICovCisgIGdwcl9zbGljZV9idWZmZXJfYWRkbigmdC0+cmVhZF9idWZmZXIsIHNsaWNlcywgbnNsaWNlcyk7CisgIHJlY3ZfZGF0YShleGVjX2N0eCwgdCwgMSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJmOWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaApAQCAtMCwwICsxLDUxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIgorCitleHRlcm4gaW50IGdycGNfaHR0cF90cmFjZTsKK2V4dGVybiBpbnQgZ3JwY19mbG93Y3RsX3RyYWNlOworCitncnBjX3RyYW5zcG9ydCAqZ3JwY19jcmVhdGVfY2h0dHAyX3RyYW5zcG9ydCgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmNoYW5uZWxfYXJncywKKyAgICBncnBjX2VuZHBvaW50ICplcCwgaW50IGlzX2NsaWVudCk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3N0YXJ0X3JlYWRpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqc2xpY2VzLCBzaXplX3QgbnNsaWNlcyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMxMWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorCisvKiBDb21tb24gZGVmaW5pdGlvbnMgZm9yIGZyYW1lIGhhbmRsaW5nIGluIHRoZSBjaHR0cDIgdHJhbnNwb3J0ICovCisKK3R5cGVkZWYgZW51bSB7CisgIEdSUENfQ0hUVFAyX1BBUlNFX09LLAorICBHUlBDX0NIVFRQMl9TVFJFQU1fRVJST1IsCisgIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1IKK30gZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3I7CisKKy8qIGRlZmluZWQgaW4gaW50ZXJuYWwuaCAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmc7Cit0eXBlZGVmIHN0cnVjdCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZzsKKworI2RlZmluZSBHUlBDX0NIVFRQMl9GUkFNRV9EQVRBIDAKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfSEVBREVSIDEKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfQ09OVElOVUFUSU9OIDkKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfUlNUX1NUUkVBTSAzCisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZSQU1FX1NFVFRJTkdTIDQKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfUElORyA2CisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZSQU1FX0dPQVdBWSA3CisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZSQU1FX1dJTkRPV19VUERBVEUgOAorCisjZGVmaW5lIEdSUENfQ0hUVFAyX01BWF9QQVlMT0FEX0xFTkdUSCAoKDEgPDwgMTQpIC0gMSkKKworI2RlZmluZSBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSAxCisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZMQUdfQUNLIDEKKyNkZWZpbmUgR1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9IRUFERVJTIDQKKyNkZWZpbmUgR1JQQ19DSFRUUDJfREFUQV9GTEFHX1BBRERFRCA4CisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZMQUdfSEFTX1BSSU9SSVRZIDB4MjAKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfRlJBTUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkNjI0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCisKK2dycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2luaXQoCisgICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlcikgeworICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GSF8wOworICBwYXJzZXItPnBhcnNpbmdfZnJhbWUgPSBOVUxMOworICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9kYXRhX3BhcnNlciAqcGFyc2VyKSB7CisgIGdycGNfYnl0ZV9zdHJlYW0gKmJzOworICBpZiAocGFyc2VyLT5wYXJzaW5nX2ZyYW1lKSB7CisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fZmluaXNoZWQoZXhlY19jdHgsIHBhcnNlci0+cGFyc2luZ19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxKTsKKyAgfQorICB3aGlsZSAoCisgICAgICAoYnMgPSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9wb3AoJnBhcnNlci0+aW5jb21pbmdfZnJhbWVzKSkpIHsKKyAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGJzKTsKKyAgfQorfQorCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9iZWdpbl9mcmFtZSgKKyAgICBncnBjX2NodHRwMl9kYXRhX3BhcnNlciAqcGFyc2VyLCB1aW50OF90IGZsYWdzKSB7CisgIGlmIChmbGFncyAmIH5HUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAidW5zdXBwb3J0ZWQgZGF0YSBmbGFnczogMHglMDJ4IiwgZmxhZ3MpOworICAgIHJldHVybiBHUlBDX0NIVFRQMl9TVFJFQU1fRVJST1I7CisgIH0KKworICBpZiAoZmxhZ3MgJiBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSkgeworICAgIHBhcnNlci0+aXNfbGFzdF9mcmFtZSA9IDE7CisgIH0gZWxzZSB7CisgICAgcGFyc2VyLT5pc19sYXN0X2ZyYW1lID0gMDsKKyAgfQorCisgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKK30KKwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9tZXJnZSgKKyAgICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqaGVhZF9kc3QsCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgKnRhaWxfc3JjKSB7CisgIGlmICh0YWlsX3NyYy0+aGVhZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGhlYWRfZHN0LT5oZWFkID09IE5VTEwpIHsKKyAgICAqaGVhZF9kc3QgPSAqdGFpbF9zcmM7CisgICAgbWVtc2V0KHRhaWxfc3JjLCAwLCBzaXplb2YoKnRhaWxfc3JjKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaGVhZF9kc3QtPnRhaWwtPm5leHRfbWVzc2FnZSA9IHRhaWxfc3JjLT5oZWFkOworICBoZWFkX2RzdC0+dGFpbCA9IHRhaWxfc3JjLT50YWlsOworICBtZW1zZXQodGFpbF9zcmMsIDAsIHNpemVvZigqdGFpbF9zcmMpKTsKK30KKworZ3JwY19ieXRlX3N0cmVhbSAqZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWVfcG9wKAorICAgIGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlICpxKSB7CisgIGdycGNfYnl0ZV9zdHJlYW0gKm91dDsKKyAgaWYgKHEtPmhlYWQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIG91dCA9ICZxLT5oZWFkLT5iYXNlOworICBpZiAocS0+aGVhZCA9PSBxLT50YWlsKSB7CisgICAgbWVtc2V0KHEsIDAsIHNpemVvZigqcSkpOworICB9IGVsc2UgeworICAgIHEtPmhlYWQgPSBxLT5oZWFkLT5uZXh0X21lc3NhZ2U7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKwordm9pZCBncnBjX2NodHRwMl9lbmNvZGVfZGF0YSh1aW50MzJfdCBpZCwgZ3ByX3NsaWNlX2J1ZmZlciAqaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2J5dGVzLCBpbnQgaXNfZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpvdXRidWYpIHsKKyAgZ3ByX3NsaWNlIGhkcjsKKyAgdWludDhfdCAqcDsKKworICBoZHIgPSBncHJfc2xpY2VfbWFsbG9jKDkpOworICBwID0gR1BSX1NMSUNFX1NUQVJUX1BUUihoZHIpOworICBHUFJfQVNTRVJUKHdyaXRlX2J5dGVzIDwgKDEgPDwgMjQpKTsKKyAgKnArKyA9ICh1aW50OF90KSh3cml0ZV9ieXRlcyA+PiAxNik7CisgICpwKysgPSAodWludDhfdCkod3JpdGVfYnl0ZXMgPj4gOCk7CisgICpwKysgPSAodWludDhfdCkod3JpdGVfYnl0ZXMpOworICAqcCsrID0gR1JQQ19DSFRUUDJfRlJBTUVfREFUQTsKKyAgKnArKyA9IGlzX2VvZiA/IEdSUENfQ0hUVFAyX0RBVEFfRkxBR19FTkRfU1RSRUFNIDogMDsKKyAgKnArKyA9ICh1aW50OF90KShpZCA+PiAyNCk7CisgICpwKysgPSAodWludDhfdCkoaWQgPj4gMTYpOworICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDgpOworICAqcCsrID0gKHVpbnQ4X3QpKGlkKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQob3V0YnVmLCBoZHIpOworCisgIGdwcl9zbGljZV9idWZmZXJfbW92ZV9maXJzdChpbmJ1Ziwgd3JpdGVfYnl0ZXMsIG91dGJ1Zik7Cit9CisKK2dycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX3BhcnNlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgeworICB1aW50OF90ICpjb25zdCBiZWcgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKKyAgdWludDhfdCAqY29uc3QgZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpOworICB1aW50OF90ICpjdXIgPSBiZWc7CisgIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyICpwID0gcGFyc2VyOworICB1aW50MzJfdCBtZXNzYWdlX2ZsYWdzOworICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqaW5jb21pbmdfYnl0ZV9zdHJlYW07CisKKyAgaWYgKGlzX2xhc3QgJiYgcC0+aXNfbGFzdF9mcmFtZSkgeworICAgIHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9jbG9zZSA9IDE7CisgIH0KKworICBpZiAoY3VyID09IGVuZCkgeworICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgfQorCisgIHN3aXRjaCAocC0+c3RhdGUpIHsKKyAgZmhfMDoKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0RBVEFfRkhfMDoKKyAgICAgIHAtPmZyYW1lX3R5cGUgPSAqY3VyOworICAgICAgc3dpdGNoIChwLT5mcmFtZV90eXBlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBwLT5pc19mcmFtZV9jb21wcmVzc2VkID0gMDsgLyogR1BSX0ZBTFNFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBwLT5pc19mcmFtZV9jb21wcmVzc2VkID0gMTsgLyogR1BSX1RSVUUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkJhZCBHUlBDIGZyYW1lIHR5cGUgMHglMDJ4IiwgcC0+ZnJhbWVfdHlwZSk7CisgICAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1NUUkVBTV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9EQVRBX0ZIXzE7CisgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgIH0KKyAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgR1JQQ19DSFRUUDJfREFUQV9GSF8xOgorICAgICAgcC0+ZnJhbWVfc2l6ZSA9ICgodWludDMyX3QpKmN1cikgPDwgMjQ7CisgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7CisgICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GSF8yOworICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICB9CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0RBVEFfRkhfMjoKKyAgICAgIHAtPmZyYW1lX3NpemUgfD0gKCh1aW50MzJfdCkqY3VyKSA8PCAxNjsKKyAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9EQVRBX0ZIXzM7CisgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgIH0KKyAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgR1JQQ19DSFRUUDJfREFUQV9GSF8zOgorICAgICAgcC0+ZnJhbWVfc2l6ZSB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDg7CisgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7CisgICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GSF80OworICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICB9CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0RBVEFfRkhfNDoKKyAgICAgIHAtPmZyYW1lX3NpemUgfD0gKCh1aW50MzJfdCkqY3VyKTsKKyAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GUkFNRTsKKyAgICAgICsrY3VyOworICAgICAgbWVzc2FnZV9mbGFncyA9IDA7CisgICAgICBpZiAocC0+aXNfZnJhbWVfY29tcHJlc3NlZCkgeworICAgICAgICBtZXNzYWdlX2ZsYWdzIHw9IEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1M7CisgICAgICB9CisgICAgICBwLT5wYXJzaW5nX2ZyYW1lID0gaW5jb21pbmdfYnl0ZV9zdHJlYW0gPQorICAgICAgICAgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2NyZWF0ZSgKKyAgICAgICAgICAgICAgZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCBzdHJlYW1fcGFyc2luZywgcC0+ZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgbWVzc2FnZV9mbGFncywgJnAtPmluY29taW5nX2ZyYW1lcyk7CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0RBVEFfRlJBTUU6CisgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKHRyYW5zcG9ydF9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wYXJzaW5nKTsKKyAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICAgICAgfQorICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfcGFyc2luZ19zZWVuX3N0cmVhbSh0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmcpOworICAgICAgaWYgKCh1aW50MzJfdCkoZW5kIC0gY3VyKSA9PSBwLT5mcmFtZV9zaXplKSB7CisgICAgICAgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX3B1c2goCisgICAgICAgICAgICBleGVjX2N0eCwgcC0+cGFyc2luZ19mcmFtZSwKKyAgICAgICAgICAgIGdwcl9zbGljZV9zdWIoc2xpY2UsIChzaXplX3QpKGN1ciAtIGJlZyksIChzaXplX3QpKGVuZCAtIGJlZykpKTsKKyAgICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fZmluaXNoZWQoZXhlY19jdHgsIHAtPnBhcnNpbmdfZnJhbWUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBwLT5wYXJzaW5nX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9EQVRBX0ZIXzA7CisgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KShlbmQgLSBjdXIpID4gcC0+ZnJhbWVfc2l6ZSkgeworICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9wdXNoKAorICAgICAgICAgICAgZXhlY19jdHgsIHAtPnBhcnNpbmdfZnJhbWUsCisgICAgICAgICAgICBncHJfc2xpY2Vfc3ViKHNsaWNlLCAoc2l6ZV90KShjdXIgLSBiZWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KShjdXIgKyBwLT5mcmFtZV9zaXplIC0gYmVnKSkpOworICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9maW5pc2hlZChleGVjX2N0eCwgcC0+cGFyc2luZ19mcmFtZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIHAtPnBhcnNpbmdfZnJhbWUgPSBOVUxMOworICAgICAgICBjdXIgKz0gcC0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgZ290byBmaF8wOyAvKiBsb29wICovCisgICAgICB9IGVsc2UgeworICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9wdXNoKAorICAgICAgICAgICAgZXhlY19jdHgsIHAtPnBhcnNpbmdfZnJhbWUsCisgICAgICAgICAgICBncHJfc2xpY2Vfc3ViKHNsaWNlLCAoc2l6ZV90KShjdXIgLSBiZWcpLCAoc2l6ZV90KShlbmQgLSBiZWcpKSk7CisgICAgICAgIEdQUl9BU1NFUlQoKHNpemVfdCkoZW5kIC0gY3VyKSA8PSBwLT5mcmFtZV9zaXplKTsKKyAgICAgICAgcC0+ZnJhbWVfc2l6ZSAtPSAodWludDMyX3QpKGVuZCAtIGN1cik7CisgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgIH0KKyAgfQorCisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzYyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfRlJBTUVfREFUQV9ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfRlJBTUVfREFUQV9ICisKKy8qIFBhcnNlciBmb3IgR1JQQyBzdHJlYW1zIGVtYmVkZGVkIGluIERBVEEgZnJhbWVzICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIgorCit0eXBlZGVmIGVudW0geworICBHUlBDX0NIVFRQMl9EQVRBX0ZIXzAsCisgIEdSUENfQ0hUVFAyX0RBVEFfRkhfMSwKKyAgR1JQQ19DSFRUUDJfREFUQV9GSF8yLAorICBHUlBDX0NIVFRQMl9EQVRBX0ZIXzMsCisgIEdSUENfQ0hUVFAyX0RBVEFfRkhfNCwKKyAgR1JQQ19DSFRUUDJfREFUQV9GUkFNRQorfSBncnBjX2NodHRwMl9zdHJlYW1fc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW07CisKK3R5cGVkZWYgc3RydWN0IGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlIHsKKyAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKmhlYWQ7CisgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICp0YWlsOworfSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NodHRwMl9zdHJlYW1fc3RhdGUgc3RhdGU7CisgIHVpbnQ4X3QgaXNfbGFzdF9mcmFtZTsKKyAgdWludDhfdCBmcmFtZV90eXBlOworICB1aW50MzJfdCBmcmFtZV9zaXplOworCisgIGludCBpc19mcmFtZV9jb21wcmVzc2VkOworICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSBpbmNvbWluZ19mcmFtZXM7CisgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpwYXJzaW5nX2ZyYW1lOworfSBncnBjX2NodHRwMl9kYXRhX3BhcnNlcjsKKwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9tZXJnZSgKKyAgICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqaGVhZF9kc3QsCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgKnRhaWxfc3JjKTsKK2dycGNfYnl0ZV9zdHJlYW0gKmdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlX3BvcCgKKyAgICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqcSk7CisKKy8qIGluaXRpYWxpemUgcGVyLXN0cmVhbSBzdGF0ZSBmb3IgZGF0YSBmcmFtZSBwYXJzaW5nICovCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9pbml0KAorICAgIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyICpwYXJzZXIpOworCit2b2lkIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlcik7CisKKy8qIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgZGF0YSBmcmFtZSAqLworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfYmVnaW5fZnJhbWUoCisgICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlciwgdWludDhfdCBmbGFncyk7CisKKy8qIGhhbmRsZSBhIHNsaWNlIG9mIGEgZGF0YSBmcmFtZSAtIGlzX2xhc3QgaW5kaWNhdGVzIHRoZSBsYXN0IHNsaWNlIG9mIGEKKyAgIGZyYW1lICovCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9wYXJzZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOworCit2b2lkIGdycGNfY2h0dHAyX2VuY29kZV9kYXRhKHVpbnQzMl90IGlkLCBncHJfc2xpY2VfYnVmZmVyICppbmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfYnl0ZXMsIGludCBpc19lb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKm91dGJ1Zik7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTdmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKwordm9pZCBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2luaXQoZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlciAqcCkgeworICBwLT5kZWJ1Z19kYXRhID0gTlVMTDsKK30KKwordm9pZCBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2Rlc3Ryb3koZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlciAqcCkgeworICBncHJfZnJlZShwLT5kZWJ1Z19kYXRhKTsKK30KKworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlcl9iZWdpbl9mcmFtZSgKKyAgICBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyICpwLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MpIHsKKyAgaWYgKGxlbmd0aCA8IDgpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImdvYXdheSBmcmFtZSB0b28gc2hvcnQgKCVkIGJ5dGVzKSIsIGxlbmd0aCk7CisgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7CisgIH0KKworICBncHJfZnJlZShwLT5kZWJ1Z19kYXRhKTsKKyAgcC0+ZGVidWdfbGVuZ3RoID0gbGVuZ3RoIC0gODsKKyAgcC0+ZGVidWdfZGF0YSA9IGdwcl9tYWxsb2MocC0+ZGVidWdfbGVuZ3RoKTsKKyAgcC0+ZGVidWdfcG9zID0gMDsKKyAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMDsKKyAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworfQorCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX3BhcnNlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgeworICB1aW50OF90ICpjb25zdCBiZWcgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKKyAgdWludDhfdCAqY29uc3QgZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpOworICB1aW50OF90ICpjdXIgPSBiZWc7CisgIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXIgKnAgPSBwYXJzZXI7CisKKyAgc3dpdGNoIChwLT5zdGF0ZSkgeworICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTA6CisgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kwOworICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICB9CisgICAgICBwLT5sYXN0X3N0cmVhbV9pZCA9ICgodWludDMyX3QpKmN1cikgPDwgMjQ7CisgICAgICArK2N1cjsKKyAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTE6CisgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kxOworICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICB9CisgICAgICBwLT5sYXN0X3N0cmVhbV9pZCB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDE2OworICAgICAgKytjdXI7CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kyOgorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMjsKKyAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICAgICAgfQorICAgICAgcC0+bGFzdF9zdHJlYW1faWQgfD0gKCh1aW50MzJfdCkqY3VyKSA8PCA4OworICAgICAgKytjdXI7CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kzOgorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMzsKKyAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICAgICAgfQorICAgICAgcC0+bGFzdF9zdHJlYW1faWQgfD0gKCh1aW50MzJfdCkqY3VyKTsKKyAgICAgICsrY3VyOworICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMDoKKyAgICAgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfR09BV0FZX0VSUjA7CisgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgIH0KKyAgICAgIHAtPmVycm9yX2NvZGUgPSAoKHVpbnQzMl90KSpjdXIpIDw8IDI0OworICAgICAgKytjdXI7CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIxOgorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMTsKKyAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICAgICAgfQorICAgICAgcC0+ZXJyb3JfY29kZSB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDE2OworICAgICAgKytjdXI7CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIyOgorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMjsKKyAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICAgICAgfQorICAgICAgcC0+ZXJyb3JfY29kZSB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDg7CisgICAgICArK2N1cjsKKyAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0VSUjM6CisgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIzOworICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICB9CisgICAgICBwLT5lcnJvcl9jb2RlIHw9ICgodWludDMyX3QpKmN1cik7CisgICAgICArK2N1cjsKKyAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0RFQlVHOgorICAgICAgbWVtY3B5KHAtPmRlYnVnX2RhdGEgKyBwLT5kZWJ1Z19wb3MsIGN1ciwgKHNpemVfdCkoZW5kIC0gY3VyKSk7CisgICAgICBHUFJfQVNTRVJUKChzaXplX3QpKGVuZCAtIGN1cikgPCBVSU5UMzJfTUFYIC0gcC0+ZGVidWdfcG9zKTsKKyAgICAgIHAtPmRlYnVnX3BvcyArPSAodWludDMyX3QpKGVuZCAtIGN1cik7CisgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9ERUJVRzsKKyAgICAgIGlmIChpc19sYXN0KSB7CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfcmVjZWl2ZWQgPSAxOworICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X2xhc3Rfc3RyZWFtX2luZGV4ID0gcC0+bGFzdF9zdHJlYW1faWQ7CisgICAgICAgIGdwcl9zbGljZV91bnJlZih0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X3RleHQpOworICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X2Vycm9yID0gKGdycGNfc3RhdHVzX2NvZGUpcC0+ZXJyb3JfY29kZTsKKyAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmdvYXdheV90ZXh0ID0KKyAgICAgICAgICAgIGdwcl9zbGljZV9uZXcocC0+ZGVidWdfZGF0YSwgcC0+ZGVidWdfbGVuZ3RoLCBncHJfZnJlZSk7CisgICAgICAgIHAtPmRlYnVnX2RhdGEgPSBOVUxMOworICAgICAgfQorICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICB9CisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SKTsKK30KKwordm9pZCBncnBjX2NodHRwMl9nb2F3YXlfYXBwZW5kKHVpbnQzMl90IGxhc3Rfc3RyZWFtX2lkLCB1aW50MzJfdCBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBkZWJ1Z19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnNsaWNlX2J1ZmZlcikgeworICBncHJfc2xpY2UgaGVhZGVyID0gZ3ByX3NsaWNlX21hbGxvYyg5ICsgNCArIDQpOworICB1aW50OF90ICpwID0gR1BSX1NMSUNFX1NUQVJUX1BUUihoZWFkZXIpOworICB1aW50MzJfdCBmcmFtZV9sZW5ndGg7CisgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChkZWJ1Z19kYXRhKSA8IFVJTlQzMl9NQVggLSA0IC0gNCk7CisgIGZyYW1lX2xlbmd0aCA9IDQgKyA0ICsgKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgoZGVidWdfZGF0YSk7CisKKyAgLyogZnJhbWUgaGVhZGVyOiBsZW5ndGggKi8KKyAgKnArKyA9ICh1aW50OF90KShmcmFtZV9sZW5ndGggPj4gMTYpOworICAqcCsrID0gKHVpbnQ4X3QpKGZyYW1lX2xlbmd0aCA+PiA4KTsKKyAgKnArKyA9ICh1aW50OF90KShmcmFtZV9sZW5ndGgpOworICAvKiBmcmFtZSBoZWFkZXI6IHR5cGUgKi8KKyAgKnArKyA9IEdSUENfQ0hUVFAyX0ZSQU1FX0dPQVdBWTsKKyAgLyogZnJhbWUgaGVhZGVyOiBmbGFncyAqLworICAqcCsrID0gMDsKKyAgLyogZnJhbWUgaGVhZGVyOiBzdHJlYW0gaWQgKi8KKyAgKnArKyA9IDA7CisgICpwKysgPSAwOworICAqcCsrID0gMDsKKyAgKnArKyA9IDA7CisgIC8qIHBheWxvYWQ6IGxhc3Qgc3RyZWFtIGlkICovCisgICpwKysgPSAodWludDhfdCkobGFzdF9zdHJlYW1faWQgPj4gMjQpOworICAqcCsrID0gKHVpbnQ4X3QpKGxhc3Rfc3RyZWFtX2lkID4+IDE2KTsKKyAgKnArKyA9ICh1aW50OF90KShsYXN0X3N0cmVhbV9pZCA+PiA4KTsKKyAgKnArKyA9ICh1aW50OF90KShsYXN0X3N0cmVhbV9pZCk7CisgIC8qIHBheWxvYWQ6IGVycm9yIGNvZGUgKi8KKyAgKnArKyA9ICh1aW50OF90KShlcnJvcl9jb2RlID4+IDI0KTsKKyAgKnArKyA9ICh1aW50OF90KShlcnJvcl9jb2RlID4+IDE2KTsKKyAgKnArKyA9ICh1aW50OF90KShlcnJvcl9jb2RlID4+IDgpOworICAqcCsrID0gKHVpbnQ4X3QpKGVycm9yX2NvZGUpOworICBHUFJfQVNTRVJUKHAgPT0gR1BSX1NMSUNFX0VORF9QVFIoaGVhZGVyKSk7CisgIGdwcl9zbGljZV9idWZmZXJfYWRkKHNsaWNlX2J1ZmZlciwgaGVhZGVyKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoc2xpY2VfYnVmZmVyLCBkZWJ1Z19kYXRhKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU1MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9HT0FXQVlfSAorI2RlZmluZSBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX0dPQVdBWV9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTAsCisgIEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kxLAorICBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMiwKKyAgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTMsCisgIEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIwLAorICBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMSwKKyAgR1JQQ19DSFRUUDJfR09BV0FZX0VSUjIsCisgIEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIzLAorICBHUlBDX0NIVFRQMl9HT0FXQVlfREVCVUcKK30gZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZV9zdGF0ZSBzdGF0ZTsKKyAgdWludDMyX3QgbGFzdF9zdHJlYW1faWQ7CisgIHVpbnQzMl90IGVycm9yX2NvZGU7CisgIGNoYXIgKmRlYnVnX2RhdGE7CisgIHVpbnQzMl90IGRlYnVnX2xlbmd0aDsKKyAgdWludDMyX3QgZGVidWdfcG9zOworfSBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyOworCit2b2lkIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfaW5pdChncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyICpwKTsKK3ZvaWQgZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlcl9kZXN0cm95KGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXIgKnApOworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlcl9iZWdpbl9mcmFtZSgKKyAgICBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncyk7CitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX3BhcnNlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfZ29hd2F5X2FwcGVuZCh1aW50MzJfdCBsYXN0X3N0cmVhbV9pZCwgdWludDMyX3QgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgZGVidWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZV9idWZmZXIpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9HT0FXQVlfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxOTJhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworZ3ByX3NsaWNlIGdycGNfY2h0dHAyX3BpbmdfY3JlYXRlKHVpbnQ4X3QgYWNrLCB1aW50OF90ICpvcGFxdWVfOGJ5dGVzKSB7CisgIGdwcl9zbGljZSBzbGljZSA9IGdwcl9zbGljZV9tYWxsb2MoOSArIDgpOworICB1aW50OF90ICpwID0gR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSk7CisKKyAgKnArKyA9IDA7CisgICpwKysgPSAwOworICAqcCsrID0gODsKKyAgKnArKyA9IEdSUENfQ0hUVFAyX0ZSQU1FX1BJTkc7CisgICpwKysgPSBhY2sgPyAxIDogMDsKKyAgKnArKyA9IDA7CisgICpwKysgPSAwOworICAqcCsrID0gMDsKKyAgKnArKyA9IDA7CisgIG1lbWNweShwLCBvcGFxdWVfOGJ5dGVzLCA4KTsKKworICByZXR1cm4gc2xpY2U7Cit9CisKK2dycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgIGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncykgeworICBpZiAoZmxhZ3MgJiAweGZlIHx8IGxlbmd0aCAhPSA4KSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIHBpbmc6IGxlbmd0aD0lZCwgZmxhZ3M9JTAyeCIsIGxlbmd0aCwgZmxhZ3MpOworICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOworICB9CisgIHBhcnNlci0+Ynl0ZSA9IDA7CisgIHBhcnNlci0+aXNfYWNrID0gZmxhZ3M7CisgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKK30KKworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfcGluZ19wYXJzZXJfcGFyc2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KSB7CisgIHVpbnQ4X3QgKmNvbnN0IGJlZyA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOworICB1aW50OF90ICpjb25zdCBlbmQgPSBHUFJfU0xJQ0VfRU5EX1BUUihzbGljZSk7CisgIHVpbnQ4X3QgKmN1ciA9IGJlZzsKKyAgZ3JwY19jaHR0cDJfcGluZ19wYXJzZXIgKnAgPSBwYXJzZXI7CisKKyAgd2hpbGUgKHAtPmJ5dGUgIT0gOCAmJiBjdXIgIT0gZW5kKSB7CisgICAgcC0+b3BhcXVlXzhieXRlc1twLT5ieXRlXSA9ICpjdXI7CisgICAgY3VyKys7CisgICAgcC0+Ynl0ZSsrOworICB9CisKKyAgaWYgKHAtPmJ5dGUgPT0gOCkgeworICAgIEdQUl9BU1NFUlQoaXNfbGFzdCk7CisgICAgaWYgKHAtPmlzX2FjaykgeworICAgICAgZ3JwY19jaHR0cDJfYWNrX3BpbmcoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCBwLT5vcGFxdWVfOGJ5dGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF9wYXJzaW5nLT5xYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfcGluZ19jcmVhdGUoMSwgcC0+b3BhcXVlXzhieXRlcykpOworICAgIH0KKyAgfQorCisgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9QSU5HX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9QSU5HX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgYnl0ZTsKKyAgdWludDhfdCBpc19hY2s7CisgIHVpbnQ4X3Qgb3BhcXVlXzhieXRlc1s4XTsKK30gZ3JwY19jaHR0cDJfcGluZ19wYXJzZXI7CisKK2dwcl9zbGljZSBncnBjX2NodHRwMl9waW5nX2NyZWF0ZSh1aW50OF90IGFjaywgdWludDhfdCAqb3BhcXVlXzhieXRlcyk7CisKK2dycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgIGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncyk7CitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9waW5nX3BhcnNlcl9wYXJzZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9QSU5HX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmMgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmMzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiCisKK2dwcl9zbGljZSBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX2NyZWF0ZSh1aW50MzJfdCBpZCwgdWludDMyX3QgY29kZSkgeworICBncHJfc2xpY2Ugc2xpY2UgPSBncHJfc2xpY2VfbWFsbG9jKDEzKTsKKyAgdWludDhfdCAqcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOworCisgICpwKysgPSAwOworICAqcCsrID0gMDsKKyAgKnArKyA9IDQ7CisgICpwKysgPSBHUlBDX0NIVFRQMl9GUkFNRV9SU1RfU1RSRUFNOworICAqcCsrID0gMDsKKyAgKnArKyA9ICh1aW50OF90KShpZCA+PiAyNCk7CisgICpwKysgPSAodWludDhfdCkoaWQgPj4gMTYpOworICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDgpOworICAqcCsrID0gKHVpbnQ4X3QpKGlkKTsKKyAgKnArKyA9ICh1aW50OF90KShjb2RlID4+IDI0KTsKKyAgKnArKyA9ICh1aW50OF90KShjb2RlID4+IDE2KTsKKyAgKnArKyA9ICh1aW50OF90KShjb2RlID4+IDgpOworICAqcCsrID0gKHVpbnQ4X3QpKGNvZGUpOworCisgIHJldHVybiBzbGljZTsKK30KKworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXJfYmVnaW5fZnJhbWUoCisgICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXIgKnBhcnNlciwgdWludDMyX3QgbGVuZ3RoLCB1aW50OF90IGZsYWdzKSB7CisgIGlmIChsZW5ndGggIT0gNCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCByc3Rfc3RyZWFtOiBsZW5ndGg9JWQsIGZsYWdzPSUwMngiLCBsZW5ndGgsCisgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7CisgIH0KKyAgcGFyc2VyLT5ieXRlID0gMDsKKyAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworfQorCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX3BhcnNlcl9wYXJzZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpIHsKKyAgdWludDhfdCAqY29uc3QgYmVnID0gR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSk7CisgIHVpbnQ4X3QgKmNvbnN0IGVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKHNsaWNlKTsKKyAgdWludDhfdCAqY3VyID0gYmVnOworICBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX3BhcnNlciAqcCA9IHBhcnNlcjsKKworICB3aGlsZSAocC0+Ynl0ZSAhPSA0ICYmIGN1ciAhPSBlbmQpIHsKKyAgICBwLT5yZWFzb25fYnl0ZXNbcC0+Ynl0ZV0gPSAqY3VyOworICAgIGN1cisrOworICAgIHAtPmJ5dGUrKzsKKyAgfQorCisgIGlmIChwLT5ieXRlID09IDQpIHsKKyAgICBHUFJfQVNTRVJUKGlzX2xhc3QpOworICAgIHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9jbG9zZSA9IDE7CisgICAgc3RyZWFtX3BhcnNpbmctPnNhd19yc3Rfc3RyZWFtID0gMTsKKyAgICBzdHJlYW1fcGFyc2luZy0+cnN0X3N0cmVhbV9yZWFzb24gPSAoKCh1aW50MzJfdClwLT5yZWFzb25fYnl0ZXNbMF0pIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpcC0+cmVhc29uX2J5dGVzWzFdKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KXAtPnJlYXNvbl9ieXRlc1syXSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KXAtPnJlYXNvbl9ieXRlc1szXSkpOworICB9CisKKyAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0ZjEzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX1JTVF9TVFJFQU1fSAorI2RlZmluZSBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX1JTVF9TVFJFQU1fSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBieXRlOworICB1aW50OF90IHJlYXNvbl9ieXRlc1s0XTsKK30gZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXI7CisKK2dwcl9zbGljZSBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX2NyZWF0ZSh1aW50MzJfdCBzdHJlYW1faWQsIHVpbnQzMl90IGNvZGUpOworCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX3BhcnNlcl9iZWdpbl9mcmFtZSgKKyAgICBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MpOworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXJfcGFyc2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfRlJBTUVfUlNUX1NUUkVBTV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OWQ4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgiCisKKyNkZWZpbmUgTUFYX01BWF9IRUFERVJfTElTVF9TSVpFICgxMDI0ICogMTAyNCAqIDEwMjQpCisKKy8qIEhUVFAvMiBtYW5kYXRlZCBpbml0aWFsIGNvbm5lY3Rpb24gc2V0dGluZ3MgKi8KK2NvbnN0IGdycGNfY2h0dHAyX3NldHRpbmdfcGFyYW1ldGVycworICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcmFtZXRlcnNbR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTXSA9IHsKKyAgICAgICAge05VTEwsIDAsIDAsIDAsIEdSUENfQ0hUVFAyX0RJU0NPTk5FQ1RfT05fSU5WQUxJRF9WQUxVRSwKKyAgICAgICAgIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SfSwKKyAgICAgICAgeyJIRUFERVJfVEFCTEVfU0laRSIsIDQwOTYsIDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICBHUlBDX0NIVFRQMl9DTEFNUF9JTlZBTElEX1ZBTFVFLCBHUlBDX0NIVFRQMl9QUk9UT0NPTF9FUlJPUn0sCisgICAgICAgIHsiRU5BQkxFX1BVU0giLCAxLCAwLCAxLCBHUlBDX0NIVFRQMl9ESVNDT05ORUNUX09OX0lOVkFMSURfVkFMVUUsCisgICAgICAgICBHUlBDX0NIVFRQMl9QUk9UT0NPTF9FUlJPUn0sCisgICAgICAgIHsiTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyIsIDB4ZmZmZmZmZmZ1LCAwLCAweGZmZmZmZmZmdSwKKyAgICAgICAgIEdSUENfQ0hUVFAyX0RJU0NPTk5FQ1RfT05fSU5WQUxJRF9WQUxVRSwgR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1J9LAorICAgICAgICB7IklOSVRJQUxfV0lORE9XX1NJWkUiLCA2NTUzNSwgMCwgMHg3ZmZmZmZmZnUsCisgICAgICAgICBHUlBDX0NIVFRQMl9ESVNDT05ORUNUX09OX0lOVkFMSURfVkFMVUUsCisgICAgICAgICBHUlBDX0NIVFRQMl9GTE9XX0NPTlRST0xfRVJST1J9LAorICAgICAgICB7Ik1BWF9GUkFNRV9TSVpFIiwgMTYzODQsIDE2Mzg0LCAxNjc3NzIxNSwKKyAgICAgICAgIEdSUENfQ0hUVFAyX0RJU0NPTk5FQ1RfT05fSU5WQUxJRF9WQUxVRSwgR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1J9LAorICAgICAgICB7Ik1BWF9IRUFERVJfTElTVF9TSVpFIiwgTUFYX01BWF9IRUFERVJfTElTVF9TSVpFLCAwLAorICAgICAgICAgTUFYX01BWF9IRUFERVJfTElTVF9TSVpFLCBHUlBDX0NIVFRQMl9DTEFNUF9JTlZBTElEX1ZBTFVFLAorICAgICAgICAgR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1J9LAorfTsKKworc3RhdGljIHVpbnQ4X3QgKmZpbGxfaGVhZGVyKHVpbnQ4X3QgKm91dCwgdWludDMyX3QgbGVuZ3RoLCB1aW50OF90IGZsYWdzKSB7CisgICpvdXQrKyA9ICh1aW50OF90KShsZW5ndGggPj4gMTYpOworICAqb3V0KysgPSAodWludDhfdCkobGVuZ3RoID4+IDgpOworICAqb3V0KysgPSAodWludDhfdCkobGVuZ3RoKTsKKyAgKm91dCsrID0gR1JQQ19DSFRUUDJfRlJBTUVfU0VUVElOR1M7CisgICpvdXQrKyA9IGZsYWdzOworICAqb3V0KysgPSAwOworICAqb3V0KysgPSAwOworICAqb3V0KysgPSAwOworICAqb3V0KysgPSAwOworICByZXR1cm4gb3V0OworfQorCitncHJfc2xpY2UgZ3JwY19jaHR0cDJfc2V0dGluZ3NfY3JlYXRlKHVpbnQzMl90ICpvbGQsIGNvbnN0IHVpbnQzMl90ICpuZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcmNlX21hc2ssIHNpemVfdCBjb3VudCkgeworICBzaXplX3QgaTsKKyAgdWludDMyX3QgbiA9IDA7CisgIGdwcl9zbGljZSBvdXRwdXQ7CisgIHVpbnQ4X3QgKnA7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBuICs9IChuZXdbaV0gIT0gb2xkW2ldIHx8IChmb3JjZV9tYXNrICYgKDF1IDw8IGkpKSAhPSAwKTsKKyAgfQorCisgIG91dHB1dCA9IGdwcl9zbGljZV9tYWxsb2MoOSArIDYgKiBuKTsKKyAgcCA9IGZpbGxfaGVhZGVyKEdQUl9TTElDRV9TVEFSVF9QVFIob3V0cHV0KSwgNiAqIG4sIDApOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKG5ld1tpXSAhPSBvbGRbaV0gfHwgKGZvcmNlX21hc2sgJiAoMXUgPDwgaSkpICE9IDApIHsKKyAgICAgIEdQUl9BU1NFUlQoaSk7CisgICAgICAqcCsrID0gKHVpbnQ4X3QpKGkgPj4gOCk7CisgICAgICAqcCsrID0gKHVpbnQ4X3QpKGkpOworICAgICAgKnArKyA9ICh1aW50OF90KShuZXdbaV0gPj4gMjQpOworICAgICAgKnArKyA9ICh1aW50OF90KShuZXdbaV0gPj4gMTYpOworICAgICAgKnArKyA9ICh1aW50OF90KShuZXdbaV0gPj4gOCk7CisgICAgICAqcCsrID0gKHVpbnQ4X3QpKG5ld1tpXSk7CisgICAgICBvbGRbaV0gPSBuZXdbaV07CisgICAgfQorICB9CisKKyAgR1BSX0FTU0VSVChwID09IEdQUl9TTElDRV9FTkRfUFRSKG91dHB1dCkpOworCisgIHJldHVybiBvdXRwdXQ7Cit9CisKK2dwcl9zbGljZSBncnBjX2NodHRwMl9zZXR0aW5nc19hY2tfY3JlYXRlKHZvaWQpIHsKKyAgZ3ByX3NsaWNlIG91dHB1dCA9IGdwcl9zbGljZV9tYWxsb2MoOSk7CisgIGZpbGxfaGVhZGVyKEdQUl9TTElDRV9TVEFSVF9QVFIob3V0cHV0KSwgMCwgR1JQQ19DSFRUUDJfRkxBR19BQ0spOworICByZXR1cm4gb3V0cHV0OworfQorCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXJfYmVnaW5fZnJhbWUoCisgICAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncywKKyAgICB1aW50MzJfdCAqc2V0dGluZ3MpIHsKKyAgcGFyc2VyLT50YXJnZXRfc2V0dGluZ3MgPSBzZXR0aW5nczsKKyAgbWVtY3B5KHBhcnNlci0+aW5jb21pbmdfc2V0dGluZ3MsIHNldHRpbmdzLAorICAgICAgICAgR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTICogc2l6ZW9mKHVpbnQzMl90KSk7CisgIHBhcnNlci0+aXNfYWNrID0gMDsKKyAgcGFyc2VyLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX1NQU19JRDA7CisgIGlmIChmbGFncyA9PSBHUlBDX0NIVFRQMl9GTEFHX0FDSykgeworICAgIHBhcnNlci0+aXNfYWNrID0gMTsKKyAgICBpZiAobGVuZ3RoICE9IDApIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAibm9uLWVtcHR5IHNldHRpbmdzIGFjayBmcmFtZSByZWNlaXZlZCIpOworICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgfSBlbHNlIGlmIChmbGFncyAhPSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIGZsYWdzIG9uIHNldHRpbmdzIGZyYW1lIik7CisgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7CisgIH0gZWxzZSBpZiAobGVuZ3RoICUgNiAhPSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJzZXR0aW5ncyBmcmFtZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHNpeCBieXRlcyIpOworICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOworICB9IGVsc2UgeworICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgfQorfQorCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXJfcGFyc2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnAsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgeworICBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXIgKnBhcnNlciA9IHA7CisgIGNvbnN0IHVpbnQ4X3QgKmN1ciA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOworICBjb25zdCB1aW50OF90ICplbmQgPSBHUFJfU0xJQ0VfRU5EX1BUUihzbGljZSk7CisKKyAgaWYgKHBhcnNlci0+aXNfYWNrKSB7CisgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICB9CisKKyAgZm9yICg7OykgeworICAgIHN3aXRjaCAocGFyc2VyLT5zdGF0ZSkgeworICAgICAgY2FzZSBHUlBDX0NIVFRQMl9TUFNfSUQwOgorICAgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0NIVFRQMl9TUFNfSUQwOworICAgICAgICAgIGlmIChpc19sYXN0KSB7CisgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+c2V0dGluZ3NfdXBkYXRlZCA9IDE7CisgICAgICAgICAgICBtZW1jcHkocGFyc2VyLT50YXJnZXRfc2V0dGluZ3MsIHBhcnNlci0+aW5jb21pbmdfc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmdHJhbnNwb3J0X3BhcnNpbmctPnFidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zZXR0aW5nc19hY2tfY3JlYXRlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICAgIH0KKyAgICAgICAgcGFyc2VyLT5pZCA9ICh1aW50MTZfdCkoKCh1aW50MTZfdCkqY3VyKSA8PCA4KTsKKyAgICAgICAgY3VyKys7CisgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgICAgY2FzZSBHUlBDX0NIVFRQMl9TUFNfSUQxOgorICAgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0NIVFRQMl9TUFNfSUQxOworICAgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgICAgfQorICAgICAgICBwYXJzZXItPmlkID0gKHVpbnQxNl90KShwYXJzZXItPmlkIHwgKCpjdXIpKTsKKyAgICAgICAgY3VyKys7CisgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgICAgY2FzZSBHUlBDX0NIVFRQMl9TUFNfVkFMMDoKKyAgICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfU1BTX1ZBTDA7CisgICAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworICAgICAgICB9CisgICAgICAgIHBhcnNlci0+dmFsdWUgPSAoKHVpbnQzMl90KSpjdXIpIDw8IDI0OworICAgICAgICBjdXIrKzsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICBjYXNlIEdSUENfQ0hUVFAyX1NQU19WQUwxOgorICAgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0NIVFRQMl9TUFNfVkFMMTsKKyAgICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICAgIH0KKyAgICAgICAgcGFyc2VyLT52YWx1ZSB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDE2OworICAgICAgICBjdXIrKzsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICBjYXNlIEdSUENfQ0hUVFAyX1NQU19WQUwyOgorICAgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0NIVFRQMl9TUFNfVkFMMjsKKyAgICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7CisgICAgICAgIH0KKyAgICAgICAgcGFyc2VyLT52YWx1ZSB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDg7CisgICAgICAgIGN1cisrOworICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICAgIGNhc2UgR1JQQ19DSFRUUDJfU1BTX1ZBTDM6CisgICAgICAgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgICAgICAgcGFyc2VyLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX1NQU19WQUwzOworICAgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfU1BTX0lEMDsKKyAgICAgICAgfQorICAgICAgICBwYXJzZXItPnZhbHVlIHw9ICpjdXI7CisgICAgICAgIGN1cisrOworCisgICAgICAgIGlmIChwYXJzZXItPmlkID4gMCAmJiBwYXJzZXItPmlkIDwgR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTKSB7CisgICAgICAgICAgY29uc3QgZ3JwY19jaHR0cDJfc2V0dGluZ19wYXJhbWV0ZXJzICpzcCA9CisgICAgICAgICAgICAgICZncnBjX2NodHRwMl9zZXR0aW5nc19wYXJhbWV0ZXJzW3BhcnNlci0+aWRdOworICAgICAgICAgIGlmIChwYXJzZXItPnZhbHVlIDwgc3AtPm1pbl92YWx1ZSB8fCBwYXJzZXItPnZhbHVlID4gc3AtPm1heF92YWx1ZSkgeworICAgICAgICAgICAgc3dpdGNoIChzcC0+aW52YWxpZF92YWx1ZV9iZWhhdmlvcikgeworICAgICAgICAgICAgICBjYXNlIEdSUENfQ0hUVFAyX0NMQU1QX0lOVkFMSURfVkFMVUU6CisgICAgICAgICAgICAgICAgcGFyc2VyLT52YWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIEdQUl9DTEFNUChwYXJzZXItPnZhbHVlLCBzcC0+bWluX3ZhbHVlLCBzcC0+bWF4X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHUlBDX0NIVFRQMl9ESVNDT05ORUNUX09OX0lOVkFMSURfVkFMVUU6CisgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfZ29hd2F5X2FwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmxhc3RfaW5jb21pbmdfc3RyZWFtX2lkLCBzcC0+ZXJyb3JfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9mcm9tX3N0YXRpY19zdHJpbmcoIkhUVFAyIHNldHRpbmdzIGVycm9yIiksCisgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnRfcGFyc2luZy0+cWJ1Zik7CisgICAgICAgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIHZhbHVlICV1IHBhc3NlZCBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT52YWx1ZSwgc3AtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocGFyc2VyLT5pZCA9PSBHUlBDX0NIVFRQMl9TRVRUSU5HU19JTklUSUFMX1dJTkRPV19TSVpFICYmCisgICAgICAgICAgICAgIHBhcnNlci0+aW5jb21pbmdfc2V0dGluZ3NbcGFyc2VyLT5pZF0gIT0gcGFyc2VyLT52YWx1ZSkgeworICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluaXRpYWxfd2luZG93X3VwZGF0ZSA9CisgICAgICAgICAgICAgICAgKGludDY0X3QpcGFyc2VyLT52YWx1ZSAtIHBhcnNlci0+aW5jb21pbmdfc2V0dGluZ3NbcGFyc2VyLT5pZF07CisgICAgICAgICAgICBpZiAoZ3JwY19odHRwX3RyYWNlKSB7CisgICAgICAgICAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiYWRkaW5nICVkIGZvciBpbml0aWFsX3dpbmRvdyBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpdHJhbnNwb3J0X3BhcnNpbmctPmluaXRpYWxfd2luZG93X3VwZGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHBhcnNlci0+aW5jb21pbmdfc2V0dGluZ3NbcGFyc2VyLT5pZF0gPSBwYXJzZXItPnZhbHVlOworICAgICAgICAgIGlmIChncnBjX2h0dHBfdHJhY2UpIHsKKyAgICAgICAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiQ0hUVFAyOiVzOiBnb3Qgc2V0dGluZyAlZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmlzX2NsaWVudCA/ICJDTEkiIDogIlNWUiIsIHBhcnNlci0+aWQsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+dmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNIVFRQMjogSWdub3JpbmcgdW5rbm93biBzZXR0aW5nICVkICh2YWx1ZSAlZCkiLAorICAgICAgICAgICAgICAgICAgcGFyc2VyLT5pZCwgcGFyc2VyLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTI0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX1NFVFRJTkdTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9TRVRUSU5HU19ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorCit0eXBlZGVmIGVudW0geworICBHUlBDX0NIVFRQMl9TUFNfSUQwLAorICBHUlBDX0NIVFRQMl9TUFNfSUQxLAorICBHUlBDX0NIVFRQMl9TUFNfVkFMMCwKKyAgR1JQQ19DSFRUUDJfU1BTX1ZBTDEsCisgIEdSUENfQ0hUVFAyX1NQU19WQUwyLAorICBHUlBDX0NIVFRQMl9TUFNfVkFMMworfSBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZV9zdGF0ZTsKKworLyogVGhlIHRoaW5ncyBIVFRQLzIgZGVmaW5lcyBhcyBjb25uZWN0aW9uIGxldmVsIHNldHRpbmdzICovCit0eXBlZGVmIGVudW0geworICBHUlBDX0NIVFRQMl9TRVRUSU5HU19IRUFERVJfVEFCTEVfU0laRSA9IDEsCisgIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0VOQUJMRV9QVVNIID0gMiwKKyAgR1JQQ19DSFRUUDJfU0VUVElOR1NfTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyA9IDMsCisgIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0lOSVRJQUxfV0lORE9XX1NJWkUgPSA0LAorICBHUlBDX0NIVFRQMl9TRVRUSU5HU19NQVhfRlJBTUVfU0laRSA9IDUsCisgIEdSUENfQ0hUVFAyX1NFVFRJTkdTX01BWF9IRUFERVJfTElTVF9TSVpFID0gNiwKKyAgR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTCit9IGdycGNfY2h0dHAyX3NldHRpbmdfaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2Vfc3RhdGUgc3RhdGU7CisgIHVpbnQzMl90ICp0YXJnZXRfc2V0dGluZ3M7CisgIHVpbnQ4X3QgaXNfYWNrOworICB1aW50MTZfdCBpZDsKKyAgdWludDMyX3QgdmFsdWU7CisgIHVpbnQzMl90IGluY29taW5nX3NldHRpbmdzW0dSUENfQ0hUVFAyX05VTV9TRVRUSU5HU107Cit9IGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcnNlcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19DSFRUUDJfQ0xBTVBfSU5WQUxJRF9WQUxVRSwKKyAgR1JQQ19DSFRUUDJfRElTQ09OTkVDVF9PTl9JTlZBTElEX1ZBTFVFCit9IGdycGNfY2h0dHAyX2ludmFsaWRfdmFsdWVfYmVoYXZpb3I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdWludDMyX3QgZGVmYXVsdF92YWx1ZTsKKyAgdWludDMyX3QgbWluX3ZhbHVlOworICB1aW50MzJfdCBtYXhfdmFsdWU7CisgIGdycGNfY2h0dHAyX2ludmFsaWRfdmFsdWVfYmVoYXZpb3IgaW52YWxpZF92YWx1ZV9iZWhhdmlvcjsKKyAgdWludDMyX3QgZXJyb3JfdmFsdWU7Cit9IGdycGNfY2h0dHAyX3NldHRpbmdfcGFyYW1ldGVyczsKKworLyogSFRUUC8yIG1hbmRhdGVkIGNvbm5lY3Rpb24gc2V0dGluZyBwYXJhbWV0ZXJzICovCitleHRlcm4gY29uc3QgZ3JwY19jaHR0cDJfc2V0dGluZ19wYXJhbWV0ZXJzCisgICAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyYW1ldGVyc1tHUlBDX0NIVFRQMl9OVU1fU0VUVElOR1NdOworCisvKiBDcmVhdGUgYSBzZXR0aW5ncyBmcmFtZSBieSBkaWZmaW5nIG9sZCAmIG5ldywgYW5kIHVwZGF0aW5nIG9sZCB0byBiZSBuZXcgKi8KK2dwcl9zbGljZSBncnBjX2NodHRwMl9zZXR0aW5nc19jcmVhdGUodWludDMyX3QgKm9sZCwgY29uc3QgdWludDMyX3QgKm5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9yY2VfbWFzaywgc2l6ZV90IGNvdW50KTsKKy8qIENyZWF0ZSBhbiBhY2sgc2V0dGluZ3MgZnJhbWUgKi8KK2dwcl9zbGljZSBncnBjX2NodHRwMl9zZXR0aW5nc19hY2tfY3JlYXRlKHZvaWQpOworCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXJfYmVnaW5fZnJhbWUoCisgICAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncywKKyAgICB1aW50MzJfdCAqc2V0dGluZ3MpOworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyX3BhcnNlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0ZSQU1FX1NFVFRJTkdTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmMgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTYxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworZ3ByX3NsaWNlIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfY3JlYXRlKHVpbnQzMl90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpbmRvd191cGRhdGUpIHsKKyAgZ3ByX3NsaWNlIHNsaWNlID0gZ3ByX3NsaWNlX21hbGxvYygxMyk7CisgIHVpbnQ4X3QgKnAgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKKworICBHUFJfQVNTRVJUKHdpbmRvd191cGRhdGUpOworCisgICpwKysgPSAwOworICAqcCsrID0gMDsKKyAgKnArKyA9IDQ7CisgICpwKysgPSBHUlBDX0NIVFRQMl9GUkFNRV9XSU5ET1dfVVBEQVRFOworICAqcCsrID0gMDsKKyAgKnArKyA9ICh1aW50OF90KShpZCA+PiAyNCk7CisgICpwKysgPSAodWludDhfdCkoaWQgPj4gMTYpOworICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDgpOworICAqcCsrID0gKHVpbnQ4X3QpKGlkKTsKKyAgKnArKyA9ICh1aW50OF90KSh3aW5kb3dfdXBkYXRlID4+IDI0KTsKKyAgKnArKyA9ICh1aW50OF90KSh3aW5kb3dfdXBkYXRlID4+IDE2KTsKKyAgKnArKyA9ICh1aW50OF90KSh3aW5kb3dfdXBkYXRlID4+IDgpOworICAqcCsrID0gKHVpbnQ4X3QpKHdpbmRvd191cGRhdGUpOworCisgIHJldHVybiBzbGljZTsKK30KKworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXJfYmVnaW5fZnJhbWUoCisgICAgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXIgKnBhcnNlciwgdWludDMyX3QgbGVuZ3RoLCB1aW50OF90IGZsYWdzKSB7CisgIGlmIChmbGFncyB8fCBsZW5ndGggIT0gNCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCB3aW5kb3cgdXBkYXRlOiBsZW5ndGg9JWQsIGZsYWdzPSUwMngiLCBsZW5ndGgsCisgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7CisgIH0KKyAgcGFyc2VyLT5ieXRlID0gMDsKKyAgcGFyc2VyLT5hbW91bnQgPSAwOworICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Cit9CisKK2dycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfcGFyc2VyX3BhcnNlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgeworICB1aW50OF90ICpjb25zdCBiZWcgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKKyAgdWludDhfdCAqY29uc3QgZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpOworICB1aW50OF90ICpjdXIgPSBiZWc7CisgIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfcGFyc2VyICpwID0gcGFyc2VyOworCisgIHdoaWxlIChwLT5ieXRlICE9IDQgJiYgY3VyICE9IGVuZCkgeworICAgIHAtPmFtb3VudCB8PSAoKHVpbnQzMl90KSpjdXIpIDw8ICg4ICogKDMgLSBwLT5ieXRlKSk7CisgICAgY3VyKys7CisgICAgcC0+Ynl0ZSsrOworICB9CisKKyAgaWYgKHAtPmJ5dGUgPT0gNCkgeworICAgIHVpbnQzMl90IHJlY2VpdmVkX3VwZGF0ZSA9IHAtPmFtb3VudDsKKyAgICBpZiAocmVjZWl2ZWRfdXBkYXRlID09IDAgfHwgKHJlY2VpdmVkX3VwZGF0ZSAmIDB4ODAwMDAwMDB1KSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIHdpbmRvdyB1cGRhdGUgYnl0ZXM6ICVkIiwgcC0+YW1vdW50KTsKKyAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOworICAgIH0KKyAgICBHUFJfQVNTRVJUKGlzX2xhc3QpOworCisgICAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgIT0gMCkgeworICAgICAgaWYgKHN0cmVhbV9wYXJzaW5nICE9IE5VTEwpIHsKKyAgICAgICAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfU1RSRUFNKCJwYXJzZSIsIHRyYW5zcG9ydF9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmcsIG91dGdvaW5nX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkX3VwZGF0ZSk7CisgICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmcpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9UUkFOU1BPUlQoInBhcnNlIiwgdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfd2luZG93LCByZWNlaXZlZF91cGRhdGUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZjY3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9XSU5ET1dfVVBEQVRFX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9GUkFNRV9XSU5ET1dfVVBEQVRFX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgYnl0ZTsKKyAgdWludDhfdCBpc19jb25uZWN0aW9uX3VwZGF0ZTsKKyAgdWludDMyX3QgYW1vdW50OworfSBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlcjsKKworZ3ByX3NsaWNlIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfY3JlYXRlKHVpbnQzMl90IGlkLCB1aW50MzJfdCB3aW5kb3dfZGVsdGEpOworCitncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlcl9iZWdpbl9mcmFtZSgKKyAgICBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MpOworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXJfcGFyc2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfRlJBTUVfV0lORE9XX1VQREFURV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTlhZGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhpcyBpcyBoZXJlIGZvciBncnBjX2lzX2JpbmFyeV9oZWFkZXIKKyAqIFRPRE8obXVyZ2F0cm9pZDk5KTogUmVtb3ZlIHRoaXMKKyAqLworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCisKKyNkZWZpbmUgSEFTSF9GUkFHTUVOVF8xKHgpICgoeCkmMjU1KQorI2RlZmluZSBIQVNIX0ZSQUdNRU5UXzIoeCkgKCh4ID4+IDgpICYgMjU1KQorI2RlZmluZSBIQVNIX0ZSQUdNRU5UXzMoeCkgKCh4ID4+IDE2KSAmIDI1NSkKKyNkZWZpbmUgSEFTSF9GUkFHTUVOVF80KHgpICgoeCA+PiAyNCkgJiAyNTUpCisKKy8qIGlmIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGlzIGl0ZW0gYmVpbmcgc2VlbiBhZ2FpbiBpcyA8IDEveCB0aGVuIGRvbid0IGFkZAorICAgaXQgdG8gdGhlIHRhYmxlICovCisjZGVmaW5lIE9ORV9PTl9BRERfUFJPQkFCSUxJVFkgMTI4CisvKiBkb24ndCBjb25zaWRlciBhZGRpbmcgYW55dGhpbmcgYmlnZ2VyIHRoYW4gdGhpcyB0byB0aGUgaHBhY2sgdGFibGUgKi8KKyNkZWZpbmUgTUFYX0RFQ09ERVJfU1BBQ0VfVVNBR0UgNTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGlzX2ZpcnN0X2ZyYW1lOworICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gJ291dHB1dCcgd2hlbiB3ZSBzdGFydGVkIHRoZSBmcmFtZSAtIHVzZWQgdG8gY2FsY3VsYXRlCisgICAgIGZyYW1lIGxlbmd0aCAqLworICBzaXplX3Qgb3V0cHV0X2xlbmd0aF9hdF9zdGFydF9vZl9mcmFtZTsKKyAgLyogaW5kZXggKGluIG91dHB1dCkgb2YgdGhlIGhlYWRlciBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgc2l6ZV90IGhlYWRlcl9pZHg7CisgIC8qIGhhdmUgd2Ugc2VlbiBhIHJlZ3VsYXIgKG5vbi1jb2xvbi1wcmVmaXhlZCkgaGVhZGVyIHlldD8gKi8KKyAgdWludDhfdCBzZWVuX3JlZ3VsYXJfaGVhZGVyOworICAvKiBvdXRwdXQgc3RyZWFtIGlkICovCisgIHVpbnQzMl90IHN0cmVhbV9pZDsKKyAgZ3ByX3NsaWNlX2J1ZmZlciAqb3V0cHV0OworfSBmcmFtZXJfc3RhdGU7CisKKy8qIGZpbGxzIHAgKHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIDkgYnl0ZXMgbG9uZykgd2l0aCBhIGRhdGEgZnJhbWUgaGVhZGVyICovCitzdGF0aWMgdm9pZCBmaWxsX2hlYWRlcih1aW50OF90ICpwLCB1aW50OF90IHR5cGUsIHVpbnQzMl90IGlkLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmbGFncykgeworICBHUFJfQVNTRVJUKGxlbiA8IDE2Nzc3MzE2KTsKKyAgKnArKyA9ICh1aW50OF90KShsZW4gPj4gMTYpOworICAqcCsrID0gKHVpbnQ4X3QpKGxlbiA+PiA4KTsKKyAgKnArKyA9ICh1aW50OF90KShsZW4pOworICAqcCsrID0gdHlwZTsKKyAgKnArKyA9IGZsYWdzOworICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDI0KTsKKyAgKnArKyA9ICh1aW50OF90KShpZCA+PiAxNik7CisgICpwKysgPSAodWludDhfdCkoaWQgPj4gOCk7CisgICpwKysgPSAodWludDhfdCkoaWQpOworfQorCisvKiBmaW5pc2ggYSBmcmFtZSAtIGZpbGwgaW4gdGhlIHByZXZpb3VzbHkgcmVzZXJ2ZWQgaGVhZGVyICovCitzdGF0aWMgdm9pZCBmaW5pc2hfZnJhbWUoZnJhbWVyX3N0YXRlICpzdCwgaW50IGlzX2hlYWRlcl9ib3VuZGFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGFzdF9pbl9zdHJlYW0pIHsKKyAgdWludDhfdCB0eXBlID0gMHhmZjsKKyAgdHlwZSA9IHN0LT5pc19maXJzdF9mcmFtZSA/IEdSUENfQ0hUVFAyX0ZSQU1FX0hFQURFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR1JQQ19DSFRUUDJfRlJBTUVfQ09OVElOVUFUSU9OOworICBmaWxsX2hlYWRlcigKKyAgICAgIEdQUl9TTElDRV9TVEFSVF9QVFIoc3QtPm91dHB1dC0+c2xpY2VzW3N0LT5oZWFkZXJfaWR4XSksIHR5cGUsCisgICAgICBzdC0+c3RyZWFtX2lkLCBzdC0+b3V0cHV0LT5sZW5ndGggLSBzdC0+b3V0cHV0X2xlbmd0aF9hdF9zdGFydF9vZl9mcmFtZSwKKyAgICAgICh1aW50OF90KSgoaXNfbGFzdF9pbl9zdHJlYW0gPyBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSA6IDApIHwKKyAgICAgICAgICAgICAgICAoaXNfaGVhZGVyX2JvdW5kYXJ5ID8gR1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9IRUFERVJTIDogMCkpKTsKKyAgc3QtPmlzX2ZpcnN0X2ZyYW1lID0gMDsKK30KKworLyogYmVnaW4gYSBuZXcgZnJhbWU6IHJlc2VydmUgb2ZmIGhlYWRlciBzcGFjZSwgcmVtZW1iZXIgaG93IG1hbnkgYnl0ZXMgd2UnZAorICAgb3V0cHV0IGJlZm9yZSBiZWdpbm5pbmcgKi8KK3N0YXRpYyB2b2lkIGJlZ2luX2ZyYW1lKGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgc3QtPmhlYWRlcl9pZHggPQorICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChzdC0+b3V0cHV0LCBncHJfc2xpY2VfbWFsbG9jKDkpKTsKKyAgc3QtPm91dHB1dF9sZW5ndGhfYXRfc3RhcnRfb2ZfZnJhbWUgPSBzdC0+b3V0cHV0LT5sZW5ndGg7Cit9CisKKy8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBjdXJyZW50IGZyYW1lIGlzIG9mIHRoZSB0eXBlIGRlc2lyZWQsIGFuZCBoYXMgc3VmZmljaWVudAorICAgc3BhY2UgdG8gYWRkIGF0IGxlYXN0IGFib3V0X3RvX2FkZCBieXRlcyAtLSBmaW5pc2hlcyB0aGUgY3VycmVudCBmcmFtZSBpZgorICAgbmVlZGVkICovCitzdGF0aWMgdm9pZCBlbnN1cmVfc3BhY2UoZnJhbWVyX3N0YXRlICpzdCwgc2l6ZV90IG5lZWRfYnl0ZXMpIHsKKyAgaWYgKHN0LT5vdXRwdXQtPmxlbmd0aCAtIHN0LT5vdXRwdXRfbGVuZ3RoX2F0X3N0YXJ0X29mX2ZyYW1lICsgbmVlZF9ieXRlcyA8PQorICAgICAgR1JQQ19DSFRUUDJfTUFYX1BBWUxPQURfTEVOR1RIKSB7CisgICAgcmV0dXJuOworICB9CisgIGZpbmlzaF9mcmFtZShzdCwgMCwgMCk7CisgIGJlZ2luX2ZyYW1lKHN0KTsKK30KKworLyogaW5jcmVtZW50IGEgZmlsdGVyIGNvdW50LCBoYWx2ZSBhbGwgY291bnRzIGlmIG9uZSBlbGVtZW50IHJlYWNoZXMgbWF4ICovCitzdGF0aWMgdm9pZCBpbmNfZmlsdGVyKHVpbnQ4X3QgaWR4LCB1aW50MzJfdCAqc3VtLCB1aW50OF90ICplbGVtcykgeworICBlbGVtc1tpZHhdKys7CisgIGlmIChlbGVtc1tpZHhdIDwgMjU1KSB7CisgICAgKCpzdW0pKys7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgKnN1bSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEdSUENfQ0hUVFAyX0hQQUNLQ19OVU1fRklMVEVSUzsgaSsrKSB7CisgICAgICBlbGVtc1tpXSAvPSAyOworICAgICAgKCpzdW0pICs9IGVsZW1zW2ldOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfaGVhZGVyX2RhdGEoZnJhbWVyX3N0YXRlICpzdCwgZ3ByX3NsaWNlIHNsaWNlKSB7CisgIHNpemVfdCBsZW4gPSBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKTsKKyAgc2l6ZV90IHJlbWFpbmluZzsKKyAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisgIHJlbWFpbmluZyA9IEdSUENfQ0hUVFAyX01BWF9QQVlMT0FEX0xFTkdUSCArCisgICAgICAgICAgICAgIHN0LT5vdXRwdXRfbGVuZ3RoX2F0X3N0YXJ0X29mX2ZyYW1lIC0gc3QtPm91dHB1dC0+bGVuZ3RoOworICBpZiAobGVuIDw9IHJlbWFpbmluZykgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKHN0LT5vdXRwdXQsIHNsaWNlKTsKKyAgfSBlbHNlIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZChzdC0+b3V0cHV0LCBncHJfc2xpY2Vfc3BsaXRfaGVhZCgmc2xpY2UsIHJlbWFpbmluZykpOworICAgIGZpbmlzaF9mcmFtZShzdCwgMCwgMCk7CisgICAgYmVnaW5fZnJhbWUoc3QpOworICAgIGFkZF9oZWFkZXJfZGF0YShzdCwgc2xpY2UpOworICB9Cit9CisKK3N0YXRpYyB1aW50OF90ICphZGRfdGlueV9oZWFkZXJfZGF0YShmcmFtZXJfc3RhdGUgKnN0LCBzaXplX3QgbGVuKSB7CisgIGVuc3VyZV9zcGFjZShzdCwgbGVuKTsKKyAgcmV0dXJuIGdwcl9zbGljZV9idWZmZXJfdGlueV9hZGQoc3QtPm91dHB1dCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgZXZpY3RfZW50cnkoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYykgeworICBjLT50YWlsX3JlbW90ZV9pbmRleCsrOworICBHUFJfQVNTRVJUKGMtPnRhaWxfcmVtb3RlX2luZGV4ID4gMCk7CisgIEdQUl9BU1NFUlQoYy0+dGFibGVfc2l6ZSA+PQorICAgICAgICAgICAgIGMtPnRhYmxlX2VsZW1fc2l6ZVtjLT50YWlsX3JlbW90ZV9pbmRleCAlIGMtPmNhcF90YWJsZV9lbGVtc10pOworICBHUFJfQVNTRVJUKGMtPnRhYmxlX2VsZW1zID4gMCk7CisgIGMtPnRhYmxlX3NpemUgPQorICAgICAgKHVpbnQxNl90KShjLT50YWJsZV9zaXplIC0KKyAgICAgICAgICAgICAgICAgYy0+dGFibGVfZWxlbV9zaXplW2MtPnRhaWxfcmVtb3RlX2luZGV4ICUgYy0+Y2FwX3RhYmxlX2VsZW1zXSk7CisgIGMtPnRhYmxlX2VsZW1zLS07Cit9CisKKy8qIGFkZCBhbiBlbGVtZW50IHRvIHRoZSBkZWNvZGVyIHRhYmxlICovCitzdGF0aWMgdm9pZCBhZGRfZWxlbShncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCBncnBjX21kZWxlbSAqZWxlbSkgeworICB1aW50MzJfdCBrZXlfaGFzaCA9IGVsZW0tPmtleS0+aGFzaDsKKyAgdWludDMyX3QgZWxlbV9oYXNoID0gR1JQQ19NRFNUUl9LVl9IQVNIKGtleV9oYXNoLCBlbGVtLT52YWx1ZS0+aGFzaCk7CisgIHVpbnQzMl90IG5ld19pbmRleCA9IGMtPnRhaWxfcmVtb3RlX2luZGV4ICsgYy0+dGFibGVfZWxlbXMgKyAxOworICBzaXplX3QgZWxlbV9zaXplID0gMzIgKyBHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpICsKKyAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoZWxlbS0+dmFsdWUtPnNsaWNlKTsKKworICBHUFJfQVNTRVJUKGVsZW1fc2l6ZSA8IDY1NTM2KTsKKworICBpZiAoZWxlbV9zaXplID4gYy0+bWF4X3RhYmxlX3NpemUpIHsKKyAgICB3aGlsZSAoYy0+dGFibGVfc2l6ZSA+IDApIHsKKyAgICAgIGV2aWN0X2VudHJ5KGMpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBSZXNlcnZlIHNwYWNlIGZvciB0aGlzIGVsZW1lbnQgaW4gdGhlIHJlbW90ZSB0YWJsZTogaWYgdGhpcyBvdmVyZmxvd3MKKyAgICAgdGhlIGN1cnJlbnQgdGFibGUsIGRyb3AgZWxlbWVudHMgdW50aWwgaXQgZml0cywgbWF0Y2hpbmcgdGhlIGRlY29tcHJlc3NvcgorICAgICBhbGdvcml0aG0gKi8KKyAgd2hpbGUgKGMtPnRhYmxlX3NpemUgKyBlbGVtX3NpemUgPiBjLT5tYXhfdGFibGVfc2l6ZSkgeworICAgIGV2aWN0X2VudHJ5KGMpOworICB9CisgIEdQUl9BU1NFUlQoYy0+dGFibGVfZWxlbXMgPCBjLT5tYXhfdGFibGVfc2l6ZSk7CisgIGMtPnRhYmxlX2VsZW1fc2l6ZVtuZXdfaW5kZXggJSBjLT5jYXBfdGFibGVfZWxlbXNdID0gKHVpbnQxNl90KWVsZW1fc2l6ZTsKKyAgYy0+dGFibGVfc2l6ZSA9ICh1aW50MTZfdCkoYy0+dGFibGVfc2l6ZSArIGVsZW1fc2l6ZSk7CisgIGMtPnRhYmxlX2VsZW1zKys7CisKKyAgLyogU3RvcmUgdGhpcyBlbGVtZW50IGludG8ge2VudHJpZXMsaW5kaWNlc31fZWxlbSAqLworICBpZiAoYy0+ZW50cmllc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzIoZWxlbV9oYXNoKV0gPT0gZWxlbSkgeworICAgIC8qIGFscmVhZHkgdGhlcmU6IHVwZGF0ZSB3aXRoIG5ldyBpbmRleCAqLworICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldID0gbmV3X2luZGV4OworICB9IGVsc2UgaWYgKGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID09IGVsZW0pIHsKKyAgICAvKiBhbHJlYWR5IHRoZXJlIChjdWNrb28pOiB1cGRhdGUgd2l0aCBuZXcgaW5kZXggKi8KKyAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSA9IG5ld19pbmRleDsKKyAgfSBlbHNlIGlmIChjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9PSBOVUxMKSB7CisgICAgLyogbm90IHRoZXJlLCBidXQgYSBmcmVlIGVsZW1lbnQ6IGFkZCAqLworICAgIGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldID0gR1JQQ19NREVMRU1fUkVGKGVsZW0pOworICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldID0gbmV3X2luZGV4OworICB9IGVsc2UgaWYgKGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID09IE5VTEwpIHsKKyAgICAvKiBub3QgdGhlcmUgKGN1Y2tvbyksIGJ1dCBhIGZyZWUgZWxlbWVudDogYWRkICovCisgICAgYy0+ZW50cmllc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzMoZWxlbV9oYXNoKV0gPSBHUlBDX01ERUxFTV9SRUYoZWxlbSk7CisgICAgYy0+aW5kaWNlc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzMoZWxlbV9oYXNoKV0gPSBuZXdfaW5kZXg7CisgIH0gZWxzZSBpZiAoYy0+aW5kaWNlc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzIoZWxlbV9oYXNoKV0gPAorICAgICAgICAgICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldKSB7CisgICAgLyogbm90IHRoZXJlOiByZXBsYWNlIG9sZGVzdCAqLworICAgIEdSUENfTURFTEVNX1VOUkVGKGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldKTsKKyAgICBjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9IEdSUENfTURFTEVNX1JFRihlbGVtKTsKKyAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9IG5ld19pbmRleDsKKyAgfSBlbHNlIHsKKyAgICAvKiBub3QgdGhlcmU6IHJlcGxhY2Ugb2xkZXN0ICovCisgICAgR1JQQ19NREVMRU1fVU5SRUYoYy0+ZW50cmllc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzMoZWxlbV9oYXNoKV0pOworICAgIGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID0gR1JQQ19NREVMRU1fUkVGKGVsZW0pOworICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID0gbmV3X2luZGV4OworICB9CisKKyAgLyogZG8gZXhhY3RseSB0aGUgc2FtZSBmb3IgdGhlIGtleSAoc28gd2UgY2FuIGZpbmQgYnkgdGhhdCBhZ2FpbiB0b28pICovCisKKyAgaWYgKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzIoa2V5X2hhc2gpXSA9PSBlbGVtLT5rZXkpIHsKKyAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8yKGtleV9oYXNoKV0gPSBuZXdfaW5kZXg7CisgIH0gZWxzZSBpZiAoYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMyhrZXlfaGFzaCldID09IGVsZW0tPmtleSkgeworICAgIGMtPmluZGljZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9IG5ld19pbmRleDsKKyAgfSBlbHNlIGlmIChjLT5lbnRyaWVzX2tleXNbSEFTSF9GUkFHTUVOVF8yKGtleV9oYXNoKV0gPT0gTlVMTCkgeworICAgIGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzIoa2V5X2hhc2gpXSA9IEdSUENfTURTVFJfUkVGKGVsZW0tPmtleSk7CisgICAgYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldID0gbmV3X2luZGV4OworICB9IGVsc2UgaWYgKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9PSBOVUxMKSB7CisgICAgYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMyhrZXlfaGFzaCldID0gR1JQQ19NRFNUUl9SRUYoZWxlbS0+a2V5KTsKKyAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8zKGtleV9oYXNoKV0gPSBuZXdfaW5kZXg7CisgIH0gZWxzZSBpZiAoYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldIDwKKyAgICAgICAgICAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8zKGtleV9oYXNoKV0pIHsKKyAgICBHUlBDX01EU1RSX1VOUkVGKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzIoa2V5X2hhc2gpXSk7CisgICAgYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldID0gR1JQQ19NRFNUUl9SRUYoZWxlbS0+a2V5KTsKKyAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8yKGtleV9oYXNoKV0gPSBuZXdfaW5kZXg7CisgIH0gZWxzZSB7CisgICAgR1JQQ19NRFNUUl9VTlJFRihjLT5lbnRyaWVzX2tleXNbSEFTSF9GUkFHTUVOVF8zKGtleV9oYXNoKV0pOworICAgIGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9IEdSUENfTURTVFJfUkVGKGVsZW0tPmtleSk7CisgICAgYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMyhrZXlfaGFzaCldID0gbmV3X2luZGV4OworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfaW5kZXhlZChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBlbGVtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgdWludDMyX3QgbGVuID0gR1JQQ19DSFRUUDJfVkFSSU5UX0xFTkdUSChlbGVtX2luZGV4LCAxKTsKKyAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGVsZW1faW5kZXgsIDEsIDB4ODAsIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKK30KKworc3RhdGljIGdwcl9zbGljZSBnZXRfd2lyZV92YWx1ZShncnBjX21kZWxlbSAqZWxlbSwgdWludDhfdCAqaHVmZm1hbl9wcmVmaXgpIHsKKyAgaWYgKGdycGNfaXNfYmluYXJ5X2hlYWRlcigoY29uc3QgY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoZWxlbS0+a2V5LT5zbGljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChlbGVtLT5rZXktPnNsaWNlKSkpIHsKKyAgICAqaHVmZm1hbl9wcmVmaXggPSAweDgwOworICAgIHJldHVybiBncnBjX21kc3RyX2FzX2Jhc2U2NF9lbmNvZGVkX2FuZF9odWZmbWFuX2NvbXByZXNzZWQoZWxlbS0+dmFsdWUpOworICB9CisgIC8qIFRPRE8oY3RpbGxlcik6IG9wcG9ydHVuaXN0aWNhbGx5IGNvbXByZXNzIG5vbi1iaW5hcnkgaGVhZGVycyAqLworICAqaHVmZm1hbl9wcmVmaXggPSAweDAwOworICByZXR1cm4gZWxlbS0+dmFsdWUtPnNsaWNlOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2xpdGhkcl9pbmNpZHgoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrZXlfaW5kZXgsIGdycGNfbWRlbGVtICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgdWludDMyX3QgbGVuX3BmeCA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgoa2V5X2luZGV4LCAyKTsKKyAgdWludDhfdCBodWZmbWFuX3ByZWZpeDsKKyAgZ3ByX3NsaWNlIHZhbHVlX3NsaWNlID0gZ2V0X3dpcmVfdmFsdWUoZWxlbSwgJmh1ZmZtYW5fcHJlZml4KTsKKyAgc2l6ZV90IGxlbl92YWwgPSBHUFJfU0xJQ0VfTEVOR1RIKHZhbHVlX3NsaWNlKTsKKyAgdWludDMyX3QgbGVuX3ZhbF9sZW47CisgIEdQUl9BU1NFUlQobGVuX3ZhbCA8PSBVSU5UMzJfTUFYKTsKKyAgbGVuX3ZhbF9sZW4gPSBHUlBDX0NIVFRQMl9WQVJJTlRfTEVOR1RIKCh1aW50MzJfdClsZW5fdmFsLCAxKTsKKyAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGtleV9pbmRleCwgMiwgMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fcGZ4KSwgbGVuX3BmeCk7CisgIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVCgodWludDMyX3QpbGVuX3ZhbCwgMSwgaHVmZm1hbl9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX3ZhbF9sZW4pLCBsZW5fdmFsX2xlbik7CisgIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZih2YWx1ZV9zbGljZSkpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2xpdGhkcl9ub2lkeChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5X2luZGV4LCBncnBjX21kZWxlbSAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgdWludDMyX3QgbGVuX3BmeCA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgoa2V5X2luZGV4LCA0KTsKKyAgdWludDhfdCBodWZmbWFuX3ByZWZpeDsKKyAgZ3ByX3NsaWNlIHZhbHVlX3NsaWNlID0gZ2V0X3dpcmVfdmFsdWUoZWxlbSwgJmh1ZmZtYW5fcHJlZml4KTsKKyAgc2l6ZV90IGxlbl92YWwgPSBHUFJfU0xJQ0VfTEVOR1RIKHZhbHVlX3NsaWNlKTsKKyAgdWludDMyX3QgbGVuX3ZhbF9sZW47CisgIEdQUl9BU1NFUlQobGVuX3ZhbCA8PSBVSU5UMzJfTUFYKTsKKyAgbGVuX3ZhbF9sZW4gPSBHUlBDX0NIVFRQMl9WQVJJTlRfTEVOR1RIKCh1aW50MzJfdClsZW5fdmFsLCAxKTsKKyAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGtleV9pbmRleCwgNCwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fcGZ4KSwgbGVuX3BmeCk7CisgIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVCgodWludDMyX3QpbGVuX3ZhbCwgMSwgaHVmZm1hbl9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX3ZhbF9sZW4pLCBsZW5fdmFsX2xlbik7CisgIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZih2YWx1ZV9zbGljZSkpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2xpdGhkcl9pbmNpZHhfdihncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW0sIGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgdWludDMyX3QgbGVuX2tleSA9ICh1aW50MzJfdClHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpOworICB1aW50OF90IGh1ZmZtYW5fcHJlZml4OworICBncHJfc2xpY2UgdmFsdWVfc2xpY2UgPSBnZXRfd2lyZV92YWx1ZShlbGVtLCAmaHVmZm1hbl9wcmVmaXgpOworICB1aW50MzJfdCBsZW5fdmFsID0gKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpOworICB1aW50MzJfdCBsZW5fa2V5X2xlbiA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgobGVuX2tleSwgMSk7CisgIHVpbnQzMl90IGxlbl92YWxfbGVuID0gR1JQQ19DSFRUUDJfVkFSSU5UX0xFTkdUSChsZW5fdmFsLCAxKTsKKyAgR1BSX0FTU0VSVChsZW5fa2V5IDw9IFVJTlQzMl9NQVgpOworICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpIDw9IFVJTlQzMl9NQVgpOworICAqYWRkX3RpbnlfaGVhZGVyX2RhdGEoc3QsIDEpID0gMHg0MDsKKyAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGxlbl9rZXksIDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX2tleV9sZW4pLCBsZW5fa2V5X2xlbik7CisgIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZihlbGVtLT5rZXktPnNsaWNlKSk7CisgIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVChsZW5fdmFsLCAxLCBodWZmbWFuX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fdmFsX2xlbiksIGxlbl92YWxfbGVuKTsKKyAgYWRkX2hlYWRlcl9kYXRhKHN0LCBncHJfc2xpY2VfcmVmKHZhbHVlX3NsaWNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbGl0aGRyX25vaWR4X3YoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW0sIGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgdWludDMyX3QgbGVuX2tleSA9ICh1aW50MzJfdClHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpOworICB1aW50OF90IGh1ZmZtYW5fcHJlZml4OworICBncHJfc2xpY2UgdmFsdWVfc2xpY2UgPSBnZXRfd2lyZV92YWx1ZShlbGVtLCAmaHVmZm1hbl9wcmVmaXgpOworICB1aW50MzJfdCBsZW5fdmFsID0gKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpOworICB1aW50MzJfdCBsZW5fa2V5X2xlbiA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgobGVuX2tleSwgMSk7CisgIHVpbnQzMl90IGxlbl92YWxfbGVuID0gR1JQQ19DSFRUUDJfVkFSSU5UX0xFTkdUSChsZW5fdmFsLCAxKTsKKyAgR1BSX0FTU0VSVChsZW5fa2V5IDw9IFVJTlQzMl9NQVgpOworICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpIDw9IFVJTlQzMl9NQVgpOworICAqYWRkX3RpbnlfaGVhZGVyX2RhdGEoc3QsIDEpID0gMHgwMDsKKyAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGxlbl9rZXksIDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX2tleV9sZW4pLCBsZW5fa2V5X2xlbik7CisgIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZihlbGVtLT5rZXktPnNsaWNlKSk7CisgIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVChsZW5fdmFsLCAxLCBodWZmbWFuX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fdmFsX2xlbiksIGxlbl92YWxfbGVuKTsKKyAgYWRkX2hlYWRlcl9kYXRhKHN0LCBncHJfc2xpY2VfcmVmKHZhbHVlX3NsaWNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJfc3RhdGUgKnN0KSB7CisgIHVpbnQzMl90IGxlbiA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgoYy0+bWF4X3RhYmxlX3NpemUsIDMpOworICBHUlBDX0NIVFRQMl9XUklURV9WQVJJTlQoYy0+bWF4X3RhYmxlX3NpemUsIDMsIDB4MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuKSwgbGVuKTsKKyAgYy0+YWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlID0gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGR5bmlkeChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBlbGVtX2luZGV4KSB7CisgIHJldHVybiAxICsgR1JQQ19DSFRUUDJfTEFTVF9TVEFUSUNfRU5UUlkgKyBjLT50YWlsX3JlbW90ZV9pbmRleCArCisgICAgICAgICBjLT50YWJsZV9lbGVtcyAtIGVsZW1faW5kZXg7Cit9CisKKy8qIGVuY29kZSBhbiBtZGVsZW0gKi8KK3N0YXRpYyB2b2lkIGhwYWNrX2VuYyhncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCBncnBjX21kZWxlbSAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJfc3RhdGUgKnN0KSB7CisgIHVpbnQzMl90IGtleV9oYXNoID0gZWxlbS0+a2V5LT5oYXNoOworICB1aW50MzJfdCBlbGVtX2hhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0goa2V5X2hhc2gsIGVsZW0tPnZhbHVlLT5oYXNoKTsKKyAgc2l6ZV90IGRlY29kZXJfc3BhY2VfdXNhZ2U7CisgIHVpbnQzMl90IGluZGljZXNfa2V5OworICBpbnQgc2hvdWxkX2FkZF9lbGVtOworCisgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChlbGVtLT5rZXktPnNsaWNlKSA+IDApOworICBpZiAoR1BSX1NMSUNFX1NUQVJUX1BUUihlbGVtLT5rZXktPnNsaWNlKVswXSAhPSAnOicpIHsgLyogcmVndWxhciBoZWFkZXIgKi8KKyAgICBzdC0+c2Vlbl9yZWd1bGFyX2hlYWRlciA9IDE7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVCgKKyAgICAgICAgc3QtPnNlZW5fcmVndWxhcl9oZWFkZXIgPT0gMCAmJgorICAgICAgICAiUmVzZXJ2ZWQgaGVhZGVyIChjb2xvbi1wcmVmaXhlZCkgaGFwcGVuaW5nIGFmdGVyIHJlZ3VsYXIgb25lcy4iKTsKKyAgfQorCisgIGluY19maWx0ZXIoSEFTSF9GUkFHTUVOVF8xKGVsZW1faGFzaCksICZjLT5maWx0ZXJfZWxlbXNfc3VtLCBjLT5maWx0ZXJfZWxlbXMpOworCisgIC8qIGlzIHRoaXMgZWxlbSBjdXJyZW50bHkgaW4gdGhlIGRlY29kZXJzIHRhYmxlPyAqLworCisgIGlmIChjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9PSBlbGVtICYmCisgICAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA+IGMtPnRhaWxfcmVtb3RlX2luZGV4KSB7CisgICAgLyogSElUOiBjb21wbGV0ZSBlbGVtZW50IChmaXJzdCBjdWNrb28gaGFzaCkgKi8KKyAgICBlbWl0X2luZGV4ZWQoYywgZHluaWR4KGMsIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldKSwKKyAgICAgICAgICAgICAgICAgc3QpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSA9PSBlbGVtICYmCisgICAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSA+IGMtPnRhaWxfcmVtb3RlX2luZGV4KSB7CisgICAgLyogSElUOiBjb21wbGV0ZSBlbGVtZW50IChzZWNvbmQgY3Vja29vIGhhc2gpICovCisgICAgZW1pdF9pbmRleGVkKGMsIGR5bmlkeChjLCBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSksCisgICAgICAgICAgICAgICAgIHN0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBzaG91bGQgdGhpcyBlbGVtIGJlIGluIHRoZSB0YWJsZT8gKi8KKyAgZGVjb2Rlcl9zcGFjZV91c2FnZSA9IDMyICsgR1BSX1NMSUNFX0xFTkdUSChlbGVtLT5rZXktPnNsaWNlKSArCisgICAgICAgICAgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPnZhbHVlLT5zbGljZSk7CisgIHNob3VsZF9hZGRfZWxlbSA9IGRlY29kZXJfc3BhY2VfdXNhZ2UgPCBNQVhfREVDT0RFUl9TUEFDRV9VU0FHRSAmJgorICAgICAgICAgICAgICAgICAgICBjLT5maWx0ZXJfZWxlbXNbSEFTSF9GUkFHTUVOVF8xKGVsZW1faGFzaCldID49CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5maWx0ZXJfZWxlbXNfc3VtIC8gT05FX09OX0FERF9QUk9CQUJJTElUWTsKKworICAvKiBubyBoaXRzIGZvciB0aGUgZWxlbS4uLiBtYXliZSB0aGVyZSdzIGEga2V5PyAqLworCisgIGluZGljZXNfa2V5ID0gYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldOworICBpZiAoYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldID09IGVsZW0tPmtleSAmJgorICAgICAgaW5kaWNlc19rZXkgPiBjLT50YWlsX3JlbW90ZV9pbmRleCkgeworICAgIC8qIEhJVDoga2V5IChmaXJzdCBjdWNrb28gaGFzaCkgKi8KKyAgICBpZiAoc2hvdWxkX2FkZF9lbGVtKSB7CisgICAgICBlbWl0X2xpdGhkcl9pbmNpZHgoYywgZHluaWR4KGMsIGluZGljZXNfa2V5KSwgZWxlbSwgc3QpOworICAgICAgYWRkX2VsZW0oYywgZWxlbSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIGVtaXRfbGl0aGRyX25vaWR4KGMsIGR5bmlkeChjLCBpbmRpY2VzX2tleSksIGVsZW0sIHN0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICk7CisgIH0KKworICBpbmRpY2VzX2tleSA9IGMtPmluZGljZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXTsKKyAgaWYgKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9PSBlbGVtLT5rZXkgJiYKKyAgICAgIGluZGljZXNfa2V5ID4gYy0+dGFpbF9yZW1vdGVfaW5kZXgpIHsKKyAgICAvKiBISVQ6IGtleSAoZmlyc3QgY3Vja29vIGhhc2gpICovCisgICAgaWYgKHNob3VsZF9hZGRfZWxlbSkgeworICAgICAgZW1pdF9saXRoZHJfaW5jaWR4KGMsIGR5bmlkeChjLCBpbmRpY2VzX2tleSksIGVsZW0sIHN0KTsKKyAgICAgIGFkZF9lbGVtKGMsIGVsZW0pOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBlbWl0X2xpdGhkcl9ub2lkeChjLCBkeW5pZHgoYywgaW5kaWNlc19rZXkpLCBlbGVtLCBzdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiApOworICB9CisKKyAgLyogbm8gZWxlbSwga2V5IGluIHRoZSB0YWJsZS4uLiBmYWxsIGJhY2sgdG8gbGl0ZXJhbCBlbWlzc2lvbiAqLworCisgIGlmIChzaG91bGRfYWRkX2VsZW0pIHsKKyAgICBlbWl0X2xpdGhkcl9pbmNpZHhfdihjLCBlbGVtLCBzdCk7CisgICAgYWRkX2VsZW0oYywgZWxlbSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIGVtaXRfbGl0aGRyX25vaWR4X3YoYywgZWxlbSwgc3QpOworICAgIHJldHVybjsKKyAgfQorICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKK30KKworI2RlZmluZSBTVFJMRU5fTElUKHgpIChzaXplb2YoeCkgLSAxKQorI2RlZmluZSBUSU1FT1VUX0tFWSAiZ3JwYy10aW1lb3V0IgorCitzdGF0aWMgdm9pZCBkZWFkbGluZV9lbmMoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYywgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKKyAgY2hhciB0aW1lb3V0X3N0cltHUlBDX0NIVFRQMl9USU1FT1VUX0VOQ09ERV9NSU5fQlVGU0laRV07CisgIGdycGNfbWRlbGVtICptZGVsZW07CisgIGdycGNfY2h0dHAyX2VuY29kZV90aW1lb3V0KAorICAgICAgZ3ByX3RpbWVfc3ViKGRlYWRsaW5lLCBncHJfbm93KGRlYWRsaW5lLmNsb2NrX3R5cGUpKSwgdGltZW91dF9zdHIpOworICBtZGVsZW0gPSBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCisgICAgICBHUlBDX01EU1RSX0dSUENfVElNRU9VVCwgZ3JwY19tZHN0cl9mcm9tX3N0cmluZyh0aW1lb3V0X3N0cikpOworICBocGFja19lbmMoYywgbWRlbGVtLCBzdCk7CisgIEdSUENfTURFTEVNX1VOUkVGKG1kZWxlbSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBlbGVtc19mb3JfYnl0ZXModWludDMyX3QgYnl0ZXMpIHsgcmV0dXJuIChieXRlcyArIDMxKSAvIDMyOyB9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9pbml0KGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMpIHsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworICBjLT5tYXhfdGFibGVfc2l6ZSA9IEdSUENfQ0hUVFAyX0hQQUNLQ19JTklUSUFMX1RBQkxFX1NJWkU7CisgIGMtPmNhcF90YWJsZV9lbGVtcyA9IGVsZW1zX2Zvcl9ieXRlcyhjLT5tYXhfdGFibGVfc2l6ZSk7CisgIGMtPm1heF90YWJsZV9lbGVtcyA9IGMtPmNhcF90YWJsZV9lbGVtczsKKyAgYy0+bWF4X3VzYWJsZV9zaXplID0gR1JQQ19DSFRUUDJfSFBBQ0tDX0lOSVRJQUxfVEFCTEVfU0laRTsKKyAgYy0+dGFibGVfZWxlbV9zaXplID0KKyAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKCpjLT50YWJsZV9lbGVtX3NpemUpICogYy0+Y2FwX3RhYmxlX2VsZW1zKTsKKyAgbWVtc2V0KGMtPnRhYmxlX2VsZW1fc2l6ZSwgMCwKKyAgICAgICAgIHNpemVvZigqYy0+dGFibGVfZWxlbV9zaXplKSAqIGMtPmNhcF90YWJsZV9lbGVtcyk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9kZXN0cm95KGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBHUlBDX0NIVFRQMl9IUEFDS0NfTlVNX1ZBTFVFUzsgaSsrKSB7CisgICAgaWYgKGMtPmVudHJpZXNfa2V5c1tpXSkgR1JQQ19NRFNUUl9VTlJFRihjLT5lbnRyaWVzX2tleXNbaV0pOworICAgIGlmIChjLT5lbnRyaWVzX2VsZW1zW2ldKSBHUlBDX01ERUxFTV9VTlJFRihjLT5lbnRyaWVzX2VsZW1zW2ldKTsKKyAgfQorICBncHJfZnJlZShjLT50YWJsZV9lbGVtX3NpemUpOworfQorCit2b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF91c2FibGVfc2l6ZSgKKyAgICBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBtYXhfdGFibGVfc2l6ZSkgeworICBjLT5tYXhfdXNhYmxlX3NpemUgPSBtYXhfdGFibGVfc2l6ZTsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9zZXRfbWF4X3RhYmxlX3NpemUoCisgICAgICBjLCBHUFJfTUlOKGMtPm1heF90YWJsZV9zaXplLCBtYXhfdGFibGVfc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCByZWJ1aWxkX2VsZW1zKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IG5ld19jYXApIHsKKyAgdWludDE2X3QgKnRhYmxlX2VsZW1fc2l6ZSA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp0YWJsZV9lbGVtX3NpemUpICogbmV3X2NhcCk7CisgIHVpbnQzMl90IGk7CisKKyAgbWVtc2V0KHRhYmxlX2VsZW1fc2l6ZSwgMCwgc2l6ZW9mKCp0YWJsZV9lbGVtX3NpemUpICogbmV3X2NhcCk7CisgIEdQUl9BU1NFUlQoYy0+dGFibGVfZWxlbXMgPD0gbmV3X2NhcCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGMtPnRhYmxlX2VsZW1zOyBpKyspIHsKKyAgICB1aW50MzJfdCBvZnMgPSBjLT50YWlsX3JlbW90ZV9pbmRleCArIGkgKyAxOworICAgIHRhYmxlX2VsZW1fc2l6ZVtvZnMgJSBuZXdfY2FwXSA9CisgICAgICAgIGMtPnRhYmxlX2VsZW1fc2l6ZVtvZnMgJSBjLT5jYXBfdGFibGVfZWxlbXNdOworICB9CisKKyAgYy0+Y2FwX3RhYmxlX2VsZW1zID0gbmV3X2NhcDsKKyAgZ3ByX2ZyZWUoYy0+dGFibGVfZWxlbV9zaXplKTsKKyAgYy0+dGFibGVfZWxlbV9zaXplID0gdGFibGVfZWxlbV9zaXplOworfQorCit2b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF90YWJsZV9zaXplKAorICAgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IG1heF90YWJsZV9zaXplKSB7CisgIG1heF90YWJsZV9zaXplID0gR1BSX01JTihtYXhfdGFibGVfc2l6ZSwgYy0+bWF4X3VzYWJsZV9zaXplKTsKKyAgaWYgKG1heF90YWJsZV9zaXplID09IGMtPm1heF90YWJsZV9zaXplKSB7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlIChjLT50YWJsZV9zaXplID4gMCAmJiBjLT50YWJsZV9zaXplID4gbWF4X3RhYmxlX3NpemUpIHsKKyAgICBldmljdF9lbnRyeShjKTsKKyAgfQorICBjLT5tYXhfdGFibGVfc2l6ZSA9IG1heF90YWJsZV9zaXplOworICBjLT5tYXhfdGFibGVfZWxlbXMgPSBlbGVtc19mb3JfYnl0ZXMobWF4X3RhYmxlX3NpemUpOworICBpZiAoYy0+bWF4X3RhYmxlX2VsZW1zID4gYy0+Y2FwX3RhYmxlX2VsZW1zKSB7CisgICAgcmVidWlsZF9lbGVtcyhjLCBHUFJfTUFYKGMtPm1heF90YWJsZV9lbGVtcywgMiAqIGMtPmNhcF90YWJsZV9lbGVtcykpOworICB9IGVsc2UgaWYgKGMtPm1heF90YWJsZV9lbGVtcyA8IGMtPmNhcF90YWJsZV9lbGVtcyAvIDMpIHsKKyAgICB1aW50MzJfdCBuZXdfY2FwID0gR1BSX01BWChjLT5tYXhfdGFibGVfZWxlbXMsIDE2KTsKKyAgICBpZiAobmV3X2NhcCAhPSBjLT5jYXBfdGFibGVfZWxlbXMpIHsKKyAgICAgIHJlYnVpbGRfZWxlbXMoYywgbmV3X2NhcCk7CisgICAgfQorICB9CisgIGMtPmFkdmVydGlzZV90YWJsZV9zaXplX2NoYW5nZSA9IDE7CisgIGdwcl9sb2coR1BSX0RFQlVHLCAic2V0IG1heCB0YWJsZSBzaXplIGZyb20gZW5jb2RlciB0byAlZCIsIG1heF90YWJsZV9zaXplKTsKK30KKwordm9pZCBncnBjX2NodHRwMl9lbmNvZGVfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1ldGFkYXRhLCBpbnQgaXNfZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKm91dGJ1ZikgeworICBmcmFtZXJfc3RhdGUgc3Q7CisgIGdycGNfbGlua2VkX21kZWxlbSAqbDsKKyAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lOworCisgIEdQUl9BU1NFUlQoc3RyZWFtX2lkICE9IDApOworCisgIHN0LnNlZW5fcmVndWxhcl9oZWFkZXIgPSAwOworICBzdC5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisgIHN0Lm91dHB1dCA9IG91dGJ1ZjsKKyAgc3QuaXNfZmlyc3RfZnJhbWUgPSAxOworCisgIC8qIEVuY29kZSBhIG1ldGFkYXRhIGJhdGNoOyBzdG9yZSB0aGUgcmV0dXJuZWQgdmFsdWVzLCByZXByZXNlbnRpbmcKKyAgICAgYSBtZXRhZGF0YSBlbGVtZW50IHRoYXQgbmVlZHMgdG8gYmUgdW5yZWZmZWQgYmFjayBpbnRvIHRoZSBtZXRhZGF0YQorICAgICBzbG90LiBUSElTIE1BWSBOT1QgQkUgVEhFIFNBTUUgRUxFTUVOVCAoaWYgYSBkZWNvZGVyIHRhYmxlIHNsb3QgZ290CisgICAgIHVwZGF0ZWQpLiBBZnRlciB0aGlzIGxvb3AsIHdlJ2xsIGRvIGEgYmF0Y2ggdW5yZWYgb2YgZWxlbWVudHMuICovCisgIGJlZ2luX2ZyYW1lKCZzdCk7CisgIGlmIChjLT5hZHZlcnRpc2VfdGFibGVfc2l6ZV9jaGFuZ2UgIT0gMCkgeworICAgIGVtaXRfYWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlKGMsICZzdCk7CisgIH0KKyAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hc3NlcnRfb2sobWV0YWRhdGEpOworICBmb3IgKGwgPSBtZXRhZGF0YS0+bGlzdC5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworICAgIGhwYWNrX2VuYyhjLCBsLT5tZCwgJnN0KTsKKyAgfQorICBkZWFkbGluZSA9IG1ldGFkYXRhLT5kZWFkbGluZTsKKyAgaWYgKGdwcl90aW1lX2NtcChkZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUoZGVhZGxpbmUuY2xvY2tfdHlwZSkpICE9IDApIHsKKyAgICBkZWFkbGluZV9lbmMoYywgZGVhZGxpbmUsICZzdCk7CisgIH0KKworICBmaW5pc2hfZnJhbWUoJnN0LCAxLCBpc19lb2YpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5ZGUzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0hQQUNLX0VOQ09ERVJfSAorI2RlZmluZSBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0hQQUNLX0VOQ09ERVJfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIKKworI2RlZmluZSBHUlBDX0NIVFRQMl9IUEFDS0NfTlVNX0ZJTFRFUlMgMjU2CisjZGVmaW5lIEdSUENfQ0hUVFAyX0hQQUNLQ19OVU1fVkFMVUVTIDI1NgorLyogaW5pdGlhbCB0YWJsZSBzaXplLCBwZXIgc3BlYyAqLworI2RlZmluZSBHUlBDX0NIVFRQMl9IUEFDS0NfSU5JVElBTF9UQUJMRV9TSVpFIDQwOTYKKy8qIG1heGltdW0gdGFibGUgc2l6ZSB3ZSdsbCBhY3R1YWxseSB1c2UgKi8KKyNkZWZpbmUgR1JQQ19DSFRUUDJfSFBBQ0tDX01BWF9UQUJMRV9TSVpFICgxMDI0ICogMTAyNCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBmaWx0ZXJfZWxlbXNfc3VtOworICB1aW50MzJfdCBtYXhfdGFibGVfc2l6ZTsKKyAgdWludDMyX3QgbWF4X3RhYmxlX2VsZW1zOworICB1aW50MzJfdCBjYXBfdGFibGVfZWxlbXM7CisgIC8qKiBpZiBub24temVybywgYWR2ZXJ0aXNlIHRvIHRoZSBkZWNvZGVyIHRoYXQgd2UnbGwgc3RhcnQgdXNpbmcgYSB0YWJsZQorICAgICAgb2YgdGhpcyBzaXplICovCisgIHVpbnQ4X3QgYWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlOworICAvKiogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgd2UnbGwgdXNlIGZvciB0aGUgZGVjb2RlIHRhYmxlICh0byBndWFyZCBhZ2FpbnN0CisgICAgICBwZWVycyBvb21pbmcgdXMgYnkgc2V0dGluZyBkZWNvZGUgdGFibGUgc2l6ZSBoaWdoKSAqLworICB1aW50MzJfdCBtYXhfdXNhYmxlX3NpemU7CisgIC8qIG9uZSBiZWZvcmUgdGhlIGxvd2VzdCB1c2FibGUgdGFibGUgaW5kZXggKi8KKyAgdWludDMyX3QgdGFpbF9yZW1vdGVfaW5kZXg7CisgIHVpbnQzMl90IHRhYmxlX3NpemU7CisgIHVpbnQzMl90IHRhYmxlX2VsZW1zOworCisgIC8qIGZpbHRlciB0YWJsZXMgZm9yIGVsZW1zOiB0aGlzIHRhYmxlcyBwcm92aWRlcyBhbiBhcHByb3hpbWF0ZQorICAgICBwb3B1bGFyaXR5IGNvdW50IGZvciBwYXJ0aWN1bGFyIGhhc2hlcywgYW5kIGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgIGEgbmV3IGxpdGVyYWwgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBjb21wcmVzc2lvbiB0YWJsZSBvciBub3QuCisgICAgIFRoZXkgdHJhY2sgYSBzaW5nbGUgaW50ZWdlciB0aGF0IGNvdW50cyBob3cgb2Z0ZW4gYSBwYXJ0aWN1bGFyIHZhbHVlIGhhcworICAgICBiZWVuIHNlZW4uIFdoZW4gdGhhdCBjb3VudCByZWFjaGVzIG1heCAoMjU1KSwgYWxsIHZhbHVlcyBhcmUgaGFsdmVkLiAqLworICB1aW50OF90IGZpbHRlcl9lbGVtc1tHUlBDX0NIVFRQMl9IUEFDS0NfTlVNX0ZJTFRFUlNdOworCisgIC8qIGVudHJ5IHRhYmxlcyBmb3Iga2V5cyAmIGVsZW1zOiB0aGVzZSB0YWJsZXMgdHJhY2sgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuCisgICAgIHNlZW4gYW5kICptYXkqIGJlIGluIHRoZSBkZWNvbXByZXNzb3IgdGFibGUgKi8KKyAgZ3JwY19tZHN0ciAqZW50cmllc19rZXlzW0dSUENfQ0hUVFAyX0hQQUNLQ19OVU1fVkFMVUVTXTsKKyAgZ3JwY19tZGVsZW0gKmVudHJpZXNfZWxlbXNbR1JQQ19DSFRUUDJfSFBBQ0tDX05VTV9WQUxVRVNdOworICB1aW50MzJfdCBpbmRpY2VzX2tleXNbR1JQQ19DSFRUUDJfSFBBQ0tDX05VTV9WQUxVRVNdOworICB1aW50MzJfdCBpbmRpY2VzX2VsZW1zW0dSUENfQ0hUVFAyX0hQQUNLQ19OVU1fVkFMVUVTXTsKKworICB1aW50MTZfdCAqdGFibGVfZWxlbV9zaXplOworfSBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yOworCit2b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3JfaW5pdChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjKTsKK3ZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9kZXN0cm95KGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMpOwordm9pZCBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yX3NldF9tYXhfdGFibGVfc2l6ZSgKKyAgICBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBtYXhfdGFibGVfc2l6ZSk7Cit2b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF91c2FibGVfc2l6ZSgKKyAgICBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBtYXhfdGFibGVfc2l6ZSk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfZW5jb2RlX2hlYWRlcihncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICptZXRhZGF0YSwgaW50IGlzX2VvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpvdXRidWYpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9IUEFDS19FTkNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMzODdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5jCkBAIC0wLDAgKzEsMTQ2MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBUaGlzIGlzIGhlcmUgZm9yIGdycGNfaXNfYmluYXJ5X2hlYWRlcgorICogVE9ETyhtdXJnYXRyb2lkOTkpOiBSZW1vdmUgdGhpcworICovCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCitleHRlcm4gaW50IGdycGNfaHR0cF90cmFjZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTk9UX0JJTkFSWSwKKyAgQjY0X0JZVEUwLAorICBCNjRfQllURTEsCisgIEI2NF9CWVRFMiwKKyAgQjY0X0JZVEUzCit9IGJpbmFyeV9zdGF0ZTsKKworLyogSG93IHBhcnNpbmcgd29ya3M6CisKKyAgIFRoZSBwYXJzZXIgb2JqZWN0IGtlZXBzIHRyYWNrIG9mIGEgZnVuY3Rpb24gcG9pbnRlciB3aGljaCByZXByZXNlbnRzIHRoZQorICAgY3VycmVudCBwYXJzZSBzdGF0ZS4KKworICAgRWFjaCB0aW1lIG5ldyBieXRlcyBhcmUgcHJlc2VudGVkLCB3ZSBjYWxsIGludG8gdGhlIGN1cnJlbnQgc3RhdGUsIHdoaWNoCisgICByZWN1cnNpdmVseSBwYXJzZXMgdW50aWwgYWxsIGJ5dGVzIGluIHRoZSBnaXZlbiBjaHVuayBhcmUgZXhoYXVzdGVkLgorCisgICBUaGUgcGFyc2Ugc3RhdGUgdGhhdCB0ZXJtaW5hdGVzIHRoZW4gc2F2ZXMgaXRzIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYmUgdGhlCisgICBjdXJyZW50IHN0YXRlIHNvIHRoYXQgaXQgY2FuIHJlc3VtZSB3aGVuIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZS4KKworICAgSXQncyBleHBlY3RlZCB0aGF0IG1vc3Qgb3B0aW1pemluZyBjb21waWxlcnMgd2lsbCB0dXJuIHRoaXMgY29kZSBpbnRvCisgICBhIHNldCBvZiBpbmRpcmVjdCBqdW1wcywgYW5kIHNvIG5vdCB3YXN0ZSBzdGFjayBzcGFjZS4gKi8KKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHBhcnNpbmcgc3RhdGVzICovCitzdGF0aWMgaW50IHBhcnNlX2JlZ2luKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9lcnJvcihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfaWxsZWdhbF9vcChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOworCitzdGF0aWMgaW50IHBhcnNlX3N0cmluZ19wcmVmaXgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2Vfa2V5X3N0cmluZyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9pbmRleGVkX2tleShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfbGl0ZXJhbF9rZXkoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7CisKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWUwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWUxKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWUyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWUzKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWU0KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWU1dXAoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7CisKK3N0YXRpYyBpbnQgcGFyc2VfaW5kZXhlZF9maWVsZChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9pbmRleGVkX2ZpZWxkX3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9saXRoZHJfaW5jaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7CitzdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9pbmNpZHhfeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCk7CitzdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9pbmNpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCk7CitzdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9ub3RpZHgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX25vdGlkeF94KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX25vdGlkeF92KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKTsKK3N0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX252cmlkeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9saXRoZHJfbnZyaWR4X3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9saXRoZHJfbnZyaWR4X3YoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9tYXhfdGJsX3NpemUoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOworc3RhdGljIGludCBwYXJzZV9tYXhfdGJsX3NpemVfeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKKworLyogd2UgdHJhbnNsYXRlIHRoZSBmaXJzdCBieXRlIG9mIGEgaHBhY2sgZmllbGQgaW50byBvbmUgb2YgdGhlc2UgZGVjb2RpbmcKKyAgIGNhc2VzLCB0aGVuIHVzZSBhIGxvb2t1cCB0YWJsZSB0byBqdW1wIGRpcmVjdGx5IHRvIHRoZSBhcHByb3ByaWF0ZSBwYXJzZXIuCisKKyAgIF9YID0+IHRoZSBpbnRlZ2VyIGluZGV4IGlzIGFsbCBvbmVzLCBtZWFuaW5nIHdlIG5lZWQgdG8gZG8gdmFyaW50IGRlY29kaW5nCisgICBfViA9PiB0aGUgaW50ZWdlciBpbmRleCBpcyBhbGwgemVyb3MsIG1lYW5pbmcgd2UgbmVlZCB0byBkZWNvZGUgYW4gYWRkaXRpb25hbAorICAgICAgICAgc3RyaW5nIHZhbHVlICovCit0eXBlZGVmIGVudW0geworICBJTkRFWEVEX0ZJRUxELAorICBJTkRFWEVEX0ZJRUxEX1gsCisgIExJVEhEUl9JTkNJRFgsCisgIExJVEhEUl9JTkNJRFhfWCwKKyAgTElUSERSX0lOQ0lEWF9WLAorICBMSVRIRFJfTk9USURYLAorICBMSVRIRFJfTk9USURYX1gsCisgIExJVEhEUl9OT1RJRFhfViwKKyAgTElUSERSX05WUklEWCwKKyAgTElUSERSX05WUklEWF9YLAorICBMSVRIRFJfTlZSSURYX1YsCisgIE1BWF9UQkxfU0laRSwKKyAgTUFYX1RCTF9TSVpFX1gsCisgIElMTEVHQUwKK30gZmlyc3RfYnl0ZV90eXBlOworCisvKiBqdW1wIHRhYmxlIG9mIHBhcnNlIHN0YXRlIGZ1bmN0aW9ucyAtLSBvcmRlciBtdXN0IG1hdGNoIGZpcnN0X2J5dGVfdHlwZQorICAgYWJvdmUgKi8KK3N0YXRpYyBjb25zdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUgZmlyc3RfYnl0ZV9hY3Rpb25bXSA9IHsKKyAgICBwYXJzZV9pbmRleGVkX2ZpZWxkLCAgIHBhcnNlX2luZGV4ZWRfZmllbGRfeCwgcGFyc2VfbGl0aGRyX2luY2lkeCwKKyAgICBwYXJzZV9saXRoZHJfaW5jaWR4X3gsIHBhcnNlX2xpdGhkcl9pbmNpZHhfdiwgcGFyc2VfbGl0aGRyX25vdGlkeCwKKyAgICBwYXJzZV9saXRoZHJfbm90aWR4X3gsIHBhcnNlX2xpdGhkcl9ub3RpZHhfdiwgcGFyc2VfbGl0aGRyX252cmlkeCwKKyAgICBwYXJzZV9saXRoZHJfbnZyaWR4X3gsIHBhcnNlX2xpdGhkcl9udnJpZHhfdiwgcGFyc2VfbWF4X3RibF9zaXplLAorICAgIHBhcnNlX21heF90Ymxfc2l6ZV94LCAgcGFyc2VfaWxsZWdhbF9vcH07CisKKy8qIGluZGV4ZXMgdGhlIGZpcnN0IGJ5dGUgdG8gYSBwYXJzZSBzdGF0ZSBmdW5jdGlvbiAtIGdlbmVyYXRlZCBieQorICAgZ2VuX2hwYWNrX3RhYmxlcy5jICovCitzdGF0aWMgY29uc3QgdWludDhfdCBmaXJzdF9ieXRlX2x1dFsyNTZdID0geworICAgIExJVEhEUl9OT1RJRFhfViwgTElUSERSX05PVElEWCwgTElUSERSX05PVElEWCwgTElUSERSX05PVElEWCwKKyAgICBMSVRIRFJfTk9USURYLCAgIExJVEhEUl9OT1RJRFgsIExJVEhEUl9OT1RJRFgsIExJVEhEUl9OT1RJRFgsCisgICAgTElUSERSX05PVElEWCwgICBMSVRIRFJfTk9USURYLCBMSVRIRFJfTk9USURYLCBMSVRIRFJfTk9USURYLAorICAgIExJVEhEUl9OT1RJRFgsICAgTElUSERSX05PVElEWCwgTElUSERSX05PVElEWCwgTElUSERSX05PVElEWF9YLAorICAgIExJVEhEUl9OVlJJRFhfViwgTElUSERSX05WUklEWCwgTElUSERSX05WUklEWCwgTElUSERSX05WUklEWCwKKyAgICBMSVRIRFJfTlZSSURYLCAgIExJVEhEUl9OVlJJRFgsIExJVEhEUl9OVlJJRFgsIExJVEhEUl9OVlJJRFgsCisgICAgTElUSERSX05WUklEWCwgICBMSVRIRFJfTlZSSURYLCBMSVRIRFJfTlZSSURYLCBMSVRIRFJfTlZSSURYLAorICAgIExJVEhEUl9OVlJJRFgsICAgTElUSERSX05WUklEWCwgTElUSERSX05WUklEWCwgTElUSERSX05WUklEWF9YLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLAorICAgIE1BWF9UQkxfU0laRSwgICAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFLCAgTUFYX1RCTF9TSVpFX1gsCisgICAgTElUSERSX0lOQ0lEWF9WLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAorICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKKyAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCisgICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAorICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKKyAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCisgICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAorICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKKyAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCisgICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAorICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKKyAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCisgICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAorICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKKyAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCisgICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYX1gsCisgICAgSUxMRUdBTCwgICAgICAgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKKyAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCisgICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAorICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRF9YLAorfTsKKworLyogc3RhdGUgdGFibGUgZm9yIGh1ZmZtYW4gZGVjb2Rpbmc6IGdpdmVuIGEgc3RhdGUsIGdpdmVzIGFuIGluZGV4LzE2IGludG8KKyAgIG5leHRfc3ViX3RibC4gVGFraW5nIHRoYXQgaW5kZXggYW5kIGFkZGluZyB0aGUgdmFsdWUgb2YgdGhlIG5pYmJsZSBiZWluZworICAgY29uc2lkZXJlZCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlLgorCisgICBnZW5lcmF0ZWQgYnkgZ2VuX2hwYWNrX3RhYmxlcy5jICovCitzdGF0aWMgY29uc3QgdWludDhfdCBuZXh0X3RibFsyNTZdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsIDUsICA2LCAgMSwgNywgIDgsICAxLCAgMywgIDMsICA5LCAgMTAsIDExLCAxLCAgMSwKKyAgICAxLCAgMTIsIDEsICAyLCAgMTMsIDEsICAxLCAxLCAgMSwgIDEsIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsCisgICAgMTQsIDEsICAxNSwgMTYsIDEsICAxNywgMSwgMTUsIDIsICA3LCAzLCAgMTgsIDE5LCAxLCAgMSwgIDEsICAxLCAgMjAsIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEsICAxNSwgMiwgMiwgIDcsICAyMSwgMSwgIDIyLCAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxNSwgMiwgIDIsICAyLCAyLCAgMiwgIDIsIDIzLCAyNCwgMjUsIDEsICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsCisgICAgMjYsIDMsICAzLCAgMjcsIDEwLCAyOCwgMSwgMSwgIDEsICAxLCAxLCAgMSwgIDIsICAzLCAgMjksIDEwLCAzMCwgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEsICAxLCAgMSwgMSwgIDMxLCAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwKKyAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAzMiwgMSwgIDEsIDE1LCAzMywgMSwgIDM0LCAzNSwgOSwgIDM2LCAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDM3LCAxLCAgMSwgMSwgIDEsICAxLCAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDI2LCA5LAorICAgIDM4LCAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEsICAxNSwgMiwgMiwgIDIsICAyLCAgMjYsIDMsICAzLCAgMzksIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAgMiwgIDIsIDIsICAyLCAgMiwgIDIsICA3LCAgMywgIDMsICAzLCAgNDAsIDIsCisgICAgNDEsIDEsICAxLCAgMSwgIDQyLCA0MywgMSwgMSwgIDQ0LCAxLCAxLCAgMSwgIDEsICAxNSwgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgIDMsICAzLCAgMywgIDQ1LCA0NiwgMSwgIDEsIDIsICAyLCAgMiwgMzUsIDMsICAzLCAgMTgsIDQ3LCAyLAorfTsKKworLyogbmV4dCBzdGF0ZSwgYmFzZWQgdXBvbiBjdXJyZW50IHN0YXRlIGFuZCB0aGUgY3VycmVudCBuaWJibGU6IHNlZSBhYm92ZS4KKyAgIGdlbmVyYXRlZCBieSBnZW5faHBhY2tfdGFibGVzLmMgKi8KK3N0YXRpYyBjb25zdCBpbnQxNl90IG5leHRfc3ViX3RibFs0OCAqIDE2XSA9IHsKKyAgICAxLCAgIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LAorICAgIDIxOCwgMiwgICA2LCAgIDEwLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDIsICAgNiwgICAxMCwgIDEzLCAgMTQsICAxNSwKKyAgICAxNiwgIDE3LCAgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsICAyNCwgIDMsICAgNywgICAxMSwgIDI0LCAgMywKKyAgICA3LCAgIDExLCAgMjQsICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwKKyAgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgNSwKKyAgICAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA5LCAgIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLAorICAgIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsICAyNCwKKyAgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyLCAgMTMyLCA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwKKyAgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTgsICAxOSwgIDIwLCAgMjEsICA0LCAgIDgsICAgNCwKKyAgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDIyLCAgMjMsICA5MSwgIDI1LCAgMjYsCisgICAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDMsCisgICAgNywgICAxMSwgIDI0LCAgMywgICA3LCAgIDExLCAgMjQsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgNDEsICA0MiwgIDQzLAorICAgIDIsICAgNiwgICAxMCwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAzLCAgIDcsICAgMTEsICAyNCwgIDMsICAgNywgICAxMSwKKyAgICAyNCwgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwKKyAgICA0NCwgIDQ1LCAgMiwgICA2LCAgIDEwLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsCisgICAgNTEsICA1MiwgIDU3LCAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICA1MywgIDU0LCAgNTUsICA1NiwgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LAorICAgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3NCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDczLCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwKKyAgICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsCisgICAgMjQsICAzLCAgIDcsICAgMTEsICAyNCwgIDAsICAgMCwgICAwLCAgIDAsICAgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsCisgICAgMTEsICAyNCwgIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgOTIsICAwLCAgIDAsICAgMCwgICA5MywgIDk0LAorICAgIDk1LCAgOTYsICA5NywgIDk4LCAgOTksICAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAzLCAgIDcsICAgMTEsICAyNCwKKyAgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwKKyAgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgNCwKKyAgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwKKyAgICAwLCAgIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAorICAgIDEzMSwgMiwgICA2LCAgIDEwLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LAorICAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAxNDgsCisgICAgMTQ5LCAxNTAsIDE1MSwgMywgICA3LCAgIDExLCAgMjQsICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDE1MiwgMTUzLCAzLCAgIDcsICAgMTEsICAyNCwgIDMsICAgNywgICAxMSwgIDI0LCAgMywgICA3LCAgIDExLAorICAgIDI0LCAgMTU0LCAxNTUsIDE1NiwgMTY0LCAzLCAgIDcsICAgMTEsICAyNCwgIDMsICAgNywgICAxMSwgIDI0LCAgMywgICA3LAorICAgIDExLCAgMjQsICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE1NywgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsCisgICAgMTczLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywKKyAgICAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwKKyAgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMTk3LCAxOTgsIDQsICAgOCwgICA0LCAgIDgsICAgNCwKKyAgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAyMTksIDIyMCwgMywgICA3LCAgIDExLCAgMjQsCisgICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDIyMSwgMjIyLCAyMjMsIDIyNCwgMywgICA3LCAgIDExLAorICAgIDI0LCAgMywgICA3LCAgIDExLCAgMjQsICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAyMjUsIDIyOCwgNCwgICA4LAorICAgIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDIyNiwgMjI3LCAyMjksCisgICAgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwKKyAgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLAorICAgIDI1MywgMjU0LCAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAyNTUsCit9OworCisvKiBlbWlzc2lvbiB0YWJsZTogaW5kZXhlZCBsaWtlIG5leHRfdGJsLCB1bHRpbWF0ZWx5IGdpdmVzIHRoZSBieXRlIHRvIGJlCisgICBlbWl0dGVkLCBvciAtMSBmb3Igbm8gYnl0ZSwgb3IgMjU2IGZvciBlbmQgb2Ygc3RyZWFtCisKKyAgIGdlbmVyYXRlZCBieSBnZW5faHBhY2tfdGFibGVzLmMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBlbWl0X3RibFsyNTZdID0geworICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICAwLCAgIDgsICAgOSwgICAxMCwgIDExLCAgMTIsICAxMywKKyAgICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAwLCAgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsCisgICAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLAorICAgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDAsICAgNTUsICA1NiwKKyAgICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgMCwKKyAgICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsCisgICAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsICA5NiwgIDk3LCAgOTgsICA5OSwgIDEwMCwKKyAgICAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LAorICAgIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCisgICAgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwKKyAgICAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMCwKKyAgICAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LAorICAgIDAsICAgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsCisgICAgMTg5LCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywKKyAgICAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LAorICAgIDIxOSwgMjIwLCAyMjEsIDAsICAgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsCisgICAgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywKKyAgICAyNDgsCit9OworCisvKiBnZW5lcmF0ZWQgYnkgZ2VuX2hwYWNrX3RhYmxlcy5jICovCitzdGF0aWMgY29uc3QgaW50MTZfdCBlbWl0X3N1Yl90YmxbMjQ5ICogMTZdID0geworICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAtMSwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDgsICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksCisgICAgNDksICA0OSwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDksICA0OSwgIDQ5LCAgNDksICA1MCwgIDUwLCAgNTAsICA1MCwgIDk3LAorICAgIDk3LCAgOTcsICA5NywgIDQ4LCAgNDgsICA0OSwgIDQ5LCAgNTAsICA1MCwgIDk3LCAgOTcsICA5OSwgIDk5LCAgMTAxLCAxMDEsCisgICAgMTA1LCAxMDUsIDExMSwgMTExLCA0OCwgIDQ5LCAgNTAsICA5NywgIDk5LCAgMTAxLCAxMDUsIDExMSwgMTE1LCAxMTYsIC0xLAorICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAzMiwgIDMyLCAgMzIsICAzMiwgIDMyLCAgMzIsICAzMiwgIDMyLCAgMzcsICAzNywKKyAgICAzNywgIDM3LCAgMzcsICAzNywgIDM3LCAgMzcsICA5OSwgIDk5LCAgOTksICA5OSwgIDEwMSwgMTAxLCAxMDEsIDEwMSwgMTA1LAorICAgIDEwNSwgMTA1LCAxMDUsIDExMSwgMTExLCAxMTEsIDExMSwgMTE1LCAxMTUsIDExNiwgMTE2LCAzMiwgIDM3LCAgNDUsICA0NiwKKyAgICA0NywgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNjEsICA2MSwgIDYxLCAgNjEsICA2MSwgIDYxLCAgNjEsCisgICAgNjEsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgMTE1LCAxMTUsIDExNSwgMTE1LCAxMTYsIDExNiwKKyAgICAxMTYsIDExNiwgMzIsICAzMiwgIDM3LCAgMzcsICA0NSwgIDQ1LCAgNDYsICA0NiwgIDYxLCAgNjUsICA5NSwgIDk4LCAgMTAwLAorICAgIDEwMiwgMTAzLCAxMDQsIDEwOCwgMTA5LCAxMTAsIDExMiwgMTE0LCAxMTcsIC0xLCAgLTEsICA1OCwgIDU4LCAgNTgsICA1OCwKKyAgICA1OCwgIDU4LCAgNTgsICA1OCwgIDY2LCAgNjYsICA2NiwgIDY2LCAgNjYsICA2NiwgIDY2LCAgNjYsICA0NywgIDQ3LCAgNTEsCisgICAgNTEsICA1MiwgIDUyLCAgNTMsICA1MywgIDU0LCAgNTQsICA1NSwgIDU1LCAgNTYsICA1NiwgIDU3LCAgNTcsICA2MSwgIDYxLAorICAgIDY1LCAgNjUsICA5NSwgIDk1LCAgOTgsICA5OCwgIDEwMCwgMTAwLCAxMDIsIDEwMiwgMTAzLCAxMDMsIDEwNCwgMTA0LCAxMDgsCisgICAgMTA4LCAxMDksIDEwOSwgMTEwLCAxMTAsIDExMiwgMTEyLCAxMTQsIDExNCwgMTE3LCAxMTcsIDU4LCAgNjYsICA2NywgIDY4LAorICAgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLCAgODIsICA4MywKKyAgICA4NCwgIDg1LCAgODYsICA4NywgIDg5LCAgMTA2LCAxMDcsIDExMywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIC0xLCAgLTEsCisgICAgLTEsICAtMSwgIDM4LCAgMzgsICAzOCwgIDM4LCAgMzgsICAzOCwgIDM4LCAgMzgsICA0MiwgIDQyLCAgNDIsICA0MiwgIDQyLAorICAgIDQyLCAgNDIsICA0MiwgIDQ0LCAgNDQsICA0NCwgIDQ0LCAgNDQsICA0NCwgIDQ0LCAgNDQsICA1OSwgIDU5LCAgNTksICA1OSwKKyAgICA1OSwgIDU5LCAgNTksICA1OSwgIDg4LCAgODgsICA4OCwgIDg4LCAgODgsICA4OCwgIDg4LCAgODgsICA5MCwgIDkwLCAgOTAsCisgICAgOTAsICA5MCwgIDkwLCAgOTAsICA5MCwgIDMzLCAgMzMsICAzNCwgIDM0LCAgNDAsICA0MCwgIDQxLCAgNDEsICA2MywgIDYzLAorICAgIDM5LCAgNDMsICAxMjQsIC0xLCAgLTEsICAtMSwgIDM1LCAgMzUsICAzNSwgIDM1LCAgMzUsICAzNSwgIDM1LCAgMzUsICA2MiwKKyAgICA2MiwgIDYyLCAgNjIsICA2MiwgIDYyLCAgNjIsICA2MiwgIDAsICAgMCwgICAwLCAgIDAsICAgMzYsICAzNiwgIDM2LCAgMzYsCisgICAgNjQsICA2NCwgIDY0LCAgNjQsICA5MSwgIDkxLCAgOTEsICA5MSwgIDY5LCAgNjksICA2OSwgIDY5LCAgNjksICA2OSwgIDY5LAorICAgIDY5LCAgNzAsICA3MCwgIDcwLCAgNzAsICA3MCwgIDcwLCAgNzAsICA3MCwgIDcxLCAgNzEsICA3MSwgIDcxLCAgNzEsICA3MSwKKyAgICA3MSwgIDcxLCAgNzIsICA3MiwgIDcyLCAgNzIsICA3MiwgIDcyLCAgNzIsICA3MiwgIDczLCAgNzMsICA3MywgIDczLCAgNzMsCisgICAgNzMsICA3MywgIDczLCAgNzQsICA3NCwgIDc0LCAgNzQsICA3NCwgIDc0LCAgNzQsICA3NCwgIDc1LCAgNzUsICA3NSwgIDc1LAorICAgIDc1LCAgNzUsICA3NSwgIDc1LCAgNzYsICA3NiwgIDc2LCAgNzYsICA3NiwgIDc2LCAgNzYsICA3NiwgIDc3LCAgNzcsICA3NywKKyAgICA3NywgIDc3LCAgNzcsICA3NywgIDc3LCAgNzgsICA3OCwgIDc4LCAgNzgsICA3OCwgIDc4LCAgNzgsICA3OCwgIDc5LCAgNzksCisgICAgNzksICA3OSwgIDc5LCAgNzksICA3OSwgIDc5LCAgODAsICA4MCwgIDgwLCAgODAsICA4MCwgIDgwLCAgODAsICA4MCwgIDgxLAorICAgIDgxLCAgODEsICA4MSwgIDgxLCAgODEsICA4MSwgIDgxLCAgODIsICA4MiwgIDgyLCAgODIsICA4MiwgIDgyLCAgODIsICA4MiwKKyAgICA4MywgIDgzLCAgODMsICA4MywgIDgzLCAgODMsICA4MywgIDgzLCAgODQsICA4NCwgIDg0LCAgODQsICA4NCwgIDg0LCAgODQsCisgICAgODQsICA4NSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODYsICA4NiwgIDg2LCAgODYsICA4NiwgIDg2LAorICAgIDg2LCAgODYsICA4NywgIDg3LCAgODcsICA4NywgIDg3LCAgODcsICA4NywgIDg3LCAgODksICA4OSwgIDg5LCAgODksICA4OSwKKyAgICA4OSwgIDg5LCAgODksICAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA3LCAxMDcsIDEwNywgMTA3LAorICAgIDEwNywgMTA3LCAxMDcsIDEwNywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExOCwgMTE4LCAxMTgsCisgICAgMTE4LCAxMTgsIDExOCwgMTE4LCAxMTgsIDExOSwgMTE5LCAxMTksIDExOSwgMTE5LCAxMTksIDExOSwgMTE5LCAxMjAsIDEyMCwKKyAgICAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjEsIDEyMSwgMTIxLCAxMjEsIDEyMSwgMTIxLCAxMjEsIDEyMSwgMTIyLAorICAgIDEyMiwgMTIyLCAxMjIsIDEyMiwgMTIyLCAxMjIsIDEyMiwgMzgsICAzOCwgIDM4LCAgMzgsICA0MiwgIDQyLCAgNDIsICA0MiwKKyAgICA0NCwgIDQ0LCAgNDQsICA0NCwgIDU5LCAgNTksICA1OSwgIDU5LCAgODgsICA4OCwgIDg4LCAgODgsICA5MCwgIDkwLCAgOTAsCisgICAgOTAsICAzMywgIDM0LCAgNDAsICA0MSwgIDYzLCAgLTEsICAtMSwgIC0xLCAgMzksICAzOSwgIDM5LCAgMzksICAzOSwgIDM5LAorICAgIDM5LCAgMzksICA0MywgIDQzLCAgNDMsICA0MywgIDQzLCAgNDMsICA0MywgIDQzLCAgMTI0LCAxMjQsIDEyNCwgMTI0LCAxMjQsCisgICAgMTI0LCAxMjQsIDEyNCwgMzUsICAzNSwgIDM1LCAgMzUsICA2MiwgIDYyLCAgNjIsICA2MiwgIDAsICAgMCwgICAzNiwgIDM2LAorICAgIDY0LCAgNjQsICA5MSwgIDkxLCAgOTMsICA5MywgIDEyNiwgMTI2LCA5NCwgIDEyNSwgLTEsICAtMSwgIDYwLCAgNjAsICA2MCwKKyAgICA2MCwgIDYwLCAgNjAsICA2MCwgIDYwLCAgOTYsICA5NiwgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYsICA5NiwgIDEyMywgMTIzLAorICAgIDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMsIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICA5MiwKKyAgICA5MiwgIDkyLCAgOTIsICA5MiwgIDkyLCAgOTIsICA5MiwgIDE5NSwgMTk1LCAxOTUsIDE5NSwgMTk1LCAxOTUsIDE5NSwgMTk1LAorICAgIDIwOCwgMjA4LCAyMDgsIDIwOCwgMjA4LCAyMDgsIDIwOCwgMjA4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEzMCwgMTMwLCAxMzAsCisgICAgMTMwLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDE2MiwgMTYyLCAxNjIsIDE2MiwgMTg0LCAxODQsIDE4NCwgMTg0LCAxOTQsIDE5NCwKKyAgICAxOTQsIDE5NCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjYsIDIyNiwgMjI2LCAyMjYsIDE1MywgMTUzLCAxNjEsIDE2MSwgMTY3LAorICAgIDE2NywgMTcyLCAxNzIsIDE3NiwgMTc2LCAxNzcsIDE3NywgMTc5LCAxNzksIDIwOSwgMjA5LCAyMTYsIDIxNiwgMjE3LCAyMTcsCisgICAgMjI3LCAyMjcsIDIyOSwgMjI5LCAyMzAsIDIzMCwgMTI5LCAxMzIsIDEzMywgMTM0LCAxMzYsIDE0NiwgMTU0LCAxNTYsIDE2MCwKKyAgICAxNjMsIDE2NCwgMTY5LCAxNzAsIDE3MywgMTc4LCAxODEsIDE4NSwgMTg2LCAxODcsIDE4OSwgMTkwLCAxOTYsIDE5OCwgMjI4LAorICAgIDIzMiwgMjMzLCAtMSwgIC0xLCAgLTEsICAtMSwgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxMzUsCisgICAgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzcsIDEzNywgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzcsIDEzNywKKyAgICAxMzgsIDEzOCwgMTM4LCAxMzgsIDEzOCwgMTM4LCAxMzgsIDEzOCwgMTM5LCAxMzksIDEzOSwgMTM5LCAxMzksIDEzOSwgMTM5LAorICAgIDEzOSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxNDAsIDE0MSwgMTQxLCAxNDEsIDE0MSwgMTQxLCAxNDEsCisgICAgMTQxLCAxNDEsIDE0MywgMTQzLCAxNDMsIDE0MywgMTQzLCAxNDMsIDE0MywgMTQzLCAxNDcsIDE0NywgMTQ3LCAxNDcsIDE0NywKKyAgICAxNDcsIDE0NywgMTQ3LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTUwLCAxNTAsIDE1MCwgMTUwLAorICAgIDE1MCwgMTUwLCAxNTAsIDE1MCwgMTUxLCAxNTEsIDE1MSwgMTUxLCAxNTEsIDE1MSwgMTUxLCAxNTEsIDE1MiwgMTUyLCAxNTIsCisgICAgMTUyLCAxNTIsIDE1MiwgMTUyLCAxNTIsIDE1NSwgMTU1LCAxNTUsIDE1NSwgMTU1LCAxNTUsIDE1NSwgMTU1LCAxNTcsIDE1NywKKyAgICAxNTcsIDE1NywgMTU3LCAxNTcsIDE1NywgMTU3LCAxNTgsIDE1OCwgMTU4LCAxNTgsIDE1OCwgMTU4LCAxNTgsIDE1OCwgMTY1LAorICAgIDE2NSwgMTY1LCAxNjUsIDE2NSwgMTY1LCAxNjUsIDE2NSwgMTY2LCAxNjYsIDE2NiwgMTY2LCAxNjYsIDE2NiwgMTY2LCAxNjYsCisgICAgMTY4LCAxNjgsIDE2OCwgMTY4LCAxNjgsIDE2OCwgMTY4LCAxNjgsIDE3NCwgMTc0LCAxNzQsIDE3NCwgMTc0LCAxNzQsIDE3NCwKKyAgICAxNzQsIDE3NSwgMTc1LCAxNzUsIDE3NSwgMTc1LCAxNzUsIDE3NSwgMTc1LCAxODAsIDE4MCwgMTgwLCAxODAsIDE4MCwgMTgwLAorICAgIDE4MCwgMTgwLCAxODIsIDE4MiwgMTgyLCAxODIsIDE4MiwgMTgyLCAxODIsIDE4MiwgMTgzLCAxODMsIDE4MywgMTgzLCAxODMsCisgICAgMTgzLCAxODMsIDE4MywgMTg4LCAxODgsIDE4OCwgMTg4LCAxODgsIDE4OCwgMTg4LCAxODgsIDE5MSwgMTkxLCAxOTEsIDE5MSwKKyAgICAxOTEsIDE5MSwgMTkxLCAxOTEsIDE5NywgMTk3LCAxOTcsIDE5NywgMTk3LCAxOTcsIDE5NywgMTk3LCAyMzEsIDIzMSwgMjMxLAorICAgIDIzMSwgMjMxLCAyMzEsIDIzMSwgMjMxLCAyMzksIDIzOSwgMjM5LCAyMzksIDIzOSwgMjM5LCAyMzksIDIzOSwgOSwgICA5LAorICAgIDksICAgOSwgICAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0NCwgMTQ0LCAxNDQsIDE0NCwgMTQ1LCAxNDUsIDE0NSwgMTQ1LCAxNDgsCisgICAgMTQ4LCAxNDgsIDE0OCwgMTU5LCAxNTksIDE1OSwgMTU5LCAxNzEsIDE3MSwgMTcxLCAxNzEsIDIwNiwgMjA2LCAyMDYsIDIwNiwKKyAgICAyMTUsIDIxNSwgMjE1LCAyMTUsIDIyNSwgMjI1LCAyMjUsIDIyNSwgMjM2LCAyMzYsIDIzNiwgMjM2LCAyMzcsIDIzNywgMjM3LAorICAgIDIzNywgMTk5LCAxOTksIDIwNywgMjA3LCAyMzQsIDIzNCwgMjM1LCAyMzUsIDE5MiwgMTkzLCAyMDAsIDIwMSwgMjAyLCAyMDUsCisgICAgMjEwLCAyMTMsIDIxOCwgMjE5LCAyMzgsIDI0MCwgMjQyLCAyNDMsIDI1NSwgLTEsICAyMDMsIDIwMywgMjAzLCAyMDMsIDIwMywKKyAgICAyMDMsIDIwMywgMjAzLCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjExLCAyMTEsIDIxMSwgMjExLAorICAgIDIxMSwgMjExLCAyMTEsIDIxMSwgMjEyLCAyMTIsIDIxMiwgMjEyLCAyMTIsIDIxMiwgMjEyLCAyMTIsIDIxNCwgMjE0LCAyMTQsCisgICAgMjE0LCAyMTQsIDIxNCwgMjE0LCAyMTQsIDIyMSwgMjIxLCAyMjEsIDIyMSwgMjIxLCAyMjEsIDIyMSwgMjIxLCAyMjIsIDIyMiwKKyAgICAyMjIsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMjIyLCAyMjMsIDIyMywgMjIzLCAyMjMsIDIyMywgMjIzLCAyMjMsIDIyMywgMjQxLAorICAgIDI0MSwgMjQxLCAyNDEsIDI0MSwgMjQxLCAyNDEsIDI0MSwgMjQ0LCAyNDQsIDI0NCwgMjQ0LCAyNDQsIDI0NCwgMjQ0LCAyNDQsCisgICAgMjQ1LCAyNDUsIDI0NSwgMjQ1LCAyNDUsIDI0NSwgMjQ1LCAyNDUsIDI0NiwgMjQ2LCAyNDYsIDI0NiwgMjQ2LCAyNDYsIDI0NiwKKyAgICAyNDYsIDI0NywgMjQ3LCAyNDcsIDI0NywgMjQ3LCAyNDcsIDI0NywgMjQ3LCAyNDgsIDI0OCwgMjQ4LCAyNDgsIDI0OCwgMjQ4LAorICAgIDI0OCwgMjQ4LCAyNTAsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUxLCAyNTEsIDI1MSwgMjUxLCAyNTEsCisgICAgMjUxLCAyNTEsIDI1MSwgMjUyLCAyNTIsIDI1MiwgMjUyLCAyNTIsIDI1MiwgMjUyLCAyNTIsIDI1MywgMjUzLCAyNTMsIDI1MywKKyAgICAyNTMsIDI1MywgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyLCAgIDIsICAgMiwKKyAgICAyLCAgIDMsICAgMywgICAzLCAgIDMsICAgNCwgICA0LCAgIDQsICAgNCwgICA1LCAgIDUsICAgNSwgICA1LCAgIDYsICAgNiwKKyAgICA2LCAgIDYsICAgNywgICA3LCAgIDcsICAgNywgICA4LCAgIDgsICAgOCwgICA4LCAgIDExLCAgMTEsICAxMSwgIDExLCAgMTIsCisgICAgMTIsICAxMiwgIDEyLCAgMTQsICAxNCwgIDE0LCAgMTQsICAxNSwgIDE1LCAgMTUsICAxNSwgIDE2LCAgMTYsICAxNiwgIDE2LAorICAgIDE3LCAgMTcsICAxNywgIDE3LCAgMTgsICAxOCwgIDE4LCAgMTgsICAxOSwgIDE5LCAgMTksICAxOSwgIDIwLCAgMjAsICAyMCwKKyAgICAyMCwgIDIxLCAgMjEsICAyMSwgIDIxLCAgMjMsICAyMywgIDIzLCAgMjMsICAyNCwgIDI0LCAgMjQsICAyNCwgIDI1LCAgMjUsCisgICAgMjUsICAyNSwgIDI2LCAgMjYsICAyNiwgIDI2LCAgMjcsICAyNywgIDI3LCAgMjcsICAyOCwgIDI4LCAgMjgsICAyOCwgIDI5LAorICAgIDI5LCAgMjksICAyOSwgIDMwLCAgMzAsICAzMCwgIDMwLCAgMzEsICAzMSwgIDMxLCAgMzEsICAxMjcsIDEyNywgMTI3LCAxMjcsCisgICAgMjIwLCAyMjAsIDIyMCwgMjIwLCAyNDksIDI0OSwgMjQ5LCAyNDksIDEwLCAgMTMsICAyMiwgIDI1NiwgOTMsICA5MywgIDkzLAorICAgIDkzLCAgMTI2LCAxMjYsIDEyNiwgMTI2LCA5NCwgIDk0LCAgMTI1LCAxMjUsIDYwLCAgOTYsICAxMjMsIC0xLCAgOTIsICAxOTUsCisgICAgMjA4LCAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIDEyOCwKKyAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEzMCwgMTMwLCAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMCwgMTMwLAorICAgIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxNjIsIDE2MiwgMTYyLCAxNjIsIDE2MiwgMTYyLCAxNjIsCisgICAgMTYyLCAxODQsIDE4NCwgMTg0LCAxODQsIDE4NCwgMTg0LCAxODQsIDE4NCwgMTk0LCAxOTQsIDE5NCwgMTk0LCAxOTQsIDE5NCwKKyAgICAxOTQsIDE5NCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNiwgMjI2LCAyMjYsIDIyNiwgMjI2LAorICAgIDIyNiwgMjI2LCAyMjYsIDE1MywgMTUzLCAxNTMsIDE1MywgMTYxLCAxNjEsIDE2MSwgMTYxLCAxNjcsIDE2NywgMTY3LCAxNjcsCisgICAgMTcyLCAxNzIsIDE3MiwgMTcyLCAxNzYsIDE3NiwgMTc2LCAxNzYsIDE3NywgMTc3LCAxNzcsIDE3NywgMTc5LCAxNzksIDE3OSwKKyAgICAxNzksIDIwOSwgMjA5LCAyMDksIDIwOSwgMjE2LCAyMTYsIDIxNiwgMjE2LCAyMTcsIDIxNywgMjE3LCAyMTcsIDIyNywgMjI3LAorICAgIDIyNywgMjI3LCAyMjksIDIyOSwgMjI5LCAyMjksIDIzMCwgMjMwLCAyMzAsIDIzMCwgMTI5LCAxMjksIDEzMiwgMTMyLCAxMzMsCisgICAgMTMzLCAxMzQsIDEzNCwgMTM2LCAxMzYsIDE0NiwgMTQ2LCAxNTQsIDE1NCwgMTU2LCAxNTYsIDE2MCwgMTYwLCAxNjMsIDE2MywKKyAgICAxNjQsIDE2NCwgMTY5LCAxNjksIDE3MCwgMTcwLCAxNzMsIDE3MywgMTc4LCAxNzgsIDE4MSwgMTgxLCAxODUsIDE4NSwgMTg2LAorICAgIDE4NiwgMTg3LCAxODcsIDE4OSwgMTg5LCAxOTAsIDE5MCwgMTk2LCAxOTYsIDE5OCwgMTk4LCAyMjgsIDIyOCwgMjMyLCAyMzIsCisgICAgMjMzLCAyMzMsIDEsICAgMTM1LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQzLCAxNDcsIDE0OSwgMTUwLCAxNTEsIDE1MiwKKyAgICAxNTUsIDE1NywgMTU4LCAxNjUsIDE2NiwgMTY4LCAxNzQsIDE3NSwgMTgwLCAxODIsIDE4MywgMTg4LCAxOTEsIDE5NywgMjMxLAorICAgIDIzOSwgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIDksICAgOSwgICA5LAorICAgIDksICAgOSwgICA5LCAgIDksICAgOSwgICAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQ0LCAxNDQsCisgICAgMTQ0LCAxNDQsIDE0NCwgMTQ0LCAxNDQsIDE0NCwgMTQ1LCAxNDUsIDE0NSwgMTQ1LCAxNDUsIDE0NSwgMTQ1LCAxNDUsIDE0OCwKKyAgICAxNDgsIDE0OCwgMTQ4LCAxNDgsIDE0OCwgMTQ4LCAxNDgsIDE1OSwgMTU5LCAxNTksIDE1OSwgMTU5LCAxNTksIDE1OSwgMTU5LAorICAgIDE3MSwgMTcxLCAxNzEsIDE3MSwgMTcxLCAxNzEsIDE3MSwgMTcxLCAyMDYsIDIwNiwgMjA2LCAyMDYsIDIwNiwgMjA2LCAyMDYsCisgICAgMjA2LCAyMTUsIDIxNSwgMjE1LCAyMTUsIDIxNSwgMjE1LCAyMTUsIDIxNSwgMjI1LCAyMjUsIDIyNSwgMjI1LCAyMjUsIDIyNSwKKyAgICAyMjUsIDIyNSwgMjM2LCAyMzYsIDIzNiwgMjM2LCAyMzYsIDIzNiwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzcsIDIzNywgMjM3LAorICAgIDIzNywgMjM3LCAyMzcsIDE5OSwgMTk5LCAxOTksIDE5OSwgMjA3LCAyMDcsIDIwNywgMjA3LCAyMzQsIDIzNCwgMjM0LCAyMzQsCisgICAgMjM1LCAyMzUsIDIzNSwgMjM1LCAxOTIsIDE5MiwgMTkzLCAxOTMsIDIwMCwgMjAwLCAyMDEsIDIwMSwgMjAyLCAyMDIsIDIwNSwKKyAgICAyMDUsIDIxMCwgMjEwLCAyMTMsIDIxMywgMjE4LCAyMTgsIDIxOSwgMjE5LCAyMzgsIDIzOCwgMjQwLCAyNDAsIDI0MiwgMjQyLAorICAgIDI0MywgMjQzLCAyNTUsIDI1NSwgMjAzLCAyMDQsIDIxMSwgMjEyLCAyMTQsIDIyMSwgMjIyLCAyMjMsIDI0MSwgMjQ0LCAyNDUsCisgICAgMjQ2LCAyNDcsIDI0OCwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLAorICAgIDIsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDQsICAgNCwgICA0LCAgIDQsICAgNCwgICA0LAorICAgIDQsICAgNCwgICA1LCAgIDUsICAgNSwgICA1LCAgIDUsICAgNSwgICA1LCAgIDUsICAgNiwgICA2LCAgIDYsICAgNiwgICA2LAorICAgIDYsICAgNiwgICA2LCAgIDcsICAgNywgICA3LCAgIDcsICAgNywgICA3LCAgIDcsICAgNywgICA4LCAgIDgsICAgOCwgICA4LAorICAgIDgsICAgOCwgICA4LCAgIDgsICAgMTEsICAxMSwgIDExLCAgMTEsICAxMSwgIDExLCAgMTEsICAxMSwgIDEyLCAgMTIsICAxMiwKKyAgICAxMiwgIDEyLCAgMTIsICAxMiwgIDEyLCAgMTQsICAxNCwgIDE0LCAgMTQsICAxNCwgIDE0LCAgMTQsICAxNCwgIDE1LCAgMTUsCisgICAgMTUsICAxNSwgIDE1LCAgMTUsICAxNSwgIDE1LCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNiwgIDE3LAorICAgIDE3LCAgMTcsICAxNywgIDE3LCAgMTcsICAxNywgIDE3LCAgMTgsICAxOCwgIDE4LCAgMTgsICAxOCwgIDE4LCAgMTgsICAxOCwKKyAgICAxOSwgIDE5LCAgMTksICAxOSwgIDE5LCAgMTksICAxOSwgIDE5LCAgMjAsICAyMCwgIDIwLCAgMjAsICAyMCwgIDIwLCAgMjAsCisgICAgMjAsICAyMSwgIDIxLCAgMjEsICAyMSwgIDIxLCAgMjEsICAyMSwgIDIxLCAgMjMsICAyMywgIDIzLCAgMjMsICAyMywgIDIzLAorICAgIDIzLCAgMjMsICAyNCwgIDI0LCAgMjQsICAyNCwgIDI0LCAgMjQsICAyNCwgIDI0LCAgMjUsICAyNSwgIDI1LCAgMjUsICAyNSwKKyAgICAyNSwgIDI1LCAgMjUsICAyNiwgIDI2LCAgMjYsICAyNiwgIDI2LCAgMjYsICAyNiwgIDI2LCAgMjcsICAyNywgIDI3LCAgMjcsCisgICAgMjcsICAyNywgIDI3LCAgMjcsICAyOCwgIDI4LCAgMjgsICAyOCwgIDI4LCAgMjgsICAyOCwgIDI4LCAgMjksICAyOSwgIDI5LAorICAgIDI5LCAgMjksICAyOSwgIDI5LCAgMjksICAzMCwgIDMwLCAgMzAsICAzMCwgIDMwLCAgMzAsICAzMCwgIDMwLCAgMzEsICAzMSwKKyAgICAzMSwgIDMxLCAgMzEsICAzMSwgIDMxLCAgMzEsICAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMjIwLAorICAgIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjQ5LCAyNDksIDI0OSwgMjQ5LCAyNDksIDI0OSwgMjQ5LCAyNDksCisgICAgMTAsICAxMCwgIDEzLCAgMTMsICAyMiwgIDIyLCAgMjU2LCAyNTYsIDY3LCAgNjcsICA2NywgIDY3LCAgNjcsICA2NywgIDY3LAorICAgIDY3LCAgNjgsICA2OCwgIDY4LCAgNjgsICA2OCwgIDY4LCAgNjgsICA2OCwgIDk1LCAgOTUsICA5NSwgIDk1LCAgOTUsICA5NSwKKyAgICA5NSwgIDk1LCAgOTgsICA5OCwgIDk4LCAgOTgsICA5OCwgIDk4LCAgOTgsICA5OCwgIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLAorICAgIDEwMCwgMTAwLCAxMDAsIDEwMiwgMTAyLCAxMDIsIDEwMiwgMTAyLCAxMDIsIDEwMiwgMTAyLCAxMDMsIDEwMywgMTAzLCAxMDMsCisgICAgMTAzLCAxMDMsIDEwMywgMTAzLCAxMDQsIDEwNCwgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDQsIDEwNCwgMTA4LCAxMDgsIDEwOCwKKyAgICAxMDgsIDEwOCwgMTA4LCAxMDgsIDEwOCwgMTA5LCAxMDksIDEwOSwgMTA5LCAxMDksIDEwOSwgMTA5LCAxMDksIDExMCwgMTEwLAorICAgIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTQsCisgICAgMTE0LCAxMTQsIDExNCwgMTE0LCAxMTQsIDExNCwgMTE0LCAxMTcsIDExNywgMTE3LCAxMTcsIDExNywgMTE3LCAxMTcsIDExNywKKyAgICA1OCwgIDU4LCAgNTgsICA1OCwgIDY2LCAgNjYsICA2NiwgIDY2LCAgNjcsICA2NywgIDY3LCAgNjcsICA2OCwgIDY4LCAgNjgsCisgICAgNjgsICA2OSwgIDY5LCAgNjksICA2OSwgIDcwLCAgNzAsICA3MCwgIDcwLCAgNzEsICA3MSwgIDcxLCAgNzEsICA3MiwgIDcyLAorICAgIDcyLCAgNzIsICA3MywgIDczLCAgNzMsICA3MywgIDc0LCAgNzQsICA3NCwgIDc0LCAgNzUsICA3NSwgIDc1LCAgNzUsICA3NiwKKyAgICA3NiwgIDc2LCAgNzYsICA3NywgIDc3LCAgNzcsICA3NywgIDc4LCAgNzgsICA3OCwgIDc4LCAgNzksICA3OSwgIDc5LCAgNzksCisgICAgODAsICA4MCwgIDgwLCAgODAsICA4MSwgIDgxLCAgODEsICA4MSwgIDgyLCAgODIsICA4MiwgIDgyLCAgODMsICA4MywgIDgzLAorICAgIDgzLCAgODQsICA4NCwgIDg0LCAgODQsICA4NSwgIDg1LCAgODUsICA4NSwgIDg2LCAgODYsICA4NiwgIDg2LCAgODcsICA4NywKKyAgICA4NywgIDg3LCAgODksICA4OSwgIDg5LCAgODksICAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNywgMTA3LCAxMDcsIDEwNywgMTEzLAorICAgIDExMywgMTEzLCAxMTMsIDExOCwgMTE4LCAxMTgsIDExOCwgMTE5LCAxMTksIDExOSwgMTE5LCAxMjAsIDEyMCwgMTIwLCAxMjAsCisgICAgMTIxLCAxMjEsIDEyMSwgMTIxLCAxMjIsIDEyMiwgMTIyLCAxMjIsIDM4LCAgMzgsICA0MiwgIDQyLCAgNDQsICA0NCwgIDU5LAorICAgIDU5LCAgODgsICA4OCwgIDkwLCAgOTAsICAtMSwgIC0xLCAgLTEsICAtMSwgIDMzLCAgMzMsICAzMywgIDMzLCAgMzMsICAzMywKKyAgICAzMywgIDMzLCAgMzQsICAzNCwgIDM0LCAgMzQsICAzNCwgIDM0LCAgMzQsICAzNCwgIDQwLCAgNDAsICA0MCwgIDQwLCAgNDAsCisgICAgNDAsICA0MCwgIDQwLCAgNDEsICA0MSwgIDQxLCAgNDEsICA0MSwgIDQxLCAgNDEsICA0MSwgIDYzLCAgNjMsICA2MywgIDYzLAorICAgIDYzLCAgNjMsICA2MywgIDYzLCAgMzksICAzOSwgIDM5LCAgMzksICA0MywgIDQzLCAgNDMsICA0MywgIDEyNCwgMTI0LCAxMjQsCisgICAgMTI0LCAzNSwgIDM1LCAgNjIsICA2MiwgIDAsICAgMzYsICA2NCwgIDkxLCAgOTMsICAxMjYsIC0xLCAgLTEsICA5NCwgIDk0LAorICAgIDk0LCAgOTQsICA5NCwgIDk0LCAgOTQsICA5NCwgIDEyNSwgMTI1LCAxMjUsIDEyNSwgMTI1LCAxMjUsIDEyNSwgMTI1LCA2MCwKKyAgICA2MCwgIDYwLCAgNjAsICA5NiwgIDk2LCAgOTYsICA5NiwgIDEyMywgMTIzLCAxMjMsIDEyMywgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgOTIsICA5MiwgIDkyLCAgOTIsICAxOTUsIDE5NSwgMTk1LCAxOTUsIDIwOCwgMjA4LCAyMDgsIDIwOCwgMTI4LCAxMjgsIDEzMCwKKyAgICAxMzAsIDEzMSwgMTMxLCAxNjIsIDE2MiwgMTg0LCAxODQsIDE5NCwgMTk0LCAyMjQsIDIyNCwgMjI2LCAyMjYsIDE1MywgMTYxLAorICAgIDE2NywgMTcyLCAxNzYsIDE3NywgMTc5LCAyMDksIDIxNiwgMjE3LCAyMjcsIDIyOSwgMjMwLCAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAtMSwgIC0xLCAgLTEsICAxMjksIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI5LCAxMjksIDEyOSwgMTMyLCAxMzIsIDEzMiwgMTMyLAorICAgIDEzMiwgMTMyLCAxMzIsIDEzMiwgMTMzLCAxMzMsIDEzMywgMTMzLCAxMzMsIDEzMywgMTMzLCAxMzMsIDEzNCwgMTM0LCAxMzQsCisgICAgMTM0LCAxMzQsIDEzNCwgMTM0LCAxMzQsIDEzNiwgMTM2LCAxMzYsIDEzNiwgMTM2LCAxMzYsIDEzNiwgMTM2LCAxNDYsIDE0NiwKKyAgICAxNDYsIDE0NiwgMTQ2LCAxNDYsIDE0NiwgMTQ2LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU2LAorICAgIDE1NiwgMTU2LCAxNTYsIDE1NiwgMTU2LCAxNTYsIDE1NiwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsCisgICAgMTYzLCAxNjMsIDE2MywgMTYzLCAxNjMsIDE2MywgMTYzLCAxNjMsIDE2NCwgMTY0LCAxNjQsIDE2NCwgMTY0LCAxNjQsIDE2NCwKKyAgICAxNjQsIDE2OSwgMTY5LCAxNjksIDE2OSwgMTY5LCAxNjksIDE2OSwgMTY5LCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLAorICAgIDE3MCwgMTcwLCAxNzMsIDE3MywgMTczLCAxNzMsIDE3MywgMTczLCAxNzMsIDE3MywgMTc4LCAxNzgsIDE3OCwgMTc4LCAxNzgsCisgICAgMTc4LCAxNzgsIDE3OCwgMTgxLCAxODEsIDE4MSwgMTgxLCAxODEsIDE4MSwgMTgxLCAxODEsIDE4NSwgMTg1LCAxODUsIDE4NSwKKyAgICAxODUsIDE4NSwgMTg1LCAxODUsIDE4NiwgMTg2LCAxODYsIDE4NiwgMTg2LCAxODYsIDE4NiwgMTg2LCAxODcsIDE4NywgMTg3LAorICAgIDE4NywgMTg3LCAxODcsIDE4NywgMTg3LCAxODksIDE4OSwgMTg5LCAxODksIDE4OSwgMTg5LCAxODksIDE4OSwgMTkwLCAxOTAsCisgICAgMTkwLCAxOTAsIDE5MCwgMTkwLCAxOTAsIDE5MCwgMTk2LCAxOTYsIDE5NiwgMTk2LCAxOTYsIDE5NiwgMTk2LCAxOTYsIDE5OCwKKyAgICAxOTgsIDE5OCwgMTk4LCAxOTgsIDE5OCwgMTk4LCAxOTgsIDIyOCwgMjI4LCAyMjgsIDIyOCwgMjI4LCAyMjgsIDIyOCwgMjI4LAorICAgIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMyLCAyMzMsIDIzMywgMjMzLCAyMzMsIDIzMywgMjMzLCAyMzMsCisgICAgMjMzLCAxLCAgIDEsICAgMSwgICAxLCAgIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzgsIDEzOCwKKyAgICAxMzgsIDEzOCwgMTM5LCAxMzksIDEzOSwgMTM5LCAxNDAsIDE0MCwgMTQwLCAxNDAsIDE0MSwgMTQxLCAxNDEsIDE0MSwgMTQzLAorICAgIDE0MywgMTQzLCAxNDMsIDE0NywgMTQ3LCAxNDcsIDE0NywgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNTAsIDE1MCwgMTUwLCAxNTAsCisgICAgMTUxLCAxNTEsIDE1MSwgMTUxLCAxNTIsIDE1MiwgMTUyLCAxNTIsIDE1NSwgMTU1LCAxNTUsIDE1NSwgMTU3LCAxNTcsIDE1NywKKyAgICAxNTcsIDE1OCwgMTU4LCAxNTgsIDE1OCwgMTY1LCAxNjUsIDE2NSwgMTY1LCAxNjYsIDE2NiwgMTY2LCAxNjYsIDE2OCwgMTY4LAorICAgIDE2OCwgMTY4LCAxNzQsIDE3NCwgMTc0LCAxNzQsIDE3NSwgMTc1LCAxNzUsIDE3NSwgMTgwLCAxODAsIDE4MCwgMTgwLCAxODIsCisgICAgMTgyLCAxODIsIDE4MiwgMTgzLCAxODMsIDE4MywgMTgzLCAxODgsIDE4OCwgMTg4LCAxODgsIDE5MSwgMTkxLCAxOTEsIDE5MSwKKyAgICAxOTcsIDE5NywgMTk3LCAxOTcsIDIzMSwgMjMxLCAyMzEsIDIzMSwgMjM5LCAyMzksIDIzOSwgMjM5LCA5LCAgIDksICAgMTQyLAorICAgIDE0MiwgMTQ0LCAxNDQsIDE0NSwgMTQ1LCAxNDgsIDE0OCwgMTU5LCAxNTksIDE3MSwgMTcxLCAyMDYsIDIwNiwgMjE1LCAyMTUsCisgICAgMjI1LCAyMjUsIDIzNiwgMjM2LCAyMzcsIDIzNywgMTk5LCAyMDcsIDIzNCwgMjM1LCAxOTIsIDE5MiwgMTkyLCAxOTIsIDE5MiwKKyAgICAxOTIsIDE5MiwgMTkyLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMjAwLCAyMDAsIDIwMCwgMjAwLAorICAgIDIwMCwgMjAwLCAyMDAsIDIwMCwgMjAxLCAyMDEsIDIwMSwgMjAxLCAyMDEsIDIwMSwgMjAxLCAyMDEsIDIwMiwgMjAyLCAyMDIsCisgICAgMjAyLCAyMDIsIDIwMiwgMjAyLCAyMDIsIDIwNSwgMjA1LCAyMDUsIDIwNSwgMjA1LCAyMDUsIDIwNSwgMjA1LCAyMTAsIDIxMCwKKyAgICAyMTAsIDIxMCwgMjEwLCAyMTAsIDIxMCwgMjEwLCAyMTMsIDIxMywgMjEzLCAyMTMsIDIxMywgMjEzLCAyMTMsIDIxMywgMjE4LAorICAgIDIxOCwgMjE4LCAyMTgsIDIxOCwgMjE4LCAyMTgsIDIxOCwgMjE5LCAyMTksIDIxOSwgMjE5LCAyMTksIDIxOSwgMjE5LCAyMTksCisgICAgMjM4LCAyMzgsIDIzOCwgMjM4LCAyMzgsIDIzOCwgMjM4LCAyMzgsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwKKyAgICAyNDAsIDI0MiwgMjQyLCAyNDIsIDI0MiwgMjQyLCAyNDIsIDI0MiwgMjQyLCAyNDMsIDI0MywgMjQzLCAyNDMsIDI0MywgMjQzLAorICAgIDI0MywgMjQzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjAzLCAyMDMsIDIwMywgMjAzLCAyMDQsCisgICAgMjA0LCAyMDQsIDIwNCwgMjExLCAyMTEsIDIxMSwgMjExLCAyMTIsIDIxMiwgMjEyLCAyMTIsIDIxNCwgMjE0LCAyMTQsIDIxNCwKKyAgICAyMjEsIDIyMSwgMjIxLCAyMjEsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMjIzLCAyMjMsIDIyMywgMjIzLCAyNDEsIDI0MSwgMjQxLAorICAgIDI0MSwgMjQ0LCAyNDQsIDI0NCwgMjQ0LCAyNDUsIDI0NSwgMjQ1LCAyNDUsIDI0NiwgMjQ2LCAyNDYsIDI0NiwgMjQ3LCAyNDcsCisgICAgMjQ3LCAyNDcsIDI0OCwgMjQ4LCAyNDgsIDI0OCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTEsIDI1MSwgMjUxLCAyNTEsIDI1MiwKKyAgICAyNTIsIDI1MiwgMjUyLCAyNTMsIDI1MywgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMiwgICAyLCAgIDMsICAgMywKKyAgICA0LCAgIDQsICAgNSwgICA1LCAgIDYsICAgNiwgICA3LCAgIDcsICAgOCwgICA4LCAgIDExLCAgMTEsICAxMiwgIDEyLCAgMTQsCisgICAgMTQsICAxNSwgIDE1LCAgMTYsICAxNiwgIDE3LCAgMTcsICAxOCwgIDE4LCAgMTksICAxOSwgIDIwLCAgMjAsICAyMSwgIDIxLAorICAgIDIzLCAgMjMsICAyNCwgIDI0LCAgMjUsICAyNSwgIDI2LCAgMjYsICAyNywgIDI3LCAgMjgsICAyOCwgIDI5LCAgMjksICAzMCwKKyAgICAzMCwgIDMxLCAgMzEsICAxMjcsIDEyNywgMjIwLCAyMjAsIDI0OSwgMjQ5LCAtMSwgIC0xLCAgMTAsICAxMCwgIDEwLCAgMTAsCisgICAgMTAsICAxMCwgIDEwLCAgMTAsICAxMywgIDEzLCAgMTMsICAxMywgIDEzLCAgMTMsICAxMywgIDEzLCAgMjIsICAyMiwgIDIyLAorICAgIDIyLCAgMjIsICAyMiwgIDIyLCAgMjIsICAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgNDUsICA0NSwKKyAgICA0NSwgIDQ1LCAgNDUsICA0NSwgIDQ1LCAgNDUsICA0NiwgIDQ2LCAgNDYsICA0NiwgIDQ2LCAgNDYsICA0NiwgIDQ2LCAgNDcsCisgICAgNDcsICA0NywgIDQ3LCAgNDcsICA0NywgIDQ3LCAgNDcsICA1MSwgIDUxLCAgNTEsICA1MSwgIDUxLCAgNTEsICA1MSwgIDUxLAorICAgIDUyLCAgNTIsICA1MiwgIDUyLCAgNTIsICA1MiwgIDUyLCAgNTIsICA1MywgIDUzLCAgNTMsICA1MywgIDUzLCAgNTMsICA1MywKKyAgICA1MywgIDU0LCAgNTQsICA1NCwgIDU0LCAgNTQsICA1NCwgIDU0LCAgNTQsICA1NSwgIDU1LCAgNTUsICA1NSwgIDU1LCAgNTUsCisgICAgNTUsICA1NSwgIDU2LCAgNTYsICA1NiwgIDU2LCAgNTYsICA1NiwgIDU2LCAgNTYsICA1NywgIDU3LCAgNTcsICA1NywgIDU3LAorICAgIDU3LCAgNTcsICA1NywgIDUwLCAgNTAsICA1MCwgIDUwLCAgNTAsICA1MCwgIDUwLCAgNTAsICA5NywgIDk3LCAgOTcsICA5NywKKyAgICA5NywgIDk3LCAgOTcsICA5NywgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICAxMDEsIDEwMSwgMTAxLAorICAgIDEwMSwgMTAxLCAxMDEsIDEwMSwgMTAxLCAxMDUsIDEwNSwgMTA1LCAxMDUsIDEwNSwgMTA1LCAxMDUsIDEwNSwgMTExLCAxMTEsCisgICAgMTExLCAxMTEsIDExMSwgMTExLCAxMTEsIDExMSwgMTE1LCAxMTUsIDExNSwgMTE1LCAxMTUsIDExNSwgMTE1LCAxMTUsIDExNiwKKyAgICAxMTYsIDExNiwgMTE2LCAxMTYsIDExNiwgMTE2LCAxMTYsIDMyLCAgMzIsICAzMiwgIDMyLCAgMzcsICAzNywgIDM3LCAgMzcsCisgICAgNDUsICA0NSwgIDQ1LCAgNDUsICA0NiwgIDQ2LCAgNDYsICA0NiwgIDQ3LCAgNDcsICA0NywgIDQ3LCAgNTEsICA1MSwgIDUxLAorICAgIDUxLCAgNTIsICA1MiwgIDUyLCAgNTIsICA1MywgIDUzLCAgNTMsICA1MywgIDU0LCAgNTQsICA1NCwgIDU0LCAgNTUsICA1NSwKKyAgICA1NSwgIDU1LCAgNTYsICA1NiwgIDU2LCAgNTYsICA1NywgIDU3LCAgNTcsICA1NywgIDYxLCAgNjEsICA2MSwgIDYxLCAgNjUsCisgICAgNjUsICA2NSwgIDY1LCAgOTUsICA5NSwgIDk1LCAgOTUsICA5OCwgIDk4LCAgOTgsICA5OCwgIDEwMCwgMTAwLCAxMDAsIDEwMCwKKyAgICAxMDIsIDEwMiwgMTAyLCAxMDIsIDEwMywgMTAzLCAxMDMsIDEwMywgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDgsIDEwOCwgMTA4LAorICAgIDEwOCwgMTA5LCAxMDksIDEwOSwgMTA5LCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMiwgMTEyLCAxMTIsIDExMiwgMTE0LCAxMTQsCisgICAgMTE0LCAxMTQsIDExNywgMTE3LCAxMTcsIDExNywgNTgsICA1OCwgIDY2LCAgNjYsICA2NywgIDY3LCAgNjgsICA2OCwgIDY5LAorICAgIDY5LCAgNzAsICA3MCwgIDcxLCAgNzEsICA3MiwgIDcyLCAgNzMsICA3MywgIDc0LCAgNzQsICA3NSwgIDc1LCAgNzYsICA3NiwKKyAgICA3NywgIDc3LCAgNzgsICA3OCwgIDc5LCAgNzksICA4MCwgIDgwLCAgODEsICA4MSwgIDgyLCAgODIsICA4MywgIDgzLCAgODQsCisgICAgODQsICA4NSwgIDg1LCAgODYsICA4NiwgIDg3LCAgODcsICA4OSwgIDg5LCAgMTA2LCAxMDYsIDEwNywgMTA3LCAxMTMsIDExMywKKyAgICAxMTgsIDExOCwgMTE5LCAxMTksIDEyMCwgMTIwLCAxMjEsIDEyMSwgMTIyLCAxMjIsIDM4LCAgNDIsICA0NCwgIDU5LCAgODgsCisgICAgOTAsICAtMSwgIC0xLCAgMzMsICAzMywgIDMzLCAgMzMsICAzNCwgIDM0LCAgMzQsICAzNCwgIDQwLCAgNDAsICA0MCwgIDQwLAorICAgIDQxLCAgNDEsICA0MSwgIDQxLCAgNjMsICA2MywgIDYzLCAgNjMsICAzOSwgIDM5LCAgNDMsICA0MywgIDEyNCwgMTI0LCAzNSwKKyAgICA2MiwgIC0xLCAgLTEsICAtMSwgIC0xLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDM2LCAgMzYsCisgICAgMzYsICAzNiwgIDM2LCAgMzYsICAzNiwgIDM2LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDkxLAorICAgIDkxLCAgOTEsICA5MSwgIDkxLCAgOTEsICA5MSwgIDkxLCAgOTMsICA5MywgIDkzLCAgOTMsICA5MywgIDkzLCAgOTMsICA5MywKKyAgICAxMjYsIDEyNiwgMTI2LCAxMjYsIDEyNiwgMTI2LCAxMjYsIDEyNiwgOTQsICA5NCwgIDk0LCAgOTQsICAxMjUsIDEyNSwgMTI1LAorICAgIDEyNSwgNjAsICA2MCwgIDk2LCAgOTYsICAxMjMsIDEyMywgLTEsICAtMSwgIDkyLCAgOTIsICAxOTUsIDE5NSwgMjA4LCAyMDgsCisgICAgMTI4LCAxMzAsIDEzMSwgMTYyLCAxODQsIDE5NCwgMjI0LCAyMjYsIC0xLCAgLTEsICAxNTMsIDE1MywgMTUzLCAxNTMsIDE1MywKKyAgICAxNTMsIDE1MywgMTUzLCAxNjEsIDE2MSwgMTYxLCAxNjEsIDE2MSwgMTYxLCAxNjEsIDE2MSwgMTY3LCAxNjcsIDE2NywgMTY3LAorICAgIDE2NywgMTY3LCAxNjcsIDE2NywgMTcyLCAxNzIsIDE3MiwgMTcyLCAxNzIsIDE3MiwgMTcyLCAxNzIsIDE3NiwgMTc2LCAxNzYsCisgICAgMTc2LCAxNzYsIDE3NiwgMTc2LCAxNzYsIDE3NywgMTc3LCAxNzcsIDE3NywgMTc3LCAxNzcsIDE3NywgMTc3LCAxNzksIDE3OSwKKyAgICAxNzksIDE3OSwgMTc5LCAxNzksIDE3OSwgMTc5LCAyMDksIDIwOSwgMjA5LCAyMDksIDIwOSwgMjA5LCAyMDksIDIwOSwgMjE2LAorICAgIDIxNiwgMjE2LCAyMTYsIDIxNiwgMjE2LCAyMTYsIDIxNiwgMjE3LCAyMTcsIDIxNywgMjE3LCAyMTcsIDIxNywgMjE3LCAyMTcsCisgICAgMjI3LCAyMjcsIDIyNywgMjI3LCAyMjcsIDIyNywgMjI3LCAyMjcsIDIyOSwgMjI5LCAyMjksIDIyOSwgMjI5LCAyMjksIDIyOSwKKyAgICAyMjksIDIzMCwgMjMwLCAyMzAsIDIzMCwgMjMwLCAyMzAsIDIzMCwgMjMwLCAxMjksIDEyOSwgMTI5LCAxMjksIDEzMiwgMTMyLAorICAgIDEzMiwgMTMyLCAxMzMsIDEzMywgMTMzLCAxMzMsIDEzNCwgMTM0LCAxMzQsIDEzNCwgMTM2LCAxMzYsIDEzNiwgMTM2LCAxNDYsCisgICAgMTQ2LCAxNDYsIDE0NiwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTYsIDE1NiwgMTU2LCAxNTYsIDE2MCwgMTYwLCAxNjAsIDE2MCwKKyAgICAxNjMsIDE2MywgMTYzLCAxNjMsIDE2NCwgMTY0LCAxNjQsIDE2NCwgMTY5LCAxNjksIDE2OSwgMTY5LCAxNzAsIDE3MCwgMTcwLAorICAgIDE3MCwgMTczLCAxNzMsIDE3MywgMTczLCAxNzgsIDE3OCwgMTc4LCAxNzgsIDE4MSwgMTgxLCAxODEsIDE4MSwgMTg1LCAxODUsCisgICAgMTg1LCAxODUsIDE4NiwgMTg2LCAxODYsIDE4NiwgMTg3LCAxODcsIDE4NywgMTg3LCAxODksIDE4OSwgMTg5LCAxODksIDE5MCwKKyAgICAxOTAsIDE5MCwgMTkwLCAxOTYsIDE5NiwgMTk2LCAxOTYsIDE5OCwgMTk4LCAxOTgsIDE5OCwgMjI4LCAyMjgsIDIyOCwgMjI4LAorICAgIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMzLCAyMzMsIDIzMywgMjMzLCAxLCAgIDEsICAgMTM1LCAxMzUsIDEzNywgMTM3LCAxMzgsCisgICAgMTM4LCAxMzksIDEzOSwgMTQwLCAxNDAsIDE0MSwgMTQxLCAxNDMsIDE0MywgMTQ3LCAxNDcsIDE0OSwgMTQ5LCAxNTAsIDE1MCwKKyAgICAxNTEsIDE1MSwgMTUyLCAxNTIsIDE1NSwgMTU1LCAxNTcsIDE1NywgMTU4LCAxNTgsIDE2NSwgMTY1LCAxNjYsIDE2NiwgMTY4LAorICAgIDE2OCwgMTc0LCAxNzQsIDE3NSwgMTc1LCAxODAsIDE4MCwgMTgyLCAxODIsIDE4MywgMTgzLCAxODgsIDE4OCwgMTkxLCAxOTEsCisgICAgMTk3LCAxOTcsIDIzMSwgMjMxLCAyMzksIDIzOSwgOSwgICAxNDIsIDE0NCwgMTQ1LCAxNDgsIDE1OSwgMTcxLCAyMDYsIDIxNSwKKyAgICAyMjUsIDIzNiwgMjM3LCAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIDE5OSwgMTk5LAorICAgIDE5OSwgMTk5LCAxOTksIDE5OSwgMTk5LCAxOTksIDIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMzQsCisgICAgMjM0LCAyMzQsIDIzNCwgMjM0LCAyMzQsIDIzNCwgMjM0LCAyMzUsIDIzNSwgMjM1LCAyMzUsIDIzNSwgMjM1LCAyMzUsIDIzNSwKKyAgICAxOTIsIDE5MiwgMTkyLCAxOTIsIDE5MywgMTkzLCAxOTMsIDE5MywgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDEsIDIwMSwgMjAxLAorICAgIDIwMSwgMjAyLCAyMDIsIDIwMiwgMjAyLCAyMDUsIDIwNSwgMjA1LCAyMDUsIDIxMCwgMjEwLCAyMTAsIDIxMCwgMjEzLCAyMTMsCisgICAgMjEzLCAyMTMsIDIxOCwgMjE4LCAyMTgsIDIxOCwgMjE5LCAyMTksIDIxOSwgMjE5LCAyMzgsIDIzOCwgMjM4LCAyMzgsIDI0MCwKKyAgICAyNDAsIDI0MCwgMjQwLCAyNDIsIDI0MiwgMjQyLCAyNDIsIDI0MywgMjQzLCAyNDMsIDI0MywgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDIwMywgMjAzLCAyMDQsIDIwNCwgMjExLCAyMTEsIDIxMiwgMjEyLCAyMTQsIDIxNCwgMjIxLCAyMjEsIDIyMiwgMjIyLCAyMjMsCisgICAgMjIzLCAyNDEsIDI0MSwgMjQ0LCAyNDQsIDI0NSwgMjQ1LCAyNDYsIDI0NiwgMjQ3LCAyNDcsIDI0OCwgMjQ4LCAyNTAsIDI1MCwKKyAgICAyNTEsIDI1MSwgMjUyLCAyNTIsIDI1MywgMjUzLCAyNTQsIDI1NCwgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwKKyAgICAxMSwgIDEyLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsCisgICAgMjgsICAyOSwgIDMwLCAgMzEsICAxMjcsIDIyMCwgMjQ5LCAtMSwgIDEwLCAgMTAsICAxMCwgIDEwLCAgMTMsICAxMywgIDEzLAorICAgIDEzLCAgMjIsICAyMiwgIDIyLCAgMjIsICAyNTYsIDI1NiwgMjU2LCAyNTYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBpbnZlcnNlX2Jhc2U2NFsyNTZdID0geworICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDYyLCAgMjU1LAorICAgIDI1NSwgMjU1LCA2MywgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgMjU1LCAyNTUsCisgICAgMjU1LCA2NCwgIDI1NSwgMjU1LCAyNTUsIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksCisgICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LAorICAgIDI1LCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywKKyAgICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsCisgICAgNDksICA1MCwgIDUxLCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LAorfTsKKworLyogZW1pc3Npb24gaGVscGVycyAqLworc3RhdGljIGludCBvbl9oZHIoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBncnBjX21kZWxlbSAqbWQsCisgICAgICAgICAgICAgICAgICBpbnQgYWRkX3RvX3RhYmxlKSB7CisgIGlmIChhZGRfdG9fdGFibGUpIHsKKyAgICBpZiAoIWdycGNfY2h0dHAyX2hwdGJsX2FkZCgmcC0+dGFibGUsIG1kKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHAtPm9uX2hlYWRlcihwLT5vbl9oZWFkZXJfdXNlcl9kYXRhLCBtZCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgZ3JwY19tZHN0ciAqdGFrZV9zdHJpbmcoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0cikgeworICBncnBjX21kc3RyICpzID0gZ3JwY19tZHN0cl9mcm9tX2J1ZmZlcigodWludDhfdCAqKXN0ci0+c3RyLCBzdHItPmxlbmd0aCk7CisgIHN0ci0+bGVuZ3RoID0gMDsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIGp1bXAgdG8gdGhlIG5leHQgc3RhdGUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbmV4dChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgcC0+c3RhdGUgPSAqcC0+bmV4dF9zdGF0ZSsrOworICByZXR1cm4gcC0+c3RhdGUocCwgY3VyLCBlbmQpOworfQorCisvKiBiZWdpbiBwYXJzaW5nIGEgaGVhZGVyOiBhbGwgZnVuY3Rpb25hbGl0eSBpcyBlbmNvZGVkIGludG8gbG9va3VwIHRhYmxlcworICAgYWJvdmUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfYmVnaW4oZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBpZiAoY3VyID09IGVuZCkgeworICAgIHAtPnN0YXRlID0gcGFyc2VfYmVnaW47CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gZmlyc3RfYnl0ZV9hY3Rpb25bZmlyc3RfYnl0ZV9sdXRbKmN1cl1dKHAsIGN1ciwgZW5kKTsKK30KKworLyogc3RyZWFtIGRlcGVuZGVuY3kgYW5kIHByaW9yaXRpemF0aW9uIGRhdGE6IHdlIGp1c3Qgc2tpcCBpdCAqLworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fd2VpZ2h0KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBpZiAoY3VyID09IGVuZCkgeworICAgIHAtPnN0YXRlID0gcGFyc2Vfc3RyZWFtX3dlaWdodDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiBwLT5hZnRlcl9wcmlvcml0aXphdGlvbihwLCBjdXIgKyAxLCBlbmQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV9kZXAzKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICBwLT5zdGF0ZSA9IHBhcnNlX3N0cmVhbV9kZXAzOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIHBhcnNlX3N0cmVhbV93ZWlnaHQocCwgY3VyICsgMSwgZW5kKTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fZGVwMihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJlYW1fZGVwMjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiBwYXJzZV9zdHJlYW1fZGVwMyhwLCBjdXIgKyAxLCBlbmQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV9kZXAxKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICBwLT5zdGF0ZSA9IHBhcnNlX3N0cmVhbV9kZXAxOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIHBhcnNlX3N0cmVhbV9kZXAyKHAsIGN1ciArIDEsIGVuZCk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX2RlcDAoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBpZiAoY3VyID09IGVuZCkgeworICAgIHAtPnN0YXRlID0gcGFyc2Vfc3RyZWFtX2RlcDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gcGFyc2Vfc3RyZWFtX2RlcDEocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogZW1pdCBhbiBpbmRleGVkIGZpZWxkOyBmb3Igbm93IGp1c3QgbG9ncyBpdCB0byBjb25zb2xlOyBqdW1wcyB0bworICAgYmVnaW4gdGhlIG5leHQgZmllbGQgb24gY29tcGxldGlvbiAqLworc3RhdGljIGludCBmaW5pc2hfaW5kZXhlZF9maWVsZChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIGdycGNfbWRlbGVtICptZCA9IGdycGNfY2h0dHAyX2hwdGJsX2xvb2t1cCgmcC0+dGFibGUsIHAtPmluZGV4KTsKKyAgaWYgKG1kID09IE5VTEwpIHsKKyAgICBpZiAoZ3JwY19odHRwX3RyYWNlKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgSFBBQ0sgaW5kZXggcmVjZWl2ZWQ6ICVkIiwgcC0+aW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICBHUlBDX01ERUxFTV9SRUYobWQpOworICByZXR1cm4gb25faGRyKHAsIG1kLCAwKSAmJiBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGFuIGluZGV4ZWQgZmllbGQgd2l0aCBpbmRleCA8IDEyNyAqLworc3RhdGljIGludCBwYXJzZV9pbmRleGVkX2ZpZWxkKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKKyAgcC0+aW5kZXggPSAoKmN1cikgJiAweDdmOworICByZXR1cm4gZmluaXNoX2luZGV4ZWRfZmllbGQocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogcGFyc2UgYW4gaW5kZXhlZCBmaWVsZCB3aXRoIGluZGV4ID49IDEyNyAqLworc3RhdGljIGludCBwYXJzZV9pbmRleGVkX2ZpZWxkX3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0geworICAgICAgZmluaXNoX2luZGV4ZWRfZmllbGR9OworICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKKyAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOworICBwLT5pbmRleCA9IDB4N2Y7CisgIHAtPnBhcnNpbmcudmFsdWUgPSAmcC0+aW5kZXg7CisgIHJldHVybiBwYXJzZV92YWx1ZTAocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogZmluaXNoIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aCBpbmNyZW1lbnRhbCBpbmRleGluZzoganVzdCBsb2csIGFuZCBqdW1wIHRvICcKKyAgIGJlZ2luICovCitzdGF0aWMgaW50IGZpbmlzaF9saXRoZHJfaW5jaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgZ3JwY19tZGVsZW0gKm1kID0gZ3JwY19jaHR0cDJfaHB0YmxfbG9va3VwKCZwLT50YWJsZSwgcC0+aW5kZXgpOworICBHUFJfQVNTRVJUKG1kICE9IE5VTEwpOyAvKiBoYW5kbGVkIGluIHN0cmluZyBwYXJzaW5nICovCisgIHJldHVybiBvbl9oZHIocCwgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfUkVGKG1kLT5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlX3N0cmluZyhwLCAmcC0+dmFsdWUpKSwKKyAgICAgICAgICAgICAgICAxKSAmJgorICAgICAgICAgcGFyc2VfYmVnaW4ocCwgY3VyLCBlbmQpOworfQorCisvKiBmaW5pc2ggYSBsaXRlcmFsIGhlYWRlciB3aXRoIGluY3JlbWVudGFsIGluZGV4aW5nIHdpdGggbm8gaW5kZXggKi8KK3N0YXRpYyBpbnQgZmluaXNoX2xpdGhkcl9pbmNpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgcmV0dXJuIG9uX2hkcihwLCBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3ModGFrZV9zdHJpbmcocCwgJnAtPmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vfc3RyaW5nKHAsICZwLT52YWx1ZSkpLAorICAgICAgICAgICAgICAgIDEpICYmCisgICAgICAgICBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPCA2MyAqLworc3RhdGljIGludCBwYXJzZV9saXRoZHJfaW5jaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7CisgICAgICBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9pbmRleGVkX2tleSwgZmluaXNoX2xpdGhkcl9pbmNpZHh9OworICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKKyAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOworICBwLT5pbmRleCA9ICgqY3VyKSAmIDB4M2Y7CisgIHJldHVybiBwYXJzZV9zdHJpbmdfcHJlZml4KHAsIGN1ciArIDEsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPj0gNjMgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX2luY2lkeF94KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIHN0YXRpYyBjb25zdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUgYW5kX3RoZW5bXSA9IHsKKyAgICAgIHBhcnNlX3N0cmluZ19wcmVmaXgsIHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2luZGV4ZWRfa2V5LAorICAgICAgZmluaXNoX2xpdGhkcl9pbmNpZHh9OworICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKKyAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOworICBwLT5pbmRleCA9IDB4M2Y7CisgIHAtPnBhcnNpbmcudmFsdWUgPSAmcC0+aW5kZXg7CisgIHJldHVybiBwYXJzZV92YWx1ZTAocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogcGFyc2UgYSBsaXRlcmFsIGhlYWRlciB3aXRoIGluY3JlbWVudGFsIGluZGV4aW5nOyBpbmRleCA9IDAgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX2luY2lkeF92KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIHN0YXRpYyBjb25zdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUgYW5kX3RoZW5bXSA9IHsKKyAgICAgIHBhcnNlX2tleV9zdHJpbmcsIHBhcnNlX3N0cmluZ19wcmVmaXgsCisgICAgICBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9saXRlcmFsX2tleSwgZmluaXNoX2xpdGhkcl9pbmNpZHhfdn07CisgIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAwOworICBwLT5uZXh0X3N0YXRlID0gYW5kX3RoZW47CisgIHJldHVybiBwYXJzZV9zdHJpbmdfcHJlZml4KHAsIGN1ciArIDEsIGVuZCk7Cit9CisKKy8qIGZpbmlzaCBhIGxpdGVyYWwgaGVhZGVyIHdpdGhvdXQgaW5jcmVtZW50YWwgaW5kZXhpbmcgKi8KK3N0YXRpYyBpbnQgZmluaXNoX2xpdGhkcl9ub3RpZHgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBncnBjX21kZWxlbSAqbWQgPSBncnBjX2NodHRwMl9ocHRibF9sb29rdXAoJnAtPnRhYmxlLCBwLT5pbmRleCk7CisgIEdQUl9BU1NFUlQobWQgIT0gTlVMTCk7IC8qIGhhbmRsZWQgaW4gc3RyaW5nIHBhcnNpbmcgKi8KKyAgcmV0dXJuIG9uX2hkcihwLCBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoR1JQQ19NRFNUUl9SRUYobWQtPmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vfc3RyaW5nKHAsICZwLT52YWx1ZSkpLAorICAgICAgICAgICAgICAgIDApICYmCisgICAgICAgICBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Cit9CisKKy8qIGZpbmlzaCBhIGxpdGVyYWwgaGVhZGVyIHdpdGhvdXQgaW5jcmVtZW50YWwgaW5kZXhpbmcgd2l0aCBpbmRleCA9IDAgKi8KK3N0YXRpYyBpbnQgZmluaXNoX2xpdGhkcl9ub3RpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgcmV0dXJuIG9uX2hkcihwLCBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3ModGFrZV9zdHJpbmcocCwgJnAtPmtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vfc3RyaW5nKHAsICZwLT52YWx1ZSkpLAorICAgICAgICAgICAgICAgIDApICYmCisgICAgICAgICBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aG91dCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPCAxNSAqLworc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7CisgICAgICBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9pbmRleGVkX2tleSwgZmluaXNoX2xpdGhkcl9ub3RpZHh9OworICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKKyAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOworICBwLT5pbmRleCA9ICgqY3VyKSAmIDB4ZjsKKyAgcmV0dXJuIHBhcnNlX3N0cmluZ19wcmVmaXgocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogcGFyc2UgYSBsaXRlcmFsIGhlYWRlciB3aXRob3V0IGluY3JlbWVudGFsIGluZGV4aW5nOyBpbmRleCA+PSAxNSAqLworc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4X3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0geworICAgICAgcGFyc2Vfc3RyaW5nX3ByZWZpeCwgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXksCisgICAgICBmaW5pc2hfbGl0aGRyX25vdGlkeH07CisgIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAwOworICBwLT5uZXh0X3N0YXRlID0gYW5kX3RoZW47CisgIHAtPmluZGV4ID0gMHhmOworICBwLT5wYXJzaW5nLnZhbHVlID0gJnAtPmluZGV4OworICByZXR1cm4gcGFyc2VfdmFsdWUwKHAsIGN1ciArIDEsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aG91dCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPT0gMCAqLworc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4X3YoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0geworICAgICAgcGFyc2Vfa2V5X3N0cmluZywgcGFyc2Vfc3RyaW5nX3ByZWZpeCwKKyAgICAgIHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2xpdGVyYWxfa2V5LCBmaW5pc2hfbGl0aGRyX25vdGlkeF92fTsKKyAgcC0+ZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZCA9IDA7CisgIHAtPm5leHRfc3RhdGUgPSBhbmRfdGhlbjsKKyAgcmV0dXJuIHBhcnNlX3N0cmluZ19wcmVmaXgocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogZmluaXNoIGEgbGl0ZXJhbCBoZWFkZXIgdGhhdCBpcyBuZXZlciBpbmRleGVkICovCitzdGF0aWMgaW50IGZpbmlzaF9saXRoZHJfbnZyaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgZ3JwY19tZGVsZW0gKm1kID0gZ3JwY19jaHR0cDJfaHB0YmxfbG9va3VwKCZwLT50YWJsZSwgcC0+aW5kZXgpOworICBHUFJfQVNTRVJUKG1kICE9IE5VTEwpOyAvKiBoYW5kbGVkIGluIHN0cmluZyBwYXJzaW5nICovCisgIHJldHVybiBvbl9oZHIocCwgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfUkVGKG1kLT5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlX3N0cmluZyhwLCAmcC0+dmFsdWUpKSwKKyAgICAgICAgICAgICAgICAwKSAmJgorICAgICAgICAgcGFyc2VfYmVnaW4ocCwgY3VyLCBlbmQpOworfQorCisvKiBmaW5pc2ggYSBsaXRlcmFsIGhlYWRlciB0aGF0IGlzIG5ldmVyIGluZGV4ZWQgd2l0aCBhbiBleHRyYSB2YWx1ZSAqLworc3RhdGljIGludCBmaW5pc2hfbGl0aGRyX252cmlkeF92KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICByZXR1cm4gb25faGRyKHAsIGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyh0YWtlX3N0cmluZyhwLCAmcC0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZV9zdHJpbmcocCwgJnAtPnZhbHVlKSksCisgICAgICAgICAgICAgICAgMCkgJiYKKyAgICAgICAgIHBhcnNlX2JlZ2luKHAsIGN1ciwgZW5kKTsKK30KKworLyogcGFyc2UgYSBsaXRlcmFsIGhlYWRlciB0aGF0IGlzIG5ldmVyIGluZGV4ZWQ7IGluZGV4IDwgMTUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX252cmlkeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0geworICAgICAgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXksIGZpbmlzaF9saXRoZHJfbnZyaWR4fTsKKyAgcC0+ZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZCA9IDA7CisgIHAtPm5leHRfc3RhdGUgPSBhbmRfdGhlbjsKKyAgcC0+aW5kZXggPSAoKmN1cikgJiAweGY7CisgIHJldHVybiBwYXJzZV9zdHJpbmdfcHJlZml4KHAsIGN1ciArIDEsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgdGhhdCBpcyBuZXZlciBpbmRleGVkOyBpbmRleCA+PSAxNSAqLworc3RhdGljIGludCBwYXJzZV9saXRoZHJfbnZyaWR4X3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0geworICAgICAgcGFyc2Vfc3RyaW5nX3ByZWZpeCwgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXksCisgICAgICBmaW5pc2hfbGl0aGRyX252cmlkeH07CisgIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAwOworICBwLT5uZXh0X3N0YXRlID0gYW5kX3RoZW47CisgIHAtPmluZGV4ID0gMHhmOworICBwLT5wYXJzaW5nLnZhbHVlID0gJnAtPmluZGV4OworICByZXR1cm4gcGFyc2VfdmFsdWUwKHAsIGN1ciArIDEsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgdGhhdCBpcyBuZXZlciBpbmRleGVkOyBpbmRleCA9PSAwICovCitzdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9udnJpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7CisgICAgICBwYXJzZV9rZXlfc3RyaW5nLCBwYXJzZV9zdHJpbmdfcHJlZml4LAorICAgICAgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfbGl0ZXJhbF9rZXksIGZpbmlzaF9saXRoZHJfbnZyaWR4X3Z9OworICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKKyAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOworICByZXR1cm4gcGFyc2Vfc3RyaW5nX3ByZWZpeChwLCBjdXIgKyAxLCBlbmQpOworfQorCisvKiBmaW5pc2ggcGFyc2luZyBhIG1heCB0YWJsZSBzaXplIGNoYW5nZSAqLworc3RhdGljIGludCBmaW5pc2hfbWF4X3RibF9zaXplKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBpZiAoZ3JwY19odHRwX3RyYWNlKSB7CisgICAgZ3ByX2xvZyhHUFJfSU5GTywgIk1BWCBUQUJMRSBTSVpFOiAlZCIsIHAtPmluZGV4KTsKKyAgfQorICByZXR1cm4gZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X2N1cnJlbnRfdGFibGVfc2l6ZSgmcC0+dGFibGUsIHAtPmluZGV4KSAmJgorICAgICAgICAgcGFyc2VfYmVnaW4ocCwgY3VyLCBlbmQpOworfQorCisvKiBwYXJzZSBhIG1heCB0YWJsZSBzaXplIGNoYW5nZSwgbWF4IHNpemUgPCAxNSAqLworc3RhdGljIGludCBwYXJzZV9tYXhfdGJsX3NpemUoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgaWYgKHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQtLTsKKyAgcC0+aW5kZXggPSAoKmN1cikgJiAweDFmOworICByZXR1cm4gZmluaXNoX21heF90Ymxfc2l6ZShwLCBjdXIgKyAxLCBlbmQpOworfQorCisvKiBwYXJzZSBhIG1heCB0YWJsZSBzaXplIGNoYW5nZSwgbWF4IHNpemUgPj0gMTUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbWF4X3RibF9zaXplX3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7CisgICAgICBmaW5pc2hfbWF4X3RibF9zaXplfTsKKyAgaWYgKHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQtLTsKKyAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOworICBwLT5pbmRleCA9IDB4MWY7CisgIHAtPnBhcnNpbmcudmFsdWUgPSAmcC0+aW5kZXg7CisgIHJldHVybiBwYXJzZV92YWx1ZTAocCwgY3VyICsgMSwgZW5kKTsKK30KKworLyogYSBwYXJzZSBlcnJvcjogamFtIHRoZSBwYXJzZSBzdGF0ZSBpbnRvIHBhcnNlX2Vycm9yLCBhbmQgcmV0dXJuIGVycm9yICovCitzdGF0aWMgaW50IHBhcnNlX2Vycm9yKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgcC0+c3RhdGUgPSBwYXJzZV9lcnJvcjsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaWxsZWdhbF9vcChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgR1BSX0FTU0VSVChjdXIgIT0gZW5kKTsKKyAgaWYgKGdycGNfaHR0cF90cmFjZSkgeworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiSWxsZWdhbCBocGFjayBvcCBjb2RlICVkIiwgKmN1cik7CisgIH0KKyAgcmV0dXJuIHBhcnNlX2Vycm9yKHAsIGN1ciwgZW5kKTsKK30KKworLyogcGFyc2UgdGhlIDFzdCBieXRlIG9mIGEgdmFyaW50IGludG8gcC0+cGFyc2luZy52YWx1ZQorICAgbm8gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWUwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgcC0+c3RhdGUgPSBwYXJzZV92YWx1ZTA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAqcC0+cGFyc2luZy52YWx1ZSArPSAoKmN1cikgJiAweDdmOworCisgIGlmICgoKmN1cikgJiAweDgwKSB7CisgICAgcmV0dXJuIHBhcnNlX3ZhbHVlMShwLCBjdXIgKyAxLCBlbmQpOworICB9IGVsc2UgeworICAgIHJldHVybiBwYXJzZV9uZXh0KHAsIGN1ciArIDEsIGVuZCk7CisgIH0KK30KKworLyogcGFyc2UgdGhlIDJuZCBieXRlIG9mIGEgdmFyaW50IGludG8gcC0+cGFyc2luZy52YWx1ZQorICAgbm8gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdmFsdWUxKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgcC0+c3RhdGUgPSBwYXJzZV92YWx1ZTE7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAqcC0+cGFyc2luZy52YWx1ZSArPSAoKCh1aW50MzJfdCkqY3VyKSAmIDB4N2YpIDw8IDc7CisKKyAgaWYgKCgqY3VyKSAmIDB4ODApIHsKKyAgICByZXR1cm4gcGFyc2VfdmFsdWUyKHAsIGN1ciArIDEsIGVuZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKKyAgfQorfQorCisvKiBwYXJzZSB0aGUgM3JkIGJ5dGUgb2YgYSB2YXJpbnQgaW50byBwLT5wYXJzaW5nLnZhbHVlCisgICBubyBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLworc3RhdGljIGludCBwYXJzZV92YWx1ZTIoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICBwLT5zdGF0ZSA9IHBhcnNlX3ZhbHVlMjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgICpwLT5wYXJzaW5nLnZhbHVlICs9ICgoKHVpbnQzMl90KSpjdXIpICYgMHg3ZikgPDwgMTQ7CisKKyAgaWYgKCgqY3VyKSAmIDB4ODApIHsKKyAgICByZXR1cm4gcGFyc2VfdmFsdWUzKHAsIGN1ciArIDEsIGVuZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKKyAgfQorfQorCisvKiBwYXJzZSB0aGUgNHRoIGJ5dGUgb2YgYSB2YXJpbnQgaW50byBwLT5wYXJzaW5nLnZhbHVlCisgICBubyBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLworc3RhdGljIGludCBwYXJzZV92YWx1ZTMoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICBwLT5zdGF0ZSA9IHBhcnNlX3ZhbHVlMzsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgICpwLT5wYXJzaW5nLnZhbHVlICs9ICgoKHVpbnQzMl90KSpjdXIpICYgMHg3ZikgPDwgMjE7CisKKyAgaWYgKCgqY3VyKSAmIDB4ODApIHsKKyAgICByZXR1cm4gcGFyc2VfdmFsdWU0KHAsIGN1ciArIDEsIGVuZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKKyAgfQorfQorCisvKiBwYXJzZSB0aGUgNXRoIGJ5dGUgb2YgYSB2YXJpbnQgaW50byBwLT5wYXJzaW5nLnZhbHVlCisgICBkZXBlbmRpbmcgb24gdGhlIGJ5dGUsIHdlIG1heSBvdmVyZmxvdywgYW5kIGNhcmUgbXVzdCBiZSB0YWtlbiAqLworc3RhdGljIGludCBwYXJzZV92YWx1ZTQoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgdWludDhfdCBjOworICB1aW50MzJfdCBjdXJfdmFsdWU7CisgIHVpbnQzMl90IGFkZF92YWx1ZTsKKworICBpZiAoY3VyID09IGVuZCkgeworICAgIHAtPnN0YXRlID0gcGFyc2VfdmFsdWU0OworICAgIHJldHVybiAxOworICB9CisKKyAgYyA9ICgqY3VyKSAmIDB4N2Y7CisgIGlmIChjID4gMHhmKSB7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGN1cl92YWx1ZSA9ICpwLT5wYXJzaW5nLnZhbHVlOworICBhZGRfdmFsdWUgPSAoKHVpbnQzMl90KWMpIDw8IDI4OworICBpZiAoYWRkX3ZhbHVlID4gMHhmZmZmZmZmZnUgLSBjdXJfdmFsdWUpIHsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgKnAtPnBhcnNpbmcudmFsdWUgPSBjdXJfdmFsdWUgKyBhZGRfdmFsdWU7CisKKyAgaWYgKCgqY3VyKSAmIDB4ODApIHsKKyAgICByZXR1cm4gcGFyc2VfdmFsdWU1dXAocCwgY3VyICsgMSwgZW5kKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcGFyc2VfbmV4dChwLCBjdXIgKyAxLCBlbmQpOworICB9CisKK2Vycm9yOgorICBpZiAoZ3JwY19odHRwX3RyYWNlKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAiaW50ZWdlciBvdmVyZmxvdyBpbiBocGFjayBpbnRlZ2VyIGRlY29kaW5nOiBoYXZlIDB4JTA4eCwgIgorICAgICAgICAgICAgImdvdCBieXRlIDB4JTAyeCBvbiBieXRlIDUiLAorICAgICAgICAgICAgKnAtPnBhcnNpbmcudmFsdWUsICpjdXIpOworICB9CisgIHJldHVybiBwYXJzZV9lcnJvcihwLCBjdXIsIGVuZCk7Cit9CisKKy8qIHBhcnNlIGFueSB0cmFpbGluZyBieXRlcyBpbiBhIHZhcmludDogaXQncyBwb3NzaWJsZSB0byBhcHBlbmQgYW4gYXJiaXRyYXJ5CisgICBudW1iZXIgb2YgMHg4MCdzIGFuZCBub3QgYWZmZWN0IHRoZSB2YWx1ZSAtIGEgemVybyB3aWxsIHRlcm1pbmF0ZSAtIGFuZAorICAgYW55dGhpbmcgZWxzZSB3aWxsIG92ZXJmbG93ICovCitzdGF0aWMgaW50IHBhcnNlX3ZhbHVlNXVwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgd2hpbGUgKGN1ciAhPSBlbmQgJiYgKmN1ciA9PSAweDgwKSB7CisgICAgKytjdXI7CisgIH0KKworICBpZiAoY3VyID09IGVuZCkgeworICAgIHAtPnN0YXRlID0gcGFyc2VfdmFsdWU1dXA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoKmN1ciA9PSAwKSB7CisgICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKKyAgfQorCisgIGlmIChncnBjX2h0dHBfdHJhY2UpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwKKyAgICAgICAgICAgICJpbnRlZ2VyIG92ZXJmbG93IGluIGhwYWNrIGludGVnZXIgZGVjb2Rpbmc6IGhhdmUgMHglMDh4LCAiCisgICAgICAgICAgICAiZ290IGJ5dGUgMHglMDJ4IHNvbWV0aW1lIGFmdGVyIGJ5dGUgNSIsCisgICAgICAgICAgICAqcC0+cGFyc2luZy52YWx1ZSwgKmN1cik7CisgIH0KKyAgcmV0dXJuIHBhcnNlX2Vycm9yKHAsIGN1ciwgZW5kKTsKK30KKworLyogcGFyc2UgYSBzdHJpbmcgcHJlZml4ICovCitzdGF0aWMgaW50IHBhcnNlX3N0cmluZ19wcmVmaXgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJpbmdfcHJlZml4OworICAgIHJldHVybiAxOworICB9CisKKyAgcC0+c3RybGVuID0gKCpjdXIpICYgMHg3ZjsKKyAgcC0+aHVmZiA9ICgqY3VyKSA+PiA3OworICBpZiAocC0+c3RybGVuID09IDB4N2YpIHsKKyAgICBwLT5wYXJzaW5nLnZhbHVlID0gJnAtPnN0cmxlbjsKKyAgICByZXR1cm4gcGFyc2VfdmFsdWUwKHAsIGN1ciArIDEsIGVuZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKKyAgfQorfQorCisvKiBhcHBlbmQgc29tZSBieXRlcyB0byBhIHN0cmluZyAqLworc3RhdGljIHZvaWQgYXBwZW5kX2J5dGVzKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CisgIGlmIChsZW5ndGggKyBzdHItPmxlbmd0aCA+IHN0ci0+Y2FwYWNpdHkpIHsKKyAgICBHUFJfQVNTRVJUKHN0ci0+bGVuZ3RoICsgbGVuZ3RoIDw9IFVJTlQzMl9NQVgpOworICAgIHN0ci0+Y2FwYWNpdHkgPSAodWludDMyX3QpKHN0ci0+bGVuZ3RoICsgbGVuZ3RoKTsKKyAgICBzdHItPnN0ciA9IGdwcl9yZWFsbG9jKHN0ci0+c3RyLCBzdHItPmNhcGFjaXR5KTsKKyAgfQorICBtZW1jcHkoc3RyLT5zdHIgKyBzdHItPmxlbmd0aCwgZGF0YSwgbGVuZ3RoKTsKKyAgR1BSX0FTU0VSVChsZW5ndGggPD0gVUlOVDMyX01BWCAtIHN0ci0+bGVuZ3RoKTsKKyAgc3RyLT5sZW5ndGggKz0gKHVpbnQzMl90KWxlbmd0aDsKK30KKworc3RhdGljIGludCBhcHBlbmRfc3RyaW5nKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RyaW5nICpzdHIgPSBwLT5wYXJzaW5nLnN0cjsKKyAgdWludDMyX3QgYml0czsKKyAgdWludDhfdCBkZWNvZGVkWzNdOworICBzd2l0Y2ggKChiaW5hcnlfc3RhdGUpcC0+YmluYXJ5KSB7CisgICAgY2FzZSBOT1RfQklOQVJZOgorICAgICAgYXBwZW5kX2J5dGVzKHN0ciwgY3VyLCAoc2l6ZV90KShlbmQgLSBjdXIpKTsKKyAgICAgIHJldHVybiAxOworICAgIGI2NF9ieXRlMDoKKyAgICBjYXNlIEI2NF9CWVRFMDoKKyAgICAgIGlmIChjdXIgPT0gZW5kKSB7CisgICAgICAgIHAtPmJpbmFyeSA9IEI2NF9CWVRFMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBiaXRzID0gaW52ZXJzZV9iYXNlNjRbKmN1cl07CisgICAgICArK2N1cjsKKyAgICAgIGlmIChiaXRzID09IDI1NSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBlbHNlIGlmIChiaXRzID09IDY0KQorICAgICAgICBnb3RvIGI2NF9ieXRlMDsKKyAgICAgIHAtPmJhc2U2NF9idWZmZXIgPSBiaXRzIDw8IDE4OworICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgYjY0X2J5dGUxOgorICAgIGNhc2UgQjY0X0JZVEUxOgorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+YmluYXJ5ID0gQjY0X0JZVEUxOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGJpdHMgPSBpbnZlcnNlX2Jhc2U2NFsqY3VyXTsKKyAgICAgICsrY3VyOworICAgICAgaWYgKGJpdHMgPT0gMjU1KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UgaWYgKGJpdHMgPT0gNjQpCisgICAgICAgIGdvdG8gYjY0X2J5dGUxOworICAgICAgcC0+YmFzZTY0X2J1ZmZlciB8PSBiaXRzIDw8IDEyOworICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgYjY0X2J5dGUyOgorICAgIGNhc2UgQjY0X0JZVEUyOgorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcC0+YmluYXJ5ID0gQjY0X0JZVEUyOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGJpdHMgPSBpbnZlcnNlX2Jhc2U2NFsqY3VyXTsKKyAgICAgICsrY3VyOworICAgICAgaWYgKGJpdHMgPT0gMjU1KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UgaWYgKGJpdHMgPT0gNjQpCisgICAgICAgIGdvdG8gYjY0X2J5dGUyOworICAgICAgcC0+YmFzZTY0X2J1ZmZlciB8PSBiaXRzIDw8IDY7CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBiNjRfYnl0ZTM6CisgICAgY2FzZSBCNjRfQllURTM6CisgICAgICBpZiAoY3VyID09IGVuZCkgeworICAgICAgICBwLT5iaW5hcnkgPSBCNjRfQllURTM7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgYml0cyA9IGludmVyc2VfYmFzZTY0WypjdXJdOworICAgICAgKytjdXI7CisgICAgICBpZiAoYml0cyA9PSAyNTUpCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZSBpZiAoYml0cyA9PSA2NCkKKyAgICAgICAgZ290byBiNjRfYnl0ZTM7CisgICAgICBwLT5iYXNlNjRfYnVmZmVyIHw9IGJpdHM7CisgICAgICBiaXRzID0gcC0+YmFzZTY0X2J1ZmZlcjsKKyAgICAgIGRlY29kZWRbMF0gPSAodWludDhfdCkoYml0cyA+PiAxNik7CisgICAgICBkZWNvZGVkWzFdID0gKHVpbnQ4X3QpKGJpdHMgPj4gOCk7CisgICAgICBkZWNvZGVkWzJdID0gKHVpbnQ4X3QpKGJpdHMpOworICAgICAgYXBwZW5kX2J5dGVzKHN0ciwgZGVjb2RlZCwgMyk7CisgICAgICBnb3RvIGI2NF9ieXRlMDsKKyAgfQorICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMSk7Cit9CisKKy8qIGFwcGVuZCBhIG51bGwgdGVybWluYXRvciB0byBhIHN0cmluZyAqLworc3RhdGljIGludCBmaW5pc2hfc3RyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCkgeworICB1aW50OF90IHRlcm1pbmF0b3IgPSAwOworICB1aW50OF90IGRlY29kZWRbMl07CisgIHVpbnQzMl90IGJpdHM7CisgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0ciA9IHAtPnBhcnNpbmcuc3RyOworICBzd2l0Y2ggKChiaW5hcnlfc3RhdGUpcC0+YmluYXJ5KSB7CisgICAgY2FzZSBOT1RfQklOQVJZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBCNjRfQllURTA6CisgICAgICBicmVhazsKKyAgICBjYXNlIEI2NF9CWVRFMToKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaWxsZWdhbCBiYXNlNjQgZW5jb2RpbmciKTsKKyAgICAgIHJldHVybiAwOyAvKiBpbGxlZ2FsIGVuY29kaW5nICovCisgICAgY2FzZSBCNjRfQllURTI6CisgICAgICBiaXRzID0gcC0+YmFzZTY0X2J1ZmZlcjsKKyAgICAgIGlmIChiaXRzICYgMHhmZmZmKSB7CisgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAidHJhaWxpbmcgYml0cyBpbiBiYXNlNjQgZW5jb2Rpbmc6IDB4JTA0eCIsCisgICAgICAgICAgICAgICAgYml0cyAmIDB4ZmZmZik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZGVjb2RlZFswXSA9ICh1aW50OF90KShiaXRzID4+IDE2KTsKKyAgICAgIGFwcGVuZF9ieXRlcyhzdHIsIGRlY29kZWQsIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCNjRfQllURTM6CisgICAgICBiaXRzID0gcC0+YmFzZTY0X2J1ZmZlcjsKKyAgICAgIGlmIChiaXRzICYgMHhmZikgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInRyYWlsaW5nIGJpdHMgaW4gYmFzZTY0IGVuY29kaW5nOiAweCUwMngiLAorICAgICAgICAgICAgICAgIGJpdHMgJiAweGZmKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBkZWNvZGVkWzBdID0gKHVpbnQ4X3QpKGJpdHMgPj4gMTYpOworICAgICAgZGVjb2RlZFsxXSA9ICh1aW50OF90KShiaXRzID4+IDgpOworICAgICAgYXBwZW5kX2J5dGVzKHN0ciwgZGVjb2RlZCwgMik7CisgICAgICBicmVhazsKKyAgfQorICBhcHBlbmRfYnl0ZXMoc3RyLCAmdGVybWluYXRvciwgMSk7CisgIHAtPnBhcnNpbmcuc3RyLT5sZW5ndGgtLTsgLyogZG9uJ3QgYWN0dWFsbHkgY291bnQgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gMTsKK30KKworLyogZGVjb2RlIGEgbmliYmxlIGZyb20gYSBodWZmbWFuIGVuY29kZWQgc3RyZWFtICovCitzdGF0aWMgaW50IGh1ZmZfbmliYmxlKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgdWludDhfdCBuaWJibGUpIHsKKyAgaW50MTZfdCBlbWl0ID0gZW1pdF9zdWJfdGJsWzE2ICogZW1pdF90YmxbcC0+aHVmZl9zdGF0ZV0gKyBuaWJibGVdOworICBpbnQxNl90IG5leHQgPSBuZXh0X3N1Yl90YmxbMTYgKiBuZXh0X3RibFtwLT5odWZmX3N0YXRlXSArIG5pYmJsZV07CisgIGlmIChlbWl0ICE9IC0xKSB7CisgICAgaWYgKGVtaXQgPj0gMCAmJiBlbWl0IDwgMjU2KSB7CisgICAgICB1aW50OF90IGMgPSAodWludDhfdCllbWl0OworICAgICAgaWYgKCFhcHBlbmRfc3RyaW5nKHAsICZjLCAoJmMpICsgMSkpIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoZW1pdCA9PSAyNTYpOworICAgIH0KKyAgfQorICBwLT5odWZmX3N0YXRlID0gbmV4dDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIGRlY29kZSBmdWxsIGJ5dGVzIGZyb20gYSBodWZmbWFuIGVuY29kZWQgc3RyZWFtICovCitzdGF0aWMgaW50IGFkZF9odWZmX2J5dGVzKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgZm9yICg7IGN1ciAhPSBlbmQ7ICsrY3VyKSB7CisgICAgaWYgKCFodWZmX25pYmJsZShwLCAqY3VyID4+IDQpIHx8ICFodWZmX25pYmJsZShwLCAqY3VyICYgMHhmKSkgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIGRlY29kZSBzb21lIHN0cmluZyBieXRlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBkZWNvZGluZyBtb2RlCisgICAoaHVmZm1hbiBvciBub3QpICovCitzdGF0aWMgaW50IGFkZF9zdHJfYnl0ZXMoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIGlmIChwLT5odWZmKSB7CisgICAgcmV0dXJuIGFkZF9odWZmX2J5dGVzKHAsIGN1ciwgZW5kKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gYXBwZW5kX3N0cmluZyhwLCBjdXIsIGVuZCk7CisgIH0KK30KKworLyogcGFyc2UgYSBzdHJpbmcgLSB0cmllcyB0byBkbyBsYXJnZSBjaHVua3MgYXQgYSB0aW1lICovCitzdGF0aWMgaW50IHBhcnNlX3N0cmluZyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICBzaXplX3QgcmVtYWluaW5nID0gcC0+c3RybGVuIC0gcC0+c3RyZ290OworICBzaXplX3QgZ2l2ZW4gPSAoc2l6ZV90KShlbmQgLSBjdXIpOworICBpZiAocmVtYWluaW5nIDw9IGdpdmVuKSB7CisgICAgcmV0dXJuIGFkZF9zdHJfYnl0ZXMocCwgY3VyLCBjdXIgKyByZW1haW5pbmcpICYmIGZpbmlzaF9zdHIocCkgJiYKKyAgICAgICAgICAgcGFyc2VfbmV4dChwLCBjdXIgKyByZW1haW5pbmcsIGVuZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFhZGRfc3RyX2J5dGVzKHAsIGN1ciwgY3VyICsgZ2l2ZW4pKSByZXR1cm4gMDsKKyAgICBHUFJfQVNTRVJUKGdpdmVuIDw9IFVJTlQzMl9NQVggLSBwLT5zdHJnb3QpOworICAgIHAtPnN0cmdvdCArPSAodWludDMyX3QpZ2l2ZW47CisgICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJpbmc7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLyogYmVnaW4gcGFyc2luZyBhIHN0cmluZyAtIHBlcmZvcm1zIHNldHVwLCBjYWxscyBwYXJzZV9zdHJpbmcgKi8KK3N0YXRpYyBpbnQgYmVnaW5fcGFyc2Vfc3RyaW5nKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kLCB1aW50OF90IGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0cikgeworICBwLT5zdHJnb3QgPSAwOworICBzdHItPmxlbmd0aCA9IDA7CisgIHAtPnBhcnNpbmcuc3RyID0gc3RyOworICBwLT5odWZmX3N0YXRlID0gMDsKKyAgcC0+YmluYXJ5ID0gYmluYXJ5OworICByZXR1cm4gcGFyc2Vfc3RyaW5nKHAsIGN1ciwgZW5kKTsKK30KKworLyogcGFyc2UgdGhlIGtleSBzdHJpbmcgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfa2V5X3N0cmluZyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgcmV0dXJuIGJlZ2luX3BhcnNlX3N0cmluZyhwLCBjdXIsIGVuZCwgTk9UX0JJTkFSWSwgJnAtPmtleSk7Cit9CisKKy8qIGNoZWNrIGlmIGEga2V5IHJlcHJlc2VudHMgYSBiaW5hcnkgaGVhZGVyIG9yIG5vdCAqLwordHlwZWRlZiBlbnVtIHsgQklOQVJZX0hFQURFUiwgUExBSU5URVhUX0hFQURFUiwgRVJST1JfSEVBREVSIH0gaXNfYmluYXJ5X2hlYWRlcjsKKworc3RhdGljIGlzX2JpbmFyeV9oZWFkZXIgaXNfYmluYXJ5X2xpdGVyYWxfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCkgeworICByZXR1cm4gZ3JwY19pc19iaW5hcnlfaGVhZGVyKHAtPmtleS5zdHIsIHAtPmtleS5sZW5ndGgpID8gQklOQVJZX0hFQURFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUExBSU5URVhUX0hFQURFUjsKK30KKworc3RhdGljIGlzX2JpbmFyeV9oZWFkZXIgaXNfYmluYXJ5X2luZGV4ZWRfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCkgeworICBncnBjX21kZWxlbSAqZWxlbSA9IGdycGNfY2h0dHAyX2hwdGJsX2xvb2t1cCgmcC0+dGFibGUsIHAtPmluZGV4KTsKKyAgaWYgKCFlbGVtKSB7CisgICAgaWYgKGdycGNfaHR0cF90cmFjZSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIEhQQUNLIGluZGV4IHJlY2VpdmVkOiAlZCIsIHAtPmluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX0hFQURFUjsKKyAgfQorICByZXR1cm4gZ3JwY19pc19iaW5hcnlfaGVhZGVyKAorICAgICAgICAgICAgIChjb25zdCBjaGFyICopR1BSX1NMSUNFX1NUQVJUX1BUUihlbGVtLT5rZXktPnNsaWNlKSwKKyAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpKQorICAgICAgICAgICAgID8gQklOQVJZX0hFQURFUgorICAgICAgICAgICAgIDogUExBSU5URVhUX0hFQURFUjsKK30KKworLyogcGFyc2UgdGhlIHZhbHVlIHN0cmluZyAqLworc3RhdGljIGludCBwYXJzZV92YWx1ZV9zdHJpbmcoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQsIGlzX2JpbmFyeV9oZWFkZXIgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEJJTkFSWV9IRUFERVI6CisgICAgICByZXR1cm4gYmVnaW5fcGFyc2Vfc3RyaW5nKHAsIGN1ciwgZW5kLCBCNjRfQllURTAsICZwLT52YWx1ZSk7CisgICAgY2FzZSBQTEFJTlRFWFRfSEVBREVSOgorICAgICAgcmV0dXJuIGJlZ2luX3BhcnNlX3N0cmluZyhwLCBjdXIsIGVuZCwgTk9UX0JJTkFSWSwgJnAtPnZhbHVlKTsKKyAgICBjYXNlIEVSUk9SX0hFQURFUjoKKyAgICAgIHJldHVybiAwOworICB9CisgIC8qIEFkZCBjb2RlIHRvIHByZXZlbnQgcmV0dXJuIHdpdGhvdXQgdmFsdWUgZXJyb3IgKi8KKyAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuIDApOworfQorCitzdGF0aWMgaW50IHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2luZGV4ZWRfa2V5KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKKyAgcmV0dXJuIHBhcnNlX3ZhbHVlX3N0cmluZyhwLCBjdXIsIGVuZCwgaXNfYmluYXJ5X2luZGV4ZWRfaGVhZGVyKHApKTsKK30KKworc3RhdGljIGludCBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9saXRlcmFsX2tleShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7CisgIHJldHVybiBwYXJzZV92YWx1ZV9zdHJpbmcocCwgY3VyLCBlbmQsIGlzX2JpbmFyeV9saXRlcmFsX2hlYWRlcihwKSk7Cit9CisKKy8qIFBVQkxJQyBJTlRFUkZBQ0UgKi8KKworc3RhdGljIHZvaWQgb25faGVhZGVyX25vdF9zZXQodm9pZCAqdXNlcl9kYXRhLCBncnBjX21kZWxlbSAqbWQpIHsKKyAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX2luaXQoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwKSB7CisgIHAtPm9uX2hlYWRlciA9IG9uX2hlYWRlcl9ub3Rfc2V0OworICBwLT5vbl9oZWFkZXJfdXNlcl9kYXRhID0gTlVMTDsKKyAgcC0+c3RhdGUgPSBwYXJzZV9iZWdpbjsKKyAgcC0+a2V5LnN0ciA9IE5VTEw7CisgIHAtPmtleS5jYXBhY2l0eSA9IDA7CisgIHAtPmtleS5sZW5ndGggPSAwOworICBwLT52YWx1ZS5zdHIgPSBOVUxMOworICBwLT52YWx1ZS5jYXBhY2l0eSA9IDA7CisgIHAtPnZhbHVlLmxlbmd0aCA9IDA7CisgIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAyOworICBncnBjX2NodHRwMl9ocHRibF9pbml0KCZwLT50YWJsZSk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3NldF9oYXNfcHJpb3JpdHkoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwKSB7CisgIHAtPmFmdGVyX3ByaW9yaXRpemF0aW9uID0gcC0+c3RhdGU7CisgIHAtPnN0YXRlID0gcGFyc2Vfc3RyZWFtX2RlcDA7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX2Rlc3Ryb3koZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwKSB7CisgIGdycGNfY2h0dHAyX2hwdGJsX2Rlc3Ryb3koJnAtPnRhYmxlKTsKKyAgZ3ByX2ZyZWUocC0+a2V5LnN0cik7CisgIGdwcl9mcmVlKHAtPnZhbHVlLnN0cik7Cit9CisKK2ludCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiZWcsIGNvbnN0IHVpbnQ4X3QgKmVuZCkgeworICAvKiBUT0RPKGN0aWxsZXIpOiBsaW1pdCB0aGUgZGlzdGFuY2Ugb2YgZW5kIGZyb20gYmVnLCBhbmQgcGVyZm9ybSBtdWx0aXBsZQorICAgICBzdGVwcyBpbiB0aGUgZXZlbnQgb2YgYSBsYXJnZSBjaHVuayBvZiBkYXRhIHRvIGxpbWl0CisgICAgIHN0YWNrIHNwYWNlIHVzYWdlIHdoZW4gbm8gdGFpbCBjYWxsIG9wdGltaXphdGlvbiBpcworICAgICBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIHAtPnN0YXRlKHAsIGJlZywgZW5kKTsKK30KKworZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfaGVhZGVyX3BhcnNlcl9wYXJzZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqaHBhY2tfcGFyc2VyLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpIHsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwYXJzZXIgPSBocGFja19wYXJzZXI7CisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3BhcnNlIiwgMCk7CisgIGlmICghZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3BhcnNlKHBhcnNlciwgR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9FTkRfUFRSKHNsaWNlKSkpIHsKKyAgICBHUFJfVElNRVJfRU5EKCJncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UiLCAwKTsKKyAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKKyAgfQorICBpZiAoaXNfbGFzdCkgeworICAgIGlmIChwYXJzZXItPmlzX2JvdW5kYXJ5ICYmIHBhcnNlci0+c3RhdGUgIT0gcGFyc2VfYmVnaW4pIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgICAiZW5kIG9mIGhlYWRlciBmcmFtZSBub3QgYWxpZ25lZCB3aXRoIGEgaHBhY2sgcmVjb3JkIGJvdW5kYXJ5Iik7CisgICAgICBHUFJfVElNRVJfRU5EKCJncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UiLCAwKTsKKyAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOworICAgIH0KKyAgICAvKiBuZWVkIHRvIGNoZWNrIGZvciBudWxsIHN0cmVhbTogdGhpcyBjYW4gb2NjdXIgaWYgd2UgcmVjZWl2ZSBhbiBpbnZhbGlkCisgICAgICAgc3RyZWFtIGlkIG9uIGEgaGVhZGVyICovCisgICAgaWYgKHN0cmVhbV9wYXJzaW5nICE9IE5VTEwpIHsKKyAgICAgIGlmIChwYXJzZXItPmlzX2JvdW5kYXJ5KSB7CisgICAgICAgIHN0cmVhbV9wYXJzaW5nCisgICAgICAgICAgICAtPmdvdF9tZXRhZGF0YV9vbl9wYXJzZVtzdHJlYW1fcGFyc2luZy0+aGVhZGVyX2ZyYW1lc19yZWNlaXZlZF0gPSAxOworICAgICAgICBzdHJlYW1fcGFyc2luZy0+aGVhZGVyX2ZyYW1lc19yZWNlaXZlZCsrOworICAgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKHRyYW5zcG9ydF9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wYXJzaW5nKTsKKyAgICAgIH0KKyAgICAgIGlmIChwYXJzZXItPmlzX2VvZikgeworICAgICAgICBzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfY2xvc2UgPSAxOworICAgICAgfQorICAgIH0KKyAgICBwYXJzZXItPm9uX2hlYWRlciA9IG9uX2hlYWRlcl9ub3Rfc2V0OworICAgIHBhcnNlci0+b25faGVhZGVyX3VzZXJfZGF0YSA9IE5VTEw7CisgICAgcGFyc2VyLT5pc19ib3VuZGFyeSA9IDB4ZGU7CisgICAgcGFyc2VyLT5pc19lb2YgPSAweGRlOworICAgIHBhcnNlci0+ZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZCA9IDI7CisgIH0KKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3BhcnNlIiwgMCk7CisgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFkZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSFBBQ0tfUEFSU0VSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9IUEFDS19QQVJTRVJfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcjsKKwordHlwZWRlZiBpbnQgKCpncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUpKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpzdHI7CisgIHVpbnQzMl90IGxlbmd0aDsKKyAgdWludDMyX3QgY2FwYWNpdHk7Cit9IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmc7CisKK3N0cnVjdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXIgeworICAvKiB1c2VyIHNwZWNpZmllZCBjYWxsYmFjayBmb3IgZWFjaCBoZWFkZXIgb3V0cHV0ICovCisgIHZvaWQgKCpvbl9oZWFkZXIpKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKTsKKyAgdm9pZCAqb25faGVhZGVyX3VzZXJfZGF0YTsKKworICAvKiBjdXJyZW50IHBhcnNlIHN0YXRlIC0gb3IgYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgaXQgKi8KKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIHN0YXRlOworICAvKiBmdXR1cmUgc3RhdGVzIGRlcGVuZGVudCBvbiB0aGUgb3BlbmluZyBvcCBjb2RlICovCisgIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSAqbmV4dF9zdGF0ZTsKKyAgLyogd2hhdCB0byBkbyBhZnRlciBza2lwcGluZyBwcmlvcml0aXphdGlvbiBkYXRhICovCisgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhZnRlcl9wcmlvcml0aXphdGlvbjsKKyAgLyogdGhlIHZhbHVlIHdlJ3JlIGN1cnJlbnRseSBwYXJzaW5nICovCisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCAqdmFsdWU7CisgICAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0cmluZyAqc3RyOworICB9IHBhcnNpbmc7CisgIC8qIHN0cmluZyBwYXJhbWV0ZXJzIGZvciBlYWNoIGNodW5rICovCisgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcga2V5OworICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RyaW5nIHZhbHVlOworICAvKiBwYXJzZWQgaW5kZXggKi8KKyAgdWludDMyX3QgaW5kZXg7CisgIC8qIGxlbmd0aCBvZiBzb3VyY2UgYnl0ZXMgZm9yIHRoZSBjdXJyZW50bHkgcGFyc2luZyBzdHJpbmcgKi8KKyAgdWludDMyX3Qgc3RybGVuOworICAvKiBudW1iZXIgb2Ygc291cmNlIGJ5dGVzIHJlYWQgZm9yIHRoZSBjdXJyZW50bHkgcGFyc2luZyBzdHJpbmcgKi8KKyAgdWludDMyX3Qgc3RyZ290OworICAvKiBodWZmbWFuIGRlY29kaW5nIHN0YXRlICovCisgIGludDE2X3QgaHVmZl9zdGF0ZTsKKyAgLyogaXMgdGhlIHN0cmluZyBiZWluZyBkZWNvZGVkIGJpbmFyeT8gKi8KKyAgdWludDhfdCBiaW5hcnk7CisgIC8qIGlzIHRoZSBjdXJyZW50IHN0cmluZyBodWZmbWFuIGVuY29kZWQ/ICovCisgIHVpbnQ4X3QgaHVmZjsKKyAgLyogaXMgYSBkeW5hbWljIHRhYmxlIHVwZGF0ZSBhbGxvd2VkPyAqLworICB1aW50OF90IGR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQ7CisgIC8qIHNldCBieSBoaWdoZXIgbGF5ZXJzLCB1c2VkIGJ5IGdycGNfY2h0dHAyX2hlYWRlcl9wYXJzZXJfcGFyc2UgdG8gc2lnbmFsCisgICAgIGl0IHNob3VsZCBhcHBlbmQgYSBtZXRhZGF0YSBib3VuZGFyeSBhdCB0aGUgZW5kIG9mIGZyYW1lICovCisgIHVpbnQ4X3QgaXNfYm91bmRhcnk7CisgIHVpbnQ4X3QgaXNfZW9mOworICB1aW50MzJfdCBiYXNlNjRfYnVmZmVyOworCisgIC8qIGhwYWNrIHRhYmxlICovCisgIGdycGNfY2h0dHAyX2hwdGJsIHRhYmxlOworfTsKKwordm9pZCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfaW5pdChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnApOwordm9pZCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfZGVzdHJveShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnApOworCit2b2lkIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zZXRfaGFzX3ByaW9yaXR5KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCk7CisKKy8qIHJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yICovCitpbnQgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3BhcnNlKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmVnLCBjb25zdCB1aW50OF90ICplbmQpOworCisvKiB3cmFwcyBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UgdG8gcHJvdmlkZSBhIGZyYW1lIGxldmVsIHBhcnNlciBmb3IKKyAgIHRoZSB0cmFuc3BvcnQgKi8KK2dycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX2hlYWRlcl9wYXJzZXJfcGFyc2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmhwYWNrX3BhcnNlciwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSFBBQ0tfUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjZDFiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jCkBAIC0wLDAgKzEsMzY5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiCisKK2V4dGVybiBpbnQgZ3JwY19odHRwX3RyYWNlOworCitzdGF0aWMgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqa2V5OworICBjb25zdCBjaGFyICp2YWx1ZTsKK30gc3RhdGljX3RhYmxlW10gPSB7CisgICAgLyogMDogKi8KKyAgICB7TlVMTCwgTlVMTH0sCisgICAgLyogMTogKi8KKyAgICB7IjphdXRob3JpdHkiLCAiIn0sCisgICAgLyogMjogKi8KKyAgICB7IjptZXRob2QiLCAiR0VUIn0sCisgICAgLyogMzogKi8KKyAgICB7IjptZXRob2QiLCAiUE9TVCJ9LAorICAgIC8qIDQ6ICovCisgICAgeyI6cGF0aCIsICIvIn0sCisgICAgLyogNTogKi8KKyAgICB7IjpwYXRoIiwgIi9pbmRleC5odG1sIn0sCisgICAgLyogNjogKi8KKyAgICB7IjpzY2hlbWUiLCAiaHR0cCJ9LAorICAgIC8qIDc6ICovCisgICAgeyI6c2NoZW1lIiwgImh0dHBzIn0sCisgICAgLyogODogKi8KKyAgICB7IjpzdGF0dXMiLCAiMjAwIn0sCisgICAgLyogOTogKi8KKyAgICB7IjpzdGF0dXMiLCAiMjA0In0sCisgICAgLyogMTA6ICovCisgICAgeyI6c3RhdHVzIiwgIjIwNiJ9LAorICAgIC8qIDExOiAqLworICAgIHsiOnN0YXR1cyIsICIzMDQifSwKKyAgICAvKiAxMjogKi8KKyAgICB7IjpzdGF0dXMiLCAiNDAwIn0sCisgICAgLyogMTM6ICovCisgICAgeyI6c3RhdHVzIiwgIjQwNCJ9LAorICAgIC8qIDE0OiAqLworICAgIHsiOnN0YXR1cyIsICI1MDAifSwKKyAgICAvKiAxNTogKi8KKyAgICB7ImFjY2VwdC1jaGFyc2V0IiwgIiJ9LAorICAgIC8qIDE2OiAqLworICAgIHsiYWNjZXB0LWVuY29kaW5nIiwgImd6aXAsIGRlZmxhdGUifSwKKyAgICAvKiAxNzogKi8KKyAgICB7ImFjY2VwdC1sYW5ndWFnZSIsICIifSwKKyAgICAvKiAxODogKi8KKyAgICB7ImFjY2VwdC1yYW5nZXMiLCAiIn0sCisgICAgLyogMTk6ICovCisgICAgeyJhY2NlcHQiLCAiIn0sCisgICAgLyogMjA6ICovCisgICAgeyJhY2Nlc3MtY29udHJvbC1hbGxvdy1vcmlnaW4iLCAiIn0sCisgICAgLyogMjE6ICovCisgICAgeyJhZ2UiLCAiIn0sCisgICAgLyogMjI6ICovCisgICAgeyJhbGxvdyIsICIifSwKKyAgICAvKiAyMzogKi8KKyAgICB7ImF1dGhvcml6YXRpb24iLCAiIn0sCisgICAgLyogMjQ6ICovCisgICAgeyJjYWNoZS1jb250cm9sIiwgIiJ9LAorICAgIC8qIDI1OiAqLworICAgIHsiY29udGVudC1kaXNwb3NpdGlvbiIsICIifSwKKyAgICAvKiAyNjogKi8KKyAgICB7ImNvbnRlbnQtZW5jb2RpbmciLCAiIn0sCisgICAgLyogMjc6ICovCisgICAgeyJjb250ZW50LWxhbmd1YWdlIiwgIiJ9LAorICAgIC8qIDI4OiAqLworICAgIHsiY29udGVudC1sZW5ndGgiLCAiIn0sCisgICAgLyogMjk6ICovCisgICAgeyJjb250ZW50LWxvY2F0aW9uIiwgIiJ9LAorICAgIC8qIDMwOiAqLworICAgIHsiY29udGVudC1yYW5nZSIsICIifSwKKyAgICAvKiAzMTogKi8KKyAgICB7ImNvbnRlbnQtdHlwZSIsICIifSwKKyAgICAvKiAzMjogKi8KKyAgICB7ImNvb2tpZSIsICIifSwKKyAgICAvKiAzMzogKi8KKyAgICB7ImRhdGUiLCAiIn0sCisgICAgLyogMzQ6ICovCisgICAgeyJldGFnIiwgIiJ9LAorICAgIC8qIDM1OiAqLworICAgIHsiZXhwZWN0IiwgIiJ9LAorICAgIC8qIDM2OiAqLworICAgIHsiZXhwaXJlcyIsICIifSwKKyAgICAvKiAzNzogKi8KKyAgICB7ImZyb20iLCAiIn0sCisgICAgLyogMzg6ICovCisgICAgeyJob3N0IiwgIiJ9LAorICAgIC8qIDM5OiAqLworICAgIHsiaWYtbWF0Y2giLCAiIn0sCisgICAgLyogNDA6ICovCisgICAgeyJpZi1tb2RpZmllZC1zaW5jZSIsICIifSwKKyAgICAvKiA0MTogKi8KKyAgICB7ImlmLW5vbmUtbWF0Y2giLCAiIn0sCisgICAgLyogNDI6ICovCisgICAgeyJpZi1yYW5nZSIsICIifSwKKyAgICAvKiA0MzogKi8KKyAgICB7ImlmLXVubW9kaWZpZWQtc2luY2UiLCAiIn0sCisgICAgLyogNDQ6ICovCisgICAgeyJsYXN0LW1vZGlmaWVkIiwgIiJ9LAorICAgIC8qIDQ1OiAqLworICAgIHsibGluayIsICIifSwKKyAgICAvKiA0NjogKi8KKyAgICB7ImxvY2F0aW9uIiwgIiJ9LAorICAgIC8qIDQ3OiAqLworICAgIHsibWF4LWZvcndhcmRzIiwgIiJ9LAorICAgIC8qIDQ4OiAqLworICAgIHsicHJveHktYXV0aGVudGljYXRlIiwgIiJ9LAorICAgIC8qIDQ5OiAqLworICAgIHsicHJveHktYXV0aG9yaXphdGlvbiIsICIifSwKKyAgICAvKiA1MDogKi8KKyAgICB7InJhbmdlIiwgIiJ9LAorICAgIC8qIDUxOiAqLworICAgIHsicmVmZXJlciIsICIifSwKKyAgICAvKiA1MjogKi8KKyAgICB7InJlZnJlc2giLCAiIn0sCisgICAgLyogNTM6ICovCisgICAgeyJyZXRyeS1hZnRlciIsICIifSwKKyAgICAvKiA1NDogKi8KKyAgICB7InNlcnZlciIsICIifSwKKyAgICAvKiA1NTogKi8KKyAgICB7InNldC1jb29raWUiLCAiIn0sCisgICAgLyogNTY6ICovCisgICAgeyJzdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5IiwgIiJ9LAorICAgIC8qIDU3OiAqLworICAgIHsidHJhbnNmZXItZW5jb2RpbmciLCAiIn0sCisgICAgLyogNTg6ICovCisgICAgeyJ1c2VyLWFnZW50IiwgIiJ9LAorICAgIC8qIDU5OiAqLworICAgIHsidmFyeSIsICIifSwKKyAgICAvKiA2MDogKi8KKyAgICB7InZpYSIsICIifSwKKyAgICAvKiA2MTogKi8KKyAgICB7Ind3dy1hdXRoZW50aWNhdGUiLCAiIn0sCit9OworCitzdGF0aWMgdWludDMyX3QgZW50cmllc19mb3JfYnl0ZXModWludDMyX3QgYnl0ZXMpIHsKKyAgcmV0dXJuIChieXRlcyArIEdSUENfQ0hUVFAyX0hQQUNLX0VOVFJZX09WRVJIRUFEIC0gMSkgLworICAgICAgICAgR1JQQ19DSFRUUDJfSFBBQ0tfRU5UUllfT1ZFUkhFQUQ7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaHB0YmxfaW5pdChncnBjX2NodHRwMl9ocHRibCAqdGJsKSB7CisgIHNpemVfdCBpOworCisgIG1lbXNldCh0YmwsIDAsIHNpemVvZigqdGJsKSk7CisgIHRibC0+Y3VycmVudF90YWJsZV9ieXRlcyA9IHRibC0+bWF4X2J5dGVzID0KKyAgICAgIEdSUENfQ0hUVFAyX0lOSVRJQUxfSFBBQ0tfVEFCTEVfU0laRTsKKyAgdGJsLT5tYXhfZW50cmllcyA9IHRibC0+Y2FwX2VudHJpZXMgPQorICAgICAgZW50cmllc19mb3JfYnl0ZXModGJsLT5jdXJyZW50X3RhYmxlX2J5dGVzKTsKKyAgdGJsLT5lbnRzID0gZ3ByX21hbGxvYyhzaXplb2YoKnRibC0+ZW50cykgKiB0YmwtPmNhcF9lbnRyaWVzKTsKKyAgbWVtc2V0KHRibC0+ZW50cywgMCwgc2l6ZW9mKCp0YmwtPmVudHMpICogdGJsLT5jYXBfZW50cmllcyk7CisgIGZvciAoaSA9IDE7IGkgPD0gR1JQQ19DSFRUUDJfTEFTVF9TVEFUSUNfRU5UUlk7IGkrKykgeworICAgIHRibC0+c3RhdGljX2VudHNbaSAtIDFdID0KKyAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKHN0YXRpY190YWJsZVtpXS5rZXksIHN0YXRpY190YWJsZVtpXS52YWx1ZSk7CisgIH0KK30KKwordm9pZCBncnBjX2NodHRwMl9ocHRibF9kZXN0cm95KGdycGNfY2h0dHAyX2hwdGJsICp0YmwpIHsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWTsgaSsrKSB7CisgICAgR1JQQ19NREVMRU1fVU5SRUYodGJsLT5zdGF0aWNfZW50c1tpXSk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHRibC0+bnVtX2VudHM7IGkrKykgeworICAgIEdSUENfTURFTEVNX1VOUkVGKHRibC0+ZW50c1sodGJsLT5maXJzdF9lbnQgKyBpKSAlIHRibC0+Y2FwX2VudHJpZXNdKTsKKyAgfQorICBncHJfZnJlZSh0YmwtPmVudHMpOworfQorCitncnBjX21kZWxlbSAqZ3JwY19jaHR0cDJfaHB0YmxfbG9va3VwKGNvbnN0IGdycGNfY2h0dHAyX2hwdGJsICp0YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRibF9pbmRleCkgeworICAvKiBTdGF0aWMgdGFibGUgY29tZXMgZmlyc3QsIGp1c3QgcmV0dXJuIGFuIGVudHJ5IGZyb20gaXQgKi8KKyAgaWYgKHRibF9pbmRleCA8PSBHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWSkgeworICAgIHJldHVybiB0YmwtPnN0YXRpY19lbnRzW3RibF9pbmRleCAtIDFdOworICB9CisgIC8qIE90aGVyd2lzZSwgZmluZCB0aGUgdmFsdWUgaW4gdGhlIGxpc3Qgb2YgdmFsaWQgZW50cmllcyAqLworICB0YmxfaW5kZXggLT0gKEdSUENfQ0hUVFAyX0xBU1RfU1RBVElDX0VOVFJZICsgMSk7CisgIGlmICh0YmxfaW5kZXggPCB0YmwtPm51bV9lbnRzKSB7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0KKyAgICAgICAgKHRibC0+bnVtX2VudHMgLSAxdSAtIHRibF9pbmRleCArIHRibC0+Zmlyc3RfZW50KSAlIHRibC0+Y2FwX2VudHJpZXM7CisgICAgcmV0dXJuIHRibC0+ZW50c1tvZmZzZXRdOworICB9CisgIC8qIEludmFsaWQgZW50cnk6IHJldHVybiBlcnJvciAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogRXZpY3Qgb25lIGVsZW1lbnQgZnJvbSB0aGUgdGFibGUgKi8KK3N0YXRpYyB2b2lkIGV2aWN0MShncnBjX2NodHRwMl9ocHRibCAqdGJsKSB7CisgIGdycGNfbWRlbGVtICpmaXJzdF9lbnQgPSB0YmwtPmVudHNbdGJsLT5maXJzdF9lbnRdOworICBzaXplX3QgZWxlbV9ieXRlcyA9IEdQUl9TTElDRV9MRU5HVEgoZmlyc3RfZW50LT5rZXktPnNsaWNlKSArCisgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChmaXJzdF9lbnQtPnZhbHVlLT5zbGljZSkgKworICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0hQQUNLX0VOVFJZX09WRVJIRUFEOworICBHUFJfQVNTRVJUKGVsZW1fYnl0ZXMgPD0gdGJsLT5tZW1fdXNlZCk7CisgIHRibC0+bWVtX3VzZWQgLT0gKHVpbnQzMl90KWVsZW1fYnl0ZXM7CisgIHRibC0+Zmlyc3RfZW50ID0gKCh0YmwtPmZpcnN0X2VudCArIDEpICUgdGJsLT5jYXBfZW50cmllcyk7CisgIHRibC0+bnVtX2VudHMtLTsKKyAgR1JQQ19NREVMRU1fVU5SRUYoZmlyc3RfZW50KTsKK30KKworc3RhdGljIHZvaWQgcmVidWlsZF9lbnRzKGdycGNfY2h0dHAyX2hwdGJsICp0YmwsIHVpbnQzMl90IG5ld19jYXApIHsKKyAgZ3JwY19tZGVsZW0gKiplbnRzID0gZ3ByX21hbGxvYyhzaXplb2YoKmVudHMpICogbmV3X2NhcCk7CisgIHVpbnQzMl90IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHRibC0+bnVtX2VudHM7IGkrKykgeworICAgIGVudHNbaV0gPSB0YmwtPmVudHNbKHRibC0+Zmlyc3RfZW50ICsgaSkgJSB0YmwtPmNhcF9lbnRyaWVzXTsKKyAgfQorICBncHJfZnJlZSh0YmwtPmVudHMpOworICB0YmwtPmVudHMgPSBlbnRzOworICB0YmwtPmNhcF9lbnRyaWVzID0gbmV3X2NhcDsKKyAgdGJsLT5maXJzdF9lbnQgPSAwOworfQorCit2b2lkIGdycGNfY2h0dHAyX2hwdGJsX3NldF9tYXhfYnl0ZXMoZ3JwY19jaHR0cDJfaHB0YmwgKnRibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfYnl0ZXMpIHsKKyAgaWYgKHRibC0+bWF4X2J5dGVzID09IG1heF9ieXRlcykgeworICAgIHJldHVybjsKKyAgfQorICBncHJfbG9nKEdQUl9ERUJVRywgIlVwZGF0ZSBocGFjayBwYXJzZXIgbWF4IHNpemUgdG8gJWQiLCBtYXhfYnl0ZXMpOworICB3aGlsZSAodGJsLT5tZW1fdXNlZCA+IG1heF9ieXRlcykgeworICAgIGV2aWN0MSh0YmwpOworICB9CisgIHRibC0+bWF4X2J5dGVzID0gbWF4X2J5dGVzOworfQorCitpbnQgZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X2N1cnJlbnRfdGFibGVfc2l6ZShncnBjX2NodHRwMl9ocHRibCAqdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXMpIHsKKyAgaWYgKHRibC0+Y3VycmVudF90YWJsZV9ieXRlcyA9PSBieXRlcykgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChieXRlcyA+IHRibC0+bWF4X2J5dGVzKSB7CisgICAgaWYgKGdycGNfaHR0cF90cmFjZSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAgICJBdHRlbXB0IHRvIG1ha2UgaHBhY2sgdGFibGUgJWQgYnl0ZXMgd2hlbiBtYXggaXMgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICBieXRlcywgdGJsLT5tYXhfYnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZ3JwY19odHRwX3RyYWNlKSB7CisgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJVcGRhdGUgaHBhY2sgcGFyc2VyIHRhYmxlIHNpemUgdG8gJWQiLCBieXRlcyk7CisgIH0KKyAgd2hpbGUgKHRibC0+bWVtX3VzZWQgPiBieXRlcykgeworICAgIGV2aWN0MSh0YmwpOworICB9CisgIHRibC0+Y3VycmVudF90YWJsZV9ieXRlcyA9IGJ5dGVzOworICB0YmwtPm1heF9lbnRyaWVzID0gZW50cmllc19mb3JfYnl0ZXMoYnl0ZXMpOworICBpZiAodGJsLT5tYXhfZW50cmllcyA+IHRibC0+Y2FwX2VudHJpZXMpIHsKKyAgICByZWJ1aWxkX2VudHModGJsLCBHUFJfTUFYKHRibC0+bWF4X2VudHJpZXMsIDIgKiB0YmwtPmNhcF9lbnRyaWVzKSk7CisgIH0gZWxzZSBpZiAodGJsLT5tYXhfZW50cmllcyA8IHRibC0+Y2FwX2VudHJpZXMgLyAzKSB7CisgICAgdWludDMyX3QgbmV3X2NhcCA9IEdQUl9NQVgodGJsLT5tYXhfZW50cmllcywgMTZ1KTsKKyAgICBpZiAobmV3X2NhcCAhPSB0YmwtPmNhcF9lbnRyaWVzKSB7CisgICAgICByZWJ1aWxkX2VudHModGJsLCBuZXdfY2FwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBncnBjX2NodHRwMl9ocHRibF9hZGQoZ3JwY19jaHR0cDJfaHB0YmwgKnRibCwgZ3JwY19tZGVsZW0gKm1kKSB7CisgIC8qIGRldGVybWluZSBob3cgbWFueSBieXRlcyBvZiBidWZmZXIgdGhpcyBlbnRyeSByZXByZXNlbnRzICovCisgIHNpemVfdCBlbGVtX2J5dGVzID0gR1BSX1NMSUNFX0xFTkdUSChtZC0+a2V5LT5zbGljZSkgKworICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgobWQtPnZhbHVlLT5zbGljZSkgKworICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0hQQUNLX0VOVFJZX09WRVJIRUFEOworCisgIGlmICh0YmwtPmN1cnJlbnRfdGFibGVfYnl0ZXMgPiB0YmwtPm1heF9ieXRlcykgeworICAgIGlmIChncnBjX2h0dHBfdHJhY2UpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgICAiSFBBQ0sgbWF4IHRhYmxlIHNpemUgcmVkdWNlZCB0byAlZCBidXQgbm90IHJlZmxlY3RlZCBieSBocGFjayAiCisgICAgICAgICAgICAgICJzdHJlYW0gKHN0aWxsIGF0ICVkKSIsCisgICAgICAgICAgICAgIHRibC0+bWF4X2J5dGVzLCB0YmwtPmN1cnJlbnRfdGFibGVfYnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIHdlIGNhbid0IGFkZCBlbGVtZW50cyBiaWdnZXIgdGhhbiB0aGUgbWF4IHRhYmxlIHNpemUgKi8KKyAgaWYgKGVsZW1fYnl0ZXMgPiB0YmwtPmN1cnJlbnRfdGFibGVfYnl0ZXMpIHsKKyAgICAvKiBIUEFDSyBkcmFmdCAxMCBzZWN0aW9uIDQuNCBzdGF0ZXM6CisgICAgICogSWYgdGhlIHNpemUgb2YgdGhlIG5ldyBlbnRyeSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1heGltdW0KKyAgICAgKiBzaXplLCB0aGF0IGVudHJ5IGlzIGFkZGVkIHRvIHRoZSB0YWJsZS4gIEl0IGlzIG5vdCBhbiBlcnJvciB0bworICAgICAqIGF0dGVtcHQgdG8gYWRkIGFuIGVudHJ5IHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gc2l6ZTsgYW4KKyAgICAgKiBhdHRlbXB0IHRvIGFkZCBhbiBlbnRyeSBsYXJnZXIgdGhhbiB0aGUgZW50aXJlIHRhYmxlIGNhdXNlcworICAgICAqIHRoZSB0YWJsZQorICAgICAqIHRvIGJlIGVtcHRpZWQgb2YgYWxsIGV4aXN0aW5nIGVudHJpZXMsIGFuZCByZXN1bHRzIGluIGFuCisgICAgICogZW1wdHkgdGFibGUuCisgICAgICovCisgICAgd2hpbGUgKHRibC0+bnVtX2VudHMpIHsKKyAgICAgIGV2aWN0MSh0YmwpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIGV2aWN0IGVudHJpZXMgdG8gZW5zdXJlIG5vIG92ZXJmbG93ICovCisgIHdoaWxlIChlbGVtX2J5dGVzID4gKHNpemVfdCl0YmwtPmN1cnJlbnRfdGFibGVfYnl0ZXMgLSB0YmwtPm1lbV91c2VkKSB7CisgICAgZXZpY3QxKHRibCk7CisgIH0KKworICAvKiBjb3B5IHRoZSBmaW5hbGl6ZWQgZW50cnkgaW4gKi8KKyAgdGJsLT5lbnRzWyh0YmwtPmZpcnN0X2VudCArIHRibC0+bnVtX2VudHMpICUgdGJsLT5jYXBfZW50cmllc10gPQorICAgICAgR1JQQ19NREVMRU1fUkVGKG1kKTsKKworICAvKiB1cGRhdGUgYWNjb3VudGluZyB2YWx1ZXMgKi8KKyAgdGJsLT5udW1fZW50cysrOworICB0YmwtPm1lbV91c2VkICs9ICh1aW50MzJfdCllbGVtX2J5dGVzOworICByZXR1cm4gMTsKK30KKworZ3JwY19jaHR0cDJfaHB0YmxfZmluZF9yZXN1bHQgZ3JwY19jaHR0cDJfaHB0YmxfZmluZCgKKyAgICBjb25zdCBncnBjX2NodHRwMl9ocHRibCAqdGJsLCBncnBjX21kZWxlbSAqbWQpIHsKKyAgZ3JwY19jaHR0cDJfaHB0YmxfZmluZF9yZXN1bHQgciA9IHswLCAwfTsKKyAgdWludDMyX3QgaTsKKworICAvKiBTZWUgaWYgdGhlIHN0cmluZyBpcyBpbiB0aGUgc3RhdGljIHRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCBHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWTsgaSsrKSB7CisgICAgZ3JwY19tZGVsZW0gKmVudCA9IHRibC0+c3RhdGljX2VudHNbaV07CisgICAgaWYgKG1kLT5rZXkgIT0gZW50LT5rZXkpIGNvbnRpbnVlOworICAgIHIuaW5kZXggPSBpICsgMXU7CisgICAgci5oYXNfdmFsdWUgPSBtZC0+dmFsdWUgPT0gZW50LT52YWx1ZTsKKyAgICBpZiAoci5oYXNfdmFsdWUpIHJldHVybiByOworICB9CisKKyAgLyogU2NhbiB0aGUgZHluYW1pYyB0YWJsZSAqLworICBmb3IgKGkgPSAwOyBpIDwgdGJsLT5udW1fZW50czsgaSsrKSB7CisgICAgdWludDMyX3QgaWR4ID0KKyAgICAgICAgKHVpbnQzMl90KSh0YmwtPm51bV9lbnRzIC0gaSArIEdSUENfQ0hUVFAyX0xBU1RfU1RBVElDX0VOVFJZKTsKKyAgICBncnBjX21kZWxlbSAqZW50ID0gdGJsLT5lbnRzWyh0YmwtPmZpcnN0X2VudCArIGkpICUgdGJsLT5jYXBfZW50cmllc107CisgICAgaWYgKG1kLT5rZXkgIT0gZW50LT5rZXkpIGNvbnRpbnVlOworICAgIHIuaW5kZXggPSBpZHg7CisgICAgci5oYXNfdmFsdWUgPSBtZC0+dmFsdWUgPT0gZW50LT52YWx1ZTsKKyAgICBpZiAoci5oYXNfdmFsdWUpIHJldHVybiByOworICB9CisKKyAgcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDc1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0hQQUNLX1RBQkxFX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9IUEFDS19UQUJMRV9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIKKworLyogSFBBQ0sgaGVhZGVyIHRhYmxlICovCisKKy8qIGxhc3QgaW5kZXggaW4gdGhlIHN0YXRpYyB0YWJsZSAqLworI2RlZmluZSBHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWSA2MQorCisvKiBJbml0aWFsIHRhYmxlIHNpemUgYXMgcGVyIHRoZSBzcGVjICovCisjZGVmaW5lIEdSUENfQ0hUVFAyX0lOSVRJQUxfSFBBQ0tfVEFCTEVfU0laRSA0MDk2CisvKiBNYXhpbXVtIHRhYmxlIHNpemUgdGhhdCB3ZSdsbCB1c2UgKi8KKyNkZWZpbmUgR1JQQ19DSFRUUDJfTUFYX0hQQUNLX1RBQkxFX1NJWkUgR1JQQ19DSFRUUDJfSU5JVElBTF9IUEFDS19UQUJMRV9TSVpFCisvKiBQZXIgZW50cnkgb3ZlcmhlYWQgYnl0ZXMgYXMgcGVyIHRoZSBzcGVjICovCisjZGVmaW5lIEdSUENfQ0hUVFAyX0hQQUNLX0VOVFJZX09WRVJIRUFEIDMyCisjaWYgMAorLyogTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB3ZSBjb3VsZCBwb3NzaWJseSBmaXQgaW4gdGhlIHRhYmxlLCBnaXZlbiBkZWZpbmVkCisgICBvdmVyaGVhZHMgKi8KKyNkZWZpbmUgR1JQQ19DSFRUUDJfTUFYX1RBQkxFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoR1JQQ19DSFRUUDJfTUFYX0hQQUNLX1RBQkxFX1NJWkUgKyBHUlBDX0NIVFRQMl9IUEFDS19FTlRSWV9PVkVSSEVBRCAtIDEpIC8gXAorICAgR1JQQ19DSFRUUDJfSFBBQ0tfRU5UUllfT1ZFUkhFQUQpCisjZW5kaWYKKworLyogaHBhY2sgZGVjb2RlciB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiB0aGUgZmlyc3QgdXNlZCBlbnRyeSBpbiBlbnRzICovCisgIHVpbnQzMl90IGZpcnN0X2VudDsKKyAgLyogaG93IG1hbnkgZW50cmllcyBhcmUgaW4gdGhlIHRhYmxlICovCisgIHVpbnQzMl90IG51bV9lbnRzOworICAvKiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSB0YWJsZSwgYWNjb3JkaW5nIHRvIHRoZSBocGFjayBhbGdvcml0aG0gKi8KKyAgdWludDMyX3QgbWVtX3VzZWQ7CisgIC8qIHRoZSBtYXggbWVtb3J5IGFsbG93ZWQgdG8gYmUgdXNlZCBieSB0aGUgdGFibGUsIGFjY29yZGluZyB0byB0aGUgaHBhY2sKKyAgICAgYWxnb3JpdGhtICovCisgIHVpbnQzMl90IG1heF9ieXRlczsKKyAgLyogdGhlIGN1cnJlbnRseSBhZ3JlZWQgc2l6ZSBvZiB0aGUgdGFibGUsIGFjY29yZGluZyB0byB0aGUgaHBhY2sgYWxnb3JpdGhtICovCisgIHVpbnQzMl90IGN1cnJlbnRfdGFibGVfYnl0ZXM7CisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgd2UgY291bGQgcG9zc2libHkgZml0IGluIHRoZSB0YWJsZSwgZ2l2ZW4gZGVmaW5lZAorICAgICBvdmVyaGVhZHMgKi8KKyAgdWludDMyX3QgbWF4X2VudHJpZXM7CisgIC8qIE51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBpbiBlbnRzICovCisgIHVpbnQzMl90IGNhcF9lbnRyaWVzOworICAvKiBhIGNpcmN1bGFyIGJ1ZmZlciBvZiBoZWFkZXJzIC0gdGhpcyBpcyBzdG9yZWQgaW4gdGhlIG9wcG9zaXRlIG9yZGVyIHRvCisgICAgIHdoYXQgaHBhY2sgc3BlY2lmaWVzLCBpbiBvcmRlciB0byBzaW1wbGlmeSB0YWJsZSBtYW5hZ2VtZW50IGEgbGl0dGxlLi4uCisgICAgIG1lYW5pbmcgbG9va3VwcyBuZWVkIHRvIFNVQlRSQUNUIGZyb20gdGhlIGVuZCBwb3NpdGlvbiAqLworICBncnBjX21kZWxlbSAqKmVudHM7CisgIGdycGNfbWRlbGVtICpzdGF0aWNfZW50c1tHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWV07Cit9IGdycGNfY2h0dHAyX2hwdGJsOworCisvKiBpbml0aWFsaXplIGEgaHBhY2sgdGFibGUgKi8KK3ZvaWQgZ3JwY19jaHR0cDJfaHB0YmxfaW5pdChncnBjX2NodHRwMl9ocHRibCAqdGJsKTsKK3ZvaWQgZ3JwY19jaHR0cDJfaHB0YmxfZGVzdHJveShncnBjX2NodHRwMl9ocHRibCAqdGJsKTsKK3ZvaWQgZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X21heF9ieXRlcyhncnBjX2NodHRwMl9ocHRibCAqdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heF9ieXRlcyk7CitpbnQgZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X2N1cnJlbnRfdGFibGVfc2l6ZShncnBjX2NodHRwMl9ocHRibCAqdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXMpOworCisvKiBsb29rdXAgYSB0YWJsZSBlbnRyeSBiYXNlZCBvbiBpdHMgaHBhY2sgaW5kZXggKi8KK2dycGNfbWRlbGVtICpncnBjX2NodHRwMl9ocHRibF9sb29rdXAoY29uc3QgZ3JwY19jaHR0cDJfaHB0YmwgKnRibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpOworLyogYWRkIGEgdGFibGUgZW50cnkgdG8gdGhlIGluZGV4ICovCitpbnQgZ3JwY19jaHR0cDJfaHB0YmxfYWRkKGdycGNfY2h0dHAyX2hwdGJsICp0YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRlbGVtICptZCkgR1JQQ19NVVNUX1VTRV9SRVNVTFQ7CisvKiBGaW5kIGEga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIHRhYmxlLi4uIHJldHVybnMgdGhlIGluZGV4IGluIHRoZSB0YWJsZSBvZiB0aGUKKyAgIG1vc3Qgc2ltaWxhciBlbnRyeSwgb3IgMCBpZiB0aGUgdmFsdWUgd2FzIG5vdCBmb3VuZCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBpbmRleDsKKyAgaW50IGhhc192YWx1ZTsKK30gZ3JwY19jaHR0cDJfaHB0YmxfZmluZF9yZXN1bHQ7CitncnBjX2NodHRwMl9ocHRibF9maW5kX3Jlc3VsdCBncnBjX2NodHRwMl9ocHRibF9maW5kKAorICAgIGNvbnN0IGdycGNfY2h0dHAyX2hwdGJsICp0YmwsIGdycGNfbWRlbGVtICptZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0hQQUNLX1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGVzLnR4dCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZXMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlcy50eHQKcmVuYW1lIHRvIHNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZXMudHh0CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1NDJlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odHRwMl9lcnJvcnMuaApAQCAtMCwwICsxLDU2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSFRUUDJfRVJST1JTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9IVFRQMl9FUlJPUlNfSAorCisvKiBlcnJvciBjb2RlcyBmb3IgUlNUX1NUUkVBTSBmcm9tIGh0dHAyIGRyYWZ0IDE0IHNlY3Rpb24gNyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19DSFRUUDJfTk9fRVJST1IgPSAweDAsCisgIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SID0gMHgxLAorICBHUlBDX0NIVFRQMl9JTlRFUk5BTF9FUlJPUiA9IDB4MiwKKyAgR1JQQ19DSFRUUDJfRkxPV19DT05UUk9MX0VSUk9SID0gMHgzLAorICBHUlBDX0NIVFRQMl9TRVRUSU5HU19USU1FT1VUID0gMHg0LAorICBHUlBDX0NIVFRQMl9TVFJFQU1fQ0xPU0VEID0gMHg1LAorICBHUlBDX0NIVFRQMl9GUkFNRV9TSVpFX0VSUk9SID0gMHg2LAorICBHUlBDX0NIVFRQMl9SRUZVU0VEX1NUUkVBTSA9IDB4NywKKyAgR1JQQ19DSFRUUDJfQ0FOQ0VMID0gMHg4LAorICBHUlBDX0NIVFRQMl9DT01QUkVTU0lPTl9FUlJPUiA9IDB4OSwKKyAgR1JQQ19DSFRUUDJfQ09OTkVDVF9FUlJPUiA9IDB4YSwKKyAgR1JQQ19DSFRUUDJfRU5IQU5DRV9ZT1VSX0NBTE0gPSAweGIsCisgIEdSUENfQ0hUVFAyX0lOQURFUVVBVEVfU0VDVVJJVFkgPSAweGMsCisgIC8qIGZvcmNlIHVzZSBvZiBhIGRlZmF1bHQgY2xhdXNlICovCisgIEdSUENfQ0hUVFAyX19FUlJPUl9ET19OT1RfVVNFID0gLTEKK30gZ3JwY19jaHR0cDJfZXJyb3JfY29kZTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSFRUUDJfRVJST1JTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNjJiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmgiCisKKy8qIENvbnN0YW50cyBwdWxsZWQgZnJvbSB0aGUgSFBBQ0sgc3BlYywgYW5kIGNvbnZlcnRlZCB0byBDIHVzaW5nIHRoZSB2aW0KKyAgIGNvbW1hbmQ6CisgICA6JXMvLiogICBcKFswLTlhLWZdXCtcKSAgXFsgKlwoWzAtOV1cK1wpXF0vezB4XDEsIFwyfSwvZyAqLworY29uc3QgZ3JwY19jaHR0cDJfaHVmZnN5bSBncnBjX2NodHRwMl9odWZmc3ltc1tHUlBDX0NIVFRQMl9OVU1fSFVGRlNZTVNdID0geworICAgIHsweDFmZjgsIDEzfSwgICAgIHsweDdmZmZkOCwgMjN9LCAgIHsweGZmZmZmZTIsIDI4fSwgIHsweGZmZmZmZTMsIDI4fSwKKyAgICB7MHhmZmZmZmU0LCAyOH0sICB7MHhmZmZmZmU1LCAyOH0sICB7MHhmZmZmZmU2LCAyOH0sICB7MHhmZmZmZmU3LCAyOH0sCisgICAgezB4ZmZmZmZlOCwgMjh9LCAgezB4ZmZmZmVhLCAyNH0sICAgezB4M2ZmZmZmZmMsIDMwfSwgezB4ZmZmZmZlOSwgMjh9LAorICAgIHsweGZmZmZmZWEsIDI4fSwgIHsweDNmZmZmZmZkLCAzMH0sIHsweGZmZmZmZWIsIDI4fSwgIHsweGZmZmZmZWMsIDI4fSwKKyAgICB7MHhmZmZmZmVkLCAyOH0sICB7MHhmZmZmZmVlLCAyOH0sICB7MHhmZmZmZmVmLCAyOH0sICB7MHhmZmZmZmYwLCAyOH0sCisgICAgezB4ZmZmZmZmMSwgMjh9LCAgezB4ZmZmZmZmMiwgMjh9LCAgezB4M2ZmZmZmZmUsIDMwfSwgezB4ZmZmZmZmMywgMjh9LAorICAgIHsweGZmZmZmZjQsIDI4fSwgIHsweGZmZmZmZjUsIDI4fSwgIHsweGZmZmZmZjYsIDI4fSwgIHsweGZmZmZmZjcsIDI4fSwKKyAgICB7MHhmZmZmZmY4LCAyOH0sICB7MHhmZmZmZmY5LCAyOH0sICB7MHhmZmZmZmZhLCAyOH0sICB7MHhmZmZmZmZiLCAyOH0sCisgICAgezB4MTQsIDZ9LCAgICAgICAgezB4M2Y4LCAxMH0sICAgICAgezB4M2Y5LCAxMH0sICAgICAgezB4ZmZhLCAxMn0sCisgICAgezB4MWZmOSwgMTN9LCAgICAgezB4MTUsIDZ9LCAgICAgICAgezB4ZjgsIDh9LCAgICAgICAgezB4N2ZhLCAxMX0sCisgICAgezB4M2ZhLCAxMH0sICAgICAgezB4M2ZiLCAxMH0sICAgICAgezB4ZjksIDh9LCAgICAgICAgezB4N2ZiLCAxMX0sCisgICAgezB4ZmEsIDh9LCAgICAgICAgezB4MTYsIDZ9LCAgICAgICAgezB4MTcsIDZ9LCAgICAgICAgezB4MTgsIDZ9LAorICAgIHsweDAsIDV9LCAgICAgICAgIHsweDEsIDV9LCAgICAgICAgIHsweDIsIDV9LCAgICAgICAgIHsweDE5LCA2fSwKKyAgICB7MHgxYSwgNn0sICAgICAgICB7MHgxYiwgNn0sICAgICAgICB7MHgxYywgNn0sICAgICAgICB7MHgxZCwgNn0sCisgICAgezB4MWUsIDZ9LCAgICAgICAgezB4MWYsIDZ9LCAgICAgICAgezB4NWMsIDd9LCAgICAgICAgezB4ZmIsIDh9LAorICAgIHsweDdmZmMsIDE1fSwgICAgIHsweDIwLCA2fSwgICAgICAgIHsweGZmYiwgMTJ9LCAgICAgIHsweDNmYywgMTB9LAorICAgIHsweDFmZmEsIDEzfSwgICAgIHsweDIxLCA2fSwgICAgICAgIHsweDVkLCA3fSwgICAgICAgIHsweDVlLCA3fSwKKyAgICB7MHg1ZiwgN30sICAgICAgICB7MHg2MCwgN30sICAgICAgICB7MHg2MSwgN30sICAgICAgICB7MHg2MiwgN30sCisgICAgezB4NjMsIDd9LCAgICAgICAgezB4NjQsIDd9LCAgICAgICAgezB4NjUsIDd9LCAgICAgICAgezB4NjYsIDd9LAorICAgIHsweDY3LCA3fSwgICAgICAgIHsweDY4LCA3fSwgICAgICAgIHsweDY5LCA3fSwgICAgICAgIHsweDZhLCA3fSwKKyAgICB7MHg2YiwgN30sICAgICAgICB7MHg2YywgN30sICAgICAgICB7MHg2ZCwgN30sICAgICAgICB7MHg2ZSwgN30sCisgICAgezB4NmYsIDd9LCAgICAgICAgezB4NzAsIDd9LCAgICAgICAgezB4NzEsIDd9LCAgICAgICAgezB4NzIsIDd9LAorICAgIHsweGZjLCA4fSwgICAgICAgIHsweDczLCA3fSwgICAgICAgIHsweGZkLCA4fSwgICAgICAgIHsweDFmZmIsIDEzfSwKKyAgICB7MHg3ZmZmMCwgMTl9LCAgICB7MHgxZmZjLCAxM30sICAgICB7MHgzZmZjLCAxNH0sICAgICB7MHgyMiwgNn0sCisgICAgezB4N2ZmZCwgMTV9LCAgICAgezB4MywgNX0sICAgICAgICAgezB4MjMsIDZ9LCAgICAgICAgezB4NCwgNX0sCisgICAgezB4MjQsIDZ9LCAgICAgICAgezB4NSwgNX0sICAgICAgICAgezB4MjUsIDZ9LCAgICAgICAgezB4MjYsIDZ9LAorICAgIHsweDI3LCA2fSwgICAgICAgIHsweDYsIDV9LCAgICAgICAgIHsweDc0LCA3fSwgICAgICAgIHsweDc1LCA3fSwKKyAgICB7MHgyOCwgNn0sICAgICAgICB7MHgyOSwgNn0sICAgICAgICB7MHgyYSwgNn0sICAgICAgICB7MHg3LCA1fSwKKyAgICB7MHgyYiwgNn0sICAgICAgICB7MHg3NiwgN30sICAgICAgICB7MHgyYywgNn0sICAgICAgICB7MHg4LCA1fSwKKyAgICB7MHg5LCA1fSwgICAgICAgICB7MHgyZCwgNn0sICAgICAgICB7MHg3NywgN30sICAgICAgICB7MHg3OCwgN30sCisgICAgezB4NzksIDd9LCAgICAgICAgezB4N2EsIDd9LCAgICAgICAgezB4N2IsIDd9LCAgICAgICAgezB4N2ZmZSwgMTV9LAorICAgIHsweDdmYywgMTF9LCAgICAgIHsweDNmZmQsIDE0fSwgICAgIHsweDFmZmQsIDEzfSwgICAgIHsweGZmZmZmZmMsIDI4fSwKKyAgICB7MHhmZmZlNiwgMjB9LCAgICB7MHgzZmZmZDIsIDIyfSwgICB7MHhmZmZlNywgMjB9LCAgICB7MHhmZmZlOCwgMjB9LAorICAgIHsweDNmZmZkMywgMjJ9LCAgIHsweDNmZmZkNCwgMjJ9LCAgIHsweDNmZmZkNSwgMjJ9LCAgIHsweDdmZmZkOSwgMjN9LAorICAgIHsweDNmZmZkNiwgMjJ9LCAgIHsweDdmZmZkYSwgMjN9LCAgIHsweDdmZmZkYiwgMjN9LCAgIHsweDdmZmZkYywgMjN9LAorICAgIHsweDdmZmZkZCwgMjN9LCAgIHsweDdmZmZkZSwgMjN9LCAgIHsweGZmZmZlYiwgMjR9LCAgIHsweDdmZmZkZiwgMjN9LAorICAgIHsweGZmZmZlYywgMjR9LCAgIHsweGZmZmZlZCwgMjR9LCAgIHsweDNmZmZkNywgMjJ9LCAgIHsweDdmZmZlMCwgMjN9LAorICAgIHsweGZmZmZlZSwgMjR9LCAgIHsweDdmZmZlMSwgMjN9LCAgIHsweDdmZmZlMiwgMjN9LCAgIHsweDdmZmZlMywgMjN9LAorICAgIHsweDdmZmZlNCwgMjN9LCAgIHsweDFmZmZkYywgMjF9LCAgIHsweDNmZmZkOCwgMjJ9LCAgIHsweDdmZmZlNSwgMjN9LAorICAgIHsweDNmZmZkOSwgMjJ9LCAgIHsweDdmZmZlNiwgMjN9LCAgIHsweDdmZmZlNywgMjN9LCAgIHsweGZmZmZlZiwgMjR9LAorICAgIHsweDNmZmZkYSwgMjJ9LCAgIHsweDFmZmZkZCwgMjF9LCAgIHsweGZmZmU5LCAyMH0sICAgIHsweDNmZmZkYiwgMjJ9LAorICAgIHsweDNmZmZkYywgMjJ9LCAgIHsweDdmZmZlOCwgMjN9LCAgIHsweDdmZmZlOSwgMjN9LCAgIHsweDFmZmZkZSwgMjF9LAorICAgIHsweDdmZmZlYSwgMjN9LCAgIHsweDNmZmZkZCwgMjJ9LCAgIHsweDNmZmZkZSwgMjJ9LCAgIHsweGZmZmZmMCwgMjR9LAorICAgIHsweDFmZmZkZiwgMjF9LCAgIHsweDNmZmZkZiwgMjJ9LCAgIHsweDdmZmZlYiwgMjN9LCAgIHsweDdmZmZlYywgMjN9LAorICAgIHsweDFmZmZlMCwgMjF9LCAgIHsweDFmZmZlMSwgMjF9LCAgIHsweDNmZmZlMCwgMjJ9LCAgIHsweDFmZmZlMiwgMjF9LAorICAgIHsweDdmZmZlZCwgMjN9LCAgIHsweDNmZmZlMSwgMjJ9LCAgIHsweDdmZmZlZSwgMjN9LCAgIHsweDdmZmZlZiwgMjN9LAorICAgIHsweGZmZmVhLCAyMH0sICAgIHsweDNmZmZlMiwgMjJ9LCAgIHsweDNmZmZlMywgMjJ9LCAgIHsweDNmZmZlNCwgMjJ9LAorICAgIHsweDdmZmZmMCwgMjN9LCAgIHsweDNmZmZlNSwgMjJ9LCAgIHsweDNmZmZlNiwgMjJ9LCAgIHsweDdmZmZmMSwgMjN9LAorICAgIHsweDNmZmZmZTAsIDI2fSwgIHsweDNmZmZmZTEsIDI2fSwgIHsweGZmZmViLCAyMH0sICAgIHsweDdmZmYxLCAxOX0sCisgICAgezB4M2ZmZmU3LCAyMn0sICAgezB4N2ZmZmYyLCAyM30sICAgezB4M2ZmZmU4LCAyMn0sICAgezB4MWZmZmZlYywgMjV9LAorICAgIHsweDNmZmZmZTIsIDI2fSwgIHsweDNmZmZmZTMsIDI2fSwgIHsweDNmZmZmZTQsIDI2fSwgIHsweDdmZmZmZGUsIDI3fSwKKyAgICB7MHg3ZmZmZmRmLCAyN30sICB7MHgzZmZmZmU1LCAyNn0sICB7MHhmZmZmZjEsIDI0fSwgICB7MHgxZmZmZmVkLCAyNX0sCisgICAgezB4N2ZmZjIsIDE5fSwgICAgezB4MWZmZmUzLCAyMX0sICAgezB4M2ZmZmZlNiwgMjZ9LCAgezB4N2ZmZmZlMCwgMjd9LAorICAgIHsweDdmZmZmZTEsIDI3fSwgIHsweDNmZmZmZTcsIDI2fSwgIHsweDdmZmZmZTIsIDI3fSwgIHsweGZmZmZmMiwgMjR9LAorICAgIHsweDFmZmZlNCwgMjF9LCAgIHsweDFmZmZlNSwgMjF9LCAgIHsweDNmZmZmZTgsIDI2fSwgIHsweDNmZmZmZTksIDI2fSwKKyAgICB7MHhmZmZmZmZkLCAyOH0sICB7MHg3ZmZmZmUzLCAyN30sICB7MHg3ZmZmZmU0LCAyN30sICB7MHg3ZmZmZmU1LCAyN30sCisgICAgezB4ZmZmZWMsIDIwfSwgICAgezB4ZmZmZmYzLCAyNH0sICAgezB4ZmZmZWQsIDIwfSwgICAgezB4MWZmZmU2LCAyMX0sCisgICAgezB4M2ZmZmU5LCAyMn0sICAgezB4MWZmZmU3LCAyMX0sICAgezB4MWZmZmU4LCAyMX0sICAgezB4N2ZmZmYzLCAyM30sCisgICAgezB4M2ZmZmVhLCAyMn0sICAgezB4M2ZmZmViLCAyMn0sICAgezB4MWZmZmZlZSwgMjV9LCAgezB4MWZmZmZlZiwgMjV9LAorICAgIHsweGZmZmZmNCwgMjR9LCAgIHsweGZmZmZmNSwgMjR9LCAgIHsweDNmZmZmZWEsIDI2fSwgIHsweDdmZmZmNCwgMjN9LAorICAgIHsweDNmZmZmZWIsIDI2fSwgIHsweDdmZmZmZTYsIDI3fSwgIHsweDNmZmZmZWMsIDI2fSwgIHsweDNmZmZmZWQsIDI2fSwKKyAgICB7MHg3ZmZmZmU3LCAyN30sICB7MHg3ZmZmZmU4LCAyN30sICB7MHg3ZmZmZmU5LCAyN30sICB7MHg3ZmZmZmVhLCAyN30sCisgICAgezB4N2ZmZmZlYiwgMjd9LCAgezB4ZmZmZmZmZSwgMjh9LCAgezB4N2ZmZmZlYywgMjd9LCAgezB4N2ZmZmZlZCwgMjd9LAorICAgIHsweDdmZmZmZWUsIDI3fSwgIHsweDdmZmZmZWYsIDI3fSwgIHsweDdmZmZmZjAsIDI3fSwgIHsweDNmZmZmZWUsIDI2fSwKKyAgICB7MHgzZmZmZmZmZiwgMzB9LAorfTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h1ZmZzeW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwYmFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9IVUZGU1lNU19ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSFVGRlNZTVNfSAorCisvKiBIUEFDSyBzdGF0aWMgaHVmZm1hbiB0YWJsZSAqLworCisjZGVmaW5lIEdSUENfQ0hUVFAyX05VTV9IVUZGU1lNUyAyNTcKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBiaXRzOworICB1bnNpZ25lZCBsZW5ndGg7Cit9IGdycGNfY2h0dHAyX2h1ZmZzeW07CisKK2V4dGVybiBjb25zdCBncnBjX2NodHRwMl9odWZmc3ltIGdycGNfY2h0dHAyX2h1ZmZzeW1zW0dSUENfQ0hUVFAyX05VTV9IVUZGU1lNU107CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0hVRkZTWU1TX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1ZmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2luaXQoCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIpIHsKKyAgYnVmZmVyLT5kZWFkbGluZSA9IGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19SRUFMVElNRSk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2Rlc3Ryb3koCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIpIHsKKyAgc2l6ZV90IGk7CisgIGlmICghYnVmZmVyLT5wdWJsaXNoZWQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyLT5jb3VudDsgaSsrKSB7CisgICAgICBHUlBDX01ERUxFTV9VTlJFRihidWZmZXItPmVsZW1zW2ldLm1kKTsKKyAgICB9CisgIH0KKyAgZ3ByX2ZyZWUoYnVmZmVyLT5lbGVtcyk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2FkZCgKKyAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlciwgZ3JwY19tZGVsZW0gKmVsZW0pIHsKKyAgR1BSX0FTU0VSVCghYnVmZmVyLT5wdWJsaXNoZWQpOworICBpZiAoYnVmZmVyLT5jYXBhY2l0eSA9PSBidWZmZXItPmNvdW50KSB7CisgICAgYnVmZmVyLT5jYXBhY2l0eSA9IEdQUl9NQVgoOCwgMiAqIGJ1ZmZlci0+Y2FwYWNpdHkpOworICAgIGJ1ZmZlci0+ZWxlbXMgPQorICAgICAgICBncHJfcmVhbGxvYyhidWZmZXItPmVsZW1zLCBzaXplb2YoKmJ1ZmZlci0+ZWxlbXMpICogYnVmZmVyLT5jYXBhY2l0eSk7CisgIH0KKyAgYnVmZmVyLT5lbGVtc1tidWZmZXItPmNvdW50KytdLm1kID0gZWxlbTsKK30KKwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfc2V0X2RlYWRsaW5lKAorICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciAqYnVmZmVyLCBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKKyAgR1BSX0FTU0VSVCghYnVmZmVyLT5wdWJsaXNoZWQpOworICBidWZmZXItPmRlYWRsaW5lID0gZGVhZGxpbmU7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3B1Ymxpc2goCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIsIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKSB7CisgIEdQUl9BU1NFUlQoIWJ1ZmZlci0+cHVibGlzaGVkKTsKKyAgYnVmZmVyLT5wdWJsaXNoZWQgPSAxOworICBpZiAoYnVmZmVyLT5jb3VudCA+IDApIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgYnVmZmVyLT5jb3VudDsgaSsrKSB7CisgICAgICBidWZmZXItPmVsZW1zW2ldLnByZXYgPSAmYnVmZmVyLT5lbGVtc1tpIC0gMV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXItPmNvdW50IC0gMTsgaSsrKSB7CisgICAgICBidWZmZXItPmVsZW1zW2ldLm5leHQgPSAmYnVmZmVyLT5lbGVtc1tpICsgMV07CisgICAgfQorICAgIGJ1ZmZlci0+ZWxlbXNbMF0ucHJldiA9IE5VTEw7CisgICAgYnVmZmVyLT5lbGVtc1tidWZmZXItPmNvdW50IC0gMV0ubmV4dCA9IE5VTEw7CisgICAgYmF0Y2gtPmxpc3QuaGVhZCA9ICZidWZmZXItPmVsZW1zWzBdOworICAgIGJhdGNoLT5saXN0LnRhaWwgPSAmYnVmZmVyLT5lbGVtc1tidWZmZXItPmNvdW50IC0gMV07CisgIH0gZWxzZSB7CisgICAgYmF0Y2gtPmxpc3QuaGVhZCA9IGJhdGNoLT5saXN0LnRhaWwgPSBOVUxMOworICB9CisgIGJhdGNoLT5kZWFkbGluZSA9IGJ1ZmZlci0+ZGVhZGxpbmU7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWRjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaApAQCAtMCwwICsxLDYwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSU5DT01JTkdfTUVUQURBVEFfSAorI2RlZmluZSBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0lOQ09NSU5HX01FVEFEQVRBX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19saW5rZWRfbWRlbGVtICplbGVtczsKKyAgc2l6ZV90IGNvdW50OworICBzaXplX3QgY2FwYWNpdHk7CisgIGdwcl90aW1lc3BlYyBkZWFkbGluZTsKKyAgaW50IHB1Ymxpc2hlZDsKK30gZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyOworCisvKiogYXNzdW1lcyBldmVyeXRoaW5nIGluaXRpYWxseSB6ZXJvZWQgKi8KK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2luaXQoCisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIpOwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgKKyAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlcik7Cit2b2lkIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9wdWJsaXNoKAorICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciAqYnVmZmVyLCBncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2FkZCgKKyAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlciwgZ3JwY19tZGVsZW0gKmVsZW0pOwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfc2V0X2RlYWRsaW5lKAorICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciAqYnVmZmVyLCBncHJfdGltZXNwZWMgZGVhZGxpbmUpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9JTkNPTUlOR19NRVRBREFUQV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWU2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaApAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX0lOVEVSTkFMX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3NldHRpbmdzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX2NodHRwMl90cmFuc3BvcnQgZ3JwY19jaHR0cDJfdHJhbnNwb3J0OwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaHR0cDJfc3RyZWFtIGdycGNfY2h0dHAyX3N0cmVhbTsKKworLyogc3RyZWFtcyBhcmUga2VwdCBpbiB2YXJpb3VzIGxpbmtlZCBsaXN0cyBkZXBlbmRpbmcgb24gd2hhdCB0aGluZ3MgbmVlZCB0bworICAgaGFwcGVuIHRvIHRoZW0uLi4gdGhpcyBlbnVtIGxhYmVscyBlYWNoIGxpc3QgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdSUENfQ0hUVFAyX0xJU1RfQUxMX1NUUkVBTVMsCisgIEdSUENfQ0hUVFAyX0xJU1RfQ0hFQ0tfUkVBRF9PUFMsCisgIEdSUENfQ0hUVFAyX0xJU1RfVU5BTk5PVU5DRURfSU5DT01JTkdfV0lORE9XX0FWQUlMQUJMRSwKKyAgR1JQQ19DSFRUUDJfTElTVF9XUklUQUJMRSwKKyAgR1JQQ19DSFRUUDJfTElTVF9XUklUSU5HLAorICBHUlBDX0NIVFRQMl9MSVNUX1dSSVRURU4sCisgIEdSUENfQ0hUVFAyX0xJU1RfUEFSU0lOR19TRUVOLAorICBHUlBDX0NIVFRQMl9MSVNUX0NMT1NFRF9XQUlUSU5HX0ZPUl9QQVJTSU5HLAorICBHUlBDX0NIVFRQMl9MSVNUX0NMT1NFRF9XQUlUSU5HX0ZPUl9XUklUSU5HLAorICBHUlBDX0NIVFRQMl9MSVNUX1NUQUxMRURfQllfVFJBTlNQT1JULAorICAvKiBzdHJlYW1zIHdhaXRpbmcgZm9yIHRoZSBvdXRnb2luZyB3aW5kb3cgaW4gdGhlIHdyaXRpbmcgcGF0aCwgdGhleSB3aWxsIGJlCisgICAqIG1lcmdlZCB0byB0aGUgc3RhbGxlZCBsaXN0IG9yIHdyaXRhYmxlIGxpc3QgdW5kZXIgdHJhbnNwb3J0IGxvY2suICovCisgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVElOR19TVEFMTEVEX0JZX1RSQU5TUE9SVCwKKyAgLyoqIHN0cmVhbXMgdGhhdCBhcmUgd2FpdGluZyB0byBzdGFydCBiZWNhdXNlIHRoZXJlIGFyZSB0b28gbWFueSBjb25jdXJyZW50CisgICAgICBzdHJlYW1zIG9uIHRoZSBjb25uZWN0aW9uICovCisgIEdSUENfQ0hUVFAyX0xJU1RfV0FJVElOR19GT1JfQ09OQ1VSUkVOQ1ksCisgIFNUUkVBTV9MSVNUX0NPVU5UIC8qIG11c3QgYmUgbGFzdCAqLworfSBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZDsKKworLyogZGVmcmFtZXIgc3RhdGUgZm9yIHRoZSBvdmVyYWxsIGh0dHAyIHN0cmVhbSBvZiBieXRlcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgLyogcHJlZml4OiBvbmUgZW50cnkgcGVyIGh0dHAyIGNvbm5lY3Rpb24gcHJlZml4IGJ5dGUgKi8KKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8wID0gMCwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xLAorICBHUlBDX0RUU19DTElFTlRfUFJFRklYXzIsCisgIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMywKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF80LAorICBHUlBDX0RUU19DTElFTlRfUFJFRklYXzUsCisgIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfNiwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF83LAorICBHUlBDX0RUU19DTElFTlRfUFJFRklYXzgsCisgIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfOSwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMCwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMSwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMiwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMywKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNCwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNSwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNiwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNywKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xOCwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xOSwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMCwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMSwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMiwKKyAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMywKKyAgLyogZnJhbWUgaGVhZGVyIGJ5dGUgMC4uLiAqLworICAvKiBtdXN0IGZvbGxvdyBmcm9tIHRoZSBwcmVmaXggc3RhdGVzICovCisgIEdSUENfRFRTX0ZIXzAsCisgIEdSUENfRFRTX0ZIXzEsCisgIEdSUENfRFRTX0ZIXzIsCisgIEdSUENfRFRTX0ZIXzMsCisgIEdSUENfRFRTX0ZIXzQsCisgIEdSUENfRFRTX0ZIXzUsCisgIEdSUENfRFRTX0ZIXzYsCisgIEdSUENfRFRTX0ZIXzcsCisgIC8qIC4uLiBmcmFtZSBoZWFkZXIgYnl0ZSA4ICovCisgIEdSUENfRFRTX0ZIXzgsCisgIC8qIGluc2lkZSBhIGh0dHAyIGZyYW1lICovCisgIEdSUENfRFRTX0ZSQU1FCit9IGdycGNfY2h0dHAyX2RlZnJhbWVfdHJhbnNwb3J0X3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqaGVhZDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICp0YWlsOworfSBncnBjX2NodHRwMl9zdHJlYW1fbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NodHRwMl9zdHJlYW0gKm5leHQ7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqcHJldjsKK30gZ3JwY19jaHR0cDJfc3RyZWFtX2xpbms7CisKKy8qIFdlIGtlZXAgc2V2ZXJhbCBzZXRzIG9mIGNvbm5lY3Rpb24gd2lkZSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIGVudW0geworICAvKiBUaGUgc2V0dGluZ3Mgb3VyIHBlZXIgaGFzIGFza2VkIGZvciAoYW5kIHdlIGhhdmUgYWNrZWQpICovCisgIEdSUENfUEVFUl9TRVRUSU5HUyA9IDAsCisgIC8qIFRoZSBzZXR0aW5ncyB3ZSdkIGxpa2UgdG8gaGF2ZSAqLworICBHUlBDX0xPQ0FMX1NFVFRJTkdTLAorICAvKiBUaGUgc2V0dGluZ3Mgd2UndmUgcHVibGlzaGVkIHRvIG91ciBwZWVyICovCisgIEdSUENfU0VOVF9TRVRUSU5HUywKKyAgLyogVGhlIHNldHRpbmdzIHRoZSBwZWVyIGhhcyBhY2tlZCAqLworICBHUlBDX0FDS0VEX1NFVFRJTkdTLAorICBHUlBDX05VTV9TRVRUSU5HX1NFVFMKK30gZ3JwY19jaHR0cDJfc2V0dGluZ19zZXQ7CisKKy8qIE91dHN0YW5kaW5nIHBpbmcgcmVxdWVzdCBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBncnBjX2NodHRwMl9vdXRzdGFuZGluZ19waW5nIHsKKyAgdWludDhfdCBpZFs4XTsKKyAgZ3JwY19jbG9zdXJlICpvbl9yZWN2OworICBzdHJ1Y3QgZ3JwY19jaHR0cDJfb3V0c3RhbmRpbmdfcGluZyAqbmV4dDsKKyAgc3RydWN0IGdycGNfY2h0dHAyX291dHN0YW5kaW5nX3BpbmcgKnByZXY7Cit9IGdycGNfY2h0dHAyX291dHN0YW5kaW5nX3Bpbmc7CisKKy8qIGZvcndhcmQgZGVjbGFyZWQgaW4gZnJhbWVfZGF0YS5oICovCitzdHJ1Y3QgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0geworICBncnBjX2J5dGVfc3RyZWFtIGJhc2U7CisgIGdwcl9yZWZjb3VudCByZWZzOworICBzdHJ1Y3QgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKm5leHRfbWVzc2FnZTsKKyAgaW50IGZhaWxlZDsKKworICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07CisgIGludCBpc190YWlsOworICBncHJfc2xpY2VfYnVmZmVyIHNsaWNlczsKKyAgZ3JwY19jbG9zdXJlICpvbl9uZXh0OworICBncHJfc2xpY2UgKm5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qKiBkYXRhIHRvIHdyaXRlIG5leHQgd3JpdGUgKi8KKyAgZ3ByX3NsaWNlX2J1ZmZlciBxYnVmOworCisgIC8qKiB3aW5kb3cgYXZhaWxhYmxlIGZvciB1cyB0byBzZW5kIHRvIHBlZXIgKi8KKyAgaW50NjRfdCBvdXRnb2luZ193aW5kb3c7CisgIC8qKiB3aW5kb3cgYXZhaWxhYmxlIHRvIGFubm91bmNlIHRvIHBlZXIgKi8KKyAgaW50NjRfdCBhbm5vdW5jZV9pbmNvbWluZ193aW5kb3c7CisgIC8qKiBob3cgbXVjaCB3aW5kb3cgd291bGQgd2UgbGlrZSB0byBoYXZlIGZvciBpbmNvbWluZ193aW5kb3cgKi8KKyAgdWludDMyX3QgY29ubmVjdGlvbl93aW5kb3dfdGFyZ2V0OworCisgIC8qKiBoYXZlIHdlIHNlZW4gYSBnb2F3YXkgKi8KKyAgdWludDhfdCBzZWVuX2dvYXdheTsKKyAgLyoqIGhhdmUgd2Ugc2VudCBhIGdvYXdheSAqLworICB1aW50OF90IHNlbnRfZ29hd2F5OworCisgIC8qKiBpcyB0aGlzIHRyYW5zcG9ydCBhIGNsaWVudD8gKi8KKyAgdWludDhfdCBpc19jbGllbnQ7CisgIC8qKiBhcmUgdGhlIGxvY2FsIHNldHRpbmdzIGRpcnR5IGFuZCBuZWVkIHRvIGJlIHNlbnQ/ICovCisgIHVpbnQ4X3QgZGlydGllZF9sb2NhbF9zZXR0aW5nczsKKyAgLyoqIGhhdmUgbG9jYWwgc2V0dGluZ3MgYmVlbiBzZW50PyAqLworICB1aW50OF90IHNlbnRfbG9jYWxfc2V0dGluZ3M7CisgIC8qKiBiaXRtYXNrIG9mIHNldHRpbmcgaW5kZXhlcyB0byBzZW5kIG91dCAqLworICB1aW50MzJfdCBmb3JjZV9zZW5kX3NldHRpbmdzOworICAvKiogc2V0dGluZ3MgdmFsdWVzICovCisgIHVpbnQzMl90IHNldHRpbmdzW0dSUENfTlVNX1NFVFRJTkdfU0VUU11bR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTXTsKKworICAvKiogd2hhdCBpcyB0aGUgbmV4dCBzdHJlYW0gaWQgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoaXMgcGVlcj8KKyAgICAgIGNvcGllZCB0byBuZXh0X3N0cmVhbV9pZCBpbiBwYXJzaW5nIHdoZW4gcGFyc2luZyBjb21tZW5jZXMgKi8KKyAgdWludDMyX3QgbmV4dF9zdHJlYW1faWQ7CisKKyAgLyoqIGhvdyBmYXIgdG8gbG9va2FoZWFkIGluIGEgc3RyZWFtPyAqLworICB1aW50MzJfdCBzdHJlYW1fbG9va2FoZWFkOworCisgIC8qKiBsYXN0IHJlY2VpdmVkIHN0cmVhbSBpZCAqLworICB1aW50MzJfdCBsYXN0X2luY29taW5nX3N0cmVhbV9pZDsKKworICAvKiogcGluZ3MgYXdhaXRpbmcgcmVzcG9uc2VzICovCisgIGdycGNfY2h0dHAyX291dHN0YW5kaW5nX3BpbmcgcGluZ3M7CisgIC8qKiBuZXh0IHBheWxvYWQgZm9yIGFuIG91dGdvaW5nIHBpbmcgKi8KKyAgdWludDY0X3QgcGluZ19jb3VudGVyOworCisgIC8qKiBjb25jdXJyZW50IHN0cmVhbSBjb3VudDogdXBkYXRlZCB3aGVuIG5vdCBwYXJzaW5nLAorICAgICAgc28gdGhpcyBpcyBhIHN0cmljdCBvdmVyLWVzdGltYXRpb24gb24gdGhlIGNsaWVudCAqLworICB1aW50MzJfdCBjb25jdXJyZW50X3N0cmVhbV9jb3VudDsKK30gZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiogZGF0YSB0byB3cml0ZSBub3cgKi8KKyAgZ3ByX3NsaWNlX2J1ZmZlciBvdXRidWY7CisgIC8qKiBocGFjayBlbmNvZGluZyAqLworICBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yIGhwYWNrX2NvbXByZXNzb3I7CisgIGludDY0X3Qgb3V0Z29pbmdfd2luZG93OworICAvKiogaXMgdGhpcyBhIGNsaWVudD8gKi8KKyAgdWludDhfdCBpc19jbGllbnQ7CisgIC8qKiBjYWxsYmFjayBmb3Igd2hlbiB3cml0aW5nIGlzIGRvbmUgKi8KKyAgZ3JwY19jbG9zdXJlIGRvbmVfY2I7Cit9IGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nOworCitzdHJ1Y3QgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgeworICAvKiogaXMgdGhpcyB0cmFuc3BvcnQgYSBjbGllbnQ/IChib29sZWFuKSAqLworICB1aW50OF90IGlzX2NsaWVudDsKKworICAvKiogd2VyZSBzZXR0aW5ncyB1cGRhdGVkPyAqLworICB1aW50OF90IHNldHRpbmdzX3VwZGF0ZWQ7CisgIC8qKiB3YXMgYSBzZXR0aW5ncyBhY2sgcmVjZWl2ZWQ/ICovCisgIHVpbnQ4X3Qgc2V0dGluZ3NfYWNrX3JlY2VpdmVkOworICAvKiogd2FzIGEgZ29hd2F5IGZyYW1lIHJlY2VpdmVkPyAqLworICB1aW50OF90IGdvYXdheV9yZWNlaXZlZDsKKworICAvKiogdGhlIGxhc3Qgc2VudCBtYXhfdGFibGVfc2l6ZSBzZXR0aW5nICovCisgIHVpbnQzMl90IGxhc3Rfc2VudF9tYXhfdGFibGVfc2l6ZTsKKworICAvKiogaW5pdGlhbCB3aW5kb3cgY2hhbmdlICovCisgIGludDY0X3QgaW5pdGlhbF93aW5kb3dfdXBkYXRlOworCisgIC8qKiBkYXRhIHRvIHdyaXRlIGxhdGVyIC0gYWZ0ZXIgcGFyc2luZyAqLworICBncHJfc2xpY2VfYnVmZmVyIHFidWY7CisgIC8qKiBwYXJzZXIgZm9yIGhlYWRlcnMgKi8KKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyIGhwYWNrX3BhcnNlcjsKKyAgLyoqIHNpbXBsZSBvbmUgc2hvdCBwYXJzZXJzICovCisgIHVuaW9uIHsKKyAgICBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlciB3aW5kb3dfdXBkYXRlOworICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcnNlciBzZXR0aW5nczsKKyAgICBncnBjX2NodHRwMl9waW5nX3BhcnNlciBwaW5nOworICAgIGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fcGFyc2VyIHJzdF9zdHJlYW07CisgIH0gc2ltcGxlOworICAvKiogcGFyc2VyIGZvciBnb2F3YXkgZnJhbWVzICovCisgIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXIgZ29hd2F5X3BhcnNlcjsKKworICAvKiogd2luZG93IGF2YWlsYWJsZSBmb3IgcGVlciB0byBzZW5kIHRvIHVzICovCisgIGludDY0X3QgaW5jb21pbmdfd2luZG93OworCisgIC8qKiBuZXh0IHN0cmVhbSBpZCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgb2YgYmVnaW5uaW5nIHBhcnNpbmcgKi8KKyAgdWludDMyX3QgbmV4dF9zdHJlYW1faWQ7CisgIHVpbnQzMl90IGxhc3RfaW5jb21pbmdfc3RyZWFtX2lkOworCisgIC8qIGRlZnJhbWluZyAqLworICBncnBjX2NodHRwMl9kZWZyYW1lX3RyYW5zcG9ydF9zdGF0ZSBkZWZyYW1lX3N0YXRlOworICB1aW50OF90IGluY29taW5nX2ZyYW1lX3R5cGU7CisgIHVpbnQ4X3QgaW5jb21pbmdfZnJhbWVfZmxhZ3M7CisgIHVpbnQ4X3QgaGVhZGVyX2VvZjsKKyAgdWludDMyX3QgZXhwZWN0X2NvbnRpbnVhdGlvbl9zdHJlYW1faWQ7CisgIHVpbnQzMl90IGluY29taW5nX2ZyYW1lX3NpemU7CisgIHVpbnQzMl90IGluY29taW5nX3N0cmVhbV9pZDsKKworICAvKiBhY3RpdmUgcGFyc2VyICovCisgIHZvaWQgKnBhcnNlcl9kYXRhOworICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqaW5jb21pbmdfc3RyZWFtOworICBncnBjX2NodHRwMl9wYXJzZV9lcnJvciAoKnBhcnNlcikoCisgICAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyX3VzZXJfZGF0YSwKKyAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCk7CisKKyAgLyogcmVjZWl2ZWQgc2V0dGluZ3MgKi8KKyAgdWludDMyX3Qgc2V0dGluZ3NbR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTXTsKKworICAvKiBnb2F3YXkgZGF0YSAqLworICBncnBjX3N0YXR1c19jb2RlIGdvYXdheV9lcnJvcjsKKyAgdWludDMyX3QgZ29hd2F5X2xhc3Rfc3RyZWFtX2luZGV4OworICBncHJfc2xpY2UgZ29hd2F5X3RleHQ7CisKKyAgaW50NjRfdCBvdXRnb2luZ193aW5kb3c7Cit9OworCitzdHJ1Y3QgZ3JwY19jaHR0cDJfdHJhbnNwb3J0IHsKKyAgZ3JwY190cmFuc3BvcnQgYmFzZTsgLyogbXVzdCBiZSBmaXJzdCAqLworICBncnBjX2VuZHBvaW50ICplcDsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7CisgIGNoYXIgKnBlZXJfc3RyaW5nOworCisgIC8qKiB3aGVuIHRoaXMgZHJvcHMgdG8gemVybyBpdCdzIHNhZmUgdG8gc2h1dGRvd24gdGhlIGVuZHBvaW50ICovCisgIGdwcl9yZWZjb3VudCBzaHV0ZG93bl9lcF9yZWZzOworCisgIGdwcl9tdSBtdTsKKworICAvKiogaXMgdGhlIHRyYW5zcG9ydCBkZXN0cm95aW5nIGl0c2VsZj8gKi8KKyAgdWludDhfdCBkZXN0cm95aW5nOworICAvKiogaGFzIHRoZSB1cHBlciBsYXllciBjbG9zZWQgdGhlIHRyYW5zcG9ydD8gKi8KKyAgdWludDhfdCBjbG9zZWQ7CisKKyAgLyoqIGlzIGEgdGhyZWFkIGN1cnJlbnRseSB3cml0aW5nICovCisgIHVpbnQ4X3Qgd3JpdGluZ19hY3RpdmU7CisgIC8qKiBpcyBhIHRocmVhZCBjdXJyZW50bHkgcGFyc2luZyAqLworICB1aW50OF90IHBhcnNpbmdfYWN0aXZlOworCisgIC8qKiBpcyB0aGVyZSBhIHJlYWQgcmVxdWVzdCB0byB0aGUgZW5kcG9pbnQgb3V0c3RhbmRpbmc/ICovCisgIHVpbnQ4X3QgZW5kcG9pbnRfcmVhZGluZzsKKworICAvKiogdmFyaW91cyBsaXN0cyBvZiBzdHJlYW1zICovCisgIGdycGNfY2h0dHAyX3N0cmVhbV9saXN0IGxpc3RzW1NUUkVBTV9MSVNUX0NPVU5UXTsKKworICAvKiogZ2xvYmFsIHN0YXRlIGZvciByZWFkaW5nL3dyaXRpbmcgKi8KKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCBnbG9iYWw7CisgIC8qKiBzdGF0ZSBvbmx5IGFjY2Vzc2libGUgYnkgdGhlIGNoYWluIG9mIGV4ZWN1dGlvbiB0aGF0CisgICAgICBzZXQgd3JpdGluZ19hY3RpdmU9MSAqLworICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyB3cml0aW5nOworICAvKiogc3RhdGUgb25seSBhY2Nlc3NpYmxlIGJ5IHRoZSBjaGFpbiBvZiBleGVjdXRpb24gdGhhdAorICAgICAgc2V0IHBhcnNpbmdfYWN0aXZlPTEgKi8KKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgcGFyc2luZzsKKworICAvKiogbWFwcyBzdHJlYW0gaWQgdG8gZ3JwY19jaHR0cDJfc3RyZWFtIG9iamVjdHM7CisgICAgICBvd25lZCBieSB0aGUgcGFyc2luZyB0aHJlYWQgd2hlbiBwYXJzaW5nICovCisgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgcGFyc2luZ19zdHJlYW1fbWFwOworCisgIC8qKiBzdHJlYW1zIGNyZWF0ZWQgYnkgdGhlIGNsaWVudCAocG9zc2libHkgZHVyaW5nIHBhcnNpbmcpOworICAgICAgbWVyZ2VkIHdpdGggcGFyc2luZ19zdHJlYW1fbWFwIGR1cmluZyB1bmxvY2sgd2hlbiBubworICAgICAgcGFyc2luZyBpcyBvY2N1cnJpbmcgKi8KKyAgZ3JwY19jaHR0cDJfc3RyZWFtX21hcCBuZXdfc3RyZWFtX21hcDsKKworICAvKiogY2xvc3VyZSB0byBleGVjdXRlIHdyaXRpbmcgKi8KKyAgZ3JwY19jbG9zdXJlIHdyaXRpbmdfYWN0aW9uOworICAvKiogY2xvc3VyZSB0byBmaW5pc2ggcmVhZGluZyBmcm9tIHRoZSBlbmRwb2ludCAqLworICBncnBjX2Nsb3N1cmUgcmVjdl9kYXRhOworCisgIC8qKiBpbmNvbWluZyByZWFkIGJ5dGVzICovCisgIGdwcl9zbGljZV9idWZmZXIgcmVhZF9idWZmZXI7CisKKyAgLyoqIGFkZHJlc3MgdG8gcGxhY2UgYSBuZXdseSBhY2NlcHRlZCBzdHJlYW0gLSBzZXQgYW5kIHVuc2V0IGJ5CisgICAgICBncnBjX2NodHRwMl9wYXJzaW5nX2FjY2VwdF9zdHJlYW07IHVzZWQgYnkgaW5pdF9zdHJlYW0gdG8KKyAgICAgIHB1Ymxpc2ggdGhlIGFjY2VwdGVkIHNlcnZlciBzdHJlYW0gKi8KKyAgZ3JwY19jaHR0cDJfc3RyZWFtICoqYWNjZXB0aW5nX3N0cmVhbTsKKworICBzdHJ1Y3QgeworICAgIC8qIGFjY2VwdCBzdHJlYW0gY2FsbGJhY2sgKi8KKyAgICB2b2lkICgqYWNjZXB0X3N0cmVhbSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3Qgdm9pZCAqc2VydmVyX2RhdGEpOworICAgIHZvaWQgKmFjY2VwdF9zdHJlYW1fdXNlcl9kYXRhOworCisgICAgLyoqIGNvbm5lY3Rpdml0eSB0cmFja2luZyAqLworICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgc3RhdGVfdHJhY2tlcjsKKyAgfSBjaGFubmVsX2NhbGxiYWNrOworCisgIC8qKiBUcmFuc3BvcnQgb3AgdG8gYmUgYXBwbGllZCBwb3N0LXBhcnNpbmcgKi8KKyAgZ3JwY190cmFuc3BvcnRfb3AgKnBvc3RfcGFyc2luZ19vcDsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyoqIEhUVFAyIHN0cmVhbSBpZCBmb3IgdGhpcyBzdHJlYW0sIG9yIHplcm8gaWYgb25lIGhhcyBub3QgYmVlbiBhc3NpZ25lZCAqLworICB1aW50MzJfdCBpZDsKKworICAvKiogd2luZG93IGF2YWlsYWJsZSBmb3IgdXMgdG8gc2VuZCB0byBwZWVyICovCisgIGludDY0X3Qgb3V0Z29pbmdfd2luZG93OworICAvKiogVGhlIG51bWJlciBvZiBieXRlcyB0aGUgdXBwZXIgbGF5ZXJzIGhhdmUgb2ZmZXJlZCB0byByZWNlaXZlLgorICAgICAgQXMgdGhlIHVwcGVyIGxheWVyIG9mZmVycyBtb3JlIGJ5dGVzLCB0aGlzIHZhbHVlIGluY3JlYXNlcy4KKyAgICAgIEFzIGJ5dGVzIGFyZSByZWFkLCB0aGlzIHZhbHVlIGRlY3JlYXNlcy4gKi8KKyAgdWludDMyX3QgbWF4X3JlY3ZfYnl0ZXM7CisgIC8qKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSB1cHBlciBsYXllciBoYXMgb2ZmZXJlZCB0byByZWFkIGJ1dCB3ZSBoYXZlCisgICAgICBub3QgeWV0IGFubm91bmNlZCB0byBIVFRQMiBmbG93IGNvbnRyb2wuCisgICAgICBBcyB0aGUgdXBwZXIgbGF5ZXJzIG9mZmVyIHRvIHJlYWQgbW9yZSBieXRlcywgdGhpcyB2YWx1ZSBpbmNyZWFzZXMuCisgICAgICBBcyB3ZSBhZHZlcnRpc2UgaW5jb21pbmcgZmxvdyBjb250cm9sIHdpbmRvdywgdGhpcyB2YWx1ZSBkZWNyZWFzZXMuICovCisgIHVpbnQzMl90IHVuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19mb3JfcGFyc2U7CisgIHVpbnQzMl90IHVuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19mb3Jfd3JpdGluZzsKKyAgLyoqIHRoaW5ncyB0aGUgdXBwZXIgbGF5ZXJzIHdvdWxkIGxpa2UgdG8gc2VuZCAqLworICBncnBjX21ldGFkYXRhX2JhdGNoICpzZW5kX2luaXRpYWxfbWV0YWRhdGE7CisgIGdycGNfY2xvc3VyZSAqc2VuZF9pbml0aWFsX21ldGFkYXRhX2ZpbmlzaGVkOworICBncnBjX2J5dGVfc3RyZWFtICpzZW5kX21lc3NhZ2U7CisgIGdycGNfY2xvc3VyZSAqc2VuZF9tZXNzYWdlX2ZpbmlzaGVkOworICBncnBjX21ldGFkYXRhX2JhdGNoICpzZW5kX3RyYWlsaW5nX21ldGFkYXRhOworICBncnBjX2Nsb3N1cmUgKnNlbmRfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQ7CisKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl9pbml0aWFsX21ldGFkYXRhOworICBncnBjX2Nsb3N1cmUgKnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKKyAgZ3JwY19ieXRlX3N0cmVhbSAqKnJlY3ZfbWVzc2FnZTsKKyAgZ3JwY19jbG9zdXJlICpyZWN2X21lc3NhZ2VfcmVhZHk7CisgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGE7CisgIGdycGNfY2xvc3VyZSAqcmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZDsKKworICAvKiogd2hlbiB0aGUgYXBwbGljYXRpb24gcmVxdWVzdHMgd3JpdGVzIGJlIGNsb3NlZCwgdGhlIHdyaXRlX2Nsb3NlZCBpcworICAgICAgJ3F1ZXVlZCc7IHdoZW4gdGhlIGNsb3NlIGlzIGZsb3cgY29udHJvbGxlZCBpbnRvIHRoZSBzZW5kIHBhdGgsIHdlIGFyZQorICAgICAgJ3NlbmRpbmcnIGl0OyB3aGVuIHRoZSB3cml0ZSBoYXMgYmVlbiBwZXJmb3JtZWQgaXQgaXMgJ3NlbnQnICovCisgIHVpbnQ4X3Qgd3JpdGVfY2xvc2VkOworICAvKiogaXMgdGhpcyBzdHJlYW0gcmVhZGluZyBoYWxmLWNsb3NlZCAoYm9vbGVhbikgKi8KKyAgdWludDhfdCByZWFkX2Nsb3NlZDsKKyAgLyoqIGlzIHRoaXMgc3RyZWFtIGluIHRoZSBzdHJlYW0gbWFwPyAoYm9vbGVhbikgKi8KKyAgdWludDhfdCBpbl9zdHJlYW1fbWFwOworICAvKiogaGFzIHRoaXMgc3RyZWFtIHNlZW4gYW4gZXJyb3I/IGlmIDEsIHRoZW4gcGVuZGluZyBpbmNvbWluZyBmcmFtZXMKKyAgICAgIGNhbiBiZSB0aHJvd24gYXdheSAqLworICB1aW50OF90IHNlZW5fZXJyb3I7CisKKyAgdWludDhfdCBwdWJsaXNoZWRfaW5pdGlhbF9tZXRhZGF0YTsKKyAgdWludDhfdCBwdWJsaXNoZWRfdHJhaWxpbmdfbWV0YWRhdGE7CisgIHVpbnQ4X3QgZmFrZWRfdHJhaWxpbmdfbWV0YWRhdGE7CisKKyAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyIHJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGE7CisgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciByZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YTsKKworICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSBpbmNvbWluZ19mcmFtZXM7Cit9IGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyoqIEhUVFAyIHN0cmVhbSBpZCBmb3IgdGhpcyBzdHJlYW0sIG9yIHplcm8gaWYgb25lIGhhcyBub3QgYmVlbiBhc3NpZ25lZCAqLworICB1aW50MzJfdCBpZDsKKyAgdWludDhfdCBmZXRjaGluZzsKKyAgYm9vbCBzZW50X2luaXRpYWxfbWV0YWRhdGE7CisgIHVpbnQ4X3Qgc2VudF9tZXNzYWdlOworICB1aW50OF90IHNlbnRfdHJhaWxpbmdfbWV0YWRhdGE7CisgIHVpbnQ4X3QgcmVhZF9jbG9zZWQ7CisgIC8qKiBzZW5kIHRoaXMgaW5pdGlhbCBtZXRhZGF0YSAqLworICBncnBjX21ldGFkYXRhX2JhdGNoICpzZW5kX2luaXRpYWxfbWV0YWRhdGE7CisgIGdycGNfYnl0ZV9zdHJlYW0gKnNlbmRfbWVzc2FnZTsKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqc2VuZF90cmFpbGluZ19tZXRhZGF0YTsKKyAgaW50NjRfdCBvdXRnb2luZ193aW5kb3c7CisgIC8qKiBob3cgbXVjaCB3aW5kb3cgc2hvdWxkIHdlIGFubm91bmNlPyAqLworICB1aW50MzJfdCBhbm5vdW5jZV93aW5kb3c7CisgIGdwcl9zbGljZV9idWZmZXIgZmxvd19jb250cm9sbGVkX2J1ZmZlcjsKKyAgZ3ByX3NsaWNlIGZldGNoaW5nX3NsaWNlOworICBzaXplX3Qgc3RyZWFtX2ZldGNoZWQ7CisgIGdycGNfY2xvc3VyZSBmaW5pc2hlZF9mZXRjaDsKK30gZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmc7CisKK3N0cnVjdCBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyB7CisgIC8qKiBIVFRQMiBzdHJlYW0gaWQgZm9yIHRoaXMgc3RyZWFtLCBvciB6ZXJvIGlmIG9uZSBoYXMgbm90IGJlZW4gYXNzaWduZWQgKi8KKyAgdWludDMyX3QgaWQ7CisgIC8qKiBoYXMgdGhpcyBzdHJlYW0gcmVjZWl2ZWQgYSBjbG9zZSAqLworICB1aW50OF90IHJlY2VpdmVkX2Nsb3NlOworICAvKiogc2F3IGEgcnN0X3N0cmVhbSAqLworICB1aW50OF90IHNhd19yc3Rfc3RyZWFtOworICAvKiogaG93IG1hbnkgaGVhZGVyIGZyYW1lcyBoYXZlIHdlIHJlY2VpdmVkPyAqLworICB1aW50OF90IGhlYWRlcl9mcmFtZXNfcmVjZWl2ZWQ7CisgIC8qKiB3aGljaCBtZXRhZGF0YSBkaWQgd2UgZ2V0IChvbiB0aGlzIHBhcnNlKSAqLworICB1aW50OF90IGdvdF9tZXRhZGF0YV9vbl9wYXJzZVsyXTsKKyAgLyoqIHNob3VsZCB3ZSByYWlzZSB0aGUgc2Vlbl9lcnJvciBmbGFnIGluIHRyYW5zcG9ydF9nbG9iYWwgKi8KKyAgdWludDhfdCBzZWVuX2Vycm9yOworICAvKiogd2luZG93IGF2YWlsYWJsZSBmb3IgcGVlciB0byBzZW5kIHRvIHVzICovCisgIGludDY0X3QgaW5jb21pbmdfd2luZG93OworICAvKiogcGFyc2luZyBzdGF0ZSBmb3IgZGF0YSBmcmFtZXMgKi8KKyAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgZGF0YV9wYXJzZXI7CisgIC8qKiByZWFzb24gZ2l2ZSB0byByc3Rfc3RyZWFtICovCisgIHVpbnQzMl90IHJzdF9zdHJlYW1fcmVhc29uOworICAvKiogYW1vdW50IG9mIHdpbmRvdyBnaXZlbiAqLworICBpbnQ2NF90IG91dGdvaW5nX3dpbmRvdzsKKyAgLyoqIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCAtIHJlc2V0IGF0IGVuZCBvZiBwYXJzZSB0aHJlYWQgZXhlY3V0aW9uICovCisgIGludDY0X3QgcmVjZWl2ZWRfYnl0ZXM7CisKKyAgLyoqIGluY29taW5nIG1ldGFkYXRhICovCisgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciBtZXRhZGF0YV9idWZmZXJbMl07Cit9OworCitzdHJ1Y3QgZ3JwY19jaHR0cDJfc3RyZWFtIHsKKyAgZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50OworICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsIGdsb2JhbDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgd3JpdGluZzsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgcGFyc2luZzsKKworICBncnBjX2NodHRwMl9zdHJlYW1fbGluayBsaW5rc1tTVFJFQU1fTElTVF9DT1VOVF07CisgIHVpbnQ4X3QgaW5jbHVkZWRbU1RSRUFNX0xJU1RfQ09VTlRdOworfTsKKworLyoqIFRyYW5zcG9ydCB3cml0aW5nIGNhbGwgZmxvdzoKKyAgICBjaHR0cDJfdHJhbnNwb3J0LmMgY2FsbHMgZ3JwY19jaHR0cDJfdW5sb2NraW5nX2NoZWNrX3dyaXRlcyB0byBzZWUgaWYgd3JpdGVzCisgICBhcmUgcmVxdWlyZWQ7CisgICAgaWYgdGhleSBhcmUsIGNodHRwMl90cmFuc3BvcnQuYyBjYWxscyBncnBjX2NodHRwMl9wZXJmb3JtX3dyaXRlcyB0byBkbyB0aGUKKyAgIHdyaXRlcy4KKyAgICBPbmNlIHdyaXRlcyBoYXZlIGJlZW4gY29tcGxldGVkIChtZWFuaW5nIGFub3RoZXIgd3JpdGUgY291bGQgcG90ZW50aWFsbHkgYmUKKyAgIHN0YXJ0ZWQpLAorICAgIGdycGNfY2h0dHAyX3Rlcm1pbmF0ZV93cml0aW5nIGlzIGNhbGxlZC4gVGhpcyB3aWxsIGNhbGwKKyAgIGdycGNfY2h0dHAyX2NsZWFudXBfd3JpdGluZywgYXQgd2hpY2gKKyAgICBwb2ludCB0aGUgd3JpdGUgcGhhc2UgaXMgY29tcGxldGUuICovCisKKy8qKiBTb21lb25lIGlzIHVubG9ja2luZyB0aGUgdHJhbnNwb3J0IG11dGV4OiBjaGVjayB0byBzZWUgaWYgd3JpdGVzCisgICAgYXJlIHJlcXVpcmVkLCBhbmQgc2NoZWR1bGUgdGhlbSBpZiBzbyAqLworaW50IGdycGNfY2h0dHAyX3VubG9ja2luZ19jaGVja193cml0ZXMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICpnbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqd3JpdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19wYXJzaW5nKTsKK3ZvaWQgZ3JwY19jaHR0cDJfcGVyZm9ybV93cml0ZXMoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2VuZHBvaW50ICplbmRwb2ludCk7Cit2b2lkIGdycGNfY2h0dHAyX3Rlcm1pbmF0ZV93cml0aW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0cmFuc3BvcnRfd3JpdGluZywgYm9vbCBzdWNjZXNzKTsKK3ZvaWQgZ3JwY19jaHR0cDJfY2xlYW51cF93cml0aW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKndyaXRpbmcpOworCit2b2lkIGdycGNfY2h0dHAyX3ByZXBhcmVfdG9fcmVhZChncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICpnbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqcGFyc2luZyk7CisvKiogUHJvY2VzcyBvbmUgc2xpY2Ugb2YgaW5jb21pbmcgZGF0YTsgcmV0dXJuIDEgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwKKyAgICB2aWFibGUgYWZ0ZXIgcmVhZGluZywgb3IgMCBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgdG9ybiBkb3duICovCitpbnQgZ3JwY19jaHR0cDJfcGVyZm9ybV9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBzbGljZSk7Cit2b2lkIGdycGNfY2h0dHAyX3B1Ymxpc2hfcmVhZHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICpwYXJzaW5nKTsKKworYm9vbCBncnBjX2NodHRwMl9saXN0X2FkZF93cml0YWJsZV9zdHJlYW0oCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKKy8qKiBHZXQgYSB3cml0YWJsZSBzdHJlYW0KKyAgICByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIHdhcyBhIHN0cmVhbSBhdmFpbGFibGUgKi8KK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF93cml0YWJsZV9zdHJlYW0oCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKipzdHJlYW1fd3JpdGluZyk7Citib29sIGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3dyaXRhYmxlX3N0cmVhbSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIEdSUENfTVVTVF9VU0VfUkVTVUxUOworCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpOworaW50IGdycGNfY2h0dHAyX2xpc3RfaGF2ZV93cml0aW5nX3N0cmVhbXMoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nKTsKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF93cml0aW5nX3N0cmVhbSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKipzdHJlYW1fd3JpdGluZyk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdHRlbl9zdHJlYW0oCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZyk7CitpbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdHRlbl9zdHJlYW0oCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKipzdHJlYW1fd3JpdGluZyk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfcGFyc2luZ19zZWVuX3N0cmVhbSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nKTsKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF9wYXJzaW5nX3NlZW5fc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICoqc3RyZWFtX3BhcnNpbmcpOworCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dhaXRpbmdfZm9yX2NvbmN1cnJlbmN5KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7CitpbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd2FpdGluZ19mb3JfY29uY3VycmVuY3koCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHMoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF9jaGVja19yZWFkX29wcygKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsKTsKKwordm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpOwordm9pZCBncnBjX2NodHRwMl9saXN0X2ZsdXNoX3dyaXRpbmdfc3RhbGxlZF9ieV90cmFuc3BvcnQoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBib29sIGlzX3dpbmRvd19hdmFpbGFibGUpOworCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpOworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpOwordm9pZCBncnBjX2NodHRwMl9saXN0X3JlbW92ZV9zdGFsbGVkX2J5X3RyYW5zcG9ydCgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpOworCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3VuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19hdmFpbGFibGUoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9yZW1vdmVfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpOworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3VuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19hdmFpbGFibGUoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKipzdHJlYW1fcGFyc2luZyk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF9jbG9zZWRfd2FpdGluZ19mb3JfcGFyc2luZygKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsKTsKKwordm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF9jbG9zZWRfd2FpdGluZ19mb3Jfd3JpdGluZygKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpOworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX2Nsb3NlZF93YWl0aW5nX2Zvcl93cml0aW5nKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpOworCitncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqZ3JwY19jaHR0cDJfcGFyc2luZ19sb29rdXBfc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywgdWludDMyX3QgaWQpOworZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKmdycGNfY2h0dHAyX3BhcnNpbmdfYWNjZXB0X3N0cmVhbSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIHVpbnQzMl90IGlkKTsKKwordm9pZCBncnBjX2NodHRwMl9hZGRfaW5jb21pbmdfZ29hd2F5KAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIHVpbnQzMl90IGdvYXdheV9lcnJvciwgZ3ByX3NsaWNlIGdvYXdheV90ZXh0KTsKKwordm9pZCBncnBjX2NodHRwMl9yZWdpc3Rlcl9zdHJlYW0oZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpzKTsKKy8qIHJldHVybnMgMSBpZiB0aGlzIGlzIHRoZSBsYXN0IHN0cmVhbSwgMCBvdGhlcndpc2UgKi8KK2ludCBncnBjX2NodHRwMl91bnJlZ2lzdGVyX3N0cmVhbShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpzKSBHUlBDX01VU1RfVVNFX1JFU1VMVDsKK2ludCBncnBjX2NodHRwMl9oYXNfc3RyZWFtcyhncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpOwordm9pZCBncnBjX2NodHRwMl9mb3JfYWxsX3N0cmVhbXMoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwgdm9pZCAqdXNlcl9kYXRhLAorICAgIHZvaWQgKCpjYikoZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkpOworCit2b2lkIGdycGNfY2h0dHAyX3BhcnNpbmdfYmVjb21lX3NraXBfcGFyc2VyKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpOworCit2b2lkIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqKnBjbG9zdXJlLCBpbnQgc3VjY2Vzcyk7CisKKyNkZWZpbmUgR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSSU5HICJQUkkgKiBIVFRQLzIuMFxyXG5cclxuU01cclxuXHJcbiIKKyNkZWZpbmUgR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSTEVOIFwKKyAgKHNpemVvZihHUlBDX0NIVFRQMl9DTElFTlRfQ09OTkVDVF9TVFJJTkcpIC0gMSkKKworZXh0ZXJuIGludCBncnBjX2h0dHBfdHJhY2U7CitleHRlcm4gaW50IGdycGNfZmxvd2N0bF90cmFjZTsKKworI2RlZmluZSBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKHN0bXQpIFwKKyAgaWYgKCEoZ3JwY19odHRwX3RyYWNlKSkgICAgICAgICAgICBcCisgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RtdAorCit0eXBlZGVmIGVudW0geworICBHUlBDX0NIVFRQMl9GTE9XQ1RMX01PVkUsCisgIEdSUENfQ0hUVFAyX0ZMT1dDVExfQ1JFRElULAorICBHUlBDX0NIVFRQMl9GTE9XQ1RMX0RFQklUCit9IGdycGNfY2h0dHAyX2Zsb3djdGxfb3A7CisKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX0NPTU1PTihwaGFzZSwgdHJhbnNwb3J0LCBpZDEsIGlkMiwgZHN0X2NvbnRleHQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdmFyLCBzcmNfY29udGV4dCwgc3JjX3ZhcikgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoaWQxID09IGlkMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZ3JwY19mbG93Y3RsX3RyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdycGNfY2h0dHAyX2Zsb3djdGxfdHJhY2UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIHBoYXNlLCBHUlBDX0NIVFRQMl9GTE9XQ1RMX01PVkUsICNkc3RfY29udGV4dCwgIFwKKyAgICAgICAgICAjZHN0X3ZhciwgI3NyY19jb250ZXh0LCAjc3JjX3ZhciwgdHJhbnNwb3J0LT5pc19jbGllbnQsIGlkMSwgICAgICAgIFwKKyAgICAgICAgICBkc3RfY29udGV4dC0+ZHN0X3Zhciwgc3JjX2NvbnRleHQtPnNyY192YXIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RfY29udGV4dC0+ZHN0X3ZhciArPSBzcmNfY29udGV4dC0+c3JjX3ZhcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNfY29udGV4dC0+c3JjX3ZhciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHUlBDX0NIVFRQMl9GTE9XX01PVkVfU1RSRUFNKHBoYXNlLCB0cmFuc3BvcnQsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbnRleHQsIHNyY192YXIpICAgICAgICAgICAgICAgICAgIFwKKyAgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX0NPTU1PTihwaGFzZSwgdHJhbnNwb3J0LCBkc3RfY29udGV4dC0+aWQsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb250ZXh0LT5pZCwgZHN0X2NvbnRleHQsIGRzdF92YXIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbnRleHQsIHNyY192YXIpCisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZMT1dfTU9WRV9UUkFOU1BPUlQocGhhc2UsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb250ZXh0LCBzcmNfdmFyKSAgICAgICAgICAgICAgICAgIFwKKyAgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX0NPTU1PTihwaGFzZSwgZHN0X2NvbnRleHQsIDAsIDAsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbnRleHQsIHNyY192YXIpCisKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfQ09NTU9OKHBoYXNlLCB0cmFuc3BvcnQsIGlkLCBkc3RfY29udGV4dCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdmFyLCBhbW91bnQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZ3JwY19mbG93Y3RsX3RyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBncnBjX2NodHRwMl9mbG93Y3RsX3RyYWNlKF9fRklMRV9fLCBfX0xJTkVfXywgcGhhc2UsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9GTE9XQ1RMX0NSRURJVCwgI2RzdF9jb250ZXh0LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RzdF92YXIsIE5VTEwsICNhbW91bnQsIHRyYW5zcG9ydC0+aXNfY2xpZW50LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkc3RfY29udGV4dC0+ZHN0X3ZhciwgYW1vdW50KTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RfY29udGV4dC0+ZHN0X3ZhciArPSBhbW91bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfU1RSRUFNKHBoYXNlLCB0cmFuc3BvcnQsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9DT01NT04ocGhhc2UsIHRyYW5zcG9ydCwgZHN0X2NvbnRleHQtPmlkLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9jb250ZXh0LCBkc3RfdmFyLCBhbW91bnQpCisjZGVmaW5lIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1RSQU5TUE9SVChwaGFzZSwgZHN0X2NvbnRleHQsIGRzdF92YXIsIGFtb3VudCkgXAorICBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9DT01NT04ocGhhc2UsIGRzdF9jb250ZXh0LCAwLCBkc3RfY29udGV4dCwgZHN0X3ZhciwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudCkKKworI2RlZmluZSBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX0NPTU1PTihwaGFzZSwgdHJhbnNwb3J0LCBpZCwgZHN0X2NvbnRleHQsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ZhciwgYW1vdW50KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChncnBjX2Zsb3djdGxfdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdycGNfY2h0dHAyX2Zsb3djdGxfdHJhY2UoX19GSUxFX18sIF9fTElORV9fLCBwaGFzZSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0ZMT1dDVExfREVCSVQsICNkc3RfY29udGV4dCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZHN0X3ZhciwgTlVMTCwgI2Ftb3VudCwgdHJhbnNwb3J0LT5pc19jbGllbnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRzdF9jb250ZXh0LT5kc3RfdmFyLCBhbW91bnQpOyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdF9jb250ZXh0LT5kc3RfdmFyIC09IGFtb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1NUUkVBTShwaGFzZSwgdHJhbnNwb3J0LCBkc3RfY29udGV4dCwgZHN0X3ZhciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX0NPTU1PTihwaGFzZSwgdHJhbnNwb3J0LCBkc3RfY29udGV4dC0+aWQsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfY29udGV4dCwgZHN0X3ZhciwgYW1vdW50KQorI2RlZmluZSBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1RSQU5TUE9SVChwaGFzZSwgZHN0X2NvbnRleHQsIGRzdF92YXIsIGFtb3VudCkgXAorICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX0NPTU1PTihwaGFzZSwgZHN0X2NvbnRleHQsIDAsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQpCisKK3ZvaWQgZ3JwY19jaHR0cDJfZmxvd2N0bF90cmFjZShjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfZmxvd2N0bF9vcCBvcCwgY29uc3QgY2hhciAqY29udGV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyMSwgY29uc3QgY2hhciAqY29udGV4dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyMiwgaW50IGlzX2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsIGludDY0X3QgdmFsMSwgaW50NjRfdCB2YWwyKTsKKwordm9pZCBncnBjX2NodHRwMl9mYWtlX3N0YXR1cyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywgZ3ByX3NsaWNlICpkZXRhaWxzKTsKK3ZvaWQgZ3JwY19jaHR0cDJfbWFya19zdHJlYW1fY2xvc2VkKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwsIGludCBjbG9zZV9yZWFkcywKKyAgICBpbnQgY2xvc2Vfd3JpdGVzKTsKK3ZvaWQgZ3JwY19jaHR0cDJfc3RhcnRfd3JpdGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsKTsKKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIEdSUENfQ0hUVFAyX1NUUkVBTV9SRUYoc3RyZWFtX2dsb2JhbCwgcmVhc29uKSBcCisgIGdycGNfY2h0dHAyX3N0cmVhbV9yZWYoc3RyZWFtX2dsb2JhbCwgcmVhc29uKQorI2RlZmluZSBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsIHJlYXNvbikgXAorICBncnBjX2NodHRwMl9zdHJlYW1fdW5yZWYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsIHJlYXNvbikKK3ZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX3JlZihncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOworI2Vsc2UKKyNkZWZpbmUgR1JQQ19DSFRUUDJfU1RSRUFNX1JFRihzdHJlYW1fZ2xvYmFsLCByZWFzb24pIFwKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX3JlZihzdHJlYW1fZ2xvYmFsKQorI2RlZmluZSBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsIHJlYXNvbikgXAorICBncnBjX2NodHRwMl9zdHJlYW1fdW5yZWYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwpCit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9yZWYoZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Cit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpOworI2VuZGlmCisKK2dycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9jcmVhdGUoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIHVpbnQzMl90IGZyYW1lX3NpemUsCisgICAgdWludDMyX3QgZmxhZ3MsIGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlICphZGRfdG9fcXVldWUpOwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9wdXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Ugc2xpY2UpOwordm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9maW5pc2hlZCgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKmJzLCBpbnQgc3VjY2VzcywKKyAgICBpbnQgZnJvbV9wYXJzaW5nX3RocmVhZCk7CisKK3ZvaWQgZ3JwY19jaHR0cDJfYWNrX3BpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICpwYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpvcGFxdWVfOGJ5dGVzKTsKKworLyoqIGFkZCBhIHJlZiB0byB0aGUgc3RyZWFtIGFuZCBhZGQgaXQgdG8gdGhlIHdyaXRhYmxlIGxpc3Q7CisgICAgcmVmIHdpbGwgYmUgZHJvcHBlZCBpbiB3cml0aW5nLmMgKi8KK3ZvaWQgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmMDQzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMKQEAgLTAsMCArMSw4NjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h0dHAyX2Vycm9ycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgorCitzdGF0aWMgaW50IGluaXRfZnJhbWVfcGFyc2VyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpOworc3RhdGljIGludCBpbml0X2hlYWRlcl9mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBpbnQgaXNfY29udGludWF0aW9uKTsKK3N0YXRpYyBpbnQgaW5pdF9kYXRhX2ZyYW1lX3BhcnNlcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKK3N0YXRpYyBpbnQgaW5pdF9yc3Rfc3RyZWFtX3BhcnNlcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKK3N0YXRpYyBpbnQgaW5pdF9zZXR0aW5nc19mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZyk7CitzdGF0aWMgaW50IGluaXRfd2luZG93X3VwZGF0ZV9mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZyk7CitzdGF0aWMgaW50IGluaXRfcGluZ19wYXJzZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKK3N0YXRpYyBpbnQgaW5pdF9nb2F3YXlfcGFyc2VyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKK3N0YXRpYyBpbnQgaW5pdF9za2lwX2ZyYW1lX3BhcnNlcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGludCBpc19oZWFkZXIpOworCitzdGF0aWMgaW50IHBhcnNlX2ZyYW1lX3NsaWNlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOworCit2b2lkIGdycGNfY2h0dHAyX3ByZXBhcmVfdG9fcmVhZCgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgeworICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsOworICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmc7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NodHRwMl9wcmVwYXJlX3RvX3JlYWQiLCAwKTsKKworICB0cmFuc3BvcnRfcGFyc2luZy0+bmV4dF9zdHJlYW1faWQgPSB0cmFuc3BvcnRfZ2xvYmFsLT5uZXh0X3N0cmVhbV9pZDsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPmxhc3Rfc2VudF9tYXhfdGFibGVfc2l6ZSA9CisgICAgICB0cmFuc3BvcnRfZ2xvYmFsLT5zZXR0aW5nc1tHUlBDX1NFTlRfU0VUVElOR1NdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHUlBDX0NIVFRQMl9TRVRUSU5HU19IRUFERVJfVEFCTEVfU0laRV07CisKKyAgLyogdXBkYXRlIHRoZSBwYXJzaW5nIHZpZXcgb2YgaW5jb21pbmcgd2luZG93ICovCisgIHdoaWxlIChncnBjX2NodHRwMl9saXN0X3BvcF91bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfYXZhaWxhYmxlKAorICAgICAgdHJhbnNwb3J0X2dsb2JhbCwgdHJhbnNwb3J0X3BhcnNpbmcsICZzdHJlYW1fZ2xvYmFsLCAmc3RyZWFtX3BhcnNpbmcpKSB7CisgICAgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX1NUUkVBTSgicGFyc2UiLCB0cmFuc3BvcnRfcGFyc2luZywgc3RyZWFtX3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ193aW5kb3csIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3BhcnNlKTsKKyAgfQorCisgIEdQUl9USU1FUl9FTkQoImdycGNfY2h0dHAyX3ByZXBhcmVfdG9fcmVhZCIsIDApOworfQorCit2b2lkIGdycGNfY2h0dHAyX3B1Ymxpc2hfcmVhZHMoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZzsKKyAgaW50IHdhc196ZXJvOworICBpbnQgaXNfemVybzsKKworICAvKiB0cmFuc3BvcnRfcGFyc2luZy0+bGFzdF9pbmNvbWluZ19zdHJlYW1faWQgaXMgdXNlZCBhcworICAgICBsYXN0LWdycGNfY2h0dHAyX3N0cmVhbS1pZCB3aGVuCisgICAgIHNlbmRpbmcgR09BV0FZIGZyYW1lLgorICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLWh0dHAyLTE3I3NlY3Rpb24tNi44CisgICAgIHNheXMgdGhhdCBsYXN0LWdycGNfY2h0dHAyX3N0cmVhbS1pZCBpcyBwZWVyLWluaXRpYXRlZCBncnBjX2NodHRwMl9zdHJlYW0KKyAgICAgSUQuICBTbywKKyAgICAgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBzZXJ2ZXIgcHVzaGVkIHN0cmVhbXMsIGNsaWVudCBzaG91bGQgc2VuZAorICAgICBHT0FXQVkgbGFzdC1ncnBjX2NodHRwMl9zdHJlYW0taWQ9MCBpbiB0aGlzIGNhc2UuICovCisgIGlmICghdHJhbnNwb3J0X3BhcnNpbmctPmlzX2NsaWVudCkgeworICAgIHRyYW5zcG9ydF9nbG9iYWwtPmxhc3RfaW5jb21pbmdfc3RyZWFtX2lkID0KKyAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZDsKKyAgfQorCisgIC8qIHVwZGF0ZSBnbG9iYWwgc2V0dGluZ3MgKi8KKyAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5nc191cGRhdGVkKSB7CisgICAgbWVtY3B5KHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfUEVFUl9TRVRUSU5HU10sCisgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5ncywgc2l6ZW9mKHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5ncykpOworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5nc191cGRhdGVkID0gMDsKKyAgfQorCisgIC8qIHVwZGF0ZSBzZXR0aW5ncyBiYXNlZCBvbiBhY2sgaWYgcmVjZWl2ZWQgKi8KKyAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5nc19hY2tfcmVjZWl2ZWQpIHsKKyAgICBtZW1jcHkodHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19BQ0tFRF9TRVRUSU5HU10sCisgICAgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfU0VOVF9TRVRUSU5HU10sCisgICAgICAgICAgIEdSUENfQ0hUVFAyX05VTV9TRVRUSU5HUyAqIHNpemVvZih1aW50MzJfdCkpOworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5nc19hY2tfcmVjZWl2ZWQgPSAwOworICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNlbnRfbG9jYWxfc2V0dGluZ3MgPSAwOworICB9CisKKyAgLyogbW92ZSBnb2F3YXkgdG8gdGhlIGdsb2JhbCBzdGF0ZSBpZiB3ZSByZWNlaXZlZCBvbmUgKGl0IHdpbGwgYmUKKyAgICAgcHVibGlzaGVkIGxhdGVyICovCisgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X3JlY2VpdmVkKSB7CisgICAgZ3JwY19jaHR0cDJfYWRkX2luY29taW5nX2dvYXdheShleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCl0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmdvYXdheV90ZXh0KTsKKyAgICB0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X3RleHQgPSBncHJfZW1wdHlfc2xpY2UoKTsKKyAgICB0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X3JlY2VpdmVkID0gMDsKKyAgfQorCisgIC8qIHByb3BhZ2F0ZSBmbG93IGNvbnRyb2wgdG9rZW5zIHRvIGdsb2JhbCBzdGF0ZSAqLworICB3YXNfemVybyA9IHRyYW5zcG9ydF9nbG9iYWwtPm91dGdvaW5nX3dpbmRvdyA8PSAwOworICBHUlBDX0NIVFRQMl9GTE9XX01PVkVfVFJBTlNQT1JUKCJwYXJzZWQiLCB0cmFuc3BvcnRfZ2xvYmFsLCBvdXRnb2luZ193aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmcsIG91dGdvaW5nX3dpbmRvdyk7CisgIGlzX3plcm8gPSB0cmFuc3BvcnRfZ2xvYmFsLT5vdXRnb2luZ193aW5kb3cgPD0gMDsKKyAgaWYgKHdhc196ZXJvICYmICFpc196ZXJvKSB7CisgICAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX3N0YWxsZWRfYnlfdHJhbnNwb3J0KHRyYW5zcG9ydF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1fZ2xvYmFsKSkgeworICAgICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOworICAgIH0KKyAgfQorCisgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfd2luZG93IDwKKyAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPmNvbm5lY3Rpb25fd2luZG93X3RhcmdldCAqIDMgLyA0KSB7CisgICAgaW50NjRfdCBhbm5vdW5jZV9ieXRlcyA9IHRyYW5zcG9ydF9nbG9iYWwtPmNvbm5lY3Rpb25fd2luZG93X3RhcmdldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ193aW5kb3c7CisgICAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfVFJBTlNQT1JUKCJwYXJzZWQiLCB0cmFuc3BvcnRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZV9pbmNvbWluZ193aW5kb3csIGFubm91bmNlX2J5dGVzKTsKKyAgICBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9UUkFOU1BPUlQoInBhcnNlZCIsIHRyYW5zcG9ydF9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ193aW5kb3csIGFubm91bmNlX2J5dGVzKTsKKyAgfQorCisgIC8qIGZvciBlYWNoIHN0cmVhbSB0aGF0IHNhdyBhbiB1cGRhdGUsIGZpeHVwIGdsb2JhbCBzdGF0ZSAqLworICB3aGlsZSAoZ3JwY19jaHR0cDJfbGlzdF9wb3BfcGFyc2luZ19zZWVuX3N0cmVhbSgKKyAgICAgIHRyYW5zcG9ydF9nbG9iYWwsIHRyYW5zcG9ydF9wYXJzaW5nLCAmc3RyZWFtX2dsb2JhbCwgJnN0cmVhbV9wYXJzaW5nKSkgeworICAgIGlmIChzdHJlYW1fcGFyc2luZy0+c2Vlbl9lcnJvcikgeworICAgICAgc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciA9IDE7CisgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgb3V0Z29pbmcgZmxvdyBjb250cm9sIHdpbmRvdyAqLworICAgIHdhc196ZXJvID0gc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93IDw9IDA7CisgICAgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX1NUUkVBTSgicGFyc2VkIiwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nX3dpbmRvdywgc3RyZWFtX3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRnb2luZ193aW5kb3cpOworICAgIGlzX3plcm8gPSBzdHJlYW1fZ2xvYmFsLT5vdXRnb2luZ193aW5kb3cgPD0gMDsKKyAgICBpZiAod2FzX3plcm8gJiYgIWlzX3plcm8pIHsKKyAgICAgIGdycGNfY2h0dHAyX2JlY29tZV93cml0YWJsZSh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgICB9CisKKyAgICBzdHJlYW1fZ2xvYmFsLT5tYXhfcmVjdl9ieXRlcyAtPSAodWludDMyX3QpR1BSX01JTigKKyAgICAgICAgc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXMsIHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9ieXRlcyk7CisgICAgc3RyZWFtX3BhcnNpbmctPnJlY2VpdmVkX2J5dGVzID0gMDsKKworICAgIC8qIHB1Ymxpc2ggaW5jb21pbmcgc3RyZWFtIG9wcyAqLworICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMudGFpbCAhPSBOVUxMKSB7CisgICAgICBzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMudGFpbC0+aXNfdGFpbCA9IDA7CisgICAgfQorICAgIGlmIChzdHJlYW1fcGFyc2luZy0+ZGF0YV9wYXJzZXIuaW5jb21pbmdfZnJhbWVzLmhlYWQgIT0gTlVMTCkgeworICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgICAgfQorICAgIGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlX21lcmdlKAorICAgICAgICAmc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzLAorICAgICAgICAmc3RyZWFtX3BhcnNpbmctPmRhdGFfcGFyc2VyLmluY29taW5nX2ZyYW1lcyk7CisgICAgaWYgKHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy50YWlsICE9IE5VTEwpIHsKKyAgICAgIHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy50YWlsLT5pc190YWlsID0gMTsKKyAgICB9CisKKyAgICBpZiAoIXN0cmVhbV9nbG9iYWwtPnB1Ymxpc2hlZF9pbml0aWFsX21ldGFkYXRhICYmCisgICAgICAgIHN0cmVhbV9wYXJzaW5nLT5nb3RfbWV0YWRhdGFfb25fcGFyc2VbMF0pIHsKKyAgICAgIHN0cmVhbV9wYXJzaW5nLT5nb3RfbWV0YWRhdGFfb25fcGFyc2VbMF0gPSAwOworICAgICAgc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX2luaXRpYWxfbWV0YWRhdGEgPSAxOworICAgICAgR1BSX1NXQVAoZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyLAorICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmctPm1ldGFkYXRhX2J1ZmZlclswXSwKKyAgICAgICAgICAgICAgIHN0cmVhbV9nbG9iYWwtPnJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGEpOworICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7CisgICAgfQorICAgIGlmICghc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhICYmCisgICAgICAgIHN0cmVhbV9wYXJzaW5nLT5nb3RfbWV0YWRhdGFfb25fcGFyc2VbMV0pIHsKKyAgICAgIHN0cmVhbV9wYXJzaW5nLT5nb3RfbWV0YWRhdGFfb25fcGFyc2VbMV0gPSAwOworICAgICAgc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhID0gMTsKKyAgICAgIEdQUl9TV0FQKGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciwKKyAgICAgICAgICAgICAgIHN0cmVhbV9wYXJzaW5nLT5tZXRhZGF0YV9idWZmZXJbMV0sCisgICAgICAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSk7CisgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtX3BhcnNpbmctPnNhd19yc3Rfc3RyZWFtKSB7CisgICAgICBpZiAoc3RyZWFtX3BhcnNpbmctPnJzdF9zdHJlYW1fcmVhc29uICE9IEdSUENfQ0hUVFAyX05PX0VSUk9SKSB7CisgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzX2NvZGUgPSBncnBjX2NodHRwMl9odHRwMl9lcnJvcl90b19ncnBjX3N0YXR1cygKKyAgICAgICAgICAgIChncnBjX2NodHRwMl9lcnJvcl9jb2RlKXN0cmVhbV9wYXJzaW5nLT5yc3Rfc3RyZWFtX3JlYXNvbik7CisgICAgICAgIGNoYXIgKnN0YXR1c19kZXRhaWxzOworICAgICAgICBncHJfc2xpY2Ugc2xpY2VfZGV0YWlsczsKKyAgICAgICAgZ3ByX2FzcHJpbnRmKCZzdGF0dXNfZGV0YWlscywgIlJlY2VpdmVkIFJTVF9TVFJFQU0gZXJyPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wYXJzaW5nLT5yc3Rfc3RyZWFtX3JlYXNvbik7CisgICAgICAgIHNsaWNlX2RldGFpbHMgPSBncHJfc2xpY2VfZnJvbV9jb3BpZWRfc3RyaW5nKHN0YXR1c19kZXRhaWxzKTsKKyAgICAgICAgZ3ByX2ZyZWUoc3RhdHVzX2RldGFpbHMpOworICAgICAgICBncnBjX2NodHRwMl9mYWtlX3N0YXR1cyhleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGUsICZzbGljZV9kZXRhaWxzKTsKKyAgICAgIH0KKyAgICAgIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtX3BhcnNpbmctPnJlY2VpdmVkX2Nsb3NlKSB7CisgICAgICBncnBjX2NodHRwMl9tYXJrX3N0cmVhbV9jbG9zZWQoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgfQorICB9Cit9CisKK2ludCBncnBjX2NodHRwMl9wZXJmb3JtX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIHNsaWNlKSB7CisgIHVpbnQ4X3QgKmJlZyA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOworICB1aW50OF90ICplbmQgPSBHUFJfU0xJQ0VfRU5EX1BUUihzbGljZSk7CisgIHVpbnQ4X3QgKmN1ciA9IGJlZzsKKworICBpZiAoY3VyID09IGVuZCkgcmV0dXJuIDE7CisKKyAgc3dpdGNoICh0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSkgeworICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8wOgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xOgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yOgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8zOgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF80OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF81OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF82OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF83OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF84OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF85OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMDoKKyAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTE6CisgICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzEyOgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMzoKKyAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTQ6CisgICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzE1OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNjoKKyAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTc6CisgICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzE4OgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xOToKKyAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjA6CisgICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzIxOgorICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMjoKKyAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjM6CisgICAgICB3aGlsZSAoY3VyICE9IGVuZCAmJiB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSAhPSBHUlBDX0RUU19GSF8wKSB7CisgICAgICAgIGlmICgqY3VyICE9IEdSUENfQ0hUVFAyX0NMSUVOVF9DT05ORUNUX1NUUklOR1t0cmFuc3BvcnRfcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmcmFtZV9zdGF0ZV0pIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9JTkZPLAorICAgICAgICAgICAgICAgICAgIkNvbm5lY3Qgc3RyaW5nIG1pc21hdGNoOiBleHBlY3RlZCAnJWMnICglZCkgZ290ICclYycgKCVkKSAiCisgICAgICAgICAgICAgICAgICAiYXQgYnl0ZSAlZCIsCisgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9DTElFTlRfQ09OTkVDVF9TVFJJTkdbdHJhbnNwb3J0X3BhcnNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5kZWZyYW1lX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgIChpbnQpKHVpbnQ4X3QpR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICpjdXIsIChpbnQpKmN1ciwgdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGUpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgICsrY3VyOworICAgICAgICArK3RyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlOworICAgICAgfQorICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBkdHNfZmhfMDoKKyAgICBjYXNlIEdSUENfRFRTX0ZIXzA6CisgICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSA9ICgodWludDMyX3QpKmN1cikgPDwgMTY7CisgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfRFRTX0ZIXzE6CisgICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDg7CisgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfMjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfRFRTX0ZIXzI6CisgICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSB8PSAqY3VyOworICAgICAgaWYgKCsrY3VyID09IGVuZCkgeworICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZIXzM7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHUlBDX0RUU19GSF8zOgorICAgICAgR1BSX0FTU0VSVChjdXIgPCBlbmQpOworICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3R5cGUgPSAqY3VyOworICAgICAgaWYgKCsrY3VyID09IGVuZCkgeworICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZIXzQ7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHUlBDX0RUU19GSF80OgorICAgICAgR1BSX0FTU0VSVChjdXIgPCBlbmQpOworICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX2ZsYWdzID0gKmN1cjsKKyAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKKyAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGUgPSBHUlBDX0RUU19GSF81OworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgR1JQQ19EVFNfRkhfNToKKyAgICAgIEdQUl9BU1NFUlQoY3VyIDwgZW5kKTsKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgPSAoKCh1aW50MzJfdCkqY3VyKSAmIDB4N2YpIDw8IDI0OworICAgICAgaWYgKCsrY3VyID09IGVuZCkgeworICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZIXzY7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHUlBDX0RUU19GSF82OgorICAgICAgR1BSX0FTU0VSVChjdXIgPCBlbmQpOworICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDE2OworICAgICAgaWYgKCsrY3VyID09IGVuZCkgeworICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZIXzc7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHUlBDX0RUU19GSF83OgorICAgICAgR1BSX0FTU0VSVChjdXIgPCBlbmQpOworICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDg7CisgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfODsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEdSUENfRFRTX0ZIXzg6CisgICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkIHw9ICgodWludDMyX3QpKmN1cik7CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZSQU1FOworICAgICAgaWYgKCFpbml0X2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpIHsKKyAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmxhc3RfaW5jb21pbmdfc3RyZWFtX2lkID0KKyAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQ7CisgICAgICB9CisgICAgICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUgPT0gMCkgeworICAgICAgICBpZiAoIXBhcnNlX2ZyYW1lX3NsaWNlKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgZ3ByX2VtcHR5X3NsaWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtID0gTlVMTDsKKyAgICAgICAgaWYgKCsrY3VyID09IGVuZCkgeworICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfMDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGR0c19maF8wOyAvKiBsb29wICovCisgICAgICB9CisgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHUlBDX0RUU19GUkFNRToKKyAgICAgIEdQUl9BU1NFUlQoY3VyIDwgZW5kKTsKKyAgICAgIGlmICgodWludDMyX3QpKGVuZCAtIGN1cikgPT0gdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUpIHsKKyAgICAgICAgaWYgKCFwYXJzZV9mcmFtZV9zbGljZShleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX3N1Yl9ub19yZWYoc2xpY2UsIChzaXplX3QpKGN1ciAtIGJlZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkoZW5kIC0gYmVnKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZIXzA7CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KShlbmQgLSBjdXIpID4KKyAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUpIHsKKyAgICAgICAgc2l6ZV90IGN1cl9vZmZzZXQgPSAoc2l6ZV90KShjdXIgLSBiZWcpOworICAgICAgICBpZiAoIXBhcnNlX2ZyYW1lX3NsaWNlKAorICAgICAgICAgICAgICAgIGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgICAgICAgICAgICBncHJfc2xpY2Vfc3ViX25vX3JlZigKKyAgICAgICAgICAgICAgICAgICAgc2xpY2UsIGN1cl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGN1cl9vZmZzZXQgKyB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSksCisgICAgICAgICAgICAgICAgMSkpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBjdXIgKz0gdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemU7CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPSBOVUxMOworICAgICAgICBnb3RvIGR0c19maF8wOyAvKiBsb29wICovCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXBhcnNlX2ZyYW1lX3NsaWNlKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Vfc3ViX25vX3JlZihzbGljZSwgKHNpemVfdCkoY3VyIC0gYmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KShlbmQgLSBiZWcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplIC09ICh1aW50MzJfdCkoZW5kIC0gY3VyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7CisgIH0KKworICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9mcmFtZV9wYXJzZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgeworICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPmV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkICE9IDApIHsKKyAgICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3R5cGUgIT0KKyAgICAgICAgR1JQQ19DSFRUUDJfRlJBTUVfQ09OVElOVUFUSU9OKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkV4cGVjdGVkIENPTlRJTlVBVElPTiBmcmFtZSwgZ290IGZyYW1lIHR5cGUgJTAyeCIsCisgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV90eXBlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPmV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkICE9CisgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgICAiRXhwZWN0ZWQgQ09OVElOVUFUSU9OIGZyYW1lIGZvciBncnBjX2NodHRwMl9zdHJlYW0gJTA4eCwgZ290ICIKKyAgICAgICAgICAgICAgImdycGNfY2h0dHAyX3N0cmVhbSAlMDh4IiwKKyAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkLAorICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gaW5pdF9oZWFkZXJfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMSk7CisgIH0KKyAgc3dpdGNoICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfdHlwZSkgeworICAgIGNhc2UgR1JQQ19DSFRUUDJfRlJBTUVfREFUQToKKyAgICAgIHJldHVybiBpbml0X2RhdGFfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZyk7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9GUkFNRV9IRUFERVI6CisgICAgICByZXR1cm4gaW5pdF9oZWFkZXJfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMCk7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9GUkFNRV9DT05USU5VQVRJT046CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuZXhwZWN0ZWQgQ09OVElOVUFUSU9OIGZyYW1lIik7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0ZSQU1FX1JTVF9TVFJFQU06CisgICAgICByZXR1cm4gaW5pdF9yc3Rfc3RyZWFtX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcpOworICAgIGNhc2UgR1JQQ19DSFRUUDJfRlJBTUVfU0VUVElOR1M6CisgICAgICByZXR1cm4gaW5pdF9zZXR0aW5nc19mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nKTsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0ZSQU1FX1dJTkRPV19VUERBVEU6CisgICAgICByZXR1cm4gaW5pdF93aW5kb3dfdXBkYXRlX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcpOworICAgIGNhc2UgR1JQQ19DSFRUUDJfRlJBTUVfUElORzoKKyAgICAgIHJldHVybiBpbml0X3BpbmdfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZyk7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9GUkFNRV9HT0FXQVk6CisgICAgICByZXR1cm4gaW5pdF9nb2F3YXlfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZyk7CisgICAgZGVmYXVsdDoKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biBmcmFtZSB0eXBlICUwMngiLAorICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfdHlwZSk7CisgICAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDApOworICB9Cit9CisKK3N0YXRpYyBncnBjX2NodHRwMl9wYXJzZV9lcnJvciBza2lwX3BhcnNlcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpIHsKKyAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworfQorCitzdGF0aWMgdm9pZCBza2lwX2hlYWRlcih2b2lkICp0cCwgZ3JwY19tZGVsZW0gKm1kKSB7IEdSUENfTURFTEVNX1VOUkVGKG1kKTsgfQorCitzdGF0aWMgaW50IGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBpbnQgaXNfaGVhZGVyKSB7CisgIGlmIChpc19oZWFkZXIpIHsKKyAgICB1aW50OF90IGlzX2VvaCA9IHRyYW5zcG9ydF9wYXJzaW5nLT5leHBlY3RfY29udGludWF0aW9uX3N0cmVhbV9pZCAhPSAwOworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl9oZWFkZXJfcGFyc2VyX3BhcnNlOworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSA9ICZ0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyOworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIub25faGVhZGVyID0gc2tpcF9oZWFkZXI7CisgICAgdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlci5vbl9oZWFkZXJfdXNlcl9kYXRhID0gTlVMTDsKKyAgICB0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLmlzX2JvdW5kYXJ5ID0gaXNfZW9oOworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIuaXNfZW9mID0KKyAgICAgICAgKHVpbnQ4X3QpKGlzX2VvaCA/IHRyYW5zcG9ydF9wYXJzaW5nLT5oZWFkZXJfZW9mIDogMCk7CisgIH0gZWxzZSB7CisgICAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9IHNraXBfcGFyc2VyOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkIGdycGNfY2h0dHAyX3BhcnNpbmdfYmVjb21lX3NraXBfcGFyc2VyKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpIHsKKyAgaW5pdF9za2lwX2ZyYW1lX3BhcnNlcigKKyAgICAgIGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPT0gZ3JwY19jaHR0cDJfaGVhZGVyX3BhcnNlcl9wYXJzZSk7Cit9CisKK3N0YXRpYyBncnBjX2NodHRwMl9wYXJzZV9lcnJvciB1cGRhdGVfaW5jb21pbmdfd2luZG93KAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nKSB7CisgIHVpbnQzMl90IGluY29taW5nX2ZyYW1lX3NpemUgPSB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZTsKKyAgaWYgKGluY29taW5nX2ZyYW1lX3NpemUgPiB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfd2luZG93KSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJmcmFtZSBvZiBzaXplICVkIG92ZXJmbG93cyBpbmNvbWluZyB3aW5kb3cgb2YgJWQiLAorICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUsCisgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfd2luZG93KTsKKyAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKKyAgfQorCisgIGlmIChpbmNvbWluZ19mcmFtZV9zaXplID4gc3RyZWFtX3BhcnNpbmctPmluY29taW5nX3dpbmRvdykgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZnJhbWUgb2Ygc2l6ZSAlZCBvdmVyZmxvd3MgaW5jb21pbmcgd2luZG93IG9mICVkIiwKKyAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplLAorICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmctPmluY29taW5nX3dpbmRvdyk7CisgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7CisgIH0KKworICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1RSQU5TUE9SVCgicGFyc2UiLCB0cmFuc3BvcnRfcGFyc2luZywgaW5jb21pbmdfd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ19mcmFtZV9zaXplKTsKKyAgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9TVFJFQU0oInBhcnNlIiwgdHJhbnNwb3J0X3BhcnNpbmcsIHN0cmVhbV9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ193aW5kb3csIGluY29taW5nX2ZyYW1lX3NpemUpOworICBzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfYnl0ZXMgKz0gaW5jb21pbmdfZnJhbWVfc2l6ZTsKKworICBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKHRyYW5zcG9ydF9wYXJzaW5nLCBzdHJlYW1fcGFyc2luZyk7CisKKyAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOworfQorCitzdGF0aWMgaW50IGluaXRfZGF0YV9mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgeworICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcgPQorICAgICAgZ3JwY19jaHR0cDJfcGFyc2luZ19sb29rdXBfc3RyZWFtKHRyYW5zcG9ydF9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOworICBncnBjX2NodHRwMl9wYXJzZV9lcnJvciBlcnIgPSBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKKyAgaWYgKCFzdHJlYW1fcGFyc2luZyB8fCBzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfY2xvc2UpCisgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAwKTsKKyAgaWYgKGVyciA9PSBHUlBDX0NIVFRQMl9QQVJTRV9PSykgeworICAgIGVyciA9IHVwZGF0ZV9pbmNvbWluZ193aW5kb3coZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCBzdHJlYW1fcGFyc2luZyk7CisgIH0KKyAgaWYgKGVyciA9PSBHUlBDX0NIVFRQMl9QQVJTRV9PSykgeworICAgIGVyciA9IGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgICAgICAmc3RyZWFtX3BhcnNpbmctPmRhdGFfcGFyc2VyLCB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MpOworICB9CisgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9QQVJTRV9PSzoKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPSBzdHJlYW1fcGFyc2luZzsKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9wYXJzZTsKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSA9ICZzdHJlYW1fcGFyc2luZy0+ZGF0YV9wYXJzZXI7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX1NUUkVBTV9FUlJPUjoKKyAgICAgIHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9jbG9zZSA9IDE7CisgICAgICBzdHJlYW1fcGFyc2luZy0+c2F3X3JzdF9zdHJlYW0gPSAxOworICAgICAgc3RyZWFtX3BhcnNpbmctPnJzdF9zdHJlYW1fcmVhc29uID0gR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1I7CisgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgKKyAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPnFidWYsCisgICAgICAgICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9QUk9UT0NPTF9FUlJPUikpOworICAgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAwKTsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I6CisgICAgICByZXR1cm4gMDsKKyAgfQorICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdGltZW91dCh2b2lkICpwKSB7IGdwcl9mcmVlKHApOyB9CisKK3N0YXRpYyB2b2lkIG9uX2luaXRpYWxfaGVhZGVyKHZvaWQgKnRwLCBncnBjX21kZWxlbSAqbWQpIHsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nID0gdHA7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZyA9CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtOworCisgIEdQUl9USU1FUl9CRUdJTigib25faW5pdGlhbF9oZWFkZXIiLCAwKTsKKworICBHUFJfQVNTRVJUKHN0cmVhbV9wYXJzaW5nKTsKKworICBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKGdwcl9sb2coCisgICAgICBHUFJfSU5GTywgIkhUVFA6JWQ6SERSOiVzOiAlczogJXMiLCBzdHJlYW1fcGFyc2luZy0+aWQsCisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aXNfY2xpZW50ID8gIkNMSSIgOiAiU1ZSIiwKKyAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPmtleSksIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSkpOworCisgIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19TVEFUVVMgJiYgbWQgIT0gR1JQQ19NREVMRU1fR1JQQ19TVEFUVVNfMCkgeworICAgIC8qIFRPRE8oY3RpbGxlcik6IGNoZWNrIGZvciBhIHN0YXR1cyBsaWtlICIgMCIgKi8KKyAgICBzdHJlYW1fcGFyc2luZy0+c2Vlbl9lcnJvciA9IDE7CisgIH0KKworICBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0dSUENfVElNRU9VVCkgeworICAgIGdwcl90aW1lc3BlYyAqY2FjaGVkX3RpbWVvdXQgPSBncnBjX21kZWxlbV9nZXRfdXNlcl9kYXRhKG1kLCBmcmVlX3RpbWVvdXQpOworICAgIGlmICghY2FjaGVkX3RpbWVvdXQpIHsKKyAgICAgIC8qIG5vdCBhbHJlYWR5IHBhcnNlZDogcGFyc2UgaXQgbm93LCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBhd2F5ICovCisgICAgICBjYWNoZWRfdGltZW91dCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdwcl90aW1lc3BlYykpOworICAgICAgaWYgKCFncnBjX2NodHRwMl9kZWNvZGVfdGltZW91dChncnBjX21kc3RyX2FzX2Nfc3RyaW5nKG1kLT52YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZF90aW1lb3V0KSkgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIklnbm9yaW5nIGJhZCB0aW1lb3V0IHZhbHVlICclcyciLAorICAgICAgICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSk7CisgICAgICAgICpjYWNoZWRfdGltZW91dCA9IGdwcl9pbmZfZnV0dXJlKEdQUl9USU1FU1BBTik7CisgICAgICB9CisgICAgICBncnBjX21kZWxlbV9zZXRfdXNlcl9kYXRhKG1kLCBmcmVlX3RpbWVvdXQsIGNhY2hlZF90aW1lb3V0KTsKKyAgICB9CisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3NldF9kZWFkbGluZSgKKyAgICAgICAgJnN0cmVhbV9wYXJzaW5nLT5tZXRhZGF0YV9idWZmZXJbMF0sCisgICAgICAgIGdwcl90aW1lX2FkZChncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpLCAqY2FjaGVkX3RpbWVvdXQpKTsKKyAgICBHUlBDX01ERUxFTV9VTlJFRihtZCk7CisgIH0gZWxzZSB7CisgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2FkZCgKKyAgICAgICAgJnN0cmVhbV9wYXJzaW5nLT5tZXRhZGF0YV9idWZmZXJbMF0sIG1kKTsKKyAgfQorCisgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsIHN0cmVhbV9wYXJzaW5nKTsKKworICBHUFJfVElNRVJfRU5EKCJvbl9pbml0aWFsX2hlYWRlciIsIDApOworfQorCitzdGF0aWMgdm9pZCBvbl90cmFpbGluZ19oZWFkZXIodm9pZCAqdHAsIGdycGNfbWRlbGVtICptZCkgeworICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcgPSB0cDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nID0KKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW07CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJvbl90cmFpbGluZ19oZWFkZXIiLCAwKTsKKworICBHUFJfQVNTRVJUKHN0cmVhbV9wYXJzaW5nKTsKKworICBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKGdwcl9sb2coCisgICAgICBHUFJfSU5GTywgIkhUVFA6JWQ6VFJMOiVzOiAlczogJXMiLCBzdHJlYW1fcGFyc2luZy0+aWQsCisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aXNfY2xpZW50ID8gIkNMSSIgOiAiU1ZSIiwKKyAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPmtleSksIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSkpOworCisgIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19TVEFUVVMgJiYgbWQgIT0gR1JQQ19NREVMRU1fR1JQQ19TVEFUVVNfMCkgeworICAgIC8qIFRPRE8oY3RpbGxlcik6IGNoZWNrIGZvciBhIHN0YXR1cyBsaWtlICIgMCIgKi8KKyAgICBzdHJlYW1fcGFyc2luZy0+c2Vlbl9lcnJvciA9IDE7CisgIH0KKworICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfYWRkKCZzdHJlYW1fcGFyc2luZy0+bWV0YWRhdGFfYnVmZmVyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kKTsKKworICBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKHRyYW5zcG9ydF9wYXJzaW5nLCBzdHJlYW1fcGFyc2luZyk7CisKKyAgR1BSX1RJTUVSX0VORCgib25fdHJhaWxpbmdfaGVhZGVyIiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9oZWFkZXJfZnJhbWVfcGFyc2VyKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgaW50IGlzX2NvbnRpbnVhdGlvbikgeworICB1aW50OF90IGlzX2VvaCA9ICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX0hFQURFUlMpICE9IDA7CisgIGludCB2aWFfYWNjZXB0ID0gMDsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nOworCisgIC8qIFRPRE8oY3RpbGxlcik6IHdoZW4gdG8gaW5jcmVtZW50IGhlYWRlcl9mcmFtZXNfcmVjZWl2ZWQ/ICovCisKKyAgaWYgKGlzX2VvaCkgeworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5leHBlY3RfY29udGludWF0aW9uX3N0cmVhbV9pZCA9IDA7CisgIH0gZWxzZSB7CisgICAgdHJhbnNwb3J0X3BhcnNpbmctPmV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkID0KKyAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZDsKKyAgfQorCisgIGlmICghaXNfY29udGludWF0aW9uKSB7CisgICAgdHJhbnNwb3J0X3BhcnNpbmctPmhlYWRlcl9lb2YgPSAodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX2ZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSkgIT0gMDsKKyAgfQorCisgIC8qIGNvdWxkIGJlIGEgbmV3IGdycGNfY2h0dHAyX3N0cmVhbSBvciBhbiBleGlzdGluZyBncnBjX2NodHRwMl9zdHJlYW0gKi8KKyAgc3RyZWFtX3BhcnNpbmcgPSBncnBjX2NodHRwMl9wYXJzaW5nX2xvb2t1cF9zdHJlYW0oCisgICAgICB0cmFuc3BvcnRfcGFyc2luZywgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCk7CisgIGlmIChzdHJlYW1fcGFyc2luZyA9PSBOVUxMKSB7CisgICAgaWYgKGlzX2NvbnRpbnVhdGlvbikgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAgICJncnBjX2NodHRwMl9zdHJlYW0gZGlzYmFuZGVkIGJlZm9yZSBDT05USU5VQVRJT04gcmVjZWl2ZWQiKTsKKyAgICAgIHJldHVybiBpbml0X3NraXBfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMSk7CisgICAgfQorICAgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+aXNfY2xpZW50KSB7CisgICAgICBpZiAoKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgJiAxKSAmJgorICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgPAorICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+bmV4dF9zdHJlYW1faWQpIHsKKyAgICAgICAgLyogdGhpcyBpcyBhbiBvbGQgKHByb2JhYmx5IGNhbmNlbGxlZCkgZ3JwY19jaHR0cDJfc3RyZWFtICovCisgICAgICB9IGVsc2UgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAiaWdub3JpbmcgbmV3IGdycGNfY2h0dHAyX3N0cmVhbSBjcmVhdGlvbiBvbiBjbGllbnQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbml0X3NraXBfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMSk7CisgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+bGFzdF9pbmNvbWluZ19zdHJlYW1faWQgPgorICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAgICJpZ25vcmluZyBvdXQgb2Ygb3JkZXIgbmV3IGdycGNfY2h0dHAyX3N0cmVhbSByZXF1ZXN0IG9uIHNlcnZlcjsgIgorICAgICAgICAgICAgICAibGFzdCBncnBjX2NodHRwMl9zdHJlYW0gIgorICAgICAgICAgICAgICAiaWQ9JWQsIG5ldyBncnBjX2NodHRwMl9zdHJlYW0gaWQ9JWQiLAorICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+bGFzdF9pbmNvbWluZ19zdHJlYW1faWQsCisgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOworICAgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAxKTsKKyAgICB9IGVsc2UgaWYgKCh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkICYgMSkgPT0gMCkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAgICJpZ25vcmluZyBncnBjX2NodHRwMl9zdHJlYW0gd2l0aCBub24tY2xpZW50IGdlbmVyYXRlZCBpbmRleCAlZCIsCisgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOworICAgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAxKTsKKyAgICB9CisgICAgc3RyZWFtX3BhcnNpbmcgPSB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtID0KKyAgICAgICAgZ3JwY19jaHR0cDJfcGFyc2luZ19hY2NlcHRfc3RyZWFtKAorICAgICAgICAgICAgZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKTsKKyAgICBpZiAoc3RyZWFtX3BhcnNpbmcgPT0gTlVMTCkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJncnBjX2NodHRwMl9zdHJlYW0gbm90IGFjY2VwdGVkIik7CisgICAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDEpOworICAgIH0KKyAgICB2aWFfYWNjZXB0ID0gMTsKKyAgfSBlbHNlIHsKKyAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtID0gc3RyZWFtX3BhcnNpbmc7CisgIH0KKyAgR1BSX0FTU0VSVChzdHJlYW1fcGFyc2luZyAhPSBOVUxMICYmICh2aWFfYWNjZXB0ID09IDAgfHwgdmlhX2FjY2VwdCA9PSAxKSk7CisgIGlmIChzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfY2xvc2UpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgInNraXBwaW5nIGFscmVhZHkgY2xvc2VkIGdycGNfY2h0dHAyX3N0cmVhbSBoZWFkZXIiKTsKKyAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtID0gTlVMTDsKKyAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDEpOworICB9CisgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl9oZWFkZXJfcGFyc2VyX3BhcnNlOworICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyX2RhdGEgPSAmdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlcjsKKyAgc3dpdGNoIChzdHJlYW1fcGFyc2luZy0+aGVhZGVyX2ZyYW1lc19yZWNlaXZlZCkgeworICAgIGNhc2UgMDoKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIub25faGVhZGVyID0gb25faW5pdGlhbF9oZWFkZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLm9uX2hlYWRlciA9IG9uX3RyYWlsaW5nX2hlYWRlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAidG9vIG1hbnkgaGVhZGVyIGZyYW1lcyByZWNlaXZlZCIpOworICAgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAxKTsKKyAgfQorICB0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLm9uX2hlYWRlcl91c2VyX2RhdGEgPSB0cmFuc3BvcnRfcGFyc2luZzsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlci5pc19ib3VuZGFyeSA9IGlzX2VvaDsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlci5pc19lb2YgPQorICAgICAgKHVpbnQ4X3QpKGlzX2VvaCA/IHRyYW5zcG9ydF9wYXJzaW5nLT5oZWFkZXJfZW9mIDogMCk7CisgIGlmICghaXNfY29udGludWF0aW9uICYmICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfRkxBR19IQVNfUFJJT1JJVFkpKSB7CisgICAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3NldF9oYXNfcHJpb3JpdHkoJnRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGluaXRfd2luZG93X3VwZGF0ZV9mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgeworICBpbnQgb2sgPSBHUlBDX0NIVFRQMl9QQVJTRV9PSyA9PSBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlcl9iZWdpbl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnRfcGFyc2luZy0+c2ltcGxlLndpbmRvd191cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncyk7CisgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKSB7CisgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbSA9IGdycGNfY2h0dHAyX3BhcnNpbmdfbG9va3VwX3N0cmVhbSgKKyAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmcsIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOworICB9CisgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlcl9wYXJzZTsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcl9kYXRhID0gJnRyYW5zcG9ydF9wYXJzaW5nLT5zaW1wbGUud2luZG93X3VwZGF0ZTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IGluaXRfcGluZ19wYXJzZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7CisgIGludCBvayA9IEdSUENfQ0hUVFAyX1BBUlNFX09LID09IGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9ydF9wYXJzaW5nLT5zaW1wbGUucGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX2ZsYWdzKTsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9IGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyX3BhcnNlOworICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyX2RhdGEgPSAmdHJhbnNwb3J0X3BhcnNpbmctPnNpbXBsZS5waW5nOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9yc3Rfc3RyZWFtX3BhcnNlcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7CisgIGludCBvayA9IEdSUENfQ0hUVFAyX1BBUlNFX09LID09IGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9ydF9wYXJzaW5nLT5zaW1wbGUucnN0X3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX2ZsYWdzKTsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbSA9IGdycGNfY2h0dHAyX3BhcnNpbmdfbG9va3VwX3N0cmVhbSgKKyAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLCB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKTsKKyAgaWYgKCF0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtKSB7CisgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAwKTsKKyAgfQorICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyID0gZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXJfcGFyc2U7CisgIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSA9ICZ0cmFuc3BvcnRfcGFyc2luZy0+c2ltcGxlLnJzdF9zdHJlYW07CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBpbml0X2dvYXdheV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgeworICBpbnQgb2sgPSBHUlBDX0NIVFRQMl9QQVJTRV9PSyA9PSBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MpOworICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyID0gZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlcl9wYXJzZTsKKyAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcl9kYXRhID0gJnRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfcGFyc2VyOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zZXR0aW5nc19mcmFtZV9wYXJzZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgeworICBpbnQgb2s7CisKKyAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgIT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAic2V0dGluZ3MgZnJhbWUgcmVjZWl2ZWQgZm9yIGdycGNfY2h0dHAyX3N0cmVhbSAlZCIsCisgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG9rID0gR1JQQ19DSFRUUDJfUEFSU0VfT0sgPT0gZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyX2JlZ2luX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPnNpbXBsZS5zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzKTsKKyAgaWYgKCFvaykgeworICAgIHJldHVybiAwOworICB9CisgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MgJiBHUlBDX0NIVFRQMl9GTEFHX0FDSykgeworICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5zZXR0aW5nc19hY2tfcmVjZWl2ZWQgPSAxOworICAgIGdycGNfY2h0dHAyX2hwdGJsX3NldF9tYXhfYnl0ZXMoCisgICAgICAgICZ0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLnRhYmxlLAorICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+bGFzdF9zZW50X21heF90YWJsZV9zaXplKTsKKyAgfQorICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyID0gZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyX3BhcnNlOworICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyX2RhdGEgPSAmdHJhbnNwb3J0X3BhcnNpbmctPnNpbXBsZS5zZXR0aW5nczsKKyAgcmV0dXJuIG9rOworfQorCisvKgorc3RhdGljIGludCBpc193aW5kb3dfdXBkYXRlX2xlZ2FsKGludDY0X3Qgd2luZG93X3VwZGF0ZSwgaW50NjRfdCB3aW5kb3cpIHsKKyAgcmV0dXJuIHdpbmRvdyArIHdpbmRvd191cGRhdGUgPCBNQVhfV0lORE9XOworfQorKi8KKworc3RhdGljIGludCBwYXJzZV9mcmFtZV9zbGljZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZyA9CisgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtOworICBzd2l0Y2ggKHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLCBzdHJlYW1fcGFyc2luZywgc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19sYXN0KSkgeworICAgIGNhc2UgR1JQQ19DSFRUUDJfUEFSU0VfT0s6CisgICAgICBpZiAoc3RyZWFtX3BhcnNpbmcpIHsKKyAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfcGFyc2luZ19zZWVuX3N0cmVhbSh0cmFuc3BvcnRfcGFyc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fcGFyc2luZyk7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX1NUUkVBTV9FUlJPUjoKKyAgICAgIGdycGNfY2h0dHAyX3BhcnNpbmdfYmVjb21lX3NraXBfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZyk7CisgICAgICBpZiAoc3RyZWFtX3BhcnNpbmcpIHsKKyAgICAgICAgc3RyZWFtX3BhcnNpbmctPnNhd19yc3Rfc3RyZWFtID0gMTsKKyAgICAgICAgc3RyZWFtX3BhcnNpbmctPnJzdF9zdHJlYW1fcmVhc29uID0gR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1I7CisgICAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAorICAgICAgICAgICAgJnRyYW5zcG9ydF9wYXJzaW5nLT5xYnVmLAorICAgICAgICAgICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SKSk7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I6CisgICAgICByZXR1cm4gMDsKKyAgfQorICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzk1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIgorCitpbnQgZ3JwY19jaHR0cDJfZ3JwY19zdGF0dXNfdG9faHR0cDJfZXJyb3IoZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpIHsKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIEdSUENfU1RBVFVTX09LOgorICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX05PX0VSUk9SOworICAgIGNhc2UgR1JQQ19TVEFUVVNfQ0FOQ0VMTEVEOgorICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NBTkNFTDsKKyAgICBjYXNlIEdSUENfU1RBVFVTX1JFU09VUkNFX0VYSEFVU1RFRDoKKyAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9FTkhBTkNFX1lPVVJfQ0FMTTsKKyAgICBjYXNlIEdSUENfU1RBVFVTX1BFUk1JU1NJT05fREVOSUVEOgorICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0lOQURFUVVBVEVfU0VDVVJJVFk7CisgICAgY2FzZSBHUlBDX1NUQVRVU19VTkFWQUlMQUJMRToKKyAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9SRUZVU0VEX1NUUkVBTTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0lOVEVSTkFMX0VSUk9SOworICB9Cit9CisKK2dycGNfc3RhdHVzX2NvZGUgZ3JwY19jaHR0cDJfaHR0cDJfZXJyb3JfdG9fZ3JwY19zdGF0dXMoCisgICAgZ3JwY19jaHR0cDJfZXJyb3JfY29kZSBlcnJvcikgeworICBzd2l0Y2ggKGVycm9yKSB7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9OT19FUlJPUjoKKyAgICAgIC8qIHNob3VsZCBuZXZlciBiZSByZWNlaXZlZCAqLworICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0lOVEVSTkFMOworICAgIGNhc2UgR1JQQ19DSFRUUDJfQ0FOQ0VMOgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0NBTkNFTExFRDsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0VOSEFOQ0VfWU9VUl9DQUxNOgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1JFU09VUkNFX0VYSEFVU1RFRDsKKyAgICBjYXNlIEdSUENfQ0hUVFAyX0lOQURFUVVBVEVfU0VDVVJJVFk6CisgICAgICByZXR1cm4gR1JQQ19TVEFUVVNfUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgY2FzZSBHUlBDX0NIVFRQMl9SRUZVU0VEX1NUUkVBTToKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19VTkFWQUlMQUJMRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0lOVEVSTkFMOworICB9Cit9CisKK2dycGNfc3RhdHVzX2NvZGUgZ3JwY19jaHR0cDJfaHR0cDJfc3RhdHVzX3RvX2dycGNfc3RhdHVzKGludCBzdGF0dXMpIHsKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAvKiB0aGVzZSBIVFRQMiBzdGF0dXMgY29kZXMgYXJlIGNhbGxlZCBvdXQgZXhwbGljaXRseSBpbiBzdGF0dXMucHJvdG8gKi8KKyAgICBjYXNlIDIwMDoKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19PSzsKKyAgICBjYXNlIDQwMDoKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19JTlZBTElEX0FSR1VNRU5UOworICAgIGNhc2UgNDAxOgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1VOQVVUSEVOVElDQVRFRDsKKyAgICBjYXNlIDQwMzoKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19QRVJNSVNTSU9OX0RFTklFRDsKKyAgICBjYXNlIDQwNDoKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19OT1RfRk9VTkQ7CisgICAgY2FzZSA0MDk6CisgICAgICByZXR1cm4gR1JQQ19TVEFUVVNfQUJPUlRFRDsKKyAgICBjYXNlIDQxMjoKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19GQUlMRURfUFJFQ09ORElUSU9OOworICAgIGNhc2UgNDI5OgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1JFU09VUkNFX0VYSEFVU1RFRDsKKyAgICBjYXNlIDQ5OToKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19DQU5DRUxMRUQ7CisgICAgY2FzZSA1MDA6CisgICAgICByZXR1cm4gR1JQQ19TVEFUVVNfVU5LTk9XTjsKKyAgICBjYXNlIDUwMToKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19VTklNUExFTUVOVEVEOworICAgIGNhc2UgNTAzOgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1VOQVZBSUxBQkxFOworICAgIGNhc2UgNTA0OgorICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0RFQURMSU5FX0VYQ0VFREVEOworICAgIC8qIGV2ZXJ5dGhpbmcgZWxzZSBpcyB1bmtub3duICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBHUlBDX1NUQVRVU19VTktOT1dOOworICB9Cit9CisKK2ludCBncnBjX2NodHRwMl9ncnBjX3N0YXR1c190b19odHRwMl9zdGF0dXMoZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpIHsKKyAgcmV0dXJuIDIwMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyYTVmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9TVEFUVVNfQ09OVkVSU0lPTl9ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfU1RBVFVTX0NPTlZFUlNJT05fSAorCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h0dHAyX2Vycm9ycy5oIgorCisvKiBDb252ZXJzaW9uIG9mIGdycGMgc3RhdHVzIGNvZGVzIHRvIGh0dHAyIGVycm9yIGNvZGVzIChmb3IgUlNUX1NUUkVBTSkgKi8KK2dycGNfY2h0dHAyX2Vycm9yX2NvZGUgZ3JwY19jaHR0cDJfZ3JwY19zdGF0dXNfdG9faHR0cDJfZXJyb3IoCisgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpOworZ3JwY19zdGF0dXNfY29kZSBncnBjX2NodHRwMl9odHRwMl9lcnJvcl90b19ncnBjX3N0YXR1cygKKyAgICBncnBjX2NodHRwMl9lcnJvcl9jb2RlIGVycm9yKTsKKworLyogQ29udmVyc2lvbiBvZiBIVFRQIHN0YXR1cyBjb2RlcyAoOnN0YXR1cykgdG8gZ3JwYyBzdGF0dXMgY29kZXMgKi8KK2dycGNfc3RhdHVzX2NvZGUgZ3JwY19jaHR0cDJfaHR0cDJfc3RhdHVzX3RvX2dycGNfc3RhdHVzKGludCBzdGF0dXMpOworaW50IGdycGNfY2h0dHAyX2dycGNfc3RhdHVzX3RvX2h0dHAyX3N0YXR1cyhncnBjX3N0YXR1c19jb2RlIHN0YXR1cyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX1NUQVRVU19DT05WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbGlzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWVkNDliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9saXN0cy5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKKyNkZWZpbmUgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0Zyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpKSkKKworI2RlZmluZSBTVFJFQU1fRlJPTV9HTE9CQUwoc2cpIFwKKyAgKChncnBjX2NodHRwMl9zdHJlYW0gKikoKGNoYXIgKikoc2cpLW9mZnNldG9mKGdycGNfY2h0dHAyX3N0cmVhbSwgZ2xvYmFsKSkpCisKKyNkZWZpbmUgVFJBTlNQT1JUX0ZST01fV1JJVElORyh0dykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0dyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nKSkpCisKKyNkZWZpbmUgU1RSRUFNX0ZST01fV1JJVElORyhzdykgXAorICAoKGdycGNfY2h0dHAyX3N0cmVhbSAqKSgoY2hhciAqKShzdyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfc3RyZWFtLCB3cml0aW5nKSkpCisKKyNkZWZpbmUgVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0cCktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nKSkpCisKKyNkZWZpbmUgU1RSRUFNX0ZST01fUEFSU0lORyhzcCkgXAorICAoKGdycGNfY2h0dHAyX3N0cmVhbSAqKSgoY2hhciAqKShzcCktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfc3RyZWFtLCBwYXJzaW5nKSkpCisKKy8qIGNvcmUgbGlzdCBtYW5hZ2VtZW50ICovCisKK3N0YXRpYyBpbnQgc3RyZWFtX2xpc3RfZW1wdHkoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZCBpZCkgeworICByZXR1cm4gdC0+bGlzdHNbaWRdLmhlYWQgPT0gTlVMTDsKK30KKworc3RhdGljIGludCBzdHJlYW1fbGlzdF9wb3AoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICoqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2xpc3RfaWQgaWQpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzID0gdC0+bGlzdHNbaWRdLmhlYWQ7CisgIGlmIChzKSB7CisgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpuZXdfaGVhZCA9IHMtPmxpbmtzW2lkXS5uZXh0OworICAgIEdQUl9BU1NFUlQocy0+aW5jbHVkZWRbaWRdKTsKKyAgICBpZiAobmV3X2hlYWQpIHsKKyAgICAgIHQtPmxpc3RzW2lkXS5oZWFkID0gbmV3X2hlYWQ7CisgICAgICBuZXdfaGVhZC0+bGlua3NbaWRdLnByZXYgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICB0LT5saXN0c1tpZF0uaGVhZCA9IE5VTEw7CisgICAgICB0LT5saXN0c1tpZF0udGFpbCA9IE5VTEw7CisgICAgfQorICAgIHMtPmluY2x1ZGVkW2lkXSA9IDA7CisgIH0KKyAgKnN0cmVhbSA9IHM7CisgIHJldHVybiBzICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9saXN0X3JlbW92ZShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsIGdycGNfY2h0dHAyX3N0cmVhbSAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZCBpZCkgeworICBHUFJfQVNTRVJUKHMtPmluY2x1ZGVkW2lkXSk7CisgIHMtPmluY2x1ZGVkW2lkXSA9IDA7CisgIGlmIChzLT5saW5rc1tpZF0ucHJldikgeworICAgIHMtPmxpbmtzW2lkXS5wcmV2LT5saW5rc1tpZF0ubmV4dCA9IHMtPmxpbmtzW2lkXS5uZXh0OworICB9IGVsc2UgeworICAgIEdQUl9BU1NFUlQodC0+bGlzdHNbaWRdLmhlYWQgPT0gcyk7CisgICAgdC0+bGlzdHNbaWRdLmhlYWQgPSBzLT5saW5rc1tpZF0ubmV4dDsKKyAgfQorICBpZiAocy0+bGlua3NbaWRdLm5leHQpIHsKKyAgICBzLT5saW5rc1tpZF0ubmV4dC0+bGlua3NbaWRdLnByZXYgPSBzLT5saW5rc1tpZF0ucHJldjsKKyAgfSBlbHNlIHsKKyAgICB0LT5saXN0c1tpZF0udGFpbCA9IHMtPmxpbmtzW2lkXS5wcmV2OworICB9Cit9CisKK3N0YXRpYyBib29sIHN0cmVhbV9saXN0X21heWJlX3JlbW92ZShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9saXN0X2lkIGlkKSB7CisgIGlmIChzLT5pbmNsdWRlZFtpZF0pIHsKKyAgICBzdHJlYW1fbGlzdF9yZW1vdmUodCwgcywgaWQpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fbGlzdF9hZGRfdGFpbChncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW0gKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZCBpZCkgeworICBncnBjX2NodHRwMl9zdHJlYW0gKm9sZF90YWlsOworICBHUFJfQVNTRVJUKCFzLT5pbmNsdWRlZFtpZF0pOworICBvbGRfdGFpbCA9IHQtPmxpc3RzW2lkXS50YWlsOworICBzLT5saW5rc1tpZF0ubmV4dCA9IE5VTEw7CisgIHMtPmxpbmtzW2lkXS5wcmV2ID0gb2xkX3RhaWw7CisgIGlmIChvbGRfdGFpbCkgeworICAgIG9sZF90YWlsLT5saW5rc1tpZF0ubmV4dCA9IHM7CisgIH0gZWxzZSB7CisgICAgdC0+bGlzdHNbaWRdLmhlYWQgPSBzOworICB9CisgIHQtPmxpc3RzW2lkXS50YWlsID0gczsKKyAgcy0+aW5jbHVkZWRbaWRdID0gMTsKK30KKworc3RhdGljIGJvb2wgc3RyZWFtX2xpc3RfYWRkKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwgZ3JwY19jaHR0cDJfc3RyZWFtICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9saXN0X2lkIGlkKSB7CisgIGlmIChzLT5pbmNsdWRlZFtpZF0pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RyZWFtX2xpc3RfYWRkX3RhaWwodCwgcywgaWQpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogd3JhcHBlcnMgZm9yIHNwZWNpYWxpemF0aW9ucyAqLworCitib29sIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRhYmxlX3N0cmVhbSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKKyAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5pZCAhPSAwKTsKKyAgcmV0dXJuIHN0cmVhbV9saXN0X2FkZChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVEFCTEUpOworfQorCitpbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdGFibGVfc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICoqc3RyZWFtX3dyaXRpbmcpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07CisgIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUQUJMRSk7CisgIGlmIChyICE9IDApIHsKKyAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKKyAgICAqc3RyZWFtX3dyaXRpbmcgPSAmc3RyZWFtLT53cml0aW5nOworICB9CisgIHJldHVybiByOworfQorCitib29sIGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3dyaXRhYmxlX3N0cmVhbSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKKyAgcmV0dXJuIHN0cmVhbV9saXN0X21heWJlX3JlbW92ZShUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVEFCTEUpOworfQorCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpIHsKKyAgR1BSX0FTU0VSVChzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTV9GUk9NX1dSSVRJTkcoc3RyZWFtX3dyaXRpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1dSSVRJTkcpKTsKK30KKworaW50IGdycGNfY2h0dHAyX2xpc3RfaGF2ZV93cml0aW5nX3N0cmVhbXMoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nKSB7CisgIHJldHVybiAhc3RyZWFtX2xpc3RfZW1wdHkoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUSU5HKTsKK30KKworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3dyaXRpbmdfc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqKnN0cmVhbV93cml0aW5nKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOworICBpbnQgciA9IHN0cmVhbV9saXN0X3BvcChUUkFOU1BPUlRfRlJPTV9XUklUSU5HKHRyYW5zcG9ydF93cml0aW5nKSwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUSU5HKTsKKyAgaWYgKHIgIT0gMCkgeworICAgICpzdHJlYW1fd3JpdGluZyA9ICZzdHJlYW0tPndyaXRpbmc7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdHRlbl9zdHJlYW0oCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZykgeworICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCisgICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9XUklUSU5HKHN0cmVhbV93cml0aW5nKSwKKyAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVFRFTik7Cit9CisKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF93cml0dGVuX3N0cmVhbSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqKnN0cmVhbV93cml0aW5nKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOworICBpbnQgciA9IHN0cmVhbV9saXN0X3BvcChUUkFOU1BPUlRfRlJPTV9XUklUSU5HKHRyYW5zcG9ydF93cml0aW5nKSwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUVEVOKTsKKyAgaWYgKHIgIT0gMCkgeworICAgICpzdHJlYW1fZ2xvYmFsID0gJnN0cmVhbS0+Z2xvYmFsOworICAgICpzdHJlYW1fd3JpdGluZyA9ICZzdHJlYW0tPndyaXRpbmc7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKKyAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5pZCAhPSAwKTsKKyAgc3RyZWFtX2xpc3RfYWRkKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwKKyAgICAgICAgICAgICAgICAgIFNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKSwKKyAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfVU5BTk5PVU5DRURfSU5DT01JTkdfV0lORE9XX0FWQUlMQUJMRSk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9yZW1vdmVfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKKyAgc3RyZWFtX2xpc3RfbWF5YmVfcmVtb3ZlKAorICAgICAgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLAorICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAorICAgICAgR1JQQ19DSFRUUDJfTElTVF9VTkFOTk9VTkNFRF9JTkNPTUlOR19XSU5ET1dfQVZBSUxBQkxFKTsKK30KKworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3VuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19hdmFpbGFibGUoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKipzdHJlYW1fcGFyc2luZykgeworICBncnBjX2NodHRwMl9zdHJlYW0gKnN0cmVhbTsKKyAgaW50IHIgPQorICAgICAgc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1VOQU5OT1VOQ0VEX0lOQ09NSU5HX1dJTkRPV19BVkFJTEFCTEUpOworICBpZiAociAhPSAwKSB7CisgICAgKnN0cmVhbV9nbG9iYWwgPSAmc3RyZWFtLT5nbG9iYWw7CisgICAgKnN0cmVhbV9wYXJzaW5nID0gJnN0cmVhbS0+cGFyc2luZzsKKyAgfQorICByZXR1cm4gcjsKK30KKwordm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcpIHsKKyAgc3RyZWFtX2xpc3RfYWRkKFRSQU5TUE9SVF9GUk9NX1BBUlNJTkcodHJhbnNwb3J0X3BhcnNpbmcpLAorICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fUEFSU0lORyhzdHJlYW1fcGFyc2luZyksCisgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1BBUlNJTkdfU0VFTik7Cit9CisKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF9wYXJzaW5nX3NlZW5fc3RyZWFtKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICoqc3RyZWFtX3BhcnNpbmcpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07CisgIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX1BBUlNJTkcodHJhbnNwb3J0X3BhcnNpbmcpLCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1BBUlNJTkdfU0VFTik7CisgIGlmIChyICE9IDApIHsKKyAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKKyAgICAqc3RyZWFtX3BhcnNpbmcgPSAmc3RyZWFtLT5wYXJzaW5nOworICB9CisgIHJldHVybiByOworfQorCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dhaXRpbmdfZm9yX2NvbmN1cnJlbmN5KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgeworICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLAorICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAorICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XQUlUSU5HX0ZPUl9DT05DVVJSRU5DWSk7Cit9CisKK2ludCBncnBjX2NodHRwMl9saXN0X3BvcF93YWl0aW5nX2Zvcl9jb25jdXJyZW5jeSgKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOworICBpbnQgciA9IHN0cmVhbV9saXN0X3BvcChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV0FJVElOR19GT1JfQ09OQ1VSUkVOQ1kpOworICBpZiAociAhPSAwKSB7CisgICAgKnN0cmVhbV9nbG9iYWwgPSAmc3RyZWFtLT5nbG9iYWw7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHMoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSB7CisgIHN0cmVhbV9saXN0X2FkZChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCisgICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9HTE9CQUwoc3RyZWFtX2dsb2JhbCksCisgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX0NIRUNLX1JFQURfT1BTKTsKK30KKworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX2NoZWNrX3JlYWRfb3BzKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07CisgIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9DSEVDS19SRUFEX09QUyk7CisgIGlmIChyICE9IDApIHsKKyAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKKyAgfQorICByZXR1cm4gcjsKK30KKwordm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW0gPSBTVFJFQU1fRlJPTV9XUklUSU5HKHN0cmVhbV93cml0aW5nKTsKKyAgaWYgKCFzdHJlYW0tPmluY2x1ZGVkW0dSUENfQ0hUVFAyX0xJU1RfV1JJVElOR19TVEFMTEVEX0JZX1RSQU5TUE9SVF0pIHsKKyAgICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKCZzdHJlYW0tPmdsb2JhbCwgImNodHRwMl93cml0aW5nX3N0YWxsZWQiKTsKKyAgfQorICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVElOR19TVEFMTEVEX0JZX1RSQU5TUE9SVCk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9mbHVzaF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCisgICAgYm9vbCBpc193aW5kb3dfYXZhaWxhYmxlKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOworICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRSQU5TUE9SVF9GUk9NX1dSSVRJTkcodHJhbnNwb3J0X3dyaXRpbmcpOworICB3aGlsZSAoc3RyZWFtX2xpc3RfcG9wKHRyYW5zcG9ydCwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1dSSVRJTkdfU1RBTExFRF9CWV9UUkFOU1BPUlQpKSB7CisgICAgaWYgKGlzX3dpbmRvd19hdmFpbGFibGUpIHsKKyAgICAgIGdycGNfY2h0dHAyX2JlY29tZV93cml0YWJsZSgmdHJhbnNwb3J0LT5nbG9iYWwsICZzdHJlYW0tPmdsb2JhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3N0YWxsZWRfYnlfdHJhbnNwb3J0KHRyYW5zcG9ydF93cml0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+d3JpdGluZyk7CisgICAgfQorICAgIEdSUENfQ0hUVFAyX1NUUkVBTV9VTlJFRihleGVjX2N0eCwgJnN0cmVhbS0+Z2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2h0dHAyX3dyaXRpbmdfc3RhbGxlZCIpOworICB9Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfc3RhbGxlZF9ieV90cmFuc3BvcnQoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZykgeworICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCisgICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9XUklUSU5HKHN0cmVhbV93cml0aW5nKSwKKyAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfU1RBTExFRF9CWV9UUkFOU1BPUlQpOworfQorCitpbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfc3RhbGxlZF9ieV90cmFuc3BvcnQoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCkgeworICBncnBjX2NodHRwMl9zdHJlYW0gKnN0cmVhbTsKKyAgaW50IHIgPSBzdHJlYW1fbGlzdF9wb3AoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1NUQUxMRURfQllfVFJBTlNQT1JUKTsKKyAgaWYgKHIgIT0gMCkgeworICAgICpzdHJlYW1fZ2xvYmFsID0gJnN0cmVhbS0+Z2xvYmFsOworICB9CisgIHJldHVybiByOworfQorCit2b2lkIGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgeworICBzdHJlYW1fbGlzdF9tYXliZV9yZW1vdmUoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9TVEFMTEVEX0JZX1RSQU5TUE9SVCk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSB7CisgIHN0cmVhbV9saXN0X2FkZChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCisgICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9HTE9CQUwoc3RyZWFtX2dsb2JhbCksCisgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX0NMT1NFRF9XQUlUSU5HX0ZPUl9QQVJTSU5HKTsKK30KKworaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX2Nsb3NlZF93YWl0aW5nX2Zvcl9wYXJzaW5nKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07CisgIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9DTE9TRURfV0FJVElOR19GT1JfUEFSU0lORyk7CisgIGlmIChyICE9IDApIHsKKyAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKKyAgfQorICByZXR1cm4gcjsKK30KKwordm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF9jbG9zZWRfd2FpdGluZ19mb3Jfd3JpdGluZygKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAorICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKKyAgc3RyZWFtX2xpc3RfYWRkKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwKKyAgICAgICAgICAgICAgICAgIFNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKSwKKyAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfQ0xPU0VEX1dBSVRJTkdfRk9SX1dSSVRJTkcpOworfQorCitpbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3BfY2xvc2VkX3dhaXRpbmdfZm9yX3dyaXRpbmcoCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCkgeworICBncnBjX2NodHRwMl9zdHJlYW0gKnN0cmVhbTsKKyAgaW50IHIgPSBzdHJlYW1fbGlzdF9wb3AoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX0NMT1NFRF9XQUlUSU5HX0ZPUl9XUklUSU5HKTsKKyAgaWYgKHIgIT0gMCkgeworICAgICpzdHJlYW1fZ2xvYmFsID0gJnN0cmVhbS0+Z2xvYmFsOworICB9CisgIHJldHVybiByOworfQorCit2b2lkIGdycGNfY2h0dHAyX3JlZ2lzdGVyX3N0cmVhbShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW0gKnMpIHsKKyAgc3RyZWFtX2xpc3RfYWRkX3RhaWwodCwgcywgR1JQQ19DSFRUUDJfTElTVF9BTExfU1RSRUFNUyk7Cit9CisKK2ludCBncnBjX2NodHRwMl91bnJlZ2lzdGVyX3N0cmVhbShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpzKSB7CisgIHN0cmVhbV9saXN0X21heWJlX3JlbW92ZSh0LCBzLCBHUlBDX0NIVFRQMl9MSVNUX0FMTF9TVFJFQU1TKTsKKyAgcmV0dXJuIHN0cmVhbV9saXN0X2VtcHR5KHQsIEdSUENfQ0hUVFAyX0xJU1RfQUxMX1NUUkVBTVMpOworfQorCitpbnQgZ3JwY19jaHR0cDJfaGFzX3N0cmVhbXMoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7CisgIHJldHVybiAhc3RyZWFtX2xpc3RfZW1wdHkodCwgR1JQQ19DSFRUUDJfTElTVF9BTExfU1RSRUFNUyk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfZm9yX2FsbF9zdHJlYW1zKAorICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICB2b2lkICgqY2IpKGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbSAqczsKKyAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpOworICBmb3IgKHMgPSB0LT5saXN0c1tHUlBDX0NIVFRQMl9MSVNUX0FMTF9TVFJFQU1TXS5oZWFkOyBzICE9IE5VTEw7CisgICAgICAgcyA9IHMtPmxpbmtzW0dSUENfQ0hUVFAyX0xJU1RfQUxMX1NUUkVBTVNdLm5leHQpIHsKKyAgICBjYih0cmFuc3BvcnRfZ2xvYmFsLCB1c2VyX2RhdGEsICZzLT5nbG9iYWwpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIxMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKK3ZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9pbml0KGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0aWFsX2NhcGFjaXR5KSB7CisgIEdQUl9BU1NFUlQoaW5pdGlhbF9jYXBhY2l0eSA+IDEpOworICBtYXAtPmtleXMgPSBncHJfbWFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBpbml0aWFsX2NhcGFjaXR5KTsKKyAgbWFwLT52YWx1ZXMgPSBncHJfbWFsbG9jKHNpemVvZih2b2lkICopICogaW5pdGlhbF9jYXBhY2l0eSk7CisgIG1hcC0+Y291bnQgPSAwOworICBtYXAtPmZyZWUgPSAwOworICBtYXAtPmNhcGFjaXR5ID0gaW5pdGlhbF9jYXBhY2l0eTsKK30KKwordm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2Rlc3Ryb3koZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwKSB7CisgIGdwcl9mcmVlKG1hcC0+a2V5cyk7CisgIGdwcl9mcmVlKG1hcC0+dmFsdWVzKTsKK30KKworc3RhdGljIHNpemVfdCBjb21wYWN0KHVpbnQzMl90ICprZXlzLCB2b2lkICoqdmFsdWVzLCBzaXplX3QgY291bnQpIHsKKyAgc2l6ZV90IGksIG91dDsKKworICBmb3IgKGkgPSAwLCBvdXQgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICh2YWx1ZXNbaV0pIHsKKyAgICAgIGtleXNbb3V0XSA9IGtleXNbaV07CisgICAgICB2YWx1ZXNbb3V0XSA9IHZhbHVlc1tpXTsKKyAgICAgIG91dCsrOworICAgIH0KKyAgfQorCisgIHJldHVybiBvdXQ7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9hZGQoZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwLCB1aW50MzJfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKSB7CisgIHNpemVfdCBjb3VudCA9IG1hcC0+Y291bnQ7CisgIHNpemVfdCBjYXBhY2l0eSA9IG1hcC0+Y2FwYWNpdHk7CisgIHVpbnQzMl90ICprZXlzID0gbWFwLT5rZXlzOworICB2b2lkICoqdmFsdWVzID0gbWFwLT52YWx1ZXM7CisKKyAgR1BSX0FTU0VSVChjb3VudCA9PSAwIHx8IGtleXNbY291bnQgLSAxXSA8IGtleSk7CisgIEdQUl9BU1NFUlQodmFsdWUpOworCisgIGlmIChjb3VudCA9PSBjYXBhY2l0eSkgeworICAgIGlmIChtYXAtPmZyZWUgPiBjYXBhY2l0eSAvIDQpIHsKKyAgICAgIGNvdW50ID0gY29tcGFjdChrZXlzLCB2YWx1ZXMsIGNvdW50KTsKKyAgICAgIG1hcC0+ZnJlZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlc2l6ZSB3aGVuIGxlc3MgdGhhbiAyNSUgb2YgdGhlIHRhYmxlIGlzIGZyZWUsIGJlY2F1c2UgY29tcGFjdGlvbgorICAgICAgICAgd29uJ3QgaGVscCBtdWNoICovCisgICAgICBtYXAtPmNhcGFjaXR5ID0gY2FwYWNpdHkgPSAzICogY2FwYWNpdHkgLyAyOworICAgICAgbWFwLT5rZXlzID0ga2V5cyA9IGdwcl9yZWFsbG9jKGtleXMsIGNhcGFjaXR5ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICBtYXAtPnZhbHVlcyA9IHZhbHVlcyA9IGdwcl9yZWFsbG9jKHZhbHVlcywgY2FwYWNpdHkgKiBzaXplb2Yodm9pZCAqKSk7CisgICAgfQorICB9CisKKyAga2V5c1tjb3VudF0gPSBrZXk7CisgIHZhbHVlc1tjb3VudF0gPSB2YWx1ZTsKKyAgbWFwLT5jb3VudCA9IGNvdW50ICsgMTsKK30KKwordm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX21vdmVfaW50byhncnBjX2NodHRwMl9zdHJlYW1fbWFwICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKmRzdCkgeworICAvKiBpZiBzcmMgaXMgZW1wdHkgd2UgZG9udCBuZWVkIHRvIGRvIGFueXRoaW5nICovCisgIGlmIChzcmMtPmNvdW50ID09IHNyYy0+ZnJlZSkgeworICAgIHJldHVybjsKKyAgfQorICAvKiBpZiBkc3QgaXMgZW1wdHkgd2Ugc2ltcGx5IG5lZWQgdG8gc3dhcCAqLworICBpZiAoZHN0LT5jb3VudCA9PSBkc3QtPmZyZWUpIHsKKyAgICBHUFJfU1dBUChncnBjX2NodHRwMl9zdHJlYW1fbWFwLCAqc3JjLCAqZHN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgLyogdGhlIGZpcnN0IGVsZW1lbnQgb2Ygc3JjIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IG9mIGRzdC4uLgorICAgKiBob3dldmVyIHRoZSBtYXBzIG1heSBuZWVkIGNvbXBhY3RpbmcgZm9yIHRoaXMgcHJvcGVydHkgdG8gaG9sZCAqLworICBpZiAoc3JjLT5rZXlzWzBdIDw9IGRzdC0+a2V5c1tkc3QtPmNvdW50IC0gMV0pIHsKKyAgICBzcmMtPmNvdW50ID0gY29tcGFjdChzcmMtPmtleXMsIHNyYy0+dmFsdWVzLCBzcmMtPmNvdW50KTsKKyAgICBzcmMtPmZyZWUgPSAwOworICAgIGRzdC0+Y291bnQgPSBjb21wYWN0KGRzdC0+a2V5cywgZHN0LT52YWx1ZXMsIGRzdC0+Y291bnQpOworICAgIGRzdC0+ZnJlZSA9IDA7CisgIH0KKyAgR1BSX0FTU0VSVChzcmMtPmtleXNbMF0gPiBkc3QtPmtleXNbZHN0LT5jb3VudCAtIDFdKTsKKyAgLyogaWYgZHN0IGRvZXNuJ3QgaGF2ZSBjYXBhY2l0eSwgcmVzaXplICovCisgIGlmIChkc3QtPmNvdW50ICsgc3JjLT5jb3VudCA+IGRzdC0+Y2FwYWNpdHkpIHsKKyAgICBkc3QtPmNhcGFjaXR5ID0gR1BSX01BWChkc3QtPmNhcGFjaXR5ICogMyAvIDIsIGRzdC0+Y291bnQgKyBzcmMtPmNvdW50KTsKKyAgICBkc3QtPmtleXMgPSBncHJfcmVhbGxvYyhkc3QtPmtleXMsIGRzdC0+Y2FwYWNpdHkgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBkc3QtPnZhbHVlcyA9IGdwcl9yZWFsbG9jKGRzdC0+dmFsdWVzLCBkc3QtPmNhcGFjaXR5ICogc2l6ZW9mKHZvaWQgKikpOworICB9CisgIG1lbWNweShkc3QtPmtleXMgKyBkc3QtPmNvdW50LCBzcmMtPmtleXMsIHNyYy0+Y291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgbWVtY3B5KGRzdC0+dmFsdWVzICsgZHN0LT5jb3VudCwgc3JjLT52YWx1ZXMsIHNyYy0+Y291bnQgKiBzaXplb2Yodm9pZCAqKSk7CisgIGRzdC0+Y291bnQgKz0gc3JjLT5jb3VudDsKKyAgZHN0LT5mcmVlICs9IHNyYy0+ZnJlZTsKKyAgc3JjLT5jb3VudCA9IDA7CisgIHNyYy0+ZnJlZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkICoqZmluZChncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSkgeworICBzaXplX3QgbWluX2lkeCA9IDA7CisgIHNpemVfdCBtYXhfaWR4ID0gbWFwLT5jb3VudDsKKyAgc2l6ZV90IG1pZF9pZHg7CisgIHVpbnQzMl90ICprZXlzID0gbWFwLT5rZXlzOworICB2b2lkICoqdmFsdWVzID0gbWFwLT52YWx1ZXM7CisgIHVpbnQzMl90IG1pZF9rZXk7CisKKyAgaWYgKG1heF9pZHggPT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgd2hpbGUgKG1pbl9pZHggPCBtYXhfaWR4KSB7CisgICAgLyogZmluZCB0aGUgbWlkcG9pbnQsIGF2b2lkaW5nIG92ZXJmbG93ICovCisgICAgbWlkX2lkeCA9IG1pbl9pZHggKyAoKG1heF9pZHggLSBtaW5faWR4KSAvIDIpOworICAgIG1pZF9rZXkgPSBrZXlzW21pZF9pZHhdOworCisgICAgaWYgKG1pZF9rZXkgPCBrZXkpIHsKKyAgICAgIG1pbl9pZHggPSBtaWRfaWR4ICsgMTsKKyAgICB9IGVsc2UgaWYgKG1pZF9rZXkgPiBrZXkpIHsKKyAgICAgIG1heF9pZHggPSBtaWRfaWR4OworICAgIH0gZWxzZSAvKiBtaWRfa2V5ID09IGtleSAqLworICAgIHsKKyAgICAgIHJldHVybiAmdmFsdWVzW21pZF9pZHhdOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCit2b2lkICpncnBjX2NodHRwMl9zdHJlYW1fbWFwX2RlbGV0ZShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSkgeworICB2b2lkICoqcHZhbHVlID0gZmluZChtYXAsIGtleSk7CisgIHZvaWQgKm91dCA9IE5VTEw7CisgIGlmIChwdmFsdWUgIT0gTlVMTCkgeworICAgIG91dCA9ICpwdmFsdWU7CisgICAgKnB2YWx1ZSA9IE5VTEw7CisgICAgbWFwLT5mcmVlICs9IChvdXQgIT0gTlVMTCk7CisgICAgLyogcmVjb2duaXplIGNvbXBsZXRlIGVtcHR5bmVzcyBhbmQgZW5zdXJlIHdlIGNhbiBza2lwCisgICAgICogZGVmcmFnbWVudGF0aW9uIGxhdGVyICovCisgICAgaWYgKG1hcC0+ZnJlZSA9PSBtYXAtPmNvdW50KSB7CisgICAgICBtYXAtPmZyZWUgPSBtYXAtPmNvdW50ID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKwordm9pZCAqZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9maW5kKGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKm1hcCwgdWludDMyX3Qga2V5KSB7CisgIHZvaWQgKipwdmFsdWUgPSBmaW5kKG1hcCwga2V5KTsKKyAgcmV0dXJuIHB2YWx1ZSAhPSBOVUxMID8gKnB2YWx1ZSA6IE5VTEw7Cit9CisKK3NpemVfdCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX3NpemUoZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwKSB7CisgIHJldHVybiBtYXAtPmNvdW50IC0gbWFwLT5mcmVlOworfQorCit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZm9yX2VhY2goZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmKSh2b2lkICp1c2VyX2RhdGEsIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBzaXplX3QgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5jb3VudDsgaSsrKSB7CisgICAgaWYgKG1hcC0+dmFsdWVzW2ldKSB7CisgICAgICBmKHVzZXJfZGF0YSwgbWFwLT5rZXlzW2ldLCBtYXAtPnZhbHVlc1tpXSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5oIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg1ODZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaApAQCAtMCwwICsxLDg0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfU1RSRUFNX01BUF9ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfU1RSRUFNX01BUF9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIERhdGEgc3RydWN0dXJlIHRvIG1hcCBhIHVpbnQzMl90IHRvIGEgZGF0YSBvYmplY3QgKHJlcHJlc2VudGVkIGJ5IGEgdm9pZCopCisKKyAgIFJlcHJlc2VudGVkIGFzIGEgc29ydGVkIGFycmF5IG9mIGtleXMsIGFuZCBhIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgdmFsdWVzLgorICAgTG9va3VwcyBhcmUgcGVyZm9ybWVkIHdpdGggYmluYXJ5IHNlYXJjaC4KKyAgIEFkZHMgYXJlIHJlc3RyaWN0ZWQgdG8gc3RyaWN0bHkgaGlnaGVyIGtleXMgdGhhbiBwcmV2aW91c2x5IHNlZW4gKHRoaXMgaXMKKyAgIGd1YXJhbnRlZWQgYnkgaHR0cDIpLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCAqa2V5czsKKyAgdm9pZCAqKnZhbHVlczsKKyAgc2l6ZV90IGNvdW50OworICBzaXplX3QgZnJlZTsKKyAgc2l6ZV90IGNhcGFjaXR5OworfSBncnBjX2NodHRwMl9zdHJlYW1fbWFwOworCit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfaW5pdChncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdGlhbF9jYXBhY2l0eSk7Cit2b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVzdHJveShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXApOworCisvKiBBZGQgYSBuZXcga2V5OiBnaXZlbiBodHRwMiBzZW1hbnRpY3MsIG5ldyBrZXlzIG11c3QgYWx3YXlzIGJlIGdyZWF0ZXIgdGhhbgorICAgZXhpc3Rpbmcga2V5cyAtIHRoaXMgaXMgYXNzZXJ0ZWQgKi8KK3ZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9hZGQoZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwLCB1aW50MzJfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKTsKKworLyogRGVsZXRlIGFuIGV4aXN0aW5nIGtleSAtIHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBrZXkgaWYgaXQgZXhpc3RlZCwKKyAgIG9yIE5VTEwgb3RoZXJ3aXNlICovCit2b2lkICpncnBjX2NodHRwMl9zdHJlYW1fbWFwX2RlbGV0ZShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSk7CisKKy8qIE1vdmUgYWxsIGVsZW1lbnRzIG9mIHNyYyBpbnRvIGRzdCAqLwordm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX21vdmVfaW50byhncnBjX2NodHRwMl9zdHJlYW1fbWFwICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKmRzdCk7CisKKy8qIFJldHVybiBhbiBleGlzdGluZyBrZXksIG9yIE5VTEwgaWYgaXQgZG9lcyBub3QgZXhpc3QgKi8KK3ZvaWQgKmdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZmluZChncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSk7CisKKy8qIEhvdyBtYW55IChwb3B1bGF0ZWQpIGVudHJpZXMgYXJlIGluIHRoZSBzdHJlYW0gbWFwPyAqLworc2l6ZV90IGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfc2l6ZShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXApOworCisvKiBDYWxsYmFjayBvbiBlYWNoIHN0cmVhbSAqLwordm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2Zvcl9lYWNoKGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqdXNlcl9kYXRhLCB1aW50MzJfdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9TVFJFQU1fTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmMgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjlkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCitzdGF0aWMgaW50NjRfdCByb3VuZF91cChpbnQ2NF90IHgsIGludDY0X3QgZGl2aXNvcikgeworICByZXR1cm4gKHggLyBkaXZpc29yICsgKHggJSBkaXZpc29yICE9IDApKSAqIGRpdmlzb3I7Cit9CisKKy8qIHJvdW5kIGFuIGludGVnZXIgdXAgdG8gdGhlIG5leHQgdmFsdWUgd2l0aCB0aHJlZSBzaWduaWZpY2FudCBmaWd1cmVzICovCitzdGF0aWMgaW50NjRfdCByb3VuZF91cF90b190aHJlZV9zaWdfZmlncyhpbnQ2NF90IHgpIHsKKyAgaWYgKHggPCAxMDAwKSByZXR1cm4geDsKKyAgaWYgKHggPCAxMDAwMCkgcmV0dXJuIHJvdW5kX3VwKHgsIDEwKTsKKyAgaWYgKHggPCAxMDAwMDApIHJldHVybiByb3VuZF91cCh4LCAxMDApOworICBpZiAoeCA8IDEwMDAwMDApIHJldHVybiByb3VuZF91cCh4LCAxMDAwKTsKKyAgaWYgKHggPCAxMDAwMDAwMCkgcmV0dXJuIHJvdW5kX3VwKHgsIDEwMDAwKTsKKyAgaWYgKHggPCAxMDAwMDAwMDApIHJldHVybiByb3VuZF91cCh4LCAxMDAwMDApOworICBpZiAoeCA8IDEwMDAwMDAwMDApIHJldHVybiByb3VuZF91cCh4LCAxMDAwMDAwKTsKKyAgcmV0dXJuIHJvdW5kX3VwKHgsIDEwMDAwMDAwKTsKK30KKworLyogZW5jb2RlIG91ciBtaW5pbXVtIHZpYWJsZSB0aW1lb3V0IHZhbHVlICovCitzdGF0aWMgdm9pZCBlbmNfdGlueShjaGFyICpidWZmZXIpIHsgbWVtY3B5KGJ1ZmZlciwgIjFuIiwgMyk7IH0KKworc3RhdGljIHZvaWQgZW5jX2V4dChjaGFyICpidWZmZXIsIGludDY0X3QgdmFsdWUsIGNoYXIgZXh0KSB7CisgIGludCBuID0gaW50NjRfdHRvYSh2YWx1ZSwgYnVmZmVyKTsKKyAgYnVmZmVyW25dID0gZXh0OworICBidWZmZXJbbiArIDFdID0gMDsKK30KKworc3RhdGljIHZvaWQgZW5jX3NlY29uZHMoY2hhciAqYnVmZmVyLCBpbnQ2NF90IHNlYykgeworICBpZiAoc2VjICUgMzYwMCA9PSAwKSB7CisgICAgZW5jX2V4dChidWZmZXIsIHNlYyAvIDM2MDAsICdIJyk7CisgIH0gZWxzZSBpZiAoc2VjICUgNjAgPT0gMCkgeworICAgIGVuY19leHQoYnVmZmVyLCBzZWMgLyA2MCwgJ00nKTsKKyAgfSBlbHNlIHsKKyAgICBlbmNfZXh0KGJ1ZmZlciwgc2VjLCAnUycpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVuY19uYW5vcyhjaGFyICpidWZmZXIsIGludDY0X3QgeCkgeworICB4ID0gcm91bmRfdXBfdG9fdGhyZWVfc2lnX2ZpZ3MoeCk7CisgIGlmICh4IDwgMTAwMDAwKSB7CisgICAgaWYgKHggJSAxMDAwID09IDApIHsKKyAgICAgIGVuY19leHQoYnVmZmVyLCB4IC8gMTAwMCwgJ3UnKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5jX2V4dChidWZmZXIsIHgsICduJyk7CisgICAgfQorICB9IGVsc2UgaWYgKHggPCAxMDAwMDAwMDApIHsKKyAgICBpZiAoeCAlIDEwMDAwMDAgPT0gMCkgeworICAgICAgZW5jX2V4dChidWZmZXIsIHggLyAxMDAwMDAwLCAnbScpOworICAgIH0gZWxzZSB7CisgICAgICBlbmNfZXh0KGJ1ZmZlciwgeCAvIDEwMDAsICd1Jyk7CisgICAgfQorICB9IGVsc2UgaWYgKHggPCAxMDAwMDAwMDAwKSB7CisgICAgZW5jX2V4dChidWZmZXIsIHggLyAxMDAwMDAwLCAnbScpOworICB9IGVsc2UgeworICAgIC8qIG5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgZXZlciBjYWxsZWQgd2l0aCB0aW1lcyBvZiBsZXNzIHRoYW4gb25lIHNlY29uZCwKKyAgICAgICBzbyBpZiB3ZSByZWFjaCBoZXJlIHRoZSB0aW1lIG11c3QgaGF2ZSBiZWVuIHJvdW5kZWQgdXAgdG8gYSB3aG9sZSBzZWNvbmQKKyAgICAgICAoYW5kIG5vIG1vcmUpICovCisgICAgbWVtY3B5KGJ1ZmZlciwgIjFTIiwgMyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZW5jX21pY3JvcyhjaGFyICpidWZmZXIsIGludDY0X3QgeCkgeworICB4ID0gcm91bmRfdXBfdG9fdGhyZWVfc2lnX2ZpZ3MoeCk7CisgIGlmICh4IDwgMTAwMDAwKSB7CisgICAgaWYgKHggJSAxMDAwID09IDApIHsKKyAgICAgIGVuY19leHQoYnVmZmVyLCB4IC8gMTAwMCwgJ20nKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5jX2V4dChidWZmZXIsIHgsICd1Jyk7CisgICAgfQorICB9IGVsc2UgaWYgKHggPCAxMDAwMDAwMDApIHsKKyAgICBpZiAoeCAlIDEwMDAwMDAgPT0gMCkgeworICAgICAgZW5jX2V4dChidWZmZXIsIHggLyAxMDAwMDAwLCAnUycpOworICAgIH0gZWxzZSB7CisgICAgICBlbmNfZXh0KGJ1ZmZlciwgeCAvIDEwMDAsICdtJyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGVuY19leHQoYnVmZmVyLCB4IC8gMTAwMDAwMCwgJ1MnKTsKKyAgfQorfQorCit2b2lkIGdycGNfY2h0dHAyX2VuY29kZV90aW1lb3V0KGdwcl90aW1lc3BlYyB0aW1lb3V0LCBjaGFyICpidWZmZXIpIHsKKyAgaWYgKHRpbWVvdXQudHZfc2VjIDwgMCkgeworICAgIGVuY190aW55KGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAodGltZW91dC50dl9zZWMgPT0gMCkgeworICAgIGVuY19uYW5vcyhidWZmZXIsIHRpbWVvdXQudHZfbnNlYyk7CisgIH0gZWxzZSBpZiAodGltZW91dC50dl9zZWMgPCAxMDAwICYmIHRpbWVvdXQudHZfbnNlYyAhPSAwKSB7CisgICAgZW5jX21pY3JvcyhidWZmZXIsCisgICAgICAgICAgICAgICAoaW50NjRfdCkodGltZW91dC50dl9zZWMgKiAxMDAwMDAwKSArCisgICAgICAgICAgICAgICAgICAgKHRpbWVvdXQudHZfbnNlYyAvIDEwMDAgKyAodGltZW91dC50dl9uc2VjICUgMTAwMCAhPSAwKSkpOworICB9IGVsc2UgeworICAgIGVuY19zZWNvbmRzKGJ1ZmZlciwgdGltZW91dC50dl9zZWMgKyAodGltZW91dC50dl9uc2VjICE9IDApKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGlzX2FsbF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnApIHsKKyAgd2hpbGUgKCpwID09ICcgJykgcCsrOworICByZXR1cm4gKnAgPT0gMDsKK30KKworaW50IGdycGNfY2h0dHAyX2RlY29kZV90aW1lb3V0KGNvbnN0IGNoYXIgKmJ1ZmZlciwgZ3ByX3RpbWVzcGVjICp0aW1lb3V0KSB7CisgIGludDMyX3QgeCA9IDA7CisgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlcjsKKyAgaW50IGhhdmVfZGlnaXQgPSAwOworICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KKyAgZm9yICg7ICpwID09ICcgJzsgcCsrKQorICAgIDsKKyAgLyogZGVjb2RlIG51bWVyaWMgcGFydCAqLworICBmb3IgKDsgKnAgPj0gJzAnICYmICpwIDw9ICc5JzsgcCsrKSB7CisgICAgaW50MzJfdCBkaWdpdCA9IChpbnQzMl90KSgqcCAtICh1aW50OF90KScwJyk7CisgICAgaGF2ZV9kaWdpdCA9IDE7CisgICAgLyogc3BlYyBhbGxvd3MgbWF4LiA4IGRpZ2l0cywgYnV0IHdlIGFsbG93IHZhbHVlcyB1cCB0byAxLDAwMCwwMDAsMDAwICovCisgICAgaWYgKHggPj0gKDEwMCAqIDEwMDAgKiAxMDAwKSkgeworICAgICAgaWYgKHggIT0gKDEwMCAqIDEwMDAgKiAxMDAwKSB8fCBkaWdpdCAhPSAwKSB7CisgICAgICAgICp0aW1lb3V0ID0gZ3ByX2luZl9mdXR1cmUoR1BSX1RJTUVTUEFOKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIHggPSB4ICogMTAgKyBkaWdpdDsKKyAgfQorICBpZiAoIWhhdmVfZGlnaXQpIHJldHVybiAwOworICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KKyAgZm9yICg7ICpwID09ICcgJzsgcCsrKQorICAgIDsKKyAgLyogZGVjb2RlIHVuaXQgc3BlY2lmaWVyICovCisgIHN3aXRjaCAoKnApIHsKKyAgICBjYXNlICduJzoKKyAgICAgICp0aW1lb3V0ID0gZ3ByX3RpbWVfZnJvbV9uYW5vcyh4LCBHUFJfVElNRVNQQU4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndSc6CisgICAgICAqdGltZW91dCA9IGdwcl90aW1lX2Zyb21fbWljcm9zKHgsIEdQUl9USU1FU1BBTik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgICp0aW1lb3V0ID0gZ3ByX3RpbWVfZnJvbV9taWxsaXMoeCwgR1BSX1RJTUVTUEFOKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1MnOgorICAgICAgKnRpbWVvdXQgPSBncHJfdGltZV9mcm9tX3NlY29uZHMoeCwgR1BSX1RJTUVTUEFOKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ00nOgorICAgICAgKnRpbWVvdXQgPSBncHJfdGltZV9mcm9tX21pbnV0ZXMoeCwgR1BSX1RJTUVTUEFOKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0gnOgorICAgICAgKnRpbWVvdXQgPSBncHJfdGltZV9mcm9tX2hvdXJzKHgsIEdQUl9USU1FU1BBTik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcCsrOworICByZXR1cm4gaXNfYWxsX3doaXRlc3BhY2UoKGNvbnN0IGNoYXIgKilwKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmggYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjRmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9USU1FT1VUX0VOQ09ESU5HX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9USU1FT1VUX0VOQ09ESU5HX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKKyNkZWZpbmUgR1JQQ19DSFRUUDJfVElNRU9VVF9FTkNPREVfTUlOX0JVRlNJWkUgKEdQUl9MVE9BX01JTl9CVUZTSVpFICsgMSkKKworLyogRW5jb2RlL2RlY29kZSB0aW1lb3V0cyB0byB0aGUgR1JQQyBvdmVyIEhUVFAyIGZvcm1hdDsKKyAgIGVuY29kaW5nIG1heSByb3VuZCB1cCBhcmJpdHJhcmlseSAqLwordm9pZCBncnBjX2NodHRwMl9lbmNvZGVfdGltZW91dChncHJfdGltZXNwZWMgdGltZW91dCwgY2hhciAqYnVmZmVyKTsKK2ludCBncnBjX2NodHRwMl9kZWNvZGVfdGltZW91dChjb25zdCBjaGFyICpidWZmZXIsIGdwcl90aW1lc3BlYyAqdGltZW91dCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX1RJTUVPVVRfRU5DT0RJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjFkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC92YXJpbnQuaCIKKwordWludDMyX3QgZ3JwY19jaHR0cDJfaHBhY2tfdmFyaW50X2xlbmd0aCh1aW50MzJfdCB0YWlsX3ZhbHVlKSB7CisgIGlmICh0YWlsX3ZhbHVlIDwgKDEgPDwgNykpIHsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIGlmICh0YWlsX3ZhbHVlIDwgKDEgPDwgMTQpKSB7CisgICAgcmV0dXJuIDM7CisgIH0gZWxzZSBpZiAodGFpbF92YWx1ZSA8ICgxIDw8IDIxKSkgeworICAgIHJldHVybiA0OworICB9IGVsc2UgaWYgKHRhaWxfdmFsdWUgPCAoMSA8PCAyOCkpIHsKKyAgICByZXR1cm4gNTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gNjsKKyAgfQorfQorCit2b2lkIGdycGNfY2h0dHAyX2hwYWNrX3dyaXRlX3ZhcmludF90YWlsKHVpbnQzMl90IHRhaWxfdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFpbF9sZW5ndGgpIHsKKyAgc3dpdGNoICh0YWlsX2xlbmd0aCkgeworICAgIGNhc2UgNToKKyAgICAgIHRhcmdldFs0XSA9ICh1aW50OF90KSgodGFpbF92YWx1ZSA+PiAyOCkgfCAweDgwKTsKKyAgICBjYXNlIDQ6CisgICAgICB0YXJnZXRbM10gPSAodWludDhfdCkoKHRhaWxfdmFsdWUgPj4gMjEpIHwgMHg4MCk7CisgICAgY2FzZSAzOgorICAgICAgdGFyZ2V0WzJdID0gKHVpbnQ4X3QpKCh0YWlsX3ZhbHVlID4+IDE0KSB8IDB4ODApOworICAgIGNhc2UgMjoKKyAgICAgIHRhcmdldFsxXSA9ICh1aW50OF90KSgodGFpbF92YWx1ZSA+PiA3KSB8IDB4ODApOworICAgIGNhc2UgMToKKyAgICAgIHRhcmdldFswXSA9ICh1aW50OF90KSgodGFpbF92YWx1ZSkgfCAweDgwKTsKKyAgfQorICB0YXJnZXRbdGFpbF9sZW5ndGggLSAxXSAmPSAweDdmOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIGIvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDJlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfRVhUX1RSQU5TUE9SVF9DSFRUUDJfVFJBTlNQT1JUX1ZBUklOVF9ICisjZGVmaW5lIEdSUENfQ09SRV9FWFRfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfVkFSSU5UX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKy8qIEhlbHBlcnMgZm9yIGhwYWNrIHZhcmludCBlbmNvZGluZyAqLworCisvKiBsZW5ndGggb2YgYSB2YWx1ZSB0aGF0IG5lZWRzIHZhcmludCB0YWlsIGVuY29kaW5nIChpdCdzIGJpZ2dlciB0aGFuIGNhbiBiZQorICAgYml0cGFja2VkIGludG8gdGhlIG9wY29kZSBieXRlKSAtIHJldHVybmVkIHZhbHVlIGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlCisgICBvcGNvZGUgYnl0ZSAqLwordWludDMyX3QgZ3JwY19jaHR0cDJfaHBhY2tfdmFyaW50X2xlbmd0aCh1aW50MzJfdCB0YWlsX3ZhbHVlKTsKKwordm9pZCBncnBjX2NodHRwMl9ocGFja193cml0ZV92YXJpbnRfdGFpbCh1aW50MzJfdCB0YWlsX3ZhbHVlLCB1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhaWxfbGVuZ3RoKTsKKworLyogbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBiaXRwYWNrZWQgd2l0aCB0aGUgb3Bjb2RlIGlmIHRoZSBvcGNvZGUgaGFzIGEKKyAgIHByZWZpeAorICAgb2YgbGVuZ3RoIHByZWZpeF9iaXRzICovCisjZGVmaW5lIEdSUENfQ0hUVFAyX01BWF9JTl9QUkVGSVgocHJlZml4X2JpdHMpIFwKKyAgKCh1aW50MzJfdCkoKDEgPDwgKDggLSAocHJlZml4X2JpdHMpKSkgLSAxKSkKKworLyogbGVuZ3RoIHJlcXVpcmVkIHRvIGJpdHBhY2sgYSB2YWx1ZSAqLworI2RlZmluZSBHUlBDX0NIVFRQMl9WQVJJTlRfTEVOR1RIKG4sIHByZWZpeF9iaXRzKSBcCisgICgobikgPCBHUlBDX0NIVFRQMl9NQVhfSU5fUFJFRklYKHByZWZpeF9iaXRzKSAgIFwKKyAgICAgICA/IDF1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogZ3JwY19jaHR0cDJfaHBhY2tfdmFyaW50X2xlbmd0aCggICAgICAgICBcCisgICAgICAgICAgICAgKG4pLUdSUENfQ0hUVFAyX01BWF9JTl9QUkVGSVgocHJlZml4X2JpdHMpKSkKKworI2RlZmluZSBHUlBDX0NIVFRQMl9XUklURV9WQVJJTlQobiwgcHJlZml4X2JpdHMsIHByZWZpeF9vciwgdGFyZ2V0LCBsZW5ndGgpICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIHRndCA9IHRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgobGVuZ3RoKSA9PSAxdSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHRndClbMF0gPSAodWludDhfdCkoKHByZWZpeF9vcikgfCAobikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHRndClbMF0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChwcmVmaXhfb3IpIHwgKHVpbnQ4X3QpR1JQQ19DSFRUUDJfTUFYX0lOX1BSRUZJWChwcmVmaXhfYml0cyk7ICAgICAgXAorICAgICAgZ3JwY19jaHR0cDJfaHBhY2tfd3JpdGVfdmFyaW50X3RhaWwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChuKS1HUlBDX0NIVFRQMl9NQVhfSU5fUFJFRklYKHByZWZpeF9iaXRzKSwgKHRndCkgKyAxLCAobGVuZ3RoKS0xKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogR1JQQ19DT1JFX0VYVF9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9WQVJJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC93cml0aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1ODg2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC93cml0aW5nLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h0dHAyX2Vycm9ycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisKK3N0YXRpYyB2b2lkIGZpbmFsaXplX291dGJ1ZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcpOworCitpbnQgZ3JwY19jaHR0cDJfdW5sb2NraW5nX2NoZWNrX3dyaXRlcygKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKKyAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsIGludCBpc19wYXJzaW5nKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7CisgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZzsKKworICBHUFJfVElNRVJfQkVHSU4oImdycGNfY2h0dHAyX3VubG9ja2luZ19jaGVja193cml0ZXMiLCAwKTsKKworICAvKiBzaW1wbGUgd3JpdGVzIGFyZSBxdWV1ZWQgdG8gcWJ1ZiwgYW5kIGZsdXNoZWQgaGVyZSAqLworICBncHJfc2xpY2VfYnVmZmVyX3N3YXAoJnRyYW5zcG9ydF9nbG9iYWwtPnFidWYsICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmKTsKKyAgR1BSX0FTU0VSVCh0cmFuc3BvcnRfZ2xvYmFsLT5xYnVmLmNvdW50ID09IDApOworCisgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF90YWJsZV9zaXplKAorICAgICAgJnRyYW5zcG9ydF93cml0aW5nLT5ocGFja19jb21wcmVzc29yLAorICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19QRUVSX1NFVFRJTkdTXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSEVBREVSX1RBQkxFX1NJWkVdKTsKKworICBpZiAodHJhbnNwb3J0X2dsb2JhbC0+ZGlydGllZF9sb2NhbF9zZXR0aW5ncyAmJgorICAgICAgIXRyYW5zcG9ydF9nbG9iYWwtPnNlbnRfbG9jYWxfc2V0dGluZ3MgJiYgIWlzX3BhcnNpbmcpIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgKKyAgICAgICAgJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYsCisgICAgICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX2NyZWF0ZSgKKyAgICAgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfU0VOVF9TRVRUSU5HU10sCisgICAgICAgICAgICB0cmFuc3BvcnRfZ2xvYmFsLT5zZXR0aW5nc1tHUlBDX0xPQ0FMX1NFVFRJTkdTXSwKKyAgICAgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPmZvcmNlX3NlbmRfc2V0dGluZ3MsIEdSUENfQ0hUVFAyX05VTV9TRVRUSU5HUykpOworICAgIHRyYW5zcG9ydF9nbG9iYWwtPmZvcmNlX3NlbmRfc2V0dGluZ3MgPSAwOworICAgIHRyYW5zcG9ydF9nbG9iYWwtPmRpcnRpZWRfbG9jYWxfc2V0dGluZ3MgPSAwOworICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNlbnRfbG9jYWxfc2V0dGluZ3MgPSAxOworICB9CisKKyAgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX1RSQU5TUE9SVCgid3JpdGUiLCB0cmFuc3BvcnRfd3JpdGluZywgb3V0Z29pbmdfd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwsIG91dGdvaW5nX3dpbmRvdyk7CisgIGJvb2wgaXNfd2luZG93X2F2YWlsYWJsZSA9IHRyYW5zcG9ydF93cml0aW5nLT5vdXRnb2luZ193aW5kb3cgPiAwOworICBncnBjX2NodHRwMl9saXN0X2ZsdXNoX3dyaXRpbmdfc3RhbGxlZF9ieV90cmFuc3BvcnQoCisgICAgICBleGVjX2N0eCwgdHJhbnNwb3J0X3dyaXRpbmcsIGlzX3dpbmRvd19hdmFpbGFibGUpOworCisgIC8qIGZvciBlYWNoIGdycGNfY2h0dHAyX3N0cmVhbSB0aGF0J3MgYmVjb21lIHdyaXRhYmxlLCBmcmFtZSBpdCdzIGRhdGEKKyAgICAgKGFjY29yZGluZyB0byBhdmFpbGFibGUgd2luZG93IHNpemVzKSBhbmQgYWRkIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCisgIHdoaWxlIChncnBjX2NodHRwMl9saXN0X3BvcF93cml0YWJsZV9zdHJlYW0oCisgICAgICB0cmFuc3BvcnRfZ2xvYmFsLCB0cmFuc3BvcnRfd3JpdGluZywgJnN0cmVhbV9nbG9iYWwsICZzdHJlYW1fd3JpdGluZykpIHsKKyAgICBib29sIHNlbnRfaW5pdGlhbF9tZXRhZGF0YSA9IHN0cmVhbV93cml0aW5nLT5zZW50X2luaXRpYWxfbWV0YWRhdGE7CisgICAgYm9vbCBiZWNvbWVfd3JpdGFibGUgPSBmYWxzZTsKKworICAgIHN0cmVhbV93cml0aW5nLT5pZCA9IHN0cmVhbV9nbG9iYWwtPmlkOworICAgIHN0cmVhbV93cml0aW5nLT5yZWFkX2Nsb3NlZCA9IHN0cmVhbV9nbG9iYWwtPnJlYWRfY2xvc2VkOworCisgICAgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX1NUUkVBTSgid3JpdGUiLCB0cmFuc3BvcnRfd3JpdGluZywgc3RyZWFtX3dyaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRnb2luZ193aW5kb3csIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRnb2luZ193aW5kb3cpOworCisgICAgaWYgKCFzZW50X2luaXRpYWxfbWV0YWRhdGEgJiYgc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKSB7CisgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9pbml0aWFsX21ldGFkYXRhID0KKyAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGE7CisgICAgICBzdHJlYW1fZ2xvYmFsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgPSBOVUxMOworICAgICAgYmVjb21lX3dyaXRhYmxlID0gdHJ1ZTsKKyAgICAgIHNlbnRfaW5pdGlhbF9tZXRhZGF0YSA9IHRydWU7CisgICAgfQorICAgIGlmIChzZW50X2luaXRpYWxfbWV0YWRhdGEpIHsKKyAgICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5zZW5kX21lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICBncHJfc2xpY2UgaGRyID0gZ3ByX3NsaWNlX21hbGxvYyg1KTsKKyAgICAgICAgdWludDhfdCAqcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaGRyKTsKKyAgICAgICAgdWludDMyX3QgbGVuID0gc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlLT5sZW5ndGg7CisgICAgICAgIEdQUl9BU1NFUlQoc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9PSBOVUxMKTsKKyAgICAgICAgcFswXSA9IChzdHJlYW1fZ2xvYmFsLT5zZW5kX21lc3NhZ2UtPmZsYWdzICYKKyAgICAgICAgICAgICAgICBHUlBDX1dSSVRFX0lOVEVSTkFMX0NPTVBSRVNTKSAhPSAwOworICAgICAgICBwWzFdID0gKHVpbnQ4X3QpKGxlbiA+PiAyNCk7CisgICAgICAgIHBbMl0gPSAodWludDhfdCkobGVuID4+IDE2KTsKKyAgICAgICAgcFszXSA9ICh1aW50OF90KShsZW4gPj4gOCk7CisgICAgICAgIHBbNF0gPSAodWludDhfdCkobGVuKTsKKyAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLCBoZHIpOworICAgICAgICBpZiAoc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlLT5sZW5ndGggPiAwKSB7CisgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9IHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1fd3JpdGluZy0+c3RyZWFtX2ZldGNoZWQgPSAwOworICAgICAgICBzdHJlYW1fZ2xvYmFsLT5zZW5kX21lc3NhZ2UgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKChzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlICE9IE5VTEwgfHwKKyAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIubGVuZ3RoID4gMCkgJiYKKyAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+b3V0Z29pbmdfd2luZG93ID4gMCkgeworICAgICAgICBpZiAodHJhbnNwb3J0X3dyaXRpbmctPm91dGdvaW5nX3dpbmRvdyA+IDApIHsKKyAgICAgICAgICBiZWNvbWVfd3JpdGFibGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3N0YWxsZWRfYnlfdHJhbnNwb3J0KHRyYW5zcG9ydF93cml0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEpIHsKKyAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgPQorICAgICAgICAgICAgc3RyZWFtX2dsb2JhbC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YTsKKyAgICAgICAgc3RyZWFtX2dsb2JhbC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSA9IE5VTEw7CisgICAgICAgIGJlY29tZV93cml0YWJsZSA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCAmJgorICAgICAgICBzdHJlYW1fZ2xvYmFsLT51bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3dyaXRpbmcgPiAxMDI0KSB7CisgICAgICBHUlBDX0NIVFRQMl9GTE9XX01PVkVfU1RSRUFNKCJ3cml0ZSIsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV93cml0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZV93aW5kb3csIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19mb3Jfd3JpdGluZyk7CisgICAgICBiZWNvbWVfd3JpdGFibGUgPSB0cnVlOworICAgIH0KKworICAgIGlmIChiZWNvbWVfd3JpdGFibGUpIHsKKyAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RyZWFtKHRyYW5zcG9ydF93cml0aW5nLCBzdHJlYW1fd3JpdGluZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdSUENfQ0hUVFAyX1NUUkVBTV9VTlJFRihleGVjX2N0eCwgc3RyZWFtX2dsb2JhbCwgImNodHRwMl93cml0aW5nIik7CisgICAgfQorICB9CisKKyAgLyogaWYgdGhlIGdycGNfY2h0dHAyX3RyYW5zcG9ydCBpcyByZWFkeSB0byBzZW5kIGEgd2luZG93IHVwZGF0ZSwgZG8gc28gaGVyZQorICAgICBhbHNvOyAzLzQgaXMgYSBtYWdpYyBudW1iZXIgdGhhdCB3aWxsIGxpa2VseSBnZXQgdHVuZWQgc29vbiAqLworICBpZiAodHJhbnNwb3J0X2dsb2JhbC0+YW5ub3VuY2VfaW5jb21pbmdfd2luZG93ID4gMCkgeworICAgIHVpbnQzMl90IGFubm91bmNlZCA9ICh1aW50MzJfdClHUFJfTUlOKAorICAgICAgICB0cmFuc3BvcnRfZ2xvYmFsLT5hbm5vdW5jZV9pbmNvbWluZ193aW5kb3csIFVJTlQzMl9NQVgpOworICAgIEdSUENfQ0hUVFAyX0ZMT1dfREVCSVRfVFJBTlNQT1JUKCJ3cml0ZSIsIHRyYW5zcG9ydF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VfaW5jb21pbmdfd2luZG93LCBhbm5vdW5jZWQpOworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfY3JlYXRlKDAsIGFubm91bmNlZCkpOworICB9CisKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19jaHR0cDJfdW5sb2NraW5nX2NoZWNrX3dyaXRlcyIsIDApOworCisgIHJldHVybiB0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmLmNvdW50ID4gMCB8fAorICAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9oYXZlX3dyaXRpbmdfc3RyZWFtcyh0cmFuc3BvcnRfd3JpdGluZyk7Cit9CisKK3ZvaWQgZ3JwY19jaHR0cDJfcGVyZm9ybV93cml0ZXMoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKKyAgICBncnBjX2VuZHBvaW50ICplbmRwb2ludCkgeworICBHUFJfQVNTRVJUKHRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYuY291bnQgPiAwIHx8CisgICAgICAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9oYXZlX3dyaXRpbmdfc3RyZWFtcyh0cmFuc3BvcnRfd3JpdGluZykpOworCisgIGZpbmFsaXplX291dGJ1ZihleGVjX2N0eCwgdHJhbnNwb3J0X3dyaXRpbmcpOworCisgIEdQUl9BU1NFUlQoZW5kcG9pbnQpOworCisgIGlmICh0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmLmNvdW50ID4gMCkgeworICAgIGdycGNfZW5kcG9pbnRfd3JpdGUoZXhlY19jdHgsIGVuZHBvaW50LCAmdHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnRfd3JpdGluZy0+ZG9uZV9jYik7CisgIH0gZWxzZSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmdHJhbnNwb3J0X3dyaXRpbmctPmRvbmVfY2IsIHRydWUsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsaXplX291dGJ1ZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcpIHsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKnN0cmVhbV93cml0aW5nOworCisgIEdQUl9USU1FUl9CRUdJTigiZmluYWxpemVfb3V0YnVmIiwgMCk7CisKKyAgd2hpbGUgKAorICAgICAgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdGluZ19zdHJlYW0odHJhbnNwb3J0X3dyaXRpbmcsICZzdHJlYW1fd3JpdGluZykpIHsKKyAgICB1aW50MzJfdCBtYXhfb3V0Z29pbmcgPQorICAgICAgICAodWludDMyX3QpR1BSX01JTihHUlBDX0NIVFRQMl9NQVhfUEFZTE9BRF9MRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9NSU4oc3RyZWFtX3dyaXRpbmctPm91dGdvaW5nX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfd3JpdGluZy0+b3V0Z29pbmdfd2luZG93KSk7CisgICAgLyogc2VuZCBpbml0aWFsIG1ldGFkYXRhIGlmIGl0J3MgYXZhaWxhYmxlICovCisgICAgaWYgKHN0cmVhbV93cml0aW5nLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgZ3JwY19jaHR0cDJfZW5jb2RlX2hlYWRlcigKKyAgICAgICAgICAmdHJhbnNwb3J0X3dyaXRpbmctPmhwYWNrX2NvbXByZXNzb3IsIHN0cmVhbV93cml0aW5nLT5pZCwKKyAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9pbml0aWFsX21ldGFkYXRhLCAwLCAmdHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1Zik7CisgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9pbml0aWFsX21ldGFkYXRhID0gTlVMTDsKKyAgICAgIHN0cmVhbV93cml0aW5nLT5zZW50X2luaXRpYWxfbWV0YWRhdGEgPSAxOworICAgIH0KKyAgICAvKiBzZW5kIGFueSB3aW5kb3cgdXBkYXRlcyAqLworICAgIGlmIChzdHJlYW1fd3JpdGluZy0+YW5ub3VuY2Vfd2luZG93ID4gMCAmJgorICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9pbml0aWFsX21ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgIHVpbnQzMl90IGFubm91bmNlID0gc3RyZWFtX3dyaXRpbmctPmFubm91bmNlX3dpbmRvdzsKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAorICAgICAgICAgICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmLAorICAgICAgICAgIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfY3JlYXRlKHN0cmVhbV93cml0aW5nLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+YW5ub3VuY2Vfd2luZG93KSk7CisgICAgICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1NUUkVBTSgid3JpdGUiLCB0cmFuc3BvcnRfd3JpdGluZywgc3RyZWFtX3dyaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZV93aW5kb3csIGFubm91bmNlKTsKKyAgICAgIHN0cmVhbV93cml0aW5nLT5hbm5vdW5jZV93aW5kb3cgPSAwOworICAgIH0KKyAgICAvKiBmZXRjaCBhbnkgYm9keSBieXRlcyAqLworICAgIHdoaWxlICghc3RyZWFtX3dyaXRpbmctPmZldGNoaW5nICYmIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgJiYKKyAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIubGVuZ3RoIDwgbWF4X291dGdvaW5nICYmCisgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zdHJlYW1fZmV0Y2hlZCA8CisgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlLT5sZW5ndGgpIHsKKyAgICAgIGlmIChncnBjX2J5dGVfc3RyZWFtX25leHQoZXhlY19jdHgsIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1fd3JpdGluZy0+ZmV0Y2hpbmdfc2xpY2UsIG1heF9vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV93cml0aW5nLT5maW5pc2hlZF9mZXRjaCkpIHsKKyAgICAgICAgc3RyZWFtX3dyaXRpbmctPnN0cmVhbV9mZXRjaGVkICs9CisgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKHN0cmVhbV93cml0aW5nLT5mZXRjaGluZ19zbGljZSk7CisgICAgICAgIGlmIChzdHJlYW1fd3JpdGluZy0+c3RyZWFtX2ZldGNoZWQgPT0KKyAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UtPmxlbmd0aCkgeworICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPmZldGNoaW5nX3NsaWNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbV93cml0aW5nLT5mZXRjaGluZyA9IDE7CisgICAgICB9CisgICAgfQorICAgIC8qIHNlbmQgYW55IGJvZHkgYnl0ZXMgKi8KKyAgICBpZiAoc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIubGVuZ3RoID4gMCkgeworICAgICAgaWYgKG1heF9vdXRnb2luZyA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc2VuZF9ieXRlcyA9ICh1aW50MzJfdClHUFJfTUlOKAorICAgICAgICAgICAgbWF4X291dGdvaW5nLCBzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlci5sZW5ndGgpOworICAgICAgICBpbnQgaXNfbGFzdF9kYXRhX2ZyYW1lID0KKyAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgPT0gTlVMTCAmJgorICAgICAgICAgICAgc2VuZF9ieXRlcyA9PSBzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlci5sZW5ndGg7CisgICAgICAgIGludCBpc19sYXN0X2ZyYW1lID0gaXNfbGFzdF9kYXRhX2ZyYW1lICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfaXNfZW1wdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhKTsKKyAgICAgICAgZ3JwY19jaHR0cDJfZW5jb2RlX2RhdGEoCisgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+aWQsICZzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlciwKKyAgICAgICAgICAgIHNlbmRfYnl0ZXMsIGlzX2xhc3RfZnJhbWUsICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmKTsKKyAgICAgICAgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9TVFJFQU0oIndyaXRlIiwgdHJhbnNwb3J0X3dyaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLCBvdXRnb2luZ193aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfYnl0ZXMpOworICAgICAgICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1RSQU5TUE9SVCgid3JpdGUiLCB0cmFuc3BvcnRfd3JpdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfd2luZG93LCBzZW5kX2J5dGVzKTsKKyAgICAgICAgaWYgKGlzX2xhc3RfZnJhbWUpIHsKKyAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSA9IE5VTEw7CisgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbnRfdHJhaWxpbmdfbWV0YWRhdGEgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChpc19sYXN0X2RhdGFfZnJhbWUpIHsKKyAgICAgICAgICBHUFJfQVNTRVJUKHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgPT0gTlVMTCk7CisgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbnRfbWVzc2FnZSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3dyaXRpbmctPm91dGdvaW5nX3dpbmRvdyA9PSAwKSB7CisgICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RhbGxlZF9ieV90cmFuc3BvcnQodHJhbnNwb3J0X3dyaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmcpOworICAgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF93cml0dGVuX3N0cmVhbSh0cmFuc3BvcnRfd3JpdGluZywgc3RyZWFtX3dyaXRpbmcpOworICAgICAgfQorICAgIH0KKyAgICAvKiBzZW5kIHRyYWlsaW5nIG1ldGFkYXRhIGlmIGl0J3MgYXZhaWxhYmxlIGFuZCB3ZSdyZSByZWFkeSBmb3IgaXQgKi8KKyAgICBpZiAoc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9PSBOVUxMICYmCisgICAgICAgIHN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLmxlbmd0aCA9PSAwICYmCisgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgIGlmIChncnBjX21ldGFkYXRhX2JhdGNoX2lzX2VtcHR5KAorICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSkpIHsKKyAgICAgICAgZ3JwY19jaHR0cDJfZW5jb2RlX2RhdGEoc3RyZWFtX3dyaXRpbmctPmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdycGNfY2h0dHAyX2VuY29kZV9oZWFkZXIoJnRyYW5zcG9ydF93cml0aW5nLT5ocGFja19jb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1Zik7CisgICAgICB9CisgICAgICBpZiAoIXRyYW5zcG9ydF93cml0aW5nLT5pc19jbGllbnQgJiYgIXN0cmVhbV93cml0aW5nLT5yZWFkX2Nsb3NlZCkgeworICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmdHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+aWQsIEdSUENfQ0hUVFAyX05PX0VSUk9SKSk7CisgICAgICB9CisgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSA9IE5VTEw7CisgICAgICBzdHJlYW1fd3JpdGluZy0+c2VudF90cmFpbGluZ19tZXRhZGF0YSA9IDE7CisgICAgfQorICAgIC8qIGlmIHRoZXJlJ3MgbW9yZSB0byB3cml0ZSwgdGhlbiBsb29wLCBvdGhlcndpc2UgcHJlcGFyZSB0byBmaW5pc2ggdGhlCisgICAgICogd3JpdGUgKi8KKyAgICBpZiAoKHN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLmxlbmd0aCA+IDAgfHwKKyAgICAgICAgIChzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlICYmICFzdHJlYW1fd3JpdGluZy0+ZmV0Y2hpbmcpKSAmJgorICAgICAgICBzdHJlYW1fd3JpdGluZy0+b3V0Z29pbmdfd2luZG93ID4gMCkgeworICAgICAgaWYgKHRyYW5zcG9ydF93cml0aW5nLT5vdXRnb2luZ193aW5kb3cgPiAwKSB7CisgICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RyZWFtKHRyYW5zcG9ydF93cml0aW5nLCBzdHJlYW1fd3JpdGluZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KHRyYW5zcG9ydF93cml0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nKTsKKyAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdHRlbl9zdHJlYW0odHJhbnNwb3J0X3dyaXRpbmcsIHN0cmVhbV93cml0aW5nKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdHRlbl9zdHJlYW0odHJhbnNwb3J0X3dyaXRpbmcsIHN0cmVhbV93cml0aW5nKTsKKyAgICB9CisgIH0KKworICBHUFJfVElNRVJfRU5EKCJmaW5hbGl6ZV9vdXRidWYiLCAwKTsKK30KKwordm9pZCBncnBjX2NodHRwMl9jbGVhbnVwX3dyaXRpbmcoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCisgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nKSB7CisgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZzsKKyAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKKworICB3aGlsZSAoZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdHRlbl9zdHJlYW0oCisgICAgICB0cmFuc3BvcnRfZ2xvYmFsLCB0cmFuc3BvcnRfd3JpdGluZywgJnN0cmVhbV9nbG9iYWwsICZzdHJlYW1fd3JpdGluZykpIHsKKyAgICBpZiAoc3RyZWFtX3dyaXRpbmctPnNlbnRfaW5pdGlhbF9tZXRhZGF0YSkgeworICAgICAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKAorICAgICAgICAgIGV4ZWNfY3R4LCAmc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhX2ZpbmlzaGVkLCAxKTsKKyAgICB9CisgICAgaWYgKHN0cmVhbV93cml0aW5nLT5zZW50X21lc3NhZ2UpIHsKKyAgICAgIEdQUl9BU1NFUlQoc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9PSBOVUxMKTsKKyAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKKyAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCwgMSk7CisgICAgICBzdHJlYW1fd3JpdGluZy0+c2VudF9tZXNzYWdlID0gMDsKKyAgICB9CisgICAgaWYgKHN0cmVhbV93cml0aW5nLT5zZW50X3RyYWlsaW5nX21ldGFkYXRhKSB7CisgICAgICBncnBjX2NodHRwMl9jb21wbGV0ZV9jbG9zdXJlX3N0ZXAoCisgICAgICAgICAgZXhlY19jdHgsICZzdHJlYW1fZ2xvYmFsLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkLCAxKTsKKyAgICB9CisgICAgaWYgKHN0cmVhbV93cml0aW5nLT5zZW50X3RyYWlsaW5nX21ldGFkYXRhKSB7CisgICAgICBncnBjX2NodHRwMl9tYXJrX3N0cmVhbV9jbG9zZWQoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRyYW5zcG9ydF9nbG9iYWwtPmlzX2NsaWVudCwgMSk7CisgICAgfQorICAgIEdSUENfQ0hUVFAyX1NUUkVBTV9VTlJFRihleGVjX2N0eCwgc3RyZWFtX2dsb2JhbCwgImNodHRwMl93cml0aW5nIik7CisgIH0KKyAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIGIvc3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzliYjhhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1zdGF0aWMgdm9pZCBmaWxsX2NvbW1vbl9oZWFkZXIoY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3N0cnZlYyAqYnVmKSB7Ci0gIHNpemVfdCBpOwotICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAocmVxdWVzdC0+aHR0cC5wYXRoKSk7Ci0gIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgZ3ByX3N0cmR1cCgiIEhUVFAvMS4wXHJcbiIpKTsKLSAgLyoganVzdCBpbiBjYXNlIHNvbWUgY3Jhenkgc2VydmVyIHJlYWxseSBleHBlY3RzIEhUVFAvMS4xICovCi0gIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgZ3ByX3N0cmR1cCgiSG9zdDogIikpOwotICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAocmVxdWVzdC0+aG9zdCkpOwotICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAoIlxyXG4iKSk7Ci0gIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgZ3ByX3N0cmR1cCgiQ29ubmVjdGlvbjogY2xvc2VcclxuIikpOwotICBncHJfc3RydmVjX2FkZChidWYsCi0gICAgICAgICAgICAgICAgIGdwcl9zdHJkdXAoIlVzZXItQWdlbnQ6ICIgR1JQQ19IVFRQQ0xJX1VTRVJfQUdFTlQgIlxyXG4iKSk7Ci0gIC8qIHVzZXIgc3VwcGxpZWQgaGVhZGVycyAqLwotICBmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+aHR0cC5oZHJfY291bnQ7IGkrKykgewotICAgIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgZ3ByX3N0cmR1cChyZXF1ZXN0LT5odHRwLmhkcnNbaV0ua2V5KSk7Ci0gICAgZ3ByX3N0cnZlY19hZGQoYnVmLCBncHJfc3RyZHVwKCI6ICIpKTsKLSAgICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAocmVxdWVzdC0+aHR0cC5oZHJzW2ldLnZhbHVlKSk7Ci0gICAgZ3ByX3N0cnZlY19hZGQoYnVmLCBncHJfc3RyZHVwKCJcclxuIikpOwotICB9Ci19Ci0KLWdwcl9zbGljZSBncnBjX2h0dHBjbGlfZm9ybWF0X2dldF9yZXF1ZXN0KGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0KSB7Ci0gIGdwcl9zdHJ2ZWMgb3V0OwotICBjaGFyICpmbGF0OwotICBzaXplX3QgZmxhdF9sZW47Ci0KLSAgZ3ByX3N0cnZlY19pbml0KCZvdXQpOwotICBncHJfc3RydmVjX2FkZCgmb3V0LCBncHJfc3RyZHVwKCJHRVQgIikpOwotICBmaWxsX2NvbW1vbl9oZWFkZXIocmVxdWVzdCwgJm91dCk7Ci0gIGdwcl9zdHJ2ZWNfYWRkKCZvdXQsIGdwcl9zdHJkdXAoIlxyXG4iKSk7Ci0KLSAgZmxhdCA9IGdwcl9zdHJ2ZWNfZmxhdHRlbigmb3V0LCAmZmxhdF9sZW4pOwotICBncHJfc3RydmVjX2Rlc3Ryb3koJm91dCk7Ci0KLSAgcmV0dXJuIGdwcl9zbGljZV9uZXcoZmxhdCwgZmxhdF9sZW4sIGdwcl9mcmVlKTsKLX0KLQotZ3ByX3NsaWNlIGdycGNfaHR0cGNsaV9mb3JtYXRfcG9zdF9yZXF1ZXN0KGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJvZHlfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJvZHlfc2l6ZSkgewotICBncHJfc3RydmVjIG91dDsKLSAgY2hhciAqdG1wOwotICBzaXplX3Qgb3V0X2xlbjsKLSAgc2l6ZV90IGk7Ci0KLSAgZ3ByX3N0cnZlY19pbml0KCZvdXQpOwotCi0gIGdwcl9zdHJ2ZWNfYWRkKCZvdXQsIGdwcl9zdHJkdXAoIlBPU1QgIikpOwotICBmaWxsX2NvbW1vbl9oZWFkZXIocmVxdWVzdCwgJm91dCk7Ci0gIGlmIChib2R5X2J5dGVzKSB7Ci0gICAgdWludDhfdCBoYXNfY29udGVudF90eXBlID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+aHR0cC5oZHJfY291bnQ7IGkrKykgewotICAgICAgaWYgKHN0cmNtcChyZXF1ZXN0LT5odHRwLmhkcnNbaV0ua2V5LCAiQ29udGVudC1UeXBlIikgPT0gMCkgewotICAgICAgICBoYXNfY29udGVudF90eXBlID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaGFzX2NvbnRlbnRfdHlwZSkgewotICAgICAgZ3ByX3N0cnZlY19hZGQoJm91dCwgZ3ByX3N0cmR1cCgiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIpKTsKLSAgICB9Ci0gICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJDb250ZW50LUxlbmd0aDogJWx1XHJcbiIsICh1bnNpZ25lZCBsb25nKWJvZHlfc2l6ZSk7Ci0gICAgZ3ByX3N0cnZlY19hZGQoJm91dCwgdG1wKTsKLSAgfQotICBncHJfc3RydmVjX2FkZCgmb3V0LCBncHJfc3RyZHVwKCJcclxuIikpOwotICB0bXAgPSBncHJfc3RydmVjX2ZsYXR0ZW4oJm91dCwgJm91dF9sZW4pOwotICBncHJfc3RydmVjX2Rlc3Ryb3koJm91dCk7Ci0KLSAgaWYgKGJvZHlfYnl0ZXMpIHsKLSAgICB0bXAgPSBncHJfcmVhbGxvYyh0bXAsIG91dF9sZW4gKyBib2R5X3NpemUpOwotICAgIG1lbWNweSh0bXAgKyBvdXRfbGVuLCBib2R5X2J5dGVzLCBib2R5X3NpemUpOwotICAgIG91dF9sZW4gKz0gYm9keV9zaXplOwotICB9Ci0KLSAgcmV0dXJuIGdwcl9zbGljZV9uZXcodG1wLCBvdXRfbGVuLCBncHJfZnJlZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmggYi9zcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDZmYWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSFRUUF9GT1JNQVRfUkVRVUVTVF9ICi0jZGVmaW5lIEdSUENfQ09SRV9IVFRQX0ZPUk1BVF9SRVFVRVNUX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgotCi1ncHJfc2xpY2UgZ3JwY19odHRwY2xpX2Zvcm1hdF9nZXRfcmVxdWVzdChjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCk7Ci1ncHJfc2xpY2UgZ3JwY19odHRwY2xpX2Zvcm1hdF9wb3N0X3JlcXVlc3QoY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYm9keV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYm9keV9zaXplKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9IVFRQX0ZPUk1BVF9SRVFVRVNUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5jIGIvc3JjL2NvcmUvaHR0cC9odHRwY2xpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGQzMzMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaHR0cC9odHRwY2xpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9odHRwL3BhcnNlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncHJfc2xpY2UgcmVxdWVzdF90ZXh0OwotICBncnBjX2h0dHBfcGFyc2VyIHBhcnNlcjsKLSAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJlc3NlczsKLSAgc2l6ZV90IG5leHRfYWRkcmVzczsKLSAgZ3JwY19lbmRwb2ludCAqZXA7Ci0gIGNoYXIgKmhvc3Q7Ci0gIGNoYXIgKnNzbF9ob3N0X292ZXJyaWRlOwotICBncHJfdGltZXNwZWMgZGVhZGxpbmU7Ci0gIGludCBoYXZlX3JlYWRfYnl0ZTsKLSAgY29uc3QgZ3JwY19odHRwY2xpX2hhbmRzaGFrZXIgKmhhbmRzaGFrZXI7Ci0gIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZTsKLSAgdm9pZCAqdXNlcl9kYXRhOwotICBncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dDsKLSAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OwotICBncnBjX2lvbWdyX29iamVjdCBpb21ncl9vYmo7Ci0gIGdwcl9zbGljZV9idWZmZXIgaW5jb21pbmc7Ci0gIGdwcl9zbGljZV9idWZmZXIgb3V0Z29pbmc7Ci0gIGdycGNfY2xvc3VyZSBvbl9yZWFkOwotICBncnBjX2Nsb3N1cmUgZG9uZV93cml0ZTsKLSAgZ3JwY19jbG9zdXJlIGNvbm5lY3RlZDsKLX0gaW50ZXJuYWxfcmVxdWVzdDsKLQotc3RhdGljIGdycGNfaHR0cGNsaV9nZXRfb3ZlcnJpZGUgZ19nZXRfb3ZlcnJpZGUgPSBOVUxMOwotc3RhdGljIGdycGNfaHR0cGNsaV9wb3N0X292ZXJyaWRlIGdfcG9zdF9vdmVycmlkZSA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIHBsYWludGV4dF9oYW5kc2hha2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpvbl9kb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50KSkgewotICBvbl9kb25lKGV4ZWNfY3R4LCBhcmcsIGVuZHBvaW50KTsKLX0KLQotY29uc3QgZ3JwY19odHRwY2xpX2hhbmRzaGFrZXIgZ3JwY19odHRwY2xpX3BsYWludGV4dCA9IHsiaHR0cCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dF9oYW5kc2hha2V9OwotCi12b2lkIGdycGNfaHR0cGNsaV9jb250ZXh0X2luaXQoZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQpIHsKLSAgY29udGV4dC0+cG9sbHNldF9zZXQgPSBncnBjX3BvbGxzZXRfc2V0X2NyZWF0ZSgpOwotfQotCi12b2lkIGdycGNfaHR0cGNsaV9jb250ZXh0X2Rlc3Ryb3koZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQpIHsKLSAgZ3JwY19wb2xsc2V0X3NldF9kZXN0cm95KGNvbnRleHQtPnBvbGxzZXRfc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgbmV4dF9hZGRyZXNzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBpbnRlcm5hbF9yZXF1ZXN0ICpyZXEpOwotCi1zdGF0aWMgdm9pZCBmaW5pc2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludGVybmFsX3JlcXVlc3QgKnJlcSwKLSAgICAgICAgICAgICAgICAgICBpbnQgc3VjY2VzcykgewotICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGV4ZWNfY3R4LCByZXEtPmNvbnRleHQtPnBvbGxzZXRfc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS0+cG9sbHNldCk7Ci0gIHJlcS0+b25fcmVzcG9uc2UoZXhlY19jdHgsIHJlcS0+dXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAmcmVxLT5wYXJzZXIuaHR0cC5yZXNwb25zZSA6IE5VTEwpOwotICBncnBjX2h0dHBfcGFyc2VyX2Rlc3Ryb3koJnJlcS0+cGFyc2VyKTsKLSAgaWYgKHJlcS0+YWRkcmVzc2VzICE9IE5VTEwpIHsKLSAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlcS0+YWRkcmVzc2VzKTsKLSAgfQotICBpZiAocmVxLT5lcCAhPSBOVUxMKSB7Ci0gICAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCByZXEtPmVwKTsKLSAgfQotICBncHJfc2xpY2VfdW5yZWYocmVxLT5yZXF1ZXN0X3RleHQpOwotICBncHJfZnJlZShyZXEtPmhvc3QpOwotICBncHJfZnJlZShyZXEtPnNzbF9ob3N0X292ZXJyaWRlKTsKLSAgZ3JwY19pb21ncl91bnJlZ2lzdGVyX29iamVjdCgmcmVxLT5pb21ncl9vYmopOwotICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnJlcS0+aW5jb21pbmcpOwotICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnJlcS0+b3V0Z29pbmcpOwotICBncHJfZnJlZShyZXEpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2Vzcyk7Ci0KLXN0YXRpYyB2b2lkIGRvX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludGVybmFsX3JlcXVlc3QgKnJlcSkgewotICBncnBjX2VuZHBvaW50X3JlYWQoZXhlY19jdHgsIHJlcS0+ZXAsICZyZXEtPmluY29taW5nLCAmcmVxLT5vbl9yZWFkKTsKLX0KLQotc3RhdGljIHZvaWQgb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLCBib29sIHN1Y2Nlc3MpIHsKLSAgaW50ZXJuYWxfcmVxdWVzdCAqcmVxID0gdXNlcl9kYXRhOwotICBzaXplX3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcmVxLT5pbmNvbWluZy5jb3VudDsgaSsrKSB7Ci0gICAgaWYgKEdQUl9TTElDRV9MRU5HVEgocmVxLT5pbmNvbWluZy5zbGljZXNbaV0pKSB7Ci0gICAgICByZXEtPmhhdmVfcmVhZF9ieXRlID0gMTsKLSAgICAgIGlmICghZ3JwY19odHRwX3BhcnNlcl9wYXJzZSgmcmVxLT5wYXJzZXIsIHJlcS0+aW5jb21pbmcuc2xpY2VzW2ldKSkgewotICAgICAgICBmaW5pc2goZXhlY19jdHgsIHJlcSwgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoc3VjY2VzcykgewotICAgIGRvX3JlYWQoZXhlY19jdHgsIHJlcSk7Ci0gIH0gZWxzZSBpZiAoIXJlcS0+aGF2ZV9yZWFkX2J5dGUpIHsKLSAgICBuZXh0X2FkZHJlc3MoZXhlY19jdHgsIHJlcSk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IHBhcnNlX3N1Y2Nlc3MgPSBncnBjX2h0dHBfcGFyc2VyX2VvZigmcmVxLT5wYXJzZXIpOwotICAgIGlmIChwYXJzZV9zdWNjZXNzICYmIChyZXEtPnBhcnNlci50eXBlICE9IEdSUENfSFRUUF9SRVNQT05TRSkpIHsKLSAgICAgIHBhcnNlX3N1Y2Nlc3MgPSAwOwotICAgIH0KLSAgICBmaW5pc2goZXhlY19jdHgsIHJlcSwgcGFyc2Vfc3VjY2Vzcyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgb25fd3JpdHRlbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgaW50ZXJuYWxfcmVxdWVzdCAqcmVxKSB7Ci0gIGRvX3JlYWQoZXhlY19jdHgsIHJlcSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvbmVfd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7Ci0gIGludGVybmFsX3JlcXVlc3QgKnJlcSA9IGFyZzsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBvbl93cml0dGVuKGV4ZWNfY3R4LCByZXEpOwotICB9IGVsc2UgewotICAgIG5leHRfYWRkcmVzcyhleGVjX2N0eCwgcmVxKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzdGFydF93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgaW50ZXJuYWxfcmVxdWVzdCAqcmVxKSB7Ci0gIGdwcl9zbGljZV9yZWYocmVxLT5yZXF1ZXN0X3RleHQpOwotICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmcmVxLT5vdXRnb2luZywgcmVxLT5yZXF1ZXN0X3RleHQpOwotICBncnBjX2VuZHBvaW50X3dyaXRlKGV4ZWNfY3R4LCByZXEtPmVwLCAmcmVxLT5vdXRnb2luZywgJnJlcS0+ZG9uZV93cml0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2hhbmRzaGFrZV9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICplcCkgewotICBpbnRlcm5hbF9yZXF1ZXN0ICpyZXEgPSBhcmc7Ci0KLSAgaWYgKCFlcCkgewotICAgIG5leHRfYWRkcmVzcyhleGVjX2N0eCwgcmVxKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICByZXEtPmVwID0gZXA7Ci0gIHN0YXJ0X3dyaXRlKGV4ZWNfY3R4LCByZXEpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9jb25uZWN0ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7Ci0gIGludGVybmFsX3JlcXVlc3QgKnJlcSA9IGFyZzsKLQotICBpZiAoIXJlcS0+ZXApIHsKLSAgICBuZXh0X2FkZHJlc3MoZXhlY19jdHgsIHJlcSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJlcS0+aGFuZHNoYWtlci0+aGFuZHNoYWtlKAotICAgICAgZXhlY19jdHgsIHJlcSwgcmVxLT5lcCwKLSAgICAgIHJlcS0+c3NsX2hvc3Rfb3ZlcnJpZGUgPyByZXEtPnNzbF9ob3N0X292ZXJyaWRlIDogcmVxLT5ob3N0LAotICAgICAgb25faGFuZHNoYWtlX2RvbmUpOwotfQotCi1zdGF0aWMgdm9pZCBuZXh0X2FkZHJlc3MoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludGVybmFsX3JlcXVlc3QgKnJlcSkgewotICBncnBjX3Jlc29sdmVkX2FkZHJlc3MgKmFkZHI7Ci0gIGlmIChyZXEtPm5leHRfYWRkcmVzcyA9PSByZXEtPmFkZHJlc3Nlcy0+bmFkZHJzKSB7Ci0gICAgZmluaXNoKGV4ZWNfY3R4LCByZXEsIDApOwotICAgIHJldHVybjsKLSAgfQotICBhZGRyID0gJnJlcS0+YWRkcmVzc2VzLT5hZGRyc1tyZXEtPm5leHRfYWRkcmVzcysrXTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnJlcS0+Y29ubmVjdGVkLCBvbl9jb25uZWN0ZWQsIHJlcSk7Ci0gIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KAotICAgICAgZXhlY19jdHgsICZyZXEtPmNvbm5lY3RlZCwgJnJlcS0+ZXAsIHJlcS0+Y29udGV4dC0+cG9sbHNldF9zZXQsCi0gICAgICAoc3RydWN0IHNvY2thZGRyICopJmFkZHItPmFkZHIsIGFkZHItPmxlbiwgcmVxLT5kZWFkbGluZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX3Jlc29sdmVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcmVzc2VzKSB7Ci0gIGludGVybmFsX3JlcXVlc3QgKnJlcSA9IGFyZzsKLSAgaWYgKCFhZGRyZXNzZXMpIHsKLSAgICBmaW5pc2goZXhlY19jdHgsIHJlcSwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJlcS0+YWRkcmVzc2VzID0gYWRkcmVzc2VzOwotICByZXEtPm5leHRfYWRkcmVzcyA9IDA7Ci0gIG5leHRfYWRkcmVzcyhleGVjX2N0eCwgcmVxKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZXJuYWxfcmVxdWVzdF9iZWdpbigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQsCi0gICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKLSAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZSwKLSAgICB2b2lkICp1c2VyX2RhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGdwcl9zbGljZSByZXF1ZXN0X3RleHQpIHsKLSAgaW50ZXJuYWxfcmVxdWVzdCAqcmVxID0gZ3ByX21hbGxvYyhzaXplb2YoaW50ZXJuYWxfcmVxdWVzdCkpOwotICBtZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwotICByZXEtPnJlcXVlc3RfdGV4dCA9IHJlcXVlc3RfdGV4dDsKLSAgZ3JwY19odHRwX3BhcnNlcl9pbml0KCZyZXEtPnBhcnNlcik7Ci0gIHJlcS0+b25fcmVzcG9uc2UgPSBvbl9yZXNwb25zZTsKLSAgcmVxLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7Ci0gIHJlcS0+ZGVhZGxpbmUgPSBkZWFkbGluZTsKLSAgcmVxLT5oYW5kc2hha2VyID0KLSAgICAgIHJlcXVlc3QtPmhhbmRzaGFrZXIgPyByZXF1ZXN0LT5oYW5kc2hha2VyIDogJmdycGNfaHR0cGNsaV9wbGFpbnRleHQ7Ci0gIHJlcS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0gIHJlcS0+cG9sbHNldCA9IHBvbGxzZXQ7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZyZXEtPm9uX3JlYWQsIG9uX3JlYWQsIHJlcSk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZyZXEtPmRvbmVfd3JpdGUsIGRvbmVfd3JpdGUsIHJlcSk7Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmcmVxLT5pbmNvbWluZyk7Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmcmVxLT5vdXRnb2luZyk7Ci0gIGdycGNfaW9tZ3JfcmVnaXN0ZXJfb2JqZWN0KCZyZXEtPmlvbWdyX29iaiwgbmFtZSk7Ci0gIHJlcS0+aG9zdCA9IGdwcl9zdHJkdXAocmVxdWVzdC0+aG9zdCk7Ci0gIHJlcS0+c3NsX2hvc3Rfb3ZlcnJpZGUgPSBncHJfc3RyZHVwKHJlcXVlc3QtPnNzbF9ob3N0X292ZXJyaWRlKTsKLQotICBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGV4ZWNfY3R4LCByZXEtPmNvbnRleHQtPnBvbGxzZXRfc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS0+cG9sbHNldCk7Ci0gIGdycGNfcmVzb2x2ZV9hZGRyZXNzKHJlcXVlc3QtPmhvc3QsIHJlcS0+aGFuZHNoYWtlci0+ZGVmYXVsdF9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBvbl9yZXNvbHZlZCwgcmVxKTsKLX0KLQotdm9pZCBncnBjX2h0dHBjbGlfZ2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZSwgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGlmIChnX2dldF9vdmVycmlkZSAmJgotICAgICAgZ19nZXRfb3ZlcnJpZGUoZXhlY19jdHgsIHJlcXVlc3QsIGRlYWRsaW5lLCBvbl9yZXNwb25zZSwgdXNlcl9kYXRhKSkgewotICAgIHJldHVybjsKLSAgfQotICBncHJfYXNwcmludGYoJm5hbWUsICJIVFRQOkdFVDolczolcyIsIHJlcXVlc3QtPmhvc3QsIHJlcXVlc3QtPmh0dHAucGF0aCk7Ci0gIGludGVybmFsX3JlcXVlc3RfYmVnaW4oZXhlY19jdHgsIGNvbnRleHQsIHBvbGxzZXQsIHJlcXVlc3QsIGRlYWRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3Jlc3BvbnNlLCB1c2VyX2RhdGEsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19odHRwY2xpX2Zvcm1hdF9nZXRfcmVxdWVzdChyZXF1ZXN0KSk7Ci0gIGdwcl9mcmVlKG5hbWUpOwotfQotCi12b2lkIGdycGNfaHR0cGNsaV9wb3N0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYm9keV9ieXRlcywgc2l6ZV90IGJvZHlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2Igb25fcmVzcG9uc2UsIHZvaWQgKnVzZXJfZGF0YSkgewotICBjaGFyICpuYW1lOwotICBpZiAoZ19wb3N0X292ZXJyaWRlICYmCi0gICAgICBnX3Bvc3Rfb3ZlcnJpZGUoZXhlY19jdHgsIHJlcXVlc3QsIGJvZHlfYnl0ZXMsIGJvZHlfc2l6ZSwgZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgb25fcmVzcG9uc2UsIHVzZXJfZGF0YSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgZ3ByX2FzcHJpbnRmKCZuYW1lLCAiSFRUUDpQT1NUOiVzOiVzIiwgcmVxdWVzdC0+aG9zdCwgcmVxdWVzdC0+aHR0cC5wYXRoKTsKLSAgaW50ZXJuYWxfcmVxdWVzdF9iZWdpbigKLSAgICAgIGV4ZWNfY3R4LCBjb250ZXh0LCBwb2xsc2V0LCByZXF1ZXN0LCBkZWFkbGluZSwgb25fcmVzcG9uc2UsIHVzZXJfZGF0YSwKLSAgICAgIG5hbWUsIGdycGNfaHR0cGNsaV9mb3JtYXRfcG9zdF9yZXF1ZXN0KHJlcXVlc3QsIGJvZHlfYnl0ZXMsIGJvZHlfc2l6ZSkpOwotICBncHJfZnJlZShuYW1lKTsKLX0KLQotdm9pZCBncnBjX2h0dHBjbGlfc2V0X292ZXJyaWRlKGdycGNfaHR0cGNsaV9nZXRfb3ZlcnJpZGUgZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9wb3N0X292ZXJyaWRlIHBvc3QpIHsKLSAgZ19nZXRfb3ZlcnJpZGUgPSBnZXQ7Ci0gIGdfcG9zdF9vdmVycmlkZSA9IHBvc3Q7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9odHRwL2h0dHBjbGkuaCBiL3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmY0ZjJmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2h0dHAvaHR0cGNsaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0hUVFBfSFRUUENMSV9ICi0jZGVmaW5lIEdSUENfQ09SRV9IVFRQX0hUVFBDTElfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9wYXJzZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXQuaCIKLQotLyogVXNlciBhZ2VudCB0aGlzIGxpYnJhcnkgcmVwb3J0cyAqLwotI2RlZmluZSBHUlBDX0hUVFBDTElfVVNFUl9BR0VOVCAiZ3JwYy1odHRwY2xpLzAuMCIKLQotLyogVHJhY2tzIGluLXByb2dyZXNzIGh0dHAgcmVxdWVzdHMKLSAgIFRPRE8oY3RpbGxlcik6IGFsbG93IGNhY2hpbmcgYW5kIGNhcHR1cmluZyBtdWx0aXBsZSByZXF1ZXN0cyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICBzYW1lIGNvbnRlbnQgYW5kIGNvbWJpbmluZyB0aGVtICovCi10eXBlZGVmIHN0cnVjdCBncnBjX2h0dHBjbGlfY29udGV4dCB7Ci0gIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0OwotfSBncnBjX2h0dHBjbGlfY29udGV4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQ7Ci0gIHZvaWQgKCpoYW5kc2hha2UpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LAotICAgICAgICAgICAgICAgICAgICB2b2lkICgqb25fZG9uZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50KSk7Ci19IGdycGNfaHR0cGNsaV9oYW5kc2hha2VyOwotCi1leHRlcm4gY29uc3QgZ3JwY19odHRwY2xpX2hhbmRzaGFrZXIgZ3JwY19odHRwY2xpX3BsYWludGV4dDsKLWV4dGVybiBjb25zdCBncnBjX2h0dHBjbGlfaGFuZHNoYWtlciBncnBjX2h0dHBjbGlfc3NsOwotCi0vKiBBIHJlcXVlc3QgKi8KLXR5cGVkZWYgc3RydWN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0IHsKLSAgLyogVGhlIGhvc3QgbmFtZSB0byBjb25uZWN0IHRvICovCi0gIGNoYXIgKmhvc3Q7Ci0gIC8qIFRoZSBob3N0IHRvIHZlcmlmeSBpbiB0aGUgU1NMIGhhbmRzaGFrZSAob3IgTlVMTCkgKi8KLSAgY2hhciAqc3NsX2hvc3Rfb3ZlcnJpZGU7Ci0gIC8qIFRoZSBtYWluIHBhcnQgb2YgdGhlIHJlcXVlc3QKLSAgICAgVGhlIGZvbGxvd2luZyBoZWFkZXJzIGFyZSBzdXBwbGllZCBhdXRvbWF0aWNhbGx5IGFuZCBNVVNUIE5PVCBiZSBzZXQgaGVyZToKLSAgICAgSG9zdCwgQ29ubmVjdGlvbiwgVXNlci1BZ2VudCAqLwotICBncnBjX2h0dHBfcmVxdWVzdCBodHRwOwotICAvKiBoYW5kc2hha2VyIHRvIHVzZSBzc2wgZm9yIHRoZSByZXF1ZXN0ICovCi0gIGNvbnN0IGdycGNfaHR0cGNsaV9oYW5kc2hha2VyICpoYW5kc2hha2VyOwotfSBncnBjX2h0dHBjbGlfcmVxdWVzdDsKLQotLyogRXhwb3NlIHRoZSBwYXJzZXIgcmVzcG9uc2UgdHlwZSBhcyBhIGh0dHBjbGkgcmVzcG9uc2UgdG9vICovCi10eXBlZGVmIHN0cnVjdCBncnBjX2h0dHBfcmVzcG9uc2UgZ3JwY19odHRwY2xpX3Jlc3BvbnNlOwotCi0vKiBDYWxsYmFjayBmb3IgZ3JwY19odHRwY2xpX2dldCBhbmQgZ3JwY19odHRwY2xpX3Bvc3QuICovCi10eXBlZGVmIHZvaWQgKCpncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cF9yZXNwb25zZSAqcmVzcG9uc2UpOwotCi12b2lkIGdycGNfaHR0cGNsaV9jb250ZXh0X2luaXQoZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQpOwotdm9pZCBncnBjX2h0dHBjbGlfY29udGV4dF9kZXN0cm95KGdycGNfaHR0cGNsaV9jb250ZXh0ICpjb250ZXh0KTsKLQotLyogQXN5bmNocm9ub3VzbHkgcGVyZm9ybSBhIEhUVFAgR0VULgotICAgJ2NvbnRleHQnIHNwZWNpZmllcyB0aGUgaHR0cCBjb250ZXh0IHVuZGVyIHdoaWNoIHRvIGRvIHRoZSBnZXQKLSAgICdwb2xsc2V0JyBpbmRpY2F0ZXMgYSBncnBjX3BvbGxzZXQgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHRoZSByZXN1bHQKLSAgICAgb2YgdGhlIGdldCAtIHdvcmsgb24gdGhpcyBwb2xsc2V0IG1heSBiZSB1c2VkIHRvIHByb2dyZXNzIHRoZSBnZXQKLSAgICAgb3BlcmF0aW9uCi0gICAncmVxdWVzdCcgY29udGFpbnMgcmVxdWVzdCBwYXJhbWV0ZXJzIC0gdGhlc2UgYXJlIGNhbGxlciBvd25lZCBhbmQgY2FuIGJlCi0gICAgIGRlc3Ryb3llZCBvbmNlIHRoZSBjYWxsIHJldHVybnMKLSAgICdkZWFkbGluZScgY29udGFpbnMgYSBkZWFkbGluZSBmb3IgdGhlIHJlcXVlc3QgKG9yIGdwcl9pbmZfZnV0dXJlKQotICAgJ29uX3Jlc3BvbnNlJyBpcyBhIGNhbGxiYWNrIHRvIHJlcG9ydCByZXN1bHRzIHRvIChhbmQgJ3VzZXJfZGF0YScgaXMgYSB1c2VyCi0gICAgIHN1cHBsaWVkIHBvaW50ZXIgdG8gcGFzcyB0byBzYWlkIGNhbGwpICovCi12b2lkIGdycGNfaHR0cGNsaV9nZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfaHR0cGNsaV9jb250ZXh0ICpjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIG9uX3Jlc3BvbnNlLCB2b2lkICp1c2VyX2RhdGEpOwotCi0vKiBBc3luY2hyb25vdXNseSBwZXJmb3JtIGEgSFRUUCBQT1NULgotICAgJ2NvbnRleHQnIHNwZWNpZmllcyB0aGUgaHR0cCBjb250ZXh0IHVuZGVyIHdoaWNoIHRvIGRvIHRoZSBwb3N0Ci0gICAncG9sbHNldCcgaW5kaWNhdGVzIGEgZ3JwY19wb2xsc2V0IHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB0aGUgcmVzdWx0Ci0gICAgIG9mIHRoZSBwb3N0IC0gd29yayBvbiB0aGlzIHBvbGxzZXQgbWF5IGJlIHVzZWQgdG8gcHJvZ3Jlc3MgdGhlIHBvc3QKLSAgICAgb3BlcmF0aW9uCi0gICAncmVxdWVzdCcgY29udGFpbnMgcmVxdWVzdCBwYXJhbWV0ZXJzIC0gdGhlc2UgYXJlIGNhbGxlciBvd25lZCBhbmQgY2FuIGJlCi0gICAgIGRlc3Ryb3llZCBvbmNlIHRoZSBjYWxsIHJldHVybnMKLSAgICdib2R5X2J5dGVzJyBhbmQgJ2JvZHlfc2l6ZScgc3BlY2lmeSB0aGUgcGF5bG9hZCBmb3IgdGhlIHBvc3QuCi0gICAgIFdoZW4gdGhlcmUgaXMgbm8gYm9keSwgcGFzcyBpbiBOVUxMIGFzIGJvZHlfYnl0ZXMuCi0gICAnZGVhZGxpbmUnIGNvbnRhaW5zIGEgZGVhZGxpbmUgZm9yIHRoZSByZXF1ZXN0IChvciBncHJfaW5mX2Z1dHVyZSkKLSAgICdlbScgcG9pbnRzIHRvIGEgY2FsbGVyIG93bmVkIGV2ZW50IG1hbmFnZXIgdGhhdCBtdXN0IGJlIGFsaXZlIGZvciB0aGUKLSAgICAgbGlmZXRpbWUgb2YgdGhlIHJlcXVlc3QKLSAgICdvbl9yZXNwb25zZScgaXMgYSBjYWxsYmFjayB0byByZXBvcnQgcmVzdWx0cyB0byAoYW5kICd1c2VyX2RhdGEnIGlzIGEgdXNlcgotICAgICBzdXBwbGllZCBwb2ludGVyIHRvIHBhc3MgdG8gc2FpZCBjYWxsKQotICAgRG9lcyBub3Qgc3VwcG9ydCA/dmFyMT12YWwxJnZhcjI9dmFsMiBpbiB0aGUgcGF0aC4gKi8KLXZvaWQgZ3JwY19odHRwY2xpX3Bvc3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfaHR0cGNsaV9jb250ZXh0ICpjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpib2R5X2J5dGVzLCBzaXplX3QgYm9keV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZSwgdm9pZCAqdXNlcl9kYXRhKTsKLQotLyogb3ZlcnJpZGUgZnVuY3Rpb25zIHJldHVybiAxIGlmIHRoZXkgaGFuZGxlZCB0aGUgcmVxdWVzdCwgMCBvdGhlcndpc2UgKi8KLXR5cGVkZWYgaW50ICgqZ3JwY19odHRwY2xpX2dldF9vdmVycmlkZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKLXR5cGVkZWYgaW50ICgqZ3JwY19odHRwY2xpX3Bvc3Rfb3ZlcnJpZGUpKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKLSAgICBjb25zdCBjaGFyICpib2R5X2J5dGVzLCBzaXplX3QgYm9keV9zaXplLCBncHJfdGltZXNwZWMgZGVhZGxpbmUsCi0gICAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIG9uX3Jlc3BvbnNlLCB2b2lkICp1c2VyX2RhdGEpOwotCi12b2lkIGdycGNfaHR0cGNsaV9zZXRfb3ZlcnJpZGUoZ3JwY19odHRwY2xpX2dldF9vdmVycmlkZSBnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19odHRwY2xpX3Bvc3Rfb3ZlcnJpZGUgcG9zdCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSFRUUF9IVFRQQ0xJX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYyBiL3NyYy9jb3JlL2h0dHAvaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhMzJmNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgYmFzZTsKLSAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKmhhbmRzaGFrZXJfZmFjdG9yeTsKLSAgY2hhciAqc2VjdXJlX3BlZXJfbmFtZTsKLX0gZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcjsKLQotc3RhdGljIHZvaWQgaHR0cGNsaV9zc2xfZGVzdHJveShncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MpIHsKLSAgZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9Ci0gICAgICAoZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotICBpZiAoYy0+aGFuZHNoYWtlcl9mYWN0b3J5ICE9IE5VTEwpIHsKLSAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KGMtPmhhbmRzaGFrZXJfZmFjdG9yeSk7Ci0gIH0KLSAgaWYgKGMtPnNlY3VyZV9wZWVyX25hbWUgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+c2VjdXJlX3BlZXJfbmFtZSk7Ci0gIGdwcl9mcmVlKHNjKTsKLX0KLQotc3RhdGljIHZvaWQgaHR0cGNsaV9zc2xfZG9faGFuZHNoYWtlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KLSAgICAgIChncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICB0c2lfaGFuZHNoYWtlciAqaGFuZHNoYWtlcjsKLSAgaWYgKGMtPmhhbmRzaGFrZXJfZmFjdG9yeSA9PSBOVUxMKSB7Ci0gICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUiwgTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJlc3VsdCA9IHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2NyZWF0ZV9oYW5kc2hha2VyKAotICAgICAgYy0+aGFuZHNoYWtlcl9mYWN0b3J5LCBjLT5zZWN1cmVfcGVlcl9uYW1lLCAmaGFuZHNoYWtlcik7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJIYW5kc2hha2VyIGNyZWF0aW9uIGZhaWxlZCB3aXRoIGVycm9yICVzLiIsCi0gICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKLSAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBHUlBDX1NFQ1VSSVRZX0VSUk9SLCBOVUxMLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBncnBjX2RvX3NlY3VyaXR5X2hhbmRzaGFrZShleGVjX2N0eCwgaGFuZHNoYWtlciwgJnNjLT5iYXNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlY3VyZV9lbmRwb2ludCwgY2IsIHVzZXJfZGF0YSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaHR0cGNsaV9zc2xfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjLCB0c2lfcGVlciBwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KLSAgICAgIChncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7Ci0gIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfT0s7Ci0KLSAgLyogQ2hlY2sgdGhlIHBlZXIgbmFtZS4gKi8KLSAgaWYgKGMtPnNlY3VyZV9wZWVyX25hbWUgIT0gTlVMTCAmJgotICAgICAgIXRzaV9zc2xfcGVlcl9tYXRjaGVzX25hbWUoJnBlZXIsIGMtPnNlY3VyZV9wZWVyX25hbWUpKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJQZWVyIG5hbWUgJXMgaXMgbm90IGluIHBlZXIgY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgYy0+c2VjdXJlX3BlZXJfbmFtZSk7Ci0gICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9FUlJPUjsKLSAgfQotICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBzdGF0dXMsIE5VTEwpOwotICB0c2lfcGVlcl9kZXN0cnVjdCgmcGVlcik7Ci19Ci0KLXN0YXRpYyBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl92dGFibGUgaHR0cGNsaV9zc2xfdnRhYmxlID0gewotICAgIGh0dHBjbGlfc3NsX2Rlc3Ryb3ksIGh0dHBjbGlfc3NsX2NoZWNrX3BlZXJ9OwotCi1zdGF0aWMgZ3JwY19zZWN1cml0eV9zdGF0dXMgaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9yb290X2NlcnRzLCBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZSwKLSAgICBjb25zdCBjaGFyICpzZWN1cmVfcGVlcl9uYW1lLCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIGdycGNfaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmM7Ci0KLSAgaWYgKHNlY3VyZV9wZWVyX25hbWUgIT0gTlVMTCAmJiBwZW1fcm9vdF9jZXJ0cyA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgICAiQ2Fubm90IGFzc2VydCBhIHNlY3VyZSBwZWVyIG5hbWUgd2l0aG91dCBhIHRydXN0IHJvb3QuIik7Ci0gICAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7Ci0gIH0KLQotICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcikpOwotICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IpKTsKLQotICBncHJfcmVmX2luaXQoJmMtPmJhc2UuYmFzZS5yZWZjb3VudCwgMSk7Ci0gIGMtPmJhc2UuYmFzZS52dGFibGUgPSAmaHR0cGNsaV9zc2xfdnRhYmxlOwotICBpZiAoc2VjdXJlX3BlZXJfbmFtZSAhPSBOVUxMKSB7Ci0gICAgYy0+c2VjdXJlX3BlZXJfbmFtZSA9IGdwcl9zdHJkdXAoc2VjdXJlX3BlZXJfbmFtZSk7Ci0gIH0KLSAgcmVzdWx0ID0gdHNpX2NyZWF0ZV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSgKLSAgICAgIE5VTEwsIDAsIE5VTEwsIDAsIHBlbV9yb290X2NlcnRzLCBwZW1fcm9vdF9jZXJ0c19zaXplLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgMCwgJmMtPmhhbmRzaGFrZXJfZmFjdG9yeSk7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJIYW5kc2hha2VyIGZhY3RvcnkgY3JlYXRpb24gZmFpbGVkIHdpdGggJXMuIiwKLSAgICAgICAgICAgIHRzaV9yZXN1bHRfdG9fc3RyaW5nKHJlc3VsdCkpOwotICAgIGh0dHBjbGlfc3NsX2Rlc3Ryb3koJmMtPmJhc2UuYmFzZSk7Ci0gICAgKnNjID0gTlVMTDsKLSAgICByZXR1cm4gR1JQQ19TRUNVUklUWV9FUlJPUjsKLSAgfQotICBjLT5iYXNlLmRvX2hhbmRzaGFrZSA9IGh0dHBjbGlfc3NsX2RvX2hhbmRzaGFrZTsKLSAgKnNjID0gJmMtPmJhc2U7Ci0gIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOwotfQotCi0vKiBoYW5kc2hha2VyICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAoKmZ1bmMpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50KTsKLSAgdm9pZCAqYXJnOwotfSBvbl9kb25lX2Nsb3N1cmU7Ci0KLXN0YXRpYyB2b2lkIG9uX3NlY3VyZV90cmFuc3BvcnRfc2V0dXBfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0KSB7Ci0gIG9uX2RvbmVfY2xvc3VyZSAqYyA9IHJwOwotICBpZiAoc3RhdHVzICE9IEdSUENfU0VDVVJJVFlfT0spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNlY3VyZSB0cmFuc3BvcnQgc2V0dXAgZmFpbGVkIHdpdGggZXJyb3IgJWQuIiwgc3RhdHVzKTsKLSAgICBjLT5mdW5jKGV4ZWNfY3R4LCBjLT5hcmcsIE5VTEwpOwotICB9IGVsc2UgewotICAgIGMtPmZ1bmMoZXhlY19jdHgsIGMtPmFyZywgc2VjdXJlX2VuZHBvaW50KTsKLSAgfQotICBncHJfZnJlZShjKTsKLX0KLQotc3RhdGljIHZvaWQgc3NsX2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICp0Y3AsIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpvbl9kb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQpKSB7Ci0gIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjID0gTlVMTDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX3Jvb3RfY2VydHMgPSBOVUxMOwotICBvbl9kb25lX2Nsb3N1cmUgKmMgPSBncHJfbWFsbG9jKHNpemVvZigqYykpOwotICBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZSA9IGdycGNfZ2V0X2RlZmF1bHRfc3NsX3Jvb3RzKCZwZW1fcm9vdF9jZXJ0cyk7Ci0gIGlmIChwZW1fcm9vdF9jZXJ0cyA9PSBOVUxMIHx8IHBlbV9yb290X2NlcnRzX3NpemUgPT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBkZWZhdWx0IHBlbSByb290IGNlcnRzLiIpOwotICAgIG9uX2RvbmUoZXhlY19jdHgsIGFyZywgTlVMTCk7Ci0gICAgZ3ByX2ZyZWUoYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGMtPmZ1bmMgPSBvbl9kb25lOwotICBjLT5hcmcgPSBhcmc7Ci0gIEdQUl9BU1NFUlQoaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAotICAgICAgICAgICAgICAgICBwZW1fcm9vdF9jZXJ0cywgcGVtX3Jvb3RfY2VydHNfc2l6ZSwgaG9zdCwgJnNjKSA9PQotICAgICAgICAgICAgIEdSUENfU0VDVVJJVFlfT0spOwotICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKLSAgICAgIGV4ZWNfY3R4LCBzYywgdGNwLCBvbl9zZWN1cmVfdHJhbnNwb3J0X3NldHVwX2RvbmUsIGMpOwotICBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9VTlJFRigmc2MtPmJhc2UsICJodHRwY2xpIik7Ci19Ci0KLWNvbnN0IGdycGNfaHR0cGNsaV9oYW5kc2hha2VyIGdycGNfaHR0cGNsaV9zc2wgPSB7Imh0dHBzIiwgc3NsX2hhbmRzaGFrZX07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9odHRwL3BhcnNlci5jIGIvc3JjL2NvcmUvaHR0cC9wYXJzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlYzhhNS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9odHRwL3BhcnNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9odHRwL3BhcnNlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi1zdGF0aWMgY2hhciAqYnVmMnN0cih2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKLSAgY2hhciAqb3V0ID0gZ3ByX21hbGxvYyhsZW5ndGggKyAxKTsKLSAgbWVtY3B5KG91dCwgYnVmZmVyLCBsZW5ndGgpOwotICBvdXRbbGVuZ3RoXSA9IDA7Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX3Jlc3BvbnNlX2xpbmUoZ3JwY19odHRwX3BhcnNlciAqcGFyc2VyKSB7Ci0gIHVpbnQ4X3QgKmJlZyA9IHBhcnNlci0+Y3VyX2xpbmU7Ci0gIHVpbnQ4X3QgKmN1ciA9IGJlZzsKLSAgdWludDhfdCAqZW5kID0gYmVnICsgcGFyc2VyLT5jdXJfbGluZV9sZW5ndGg7Ci0KLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdIJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdUJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdUJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdQJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICcvJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICcxJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICcuJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1ciA8ICcwJyB8fCAqY3VyKysgPiAnMScpIGdvdG8gZXJyb3I7Ci0gIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnICcpIGdvdG8gZXJyb3I7Ci0gIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIgPCAnMScgfHwgKmN1cisrID4gJzknKSBnb3RvIGVycm9yOwotICBpZiAoY3VyID09IGVuZCB8fCAqY3VyIDwgJzAnIHx8ICpjdXIrKyA+ICc5JykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1ciA8ICcwJyB8fCAqY3VyKysgPiAnOScpIGdvdG8gZXJyb3I7Ci0gIHBhcnNlci0+aHR0cC5yZXNwb25zZS5zdGF0dXMgPQotICAgICAgKGN1clstM10gLSAnMCcpICogMTAwICsgKGN1clstMl0gLSAnMCcpICogMTAgKyAoY3VyWy0xXSAtICcwJyk7Ci0gIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnICcpIGdvdG8gZXJyb3I7Ci0KLSAgLyogd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIHN0YXR1cyBjb2RlIG1lc3NhZ2UgKi8KLQotICByZXR1cm4gMTsKLQotZXJyb3I6Ci0gIGdwcl9sb2coR1BSX0VSUk9SLCAiRmFpbGVkIHBhcnNpbmcgcmVzcG9uc2UgbGluZSIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfcmVxdWVzdF9saW5lKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgewotICB1aW50OF90ICpiZWcgPSBwYXJzZXItPmN1cl9saW5lOwotICB1aW50OF90ICpjdXIgPSBiZWc7Ci0gIHVpbnQ4X3QgKmVuZCA9IGJlZyArIHBhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoOwotICB1aW50OF90IHZlcnNfbWFqb3IgPSAwOwotICB1aW50OF90IHZlcnNfbWlub3IgPSAwOwotCi0gIHdoaWxlIChjdXIgIT0gZW5kICYmICpjdXIrKyAhPSAnICcpCi0gICAgOwotICBpZiAoY3VyID09IGVuZCkgZ290byBlcnJvcjsKLSAgcGFyc2VyLT5odHRwLnJlcXVlc3QubWV0aG9kID0gYnVmMnN0cihiZWcsIChzaXplX3QpKGN1ciAtIGJlZyAtIDEpKTsKLQotICBiZWcgPSBjdXI7Ci0gIHdoaWxlIChjdXIgIT0gZW5kICYmICpjdXIrKyAhPSAnICcpCi0gICAgOwotICBpZiAoY3VyID09IGVuZCkgZ290byBlcnJvcjsKLSAgcGFyc2VyLT5odHRwLnJlcXVlc3QucGF0aCA9IGJ1ZjJzdHIoYmVnLCAoc2l6ZV90KShjdXIgLSBiZWcgLSAxKSk7Ci0KLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdIJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdUJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdUJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICdQJykgZ290byBlcnJvcjsKLSAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1cisrICE9ICcvJykgZ290byBlcnJvcjsKLSAgdmVyc19tYWpvciA9ICh1aW50OF90KSgqY3VyKysgLSAnMScgKyAxKTsKLSAgKytjdXI7Ci0gIGlmIChjdXIgPT0gZW5kKSBnb3RvIGVycm9yOwotICB2ZXJzX21pbm9yID0gKHVpbnQ4X3QpKCpjdXIrKyAtICcxJyArIDEpOwotCi0gIGlmICh2ZXJzX21ham9yID09IDEpIHsKLSAgICBpZiAodmVyc19taW5vciA9PSAwKSB7Ci0gICAgICBwYXJzZXItPmh0dHAucmVxdWVzdC52ZXJzaW9uID0gR1JQQ19IVFRQX0hUVFAxMDsKLSAgICB9IGVsc2UgaWYgKHZlcnNfbWlub3IgPT0gMSkgewotICAgICAgcGFyc2VyLT5odHRwLnJlcXVlc3QudmVyc2lvbiA9IEdSUENfSFRUUF9IVFRQMTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICB9IGVsc2UgaWYgKHZlcnNfbWFqb3IgPT0gMikgewotICAgIGlmICh2ZXJzX21pbm9yID09IDApIHsKLSAgICAgIHBhcnNlci0+aHR0cC5yZXF1ZXN0LnZlcnNpb24gPSBHUlBDX0hUVFBfSFRUUDIwOwotICAgIH0gZWxzZSB7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci0KLWVycm9yOgotICBncHJfbG9nKEdQUl9FUlJPUiwgIkZhaWxlZCBwYXJzaW5nIHJlcXVlc3QgbGluZSIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfZmlyc3RfbGluZShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpIHsKLSAgaWYgKHBhcnNlci0+Y3VyX2xpbmVbMF0gPT0gJ0gnKSB7Ci0gICAgcGFyc2VyLT50eXBlID0gR1JQQ19IVFRQX1JFU1BPTlNFOwotICAgIHJldHVybiBoYW5kbGVfcmVzcG9uc2VfbGluZShwYXJzZXIpOwotICB9IGVsc2UgewotICAgIHBhcnNlci0+dHlwZSA9IEdSUENfSFRUUF9SRVFVRVNUOwotICAgIHJldHVybiBoYW5kbGVfcmVxdWVzdF9saW5lKHBhcnNlcik7Ci0gIH0KLX0KLQotc3RhdGljIGludCBhZGRfaGVhZGVyKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgewotICB1aW50OF90ICpiZWcgPSBwYXJzZXItPmN1cl9saW5lOwotICB1aW50OF90ICpjdXIgPSBiZWc7Ci0gIHVpbnQ4X3QgKmVuZCA9IGJlZyArIHBhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoOwotICBzaXplX3QgKmhkcl9jb3VudCA9IE5VTEw7Ci0gIGdycGNfaHR0cF9oZWFkZXIgKipoZHJzID0gTlVMTDsKLSAgZ3JwY19odHRwX2hlYWRlciBoZHIgPSB7TlVMTCwgTlVMTH07Ci0KLSAgR1BSX0FTU0VSVChjdXIgIT0gZW5kKTsKLQotICBpZiAoKmN1ciA9PSAnICcgfHwgKmN1ciA9PSAnXHQnKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb250aW51ZWQgaGVhZGVyIGxpbmVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHdoaWxlIChjdXIgIT0gZW5kICYmICpjdXIgIT0gJzonKSB7Ci0gICAgY3VyKys7Ci0gIH0KLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkRpZG4ndCBmaW5kICc6JyBpbiBoZWFkZXIgc3RyaW5nIik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBHUFJfQVNTRVJUKGN1ciA+PSBiZWcpOwotICBoZHIua2V5ID0gYnVmMnN0cihiZWcsIChzaXplX3QpKGN1ciAtIGJlZykpOwotICBjdXIrKzsgLyogc2tpcCA6ICovCi0KLSAgd2hpbGUgKGN1ciAhPSBlbmQgJiYgKCpjdXIgPT0gJyAnIHx8ICpjdXIgPT0gJ1x0JykpIHsKLSAgICBjdXIrKzsKLSAgfQotICBHUFJfQVNTRVJUKGVuZCAtIGN1ciA+PSAyKTsKLSAgaGRyLnZhbHVlID0gYnVmMnN0cihjdXIsIChzaXplX3QpKGVuZCAtIGN1cikgLSAyKTsKLQotICBpZiAocGFyc2VyLT50eXBlID09IEdSUENfSFRUUF9SRVNQT05TRSkgewotICAgIGhkcl9jb3VudCA9ICZwYXJzZXItPmh0dHAucmVzcG9uc2UuaGRyX2NvdW50OwotICAgIGhkcnMgPSAmcGFyc2VyLT5odHRwLnJlc3BvbnNlLmhkcnM7Ci0gIH0gZWxzZSBpZiAocGFyc2VyLT50eXBlID09IEdSUENfSFRUUF9SRVFVRVNUKSB7Ci0gICAgaGRyX2NvdW50ID0gJnBhcnNlci0+aHR0cC5yZXF1ZXN0Lmhkcl9jb3VudDsKLSAgICBoZHJzID0gJnBhcnNlci0+aHR0cC5yZXF1ZXN0LmhkcnM7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoKmhkcl9jb3VudCA9PSBwYXJzZXItPmhkcl9jYXBhY2l0eSkgewotICAgIHBhcnNlci0+aGRyX2NhcGFjaXR5ID0KLSAgICAgICAgR1BSX01BWChwYXJzZXItPmhkcl9jYXBhY2l0eSArIDEsIHBhcnNlci0+aGRyX2NhcGFjaXR5ICogMyAvIDIpOwotICAgICpoZHJzID0gZ3ByX3JlYWxsb2MoKmhkcnMsIHBhcnNlci0+aGRyX2NhcGFjaXR5ICogc2l6ZW9mKCoqaGRycykpOwotICB9Ci0gICgqaGRycylbKCpoZHJfY291bnQpKytdID0gaGRyOwotICByZXR1cm4gMTsKLQotZXJyb3I6Ci0gIGdwcl9mcmVlKGhkci5rZXkpOwotICBncHJfZnJlZShoZHIudmFsdWUpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmaW5pc2hfbGluZShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpIHsKLSAgc3dpdGNoIChwYXJzZXItPnN0YXRlKSB7Ci0gICAgY2FzZSBHUlBDX0hUVFBfRklSU1RfTElORToKLSAgICAgIGlmICghaGFuZGxlX2ZpcnN0X2xpbmUocGFyc2VyKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0hUVFBfSEVBREVSUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1JQQ19IVFRQX0hFQURFUlM6Ci0gICAgICBpZiAocGFyc2VyLT5jdXJfbGluZV9sZW5ndGggPT0gMikgewotICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19IVFRQX0JPRFk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKCFhZGRfaGVhZGVyKHBhcnNlcikpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfSFRUUF9CT0RZOgotICAgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuIDApOwotICB9Ci0KLSAgcGFyc2VyLT5jdXJfbGluZV9sZW5ndGggPSAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBhZGRieXRlX2JvZHkoZ3JwY19odHRwX3BhcnNlciAqcGFyc2VyLCB1aW50OF90IGJ5dGUpIHsKLSAgc2l6ZV90ICpib2R5X2xlbmd0aCA9IE5VTEw7Ci0gIGNoYXIgKipib2R5ID0gTlVMTDsKLQotICBpZiAocGFyc2VyLT50eXBlID09IEdSUENfSFRUUF9SRVNQT05TRSkgewotICAgIGJvZHlfbGVuZ3RoID0gJnBhcnNlci0+aHR0cC5yZXNwb25zZS5ib2R5X2xlbmd0aDsKLSAgICBib2R5ID0gJnBhcnNlci0+aHR0cC5yZXNwb25zZS5ib2R5OwotICB9IGVsc2UgaWYgKHBhcnNlci0+dHlwZSA9PSBHUlBDX0hUVFBfUkVRVUVTVCkgewotICAgIGJvZHlfbGVuZ3RoID0gJnBhcnNlci0+aHR0cC5yZXF1ZXN0LmJvZHlfbGVuZ3RoOwotICAgIGJvZHkgPSAmcGFyc2VyLT5odHRwLnJlcXVlc3QuYm9keTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICgqYm9keV9sZW5ndGggPT0gcGFyc2VyLT5ib2R5X2NhcGFjaXR5KSB7Ci0gICAgcGFyc2VyLT5ib2R5X2NhcGFjaXR5ID0gR1BSX01BWCg4LCBwYXJzZXItPmJvZHlfY2FwYWNpdHkgKiAzIC8gMik7Ci0gICAgKmJvZHkgPSBncHJfcmVhbGxvYygodm9pZCAqKSpib2R5LCBwYXJzZXItPmJvZHlfY2FwYWNpdHkpOwotICB9Ci0gICgqYm9keSlbKmJvZHlfbGVuZ3RoXSA9IChjaGFyKWJ5dGU7Ci0gICgqYm9keV9sZW5ndGgpKys7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgYWRkYnl0ZShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIsIHVpbnQ4X3QgYnl0ZSkgewotICBzd2l0Y2ggKHBhcnNlci0+c3RhdGUpIHsKLSAgICBjYXNlIEdSUENfSFRUUF9GSVJTVF9MSU5FOgotICAgIGNhc2UgR1JQQ19IVFRQX0hFQURFUlM6Ci0gICAgICBpZiAocGFyc2VyLT5jdXJfbGluZV9sZW5ndGggPj0gR1JQQ19IVFRQX1BBUlNFUl9NQVhfSEVBREVSX0xFTkdUSCkgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhUVFAgY2xpZW50IG1heCBsaW5lIGxlbmd0aCAoJWQpIGV4Y2VlZGVkIiwKLSAgICAgICAgICAgICAgICBHUlBDX0hUVFBfUEFSU0VSX01BWF9IRUFERVJfTEVOR1RIKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBwYXJzZXItPmN1cl9saW5lW3BhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoXSA9IGJ5dGU7Ci0gICAgICBwYXJzZXItPmN1cl9saW5lX2xlbmd0aCsrOwotICAgICAgaWYgKHBhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoID49IDIgJiYKLSAgICAgICAgICBwYXJzZXItPmN1cl9saW5lW3BhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoIC0gMl0gPT0gJ1xyJyAmJgotICAgICAgICAgIHBhcnNlci0+Y3VyX2xpbmVbcGFyc2VyLT5jdXJfbGluZV9sZW5ndGggLSAxXSA9PSAnXG4nKSB7Ci0gICAgICAgIHJldHVybiBmaW5pc2hfbGluZShwYXJzZXIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Ci0gICAgY2FzZSBHUlBDX0hUVFBfQk9EWToKLSAgICAgIHJldHVybiBhZGRieXRlX2JvZHkocGFyc2VyLCBieXRlKTsKLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Ci19Ci0KLXZvaWQgZ3JwY19odHRwX3BhcnNlcl9pbml0KGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgewotICBtZW1zZXQocGFyc2VyLCAwLCBzaXplb2YoKnBhcnNlcikpOwotICBwYXJzZXItPnN0YXRlID0gR1JQQ19IVFRQX0ZJUlNUX0xJTkU7Ci0gIHBhcnNlci0+dHlwZSA9IEdSUENfSFRUUF9VTktOT1dOOwotfQotCi12b2lkIGdycGNfaHR0cF9wYXJzZXJfZGVzdHJveShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpIHsKLSAgc2l6ZV90IGk7Ci0gIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFU1BPTlNFKSB7Ci0gICAgZ3ByX2ZyZWUocGFyc2VyLT5odHRwLnJlc3BvbnNlLmJvZHkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwYXJzZXItPmh0dHAucmVzcG9uc2UuaGRyX2NvdW50OyBpKyspIHsKLSAgICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXNwb25zZS5oZHJzW2ldLmtleSk7Ci0gICAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVzcG9uc2UuaGRyc1tpXS52YWx1ZSk7Ci0gICAgfQotICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXNwb25zZS5oZHJzKTsKLSAgfSBlbHNlIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFUVVFU1QpIHsKLSAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVxdWVzdC5ib2R5KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcGFyc2VyLT5odHRwLnJlcXVlc3QuaGRyX2NvdW50OyBpKyspIHsKLSAgICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXF1ZXN0LmhkcnNbaV0ua2V5KTsKLSAgICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXF1ZXN0LmhkcnNbaV0udmFsdWUpOwotICAgIH0KLSAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVxdWVzdC5oZHJzKTsKLSAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVxdWVzdC5tZXRob2QpOwotICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXF1ZXN0LnBhdGgpOwotICB9Ci19Ci0KLWludCBncnBjX2h0dHBfcGFyc2VyX3BhcnNlKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlciwgZ3ByX3NsaWNlIHNsaWNlKSB7Ci0gIHNpemVfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKTsgaSsrKSB7Ci0gICAgaWYgKCFhZGRieXRlKHBhcnNlciwgR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSlbaV0pKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotaW50IGdycGNfaHR0cF9wYXJzZXJfZW9mKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgewotICByZXR1cm4gcGFyc2VyLT5zdGF0ZSA9PSBHUlBDX0hUVFBfQk9EWTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2h0dHAvcGFyc2VyLmggYi9zcmMvY29yZS9odHRwL3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTUxN2U0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2h0dHAvcGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSFRUUF9QQVJTRVJfSAotI2RlZmluZSBHUlBDX0NPUkVfSFRUUF9QQVJTRVJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLQotLyogTWF4aW11bSBsZW5ndGggb2YgYSBoZWFkZXIgc3RyaW5nIG9mIHRoZSBmb3JtICdLZXk6IFZhbHVlXHJcbicgKi8KLSNkZWZpbmUgR1JQQ19IVFRQX1BBUlNFUl9NQVhfSEVBREVSX0xFTkdUSCA0MDk2Ci0KLS8qIEEgc2luZ2xlIGhlYWRlciB0byBiZSBwYXNzZWQgaW4gYSByZXF1ZXN0ICovCi10eXBlZGVmIHN0cnVjdCBncnBjX2h0dHBfaGVhZGVyIHsKLSAgY2hhciAqa2V5OwotICBjaGFyICp2YWx1ZTsKLX0gZ3JwY19odHRwX2hlYWRlcjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19IVFRQX0ZJUlNUX0xJTkUsCi0gIEdSUENfSFRUUF9IRUFERVJTLAotICBHUlBDX0hUVFBfQk9EWQotfSBncnBjX2h0dHBfcGFyc2VyX3N0YXRlOwotCi10eXBlZGVmIGVudW0gewotICBHUlBDX0hUVFBfSFRUUDEwLAotICBHUlBDX0hUVFBfSFRUUDExLAotICBHUlBDX0hUVFBfSFRUUDIwLAotfSBncnBjX2h0dHBfdmVyc2lvbjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19IVFRQX1JFU1BPTlNFLAotICBHUlBDX0hUVFBfUkVRVUVTVCwKLSAgR1JQQ19IVFRQX1VOS05PV04KLX0gZ3JwY19odHRwX3R5cGU7Ci0KLS8qIEEgcmVxdWVzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19odHRwX3JlcXVlc3QgewotICAvKiBNZXRob2Qgb2YgdGhlIHJlcXVlc3QgKGUuZy4gR0VULCBQT1NUKSAqLwotICBjaGFyICptZXRob2Q7Ci0gIC8qIFRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB0byBmZXRjaCAqLwotICBjaGFyICpwYXRoOwotICAvKiBIVFRQIHZlcnNpb24gdG8gdXNlICovCi0gIGdycGNfaHR0cF92ZXJzaW9uIHZlcnNpb247Ci0gIC8qIEhlYWRlcnMgYXR0YWNoZWQgdG8gdGhlIHJlcXVlc3QgKi8KLSAgc2l6ZV90IGhkcl9jb3VudDsKLSAgZ3JwY19odHRwX2hlYWRlciAqaGRyczsKLSAgLyogQm9keTogbGVuZ3RoIGFuZCBjb250ZW50czsgY29udGVudHMgYXJlIE5PVCBudWxsLXRlcm1pbmF0ZWQgKi8KLSAgc2l6ZV90IGJvZHlfbGVuZ3RoOwotICBjaGFyICpib2R5OwotfSBncnBjX2h0dHBfcmVxdWVzdDsKLQotLyogQSByZXNwb25zZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19odHRwX3Jlc3BvbnNlIHsKLSAgLyogSFRUUCBzdGF0dXMgY29kZSAqLwotICBpbnQgc3RhdHVzOwotICAvKiBIZWFkZXJzOiBjb3VudCBhbmQga2V5L3ZhbHVlcyAqLwotICBzaXplX3QgaGRyX2NvdW50OwotICBncnBjX2h0dHBfaGVhZGVyICpoZHJzOwotICAvKiBCb2R5OiBsZW5ndGggYW5kIGNvbnRlbnRzOyBjb250ZW50cyBhcmUgTk9UIG51bGwtdGVybWluYXRlZCAqLwotICBzaXplX3QgYm9keV9sZW5ndGg7Ci0gIGNoYXIgKmJvZHk7Ci19IGdycGNfaHR0cF9yZXNwb25zZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2h0dHBfcGFyc2VyX3N0YXRlIHN0YXRlOwotICBncnBjX2h0dHBfdHlwZSB0eXBlOwotCi0gIHVuaW9uIHsKLSAgICBncnBjX2h0dHBfcmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgZ3JwY19odHRwX3JlcXVlc3QgcmVxdWVzdDsKLSAgfSBodHRwOwotICBzaXplX3QgYm9keV9jYXBhY2l0eTsKLSAgc2l6ZV90IGhkcl9jYXBhY2l0eTsKLQotICB1aW50OF90IGN1cl9saW5lW0dSUENfSFRUUF9QQVJTRVJfTUFYX0hFQURFUl9MRU5HVEhdOwotICBzaXplX3QgY3VyX2xpbmVfbGVuZ3RoOwotfSBncnBjX2h0dHBfcGFyc2VyOwotCi12b2lkIGdycGNfaHR0cF9wYXJzZXJfaW5pdChncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpOwotdm9pZCBncnBjX2h0dHBfcGFyc2VyX2Rlc3Ryb3koZ3JwY19odHRwX3BhcnNlciAqcGFyc2VyKTsKLQotaW50IGdycGNfaHR0cF9wYXJzZXJfcGFyc2UoZ3JwY19odHRwX3BhcnNlciAqcGFyc2VyLCBncHJfc2xpY2Ugc2xpY2UpOwotaW50IGdycGNfaHR0cF9wYXJzZXJfZW9mKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSFRUUF9QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jIGIvc3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTk2ZjczLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLQotdm9pZCBncnBjX2Nsb3N1cmVfaW5pdChncnBjX2Nsb3N1cmUgKmNsb3N1cmUsIGdycGNfaW9tZ3JfY2JfZnVuYyBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKSB7Ci0gIGNsb3N1cmUtPmNiID0gY2I7Ci0gIGNsb3N1cmUtPmNiX2FyZyA9IGNiX2FyZzsKLSAgY2xvc3VyZS0+ZmluYWxfZGF0YSA9IDA7Ci19Ci0KLXZvaWQgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKGdycGNfY2xvc3VyZV9saXN0ICpjbG9zdXJlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUsIGJvb2wgc3VjY2VzcykgewotICBpZiAoY2xvc3VyZSA9PSBOVUxMKSByZXR1cm47Ci0gIGNsb3N1cmUtPmZpbmFsX2RhdGEgPSAoc3VjY2VzcyAhPSAwKTsKLSAgaWYgKGNsb3N1cmVfbGlzdC0+aGVhZCA9PSBOVUxMKSB7Ci0gICAgY2xvc3VyZV9saXN0LT5oZWFkID0gY2xvc3VyZTsKLSAgfSBlbHNlIHsKLSAgICBjbG9zdXJlX2xpc3QtPnRhaWwtPmZpbmFsX2RhdGEgfD0gKHVpbnRwdHJfdCljbG9zdXJlOwotICB9Ci0gIGNsb3N1cmVfbGlzdC0+dGFpbCA9IGNsb3N1cmU7Ci19Ci0KLWJvb2wgZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkoZ3JwY19jbG9zdXJlX2xpc3QgY2xvc3VyZV9saXN0KSB7Ci0gIHJldHVybiBjbG9zdXJlX2xpc3QuaGVhZCA9PSBOVUxMOwotfQotCi12b2lkIGdycGNfY2xvc3VyZV9saXN0X21vdmUoZ3JwY19jbG9zdXJlX2xpc3QgKnNyYywgZ3JwY19jbG9zdXJlX2xpc3QgKmRzdCkgewotICBpZiAoc3JjLT5oZWFkID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGRzdC0+aGVhZCA9PSBOVUxMKSB7Ci0gICAgKmRzdCA9ICpzcmM7Ci0gIH0gZWxzZSB7Ci0gICAgZHN0LT50YWlsLT5maW5hbF9kYXRhIHw9ICh1aW50cHRyX3Qpc3JjLT5oZWFkOwotICAgIGRzdC0+dGFpbCA9IHNyYy0+dGFpbDsKLSAgfQotICBzcmMtPmhlYWQgPSBzcmMtPnRhaWwgPSBOVUxMOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfaW9tZ3JfY2JfZnVuYyBjYjsKLSAgdm9pZCAqY2JfYXJnOwotICBncnBjX2Nsb3N1cmUgd3JhcHBlcjsKLX0gd3JhcHBlZF9jbG9zdXJlOwotCi1zdGF0aWMgdm9pZCBjbG9zdXJlX3dyYXBwZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7Ci0gIHdyYXBwZWRfY2xvc3VyZSAqd2MgPSBhcmc7Ci0gIGdycGNfaW9tZ3JfY2JfZnVuYyBjYiA9IHdjLT5jYjsKLSAgdm9pZCAqY2JfYXJnID0gd2MtPmNiX2FyZzsKLSAgZ3ByX2ZyZWUod2MpOwotICBjYihleGVjX2N0eCwgY2JfYXJnLCBzdWNjZXNzKTsKLX0KLQotZ3JwY19jbG9zdXJlICpncnBjX2Nsb3N1cmVfY3JlYXRlKGdycGNfaW9tZ3JfY2JfZnVuYyBjYiwgdm9pZCAqY2JfYXJnKSB7Ci0gIHdyYXBwZWRfY2xvc3VyZSAqd2MgPSBncHJfbWFsbG9jKHNpemVvZigqd2MpKTsKLSAgd2MtPmNiID0gY2I7Ci0gIHdjLT5jYl9hcmcgPSBjYl9hcmc7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZ3Yy0+d3JhcHBlciwgY2xvc3VyZV93cmFwcGVyLCB3Yyk7Ci0gIHJldHVybiAmd2MtPndyYXBwZXI7Ci19Ci0KLWdycGNfY2xvc3VyZSAqZ3JwY19jbG9zdXJlX25leHQoZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIHJldHVybiAoZ3JwY19jbG9zdXJlICopKGNsb3N1cmUtPmZpbmFsX2RhdGEgJiB+KHVpbnRwdHJfdCkxKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuaCBiL3NyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMWY0NS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9jbG9zdXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9DTE9TVVJFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX0NMT1NVUkVfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLXN0cnVjdCBncnBjX2Nsb3N1cmU7Ci10eXBlZGVmIHN0cnVjdCBncnBjX2Nsb3N1cmUgZ3JwY19jbG9zdXJlOwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBleGVjX2N0eC5oICovCi1zdHJ1Y3QgZ3JwY19leGVjX2N0eDsKLXR5cGVkZWYgc3RydWN0IGdycGNfZXhlY19jdHggZ3JwY19leGVjX2N0eDsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jbG9zdXJlX2xpc3QgewotICBncnBjX2Nsb3N1cmUgKmhlYWQ7Ci0gIGdycGNfY2xvc3VyZSAqdGFpbDsKLX0gZ3JwY19jbG9zdXJlX2xpc3Q7Ci0KLS8qKiBnUlBDIENhbGxiYWNrIGRlZmluaXRpb24uCi0gKgotICogXHBhcmFtIGFyZyBBcmJpdHJhcnkgaW5wdXQuCi0gKiBccGFyYW0gc3VjY2VzcyBBbiBpbmRpY2F0aW9uIG9uIHRoZSBzdGF0ZSBvZiB0aGUgaW9tZ3IuIE9uIGZhbHNlLCBjbGVhbnVwCi0gKiBhY3Rpb25zIHNob3VsZCBiZSB0YWtlbiAoZWcsIHNodXRkb3duKS4gKi8KLXR5cGVkZWYgdm9pZCAoKmdycGNfaW9tZ3JfY2JfZnVuYykoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKLQotLyoqIEEgY2xvc3VyZSBvdmVyIGEgZ3JwY19pb21ncl9jYl9mdW5jLiAqLwotc3RydWN0IGdycGNfY2xvc3VyZSB7Ci0gIC8qKiBCb3VuZCBjYWxsYmFjay4gKi8KLSAgZ3JwY19pb21ncl9jYl9mdW5jIGNiOwotCi0gIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvICJjYiIuICovCi0gIHZvaWQgKmNiX2FyZzsKLQotICAvKiogT25jZSBlbnF1ZXVlZCwgY29udGFpbnMgaW4gdGhlIGxvd2VyIGJpdCB0aGUgc3VjY2VzcyBvZiB0aGUgY2xvc3VyZSwKLSAgICAgIGFuZCBpbiB0aGUgdXBwZXIgYml0cyB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBjbG9zdXJlIGluIHRoZSBsaXN0LgotICAgICAgQmVmb3JlIGVucXVlaW5nIGZvciBleGVjdXRpb24sIHRoaXMgaXMgdXNhYmxlIGZvciBzY3JhdGNoIGRhdGEuICovCi0gIHVpbnRwdHJfdCBmaW5hbF9kYXRhOwotfTsKLQotLyoqIEluaXRpYWxpemVzIFxhIGNsb3N1cmUgd2l0aCBcYSBjYiBhbmQgXGEgY2JfYXJnLiAqLwotdm9pZCBncnBjX2Nsb3N1cmVfaW5pdChncnBjX2Nsb3N1cmUgKmNsb3N1cmUsIGdycGNfaW9tZ3JfY2JfZnVuYyBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKTsKLQotLyogQ3JlYXRlIGEgaGVhcCBhbGxvY2F0ZWQgY2xvc3VyZTogdHJ5IHRvIGF2b2lkIGV4Y2VwdCBmb3IgdmVyeSByYXJlIGV2ZW50cyAqLwotZ3JwY19jbG9zdXJlICpncnBjX2Nsb3N1cmVfY3JlYXRlKGdycGNfaW9tZ3JfY2JfZnVuYyBjYiwgdm9pZCAqY2JfYXJnKTsKLQotI2RlZmluZSBHUlBDX0NMT1NVUkVfTElTVF9JTklUIFwKLSAgeyBOVUxMLCBOVUxMIH0KLQotLyoqIGFkZCBcYSBjbG9zdXJlIHRvIHRoZSBlbmQgb2YgXGEgbGlzdCBhbmQgc2V0IFxhIGNsb3N1cmUncyBzdWNjZXNzIHRvIFxhCi0gKiBzdWNjZXNzICovCi12b2lkIGdycGNfY2xvc3VyZV9saXN0X2FkZChncnBjX2Nsb3N1cmVfbGlzdCAqbGlzdCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKLQotLyoqIGFwcGVuZCBhbGwgY2xvc3VyZXMgZnJvbSBcYSBzcmMgdG8gXGEgZHN0IGFuZCBlbXB0eSBcYSBzcmMuICovCi12b2lkIGdycGNfY2xvc3VyZV9saXN0X21vdmUoZ3JwY19jbG9zdXJlX2xpc3QgKnNyYywgZ3JwY19jbG9zdXJlX2xpc3QgKmRzdCk7Ci0KLS8qKiByZXR1cm4gd2hldGhlciBcYSBsaXN0IGlzIGVtcHR5LiAqLwotYm9vbCBncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShncnBjX2Nsb3N1cmVfbGlzdCBsaXN0KTsKLQotLyoqIHJldHVybiB0aGUgbmV4dCBwb2ludGVyIGZvciBhIHF1ZXVlZCBjbG9zdXJlIGxpc3QgKi8KLWdycGNfY2xvc3VyZSAqZ3JwY19jbG9zdXJlX25leHQoZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9DTE9TVVJFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMgYi9zcmMvY29yZS9pb21nci9lbmRwb2ludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDY0NzA3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0KLXZvaWQgZ3JwY19lbmRwb2ludF9yZWFkKGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LCBncnBjX2VuZHBvaW50KiBlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIHNsaWNlcywgZ3JwY19jbG9zdXJlKiBjYikgewotICBlcC0+dnRhYmxlLT5yZWFkKGV4ZWNfY3R4LCBlcCwgc2xpY2VzLCBjYik7Ci19Ci0KLXZvaWQgZ3JwY19lbmRwb2ludF93cml0ZShncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19lbmRwb2ludCogZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciogc2xpY2VzLCBncnBjX2Nsb3N1cmUqIGNiKSB7Ci0gIGVwLT52dGFibGUtPndyaXRlKGV4ZWNfY3R4LCBlcCwgc2xpY2VzLCBjYik7Ci19Ci0KLXZvaWQgZ3JwY19lbmRwb2ludF9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19lbmRwb2ludCogZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0KiBwb2xsc2V0KSB7Ci0gIGVwLT52dGFibGUtPmFkZF90b19wb2xsc2V0KGV4ZWNfY3R4LCBlcCwgcG9sbHNldCk7Ci19Ci0KLXZvaWQgZ3JwY19lbmRwb2ludF9hZGRfdG9fcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCogZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQqIGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBwb2xsc2V0X3NldCkgewotICBlcC0+dnRhYmxlLT5hZGRfdG9fcG9sbHNldF9zZXQoZXhlY19jdHgsIGVwLCBwb2xsc2V0X3NldCk7Ci19Ci0KLXZvaWQgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19lbmRwb2ludCogZXApIHsKLSAgZXAtPnZ0YWJsZS0+c2h1dGRvd24oZXhlY19jdHgsIGVwKTsKLX0KLQotdm9pZCBncnBjX2VuZHBvaW50X2Rlc3Ryb3koZ3JwY19leGVjX2N0eCogZXhlY19jdHgsIGdycGNfZW5kcG9pbnQqIGVwKSB7Ci0gIGVwLT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIGVwKTsKLX0KLQotY2hhciogZ3JwY19lbmRwb2ludF9nZXRfcGVlcihncnBjX2VuZHBvaW50KiBlcCkgewotICByZXR1cm4gZXAtPnZ0YWJsZS0+Z2V0X3BlZXIoZXApOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCBiL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmU4NTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9FTkRQT0lOVF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9FTkRQT0lOVF9ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXQuaCIKLQotLyogQW4gZW5kcG9pbnQgY2FwcyBhIHN0cmVhbWluZyBjaGFubmVsIGJldHdlZW4gdHdvIGNvbW11bmljYXRpbmcgcHJvY2Vzc2VzLgotICAgRXhhbXBsZXMgbWF5IGJlOiBhIHRjcCBzb2NrZXQsIDxzdGRpbitzdGRvdXQ+LCBvciBzb21lIHNoYXJlZCBtZW1vcnkuICovCi0KLXR5cGVkZWYgc3RydWN0IGdycGNfZW5kcG9pbnQgZ3JwY19lbmRwb2ludDsKLXR5cGVkZWYgc3RydWN0IGdycGNfZW5kcG9pbnRfdnRhYmxlIGdycGNfZW5kcG9pbnRfdnRhYmxlOwotCi1zdHJ1Y3QgZ3JwY19lbmRwb2ludF92dGFibGUgewotICB2b2lkICgqcmVhZCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKLSAgdm9pZCAoKndyaXRlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKLSAgdm9pZCAoKmFkZF90b19wb2xsc2V0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKLSAgdm9pZCAoKmFkZF90b19wb2xsc2V0X3NldCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0KTsKLSAgdm9pZCAoKnNodXRkb3duKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApOwotICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwKTsKLSAgY2hhciAqKCpnZXRfcGVlcikoZ3JwY19lbmRwb2ludCAqZXApOwotfTsKLQotLyogV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgY29ubmVjdGlvbiwgY2FsbHMgdGhlIGNhbGxiYWNrIHdpdGggc2xpY2VzLgotICAgQ2FsbGJhY2sgc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCB0aGUgZW5kcG9pbnQgY2FuIGFjY2VwdCBtb3JlIHJlYWRzLCBmYWlsdXJlCi0gICBpbmRpY2F0ZXMgdGhlIGVuZHBvaW50IGlzIGNsb3NlZC4KLSAgIFZhbGlkIHNsaWNlcyBtYXkgYmUgcGxhY2VkIGludG8gXGEgc2xpY2VzIGV2ZW4gb24gY2FsbGJhY2sgc3VjY2VzcyA9PSAwLiAqLwotdm9pZCBncnBjX2VuZHBvaW50X3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKLQotY2hhciAqZ3JwY19lbmRwb2ludF9nZXRfcGVlcihncnBjX2VuZHBvaW50ICplcCk7Ci0KLS8qIFdyaXRlIHNsaWNlcyBvdXQgdG8gdGhlIHNvY2tldC4KLQotICAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgZm9yIG1vcmUgZGF0YSBhZnRlciB0aGUgZW5kIG9mIHRoZSBjYWxsLCBpdAotICAgcmV0dXJucyBHUlBDX0VORFBPSU5UX0RPTkUuCi0gICBPdGhlcndpc2UgaXQgcmV0dXJucyBHUlBDX0VORFBPSU5UX1BFTkRJTkcgYW5kIGNhbGxzIGNiIHdoZW4gdGhlCi0gICBjb25uZWN0aW9uIGlzIHJlYWR5IGZvciBtb3JlIGRhdGEuCi0gICBcYSBzbGljZXMgbWF5IGJlIG11dGF0ZWQgYXQgd2lsbCBieSB0aGUgZW5kcG9pbnQgdW50aWwgY2IgaXMgY2FsbGVkLgotICAgTm8gZ3VhcmFudGVlIGlzIG1hZGUgdG8gdGhlIGNvbnRlbnQgb2Ygc2xpY2VzIGFmdGVyIGEgd3JpdGUgRVhDRVBUIHRoYXQKLSAgIGl0IGlzIGEgdmFsaWQgc2xpY2UgYnVmZmVyLgotICAgKi8KLXZvaWQgZ3JwY19lbmRwb2ludF93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKLQotLyogQ2F1c2VzIGFueSBwZW5kaW5nIHJlYWQvd3JpdGUgY2FsbGJhY2tzIHRvIHJ1biBpbW1lZGlhdGVseSB3aXRoCi0gICBzdWNjZXNzPT0wICovCi12b2lkIGdycGNfZW5kcG9pbnRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwKTsKLXZvaWQgZ3JwY19lbmRwb2ludF9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCk7Ci0KLS8qIEFkZCBhbiBlbmRwb2ludCB0byBhIHBvbGxzZXQsIHNvIHRoYXQgd2hlbiB0aGUgcG9sbHNldCBpcyBwb2xsZWQsIGV2ZW50cyBmcm9tCi0gICB0aGlzIGVuZHBvaW50IGFyZSBjb25zaWRlcmVkICovCi12b2lkIGdycGNfZW5kcG9pbnRfYWRkX3RvX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Ci12b2lkIGdycGNfZW5kcG9pbnRfYWRkX3RvX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICplcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpOwotCi1zdHJ1Y3QgZ3JwY19lbmRwb2ludCB7Ci0gIGNvbnN0IGdycGNfZW5kcG9pbnRfdnRhYmxlICp2dGFibGU7Ci19OwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX0VORFBPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCBiL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwMTVkOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9FTkRQT0lOVF9QQUlSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX0VORFBPSU5UX1BBSVJfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2VuZHBvaW50ICpjbGllbnQ7Ci0gIGdycGNfZW5kcG9pbnQgKnNlcnZlcjsKLX0gZ3JwY19lbmRwb2ludF9wYWlyOwotCi1ncnBjX2VuZHBvaW50X3BhaXIgZ3JwY19pb21ncl9jcmVhdGVfZW5kcG9pbnRfcGFpcihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlYWRfc2xpY2Vfc2l6ZSk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfRU5EUE9JTlRfUEFJUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDE5YTQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1zdGF0aWMgdm9pZCBjcmVhdGVfc29ja2V0cyhpbnQgc3ZbMl0pIHsKLSAgaW50IGZsYWdzOwotICBncnBjX2NyZWF0ZV9zb2NrZXRwYWlyX2lmX3VuaXgoc3YpOwotICBmbGFncyA9IGZjbnRsKHN2WzBdLCBGX0dFVEZMLCAwKTsKLSAgR1BSX0FTU0VSVChmY250bChzdlswXSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA9PSAwKTsKLSAgZmxhZ3MgPSBmY250bChzdlsxXSwgRl9HRVRGTCwgMCk7Ci0gIEdQUl9BU1NFUlQoZmNudGwoc3ZbMV0sIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPT0gMCk7Ci0gIEdQUl9BU1NFUlQoZ3JwY19zZXRfc29ja2V0X25vX3NpZ3BpcGVfaWZfcG9zc2libGUoc3ZbMF0pKTsKLSAgR1BSX0FTU0VSVChncnBjX3NldF9zb2NrZXRfbm9fc2lncGlwZV9pZl9wb3NzaWJsZShzdlsxXSkpOwotfQotCi1ncnBjX2VuZHBvaW50X3BhaXIgZ3JwY19pb21ncl9jcmVhdGVfZW5kcG9pbnRfcGFpcihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlYWRfc2xpY2Vfc2l6ZSkgewotICBpbnQgc3ZbMl07Ci0gIGdycGNfZW5kcG9pbnRfcGFpciBwOwotICBjaGFyICpmaW5hbF9uYW1lOwotICBjcmVhdGVfc29ja2V0cyhzdik7Ci0KLSAgZ3ByX2FzcHJpbnRmKCZmaW5hbF9uYW1lLCAiJXM6Y2xpZW50IiwgbmFtZSk7Ci0gIHAuY2xpZW50ID0gZ3JwY190Y3BfY3JlYXRlKGdycGNfZmRfY3JlYXRlKHN2WzFdLCBmaW5hbF9uYW1lKSwgcmVhZF9zbGljZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0cGFpci1zZXJ2ZXIiKTsKLSAgZ3ByX2ZyZWUoZmluYWxfbmFtZSk7Ci0gIGdwcl9hc3ByaW50ZigmZmluYWxfbmFtZSwgIiVzOnNlcnZlciIsIG5hbWUpOwotICBwLnNlcnZlciA9IGdycGNfdGNwX2NyZWF0ZShncnBjX2ZkX2NyZWF0ZShzdlswXSwgZmluYWxfbmFtZSksIHJlYWRfc2xpY2Vfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tldHBhaXItY2xpZW50Iik7Ci0gIGdwcl9mcmVlKGZpbmFsX25hbWUpOwotICByZXR1cm4gcDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyBiL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDI0ZjU4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmgiCi0KLXN0YXRpYyB2b2lkIGNyZWF0ZV9zb2NrZXRzKFNPQ0tFVCBzdlsyXSkgewotICBTT0NLRVQgc3ZyX3NvY2sgPSBJTlZBTElEX1NPQ0tFVDsKLSAgU09DS0VUIGxzdF9zb2NrID0gSU5WQUxJRF9TT0NLRVQ7Ci0gIFNPQ0tFVCBjbGlfc29jayA9IElOVkFMSURfU09DS0VUOwotICBTT0NLQUREUl9JTiBhZGRyOwotICBpbnQgYWRkcl9sZW4gPSBzaXplb2YoYWRkcik7Ci0KLSAgbHN0X3NvY2sgPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICBXU0FfRkxBR19PVkVSTEFQUEVEKTsKLSAgR1BSX0FTU0VSVChsc3Rfc29jayAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0KLSAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7Ci0gIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIEdQUl9BU1NFUlQoYmluZChsc3Rfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpICE9Ci0gICAgICAgICAgICAgU09DS0VUX0VSUk9SKTsKLSAgR1BSX0FTU0VSVChsaXN0ZW4obHN0X3NvY2ssIFNPTUFYQ09OTikgIT0gU09DS0VUX0VSUk9SKTsKLSAgR1BSX0FTU0VSVChnZXRzb2NrbmFtZShsc3Rfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcl9sZW4pICE9Ci0gICAgICAgICAgICAgU09DS0VUX0VSUk9SKTsKLQotICBjbGlfc29jayA9IFdTQVNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIFdTQV9GTEFHX09WRVJMQVBQRUQpOwotICBHUFJfQVNTRVJUKGNsaV9zb2NrICE9IElOVkFMSURfU09DS0VUKTsKLQotICBHUFJfQVNTRVJUKFdTQUNvbm5lY3QoY2xpX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgYWRkcl9sZW4sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKTsKLSAgc3ZyX3NvY2sgPSBhY2NlcHQobHN0X3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJfbGVuKTsKLSAgR1BSX0FTU0VSVChzdnJfc29jayAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0KLSAgY2xvc2Vzb2NrZXQobHN0X3NvY2spOwotICBncnBjX3RjcF9wcmVwYXJlX3NvY2tldChjbGlfc29jayk7Ci0gIGdycGNfdGNwX3ByZXBhcmVfc29ja2V0KHN2cl9zb2NrKTsKLQotICBzdlsxXSA9IGNsaV9zb2NrOwotICBzdlswXSA9IHN2cl9zb2NrOwotfQotCi1ncnBjX2VuZHBvaW50X3BhaXIgZ3JwY19pb21ncl9jcmVhdGVfZW5kcG9pbnRfcGFpcihjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlYWRfc2xpY2Vfc2l6ZSkgewotICBTT0NLRVQgc3ZbMl07Ci0gIGdycGNfZW5kcG9pbnRfcGFpciBwOwotICBjcmVhdGVfc29ja2V0cyhzdik7Ci0gIHAuY2xpZW50ID0gZ3JwY190Y3BfY3JlYXRlKGdycGNfd2luc29ja2V0X2NyZWF0ZShzdlsxXSwgImVuZHBvaW50OmNsaWVudCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kcG9pbnQ6c2VydmVyIik7Ci0gIHAuc2VydmVyID0gZ3JwY190Y3BfY3JlYXRlKGdycGNfd2luc29ja2V0X2NyZWF0ZShzdlswXSwgImVuZHBvaW50OnNlcnZlciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kcG9pbnQ6Y2xpZW50Iik7Ci0gIHJldHVybiBwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMgYi9zcmMvY29yZS9pb21nci9leGVjX2N0eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTNmZTQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0KLSNpZm5kZWYgR1JQQ19FWEVDVVRJT05fQ09OVEVYVF9TQU5JVElaRVIKLWJvb2wgZ3JwY19leGVjX2N0eF9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkgewotICBib29sIGRpZF9zb21ldGhpbmcgPSAwOwotICBHUFJfVElNRVJfQkVHSU4oImdycGNfZXhlY19jdHhfZmx1c2giLCAwKTsKLSAgd2hpbGUgKCFncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShleGVjX2N0eC0+Y2xvc3VyZV9saXN0KSkgewotICAgIGdycGNfY2xvc3VyZSAqYyA9IGV4ZWNfY3R4LT5jbG9zdXJlX2xpc3QuaGVhZDsKLSAgICBleGVjX2N0eC0+Y2xvc3VyZV9saXN0LmhlYWQgPSBleGVjX2N0eC0+Y2xvc3VyZV9saXN0LnRhaWwgPSBOVUxMOwotICAgIHdoaWxlIChjICE9IE5VTEwpIHsKLSAgICAgIGJvb2wgc3VjY2VzcyA9IChib29sKShjLT5maW5hbF9kYXRhICYgMSk7Ci0gICAgICBncnBjX2Nsb3N1cmUgKm5leHQgPSAoZ3JwY19jbG9zdXJlICopKGMtPmZpbmFsX2RhdGEgJiB+KHVpbnRwdHJfdCkxKTsKLSAgICAgIGRpZF9zb21ldGhpbmcgPSB0cnVlOwotICAgICAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2V4ZWNfY3R4X2ZsdXNoLmNiIiwgMCk7Ci0gICAgICBjLT5jYihleGVjX2N0eCwgYy0+Y2JfYXJnLCBzdWNjZXNzKTsKLSAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfZXhlY19jdHhfZmx1c2guY2IiLCAwKTsKLSAgICAgIGMgPSBuZXh0OwotICAgIH0KLSAgfQotICBHUFJfVElNRVJfRU5EKCJncnBjX2V4ZWNfY3R4X2ZsdXNoIiwgMCk7Ci0gIHJldHVybiBkaWRfc29tZXRoaW5nOwotfQotCi12b2lkIGdycGNfZXhlY19jdHhfZmluaXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4KSB7Ci0gIGdycGNfZXhlY19jdHhfZmx1c2goZXhlY19jdHgpOwotfQotCi12b2lkIGdycGNfZXhlY19jdHhfZW5xdWV1ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKm9mZmxvYWRfdGFyZ2V0X29yX251bGwpIHsKLSAgR1BSX0FTU0VSVChvZmZsb2FkX3RhcmdldF9vcl9udWxsID09IE5VTEwpOwotICBncnBjX2Nsb3N1cmVfbGlzdF9hZGQoJmV4ZWNfY3R4LT5jbG9zdXJlX2xpc3QsIGNsb3N1cmUsIHN1Y2Nlc3MpOwotfQotCi12b2lkIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmVfbGlzdCAqbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKm9mZmxvYWRfdGFyZ2V0X29yX251bGwpIHsKLSAgR1BSX0FTU0VSVChvZmZsb2FkX3RhcmdldF9vcl9udWxsID09IE5VTEwpOwotICBncnBjX2Nsb3N1cmVfbGlzdF9tb3ZlKGxpc3QsICZleGVjX2N0eC0+Y2xvc3VyZV9saXN0KTsKLX0KLQotdm9pZCBncnBjX2V4ZWNfY3R4X2dsb2JhbF9pbml0KHZvaWQpIHt9Ci12b2lkIGdycGNfZXhlY19jdHhfZ2xvYmFsX3NodXRkb3duKHZvaWQpIHt9Ci0jZWxzZQotc3RhdGljIGdwcl9tdSBnX211Owotc3RhdGljIGdwcl9jdiBnX2N2Owotc3RhdGljIGludCBnX3RocmVhZHMgPSAwOwotCi1zdGF0aWMgdm9pZCBydW5fY2xvc3VyZSh2b2lkICphcmcpIHsKLSAgZ3JwY19jbG9zdXJlICpjbG9zdXJlID0gYXJnOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBjbG9zdXJlLT5jYigmZXhlY19jdHgsIGNsb3N1cmUtPmNiX2FyZywgKGNsb3N1cmUtPmZpbmFsX2RhdGEgJiAxKSAhPSAwKTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgZ3ByX211X2xvY2soJmdfbXUpOwotICBpZiAoLS1nX3RocmVhZHMgPT0gMCkgewotICAgIGdwcl9jdl9zaWduYWwoJmdfY3YpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmdfbXUpOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9jbG9zdXJlKGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgewotICBncHJfdGhkX2lkIGlkOwotICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gIGdfdGhyZWFkcysrOwotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLSAgZ3ByX3RoZF9uZXcoJmlkLCBydW5fY2xvc3VyZSwgY2xvc3VyZSwgTlVMTCk7Ci19Ci0KLWJvb2wgZ3JwY19leGVjX2N0eF9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkgeyByZXR1cm4gZmFsc2U7IH0KLQotdm9pZCBncnBjX2V4ZWNfY3R4X2ZpbmlzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkge30KLQotdm9pZCBncnBjX2V4ZWNfY3R4X2VucXVldWUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2xvc3VyZSAqY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICpvZmZsb2FkX3RhcmdldF9vcl9udWxsKSB7Ci0gIEdQUl9BU1NFUlQob2ZmbG9hZF90YXJnZXRfb3JfbnVsbCA9PSBOVUxMKTsKLSAgaWYgKGNsb3N1cmUgPT0gTlVMTCkgcmV0dXJuOwotICBjbG9zdXJlLT5maW5hbF9kYXRhID0gc3VjY2VzczsKLSAgc3RhcnRfY2xvc3VyZShjbG9zdXJlKTsKLX0KLQotdm9pZCBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlX2xpc3QgKmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICpvZmZsb2FkX3RhcmdldF9vcl9udWxsKSB7Ci0gIEdQUl9BU1NFUlQob2ZmbG9hZF90YXJnZXRfb3JfbnVsbCA9PSBOVUxMKTsKLSAgaWYgKGxpc3QgPT0gTlVMTCkgcmV0dXJuOwotICBncnBjX2Nsb3N1cmUgKnAgPSBsaXN0LT5oZWFkOwotICB3aGlsZSAocCkgewotICAgIGdycGNfY2xvc3VyZSAqc3RhcnQgPSBwOwotICAgIHAgPSBncnBjX2Nsb3N1cmVfbmV4dChzdGFydCk7Ci0gICAgc3RhcnRfY2xvc3VyZShzdGFydCk7Ci0gIH0KLSAgZ3JwY19jbG9zdXJlX2xpc3QgciA9IEdSUENfQ0xPU1VSRV9MSVNUX0lOSVQ7Ci0gICpsaXN0ID0gcjsKLX0KLQotdm9pZCBncnBjX2V4ZWNfY3R4X2dsb2JhbF9pbml0KHZvaWQpIHsKLSAgZ3ByX211X2luaXQoJmdfbXUpOwotICBncHJfY3ZfaW5pdCgmZ19jdik7Ci19Ci0KLXZvaWQgZ3JwY19leGVjX2N0eF9nbG9iYWxfc2h1dGRvd24odm9pZCkgewotICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gIHdoaWxlIChnX3RocmVhZHMgIT0gMCkgewotICAgIGdwcl9jdl93YWl0KCZnX2N2LCAmZ19tdSwgZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKSk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0KLSAgZ3ByX211X2Rlc3Ryb3koJmdfbXUpOwotICBncHJfY3ZfZGVzdHJveSgmZ19jdik7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmggYi9zcmMvY29yZS9pb21nci9leGVjX2N0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2I1NGEwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9FWEVDX0NUWF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9FWEVDX0NUWF9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiCi0KLS8qICNkZWZpbmUgR1JQQ19FWEVDVVRJT05fQ09OVEVYVF9TQU5JVElaRVIgMSAqLwotCi0vKiogQSB3b3JrcXVldWUgcmVwcmVzZW50cyBhIGxpc3Qgb2Ygd29yayB0byBiZSBleGVjdXRlZCBhc3luY2hyb25vdXNseS4KLSAgICBGb3J3YXJkIGRlY2xhcmVkIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggd29ya3F1ZXVlLmguICovCi1zdHJ1Y3QgZ3JwY193b3JrcXVldWU7Ci10eXBlZGVmIHN0cnVjdCBncnBjX3dvcmtxdWV1ZSBncnBjX3dvcmtxdWV1ZTsKLQotI2lmbmRlZiBHUlBDX0VYRUNVVElPTl9DT05URVhUX1NBTklUSVpFUgotLyoqIEV4ZWN1dGlvbiBjb250ZXh0LgotICogIEEgYmFnIG9mIGRhdGEgdGhhdCBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhbG9uZyBhIGNhbGxzdGFjay4KLSAqICBHZW5lcmFsbHkgY3JlYXRlZCBhdCBwdWJsaWMgQVBJIGVudHJ5IHBvaW50cywgYW5kIHBhc3NlZCBkb3duIGFzCi0gKiAgcG9pbnRlciB0byBjaGlsZCBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlIGl0LgotICoKLSAqICBTcGVjaWZpYyByZXNwb25zaWJpbGl0aWVzICh0aGlzIG1heSBncm93IGluIHRoZSBmdXR1cmUpOgotICogIC0gdHJhY2sgYSBsaXN0IG9mIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkZWxheWVkIHVudGlsIHRoZSB0b3Agb2YgdGhlCi0gKiAgICBjYWxsIHN0YWNrICh0aGlzIHByb3ZpZGVzIGEgY29udmVuaWVudCBtZWNoYW5pc20gdG8gcnVuIGNhbGxiYWNrcwotICogICAgd2l0aG91dCB3b3JyeWluZyBhYm91dCBsb2NraW5nIGlzc3VlcykKLSAqCi0gKiAgQ09OVkVOVElPTlM6Ci0gKiAgSW5zdGFuY2Ugb2YgdGhpcyBtdXN0IEFMV0FZUyBiZSBjb25zdHJ1Y3RlZCBvbiB0aGUgc3RhY2ssIG5ldmVyCi0gKiAgaGVhcCBhbGxvY2F0ZWQuIEluc3RhbmNlcyBhbmQgcG9pbnRlcnMgdG8gdGhlbSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQKLSAqICBleGVjX2N0eC4gSW5zdGFuY2VzIGFyZSBhbHdheXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICogIHRvIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdCwgYW5kIGFsd2F5cyBhcyBhIHBvaW50ZXIgKGdycGNfZXhlY19jdHgKLSAqICBpcyBuZXZlciBjb3BpZWQpLgotICovCi1zdHJ1Y3QgZ3JwY19leGVjX2N0eCB7Ci0gIGdycGNfY2xvc3VyZV9saXN0IGNsb3N1cmVfbGlzdDsKLX07Ci0KLSNkZWZpbmUgR1JQQ19FWEVDX0NUWF9JTklUIFwKLSAgeyBHUlBDX0NMT1NVUkVfTElTVF9JTklUIH0KLSNlbHNlCi1zdHJ1Y3QgZ3JwY19leGVjX2N0eCB7Ci0gIGludCB1bnVzZWQ7Ci19OwotI2RlZmluZSBHUlBDX0VYRUNfQ1RYX0lOSVQgXAotICB7IDAgfQotI2VuZGlmCi0KLS8qKiBGbHVzaCBhbnkgd29yayB0aGF0IGhhcyBiZWVuIGVucXVldWVkIG9udG8gdGhpcyBncnBjX2V4ZWNfY3R4LgotICogIENhbGxlciBtdXN0IGd1YXJhbnRlZSB0aGF0IG5vIGludGVyZmVyaW5nIGxvY2tzIGFyZSBoZWxkLgotICogIFJldHVybnMgdHJ1ZSBpZiB3b3JrIHdhcyBwZXJmb3JtZWQsIGZhbHNlIG90aGVyd2lzZS4gKi8KLWJvb2wgZ3JwY19leGVjX2N0eF9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCk7Ci0vKiogRmluaXNoIGFueSBwZW5kaW5nIHdvcmsgZm9yIGEgZ3JwY19leGVjX2N0eC4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlCi0gKiAgdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgb3Igd29yayBtYXkgYmUgbG9zdC4gKi8KLXZvaWQgZ3JwY19leGVjX2N0eF9maW5pc2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgpOwotLyoqIEFkZCBhIGNsb3N1cmUgdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIG5leHQgZmx1c2gvZmluaXNoIHBvaW50ICovCi12b2lkIGdycGNfZXhlY19jdHhfZW5xdWV1ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKm9mZmxvYWRfdGFyZ2V0X29yX251bGwpOwotLyoqIEFkZCBhIGxpc3Qgb2YgY2xvc3VyZXMgdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIG5leHQgZmx1c2gvZmluaXNoIHBvaW50LgotICogIExlYXZlcyBcYSBsaXN0IGVtcHR5LiAqLwotdm9pZCBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlX2xpc3QgKmxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICpvZmZsb2FkX3RhcmdldF9vcl9udWxsKTsKLQotdm9pZCBncnBjX2V4ZWNfY3R4X2dsb2JhbF9pbml0KHZvaWQpOwotdm9pZCBncnBjX2V4ZWNfY3R4X2dsb2JhbF9zaHV0ZG93bih2b2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9FWEVDX0NUWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9leGVjdXRvci5jIGIvc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZDhmMy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9leGVjdXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjdXRvci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19leGVjdXRvcl9kYXRhIHsKLSAgaW50IGJ1c3k7ICAgICAgICAgIC8qKjwgaXMgdGhlIHRocmVhZCBjdXJyZW50bHkgcnVubmluZz8gKi8KLSAgaW50IHNodXR0aW5nX2Rvd247IC8qKjwgaGFzIFxhIGdycGNfc2h1dGRvd24oKSBiZWVuIGludm9rZWQ/ICovCi0gIGludCBwZW5kaW5nX2pvaW47ICAvKio8IGhhcyB0aGUgdGhyZWFkIGZpbmlzaGVkIGJ1dCBub3QgYmVlbiBqb2luZWQ/ICovCi0gIGdycGNfY2xvc3VyZV9saXN0IGNsb3N1cmVzOyAvKio8IGNvbGxlY3Rpb24gb2YgcGVuZGluZyB3b3JrICovCi0gIGdwcl90aGRfaWQgdGlkOyAvKio8IHRocmVhZCBpZCBvZiB0aGUgdGhyZWFkLCBvbmx5IHZhbGlkIGlmIFxhIGJ1c3kgb3IgXGEKLSAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfam9pbiBhcmUgdHJ1ZSAqLwotICBncHJfdGhkX29wdGlvbnMgb3B0aW9uczsKLSAgZ3ByX211IG11OwotfSBncnBjX2V4ZWN1dG9yOwotCi1zdGF0aWMgZ3JwY19leGVjdXRvciBnX2V4ZWN1dG9yOwotCi12b2lkIGdycGNfZXhlY3V0b3JfaW5pdCgpIHsKLSAgbWVtc2V0KCZnX2V4ZWN1dG9yLCAwLCBzaXplb2YoZ3JwY19leGVjdXRvcikpOwotICBncHJfbXVfaW5pdCgmZ19leGVjdXRvci5tdSk7Ci0gIGdfZXhlY3V0b3Iub3B0aW9ucyA9IGdwcl90aGRfb3B0aW9uc19kZWZhdWx0KCk7Ci0gIGdwcl90aGRfb3B0aW9uc19zZXRfam9pbmFibGUoJmdfZXhlY3V0b3Iub3B0aW9ucyk7Ci19Ci0KLS8qIHRocmVhZCBib2R5ICovCi1zdGF0aWMgdm9pZCBjbG9zdXJlX2V4ZWNfdGhyZWFkX2Z1bmModm9pZCAqaWdub3JlZCkgewotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICB3aGlsZSAoMSkgewotICAgIGdwcl9tdV9sb2NrKCZnX2V4ZWN1dG9yLm11KTsKLSAgICBpZiAoZ19leGVjdXRvci5zaHV0dGluZ19kb3duICE9IDApIHsKLSAgICAgIGdwcl9tdV91bmxvY2soJmdfZXhlY3V0b3IubXUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShnX2V4ZWN1dG9yLmNsb3N1cmVzKSkgewotICAgICAgLyogbm8gbW9yZSB3b3JrLCB0aW1lIHRvIGRpZSAqLwotICAgICAgR1BSX0FTU0VSVChnX2V4ZWN1dG9yLmJ1c3kgPT0gMSk7Ci0gICAgICBnX2V4ZWN1dG9yLmJ1c3kgPSAwOwotICAgICAgZ3ByX211X3VubG9jaygmZ19leGVjdXRvci5tdSk7Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoJmV4ZWNfY3R4LCAmZ19leGVjdXRvci5jbG9zdXJlcywgTlVMTCk7Ci0gICAgfQotICAgIGdwcl9tdV91bmxvY2soJmdfZXhlY3V0b3IubXUpOwotICAgIGdycGNfZXhlY19jdHhfZmx1c2goJmV4ZWNfY3R4KTsKLSAgfQotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotfQotCi0vKiBTcGF3biB0aGUgdGhyZWFkIGlmIG5ldyB3b3JrIGhhcyBhcnJpdmVkIGEgbm8gdGhyZWFkIGlzIHVwICovCi1zdGF0aWMgdm9pZCBtYXliZV9zcGF3bl9sb2NrZWQoKSB7Ci0gIGlmIChncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShnX2V4ZWN1dG9yLmNsb3N1cmVzKSA9PSAxKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChnX2V4ZWN1dG9yLnNodXR0aW5nX2Rvd24gPT0gMSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnX2V4ZWN1dG9yLmJ1c3kgIT0gMCkgewotICAgIC8qIFRocmVhZCBzdGlsbCB3b3JraW5nLiBOZXcgd29yayB3aWxsIGJlIHBpY2tlZCB1cCBieSBhbHJlYWR5IHJ1bm5pbmcKLSAgICAgKiB0aHJlYWQuIE5vdCBzcGF3bmluZyBhbnl0aGluZy4gKi8KLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAoZ19leGVjdXRvci5wZW5kaW5nX2pvaW4gIT0gMCkgewotICAgIC8qIFBpY2t1cCB0aGUgcmVtYWlucyBvZiB0aGUgcHJldmlvdXMgaW5jYXJuYXRpb25zIG9mIHRoZSB0aHJlYWQuICovCi0gICAgZ3ByX3RoZF9qb2luKGdfZXhlY3V0b3IudGlkKTsKLSAgICBnX2V4ZWN1dG9yLnBlbmRpbmdfam9pbiA9IDA7Ci0gIH0KLQotICAvKiBBbGwgcHJldmlvdXMgaW5zdGFuY2VzIG9mIHRoZSB0aHJlYWQgc2hvdWxkIGhhdmUgYmVlbiBqb2luZWQgYXQgdGhpcyBwb2ludC4KLSAgICogU3Bhd24gdGltZSEgKi8KLSAgZ19leGVjdXRvci5idXN5ID0gMTsKLSAgZ3ByX3RoZF9uZXcoJmdfZXhlY3V0b3IudGlkLCBjbG9zdXJlX2V4ZWNfdGhyZWFkX2Z1bmMsIE5VTEwsCi0gICAgICAgICAgICAgICZnX2V4ZWN1dG9yLm9wdGlvbnMpOwotICBnX2V4ZWN1dG9yLnBlbmRpbmdfam9pbiA9IDE7Ci19Ci0KLXZvaWQgZ3JwY19leGVjdXRvcl9lbnF1ZXVlKGdycGNfY2xvc3VyZSAqY2xvc3VyZSwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdwcl9tdV9sb2NrKCZnX2V4ZWN1dG9yLm11KTsKLSAgaWYgKGdfZXhlY3V0b3Iuc2h1dHRpbmdfZG93biA9PSAwKSB7Ci0gICAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZnX2V4ZWN1dG9yLmNsb3N1cmVzLCBjbG9zdXJlLCBzdWNjZXNzKTsKLSAgICBtYXliZV9zcGF3bl9sb2NrZWQoKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZnX2V4ZWN1dG9yLm11KTsKLX0KLQotdm9pZCBncnBjX2V4ZWN1dG9yX3NodXRkb3duKCkgewotICBpbnQgcGVuZGluZ19qb2luOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotCi0gIGdwcl9tdV9sb2NrKCZnX2V4ZWN1dG9yLm11KTsKLSAgcGVuZGluZ19qb2luID0gZ19leGVjdXRvci5wZW5kaW5nX2pvaW47Ci0gIGdfZXhlY3V0b3Iuc2h1dHRpbmdfZG93biA9IDE7Ci0gIGdwcl9tdV91bmxvY2soJmdfZXhlY3V0b3IubXUpOwotICAvKiB3ZSBjYW4gcmVsZWFzZSB0aGUgbG9jayBhdCB0aGlzIHBvaW50IGRlc3BpdGUgdGhlIGFjY2VzcyB0byB0aGUgY2xvc3VyZQotICAgKiBsaXN0IGJlbG93IGJlY2F1c2Ugd2UgYXJlbid0IGFjY2VwdGluZyBuZXcgd29yayAqLwotCi0gIC8qIEV4ZWN1dGUgcGVuZGluZyBjYWxsYmFja3MsIHNvbWUgbWF5IGJlIHBlcmZvcm1pbmcgY2xlYW51cHMgKi8KLSAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoJmV4ZWNfY3R4LCAmZ19leGVjdXRvci5jbG9zdXJlcywgTlVMTCk7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIEdQUl9BU1NFUlQoZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkoZ19leGVjdXRvci5jbG9zdXJlcykpOwotICBpZiAocGVuZGluZ19qb2luKSB7Ci0gICAgZ3ByX3RoZF9qb2luKGdfZXhlY3V0b3IudGlkKTsKLSAgfQotICBncHJfbXVfZGVzdHJveSgmZ19leGVjdXRvci5tdSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9leGVjdXRvci5oIGIvc3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2YjM1Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9leGVjdXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfRVhFQ1VUT1JfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfRVhFQ1VUT1JfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIgotCi0vKiogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIGV4ZWN1dG9yLgotICoKLSAqIFRoaXMgbWVjaGFuaXNtIGlzIG1lYW50IHRvIG91dHNvdXJjZSB3b3JrIChncnBjX2Nsb3N1cmUgaW5zdGFuY2VzKSB0byBhCi0gKiB0aHJlYWQsIGZvciB0aG9zZSBjYXNlcyB3aGVyZSBibG9ja2luZyBpc24ndCBhbiBvcHRpb24gYnV0IHRoZXJlIGlzbid0IGEKLSAqIG5vbi1ibG9ja2luZyBzb2x1dGlvbiBhdmFpbGFibGUuICovCi12b2lkIGdycGNfZXhlY3V0b3JfaW5pdCgpOwotCi0vKiogRW5xdWV1ZSBcYSBjbG9zdXJlIGZvciBpdHMgZXZlbnR1YWwgZXhlY3V0aW9uIG9mIFxhIGYoYXJnKSBvbiBhIHNlcGFyYXRlCi0gKiB0aHJlYWQgKi8KLXZvaWQgZ3JwY19leGVjdXRvcl9lbnF1ZXVlKGdycGNfY2xvc3VyZSAqY2xvc3VyZSwgYm9vbCBzdWNjZXNzKTsKLQotLyoqIFNodXRkb3duIHRoZSBleGVjdXRvciwgcnVubmluZyBhbGwgcGVuZGluZyB3b3JrIGFzIHBhcnQgb2YgdGhlIGNhbGwgKi8KLXZvaWQgZ3JwY19leGVjdXRvcl9zaHV0ZG93bigpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX0VYRUNVVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci9mZF9wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQwMzhhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKLQotI2RlZmluZSBDTE9TVVJFX05PVF9SRUFEWSAoKGdycGNfY2xvc3VyZSAqKTApCi0jZGVmaW5lIENMT1NVUkVfUkVBRFkgKChncnBjX2Nsb3N1cmUgKikxKQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBmcmVlbGlzdCBub3QgYmVjYXVzZSBvZiBhbnkgY29uY2VybnMgb2YgbWFsbG9jIHBlcmZvcm1hbmNlCi0gKiBidXQgaW5zdGVhZCBzbyB0aGF0IGltcGxlbWVudGF0aW9ucyB3aXRoIG11bHRpcGxlIHRocmVhZHMgaW4gKGZvciBleGFtcGxlKQotICogZXBvbGxfd2FpdCBkZWFsIHdpdGggdGhlIHJhY2UgYmV0d2VlbiBwb2xsc2V0IHJlbW92YWwgYW5kIGluY29taW5nIHBvbGwKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKgotICogVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgcG9sbGVyIHVsdGltYXRlbHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhpcwotICogb2JqZWN0LCBzbyBpdCBpcyB2ZXJ5IGRpZmZpY3VsdCB0byBrbm93IHdoZW4gaXMgc2FmZSB0byBmcmVlIGl0LCBhdCBsZWFzdAotICogd2l0aG91dCBzb21lIGV4cGVuc2l2ZSBzeW5jaHJvbml6YXRpb24uCi0gKgotICogSWYgd2Uga2VlcCB0aGUgb2JqZWN0IGZyZWVsaXN0ZWQsIGluIHRoZSB3b3JzdCBjYXNlIGxvc2luZyB0aGlzIHJhY2UganVzdAotICogYmVjb21lcyBhIHNwdXJpb3VzIHJlYWQgbm90aWZpY2F0aW9uIG9uIGEgcmV1c2VkIGZkLgotICovCi0vKiBUT0RPKGtsZW1wbmVyKTogV2UgY291bGQgdXNlIHNvbWUgZm9ybSBvZiBwb2xsaW5nIGdlbmVyYXRpb24gY291bnQgdG8ga25vdwotICogd2hlbiB0aGVzZSBhcmUgc2FmZSB0byBmcmVlLiAqLwotLyogVE9ETyhrbGVtcG5lcik6IENvbnNpZGVyIGRpc2FibGluZyBmcmVlbGlzdGluZyBpZiB3ZSBkb24ndCBoYXZlIG11bHRpcGxlCi0gKiB0aHJlYWRzIGluIHBvbGwgb24gdGhlIHNhbWUgZmQgKi8KLS8qIFRPRE8oa2xlbXBuZXIpOiBCYXRjaCB0aGVzZSBhbGxvY2F0aW9ucyB0byByZWR1Y2UgZnJhZ21lbnRhdGlvbiAqLwotc3RhdGljIGdycGNfZmQgKmZkX2ZyZWVsaXN0ID0gTlVMTDsKLXN0YXRpYyBncHJfbXUgZmRfZnJlZWxpc3RfbXU7Ci0KLXN0YXRpYyB2b2lkIGZyZWVsaXN0X2ZkKGdycGNfZmQgKmZkKSB7Ci0gIGdwcl9tdV9sb2NrKCZmZF9mcmVlbGlzdF9tdSk7Ci0gIGZkLT5mcmVlbGlzdF9uZXh0ID0gZmRfZnJlZWxpc3Q7Ci0gIGZkX2ZyZWVsaXN0ID0gZmQ7Ci0gIGdycGNfaW9tZ3JfdW5yZWdpc3Rlcl9vYmplY3QoJmZkLT5pb21ncl9vYmplY3QpOwotICBncHJfbXVfdW5sb2NrKCZmZF9mcmVlbGlzdF9tdSk7Ci19Ci0KLXN0YXRpYyBncnBjX2ZkICphbGxvY19mZChpbnQgZmQpIHsKLSAgZ3JwY19mZCAqciA9IE5VTEw7Ci0gIGdwcl9tdV9sb2NrKCZmZF9mcmVlbGlzdF9tdSk7Ci0gIGlmIChmZF9mcmVlbGlzdCAhPSBOVUxMKSB7Ci0gICAgciA9IGZkX2ZyZWVsaXN0OwotICAgIGZkX2ZyZWVsaXN0ID0gZmRfZnJlZWxpc3QtPmZyZWVsaXN0X25leHQ7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZmRfZnJlZWxpc3RfbXUpOwotICBpZiAociA9PSBOVUxMKSB7Ci0gICAgciA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfZmQpKTsKLSAgICBncHJfbXVfaW5pdCgmci0+bXUpOwotICB9Ci0KLSAgZ3ByX211X2xvY2soJnItPm11KTsKLSAgci0+c2h1dGRvd24gPSAwOwotICByLT5yZWFkX2Nsb3N1cmUgPSBDTE9TVVJFX05PVF9SRUFEWTsKLSAgci0+d3JpdGVfY2xvc3VyZSA9IENMT1NVUkVfTk9UX1JFQURZOwotICByLT5mZCA9IGZkOwotICByLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3QubmV4dCA9IHItPmluYWN0aXZlX3dhdGNoZXJfcm9vdC5wcmV2ID0KLSAgICAgICZyLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3Q7Ci0gIHItPmZyZWVsaXN0X25leHQgPSBOVUxMOwotICByLT5yZWFkX3dhdGNoZXIgPSByLT53cml0ZV93YXRjaGVyID0gTlVMTDsKLSAgci0+b25fZG9uZV9jbG9zdXJlID0gTlVMTDsKLSAgci0+Y2xvc2VkID0gMDsKLSAgci0+cmVsZWFzZWQgPSAwOwotICBncHJfYXRtX3JlbF9zdG9yZSgmci0+cmVmc3QsIDEpOwotICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3koZ3JwY19mZCAqZmQpIHsKLSAgZ3ByX211X2Rlc3Ryb3koJmZkLT5tdSk7Ci0gIGdwcl9mcmVlKGZkKTsKLX0KLQotI2lmZGVmIEdSUENfRkRfUkVGX0NPVU5UX0RFQlVHCi0jZGVmaW5lIFJFRl9CWShmZCwgbiwgcmVhc29uKSByZWZfYnkoZmQsIG4sIHJlYXNvbiwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBVTlJFRl9CWShmZCwgbiwgcmVhc29uKSB1bnJlZl9ieShmZCwgbiwgcmVhc29uLCBfX0ZJTEVfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCByZWZfYnkoZ3JwY19mZCAqZmQsIGludCBuLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICJGRCAlZCAlcCAgIHJlZiAlZCAlZCAtPiAlZCBbJXM7ICVzOiVkXSIsIGZkLT5mZCwgZmQsIG4sCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJmZkLT5yZWZzdCksCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJmZkLT5yZWZzdCkgKyBuLCByZWFzb24sIGZpbGUsIGxpbmUpOwotI2Vsc2UKLSNkZWZpbmUgUkVGX0JZKGZkLCBuLCByZWFzb24pIHJlZl9ieShmZCwgbikKLSNkZWZpbmUgVU5SRUZfQlkoZmQsIG4sIHJlYXNvbikgdW5yZWZfYnkoZmQsIG4pCi1zdGF0aWMgdm9pZCByZWZfYnkoZ3JwY19mZCAqZmQsIGludCBuKSB7Ci0jZW5kaWYKLSAgR1BSX0FTU0VSVChncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZmZC0+cmVmc3QsIG4pID4gMCk7Ci19Ci0KLSNpZmRlZiBHUlBDX0ZEX1JFRl9DT1VOVF9ERUJVRwotc3RhdGljIHZvaWQgdW5yZWZfYnkoZ3JwY19mZCAqZmQsIGludCBuLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfYXRtIG9sZDsKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICJGRCAlZCAlcCB1bnJlZiAlZCAlZCAtPiAlZCBbJXM7ICVzOiVkXSIsIGZkLT5mZCwgZmQsIG4sCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJmZkLT5yZWZzdCksCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJmZkLT5yZWZzdCkgLSBuLCByZWFzb24sIGZpbGUsIGxpbmUpOwotI2Vsc2UKLXN0YXRpYyB2b2lkIHVucmVmX2J5KGdycGNfZmQgKmZkLCBpbnQgbikgewotICBncHJfYXRtIG9sZDsKLSNlbmRpZgotICBvbGQgPSBncHJfYXRtX2Z1bGxfZmV0Y2hfYWRkKCZmZC0+cmVmc3QsIC1uKTsKLSAgaWYgKG9sZCA9PSBuKSB7Ci0gICAgZnJlZWxpc3RfZmQoZmQpOwotICB9IGVsc2UgewotICAgIEdQUl9BU1NFUlQob2xkID4gbik7Ci0gIH0KLX0KLQotdm9pZCBncnBjX2ZkX2dsb2JhbF9pbml0KHZvaWQpIHsgZ3ByX211X2luaXQoJmZkX2ZyZWVsaXN0X211KTsgfQotCi12b2lkIGdycGNfZmRfZ2xvYmFsX3NodXRkb3duKHZvaWQpIHsKLSAgZ3ByX211X2xvY2soJmZkX2ZyZWVsaXN0X211KTsKLSAgZ3ByX211X3VubG9jaygmZmRfZnJlZWxpc3RfbXUpOwotICB3aGlsZSAoZmRfZnJlZWxpc3QgIT0gTlVMTCkgewotICAgIGdycGNfZmQgKmZkID0gZmRfZnJlZWxpc3Q7Ci0gICAgZmRfZnJlZWxpc3QgPSBmZF9mcmVlbGlzdC0+ZnJlZWxpc3RfbmV4dDsKLSAgICBkZXN0cm95KGZkKTsKLSAgfQotICBncHJfbXVfZGVzdHJveSgmZmRfZnJlZWxpc3RfbXUpOwotfQotCi1ncnBjX2ZkICpncnBjX2ZkX2NyZWF0ZShpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgZ3JwY19mZCAqciA9IGFsbG9jX2ZkKGZkKTsKLSAgY2hhciAqbmFtZTI7Ci0gIGdwcl9hc3ByaW50ZigmbmFtZTIsICIlcyBmZD0lZCIsIG5hbWUsIGZkKTsKLSAgZ3JwY19pb21ncl9yZWdpc3Rlcl9vYmplY3QoJnItPmlvbWdyX29iamVjdCwgbmFtZTIpOwotICBncHJfZnJlZShuYW1lMik7Ci0jaWZkZWYgR1JQQ19GRF9SRUZfQ09VTlRfREVCVUcKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICJGRCAlZCAlcCBjcmVhdGUgJXMiLCBmZCwgciwgbmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHI7Ci19Ci0KLWludCBncnBjX2ZkX2lzX29ycGhhbmVkKGdycGNfZmQgKmZkKSB7Ci0gIHJldHVybiAoZ3ByX2F0bV9hY3FfbG9hZCgmZmQtPnJlZnN0KSAmIDEpID09IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvbGxzZXRfa2lja19sb2NrZWQoZ3JwY19mZF93YXRjaGVyICp3YXRjaGVyKSB7Ci0gIGdwcl9tdV9sb2NrKCZ3YXRjaGVyLT5wb2xsc2V0LT5tdSk7Ci0gIEdQUl9BU1NFUlQod2F0Y2hlci0+d29ya2VyKTsKLSAgZ3JwY19wb2xsc2V0X2tpY2tfZXh0KHdhdGNoZXItPnBvbGxzZXQsIHdhdGNoZXItPndvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfUE9MTFNFVF9SRUVWQUxVQVRFX1BPTExJTkdfT05fV0FLRVVQKTsKLSAgZ3ByX211X3VubG9jaygmd2F0Y2hlci0+cG9sbHNldC0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCBtYXliZV93YWtlX29uZV93YXRjaGVyX2xvY2tlZChncnBjX2ZkICpmZCkgewotICBpZiAoZmQtPmluYWN0aXZlX3dhdGNoZXJfcm9vdC5uZXh0ICE9ICZmZC0+aW5hY3RpdmVfd2F0Y2hlcl9yb290KSB7Ci0gICAgcG9sbHNldF9raWNrX2xvY2tlZChmZC0+aW5hY3RpdmVfd2F0Y2hlcl9yb290Lm5leHQpOwotICB9IGVsc2UgaWYgKGZkLT5yZWFkX3dhdGNoZXIpIHsKLSAgICBwb2xsc2V0X2tpY2tfbG9ja2VkKGZkLT5yZWFkX3dhdGNoZXIpOwotICB9IGVsc2UgaWYgKGZkLT53cml0ZV93YXRjaGVyKSB7Ci0gICAgcG9sbHNldF9raWNrX2xvY2tlZChmZC0+d3JpdGVfd2F0Y2hlcik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgd2FrZV9hbGxfd2F0Y2hlcnNfbG9ja2VkKGdycGNfZmQgKmZkKSB7Ci0gIGdycGNfZmRfd2F0Y2hlciAqd2F0Y2hlcjsKLSAgZm9yICh3YXRjaGVyID0gZmQtPmluYWN0aXZlX3dhdGNoZXJfcm9vdC5uZXh0OwotICAgICAgIHdhdGNoZXIgIT0gJmZkLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3Q7IHdhdGNoZXIgPSB3YXRjaGVyLT5uZXh0KSB7Ci0gICAgcG9sbHNldF9raWNrX2xvY2tlZCh3YXRjaGVyKTsKLSAgfQotICBpZiAoZmQtPnJlYWRfd2F0Y2hlcikgewotICAgIHBvbGxzZXRfa2lja19sb2NrZWQoZmQtPnJlYWRfd2F0Y2hlcik7Ci0gIH0KLSAgaWYgKGZkLT53cml0ZV93YXRjaGVyICYmIGZkLT53cml0ZV93YXRjaGVyICE9IGZkLT5yZWFkX3dhdGNoZXIpIHsKLSAgICBwb2xsc2V0X2tpY2tfbG9ja2VkKGZkLT53cml0ZV93YXRjaGVyKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IGhhc193YXRjaGVycyhncnBjX2ZkICpmZCkgewotICByZXR1cm4gZmQtPnJlYWRfd2F0Y2hlciAhPSBOVUxMIHx8IGZkLT53cml0ZV93YXRjaGVyICE9IE5VTEwgfHwKLSAgICAgICAgIGZkLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3QubmV4dCAhPSAmZmQtPmluYWN0aXZlX3dhdGNoZXJfcm9vdDsKLX0KLQotc3RhdGljIHZvaWQgY2xvc2VfZmRfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCkgewotICBmZC0+Y2xvc2VkID0gMTsKLSAgaWYgKCFmZC0+cmVsZWFzZWQpIHsKLSAgICBjbG9zZShmZC0+ZmQpOwotICB9IGVsc2UgewotICAgIGdycGNfcmVtb3ZlX2ZkX2Zyb21fYWxsX2Vwb2xsX3NldHMoZmQtPmZkKTsKLSAgfQotICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGZkLT5vbl9kb25lX2Nsb3N1cmUsIHRydWUsIE5VTEwpOwotfQotCi1pbnQgZ3JwY19mZF93cmFwcGVkX2ZkKGdycGNfZmQgKmZkKSB7Ci0gIGlmIChmZC0+cmVsZWFzZWQgfHwgZmQtPmNsb3NlZCkgewotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmQtPmZkOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19mZF9vcnBoYW4oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLCBncnBjX2Nsb3N1cmUgKm9uX2RvbmUsCi0gICAgICAgICAgICAgICAgICAgIGludCAqcmVsZWFzZV9mZCwgY29uc3QgY2hhciAqcmVhc29uKSB7Ci0gIGZkLT5vbl9kb25lX2Nsb3N1cmUgPSBvbl9kb25lOwotICBmZC0+cmVsZWFzZWQgPSByZWxlYXNlX2ZkICE9IE5VTEw7Ci0gIGlmICghZmQtPnJlbGVhc2VkKSB7Ci0gICAgc2h1dGRvd24oZmQtPmZkLCBTSFVUX1JEV1IpOwotICB9IGVsc2UgewotICAgICpyZWxlYXNlX2ZkID0gZmQtPmZkOwotICB9Ci0gIGdwcl9tdV9sb2NrKCZmZC0+bXUpOwotICBSRUZfQlkoZmQsIDEsIHJlYXNvbik7IC8qIHJlbW92ZSBhY3RpdmUgc3RhdHVzLCBidXQga2VlcCByZWZlcmVuY2VkICovCi0gIGlmICghaGFzX3dhdGNoZXJzKGZkKSkgewotICAgIGNsb3NlX2ZkX2xvY2tlZChleGVjX2N0eCwgZmQpOwotICB9IGVsc2UgewotICAgIHdha2VfYWxsX3dhdGNoZXJzX2xvY2tlZChmZCk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZmQtPm11KTsKLSAgVU5SRUZfQlkoZmQsIDIsIHJlYXNvbik7IC8qIGRyb3AgdGhlIHJlZmVyZW5jZSAqLwotfQotCi0vKiBpbmNyZW1lbnQgcmVmY291bnQgYnkgdHdvIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBvcnBoYW4gYml0ICovCi0jaWZkZWYgR1JQQ19GRF9SRUZfQ09VTlRfREVCVUcKLXZvaWQgZ3JwY19mZF9yZWYoZ3JwY19mZCAqZmQsIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKLSAgcmVmX2J5KGZkLCAyLCByZWFzb24sIGZpbGUsIGxpbmUpOwotfQotCi12b2lkIGdycGNfZmRfdW5yZWYoZ3JwY19mZCAqZmQsIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICB1bnJlZl9ieShmZCwgMiwgcmVhc29uLCBmaWxlLCBsaW5lKTsKLX0KLSNlbHNlCi12b2lkIGdycGNfZmRfcmVmKGdycGNfZmQgKmZkKSB7IHJlZl9ieShmZCwgMik7IH0KLQotdm9pZCBncnBjX2ZkX3VucmVmKGdycGNfZmQgKmZkKSB7IHVucmVmX2J5KGZkLCAyKTsgfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG5vdGlmeV9vbl9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKipzdCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIGlmICgqc3QgPT0gQ0xPU1VSRV9OT1RfUkVBRFkpIHsKLSAgICAvKiBub3QgcmVhZHkgPT0+IHN3aXRjaCB0byBhIHdhaXRpbmcgc3RhdGUgYnkgc2V0dGluZyB0aGUgY2xvc3VyZSAqLwotICAgICpzdCA9IGNsb3N1cmU7Ci0gIH0gZWxzZSBpZiAoKnN0ID09IENMT1NVUkVfUkVBRFkpIHsKLSAgICAvKiBhbHJlYWR5IHJlYWR5ID09PiBxdWV1ZSB0aGUgY2xvc3VyZSB0byBydW4gaW1tZWRpYXRlbHkgKi8KLSAgICAqc3QgPSBDTE9TVVJFX05PVF9SRUFEWTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsICFmZC0+c2h1dGRvd24sIE5VTEwpOwotICAgIG1heWJlX3dha2Vfb25lX3dhdGNoZXJfbG9ja2VkKGZkKTsKLSAgfSBlbHNlIHsKLSAgICAvKiB1cGNhbGxwdHIgd2FzIHNldCB0byBhIGRpZmZlcmVudCBjbG9zdXJlLiAgVGhpcyBpcyBhbiBlcnJvciEgKi8KLSAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICJVc2VyIGNhbGxlZCBhIG5vdGlmeV9vbiBmdW5jdGlvbiB3aXRoIGEgcHJldmlvdXMgY2FsbGJhY2sgc3RpbGwgIgotICAgICAgICAgICAgInBlbmRpbmciKTsKLSAgICBhYm9ydCgpOwotICB9Ci19Ci0KLS8qIHJldHVybnMgMSBpZiBzdGF0ZSBiZWNvbWVzIG5vdCByZWFkeSAqLwotc3RhdGljIGludCBzZXRfcmVhZHlfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKipzdCkgewotICBpZiAoKnN0ID09IENMT1NVUkVfUkVBRFkpIHsKLSAgICAvKiBkdXBsaWNhdGUgcmVhZHkgPT0+IGlnbm9yZSAqLwotICAgIHJldHVybiAwOwotICB9IGVsc2UgaWYgKCpzdCA9PSBDTE9TVVJFX05PVF9SRUFEWSkgewotICAgIC8qIG5vdCByZWFkeSwgYW5kIG5vdCB3YWl0aW5nID09PiBmbGFnIHJlYWR5ICovCi0gICAgKnN0ID0gQ0xPU1VSRV9SRUFEWTsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICAvKiB3YWl0aW5nID09PiBxdWV1ZSBjbG9zdXJlICovCi0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAqc3QsICFmZC0+c2h1dGRvd24sIE5VTEwpOwotICAgICpzdCA9IENMT1NVUkVfTk9UX1JFQURZOwotICAgIHJldHVybiAxOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9yZWFkeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZmQsIGdycGNfY2xvc3VyZSAqKnN0KSB7Ci0gIC8qIG9ubHkgb25lIHNldF9yZWFkeSBjYW4gYmUgYWN0aXZlIGF0IG9uY2UgKGJ1dCB0aGVyZSBtYXkgYmUgYSByYWNpbmcKLSAgICAgbm90aWZ5X29uKSAqLwotICBncHJfbXVfbG9jaygmZmQtPm11KTsKLSAgc2V0X3JlYWR5X2xvY2tlZChleGVjX2N0eCwgZmQsIHN0KTsKLSAgZ3ByX211X3VubG9jaygmZmQtPm11KTsKLX0KLQotdm9pZCBncnBjX2ZkX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCkgewotICBncHJfbXVfbG9jaygmZmQtPm11KTsKLSAgR1BSX0FTU0VSVCghZmQtPnNodXRkb3duKTsKLSAgZmQtPnNodXRkb3duID0gMTsKLSAgc2V0X3JlYWR5X2xvY2tlZChleGVjX2N0eCwgZmQsICZmZC0+cmVhZF9jbG9zdXJlKTsKLSAgc2V0X3JlYWR5X2xvY2tlZChleGVjX2N0eCwgZmQsICZmZC0+d3JpdGVfY2xvc3VyZSk7Ci0gIGdwcl9tdV91bmxvY2soJmZkLT5tdSk7Ci19Ci0KLXZvaWQgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIGdwcl9tdV9sb2NrKCZmZC0+bXUpOwotICBub3RpZnlfb25fbG9ja2VkKGV4ZWNfY3R4LCBmZCwgJmZkLT5yZWFkX2Nsb3N1cmUsIGNsb3N1cmUpOwotICBncHJfbXVfdW5sb2NrKCZmZC0+bXUpOwotfQotCi12b2lkIGdycGNfZmRfbm90aWZ5X29uX3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIGdwcl9tdV9sb2NrKCZmZC0+bXUpOwotICBub3RpZnlfb25fbG9ja2VkKGV4ZWNfY3R4LCBmZCwgJmZkLT53cml0ZV9jbG9zdXJlLCBjbG9zdXJlKTsKLSAgZ3ByX211X3VubG9jaygmZmQtPm11KTsKLX0KLQotdWludDMyX3QgZ3JwY19mZF9iZWdpbl9wb2xsKGdycGNfZmQgKmZkLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqd29ya2VyLCB1aW50MzJfdCByZWFkX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbWFzaywgZ3JwY19mZF93YXRjaGVyICp3YXRjaGVyKSB7Ci0gIHVpbnQzMl90IG1hc2sgPSAwOwotICBncnBjX2Nsb3N1cmUgKmN1cjsKLSAgaW50IHJlcXVlc3RlZDsKLSAgLyoga2VlcCB0cmFjayBvZiBwb2xsZXJzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgb3VyIGV2ZW50cywgaW4gY2FzZSB0aGV5IGNoYW5nZQotICAgKi8KLSAgR1JQQ19GRF9SRUYoZmQsICJwb2xsIik7Ci0KLSAgZ3ByX211X2xvY2soJmZkLT5tdSk7Ci0KLSAgLyogaWYgd2UgYXJlIHNodXRkb3duLCB0aGVuIGRvbid0IGFkZCB0byB0aGUgd2F0Y2hlciBzZXQgKi8KLSAgaWYgKGZkLT5zaHV0ZG93bikgewotICAgIHdhdGNoZXItPmZkID0gTlVMTDsKLSAgICB3YXRjaGVyLT5wb2xsc2V0ID0gTlVMTDsKLSAgICB3YXRjaGVyLT53b3JrZXIgPSBOVUxMOwotICAgIGdwcl9tdV91bmxvY2soJmZkLT5tdSk7Ci0gICAgR1JQQ19GRF9VTlJFRihmZCwgInBvbGwiKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIGlmIHRoZXJlIGlzIG5vYm9keSBwb2xsaW5nIGZvciByZWFkLCBidXQgd2UgbmVlZCB0bywgdGhlbiBzdGFydCBkb2luZyBzbyAqLwotICBjdXIgPSBmZC0+cmVhZF9jbG9zdXJlOwotICByZXF1ZXN0ZWQgPSBjdXIgIT0gQ0xPU1VSRV9SRUFEWTsKLSAgaWYgKHJlYWRfbWFzayAmJiBmZC0+cmVhZF93YXRjaGVyID09IE5VTEwgJiYgcmVxdWVzdGVkKSB7Ci0gICAgZmQtPnJlYWRfd2F0Y2hlciA9IHdhdGNoZXI7Ci0gICAgbWFzayB8PSByZWFkX21hc2s7Ci0gIH0KLSAgLyogaWYgdGhlcmUgaXMgbm9ib2R5IHBvbGxpbmcgZm9yIHdyaXRlLCBidXQgd2UgbmVlZCB0bywgdGhlbiBzdGFydCBkb2luZyBzbwotICAgKi8KLSAgY3VyID0gZmQtPndyaXRlX2Nsb3N1cmU7Ci0gIHJlcXVlc3RlZCA9IGN1ciAhPSBDTE9TVVJFX1JFQURZOwotICBpZiAod3JpdGVfbWFzayAmJiBmZC0+d3JpdGVfd2F0Y2hlciA9PSBOVUxMICYmIHJlcXVlc3RlZCkgewotICAgIGZkLT53cml0ZV93YXRjaGVyID0gd2F0Y2hlcjsKLSAgICBtYXNrIHw9IHdyaXRlX21hc2s7Ci0gIH0KLSAgLyogaWYgbm90IHBvbGxpbmcsIHJlbWVtYmVyIHRoaXMgd2F0Y2hlciBpbiBjYXNlIHdlIG5lZWQgc29tZW9uZSB0byBsYXRlciAqLwotICBpZiAobWFzayA9PSAwICYmIHdvcmtlciAhPSBOVUxMKSB7Ci0gICAgd2F0Y2hlci0+bmV4dCA9ICZmZC0+aW5hY3RpdmVfd2F0Y2hlcl9yb290OwotICAgIHdhdGNoZXItPnByZXYgPSB3YXRjaGVyLT5uZXh0LT5wcmV2OwotICAgIHdhdGNoZXItPm5leHQtPnByZXYgPSB3YXRjaGVyLT5wcmV2LT5uZXh0ID0gd2F0Y2hlcjsKLSAgfQotICB3YXRjaGVyLT5wb2xsc2V0ID0gcG9sbHNldDsKLSAgd2F0Y2hlci0+d29ya2VyID0gd29ya2VyOwotICB3YXRjaGVyLT5mZCA9IGZkOwotICBncHJfbXVfdW5sb2NrKCZmZC0+bXUpOwotCi0gIHJldHVybiBtYXNrOwotfQotCi12b2lkIGdycGNfZmRfZW5kX3BvbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmRfd2F0Y2hlciAqd2F0Y2hlciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZ290X3JlYWQsIGludCBnb3Rfd3JpdGUpIHsKLSAgaW50IHdhc19wb2xsaW5nID0gMDsKLSAgaW50IGtpY2sgPSAwOwotICBncnBjX2ZkICpmZCA9IHdhdGNoZXItPmZkOwotCi0gIGlmIChmZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ3ByX211X2xvY2soJmZkLT5tdSk7Ci0KLSAgaWYgKHdhdGNoZXIgPT0gZmQtPnJlYWRfd2F0Y2hlcikgewotICAgIC8qIHJlbW92ZSByZWFkIHdhdGNoZXIsIGtpY2sgaWYgd2Ugc3RpbGwgbmVlZCBhIHJlYWQgKi8KLSAgICB3YXNfcG9sbGluZyA9IDE7Ci0gICAgaWYgKCFnb3RfcmVhZCkgewotICAgICAga2ljayA9IDE7Ci0gICAgfQotICAgIGZkLT5yZWFkX3dhdGNoZXIgPSBOVUxMOwotICB9Ci0gIGlmICh3YXRjaGVyID09IGZkLT53cml0ZV93YXRjaGVyKSB7Ci0gICAgLyogcmVtb3ZlIHdyaXRlIHdhdGNoZXIsIGtpY2sgaWYgd2Ugc3RpbGwgbmVlZCBhIHdyaXRlICovCi0gICAgd2FzX3BvbGxpbmcgPSAxOwotICAgIGlmICghZ290X3dyaXRlKSB7Ci0gICAgICBraWNrID0gMTsKLSAgICB9Ci0gICAgZmQtPndyaXRlX3dhdGNoZXIgPSBOVUxMOwotICB9Ci0gIGlmICghd2FzX3BvbGxpbmcgJiYgd2F0Y2hlci0+d29ya2VyICE9IE5VTEwpIHsKLSAgICAvKiByZW1vdmUgZnJvbSBpbmFjdGl2ZSBsaXN0ICovCi0gICAgd2F0Y2hlci0+bmV4dC0+cHJldiA9IHdhdGNoZXItPnByZXY7Ci0gICAgd2F0Y2hlci0+cHJldi0+bmV4dCA9IHdhdGNoZXItPm5leHQ7Ci0gIH0KLSAgaWYgKGdvdF9yZWFkKSB7Ci0gICAgaWYgKHNldF9yZWFkeV9sb2NrZWQoZXhlY19jdHgsIGZkLCAmZmQtPnJlYWRfY2xvc3VyZSkpIHsKLSAgICAgIGtpY2sgPSAxOwotICAgIH0KLSAgfQotICBpZiAoZ290X3dyaXRlKSB7Ci0gICAgaWYgKHNldF9yZWFkeV9sb2NrZWQoZXhlY19jdHgsIGZkLCAmZmQtPndyaXRlX2Nsb3N1cmUpKSB7Ci0gICAgICBraWNrID0gMTsKLSAgICB9Ci0gIH0KLSAgaWYgKGtpY2spIHsKLSAgICBtYXliZV93YWtlX29uZV93YXRjaGVyX2xvY2tlZChmZCk7Ci0gIH0KLSAgaWYgKGdycGNfZmRfaXNfb3JwaGFuZWQoZmQpICYmICFoYXNfd2F0Y2hlcnMoZmQpICYmICFmZC0+Y2xvc2VkKSB7Ci0gICAgY2xvc2VfZmRfbG9ja2VkKGV4ZWNfY3R4LCBmZCk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZmQtPm11KTsKLQotICBHUlBDX0ZEX1VOUkVGKGZkLCAicG9sbCIpOwotfQotCi12b2lkIGdycGNfZmRfYmVjb21lX3JlYWRhYmxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCkgewotICBzZXRfcmVhZHkoZXhlY19jdHgsIGZkLCAmZmQtPnJlYWRfY2xvc3VyZSk7Ci19Ci0KLXZvaWQgZ3JwY19mZF9iZWNvbWVfd3JpdGFibGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkKSB7Ci0gIHNldF9yZWFkeShleGVjX2N0eCwgZmQsICZmZC0+d3JpdGVfY2xvc3VyZSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCBiL3NyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTNhZGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9GRF9QT1NJWF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9GRF9QT1NJWF9ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX2ZkIGdycGNfZmQ7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfZmRfd2F0Y2hlciB7Ci0gIHN0cnVjdCBncnBjX2ZkX3dhdGNoZXIgKm5leHQ7Ci0gIHN0cnVjdCBncnBjX2ZkX3dhdGNoZXIgKnByZXY7Ci0gIGdycGNfcG9sbHNldCAqcG9sbHNldDsKLSAgZ3JwY19wb2xsc2V0X3dvcmtlciAqd29ya2VyOwotICBncnBjX2ZkICpmZDsKLX0gZ3JwY19mZF93YXRjaGVyOwotCi1zdHJ1Y3QgZ3JwY19mZCB7Ci0gIGludCBmZDsKLSAgLyogcmVmc3QgZm9ybWF0OgotICAgICBiaXQwOiAgIDE9YWN0aXZlLzA9b3JwaGFuZWQKLSAgICAgYml0MS1uOiByZWZjb3VudAotICAgICBtZWFuaW5nIHRoYXQgbW9zdGx5IHdlIHJlZiBieSB0d28gdG8gYXZvaWQgYWx0ZXJpbmcgdGhlIG9ycGhhbmVkIGJpdCwKLSAgICAgYW5kIGp1c3QgdW5yZWYgYnkgMSB3aGVuIHdlJ3JlIHJlYWR5IHRvIGZsYWcgdGhlIG9iamVjdCBhcyBvcnBoYW5lZCAqLwotICBncHJfYXRtIHJlZnN0OwotCi0gIGdwcl9tdSBtdTsKLSAgaW50IHNodXRkb3duOwotICBpbnQgY2xvc2VkOwotICBpbnQgcmVsZWFzZWQ7Ci0KLSAgLyogVGhlIHdhdGNoZXIgbGlzdC4KLQotICAgICBUaGUgZm9sbG93aW5nIHdhdGNoZXIgcmVsYXRlZCBmaWVsZHMgYXJlIHByb3RlY3RlZCBieSB3YXRjaGVyX211LgotCi0gICAgIEFuIGZkX3dhdGNoZXIgaXMgYW4gZXBoZW1lcmFsIG9iamVjdCBjcmVhdGVkIHdoZW4gYW4gZmQgd2FudHMgdG8KLSAgICAgYmVnaW4gcG9sbGluZywgYW5kIGRlc3Ryb3llZCBhZnRlciB0aGUgcG9sbC4KLQotICAgICBJdCBkZW5vdGVzIHRoZSBmZCdzIGludGVyZXN0IGluIHdoZXRoZXIgdG8gcmVhZCBwb2xsIG9yIHdyaXRlIHBvbGwKLSAgICAgb3IgYm90aCBvciBuZWl0aGVyIG9uIHRoaXMgZmQuCi0KLSAgICAgSWYgYSB3YXRjaGVyIGlzIGFza2VkIHRvIHBvbGwgZm9yIHJlYWRzIG9yIHdyaXRlcywgdGhlIHJlYWRfd2F0Y2hlcgotICAgICBvciB3cml0ZV93YXRjaGVyIGZpZWxkcyBhcmUgc2V0IHJlc3BlY3RpdmVseS4gQSB3YXRjaGVyIG1heSBiZSBhc2tlZAotICAgICB0byBwb2xsIGZvciBib3RoLCBpbiB3aGljaCBjYXNlIGJvdGggZmllbGRzIHdpbGwgYmUgc2V0LgotCi0gICAgIHJlYWRfd2F0Y2hlciBhbmQgd3JpdGVfd2F0Y2hlciBtYXkgYmUgTlVMTCBpZiBubyB3YXRjaGVyIGhhcyBiZWVuCi0gICAgIGFza2VkIHRvIHBvbGwgZm9yIHJlYWRzIG9yIHdyaXRlcy4KLQotICAgICBJZiBhbiBmZF93YXRjaGVyIGlzIG5vdCBhc2tlZCB0byBwb2xsIGZvciByZWFkcyBvciB3cml0ZXMsIGl0J3MgYWRkZWQKLSAgICAgdG8gYSBsaW5rZWQgbGlzdCBvZiBpbmFjdGl2ZSB3YXRjaGVycywgcm9vdGVkIGF0IGluYWN0aXZlX3dhdGNoZXJfcm9vdC4KLSAgICAgSWYgYXQgYSBsYXRlciB0aW1lIHRoZXJlIGJlY29tZXMgbmVlZCBvZiBhIHBvbGxlciB0byBwb2xsLCBvbmUgb2YKLSAgICAgdGhlIGluYWN0aXZlIHBvbGxlcnMgbWF5IGJlIGtpY2tlZCBvdXQgb2YgdGhlaXIgcG9sbCBsb29wcyB0byB0YWtlCi0gICAgIHRoYXQgcmVzcG9uc2liaWxpdHkuICovCi0gIGdycGNfZmRfd2F0Y2hlciBpbmFjdGl2ZV93YXRjaGVyX3Jvb3Q7Ci0gIGdycGNfZmRfd2F0Y2hlciAqcmVhZF93YXRjaGVyOwotICBncnBjX2ZkX3dhdGNoZXIgKndyaXRlX3dhdGNoZXI7Ci0KLSAgZ3JwY19jbG9zdXJlICpyZWFkX2Nsb3N1cmU7Ci0gIGdycGNfY2xvc3VyZSAqd3JpdGVfY2xvc3VyZTsKLQotICBzdHJ1Y3QgZ3JwY19mZCAqZnJlZWxpc3RfbmV4dDsKLQotICBncnBjX2Nsb3N1cmUgKm9uX2RvbmVfY2xvc3VyZTsKLQotICBncnBjX2lvbWdyX29iamVjdCBpb21ncl9vYmplY3Q7Ci19OwotCi0vKiBDcmVhdGUgYSB3cmFwcGVkIGZpbGUgZGVzY3JpcHRvci4KLSAgIFJlcXVpcmVzIGZkIGlzIGEgbm9uLWJsb2NraW5nIGZpbGUgZGVzY3JpcHRvci4KLSAgIFRoaXMgdGFrZXMgb3duZXJzaGlwIG9mIGNsb3NpbmcgZmQuICovCi1ncnBjX2ZkICpncnBjX2ZkX2NyZWF0ZShpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0vKiBSZXR1cm4gdGhlIHdyYXBwZWQgZmQsIG9yIC0xIGlmIGl0IGhhcyBiZWVuIHJlbGVhc2VkIG9yIGNsb3NlZC4gKi8KLWludCBncnBjX2ZkX3dyYXBwZWRfZmQoZ3JwY19mZCAqZmQpOwotCi0vKiBSZWxlYXNlcyBmZCB0byBiZSBhc3luY2hyb25vdXNseSBkZXN0cm95ZWQuCi0gICBvbl9kb25lIGlzIGNhbGxlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvciBpcyBkZWZpbml0ZWx5IGNsb3NlKClkLgotICAgSWYgb25fZG9uZSBpcyBOVUxMLCBubyBjYWxsYmFjayB3aWxsIGJlIG1hZGUuCi0gICBJZiByZWxlYXNlX2ZkIGlzIG5vdCBOVUxMLCBpdCdzIHNldCB0byBmZCBhbmQgZmQgd2lsbCBub3QgYmUgY2xvc2VkLgotICAgUmVxdWlyZXM6ICpmZCBpbml0aWFsaXplZDsgbm8gb3V0c3RhbmRpbmcgbm90aWZ5X29uX3JlYWQgb3IKLSAgIG5vdGlmeV9vbl93cml0ZS4KLSAgIE1VU1QgTk9UIGJlIGNhbGxlZCB3aXRoIGEgcG9sbHNldCBsb2NrIHRha2VuICovCi12b2lkIGdycGNfZmRfb3JwaGFuKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwgZ3JwY19jbG9zdXJlICpvbl9kb25lLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlbGVhc2VfZmQsIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci0KLS8qIEJlZ2luIHBvbGxpbmcgb24gYW4gZmQuCi0gICBSZWdpc3RlcnMgdGhhdCB0aGUgZ2l2ZW4gcG9sbHNldCBpcyBpbnRlcmVzdGVkIGluIHRoaXMgZmQgLSBzbyB0aGF0IGlmIHJlYWQKLSAgIG9yIHdyaXRhYmlsaXR5IGludGVyZXN0IGNoYW5nZXMsIHRoZSBwb2xsc2V0IGNhbiBiZSBraWNrZWQgdG8gcGljayB1cCB0aGF0Ci0gICBuZXcgaW50ZXJlc3QuCi0gICBSZXR1cm4gdmFsdWUgaXM6Ci0gICAgIChmZF9uZWVkc19yZWFkPyByZWFkX21hc2sgOiAwKSB8IChmZF9uZWVkc193cml0ZT8gd3JpdGVfbWFzayA6IDApCi0gICBpLmUuIGEgY29tYmluYXRpb24gb2YgcmVhZF9tYXNrIGFuZCB3cml0ZV9tYXNrIGRldGVybWluZWQgYnkgdGhlIGZkJ3MgY3VycmVudAotICAgaW50ZXJlc3QgaW4gc2FpZCBldmVudHMuCi0gICBQb2xsaW5nIHN0cmF0ZWdpZXMgdGhhdCBkbyBub3QgbmVlZCB0byBhbHRlciB0aGVpciBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlCi0gICBmZCdzIGN1cnJlbnQgaW50ZXJlc3QgKHN1Y2ggYXMgZXBvbGwpIGRvIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KLSAgIE1VU1QgTk9UIGJlIGNhbGxlZCB3aXRoIGEgcG9sbHNldCBsb2NrIHRha2VuICovCi11aW50MzJfdCBncnBjX2ZkX2JlZ2luX3BvbGwoZ3JwY19mZCAqZmQsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIsIHVpbnQzMl90IHJlYWRfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9tYXNrLCBncnBjX2ZkX3dhdGNoZXIgKnJlYyk7Ci0vKiBDb21wbGV0ZSBwb2xsaW5nIHByZXZpb3VzbHkgc3RhcnRlZCB3aXRoIGdycGNfZmRfYmVnaW5fcG9sbAotICAgTVVTVCBOT1QgYmUgY2FsbGVkIHdpdGggYSBwb2xsc2V0IGxvY2sgdGFrZW4KLSAgIGlmIGdvdF9yZWFkIG9yIGdvdF93cml0ZSBhcmUgMSwgYWxzbyBkb2VzIHRoZSBiZWNvbWVfe3JlYWRhYmxlLHdyaXRhYmxlfSBhcwotICAgYXBwcm9wcmlhdGUuICovCi12b2lkIGdycGNfZmRfZW5kX3BvbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmRfd2F0Y2hlciAqcmVjLAotICAgICAgICAgICAgICAgICAgICAgIGludCBnb3RfcmVhZCwgaW50IGdvdF93cml0ZSk7Ci0KLS8qIFJldHVybiAxIGlmIHRoaXMgZmQgaXMgb3JwaGFuZWQsIDAgb3RoZXJ3aXNlICovCi1pbnQgZ3JwY19mZF9pc19vcnBoYW5lZChncnBjX2ZkICpmZCk7Ci0KLS8qIENhdXNlIGFueSBjdXJyZW50IGNhbGxiYWNrcyB0byBlcnJvciBvdXQgd2l0aCBHUlBDX0NBTExCQUNLX0NBTkNFTExFRC4gKi8KLXZvaWQgZ3JwY19mZF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZmQpOwotCi0vKiBSZWdpc3RlciByZWFkIGludGVyZXN0LCBjYXVzaW5nIHJlYWRfY2IgdG8gYmUgY2FsbGVkIG9uY2Ugd2hlbiBmZCBiZWNvbWVzCi0gICByZWFkYWJsZSwgb24gZGVhZGxpbmUgc3BlY2lmaWVkIGJ5IGRlYWRsaW5lLCBvciBvbiBzaHV0ZG93biB0cmlnZ2VyZWQgYnkKLSAgIGdycGNfZmRfc2h1dGRvd24uCi0gICByZWFkX2NiIHdpbGwgYmUgY2FsbGVkIHdpdGggcmVhZF9jYl9hcmcgd2hlbiAqZmQgYmVjb21lcyByZWFkYWJsZS4KLSAgIHJlYWRfY2IgaXMgQ2FsbGVkIHdpdGggc3RhdHVzIG9mIEdSUENfQ0FMTEJBQ0tfU1VDQ0VTUyBpZiByZWFkYWJsZSwKLSAgIEdSUENfQ0FMTEJBQ0tfVElNRURfT1VUIGlmIHRoZSBjYWxsIHRpbWVkIG91dCwKLSAgIGFuZCBDQU5DRUxMRUQgaWYgdGhlIGNhbGwgd2FzIGNhbmNlbGxlZC4KLQotICAgUmVxdWlyZXM6VGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcmVhZF9jYiBmb3IgYW55IHByZXZpb3VzCi0gICBjYWxsIHJ1bnMuIEVkZ2UgdHJpZ2dlcmVkIGV2ZW50cyBhcmUgdXNlZCB3aGVuZXZlciB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlCi0gICB1bmRlcmx5aW5nIHBsYXRmb3JtLiBUaGlzIG1lYW5zIHRoYXQgdXNlcnMgbXVzdCBkcmFpbiBmZCBpbiByZWFkX2NiIGJlZm9yZQotICAgY2FsbGluZyBub3RpZnlfb25fcmVhZCBhZ2Fpbi4gVXNlcnMgYXJlIGFsc28gZXhwZWN0ZWQgdG8gaGFuZGxlIHNwdXJpb3VzCi0gICBldmVudHMsIGkuZSByZWFkX2NiIGlzIGNhbGxlZCB3aGlsZSBub3RoaW5nIGNhbiBiZSByZWFkYWJsZSBmcm9tIGZkICAqLwotdm9pZCBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOwotCi0vKiBFeGFjdGx5IHRoZSBzYW1lIHNlbWFudGljcyBhcyBhYm92ZSwgZXhjZXB0IGJhc2VkIG9uIHdyaXRhYmxlIGV2ZW50cy4gICovCi12b2lkIGdycGNfZmRfbm90aWZ5X29uX3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLQotLyogTm90aWZpY2F0aW9uIGZyb20gdGhlIHBvbGxlciB0byBhbiBmZCB0aGF0IGl0IGhhcyBiZWNvbWUgcmVhZGFibGUgb3IKLSAgIHdyaXRhYmxlLgotICAgSWYgYWxsb3dfc3luY2hyb25vdXNfY2FsbGJhY2sgaXMgMSwgYWxsb3cgcnVubmluZyB0aGUgZmQgY2FsbGJhY2sgaW5saW5lCi0gICBpbiB0aGlzIGNhbGxzdGFjaywgb3RoZXJ3aXNlIHJlZ2lzdGVyIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBhbmQgcmV0dXJuICovCi12b2lkIGdycGNfZmRfYmVjb21lX3JlYWRhYmxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCk7Ci12b2lkIGdycGNfZmRfYmVjb21lX3dyaXRhYmxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCk7Ci0KLS8qIFJlZmVyZW5jZSBjb3VudGluZyBmb3IgZmRzICovCi0vKiNkZWZpbmUgR1JQQ19GRF9SRUZfQ09VTlRfREVCVUcqLwotI2lmZGVmIEdSUENfRkRfUkVGX0NPVU5UX0RFQlVHCi12b2lkIGdycGNfZmRfcmVmKGdycGNfZmQgKmZkLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKLXZvaWQgZ3JwY19mZF91bnJlZihncnBjX2ZkICpmZCwgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Ci0jZGVmaW5lIEdSUENfRkRfUkVGKGZkLCByZWFzb24pIGdycGNfZmRfcmVmKGZkLCByZWFzb24sIF9fRklMRV9fLCBfX0xJTkVfXykKLSNkZWZpbmUgR1JQQ19GRF9VTlJFRihmZCwgcmVhc29uKSBncnBjX2ZkX3VucmVmKGZkLCByZWFzb24sIF9fRklMRV9fLCBfX0xJTkVfXykKLSNlbHNlCi12b2lkIGdycGNfZmRfcmVmKGdycGNfZmQgKmZkKTsKLXZvaWQgZ3JwY19mZF91bnJlZihncnBjX2ZkICpmZCk7Ci0jZGVmaW5lIEdSUENfRkRfUkVGKGZkLCByZWFzb24pIGdycGNfZmRfcmVmKGZkKQotI2RlZmluZSBHUlBDX0ZEX1VOUkVGKGZkLCByZWFzb24pIGdycGNfZmRfdW5yZWYoZmQpCi0jZW5kaWYKLQotdm9pZCBncnBjX2ZkX2dsb2JhbF9pbml0KHZvaWQpOwotdm9pZCBncnBjX2ZkX2dsb2JhbF9zaHV0ZG93bih2b2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9GRF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuYyBiL3NyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2UyNzdkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2dfd2luMzIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKLQotc3RhdGljIFVMT05HIGdfaW9jcF9raWNrX3Rva2VuOwotc3RhdGljIE9WRVJMQVBQRUQgZ19pb2NwX2N1c3RvbV9vdmVybGFwOwotCi1zdGF0aWMgZ3ByX2F0bSBnX2N1c3RvbV9ldmVudHMgPSAwOwotCi1zdGF0aWMgSEFORExFIGdfaW9jcDsKLQotc3RhdGljIERXT1JEIGRlYWRsaW5lX3RvX21pbGxpc190aW1lb3V0KGdwcl90aW1lc3BlYyBkZWFkbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93KSB7Ci0gIGdwcl90aW1lc3BlYyB0aW1lb3V0OwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBtYXhfc3Bpbl9wb2xsaW5nX3VzID0gMTA7Ci0gIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIGdwcl9pbmZfZnV0dXJlKGRlYWRsaW5lLmNsb2NrX3R5cGUpKSA9PSAwKSB7Ci0gICAgcmV0dXJuIElORklOSVRFOwotICB9Ci0gIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIGdwcl90aW1lX2FkZChub3csIGdwcl90aW1lX2Zyb21fbWljcm9zKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3NwaW5fcG9sbGluZ191cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9USU1FU1BBTikpKSA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdGltZW91dCA9IGdwcl90aW1lX3N1YihkZWFkbGluZSwgbm93KTsKLSAgcmV0dXJuIChEV09SRClncHJfdGltZV90b19taWxsaXMoZ3ByX3RpbWVfYWRkKAotICAgICAgdGltZW91dCwgZ3ByX3RpbWVfZnJvbV9uYW5vcyhHUFJfTlNfUEVSX01TIC0gMSwgR1BSX1RJTUVTUEFOKSkpOwotfQotCi1ncnBjX2lvY3Bfd29ya19zdGF0dXMgZ3JwY19pb2NwX3dvcmsoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7Ci0gIEJPT0wgc3VjY2VzczsKLSAgRFdPUkQgYnl0ZXMgPSAwOwotICBEV09SRCBmbGFncyA9IDA7Ci0gIFVMT05HX1BUUiBjb21wbGV0aW9uX2tleTsKLSAgTFBPVkVSTEFQUEVEIG92ZXJsYXBwZWQ7Ci0gIGdycGNfd2luc29ja2V0ICpzb2NrZXQ7Ci0gIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm87Ci0gIGdycGNfY2xvc3VyZSAqY2xvc3VyZSA9IE5VTEw7Ci0gIHN1Y2Nlc3MgPSBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKAotICAgICAgZ19pb2NwLCAmYnl0ZXMsICZjb21wbGV0aW9uX2tleSwgJm92ZXJsYXBwZWQsCi0gICAgICBkZWFkbGluZV90b19taWxsaXNfdGltZW91dChkZWFkbGluZSwgZ3ByX25vdyhkZWFkbGluZS5jbG9ja190eXBlKSkpOwotICBpZiAoc3VjY2VzcyA9PSAwICYmIG92ZXJsYXBwZWQgPT0gTlVMTCkgewotICAgIHJldHVybiBHUlBDX0lPQ1BfV09SS19USU1FT1VUOwotICB9Ci0gIEdQUl9BU1NFUlQoY29tcGxldGlvbl9rZXkgJiYgb3ZlcmxhcHBlZCk7Ci0gIGlmIChvdmVybGFwcGVkID09ICZnX2lvY3BfY3VzdG9tX292ZXJsYXApIHsKLSAgICBncHJfYXRtX2Z1bGxfZmV0Y2hfYWRkKCZnX2N1c3RvbV9ldmVudHMsIC0xKTsKLSAgICBpZiAoY29tcGxldGlvbl9rZXkgPT0gKFVMT05HX1BUUikmZ19pb2NwX2tpY2tfdG9rZW4pIHsKLSAgICAgIC8qIFdlIHdlcmUgYXdva2VuIGZyb20gYSBraWNrLiAqLwotICAgICAgcmV0dXJuIEdSUENfSU9DUF9XT1JLX0tJQ0s7Ci0gICAgfQotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biBjdXN0b20gY29tcGxldGlvbiBrZXkuIik7Ci0gICAgYWJvcnQoKTsKLSAgfQotCi0gIHNvY2tldCA9IChncnBjX3dpbnNvY2tldCAqKWNvbXBsZXRpb25fa2V5OwotICBpZiAob3ZlcmxhcHBlZCA9PSAmc29ja2V0LT53cml0ZV9pbmZvLm92ZXJsYXBwZWQpIHsKLSAgICBpbmZvID0gJnNvY2tldC0+d3JpdGVfaW5mbzsKLSAgfSBlbHNlIGlmIChvdmVybGFwcGVkID09ICZzb2NrZXQtPnJlYWRfaW5mby5vdmVybGFwcGVkKSB7Ci0gICAgaW5mbyA9ICZzb2NrZXQtPnJlYWRfaW5mbzsKLSAgfSBlbHNlIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gSU9DUCBvcGVyYXRpb24iKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIHN1Y2Nlc3MgPSBXU0FHZXRPdmVybGFwcGVkUmVzdWx0KHNvY2tldC0+c29ja2V0LCAmaW5mby0+b3ZlcmxhcHBlZCwgJmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgJmZsYWdzKTsKLSAgaW5mby0+Ynl0ZXNfdHJhbnNmZXJlZCA9IGJ5dGVzOwotICBpbmZvLT53c2FfZXJyb3IgPSBzdWNjZXNzID8gMCA6IFdTQUdldExhc3RFcnJvcigpOwotICBHUFJfQVNTRVJUKG92ZXJsYXBwZWQgPT0gJmluZm8tPm92ZXJsYXBwZWQpOwotICBHUFJfQVNTRVJUKCFpbmZvLT5oYXNfcGVuZGluZ19pb2NwKTsKLSAgZ3ByX211X2xvY2soJnNvY2tldC0+c3RhdGVfbXUpOwotICBpZiAoaW5mby0+Y2xvc3VyZSkgewotICAgIGNsb3N1cmUgPSBpbmZvLT5jbG9zdXJlOwotICAgIGluZm8tPmNsb3N1cmUgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGluZm8tPmhhc19wZW5kaW5nX2lvY3AgPSAxOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnNvY2tldC0+c3RhdGVfbXUpOwotICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIHRydWUsIE5VTEwpOwotICByZXR1cm4gR1JQQ19JT0NQX1dPUktfV09SSzsKLX0KLQotdm9pZCBncnBjX2lvY3BfaW5pdCh2b2lkKSB7Ci0gIGdfaW9jcCA9Ci0gICAgICBDcmVhdGVJb0NvbXBsZXRpb25Qb3J0KElOVkFMSURfSEFORExFX1ZBTFVFLCBOVUxMLCAoVUxPTkdfUFRSKU5VTEwsIDApOwotICBHUFJfQVNTRVJUKGdfaW9jcCk7Ci19Ci0KLXZvaWQgZ3JwY19pb2NwX2tpY2sodm9pZCkgewotICBCT09MIHN1Y2Nlc3M7Ci0KLSAgZ3ByX2F0bV9mdWxsX2ZldGNoX2FkZCgmZ19jdXN0b21fZXZlbnRzLCAxKTsKLSAgc3VjY2VzcyA9IFBvc3RRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKGdfaW9jcCwgMCwgKFVMT05HX1BUUikmZ19pb2NwX2tpY2tfdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ19pb2NwX2N1c3RvbV9vdmVybGFwKTsKLSAgR1BSX0FTU0VSVChzdWNjZXNzKTsKLX0KLQotdm9pZCBncnBjX2lvY3BfZmx1c2godm9pZCkgewotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBncnBjX2lvY3Bfd29ya19zdGF0dXMgd29ya19zdGF0dXM7Ci0KLSAgZG8gewotICAgIHdvcmtfc3RhdHVzID0gZ3JwY19pb2NwX3dvcmsoJmV4ZWNfY3R4LCBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX01PTk9UT05JQykpOwotICB9IHdoaWxlICh3b3JrX3N0YXR1cyA9PSBHUlBDX0lPQ1BfV09SS19LSUNLIHx8Ci0gICAgICAgICAgIGdycGNfZXhlY19jdHhfZmx1c2goJmV4ZWNfY3R4KSk7Ci19Ci0KLXZvaWQgZ3JwY19pb2NwX3NodXRkb3duKHZvaWQpIHsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLSAgd2hpbGUgKGdwcl9hdG1fYWNxX2xvYWQoJmdfY3VzdG9tX2V2ZW50cykpIHsKLSAgICBncnBjX2lvY3Bfd29yaygmZXhlY19jdHgsIGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLSAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKCZleGVjX2N0eCk7Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgR1BSX0FTU0VSVChDbG9zZUhhbmRsZShnX2lvY3ApKTsKLX0KLQotdm9pZCBncnBjX2lvY3BfYWRkX3NvY2tldChncnBjX3dpbnNvY2tldCAqc29ja2V0KSB7Ci0gIEhBTkRMRSByZXQ7Ci0gIGlmIChzb2NrZXQtPmFkZGVkX3RvX2lvY3ApIHJldHVybjsKLSAgcmV0ID0gQ3JlYXRlSW9Db21wbGV0aW9uUG9ydCgoSEFORExFKXNvY2tldC0+c29ja2V0LCBnX2lvY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnRwdHJfdClzb2NrZXQsIDApOwotICBpZiAoIXJldCkgewotICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmFibGUgdG8gYWRkIHNvY2tldCB0byBpb2NwOiAlcyIsIHV0ZjhfbWVzc2FnZSk7Ci0gICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKLSAgICBfX2RlYnVnYnJlYWsoKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIHNvY2tldC0+YWRkZWRfdG9faW9jcCA9IDE7Ci0gIEdQUl9BU1NFUlQocmV0ID09IGdfaW9jcCk7Ci19Ci0KLS8qIENhbGxpbmcgbm90aWZ5X29uX3JlYWQgb3Igd3JpdGUgbWVhbnMgZWl0aGVyIG9mIHR3byB0aGluZ3M6Ci0gICAtKSBUaGUgSU9DUCBhbHJlYWR5IGNvbXBsZXRlZCBpbiB0aGUgYmFja2dyb3VuZCwgYW5kIHdlIG5lZWQgdG8gY2FsbAotICAgdGhlIGNhbGxiYWNrIG5vdy4KLSAgIC0pIFRoZSBJT0NQIGhhc24ndCBjb21wbGV0ZWQgeWV0LCBhbmQgd2UncmUgcXVldWluZyBpdCBmb3IgbGF0ZXIuICovCi1zdGF0aWMgdm9pZCBzb2NrZXRfbm90aWZ5X29uX2lvY3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193aW5zb2NrZXQgKnNvY2tldCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8pIHsKLSAgR1BSX0FTU0VSVChpbmZvLT5jbG9zdXJlID09IE5VTEwpOwotICBncHJfbXVfbG9jaygmc29ja2V0LT5zdGF0ZV9tdSk7Ci0gIGlmIChpbmZvLT5oYXNfcGVuZGluZ19pb2NwKSB7Ci0gICAgaW5mby0+aGFzX3BlbmRpbmdfaW9jcCA9IDA7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCB0cnVlLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBpbmZvLT5jbG9zdXJlID0gY2xvc3VyZTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZzb2NrZXQtPnN0YXRlX211KTsKLX0KLQotdm9pZCBncnBjX3NvY2tldF9ub3RpZnlfb25fd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3dpbnNvY2tldCAqc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIHNvY2tldF9ub3RpZnlfb25faW9jcChleGVjX2N0eCwgc29ja2V0LCBjbG9zdXJlLCAmc29ja2V0LT53cml0ZV9pbmZvKTsKLX0KLQotdm9pZCBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY193aW5zb2NrZXQgKnNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIHNvY2tldF9ub3RpZnlfb25faW9jcChleGVjX2N0eCwgc29ja2V0LCBjbG9zdXJlLCAmc29ja2V0LT5yZWFkX2luZm8pOwotfQotCi0jZW5kaWYgLyogR1BSX1dJTlNPQ0tfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCBiL3NyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBiODkyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfSU9DUF9XSU5ET1dTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX0lPQ1BfV0lORE9XU19ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIKLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19JT0NQX1dPUktfV09SSywKLSAgR1JQQ19JT0NQX1dPUktfVElNRU9VVCwKLSAgR1JQQ19JT0NQX1dPUktfS0lDSwotfSBncnBjX2lvY3Bfd29ya19zdGF0dXM7Ci0KLWdycGNfaW9jcF93b3JrX3N0YXR1cyBncnBjX2lvY3Bfd29yayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpOwotdm9pZCBncnBjX2lvY3BfaW5pdCh2b2lkKTsKLXZvaWQgZ3JwY19pb2NwX2tpY2sodm9pZCk7Ci12b2lkIGdycGNfaW9jcF9mbHVzaCh2b2lkKTsKLXZvaWQgZ3JwY19pb2NwX3NodXRkb3duKHZvaWQpOwotdm9pZCBncnBjX2lvY3BfYWRkX3NvY2tldChncnBjX3dpbnNvY2tldCAqKTsKLQotdm9pZCBncnBjX3NvY2tldF9ub3RpZnlfb25fd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3dpbnNvY2tldCAqd2luc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLQotdm9pZCBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193aW5zb2NrZXQgKndpbnNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9JT0NQX1dJTkRPV1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYyBiL3NyYy9jb3JlL2lvbWdyL2lvbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjQ0MzAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90aW1lci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotc3RhdGljIGdwcl9tdSBnX211Owotc3RhdGljIGdwcl9jdiBnX3JjdjsKLXN0YXRpYyBpbnQgZ19zaHV0ZG93bjsKLXN0YXRpYyBncnBjX2lvbWdyX29iamVjdCBnX3Jvb3Rfb2JqZWN0OwotCi12b2lkIGdycGNfaW9tZ3JfaW5pdCh2b2lkKSB7Ci0gIGdfc2h1dGRvd24gPSAwOwotICBncHJfbXVfaW5pdCgmZ19tdSk7Ci0gIGdwcl9jdl9pbml0KCZnX3Jjdik7Ci0gIGdycGNfZXhlY19jdHhfZ2xvYmFsX2luaXQoKTsKLSAgZ3JwY190aW1lcl9saXN0X2luaXQoZ3ByX25vdyhHUFJfQ0xPQ0tfTU9OT1RPTklDKSk7Ci0gIGdfcm9vdF9vYmplY3QubmV4dCA9IGdfcm9vdF9vYmplY3QucHJldiA9ICZnX3Jvb3Rfb2JqZWN0OwotICBnX3Jvb3Rfb2JqZWN0Lm5hbWUgPSAicm9vdCI7Ci0gIGdycGNfaW9tZ3JfcGxhdGZvcm1faW5pdCgpOwotICBncnBjX3BvbGxzZXRfZ2xvYmFsX2luaXQoKTsKLX0KLQotc3RhdGljIHNpemVfdCBjb3VudF9vYmplY3RzKHZvaWQpIHsKLSAgZ3JwY19pb21ncl9vYmplY3QgKm9iajsKLSAgc2l6ZV90IG4gPSAwOwotICBmb3IgKG9iaiA9IGdfcm9vdF9vYmplY3QubmV4dDsgb2JqICE9ICZnX3Jvb3Rfb2JqZWN0OyBvYmogPSBvYmotPm5leHQpIHsKLSAgICBuKys7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB2b2lkIGR1bXBfb2JqZWN0cyhjb25zdCBjaGFyICpraW5kKSB7Ci0gIGdycGNfaW9tZ3Jfb2JqZWN0ICpvYmo7Ci0gIGZvciAob2JqID0gZ19yb290X29iamVjdC5uZXh0OyBvYmogIT0gJmdfcm9vdF9vYmplY3Q7IG9iaiA9IG9iai0+bmV4dCkgewotICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiJXMgT0JKRUNUOiAlcyAlcCIsIGtpbmQsIG9iai0+bmFtZSwgb2JqKTsKLSAgfQotfQotCi12b2lkIGdycGNfaW9tZ3Jfc2h1dGRvd24odm9pZCkgewotICBncHJfdGltZXNwZWMgc2h1dGRvd25fZGVhZGxpbmUgPSBncHJfdGltZV9hZGQoCi0gICAgICBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGdwcl90aW1lX2Zyb21fc2Vjb25kcygxMCwgR1BSX1RJTUVTUEFOKSk7Ci0gIGdwcl90aW1lc3BlYyBsYXN0X3dhcm5pbmdfdGltZSA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBncnBjX2lvbWdyX3BsYXRmb3JtX2ZsdXNoKCk7Ci0KLSAgZ3ByX211X2xvY2soJmdfbXUpOwotICBnX3NodXRkb3duID0gMTsKLSAgd2hpbGUgKGdfcm9vdF9vYmplY3QubmV4dCAhPSAmZ19yb290X29iamVjdCkgewotICAgIGlmIChncHJfdGltZV9jbXAoCi0gICAgICAgICAgICBncHJfdGltZV9zdWIoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCBsYXN0X3dhcm5pbmdfdGltZSksCi0gICAgICAgICAgICBncHJfdGltZV9mcm9tX3NlY29uZHMoMSwgR1BSX1RJTUVTUEFOKSkgPj0gMCkgewotICAgICAgaWYgKGdfcm9vdF9vYmplY3QubmV4dCAhPSAmZ19yb290X29iamVjdCkgewotICAgICAgICBncHJfbG9nKEdQUl9ERUJVRywgIldhaXRpbmcgZm9yICVkIGlvbWdyIG9iamVjdHMgdG8gYmUgZGVzdHJveWVkIiwKLSAgICAgICAgICAgICAgICBjb3VudF9vYmplY3RzKCkpOwotICAgICAgfQotICAgICAgbGFzdF93YXJuaW5nX3RpbWUgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gICAgfQotICAgIGlmIChncnBjX3RpbWVyX2NoZWNrKCZleGVjX2N0eCwgZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX01PTk9UT05JQyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKLSAgICAgIGdwcl9tdV91bmxvY2soJmdfbXUpOwotICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaCgmZXhlY19jdHgpOwotICAgICAgZ3ByX211X2xvY2soJmdfbXUpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChnX3Jvb3Rfb2JqZWN0Lm5leHQgIT0gJmdfcm9vdF9vYmplY3QpIHsKLSAgICAgIGdwcl90aW1lc3BlYyBzaG9ydF9kZWFkbGluZSA9IGdwcl90aW1lX2FkZCgKLSAgICAgICAgICBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGdwcl90aW1lX2Zyb21fbWlsbGlzKDEwMCwgR1BSX1RJTUVTUEFOKSk7Ci0gICAgICBpZiAoZ3ByX2N2X3dhaXQoJmdfcmN2LCAmZ19tdSwgc2hvcnRfZGVhZGxpbmUpKSB7Ci0gICAgICAgIGlmIChncHJfdGltZV9jbXAoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCBzaHV0ZG93bl9kZWFkbGluZSkgPiAwKSB7Ci0gICAgICAgICAgaWYgKGdfcm9vdF9vYmplY3QubmV4dCAhPSAmZ19yb290X29iamVjdCkgewotICAgICAgICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZnJlZSAlZCBpb21nciBvYmplY3RzIGJlZm9yZSBzaHV0ZG93biBkZWFkbGluZTogIgotICAgICAgICAgICAgICAgICAgICAibWVtb3J5IGxlYWtzIGFyZSBsaWtlbHkiLAotICAgICAgICAgICAgICAgICAgICBjb3VudF9vYmplY3RzKCkpOwotICAgICAgICAgICAgZHVtcF9vYmplY3RzKCJMRUFLRUQiKTsKLSAgICAgICAgICAgIGlmIChncnBjX2lvbWdyX2Fib3J0X29uX2xlYWtzKCkpIHsKLSAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0KLSAgZ3JwY190aW1lcl9saXN0X3NodXRkb3duKCZleGVjX2N0eCk7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0KLSAgLyogZW5zdXJlIGFsbCB0aHJlYWRzIGhhdmUgbGVmdCBnX211ICovCi0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0KLSAgZ3JwY19wb2xsc2V0X2dsb2JhbF9zaHV0ZG93bigpOwotICBncnBjX2lvbWdyX3BsYXRmb3JtX3NodXRkb3duKCk7Ci0gIGdycGNfZXhlY19jdHhfZ2xvYmFsX3NodXRkb3duKCk7Ci0gIGdwcl9tdV9kZXN0cm95KCZnX211KTsKLSAgZ3ByX2N2X2Rlc3Ryb3koJmdfcmN2KTsKLX0KLQotdm9pZCBncnBjX2lvbWdyX3JlZ2lzdGVyX29iamVjdChncnBjX2lvbWdyX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gIG9iai0+bmFtZSA9IGdwcl9zdHJkdXAobmFtZSk7Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgb2JqLT5uZXh0ID0gJmdfcm9vdF9vYmplY3Q7Ci0gIG9iai0+cHJldiA9IGdfcm9vdF9vYmplY3QucHJldjsKLSAgb2JqLT5uZXh0LT5wcmV2ID0gb2JqLT5wcmV2LT5uZXh0ID0gb2JqOwotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLX0KLQotdm9pZCBncnBjX2lvbWdyX3VucmVnaXN0ZXJfb2JqZWN0KGdycGNfaW9tZ3Jfb2JqZWN0ICpvYmopIHsKLSAgZ3ByX211X2xvY2soJmdfbXUpOwotICBvYmotPm5leHQtPnByZXYgPSBvYmotPnByZXY7Ci0gIG9iai0+cHJldi0+bmV4dCA9IG9iai0+bmV4dDsKLSAgZ3ByX2N2X3NpZ25hbCgmZ19yY3YpOwotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLSAgZ3ByX2ZyZWUob2JqLT5uYW1lKTsKLX0KLQotYm9vbCBncnBjX2lvbWdyX2Fib3J0X29uX2xlYWtzKHZvaWQpIHsKLSAgY2hhciAqZW52ID0gZ3ByX2dldGVudigiR1JQQ19BQk9SVF9PTl9MRUFLUyIpOwotICBpZiAoZW52ID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKnRydXRoeVtdID0geyJ5ZXMiLCAgIlllcyIsICAiWUVTIiwgInRydWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRydWUiLCAiVFJVRSIsICIxIn07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR1BSX0FSUkFZX1NJWkUodHJ1dGh5KTsgaSsrKSB7Ci0gICAgaWYgKDAgPT0gc3RyY21wKGVudiwgdHJ1dGh5W2ldKSkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCBiL3NyYy9jb3JlL2lvbWdyL2lvbWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMjM3YTQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX0lPTUdSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX0lPTUdSX0gKLQotLyoqIEluaXRpYWxpemVzIHRoZSBpb21nci4gKi8KLXZvaWQgZ3JwY19pb21ncl9pbml0KHZvaWQpOwotCi0vKiogU2lnbmFscyB0aGUgaW50ZW50aW9uIHRvIHNodXRkb3duIHRoZSBpb21nci4gKi8KLXZvaWQgZ3JwY19pb21ncl9zaHV0ZG93bih2b2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9JT01HUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oIGIvc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhZDMxOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfSU9NR1JfSU5URVJOQUxfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfSU9NR1JfSU5URVJOQUxfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX2lvbWdyX29iamVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBncnBjX2lvbWdyX29iamVjdCAqbmV4dDsKLSAgc3RydWN0IGdycGNfaW9tZ3Jfb2JqZWN0ICpwcmV2OwotfSBncnBjX2lvbWdyX29iamVjdDsKLQotdm9pZCBncnBjX3BvbGxzZXRfZ2xvYmFsX2luaXQodm9pZCk7Ci12b2lkIGdycGNfcG9sbHNldF9nbG9iYWxfc2h1dGRvd24odm9pZCk7Ci0KLXZvaWQgZ3JwY19pb21ncl9yZWdpc3Rlcl9vYmplY3QoZ3JwY19pb21ncl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkIGdycGNfaW9tZ3JfdW5yZWdpc3Rlcl9vYmplY3QoZ3JwY19pb21ncl9vYmplY3QgKm9iaik7Ci0KLXZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9pbml0KHZvaWQpOwotLyoqIGZsdXNoIGFueSBnbG9iYWxseSBxdWV1ZWQgd29yayBmcm9tIGlvbWdyICovCi12b2lkIGdycGNfaW9tZ3JfcGxhdGZvcm1fZmx1c2godm9pZCk7Ci0vKiogdGVhciBkb3duIGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyBnbG9iYWwgaW9tZ3Igc3RydWN0dXJlcyAqLwotdm9pZCBncnBjX2lvbWdyX3BsYXRmb3JtX3NodXRkb3duKHZvaWQpOwotCi1ib29sIGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3Modm9pZCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfSU9NR1JfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYyBiL3NyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2YzNDcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvZGVidWcvdHJhY2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmgiCi0KLXZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9pbml0KHZvaWQpIHsKLSAgZ3JwY19mZF9nbG9iYWxfaW5pdCgpOwotICBncnBjX3JlZ2lzdGVyX3RyYWNlcigidGNwIiwgJmdycGNfdGNwX3RyYWNlKTsKLX0KLQotdm9pZCBncnBjX2lvbWdyX3BsYXRmb3JtX2ZsdXNoKHZvaWQpIHt9Ci0KLXZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9zaHV0ZG93bih2b2lkKSB7IGdycGNfZmRfZ2xvYmFsX3NodXRkb3duKCk7IH0KLQotI2VuZGlmIC8qIEdSUENfUE9TSVhfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5oIGIvc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZmI2YS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfSU9NR1JfUE9TSVhfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfSU9NR1JfUE9TSVhfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9JT01HUl9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMgYi9zcmMvY29yZS9pb21nci9pb21ncl93aW5kb3dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTA0MTMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiCi0KLS8qIFdpbmRvd3MnIGlvIG1hbmFnZXIgaXMgZ29pbmcgdG8gYmUgZnVsbHkgZGVzaWduZWQgdXNpbmcgSU8gY29tcGxldGlvbgotICAgcG9ydHMuIEFsbCBvZiB3aGF0IHdlJ3JlIGRvaW5nIGhlcmUgaXMgYmFzaWNhbGx5IG1ha2Ugc3VyZSB0aGF0Ci0gICBXaW5kb3dzIHNvY2tldHMgYXJlIGluaXRpYWxpemVkIGluIGFuZCBvdXQuICovCi0KLXN0YXRpYyB2b2lkIHdpbnNvY2tfaW5pdCh2b2lkKSB7Ci0gIFdTQURBVEEgd3NhRGF0YTsKLSAgaW50IHN0YXR1cyA9IFdTQVN0YXJ0dXAoTUFLRVdPUkQoMiwgMCksICZ3c2FEYXRhKTsKLSAgR1BSX0FTU0VSVChzdGF0dXMgPT0gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdpbnNvY2tfc2h1dGRvd24odm9pZCkgewotICBpbnQgc3RhdHVzID0gV1NBQ2xlYW51cCgpOwotICBHUFJfQVNTRVJUKHN0YXR1cyA9PSAwKTsKLX0KLQotdm9pZCBncnBjX2lvbWdyX3BsYXRmb3JtX2luaXQodm9pZCkgewotICB3aW5zb2NrX2luaXQoKTsKLSAgZ3JwY19pb2NwX2luaXQoKTsKLX0KLQotdm9pZCBncnBjX2lvbWdyX3BsYXRmb3JtX2ZsdXNoKHZvaWQpIHsgZ3JwY19pb2NwX2ZsdXNoKCk7IH0KLQotdm9pZCBncnBjX2lvbWdyX3BsYXRmb3JtX3NodXRkb3duKHZvaWQpIHsKLSAgZ3JwY19pb2NwX3NodXRkb3duKCk7Ci0gIHdpbnNvY2tfc2h1dGRvd24oKTsKLX0KLQotI2VuZGlmIC8qIEdSUENfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCBiL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMGIxYS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9wb2xsc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1BPTExTRVRfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIgotCi0jZGVmaW5lIEdSUENfUE9MTFNFVF9LSUNLX0JST0FEQ0FTVCAoKGdycGNfcG9sbHNldF93b3JrZXIgKikxKQotCi0vKiBBIGdycGNfcG9sbHNldCBpcyBhIHNldCBvZiBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgYSBoaWdoZXIgbGV2ZWwgaXRlbSBpcwotICAgaW50ZXJlc3RlZCBpbi4gRm9yIGV4YW1wbGU6Ci0gICAgLSBhIHNlcnZlciB3aWxsIHR5cGljYWxseSBrZWVwIGEgcG9sbHNldCBjb250YWluaW5nIGFsbCBjb25uZWN0ZWQgY2hhbm5lbHMsCi0gICAgICBzbyB0aGF0IGl0IGNhbiBmaW5kIG5ldyBjYWxscyB0byBzZXJ2aWNlCi0gICAgLSBhIGNvbXBsZXRpb24gcXVldWUgbWlnaHQga2VlcCBhIHBvbGxzZXQgd2l0aCBhbiBlbnRyeSBmb3IgZWFjaCB0cmFuc3BvcnQKLSAgICAgIHRoYXQgaXMgc2VydmljaW5nIGEgY2FsbCB0aGF0IGl0J3MgdHJhY2tpbmcgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19wb2xsc2V0IGdycGNfcG9sbHNldDsKLXR5cGVkZWYgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgZ3JwY19wb2xsc2V0X3dvcmtlcjsKLQotc2l6ZV90IGdycGNfcG9sbHNldF9zaXplKHZvaWQpOwotdm9pZCBncnBjX3BvbGxzZXRfaW5pdChncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdwcl9tdSAqKm11KTsKLS8qIEJlZ2luIHNodXR0aW5nIGRvd24gdGhlIHBvbGxzZXQsIGFuZCBjYWxsIGNsb3N1cmUgd2hlbiBkb25lLgotICogcG9sbHNldCdzIG11dGV4IG11c3QgYmUgaGVsZCAqLwotdm9pZCBncnBjX3BvbGxzZXRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7Ci0vKiogUmVzZXQgdGhlIHBvbGxzZXQgdG8gaXRzIGluaXRpYWwgc3RhdGUgKHBlcmhhcHMgd2l0aCBzb21lIGNhY2hlZCBvYmplY3RzKTsKLSAqICBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHNodXRkb3duICovCi12b2lkIGdycGNfcG9sbHNldF9yZXNldChncnBjX3BvbGxzZXQgKnBvbGxzZXQpOwotdm9pZCBncnBjX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpOwotCi0vKiBEbyBzb21lIHdvcmsgb24gYSBwb2xsc2V0LgotICAgTWF5IGludm9sdmUgaW52b2tpbmcgYXN5bmNocm9ub3VzIGNhbGxiYWNrcywgb3IgYWN0dWFsbHkgcG9sbGluZyBmaWxlCi0gICBkZXNjcmlwdG9ycy4KLSAgIFJlcXVpcmVzIHBvbGxzZXQncyBtdXRleCBsb2NrZWQuCi0gICBNYXkgdW5sb2NrIGl0cyBtdXRleCBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4KLQotICAgd29ya2VyIGlzIGEgKHBsYXRmb3JtLXNwZWNpZmljKSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWtlIHVwCi0gICBmcm9tIGdycGNfcG9sbHNldF93b3JrIGJlZm9yZSBhbnkgZXZlbnRzIGFyZSByZWNlaXZlZCBhbmQgYmVmb3JlIHRoZSB0aW1lb3V0Ci0gICBoYXMgZXhwaXJlZC4gSXQgaXMgYm90aCBpbml0aWFsaXplZCBhbmQgZGVzdHJveWVkIGJ5IGdycGNfcG9sbHNldF93b3JrLgotICAgSW5pdGlhbGl6YXRpb24gb2Ygd29ya2VyIGlzIGd1YXJhbnRlZWQgdG8gb2NjdXIgQkVGT1JFIHRoZQotICAgcG9sbHNldCdzIG11dGV4IGlzIHJlbGVhc2VkIGZvciB0aGUgZmlyc3QgdGltZSBieSBncnBjX3BvbGxzZXRfd29yawotICAgYW5kIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBpdCB3aWxsIG5vdCBiZSByZWxlYXNlZCBieSBncnBjX3BvbGxzZXRfd29yawotICAgQUZURVIgd29ya2VyIGhhcyBiZWVuIGRlc3Ryb3llZC4KLQotICAgVHJpZXMgbm90IHRvIGJsb2NrIHBhc3QgZGVhZGxpbmUuCi0gICBNYXkgY2FsbCBncnBjX2Nsb3N1cmVfbGlzdF9ydW4gb24gZ3JwY19jbG9zdXJlX2xpc3QsIHdpdGhvdXQgaG9sZGluZyB0aGUKLSAgIHBvbGxzZXQKLSAgIGxvY2sgKi8KLXZvaWQgZ3JwY19wb2xsc2V0X3dvcmsoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqKndvcmtlciwgZ3ByX3RpbWVzcGVjIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKTsKLQotLyogQnJlYWsgb25lIHBvbGxpbmcgdGhyZWFkIG91dCBvZiBwb2xsaW5nIHdvcmsgZm9yIHRoaXMgcG9sbHNldC4KLSAgIElmIHNwZWNpZmljX3dvcmtlciBpcyBHUlBDX1BPTExTRVRfS0lDS19CUk9BRENBU1QsIGtpY2sgQUxMIHRoZSB3b3JrZXJzLgotICAgT3RoZXJ3aXNlLCBpZiBzcGVjaWZpY193b3JrZXIgaXMgbm9uLU5VTEwsIHRoZW4ga2ljayB0aGF0IHdvcmtlci4gKi8KLXZvaWQgZ3JwY19wb2xsc2V0X2tpY2soZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICpzcGVjaWZpY193b3JrZXIpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1BPTExTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMgYi9zcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwZjI3Zi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9MSU5VWF9NVUxUSVBPTExfV0lUSF9FUE9MTAotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2Vwb2xsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiCi0KLXN0cnVjdCBlcG9sbF9mZF9saXN0IHsKLSAgaW50ICplcG9sbF9mZHM7Ci0gIHNpemVfdCBjb3VudDsKLSAgc2l6ZV90IGNhcGFjaXR5OwotfTsKLQotc3RhdGljIHN0cnVjdCBlcG9sbF9mZF9saXN0IGVwb2xsX2ZkX2dsb2JhbF9saXN0Owotc3RhdGljIGdwcl9vbmNlIGluaXRfZXBvbGxfZmRfbGlzdF9tdSA9IEdQUl9PTkNFX0lOSVQ7Ci1zdGF0aWMgZ3ByX211IGVwb2xsX2ZkX2xpc3RfbXU7Ci0KLXN0YXRpYyB2b2lkIGluaXRfbXUodm9pZCkgeyBncHJfbXVfaW5pdCgmZXBvbGxfZmRfbGlzdF9tdSk7IH0KLQotc3RhdGljIHZvaWQgYWRkX2Vwb2xsX2ZkX3RvX2dsb2JhbF9saXN0KGludCBlcG9sbF9mZCkgewotICBncHJfb25jZV9pbml0KCZpbml0X2Vwb2xsX2ZkX2xpc3RfbXUsIGluaXRfbXUpOwotCi0gIGdwcl9tdV9sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKLSAgaWYgKGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNvdW50ID09IGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNhcGFjaXR5KSB7Ci0gICAgZXBvbGxfZmRfZ2xvYmFsX2xpc3QuY2FwYWNpdHkgPQotICAgICAgICBHUFJfTUFYKChzaXplX3QpOCwgZXBvbGxfZmRfZ2xvYmFsX2xpc3QuY2FwYWNpdHkgKiAyKTsKLSAgICBlcG9sbF9mZF9nbG9iYWxfbGlzdC5lcG9sbF9mZHMgPQotICAgICAgICBncHJfcmVhbGxvYyhlcG9sbF9mZF9nbG9iYWxfbGlzdC5lcG9sbF9mZHMsCi0gICAgICAgICAgICAgICAgICAgIGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNhcGFjaXR5ICogc2l6ZW9mKGludCkpOwotICB9Ci0gIGVwb2xsX2ZkX2dsb2JhbF9saXN0LmVwb2xsX2Zkc1tlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudCsrXSA9IGVwb2xsX2ZkOwotICBncHJfbXVfdW5sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX2Vwb2xsX2ZkX2Zyb21fZ2xvYmFsX2xpc3QoaW50IGVwb2xsX2ZkKSB7Ci0gIGdwcl9tdV9sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKLSAgR1BSX0FTU0VSVChlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudCA+IDApOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNvdW50OyBpKyspIHsKLSAgICBpZiAoZXBvbGxfZmQgPT0gZXBvbGxfZmRfZ2xvYmFsX2xpc3QuZXBvbGxfZmRzW2ldKSB7Ci0gICAgICBlcG9sbF9mZF9nbG9iYWxfbGlzdC5lcG9sbF9mZHNbaV0gPQotICAgICAgICAgIGVwb2xsX2ZkX2dsb2JhbF9saXN0LmVwb2xsX2Zkc1stLShlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudCldOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGdwcl9tdV91bmxvY2soJmVwb2xsX2ZkX2xpc3RfbXUpOwotfQotCi12b2lkIGdycGNfcmVtb3ZlX2ZkX2Zyb21fYWxsX2Vwb2xsX3NldHMoaW50IGZkKSB7Ci0gIGludCBlcnI7Ci0gIGdwcl9vbmNlX2luaXQoJmluaXRfZXBvbGxfZmRfbGlzdF9tdSwgaW5pdF9tdSk7Ci0gIGdwcl9tdV9sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKLSAgaWYgKGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNvdW50ID09IDApIHsKLSAgICBncHJfbXVfdW5sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudDsgaSsrKSB7Ci0gICAgZXJyID0gZXBvbGxfY3RsKGVwb2xsX2ZkX2dsb2JhbF9saXN0LmVwb2xsX2Zkc1tpXSwgRVBPTExfQ1RMX0RFTCwgZmQsIE5VTEwpOwotICAgIGlmIChlcnIgPCAwICYmIGVycm5vICE9IEVOT0VOVCkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJlcG9sbF9jdGwgZGVsIGZvciAlZCBmYWlsZWQ6ICVzIiwgZmQsCi0gICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICB9Ci0gIGdwcl9tdV91bmxvY2soJmVwb2xsX2ZkX2xpc3RfbXUpOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfcG9sbHNldCAqcG9sbHNldDsKLSAgZ3JwY19mZCAqZmQ7Ci0gIGdycGNfY2xvc3VyZSBjbG9zdXJlOwotfSBkZWxheWVkX2FkZDsKLQotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgZXBvbGxfZmQ7IH0gcG9sbHNldF9oZHI7Ci0KLXN0YXRpYyB2b2lkIGZpbmFsbHlfYWRkX2ZkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2ZkICpmZCkgewotICBwb2xsc2V0X2hkciAqaCA9IHBvbGxzZXQtPmRhdGEucHRyOwotICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7Ci0gIGludCBlcnI7Ci0gIGdycGNfZmRfd2F0Y2hlciB3YXRjaGVyOwotCi0gIC8qIFdlIHByZXRlbmQgdG8gYmUgcG9sbGluZyB3aGlsc3QgYWRkaW5nIGFuIGZkIHRvIGtlZXAgdGhlIGZkIGZyb20gYmVpbmcKLSAgICAgY2xvc2VkIGR1cmluZyB0aGUgYWRkLiBUaGlzIG1heSByZXN1bHQgaW4gYSBzcHVyaW91cyB3YWtldXAgYmVpbmcgYXNzaWduZWQKLSAgICAgdG8gdGhpcyBwb2xsc2V0IHdoaWxzdCBhZGRpbmcsIGJ1dCB0aGF0IHNob3VsZCBiZSBiZW5pZ24uICovCi0gIEdQUl9BU1NFUlQoZ3JwY19mZF9iZWdpbl9wb2xsKGZkLCBwb2xsc2V0LCBOVUxMLCAwLCAwLCAmd2F0Y2hlcikgPT0gMCk7Ci0gIGlmICh3YXRjaGVyLmZkICE9IE5VTEwpIHsKLSAgICBldi5ldmVudHMgPSAodWludDMyX3QpKEVQT0xMSU4gfCBFUE9MTE9VVCB8IEVQT0xMRVQpOwotICAgIGV2LmRhdGEucHRyID0gZmQ7Ci0gICAgZXJyID0gZXBvbGxfY3RsKGgtPmVwb2xsX2ZkLCBFUE9MTF9DVExfQURELCBmZC0+ZmQsICZldik7Ci0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgIC8qIEZEcyBtYXkgYmUgYWRkZWQgdG8gYSBwb2xsc2V0IG11bHRpcGxlIHRpbWVzLCBzbyBFRVhJU1QgaXMgbm9ybWFsLiAqLwotICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImVwb2xsX2N0bCBhZGQgZm9yICVkIGZhaWxlZDogJXMiLCBmZC0+ZmQsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZ3JwY19mZF9lbmRfcG9sbChleGVjX2N0eCwgJndhdGNoZXIsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBwZXJmb3JtX2RlbGF5ZWRfYWRkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3RhdHVzKSB7Ci0gIGRlbGF5ZWRfYWRkICpkYSA9IGFyZzsKLQotICBpZiAoIWdycGNfZmRfaXNfb3JwaGFuZWQoZGEtPmZkKSkgewotICAgIGZpbmFsbHlfYWRkX2ZkKGV4ZWNfY3R4LCBkYS0+cG9sbHNldCwgZGEtPmZkKTsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZkYS0+cG9sbHNldC0+bXUpOwotICBkYS0+cG9sbHNldC0+aW5fZmxpZ2h0X2Nicy0tOwotICBpZiAoZGEtPnBvbGxzZXQtPnNodXR0aW5nX2Rvd24pIHsKLSAgICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcG9sbHNldCBhbnltb3JlLiAqLwotICAgIGlmIChkYS0+cG9sbHNldC0+aW5fZmxpZ2h0X2NicyA9PSAwICYmICFkYS0+cG9sbHNldC0+Y2FsbGVkX3NodXRkb3duKSB7Ci0gICAgICBkYS0+cG9sbHNldC0+Y2FsbGVkX3NodXRkb3duID0gMTsKLSAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgZGEtPnBvbGxzZXQtPnNodXRkb3duX2RvbmUsIHRydWUsIE5VTEwpOwotICAgIH0KLSAgfQotICBncHJfbXVfdW5sb2NrKCZkYS0+cG9sbHNldC0+bXUpOwotCi0gIEdSUENfRkRfVU5SRUYoZGEtPmZkLCAiZGVsYXllZF9hZGQiKTsKLQotICBncHJfZnJlZShkYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfYWRkX2ZkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19mZCAqZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5kX3VubG9ja19wb2xsc2V0KSB7Ci0gIGlmIChhbmRfdW5sb2NrX3BvbGxzZXQpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gICAgZmluYWxseV9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXQsIGZkKTsKLSAgfSBlbHNlIHsKLSAgICBkZWxheWVkX2FkZCAqZGEgPSBncHJfbWFsbG9jKHNpemVvZigqZGEpKTsKLSAgICBkYS0+cG9sbHNldCA9IHBvbGxzZXQ7Ci0gICAgZGEtPmZkID0gZmQ7Ci0gICAgR1JQQ19GRF9SRUYoZmQsICJkZWxheWVkX2FkZCIpOwotICAgIGdycGNfY2xvc3VyZV9pbml0KCZkYS0+Y2xvc3VyZSwgcGVyZm9ybV9kZWxheWVkX2FkZCwgZGEpOwotICAgIHBvbGxzZXQtPmluX2ZsaWdodF9jYnMrKzsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZkYS0+Y2xvc3VyZSwgdHJ1ZSwgTlVMTCk7Ci0gIH0KLX0KLQotLyogVE9ETyhrbGVtcG5lcik6IFdlIHByb2JhYmx5IHdhbnQgdG8gdHVybiB0aGlzIGRvd24gYSBiaXQgKi8KLSNkZWZpbmUgR1JQQ19FUE9MTF9NQVhfRVZFTlRTIDEwMDAKLQotc3RhdGljIHZvaWQgbXVsdGlwb2xsX3dpdGhfZXBvbGxfcG9sbHNldF9tYXliZV93b3JrX2FuZF91bmxvY2soCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3JwY19wb2xsc2V0X3dvcmtlciAqd29ya2VyLAotICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwgZ3ByX3RpbWVzcGVjIG5vdykgewotICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXBfZXZbR1JQQ19FUE9MTF9NQVhfRVZFTlRTXTsKLSAgaW50IGVwX3J2OwotICBpbnQgcG9sbF9ydjsKLSAgcG9sbHNldF9oZHIgKmggPSBwb2xsc2V0LT5kYXRhLnB0cjsKLSAgaW50IHRpbWVvdXRfbXM7Ci0gIHN0cnVjdCBwb2xsZmQgcGZkc1syXTsKLQotICAvKiBJZiB5b3Ugd2FudCB0byBpZ25vcmUgZXBvbGwncyBhYmlsaXR5IHRvIHNhbmVseSBoYW5kbGUgcGFyYWxsZWwgcG9sbGVycywKLSAgICogZm9yIGEgbW9yZSBhcHBsZXMtdG8tYXBwbGVzIHBlcmZvcm1hbmNlIGNvbXBhcmlzb24gd2l0aCBwb2xsLCBhZGQgYQotICAgKiBpZiAocG9sbHNldC0+Y291bnRlciAhPSAwKSB7IHJldHVybiAwOyB9Ci0gICAqIGhlcmUuCi0gICAqLwotCi0gIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKLQotICB0aW1lb3V0X21zID0gZ3JwY19wb2xsX2RlYWRsaW5lX3RvX21pbGxpc190aW1lb3V0KGRlYWRsaW5lLCBub3cpOwotCi0gIHBmZHNbMF0uZmQgPSBHUlBDX1dBS0VVUF9GRF9HRVRfUkVBRF9GRCgmd29ya2VyLT53YWtldXBfZmQtPmZkKTsKLSAgcGZkc1swXS5ldmVudHMgPSBQT0xMSU47Ci0gIHBmZHNbMF0ucmV2ZW50cyA9IDA7Ci0gIHBmZHNbMV0uZmQgPSBoLT5lcG9sbF9mZDsKLSAgcGZkc1sxXS5ldmVudHMgPSBQT0xMSU47Ci0gIHBmZHNbMV0ucmV2ZW50cyA9IDA7Ci0KLSAgLyogVE9ETyh2cGFpKTogQ29uc2lkZXIgZmlyc3QgZG9pbmcgYSAwIHRpbWVvdXQgcG9sbCBoZXJlIHRvIGF2b2lkCi0gICAgIGV2ZW4gZ29pbmcgaW50byB0aGUgYmxvY2tpbmcgYW5ub3RhdGlvbiBpZiBwb3NzaWJsZSAqLwotICBHUFJfVElNRVJfQkVHSU4oInBvbGwiLCAwKTsKLSAgR1JQQ19TQ0hFRFVMSU5HX1NUQVJUX0JMT0NLSU5HX1JFR0lPTjsKLSAgcG9sbF9ydiA9IGdycGNfcG9sbF9mdW5jdGlvbihwZmRzLCAyLCB0aW1lb3V0X21zKTsKLSAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047Ci0gIEdQUl9USU1FUl9FTkQoInBvbGwiLCAwKTsKLQotICBpZiAocG9sbF9ydiA8IDApIHsKLSAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAicG9sbCgpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgfSBlbHNlIGlmIChwb2xsX3J2ID09IDApIHsKLSAgICAvKiBkbyBub3RoaW5nICovCi0gIH0gZWxzZSB7Ci0gICAgaWYgKHBmZHNbMF0ucmV2ZW50cykgewotICAgICAgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoJndvcmtlci0+d2FrZXVwX2ZkLT5mZCk7Ci0gICAgfQotICAgIGlmIChwZmRzWzFdLnJldmVudHMpIHsKLSAgICAgIGRvIHsKLSAgICAgICAgLyogVGhlIGZvbGxvd2luZyBlcG9sbF93YWl0IG5ldmVyIGJsb2NrczsgaXQgaGFzIGEgdGltZW91dCBvZiAwICovCi0gICAgICAgIGVwX3J2ID0gZXBvbGxfd2FpdChoLT5lcG9sbF9mZCwgZXBfZXYsIEdSUENfRVBPTExfTUFYX0VWRU5UUywgMCk7Ci0gICAgICAgIGlmIChlcF9ydiA8IDApIHsKLSAgICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZXBvbGxfd2FpdCgpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXBfcnY7ICsraSkgewotICAgICAgICAgICAgZ3JwY19mZCAqZmQgPSBlcF9ldltpXS5kYXRhLnB0cjsKLSAgICAgICAgICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBXZSBtaWdodCB3YW50IHRvIGNvbnNpZGVyIG1ha2luZyBlcnIgYW5kIHByaQotICAgICAgICAgICAgICogc2VwYXJhdGUgZXZlbnRzICovCi0gICAgICAgICAgICBpbnQgY2FuY2VsID0gZXBfZXZbaV0uZXZlbnRzICYgKEVQT0xMRVJSIHwgRVBPTExIVVApOwotICAgICAgICAgICAgaW50IHJlYWRfZXYgPSBlcF9ldltpXS5ldmVudHMgJiAoRVBPTExJTiB8IEVQT0xMUFJJKTsKLSAgICAgICAgICAgIGludCB3cml0ZV9ldiA9IGVwX2V2W2ldLmV2ZW50cyAmIEVQT0xMT1VUOwotICAgICAgICAgICAgaWYgKGZkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoJmdycGNfZ2xvYmFsX3dha2V1cF9mZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAocmVhZF9ldiB8fCBjYW5jZWwpIHsKLSAgICAgICAgICAgICAgICBncnBjX2ZkX2JlY29tZV9yZWFkYWJsZShleGVjX2N0eCwgZmQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICh3cml0ZV9ldiB8fCBjYW5jZWwpIHsKLSAgICAgICAgICAgICAgICBncnBjX2ZkX2JlY29tZV93cml0YWJsZShleGVjX2N0eCwgZmQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IHdoaWxlIChlcF9ydiA9PSBHUlBDX0VQT0xMX01BWF9FVkVOVFMpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2ZpbmlzaF9zaHV0ZG93bigKLSAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHt9Ci0KLXN0YXRpYyB2b2lkIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKLSAgcG9sbHNldF9oZHIgKmggPSBwb2xsc2V0LT5kYXRhLnB0cjsKLSAgY2xvc2UoaC0+ZXBvbGxfZmQpOwotICByZW1vdmVfZXBvbGxfZmRfZnJvbV9nbG9iYWxfbGlzdChoLT5lcG9sbF9mZCk7Ci0gIGdwcl9mcmVlKGgpOwotfQotCi1zdGF0aWMgY29uc3QgZ3JwY19wb2xsc2V0X3Z0YWJsZSBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0ID0gewotICAgIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfYWRkX2ZkLAotICAgIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfbWF5YmVfd29ya19hbmRfdW5sb2NrLAotICAgIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfZmluaXNoX3NodXRkb3duLAotICAgIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfZGVzdHJveX07Ci0KLXN0YXRpYyB2b2lkIGVwb2xsX2JlY29tZV9tdWx0aXBvbGxlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfZmQgKipmZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5mZHMpIHsKLSAgc2l6ZV90IGk7Ci0gIHBvbGxzZXRfaGRyICpoID0gZ3ByX21hbGxvYyhzaXplb2YocG9sbHNldF9oZHIpKTsKLSAgc3RydWN0IGVwb2xsX2V2ZW50IGV2OwotICBpbnQgZXJyOwotCi0gIHBvbGxzZXQtPnZ0YWJsZSA9ICZtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0OwotICBwb2xsc2V0LT5kYXRhLnB0ciA9IGg7Ci0gIGgtPmVwb2xsX2ZkID0gZXBvbGxfY3JlYXRlMShFUE9MTF9DTE9FWEVDKTsKLSAgaWYgKGgtPmVwb2xsX2ZkIDwgMCkgewotICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBGYWxsIGJhY2sgdG8gcG9sbCBoZXJlLCBlc3BlY2lhbGx5IG9uIEVOT1NZUyAqLwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZXBvbGxfY3JlYXRlMSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIGFkZF9lcG9sbF9mZF90b19nbG9iYWxfbGlzdChoLT5lcG9sbF9mZCk7Ci0KLSAgZXYuZXZlbnRzID0gKHVpbnQzMl90KShFUE9MTElOIHwgRVBPTExFVCk7Ci0gIGV2LmRhdGEucHRyID0gTlVMTDsKLSAgZXJyID0gZXBvbGxfY3RsKGgtPmVwb2xsX2ZkLCBFUE9MTF9DVExfQURELAotICAgICAgICAgICAgICAgICAgR1JQQ19XQUtFVVBfRkRfR0VUX1JFQURfRkQoJmdycGNfZ2xvYmFsX3dha2V1cF9mZCksICZldik7Ci0gIGlmIChlcnIgPCAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJlcG9sbF9jdGwgYWRkIGZvciAlZCBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgIEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZncnBjX2dsb2JhbF93YWtldXBfZmQpLAotICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKLSAgICBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2FkZF9mZChleGVjX2N0eCwgcG9sbHNldCwgZmRzW2ldLCAwKTsKLSAgfQotfQotCi1ncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcl90eXBlIGdycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyID0KLSAgICBlcG9sbF9iZWNvbWVfbXVsdGlwb2xsZXI7Ci0KLSNlbHNlIC8qIEdQUl9MSU5VWF9NVUxUSVBPTExfV0lUSF9FUE9MTCAqLwotCi12b2lkIGdycGNfcmVtb3ZlX2ZkX2Zyb21fYWxsX2Vwb2xsX3NldHMoaW50IGZkKSB7fQotCi0jZW5kaWYgLyogR1BSX0xJTlVYX01VTFRJUE9MTF9XSVRIX0VQT0xMICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIGIvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNmZiNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogYWxsIHBvbGxlZCBmZHMgKi8KLSAgc2l6ZV90IGZkX2NvdW50OwotICBzaXplX3QgZmRfY2FwYWNpdHk7Ci0gIGdycGNfZmQgKipmZHM7Ci0gIC8qIGZkcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHBvbGxzZXQgZXhwbGljaXRseSAqLwotICBzaXplX3QgZGVsX2NvdW50OwotICBzaXplX3QgZGVsX2NhcGFjaXR5OwotICBncnBjX2ZkICoqZGVsczsKLX0gcG9sbHNldF9oZHI7Ci0KLXN0YXRpYyB2b2lkIG11bHRpcG9sbF93aXRoX3BvbGxfcG9sbHNldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19mZCAqZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmRfdW5sb2NrX3BvbGxzZXQpIHsKLSAgc2l6ZV90IGk7Ci0gIHBvbGxzZXRfaGRyICpoID0gcG9sbHNldC0+ZGF0YS5wdHI7Ci0gIC8qIFRPRE8oY3RpbGxlcik6IHRoaXMgaXMgTyhudW1fZmRzXjIpOyBtYXliZSBzd2l0Y2ggdG8gYSBoYXNoIHNldCBoZXJlICovCi0gIGZvciAoaSA9IDA7IGkgPCBoLT5mZF9jb3VudDsgaSsrKSB7Ci0gICAgaWYgKGgtPmZkc1tpXSA9PSBmZCkgZ290byBleGl0OwotICB9Ci0gIGlmIChoLT5mZF9jb3VudCA9PSBoLT5mZF9jYXBhY2l0eSkgewotICAgIGgtPmZkX2NhcGFjaXR5ID0gR1BSX01BWChoLT5mZF9jYXBhY2l0eSArIDgsIGgtPmZkX2NvdW50ICogMyAvIDIpOwotICAgIGgtPmZkcyA9IGdwcl9yZWFsbG9jKGgtPmZkcywgc2l6ZW9mKGdycGNfZmQgKikgKiBoLT5mZF9jYXBhY2l0eSk7Ci0gIH0KLSAgaC0+ZmRzW2gtPmZkX2NvdW50KytdID0gZmQ7Ci0gIEdSUENfRkRfUkVGKGZkLCAibXVsdGlwb2xsZXIiKTsKLWV4aXQ6Ci0gIGlmIChhbmRfdW5sb2NrX3BvbGxzZXQpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X21heWJlX3dvcmtfYW5kX3VubG9jaygKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIsCi0gICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCBncHJfdGltZXNwZWMgbm93KSB7Ci0jZGVmaW5lIFBPTExPVVRfQ0hFQ0sgKFBPTExPVVQgfCBQT0xMSFVQIHwgUE9MTEVSUikKLSNkZWZpbmUgUE9MTElOX0NIRUNLIChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikKLQotICBpbnQgdGltZW91dDsKLSAgaW50IHI7Ci0gIHNpemVfdCBpLCBqLCBmZF9jb3VudDsKLSAgbmZkc190IHBmZF9jb3VudDsKLSAgcG9sbHNldF9oZHIgKmg7Ci0gIC8qIFRPRE8oY3RpbGxlcik6IGlubGluZSBzb21lIGVsZW1lbnRzIHRvIGF2b2lkIGFuIGFsbG9jYXRpb24gKi8KLSAgZ3JwY19mZF93YXRjaGVyICp3YXRjaGVyczsKLSAgc3RydWN0IHBvbGxmZCAqcGZkczsKLQotICBoID0gcG9sbHNldC0+ZGF0YS5wdHI7Ci0gIHRpbWVvdXQgPSBncnBjX3BvbGxfZGVhZGxpbmVfdG9fbWlsbGlzX3RpbWVvdXQoZGVhZGxpbmUsIG5vdyk7Ci0gIC8qIFRPRE8oY3RpbGxlcik6IHBlcmZvcm0ganVzdCBvbmUgbWFsbG9jIGhlcmUgaWYgd2UgZXhjZWVkIHRoZSBpbmxpbmUgY2FzZSAqLwotICBwZmRzID0gZ3ByX21hbGxvYyhzaXplb2YoKnBmZHMpICogKGgtPmZkX2NvdW50ICsgMikpOwotICB3YXRjaGVycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp3YXRjaGVycykgKiAoaC0+ZmRfY291bnQgKyAyKSk7Ci0gIGZkX2NvdW50ID0gMDsKLSAgcGZkX2NvdW50ID0gMjsKLSAgcGZkc1swXS5mZCA9IEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZncnBjX2dsb2JhbF93YWtldXBfZmQpOwotICBwZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKLSAgcGZkc1swXS5yZXZlbnRzID0gMDsKLSAgcGZkc1sxXS5mZCA9IEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZ3b3JrZXItPndha2V1cF9mZC0+ZmQpOwotICBwZmRzWzFdLmV2ZW50cyA9IFBPTExJTjsKLSAgcGZkc1sxXS5yZXZlbnRzID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IGgtPmZkX2NvdW50OyBpKyspIHsKLSAgICBpbnQgcmVtb3ZlID0gZ3JwY19mZF9pc19vcnBoYW5lZChoLT5mZHNbaV0pOwotICAgIGZvciAoaiA9IDA7ICFyZW1vdmUgJiYgaiA8IGgtPmRlbF9jb3VudDsgaisrKSB7Ci0gICAgICBpZiAoaC0+ZmRzW2ldID09IGgtPmRlbHNbal0pIHJlbW92ZSA9IDE7Ci0gICAgfQotICAgIGlmIChyZW1vdmUpIHsKLSAgICAgIEdSUENfRkRfVU5SRUYoaC0+ZmRzW2ldLCAibXVsdGlwb2xsZXIiKTsKLSAgICB9IGVsc2UgewotICAgICAgaC0+ZmRzW2ZkX2NvdW50KytdID0gaC0+ZmRzW2ldOwotICAgICAgd2F0Y2hlcnNbcGZkX2NvdW50XS5mZCA9IGgtPmZkc1tpXTsKLSAgICAgIEdSUENfRkRfUkVGKHdhdGNoZXJzW3BmZF9jb3VudF0uZmQsICJtdWx0aXBvbGxlcl9zdGFydCIpOwotICAgICAgcGZkc1twZmRfY291bnRdLmZkID0gaC0+ZmRzW2ldLT5mZDsKLSAgICAgIHBmZHNbcGZkX2NvdW50XS5yZXZlbnRzID0gMDsKLSAgICAgIHBmZF9jb3VudCsrOwotICAgIH0KLSAgfQotICBmb3IgKGogPSAwOyBqIDwgaC0+ZGVsX2NvdW50OyBqKyspIHsKLSAgICBHUlBDX0ZEX1VOUkVGKGgtPmRlbHNbal0sICJtdWx0aXBvbGxlcl9kZWwiKTsKLSAgfQotICBoLT5kZWxfY291bnQgPSAwOwotICBoLT5mZF9jb3VudCA9IGZkX2NvdW50OwotICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7Ci0KLSAgZm9yIChpID0gMjsgaSA8IHBmZF9jb3VudDsgaSsrKSB7Ci0gICAgZ3JwY19mZCAqZmQgPSB3YXRjaGVyc1tpXS5mZDsKLSAgICBwZmRzW2ldLmV2ZW50cyA9IChzaG9ydClncnBjX2ZkX2JlZ2luX3BvbGwoZmQsIHBvbGxzZXQsIHdvcmtlciwgUE9MTElOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMT1VULCAmd2F0Y2hlcnNbaV0pOwotICAgIEdSUENfRkRfVU5SRUYoZmQsICJtdWx0aXBvbGxlcl9zdGFydCIpOwotICB9Ci0KLSAgLyogVE9ETyh2cGFpKTogQ29uc2lkZXIgZmlyc3QgZG9pbmcgYSAwIHRpbWVvdXQgcG9sbCBoZXJlIHRvIGF2b2lkCi0gICAgIGV2ZW4gZ29pbmcgaW50byB0aGUgYmxvY2tpbmcgYW5ub3RhdGlvbiBpZiBwb3NzaWJsZSAqLwotICBHUlBDX1NDSEVEVUxJTkdfU1RBUlRfQkxPQ0tJTkdfUkVHSU9OOwotICByID0gZ3JwY19wb2xsX2Z1bmN0aW9uKHBmZHMsIHBmZF9jb3VudCwgdGltZW91dCk7Ci0gIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OOwotCi0gIGlmIChyIDwgMCkgewotICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJwb2xsKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIGZvciAoaSA9IDI7IGkgPCBwZmRfY291bnQ7IGkrKykgewotICAgICAgZ3JwY19mZF9lbmRfcG9sbChleGVjX2N0eCwgJndhdGNoZXJzW2ldLCAwLCAwKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAociA9PSAwKSB7Ci0gICAgZm9yIChpID0gMjsgaSA8IHBmZF9jb3VudDsgaSsrKSB7Ci0gICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmd2F0Y2hlcnNbaV0sIDAsIDApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAocGZkc1swXS5yZXZlbnRzICYgUE9MTElOX0NIRUNLKSB7Ci0gICAgICBncnBjX3dha2V1cF9mZF9jb25zdW1lX3dha2V1cCgmZ3JwY19nbG9iYWxfd2FrZXVwX2ZkKTsKLSAgICB9Ci0gICAgaWYgKHBmZHNbMV0ucmV2ZW50cyAmIFBPTExJTl9DSEVDSykgewotICAgICAgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoJndvcmtlci0+d2FrZXVwX2ZkLT5mZCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDI7IGkgPCBwZmRfY291bnQ7IGkrKykgewotICAgICAgaWYgKHdhdGNoZXJzW2ldLmZkID09IE5VTEwpIHsKLSAgICAgICAgZ3JwY19mZF9lbmRfcG9sbChleGVjX2N0eCwgJndhdGNoZXJzW2ldLCAwLCAwKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmd2F0Y2hlcnNbaV0sIHBmZHNbaV0ucmV2ZW50cyAmIFBPTExJTl9DSEVDSywKLSAgICAgICAgICAgICAgICAgICAgICAgcGZkc1tpXS5yZXZlbnRzICYgUE9MTE9VVF9DSEVDSyk7Ci0gICAgfQotICB9Ci0KLSAgZ3ByX2ZyZWUocGZkcyk7Ci0gIGdwcl9mcmVlKHdhdGNoZXJzKTsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X2ZpbmlzaF9zaHV0ZG93bihncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKLSAgc2l6ZV90IGk7Ci0gIHBvbGxzZXRfaGRyICpoID0gcG9sbHNldC0+ZGF0YS5wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCBoLT5mZF9jb3VudDsgaSsrKSB7Ci0gICAgR1JQQ19GRF9VTlJFRihoLT5mZHNbaV0sICJtdWx0aXBvbGxlciIpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBoLT5kZWxfY291bnQ7IGkrKykgewotICAgIEdSUENfRkRfVU5SRUYoaC0+ZGVsc1tpXSwgIm11bHRpcG9sbGVyX2RlbCIpOwotICB9Ci0gIGgtPmZkX2NvdW50ID0gMDsKLSAgaC0+ZGVsX2NvdW50ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X2Rlc3Ryb3koZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7Ci0gIHBvbGxzZXRfaGRyICpoID0gcG9sbHNldC0+ZGF0YS5wdHI7Ci0gIG11bHRpcG9sbF93aXRoX3BvbGxfcG9sbHNldF9maW5pc2hfc2h1dGRvd24ocG9sbHNldCk7Ci0gIGdwcl9mcmVlKGgtPmZkcyk7Ci0gIGdwcl9mcmVlKGgtPmRlbHMpOwotICBncHJfZnJlZShoKTsKLX0KLQotc3RhdGljIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0ID0gewotICAgIG11bHRpcG9sbF93aXRoX3BvbGxfcG9sbHNldF9hZGRfZmQsCi0gICAgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X21heWJlX3dvcmtfYW5kX3VubG9jaywKLSAgICBtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXRfZmluaXNoX3NodXRkb3duLAotICAgIG11bHRpcG9sbF93aXRoX3BvbGxfcG9sbHNldF9kZXN0cm95fTsKLQotdm9pZCBncnBjX3BvbGxfYmVjb21lX211bHRpcG9sbGVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3JwY19mZCAqKmZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmZkcykgewotICBzaXplX3QgaTsKLSAgcG9sbHNldF9oZHIgKmggPSBncHJfbWFsbG9jKHNpemVvZihwb2xsc2V0X2hkcikpOwotICBwb2xsc2V0LT52dGFibGUgPSAmbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0OwotICBwb2xsc2V0LT5kYXRhLnB0ciA9IGg7Ci0gIGgtPmZkX2NvdW50ID0gbmZkczsKLSAgaC0+ZmRfY2FwYWNpdHkgPSBuZmRzOwotICBoLT5mZHMgPSBncHJfbWFsbG9jKG5mZHMgKiBzaXplb2YoZ3JwY19mZCAqKSk7Ci0gIGgtPmRlbF9jb3VudCA9IDA7Ci0gIGgtPmRlbF9jYXBhY2l0eSA9IDA7Ci0gIGgtPmRlbHMgPSBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7Ci0gICAgaC0+ZmRzW2ldID0gZmRzW2ldOwotICAgIEdSUENfRkRfUkVGKGZkc1tpXSwgIm11bHRpcG9sbGVyIik7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIEdQUl9QT1NJWF9TT0NLRVQgKi8KLQotI2lmZGVmIEdQUl9QT1NJWF9NVUxUSVBPTExfV0lUSF9QT0xMCi1ncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcl90eXBlIGdycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyID0KLSAgICBncnBjX3BvbGxfYmVjb21lX211bHRpcG9sbGVyOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTVhNzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3Rscy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIKLQotR1BSX1RMU19ERUNMKGdfY3VycmVudF90aHJlYWRfcG9sbGVyKTsKLUdQUl9UTFNfREVDTChnX2N1cnJlbnRfdGhyZWFkX3dvcmtlcik7Ci0KLS8qKiBEZWZhdWx0IHBvbGwoKSBmdW5jdGlvbiAtIGEgcG9pbnRlciBzbyB0aGF0IGl0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNvbWUKLSAqICB0ZXN0cyAqLwotZ3JwY19wb2xsX2Z1bmN0aW9uX3R5cGUgZ3JwY19wb2xsX2Z1bmN0aW9uID0gcG9sbDsKLQotLyoqIFRoZSBhbGFybSBzeXN0ZW0gbmVlZHMgdG8gYmUgYWJsZSB0byB3YWtldXAgJ3NvbWUgcG9sbGVyJyBzb21ldGltZXMKLSAqICAoc3BlY2lmaWNhbGx5IHdoZW4gYSBuZXcgYWxhcm0gbmVlZHMgdG8gYmUgdHJpZ2dlcmVkIGVhcmxpZXIgdGhhbiB0aGUgbmV4dAotICogIGFsYXJtICdlcG9jaCcpLgotICogIFRoaXMgd2FrZXVwX2ZkIGdpdmVzIHVzIHNvbWV0aGluZyB0byBhbGVydCBvbiB3aGVuIHN1Y2ggYSBjYXNlIG9jY3Vycy4gKi8KLWdycGNfd2FrZXVwX2ZkIGdycGNfZ2xvYmFsX3dha2V1cF9mZDsKLQotc3RhdGljIHZvaWQgcmVtb3ZlX3dvcmtlcihncnBjX3BvbGxzZXQgKnAsIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlcikgewotICB3b3JrZXItPnByZXYtPm5leHQgPSB3b3JrZXItPm5leHQ7Ci0gIHdvcmtlci0+bmV4dC0+cHJldiA9IHdvcmtlci0+cHJldjsKLX0KLQotaW50IGdycGNfcG9sbHNldF9oYXNfd29ya2VycyhncnBjX3BvbGxzZXQgKnApIHsKLSAgcmV0dXJuIHAtPnJvb3Rfd29ya2VyLm5leHQgIT0gJnAtPnJvb3Rfd29ya2VyOwotfQotCi1zdGF0aWMgZ3JwY19wb2xsc2V0X3dvcmtlciAqcG9wX2Zyb250X3dvcmtlcihncnBjX3BvbGxzZXQgKnApIHsKLSAgaWYgKGdycGNfcG9sbHNldF9oYXNfd29ya2VycyhwKSkgewotICAgIGdycGNfcG9sbHNldF93b3JrZXIgKncgPSBwLT5yb290X3dvcmtlci5uZXh0OwotICAgIHJlbW92ZV93b3JrZXIocCwgdyk7Ci0gICAgcmV0dXJuIHc7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcHVzaF9iYWNrX3dvcmtlcihncnBjX3BvbGxzZXQgKnAsIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlcikgewotICB3b3JrZXItPm5leHQgPSAmcC0+cm9vdF93b3JrZXI7Ci0gIHdvcmtlci0+cHJldiA9IHdvcmtlci0+bmV4dC0+cHJldjsKLSAgd29ya2VyLT5wcmV2LT5uZXh0ID0gd29ya2VyLT5uZXh0LT5wcmV2ID0gd29ya2VyOwotfQotCi1zdGF0aWMgdm9pZCBwdXNoX2Zyb250X3dvcmtlcihncnBjX3BvbGxzZXQgKnAsIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlcikgewotICB3b3JrZXItPnByZXYgPSAmcC0+cm9vdF93b3JrZXI7Ci0gIHdvcmtlci0+bmV4dCA9IHdvcmtlci0+cHJldi0+bmV4dDsKLSAgd29ya2VyLT5wcmV2LT5uZXh0ID0gd29ya2VyLT5uZXh0LT5wcmV2ID0gd29ya2VyOwotfQotCi1zaXplX3QgZ3JwY19wb2xsc2V0X3NpemUodm9pZCkgeyByZXR1cm4gc2l6ZW9mKGdycGNfcG9sbHNldCk7IH0KLQotdm9pZCBncnBjX3BvbGxzZXRfa2lja19leHQoZ3JwY19wb2xsc2V0ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqc3BlY2lmaWNfd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX3BvbGxzZXRfa2lja19leHQiLCAwKTsKLQotICAvKiBwb2xsc2V0LT5tdSBhbHJlYWR5IGhlbGQgKi8KLSAgaWYgKHNwZWNpZmljX3dvcmtlciAhPSBOVUxMKSB7Ci0gICAgaWYgKHNwZWNpZmljX3dvcmtlciA9PSBHUlBDX1BPTExTRVRfS0lDS19CUk9BRENBU1QpIHsKLSAgICAgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19wb2xsc2V0X2tpY2tfZXh0LmJyb2FkY2FzdCIsIDApOwotICAgICAgR1BSX0FTU0VSVCgoZmxhZ3MgJiBHUlBDX1BPTExTRVRfUkVFVkFMVUFURV9QT0xMSU5HX09OX1dBS0VVUCkgPT0gMCk7Ci0gICAgICBmb3IgKHNwZWNpZmljX3dvcmtlciA9IHAtPnJvb3Rfd29ya2VyLm5leHQ7Ci0gICAgICAgICAgIHNwZWNpZmljX3dvcmtlciAhPSAmcC0+cm9vdF93b3JrZXI7Ci0gICAgICAgICAgIHNwZWNpZmljX3dvcmtlciA9IHNwZWNpZmljX3dvcmtlci0+bmV4dCkgewotICAgICAgICBncnBjX3dha2V1cF9mZF93YWtldXAoJnNwZWNpZmljX3dvcmtlci0+d2FrZXVwX2ZkLT5mZCk7Ci0gICAgICB9Ci0gICAgICBwLT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMTsKLSAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfcG9sbHNldF9raWNrX2V4dC5icm9hZGNhc3QiLCAwKTsKLSAgICB9IGVsc2UgaWYgKGdwcl90bHNfZ2V0KCZnX2N1cnJlbnRfdGhyZWFkX3dvcmtlcikgIT0KLSAgICAgICAgICAgICAgIChpbnRwdHJfdClzcGVjaWZpY193b3JrZXIpIHsKLSAgICAgIEdQUl9USU1FUl9NQVJLKCJkaWZmZXJlbnRfdGhyZWFkX3dvcmtlciIsIDApOwotICAgICAgaWYgKChmbGFncyAmIEdSUENfUE9MTFNFVF9SRUVWQUxVQVRFX1BPTExJTkdfT05fV0FLRVVQKSAhPSAwKSB7Ci0gICAgICAgIHNwZWNpZmljX3dvcmtlci0+cmVldmFsdWF0ZV9wb2xsaW5nX29uX3dha2V1cCA9IDE7Ci0gICAgICB9Ci0gICAgICBzcGVjaWZpY193b3JrZXItPmtpY2tlZF9zcGVjaWZpY2FsbHkgPSAxOwotICAgICAgZ3JwY193YWtldXBfZmRfd2FrZXVwKCZzcGVjaWZpY193b3JrZXItPndha2V1cF9mZC0+ZmQpOwotICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgR1JQQ19QT0xMU0VUX0NBTl9LSUNLX1NFTEYpICE9IDApIHsKLSAgICAgIEdQUl9USU1FUl9NQVJLKCJraWNrX3lvc2VsZiIsIDApOwotICAgICAgaWYgKChmbGFncyAmIEdSUENfUE9MTFNFVF9SRUVWQUxVQVRFX1BPTExJTkdfT05fV0FLRVVQKSAhPSAwKSB7Ci0gICAgICAgIHNwZWNpZmljX3dvcmtlci0+cmVldmFsdWF0ZV9wb2xsaW5nX29uX3dha2V1cCA9IDE7Ci0gICAgICB9Ci0gICAgICBzcGVjaWZpY193b3JrZXItPmtpY2tlZF9zcGVjaWZpY2FsbHkgPSAxOwotICAgICAgZ3JwY193YWtldXBfZmRfd2FrZXVwKCZzcGVjaWZpY193b3JrZXItPndha2V1cF9mZC0+ZmQpOwotICAgIH0KLSAgfSBlbHNlIGlmIChncHJfdGxzX2dldCgmZ19jdXJyZW50X3RocmVhZF9wb2xsZXIpICE9IChpbnRwdHJfdClwKSB7Ci0gICAgR1BSX0FTU0VSVCgoZmxhZ3MgJiBHUlBDX1BPTExTRVRfUkVFVkFMVUFURV9QT0xMSU5HX09OX1dBS0VVUCkgPT0gMCk7Ci0gICAgR1BSX1RJTUVSX01BUksoImtpY2tfYW5vbnltb3VzIiwgMCk7Ci0gICAgc3BlY2lmaWNfd29ya2VyID0gcG9wX2Zyb250X3dvcmtlcihwKTsKLSAgICBpZiAoc3BlY2lmaWNfd29ya2VyICE9IE5VTEwpIHsKLSAgICAgIGlmIChncHJfdGxzX2dldCgmZ19jdXJyZW50X3RocmVhZF93b3JrZXIpID09IChpbnRwdHJfdClzcGVjaWZpY193b3JrZXIpIHsKLSAgICAgICAgR1BSX1RJTUVSX01BUksoImtpY2tfYW5vbnltb3VzX25vdF9zZWxmIiwgMCk7Ci0gICAgICAgIHB1c2hfYmFja193b3JrZXIocCwgc3BlY2lmaWNfd29ya2VyKTsKLSAgICAgICAgc3BlY2lmaWNfd29ya2VyID0gcG9wX2Zyb250X3dvcmtlcihwKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEdSUENfUE9MTFNFVF9DQU5fS0lDS19TRUxGKSA9PSAwICYmCi0gICAgICAgICAgICBncHJfdGxzX2dldCgmZ19jdXJyZW50X3RocmVhZF93b3JrZXIpID09Ci0gICAgICAgICAgICAgICAgKGludHB0cl90KXNwZWNpZmljX3dvcmtlcikgewotICAgICAgICAgIHB1c2hfYmFja193b3JrZXIocCwgc3BlY2lmaWNfd29ya2VyKTsKLSAgICAgICAgICBzcGVjaWZpY193b3JrZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc3BlY2lmaWNfd29ya2VyICE9IE5VTEwpIHsKLSAgICAgICAgR1BSX1RJTUVSX01BUksoImZpbmFsbHlfa2ljayIsIDApOwotICAgICAgICBwdXNoX2JhY2tfd29ya2VyKHAsIHNwZWNpZmljX3dvcmtlcik7Ci0gICAgICAgIGdycGNfd2FrZXVwX2ZkX3dha2V1cCgmc3BlY2lmaWNfd29ya2VyLT53YWtldXBfZmQtPmZkKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgR1BSX1RJTUVSX01BUksoImtpY2tlZF9ub19wb2xsZXJzIiwgMCk7Ci0gICAgICBwLT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMTsKLSAgICB9Ci0gIH0KLQotICBHUFJfVElNRVJfRU5EKCJncnBjX3BvbGxzZXRfa2lja19leHQiLCAwKTsKLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfa2ljayhncnBjX3BvbGxzZXQgKnAsIGdycGNfcG9sbHNldF93b3JrZXIgKnNwZWNpZmljX3dvcmtlcikgewotICBncnBjX3BvbGxzZXRfa2lja19leHQocCwgc3BlY2lmaWNfd29ya2VyLCAwKTsKLX0KLQotLyogZ2xvYmFsIHN0YXRlIG1hbmFnZW1lbnQgKi8KLQotdm9pZCBncnBjX3BvbGxzZXRfZ2xvYmFsX2luaXQodm9pZCkgewotICBncHJfdGxzX2luaXQoJmdfY3VycmVudF90aHJlYWRfcG9sbGVyKTsKLSAgZ3ByX3Rsc19pbml0KCZnX2N1cnJlbnRfdGhyZWFkX3dvcmtlcik7Ci0gIGdycGNfd2FrZXVwX2ZkX2dsb2JhbF9pbml0KCk7Ci0gIGdycGNfd2FrZXVwX2ZkX2luaXQoJmdycGNfZ2xvYmFsX3dha2V1cF9mZCk7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X2dsb2JhbF9zaHV0ZG93bih2b2lkKSB7Ci0gIGdycGNfd2FrZXVwX2ZkX2Rlc3Ryb3koJmdycGNfZ2xvYmFsX3dha2V1cF9mZCk7Ci0gIGdwcl90bHNfZGVzdHJveSgmZ19jdXJyZW50X3RocmVhZF9wb2xsZXIpOwotICBncHJfdGxzX2Rlc3Ryb3koJmdfY3VycmVudF90aHJlYWRfd29ya2VyKTsKLSAgZ3JwY193YWtldXBfZmRfZ2xvYmFsX2Rlc3Ryb3koKTsKLX0KLQotdm9pZCBncnBjX2tpY2tfcG9sbGVyKHZvaWQpIHsgZ3JwY193YWtldXBfZmRfd2FrZXVwKCZncnBjX2dsb2JhbF93YWtldXBfZmQpOyB9Ci0KLS8qIG1haW4gaW50ZXJmYWNlICovCi0KLXN0YXRpYyB2b2lkIGJlY29tZV9iYXNpY19wb2xsc2V0KGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3JwY19mZCAqZmRfb3JfbnVsbCk7Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X2luaXQoZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncHJfbXUgKiptdSkgewotICBncHJfbXVfaW5pdCgmcG9sbHNldC0+bXUpOwotICAqbXUgPSAmcG9sbHNldC0+bXU7Ci0gIHBvbGxzZXQtPnJvb3Rfd29ya2VyLm5leHQgPSBwb2xsc2V0LT5yb290X3dvcmtlci5wcmV2ID0gJnBvbGxzZXQtPnJvb3Rfd29ya2VyOwotICBwb2xsc2V0LT5pbl9mbGlnaHRfY2JzID0gMDsKLSAgcG9sbHNldC0+c2h1dHRpbmdfZG93biA9IDA7Ci0gIHBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93biA9IDA7Ci0gIHBvbGxzZXQtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMgPSAwOwotICBwb2xsc2V0LT5pZGxlX2pvYnMuaGVhZCA9IHBvbGxzZXQtPmlkbGVfam9icy50YWlsID0gTlVMTDsKLSAgcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlID0gTlVMTDsKLSAgcG9sbHNldC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDA7Ci0gIGJlY29tZV9iYXNpY19wb2xsc2V0KHBvbGxzZXQsIE5VTEwpOwotfQotCi12b2lkIGdycGNfcG9sbHNldF9kZXN0cm95KGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBHUFJfQVNTRVJUKHBvbGxzZXQtPmluX2ZsaWdodF9jYnMgPT0gMCk7Ci0gIEdQUl9BU1NFUlQoIWdycGNfcG9sbHNldF9oYXNfd29ya2Vycyhwb2xsc2V0KSk7Ci0gIEdQUl9BU1NFUlQocG9sbHNldC0+aWRsZV9qb2JzLmhlYWQgPT0gcG9sbHNldC0+aWRsZV9qb2JzLnRhaWwpOwotICBwb2xsc2V0LT52dGFibGUtPmRlc3Ryb3kocG9sbHNldCk7Ci0gIHdoaWxlIChwb2xsc2V0LT5sb2NhbF93YWtldXBfY2FjaGUpIHsKLSAgICBncnBjX2NhY2hlZF93YWtldXBfZmQgKm5leHQgPSBwb2xsc2V0LT5sb2NhbF93YWtldXBfY2FjaGUtPm5leHQ7Ci0gICAgZ3JwY193YWtldXBfZmRfZGVzdHJveSgmcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlLT5mZCk7Ci0gICAgZ3ByX2ZyZWUocG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlKTsKLSAgICBwb2xsc2V0LT5sb2NhbF93YWtldXBfY2FjaGUgPSBuZXh0OwotICB9Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3Jlc2V0KGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBHUFJfQVNTRVJUKHBvbGxzZXQtPnNodXR0aW5nX2Rvd24pOwotICBHUFJfQVNTRVJUKHBvbGxzZXQtPmluX2ZsaWdodF9jYnMgPT0gMCk7Ci0gIEdQUl9BU1NFUlQoIWdycGNfcG9sbHNldF9oYXNfd29ya2Vycyhwb2xsc2V0KSk7Ci0gIEdQUl9BU1NFUlQocG9sbHNldC0+aWRsZV9qb2JzLmhlYWQgPT0gcG9sbHNldC0+aWRsZV9qb2JzLnRhaWwpOwotICBwb2xsc2V0LT52dGFibGUtPmRlc3Ryb3kocG9sbHNldCk7Ci0gIHBvbGxzZXQtPnNodXR0aW5nX2Rvd24gPSAwOwotICBwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24gPSAwOwotICBwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMDsKLSAgYmVjb21lX2Jhc2ljX3BvbGxzZXQocG9sbHNldCwgTlVMTCk7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X2FkZF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZmQgKmZkKSB7Ci0gIGdwcl9tdV9sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gIHBvbGxzZXQtPnZ0YWJsZS0+YWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0LCBmZCwgMSk7Ci0vKiB0aGUgZm9sbG93aW5nIChlbmFibGVkIG9ubHkgaW4gZGVidWcpIHdpbGwgcmVhY3F1aXJlIGFuZCB0aGVuIHJlbGVhc2UKLSAgIG91ciBsb2NrIC0gbWVhbmluZyB0aGF0IGlmIHRoZSB1bmxvY2tpbmcgZmxhZyBwYXNzZWQgdG8gYWRkX2ZkIGFib3ZlIGlzCi0gICBub3QgcmVzcGVjdGVkLCB0aGUgY29kZSB3aWxsIGRlYWRsb2NrIChpbiBhIHdheSB0aGF0IHdlIGhhdmUgYSBjaGFuY2Ugb2YKLSAgIGRlYnVnZ2luZykgKi8KLSNpZm5kZWYgTkRFQlVHCi0gIGdwcl9tdV9sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBmaW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBHUFJfQVNTRVJUKGdycGNfY2xvc3VyZV9saXN0X2VtcHR5KHBvbGxzZXQtPmlkbGVfam9icykpOwotICBwb2xsc2V0LT52dGFibGUtPmZpbmlzaF9zaHV0ZG93bihwb2xsc2V0KTsKLSAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwb2xsc2V0LT5zaHV0ZG93bl9kb25lLCB0cnVlLCBOVUxMKTsKLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfd29yayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICoqd29ya2VyX2hkbCwgZ3ByX3RpbWVzcGVjIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7Ci0gIGdycGNfcG9sbHNldF93b3JrZXIgd29ya2VyOwotICAqd29ya2VyX2hkbCA9ICZ3b3JrZXI7Ci0KLSAgLyogcG9sbHNldC0+bXUgYWxyZWFkeSBoZWxkICovCi0gIGludCBhZGRlZF93b3JrZXIgPSAwOwotICBpbnQgbG9ja2VkID0gMTsKLSAgaW50IHF1ZXVlZF93b3JrID0gMDsKLSAgaW50IGtlZXBfcG9sbGluZyA9IDA7Ci0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19wb2xsc2V0X3dvcmsiLCAwKTsKLSAgLyogdGhpcyBtdXN0IGhhcHBlbiBiZWZvcmUgd2UgKHBvdGVudGlhbGx5KSBkcm9wIHBvbGxzZXQtPm11ICovCi0gIHdvcmtlci5uZXh0ID0gd29ya2VyLnByZXYgPSBOVUxMOwotICB3b3JrZXIucmVldmFsdWF0ZV9wb2xsaW5nX29uX3dha2V1cCA9IDA7Ci0gIGlmIChwb2xsc2V0LT5sb2NhbF93YWtldXBfY2FjaGUgIT0gTlVMTCkgewotICAgIHdvcmtlci53YWtldXBfZmQgPSBwb2xsc2V0LT5sb2NhbF93YWtldXBfY2FjaGU7Ci0gICAgcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlID0gd29ya2VyLndha2V1cF9mZC0+bmV4dDsKLSAgfSBlbHNlIHsKLSAgICB3b3JrZXIud2FrZXVwX2ZkID0gZ3ByX21hbGxvYyhzaXplb2YoKndvcmtlci53YWtldXBfZmQpKTsKLSAgICBncnBjX3dha2V1cF9mZF9pbml0KCZ3b3JrZXIud2FrZXVwX2ZkLT5mZCk7Ci0gIH0KLSAgd29ya2VyLmtpY2tlZF9zcGVjaWZpY2FsbHkgPSAwOwotICAvKiBJZiB0aGVyZSdzIHdvcmsgd2FpdGluZyBmb3IgdGhlIHBvbGxzZXQgdG8gYmUgaWRsZSwgYW5kIHRoZQotICAgICBwb2xsc2V0IGlzIGlkbGUsIHRoZW4gZG8gdGhhdCB3b3JrICovCi0gIGlmICghZ3JwY19wb2xsc2V0X2hhc193b3JrZXJzKHBvbGxzZXQpICYmCi0gICAgICAhZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkocG9sbHNldC0+aWRsZV9qb2JzKSkgewotICAgIEdQUl9USU1FUl9NQVJLKCJncnBjX3BvbGxzZXRfd29yay5pZGxlX2pvYnMiLCAwKTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChleGVjX2N0eCwgJnBvbGxzZXQtPmlkbGVfam9icywgTlVMTCk7Ci0gICAgZ290byBkb25lOwotICB9Ci0gIC8qIElmIHdlJ3JlIHNodXR0aW5nIGRvd24gdGhlbiB3ZSBkb24ndCBleGVjdXRlIGFueSBleHRlbmRlZCB3b3JrICovCi0gIGlmIChwb2xsc2V0LT5zaHV0dGluZ19kb3duKSB7Ci0gICAgR1BSX1RJTUVSX01BUksoImdycGNfcG9sbHNldF93b3JrLnNodXR0aW5nX2Rvd24iLCAwKTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLSAgLyogR2l2ZSBkb19wcm9tb3RlIHByaW9yaXR5IHNvIHdlIGRvbid0IHN0YXJ2ZSBpdCBvdXQgKi8KLSAgaWYgKHBvbGxzZXQtPmluX2ZsaWdodF9jYnMpIHsKLSAgICBHUFJfVElNRVJfTUFSSygiZ3JwY19wb2xsc2V0X3dvcmsuaW5fZmxpZ2h0X2NicyIsIDApOwotICAgIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKLSAgICBsb2NrZWQgPSAwOwotICAgIGdvdG8gZG9uZTsKLSAgfQotICAvKiBTdGFydCBwb2xsaW5nLCBhbmQga2VlcCBkb2luZyBzbyB3aGlsZSB3ZSdyZSBiZWluZyBhc2tlZCB0bwotICAgICByZS1ldmFsdWF0ZSBvdXIgcG9sbGVycyAodGhpcyBhbGxvd3MgcG9sbCgpIGJhc2VkIHBvbGxlcnMgdG8KLSAgICAgZW5zdXJlIHRoZXkgZG9uJ3QgbWlzcyB3YWtldXBzKSAqLwotICBrZWVwX3BvbGxpbmcgPSAxOwotICB3aGlsZSAoa2VlcF9wb2xsaW5nKSB7Ci0gICAga2VlcF9wb2xsaW5nID0gMDsKLSAgICBpZiAoIXBvbGxzZXQtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMpIHsKLSAgICAgIGlmICghYWRkZWRfd29ya2VyKSB7Ci0gICAgICAgIHB1c2hfZnJvbnRfd29ya2VyKHBvbGxzZXQsICZ3b3JrZXIpOwotICAgICAgICBhZGRlZF93b3JrZXIgPSAxOwotICAgICAgICBncHJfdGxzX3NldCgmZ19jdXJyZW50X3RocmVhZF93b3JrZXIsIChpbnRwdHJfdCkmd29ya2VyKTsKLSAgICAgIH0KLSAgICAgIGdwcl90bHNfc2V0KCZnX2N1cnJlbnRfdGhyZWFkX3BvbGxlciwgKGludHB0cl90KXBvbGxzZXQpOwotICAgICAgR1BSX1RJTUVSX0JFR0lOKCJtYXliZV93b3JrX2FuZF91bmxvY2siLCAwKTsKLSAgICAgIHBvbGxzZXQtPnZ0YWJsZS0+bWF5YmVfd29ya19hbmRfdW5sb2NrKGV4ZWNfY3R4LCBwb2xsc2V0LCAmd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhZGxpbmUsIG5vdyk7Ci0gICAgICBHUFJfVElNRVJfRU5EKCJtYXliZV93b3JrX2FuZF91bmxvY2siLCAwKTsKLSAgICAgIGxvY2tlZCA9IDA7Ci0gICAgICBncHJfdGxzX3NldCgmZ19jdXJyZW50X3RocmVhZF9wb2xsZXIsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICBHUFJfVElNRVJfTUFSSygiZ3JwY19wb2xsc2V0X3dvcmsua2lja2VkX3dpdGhvdXRfcG9sbGVycyIsIDApOwotICAgICAgcG9sbHNldC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDA7Ci0gICAgfQotICAvKiBGaW5pc2hlZCBleGVjdXRpb24gLSBzdGFydCBjbGVhbmluZyB1cC4KLSAgICAgTm90ZSB0aGF0IHdlIG1heSBhcnJpdmUgaGVyZSBmcm9tIG91dHNpZGUgdGhlIGVuY2xvc2luZyB3aGlsZSgpIGxvb3AuCi0gICAgIEluIHRoYXQgY2FzZSB3ZSB3b24ndCBsb29wIHRob3VnaCBhcyB3ZSBoYXZlbid0IGFkZGVkIHdvcmtlciB0byB0aGUKLSAgICAgd29ya2VyIGxpc3QsIHdoaWNoIG1lYW5zIG5vYm9keSBjb3VsZCBhc2sgdXMgdG8gcmUtZXZhbHVhdGUgcG9sbGluZykuICovCi0gIGRvbmU6Ci0gICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgIHF1ZXVlZF93b3JrIHw9IGdycGNfZXhlY19jdHhfZmx1c2goZXhlY19jdHgpOwotICAgICAgZ3ByX211X2xvY2soJnBvbGxzZXQtPm11KTsKLSAgICAgIGxvY2tlZCA9IDE7Ci0gICAgfQotICAgIC8qIElmIHdlJ3JlIGZvcmNlZCB0byByZS1ldmFsdWF0ZSBwb2xsaW5nICh2aWEgZ3JwY19wb2xsc2V0X2tpY2sgd2l0aAotICAgICAgIEdSUENfUE9MTFNFVF9SRUVWQUxVQVRFX1BPTExJTkdfT05fV0FLRVVQKSB0aGVuIHdlIGxhbmQgaGVyZSBhbmQgZm9yY2UKLSAgICAgICBhIGxvb3AgKi8KLSAgICBpZiAod29ya2VyLnJlZXZhbHVhdGVfcG9sbGluZ19vbl93YWtldXApIHsKLSAgICAgIHdvcmtlci5yZWV2YWx1YXRlX3BvbGxpbmdfb25fd2FrZXVwID0gMDsKLSAgICAgIHBvbGxzZXQtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMgPSAwOwotICAgICAgaWYgKHF1ZXVlZF93b3JrIHx8IHdvcmtlci5raWNrZWRfc3BlY2lmaWNhbGx5KSB7Ci0gICAgICAgIC8qIElmIHRoZXJlJ3MgcXVldWVkIHdvcmsgb24gdGhlIGxpc3QsIHRoZW4gc2V0IHRoZSBkZWFkbGluZSB0byBiZQotICAgICAgICAgICBpbW1lZGlhdGUgc28gd2UgZ2V0IGJhY2sgb3V0IG9mIHRoZSBwb2xsaW5nIGxvb3AgcXVpY2tseSAqLwotICAgICAgICBkZWFkbGluZSA9IGdwcl9pbmZfcGFzdChHUFJfQ0xPQ0tfTU9OT1RPTklDKTsKLSAgICAgIH0KLSAgICAgIGtlZXBfcG9sbGluZyA9IDE7Ci0gICAgfQotICB9Ci0gIGlmIChhZGRlZF93b3JrZXIpIHsKLSAgICByZW1vdmVfd29ya2VyKHBvbGxzZXQsICZ3b3JrZXIpOwotICAgIGdwcl90bHNfc2V0KCZnX2N1cnJlbnRfdGhyZWFkX3dvcmtlciwgMCk7Ci0gIH0KLSAgLyogcmVsZWFzZSB3YWtldXAgZmQgdG8gdGhlIGxvY2FsIHBvb2wgKi8KLSAgd29ya2VyLndha2V1cF9mZC0+bmV4dCA9IHBvbGxzZXQtPmxvY2FsX3dha2V1cF9jYWNoZTsKLSAgcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlID0gd29ya2VyLndha2V1cF9mZDsKLSAgLyogY2hlY2sgc2h1dGRvd24gY29uZGl0aW9ucyAqLwotICBpZiAocG9sbHNldC0+c2h1dHRpbmdfZG93bikgewotICAgIGlmIChncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocG9sbHNldCkpIHsKLSAgICAgIGdycGNfcG9sbHNldF9raWNrKHBvbGxzZXQsIE5VTEwpOwotICAgIH0gZWxzZSBpZiAoIXBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93biAmJiBwb2xsc2V0LT5pbl9mbGlnaHRfY2JzID09IDApIHsKLSAgICAgIHBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93biA9IDE7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gICAgICBmaW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHBvbGxzZXQpOwotICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaChleGVjX2N0eCk7Ci0gICAgICAvKiBDb250aW51aW5nIHRvIGFjY2VzcyBwb2xsc2V0IGhlcmUgaXMgc2FmZSAtLSBpdCBpcyB0aGUgY2FsbGVyJ3MKLSAgICAgICAqIHJlc3BvbnNpYmlsaXR5IHRvIG5vdCBkZXN0cm95IHdoZW4gaXQgaGFzIG91dHN0YW5kaW5nIGNhbGxzIHRvCi0gICAgICAgKiBncnBjX3BvbGxzZXRfd29yay4KLSAgICAgICAqIFRPRE8oZGtsZW1wbmVyKTogQ2FuIHdlIHJlZmFjdG9yIHRoZSBzaHV0ZG93biBsb2dpYyB0byBhdm9pZCB0aGlzPyAqLwotICAgICAgZ3ByX211X2xvY2soJnBvbGxzZXQtPm11KTsKLSAgICB9IGVsc2UgaWYgKCFncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShwb2xsc2V0LT5pZGxlX2pvYnMpKSB7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChleGVjX2N0eCwgJnBvbGxzZXQtPmlkbGVfam9icywgTlVMTCk7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKGV4ZWNfY3R4KTsKLSAgICAgIGdwcl9tdV9sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gICAgfQotICB9Ci0gICp3b3JrZXJfaGRsID0gTlVMTDsKLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19wb2xsc2V0X3dvcmsiLCAwKTsKLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgewotICBHUFJfQVNTRVJUKCFwb2xsc2V0LT5zaHV0dGluZ19kb3duKTsKLSAgcG9sbHNldC0+c2h1dHRpbmdfZG93biA9IDE7Ci0gIHBvbGxzZXQtPnNodXRkb3duX2RvbmUgPSBjbG9zdXJlOwotICBncnBjX3BvbGxzZXRfa2ljayhwb2xsc2V0LCBHUlBDX1BPTExTRVRfS0lDS19CUk9BRENBU1QpOwotICBpZiAoIWdycGNfcG9sbHNldF9oYXNfd29ya2Vycyhwb2xsc2V0KSkgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGV4ZWNfY3R4LCAmcG9sbHNldC0+aWRsZV9qb2JzLCBOVUxMKTsKLSAgfQotICBpZiAoIXBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93biAmJiBwb2xsc2V0LT5pbl9mbGlnaHRfY2JzID09IDAgJiYKLSAgICAgICFncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocG9sbHNldCkpIHsKLSAgICBwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24gPSAxOwotICAgIGZpbmlzaF9zaHV0ZG93bihleGVjX2N0eCwgcG9sbHNldCk7Ci0gIH0KLX0KLQotaW50IGdycGNfcG9sbF9kZWFkbGluZV90b19taWxsaXNfdGltZW91dChncHJfdGltZXNwZWMgZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBub3cpIHsKLSAgZ3ByX3RpbWVzcGVjIHRpbWVvdXQ7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IG1heF9zcGluX3BvbGxpbmdfdXMgPSAxMDsKLSAgaWYgKGdwcl90aW1lX2NtcChkZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUoZGVhZGxpbmUuY2xvY2tfdHlwZSkpID09IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGdwcl90aW1lX2NtcChkZWFkbGluZSwgZ3ByX3RpbWVfYWRkKG5vdywgZ3ByX3RpbWVfZnJvbV9taWNyb3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc3Bpbl9wb2xsaW5nX3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1RJTUVTUEFOKSkpIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICB0aW1lb3V0ID0gZ3ByX3RpbWVfc3ViKGRlYWRsaW5lLCBub3cpOwotICByZXR1cm4gZ3ByX3RpbWVfdG9fbWlsbGlzKGdwcl90aW1lX2FkZCgKLSAgICAgIHRpbWVvdXQsIGdwcl90aW1lX2Zyb21fbmFub3MoR1BSX05TX1BFUl9NUyAtIDEsIEdQUl9USU1FU1BBTikpKTsKLX0KLQotLyoKLSAqIGJhc2ljX3BvbGxzZXQgLSBhIHZ0YWJsZSB0aGF0IHByb3ZpZGVzIHBvbGxpbmcgZm9yIHplcm8gb3Igb25lIGZpbGUKLSAqICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHZpYSBwb2xsKCkKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3VuYXJ5X3Byb21vdGVfYXJncyB7Ci0gIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgKm9yaWdpbmFsX3Z0YWJsZTsKLSAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OwotICBncnBjX2ZkICpmZDsKLSAgZ3JwY19jbG9zdXJlIHByb21vdGlvbl9jbG9zdXJlOwotfSBncnBjX3VuYXJ5X3Byb21vdGVfYXJnczsKLQotc3RhdGljIHZvaWQgYmFzaWNfZG9fcHJvbW90ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfdW5hcnlfcHJvbW90ZV9hcmdzICp1cF9hcmdzID0gYXJnczsKLSAgY29uc3QgZ3JwY19wb2xsc2V0X3Z0YWJsZSAqb3JpZ2luYWxfdnRhYmxlID0gdXBfYXJncy0+b3JpZ2luYWxfdnRhYmxlOwotICBncnBjX3BvbGxzZXQgKnBvbGxzZXQgPSB1cF9hcmdzLT5wb2xsc2V0OwotICBncnBjX2ZkICpmZCA9IHVwX2FyZ3MtPmZkOwotCi0gIC8qCi0gICAqIFRoaXMgaXMgcXVpdGUgdHJpY2t5LiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgY2FzZXMgdG8ga2VlcCBpbiBtaW5kIGhlcmU6Ci0gICAqIDEuIGZkIG1heSBoYXZlIGJlZW4gb3JwaGFuZWQKLSAgICogMi4gVGhlIHBvbGxzZXQgbWF5IG5vIGxvbmdlciBiZSBhIHVuYXJ5IHBvbGxlciAoYW5kIHdlIGNhbid0IGxldCBjYXNlICMxCi0gICAqIGxlYWsgdG8gb3RoZXIgcG9sbHNldCB0eXBlcyEpCi0gICAqIDMuIHBvbGxzZXQncyBmZCAod2hpY2ggbWF5IGhhdmUgY2hhbmdlZCkgbWF5IGhhdmUgYmVlbiBvcnBoYW5lZAotICAgKiA0LiBUaGUgcG9sbHNldCBtYXkgYmUgc2h1dHRpbmcgZG93bi4KLSAgICovCi0KLSAgZ3ByX211X2xvY2soJnBvbGxzZXQtPm11KTsKLSAgLyogRmlyc3Qgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBub2JvZHkgaXMgcG9sbGluZyBjb25jdXJyZW50bHkgKi8KLSAgR1BSX0FTU0VSVCghZ3JwY19wb2xsc2V0X2hhc193b3JrZXJzKHBvbGxzZXQpKTsKLQotICBncHJfZnJlZSh1cF9hcmdzKTsKLSAgLyogQXQgdGhpcyBwb2ludCB0aGUgcG9sbHNldCBtYXkgbm8gbG9uZ2VyIGJlIGEgdW5hcnkgcG9sbGVyLiBJbiB0aGF0IGNhc2UKLSAgICogd2Ugc2hvdWxkIGp1c3QgY2FsbCB0aGUgcmlnaHQgYWRkIGZ1bmN0aW9uIGFuZCBiZSBkb25lLiAqLwotICAvKiBUT0RPKGtsZW1wbmVyKTogSWYgd2UncmUgbm90IGNhcmVmdWwgdGhpcyBjb3VsZCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCi0gICAqIFRoYXQncyBub3QgYSBwcm9ibGVtIGZvciBub3cgYmVjYXVzZSBlbXB0eV9wb2xsc2V0IGhhcyBhIHRyaXZpYWwgcG9sbGVyCi0gICAqIGFuZCB3ZSBkb24ndCBoYXZlIGFueSBtZWNoYW5pc20gdG8gdW5iZWNvbWUgbXVsdGlwb2xsZXIuICovCi0gIHBvbGxzZXQtPmluX2ZsaWdodF9jYnMtLTsKLSAgaWYgKHBvbGxzZXQtPnNodXR0aW5nX2Rvd24pIHsKLSAgICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcG9sbHNldCBhbnltb3JlLiAqLwotICAgIGlmIChwb2xsc2V0LT5pbl9mbGlnaHRfY2JzID09IDAgJiYgIXBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93bikgewotICAgICAgcG9sbHNldC0+Y2FsbGVkX3NodXRkb3duID0gMTsKLSAgICAgIGZpbmlzaF9zaHV0ZG93bihleGVjX2N0eCwgcG9sbHNldCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGdycGNfZmRfaXNfb3JwaGFuZWQoZmQpKSB7Ci0gICAgLyogRG9uJ3QgdHJ5IHRvIGFkZCBpdCB0byBhbnl0aGluZywgd2UnbGwgZHJvcCBvdXIgcmVmIG9uIGl0IGJlbG93ICovCi0gIH0gZWxzZSBpZiAocG9sbHNldC0+dnRhYmxlICE9IG9yaWdpbmFsX3Z0YWJsZSkgewotICAgIHBvbGxzZXQtPnZ0YWJsZS0+YWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0LCBmZCwgMCk7Ci0gIH0gZWxzZSBpZiAoZmQgIT0gcG9sbHNldC0+ZGF0YS5wdHIpIHsKLSAgICBncnBjX2ZkICpmZHNbMl07Ci0gICAgZmRzWzBdID0gcG9sbHNldC0+ZGF0YS5wdHI7Ci0gICAgZmRzWzFdID0gZmQ7Ci0KLSAgICBpZiAoZmRzWzBdICYmICFncnBjX2ZkX2lzX29ycGhhbmVkKGZkc1swXSkpIHsKLSAgICAgIGdycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyKGV4ZWNfY3R4LCBwb2xsc2V0LCBmZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfQVJSQVlfU0laRShmZHMpKTsKLSAgICAgIEdSUENfRkRfVU5SRUYoZmRzWzBdLCAiYmFzaWNwb2xsIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIG9sZCBmZCBpcyBvcnBoYW5lZCBhbmQgd2UgaGF2ZW4ndCBjbGVhbmVkIGl0IHVwIHVudGlsIG5vdywgc28gcmVtYWluIGEKLSAgICAgICAqIHVuYXJ5IHBvbGxlciAqLwotICAgICAgLyogTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgZmRzWzFdIGlzIGFsc28gb3JwaGFuZWQgYXQgdGhpcyBwb2ludC4KLSAgICAgICAqIFRoYXQncyBva2F5LCB3ZSdsbCBjb3JyZWN0IGl0IGF0IHRoZSBuZXh0IGFkZCBvciBwb2xsLiAqLwotICAgICAgaWYgKGZkc1swXSkgR1JQQ19GRF9VTlJFRihmZHNbMF0sICJiYXNpY3BvbGwiKTsKLSAgICAgIHBvbGxzZXQtPmRhdGEucHRyID0gZmQ7Ci0gICAgICBHUlBDX0ZEX1JFRihmZCwgImJhc2ljcG9sbCIpOwotICAgIH0KLSAgfQotCi0gIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKLQotICAvKiBNYXRjaGluZyByZWYgaW4gYmFzaWNfcG9sbHNldF9hZGRfZmQgKi8KLSAgR1JQQ19GRF9VTlJFRihmZCwgImJhc2ljcG9sbF9hZGQiKTsKLX0KLQotc3RhdGljIHZvaWQgYmFzaWNfcG9sbHNldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZmQgKmZkLCBpbnQgYW5kX3VubG9ja19wb2xsc2V0KSB7Ci0gIGdycGNfdW5hcnlfcHJvbW90ZV9hcmdzICp1cF9hcmdzOwotICBHUFJfQVNTRVJUKGZkKTsKLSAgaWYgKGZkID09IHBvbGxzZXQtPmRhdGEucHRyKSBnb3RvIGV4aXQ7Ci0KLSAgaWYgKCFncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocG9sbHNldCkpIHsKLSAgICAvKiBGYXN0IHBhdGggLS0gbm8gaW4gZmxpZ2h0IGNicyAqLwotICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBDb21tZW50IHRoaXMgb3V0IGFuZCBmaXggYW55IHRlc3QgZmFpbHVyZXMgb3IgZXN0YWJsaXNoCi0gICAgICogdGhleSBhcmUgZHVlIHRvIHRpbWluZyBpc3N1ZXMgKi8KLSAgICBncnBjX2ZkICpmZHNbMl07Ci0gICAgZmRzWzBdID0gcG9sbHNldC0+ZGF0YS5wdHI7Ci0gICAgZmRzWzFdID0gZmQ7Ci0KLSAgICBpZiAoZmRzWzBdID09IE5VTEwpIHsKLSAgICAgIHBvbGxzZXQtPmRhdGEucHRyID0gZmQ7Ci0gICAgICBHUlBDX0ZEX1JFRihmZCwgImJhc2ljcG9sbCIpOwotICAgIH0gZWxzZSBpZiAoIWdycGNfZmRfaXNfb3JwaGFuZWQoZmRzWzBdKSkgewotICAgICAgZ3JwY19wbGF0Zm9ybV9iZWNvbWVfbXVsdGlwb2xsZXIoZXhlY19jdHgsIHBvbGxzZXQsIGZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9BUlJBWV9TSVpFKGZkcykpOwotICAgICAgR1JQQ19GRF9VTlJFRihmZHNbMF0sICJiYXNpY3BvbGwiKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogb2xkIGZkIGlzIG9ycGhhbmVkIGFuZCB3ZSBoYXZlbid0IGNsZWFuZWQgaXQgdXAgdW50aWwgbm93LCBzbyByZW1haW4gYQotICAgICAgICogdW5hcnkgcG9sbGVyICovCi0gICAgICBHUlBDX0ZEX1VOUkVGKGZkc1swXSwgImJhc2ljcG9sbCIpOwotICAgICAgcG9sbHNldC0+ZGF0YS5wdHIgPSBmZDsKLSAgICAgIEdSUENfRkRfUkVGKGZkLCAiYmFzaWNwb2xsIik7Ci0gICAgfQotICAgIGdvdG8gZXhpdDsKLSAgfQotCi0gIC8qIE5vdyB3ZSBuZWVkIHRvIHByb21vdGUuIFRoaXMgbmVlZHMgdG8gaGFwcGVuIHdoZW4gd2UncmUgbm90IHBvbGxpbmcuIFNpbmNlCi0gICAqIHRoaXMgbWF5IGJlIGNhbGxlZCBmcm9tIHBvbGwsIHRoZSB3YWl0IG5lZWRzIHRvIGhhcHBlbiBhc3luY2hyb25vdXNseS4gKi8KLSAgR1JQQ19GRF9SRUYoZmQsICJiYXNpY3BvbGxfYWRkIik7Ci0gIHBvbGxzZXQtPmluX2ZsaWdodF9jYnMrKzsKLSAgdXBfYXJncyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp1cF9hcmdzKSk7Ci0gIHVwX2FyZ3MtPmZkID0gZmQ7Ci0gIHVwX2FyZ3MtPm9yaWdpbmFsX3Z0YWJsZSA9IHBvbGxzZXQtPnZ0YWJsZTsKLSAgdXBfYXJncy0+cG9sbHNldCA9IHBvbGxzZXQ7Ci0gIHVwX2FyZ3MtPnByb21vdGlvbl9jbG9zdXJlLmNiID0gYmFzaWNfZG9fcHJvbW90ZTsKLSAgdXBfYXJncy0+cHJvbW90aW9uX2Nsb3N1cmUuY2JfYXJnID0gdXBfYXJnczsKLQotICBncnBjX2Nsb3N1cmVfbGlzdF9hZGQoJnBvbGxzZXQtPmlkbGVfam9icywgJnVwX2FyZ3MtPnByb21vdGlvbl9jbG9zdXJlLCAxKTsKLSAgZ3JwY19wb2xsc2V0X2tpY2socG9sbHNldCwgR1JQQ19QT0xMU0VUX0tJQ0tfQlJPQURDQVNUKTsKLQotZXhpdDoKLSAgaWYgKGFuZF91bmxvY2tfcG9sbHNldCkgewotICAgIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBiYXNpY19wb2xsc2V0X21heWJlX3dvcmtfYW5kX3VubG9jayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBub3cpIHsKLSNkZWZpbmUgUE9MTE9VVF9DSEVDSyAoUE9MTE9VVCB8IFBPTExIVVAgfCBQT0xMRVJSKQotI2RlZmluZSBQT0xMSU5fQ0hFQ0sgKFBPTExJTiB8IFBPTExIVVAgfCBQT0xMRVJSKQotCi0gIHN0cnVjdCBwb2xsZmQgcGZkWzNdOwotICBncnBjX2ZkICpmZDsKLSAgZ3JwY19mZF93YXRjaGVyIGZkX3dhdGNoZXI7Ci0gIGludCB0aW1lb3V0OwotICBpbnQgcjsKLSAgbmZkc190IG5mZHM7Ci0KLSAgZmQgPSBwb2xsc2V0LT5kYXRhLnB0cjsKLSAgaWYgKGZkICYmIGdycGNfZmRfaXNfb3JwaGFuZWQoZmQpKSB7Ci0gICAgR1JQQ19GRF9VTlJFRihmZCwgImJhc2ljcG9sbCIpOwotICAgIGZkID0gcG9sbHNldC0+ZGF0YS5wdHIgPSBOVUxMOwotICB9Ci0gIHRpbWVvdXQgPSBncnBjX3BvbGxfZGVhZGxpbmVfdG9fbWlsbGlzX3RpbWVvdXQoZGVhZGxpbmUsIG5vdyk7Ci0gIHBmZFswXS5mZCA9IEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZncnBjX2dsb2JhbF93YWtldXBfZmQpOwotICBwZmRbMF0uZXZlbnRzID0gUE9MTElOOwotICBwZmRbMF0ucmV2ZW50cyA9IDA7Ci0gIHBmZFsxXS5mZCA9IEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZ3b3JrZXItPndha2V1cF9mZC0+ZmQpOwotICBwZmRbMV0uZXZlbnRzID0gUE9MTElOOwotICBwZmRbMV0ucmV2ZW50cyA9IDA7Ci0gIG5mZHMgPSAyOwotICBpZiAoZmQpIHsKLSAgICBwZmRbMl0uZmQgPSBmZC0+ZmQ7Ci0gICAgcGZkWzJdLnJldmVudHMgPSAwOwotICAgIEdSUENfRkRfUkVGKGZkLCAiYmFzaWNwb2xsX2JlZ2luIik7Ci0gICAgZ3ByX211X3VubG9jaygmcG9sbHNldC0+bXUpOwotICAgIHBmZFsyXS5ldmVudHMgPSAoc2hvcnQpZ3JwY19mZF9iZWdpbl9wb2xsKGZkLCBwb2xsc2V0LCB3b3JrZXIsIFBPTExJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMT1VULCAmZmRfd2F0Y2hlcik7Ci0gICAgaWYgKHBmZFsyXS5ldmVudHMgIT0gMCkgewotICAgICAgbmZkcysrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7Ci0gIH0KLQotICAvKiBUT0RPKHZwYWkpOiBDb25zaWRlciBmaXJzdCBkb2luZyBhIDAgdGltZW91dCBwb2xsIGhlcmUgdG8gYXZvaWQKLSAgICAgZXZlbiBnb2luZyBpbnRvIHRoZSBibG9ja2luZyBhbm5vdGF0aW9uIGlmIHBvc3NpYmxlICovCi0gIC8qIHBvbGwgZmQgY291bnQgKGFyZ3VtZW50IDIpIGlzIHNob3J0ZW5lZCBieSBvbmUgaWYgd2UgaGF2ZSBubyBldmVudHMKLSAgICAgdG8gcG9sbCBvbiAtIHN1Y2ggdGhhdCBpdCBvbmx5IGluY2x1ZGVzIHRoZSBraWNrZXIgKi8KLSAgR1BSX1RJTUVSX0JFR0lOKCJwb2xsIiwgMCk7Ci0gIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047Ci0gIHIgPSBncnBjX3BvbGxfZnVuY3Rpb24ocGZkLCBuZmRzLCB0aW1lb3V0KTsKLSAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047Ci0gIEdQUl9USU1FUl9FTkQoInBvbGwiLCAwKTsKLQotICBpZiAociA8IDApIHsKLSAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAicG9sbCgpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgICBpZiAoZmQpIHsKLSAgICAgIGdycGNfZmRfZW5kX3BvbGwoZXhlY19jdHgsICZmZF93YXRjaGVyLCAwLCAwKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAociA9PSAwKSB7Ci0gICAgaWYgKGZkKSB7Ci0gICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmZmRfd2F0Y2hlciwgMCwgMCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwZmRbMF0ucmV2ZW50cyAmIFBPTExJTl9DSEVDSykgewotICAgICAgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoJmdycGNfZ2xvYmFsX3dha2V1cF9mZCk7Ci0gICAgfQotICAgIGlmIChwZmRbMV0ucmV2ZW50cyAmIFBPTExJTl9DSEVDSykgewotICAgICAgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoJndvcmtlci0+d2FrZXVwX2ZkLT5mZCk7Ci0gICAgfQotICAgIGlmIChuZmRzID4gMikgewotICAgICAgZ3JwY19mZF9lbmRfcG9sbChleGVjX2N0eCwgJmZkX3dhdGNoZXIsIHBmZFsyXS5yZXZlbnRzICYgUE9MTElOX0NIRUNLLAotICAgICAgICAgICAgICAgICAgICAgICBwZmRbMl0ucmV2ZW50cyAmIFBPTExPVVRfQ0hFQ0spOwotICAgIH0gZWxzZSBpZiAoZmQpIHsKLSAgICAgIGdycGNfZmRfZW5kX3BvbGwoZXhlY19jdHgsICZmZF93YXRjaGVyLCAwLCAwKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmQpIHsKLSAgICBHUlBDX0ZEX1VOUkVGKGZkLCAiYmFzaWNwb2xsX2JlZ2luIik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYmFzaWNfcG9sbHNldF9kZXN0cm95KGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBpZiAocG9sbHNldC0+ZGF0YS5wdHIgIT0gTlVMTCkgewotICAgIEdSUENfRkRfVU5SRUYocG9sbHNldC0+ZGF0YS5wdHIsICJiYXNpY3BvbGwiKTsKLSAgICBwb2xsc2V0LT5kYXRhLnB0ciA9IE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgYmFzaWNfcG9sbHNldCA9IHsKLSAgICBiYXNpY19wb2xsc2V0X2FkZF9mZCwgYmFzaWNfcG9sbHNldF9tYXliZV93b3JrX2FuZF91bmxvY2ssCi0gICAgYmFzaWNfcG9sbHNldF9kZXN0cm95LCBiYXNpY19wb2xsc2V0X2Rlc3Ryb3l9OwotCi1zdGF0aWMgdm9pZCBiZWNvbWVfYmFzaWNfcG9sbHNldChncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfZmQgKmZkX29yX251bGwpIHsKLSAgcG9sbHNldC0+dnRhYmxlID0gJmJhc2ljX3BvbGxzZXQ7Ci0gIHBvbGxzZXQtPmRhdGEucHRyID0gZmRfb3JfbnVsbDsKLSAgaWYgKGZkX29yX251bGwgIT0gTlVMTCkgewotICAgIEdSUENfRkRfUkVGKGZkX29yX251bGwsICJiYXNpY3BvbGwiKTsKLSAgfQotfQotCi0jZW5kaWYgLyogR1BSX1BPU0lYX1BPTExTRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCBiL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjZmM0NC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfUE9MTFNFVF9QT1NJWF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1BPU0lYX0gKLQotI2luY2x1ZGUgPHBvbGwuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXRfdnRhYmxlIGdycGNfcG9sbHNldF92dGFibGU7Ci0KLS8qIGZvcndhcmQgZGVjbGFyZSBvbmx5IGluIHRoaXMgZmlsZSB0byBhdm9pZCBsZWFraW5nIGltcGwgZGV0YWlscyB2aWEKLSAgIHBvbGxzZXQuaDsgcmVhbCB1c2VycyBvZiBncnBjX2ZkIHNob3VsZCBhbHdheXMgaW5jbHVkZSAnZmRfcG9zaXguaCcgYW5kIG5vdAotICAgdXNlIHRoZSBzdHJ1Y3QgdGFnICovCi1zdHJ1Y3QgZ3JwY19mZDsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jYWNoZWRfd2FrZXVwX2ZkIHsKLSAgZ3JwY193YWtldXBfZmQgZmQ7Ci0gIHN0cnVjdCBncnBjX2NhY2hlZF93YWtldXBfZmQgKm5leHQ7Ci19IGdycGNfY2FjaGVkX3dha2V1cF9mZDsKLQotc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgewotICBncnBjX2NhY2hlZF93YWtldXBfZmQgKndha2V1cF9mZDsKLSAgaW50IHJlZXZhbHVhdGVfcG9sbGluZ19vbl93YWtldXA7Ci0gIGludCBraWNrZWRfc3BlY2lmaWNhbGx5OwotICBzdHJ1Y3QgZ3JwY19wb2xsc2V0X3dvcmtlciAqbmV4dDsKLSAgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgKnByZXY7Ci19OwotCi1zdHJ1Y3QgZ3JwY19wb2xsc2V0IHsKLSAgLyogcG9sbHNldHMgdW5kZXIgcG9zaXggY2FuIG11dGF0ZSByZXByZXNlbnRhdGlvbiBhcyBmZHMgYXJlIGFkZGVkIGFuZAotICAgICByZW1vdmVkLgotICAgICBGb3IgZXhhbXBsZSwgd2UgbWF5IGNob29zZSBhIHBvbGwoKSBiYXNlZCBpbXBsZW1lbnRhdGlvbiBvbiBsaW51eCBmb3IKLSAgICAgZmV3IGZkcywgYW5kIGFuIGVwb2xsKCkgYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIG1hbnkgZmRzICovCi0gIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgKnZ0YWJsZTsKLSAgZ3ByX211IG11OwotICBncnBjX3BvbGxzZXRfd29ya2VyIHJvb3Rfd29ya2VyOwotICBpbnQgaW5fZmxpZ2h0X2NiczsKLSAgaW50IHNodXR0aW5nX2Rvd247Ci0gIGludCBjYWxsZWRfc2h1dGRvd247Ci0gIGludCBraWNrZWRfd2l0aG91dF9wb2xsZXJzOwotICBncnBjX2Nsb3N1cmUgKnNodXRkb3duX2RvbmU7Ci0gIGdycGNfY2xvc3VyZV9saXN0IGlkbGVfam9iczsKLSAgdW5pb24gewotICAgIGludCBmZDsKLSAgICB2b2lkICpwdHI7Ci0gIH0gZGF0YTsKLSAgLyogTG9jYWwgY2FjaGUgb2YgZXZlbnRmZHMgZm9yIHdvcmtlcnMgKi8KLSAgZ3JwY19jYWNoZWRfd2FrZXVwX2ZkICpsb2NhbF93YWtldXBfY2FjaGU7Ci19OwotCi1zdHJ1Y3QgZ3JwY19wb2xsc2V0X3Z0YWJsZSB7Ci0gIHZvaWQgKCphZGRfZmQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgIHN0cnVjdCBncnBjX2ZkICpmZCwgaW50IGFuZF91bmxvY2tfcG9sbHNldCk7Ci0gIHZvaWQgKCptYXliZV93b3JrX2FuZF91bmxvY2spKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCBncHJfdGltZXNwZWMgbm93KTsKLSAgdm9pZCAoKmZpbmlzaF9zaHV0ZG93bikoZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKLSAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfcG9sbHNldCAqcG9sbHNldCk7Ci19OwotCi0vKiBBZGQgYW4gZmQgdG8gYSBwb2xsc2V0ICovCi12b2lkIGdycGNfcG9sbHNldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JwY19mZCAqZmQpOwotCi0vKiBSZXR1cm5zIHRoZSBmZCB0byBsaXN0ZW4gb24gZm9yIGtpY2tzICovCi1pbnQgZ3JwY19raWNrX3JlYWRfZmQoZ3JwY19wb2xsc2V0ICpwKTsKLS8qIENhbGwgYWZ0ZXIgcG9sbGluZyBoYXMgYmVlbiBraWNrZWQgdG8gbGVhdmUgdGhlIGtpY2tlZCBzdGF0ZSAqLwotdm9pZCBncnBjX2tpY2tfZHJhaW4oZ3JwY19wb2xsc2V0ICpwKTsKLQotLyogQ29udmVydCBhIHRpbWVzcGVjIHRvIG1pbGxpc2Vjb25kczoKLSAgIC0gdmVyeSBzbWFsbCBvciBuZWdhdGl2ZSBwb2xsIHRpbWVzIGFyZSBjbGFtcGVkIHRvIHplcm8gdG8gZG8gYQotICAgICBub24tYmxvY2tpbmcgcG9sbCAod2hpY2ggYmVjb21lcyBzcGluIHBvbGxpbmcpCi0gICAtIG90aGVyIHNtYWxsIHZhbHVlcyBhcmUgcm91bmRlZCB1cCB0byBvbmUgbWlsbGlzZWNvbmQKLSAgIC0gbG9uZ2VyIHRoYW4gYSBtaWxsaXNlY29uZCBwb2xscyBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBuZWFyZXN0Ci0gICAgIG1pbGxpc2Vjb25kIHRvIGF2b2lkIHNwaW5uaW5nCi0gICAtIGluZmluaXRlIHRpbWVvdXRzIGFyZSBjb252ZXJ0ZWQgdG8gLTEgKi8KLWludCBncnBjX3BvbGxfZGVhZGxpbmVfdG9fbWlsbGlzX3RpbWVvdXQoZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93KTsKLQotLyogQWxsb3cga2ljayB0byB3YWtldXAgdGhlIGN1cnJlbnRseSBwb2xsaW5nIHdvcmtlciAqLwotI2RlZmluZSBHUlBDX1BPTExTRVRfQ0FOX0tJQ0tfU0VMRiAxCi0vKiBGb3JjZSB0aGUgd2FrZWUgdG8gcmVwb2xsIHdoZW4gYXdva2VuICovCi0jZGVmaW5lIEdSUENfUE9MTFNFVF9SRUVWQUxVQVRFX1BPTExJTkdfT05fV0FLRVVQIDIKLS8qIEFzIHBlciBncnBjX3BvbGxzZXRfa2ljaywgd2l0aCBhbiBleHRlbmRlZCBzZXQgb2YgZmxhZ3MgKGRlZmluZWQgYWJvdmUpCi0gICAtLSBtb3N0bHkgZm9yIGZkX3Bvc2l4J3MgdXNlLiAqLwotdm9pZCBncnBjX3BvbGxzZXRfa2lja19leHQoZ3JwY19wb2xsc2V0ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqc3BlY2lmaWNfd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0vKiB0dXJuIGEgcG9sbHNldCBpbnRvIGEgbXVsdGlwb2xsZXI6IHBsYXRmb3JtIHNwZWNpZmljICovCi10eXBlZGVmIHZvaWQgKCpncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcl90eXBlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBncnBjX2ZkICoqZmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZkX2NvdW50KTsKLWV4dGVybiBncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcl90eXBlIGdycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyOwotCi12b2lkIGdycGNfcG9sbF9iZWNvbWVfbXVsdGlwb2xsZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBzdHJ1Y3QgZ3JwY19mZCAqKmZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmRfY291bnQpOwotCi0vKiBSZXR1cm4gMSBpZiB0aGUgcG9sbHNldCBoYXMgYWN0aXZlIHRocmVhZHMgaW4gZ3JwY19wb2xsc2V0X3dvcmsgKHBvbGxzZXQgbXVzdAotICogYmUgbG9ja2VkKSAqLwotaW50IGdycGNfcG9sbHNldF9oYXNfd29ya2VycyhncnBjX3BvbGxzZXQgKnBvbGxzZXQpOwotCi12b2lkIGdycGNfcmVtb3ZlX2ZkX2Zyb21fYWxsX2Vwb2xsX3NldHMoaW50IGZkKTsKLQotLyogb3ZlcnJpZGUgdG8gYWxsb3cgdGVzdHMgdG8gaG9vayBwb2xsKCkgdXNhZ2UgKi8KLS8qIE5PVEU6IEFueSBjaGFuZ2VzIHRvIGdycGNfcG9sbF9mdW5jdGlvbiBtdXN0IHRha2UgcGxhY2Ugd2hlbiB0aGUgZ1JQQwotICAgaXMgY2VydGFpbmx5IG5vdCBkb2luZyBhbnkgcG9sbGluZyBhbnl3aGVyZS4KLSAgIE90aGVyd2lzZSwgdGhlcmUgbWlnaHQgYmUgYSByYWNlIGJldHdlZW4gY2hhbmdpbmcgdGhlIHZhcmlhYmxlIGFuZCBhY3R1YWxseQotICAgZG9pbmcgYSBwb2xsaW5nIG9wZXJhdGlvbiAqLwotdHlwZWRlZiBpbnQgKCpncnBjX3BvbGxfZnVuY3Rpb25fdHlwZSkoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIGludCk7Ci1leHRlcm4gZ3JwY19wb2xsX2Z1bmN0aW9uX3R5cGUgZ3JwY19wb2xsX2Z1bmN0aW9uOwotZXh0ZXJuIGdycGNfd2FrZXVwX2ZkIGdycGNfZ2xvYmFsX3dha2V1cF9mZDsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1BPU0lYX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmggYi9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRjNjI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1NFVF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1NFVF9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiCi0KLS8qIEEgZ3JwY19wb2xsc2V0X3NldCBpcyBhIHNldCBvZiBwb2xsc2V0cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGFuCi0gICBhY3Rpb24uIEFkZGluZyBhIHBvbGxzZXQgdG8gYSBwb2xsc2V0X3NldCBhdXRvbWF0aWNhbGx5IGFkZHMgYW55Ci0gICBmZCdzIChldGMpIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2V0X3NldCB0byB0aGF0IHBvbGxzZXQuCi0gICBSZWdpc3RlcmluZyBmZCdzIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGVtIHRvIGFsbCBjdXJyZW50IHBvbGxzZXRzLiAqLwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXRfc2V0IGdycGNfcG9sbHNldF9zZXQ7Ci0KLWdycGNfcG9sbHNldF9zZXQgKmdycGNfcG9sbHNldF9zZXRfY3JlYXRlKHZvaWQpOwotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2Rlc3Ryb3koZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpOwotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Ci12b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKmJhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqaXRlbSk7Ci12b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpiYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKml0ZW0pOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1BPTExTRVRfU0VUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM5YWZmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIgotCi1zdHJ1Y3QgZ3JwY19wb2xsc2V0X3NldCB7Ci0gIGdwcl9tdSBtdTsKLQotICBzaXplX3QgcG9sbHNldF9jb3VudDsKLSAgc2l6ZV90IHBvbGxzZXRfY2FwYWNpdHk7Ci0gIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzOwotCi0gIHNpemVfdCBwb2xsc2V0X3NldF9jb3VudDsKLSAgc2l6ZV90IHBvbGxzZXRfc2V0X2NhcGFjaXR5OwotICBzdHJ1Y3QgZ3JwY19wb2xsc2V0X3NldCAqKnBvbGxzZXRfc2V0czsKLQotICBzaXplX3QgZmRfY291bnQ7Ci0gIHNpemVfdCBmZF9jYXBhY2l0eTsKLSAgZ3JwY19mZCAqKmZkczsKLX07Ci0KLWdycGNfcG9sbHNldF9zZXQgKmdycGNfcG9sbHNldF9zZXRfY3JlYXRlKHZvaWQpIHsKLSAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQgPSBncHJfbWFsbG9jKHNpemVvZigqcG9sbHNldF9zZXQpKTsKLSAgbWVtc2V0KHBvbGxzZXRfc2V0LCAwLCBzaXplb2YoKnBvbGxzZXRfc2V0KSk7Ci0gIGdwcl9tdV9pbml0KCZwb2xsc2V0X3NldC0+bXUpOwotICByZXR1cm4gcG9sbHNldF9zZXQ7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9kZXN0cm95KGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0KSB7Ci0gIHNpemVfdCBpOwotICBncHJfbXVfZGVzdHJveSgmcG9sbHNldF9zZXQtPm11KTsKLSAgZm9yIChpID0gMDsgaSA8IHBvbGxzZXRfc2V0LT5mZF9jb3VudDsgaSsrKSB7Ci0gICAgR1JQQ19GRF9VTlJFRihwb2xsc2V0X3NldC0+ZmRzW2ldLCAicG9sbHNldF9zZXQiKTsKLSAgfQotICBncHJfZnJlZShwb2xsc2V0X3NldC0+cG9sbHNldHMpOwotICBncHJfZnJlZShwb2xsc2V0X3NldC0+cG9sbHNldF9zZXRzKTsKLSAgZ3ByX2ZyZWUocG9sbHNldF9zZXQtPmZkcyk7Ci0gIGdwcl9mcmVlKHBvbGxzZXRfc2V0KTsKLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBzaXplX3QgaSwgajsKLSAgZ3ByX211X2xvY2soJnBvbGxzZXRfc2V0LT5tdSk7Ci0gIGlmIChwb2xsc2V0X3NldC0+cG9sbHNldF9jb3VudCA9PSBwb2xsc2V0X3NldC0+cG9sbHNldF9jYXBhY2l0eSkgewotICAgIHBvbGxzZXRfc2V0LT5wb2xsc2V0X2NhcGFjaXR5ID0KLSAgICAgICAgR1BSX01BWCg4LCAyICogcG9sbHNldF9zZXQtPnBvbGxzZXRfY2FwYWNpdHkpOwotICAgIHBvbGxzZXRfc2V0LT5wb2xsc2V0cyA9Ci0gICAgICAgIGdwcl9yZWFsbG9jKHBvbGxzZXRfc2V0LT5wb2xsc2V0cywgcG9sbHNldF9zZXQtPnBvbGxzZXRfY2FwYWNpdHkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnBvbGxzZXRfc2V0LT5wb2xsc2V0cykpOwotICB9Ci0gIHBvbGxzZXRfc2V0LT5wb2xsc2V0c1twb2xsc2V0X3NldC0+cG9sbHNldF9jb3VudCsrXSA9IHBvbGxzZXQ7Ci0gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcG9sbHNldF9zZXQtPmZkX2NvdW50OyBpKyspIHsKLSAgICBpZiAoZ3JwY19mZF9pc19vcnBoYW5lZChwb2xsc2V0X3NldC0+ZmRzW2ldKSkgewotICAgICAgR1JQQ19GRF9VTlJFRihwb2xsc2V0X3NldC0+ZmRzW2ldLCAicG9sbHNldF9zZXQiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ3JwY19wb2xsc2V0X2FkZF9mZChleGVjX2N0eCwgcG9sbHNldCwgcG9sbHNldF9zZXQtPmZkc1tpXSk7Ci0gICAgICBwb2xsc2V0X3NldC0+ZmRzW2orK10gPSBwb2xsc2V0X3NldC0+ZmRzW2ldOwotICAgIH0KLSAgfQotICBwb2xsc2V0X3NldC0+ZmRfY291bnQgPSBqOwotICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0X3NldC0+bXUpOwotfQotCi12b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7Ci0gIHNpemVfdCBpOwotICBncHJfbXVfbG9jaygmcG9sbHNldF9zZXQtPm11KTsKLSAgZm9yIChpID0gMDsgaSA8IHBvbGxzZXRfc2V0LT5wb2xsc2V0X2NvdW50OyBpKyspIHsKLSAgICBpZiAocG9sbHNldF9zZXQtPnBvbGxzZXRzW2ldID09IHBvbGxzZXQpIHsKLSAgICAgIHBvbGxzZXRfc2V0LT5wb2xsc2V0X2NvdW50LS07Ci0gICAgICBHUFJfU1dBUChncnBjX3BvbGxzZXQgKiwgcG9sbHNldF9zZXQtPnBvbGxzZXRzW2ldLAotICAgICAgICAgICAgICAgcG9sbHNldF9zZXQtPnBvbGxzZXRzW3BvbGxzZXRfc2V0LT5wb2xsc2V0X2NvdW50XSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmcG9sbHNldF9zZXQtPm11KTsKLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqYmFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICppdGVtKSB7Ci0gIHNpemVfdCBpLCBqOwotICBncHJfbXVfbG9jaygmYmFnLT5tdSk7Ci0gIGlmIChiYWctPnBvbGxzZXRfc2V0X2NvdW50ID09IGJhZy0+cG9sbHNldF9zZXRfY2FwYWNpdHkpIHsKLSAgICBiYWctPnBvbGxzZXRfc2V0X2NhcGFjaXR5ID0gR1BSX01BWCg4LCAyICogYmFnLT5wb2xsc2V0X3NldF9jYXBhY2l0eSk7Ci0gICAgYmFnLT5wb2xsc2V0X3NldHMgPQotICAgICAgICBncHJfcmVhbGxvYyhiYWctPnBvbGxzZXRfc2V0cywKLSAgICAgICAgICAgICAgICAgICAgYmFnLT5wb2xsc2V0X3NldF9jYXBhY2l0eSAqIHNpemVvZigqYmFnLT5wb2xsc2V0X3NldHMpKTsKLSAgfQotICBiYWctPnBvbGxzZXRfc2V0c1tiYWctPnBvbGxzZXRfc2V0X2NvdW50KytdID0gaXRlbTsKLSAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBiYWctPmZkX2NvdW50OyBpKyspIHsKLSAgICBpZiAoZ3JwY19mZF9pc19vcnBoYW5lZChiYWctPmZkc1tpXSkpIHsKLSAgICAgIEdSUENfRkRfVU5SRUYoYmFnLT5mZHNbaV0sICJwb2xsc2V0X3NldCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX3BvbGxzZXRfc2V0X2FkZF9mZChleGVjX2N0eCwgaXRlbSwgYmFnLT5mZHNbaV0pOwotICAgICAgYmFnLT5mZHNbaisrXSA9IGJhZy0+ZmRzW2ldOwotICAgIH0KLSAgfQotICBiYWctPmZkX2NvdW50ID0gajsKLSAgZ3ByX211X3VubG9jaygmYmFnLT5tdSk7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKmJhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqaXRlbSkgewotICBzaXplX3QgaTsKLSAgZ3ByX211X2xvY2soJmJhZy0+bXUpOwotICBmb3IgKGkgPSAwOyBpIDwgYmFnLT5wb2xsc2V0X3NldF9jb3VudDsgaSsrKSB7Ci0gICAgaWYgKGJhZy0+cG9sbHNldF9zZXRzW2ldID09IGl0ZW0pIHsKLSAgICAgIGJhZy0+cG9sbHNldF9zZXRfY291bnQtLTsKLSAgICAgIEdQUl9TV0FQKGdycGNfcG9sbHNldF9zZXQgKiwgYmFnLT5wb2xsc2V0X3NldHNbaV0sCi0gICAgICAgICAgICAgICBiYWctPnBvbGxzZXRfc2V0c1tiYWctPnBvbGxzZXRfc2V0X2NvdW50XSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmYmFnLT5tdSk7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0LCBncnBjX2ZkICpmZCkgewotICBzaXplX3QgaTsKLSAgZ3ByX211X2xvY2soJnBvbGxzZXRfc2V0LT5tdSk7Ci0gIGlmIChwb2xsc2V0X3NldC0+ZmRfY291bnQgPT0gcG9sbHNldF9zZXQtPmZkX2NhcGFjaXR5KSB7Ci0gICAgcG9sbHNldF9zZXQtPmZkX2NhcGFjaXR5ID0gR1BSX01BWCg4LCAyICogcG9sbHNldF9zZXQtPmZkX2NhcGFjaXR5KTsKLSAgICBwb2xsc2V0X3NldC0+ZmRzID0gZ3ByX3JlYWxsb2MoCi0gICAgICAgIHBvbGxzZXRfc2V0LT5mZHMsIHBvbGxzZXRfc2V0LT5mZF9jYXBhY2l0eSAqIHNpemVvZigqcG9sbHNldF9zZXQtPmZkcykpOwotICB9Ci0gIEdSUENfRkRfUkVGKGZkLCAicG9sbHNldF9zZXQiKTsKLSAgcG9sbHNldF9zZXQtPmZkc1twb2xsc2V0X3NldC0+ZmRfY291bnQrK10gPSBmZDsKLSAgZm9yIChpID0gMDsgaSA8IHBvbGxzZXRfc2V0LT5wb2xsc2V0X2NvdW50OyBpKyspIHsKLSAgICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0X3NldC0+cG9sbHNldHNbaV0sIGZkKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgcG9sbHNldF9zZXQtPnBvbGxzZXRfc2V0X2NvdW50OyBpKyspIHsKLSAgICBncnBjX3BvbGxzZXRfc2V0X2FkZF9mZChleGVjX2N0eCwgcG9sbHNldF9zZXQtPnBvbGxzZXRfc2V0c1tpXSwgZmQpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnBvbGxzZXRfc2V0LT5tdSk7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9kZWxfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0LCBncnBjX2ZkICpmZCkgewotICBzaXplX3QgaTsKLSAgZ3ByX211X2xvY2soJnBvbGxzZXRfc2V0LT5tdSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwb2xsc2V0X3NldC0+ZmRfY291bnQ7IGkrKykgewotICAgIGlmIChwb2xsc2V0X3NldC0+ZmRzW2ldID09IGZkKSB7Ci0gICAgICBwb2xsc2V0X3NldC0+ZmRfY291bnQtLTsKLSAgICAgIEdQUl9TV0FQKGdycGNfZmQgKiwgcG9sbHNldF9zZXQtPmZkc1tpXSwKLSAgICAgICAgICAgICAgIHBvbGxzZXRfc2V0LT5mZHNbcG9sbHNldF9zZXQtPmZkX2NvdW50XSk7Ci0gICAgICBHUlBDX0ZEX1VOUkVGKGZkLCAicG9sbHNldF9zZXQiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgcG9sbHNldF9zZXQtPnBvbGxzZXRfc2V0X2NvdW50OyBpKyspIHsKLSAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9mZChleGVjX2N0eCwgcG9sbHNldF9zZXQtPnBvbGxzZXRfc2V0c1tpXSwgZmQpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnBvbGxzZXRfc2V0LT5tdSk7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfUE9TSVhfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIGIvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNDg3Ny4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfUE9MTFNFVF9TRVRfUE9TSVhfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfUE9MTFNFVF9TRVRfUE9TSVhfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oIgotCi12b2lkIGdycGNfcG9sbHNldF9zZXRfYWRkX2ZkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldCwgZ3JwY19mZCAqZmQpOwotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2RlbF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsIGdycGNfZmQgKmZkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1NFVF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMgYi9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGVjYTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIKLQotZ3JwY19wb2xsc2V0X3NldCogZ3JwY19wb2xsc2V0X3NldF9jcmVhdGUocG9sbHNldF9zZXQpIHsgcmV0dXJuIE5VTEw7IH0KLQotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2Rlc3Ryb3koZ3JwY19wb2xsc2V0X3NldCogcG9sbHNldF9zZXQpIHt9Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBwb2xsc2V0X3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQqIHBvbGxzZXQpIHt9Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBwb2xsc2V0X3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQqIHBvbGxzZXQpIHt9Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCogZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQqIGJhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCogaXRlbSkge30KLQotdm9pZCBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCogYmFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBpdGVtKSB7fQotCi0jZW5kaWYgLyogR1BSX1dJTlNPQ0tfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmggYi9zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDQwZmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfUE9MTFNFVF9TRVRfV0lORE9XU19ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1NFVF9XSU5ET1dTX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgiCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfUE9MTFNFVF9TRVRfV0lORE9XU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBiL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk5MjI0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiCi0KLWdwcl9tdSBncnBjX3BvbGxpbmdfbXU7Ci1zdGF0aWMgZ3JwY19wb2xsc2V0X3dvcmtlciAqZ19hY3RpdmVfcG9sbGVyOwotc3RhdGljIGdycGNfcG9sbHNldF93b3JrZXIgZ19nbG9iYWxfcm9vdF93b3JrZXI7Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X2dsb2JhbF9pbml0KCkgewotICBncHJfbXVfaW5pdCgmZ3JwY19wb2xsaW5nX211KTsKLSAgZ19hY3RpdmVfcG9sbGVyID0gTlVMTDsKLSAgZ19nbG9iYWxfcm9vdF93b3JrZXIubGlua3NbR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX0dMT0JBTF0ubmV4dCA9Ci0gICAgICBnX2dsb2JhbF9yb290X3dvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfR0xPQkFMXS5wcmV2ID0KLSAgICAgICAgICAmZ19nbG9iYWxfcm9vdF93b3JrZXI7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X2dsb2JhbF9zaHV0ZG93bigpIHsgZ3ByX211X2Rlc3Ryb3koJmdycGNfcG9sbGluZ19tdSk7IH0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX3dvcmtlcihncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXJfbGlua190eXBlIHR5cGUpIHsKLSAgd29ya2VyLT5saW5rc1t0eXBlXS5wcmV2LT5saW5rc1t0eXBlXS5uZXh0ID0gd29ya2VyLT5saW5rc1t0eXBlXS5uZXh0OwotICB3b3JrZXItPmxpbmtzW3R5cGVdLm5leHQtPmxpbmtzW3R5cGVdLnByZXYgPSB3b3JrZXItPmxpbmtzW3R5cGVdLnByZXY7Ci0gIHdvcmtlci0+bGlua3NbdHlwZV0ubmV4dCA9IHdvcmtlci0+bGlua3NbdHlwZV0ucHJldiA9IHdvcmtlcjsKLX0KLQotc3RhdGljIGludCBoYXNfd29ya2VycyhncnBjX3BvbGxzZXRfd29ya2VyICpyb290LAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyX2xpbmtfdHlwZSB0eXBlKSB7Ci0gIHJldHVybiByb290LT5saW5rc1t0eXBlXS5uZXh0ICE9IHJvb3Q7Ci19Ci0KLXN0YXRpYyBncnBjX3BvbGxzZXRfd29ya2VyICpwb3BfZnJvbnRfd29ya2VyKAotICAgIGdycGNfcG9sbHNldF93b3JrZXIgKnJvb3QsIGdycGNfcG9sbHNldF93b3JrZXJfbGlua190eXBlIHR5cGUpIHsKLSAgaWYgKGhhc193b3JrZXJzKHJvb3QsIHR5cGUpKSB7Ci0gICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqdyA9IHJvb3QtPmxpbmtzW3R5cGVdLm5leHQ7Ci0gICAgcmVtb3ZlX3dvcmtlcih3LCB0eXBlKTsKLSAgICByZXR1cm4gdzsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXNoX2Zyb250X3dvcmtlcihncnBjX3BvbGxzZXRfd29ya2VyICpyb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlcl9saW5rX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlcikgewotICB3b3JrZXItPmxpbmtzW3R5cGVdLnByZXYgPSByb290OwotICB3b3JrZXItPmxpbmtzW3R5cGVdLm5leHQgPSB3b3JrZXItPmxpbmtzW3R5cGVdLnByZXYtPmxpbmtzW3R5cGVdLm5leHQ7Ci0gIHdvcmtlci0+bGlua3NbdHlwZV0ucHJldi0+bGlua3NbdHlwZV0ubmV4dCA9Ci0gICAgICB3b3JrZXItPmxpbmtzW3R5cGVdLm5leHQtPmxpbmtzW3R5cGVdLnByZXYgPSB3b3JrZXI7Ci19Ci0KLXNpemVfdCBncnBjX3BvbGxzZXRfc2l6ZSh2b2lkKSB7IHJldHVybiBzaXplb2YoZ3JwY19wb2xsc2V0KTsgfQotCi0vKiBUaGVyZSBpc24ndCByZWFsbHkgYW55IHN1Y2ggdGhpbmcgYXMgYSBwb2xsc2V0IHVuZGVyIFdpbmRvd3MsIGR1ZSB0byB0aGUKLSAgIG5hdHVyZSBvZiB0aGUgSU8gY29tcGxldGlvbiBwb3J0cy4gV2UncmUgc3RpbGwgZ29pbmcgdG8gcHJvdmlkZSBhIG1pbmltYWwKLSAgIHNldCBvZiBmZWF0dXJlcyBmb3IgdGhlIHNha2Ugb2YgdGhlIHJlc3Qgb2YgZ3JwYy4gQnV0IGdycGNfcG9sbHNldF93b3JrCi0gICB3b24ndCBhY3R1YWxseSBkbyBhbnkgcG9sbGluZywgYW5kIHJldHVybiBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiAqLwotCi12b2lkIGdycGNfcG9sbHNldF9pbml0KGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3ByX211ICoqbXUpIHsKLSAgKm11ID0gJmdycGNfcG9sbGluZ19tdTsKLSAgbWVtc2V0KHBvbGxzZXQsIDAsIHNpemVvZigqcG9sbHNldCkpOwotICBwb2xsc2V0LT5yb290X3dvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVF0ubmV4dCA9Ci0gICAgICBwb2xsc2V0LT5yb290X3dvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVF0ucHJldiA9Ci0gICAgICAgICAgJnBvbGxzZXQtPnJvb3Rfd29ya2VyOwotfQotCi12b2lkIGdycGNfcG9sbHNldF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIHBvbGxzZXQtPnNodXR0aW5nX2Rvd24gPSAxOwotICBncnBjX3BvbGxzZXRfa2ljayhwb2xsc2V0LCBHUlBDX1BPTExTRVRfS0lDS19CUk9BRENBU1QpOwotICBpZiAoIXBvbGxzZXQtPmlzX2lvY3Bfd29ya2VyKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCB0cnVlLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBwb2xsc2V0LT5vbl9zaHV0ZG93biA9IGNsb3N1cmU7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHt9Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X3Jlc2V0KGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBHUFJfQVNTRVJUKHBvbGxzZXQtPnNodXR0aW5nX2Rvd24pOwotICBHUFJfQVNTRVJUKAotICAgICAgIWhhc193b3JrZXJzKCZwb2xsc2V0LT5yb290X3dvcmtlciwgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1BPTExTRVQpKTsKLSAgcG9sbHNldC0+c2h1dHRpbmdfZG93biA9IDA7Ci0gIHBvbGxzZXQtPmlzX2lvY3Bfd29ya2VyID0gMDsKLSAgcG9sbHNldC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDA7Ci0gIHBvbGxzZXQtPm9uX3NodXRkb3duID0gTlVMTDsKLX0KLQotdm9pZCBncnBjX3BvbGxzZXRfd29yayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICoqd29ya2VyX2hkbCwgZ3ByX3RpbWVzcGVjIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7Ci0gIGdycGNfcG9sbHNldF93b3JrZXIgd29ya2VyOwotICAqd29ya2VyX2hkbCA9ICZ3b3JrZXI7Ci0KLSAgaW50IGFkZGVkX3dvcmtlciA9IDA7Ci0gIHdvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVF0ubmV4dCA9Ci0gICAgICB3b3JrZXIubGlua3NbR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1BPTExTRVRdLnByZXYgPQotICAgICAgICAgIHdvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfR0xPQkFMXS5uZXh0ID0KLSAgICAgICAgICAgICAgd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19HTE9CQUxdLnByZXYgPSBOVUxMOwotICB3b3JrZXIua2lja2VkID0gMDsKLSAgd29ya2VyLnBvbGxzZXQgPSBwb2xsc2V0OwotICBncHJfY3ZfaW5pdCgmd29ya2VyLmN2KTsKLSAgaWYgKCFwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzICYmICFwb2xsc2V0LT5zaHV0dGluZ19kb3duKSB7Ci0gICAgaWYgKGdfYWN0aXZlX3BvbGxlciA9PSBOVUxMKSB7Ci0gICAgICBncnBjX3BvbGxzZXRfd29ya2VyICpuZXh0X3dvcmtlcjsKLSAgICAgIC8qIGJlY29tZSBwb2xsZXIgKi8KLSAgICAgIHBvbGxzZXQtPmlzX2lvY3Bfd29ya2VyID0gMTsKLSAgICAgIGdfYWN0aXZlX3BvbGxlciA9ICZ3b3JrZXI7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZncnBjX3BvbGxpbmdfbXUpOwotICAgICAgZ3JwY19pb2NwX3dvcmsoZXhlY19jdHgsIGRlYWRsaW5lKTsKLSAgICAgIGdycGNfZXhlY19jdHhfZmx1c2goZXhlY19jdHgpOwotICAgICAgZ3ByX211X2xvY2soJmdycGNfcG9sbGluZ19tdSk7Ci0gICAgICBwb2xsc2V0LT5pc19pb2NwX3dvcmtlciA9IDA7Ci0gICAgICBnX2FjdGl2ZV9wb2xsZXIgPSBOVUxMOwotICAgICAgLyogdHJ5IHRvIGdldCBhIHdvcmtlciBmcm9tIHRoaXMgcG9sbHNldHMgd29ya2VyIGxpc3QgKi8KLSAgICAgIG5leHRfd29ya2VyID0gcG9wX2Zyb250X3dvcmtlcigmcG9sbHNldC0+cm9vdF93b3JrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1BPTExTRVQpOwotICAgICAgaWYgKG5leHRfd29ya2VyID09IE5VTEwpIHsKLSAgICAgICAgLyogdHJ5IHRvIGdldCBhIHdvcmtlciBmcm9tIHRoZSBnbG9iYWwgbGlzdCAqLwotICAgICAgICBuZXh0X3dvcmtlciA9IHBvcF9mcm9udF93b3JrZXIoJmdfZ2xvYmFsX3Jvb3Rfd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX0dMT0JBTCk7Ci0gICAgICB9Ci0gICAgICBpZiAobmV4dF93b3JrZXIgIT0gTlVMTCkgewotICAgICAgICBuZXh0X3dvcmtlci0+a2lja2VkID0gMTsKLSAgICAgICAgZ3ByX2N2X3NpZ25hbCgmbmV4dF93b3JrZXItPmN2KTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBvbGxzZXQtPnNodXR0aW5nX2Rvd24gJiYgcG9sbHNldC0+b25fc2h1dGRvd24gIT0gTlVMTCkgewotICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBvbGxzZXQtPm9uX3NodXRkb3duLCB0cnVlLCBOVUxMKTsKLSAgICAgICAgcG9sbHNldC0+b25fc2h1dGRvd24gPSBOVUxMOwotICAgICAgfQotICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBwdXNoX2Zyb250X3dvcmtlcigmZ19nbG9iYWxfcm9vdF93b3JrZXIsIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19HTE9CQUwsCi0gICAgICAgICAgICAgICAgICAgICAgJndvcmtlcik7Ci0gICAgcHVzaF9mcm9udF93b3JrZXIoJnBvbGxzZXQtPnJvb3Rfd29ya2VyLCBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAmd29ya2VyKTsKLSAgICBhZGRlZF93b3JrZXIgPSAxOwotICAgIHdoaWxlICghd29ya2VyLmtpY2tlZCkgewotICAgICAgaWYgKGdwcl9jdl93YWl0KCZ3b3JrZXIuY3YsICZncnBjX3BvbGxpbmdfbXUsIGRlYWRsaW5lKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcG9sbHNldC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDA7Ci0gIH0KLWRvbmU6Ci0gIGlmICghZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkoZXhlY19jdHgtPmNsb3N1cmVfbGlzdCkpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZncnBjX3BvbGxpbmdfbXUpOwotICAgIGdycGNfZXhlY19jdHhfZmx1c2goZXhlY19jdHgpOwotICAgIGdwcl9tdV9sb2NrKCZncnBjX3BvbGxpbmdfbXUpOwotICB9Ci0gIGlmIChhZGRlZF93b3JrZXIpIHsKLSAgICByZW1vdmVfd29ya2VyKCZ3b3JrZXIsIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19HTE9CQUwpOwotICAgIHJlbW92ZV93b3JrZXIoJndvcmtlciwgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1BPTExTRVQpOwotICB9Ci0gIGdwcl9jdl9kZXN0cm95KCZ3b3JrZXIuY3YpOwotICAqd29ya2VyX2hkbCA9IE5VTEw7Ci19Ci0KLXZvaWQgZ3JwY19wb2xsc2V0X2tpY2soZ3JwY19wb2xsc2V0ICpwLCBncnBjX3BvbGxzZXRfd29ya2VyICpzcGVjaWZpY193b3JrZXIpIHsKLSAgaWYgKHNwZWNpZmljX3dvcmtlciAhPSBOVUxMKSB7Ci0gICAgaWYgKHNwZWNpZmljX3dvcmtlciA9PSBHUlBDX1BPTExTRVRfS0lDS19CUk9BRENBU1QpIHsKLSAgICAgIGZvciAoc3BlY2lmaWNfd29ya2VyID0KLSAgICAgICAgICAgICAgIHAtPnJvb3Rfd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUXS5uZXh0OwotICAgICAgICAgICBzcGVjaWZpY193b3JrZXIgIT0gJnAtPnJvb3Rfd29ya2VyOwotICAgICAgICAgICBzcGVjaWZpY193b3JrZXIgPQotICAgICAgICAgICAgICAgc3BlY2lmaWNfd29ya2VyLT5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVF0ubmV4dCkgewotICAgICAgICBzcGVjaWZpY193b3JrZXItPmtpY2tlZCA9IDE7Ci0gICAgICAgIGdwcl9jdl9zaWduYWwoJnNwZWNpZmljX3dvcmtlci0+Y3YpOwotICAgICAgfQotICAgICAgcC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDE7Ci0gICAgICBpZiAocC0+aXNfaW9jcF93b3JrZXIpIHsKLSAgICAgICAgZ3JwY19pb2NwX2tpY2soKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHAtPmlzX2lvY3Bfd29ya2VyICYmIGdfYWN0aXZlX3BvbGxlciA9PSBzcGVjaWZpY193b3JrZXIpIHsKLSAgICAgICAgZ3JwY19pb2NwX2tpY2soKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwZWNpZmljX3dvcmtlci0+a2lja2VkID0gMTsKLSAgICAgICAgZ3ByX2N2X3NpZ25hbCgmc3BlY2lmaWNfd29ya2VyLT5jdik7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHNwZWNpZmljX3dvcmtlciA9Ci0gICAgICAgIHBvcF9mcm9udF93b3JrZXIoJnAtPnJvb3Rfd29ya2VyLCBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVCk7Ci0gICAgaWYgKHNwZWNpZmljX3dvcmtlciAhPSBOVUxMKSB7Ci0gICAgICBncnBjX3BvbGxzZXRfa2ljayhwLCBzcGVjaWZpY193b3JrZXIpOwotICAgIH0gZWxzZSBpZiAocC0+aXNfaW9jcF93b3JrZXIpIHsKLSAgICAgIGdycGNfaW9jcF9raWNrKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHAtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMgPSAxOwotICAgIH0KLSAgfQotfQotCi12b2lkIGdycGNfa2lja19wb2xsZXIodm9pZCkgeyBncnBjX2lvY3Bfa2ljaygpOyB9Ci0KLSNlbmRpZiAvKiBHUFJfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIGIvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDE1ODUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9QT0xMU0VUX1dJTkRPV1NfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfUE9MTFNFVF9XSU5ET1dTX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIgotCi0vKiBUaGVyZSBpc24ndCByZWFsbHkgYW55IHN1Y2ggdGhpbmcgYXMgYSBwb2xsc2V0IHVuZGVyIFdpbmRvd3MsIGR1ZSB0byB0aGUKLSAgIG5hdHVyZSBvZiB0aGUgSU8gY29tcGxldGlvbiBwb3J0cy4gQSBXaW5kb3dzICJwb2xsc2V0IiBpcyBtZXJlbHkgYSBtdXRleAotICAgdXNlZCB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBJT0NQLCBhbmQgd29ya2VycyBhcmUgY29uZGl0aW9uIHZhcmlhYmxlcwotICAgdXNlZCB0byBibG9jayB0aHJlYWRzIHVudGlsIHdvcmsgaXMgcmVhZHkuICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUID0gMCwKLSAgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX0dMT0JBTCwKLSAgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1RZUEVTCi19IGdycGNfcG9sbHNldF93b3JrZXJfbGlua190eXBlOwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXRfd29ya2VyX2xpbmsgewotICBzdHJ1Y3QgZ3JwY19wb2xsc2V0X3dvcmtlciAqbmV4dDsKLSAgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgKnByZXY7Ci19IGdycGNfcG9sbHNldF93b3JrZXJfbGluazsKLQotc3RydWN0IGdycGNfcG9sbHNldDsKLXR5cGVkZWYgc3RydWN0IGdycGNfcG9sbHNldCBncnBjX3BvbGxzZXQ7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgewotICBncHJfY3YgY3Y7Ci0gIGludCBraWNrZWQ7Ci0gIHN0cnVjdCBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7Ci0gIGdycGNfcG9sbHNldF93b3JrZXJfbGluayBsaW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfVFlQRVNdOwotfSBncnBjX3BvbGxzZXRfd29ya2VyOwotCi1zdHJ1Y3QgZ3JwY19wb2xsc2V0IHsKLSAgaW50IHNodXR0aW5nX2Rvd247Ci0gIGludCBraWNrZWRfd2l0aG91dF9wb2xsZXJzOwotICBpbnQgaXNfaW9jcF93b3JrZXI7Ci0gIGdycGNfcG9sbHNldF93b3JrZXIgcm9vdF93b3JrZXI7Ci0gIGdycGNfY2xvc3VyZSAqb25fc2h1dGRvd247Ci19OwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1BPTExTRVRfV0lORE9XU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCBiL3NyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBkN2QxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfUkVTT0xWRV9BRERSRVNTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1JFU09MVkVfQUREUkVTU19ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCi0KLSNkZWZpbmUgR1JQQ19NQVhfU09DS0FERFJfU0laRSAxMjgKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyIGFkZHJbR1JQQ19NQVhfU09DS0FERFJfU0laRV07Ci0gIHNpemVfdCBsZW47Ci19IGdycGNfcmVzb2x2ZWRfYWRkcmVzczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3QgbmFkZHJzOwotICBncnBjX3Jlc29sdmVkX2FkZHJlc3MgKmFkZHJzOwotfSBncnBjX3Jlc29sdmVkX2FkZHJlc3NlczsKLQotLyogQXN5bmMgcmVzdWx0IGNhbGxiYWNrOgotICAgT24gc3VjY2VzczogYWRkcmVzc2VzIGlzIHRoZSByZXN1bHQsIGFuZCB0aGUgY2FsbGVlIG11c3QgY2FsbAotICAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXNfZGVzdHJveSB3aGVuIGl0J3MgZG9uZSB3aXRoIHRoZW0KLSAgIE9uIGZhaWx1cmU6IGFkZHJlc3NlcyBpcyBOVUxMICovCi10eXBlZGVmIHZvaWQgKCpncnBjX3Jlc29sdmVfY2IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRyZXNzZXMpOwotLyogQXN5bmNocm9ub3VzbHkgcmVzb2x2ZSBhZGRyLiBVc2UgZGVmYXVsdF9wb3J0IGlmIGEgcG9ydCBpc24ndCBkZXNpZ25hdGVkCi0gICBpbiBhZGRyLCBvdGhlcndpc2UgdXNlIHRoZSBwb3J0IGluIGFkZHIuICovCi0vKiBUT0RPKGN0aWxsZXIpOiBhZGQgYSB0aW1lb3V0IGhlcmUgKi8KLXZvaWQgZ3JwY19yZXNvbHZlX2FkZHJlc3MoY29uc3QgY2hhciAqYWRkciwgY29uc3QgY2hhciAqZGVmYXVsdF9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVfY2IgY2IsIHZvaWQgKmFyZyk7Ci0vKiBEZXN0cm95IHJlc29sdmVkIGFkZHJlc3NlcyAqLwotdm9pZCBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRyZXNzZXMpOwotCi0vKiBSZXNvbHZlIGFkZHIgaW4gYSBibG9ja2luZyBmYXNoaW9uLiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4gT24gc3VjY2VzcywKLSAgIHJlc3VsdCBtdXN0IGJlIGZyZWVkIHdpdGggZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXNfZGVzdHJveS4gKi8KLWV4dGVybiBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqKCpncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcykoCi0gICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVmYXVsdF9wb3J0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9SRVNPTFZFX0FERFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiM2FhOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjdXRvci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICBjaGFyICpkZWZhdWx0X3BvcnQ7Ci0gIGdycGNfcmVzb2x2ZV9jYiBjYjsKLSAgZ3JwY19jbG9zdXJlIHJlcXVlc3RfY2xvc3VyZTsKLSAgdm9pZCAqYXJnOwotfSByZXF1ZXN0OwotCi1zdGF0aWMgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmJsb2NraW5nX3Jlc29sdmVfYWRkcmVzc19pbXBsKAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9ydCkgewotICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7Ci0gIHN0cnVjdCBhZGRyaW5mbyAqcmVzdWx0ID0gTlVMTCwgKnJlc3A7Ci0gIGNoYXIgKmhvc3Q7Ci0gIGNoYXIgKnBvcnQ7Ci0gIGludCBzOwotICBzaXplX3QgaTsKLSAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJzID0gTlVMTDsKLQotICBpZiAobmFtZVswXSA9PSAndScgJiYgbmFtZVsxXSA9PSAnbicgJiYgbmFtZVsyXSA9PSAnaScgJiYgbmFtZVszXSA9PSAneCcgJiYKLSAgICAgIG5hbWVbNF0gPT0gJzonICYmIG5hbWVbNV0gIT0gMCkgewotICAgIHJldHVybiBncnBjX3Jlc29sdmVfdW5peF9kb21haW5fYWRkcmVzcyhuYW1lICsgNSk7Ci0gIH0KLQotICAvKiBwYXJzZSBuYW1lLCBzcGxpdHRpbmcgaXQgaW50byBob3N0IGFuZCBwb3J0IHBhcnRzICovCi0gIGdwcl9zcGxpdF9ob3N0X3BvcnQobmFtZSwgJmhvc3QsICZwb3J0KTsKLSAgaWYgKGhvc3QgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAidW5wYXJzZWFibGUgaG9zdDpwb3J0OiAnJXMnIiwgbmFtZSk7Ci0gICAgZ290byBkb25lOwotICB9Ci0gIGlmIChwb3J0ID09IE5VTEwpIHsKLSAgICBpZiAoZGVmYXVsdF9wb3J0ID09IE5VTEwpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAibm8gcG9ydCBpbiBuYW1lICclcyciLCBuYW1lKTsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgcG9ydCA9IGdwcl9zdHJkdXAoZGVmYXVsdF9wb3J0KTsKLSAgfQotCi0gIC8qIENhbGwgZ2V0YWRkcmluZm8gKi8KLSAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgICAgIC8qIGlwdjQgb3IgaXB2NiAqLwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOyAvKiBzdHJlYW0gc29ja2V0ICovCi0gIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsgICAgIC8qIGZvciB3aWxkY2FyZCBJUCBhZGRyZXNzICovCi0KLSAgR1JQQ19TQ0hFRFVMSU5HX1NUQVJUX0JMT0NLSU5HX1JFR0lPTjsKLSAgcyA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJnJlc3VsdCk7Ci0gIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OOwotCi0gIGlmIChzICE9IDApIHsKLSAgICAvKiBSZXRyeSBpZiB3ZWxsLWtub3duIHNlcnZpY2UgbmFtZSBpcyByZWNvZ25pemVkICovCi0gICAgY2hhciAqc3ZjW11bMl0gPSB7eyJodHRwIiwgIjgwIn0sIHsiaHR0cHMiLCAiNDQzIn19OwotICAgIGZvciAoaSA9IDA7IGkgPCBHUFJfQVJSQVlfU0laRShzdmMpOyBpKyspIHsKLSAgICAgIGlmIChzdHJjbXAocG9ydCwgc3ZjW2ldWzBdKSA9PSAwKSB7Ci0gICAgICAgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047Ci0gICAgICAgIHMgPSBnZXRhZGRyaW5mbyhob3N0LCBzdmNbaV1bMV0sICZoaW50cywgJnJlc3VsdCk7Ci0gICAgICAgIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAocyAhPSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJnZXRhZGRyaW5mbzogJXMiLCBnYWlfc3RyZXJyb3IocykpOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIC8qIFN1Y2Nlc3MgcGF0aDogc2V0IGFkZHJzIG5vbi1OVUxMLCBmaWxsIGl0IGluICovCi0gIGFkZHJzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMpKTsKLSAgYWRkcnMtPm5hZGRycyA9IDA7Ci0gIGZvciAocmVzcCA9IHJlc3VsdDsgcmVzcCAhPSBOVUxMOyByZXNwID0gcmVzcC0+YWlfbmV4dCkgewotICAgIGFkZHJzLT5uYWRkcnMrKzsKLSAgfQotICBhZGRycy0+YWRkcnMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3Jlc29sdmVkX2FkZHJlc3MpICogYWRkcnMtPm5hZGRycyk7Ci0gIGkgPSAwOwotICBmb3IgKHJlc3AgPSByZXN1bHQ7IHJlc3AgIT0gTlVMTDsgcmVzcCA9IHJlc3AtPmFpX25leHQpIHsKLSAgICBtZW1jcHkoJmFkZHJzLT5hZGRyc1tpXS5hZGRyLCByZXNwLT5haV9hZGRyLCByZXNwLT5haV9hZGRybGVuKTsKLSAgICBhZGRycy0+YWRkcnNbaV0ubGVuID0gcmVzcC0+YWlfYWRkcmxlbjsKLSAgICBpKys7Ci0gIH0KLQotZG9uZToKLSAgZ3ByX2ZyZWUoaG9zdCk7Ci0gIGdwcl9mcmVlKHBvcnQpOwotICBpZiAocmVzdWx0KSB7Ci0gICAgZnJlZWFkZHJpbmZvKHJlc3VsdCk7Ci0gIH0KLSAgcmV0dXJuIGFkZHJzOwotfQotCi1ncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqKCpncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcykoCi0gICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVmYXVsdF9wb3J0KSA9IGJsb2NraW5nX3Jlc29sdmVfYWRkcmVzc19pbXBsOwotCi0vKiBDYWxsYmFjayB0byBiZSBwYXNzZWQgdG8gZ3JwY19leGVjdXRvciB0byBhc3luY2gtaWZ5Ci0gKiBncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcyAqLwotc3RhdGljIHZvaWQgZG9fcmVxdWVzdF90aHJlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnJwLCBib29sIHN1Y2Nlc3MpIHsKLSAgcmVxdWVzdCAqciA9IHJwOwotICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqcmVzb2x2ZWQgPQotICAgICAgZ3JwY19ibG9ja2luZ19yZXNvbHZlX2FkZHJlc3Moci0+bmFtZSwgci0+ZGVmYXVsdF9wb3J0KTsKLSAgdm9pZCAqYXJnID0gci0+YXJnOwotICBncnBjX3Jlc29sdmVfY2IgY2IgPSByLT5jYjsKLSAgZ3ByX2ZyZWUoci0+bmFtZSk7Ci0gIGdwcl9mcmVlKHItPmRlZmF1bHRfcG9ydCk7Ci0gIGNiKGV4ZWNfY3R4LCBhcmcsIHJlc29sdmVkKTsKLSAgZ3ByX2ZyZWUocik7Ci19Ci0KLXZvaWQgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXNfZGVzdHJveShncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcnMpIHsKLSAgZ3ByX2ZyZWUoYWRkcnMtPmFkZHJzKTsKLSAgZ3ByX2ZyZWUoYWRkcnMpOwotfQotCi12b2lkIGdycGNfcmVzb2x2ZV9hZGRyZXNzKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlX2NiIGNiLCB2b2lkICphcmcpIHsKLSAgcmVxdWVzdCAqciA9IGdwcl9tYWxsb2Moc2l6ZW9mKHJlcXVlc3QpKTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnItPnJlcXVlc3RfY2xvc3VyZSwgZG9fcmVxdWVzdF90aHJlYWQsIHIpOwotICByLT5uYW1lID0gZ3ByX3N0cmR1cChuYW1lKTsKLSAgci0+ZGVmYXVsdF9wb3J0ID0gZ3ByX3N0cmR1cChkZWZhdWx0X3BvcnQpOwotICByLT5jYiA9IGNiOwotICByLT5hcmcgPSBhcmc7Ci0gIGdycGNfZXhlY3V0b3JfZW5xdWV1ZSgmci0+cmVxdWVzdF9jbG9zdXJlLCAxKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIGIvc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZTc5Ny4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nX3dpbjMyLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqZGVmYXVsdF9wb3J0OwotICBncnBjX3Jlc29sdmVfY2IgY2I7Ci0gIGdycGNfY2xvc3VyZSByZXF1ZXN0X2Nsb3N1cmU7Ci0gIHZvaWQgKmFyZzsKLX0gcmVxdWVzdDsKLQotc3RhdGljIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpibG9ja2luZ19yZXNvbHZlX2FkZHJlc3NfaW1wbCgKLSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQpIHsKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOwotICBzdHJ1Y3QgYWRkcmluZm8gKnJlc3VsdCA9IE5VTEwsICpyZXNwOwotICBjaGFyICpob3N0OwotICBjaGFyICpwb3J0OwotICBpbnQgczsKLSAgc2l6ZV90IGk7Ci0gIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRycyA9IE5VTEw7Ci0KLSAgLyogcGFyc2UgbmFtZSwgc3BsaXR0aW5nIGl0IGludG8gaG9zdCBhbmQgcG9ydCBwYXJ0cyAqLwotICBncHJfc3BsaXRfaG9zdF9wb3J0KG5hbWUsICZob3N0LCAmcG9ydCk7Ci0gIGlmIChob3N0ID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgInVucGFyc2VhYmxlIGhvc3Q6cG9ydDogJyVzJyIsIG5hbWUpOwotICAgIGdvdG8gZG9uZTsKLSAgfQotICBpZiAocG9ydCA9PSBOVUxMKSB7Ci0gICAgaWYgKGRlZmF1bHRfcG9ydCA9PSBOVUxMKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm5vIHBvcnQgaW4gbmFtZSAnJXMnIiwgbmFtZSk7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIHBvcnQgPSBncHJfc3RyZHVwKGRlZmF1bHRfcG9ydCk7Ci0gIH0KLQotICAvKiBDYWxsIGdldGFkZHJpbmZvICovCi0gIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7ICAgICAvKiBpcHY0IG9yIGlwdjYgKi8KLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsgLyogc3RyZWFtIHNvY2tldCAqLwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7ICAgICAvKiBmb3Igd2lsZGNhcmQgSVAgYWRkcmVzcyAqLwotCi0gIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047Ci0gIHMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZyZXN1bHQpOwotICBHUlBDX1NDSEVEVUxJTkdfRU5EX0JMT0NLSU5HX1JFR0lPTjsKLSAgaWYgKHMgIT0gMCkgewotICAgIGNoYXIgKmVycm9yX21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2Uocyk7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJnZXRhZGRyaW5mbzogJXMiLCBlcnJvcl9tZXNzYWdlKTsKLSAgICBncHJfZnJlZShlcnJvcl9tZXNzYWdlKTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLQotICAvKiBTdWNjZXNzIHBhdGg6IHNldCBhZGRycyBub24tTlVMTCwgZmlsbCBpdCBpbiAqLwotICBhZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzKSk7Ci0gIGFkZHJzLT5uYWRkcnMgPSAwOwotICBmb3IgKHJlc3AgPSByZXN1bHQ7IHJlc3AgIT0gTlVMTDsgcmVzcCA9IHJlc3AtPmFpX25leHQpIHsKLSAgICBhZGRycy0+bmFkZHJzKys7Ci0gIH0KLSAgYWRkcnMtPmFkZHJzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzKSAqIGFkZHJzLT5uYWRkcnMpOwotICBpID0gMDsKLSAgZm9yIChyZXNwID0gcmVzdWx0OyByZXNwICE9IE5VTEw7IHJlc3AgPSByZXNwLT5haV9uZXh0KSB7Ci0gICAgbWVtY3B5KCZhZGRycy0+YWRkcnNbaV0uYWRkciwgcmVzcC0+YWlfYWRkciwgcmVzcC0+YWlfYWRkcmxlbik7Ci0gICAgYWRkcnMtPmFkZHJzW2ldLmxlbiA9IHJlc3AtPmFpX2FkZHJsZW47Ci0gICAgaSsrOwotICB9Ci0KLSAgewotICAgIGZvciAoaSA9IDA7IGkgPCBhZGRycy0+bmFkZHJzOyBpKyspIHsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKCZidWYsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcnMtPmFkZHJzW2ldLmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgIGdwcl9mcmVlKGJ1Zik7Ci0gICAgfQotICB9Ci0KLWRvbmU6Ci0gIGdwcl9mcmVlKGhvc3QpOwotICBncHJfZnJlZShwb3J0KTsKLSAgaWYgKHJlc3VsdCkgewotICAgIGZyZWVhZGRyaW5mbyhyZXN1bHQpOwotICB9Ci0gIHJldHVybiBhZGRyczsKLX0KLQotZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKigqZ3JwY19ibG9ja2luZ19yZXNvbHZlX2FkZHJlc3MpKAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9ydCkgPSBibG9ja2luZ19yZXNvbHZlX2FkZHJlc3NfaW1wbDsKLQotLyogQ2FsbGJhY2sgdG8gYmUgcGFzc2VkIHRvIGdycGNfZXhlY3V0b3IgdG8gYXN5bmNoLWlmeQotICogZ3JwY19ibG9ja2luZ19yZXNvbHZlX2FkZHJlc3MgKi8KLXN0YXRpYyB2b2lkIGRvX3JlcXVlc3RfdGhyZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpycCwgYm9vbCBzdWNjZXNzKSB7Ci0gIHJlcXVlc3QgKnIgPSBycDsKLSAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKnJlc29sdmVkID0KLSAgICAgIGdycGNfYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzKHItPm5hbWUsIHItPmRlZmF1bHRfcG9ydCk7Ci0gIHZvaWQgKmFyZyA9IHItPmFyZzsKLSAgZ3JwY19yZXNvbHZlX2NiIGNiID0gci0+Y2I7Ci0gIGdwcl9mcmVlKHItPm5hbWUpOwotICBncHJfZnJlZShyLT5kZWZhdWx0X3BvcnQpOwotICBjYihleGVjX2N0eCwgYXJnLCByZXNvbHZlZCk7Ci0gIGdwcl9mcmVlKHIpOwotfQotCi12b2lkIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzX2Rlc3Ryb3koZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJzKSB7Ci0gIGdwcl9mcmVlKGFkZHJzLT5hZGRycyk7Ci0gIGdwcl9mcmVlKGFkZHJzKTsKLX0KLQotdm9pZCBncnBjX3Jlc29sdmVfYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZV9jYiBjYiwgdm9pZCAqYXJnKSB7Ci0gIHJlcXVlc3QgKnIgPSBncHJfbWFsbG9jKHNpemVvZihyZXF1ZXN0KSk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZyLT5yZXF1ZXN0X2Nsb3N1cmUsIGRvX3JlcXVlc3RfdGhyZWFkLCByKTsKLSAgci0+bmFtZSA9IGdwcl9zdHJkdXAobmFtZSk7Ci0gIHItPmRlZmF1bHRfcG9ydCA9IGdwcl9zdHJkdXAoZGVmYXVsdF9wb3J0KTsKLSAgci0+Y2IgPSBjYjsKLSAgci0+YXJnID0gYXJnOwotICBncnBjX2V4ZWN1dG9yX2VucXVldWUoJnItPnJlcXVlc3RfY2xvc3VyZSwgMSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCBiL3NyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjQxYmQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1NPQ0tBRERSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1NPQ0tBRERSX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOMzIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oIgotI2VuZGlmCi0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUQUREUgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgiCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9TT0NLQUREUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oIGIvc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ODA5Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfU09DS0FERFJfUE9TSVhfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfU09DS0FERFJfUE9TSVhfSAotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1NPQ0tBRERSX1BPU0lYX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMgYi9zcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2MzYTg3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9ob3N0X3BvcnQuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtWNE1hcHBlZFByZWZpeFtdID0gezAsIDAsIDAsIDAsIDAsICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAweGZmLCAweGZmfTsKLQotaW50IGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICphZGRyNF9vdXQpIHsKLSAgR1BSX0FTU0VSVChhZGRyICE9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyNF9vdXQpOwotICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7Ci0gICAgaWYgKG1lbWNtcChhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsIGtWNE1hcHBlZFByZWZpeCwKLSAgICAgICAgICAgICAgIHNpemVvZihrVjRNYXBwZWRQcmVmaXgpKSA9PSAwKSB7Ci0gICAgICBpZiAoYWRkcjRfb3V0ICE9IE5VTEwpIHsKLSAgICAgICAgLyogTm9ybWFsaXplIDo6ZmZmZjowLjAuMC4wLzk2IHRvIElQdjQuICovCi0gICAgICAgIG1lbXNldChhZGRyNF9vdXQsIDAsIHNpemVvZigqYWRkcjRfb3V0KSk7Ci0gICAgICAgIGFkZHI0X291dC0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgIC8qIHM2X2FkZHIzMiB3b3VsZCBiZSBuaWNlLCBidXQgaXQncyBub24tc3RhbmRhcmQuICovCi0gICAgICAgIG1lbWNweSgmYWRkcjRfb3V0LT5zaW5fYWRkciwgJmFkZHI2LT5zaW42X2FkZHIuczZfYWRkclsxMl0sIDQpOwotICAgICAgICBhZGRyNF9vdXQtPnNpbl9wb3J0ID0gYWRkcjYtPnNpbjZfcG9ydDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IGdycGNfc29ja2FkZHJfdG9fdjRtYXBwZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjZfb3V0KSB7Ci0gIEdQUl9BU1NFUlQoYWRkciAhPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjZfb3V0KTsKLSAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0gICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwotICAgIG1lbXNldChhZGRyNl9vdXQsIDAsIHNpemVvZigqYWRkcjZfb3V0KSk7Ci0gICAgYWRkcjZfb3V0LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotICAgIG1lbWNweSgmYWRkcjZfb3V0LT5zaW42X2FkZHIuczZfYWRkclswXSwga1Y0TWFwcGVkUHJlZml4LCAxMik7Ci0gICAgbWVtY3B5KCZhZGRyNl9vdXQtPnNpbjZfYWRkci5zNl9hZGRyWzEyXSwgJmFkZHI0LT5zaW5fYWRkciwgNCk7Ci0gICAgYWRkcjZfb3V0LT5zaW42X3BvcnQgPSBhZGRyNC0+c2luX3BvcnQ7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBncnBjX3NvY2thZGRyX2lzX3dpbGRjYXJkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50ICpwb3J0X291dCkgewotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjRfbm9ybWFsaXplZDsKLSAgaWYgKGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHI0X25vcm1hbGl6ZWQpKSB7Ci0gICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjRfbm9ybWFsaXplZDsKLSAgfQotICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKLSAgICAvKiBDaGVjayBmb3IgMC4wLjAuMCAqLwotICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopYWRkcjsKLSAgICBpZiAoYWRkcjQtPnNpbl9hZGRyLnNfYWRkciAhPSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgKnBvcnRfb3V0ID0gbnRvaHMoYWRkcjQtPnNpbl9wb3J0KTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICAvKiBDaGVjayBmb3IgOjogKi8KLSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgaWYgKGFkZHI2LT5zaW42X2FkZHIuczZfYWRkcltpXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICAqcG9ydF9vdXQgPSBudG9ocyhhZGRyNi0+c2luNl9wb3J0KTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi12b2lkIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZHMoaW50IHBvcnQsIHN0cnVjdCBzb2NrYWRkcl9pbiAqd2lsZDRfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKndpbGQ2X291dCkgewotICBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ0KHBvcnQsIHdpbGQ0X291dCk7Ci0gIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZDYocG9ydCwgd2lsZDZfb3V0KTsKLX0KLQotdm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ0KGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKndpbGRfb3V0KSB7Ci0gIEdQUl9BU1NFUlQocG9ydCA+PSAwICYmIHBvcnQgPCA2NTUzNik7Ci0gIG1lbXNldCh3aWxkX291dCwgMCwgc2l6ZW9mKCp3aWxkX291dCkpOwotICB3aWxkX291dC0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHdpbGRfb3V0LT5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClwb3J0KTsKLX0KLQotdm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ2KGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp3aWxkX291dCkgewotICBHUFJfQVNTRVJUKHBvcnQgPj0gMCAmJiBwb3J0IDwgNjU1MzYpOwotICBtZW1zZXQod2lsZF9vdXQsIDAsIHNpemVvZigqd2lsZF9vdXQpKTsKLSAgd2lsZF9vdXQtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Ci0gIHdpbGRfb3V0LT5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpcG9ydCk7Ci19Ci0KLWludCBncnBjX3NvY2thZGRyX3RvX3N0cmluZyhjaGFyICoqb3V0LCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1hbGl6ZSkgewotICBjb25zdCBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcl9ub3JtYWxpemVkOwotICBjaGFyIG50b3BfYnVmW0lORVQ2X0FERFJTVFJMRU5dOwotICBjb25zdCB2b2lkICppcCA9IE5VTEw7Ci0gIGludCBwb3J0OwotICBpbnQgcmV0OwotCi0gICpvdXQgPSBOVUxMOwotICBpZiAobm9ybWFsaXplICYmIGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHJfbm9ybWFsaXplZCkpIHsKLSAgICBhZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX25vcm1hbGl6ZWQ7Ci0gIH0KLSAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0gICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwotICAgIGlwID0gJmFkZHI0LT5zaW5fYWRkcjsKLSAgICBwb3J0ID0gbnRvaHMoYWRkcjQtPnNpbl9wb3J0KTsKLSAgfSBlbHNlIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKLSAgICBpcCA9ICZhZGRyNi0+c2luNl9hZGRyOwotICAgIHBvcnQgPSBudG9ocyhhZGRyNi0+c2luNl9wb3J0KTsKLSAgfQotICAvKiBXaW5kb3dzIGluZXRfbnRvcCB3YW50cyBhIG11dGFibGUgaXAgcG9pbnRlciAqLwotICBpZiAoaXAgIT0gTlVMTCAmJgotICAgICAgaW5ldF9udG9wKGFkZHItPnNhX2ZhbWlseSwgKHZvaWQgKilpcCwgbnRvcF9idWYsIHNpemVvZihudG9wX2J1ZikpICE9Ci0gICAgICAgICAgTlVMTCkgewotICAgIHJldCA9IGdwcl9qb2luX2hvc3RfcG9ydChvdXQsIG50b3BfYnVmLCBwb3J0KTsKLSAgfSBlbHNlIHsKLSAgICByZXQgPSBncHJfYXNwcmludGYob3V0LCAiKHNvY2thZGRyIGZhbWlseT0lZCkiLCBhZGRyLT5zYV9mYW1pbHkpOwotICB9Ci0gIC8qIFRoaXMgaXMgcHJvYmFibHkgcmVkdW5kYW50LCBidXQgd2Ugd291bGRuJ3Qgd2FudCB0byBsb2cgdGhlIHdyb25nIGVycm9yLiAqLwotICBlcnJubyA9IHNhdmVfZXJybm87Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWNoYXIgKmdycGNfc29ja2FkZHJfdG9fdXJpKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcikgewotICBjaGFyICp0ZW1wOwotICBjaGFyICpyZXN1bHQ7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyX25vcm1hbGl6ZWQ7Ci0KLSAgaWYgKGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHJfbm9ybWFsaXplZCkpIHsKLSAgICBhZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX25vcm1hbGl6ZWQ7Ci0gIH0KLQotICBzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgewotICAgIGNhc2UgQUZfSU5FVDoKLSAgICAgIGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKCZ0ZW1wLCBhZGRyLCAwKTsKLSAgICAgIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAiaXB2NDolcyIsIHRlbXApOwotICAgICAgZ3ByX2ZyZWUodGVtcCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIGNhc2UgQUZfSU5FVDY6Ci0gICAgICBncnBjX3NvY2thZGRyX3RvX3N0cmluZygmdGVtcCwgYWRkciwgMCk7Ci0gICAgICBncHJfYXNwcmludGYoJnJlc3VsdCwgImlwdjY6JXMiLCB0ZW1wKTsKLSAgICAgIGdwcl9mcmVlKHRlbXApOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGdycGNfc29ja2FkZHJfdG9fdXJpX3VuaXhfaWZfcG9zc2libGUoYWRkcik7Ci0gIH0KLX0KLQotaW50IGdycGNfc29ja2FkZHJfZ2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKSB7Ci0gIHN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7Ci0gICAgY2FzZSBBRl9JTkVUOgotICAgICAgcmV0dXJuIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkciktPnNpbl9wb3J0KTsKLSAgICBjYXNlIEFGX0lORVQ2OgotICAgICAgcmV0dXJuIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHIpLT5zaW42X3BvcnQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoZ3JwY19pc191bml4X3NvY2tldChhZGRyKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biBzb2NrZXQgZmFtaWx5ICVkIGluIGdycGNfc29ja2FkZHJfZ2V0X3BvcnQiLAotICAgICAgICAgICAgICBhZGRyLT5zYV9mYW1pbHkpOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotaW50IGdycGNfc29ja2FkZHJfc2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgcG9ydCkgewotICBzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgewotICAgIGNhc2UgQUZfSU5FVDoKLSAgICAgIEdQUl9BU1NFUlQocG9ydCA+PSAwICYmIHBvcnQgPCA2NTUzNik7Ci0gICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHIpLT5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClwb3J0KTsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgQUZfSU5FVDY6Ci0gICAgICBHUFJfQVNTRVJUKHBvcnQgPj0gMCAmJiBwb3J0IDwgNjU1MzYpOwotICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkciktPnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdClwb3J0KTsKLSAgICAgIHJldHVybiAxOwotICAgIGRlZmF1bHQ6Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gc29ja2V0IGZhbWlseSAlZCBpbiBncnBjX3NvY2thZGRyX3NldF9wb3J0IiwKLSAgICAgICAgICAgICAgYWRkci0+c2FfZmFtaWx5KTsKLSAgICAgIHJldHVybiAwOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oIGIvc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkYzdhNC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfU09DS0FERFJfVVRJTFNfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfU09DS0FERFJfVVRJTFNfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCIKLQotLyogUmV0dXJucyB0cnVlIGlmIGFkZHIgaXMgYW4gSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzIHdpdGhpbiB0aGUKLSAgIDo6ZmZmZjowLjAuMC4wLzk2IHJhbmdlLCBvciBmYWxzZSBvdGhlcndpc2UuCi0KLSAgIElmIGFkZHI0X291dCBpcyBub24tTlVMTCwgdGhlIGlubmVyIElQdjQgYWRkcmVzcyB3aWxsIGJlIGNvcGllZCBoZXJlIHdoZW4KLSAgIHJldHVybmluZyB0cnVlLiAqLwotaW50IGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICphZGRyNF9vdXQpOwotCi0vKiBJZiBhZGRyIGlzIGFuIEFGX0lORVQgYWRkcmVzcywgd3JpdGVzIHRoZSBjb3JyZXNwb25kaW5nIDo6ZmZmZjowLjAuMC4wLzk2Ci0gICBhZGRyZXNzIHRvIGFkZHI2X291dCBhbmQgcmV0dXJucyB0cnVlLiAgT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuICovCi1pbnQgZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNl9vdXQpOwotCi0vKiBJZiBhZGRyIGlzIDo6LCAwLjAuMC4wLCBvciA6OmZmZmY6MC4wLjAuMCwgd3JpdGVzIHRoZSBwb3J0IG51bWJlciB0bwotICAgKnBvcnRfb3V0IChpZiBub3QgTlVMTCkgYW5kIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuICovCi1pbnQgZ3JwY19zb2NrYWRkcl9pc193aWxkY2FyZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCAqcG9ydF9vdXQpOwotCi0vKiBXcml0ZXMgMC4wLjAuMDpwb3J0IGFuZCBbOjpdOnBvcnQgdG8gc2VwYXJhdGUgc29ja2FkZHJzLiAqLwotdm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmRzKGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKndpbGQ0X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp3aWxkNl9vdXQpOwotCi0vKiBXcml0ZXMgMC4wLjAuMDpwb3J0LiAqLwotdm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ0KGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKndpbGRfb3V0KTsKLQotLyogV3JpdGVzIFs6Ol06cG9ydC4gKi8KLXZvaWQgZ3JwY19zb2NrYWRkcl9tYWtlX3dpbGRjYXJkNihpbnQgcG9ydCwgc3RydWN0IHNvY2thZGRyX2luNiAqd2lsZF9vdXQpOwotCi0vKiBSZXR1cm4gdGhlIElQIHBvcnQgbnVtYmVyIG9mIGEgc29ja2FkZHIgKi8KLWludCBncnBjX3NvY2thZGRyX2dldF9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcik7Ci0KLS8qIFNldCBJUCBwb3J0IG51bWJlciBvZiBhIHNvY2thZGRyICovCi1pbnQgZ3JwY19zb2NrYWRkcl9zZXRfcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBwb3J0KTsKLQotLyogQ29udmVydHMgYSBzb2NrYWRkciBpbnRvIGEgbmV3bHktYWxsb2NhdGVkIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KLQotICAgQ3VycmVudGx5LCBvbmx5IHRoZSBBRl9JTkVUIGFuZCBBRl9JTkVUNiBmYW1pbGllcyBhcmUgcmVjb2duaXplZC4KLSAgIElmIHRoZSBub3JtYWxpemUgZmxhZyBpcyBlbmFibGVkLCA6OmZmZmY6MC4wLjAuMC85NiBJUHY2IGFkZHJlc3NlcyBhcmUKLSAgIGRpc3BsYXllZCBhcyBwbGFpbiBJUHY0LgotCi0gICBVc2FnZSBpcyBzaW1pbGFyIHRvIGdwcl9hc3ByaW50ZjogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KLSAgIChleGNsdWRpbmcgdGhlIGZpbmFsICdcMCcpLCBhbmQgKm91dCBwb2ludHMgdG8gYSBzdHJpbmcgd2hpY2ggbXVzdCBsYXRlciBiZQotICAgZGVzdHJveWVkIHVzaW5nIGdwcl9mcmVlKCkuCi0KLSAgIEluIHRoZSB1bmxpa2VseSBldmVudCBvZiBhbiBlcnJvciwgcmV0dXJucyAtMSBhbmQgc2V0cyAqb3V0IHRvIE5VTEwuCi0gICBUaGUgZXhpc3RpbmcgdmFsdWUgb2YgZXJybm8gaXMgYWx3YXlzIHByZXNlcnZlZC4gKi8KLWludCBncnBjX3NvY2thZGRyX3RvX3N0cmluZyhjaGFyICoqb3V0LCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1hbGl6ZSk7Ci0KLWNoYXIgKmdycGNfc29ja2FkZHJfdG9fdXJpKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfU09DS0FERFJfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCBiL3NyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzA2ZTMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1NPQ0tBRERSX1dJTjMyX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1NPQ0tBRERSX1dJTjMyX0gKLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jaW5jbHVkZSA8d3MydGNwaXAuaD4KLQotLy8gbXVzdCBiZSBpbmNsdWRlZCBhZnRlciB0aGUgYWJvdmUKLSNpbmNsdWRlIDxtc3dzb2NrLmg+Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfU09DS0FERFJfV0lOMzJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIGIvc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBkYWNjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9QT1NJWF9TT0NLRVQKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi0vKiBzZXQgYSBzb2NrZXQgdG8gbm9uIGJsb2NraW5nIG1vZGUgKi8KLWludCBncnBjX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcoaW50IGZkLCBpbnQgbm9uX2Jsb2NraW5nKSB7Ci0gIGludCBvbGRmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKLSAgaWYgKG9sZGZsYWdzIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKG5vbl9ibG9ja2luZykgewotICAgIG9sZGZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0gIH0gZWxzZSB7Ci0gICAgb2xkZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7Ci0gIH0KLQotICBpZiAoZmNudGwoZmQsIEZfU0VURkwsIG9sZGZsYWdzKSAhPSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotaW50IGdycGNfc2V0X3NvY2tldF9ub19zaWdwaXBlX2lmX3Bvc3NpYmxlKGludCBmZCkgewotI2lmZGVmIEdQUl9IQVZFX1NPX05PU0lHUElQRQotICBpbnQgdmFsID0gMTsKLSAgaW50IG5ld3ZhbDsKLSAgc29ja2xlbl90IGludGxlbiA9IHNpemVvZihuZXd2YWwpOwotICByZXR1cm4gMCA9PSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZ2YWwsIHNpemVvZih2YWwpKSAmJgotICAgICAgICAgMCA9PSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZuZXd2YWwsICZpbnRsZW4pICYmCi0gICAgICAgICAobmV3dmFsICE9IDApID09IHZhbDsKLSNlbHNlCi0gIHJldHVybiAxOwotI2VuZGlmCi19Ci0KLS8qIHNldCBhIHNvY2tldCB0byBjbG9zZSBvbiBleGVjICovCi1pbnQgZ3JwY19zZXRfc29ja2V0X2Nsb2V4ZWMoaW50IGZkLCBpbnQgY2xvc2Vfb25fZXhlYykgewotICBpbnQgb2xkZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGRCwgMCk7Ci0gIGlmIChvbGRmbGFncyA8IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChjbG9zZV9vbl9leGVjKSB7Ci0gICAgb2xkZmxhZ3MgfD0gRkRfQ0xPRVhFQzsKLSAgfSBlbHNlIHsKLSAgICBvbGRmbGFncyAmPSB+RkRfQ0xPRVhFQzsKLSAgfQotCi0gIGlmIChmY250bChmZCwgRl9TRVRGRCwgb2xkZmxhZ3MpICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBzZXQgYSBzb2NrZXQgdG8gcmV1c2Ugb2xkIGFkZHJlc3NlcyAqLwotaW50IGdycGNfc2V0X3NvY2tldF9yZXVzZV9hZGRyKGludCBmZCwgaW50IHJldXNlKSB7Ci0gIGludCB2YWwgPSAocmV1c2UgIT0gMCk7Ci0gIGludCBuZXd2YWw7Ci0gIHNvY2tsZW5fdCBpbnRsZW4gPSBzaXplb2YobmV3dmFsKTsKLSAgcmV0dXJuIDAgPT0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmdmFsLCBzaXplb2YodmFsKSkgJiYKLSAgICAgICAgIDAgPT0gZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmbmV3dmFsLCAmaW50bGVuKSAmJgotICAgICAgICAgKG5ld3ZhbCAhPSAwKSA9PSB2YWw7Ci19Ci0KLS8qIGRpc2FibGUgbmFnbGUgKi8KLWludCBncnBjX3NldF9zb2NrZXRfbG93X2xhdGVuY3koaW50IGZkLCBpbnQgbG93X2xhdGVuY3kpIHsKLSAgaW50IHZhbCA9IChsb3dfbGF0ZW5jeSAhPSAwKTsKLSAgaW50IG5ld3ZhbDsKLSAgc29ja2xlbl90IGludGxlbiA9IHNpemVvZihuZXd2YWwpOwotICByZXR1cm4gMCA9PSBzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZ2YWwsIHNpemVvZih2YWwpKSAmJgotICAgICAgICAgMCA9PSBnZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZuZXd2YWwsICZpbnRsZW4pICYmCi0gICAgICAgICAobmV3dmFsICE9IDApID09IHZhbDsKLX0KLQotc3RhdGljIGdwcl9vbmNlIGdfcHJvYmVfaXB2Nl9vbmNlID0gR1BSX09OQ0VfSU5JVDsKLXN0YXRpYyBpbnQgZ19pcHY2X2xvb3BiYWNrX2F2YWlsYWJsZTsKLQotc3RhdGljIHZvaWQgcHJvYmVfaXB2Nl9vbmNlKHZvaWQpIHsKLSAgaW50IGZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCk7Ci0gIGdfaXB2Nl9sb29wYmFja19hdmFpbGFibGUgPSAwOwotICBpZiAoZmQgPCAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfSU5GTywgIkRpc2FibGluZyBBRl9JTkVUNiBzb2NrZXRzIGJlY2F1c2Ugc29ja2V0KCkgZmFpbGVkLiIpOwotICB9IGVsc2UgewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjsKLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotICAgIGFkZHIuc2luNl9hZGRyLnM2X2FkZHJbMTVdID0gMTsgLyogWzo6MV06MCAqLwotICAgIGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gMCkgewotICAgICAgZ19pcHY2X2xvb3BiYWNrX2F2YWlsYWJsZSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdwcl9sb2coR1BSX0lORk8sCi0gICAgICAgICAgICAgICJEaXNhYmxpbmcgQUZfSU5FVDYgc29ja2V0cyBiZWNhdXNlIDo6MSBpcyBub3QgYXZhaWxhYmxlLiIpOwotICAgIH0KLSAgICBjbG9zZShmZCk7Ci0gIH0KLX0KLQotaW50IGdycGNfaXB2Nl9sb29wYmFja19hdmFpbGFibGUodm9pZCkgewotICBncHJfb25jZV9pbml0KCZnX3Byb2JlX2lwdjZfb25jZSwgcHJvYmVfaXB2Nl9vbmNlKTsKLSAgcmV0dXJuIGdfaXB2Nl9sb29wYmFja19hdmFpbGFibGU7Ci19Ci0KLS8qIFRoaXMgc2hvdWxkIGJlIDAgaW4gcHJvZHVjdGlvbiwgYnV0IGl0IG1heSBiZSBlbmFibGVkIGZvciB0ZXN0aW5nIG9yCi0gICBkZWJ1Z2dpbmcgcHVycG9zZXMsIHRvIHNpbXVsYXRlIGFuIGVudmlyb25tZW50IHdoZXJlIElQdjYgc29ja2V0cyBjYW4ndAotICAgYWxzbyBzcGVhayBJUHY0LiAqLwotaW50IGdycGNfZm9yYmlkX2R1YWxzdGFja19zb2NrZXRzX2Zvcl90ZXN0aW5nID0gMDsKLQotc3RhdGljIGludCBzZXRfc29ja2V0X2R1YWxzdGFjayhpbnQgZmQpIHsKLSAgaWYgKCFncnBjX2ZvcmJpZF9kdWFsc3RhY2tfc29ja2V0c19mb3JfdGVzdGluZykgewotICAgIGNvbnN0IGludCBvZmYgPSAwOwotICAgIHJldHVybiAwID09IHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksICZvZmYsIHNpemVvZihvZmYpKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBGb3JjZSBhbiBJUHY2LW9ubHkgc29ja2V0LCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KLSAgICBjb25zdCBpbnQgb24gPSAxOwotICAgIHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksICZvbiwgc2l6ZW9mKG9uKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotaW50IGdycGNfY3JlYXRlX2R1YWxzdGFja19zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm90b2NvbCwgZ3JwY19kdWFsc3RhY2tfbW9kZSAqZHNtb2RlKSB7Ci0gIGludCBmYW1pbHkgPSBhZGRyLT5zYV9mYW1pbHk7Ci0gIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBpbnQgZmQ7Ci0gICAgaWYgKGdycGNfaXB2Nl9sb29wYmFja19hdmFpbGFibGUoKSkgewotICAgICAgZmQgPSBzb2NrZXQoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZkID0gLTE7Ci0gICAgICBlcnJubyA9IEVBRk5PU1VQUE9SVDsKLSAgICB9Ci0gICAgLyogQ2hlY2sgaWYgd2UndmUgZ290IGEgdmFsaWQgZHVhbHN0YWNrIHNvY2tldC4gKi8KLSAgICBpZiAoZmQgPj0gMCAmJiBzZXRfc29ja2V0X2R1YWxzdGFjayhmZCkpIHsKLSAgICAgICpkc21vZGUgPSBHUlBDX0RTTU9ERV9EVUFMU1RBQ0s7Ci0gICAgICByZXR1cm4gZmQ7Ci0gICAgfQotICAgIC8qIElmIHRoaXMgaXNuJ3QgYW4gSVB2NCBhZGRyZXNzLCB0aGVuIHJldHVybiB3aGF0ZXZlciB3ZSd2ZSBnb3QuICovCi0gICAgaWYgKCFncnBjX3NvY2thZGRyX2lzX3Y0bWFwcGVkKGFkZHIsIE5VTEwpKSB7Ci0gICAgICAqZHNtb2RlID0gR1JQQ19EU01PREVfSVBWNjsKLSAgICAgIHJldHVybiBmZDsKLSAgICB9Ci0gICAgLyogRmFsbCBiYWNrIHRvIEFGX0lORVQuICovCi0gICAgaWYgKGZkID49IDApIHsKLSAgICAgIGNsb3NlKGZkKTsKLSAgICB9Ci0gICAgZmFtaWx5ID0gQUZfSU5FVDsKLSAgfQotICAqZHNtb2RlID0gZmFtaWx5ID09IEFGX0lORVQgPyBHUlBDX0RTTU9ERV9JUFY0IDogR1JQQ19EU01PREVfTk9ORTsKLSAgcmV0dXJuIHNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvY29sKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBiL3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY4ODVmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfTElOVVhfU09DS0VUVVRJTFMKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1pbnQgZ3JwY19hY2NlcHQ0KGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICphZGRybGVuLAotICAgICAgICAgICAgICAgICBpbnQgbm9uYmxvY2ssIGludCBjbG9leGVjKSB7Ci0gIGludCBmbGFncyA9IDA7Ci0gIGZsYWdzIHw9IG5vbmJsb2NrID8gU09DS19OT05CTE9DSyA6IDA7Ci0gIGZsYWdzIHw9IGNsb2V4ZWMgPyBTT0NLX0NMT0VYRUMgOiAwOwotICByZXR1cm4gYWNjZXB0NChzb2NrZmQsIGFkZHIsIGFkZHJsZW4sIGZsYWdzKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyBiL3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzU2YjQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVFVUSUxTCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi1pbnQgZ3JwY19hY2NlcHQ0KGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICphZGRybGVuLAotICAgICAgICAgICAgICAgICBpbnQgbm9uYmxvY2ssIGludCBjbG9leGVjKSB7Ci0gIGludCBmZCwgZmxhZ3M7Ci0KLSAgZmQgPSBhY2NlcHQoc29ja2ZkLCBhZGRyLCBhZGRybGVuKTsKLSAgaWYgKGZkID49IDApIHsKLSAgICBpZiAobm9uYmxvY2spIHsKLSAgICAgIGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOwotICAgICAgaWYgKGZsYWdzIDwgMCkgZ290byBjbG9zZV9hbmRfZXJyb3I7Ci0gICAgICBpZiAoZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgIT0gMCkgZ290byBjbG9zZV9hbmRfZXJyb3I7Ci0gICAgfQotICAgIGlmIChjbG9leGVjKSB7Ci0gICAgICBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZELCAwKTsKLSAgICAgIGlmIChmbGFncyA8IDApIGdvdG8gY2xvc2VfYW5kX2Vycm9yOwotICAgICAgaWYgKGZjbnRsKGZkLCBGX1NFVEZELCBmbGFncyB8IEZEX0NMT0VYRUMpICE9IDApIGdvdG8gY2xvc2VfYW5kX2Vycm9yOwotICAgIH0KLSAgfQotICByZXR1cm4gZmQ7Ci0KLWNsb3NlX2FuZF9lcnJvcjoKLSAgY2xvc2UoZmQpOwotICByZXR1cm4gLTE7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfUE9TSVhfU09DS0VUVVRJTFMgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIGIvc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDg1NTAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfU09DS0VUX1VUSUxTX1BPU0lYX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1NPQ0tFVF9VVElMU19QT1NJWF9ICi0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLS8qIGEgd3JhcHBlciBmb3IgYWNjZXB0IG9yIGFjY2VwdDQgKi8KLWludCBncnBjX2FjY2VwdDQoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmFkZHJsZW4sCi0gICAgICAgICAgICAgICAgIGludCBub25ibG9jaywgaW50IGNsb2V4ZWMpOwotCi0vKiBzZXQgYSBzb2NrZXQgdG8gbm9uIGJsb2NraW5nIG1vZGUgKi8KLWludCBncnBjX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcoaW50IGZkLCBpbnQgbm9uX2Jsb2NraW5nKTsKLQotLyogc2V0IGEgc29ja2V0IHRvIGNsb3NlIG9uIGV4ZWMgKi8KLWludCBncnBjX3NldF9zb2NrZXRfY2xvZXhlYyhpbnQgZmQsIGludCBjbG9zZV9vbl9leGVjKTsKLQotLyogc2V0IGEgc29ja2V0IHRvIHJldXNlIG9sZCBhZGRyZXNzZXMgKi8KLWludCBncnBjX3NldF9zb2NrZXRfcmV1c2VfYWRkcihpbnQgZmQsIGludCByZXVzZSk7Ci0KLS8qIGRpc2FibGUgbmFnbGUgKi8KLWludCBncnBjX3NldF9zb2NrZXRfbG93X2xhdGVuY3koaW50IGZkLCBpbnQgbG93X2xhdGVuY3kpOwotCi0vKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzeXN0ZW0gY2FuIGNyZWF0ZSBBRl9JTkVUNiBzb2NrZXRzIGJvdW5kIHRvIDo6MS4KLSAgIFRoZSB2YWx1ZSBpcyBwcm9iZWQgb25jZSwgYW5kIGNhY2hlZCBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MuCi0KLSAgIFRoaXMgaXMgbW9yZSByZXN0cmljdGl2ZSB0aGFuIGNoZWNraW5nIGZvciBzb2NrZXQoQUZfSU5FVDYpIHRvIHN1Y2NlZWQsCi0gICBiZWNhdXNlIExpbnV4IHdpdGggIm5ldC5pcHY2LmNvbmYuYWxsLmRpc2FibGVfaXB2NiA9IDEiIGlzIGFibGUgdG8gY3JlYXRlCi0gICBhbmQgYmluZCBJUHY2IHNvY2tldHMsIGJ1dCBjYW5ub3QgY29ubmVjdCB0byBhIGdldHNvY2tuYW1lKCkgb2YgWzo6XTpwb3J0Ci0gICB3aXRob3V0IGEgdmFsaWQgbG9vcGJhY2sgaW50ZXJmYWNlLiAgUmF0aGVyIHRoYW4gZXhwb3NlIHRoaXMgaGFsZi1icm9rZW4KLSAgIHN0YXRlIHRvIGxpYnJhcnkgdXNlcnMsIHdlIHR1cm4gb2ZmIElQdjYgc29ja2V0cy4gKi8KLWludCBncnBjX2lwdjZfbG9vcGJhY2tfYXZhaWxhYmxlKHZvaWQpOwotCi0vKiBUcmllcyB0byBzZXQgU09fTk9TSUdQSVBFIGlmIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLgotICAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KLSAgIElmIFNPX05PX1NJR1BJUEUgaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJucyAxLiAqLwotaW50IGdycGNfc2V0X3NvY2tldF9ub19zaWdwaXBlX2lmX3Bvc3NpYmxlKGludCBmZCk7Ci0KLS8qIEFuIGVudW0gdG8ga2VlcCB0cmFjayBvZiBJUHY0L0lQdjYgc29ja2V0IG1vZGVzLgotCi0gICBDdXJyZW50bHksIHRoaXMgaW5mb3JtYXRpb24gaXMgb25seSB1c2VkIHdoZW4gYSBzb2NrZXQgaXMgZmlyc3QgY3JlYXRlZCwgYnV0Ci0gICBpbiB0aGUgZnV0dXJlIHdlIG1heSB3aXNoIHRvIHN0b3JlIGl0IGFsb25nc2lkZSB0aGUgZmQuICBUaGlzIHdvdWxkIGxldCBjYWxscwotICAgbGlrZSBzZW5kdG8oKSBrbm93IHdoaWNoIGZhbWlseSB0byB1c2Ugd2l0aG91dCBhc2tpbmcgdGhlIGtlcm5lbCBmaXJzdC4gKi8KLXR5cGVkZWYgZW51bSBncnBjX2R1YWxzdGFja19tb2RlIHsKLSAgLyogVW5pbml0aWFsaXplZCwgb3IgYSBub24tSVAgc29ja2V0LiAqLwotICBHUlBDX0RTTU9ERV9OT05FLAotICAvKiBBRl9JTkVUIG9ubHkuICovCi0gIEdSUENfRFNNT0RFX0lQVjQsCi0gIC8qIEFGX0lORVQ2IG9ubHksIGJlY2F1c2UgSVBWNl9WNk9OTFkgY291bGQgbm90IGJlIGNsZWFyZWQuICovCi0gIEdSUENfRFNNT0RFX0lQVjYsCi0gIC8qIEFGX0lORVQ2LCB3aGljaCBhbHNvIHN1cHBvcnRzIDo6ZmZmZi1tYXBwZWQgSVB2NCBhZGRyZXNzZXMuICovCi0gIEdSUENfRFNNT0RFX0RVQUxTVEFDSwotfSBncnBjX2R1YWxzdGFja19tb2RlOwotCi0vKiBPbmx5IHRlc3RzIHNob3VsZCB1c2UgdGhpcyBmbGFnLiAqLwotZXh0ZXJuIGludCBncnBjX2ZvcmJpZF9kdWFsc3RhY2tfc29ja2V0c19mb3JfdGVzdGluZzsKLQotLyogQ3JlYXRlcyBhIG5ldyBzb2NrZXQgZm9yIGNvbm5lY3RpbmcgdG8gKG9yIGxpc3RlbmluZyBvbikgYW4gYWRkcmVzcy4KLQotICAgSWYgYWRkciBpcyBBRl9JTkVUNiwgdGhpcyBjcmVhdGVzIGFuIElQdjYgc29ja2V0IGZpcnN0LiAgSWYgdGhhdCBmYWlscywKLSAgIGFuZCBhZGRyIGlzIHdpdGhpbiA6OmZmZmY6MC4wLjAuMC85NiwgdGhlbiBpdCBhdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2sgdG8KLSAgIGFuIElQdjQgc29ja2V0LgotCi0gICBJZiBhZGRyIGlzIEFGX0lORVQsIEFGX1VOSVgsIG9yIGFueXRoaW5nIGVsc2UsIHRoZW4gdGhpcyBpcyBzaW1pbGFyIHRvCi0gICBjYWxsaW5nIHNvY2tldCgpIGRpcmVjdGx5LgotCi0gICBSZXR1cm5zIGFuIGZkIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSByZXR1cm5zIC0xIHdpdGggZXJybm8gc2V0IHRvIHRoZSByZXN1bHQKLSAgIG9mIGEgZmFpbGVkIHNvY2tldCgpIGNhbGwuCi0KLSAgIFRoZSAqZHNtb2RlIG91dHB1dCBpbmRpY2F0ZXMgd2hpY2ggYWRkcmVzcyBmYW1pbHkgd2FzIGFjdHVhbGx5IGNyZWF0ZWQuCi0gICBUaGUgcmVjb21tZW5kZWQgd2F5IHRvIHVzZSB0aGlzIGlzOgotICAgLSBGaXJzdCBjb252ZXJ0IHRvIElQdjYgdXNpbmcgZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZCgpLgotICAgLSBDcmVhdGUgdGhlIHNvY2tldC4KLSAgIC0gSWYgKmRzbW9kZSBpcyBJUFY0LCB1c2UgZ3JwY19zb2NrYWRkcl9pc192NG1hcHBlZCgpIHRvIGNvbnZlcnQgYmFjayB0bwotICAgICBJUHY0LCBzbyB0aGF0IGJpbmQoKSBvciBjb25uZWN0KCkgc2VlIHRoZSBjb3JyZWN0IGZhbWlseS4KLSAgIEFsc28sIGl0J3MgaW1wb3J0YW50IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gRFVBTFNUQUNLIGFuZCBJUFY2IHdoZW4KLSAgIGxpc3RlbmluZyBvbiB0aGUgWzo6XSB3aWxkY2FyZCBhZGRyZXNzLiAqLwotaW50IGdycGNfY3JlYXRlX2R1YWxzdGFja19zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm90b2NvbCwgZ3JwY19kdWFsc3RhY2tfbW9kZSAqZHNtb2RlKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9TT0NLRVRfVVRJTFNfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyBiL3NyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjQxOWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotLy8gbXVzdCBiZSBpbmNsdWRlZCBhZnRlciB3aW5zb2NrMi5oCi0jaW5jbHVkZSA8bXN3c29jay5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2dfd2luMzIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiCi0KLWdycGNfd2luc29ja2V0ICpncnBjX3dpbnNvY2tldF9jcmVhdGUoU09DS0VUIHNvY2tldCwgY29uc3QgY2hhciAqbmFtZSkgewotICBjaGFyICpmaW5hbF9uYW1lOwotICBncnBjX3dpbnNvY2tldCAqciA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfd2luc29ja2V0KSk7Ci0gIG1lbXNldChyLCAwLCBzaXplb2YoZ3JwY193aW5zb2NrZXQpKTsKLSAgci0+c29ja2V0ID0gc29ja2V0OwotICBncHJfbXVfaW5pdCgmci0+c3RhdGVfbXUpOwotICBncHJfYXNwcmludGYoJmZpbmFsX25hbWUsICIlczpzb2NrZXQ9MHglcCIsIG5hbWUsIHIpOwotICBncnBjX2lvbWdyX3JlZ2lzdGVyX29iamVjdCgmci0+aW9tZ3Jfb2JqZWN0LCBmaW5hbF9uYW1lKTsKLSAgZ3ByX2ZyZWUoZmluYWxfbmFtZSk7Ci0gIGdycGNfaW9jcF9hZGRfc29ja2V0KHIpOwotICByZXR1cm4gcjsKLX0KLQotLyogU2NoZWR1bGUgYSBzaHV0ZG93biBvZiB0aGUgc29ja2V0IG9wZXJhdGlvbnMuIFdpbGwgY2FsbCB0aGUgcGVuZGluZwotICAgb3BlcmF0aW9ucyB0byBhYm9ydCB0aGVtLiBXZSBuZWVkIHRvIGRvIHRoYXQgdGhpcyB3YXkgYmVjYXVzZSBvZiB0aGUKLSAgIHZhcmlvdXMgY2FsbHNpdGVzIG9mIHRoYXQgZnVuY3Rpb24sIHdoaWNoIGhhcHBlbnMgdG8gYmUgaW4gdmFyaW91cwotICAgbXV0ZXggaG9sZCBzdGF0ZXMsIGFuZCB0aGF0J2QgYmUgdW5zYWZlIHRvIGNhbGwgdGhlbSBkaXJlY3RseS4gKi8KLXZvaWQgZ3JwY193aW5zb2NrZXRfc2h1dGRvd24oZ3JwY193aW5zb2NrZXQgKndpbnNvY2tldCkgewotICAvKiBHcmFiIHRoZSBmdW5jdGlvbiBwb2ludGVyIGZvciBEaXNjb25uZWN0RXggZm9yIHRoYXQgc3BlY2lmaWMgc29ja2V0LgotICAgICBJdCBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgaW50ZXJmYWNlLiAqLwotICBpbnQgc3RhdHVzOwotICBHVUlEIGd1aWQgPSBXU0FJRF9ESVNDT05ORUNURVg7Ci0gIExQRk5fRElTQ09OTkVDVEVYIERpc2Nvbm5lY3RFeDsKLSAgRFdPUkQgaW9jdGxfbnVtX2J5dGVzOwotCi0gIHN0YXR1cyA9IFdTQUlvY3RsKHdpbnNvY2tldC0+c29ja2V0LCBTSU9fR0VUX0VYVEVOU0lPTl9GVU5DVElPTl9QT0lOVEVSLAotICAgICAgICAgICAgICAgICAgICAmZ3VpZCwgc2l6ZW9mKGd1aWQpLCAmRGlzY29ubmVjdEV4LCBzaXplb2YoRGlzY29ubmVjdEV4KSwKLSAgICAgICAgICAgICAgICAgICAgJmlvY3RsX251bV9ieXRlcywgTlVMTCwgTlVMTCk7Ci0KLSAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgRGlzY29ubmVjdEV4KHdpbnNvY2tldC0+c29ja2V0LCBOVUxMLCAwLCAwKTsKLSAgfSBlbHNlIHsKLSAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIHJldHJpZXZlIERpc2Nvbm5lY3RFeCBwb2ludGVyIDogJXMiLAotICAgICAgICAgICAgdXRmOF9tZXNzYWdlKTsKLSAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICB9Ci0gIGNsb3Nlc29ja2V0KHdpbnNvY2tldC0+c29ja2V0KTsKLX0KLQotdm9pZCBncnBjX3dpbnNvY2tldF9kZXN0cm95KGdycGNfd2luc29ja2V0ICp3aW5zb2NrZXQpIHsKLSAgZ3JwY19pb21ncl91bnJlZ2lzdGVyX29iamVjdCgmd2luc29ja2V0LT5pb21ncl9vYmplY3QpOwotICBncHJfbXVfZGVzdHJveSgmd2luc29ja2V0LT5zdGF0ZV9tdSk7Ci0gIGdwcl9mcmVlKHdpbnNvY2tldCk7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmggYi9zcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmUzYzZlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfU09DS0VUX1dJTkRPV1NfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfU09DS0VUX1dJTkRPV1NfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2F0bS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCi0KLS8qIFRoaXMgaG9sZHMgdGhlIGRhdGEgZm9yIGFuIG91dHN0YW5kaW5nIHJlYWQgb3Igd3JpdGUgb24gYSBzb2NrZXQuCi0gICBUaGUgbXV0ZXggdG8gcHJvdGVjdCB0aGUgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhhdCBkYXRhIGlzIHRoZSBvbmUKLSAgIGluc2lkZSB0aGUgd2luc29ja2V0IHdyYXBwZXIuICovCi10eXBlZGVmIHN0cnVjdCBncnBjX3dpbnNvY2tldF9jYWxsYmFja19pbmZvIHsKLSAgLyogVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBhIFdTQU9WRVJMQVBQRUQsIGJ1dCBpbiBvcmRlciB0byBnZXQgdGhhdAotICAgICBkZWZpbml0aW9uLCB3ZSBuZWVkIHRvIGluY2x1ZGUgd3MydGNwaXAuaCwgd2hpY2ggbmVlZHMgdG8gYmUgaW5jbHVkZWQKLSAgICAgZnJvbSB0aGUgdG9wLCBvdGhlcndpc2UgaXQnbGwgY2xhc2ggd2l0aCBhIHByZXZpb3VzIGluY2x1c2lvbiBvZgotICAgICB3aW5kb3dzLmggdGhhdCBpbiB0dXJucyBpbmNsdWRlcyB3aW5zb2NrLmguIElmIGFueW9uZSBrbm93cyBhIHdheQotICAgICB0byBkbyBpdCBwcm9wZXJseSwgZmVlbCBmcmVlIHRvIHNlbmQgYSBwYXRjaC4gKi8KLSAgT1ZFUkxBUFBFRCBvdmVybGFwcGVkOwotICAvKiBUaGUgY2FsbGJhY2sgaW5mb3JtYXRpb24gZm9yIHRoZSBwZW5kaW5nIG9wZXJhdGlvbi4gTWF5IGJlIGVtcHR5IGlmIHRoZQotICAgICBjYWxsZXIgaGFzbid0IHJlZ2lzdGVyZWQgYSBjYWxsYmFjayB5ZXQuICovCi0gIGdycGNfY2xvc3VyZSAqY2xvc3VyZTsKLSAgLyogQSBib29sZWFuIHRvIGRlc2NyaWJlIGlmIHRoZSBJTyBDb21wbGV0aW9uIFBvcnQgZ290IGEgbm90aWZpY2F0aW9uIGZvcgotICAgICB0aGF0IG9wZXJhdGlvbi4gVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBiZWZvcmUgdGhlCi0gICAgIGNhbGxlZCBoYWQgdGltZSB0byByZWdpc3RlciBhIGNhbGxiYWNrLiBXZSBjb3VsZCBhdm9pZCB0aGF0IGJlaGF2aW9yCi0gICAgIGFsdG9nZXRoZXIgYnkgZm9yY2luZyB0aGUgY2FsbGVyIHRvIGFsd2F5cyByZWdpc3RlciBpdHMgY2FsbGJhY2sgYmVmb3JlCi0gICAgIHByb2NlZWRpbmcgcXVldWUgYW4gb3BlcmF0aW9uLCBidXQgaXQgaXMgZnJlcXVlbnQgZm9yIGFuIElPIENvbXBsZXRpb24KLSAgICAgUG9ydCB0byB0cmlnZ2VyIHF1aWNrbHkuIFRoaXMgd2F5IHdlIGF2b2lkIGEgY29udGV4dCBzd2l0Y2ggZm9yIGNhbGxpbmcKLSAgICAgdGhlIGNhbGxiYWNrLiBXZSBhbHNvIHNpbXBsaWZ5IHRoZSByZWFkIC8gd3JpdGUgb3BlcmF0aW9ucyB0byBhdm9pZCBoYXZpbmcKLSAgICAgdG8gaG9sZCBhIG11dGV4IGZvciBhIGxvbmcgYW1vdW50IG9mIHRpbWUuICovCi0gIGludCBoYXNfcGVuZGluZ19pb2NwOwotICAvKiBUaGUgcmVzdWx0cyBvZiB0aGUgb3ZlcmxhcHBlZCBvcGVyYXRpb24uICovCi0gIERXT1JEIGJ5dGVzX3RyYW5zZmVyZWQ7Ci0gIGludCB3c2FfZXJyb3I7Ci19IGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm87Ci0KLS8qIFRoaXMgaXMgYSB3cmFwcGVyIHRvIGEgV2luZG93cyBzb2NrZXQuIEEgc29ja2V0IGNhbiBoYXZlIG9uZSBvdXRzdGFuZGluZwotICAgcmVhZCwgYW5kIG9uZSBvdXRzdGFuZGluZyB3cml0ZS4gRG9pbmcgYW4gYXN5bmNocm9ub3VzIGFjY2VwdCBtZWFucyB3YWl0aW5nCi0gICBmb3IgYSByZWFkIG9wZXJhdGlvbi4gRG9pbmcgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3QgbWVhbnMgd2FpdGluZyBmb3IgYQotICAgd3JpdGUgb3BlcmF0aW9uLiBUaGVzZSBhcmUgY29tcGxldGVseSBhcmJpdHJhcnkgdGllcyBiZXR3ZWVuIHRoZSBvcGVyYXRpb24KLSAgIGFuZCB0aGUga2luZCBvZiBldmVudCwgYmVjYXVzZSB3ZSBjYW4gaGF2ZSBvbmUgb3ZlcmxhcHBlZCBwZXIgcGVuZGluZwotICAgb3BlcmF0aW9uLCB3aGljaGV2ZXIgaXRzIG5hdHVyZSBpcy4gU28gd2UgY291bGQgaGF2ZSBtb3JlIGRlZGljYXRlZCBwZW5kaW5nCi0gICBvcGVyYXRpb24gY2FsbGJhY2tzIGZvciBjb25uZWN0IGFuZCBsaXN0ZW4uIEJ1dCBnaXZlbiB0aGUgc2NvcGUgb2YgbGlzdGVuCi0gICBhbmQgYWNjZXB0LCB3ZSBkb24ndCBuZWVkIHRvIGdvIHRvIHRoYXQgZXh0ZW50IGFuZCB3YXN0ZSBtZW1vcnkuIEFsc28sIHRoaXMKLSAgIGlzIGNsb3NlciB0byB3aGF0IGhhcHBlbnMgaW4gcG9zaXggd29ybGQuICovCi10eXBlZGVmIHN0cnVjdCBncnBjX3dpbnNvY2tldCB7Ci0gIFNPQ0tFVCBzb2NrZXQ7Ci0KLSAgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyB3cml0ZV9pbmZvOwotICBncnBjX3dpbnNvY2tldF9jYWxsYmFja19pbmZvIHJlYWRfaW5mbzsKLQotICBncHJfbXUgc3RhdGVfbXU7Ci0KLSAgLyogWW91IGNhbid0IGFkZCB0aGUgc2FtZSBzb2NrZXQgdHdpY2UgdG8gdGhlIHNhbWUgSU8gQ29tcGxldGlvbiBQb3J0LgotICAgICBUaGlzIHByZXZlbnRzIHRoYXQuICovCi0gIGludCBhZGRlZF90b19pb2NwOwotCi0gIGdycGNfY2xvc3VyZSBzaHV0ZG93bl9jbG9zdXJlOwotCi0gIC8qIEEgbGFiZWwgZm9yIGlvbWdyIHRvIHRyYWNrIG91dHN0YW5kaW5nIG9iamVjdHMgKi8KLSAgZ3JwY19pb21ncl9vYmplY3QgaW9tZ3Jfb2JqZWN0OwotfSBncnBjX3dpbnNvY2tldDsKLQotLyogQ3JlYXRlIGEgd3JhcHBlZCB3aW5kb3dzIGhhbmRsZS4gVGhpcyB0YWtlcyBvd25lcnNoaXAgb2YgaXQsIG1lYW5pbmcgdGhhdAotICAgaXQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdC4gKi8KLWdycGNfd2luc29ja2V0ICpncnBjX3dpbnNvY2tldF9jcmVhdGUoU09DS0VUIHNvY2tldCwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIEluaXRpYXRlIGFuIGFzeW5jaHJvbm91cyBzaHV0ZG93biBvZiB0aGUgc29ja2V0LiBXaWxsIGNhbGwgb2ZmIGFueSBwZW5kaW5nCi0gICBvcGVyYXRpb24gdG8gY2FuY2VsIHRoZW0uICovCi12b2lkIGdycGNfd2luc29ja2V0X3NodXRkb3duKGdycGNfd2luc29ja2V0ICpzb2NrZXQpOwotCi0vKiBEZXN0cm95IGEgc29ja2V0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlcmUncyBubyBwZW5kaW5nIG9wZXJhdGlvbi4gKi8KLXZvaWQgZ3JwY193aW5zb2NrZXRfZGVzdHJveShncnBjX3dpbnNvY2tldCAqc29ja2V0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9TT0NLRVRfV0lORE9XU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmggYi9zcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNmY4ZGUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfVENQX0NMSUVOVF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9UQ1BfQ0xJRU5UX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0KLS8qIEFzeW5jaHJvbm91c2x5IGNvbm5lY3QgdG8gYW4gYWRkcmVzcyAoc3BlY2lmaWVkIGFzIChhZGRyLCBsZW4pKSwgYW5kIGNhbGwKLSAgIGNiIHdpdGggYXJnIGFuZCB0aGUgY29tcGxldGVkIGNvbm5lY3Rpb24gd2hlbiBkb25lIChvciBjYWxsIGNiIHdpdGggYXJnIGFuZAotICAgTlVMTCBvbiBmYWlsdXJlKS4KLSAgIGludGVyZXN0ZWRfcGFydGllcyBwb2ludHMgdG8gYSBzZXQgb2YgcG9sbHNldHMgdGhhdCB3b3VsZCBiZSBpbnRlcmVzdGVkCi0gICBpbiB0aGlzIGNvbm5lY3Rpb24gYmVpbmcgZXN0YWJsaXNoZWQgKGluIG9yZGVyIHRvIGNvbnRpbnVlIHRoZWlyIHdvcmspICovCi12b2lkIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nsb3N1cmUgKm9uX2Nvbm5lY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKiplbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNpemVfdCBhZGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9UQ1BfQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyBiL3NyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZjliNi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotZXh0ZXJuIGludCBncnBjX3RjcF90cmFjZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncHJfbXUgbXU7Ci0gIGdycGNfZmQgKmZkOwotICBncHJfdGltZXNwZWMgZGVhZGxpbmU7Ci0gIGdycGNfdGltZXIgYWxhcm07Ci0gIGludCByZWZzOwotICBncnBjX2Nsb3N1cmUgd3JpdGVfY2xvc3VyZTsKLSAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzOwotICBjaGFyICphZGRyX3N0cjsKLSAgZ3JwY19lbmRwb2ludCAqKmVwOwotICBncnBjX2Nsb3N1cmUgKmNsb3N1cmU7Ci19IGFzeW5jX2Nvbm5lY3Q7Ci0KLXN0YXRpYyBpbnQgcHJlcGFyZV9zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgZmQpIHsKLSAgaWYgKGZkIDwgMCkgewotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBpZiAoIWdycGNfc2V0X3NvY2tldF9ub25ibG9ja2luZyhmZCwgMSkgfHwgIWdycGNfc2V0X3NvY2tldF9jbG9leGVjKGZkLCAxKSB8fAotICAgICAgKCFncnBjX2lzX3VuaXhfc29ja2V0KGFkZHIpICYmICFncnBjX3NldF9zb2NrZXRfbG93X2xhdGVuY3koZmQsIDEpKSB8fAotICAgICAgIWdycGNfc2V0X3NvY2tldF9ub19zaWdwaXBlX2lmX3Bvc3NpYmxlKGZkKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBzb2NrZXQgJWQ6ICVzIiwgZmQsCi0gICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLSAgcmV0dXJuIDE7Ci0KLWVycm9yOgotICBpZiAoZmQgPj0gMCkgewotICAgIGNsb3NlKGZkKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGNfb25fYWxhcm0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFjcCwgYm9vbCBzdWNjZXNzKSB7Ci0gIGludCBkb25lOwotICBhc3luY19jb25uZWN0ICphYyA9IGFjcDsKLSAgaWYgKGdycGNfdGNwX3RyYWNlKSB7Ci0gICAgZ3ByX2xvZyhHUFJfREVCVUcsICJDTElFTlRfQ09OTkVDVDogJXM6IG9uX2FsYXJtOiBzdWNjZXNzPSVkIiwgYWMtPmFkZHJfc3RyLAotICAgICAgICAgICAgc3VjY2Vzcyk7Ci0gIH0KLSAgZ3ByX211X2xvY2soJmFjLT5tdSk7Ci0gIGlmIChhYy0+ZmQgIT0gTlVMTCkgewotICAgIGdycGNfZmRfc2h1dGRvd24oZXhlY19jdHgsIGFjLT5mZCk7Ci0gIH0KLSAgZG9uZSA9ICgtLWFjLT5yZWZzID09IDApOwotICBncHJfbXVfdW5sb2NrKCZhYy0+bXUpOwotICBpZiAoZG9uZSkgewotICAgIGdwcl9tdV9kZXN0cm95KCZhYy0+bXUpOwotICAgIGdwcl9mcmVlKGFjLT5hZGRyX3N0cik7Ci0gICAgZ3ByX2ZyZWUoYWMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX3dyaXRhYmxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphY3AsIGJvb2wgc3VjY2VzcykgewotICBhc3luY19jb25uZWN0ICphYyA9IGFjcDsKLSAgaW50IHNvX2Vycm9yID0gMDsKLSAgc29ja2xlbl90IHNvX2Vycm9yX3NpemU7Ci0gIGludCBlcnI7Ci0gIGludCBkb25lOwotICBncnBjX2VuZHBvaW50ICoqZXAgPSBhYy0+ZXA7Ci0gIGdycGNfY2xvc3VyZSAqY2xvc3VyZSA9IGFjLT5jbG9zdXJlOwotICBncnBjX2ZkICpmZDsKLQotICBpZiAoZ3JwY190Y3BfdHJhY2UpIHsKLSAgICBncHJfbG9nKEdQUl9ERUJVRywgIkNMSUVOVF9DT05ORUNUOiAlczogb25fd3JpdGFibGU6IHN1Y2Nlc3M9JWQiLAotICAgICAgICAgICAgYWMtPmFkZHJfc3RyLCBzdWNjZXNzKTsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZhYy0+bXUpOwotICBHUFJfQVNTRVJUKGFjLT5mZCk7Ci0gIGZkID0gYWMtPmZkOwotICBhYy0+ZmQgPSBOVUxMOwotICBncHJfbXVfdW5sb2NrKCZhYy0+bXUpOwotCi0gIGdycGNfdGltZXJfY2FuY2VsKGV4ZWNfY3R4LCAmYWMtPmFsYXJtKTsKLQotICBncHJfbXVfbG9jaygmYWMtPm11KTsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBkbyB7Ci0gICAgICBzb19lcnJvcl9zaXplID0gc2l6ZW9mKHNvX2Vycm9yKTsKLSAgICAgIGVyciA9IGdldHNvY2tvcHQoZmQtPmZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgJnNvX2Vycm9yLCAmc29fZXJyb3Jfc2l6ZSk7Ci0gICAgfSB3aGlsZSAoZXJyIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJzogZ2V0c29ja29wdChFUlJPUik6ICVzIiwKLSAgICAgICAgICAgICAgYWMtPmFkZHJfc3RyLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgZ290byBmaW5pc2g7Ci0gICAgfSBlbHNlIGlmIChzb19lcnJvciAhPSAwKSB7Ci0gICAgICBpZiAoc29fZXJyb3IgPT0gRU5PQlVGUykgewotICAgICAgICAvKiBXZSB3aWxsIGdldCBvbmUgb2YgdGhlc2UgZXJyb3JzIGlmIHdlIGhhdmUgcnVuIG91dCBvZgotICAgICAgICAgICBtZW1vcnkgaW4gdGhlIGtlcm5lbCBmb3IgdGhlIGRhdGEgc3RydWN0dXJlcyBhbGxvY2F0ZWQKLSAgICAgICAgICAgd2hlbiB5b3UgY29ubmVjdCBhIHNvY2tldC4gIElmIHRoaXMgaGFwcGVucyBpdCBpcyB2ZXJ5Ci0gICAgICAgICAgIGxpa2VseSB0aGF0IGlmIHdlIHdhaXQgYSBsaXR0bGUgYml0IHRoZW4gdHJ5IGFnYWluIHRoZQotICAgICAgICAgICBjb25uZWN0aW9uIHdpbGwgd29yayAoc2luY2Ugb3RoZXIgcHJvZ3JhbXMgb3IgdGhpcwotICAgICAgICAgICBwcm9ncmFtIHdpbGwgY2xvc2UgdGhlaXIgbmV0d29yayBjb25uZWN0aW9ucyBhbmQgZnJlZSB1cAotICAgICAgICAgICBtZW1vcnkpLiAgVGhpcyBkb2VzIF9ub3RfIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYW55dGhpbmcKLSAgICAgICAgICAgd3Jvbmcgd2l0aCB0aGUgc2VydmVyIHdlIGFyZSBjb25uZWN0aW5nIHRvLCB0aGlzIGlzIGEKLSAgICAgICAgICAgbG9jYWwgcHJvYmxlbS4KLQotICAgICAgICAgICBJZiB5b3UgYXJlIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCB0aGVuIGNoYW5jZXMgYXJlIHRoYXQKLSAgICAgICAgICAgeW91ciBwcm9ncmFtIG9yIGFub3RoZXIgcHJvZ3JhbSBvbiB0aGUgc2FtZSBjb21wdXRlcgotICAgICAgICAgICBvcGVuZWQgdG9vIG1hbnkgbmV0d29yayBjb25uZWN0aW9ucy4gIFRoZSAiZWFzeSIgZml4OgotICAgICAgICAgICBkb24ndCBkbyB0aGF0ISAqLwotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImtlcm5lbCBvdXQgb2YgYnVmZmVycyIpOwotICAgICAgICBncHJfbXVfdW5sb2NrKCZhYy0+bXUpOwotICAgICAgICBncnBjX2ZkX25vdGlmeV9vbl93cml0ZShleGVjX2N0eCwgZmQsICZhYy0+d3JpdGVfY2xvc3VyZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoc29fZXJyb3IpIHsKLSAgICAgICAgICBjYXNlIEVDT05OUkVGVVNFRDoKLSAgICAgICAgICAgIGdwcl9sb2coCi0gICAgICAgICAgICAgICAgR1BSX0VSUk9SLAotICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnOiBzb2NrZXQgZXJyb3I6IGNvbm5lY3Rpb24gcmVmdXNlZCIsCi0gICAgICAgICAgICAgICAgYWMtPmFkZHJfc3RyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImZhaWxlZCB0byBjb25uZWN0IHRvICclcyc6IHNvY2tldCBlcnJvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICBhYy0+YWRkcl9zdHIsIHNvX2Vycm9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGdvdG8gZmluaXNoOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9mZChleGVjX2N0eCwgYWMtPmludGVyZXN0ZWRfcGFydGllcywgZmQpOwotICAgICAgKmVwID0gZ3JwY190Y3BfY3JlYXRlKGZkLCBHUlBDX1RDUF9ERUZBVUxUX1JFQURfU0xJQ0VfU0laRSwgYWMtPmFkZHJfc3RyKTsKLSAgICAgIGZkID0gTlVMTDsKLSAgICAgIGdvdG8gZmluaXNoOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgImZhaWxlZCB0byBjb25uZWN0IHRvICclcyc6IHRpbWVvdXQgb2NjdXJyZWQiLAotICAgICAgICAgICAgYWMtPmFkZHJfc3RyKTsKLSAgICBnb3RvIGZpbmlzaDsKLSAgfQotCi0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiApOwotCi1maW5pc2g6Ci0gIGlmIChmZCAhPSBOVUxMKSB7Ci0gICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfZmQoZXhlY19jdHgsIGFjLT5pbnRlcmVzdGVkX3BhcnRpZXMsIGZkKTsKLSAgICBncnBjX2ZkX29ycGhhbihleGVjX2N0eCwgZmQsIE5VTEwsIE5VTEwsICJ0Y3BfY2xpZW50X29ycGhhbiIpOwotICAgIGZkID0gTlVMTDsKLSAgfQotICBkb25lID0gKC0tYWMtPnJlZnMgPT0gMCk7Ci0gIGdwcl9tdV91bmxvY2soJmFjLT5tdSk7Ci0gIGlmIChkb25lKSB7Ci0gICAgZ3ByX211X2Rlc3Ryb3koJmFjLT5tdSk7Ci0gICAgZ3ByX2ZyZWUoYWMtPmFkZHJfc3RyKTsKLSAgICBncHJfZnJlZShhYyk7Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCAqZXAgIT0gTlVMTCwgTlVMTCk7Ci19Ci0KLXZvaWQgZ3JwY190Y3BfY2xpZW50X2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2xvc3VyZSAqY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqKmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKLSAgaW50IGZkOwotICBncnBjX2R1YWxzdGFja19tb2RlIGRzbW9kZTsKLSAgaW50IGVycjsKLSAgYXN5bmNfY29ubmVjdCAqYWM7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjZfdjRtYXBwZWQ7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyNF9jb3B5OwotICBncnBjX2ZkICpmZG9iajsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqYWRkcl9zdHI7Ci0KLSAgKmVwID0gTlVMTDsKLQotICAvKiBVc2UgZHVhbHN0YWNrIHNvY2tldHMgd2hlcmUgYXZhaWxhYmxlLiAqLwotICBpZiAoZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZChhZGRyLCAmYWRkcjZfdjRtYXBwZWQpKSB7Ci0gICAgYWRkciA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjZfdjRtYXBwZWQ7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjZfdjRtYXBwZWQpOwotICB9Ci0KLSAgZmQgPSBncnBjX2NyZWF0ZV9kdWFsc3RhY2tfc29ja2V0KGFkZHIsIFNPQ0tfU1RSRUFNLCAwLCAmZHNtb2RlKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotICBpZiAoZHNtb2RlID09IEdSUENfRFNNT0RFX0lQVjQpIHsKLSAgICAvKiBJZiB3ZSBnb3QgYW4gQUZfSU5FVCBzb2NrZXQsIG1hcCB0aGUgYWRkcmVzcyBiYWNrIHRvIElQdjQuICovCi0gICAgR1BSX0FTU0VSVChncnBjX3NvY2thZGRyX2lzX3Y0bWFwcGVkKGFkZHIsICZhZGRyNF9jb3B5KSk7Ci0gICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjRfY29weTsKLSAgICBhZGRyX2xlbiA9IHNpemVvZihhZGRyNF9jb3B5KTsKLSAgfQotICBpZiAoIXByZXBhcmVfc29ja2V0KGFkZHIsIGZkKSkgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2xvc3VyZSwgZmFsc2UsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGRvIHsKLSAgICBHUFJfQVNTRVJUKGFkZHJfbGVuIDwgfihzb2NrbGVuX3QpMCk7Ci0gICAgZXJyID0gY29ubmVjdChmZCwgYWRkciwgKHNvY2tsZW5fdClhZGRyX2xlbik7Ci0gIH0gd2hpbGUgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gIGFkZHJfc3RyID0gZ3JwY19zb2NrYWRkcl90b191cmkoYWRkcik7Ci0gIGdwcl9hc3ByaW50ZigmbmFtZSwgInRjcC1jbGllbnQ6JXMiLCBhZGRyX3N0cik7Ci0KLSAgZmRvYmogPSBncnBjX2ZkX2NyZWF0ZShmZCwgbmFtZSk7Ci0KLSAgaWYgKGVyciA+PSAwKSB7Ci0gICAgKmVwID0gZ3JwY190Y3BfY3JlYXRlKGZkb2JqLCBHUlBDX1RDUF9ERUZBVUxUX1JFQURfU0xJQ0VfU0laRSwgYWRkcl9zdHIpOwotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2xvc3VyZSwgdHJ1ZSwgTlVMTCk7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVJTlBST0dSRVNTKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJjb25uZWN0IGVycm9yIHRvICclcyc6ICVzIiwgYWRkcl9zdHIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgZ3JwY19mZF9vcnBoYW4oZXhlY19jdHgsIGZkb2JqLCBOVUxMLCBOVUxMLCAidGNwX2NsaWVudF9jb25uZWN0X2Vycm9yIik7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCBmYWxzZSwgTlVMTCk7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgZ3JwY19wb2xsc2V0X3NldF9hZGRfZmQoZXhlY19jdHgsIGludGVyZXN0ZWRfcGFydGllcywgZmRvYmopOwotCi0gIGFjID0gZ3ByX21hbGxvYyhzaXplb2YoYXN5bmNfY29ubmVjdCkpOwotICBhYy0+Y2xvc3VyZSA9IGNsb3N1cmU7Ci0gIGFjLT5lcCA9IGVwOwotICBhYy0+ZmQgPSBmZG9iajsKLSAgYWMtPmludGVyZXN0ZWRfcGFydGllcyA9IGludGVyZXN0ZWRfcGFydGllczsKLSAgYWMtPmFkZHJfc3RyID0gYWRkcl9zdHI7Ci0gIGFkZHJfc3RyID0gTlVMTDsKLSAgZ3ByX211X2luaXQoJmFjLT5tdSk7Ci0gIGFjLT5yZWZzID0gMjsKLSAgYWMtPndyaXRlX2Nsb3N1cmUuY2IgPSBvbl93cml0YWJsZTsKLSAgYWMtPndyaXRlX2Nsb3N1cmUuY2JfYXJnID0gYWM7Ci0KLSAgaWYgKGdycGNfdGNwX3RyYWNlKSB7Ci0gICAgZ3ByX2xvZyhHUFJfREVCVUcsICJDTElFTlRfQ09OTkVDVDogJXM6IGFzeW5jaHJvbm91c2x5IGNvbm5lY3RpbmciLAotICAgICAgICAgICAgYWMtPmFkZHJfc3RyKTsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZhYy0+bXUpOwotICBncnBjX3RpbWVyX2luaXQoZXhlY19jdHgsICZhYy0+YWxhcm0sCi0gICAgICAgICAgICAgICAgICBncHJfY29udmVydF9jbG9ja190eXBlKGRlYWRsaW5lLCBHUFJfQ0xPQ0tfTU9OT1RPTklDKSwKLSAgICAgICAgICAgICAgICAgIHRjX29uX2FsYXJtLCBhYywgZ3ByX25vdyhHUFJfQ0xPQ0tfTU9OT1RPTklDKSk7Ci0gIGdycGNfZmRfbm90aWZ5X29uX3dyaXRlKGV4ZWNfY3R4LCBhYy0+ZmQsICZhYy0+d3JpdGVfY2xvc3VyZSk7Ci0gIGdwcl9tdV91bmxvY2soJmFjLT5tdSk7Ci0KLWRvbmU6Ci0gIGdwcl9mcmVlKG5hbWUpOwotICBncHJfZnJlZShhZGRyX3N0cik7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMgYi9zcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4M2Y3Yi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nX3dpbjMyLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jbG9zdXJlICpvbl9kb25lOwotICBncHJfbXUgbXU7Ci0gIGdycGNfd2luc29ja2V0ICpzb2NrZXQ7Ci0gIGdwcl90aW1lc3BlYyBkZWFkbGluZTsKLSAgZ3JwY190aW1lciBhbGFybTsKLSAgY2hhciAqYWRkcl9uYW1lOwotICBpbnQgcmVmczsKLSAgZ3JwY19jbG9zdXJlIG9uX2Nvbm5lY3Q7Ci0gIGdycGNfZW5kcG9pbnQgKiplbmRwb2ludDsKLX0gYXN5bmNfY29ubmVjdDsKLQotc3RhdGljIHZvaWQgYXN5bmNfY29ubmVjdF91bmxvY2tfYW5kX2NsZWFudXAoYXN5bmNfY29ubmVjdCAqYWMpIHsKLSAgaW50IGRvbmUgPSAoLS1hYy0+cmVmcyA9PSAwKTsKLSAgZ3ByX211X3VubG9jaygmYWMtPm11KTsKLSAgaWYgKGRvbmUpIHsKLSAgICBpZiAoYWMtPnNvY2tldCAhPSBOVUxMKSBncnBjX3dpbnNvY2tldF9kZXN0cm95KGFjLT5zb2NrZXQpOwotICAgIGdwcl9tdV9kZXN0cm95KCZhYy0+bXUpOwotICAgIGdwcl9mcmVlKGFjLT5hZGRyX25hbWUpOwotICAgIGdwcl9mcmVlKGFjKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBvbl9hbGFybShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYWNwLCBib29sIG9jY3VyZWQpIHsKLSAgYXN5bmNfY29ubmVjdCAqYWMgPSBhY3A7Ci0gIGdwcl9tdV9sb2NrKCZhYy0+bXUpOwotICAvKiBJZiB0aGUgYWxhcm0gZGlkbid0IG9jY3VyLCBpdCBnb3QgY2FuY2VsbGVkLiAqLwotICBpZiAoYWMtPnNvY2tldCAhPSBOVUxMICYmIG9jY3VyZWQpIHsKLSAgICBncnBjX3dpbnNvY2tldF9zaHV0ZG93bihhYy0+c29ja2V0KTsKLSAgfQotICBhc3luY19jb25uZWN0X3VubG9ja19hbmRfY2xlYW51cChhYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFjcCwgYm9vbCBmcm9tX2lvY3ApIHsKLSAgYXN5bmNfY29ubmVjdCAqYWMgPSBhY3A7Ci0gIFNPQ0tFVCBzb2NrID0gYWMtPnNvY2tldC0+c29ja2V0OwotICBncnBjX2VuZHBvaW50ICoqZXAgPSBhYy0+ZW5kcG9pbnQ7Ci0gIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmYWMtPnNvY2tldC0+d3JpdGVfaW5mbzsKLSAgZ3JwY19jbG9zdXJlICpvbl9kb25lID0gYWMtPm9uX2RvbmU7Ci0KLSAgZ3JwY190aW1lcl9jYW5jZWwoZXhlY19jdHgsICZhYy0+YWxhcm0pOwotCi0gIGdwcl9tdV9sb2NrKCZhYy0+bXUpOwotCi0gIGlmIChmcm9tX2lvY3ApIHsKLSAgICBEV09SRCB0cmFuc2ZlcmVkX2J5dGVzID0gMDsKLSAgICBEV09SRCBmbGFnczsKLSAgICBCT09MIHdzYV9zdWNjZXNzID0gV1NBR2V0T3ZlcmxhcHBlZFJlc3VsdChzb2NrLCAmaW5mby0+b3ZlcmxhcHBlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmZXJlZF9ieXRlcywgRkFMU0UsICZmbGFncyk7Ci0gICAgR1BSX0FTU0VSVCh0cmFuc2ZlcmVkX2J5dGVzID09IDApOwotICAgIGlmICghd3NhX3N1Y2Nlc3MpIHsKLSAgICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm9uX2Nvbm5lY3QgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICAgIGdwcl9mcmVlKHV0ZjhfbWVzc2FnZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICplcCA9IGdycGNfdGNwX2NyZWF0ZShhYy0+c29ja2V0LCBhYy0+YWRkcl9uYW1lKTsKLSAgICAgIGFjLT5zb2NrZXQgPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIGFzeW5jX2Nvbm5lY3RfdW5sb2NrX2FuZF9jbGVhbnVwKGFjKTsKLSAgLyogSWYgdGhlIGNvbm5lY3Rpb24gd2FzIGFib3J0ZWQsIHRoZSBjYWxsYmFjayB3YXMgYWxyZWFkeSBjYWxsZWQgd2hlbgotICAgICB0aGUgZGVhZGxpbmUgd2FzIG1ldC4gKi8KLSAgb25fZG9uZS0+Y2IoZXhlY19jdHgsIG9uX2RvbmUtPmNiX2FyZywgKmVwICE9IE5VTEwpOwotfQotCi0vKiBUcmllcyB0byBpc3N1ZSBvbmUgYXN5bmMgY29ubmVjdGlvbiwgdGhlbiBzY2hlZHVsZXMgYm90aCBhbiBJT0NQCi0gICBub3RpZmljYXRpb24gcmVxdWVzdCBmb3IgdGhlIGNvbm5lY3Rpb24sIGFuZCBvbmUgdGltZW91dCBhbGVydC4gKi8KLXZvaWQgZ3JwY190Y3BfY2xpZW50X2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2xvc3VyZSAqb25fZG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqKmVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKLSAgU09DS0VUIHNvY2sgPSBJTlZBTElEX1NPQ0tFVDsKLSAgQk9PTCBzdWNjZXNzOwotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI2X3Y0bWFwcGVkOwotICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGxvY2FsX2FkZHJlc3M7Ci0gIGFzeW5jX2Nvbm5lY3QgKmFjOwotICBncnBjX3dpbnNvY2tldCAqc29ja2V0ID0gTlVMTDsKLSAgTFBGTl9DT05ORUNURVggQ29ubmVjdEV4OwotICBHVUlEIGd1aWQgPSBXU0FJRF9DT05ORUNURVg7Ci0gIERXT1JEIGlvY3RsX251bV9ieXRlczsKLSAgY29uc3QgY2hhciAqbWVzc2FnZSA9IE5VTEw7Ci0gIGNoYXIgKnV0ZjhfbWVzc2FnZTsKLSAgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyAqaW5mbzsKLQotICAqZW5kcG9pbnQgPSBOVUxMOwotCi0gIC8qIFVzZSBkdWFsc3RhY2sgc29ja2V0cyB3aGVyZSBhdmFpbGFibGUuICovCi0gIGlmIChncnBjX3NvY2thZGRyX3RvX3Y0bWFwcGVkKGFkZHIsICZhZGRyNl92NG1hcHBlZCkpIHsKLSAgICBhZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyNl92NG1hcHBlZDsKLSAgICBhZGRyX2xlbiA9IHNpemVvZihhZGRyNl92NG1hcHBlZCk7Ci0gIH0KLQotICBzb2NrID0gV1NBU29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgV1NBX0ZMQUdfT1ZFUkxBUFBFRCk7Ci0gIGlmIChzb2NrID09IElOVkFMSURfU09DS0VUKSB7Ci0gICAgbWVzc2FnZSA9ICJVbmFibGUgdG8gY3JlYXRlIHNvY2tldDogJXMiOwotICAgIGdvdG8gZmFpbHVyZTsKLSAgfQotCi0gIGlmICghZ3JwY190Y3BfcHJlcGFyZV9zb2NrZXQoc29jaykpIHsKLSAgICBtZXNzYWdlID0gIlVuYWJsZSB0byBzZXQgc29ja2V0IG9wdGlvbnM6ICVzIjsKLSAgICBnb3RvIGZhaWx1cmU7Ci0gIH0KLQotICAvKiBHcmFiIHRoZSBmdW5jdGlvbiBwb2ludGVyIGZvciBDb25uZWN0RXggZm9yIHRoYXQgc3BlY2lmaWMgc29ja2V0LgotICAgICBJdCBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgaW50ZXJmYWNlLiAqLwotICBzdGF0dXMgPQotICAgICAgV1NBSW9jdGwoc29jaywgU0lPX0dFVF9FWFRFTlNJT05fRlVOQ1RJT05fUE9JTlRFUiwgJmd1aWQsIHNpemVvZihndWlkKSwKLSAgICAgICAgICAgICAgICZDb25uZWN0RXgsIHNpemVvZihDb25uZWN0RXgpLCAmaW9jdGxfbnVtX2J5dGVzLCBOVUxMLCBOVUxMKTsKLQotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICBtZXNzYWdlID0gIlVuYWJsZSB0byByZXRyaWV2ZSBDb25uZWN0RXggcG9pbnRlcjogJXMiOwotICAgIGdvdG8gZmFpbHVyZTsKLSAgfQotCi0gIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZDYoMCwgJmxvY2FsX2FkZHJlc3MpOwotCi0gIHN0YXR1cyA9IGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZsb2NhbF9hZGRyZXNzLCBzaXplb2YobG9jYWxfYWRkcmVzcykpOwotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICBtZXNzYWdlID0gIlVuYWJsZSB0byBiaW5kIHNvY2tldDogJXMiOwotICAgIGdvdG8gZmFpbHVyZTsKLSAgfQotCi0gIHNvY2tldCA9IGdycGNfd2luc29ja2V0X2NyZWF0ZShzb2NrLCAiY2xpZW50Iik7Ci0gIGluZm8gPSAmc29ja2V0LT53cml0ZV9pbmZvOwotICBzdWNjZXNzID0KLSAgICAgIENvbm5lY3RFeChzb2NrLCBhZGRyLCAoaW50KWFkZHJfbGVuLCBOVUxMLCAwLCBOVUxMLCAmaW5mby0+b3ZlcmxhcHBlZCk7Ci0KLSAgLyogSXQgd291bGRuJ3QgYmUgdW51c3VhbCB0byBnZXQgYSBzdWNjZXNzIGltbWVkaWF0ZWx5LiBCdXQgd2UnbGwgc3RpbGwgZ2V0Ci0gICAgIGFuIElPQ1Agbm90aWZpY2F0aW9uLCBzbyBsZXQncyBpZ25vcmUgaXQuICovCi0gIGlmICghc3VjY2VzcykgewotICAgIGludCBlcnJvciA9IFdTQUdldExhc3RFcnJvcigpOwotICAgIGlmIChlcnJvciAhPSBFUlJPUl9JT19QRU5ESU5HKSB7Ci0gICAgICBtZXNzYWdlID0gIkNvbm5lY3RFeCBmYWlsZWQ6ICVzIjsKLSAgICAgIGdvdG8gZmFpbHVyZTsKLSAgICB9Ci0gIH0KLQotICBhYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGFzeW5jX2Nvbm5lY3QpKTsKLSAgYWMtPm9uX2RvbmUgPSBvbl9kb25lOwotICBhYy0+c29ja2V0ID0gc29ja2V0OwotICBncHJfbXVfaW5pdCgmYWMtPm11KTsKLSAgYWMtPnJlZnMgPSAyOwotICBhYy0+YWRkcl9uYW1lID0gZ3JwY19zb2NrYWRkcl90b191cmkoYWRkcik7Ci0gIGFjLT5lbmRwb2ludCA9IGVuZHBvaW50OwotICBncnBjX2Nsb3N1cmVfaW5pdCgmYWMtPm9uX2Nvbm5lY3QsIG9uX2Nvbm5lY3QsIGFjKTsKLQotICBncnBjX3RpbWVyX2luaXQoZXhlY19jdHgsICZhYy0+YWxhcm0sIGRlYWRsaW5lLCBvbl9hbGFybSwgYWMsCi0gICAgICAgICAgICAgICAgICBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLSAgZ3JwY19zb2NrZXRfbm90aWZ5X29uX3dyaXRlKGV4ZWNfY3R4LCBzb2NrZXQsICZhYy0+b25fY29ubmVjdCk7Ci0gIHJldHVybjsKLQotZmFpbHVyZToKLSAgdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKLSAgZ3ByX2xvZyhHUFJfRVJST1IsIG1lc3NhZ2UsIHV0ZjhfbWVzc2FnZSk7Ci0gIGdwcl9mcmVlKHV0ZjhfbWVzc2FnZSk7Ci0gIGlmIChzb2NrZXQgIT0gTlVMTCkgewotICAgIGdycGNfd2luc29ja2V0X2Rlc3Ryb3koc29ja2V0KTsKLSAgfSBlbHNlIGlmIChzb2NrICE9IElOVkFMSURfU09DS0VUKSB7Ci0gICAgY2xvc2Vzb2NrZXQoc29jayk7Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBvbl9kb25lLCBmYWxzZSwgTlVMTCk7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIGIvc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjczODEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLSNpZmRlZiBHUFJfSEFWRV9NU0dfTk9TSUdOQUwKLSNkZWZpbmUgU0VORE1TR19GTEFHUyBNU0dfTk9TSUdOQUwKLSNlbHNlCi0jZGVmaW5lIFNFTkRNU0dfRkxBR1MgMAotI2VuZGlmCi0KLSNpZmRlZiBHUFJfTVNHX0lPVkxFTl9UWVBFCi10eXBlZGVmIEdQUl9NU0dfSU9WTEVOX1RZUEUgbXNnX2lvdmxlbl90eXBlOwotI2Vsc2UKLXR5cGVkZWYgc2l6ZV90IG1zZ19pb3ZsZW5fdHlwZTsKLSNlbmRpZgotCi1pbnQgZ3JwY190Y3BfdHJhY2UgPSAwOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfZW5kcG9pbnQgYmFzZTsKLSAgZ3JwY19mZCAqZW1fZmQ7Ci0gIGludCBmZDsKLSAgaW50IGZpbmlzaGVkX2VkZ2U7Ci0gIG1zZ19pb3ZsZW5fdHlwZSBpb3Zfc2l6ZTsgLyogTnVtYmVyIG9mIHNsaWNlcyB0byBhbGxvY2F0ZSBwZXIgcmVhZCBhdHRlbXB0ICovCi0gIHNpemVfdCBzbGljZV9zaXplOwotICBncHJfcmVmY291bnQgcmVmY291bnQ7Ci0KLSAgLyogZ2FyYmFnZSBhZnRlciB0aGUgbGFzdCByZWFkICovCi0gIGdwcl9zbGljZV9idWZmZXIgbGFzdF9yZWFkX2J1ZmZlcjsKLQotICBncHJfc2xpY2VfYnVmZmVyICppbmNvbWluZ19idWZmZXI7Ci0gIGdwcl9zbGljZV9idWZmZXIgKm91dGdvaW5nX2J1ZmZlcjsKLSAgLyoqIHNsaWNlIHdpdGhpbiBvdXRnb2luZ19idWZmZXIgdG8gd3JpdGUgbmV4dCAqLwotICBzaXplX3Qgb3V0Z29pbmdfc2xpY2VfaWR4OwotICAvKiogYnl0ZSB3aXRoaW4gb3V0Z29pbmdfYnVmZmVyLT5zbGljZXNbb3V0Z29pbmdfc2xpY2VfaWR4XSB0byB3cml0ZSBuZXh0ICovCi0gIHNpemVfdCBvdXRnb2luZ19ieXRlX2lkeDsKLQotICBncnBjX2Nsb3N1cmUgKnJlYWRfY2I7Ci0gIGdycGNfY2xvc3VyZSAqd3JpdGVfY2I7Ci0gIGdycGNfY2xvc3VyZSAqcmVsZWFzZV9mZF9jYjsKLSAgaW50ICpyZWxlYXNlX2ZkOwotCi0gIGdycGNfY2xvc3VyZSByZWFkX2Nsb3N1cmU7Ci0gIGdycGNfY2xvc3VyZSB3cml0ZV9jbG9zdXJlOwotCi0gIGNoYXIgKnBlZXJfc3RyaW5nOwotfSBncnBjX3RjcDsKLQotc3RhdGljIHZvaWQgdGNwX2hhbmRsZV9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcgLyogZ3JwY190Y3AgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKLXN0YXRpYyB2b2lkIHRjcF9oYW5kbGVfd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZyAvKiBncnBjX3RjcCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKLQotc3RhdGljIHZvaWQgdGNwX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCkgewotICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7Ci0gIGdycGNfZmRfc2h1dGRvd24oZXhlY19jdHgsIHRjcC0+ZW1fZmQpOwotfQotCi1zdGF0aWMgdm9pZCB0Y3BfZnJlZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3AgKnRjcCkgewotICBncnBjX2ZkX29ycGhhbihleGVjX2N0eCwgdGNwLT5lbV9mZCwgdGNwLT5yZWxlYXNlX2ZkX2NiLCB0Y3AtPnJlbGVhc2VfZmQsCi0gICAgICAgICAgICAgICAgICJ0Y3BfdW5yZWZfb3JwaGFuIik7Ci0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmdGNwLT5sYXN0X3JlYWRfYnVmZmVyKTsKLSAgZ3ByX2ZyZWUodGNwLT5wZWVyX3N0cmluZyk7Ci0gIGdwcl9mcmVlKHRjcCk7Ci19Ci0KLS8qI2RlZmluZSBHUlBDX1RDUF9SRUZDT1VOVF9ERUJVRyovCi0jaWZkZWYgR1JQQ19UQ1BfUkVGQ09VTlRfREVCVUcKLSNkZWZpbmUgVENQX1VOUkVGKGNsLCB0Y3AsIHJlYXNvbikgXAotICB0Y3BfdW5yZWYoKGNsKSwgKHRjcCksIChyZWFzb24pLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIFRDUF9SRUYodGNwLCByZWFzb24pIHRjcF9yZWYoKHRjcCksIChyZWFzb24pLCBfX0ZJTEVfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCB0Y3BfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwICp0Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgewotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJUQ1AgdW5yZWYgJXAgOiAlcyAlZCAtPiAlZCIsIHRjcCwKLSAgICAgICAgICByZWFzb24sIHRjcC0+cmVmY291bnQuY291bnQsIHRjcC0+cmVmY291bnQuY291bnQgLSAxKTsKLSAgaWYgKGdwcl91bnJlZigmdGNwLT5yZWZjb3VudCkpIHsKLSAgICB0Y3BfZnJlZShleGVjX2N0eCwgdGNwKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB0Y3BfcmVmKGdycGNfdGNwICp0Y3AsIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiVENQICAgcmVmICVwIDogJXMgJWQgLT4gJWQiLCB0Y3AsCi0gICAgICAgICAgcmVhc29uLCB0Y3AtPnJlZmNvdW50LmNvdW50LCB0Y3AtPnJlZmNvdW50LmNvdW50ICsgMSk7Ci0gIGdwcl9yZWYoJnRjcC0+cmVmY291bnQpOwotfQotI2Vsc2UKLSNkZWZpbmUgVENQX1VOUkVGKGNsLCB0Y3AsIHJlYXNvbikgdGNwX3VucmVmKChjbCksICh0Y3ApKQotI2RlZmluZSBUQ1BfUkVGKHRjcCwgcmVhc29uKSB0Y3BfcmVmKCh0Y3ApKQotc3RhdGljIHZvaWQgdGNwX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RjcCAqdGNwKSB7Ci0gIGlmIChncHJfdW5yZWYoJnRjcC0+cmVmY291bnQpKSB7Ci0gICAgdGNwX2ZyZWUoZXhlY19jdHgsIHRjcCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgdGNwX3JlZihncnBjX3RjcCAqdGNwKSB7IGdwcl9yZWYoJnRjcC0+cmVmY291bnQpOyB9Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgdGNwX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJkZXN0cm95Iik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGxfcmVhZF9jYihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3AgKnRjcCwgaW50IHN1Y2Nlc3MpIHsKLSAgZ3JwY19jbG9zdXJlICpjYiA9IHRjcC0+cmVhZF9jYjsKLQotICBpZiAoZ3JwY190Y3BfdHJhY2UpIHsKLSAgICBzaXplX3QgaTsKLSAgICBncHJfbG9nKEdQUl9ERUJVRywgInJlYWQ6IHN1Y2Nlc3M9JWQiLCBzdWNjZXNzKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdGNwLT5pbmNvbWluZ19idWZmZXItPmNvdW50OyBpKyspIHsKLSAgICAgIGNoYXIgKmR1bXAgPSBncHJfZHVtcF9zbGljZSh0Y3AtPmluY29taW5nX2J1ZmZlci0+c2xpY2VzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9EVU1QX0hFWCB8IEdQUl9EVU1QX0FTQ0lJKTsKLSAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiUkVBRCAlcDogJXMiLCB0Y3AsIGR1bXApOwotICAgICAgZ3ByX2ZyZWUoZHVtcCk7Ci0gICAgfQotICB9Ci0KLSAgdGNwLT5yZWFkX2NiID0gTlVMTDsKLSAgdGNwLT5pbmNvbWluZ19idWZmZXIgPSBOVUxMOwotICBjYi0+Y2IoZXhlY19jdHgsIGNiLT5jYl9hcmcsIHN1Y2Nlc3MpOwotfQotCi0jZGVmaW5lIE1BWF9SRUFEX0lPVkVDIDQKLXN0YXRpYyB2b2lkIHRjcF9jb250aW51ZV9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RjcCAqdGNwKSB7Ci0gIHN0cnVjdCBtc2doZHIgbXNnOwotICBzdHJ1Y3QgaW92ZWMgaW92W01BWF9SRUFEX0lPVkVDXTsKLSAgc3NpemVfdCByZWFkX2J5dGVzOwotICBzaXplX3QgaTsKLQotICBHUFJfQVNTRVJUKCF0Y3AtPmZpbmlzaGVkX2VkZ2UpOwotICBHUFJfQVNTRVJUKHRjcC0+aW92X3NpemUgPD0gTUFYX1JFQURfSU9WRUMpOwotICBHUFJfQVNTRVJUKHRjcC0+aW5jb21pbmdfYnVmZmVyLT5jb3VudCA8PSBNQVhfUkVBRF9JT1ZFQyk7Ci0gIEdQUl9USU1FUl9CRUdJTigidGNwX2NvbnRpbnVlX3JlYWQiLCAwKTsKLQotICB3aGlsZSAodGNwLT5pbmNvbWluZ19idWZmZXItPmNvdW50IDwgKHNpemVfdCl0Y3AtPmlvdl9zaXplKSB7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZCh0Y3AtPmluY29taW5nX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9tYWxsb2ModGNwLT5zbGljZV9zaXplKSk7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IHRjcC0+aW5jb21pbmdfYnVmZmVyLT5jb3VudDsgaSsrKSB7Ci0gICAgaW92W2ldLmlvdl9iYXNlID0gR1BSX1NMSUNFX1NUQVJUX1BUUih0Y3AtPmluY29taW5nX2J1ZmZlci0+c2xpY2VzW2ldKTsKLSAgICBpb3ZbaV0uaW92X2xlbiA9IEdQUl9TTElDRV9MRU5HVEgodGNwLT5pbmNvbWluZ19idWZmZXItPnNsaWNlc1tpXSk7Ci0gIH0KLQotICBtc2cubXNnX25hbWUgPSBOVUxMOwotICBtc2cubXNnX25hbWVsZW4gPSAwOwotICBtc2cubXNnX2lvdiA9IGlvdjsKLSAgbXNnLm1zZ19pb3ZsZW4gPSB0Y3AtPmlvdl9zaXplOwotICBtc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotICBtc2cubXNnX2NvbnRyb2xsZW4gPSAwOwotICBtc2cubXNnX2ZsYWdzID0gMDsKLQotICBHUFJfVElNRVJfQkVHSU4oInJlY3Ztc2ciLCAxKTsKLSAgZG8gewotICAgIHJlYWRfYnl0ZXMgPSByZWN2bXNnKHRjcC0+ZmQsICZtc2csIDApOwotICB9IHdoaWxlIChyZWFkX2J5dGVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gIEdQUl9USU1FUl9FTkQoInJlY3Ztc2ciLCAwKTsKLQotICBpZiAocmVhZF9ieXRlcyA8IDApIHsKLSAgICAvKiBOQjogQWZ0ZXIgY2FsbGluZyBjYWxsX3JlYWRfY2IgYSBwYXJhbGxlbCBjYWxsIG9mIHRoZSByZWFkIGhhbmRsZXIgbWF5Ci0gICAgICogYmUgcnVubmluZy4gKi8KLSAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7Ci0gICAgICBpZiAodGNwLT5pb3Zfc2l6ZSA+IDEpIHsKLSAgICAgICAgdGNwLT5pb3Zfc2l6ZSAvPSAyOwotICAgICAgfQotICAgICAgLyogV2UndmUgY29uc3VtZWQgdGhlIGVkZ2UsIHJlcXVlc3QgYSBuZXcgb25lICovCi0gICAgICBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCB0Y3AtPmVtX2ZkLCAmdGNwLT5yZWFkX2Nsb3N1cmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBUT0RPKGtsZW1wbmVyKTogTG9nIGludGVyZXN0aW5nIGVycm9ycyAqLwotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYodGNwLT5pbmNvbWluZ19idWZmZXIpOwotICAgICAgY2FsbF9yZWFkX2NiKGV4ZWNfY3R4LCB0Y3AsIDApOwotICAgICAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJyZWFkIik7Ci0gICAgfQotICB9IGVsc2UgaWYgKHJlYWRfYnl0ZXMgPT0gMCkgewotICAgIC8qIDAgcmVhZCBzaXplID09PiBlbmQgb2Ygc3RyZWFtICovCi0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYodGNwLT5pbmNvbWluZ19idWZmZXIpOwotICAgIGNhbGxfcmVhZF9jYihleGVjX2N0eCwgdGNwLCAwKTsKLSAgICBUQ1BfVU5SRUYoZXhlY19jdHgsIHRjcCwgInJlYWQiKTsKLSAgfSBlbHNlIHsKLSAgICBHUFJfQVNTRVJUKChzaXplX3QpcmVhZF9ieXRlcyA8PSB0Y3AtPmluY29taW5nX2J1ZmZlci0+bGVuZ3RoKTsKLSAgICBpZiAoKHNpemVfdClyZWFkX2J5dGVzIDwgdGNwLT5pbmNvbWluZ19idWZmZXItPmxlbmd0aCkgewotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl90cmltX2VuZCgKLSAgICAgICAgICB0Y3AtPmluY29taW5nX2J1ZmZlciwKLSAgICAgICAgICB0Y3AtPmluY29taW5nX2J1ZmZlci0+bGVuZ3RoIC0gKHNpemVfdClyZWFkX2J5dGVzLAotICAgICAgICAgICZ0Y3AtPmxhc3RfcmVhZF9idWZmZXIpOwotICAgIH0gZWxzZSBpZiAodGNwLT5pb3Zfc2l6ZSA8IE1BWF9SRUFEX0lPVkVDKSB7Ci0gICAgICArK3RjcC0+aW92X3NpemU7Ci0gICAgfQotICAgIEdQUl9BU1NFUlQoKHNpemVfdClyZWFkX2J5dGVzID09IHRjcC0+aW5jb21pbmdfYnVmZmVyLT5sZW5ndGgpOwotICAgIGNhbGxfcmVhZF9jYihleGVjX2N0eCwgdGNwLCAxKTsKLSAgICBUQ1BfVU5SRUYoZXhlY19jdHgsIHRjcCwgInJlYWQiKTsKLSAgfQotCi0gIEdQUl9USU1FUl9FTkQoInRjcF9jb250aW51ZV9yZWFkIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRjcF9oYW5kbGVfcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnIC8qIGdycGNfdGNwICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopYXJnOwotICBHUFJfQVNTRVJUKCF0Y3AtPmZpbmlzaGVkX2VkZ2UpOwotCi0gIGlmICghc3VjY2VzcykgewotICAgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKHRjcC0+aW5jb21pbmdfYnVmZmVyKTsKLSAgICBjYWxsX3JlYWRfY2IoZXhlY19jdHgsIHRjcCwgMCk7Ci0gICAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJyZWFkIik7Ci0gIH0gZWxzZSB7Ci0gICAgdGNwX2NvbnRpbnVlX3JlYWQoZXhlY19jdHgsIHRjcCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgdGNwX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqaW5jb21pbmdfYnVmZmVyLCBncnBjX2Nsb3N1cmUgKmNiKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgR1BSX0FTU0VSVCh0Y3AtPnJlYWRfY2IgPT0gTlVMTCk7Ci0gIHRjcC0+cmVhZF9jYiA9IGNiOwotICB0Y3AtPmluY29taW5nX2J1ZmZlciA9IGluY29taW5nX2J1ZmZlcjsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoaW5jb21pbmdfYnVmZmVyKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9zd2FwKGluY29taW5nX2J1ZmZlciwgJnRjcC0+bGFzdF9yZWFkX2J1ZmZlcik7Ci0gIFRDUF9SRUYodGNwLCAicmVhZCIpOwotICBpZiAodGNwLT5maW5pc2hlZF9lZGdlKSB7Ci0gICAgdGNwLT5maW5pc2hlZF9lZGdlID0gMDsKLSAgICBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCB0Y3AtPmVtX2ZkLCAmdGNwLT5yZWFkX2Nsb3N1cmUpOwotICB9IGVsc2UgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJnRjcC0+cmVhZF9jbG9zdXJlLCB0cnVlLCBOVUxMKTsKLSAgfQotfQotCi10eXBlZGVmIGVudW0geyBGTFVTSF9ET05FLCBGTFVTSF9QRU5ESU5HLCBGTFVTSF9FUlJPUiB9IGZsdXNoX3Jlc3VsdDsKLQotI2RlZmluZSBNQVhfV1JJVEVfSU9WRUMgMTYKLXN0YXRpYyBmbHVzaF9yZXN1bHQgdGNwX2ZsdXNoKGdycGNfdGNwICp0Y3ApIHsKLSAgc3RydWN0IG1zZ2hkciBtc2c7Ci0gIHN0cnVjdCBpb3ZlYyBpb3ZbTUFYX1dSSVRFX0lPVkVDXTsKLSAgbXNnX2lvdmxlbl90eXBlIGlvdl9zaXplOwotICBzc2l6ZV90IHNlbnRfbGVuZ3RoOwotICBzaXplX3Qgc2VuZGluZ19sZW5ndGg7Ci0gIHNpemVfdCB0cmFpbGluZzsKLSAgc2l6ZV90IHVud2luZF9zbGljZV9pZHg7Ci0gIHNpemVfdCB1bndpbmRfYnl0ZV9pZHg7Ci0KLSAgZm9yICg7OykgewotICAgIHNlbmRpbmdfbGVuZ3RoID0gMDsKLSAgICB1bndpbmRfc2xpY2VfaWR4ID0gdGNwLT5vdXRnb2luZ19zbGljZV9pZHg7Ci0gICAgdW53aW5kX2J5dGVfaWR4ID0gdGNwLT5vdXRnb2luZ19ieXRlX2lkeDsKLSAgICBmb3IgKGlvdl9zaXplID0gMDsgdGNwLT5vdXRnb2luZ19zbGljZV9pZHggIT0gdGNwLT5vdXRnb2luZ19idWZmZXItPmNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgIGlvdl9zaXplICE9IE1BWF9XUklURV9JT1ZFQzsKLSAgICAgICAgIGlvdl9zaXplKyspIHsKLSAgICAgIGlvdltpb3Zfc2l6ZV0uaW92X2Jhc2UgPQotICAgICAgICAgIEdQUl9TTElDRV9TVEFSVF9QVFIoCi0gICAgICAgICAgICAgIHRjcC0+b3V0Z29pbmdfYnVmZmVyLT5zbGljZXNbdGNwLT5vdXRnb2luZ19zbGljZV9pZHhdKSArCi0gICAgICAgICAgdGNwLT5vdXRnb2luZ19ieXRlX2lkeDsKLSAgICAgIGlvdltpb3Zfc2l6ZV0uaW92X2xlbiA9Ci0gICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSCgKLSAgICAgICAgICAgICAgdGNwLT5vdXRnb2luZ19idWZmZXItPnNsaWNlc1t0Y3AtPm91dGdvaW5nX3NsaWNlX2lkeF0pIC0KLSAgICAgICAgICB0Y3AtPm91dGdvaW5nX2J5dGVfaWR4OwotICAgICAgc2VuZGluZ19sZW5ndGggKz0gaW92W2lvdl9zaXplXS5pb3ZfbGVuOwotICAgICAgdGNwLT5vdXRnb2luZ19zbGljZV9pZHgrKzsKLSAgICAgIHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHggPSAwOwotICAgIH0KLSAgICBHUFJfQVNTRVJUKGlvdl9zaXplID4gMCk7Ci0KLSAgICBtc2cubXNnX25hbWUgPSBOVUxMOwotICAgIG1zZy5tc2dfbmFtZWxlbiA9IDA7Ci0gICAgbXNnLm1zZ19pb3YgPSBpb3Y7Ci0gICAgbXNnLm1zZ19pb3ZsZW4gPSBpb3Zfc2l6ZTsKLSAgICBtc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0gICAgbXNnLm1zZ19mbGFncyA9IDA7Ci0KLSAgICBHUFJfVElNRVJfQkVHSU4oInNlbmRtc2ciLCAxKTsKLSAgICBkbyB7Ci0gICAgICAvKiBUT0RPKGtsZW1wbmVyKTogQ29yayBpZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSAqLwotICAgICAgc2VudF9sZW5ndGggPSBzZW5kbXNnKHRjcC0+ZmQsICZtc2csIFNFTkRNU0dfRkxBR1MpOwotICAgIH0gd2hpbGUgKHNlbnRfbGVuZ3RoIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgR1BSX1RJTUVSX0VORCgic2VuZG1zZyIsIDApOwotCi0gICAgaWYgKHNlbnRfbGVuZ3RoIDwgMCkgewotICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgewotICAgICAgICB0Y3AtPm91dGdvaW5nX3NsaWNlX2lkeCA9IHVud2luZF9zbGljZV9pZHg7Ci0gICAgICAgIHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHggPSB1bndpbmRfYnl0ZV9pZHg7Ci0gICAgICAgIHJldHVybiBGTFVTSF9QRU5ESU5HOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogVE9ETyhrbGVtcG5lcik6IExvZyBzb21lIG9mIHRoZXNlICovCi0gICAgICAgIHJldHVybiBGTFVTSF9FUlJPUjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBHUFJfQVNTRVJUKHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHggPT0gMCk7Ci0gICAgdHJhaWxpbmcgPSBzZW5kaW5nX2xlbmd0aCAtIChzaXplX3Qpc2VudF9sZW5ndGg7Ci0gICAgd2hpbGUgKHRyYWlsaW5nID4gMCkgewotICAgICAgc2l6ZV90IHNsaWNlX2xlbmd0aDsKLQotICAgICAgdGNwLT5vdXRnb2luZ19zbGljZV9pZHgtLTsKLSAgICAgIHNsaWNlX2xlbmd0aCA9IEdQUl9TTElDRV9MRU5HVEgoCi0gICAgICAgICAgdGNwLT5vdXRnb2luZ19idWZmZXItPnNsaWNlc1t0Y3AtPm91dGdvaW5nX3NsaWNlX2lkeF0pOwotICAgICAgaWYgKHNsaWNlX2xlbmd0aCA+IHRyYWlsaW5nKSB7Ci0gICAgICAgIHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHggPSBzbGljZV9sZW5ndGggLSB0cmFpbGluZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cmFpbGluZyAtPSBzbGljZV9sZW5ndGg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHRjcC0+b3V0Z29pbmdfc2xpY2VfaWR4ID09IHRjcC0+b3V0Z29pbmdfYnVmZmVyLT5jb3VudCkgewotICAgICAgcmV0dXJuIEZMVVNIX0RPTkU7Ci0gICAgfQotICB9OwotfQotCi1zdGF0aWMgdm9pZCB0Y3BfaGFuZGxlX3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcgLyogZ3JwY190Y3AgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopYXJnOwotICBmbHVzaF9yZXN1bHQgc3RhdHVzOwotICBncnBjX2Nsb3N1cmUgKmNiOwotCi0gIGlmICghc3VjY2VzcykgewotICAgIGNiID0gdGNwLT53cml0ZV9jYjsKLSAgICB0Y3AtPndyaXRlX2NiID0gTlVMTDsKLSAgICBjYi0+Y2IoZXhlY19jdHgsIGNiLT5jYl9hcmcsIDApOwotICAgIFRDUF9VTlJFRihleGVjX2N0eCwgdGNwLCAid3JpdGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGF0dXMgPSB0Y3BfZmx1c2godGNwKTsKLSAgaWYgKHN0YXR1cyA9PSBGTFVTSF9QRU5ESU5HKSB7Ci0gICAgZ3JwY19mZF9ub3RpZnlfb25fd3JpdGUoZXhlY19jdHgsIHRjcC0+ZW1fZmQsICZ0Y3AtPndyaXRlX2Nsb3N1cmUpOwotICB9IGVsc2UgewotICAgIGNiID0gdGNwLT53cml0ZV9jYjsKLSAgICB0Y3AtPndyaXRlX2NiID0gTlVMTDsKLSAgICBHUFJfVElNRVJfQkVHSU4oInRjcF9oYW5kbGVfd3JpdGUuY2IiLCAwKTsKLSAgICBjYi0+Y2IoZXhlY19jdHgsIGNiLT5jYl9hcmcsIHN0YXR1cyA9PSBGTFVTSF9ET05FKTsKLSAgICBHUFJfVElNRVJfRU5EKCJ0Y3BfaGFuZGxlX3dyaXRlLmNiIiwgMCk7Ci0gICAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJ3cml0ZSIpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHRjcF93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqYnVmLCBncnBjX2Nsb3N1cmUgKmNiKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgZmx1c2hfcmVzdWx0IHN0YXR1czsKLQotICBpZiAoZ3JwY190Y3BfdHJhY2UpIHsKLSAgICBzaXplX3QgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBidWYtPmNvdW50OyBpKyspIHsKLSAgICAgIGNoYXIgKmRhdGEgPQotICAgICAgICAgIGdwcl9kdW1wX3NsaWNlKGJ1Zi0+c2xpY2VzW2ldLCBHUFJfRFVNUF9IRVggfCBHUFJfRFVNUF9BU0NJSSk7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywgIldSSVRFICVwOiAlcyIsIHRjcCwgZGF0YSk7Ci0gICAgICBncHJfZnJlZShkYXRhKTsKLSAgICB9Ci0gIH0KLQotICBHUFJfVElNRVJfQkVHSU4oInRjcF93cml0ZSIsIDApOwotICBHUFJfQVNTRVJUKHRjcC0+d3JpdGVfY2IgPT0gTlVMTCk7Ci0KLSAgaWYgKGJ1Zi0+bGVuZ3RoID09IDApIHsKLSAgICBHUFJfVElNRVJfRU5EKCJ0Y3Bfd3JpdGUiLCAwKTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCB0cnVlLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgdGNwLT5vdXRnb2luZ19idWZmZXIgPSBidWY7Ci0gIHRjcC0+b3V0Z29pbmdfc2xpY2VfaWR4ID0gMDsKLSAgdGNwLT5vdXRnb2luZ19ieXRlX2lkeCA9IDA7Ci0KLSAgc3RhdHVzID0gdGNwX2ZsdXNoKHRjcCk7Ci0gIGlmIChzdGF0dXMgPT0gRkxVU0hfUEVORElORykgewotICAgIFRDUF9SRUYodGNwLCAid3JpdGUiKTsKLSAgICB0Y3AtPndyaXRlX2NiID0gY2I7Ci0gICAgZ3JwY19mZF9ub3RpZnlfb25fd3JpdGUoZXhlY19jdHgsIHRjcC0+ZW1fZmQsICZ0Y3AtPndyaXRlX2Nsb3N1cmUpOwotICB9IGVsc2UgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2IsIHN0YXR1cyA9PSBGTFVTSF9ET05FLCBOVUxMKTsKLSAgfQotCi0gIEdQUl9USU1FUl9FTkQoInRjcF93cml0ZSIsIDApOwotfQotCi1zdGF0aWMgdm9pZCB0Y3BfYWRkX3RvX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7Ci0gIGdycGNfcG9sbHNldF9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXQsIHRjcC0+ZW1fZmQpOwotfQotCi1zdGF0aWMgdm9pZCB0Y3BfYWRkX3RvX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpIHsKLSAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOwotICBncnBjX3BvbGxzZXRfc2V0X2FkZF9mZChleGVjX2N0eCwgcG9sbHNldF9zZXQsIHRjcC0+ZW1fZmQpOwotfQotCi1zdGF0aWMgY2hhciAqdGNwX2dldF9wZWVyKGdycGNfZW5kcG9pbnQgKmVwKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgcmV0dXJuIGdwcl9zdHJkdXAodGNwLT5wZWVyX3N0cmluZyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBncnBjX2VuZHBvaW50X3Z0YWJsZSB2dGFibGUgPSB7Ci0gICAgdGNwX3JlYWQsICAgICB0Y3Bfd3JpdGUsICAgdGNwX2FkZF90b19wb2xsc2V0LCB0Y3BfYWRkX3RvX3BvbGxzZXRfc2V0LAotICAgIHRjcF9zaHV0ZG93biwgdGNwX2Rlc3Ryb3ksIHRjcF9nZXRfcGVlcn07Ci0KLWdycGNfZW5kcG9pbnQgKmdycGNfdGNwX2NyZWF0ZShncnBjX2ZkICplbV9mZCwgc2l6ZV90IHNsaWNlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGVlcl9zdHJpbmcpIHsKLSAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfdGNwKSk7Ci0gIHRjcC0+YmFzZS52dGFibGUgPSAmdnRhYmxlOwotICB0Y3AtPnBlZXJfc3RyaW5nID0gZ3ByX3N0cmR1cChwZWVyX3N0cmluZyk7Ci0gIHRjcC0+ZmQgPSBlbV9mZC0+ZmQ7Ci0gIHRjcC0+cmVhZF9jYiA9IE5VTEw7Ci0gIHRjcC0+d3JpdGVfY2IgPSBOVUxMOwotICB0Y3AtPnJlbGVhc2VfZmRfY2IgPSBOVUxMOwotICB0Y3AtPnJlbGVhc2VfZmQgPSBOVUxMOwotICB0Y3AtPmluY29taW5nX2J1ZmZlciA9IE5VTEw7Ci0gIHRjcC0+c2xpY2Vfc2l6ZSA9IHNsaWNlX3NpemU7Ci0gIHRjcC0+aW92X3NpemUgPSAxOwotICB0Y3AtPmZpbmlzaGVkX2VkZ2UgPSAxOwotICAvKiBwYWlyZWQgd2l0aCB1bnJlZiBpbiBncnBjX3RjcF9kZXN0cm95ICovCi0gIGdwcl9yZWZfaW5pdCgmdGNwLT5yZWZjb3VudCwgMSk7Ci0gIHRjcC0+ZW1fZmQgPSBlbV9mZDsKLSAgdGNwLT5yZWFkX2Nsb3N1cmUuY2IgPSB0Y3BfaGFuZGxlX3JlYWQ7Ci0gIHRjcC0+cmVhZF9jbG9zdXJlLmNiX2FyZyA9IHRjcDsKLSAgdGNwLT53cml0ZV9jbG9zdXJlLmNiID0gdGNwX2hhbmRsZV93cml0ZTsKLSAgdGNwLT53cml0ZV9jbG9zdXJlLmNiX2FyZyA9IHRjcDsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0Y3AtPmxhc3RfcmVhZF9idWZmZXIpOwotCi0gIHJldHVybiAmdGNwLT5iYXNlOwotfQotCi1pbnQgZ3JwY190Y3BfZmQoZ3JwY19lbmRwb2ludCAqZXApIHsKLSAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOwotICBHUFJfQVNTRVJUKGVwLT52dGFibGUgPT0gJnZ0YWJsZSk7Ci0gIHJldHVybiBncnBjX2ZkX3dyYXBwZWRfZmQodGNwLT5lbV9mZCk7Ci19Ci0KLXZvaWQgZ3JwY190Y3BfZGVzdHJveV9hbmRfcmVsZWFzZV9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmZCwgZ3JwY19jbG9zdXJlICpkb25lKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgR1BSX0FTU0VSVChlcC0+dnRhYmxlID09ICZ2dGFibGUpOwotICB0Y3AtPnJlbGVhc2VfZmQgPSBmZDsKLSAgdGNwLT5yZWxlYXNlX2ZkX2NiID0gZG9uZTsKLSAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJkZXN0cm95Iik7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmggYi9zcmMvY29yZS9pb21nci90Y3BfcG9zaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0NmVjNS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci90Y3BfcG9zaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1RDUF9QT1NJWF9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9UQ1BfUE9TSVhfSAotLyoKLSAgIExvdyBsZXZlbCBUQ1AgImJvdHRvbSBoYWxmIiBpbXBsZW1lbnRhdGlvbiwgZm9yIHVzZSBieSB0cmFuc3BvcnRzIGJ1aWx0IG9uCi0gICB0b3Agb2YgYSBUQ1AgY29ubmVjdGlvbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZmlsZSBkb2VzIG5vdCAoeWV0KSBpbmNsdWRlIEFQSXMgZm9yIGNyZWF0aW5nIHRoZSBzb2NrZXQgaW4KLSAgIHRoZSBmaXJzdCBwbGFjZS4KLQotICAgQWxsIGNhbGxzIHBhc3Npbmcgc2xpY2UgdHJhbnNmZXIgb3duZXJzaGlwIG9mIGEgc2xpY2UgcmVmY291bnQgdW5sZXNzCi0gICBvdGhlcndpc2Ugc3BlY2lmaWVkLgotKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIKLQotI2RlZmluZSBHUlBDX1RDUF9ERUZBVUxUX1JFQURfU0xJQ0VfU0laRSA4MTkyCi0KLWV4dGVybiBpbnQgZ3JwY190Y3BfdHJhY2U7Ci0KLS8qIENyZWF0ZSBhIHRjcCBlbmRwb2ludCBnaXZlbiBhIGZpbGUgZGVzY2lwdG9yIGFuZCBhIHJlYWQgc2xpY2Ugc2l6ZS4KLSAgIFRha2VzIG93bmVyc2hpcCBvZiBmZC4gKi8KLWdycGNfZW5kcG9pbnQgKmdycGNfdGNwX2NyZWF0ZShncnBjX2ZkICpmZCwgc2l6ZV90IHJlYWRfc2xpY2Vfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwZWVyX3N0cmluZyk7Ci0KLS8qIFJldHVybiB0aGUgdGNwIGVuZHBvaW50J3MgZmQsIG9yIC0xIGlmIHRoaXMgaXMgbm90IGF2YWlsYWJsZS4gRG9lcyBub3QKLSAgIHJlbGVhc2UgdGhlIGZkLgotICAgUmVxdWlyZXM6IGVwIG11c3QgYmUgYSB0Y3AgZW5kcG9pbnQuCi0gKi8KLWludCBncnBjX3RjcF9mZChncnBjX2VuZHBvaW50ICplcCk7Ci0KLS8qIERlc3Ryb3kgdGhlIHRjcCBlbmRwb2ludCB3aXRob3V0IGNsb3NpbmcgaXRzIGZkLiAqZmQgd2lsbCBiZSBzZXQgYW5kIGRvbmUKLSAqIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGVuZHBvaW50IGlzIGRlc3Ryb3llZC4KLSAqIFJlcXVpcmVzOiBlcCBtdXN0IGJlIGEgdGNwIGVuZHBvaW50IGFuZCBmZCBtdXN0IG5vdCBiZSBOVUxMLiAqLwotdm9pZCBncnBjX3RjcF9kZXN0cm95X2FuZF9yZWxlYXNlX2ZkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZkLCBncnBjX2Nsb3N1cmUgKmRvbmUpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1RDUF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmggYi9zcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjQ3ZTkuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1RDUF9TRVJWRVJfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfVENQX1NFUlZFUl9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIKLQotLyogRm9yd2FyZCBkZWNsIG9mIGdycGNfdGNwX3NlcnZlciAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190Y3Bfc2VydmVyIGdycGNfdGNwX3NlcnZlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yIHsKLSAgLyogZ3JwY190Y3Bfc2VydmVyX2NiIGZ1bmN0aW9ucyBzaGFyZSBhIHJlZiBvbiBmcm9tX3NlcnZlciB0aGF0IGlzIHZhbGlkCi0gICAgIHVudGlsIHRoZSBmdW5jdGlvbiByZXR1cm5zLiAqLwotICBncnBjX3RjcF9zZXJ2ZXIgKmZyb21fc2VydmVyOwotICAvKiBJbmRpY2VzIHRoYXQgbWF5IGJlIHBhc3NlZCB0byBncnBjX3RjcF9zZXJ2ZXJfcG9ydF9mZCgpLiAqLwotICB1bnNpZ25lZCBwb3J0X2luZGV4OwotICB1bnNpZ25lZCBmZF9pbmRleDsKLX0gZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yOwotCi0vKiBDYWxsZWQgZm9yIG5ld2x5IGNvbm5lY3RlZCBUQ1AgY29ubmVjdGlvbnMuICovCi10eXBlZGVmIHZvaWQgKCpncnBjX3RjcF9zZXJ2ZXJfY2IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKmVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgKmFjY2VwdG9yKTsKLQotLyogQ3JlYXRlIGEgc2VydmVyLCBpbml0aWFsbHkgbm90IGJvdW5kIHRvIGFueSBwb3J0cy4gVGhlIGNhbGxlciBvd25zIG9uZSByZWYuCi0gICBJZiBzaHV0ZG93bl9jb21wbGV0ZSBpcyBub3QgTlVMTCwgaXQgd2lsbCBiZSB1c2VkIGJ5Ci0gICBncnBjX3RjcF9zZXJ2ZXJfdW5yZWYoKSB3aGVuIHRoZSByZWYgY291bnQgcmVhY2hlcyB6ZXJvLiAqLwotZ3JwY190Y3Bfc2VydmVyICpncnBjX3RjcF9zZXJ2ZXJfY3JlYXRlKGdycGNfY2xvc3VyZSAqc2h1dGRvd25fY29tcGxldGUpOwotCi0vKiBTdGFydCBsaXN0ZW5pbmcgdG8gYm91bmQgcG9ydHMgKi8KLXZvaWQgZ3JwY190Y3Bfc2VydmVyX3N0YXJ0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RjcF9zZXJ2ZXIgKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzLCBzaXplX3QgcG9sbHNldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9jYiBvbl9hY2NlcHRfY2IsIHZvaWQgKmNiX2FyZyk7Ci0KLS8qIEFkZCBhIHBvcnQgdG8gdGhlIHNlcnZlciwgcmV0dXJuaW5nIHRoZSBuZXdseSBhbGxvY2F0ZWQgcG9ydCBvbiBzdWNjZXNzLCBvcgotICAgLTEgb24gZmFpbHVyZS4KLQotICAgVGhlIDo6IGFuZCAwLjAuMC4wIHdpbGRjYXJkIGFkZHJlc3NlcyBhcmUgdHJlYXRlZCBpZGVudGljYWxseSwgYWNjZXB0aW5nCi0gICBib3RoIElQdjQgYW5kIElQdjYgY29ubmVjdGlvbnMsIGJ1dCA6OiBpcyB0aGUgcHJlZmVycmVkIHN0eWxlLiAgVGhpcyB1c3VhbGx5Ci0gICBjcmVhdGVzIG9uZSBzb2NrZXQsIGJ1dCBwb3NzaWJseSB0d28gb24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IElQdjYsCi0gICBidXQgbm90IGR1YWxzdGFjayBzb2NrZXRzLiAqLwotLyogVE9ETyhjdGlsbGVyKTogZGVwcmVjYXRlIHRoaXMsIGFuZCBtYWtlIGdycGNfdGNwX3NlcnZlcl9hZGRfcG9ydHMgdG8gaGFuZGxlCi0gICAgICAgICAgICAgICAgICBhbGwgb2YgdGhlIG11bHRpcGxlIHNvY2tldCBwb3J0IG1hdGNoaW5nIGxvZ2ljIGluIG9uZSBwbGFjZSAqLwotaW50IGdycGNfdGNwX3NlcnZlcl9hZGRfcG9ydChncnBjX3RjcF9zZXJ2ZXIgKnMsIGNvbnN0IHZvaWQgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZGRyX2xlbik7Ci0KLS8qIE51bWJlciBvZiBmZHMgYXQgdGhlIGdpdmVuIHBvcnRfaW5kZXgsIG9yIDAgaWYgcG9ydF9pbmRleCBpcyBvdXQgb2YKLSAgIGJvdW5kcy4gKi8KLXVuc2lnbmVkIGdycGNfdGNwX3NlcnZlcl9wb3J0X2ZkX2NvdW50KGdycGNfdGNwX3NlcnZlciAqcywgdW5zaWduZWQgcG9ydF9pbmRleCk7Ci0KLS8qIFJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgTXRoIChmZF9pbmRleCkgbGlzdGVuaW5nIHNvY2tldCBvZiB0aGUgTnRoCi0gICAocG9ydF9pbmRleCkgY2FsbCB0byBhZGRfcG9ydCgpIG9uIHRoaXMgc2VydmVyLCBvciAtMSBpZiB0aGUgaW5kaWNlcyBhcmUgb3V0Ci0gICBvZiBib3VuZHMuIFRoZSBmaWxlIGRlc2NyaXB0b3IgcmVtYWlucyBvd25lZCBieSB0aGUgc2VydmVyLCBhbmQgd2lsbCBiZQotICAgY2xlYW5lZCB1cCB3aGVuIHRoZSByZWYgY291bnQgcmVhY2hlcyB6ZXJvLiAqLwotaW50IGdycGNfdGNwX3NlcnZlcl9wb3J0X2ZkKGdycGNfdGNwX3NlcnZlciAqcywgdW5zaWduZWQgcG9ydF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmZF9pbmRleCk7Ci0KLS8qIFJlZiBzIGFuZCByZXR1cm4gcy4gKi8KLWdycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX3JlZihncnBjX3RjcF9zZXJ2ZXIgKnMpOwotCi0vKiBzaHV0ZG93bl9zdGFydGluZyBpcyBjYWxsZWQgd2hlbiByZWYgY291bnQgaGFzIHJlYWNoZWQgemVybyBhbmQgdGhlIHNlcnZlciBpcwotICAgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiBUaGUgc2VydmVyIHdpbGwgYmUgZGVsZXRlZCBhZnRlciBpdCByZXR1cm5zLiBDYWxsaW5nCi0gICBncnBjX3RjcF9zZXJ2ZXJfcmVmKCkgZnJvbSBpdCBoYXMgbm8gZWZmZWN0LiAqLwotdm9pZCBncnBjX3RjcF9zZXJ2ZXJfc2h1dGRvd25fc3RhcnRpbmdfYWRkKGdycGNfdGNwX3NlcnZlciAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKnNodXRkb3duX3N0YXJ0aW5nKTsKLQotLyogSWYgdGhlIHJlZmNvdW50IGRyb3BzIHRvIHplcm8sIGRlbGV0ZSBzLCBhbmQgY2FsbCAoZXhlY19jdHg9PU5VTEwpIG9yIGVucXVldWUKLSAgIGEgY2FsbCAoZXhlY19jdHghPU5VTEwpIHRvIHNodXRkb3duX2NvbXBsZXRlLiAqLwotdm9pZCBncnBjX3RjcF9zZXJ2ZXJfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqcyk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfVENQX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWU2OGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLS8qIEZJWE1FOiAicG9zaXgiIGZpbGVzIHNob3VsZG4ndCBiZSBkZXBlbmRpbmcgb24gX0dOVV9TT1VSQ0UgKi8KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9QT1NJWF9TT0NLRVQKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi0jZGVmaW5lIE1JTl9TQUZFX0FDQ0VQVF9RVUVVRV9TSVpFIDEwMAotCi1zdGF0aWMgZ3ByX29uY2Ugc19pbml0X21heF9hY2NlcHRfcXVldWVfc2l6ZTsKLXN0YXRpYyBpbnQgc19tYXhfYWNjZXB0X3F1ZXVlX3NpemU7Ci0KLS8qIG9uZSBsaXN0ZW5pbmcgcG9ydCAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190Y3BfbGlzdGVuZXIgZ3JwY190Y3BfbGlzdGVuZXI7Ci1zdHJ1Y3QgZ3JwY190Y3BfbGlzdGVuZXIgewotICBpbnQgZmQ7Ci0gIGdycGNfZmQgKmVtZmQ7Ci0gIGdycGNfdGNwX3NlcnZlciAqc2VydmVyOwotICB1bmlvbiB7Ci0gICAgdWludDhfdCB1bnR5cGVkW0dSUENfTUFYX1NPQ0tBRERSX1NJWkVdOwotICAgIHN0cnVjdCBzb2NrYWRkciBzb2NrYWRkcjsKLSAgfSBhZGRyOwotICBzaXplX3QgYWRkcl9sZW47Ci0gIGludCBwb3J0OwotICB1bnNpZ25lZCBwb3J0X2luZGV4OwotICB1bnNpZ25lZCBmZF9pbmRleDsKLSAgZ3JwY19jbG9zdXJlIHJlYWRfY2xvc3VyZTsKLSAgZ3JwY19jbG9zdXJlIGRlc3Ryb3llZF9jbG9zdXJlOwotICBzdHJ1Y3QgZ3JwY190Y3BfbGlzdGVuZXIgKm5leHQ7Ci0gIC8qIFdoZW4gd2UgYWRkIGEgbGlzdGVuZXIsIG1vcmUgdGhhbiBvbmUgY2FuIGJlIGNyZWF0ZWQsIG1haW5seSBiZWNhdXNlIG9mCi0gICAgIElQdjYuIEEgc2libGluZyB3aWxsIHN0aWxsIGJlIGluIHRoZSBub3JtYWwgbGlzdCwgYnV0IHdpbGwgYmUgZmxhZ2dlZAotICAgICBhcyBzdWNoLiBBbnkgYWN0aW9uLCBzdWNoIGFzIHJlZiBvciB1bnJlZiwgd2lsbCBhZmZlY3QgYWxsIG9mIHRoZQotICAgICBzaWJsaW5ncyBpbiB0aGUgbGlzdC4gKi8KLSAgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyICpzaWJsaW5nOwotICBpbnQgaXNfc2libGluZzsKLX07Ci0KLS8qIHRoZSBvdmVyYWxsIHNlcnZlciAqLwotc3RydWN0IGdycGNfdGNwX3NlcnZlciB7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotICAvKiBDYWxsZWQgd2hlbmV2ZXIgYWNjZXB0KCkgc3VjY2VlZHMgb24gYSBzZXJ2ZXIgcG9ydC4gKi8KLSAgZ3JwY190Y3Bfc2VydmVyX2NiIG9uX2FjY2VwdF9jYjsKLSAgdm9pZCAqb25fYWNjZXB0X2NiX2FyZzsKLQotICBncHJfbXUgbXU7Ci0KLSAgLyogYWN0aXZlIHBvcnQgY291bnQ6IGhvdyBtYW55IHBvcnRzIGFyZSBhY3R1YWxseSBzdGlsbCBsaXN0ZW5pbmcgKi8KLSAgc2l6ZV90IGFjdGl2ZV9wb3J0czsKLSAgLyogZGVzdHJveWVkIHBvcnQgY291bnQ6IGhvdyBtYW55IHBvcnRzIGFyZSBjb21wbGV0ZWx5IGRlc3Ryb3llZCAqLwotICBzaXplX3QgZGVzdHJveWVkX3BvcnRzOwotCi0gIC8qIGlzIHRoaXMgc2VydmVyIHNodXR0aW5nIGRvd24/IChib29sZWFuKSAqLwotICBpbnQgc2h1dGRvd247Ci0KLSAgLyogbGlua2VkIGxpc3Qgb2Ygc2VydmVyIHBvcnRzICovCi0gIGdycGNfdGNwX2xpc3RlbmVyICpoZWFkOwotICBncnBjX3RjcF9saXN0ZW5lciAqdGFpbDsKLSAgdW5zaWduZWQgbnBvcnRzOwotCi0gIC8qIExpc3Qgb2YgY2xvc3VyZXMgcGFzc2VkIHRvIHNodXRkb3duX3N0YXJ0aW5nX2FkZCgpLiAqLwotICBncnBjX2Nsb3N1cmVfbGlzdCBzaHV0ZG93bl9zdGFydGluZzsKLQotICAvKiBzaHV0ZG93biBjYWxsYmFjayAqLwotICBncnBjX2Nsb3N1cmUgKnNodXRkb3duX2NvbXBsZXRlOwotCi0gIC8qIGFsbCBwb2xsc2V0cyBpbnRlcmVzdGVkIGluIG5ldyBjb25uZWN0aW9ucyAqLwotICBncnBjX3BvbGxzZXQgKipwb2xsc2V0czsKLSAgLyogbnVtYmVyIG9mIHBvbGxzZXRzIGluIHRoZSBwb2xsc2V0cyBhcnJheSAqLwotICBzaXplX3QgcG9sbHNldF9jb3VudDsKLX07Ci0KLWdycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX2NyZWF0ZShncnBjX2Nsb3N1cmUgKnNodXRkb3duX2NvbXBsZXRlKSB7Ci0gIGdycGNfdGNwX3NlcnZlciAqcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfdGNwX3NlcnZlcikpOwotICBncHJfcmVmX2luaXQoJnMtPnJlZnMsIDEpOwotICBncHJfbXVfaW5pdCgmcy0+bXUpOwotICBzLT5hY3RpdmVfcG9ydHMgPSAwOwotICBzLT5kZXN0cm95ZWRfcG9ydHMgPSAwOwotICBzLT5zaHV0ZG93biA9IDA7Ci0gIHMtPnNodXRkb3duX3N0YXJ0aW5nLmhlYWQgPSBOVUxMOwotICBzLT5zaHV0ZG93bl9zdGFydGluZy50YWlsID0gTlVMTDsKLSAgcy0+c2h1dGRvd25fY29tcGxldGUgPSBzaHV0ZG93bl9jb21wbGV0ZTsKLSAgcy0+b25fYWNjZXB0X2NiID0gTlVMTDsKLSAgcy0+b25fYWNjZXB0X2NiX2FyZyA9IE5VTEw7Ci0gIHMtPmhlYWQgPSBOVUxMOwotICBzLT50YWlsID0gTlVMTDsKLSAgcy0+bnBvcnRzID0gMDsKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmlzaF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7Ci0gIGlmIChzLT5zaHV0ZG93bl9jb21wbGV0ZSAhPSBOVUxMKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBzLT5zaHV0ZG93bl9jb21wbGV0ZSwgdHJ1ZSwgTlVMTCk7Ci0gIH0KLQotICBncHJfbXVfZGVzdHJveSgmcy0+bXUpOwotCi0gIHdoaWxlIChzLT5oZWFkKSB7Ci0gICAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwID0gcy0+aGVhZDsKLSAgICBzLT5oZWFkID0gc3AtPm5leHQ7Ci0gICAgZ3ByX2ZyZWUoc3ApOwotICB9Ci0KLSAgZ3ByX2ZyZWUocyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3llZF9wb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY190Y3Bfc2VydmVyICpzID0gc2VydmVyOwotICBncHJfbXVfbG9jaygmcy0+bXUpOwotICBzLT5kZXN0cm95ZWRfcG9ydHMrKzsKLSAgaWYgKHMtPmRlc3Ryb3llZF9wb3J0cyA9PSBzLT5ucG9ydHMpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci0gICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzKTsKLSAgfSBlbHNlIHsKLSAgICBHUFJfQVNTRVJUKHMtPmRlc3Ryb3llZF9wb3J0cyA8IHMtPm5wb3J0cyk7Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICB9Ci19Ci0KLS8qIGNhbGxlZCB3aGVuIGFsbCBsaXN0ZW5pbmcgZW5kcG9pbnRzIGhhdmUgYmVlbiBzaHV0ZG93biwgc28gbm8gZnVydGhlcgotICAgZXZlbnRzIHdpbGwgYmUgcmVjZWl2ZWQgb24gdGhlbSAtIGF0IHRoaXMgcG9pbnQgaXQncyBzYWZlIHRvIGRlc3Ryb3kKLSAgIHRoaW5ncyAqLwotc3RhdGljIHZvaWQgZGVhY3RpdmF0ZWRfYWxsX3BvcnRzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RjcF9zZXJ2ZXIgKnMpIHsKLSAgLyogZGVsZXRlIEFMTCB0aGUgdGhpbmdzICovCi0gIGdwcl9tdV9sb2NrKCZzLT5tdSk7Ci0KLSAgaWYgKCFzLT5zaHV0ZG93bikgewotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocy0+aGVhZCkgewotICAgIGdycGNfdGNwX2xpc3RlbmVyICpzcDsKLSAgICBmb3IgKHNwID0gcy0+aGVhZDsgc3A7IHNwID0gc3AtPm5leHQpIHsKLSAgICAgIGdycGNfdW5saW5rX2lmX3VuaXhfZG9tYWluX3NvY2tldCgmc3AtPmFkZHIuc29ja2FkZHIpOwotICAgICAgc3AtPmRlc3Ryb3llZF9jbG9zdXJlLmNiID0gZGVzdHJveWVkX3BvcnQ7Ci0gICAgICBzcC0+ZGVzdHJveWVkX2Nsb3N1cmUuY2JfYXJnID0gczsKLSAgICAgIGdycGNfZmRfb3JwaGFuKGV4ZWNfY3R4LCBzcC0+ZW1mZCwgJnNwLT5kZXN0cm95ZWRfY2xvc3VyZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJ0Y3BfbGlzdGVuZXJfc2h1dGRvd24iKTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICB9IGVsc2UgewotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICBmaW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHRjcF9zZXJ2ZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7Ci0gIGdwcl9tdV9sb2NrKCZzLT5tdSk7Ci0KLSAgR1BSX0FTU0VSVCghcy0+c2h1dGRvd24pOwotICBzLT5zaHV0ZG93biA9IDE7Ci0KLSAgLyogc2h1dGRvd24gYWxsIGZkJ3MgKi8KLSAgaWYgKHMtPmFjdGl2ZV9wb3J0cykgewotICAgIGdycGNfdGNwX2xpc3RlbmVyICpzcDsKLSAgICBmb3IgKHNwID0gcy0+aGVhZDsgc3A7IHNwID0gc3AtPm5leHQpIHsKLSAgICAgIGdycGNfZmRfc2h1dGRvd24oZXhlY19jdHgsIHNwLT5lbWZkKTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICB9IGVsc2UgewotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICBkZWFjdGl2YXRlZF9hbGxfcG9ydHMoZXhlY19jdHgsIHMpOwotICB9Ci19Ci0KLS8qIGdldCBtYXggbGlzdGVuIHF1ZXVlIHNpemUgb24gbGludXggKi8KLXN0YXRpYyB2b2lkIGluaXRfbWF4X2FjY2VwdF9xdWV1ZV9zaXplKHZvaWQpIHsKLSAgaW50IG4gPSBTT01BWENPTk47Ci0gIGNoYXIgYnVmWzY0XTsKLSAgRklMRSAqZnAgPSBmb3BlbigiL3Byb2Mvc3lzL25ldC9jb3JlL3NvbWF4Y29ubiIsICJyIik7Ci0gIGlmIChmcCA9PSBOVUxMKSB7Ci0gICAgLyogMi40IGtlcm5lbC4gKi8KLSAgICBzX21heF9hY2NlcHRfcXVldWVfc2l6ZSA9IFNPTUFYQ09OTjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZnApKSB7Ci0gICAgY2hhciAqZW5kOwotICAgIGxvbmcgaSA9IHN0cnRvbChidWYsICZlbmQsIDEwKTsKLSAgICBpZiAoaSA+IDAgJiYgaSA8PSBJTlRfTUFYICYmIGVuZCAmJiAqZW5kID09IDApIHsKLSAgICAgIG4gPSAoaW50KWk7Ci0gICAgfQotICB9Ci0gIGZjbG9zZShmcCk7Ci0gIHNfbWF4X2FjY2VwdF9xdWV1ZV9zaXplID0gbjsKLQotICBpZiAoc19tYXhfYWNjZXB0X3F1ZXVlX3NpemUgPCBNSU5fU0FGRV9BQ0NFUFRfUVVFVUVfU0laRSkgewotICAgIGdwcl9sb2coR1BSX0lORk8sCi0gICAgICAgICAgICAiU3VzcGljaW91c2x5IHNtYWxsIGFjY2VwdCBxdWV1ZSAoJWQpIHdpbGwgcHJvYmFibHkgbGVhZCB0byAiCi0gICAgICAgICAgICAiY29ubmVjdGlvbiBkcm9wcyIsCi0gICAgICAgICAgICBzX21heF9hY2NlcHRfcXVldWVfc2l6ZSk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBnZXRfbWF4X2FjY2VwdF9xdWV1ZV9zaXplKHZvaWQpIHsKLSAgZ3ByX29uY2VfaW5pdCgmc19pbml0X21heF9hY2NlcHRfcXVldWVfc2l6ZSwgaW5pdF9tYXhfYWNjZXB0X3F1ZXVlX3NpemUpOwotICByZXR1cm4gc19tYXhfYWNjZXB0X3F1ZXVlX3NpemU7Ci19Ci0KLS8qIFByZXBhcmUgYSByZWNlbnRseS1jcmVhdGVkIHNvY2tldCBmb3IgbGlzdGVuaW5nLiAqLwotc3RhdGljIGludCBwcmVwYXJlX3NvY2tldChpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuKSB7Ci0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNvY2tuYW1lX3RlbXA7Ci0gIHNvY2tsZW5fdCBzb2NrbmFtZV9sZW47Ci0KLSAgaWYgKGZkIDwgMCkgewotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBpZiAoIWdycGNfc2V0X3NvY2tldF9ub25ibG9ja2luZyhmZCwgMSkgfHwgIWdycGNfc2V0X3NvY2tldF9jbG9leGVjKGZkLCAxKSB8fAotICAgICAgKCFncnBjX2lzX3VuaXhfc29ja2V0KGFkZHIpICYmICghZ3JwY19zZXRfc29ja2V0X2xvd19sYXRlbmN5KGZkLCAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZ3JwY19zZXRfc29ja2V0X3JldXNlX2FkZHIoZmQsIDEpKSkgfHwKLSAgICAgICFncnBjX3NldF9zb2NrZXRfbm9fc2lncGlwZV9pZl9wb3NzaWJsZShmZCkpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBjb25maWd1cmUgc29ja2V0ICVkOiAlcyIsIGZkLAotICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgR1BSX0FTU0VSVChhZGRyX2xlbiA8IH4oc29ja2xlbl90KTApOwotICBpZiAoYmluZChmZCwgYWRkciwgKHNvY2tsZW5fdClhZGRyX2xlbikgPCAwKSB7Ci0gICAgY2hhciAqYWRkcl9zdHI7Ci0gICAgZ3JwY19zb2NrYWRkcl90b19zdHJpbmcoJmFkZHJfc3RyLCBhZGRyLCAwKTsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgImJpbmQgYWRkcj0lczogJXMiLCBhZGRyX3N0ciwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBncHJfZnJlZShhZGRyX3N0cik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIGlmIChsaXN0ZW4oZmQsIGdldF9tYXhfYWNjZXB0X3F1ZXVlX3NpemUoKSkgPCAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJsaXN0ZW46ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgc29ja25hbWVfbGVuID0gc2l6ZW9mKHNvY2tuYW1lX3RlbXApOwotICBpZiAoZ2V0c29ja25hbWUoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCwgJnNvY2tuYW1lX2xlbikgPCAwKSB7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHJldHVybiBncnBjX3NvY2thZGRyX2dldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCk7Ci0KLWVycm9yOgotICBpZiAoZmQgPj0gMCkgewotICAgIGNsb3NlKGZkKTsKLSAgfQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIGV2ZW50IG1hbmFnZXIgY2FsbGJhY2sgd2hlbiByZWFkcyBhcmUgcmVhZHkgKi8KLXN0YXRpYyB2b2lkIG9uX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfdGNwX2xpc3RlbmVyICpzcCA9IGFyZzsKLSAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yIGFjY2VwdG9yID0ge3NwLT5zZXJ2ZXIsIHNwLT5wb3J0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AtPmZkX2luZGV4fTsKLSAgZ3JwY19mZCAqZmRvYmo7Ci0gIHNpemVfdCBpOwotCi0gIGlmICghc3VjY2VzcykgewotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICAvKiBsb29wIHVudGlsIGFjY2VwdDQgcmV0dXJucyBFQUdBSU4sIGFuZCB0aGVuIHJlLWFybSBub3RpZmljYXRpb24gKi8KLSAgZm9yICg7OykgewotICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0gICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7Ci0gICAgY2hhciAqYWRkcl9zdHI7Ci0gICAgY2hhciAqbmFtZTsKLSAgICAvKiBOb3RlOiBJZiB3ZSBldmVyIGRlY2lkZSB0byByZXR1cm4gdGhpcyBhZGRyZXNzIHRvIHRoZSB1c2VyLCByZW1lbWJlciB0bwotICAgICAgIHN0cmlwIG9mZiB0aGUgOjpmZmZmOjAuMC4wLjAvOTYgcHJlZml4IGZpcnN0LiAqLwotICAgIGludCBmZCA9IGdycGNfYWNjZXB0NChzcC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4sIDEsIDEpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgIHN3aXRjaCAoZXJybm8pIHsKLSAgICAgICAgY2FzZSBFSU5UUjoKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2FzZSBFQUdBSU46Ci0gICAgICAgICAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgc3AtPmVtZmQsICZzcC0+cmVhZF9jbG9zdXJlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJGYWlsZWQgYWNjZXB0NDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZ3JwY19zZXRfc29ja2V0X25vX3NpZ3BpcGVfaWZfcG9zc2libGUoZmQpOwotCi0gICAgYWRkcl9zdHIgPSBncnBjX3NvY2thZGRyX3RvX3VyaSgoc3RydWN0IHNvY2thZGRyICopJmFkZHIpOwotICAgIGdwcl9hc3ByaW50ZigmbmFtZSwgInRjcC1zZXJ2ZXItY29ubmVjdGlvbjolcyIsIGFkZHJfc3RyKTsKLQotICAgIGlmIChncnBjX3RjcF90cmFjZSkgewotICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJTRVJWRVJfQ09OTkVDVDogaW5jb21pbmcgY29ubmVjdGlvbjogJXMiLCBhZGRyX3N0cik7Ci0gICAgfQotCi0gICAgZmRvYmogPSBncnBjX2ZkX2NyZWF0ZShmZCwgbmFtZSk7Ci0gICAgLyogVE9ETyhjdGlsbGVyKTogcmV2aXNlIHRoaXMgd2hlbiB3ZSBoYXZlIHNlcnZlci1zaWRlIHNoYXJkaW5nCi0gICAgICAgb2YgY2hhbm5lbHMgLS0gd2UgY2VydGFpbmx5IHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBhZGRpbmcgZXZlcnkKLSAgICAgICBpbmNvbWluZyBjaGFubmVsIHRvIGV2ZXJ5IHBvbGxzZXQgb3duZWQgYnkgdGhlIHNlcnZlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzcC0+c2VydmVyLT5wb2xsc2V0X2NvdW50OyBpKyspIHsKLSAgICAgIGdycGNfcG9sbHNldF9hZGRfZmQoZXhlY19jdHgsIHNwLT5zZXJ2ZXItPnBvbGxzZXRzW2ldLCBmZG9iaik7Ci0gICAgfQotICAgIHNwLT5zZXJ2ZXItPm9uX2FjY2VwdF9jYigKLSAgICAgICAgZXhlY19jdHgsIHNwLT5zZXJ2ZXItPm9uX2FjY2VwdF9jYl9hcmcsCi0gICAgICAgIGdycGNfdGNwX2NyZWF0ZShmZG9iaiwgR1JQQ19UQ1BfREVGQVVMVF9SRUFEX1NMSUNFX1NJWkUsIGFkZHJfc3RyKSwKLSAgICAgICAgJmFjY2VwdG9yKTsKLQotICAgIGdwcl9mcmVlKG5hbWUpOwotICAgIGdwcl9mcmVlKGFkZHJfc3RyKTsKLSAgfQotCi0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiApOwotCi1lcnJvcjoKLSAgZ3ByX211X2xvY2soJnNwLT5zZXJ2ZXItPm11KTsKLSAgaWYgKDAgPT0gLS1zcC0+c2VydmVyLT5hY3RpdmVfcG9ydHMpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZzcC0+c2VydmVyLT5tdSk7Ci0gICAgZGVhY3RpdmF0ZWRfYWxsX3BvcnRzKGV4ZWNfY3R4LCBzcC0+c2VydmVyKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfbXVfdW5sb2NrKCZzcC0+c2VydmVyLT5tdSk7Ci0gIH0KLX0KLQotc3RhdGljIGdycGNfdGNwX2xpc3RlbmVyICphZGRfc29ja2V0X3RvX3NlcnZlcihncnBjX3RjcF9zZXJ2ZXIgKnMsIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZkX2luZGV4KSB7Ci0gIGdycGNfdGNwX2xpc3RlbmVyICpzcCA9IE5VTEw7Ci0gIGludCBwb3J0OwotICBjaGFyICphZGRyX3N0cjsKLSAgY2hhciAqbmFtZTsKLQotICBwb3J0ID0gcHJlcGFyZV9zb2NrZXQoZmQsIGFkZHIsIGFkZHJfbGVuKTsKLSAgaWYgKHBvcnQgPj0gMCkgewotICAgIGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKCZhZGRyX3N0ciwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAxKTsKLSAgICBncHJfYXNwcmludGYoJm5hbWUsICJ0Y3Atc2VydmVyLWxpc3RlbmVyOiVzIiwgYWRkcl9zdHIpOwotICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7Ci0gICAgcy0+bnBvcnRzKys7Ci0gICAgR1BSX0FTU0VSVCghcy0+b25fYWNjZXB0X2NiICYmICJtdXN0IGFkZCBwb3J0cyBiZWZvcmUgc3RhcnRpbmcgc2VydmVyIik7Ci0gICAgc3AgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3RjcF9saXN0ZW5lcikpOwotICAgIHNwLT5uZXh0ID0gTlVMTDsKLSAgICBpZiAocy0+aGVhZCA9PSBOVUxMKSB7Ci0gICAgICBzLT5oZWFkID0gc3A7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMtPnRhaWwtPm5leHQgPSBzcDsKLSAgICB9Ci0gICAgcy0+dGFpbCA9IHNwOwotICAgIHNwLT5zZXJ2ZXIgPSBzOwotICAgIHNwLT5mZCA9IGZkOwotICAgIHNwLT5lbWZkID0gZ3JwY19mZF9jcmVhdGUoZmQsIG5hbWUpOwotICAgIG1lbWNweShzcC0+YWRkci51bnR5cGVkLCBhZGRyLCBhZGRyX2xlbik7Ci0gICAgc3AtPmFkZHJfbGVuID0gYWRkcl9sZW47Ci0gICAgc3AtPnBvcnQgPSBwb3J0OwotICAgIHNwLT5wb3J0X2luZGV4ID0gcG9ydF9pbmRleDsKLSAgICBzcC0+ZmRfaW5kZXggPSBmZF9pbmRleDsKLSAgICBzcC0+aXNfc2libGluZyA9IDA7Ci0gICAgc3AtPnNpYmxpbmcgPSBOVUxMOwotICAgIEdQUl9BU1NFUlQoc3AtPmVtZmQpOwotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICBncHJfZnJlZShhZGRyX3N0cik7Ci0gICAgZ3ByX2ZyZWUobmFtZSk7Ci0gIH0KLQotICByZXR1cm4gc3A7Ci19Ci0KLWludCBncnBjX3RjcF9zZXJ2ZXJfYWRkX3BvcnQoZ3JwY190Y3Bfc2VydmVyICpzLCBjb25zdCB2b2lkICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4pIHsKLSAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOwotICBncnBjX3RjcF9saXN0ZW5lciAqc3AyID0gTlVMTDsKLSAgaW50IGZkOwotICBncnBjX2R1YWxzdGFja19tb2RlIGRzbW9kZTsKLSAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNl92NG1hcHBlZDsKLSAgc3RydWN0IHNvY2thZGRyX2luIHdpbGQ0OwotICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHdpbGQ2OwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjRfY29weTsKLSAgc3RydWN0IHNvY2thZGRyICphbGxvY2F0ZWRfYWRkciA9IE5VTEw7Ci0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNvY2tuYW1lX3RlbXA7Ci0gIHNvY2tsZW5fdCBzb2NrbmFtZV9sZW47Ci0gIGludCBwb3J0OwotICB1bnNpZ25lZCBwb3J0X2luZGV4ID0gMDsKLSAgdW5zaWduZWQgZmRfaW5kZXggPSAwOwotICBpZiAocy0+dGFpbCAhPSBOVUxMKSB7Ci0gICAgcG9ydF9pbmRleCA9IHMtPnRhaWwtPnBvcnRfaW5kZXggKyAxOwotICB9Ci0gIGdycGNfdW5saW5rX2lmX3VuaXhfZG9tYWluX3NvY2tldCgoc3RydWN0IHNvY2thZGRyICopYWRkcik7Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHdpbGRjYXJkIHBvcnQsIGFuZCBpZiBzbywgdHJ5IHRvIGtlZXAgdGhlIHBvcnQgdGhlIHNhbWUKLSAgICAgYXMgc29tZSBwcmV2aW91c2x5IGNyZWF0ZWQgbGlzdGVuZXIuICovCi0gIGlmIChncnBjX3NvY2thZGRyX2dldF9wb3J0KGFkZHIpID09IDApIHsKLSAgICBmb3IgKHNwID0gcy0+aGVhZDsgc3A7IHNwID0gc3AtPm5leHQpIHsKLSAgICAgIHNvY2tuYW1lX2xlbiA9IHNpemVvZihzb2NrbmFtZV90ZW1wKTsKLSAgICAgIGlmICgwID09IGdldHNvY2tuYW1lKHNwLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrbmFtZV90ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tuYW1lX2xlbikpIHsKLSAgICAgICAgcG9ydCA9IGdycGNfc29ja2FkZHJfZ2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrbmFtZV90ZW1wKTsKLSAgICAgICAgaWYgKHBvcnQgPiAwKSB7Ci0gICAgICAgICAgYWxsb2NhdGVkX2FkZHIgPSBtYWxsb2MoYWRkcl9sZW4pOwotICAgICAgICAgIG1lbWNweShhbGxvY2F0ZWRfYWRkciwgYWRkciwgYWRkcl9sZW4pOwotICAgICAgICAgIGdycGNfc29ja2FkZHJfc2V0X3BvcnQoYWxsb2NhdGVkX2FkZHIsIHBvcnQpOwotICAgICAgICAgIGFkZHIgPSBhbGxvY2F0ZWRfYWRkcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHNwID0gTlVMTDsKLQotICBpZiAoZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZChhZGRyLCAmYWRkcjZfdjRtYXBwZWQpKSB7Ci0gICAgYWRkciA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjZfdjRtYXBwZWQ7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjZfdjRtYXBwZWQpOwotICB9Ci0KLSAgLyogVHJlYXQgOjogb3IgMC4wLjAuMCBhcyBhIGZhbWlseS1hZ25vc3RpYyB3aWxkY2FyZC4gKi8KLSAgaWYgKGdycGNfc29ja2FkZHJfaXNfd2lsZGNhcmQoYWRkciwgJnBvcnQpKSB7Ci0gICAgZ3JwY19zb2NrYWRkcl9tYWtlX3dpbGRjYXJkcyhwb3J0LCAmd2lsZDQsICZ3aWxkNik7Ci0KLSAgICAvKiBUcnkgbGlzdGVuaW5nIG9uIElQdjYgZmlyc3QuICovCi0gICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZDY7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2Yod2lsZDYpOwotICAgIGZkID0gZ3JwY19jcmVhdGVfZHVhbHN0YWNrX3NvY2tldChhZGRyLCBTT0NLX1NUUkVBTSwgMCwgJmRzbW9kZSk7Ci0gICAgc3AgPSBhZGRfc29ja2V0X3RvX3NlcnZlcihzLCBmZCwgYWRkciwgYWRkcl9sZW4sIHBvcnRfaW5kZXgsIGZkX2luZGV4KTsKLSAgICBpZiAoZmQgPj0gMCAmJiBkc21vZGUgPT0gR1JQQ19EU01PREVfRFVBTFNUQUNLKSB7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIGlmIChzcCAhPSBOVUxMKSB7Ci0gICAgICArK2ZkX2luZGV4OwotICAgIH0KLSAgICAvKiBJZiB3ZSBkaWRuJ3QgZ2V0IGEgZHVhbHN0YWNrIHNvY2tldCwgYWxzbyBsaXN0ZW4gb24gMC4wLjAuMC4gKi8KLSAgICBpZiAocG9ydCA9PSAwICYmIHNwICE9IE5VTEwpIHsKLSAgICAgIGdycGNfc29ja2FkZHJfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSZ3aWxkNCwgc3AtPnBvcnQpOwotICAgIH0KLSAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZ3aWxkNDsKLSAgICBhZGRyX2xlbiA9IHNpemVvZih3aWxkNCk7Ci0gIH0KLQotICBmZCA9IGdycGNfY3JlYXRlX2R1YWxzdGFja19zb2NrZXQoYWRkciwgU09DS19TVFJFQU0sIDAsICZkc21vZGUpOwotICBpZiAoZmQgPCAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlIHNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICB9IGVsc2UgewotICAgIGlmIChkc21vZGUgPT0gR1JQQ19EU01PREVfSVBWNCAmJgotICAgICAgICBncnBjX3NvY2thZGRyX2lzX3Y0bWFwcGVkKGFkZHIsICZhZGRyNF9jb3B5KSkgewotICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjRfY29weTsKLSAgICAgIGFkZHJfbGVuID0gc2l6ZW9mKGFkZHI0X2NvcHkpOwotICAgIH0KLSAgICBzcDIgPSBzcDsKLSAgICBzcCA9IGFkZF9zb2NrZXRfdG9fc2VydmVyKHMsIGZkLCBhZGRyLCBhZGRyX2xlbiwgcG9ydF9pbmRleCwgZmRfaW5kZXgpOwotICAgIGlmIChzcDIgIT0gTlVMTCAmJiBzcCAhPSBOVUxMKSB7Ci0gICAgICBzcDItPnNpYmxpbmcgPSBzcDsKLSAgICAgIHNwLT5pc19zaWJsaW5nID0gMTsKLSAgICB9Ci0gIH0KLQotZG9uZToKLSAgZ3ByX2ZyZWUoYWxsb2NhdGVkX2FkZHIpOwotICBpZiAoc3AgIT0gTlVMTCkgewotICAgIHJldHVybiBzcC0+cG9ydDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotdW5zaWduZWQgZ3JwY190Y3Bfc2VydmVyX3BvcnRfZmRfY291bnQoZ3JwY190Y3Bfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydF9pbmRleCkgewotICB1bnNpZ25lZCBudW1fZmRzID0gMDsKLSAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOwotICBmb3IgKHNwID0gcy0+aGVhZDsgc3AgJiYgcG9ydF9pbmRleCAhPSAwOyBzcCA9IHNwLT5uZXh0KSB7Ci0gICAgaWYgKCFzcC0+aXNfc2libGluZykgewotICAgICAgLS1wb3J0X2luZGV4OwotICAgIH0KLSAgfQotICBmb3IgKDsgc3A7IHNwID0gc3AtPnNpYmxpbmcsICsrbnVtX2ZkcykKLSAgICA7Ci0gIHJldHVybiBudW1fZmRzOwotfQotCi1pbnQgZ3JwY190Y3Bfc2VydmVyX3BvcnRfZmQoZ3JwY190Y3Bfc2VydmVyICpzLCB1bnNpZ25lZCBwb3J0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZkX2luZGV4KSB7Ci0gIGdycGNfdGNwX2xpc3RlbmVyICpzcDsKLSAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwICYmIHBvcnRfaW5kZXggIT0gMDsgc3AgPSBzcC0+bmV4dCkgewotICAgIGlmICghc3AtPmlzX3NpYmxpbmcpIHsKLSAgICAgIC0tcG9ydF9pbmRleDsKLSAgICB9Ci0gIH0KLSAgZm9yICg7IHNwICYmIGZkX2luZGV4ICE9IDA7IHNwID0gc3AtPnNpYmxpbmcsIC0tZmRfaW5kZXgpCi0gICAgOwotICBpZiAoc3ApIHsKLSAgICByZXR1cm4gc3AtPmZkOwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotfQotCi12b2lkIGdycGNfdGNwX3NlcnZlcl9zdGFydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190Y3Bfc2VydmVyX2NiIG9uX2FjY2VwdF9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9uX2FjY2VwdF9jYl9hcmcpIHsKLSAgc2l6ZV90IGk7Ci0gIGdycGNfdGNwX2xpc3RlbmVyICpzcDsKLSAgR1BSX0FTU0VSVChvbl9hY2NlcHRfY2IpOwotICBncHJfbXVfbG9jaygmcy0+bXUpOwotICBHUFJfQVNTRVJUKCFzLT5vbl9hY2NlcHRfY2IpOwotICBHUFJfQVNTRVJUKHMtPmFjdGl2ZV9wb3J0cyA9PSAwKTsKLSAgcy0+b25fYWNjZXB0X2NiID0gb25fYWNjZXB0X2NiOwotICBzLT5vbl9hY2NlcHRfY2JfYXJnID0gb25fYWNjZXB0X2NiX2FyZzsKLSAgcy0+cG9sbHNldHMgPSBwb2xsc2V0czsKLSAgcy0+cG9sbHNldF9jb3VudCA9IHBvbGxzZXRfY291bnQ7Ci0gIGZvciAoc3AgPSBzLT5oZWFkOyBzcDsgc3AgPSBzcC0+bmV4dCkgewotICAgIGZvciAoaSA9IDA7IGkgPCBwb2xsc2V0X2NvdW50OyBpKyspIHsKLSAgICAgIGdycGNfcG9sbHNldF9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXRzW2ldLCBzcC0+ZW1mZCk7Ci0gICAgfQotICAgIHNwLT5yZWFkX2Nsb3N1cmUuY2IgPSBvbl9yZWFkOwotICAgIHNwLT5yZWFkX2Nsb3N1cmUuY2JfYXJnID0gc3A7Ci0gICAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgc3AtPmVtZmQsICZzcC0+cmVhZF9jbG9zdXJlKTsKLSAgICBzLT5hY3RpdmVfcG9ydHMrKzsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci19Ci0KLWdycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX3JlZihncnBjX3RjcF9zZXJ2ZXIgKnMpIHsKLSAgZ3ByX3JlZigmcy0+cmVmcyk7Ci0gIHJldHVybiBzOwotfQotCi12b2lkIGdycGNfdGNwX3NlcnZlcl9zaHV0ZG93bl9zdGFydGluZ19hZGQoZ3JwY190Y3Bfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fc3RhcnRpbmcpIHsKLSAgZ3ByX211X2xvY2soJnMtPm11KTsKLSAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZzLT5zaHV0ZG93bl9zdGFydGluZywgc2h1dGRvd25fc3RhcnRpbmcsIDEpOwotICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci19Ci0KLXZvaWQgZ3JwY190Y3Bfc2VydmVyX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RjcF9zZXJ2ZXIgKnMpIHsKLSAgaWYgKGdwcl91bnJlZigmcy0+cmVmcykpIHsKLSAgICAvKiBDb21wbGV0ZSBzaHV0ZG93bl9zdGFydGluZyB3b3JrIGJlZm9yZSBkZXN0cm95aW5nLiAqLwotICAgIGdycGNfZXhlY19jdHggbG9jYWxfZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7Ci0gICAgZ3ByX211X2xvY2soJnMtPm11KTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdCgmbG9jYWxfZXhlY19jdHgsICZzLT5zaHV0ZG93bl9zdGFydGluZywgTlVMTCk7Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICAgIGlmIChleGVjX2N0eCA9PSBOVUxMKSB7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKCZsb2NhbF9leGVjX2N0eCk7Ci0gICAgICB0Y3Bfc2VydmVyX2Rlc3Ryb3koJmxvY2FsX2V4ZWNfY3R4LCBzKTsKLSAgICAgIGdycGNfZXhlY19jdHhfZmluaXNoKCZsb2NhbF9leGVjX2N0eCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdycGNfZXhlY19jdHhfZmluaXNoKCZsb2NhbF9leGVjX2N0eCk7Ci0gICAgICB0Y3Bfc2VydmVyX2Rlc3Ryb3koZXhlY19jdHgsIHMpOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIGIvc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YWJjNWIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKLQotI2luY2x1ZGUgPGlvLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2dfd2luMzIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIgotCi0jZGVmaW5lIE1JTl9TQUZFX0FDQ0VQVF9RVUVVRV9TSVpFIDEwMAotCi0vKiBvbmUgbGlzdGVuaW5nIHBvcnQgKi8KLXR5cGVkZWYgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyIGdycGNfdGNwX2xpc3RlbmVyOwotc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyIHsKLSAgLyogVGhpcyBzZWVtaW5nbHkgbWFnaWMgbnVtYmVyIGNvbWVzIGZyb20gQWNjZXB0RXgncyBkb2N1bWVudGF0aW9uLiBlYWNoCi0gICAgIGFkZHJlc3MgYnVmZmVyIG5lZWRzIHRvIGhhdmUgYXQgbGVhc3QgMTYgbW9yZSBieXRlcyBhdCB0aGVpciBlbmQuICovCi0gIHVpbnQ4X3QgYWRkcmVzc2VzWyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgKyAxNikgKiAyXTsKLSAgLyogVGhpcyB3aWxsIGhvbGQgdGhlIHNvY2tldCBmb3IgdGhlIG5leHQgYWNjZXB0LiAqLwotICBTT0NLRVQgbmV3X3NvY2tldDsKLSAgLyogVGhlIGxpc3RlbmVyIHdpbnNvY2tldC4gKi8KLSAgZ3JwY193aW5zb2NrZXQgKnNvY2tldDsKLSAgLyogVGhlIGFjdHVhbCBUQ1AgcG9ydCBudW1iZXIuICovCi0gIGludCBwb3J0OwotICB1bnNpZ25lZCBwb3J0X2luZGV4OwotICBncnBjX3RjcF9zZXJ2ZXIgKnNlcnZlcjsKLSAgLyogVGhlIGNhY2hlZCBBY2NlcHRFeCBmb3IgdGhhdCBwb3J0LiAqLwotICBMUEZOX0FDQ0VQVEVYIEFjY2VwdEV4OwotICBpbnQgc2h1dHRpbmdfZG93bjsKLSAgLyogY2xvc3VyZSBmb3Igc29ja2V0IG5vdGlmaWNhdGlvbiBvZiBhY2NlcHQgYmVpbmcgcmVhZHkgKi8KLSAgZ3JwY19jbG9zdXJlIG9uX2FjY2VwdDsKLSAgLyogbGlua2VkIGxpc3QgKi8KLSAgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyICpuZXh0OwotfTsKLQotLyogdGhlIG92ZXJhbGwgc2VydmVyICovCi1zdHJ1Y3QgZ3JwY190Y3Bfc2VydmVyIHsKLSAgZ3ByX3JlZmNvdW50IHJlZnM7Ci0gIC8qIENhbGxlZCB3aGVuZXZlciBhY2NlcHQoKSBzdWNjZWVkcyBvbiBhIHNlcnZlciBwb3J0LiAqLwotICBncnBjX3RjcF9zZXJ2ZXJfY2Igb25fYWNjZXB0X2NiOwotICB2b2lkICpvbl9hY2NlcHRfY2JfYXJnOwotCi0gIGdwcl9tdSBtdTsKLQotICAvKiBhY3RpdmUgcG9ydCBjb3VudDogaG93IG1hbnkgcG9ydHMgYXJlIGFjdHVhbGx5IHN0aWxsIGxpc3RlbmluZyAqLwotICBpbnQgYWN0aXZlX3BvcnRzOwotCi0gIC8qIGxpbmtlZCBsaXN0IG9mIHNlcnZlciBwb3J0cyAqLwotICBncnBjX3RjcF9saXN0ZW5lciAqaGVhZDsKLSAgZ3JwY190Y3BfbGlzdGVuZXIgKnRhaWw7Ci0KLSAgLyogTGlzdCBvZiBjbG9zdXJlcyBwYXNzZWQgdG8gc2h1dGRvd25fc3RhcnRpbmdfYWRkKCkuICovCi0gIGdycGNfY2xvc3VyZV9saXN0IHNodXRkb3duX3N0YXJ0aW5nOwotCi0gIC8qIHNodXRkb3duIGNhbGxiYWNrICovCi0gIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fY29tcGxldGU7Ci19OwotCi0vKiBQdWJsaWMgZnVuY3Rpb24uIEFsbG9jYXRlcyB0aGUgcHJvcGVyIGRhdGEgc3RydWN0dXJlcyB0byBob2xkIGEKLSAgIGdycGNfdGNwX3NlcnZlci4gKi8KLWdycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX2NyZWF0ZShncnBjX2Nsb3N1cmUgKnNodXRkb3duX2NvbXBsZXRlKSB7Ci0gIGdycGNfdGNwX3NlcnZlciAqcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfdGNwX3NlcnZlcikpOwotICBncHJfcmVmX2luaXQoJnMtPnJlZnMsIDEpOwotICBncHJfbXVfaW5pdCgmcy0+bXUpOwotICBzLT5hY3RpdmVfcG9ydHMgPSAwOwotICBzLT5vbl9hY2NlcHRfY2IgPSBOVUxMOwotICBzLT5vbl9hY2NlcHRfY2JfYXJnID0gTlVMTDsKLSAgcy0+aGVhZCA9IE5VTEw7Ci0gIHMtPnRhaWwgPSBOVUxMOwotICBzLT5zaHV0ZG93bl9zdGFydGluZy5oZWFkID0gTlVMTDsKLSAgcy0+c2h1dGRvd25fc3RhcnRpbmcudGFpbCA9IE5VTEw7Ci0gIHMtPnNodXRkb3duX2NvbXBsZXRlID0gc2h1dGRvd25fY29tcGxldGU7Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgdm9pZCBmaW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqcykgewotICBpZiAocy0+c2h1dGRvd25fY29tcGxldGUgIT0gTlVMTCkgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcy0+c2h1dGRvd25fY29tcGxldGUsIHRydWUsIE5VTEwpOwotICB9Ci0KLSAgLyogTm93IHRoYXQgdGhlIGFjY2VwdHMgaGF2ZSBiZWVuIGFib3J0ZWQsIHdlIGNhbiBkZXN0cm95IHRoZSBzb2NrZXRzLgotICAgICBUaGUgSU9DUCB3b24ndCBnZXQgbm90aWZpZWQgb24gdGhlc2UsIHNvIHdlIGNhbiBmbGFnIHRoZW0gYXMgYWxyZWFkeQotICAgICBjbG9zZWQgYnkgdGhlIHN5c3RlbS4gKi8KLSAgd2hpbGUgKHMtPmhlYWQpIHsKLSAgICBncnBjX3RjcF9saXN0ZW5lciAqc3AgPSBzLT5oZWFkOwotICAgIHMtPmhlYWQgPSBzcC0+bmV4dDsKLSAgICBzcC0+bmV4dCA9IE5VTEw7Ci0gICAgZ3JwY193aW5zb2NrZXRfZGVzdHJveShzcC0+c29ja2V0KTsKLSAgICBncHJfZnJlZShzcCk7Ci0gIH0KLSAgZ3ByX2ZyZWUocyk7Ci19Ci0KLWdycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX3JlZihncnBjX3RjcF9zZXJ2ZXIgKnMpIHsKLSAgZ3ByX3JlZigmcy0+cmVmcyk7Ci0gIHJldHVybiBzOwotfQotCi12b2lkIGdycGNfdGNwX3NlcnZlcl9zaHV0ZG93bl9zdGFydGluZ19hZGQoZ3JwY190Y3Bfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fc3RhcnRpbmcpIHsKLSAgZ3ByX211X2xvY2soJnMtPm11KTsKLSAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZzLT5zaHV0ZG93bl9zdGFydGluZywgc2h1dGRvd25fc3RhcnRpbmcsIDEpOwotICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRjcF9zZXJ2ZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7Ci0gIGludCBpbW1lZGlhdGVseV9kb25lID0gMDsKLSAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOwotICBncHJfbXVfbG9jaygmcy0+bXUpOwotCi0gIC8qIEZpcnN0LCBzaHV0ZG93biBhbGwgZmQncy4gVGhpcyB3aWxsIHF1ZXVlIGFib3J0aW9uIGNhbGxzIGZvciBhbGwKLSAgICAgb2YgdGhlIHBlbmRpbmcgYWNjZXB0cyBkdWUgdG8gdGhlIG5vcm1hbCBvcGVyYXRpb24gbWVjaGFuaXNtLiAqLwotICBpZiAocy0+YWN0aXZlX3BvcnRzID09IDApIHsKLSAgICBpbW1lZGlhdGVseV9kb25lID0gMTsKLSAgfQotICBmb3IgKHNwID0gcy0+aGVhZDsgc3A7IHNwID0gc3AtPm5leHQpIHsKLSAgICBzcC0+c2h1dHRpbmdfZG93biA9IDE7Ci0gICAgZ3JwY193aW5zb2NrZXRfc2h1dGRvd24oc3AtPnNvY2tldCk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotCi0gIGlmIChpbW1lZGlhdGVseV9kb25lKSB7Ci0gICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzKTsKLSAgfQotfQotCi12b2lkIGdycGNfdGNwX3NlcnZlcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7Ci0gIGlmIChncHJfdW5yZWYoJnMtPnJlZnMpKSB7Ci0gICAgLyogQ29tcGxldGUgc2h1dGRvd25fc3RhcnRpbmcgd29yayBiZWZvcmUgZGVzdHJveWluZy4gKi8KLSAgICBncnBjX2V4ZWNfY3R4IGxvY2FsX2V4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoJmxvY2FsX2V4ZWNfY3R4LCAmcy0+c2h1dGRvd25fc3RhcnRpbmcsIE5VTEwpOwotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICBpZiAoZXhlY19jdHggPT0gTlVMTCkgewotICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaCgmbG9jYWxfZXhlY19jdHgpOwotICAgICAgdGNwX3NlcnZlcl9kZXN0cm95KCZsb2NhbF9leGVjX2N0eCwgcyk7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmbG9jYWxfZXhlY19jdHgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmbG9jYWxfZXhlY19jdHgpOwotICAgICAgdGNwX3NlcnZlcl9kZXN0cm95KGV4ZWNfY3R4LCBzKTsKLSAgICB9Ci0gIH0KLX0KLQotLyogUHJlcGFyZSAoYmluZCkgYSByZWNlbnRseS1jcmVhdGVkIHNvY2tldCBmb3IgbGlzdGVuaW5nLiAqLwotc3RhdGljIGludCBwcmVwYXJlX3NvY2tldChTT0NLRVQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4pIHsKLSAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc29ja25hbWVfdGVtcDsKLSAgc29ja2xlbl90IHNvY2tuYW1lX2xlbjsKLQotICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgZ290byBlcnJvcjsKLQotICBpZiAoIWdycGNfdGNwX3ByZXBhcmVfc29ja2V0KHNvY2spKSB7Ci0gICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBwcmVwYXJlIHNvY2tldDogJXMiLCB1dGY4X21lc3NhZ2UpOwotICAgIGdwcl9mcmVlKHV0ZjhfbWVzc2FnZSk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIGlmIChiaW5kKHNvY2ssIGFkZHIsIChpbnQpYWRkcl9sZW4pID09IFNPQ0tFVF9FUlJPUikgewotICAgIGNoYXIgKmFkZHJfc3RyOwotICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7Ci0gICAgZ3JwY19zb2NrYWRkcl90b19zdHJpbmcoJmFkZHJfc3RyLCBhZGRyLCAwKTsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgImJpbmQgYWRkcj0lczogJXMiLCBhZGRyX3N0ciwgdXRmOF9tZXNzYWdlKTsKLSAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICAgIGdwcl9mcmVlKGFkZHJfc3RyKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgaWYgKGxpc3Rlbihzb2NrLCBTT01BWENPTk4pID09IFNPQ0tFVF9FUlJPUikgewotICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJsaXN0ZW46ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBzb2NrbmFtZV9sZW4gPSBzaXplb2Yoc29ja25hbWVfdGVtcCk7Ci0gIGlmIChnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXAsICZzb2NrbmFtZV9sZW4pID09Ci0gICAgICBTT0NLRVRfRVJST1IpIHsKLSAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZ2V0c29ja25hbWU6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICByZXR1cm4gZ3JwY19zb2NrYWRkcl9nZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXApOwotCi1lcnJvcjoKLSAgaWYgKHNvY2sgIT0gSU5WQUxJRF9TT0NLRVQpIGNsb3Nlc29ja2V0KHNvY2spOwotICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY3JlbWVudF9hY3RpdmVfcG9ydHNfYW5kX25vdGlmeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9saXN0ZW5lciAqc3ApIHsKLSAgaW50IG5vdGlmeSA9IDA7Ci0gIHNwLT5zaHV0dGluZ19kb3duID0gMDsKLSAgZ3ByX211X2xvY2soJnNwLT5zZXJ2ZXItPm11KTsKLSAgR1BSX0FTU0VSVChzcC0+c2VydmVyLT5hY3RpdmVfcG9ydHMgPiAwKTsKLSAgaWYgKDAgPT0gLS1zcC0+c2VydmVyLT5hY3RpdmVfcG9ydHMpIHsKLSAgICBub3RpZnkgPSAxOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnNwLT5zZXJ2ZXItPm11KTsKLSAgaWYgKG5vdGlmeSkgewotICAgIGZpbmlzaF9zaHV0ZG93bihleGVjX2N0eCwgc3AtPnNlcnZlcik7Ci0gIH0KLX0KLQotLyogSW4gb3JkZXIgdG8gZG8gYW4gYXN5bmMgYWNjZXB0LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNvY2tldCBmaXJzdCB3aGljaAotICAgd2lsbCBiZSB0aGUgb25lIGFzc2lnbmVkIHRvIHRoZSBuZXcgaW5jb21pbmcgY29ubmVjdGlvbi4gKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X2FjY2VwdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3BfbGlzdGVuZXIgKnBvcnQpIHsKLSAgU09DS0VUIHNvY2sgPSBJTlZBTElEX1NPQ0tFVDsKLSAgY2hhciAqbWVzc2FnZTsKLSAgY2hhciAqdXRmOF9tZXNzYWdlOwotICBCT09MIHN1Y2Nlc3M7Ci0gIERXT1JEIGFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgKyAxNjsKLSAgRFdPUkQgYnl0ZXNfcmVjZWl2ZWQgPSAwOwotCi0gIHNvY2sgPSBXU0FTb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICBXU0FfRkxBR19PVkVSTEFQUEVEKTsKLQotICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgewotICAgIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQ6ICVzIjsKLSAgICBnb3RvIGZhaWx1cmU7Ci0gIH0KLQotICBpZiAoIWdycGNfdGNwX3ByZXBhcmVfc29ja2V0KHNvY2spKSB7Ci0gICAgbWVzc2FnZSA9ICJVbmFibGUgdG8gcHJlcGFyZSBzb2NrZXQ6ICVzIjsKLSAgICBnb3RvIGZhaWx1cmU7Ci0gIH0KLQotICAvKiBTdGFydCB0aGUgImFjY2VwdCIgYXN5bmNocm9ub3VzbHkuICovCi0gIHN1Y2Nlc3MgPSBwb3J0LT5BY2NlcHRFeChwb3J0LT5zb2NrZXQtPnNvY2tldCwgc29jaywgcG9ydC0+YWRkcmVzc2VzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmxlbiwgYWRkcmxlbiwgJmJ5dGVzX3JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQtPnNvY2tldC0+cmVhZF9pbmZvLm92ZXJsYXBwZWQpOwotCi0gIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGdldCBhbiBhY2NlcHQgaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4gSG93ZXZlciwgd2UKLSAgICAgd2lsbCBzdGlsbCBnZXQgYW4gSU9DUCBub3RpZmljYXRpb24gZm9yIGl0LiBTbyBsZXQncyBqdXN0IGlnbm9yZSBpdC4gKi8KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgaW50IGVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgaWYgKGVycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKLSAgICAgIG1lc3NhZ2UgPSAiQWNjZXB0RXggZmFpbGVkOiAlcyI7Ci0gICAgICBnb3RvIGZhaWx1cmU7Ci0gICAgfQotICB9Ci0KLSAgLyogV2UncmUgcmVhZHkgdG8gZG8gdGhlIGFjY2VwdC4gQ2FsbGluZyBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZCBtYXkKLSAgICAgaW1tZWRpYXRlbHkgcHJvY2VzcyBhbiBhY2NlcHQgdGhhdCBoYXBwZW5lZCBpbiB0aGUgbWVhbnRpbWUuICovCi0gIHBvcnQtPm5ld19zb2NrZXQgPSBzb2NrOwotICBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgcG9ydC0+c29ja2V0LCAmcG9ydC0+b25fYWNjZXB0KTsKLSAgcmV0dXJuOwotCi1mYWlsdXJlOgotICBpZiAocG9ydC0+c2h1dHRpbmdfZG93bikgewotICAgIC8qIFdlIGFyZSBhYmFuZG9uaW5nIHRoZSBsaXN0ZW5lciBwb3J0LCB0YWtlIHRoYXQgaW50byBhY2NvdW50IHRvIHByZXZlbnQKLSAgICAgICBvY2Nhc2lvbmFsIGhhbmdzIG9uIHNodXRkb3duLiBUaGUgaGFuZyBoYXBwZW5zIHdoZW4gc3AtPnNodXR0aW5nX2Rvd24KLSAgICAgICBjaGFuZ2UgaXMgbm90IHNlZW4gYnkgb25fYWNjZXB0IGFuZCB3ZSBwcm9jZWVkIHRvIHRyeWluZyBuZXcgYWNjZXB0LAotICAgICAgIGJ1dCB3ZSBmYWlsIHRoZXJlIGJlY2F1c2UgdGhlIGxpc3RlbmluZyBwb3J0IGhhcyBiZWVuIGNsb3NlZCBpbiB0aGUKLSAgICAgICBtZWFudGltZS4gKi8KLSAgICBkZWNyZW1lbnRfYWN0aXZlX3BvcnRzX2FuZF9ub3RpZnkoZXhlY19jdHgsIHBvcnQpOwotICAgIHJldHVybjsKLSAgfQotICB1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOwotICBncHJfbG9nKEdQUl9FUlJPUiwgbWVzc2FnZSwgdXRmOF9tZXNzYWdlKTsKLSAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKLSAgaWYgKHNvY2sgIT0gSU5WQUxJRF9TT0NLRVQpIGNsb3Nlc29ja2V0KHNvY2spOwotfQotCi0vKiBFdmVudCBtYW5hZ2VyIGNhbGxiYWNrIHdoZW4gcmVhZHMgYXJlIHJlYWR5LiAqLwotc3RhdGljIHZvaWQgb25fYWNjZXB0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgZnJvbV9pb2NwKSB7Ci0gIGdycGNfdGNwX2xpc3RlbmVyICpzcCA9IGFyZzsKLSAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yIGFjY2VwdG9yID0ge3NwLT5zZXJ2ZXIsIHNwLT5wb3J0X2luZGV4LCAwfTsKLSAgU09DS0VUIHNvY2sgPSBzcC0+bmV3X3NvY2tldDsKLSAgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyAqaW5mbyA9ICZzcC0+c29ja2V0LT5yZWFkX2luZm87Ci0gIGdycGNfZW5kcG9pbnQgKmVwID0gTlVMTDsKLSAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcl9uYW1lOwotICBjaGFyICpwZWVyX25hbWVfc3RyaW5nOwotICBjaGFyICpmZF9uYW1lOwotICBpbnQgcGVlcl9uYW1lX2xlbiA9IHNpemVvZihwZWVyX25hbWUpOwotICBEV09SRCB0cmFuc2ZlcmVkX2J5dGVzOwotICBEV09SRCBmbGFnczsKLSAgQk9PTCB3c2Ffc3VjY2VzczsKLSAgaW50IGVycjsKLQotICAvKiBUaGUgZ2VuZXJhbCBtZWNoYW5pc20gZm9yIHNodXR0aW5nIGRvd24gaXMgdG8gcXVldWUgYWJvcnRpb24gY2FsbHMuIFdoaWxlCi0gICAgIHRoaXMgaXMgbmVjZXNzYXJ5IGluIHRoZSByZWFkL3dyaXRlIGNhc2UsIGl0J3MgdXNlbGVzcyBmb3IgdGhlIGFjY2VwdAotICAgICBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gYWRqdXN0IHRoZSBwZW5kaW5nIGNhbGxiYWNrIGNvdW50ICovCi0gIGlmICghZnJvbV9pb2NwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogVGhlIElPQ1Agbm90aWZpZWQgdXMgb2YgYSBjb21wbGV0ZWQgb3BlcmF0aW9uLiBMZXQncyBncmFiIHRoZSByZXN1bHRzLAotICAgICBhbmQgYWN0IGFjY29yZGluZ2x5LiAqLwotICB0cmFuc2ZlcmVkX2J5dGVzID0gMDsKLSAgd3NhX3N1Y2Nlc3MgPSBXU0FHZXRPdmVybGFwcGVkUmVzdWx0KHNvY2ssICZpbmZvLT5vdmVybGFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZmVyZWRfYnl0ZXMsIEZBTFNFLCAmZmxhZ3MpOwotICBpZiAoIXdzYV9zdWNjZXNzKSB7Ci0gICAgaWYgKHNwLT5zaHV0dGluZ19kb3duKSB7Ci0gICAgICAvKiBEdXJpbmcgdGhlIHNodXRkb3duIGNhc2UsIHdlIEFSRSBleHBlY3RpbmcgYW4gZXJyb3IuIFNvIHRoYXQncyB3ZWxsLAotICAgICAgICAgYW5kIHdlIGNhbiB3YWtlIHVwIHRoZSBzaHV0ZG93biB0aHJlYWQuICovCi0gICAgICBkZWNyZW1lbnRfYWN0aXZlX3BvcnRzX2FuZF9ub3RpZnkoZXhlY19jdHgsIHNwKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAib25fYWNjZXB0IGVycm9yOiAlcyIsIHV0ZjhfbWVzc2FnZSk7Ci0gICAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICAgICAgY2xvc2Vzb2NrZXQoc29jayk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICghc3AtPnNodXR0aW5nX2Rvd24pIHsKLSAgICAgIHBlZXJfbmFtZV9zdHJpbmcgPSBOVUxMOwotICAgICAgZXJyID0gc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19VUERBVEVfQUNDRVBUX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNwLT5zb2NrZXQtPnNvY2tldCwgc2l6ZW9mKHNwLT5zb2NrZXQtPnNvY2tldCkpOwotICAgICAgaWYgKGVycikgewotICAgICAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOwotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInNldHNvY2tvcHQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVyciA9IGdldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmcGVlcl9uYW1lLCAmcGVlcl9uYW1lX2xlbik7Ci0gICAgICBpZiAoIWVycikgewotICAgICAgICBwZWVyX25hbWVfc3RyaW5nID0gZ3JwY19zb2NrYWRkcl90b191cmkoKHN0cnVjdCBzb2NrYWRkciAqKSZwZWVyX25hbWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJnZXRwZWVybmFtZSBlcnJvcjogJXMiLCB1dGY4X21lc3NhZ2UpOwotICAgICAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICAgICAgfQotICAgICAgZ3ByX2FzcHJpbnRmKCZmZF9uYW1lLCAidGNwX3NlcnZlcjolcyIsIHBlZXJfbmFtZV9zdHJpbmcpOwotICAgICAgZXAgPSBncnBjX3RjcF9jcmVhdGUoZ3JwY193aW5zb2NrZXRfY3JlYXRlKHNvY2ssIGZkX25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9uYW1lX3N0cmluZyk7Ci0gICAgICBncHJfZnJlZShmZF9uYW1lKTsKLSAgICAgIGdwcl9mcmVlKHBlZXJfbmFtZV9zdHJpbmcpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjbG9zZXNvY2tldChzb2NrKTsKLSAgICB9Ci0gIH0KLQotICAvKiBUaGUgb25seSB0aW1lIHdlIHNob3VsZCBjYWxsIG91ciBjYWxsYmFjaywgaXMgd2hlcmUgd2Ugc3VjY2Vzc2Z1bGx5Ci0gICAgIG1hbmFnZWQgdG8gYWNjZXB0IGEgY29ubmVjdGlvbiwgYW5kIGNyZWF0ZWQgYW4gZW5kcG9pbnQuICovCi0gIGlmIChlcCkKLSAgICBzcC0+c2VydmVyLT5vbl9hY2NlcHRfY2IoZXhlY19jdHgsIHNwLT5zZXJ2ZXItPm9uX2FjY2VwdF9jYl9hcmcsIGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjZXB0b3IpOwotICAvKiBBcyB3ZSB3ZXJlIG5vdGlmaWVkIGZyb20gdGhlIElPQ1Agb2Ygb25lIGFuZCBleGFjdGx5IG9uZSBhY2NlcHQsCi0gICAgIHRoZSBmb3JtZXIgc29ja2VkIHdlIGNyZWF0ZWQgaGFzIG5vdyBlaXRoZXIgYmVlbiBkZXN0cm95IG9yIGFzc2lnbmVkCi0gICAgIHRvIHRoZSBuZXcgY29ubmVjdGlvbi4gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lIGZvciB0aGUgbmV4dAotICAgICBjb25uZWN0aW9uLiAqLwotICBzdGFydF9hY2NlcHQoZXhlY19jdHgsIHNwKTsKLX0KLQotc3RhdGljIGdycGNfdGNwX2xpc3RlbmVyICphZGRfc29ja2V0X3RvX3NlcnZlcihncnBjX3RjcF9zZXJ2ZXIgKnMsIFNPQ0tFVCBzb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydF9pbmRleCkgewotICBncnBjX3RjcF9saXN0ZW5lciAqc3AgPSBOVUxMOwotICBpbnQgcG9ydDsKLSAgaW50IHN0YXR1czsKLSAgR1VJRCBndWlkID0gV1NBSURfQUNDRVBURVg7Ci0gIERXT1JEIGlvY3RsX251bV9ieXRlczsKLSAgTFBGTl9BQ0NFUFRFWCBBY2NlcHRFeDsKLQotICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgcmV0dXJuIE5VTEw7Ci0KLSAgLyogV2UgbmVlZCB0byBncmFiIHRoZSBBY2NlcHRFeCBwb2ludGVyIGZvciB0aGF0IHBvcnQsIGFzIGl0IG1heSBiZQotICAgICBpbnRlcmZhY2UtZGVwZW5kZW50LiBXZSdsbCBjYWNoZSBpdCB0byBhdm9pZCBkb2luZyB0aGF0IGFnYWluLiAqLwotICBzdGF0dXMgPQotICAgICAgV1NBSW9jdGwoc29jaywgU0lPX0dFVF9FWFRFTlNJT05fRlVOQ1RJT05fUE9JTlRFUiwgJmd1aWQsIHNpemVvZihndWlkKSwKLSAgICAgICAgICAgICAgICZBY2NlcHRFeCwgc2l6ZW9mKEFjY2VwdEV4KSwgJmlvY3RsX251bV9ieXRlcywgTlVMTCwgTlVMTCk7Ci0KLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm9uX2Nvbm5lY3QgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOwotICAgIGNsb3Nlc29ja2V0KHNvY2spOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcG9ydCA9IHByZXBhcmVfc29ja2V0KHNvY2ssIGFkZHIsIGFkZHJfbGVuKTsKLSAgaWYgKHBvcnQgPj0gMCkgewotICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7Ci0gICAgR1BSX0FTU0VSVCghcy0+b25fYWNjZXB0X2NiICYmICJtdXN0IGFkZCBwb3J0cyBiZWZvcmUgc3RhcnRpbmcgc2VydmVyIik7Ci0gICAgc3AgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3RjcF9saXN0ZW5lcikpOwotICAgIHNwLT5uZXh0ID0gTlVMTDsKLSAgICBpZiAocy0+aGVhZCA9PSBOVUxMKSB7Ci0gICAgICBzLT5oZWFkID0gc3A7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMtPnRhaWwtPm5leHQgPSBzcDsKLSAgICB9Ci0gICAgcy0+dGFpbCA9IHNwOwotICAgIHNwLT5zZXJ2ZXIgPSBzOwotICAgIHNwLT5zb2NrZXQgPSBncnBjX3dpbnNvY2tldF9jcmVhdGUoc29jaywgImxpc3RlbmVyIik7Ci0gICAgc3AtPnNodXR0aW5nX2Rvd24gPSAwOwotICAgIHNwLT5BY2NlcHRFeCA9IEFjY2VwdEV4OwotICAgIHNwLT5uZXdfc29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7Ci0gICAgc3AtPnBvcnQgPSBwb3J0OwotICAgIHNwLT5wb3J0X2luZGV4ID0gcG9ydF9pbmRleDsKLSAgICBncnBjX2Nsb3N1cmVfaW5pdCgmc3AtPm9uX2FjY2VwdCwgb25fYWNjZXB0LCBzcCk7Ci0gICAgR1BSX0FTU0VSVChzcC0+c29ja2V0KTsKLSAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci0gIH0KLQotICByZXR1cm4gc3A7Ci19Ci0KLWludCBncnBjX3RjcF9zZXJ2ZXJfYWRkX3BvcnQoZ3JwY190Y3Bfc2VydmVyICpzLCBjb25zdCB2b2lkICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4pIHsKLSAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOwotICBTT0NLRVQgc29jazsKLSAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNl92NG1hcHBlZDsKLSAgc3RydWN0IHNvY2thZGRyX2luNiB3aWxkY2FyZDsKLSAgc3RydWN0IHNvY2thZGRyICphbGxvY2F0ZWRfYWRkciA9IE5VTEw7Ci0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNvY2tuYW1lX3RlbXA7Ci0gIHNvY2tsZW5fdCBzb2NrbmFtZV9sZW47Ci0gIGludCBwb3J0OwotICB1bnNpZ25lZCBwb3J0X2luZGV4ID0gMDsKLSAgaWYgKHMtPnRhaWwgIT0gTlVMTCkgewotICAgIHBvcnRfaW5kZXggPSBzLT50YWlsLT5wb3J0X2luZGV4ICsgMTsKLSAgfQotCi0gIC8qIENoZWNrIGlmIHRoaXMgaXMgYSB3aWxkY2FyZCBwb3J0LCBhbmQgaWYgc28sIHRyeSB0byBrZWVwIHRoZSBwb3J0IHRoZSBzYW1lCi0gICAgIGFzIHNvbWUgcHJldmlvdXNseSBjcmVhdGVkIGxpc3RlbmVyLiAqLwotICBpZiAoZ3JwY19zb2NrYWRkcl9nZXRfcG9ydChhZGRyKSA9PSAwKSB7Ci0gICAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwOyBzcCA9IHNwLT5uZXh0KSB7Ci0gICAgICBzb2NrbmFtZV9sZW4gPSBzaXplb2Yoc29ja25hbWVfdGVtcCk7Ci0gICAgICBpZiAoMCA9PSBnZXRzb2NrbmFtZShzcC0+c29ja2V0LT5zb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXAsICZzb2NrbmFtZV9sZW4pKSB7Ci0gICAgICAgIHBvcnQgPSBncnBjX3NvY2thZGRyX2dldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCk7Ci0gICAgICAgIGlmIChwb3J0ID4gMCkgewotICAgICAgICAgIGFsbG9jYXRlZF9hZGRyID0gbWFsbG9jKGFkZHJfbGVuKTsKLSAgICAgICAgICBtZW1jcHkoYWxsb2NhdGVkX2FkZHIsIGFkZHIsIGFkZHJfbGVuKTsKLSAgICAgICAgICBncnBjX3NvY2thZGRyX3NldF9wb3J0KGFsbG9jYXRlZF9hZGRyLCBwb3J0KTsKLSAgICAgICAgICBhZGRyID0gYWxsb2NhdGVkX2FkZHI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZChhZGRyLCAmYWRkcjZfdjRtYXBwZWQpKSB7Ci0gICAgYWRkciA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjZfdjRtYXBwZWQ7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjZfdjRtYXBwZWQpOwotICB9Ci0KLSAgLyogVHJlYXQgOjogb3IgMC4wLjAuMCBhcyBhIGZhbWlseS1hZ25vc3RpYyB3aWxkY2FyZC4gKi8KLSAgaWYgKGdycGNfc29ja2FkZHJfaXNfd2lsZGNhcmQoYWRkciwgJnBvcnQpKSB7Ci0gICAgZ3JwY19zb2NrYWRkcl9tYWtlX3dpbGRjYXJkNihwb3J0LCAmd2lsZGNhcmQpOwotCi0gICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZGNhcmQ7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2Yod2lsZGNhcmQpOwotICB9Ci0KLSAgc29jayA9IFdTQVNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgIFdTQV9GTEFHX09WRVJMQVBQRUQpOwotICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgewotICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldDogJXMiLCB1dGY4X21lc3NhZ2UpOwotICAgIGdwcl9mcmVlKHV0ZjhfbWVzc2FnZSk7Ci0gIH0KLQotICBzcCA9IGFkZF9zb2NrZXRfdG9fc2VydmVyKHMsIHNvY2ssIGFkZHIsIGFkZHJfbGVuLCBwb3J0X2luZGV4KTsKLSAgZ3ByX2ZyZWUoYWxsb2NhdGVkX2FkZHIpOwotCi0gIGlmIChzcCkgewotICAgIHJldHVybiBzcC0+cG9ydDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotdW5zaWduZWQgZ3JwY190Y3Bfc2VydmVyX3BvcnRfZmRfY291bnQoZ3JwY190Y3Bfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydF9pbmRleCkgewotICBncnBjX3RjcF9saXN0ZW5lciAqc3A7Ci0gIGZvciAoc3AgPSBzLT5oZWFkOyBzcCAmJiBwb3J0X2luZGV4ICE9IDA7IHNwID0gc3AtPm5leHQsIC0tcG9ydF9pbmRleCkKLSAgICA7Ci0gIGlmIChzcCkgewotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLWludCBncnBjX3RjcF9zZXJ2ZXJfcG9ydF9mZChncnBjX3RjcF9zZXJ2ZXIgKnMsIHVuc2lnbmVkIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmRfaW5kZXgpIHsKLSAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOwotICBpZiAoZmRfaW5kZXggIT0gMCkgewotICAgIC8qIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gaGFzIG9ubHkgb25lIGZkIHBlciBwb3J0X2luZGV4LiAqLwotICAgIHJldHVybiAtMTsKLSAgfQotICBmb3IgKHNwID0gcy0+aGVhZDsgc3AgJiYgcG9ydF9pbmRleCAhPSAwOyBzcCA9IHNwLT5uZXh0LCAtLXBvcnRfaW5kZXgpCi0gICAgOwotICBpZiAoc3ApIHsKLSAgICByZXR1cm4gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdClzcC0+c29ja2V0LT5zb2NrZXQsIDApOwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotfQotCi12b2lkIGdycGNfdGNwX3NlcnZlcl9zdGFydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldCwgc2l6ZV90IHBvbGxzZXRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9zZXJ2ZXJfY2Igb25fYWNjZXB0X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb25fYWNjZXB0X2NiX2FyZykgewotICBncnBjX3RjcF9saXN0ZW5lciAqc3A7Ci0gIEdQUl9BU1NFUlQob25fYWNjZXB0X2NiKTsKLSAgZ3ByX211X2xvY2soJnMtPm11KTsKLSAgR1BSX0FTU0VSVCghcy0+b25fYWNjZXB0X2NiKTsKLSAgR1BSX0FTU0VSVChzLT5hY3RpdmVfcG9ydHMgPT0gMCk7Ci0gIHMtPm9uX2FjY2VwdF9jYiA9IG9uX2FjY2VwdF9jYjsKLSAgcy0+b25fYWNjZXB0X2NiX2FyZyA9IG9uX2FjY2VwdF9jYl9hcmc7Ci0gIGZvciAoc3AgPSBzLT5oZWFkOyBzcDsgc3AgPSBzcC0+bmV4dCkgewotICAgIHN0YXJ0X2FjY2VwdChleGVjX2N0eCwgc3ApOwotICAgIHMtPmFjdGl2ZV9wb3J0cysrOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLX0KLQotI2VuZGlmIC8qIEdQUl9XSU5TT0NLX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuYyBiL3NyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWRiNWYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nX3dpbjMyLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90aW1lci5oIgotCi1zdGF0aWMgaW50IHNldF9ub25fYmxvY2soU09DS0VUIHNvY2spIHsKLSAgaW50IHN0YXR1czsKLSAgdW5zaWduZWQgbG9uZyBwYXJhbSA9IDE7Ci0gIERXT1JEIHJldDsKLSAgc3RhdHVzID0KLSAgICAgIFdTQUlvY3RsKHNvY2ssIEZJT05CSU8sICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSwgTlVMTCwgMCwgJnJldCwgTlVMTCwgTlVMTCk7Ci0gIHJldHVybiBzdGF0dXMgPT0gMDsKLX0KLQotc3RhdGljIGludCBzZXRfZHVhbHN0YWNrKFNPQ0tFVCBzb2NrKSB7Ci0gIGludCBzdGF0dXM7Ci0gIHVuc2lnbmVkIGxvbmcgcGFyYW0gPSAwOwotICBzdGF0dXMgPSBzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIChjb25zdCBjaGFyICopJnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbSkpOwotICByZXR1cm4gc3RhdHVzID09IDA7Ci19Ci0KLWludCBncnBjX3RjcF9wcmVwYXJlX3NvY2tldChTT0NLRVQgc29jaykgewotICBpZiAoIXNldF9ub25fYmxvY2soc29jaykpIHJldHVybiAwOwotICBpZiAoIXNldF9kdWFsc3RhY2soc29jaykpIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190Y3AgewotICAvKiBUaGlzIGlzIG91ciBDKysgY2xhc3MgZGVyaXZhdGlvbiBlbXVsYXRpb24uICovCi0gIGdycGNfZW5kcG9pbnQgYmFzZTsKLSAgLyogVGhlIG9uZSBzb2NrZXQgdGhpcyBlbmRwb2ludCBpcyB1c2luZy4gKi8KLSAgZ3JwY193aW5zb2NrZXQgKnNvY2tldDsKLSAgLyogUmVmY291bnRpbmcgaG93IG1hbnkgb3BlcmF0aW9ucyBhcmUgaW4gcHJvZ3Jlc3MuICovCi0gIGdwcl9yZWZjb3VudCByZWZjb3VudDsKLQotICBncnBjX2Nsb3N1cmUgb25fcmVhZDsKLSAgZ3JwY19jbG9zdXJlIG9uX3dyaXRlOwotCi0gIGdycGNfY2xvc3VyZSAqcmVhZF9jYjsKLSAgZ3JwY19jbG9zdXJlICp3cml0ZV9jYjsKLSAgZ3ByX3NsaWNlIHJlYWRfc2xpY2U7Ci0gIGdwcl9zbGljZV9idWZmZXIgKndyaXRlX3NsaWNlczsKLSAgZ3ByX3NsaWNlX2J1ZmZlciAqcmVhZF9zbGljZXM7Ci0KLSAgLyogVGhlIElPIENvbXBsZXRpb24gUG9ydCBydW5zIGZyb20gYW5vdGhlciB0aHJlYWQuIFdlIG5lZWQgc29tZSBtZWNoYW5pc20KLSAgICAgdG8gcHJvdGVjdCBvdXJzZWx2ZXMgd2hlbiByZXF1ZXN0aW5nIGEgc2h1dGRvd24uICovCi0gIGdwcl9tdSBtdTsKLSAgaW50IHNodXR0aW5nX2Rvd247Ci0KLSAgY2hhciAqcGVlcl9zdHJpbmc7Ci19IGdycGNfdGNwOwotCi1zdGF0aWMgdm9pZCB0Y3BfZnJlZShncnBjX3RjcCAqdGNwKSB7Ci0gIGdycGNfd2luc29ja2V0X2Rlc3Ryb3kodGNwLT5zb2NrZXQpOwotICBncHJfbXVfZGVzdHJveSgmdGNwLT5tdSk7Ci0gIGdwcl9mcmVlKHRjcC0+cGVlcl9zdHJpbmcpOwotICBncHJfZnJlZSh0Y3ApOwotfQotCi0vKiNkZWZpbmUgR1JQQ19UQ1BfUkVGQ09VTlRfREVCVUcqLwotI2lmZGVmIEdSUENfVENQX1JFRkNPVU5UX0RFQlVHCi0jZGVmaW5lIFRDUF9VTlJFRih0Y3AsIHJlYXNvbikgdGNwX3VucmVmKCh0Y3ApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBUQ1BfUkVGKHRjcCwgcmVhc29uKSB0Y3BfcmVmKCh0Y3ApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgdGNwX3VucmVmKGdycGNfdGNwICp0Y3AsIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJUQ1AgdW5yZWYgJXAgOiAlcyAlZCAtPiAlZCIsIHRjcCwKLSAgICAgICAgICByZWFzb24sIHRjcC0+cmVmY291bnQuY291bnQsIHRjcC0+cmVmY291bnQuY291bnQgLSAxKTsKLSAgaWYgKGdwcl91bnJlZigmdGNwLT5yZWZjb3VudCkpIHsKLSAgICB0Y3BfZnJlZSh0Y3ApOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHRjcF9yZWYoZ3JwY190Y3AgKnRjcCwgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJUQ1AgICByZWYgJXAgOiAlcyAlZCAtPiAlZCIsIHRjcCwKLSAgICAgICAgICByZWFzb24sIHRjcC0+cmVmY291bnQuY291bnQsIHRjcC0+cmVmY291bnQuY291bnQgKyAxKTsKLSAgZ3ByX3JlZigmdGNwLT5yZWZjb3VudCk7Ci19Ci0jZWxzZQotI2RlZmluZSBUQ1BfVU5SRUYodGNwLCByZWFzb24pIHRjcF91bnJlZigodGNwKSkKLSNkZWZpbmUgVENQX1JFRih0Y3AsIHJlYXNvbikgdGNwX3JlZigodGNwKSkKLXN0YXRpYyB2b2lkIHRjcF91bnJlZihncnBjX3RjcCAqdGNwKSB7Ci0gIGlmIChncHJfdW5yZWYoJnRjcC0+cmVmY291bnQpKSB7Ci0gICAgdGNwX2ZyZWUodGNwKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB0Y3BfcmVmKGdycGNfdGNwICp0Y3ApIHsgZ3ByX3JlZigmdGNwLT5yZWZjb3VudCk7IH0KLSNlbmRpZgotCi0vKiBBc3luY2hyb25vdXMgY2FsbGJhY2sgZnJvbSB0aGUgSU9DUCwgb3IgdGhlIGJhY2tncm91bmQgdGhyZWFkLiAqLwotc3RhdGljIHZvaWQgb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdGNwcCwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSB0Y3BwOwotICBncnBjX2Nsb3N1cmUgKmNiID0gdGNwLT5yZWFkX2NiOwotICBncnBjX3dpbnNvY2tldCAqc29ja2V0ID0gdGNwLT5zb2NrZXQ7Ci0gIGdwcl9zbGljZSBzdWI7Ci0gIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmc29ja2V0LT5yZWFkX2luZm87Ci0KLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBpZiAoaW5mby0+d3NhX2Vycm9yICE9IDAgJiYgIXRjcC0+c2h1dHRpbmdfZG93bikgewotICAgICAgaWYgKGluZm8tPndzYV9lcnJvciAhPSBXU0FFQ09OTlJFU0VUKSB7Ci0gICAgICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShpbmZvLT53c2FfZXJyb3IpOwotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlJlYWRGaWxlIG92ZXJsYXBwZWQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgZ3ByX3NsaWNlX3VucmVmKHRjcC0+cmVhZF9zbGljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpbmZvLT5ieXRlc190cmFuc2ZlcmVkICE9IDAgJiYgIXRjcC0+c2h1dHRpbmdfZG93bikgewotICAgICAgICBzdWIgPSBncHJfc2xpY2Vfc3ViX25vX3JlZih0Y3AtPnJlYWRfc2xpY2UsIDAsIGluZm8tPmJ5dGVzX3RyYW5zZmVyZWQpOwotICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCh0Y3AtPnJlYWRfc2xpY2VzLCBzdWIpOwotICAgICAgICBzdWNjZXNzID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdwcl9zbGljZV91bnJlZih0Y3AtPnJlYWRfc2xpY2UpOwotICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB0Y3AtPnJlYWRfY2IgPSBOVUxMOwotICBUQ1BfVU5SRUYodGNwLCAicmVhZCIpOwotICBpZiAoY2IpIHsKLSAgICBjYi0+Y2IoZXhlY19jdHgsIGNiLT5jYl9hcmcsIHN1Y2Nlc3MpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHdpbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKLSAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnJlYWRfc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgZ3JwY193aW5zb2NrZXQgKmhhbmRsZSA9IHRjcC0+c29ja2V0OwotICBncnBjX3dpbnNvY2tldF9jYWxsYmFja19pbmZvICppbmZvID0gJmhhbmRsZS0+cmVhZF9pbmZvOwotICBpbnQgc3RhdHVzOwotICBEV09SRCBieXRlc19yZWFkID0gMDsKLSAgRFdPUkQgZmxhZ3MgPSAwOwotICBXU0FCVUYgYnVmZmVyOwotCi0gIGlmICh0Y3AtPnNodXR0aW5nX2Rvd24pIHsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBmYWxzZSwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdGNwLT5yZWFkX2NiID0gY2I7Ci0gIHRjcC0+cmVhZF9zbGljZXMgPSByZWFkX3NsaWNlczsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYocmVhZF9zbGljZXMpOwotCi0gIHRjcC0+cmVhZF9zbGljZSA9IGdwcl9zbGljZV9tYWxsb2MoODE5Mik7Ci0KLSAgYnVmZmVyLmxlbiA9IChVTE9ORylHUFJfU0xJQ0VfTEVOR1RIKAotICAgICAgdGNwLT5yZWFkX3NsaWNlKTsgIC8vIHdlIGtub3cgc2xpY2Ugc2l6ZSBmaXRzIGluIDMyYml0LgotICBidWZmZXIuYnVmID0gKGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKHRjcC0+cmVhZF9zbGljZSk7Ci0KLSAgVENQX1JFRih0Y3AsICJyZWFkIik7Ci0KLSAgLyogRmlyc3QgbGV0J3MgdHJ5IGEgc3luY2hyb25vdXMsIG5vbi1ibG9ja2luZyByZWFkLiAqLwotICBzdGF0dXMgPQotICAgICAgV1NBUmVjdih0Y3AtPnNvY2tldC0+c29ja2V0LCAmYnVmZmVyLCAxLCAmYnl0ZXNfcmVhZCwgJmZsYWdzLCBOVUxMLCBOVUxMKTsKLSAgaW5mby0+d3NhX2Vycm9yID0gc3RhdHVzID09IDAgPyAwIDogV1NBR2V0TGFzdEVycm9yKCk7Ci0KLSAgLyogRGlkIHdlIGdldCBkYXRhIGltbWVkaWF0ZWx5ID8gWWF5LiAqLwotICBpZiAoaW5mby0+d3NhX2Vycm9yICE9IFdTQUVXT1VMREJMT0NLKSB7Ci0gICAgaW5mby0+Ynl0ZXNfdHJhbnNmZXJlZCA9IGJ5dGVzX3JlYWQ7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmdGNwLT5vbl9yZWFkLCB0cnVlLCBOVUxMKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBPdGhlcndpc2UsIGxldCdzIHJldHJ5LCBieSBxdWV1aW5nIGEgcmVhZC4gKi8KLSAgbWVtc2V0KCZ0Y3AtPnNvY2tldC0+cmVhZF9pbmZvLm92ZXJsYXBwZWQsIDAsIHNpemVvZihPVkVSTEFQUEVEKSk7Ci0gIHN0YXR1cyA9IFdTQVJlY3YodGNwLT5zb2NrZXQtPnNvY2tldCwgJmJ1ZmZlciwgMSwgJmJ5dGVzX3JlYWQsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAmaW5mby0+b3ZlcmxhcHBlZCwgTlVMTCk7Ci0KLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgaW50IHdzYV9lcnJvciA9IFdTQUdldExhc3RFcnJvcigpOwotICAgIGlmICh3c2FfZXJyb3IgIT0gV1NBX0lPX1BFTkRJTkcpIHsKLSAgICAgIGluZm8tPndzYV9lcnJvciA9IHdzYV9lcnJvcjsKLSAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJnRjcC0+b25fcmVhZCwgZmFsc2UsIE5VTEwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIGdycGNfc29ja2V0X25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCB0Y3AtPnNvY2tldCwgJnRjcC0+b25fcmVhZCk7Ci19Ci0KLS8qIEFzeW5jaHJvbm91cyBjYWxsYmFjayBmcm9tIHRoZSBJT0NQLCBvciB0aGUgYmFja2dyb3VuZCB0aHJlYWQuICovCi1zdGF0aWMgdm9pZCBvbl93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdGNwcCwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKil0Y3BwOwotICBncnBjX3dpbnNvY2tldCAqaGFuZGxlID0gdGNwLT5zb2NrZXQ7Ci0gIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmaGFuZGxlLT53cml0ZV9pbmZvOwotICBncnBjX2Nsb3N1cmUgKmNiOwotCi0gIGdwcl9tdV9sb2NrKCZ0Y3AtPm11KTsKLSAgY2IgPSB0Y3AtPndyaXRlX2NiOwotICB0Y3AtPndyaXRlX2NiID0gTlVMTDsKLSAgZ3ByX211X3VubG9jaygmdGNwLT5tdSk7Ci0KLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBpZiAoaW5mby0+d3NhX2Vycm9yICE9IDApIHsKLSAgICAgIGlmIChpbmZvLT53c2FfZXJyb3IgIT0gV1NBRUNPTk5SRVNFVCkgewotICAgICAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoaW5mby0+d3NhX2Vycm9yKTsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJXU0FTZW5kIG92ZXJsYXBwZWQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBHUFJfQVNTRVJUKGluZm8tPmJ5dGVzX3RyYW5zZmVyZWQgPT0gdGNwLT53cml0ZV9zbGljZXMtPmxlbmd0aCk7Ci0gICAgfQotICB9Ci0KLSAgVENQX1VOUkVGKHRjcCwgIndyaXRlIik7Ci0gIGNiLT5jYihleGVjX2N0eCwgY2ItPmNiX2FyZywgc3VjY2Vzcyk7Ci19Ci0KLS8qIEluaXRpYXRlcyBhIHdyaXRlLiAqLwotc3RhdGljIHZvaWQgd2luX3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKLSAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZXMsIGdycGNfY2xvc3VyZSAqY2IpIHsKLSAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOwotICBncnBjX3dpbnNvY2tldCAqc29ja2V0ID0gdGNwLT5zb2NrZXQ7Ci0gIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmc29ja2V0LT53cml0ZV9pbmZvOwotICB1bnNpZ25lZCBpOwotICBEV09SRCBieXRlc19zZW50OwotICBpbnQgc3RhdHVzOwotICBXU0FCVUYgbG9jYWxfYnVmZmVyc1sxNl07Ci0gIFdTQUJVRiAqYWxsb2NhdGVkID0gTlVMTDsKLSAgV1NBQlVGICpidWZmZXJzID0gbG9jYWxfYnVmZmVyczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAodGNwLT5zaHV0dGluZ19kb3duKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjYiwgZmFsc2UsIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRjcC0+d3JpdGVfY2IgPSBjYjsKLSAgdGNwLT53cml0ZV9zbGljZXMgPSBzbGljZXM7Ci0gIEdQUl9BU1NFUlQodGNwLT53cml0ZV9zbGljZXMtPmNvdW50IDw9IFVJTlRfTUFYKTsKLSAgaWYgKHRjcC0+d3JpdGVfc2xpY2VzLT5jb3VudCA+IEdQUl9BUlJBWV9TSVpFKGxvY2FsX2J1ZmZlcnMpKSB7Ci0gICAgYnVmZmVycyA9IChXU0FCVUYgKilncHJfbWFsbG9jKHNpemVvZihXU0FCVUYpICogdGNwLT53cml0ZV9zbGljZXMtPmNvdW50KTsKLSAgICBhbGxvY2F0ZWQgPSBidWZmZXJzOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRjcC0+d3JpdGVfc2xpY2VzLT5jb3VudDsgaSsrKSB7Ci0gICAgbGVuID0gR1BSX1NMSUNFX0xFTkdUSCh0Y3AtPndyaXRlX3NsaWNlcy0+c2xpY2VzW2ldKTsKLSAgICBHUFJfQVNTRVJUKGxlbiA8PSBVTE9OR19NQVgpOwotICAgIGJ1ZmZlcnNbaV0ubGVuID0gKFVMT05HKWxlbjsKLSAgICBidWZmZXJzW2ldLmJ1ZiA9IChjaGFyICopR1BSX1NMSUNFX1NUQVJUX1BUUih0Y3AtPndyaXRlX3NsaWNlcy0+c2xpY2VzW2ldKTsKLSAgfQotCi0gIC8qIEZpcnN0LCBsZXQncyB0cnkgYSBzeW5jaHJvbm91cywgbm9uLWJsb2NraW5nIHdyaXRlLiAqLwotICBzdGF0dXMgPSBXU0FTZW5kKHNvY2tldC0+c29ja2V0LCBidWZmZXJzLCAoRFdPUkQpdGNwLT53cml0ZV9zbGljZXMtPmNvdW50LAotICAgICAgICAgICAgICAgICAgICZieXRlc19zZW50LCAwLCBOVUxMLCBOVUxMKTsKLSAgaW5mby0+d3NhX2Vycm9yID0gc3RhdHVzID09IDAgPyAwIDogV1NBR2V0TGFzdEVycm9yKCk7Ci0KLSAgLyogV2Ugd291bGQga2luZCBvZiBleHBlY3QgdG8gZ2V0IGEgV1NBRVdPVUxEQkxPQ0sgaGVyZSwgZXNwZWNpYWxseSBvbiBhIGJ1c3kKLSAgICAgY29ubmVjdGlvbiB0aGF0IGhhcyBpdHMgc2VuZCBxdWV1ZSBmaWxsZWQgdXAuIEJ1dCBpZiB3ZSBkb24ndCwgdGhlbiB3ZSBjYW4KLSAgICAgYXZvaWQgZG9pbmcgYW4gYXN5bmMgd3JpdGUgb3BlcmF0aW9uIGF0IGFsbC4gKi8KLSAgaWYgKGluZm8tPndzYV9lcnJvciAhPSBXU0FFV09VTERCTE9DSykgewotICAgIGJvb2wgb2sgPSBmYWxzZTsKLSAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgIG9rID0gdHJ1ZTsKLSAgICAgIEdQUl9BU1NFUlQoYnl0ZXNfc2VudCA9PSB0Y3AtPndyaXRlX3NsaWNlcy0+bGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGluZm8tPndzYV9lcnJvciAhPSBXU0FFQ09OTlJFU0VUKSB7Ci0gICAgICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShpbmZvLT53c2FfZXJyb3IpOwotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIldTQVNlbmQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKLSAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGFsbG9jYXRlZCkgZ3ByX2ZyZWUoYWxsb2NhdGVkKTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBvaywgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgVENQX1JFRih0Y3AsICJ3cml0ZSIpOwotCi0gIC8qIElmIHdlIGdvdCBhIFdTQUVXT1VMREJMT0NLIGVhcmxpZXIsIHRoZW4gd2UgbmVlZCB0byByZS1kbyB0aGUgc2FtZQotICAgICBvcGVyYXRpb24sIHRoaXMgdGltZSBhc3luY2hyb25vdXNseS4gKi8KLSAgbWVtc2V0KCZzb2NrZXQtPndyaXRlX2luZm8ub3ZlcmxhcHBlZCwgMCwgc2l6ZW9mKE9WRVJMQVBQRUQpKTsKLSAgc3RhdHVzID0gV1NBU2VuZChzb2NrZXQtPnNvY2tldCwgYnVmZmVycywgKERXT1JEKXRjcC0+d3JpdGVfc2xpY2VzLT5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAmYnl0ZXNfc2VudCwgMCwgJnNvY2tldC0+d3JpdGVfaW5mby5vdmVybGFwcGVkLCBOVUxMKTsKLSAgaWYgKGFsbG9jYXRlZCkgZ3ByX2ZyZWUoYWxsb2NhdGVkKTsKLQotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICBpbnQgd3NhX2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgaWYgKHdzYV9lcnJvciAhPSBXU0FfSU9fUEVORElORykgewotICAgICAgVENQX1VOUkVGKHRjcCwgIndyaXRlIik7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBmYWxzZSwgTlVMTCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLyogQXMgYWxsIGlzIG5vdyBzZXR1cCwgd2UgY2FuIG5vdyBhc2sgZm9yIHRoZSBJT0NQIG5vdGlmaWNhdGlvbi4gSXQgbWF5Ci0gICAgIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5IGhvd2V2ZXIsIGJ1dCBubyBtYXR0ZXIuICovCi0gIGdycGNfc29ja2V0X25vdGlmeV9vbl93cml0ZShleGVjX2N0eCwgc29ja2V0LCAmdGNwLT5vbl93cml0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdpbl9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwcykgewotICBncnBjX3RjcCAqdGNwOwotICAodm9pZClwczsKLSAgdGNwID0gKGdycGNfdGNwICopZXA7Ci0gIGdycGNfaW9jcF9hZGRfc29ja2V0KHRjcC0+c29ja2V0KTsKLX0KLQotc3RhdGljIHZvaWQgd2luX2FkZF90b19wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBzcykgewotICBncnBjX3RjcCAqdGNwOwotICAodm9pZClwc3M7Ci0gIHRjcCA9IChncnBjX3RjcCAqKWVwOwotICBncnBjX2lvY3BfYWRkX3NvY2tldCh0Y3AtPnNvY2tldCk7Ci19Ci0KLS8qIEluaXRpYXRlcyBhIHNodXRkb3duIG9mIHRoZSBUQ1AgZW5kcG9pbnQuIFRoaXMgd2lsbCBxdWV1ZSBhYm9ydCBjYWxsYmFja3MKLSAgIGZvciB0aGUgcG90ZW50aWFsIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8KLSAgIGd1YXJhbnRlZSB0aGlzIGlzbid0IGNhbGxlZCBpbiBwYXJhbGxlbCB0byBhIHJlYWQgb3Igd3JpdGUgcmVxdWVzdCwgc28KLSAgIHdlJ3JlIG5vdCBnb2luZyB0byBwcm90ZWN0IGFnYWluc3QgdGhlc2UuIEhvd2V2ZXIgdGhlIElPIENvbXBsZXRpb24gUG9ydAotICAgY2FsbGJhY2sgd2lsbCBoYXBwZW4gZnJvbSBhbm90aGVyIHRocmVhZCwgc28gd2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QKLSAgIGNvbmN1cnJlbnQgYWNjZXNzIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiB0aGF0IHJlZ2FyZC4gKi8KLXN0YXRpYyB2b2lkIHdpbl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApIHsKLSAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOwotICBncHJfbXVfbG9jaygmdGNwLT5tdSk7Ci0gIC8qIEF0IHRoYXQgcG9pbnQsIHdoYXQgbWF5IGhhcHBlbiBpcyB0aGF0IHdlJ3JlIGFscmVhZHkgaW5zaWRlIHRoZSBJT0NQCi0gICAgIGNhbGxiYWNrLiBTZWUgdGhlIGNvbW1lbnRzIGluIG9uX3JlYWQgYW5kIG9uX3dyaXRlLiAqLwotICB0Y3AtPnNodXR0aW5nX2Rvd24gPSAxOwotICBncnBjX3dpbnNvY2tldF9zaHV0ZG93bih0Y3AtPnNvY2tldCk7Ci0gIGdwcl9tdV91bmxvY2soJnRjcC0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCB3aW5fZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApIHsKLSAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOwotICBUQ1BfVU5SRUYodGNwLCAiZGVzdHJveSIpOwotfQotCi1zdGF0aWMgY2hhciAqd2luX2dldF9wZWVyKGdycGNfZW5kcG9pbnQgKmVwKSB7Ci0gIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKLSAgcmV0dXJuIGdwcl9zdHJkdXAodGNwLT5wZWVyX3N0cmluZyk7Ci19Ci0KLXN0YXRpYyBncnBjX2VuZHBvaW50X3Z0YWJsZSB2dGFibGUgPSB7Ci0gICAgd2luX3JlYWQsICAgICB3aW5fd3JpdGUsICAgd2luX2FkZF90b19wb2xsc2V0LCB3aW5fYWRkX3RvX3BvbGxzZXRfc2V0LAotICAgIHdpbl9zaHV0ZG93biwgd2luX2Rlc3Ryb3ksIHdpbl9nZXRfcGVlcn07Ci0KLWdycGNfZW5kcG9pbnQgKmdycGNfdGNwX2NyZWF0ZShncnBjX3dpbnNvY2tldCAqc29ja2V0LCBjaGFyICpwZWVyX3N0cmluZykgewotICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZ3ByX21hbGxvYyhzaXplb2YoZ3JwY190Y3ApKTsKLSAgbWVtc2V0KHRjcCwgMCwgc2l6ZW9mKGdycGNfdGNwKSk7Ci0gIHRjcC0+YmFzZS52dGFibGUgPSAmdnRhYmxlOwotICB0Y3AtPnNvY2tldCA9IHNvY2tldDsKLSAgZ3ByX211X2luaXQoJnRjcC0+bXUpOwotICBncHJfcmVmX2luaXQoJnRjcC0+cmVmY291bnQsIDEpOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmdGNwLT5vbl9yZWFkLCBvbl9yZWFkLCB0Y3ApOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmdGNwLT5vbl93cml0ZSwgb25fd3JpdGUsIHRjcCk7Ci0gIHRjcC0+cGVlcl9zdHJpbmcgPSBncHJfc3RyZHVwKHBlZXJfc3RyaW5nKTsKLSAgcmV0dXJuICZ0Y3AtPmJhc2U7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmggYi9zcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJjMTMzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9UQ1BfV0lORE9XU19ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9UQ1BfV0lORE9XU19ICi0vKgotICAgTG93IGxldmVsIFRDUCAiYm90dG9tIGhhbGYiIGltcGxlbWVudGF0aW9uLCBmb3IgdXNlIGJ5IHRyYW5zcG9ydHMgYnVpbHQgb24KLSAgIHRvcCBvZiBhIFRDUCBjb25uZWN0aW9uLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmaWxlIGRvZXMgbm90ICh5ZXQpIGluY2x1ZGUgQVBJcyBmb3IgY3JlYXRpbmcgdGhlIHNvY2tldCBpbgotICAgdGhlIGZpcnN0IHBsYWNlLgotCi0gICBBbGwgY2FsbHMgcGFzc2luZyBzbGljZSB0cmFuc2ZlciBvd25lcnNoaXAgb2YgYSBzbGljZSByZWZjb3VudCB1bmxlc3MKLSAgIG90aGVyd2lzZSBzcGVjaWZpZWQuCi0qLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIgotCi0vKiBDcmVhdGUgYSB0Y3AgZW5kcG9pbnQgZ2l2ZW4gYSB3aW5zb2NrIGhhbmRsZS4KLSAqIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlLgotICovCi1ncnBjX2VuZHBvaW50ICpncnBjX3RjcF9jcmVhdGUoZ3JwY193aW5zb2NrZXQgKnNvY2tldCwgY2hhciAqcGVlcl9zdHJpbmcpOwotCi1pbnQgZ3JwY190Y3BfcHJlcGFyZV9zb2NrZXQoU09DS0VUIHNvY2spOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1RDUF9XSU5ET1dTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyBiL3NyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NWRiNC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaCIKLQotdm9pZCBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfaW5pdChncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW5pdF9hdmcsIGRvdWJsZSByZWdyZXNzX3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBlcnNpc3RlbmNlX2ZhY3RvcikgewotICBzdGF0cy0+aW5pdF9hdmcgPSBpbml0X2F2ZzsKLSAgc3RhdHMtPnJlZ3Jlc3Nfd2VpZ2h0ID0gcmVncmVzc193ZWlnaHQ7Ci0gIHN0YXRzLT5wZXJzaXN0ZW5jZV9mYWN0b3IgPSBwZXJzaXN0ZW5jZV9mYWN0b3I7Ci0gIHN0YXRzLT5iYXRjaF90b3RhbF92YWx1ZSA9IDA7Ci0gIHN0YXRzLT5iYXRjaF9udW1fc2FtcGxlcyA9IDA7Ci0gIHN0YXRzLT5hZ2dyZWdhdGVfdG90YWxfd2VpZ2h0ID0gMDsKLSAgc3RhdHMtPmFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmcgPSBpbml0X2F2ZzsKLX0KLQotdm9pZCBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfYWRkX3NhbXBsZShncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIHsKLSAgc3RhdHMtPmJhdGNoX3RvdGFsX3ZhbHVlICs9IHZhbHVlOwotICArK3N0YXRzLT5iYXRjaF9udW1fc2FtcGxlczsKLX0KLQotZG91YmxlIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c191cGRhdGVfYXZlcmFnZSgKLSAgICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzKSB7Ci0gIC8qIFN0YXJ0IHdpdGggdGhlIGN1cnJlbnQgYmF0Y2g6ICovCi0gIGRvdWJsZSB3ZWlnaHRlZF9zdW0gPSBzdGF0cy0+YmF0Y2hfdG90YWxfdmFsdWU7Ci0gIGRvdWJsZSB0b3RhbF93ZWlnaHQgPSBzdGF0cy0+YmF0Y2hfbnVtX3NhbXBsZXM7Ci0gIGlmIChzdGF0cy0+cmVncmVzc193ZWlnaHQgPiAwKSB7Ci0gICAgLyogQWRkIGluIHRoZSByZWdyZXNzaW9uIHRvd2FyZHMgaW5pdF9hdmdfOiAqLwotICAgIHdlaWdodGVkX3N1bSArPSBzdGF0cy0+cmVncmVzc193ZWlnaHQgKiBzdGF0cy0+aW5pdF9hdmc7Ci0gICAgdG90YWxfd2VpZ2h0ICs9IHN0YXRzLT5yZWdyZXNzX3dlaWdodDsKLSAgfQotICBpZiAoc3RhdHMtPnBlcnNpc3RlbmNlX2ZhY3RvciA+IDApIHsKLSAgICAvKiBBZGQgaW4gdGhlIHBlcnNpc3RlbmNlOiAqLwotICAgIGNvbnN0IGRvdWJsZSBwcmV2X3NhbXBsZV93ZWlnaHQgPQotICAgICAgICBzdGF0cy0+cGVyc2lzdGVuY2VfZmFjdG9yICogc3RhdHMtPmFnZ3JlZ2F0ZV90b3RhbF93ZWlnaHQ7Ci0gICAgd2VpZ2h0ZWRfc3VtICs9IHByZXZfc2FtcGxlX3dlaWdodCAqIHN0YXRzLT5hZ2dyZWdhdGVfd2VpZ2h0ZWRfYXZnOwotICAgIHRvdGFsX3dlaWdodCArPSBwcmV2X3NhbXBsZV93ZWlnaHQ7Ci0gIH0KLSAgc3RhdHMtPmFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmcgPQotICAgICAgKHRvdGFsX3dlaWdodCA+IDApID8gKHdlaWdodGVkX3N1bSAvIHRvdGFsX3dlaWdodCkgOiBzdGF0cy0+aW5pdF9hdmc7Ci0gIHN0YXRzLT5hZ2dyZWdhdGVfdG90YWxfd2VpZ2h0ID0gdG90YWxfd2VpZ2h0OwotICBzdGF0cy0+YmF0Y2hfbnVtX3NhbXBsZXMgPSAwOwotICBzdGF0cy0+YmF0Y2hfdG90YWxfdmFsdWUgPSAwOwotICByZXR1cm4gc3RhdHMtPmFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmc7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmggYi9zcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGUyNDQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfVElNRV9BVkVSQUdFRF9TVEFUU19ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9USU1FX0FWRVJBR0VEX1NUQVRTX0gKLQotLyogVGhpcyB0cmFja3MgYSB0aW1lLWRlY2F5aW5nIHdlaWdodGVkIGF2ZXJhZ2UuICBJdCB3b3JrcyBieSBjb2xsZWN0aW5nCi0gICBiYXRjaGVzIG9mIHNhbXBsZXMgYW5kIHRoZW4gbWl4aW5nIHRoZWlyIGF2ZXJhZ2UgaW50byBhIHRpbWUtZGVjYXlpbmcKLSAgIHdlaWdodGVkIG1lYW4uICBJdCBpcyBkZXNpZ25lZCBmb3IgYmF0Y2ggb3BlcmF0aW9ucyB3aGVyZSB3ZSBkbyBtYW55IGFkZHMKLSAgIGJlZm9yZSB1cGRhdGluZyB0aGUgYXZlcmFnZS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGUgaW5pdGlhbCBhdmVyYWdlIHZhbHVlLiAgVGhpcyBpcyB0aGUgcmVwb3J0ZWQgYXZlcmFnZSB1bnRpbCB0aGUgZmlyc3QKLSAgICAgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX3VwZGF0ZV9hdmVyYWdlIGNhbGwuICBJZiBhIHBvc2l0aXZlIHJlZ3Jlc3Nfd2VpZ2h0Ci0gICAgIGlzIHVzZWQsIHdlIGFsc28gcmVncmVzcyB0b3dhcmRzIHRoaXMgdmFsdWUgb24gZWFjaCB1cGRhdGUuICovCi0gIGRvdWJsZSBpbml0X2F2ZzsKLSAgLyogVGhlIHNhbXBsZSB3ZWlnaHQgb2YgImluaXRfYXZnIiB0aGF0IGlzIG1peGVkIGluIHdpdGggZWFjaCBjYWxsIHRvCi0gICAgIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c191cGRhdGVfYXZlcmFnZS4gIElmIHRoZSBjYWxscyB0bwotICAgICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfYWRkX3NhbXBsZSBzdG9wLCB0aGlzIHdpbGwgY2F1c2UgdGhlIGF2ZXJhZ2UgdG8KLSAgICAgcmVncmVzcyBiYWNrIHRvIHRoZSBtZWFuLiAgVGhpcyBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlLiAgU2V0IGl0IHRvIDAgdG8KLSAgICAgZGlzYWJsZSB0aGUgYmlhcy4gIEEgdmFsdWUgb2YgMSBoYXMgdGhlIGVmZmVjdCBvZiBhZGRpbmcgaW4gMSBib251cyBzYW1wbGUKLSAgICAgd2l0aCB2YWx1ZSBpbml0X2F2ZyB0byBlYWNoIHNhbXBsZSBwZXJpb2QuICovCi0gIGRvdWJsZSByZWdyZXNzX3dlaWdodDsKLSAgLyogVGhpcyBkZXRlcm1pbmVzIHRoZSByYXRlIG9mIGRlY2F5IG9mIHRoZSB0aW1lLWF2ZXJhZ2luZyBmcm9tIG9uZSBwZXJpb2QKLSAgICAgdG8gdGhlIG5leHQgYnkgc2NhbGluZyB0aGUgYWdncmVnYXRlX3RvdGFsX3dlaWdodCBvZiBzYW1wbGVzIGZyb20gcHJpb3IKLSAgICAgcGVyaW9kcyB3aGVuIGNvbWJpbmluZyB3aXRoIHRoZSBsYXRlc3QgcGVyaW9kLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZQotICAgICBbMCwxXS4gIEEgaGlnaGVyIHZhbHVlIGFkYXB0cyBtb3JlIHNsb3dseS4gIFdpdGggYSB2YWx1ZSBvZiAwLjUsIGlmIHRoZQotICAgICBiYXRjaGVzIGVhY2ggaGF2ZSBrIHNhbXBsZXMsIHRoZSBzYW1wbGVzX2luX2F2Z18gd2lsbCBncm93IHRvIDIgaywgc28gdGhlCi0gICAgIHdlaWdodGluZyBvZiB0aGUgdGltZSBhdmVyYWdlIHdpbGwgZXZlbnR1YWxseSBiZSAxLzMgbmV3IGJhdGNoIGFuZCAyLzMKLSAgICAgb2xkIGF2ZXJhZ2UuICovCi0gIGRvdWJsZSBwZXJzaXN0ZW5jZV9mYWN0b3I7Ci0KLSAgLyogVGhlIHRvdGFsIHZhbHVlIG9mIHNhbXBsZXMgc2luY2UgdGhlIGxhc3QgVXBkYXRlQXZlcmFnZSgpLiAqLwotICBkb3VibGUgYmF0Y2hfdG90YWxfdmFsdWU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBzaW5jZSB0aGUgbGFzdCBVcGRhdGVBdmVyYWdlKCkuICovCi0gIGRvdWJsZSBiYXRjaF9udW1fc2FtcGxlczsKLSAgLyogVGhlIHRpbWUtZGVjYXllZCBzdW0gb2YgYmF0Y2hfbnVtX3NhbXBsZXNfIG92ZXIgcHJldmlvdXMgYmF0Y2hlcy4gIFRoaXMgaXMKLSAgICAgdGhlICJ3ZWlnaHQiIG9mIHRoZSBvbGQgYWdncmVnYXRlX3dlaWdodGVkX2F2Z18gd2hlbiB1cGRhdGluZyB0aGUKLSAgICAgYXZlcmFnZS4gKi8KLSAgZG91YmxlIGFnZ3JlZ2F0ZV90b3RhbF93ZWlnaHQ7Ci0gIC8qIEEgdGltZS1kZWNheWVkIGF2ZXJhZ2Ugb2YgdGhlIChiYXRjaF90b3RhbF92YWx1ZV8gLyBiYXRjaF9udW1fc2FtcGxlc18pLAotICAgICBjb21wdXRlZCBieSBkZWNheWluZyB0aGUgc2FtcGxlc19pbl9hdmdfIHdlaWdodCBpbiB0aGUgd2VpZ2h0ZWQgYXZlcmFnZS4gKi8KLSAgZG91YmxlIGFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmc7Ci19IGdycGNfdGltZV9hdmVyYWdlZF9zdGF0czsKLQotLyogU2VlIHRoZSBjb21tZW50cyBvbiB0aGUgbWVtYmVycyBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaW5pdF9hdmcsCi0gICByZWdyZXNzX3dlaWdodCwgYW5kIHBlcnNpc3RlbmNlX2ZhY3Rvci4gKi8KLXZvaWQgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX2luaXQoZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzKiBzdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGluaXRfYXZnLCBkb3VibGUgcmVncmVzc193ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJzaXN0ZW5jZV9mYWN0b3IpOwotLyogQWRkIGEgc2FtcGxlIHRvIHRoZSBjdXJyZW50IGJhdGNoLiAqLwotdm9pZCBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfYWRkX3NhbXBsZShncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwotLyogQ29tcGxldGUgYSBiYXRjaCBhbmQgY29tcHV0ZSB0aGUgbmV3IGVzdGltYXRlIG9mIHRoZSBhdmVyYWdlIHNhbXBsZQotICAgdmFsdWUuICovCi1kb3VibGUgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX3VwZGF0ZV9hdmVyYWdlKGdycGNfdGltZV9hdmVyYWdlZF9zdGF0cyogc3RhdHMpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1RJTUVfQVZFUkFHRURfU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdGltZXIuYyBiL3NyYy9jb3JlL2lvbWdyL3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDQ2NDMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5oIgotCi0jZGVmaW5lIElOVkFMSURfSEVBUF9JTkRFWCAweGZmZmZmZmZmdQotCi0jZGVmaW5lIExPRzJfTlVNX1NIQVJEUyA1Ci0jZGVmaW5lIE5VTV9TSEFSRFMgKDEgPDwgTE9HMl9OVU1fU0hBUkRTKQotI2RlZmluZSBBRERfREVBRExJTkVfU0NBTEUgMC4zMwotI2RlZmluZSBNSU5fUVVFVUVfV0lORE9XX0RVUkFUSU9OIDAuMDEKLSNkZWZpbmUgTUFYX1FVRVVFX1dJTkRPV19EVVJBVElPTiAxCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3ByX211IG11OwotICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMgc3RhdHM7Ci0gIC8qIEFsbCBhbmQgb25seSB0aW1lcnMgd2l0aCBkZWFkbGluZXMgPD0gdGhpcyB3aWxsIGJlIGluIHRoZSBoZWFwLiAqLwotICBncHJfdGltZXNwZWMgcXVldWVfZGVhZGxpbmVfY2FwOwotICBncHJfdGltZXNwZWMgbWluX2RlYWRsaW5lOwotICAvKiBJbmRleCBpbiB0aGUgZ19zaGFyZF9xdWV1ZSAqLwotICB1aW50MzJfdCBzaGFyZF9xdWV1ZV9pbmRleDsKLSAgLyogVGhpcyBob2xkcyBhbGwgdGltZXJzIHdpdGggZGVhZGxpbmVzIDwgcXVldWVfZGVhZGxpbmVfY2FwLiBUaW1lcnMgaW4gdGhpcwotICAgICBsaXN0IGhhdmUgdGhlIHRvcCBiaXQgb2YgdGhlaXIgZGVhZGxpbmUgc2V0IHRvIDAuICovCi0gIGdycGNfdGltZXJfaGVhcCBoZWFwOwotICAvKiBUaGlzIGhvbGRzIHRpbWVycyB3aG9zZSBkZWFkbGluZSBpcyA+PSBxdWV1ZV9kZWFkbGluZV9jYXAuICovCi0gIGdycGNfdGltZXIgbGlzdDsKLX0gc2hhcmRfdHlwZTsKLQotLyogUHJvdGVjdHMgZ19zaGFyZF9xdWV1ZSAqLwotc3RhdGljIGdwcl9tdSBnX211OwotLyogQWxsb3cgb25seSBvbmUgcnVuX3NvbWVfZXhwaXJlZF90aW1lcnMgYXQgb25jZSAqLwotc3RhdGljIGdwcl9tdSBnX2NoZWNrZXJfbXU7Ci1zdGF0aWMgZ3ByX2Nsb2NrX3R5cGUgZ19jbG9ja190eXBlOwotc3RhdGljIHNoYXJkX3R5cGUgZ19zaGFyZHNbTlVNX1NIQVJEU107Ci0vKiBQcm90ZWN0ZWQgYnkgZ19tdSAqLwotc3RhdGljIHNoYXJkX3R5cGUgKmdfc2hhcmRfcXVldWVbTlVNX1NIQVJEU107Ci0KLXN0YXRpYyBpbnQgcnVuX3NvbWVfZXhwaXJlZF90aW1lcnMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdwcl90aW1lc3BlYyBub3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyAqbmV4dCwgaW50IHN1Y2Nlc3MpOwotCi1zdGF0aWMgZ3ByX3RpbWVzcGVjIGNvbXB1dGVfbWluX2RlYWRsaW5lKHNoYXJkX3R5cGUgKnNoYXJkKSB7Ci0gIHJldHVybiBncnBjX3RpbWVyX2hlYXBfaXNfZW1wdHkoJnNoYXJkLT5oZWFwKQotICAgICAgICAgICAgID8gc2hhcmQtPnF1ZXVlX2RlYWRsaW5lX2NhcAotICAgICAgICAgICAgIDogZ3JwY190aW1lcl9oZWFwX3RvcCgmc2hhcmQtPmhlYXApLT5kZWFkbGluZTsKLX0KLQotdm9pZCBncnBjX3RpbWVyX2xpc3RfaW5pdChncHJfdGltZXNwZWMgbm93KSB7Ci0gIHVpbnQzMl90IGk7Ci0KLSAgZ3ByX211X2luaXQoJmdfbXUpOwotICBncHJfbXVfaW5pdCgmZ19jaGVja2VyX211KTsKLSAgZ19jbG9ja190eXBlID0gbm93LmNsb2NrX3R5cGU7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9TSEFSRFM7IGkrKykgewotICAgIHNoYXJkX3R5cGUgKnNoYXJkID0gJmdfc2hhcmRzW2ldOwotICAgIGdwcl9tdV9pbml0KCZzaGFyZC0+bXUpOwotICAgIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c19pbml0KCZzaGFyZC0+c3RhdHMsIDEuMCAvIEFERF9ERUFETElORV9TQ0FMRSwgMC4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSk7Ci0gICAgc2hhcmQtPnF1ZXVlX2RlYWRsaW5lX2NhcCA9IG5vdzsKLSAgICBzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggPSBpOwotICAgIGdycGNfdGltZXJfaGVhcF9pbml0KCZzaGFyZC0+aGVhcCk7Ci0gICAgc2hhcmQtPmxpc3QubmV4dCA9IHNoYXJkLT5saXN0LnByZXYgPSAmc2hhcmQtPmxpc3Q7Ci0gICAgc2hhcmQtPm1pbl9kZWFkbGluZSA9IGNvbXB1dGVfbWluX2RlYWRsaW5lKHNoYXJkKTsKLSAgICBnX3NoYXJkX3F1ZXVlW2ldID0gc2hhcmQ7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3RpbWVyX2xpc3Rfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgpIHsKLSAgaW50IGk7Ci0gIHJ1bl9zb21lX2V4cGlyZWRfdGltZXJzKGV4ZWNfY3R4LCBncHJfaW5mX2Z1dHVyZShnX2Nsb2NrX3R5cGUpLCBOVUxMLCAwKTsKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9TSEFSRFM7IGkrKykgewotICAgIHNoYXJkX3R5cGUgKnNoYXJkID0gJmdfc2hhcmRzW2ldOwotICAgIGdwcl9tdV9kZXN0cm95KCZzaGFyZC0+bXUpOwotICAgIGdycGNfdGltZXJfaGVhcF9kZXN0cm95KCZzaGFyZC0+aGVhcCk7Ci0gIH0KLSAgZ3ByX211X2Rlc3Ryb3koJmdfbXUpOwotICBncHJfbXVfZGVzdHJveSgmZ19jaGVja2VyX211KTsKLX0KLQotLyogVGhpcyBpcyBhIGNoZWFwLCBidXQgZ29vZCBlbm91Z2gsIHBvaW50ZXIgaGFzaCBmb3Igc2hhcmRpbmcgdGhlIHRhc2tzOiAqLwotc3RhdGljIHNpemVfdCBzaGFyZF9pZHgoY29uc3QgZ3JwY190aW1lciAqaW5mbykgewotICBzaXplX3QgeCA9IChzaXplX3QpaW5mbzsKLSAgcmV0dXJuICgoeCA+PiA0KSBeICh4ID4+IDkpIF4gKHggPj4gMTQpKSAmIChOVU1fU0hBUkRTIC0gMSk7Ci19Ci0KLXN0YXRpYyBkb3VibGUgdHNfdG9fZGJsKGdwcl90aW1lc3BlYyB0cykgewotICByZXR1cm4gKGRvdWJsZSl0cy50dl9zZWMgKyAxZS05ICogdHMudHZfbnNlYzsKLX0KLQotc3RhdGljIGdwcl90aW1lc3BlYyBkYmxfdG9fdHMoZG91YmxlIGQpIHsKLSAgZ3ByX3RpbWVzcGVjIHRzOwotICB0cy50dl9zZWMgPSAoaW50NjRfdClkOwotICB0cy50dl9uc2VjID0gKGludDMyX3QpKDFlOSAqIChkIC0gKGRvdWJsZSl0cy50dl9zZWMpKTsKLSAgdHMuY2xvY2tfdHlwZSA9IEdQUl9USU1FU1BBTjsKLSAgcmV0dXJuIHRzOwotfQotCi1zdGF0aWMgdm9pZCBsaXN0X2pvaW4oZ3JwY190aW1lciAqaGVhZCwgZ3JwY190aW1lciAqdGltZXIpIHsKLSAgdGltZXItPm5leHQgPSBoZWFkOwotICB0aW1lci0+cHJldiA9IGhlYWQtPnByZXY7Ci0gIHRpbWVyLT5uZXh0LT5wcmV2ID0gdGltZXItPnByZXYtPm5leHQgPSB0aW1lcjsKLX0KLQotc3RhdGljIHZvaWQgbGlzdF9yZW1vdmUoZ3JwY190aW1lciAqdGltZXIpIHsKLSAgdGltZXItPm5leHQtPnByZXYgPSB0aW1lci0+cHJldjsKLSAgdGltZXItPnByZXYtPm5leHQgPSB0aW1lci0+bmV4dDsKLX0KLQotc3RhdGljIHZvaWQgc3dhcF9hZGphY2VudF9zaGFyZHNfaW5fcXVldWUodWludDMyX3QgZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXgpIHsKLSAgc2hhcmRfdHlwZSAqdGVtcDsKLSAgdGVtcCA9IGdfc2hhcmRfcXVldWVbZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXhdOwotICBnX3NoYXJkX3F1ZXVlW2ZpcnN0X3NoYXJkX3F1ZXVlX2luZGV4XSA9Ci0gICAgICBnX3NoYXJkX3F1ZXVlW2ZpcnN0X3NoYXJkX3F1ZXVlX2luZGV4ICsgMV07Ci0gIGdfc2hhcmRfcXVldWVbZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXggKyAxXSA9IHRlbXA7Ci0gIGdfc2hhcmRfcXVldWVbZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXhdLT5zaGFyZF9xdWV1ZV9pbmRleCA9Ci0gICAgICBmaXJzdF9zaGFyZF9xdWV1ZV9pbmRleDsKLSAgZ19zaGFyZF9xdWV1ZVtmaXJzdF9zaGFyZF9xdWV1ZV9pbmRleCArIDFdLT5zaGFyZF9xdWV1ZV9pbmRleCA9Ci0gICAgICBmaXJzdF9zaGFyZF9xdWV1ZV9pbmRleCArIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGVfZGVhZGxpbmVfY2hhbmdlKHNoYXJkX3R5cGUgKnNoYXJkKSB7Ci0gIHdoaWxlIChzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggPiAwICYmCi0gICAgICAgICBncHJfdGltZV9jbXAoCi0gICAgICAgICAgICAgc2hhcmQtPm1pbl9kZWFkbGluZSwKLSAgICAgICAgICAgICBnX3NoYXJkX3F1ZXVlW3NoYXJkLT5zaGFyZF9xdWV1ZV9pbmRleCAtIDFdLT5taW5fZGVhZGxpbmUpIDwgMCkgewotICAgIHN3YXBfYWRqYWNlbnRfc2hhcmRzX2luX3F1ZXVlKHNoYXJkLT5zaGFyZF9xdWV1ZV9pbmRleCAtIDEpOwotICB9Ci0gIHdoaWxlIChzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggPCBOVU1fU0hBUkRTIC0gMSAmJgotICAgICAgICAgZ3ByX3RpbWVfY21wKAotICAgICAgICAgICAgIHNoYXJkLT5taW5fZGVhZGxpbmUsCi0gICAgICAgICAgICAgZ19zaGFyZF9xdWV1ZVtzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggKyAxXS0+bWluX2RlYWRsaW5lKSA+IDApIHsKLSAgICBzd2FwX2FkamFjZW50X3NoYXJkc19pbl9xdWV1ZShzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXgpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY190aW1lcl9pbml0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RpbWVyICp0aW1lciwKLSAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwgZ3JwY19pb21ncl9jYl9mdW5jIHRpbWVyX2NiLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGltZXJfY2JfYXJnLCBncHJfdGltZXNwZWMgbm93KSB7Ci0gIGludCBpc19maXJzdF90aW1lciA9IDA7Ci0gIHNoYXJkX3R5cGUgKnNoYXJkID0gJmdfc2hhcmRzW3NoYXJkX2lkeCh0aW1lcildOwotICBHUFJfQVNTRVJUKGRlYWRsaW5lLmNsb2NrX3R5cGUgPT0gZ19jbG9ja190eXBlKTsKLSAgR1BSX0FTU0VSVChub3cuY2xvY2tfdHlwZSA9PSBnX2Nsb2NrX3R5cGUpOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmdGltZXItPmNsb3N1cmUsIHRpbWVyX2NiLCB0aW1lcl9jYl9hcmcpOwotICB0aW1lci0+ZGVhZGxpbmUgPSBkZWFkbGluZTsKLSAgdGltZXItPnRyaWdnZXJlZCA9IDA7Ci0KLSAgLyogVE9ETyhjdGlsbGVyKTogY2hlY2sgZGVhZGxpbmUgZXhwaXJlZCAqLwotCi0gIGdwcl9tdV9sb2NrKCZzaGFyZC0+bXUpOwotICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfYWRkX3NhbXBsZSgmc2hhcmQtPnN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c190b19kYmwoZ3ByX3RpbWVfc3ViKGRlYWRsaW5lLCBub3cpKSk7Ci0gIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIHNoYXJkLT5xdWV1ZV9kZWFkbGluZV9jYXApIDwgMCkgewotICAgIGlzX2ZpcnN0X3RpbWVyID0gZ3JwY190aW1lcl9oZWFwX2FkZCgmc2hhcmQtPmhlYXAsIHRpbWVyKTsKLSAgfSBlbHNlIHsKLSAgICB0aW1lci0+aGVhcF9pbmRleCA9IElOVkFMSURfSEVBUF9JTkRFWDsKLSAgICBsaXN0X2pvaW4oJnNoYXJkLT5saXN0LCB0aW1lcik7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKLQotICAvKiBEZWFkbGluZSBtYXkgaGF2ZSBkZWNyZWFzZWQsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgcXVldWUuICBOb3RlCi0gICAgIHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmFjeSB1bmxvY2tlZCByZWdpb24gaGVyZS4gIFRoZXJlIGNvdWxkIGJlIGEKLSAgICAgcmVvcmRlcmluZyBvZiBtdWx0aXBsZSBncnBjX3RpbWVyX2luaXQgY2FsbHMsIGF0IHRoaXMgcG9pbnQsIGJ1dCB0aGUgPCB0ZXN0Ci0gICAgIGJlbG93IHNob3VsZCBlbnN1cmUgdGhhdCB3ZSBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4gIFRoZXJlIGNvdWxkCi0gICAgIGFsc28gYmUgYSByYWNlIHdpdGggZ3JwY190aW1lcl9jaGVjaywgd2hpY2ggbWlnaHQgYmVhdCB1cyB0byB0aGUgbG9jay4gIEluCi0gICAgIHRoYXQgY2FzZSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdGltZXIgdGhhdCB3ZSBhZGRlZCB3aWxsIGhhdmUgYWxyZWFkeQotICAgICBydW4gYnkgdGhlIHRpbWUgd2UgaG9sZCB0aGUgbG9jaywgYnV0IHRoYXQgdG9vIGlzIGEgc2FmZSBlcnJvci4KLSAgICAgRmluYWxseSwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBncnBjX3RpbWVyX2NoZWNrIHRoYXQgaW50ZXJ2ZW5lZCBmYWlsZWQgdG8KLSAgICAgdHJpZ2dlciB0aGUgbmV3IHRpbWVyIGJlY2F1c2UgdGhlIG1pbl9kZWFkbGluZSBoYWRuJ3QgeWV0IGJlZW4gcmVkdWNlZC4KLSAgICAgSW4gdGhhdCBjYXNlLCB0aGUgdGltZXIgd2lsbCBzaW1wbHkgaGF2ZSB0byB3YWl0IGZvciB0aGUgbmV4dAotICAgICBncnBjX3RpbWVyX2NoZWNrLiAqLwotICBpZiAoaXNfZmlyc3RfdGltZXIpIHsKLSAgICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gICAgaWYgKGdwcl90aW1lX2NtcChkZWFkbGluZSwgc2hhcmQtPm1pbl9kZWFkbGluZSkgPCAwKSB7Ci0gICAgICBncHJfdGltZXNwZWMgb2xkX21pbl9kZWFkbGluZSA9IGdfc2hhcmRfcXVldWVbMF0tPm1pbl9kZWFkbGluZTsKLSAgICAgIHNoYXJkLT5taW5fZGVhZGxpbmUgPSBkZWFkbGluZTsKLSAgICAgIG5vdGVfZGVhZGxpbmVfY2hhbmdlKHNoYXJkKTsKLSAgICAgIGlmIChzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggPT0gMCAmJgotICAgICAgICAgIGdwcl90aW1lX2NtcChkZWFkbGluZSwgb2xkX21pbl9kZWFkbGluZSkgPCAwKSB7Ci0gICAgICAgIGdycGNfa2lja19wb2xsZXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3RpbWVyX2NhbmNlbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190aW1lciAqdGltZXIpIHsKLSAgc2hhcmRfdHlwZSAqc2hhcmQgPSAmZ19zaGFyZHNbc2hhcmRfaWR4KHRpbWVyKV07Ci0gIGdwcl9tdV9sb2NrKCZzaGFyZC0+bXUpOwotICBpZiAoIXRpbWVyLT50cmlnZ2VyZWQpIHsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZ0aW1lci0+Y2xvc3VyZSwgZmFsc2UsIE5VTEwpOwotICAgIHRpbWVyLT50cmlnZ2VyZWQgPSAxOwotICAgIGlmICh0aW1lci0+aGVhcF9pbmRleCA9PSBJTlZBTElEX0hFQVBfSU5ERVgpIHsKLSAgICAgIGxpc3RfcmVtb3ZlKHRpbWVyKTsKLSAgICB9IGVsc2UgewotICAgICAgZ3JwY190aW1lcl9oZWFwX3JlbW92ZSgmc2hhcmQtPmhlYXAsIHRpbWVyKTsKLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHkgYW5kICJub3ciIGhhcyByZWFjaGVkIHRoZQotICAgcXVldWVfZGVhZGxpbmVfY2FwLiAgV2UgY29tcHV0ZSBhIG5ldyBxdWV1ZSBkZWFkbGluZSBhbmQgdGhlbiBzY2FuIHRoZSBtYXAKLSAgIGZvciB0aW1lcnMgdGhhdCBmYWxsIGF0IG9yIHVuZGVyIGl0LiAgUmV0dXJucyB0cnVlIGlmIHRoZSBxdWV1ZSBpcyBubwotICAgbG9uZ2VyIGVtcHR5LgotICAgUkVRVUlSRVM6IHNoYXJkLT5tdSBsb2NrZWQgKi8KLXN0YXRpYyBpbnQgcmVmaWxsX3F1ZXVlKHNoYXJkX3R5cGUgKnNoYXJkLCBncHJfdGltZXNwZWMgbm93KSB7Ci0gIC8qIENvbXB1dGUgdGhlIG5ldyBxdWV1ZSB3aW5kb3cgd2lkdGggYW5kIGJvdW5kIGJ5IHRoZSBsaW1pdHM6ICovCi0gIGRvdWJsZSBjb21wdXRlZF9kZWFkbGluZV9kZWx0YSA9Ci0gICAgICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfdXBkYXRlX2F2ZXJhZ2UoJnNoYXJkLT5zdGF0cykgKgotICAgICAgQUREX0RFQURMSU5FX1NDQUxFOwotICBkb3VibGUgZGVhZGxpbmVfZGVsdGEgPQotICAgICAgR1BSX0NMQU1QKGNvbXB1dGVkX2RlYWRsaW5lX2RlbHRhLCBNSU5fUVVFVUVfV0lORE9XX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgIE1BWF9RVUVVRV9XSU5ET1dfRFVSQVRJT04pOwotICBncnBjX3RpbWVyICp0aW1lciwgKm5leHQ7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgbmV3IGNhcCBhbmQgcHV0IGFsbCB0aW1lcnMgdW5kZXIgaXQgaW50byB0aGUgcXVldWU6ICovCi0gIHNoYXJkLT5xdWV1ZV9kZWFkbGluZV9jYXAgPSBncHJfdGltZV9hZGQoCi0gICAgICBncHJfdGltZV9tYXgobm93LCBzaGFyZC0+cXVldWVfZGVhZGxpbmVfY2FwKSwgZGJsX3RvX3RzKGRlYWRsaW5lX2RlbHRhKSk7Ci0gIGZvciAodGltZXIgPSBzaGFyZC0+bGlzdC5uZXh0OyB0aW1lciAhPSAmc2hhcmQtPmxpc3Q7IHRpbWVyID0gbmV4dCkgewotICAgIG5leHQgPSB0aW1lci0+bmV4dDsKLQotICAgIGlmIChncHJfdGltZV9jbXAodGltZXItPmRlYWRsaW5lLCBzaGFyZC0+cXVldWVfZGVhZGxpbmVfY2FwKSA8IDApIHsKLSAgICAgIGxpc3RfcmVtb3ZlKHRpbWVyKTsKLSAgICAgIGdycGNfdGltZXJfaGVhcF9hZGQoJnNoYXJkLT5oZWFwLCB0aW1lcik7Ci0gICAgfQotICB9Ci0gIHJldHVybiAhZ3JwY190aW1lcl9oZWFwX2lzX2VtcHR5KCZzaGFyZC0+aGVhcCk7Ci19Ci0KLS8qIFRoaXMgcG9wcyB0aGUgbmV4dCBub24tY2FuY2VsbGVkIHRpbWVyIHdpdGggZGVhZGxpbmUgPD0gbm93IGZyb20gdGhlIHF1ZXVlLAotICAgb3IgcmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgIFJFUVVJUkVTOiBzaGFyZC0+bXUgbG9ja2VkICovCi1zdGF0aWMgZ3JwY190aW1lciAqcG9wX29uZShzaGFyZF90eXBlICpzaGFyZCwgZ3ByX3RpbWVzcGVjIG5vdykgewotICBncnBjX3RpbWVyICp0aW1lcjsKLSAgZm9yICg7OykgewotICAgIGlmIChncnBjX3RpbWVyX2hlYXBfaXNfZW1wdHkoJnNoYXJkLT5oZWFwKSkgewotICAgICAgaWYgKGdwcl90aW1lX2NtcChub3csIHNoYXJkLT5xdWV1ZV9kZWFkbGluZV9jYXApIDwgMCkgcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAoIXJlZmlsbF9xdWV1ZShzaGFyZCwgbm93KSkgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHRpbWVyID0gZ3JwY190aW1lcl9oZWFwX3RvcCgmc2hhcmQtPmhlYXApOwotICAgIGlmIChncHJfdGltZV9jbXAodGltZXItPmRlYWRsaW5lLCBub3cpID4gMCkgcmV0dXJuIE5VTEw7Ci0gICAgdGltZXItPnRyaWdnZXJlZCA9IDE7Ci0gICAgZ3JwY190aW1lcl9oZWFwX3BvcCgmc2hhcmQtPmhlYXApOwotICAgIHJldHVybiB0aW1lcjsKLSAgfQotfQotCi0vKiBSRVFVSVJFUzogc2hhcmQtPm11IHVubG9ja2VkICovCi1zdGF0aWMgc2l6ZV90IHBvcF90aW1lcnMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHNoYXJkX3R5cGUgKnNoYXJkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBub3csIGdwcl90aW1lc3BlYyAqbmV3X21pbl9kZWFkbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VjY2VzcykgewotICBzaXplX3QgbiA9IDA7Ci0gIGdycGNfdGltZXIgKnRpbWVyOwotICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKLSAgd2hpbGUgKCh0aW1lciA9IHBvcF9vbmUoc2hhcmQsIG5vdykpKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmdGltZXItPmNsb3N1cmUsIHN1Y2Nlc3MsIE5VTEwpOwotICAgIG4rKzsKLSAgfQotICAqbmV3X21pbl9kZWFkbGluZSA9IGNvbXB1dGVfbWluX2RlYWRsaW5lKHNoYXJkKTsKLSAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQgcnVuX3NvbWVfZXhwaXJlZF90aW1lcnMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdwcl90aW1lc3BlYyBub3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyAqbmV4dCwgaW50IHN1Y2Nlc3MpIHsKLSAgc2l6ZV90IG4gPSAwOwotCi0gIC8qIFRPRE8oY3RpbGxlcik6IHZlcmlmeSB0aGF0IHRoZXJlIGFyZSBhbnkgdGltZXJzIChhdG9taWNhbGx5KSBoZXJlICovCi0KLSAgaWYgKGdwcl9tdV90cnlsb2NrKCZnX2NoZWNrZXJfbXUpKSB7Ci0gICAgZ3ByX211X2xvY2soJmdfbXUpOwotCi0gICAgd2hpbGUgKGdwcl90aW1lX2NtcChnX3NoYXJkX3F1ZXVlWzBdLT5taW5fZGVhZGxpbmUsIG5vdykgPCAwKSB7Ci0gICAgICBncHJfdGltZXNwZWMgbmV3X21pbl9kZWFkbGluZTsKLQotICAgICAgLyogRm9yIGVmZmljaWVuY3ksIHdlIHBvcCBhcyBtYW55IGF2YWlsYWJsZSB0aW1lcnMgYXMgd2UgY2FuIGZyb20gdGhlCi0gICAgICAgICBzaGFyZC4gIFRoaXMgbWF5IHZpb2xhdGUgcGVyZmVjdCB0aW1lciBkZWFkbGluZSBvcmRlcmluZywgYnV0IHRoYXQKLSAgICAgICAgIHNob3VsZG4ndCBiZSBhIGJpZyBkZWFsIGJlY2F1c2Ugd2UgZG9uJ3QgbWFrZSBvcmRlcmluZyBndWFyYW50ZWVzLiAqLwotICAgICAgbiArPSBwb3BfdGltZXJzKGV4ZWNfY3R4LCBnX3NoYXJkX3F1ZXVlWzBdLCBub3csICZuZXdfbWluX2RlYWRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MpOwotCi0gICAgICAvKiBBbiBncnBjX3RpbWVyX2luaXQoKSBvbiB0aGUgc2hhcmQgY291bGQgaW50ZXJ2ZW5lIGhlcmUsIGFkZGluZyBhIG5ldwotICAgICAgICAgdGltZXIgdGhhdCBpcyBlYXJsaWVyIHRoYW4gbmV3X21pbl9kZWFkbGluZS4gIEhvd2V2ZXIsCi0gICAgICAgICBncnBjX3RpbWVyX2luaXQoKSB3aWxsIGJsb2NrIG9uIHRoZSBtYXN0ZXJfbG9jayBiZWZvcmUgaXQgY2FuIGNhbGwKLSAgICAgICAgIHNldF9taW5fZGVhZGxpbmUsIHNvIHRoaXMgb25lIHdpbGwgY29tcGxldGUgZmlyc3QgYW5kIHRoZW4gdGhlIEFkZHRpbWVyCi0gICAgICAgICB3aWxsIHJlZHVjZSB0aGUgbWluX2RlYWRsaW5lIChwZXJoYXBzIHVubmVjZXNzYXJpbHkpLiAqLwotICAgICAgZ19zaGFyZF9xdWV1ZVswXS0+bWluX2RlYWRsaW5lID0gbmV3X21pbl9kZWFkbGluZTsKLSAgICAgIG5vdGVfZGVhZGxpbmVfY2hhbmdlKGdfc2hhcmRfcXVldWVbMF0pOwotICAgIH0KLQotICAgIGlmIChuZXh0KSB7Ci0gICAgICAqbmV4dCA9IGdwcl90aW1lX21pbigqbmV4dCwgZ19zaGFyZF9xdWV1ZVswXS0+bWluX2RlYWRsaW5lKTsKLSAgICB9Ci0KLSAgICBncHJfbXVfdW5sb2NrKCZnX211KTsKLSAgICBncHJfbXVfdW5sb2NrKCZnX2NoZWNrZXJfbXUpOwotICB9IGVsc2UgaWYgKG5leHQgIT0gTlVMTCkgewotICAgIC8qIFRPRE8oY3RpbGxlcik6IHRoaXMgZm9yY2VzIGNhbGxpbmcgY29kZSB0byBkbyBhbiBzaG9ydCBwb2xsLCBhbmQKLSAgICAgICB0aGVuIHJldHJ5IHRoZSB0aW1lciBjaGVjayAoYmVjYXVzZSB0aGlzIHRpbWUgdGhyb3VnaCB0aGUgdGltZXIgbGlzdCB3YXMKLSAgICAgICBjb250ZW5kZWQpLgotCi0gICAgICAgV2UgY291bGQgcmVkdWNlIHRoZSBjb3N0IGhlcmUgZHJhbWF0aWNhbGx5IGJ5IGtlZXBpbmcgYSBjb3VudCBvZiBob3cgbWFueQotICAgICAgIGN1cnJlbnRseSBhY3RpdmUgcG9sbGVycyBnb3QgdGhyb3VnaCB0aGUgdW5jb250ZW5kZWQgY2FzZSBhYm92ZQotICAgICAgIHN1Y2Nlc3NmdWxseSwgYW5kIHdha2luZyB1cCBvdGhlciBwb2xsZXJzIElGRiB0aGF0IGNvdW50IGRyb3BzIHRvIHplcm8uCi0KLSAgICAgICBPbmNlIHRoYXQgY291bnQgaXMgaW4gcGxhY2UsIHRoaXMgZW50aXJlIGVsc2UgYnJhbmNoIGNvdWxkIGRpc2FwcGVhci4gKi8KLSAgICAqbmV4dCA9IGdwcl90aW1lX21pbigKLSAgICAgICAgKm5leHQsIGdwcl90aW1lX2FkZChub3csIGdwcl90aW1lX2Zyb21fbWlsbGlzKDEsIEdQUl9USU1FU1BBTikpKTsKLSAgfQotCi0gIHJldHVybiAoaW50KW47Ci19Ci0KLWJvb2wgZ3JwY190aW1lcl9jaGVjayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3ByX3RpbWVzcGVjIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgKm5leHQpIHsKLSAgR1BSX0FTU0VSVChub3cuY2xvY2tfdHlwZSA9PSBnX2Nsb2NrX3R5cGUpOwotICByZXR1cm4gcnVuX3NvbWVfZXhwaXJlZF90aW1lcnMoCi0gICAgICBleGVjX2N0eCwgbm93LCBuZXh0LAotICAgICAgZ3ByX3RpbWVfY21wKG5vdywgZ3ByX2luZl9mdXR1cmUobm93LmNsb2NrX3R5cGUpKSAhPSAwKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RpbWVyLmggYi9zcmMvY29yZS9pb21nci90aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTJkMWNiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfVElNRVJfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfVElNRVJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190aW1lciB7Ci0gIGdwcl90aW1lc3BlYyBkZWFkbGluZTsKLSAgdWludDMyX3QgaGVhcF9pbmRleDsgLyogSU5WQUxJRF9IRUFQX0lOREVYIGlmIG5vdCBpbiBoZWFwICovCi0gIGludCB0cmlnZ2VyZWQ7Ci0gIHN0cnVjdCBncnBjX3RpbWVyICpuZXh0OwotICBzdHJ1Y3QgZ3JwY190aW1lciAqcHJldjsKLSAgZ3JwY19jbG9zdXJlIGNsb3N1cmU7Ci19IGdycGNfdGltZXI7Ci0KLS8qIEluaXRpYWxpemUgKnRpbWVyLiBXaGVuIGV4cGlyZWQgb3IgY2FuY2VsZWQsIHRpbWVyX2NiIHdpbGwgYmUgY2FsbGVkIHdpdGgKLSAgICp0aW1lcl9jYl9hcmcgYW5kIHN0YXR1cyB0byBpbmRpY2F0ZSBpZiBpdCBleHBpcmVkIChTVUNDRVNTKSBvciB3YXMKLSAgIGNhbmNlbGVkIChDQU5DRUxMRUQpLiB0aW1lcl9jYiBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UsCi0gICBhbmQgYXBwbGljYXRpb24gY29kZSBzaG91bGQgY2hlY2sgdGhlIHN0YXR1cyB0byBkZXRlcm1pbmUgaG93IGl0IHdhcwotICAgaW52b2tlZC4gVGhlIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nCi0gICBpbmZvcm1hdGlvbiBhYm91dCB3aGVuIHRvIGZyZWUgdXAgYW55IHVzZXItbGV2ZWwgc3RhdGUuICovCi12b2lkIGdycGNfdGltZXJfaW5pdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190aW1lciAqdGltZXIsCi0gICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdycGNfaW9tZ3JfY2JfZnVuYyB0aW1lcl9jYiwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRpbWVyX2NiX2FyZywgZ3ByX3RpbWVzcGVjIG5vdyk7Ci0KLS8qIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB0aW1lciBkZXN0cm95IGZ1bmN0aW9uLiBUaGlzIGlzIGJlY2F1c2UgdGhlCi0gICB0aW1lciBpcyBhIG9uZS10aW1lIG9jY3VycmVuY2Ugd2l0aCBhIGd1YXJhbnRlZSB0aGF0IHRoZSBjYWxsYmFjayB3aWxsCi0gICBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLCBlaXRoZXIgYXQgZXhwaXJhdGlvbiBvciBjYW5jZWxsYXRpb24uIFRodXMsIGFsbAotICAgdGhlIGludGVybmFsIHRpbWVyIGV2ZW50IG1hbmFnZW1lbnQgc3RhdGUgaXMgZGVzdHJveWVkIGp1c3QgYmVmb3JlCi0gICB0aGF0IGNhbGxiYWNrIGlzIGludm9rZWQuIElmIHRoZSB1c2VyIGhhcyBhZGRpdGlvbmFsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aAotICAgdGhlIHRpbWVyLCB0aGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hlbiBpdCBpcyBzYWZlIHRvCi0gICBkZXN0cm95IHRoYXQgc3RhdGUuICovCi0KLS8qIENhbmNlbCBhbiAqdGltZXIuCi0gICBUaGVyZSBhcmUgdGhyZWUgY2FzZXM6Ci0gICAxLiBXZSBub3JtYWxseSBjYW5jZWwgdGhlIHRpbWVyCi0gICAyLiBUaGUgdGltZXIgaGFzIGFscmVhZHkgcnVuCi0gICAzLiBXZSBjYW4ndCBjYW5jZWwgdGhlIHRpbWVyIGJlY2F1c2UgaXQgaXMgImluIGZsaWdodCIuCi0KLSAgIEluIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlIGNhbmNlbGxhdGlvbiBpcyBzdGlsbCBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwuCi0gICBUaGV5IGFyZSBlc3NlbnRpYWxseSBkaXN0aW5ndWlzaGVkIGluIHRoYXQgdGhlIHRpbWVyX2NiIHdpbGwgYmUgcnVuCi0gICBleGFjdGx5IG9uY2UgZnJvbSBlaXRoZXIgdGhlIGNhbmNlbGxhdGlvbiAod2l0aCBzdGF0dXMgQ0FOQ0VMTEVEKQotICAgb3IgZnJvbSB0aGUgYWN0aXZhdGlvbiAod2l0aCBzdGF0dXMgU1VDQ0VTUykKLQotICAgTm90ZSBjYXJlZnVsbHkgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gTUFZIG9jY3VyIGluIHRoZSBzYW1lIGNhbGxzdGFjawotICAgYXMgZ3JwY190aW1lcl9jYW5jZWwuIEl0J3MgZXhwZWN0ZWQgdGhhdCBtb3N0IHRpbWVycyB3aWxsIGJlIGNhbmNlbGxlZCAodGhlaXIKLSAgIHByaW1hcnkgdXNlIGlzIHRvIGltcGxlbWVudCBkZWFkbGluZXMpLCBhbmQgc28gdGhpcyBjb2RlIGlzIG9wdGltaXplZCBzdWNoCi0gICB0aGF0IGNhbmNlbGxhdGlvbiBjb3N0cyBhcyBsaXR0bGUgYXMgcG9zc2libGUuIE1ha2luZyBjYWxsYmFja3MgcnVuIGlubGluZQotICAgbWF0Y2hlcyB0aGlzIGFpbS4KLQotICAgUmVxdWlyZXM6ICBjYW5jZWwoKSBtdXN0IGhhcHBlbiBhZnRlciBhZGQoKSBvbiBhIGdpdmVuIHRpbWVyICovCi12b2lkIGdycGNfdGltZXJfY2FuY2VsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RpbWVyICp0aW1lcik7Ci0KLS8qIGlvbWdyIGludGVybmFsIGFwaSBmb3IgZGVhbGluZyB3aXRoIHRpbWVycyAqLwotCi0vKiBDaGVjayBmb3IgdGltZXJzIHRvIGJlIHJ1biwgYW5kIHJ1biB0aGVtLgotICAgUmV0dXJuIHRydWUgaWYgdGltZXIgY2FsbGJhY2tzIHdlcmUgZXhlY3V0ZWQuCi0gICBEcm9wcyBkcm9wX211IGlmIGl0IGlzIG5vbi1udWxsIGJlZm9yZSBleGVjdXRpbmcgY2FsbGJhY2tzLgotICAgSWYgbmV4dCBpcyBub24tbnVsbCwgVFJZIHRvIHVwZGF0ZSAqbmV4dCB3aXRoIHRoZSBuZXh0IHJ1bm5pbmcgdGltZXIKLSAgIElGIHRoYXQgdGltZXIgb2NjdXJzIGJlZm9yZSAqbmV4dCBjdXJyZW50IHZhbHVlLgotICAgKm5leHQgaXMgbmV2ZXIgZ3VhcmFudGVlZCB0byBiZSB1cGRhdGVkIG9uIGFueSBnaXZlbiBleGVjdXRpb247IGhvd2V2ZXIsCi0gICB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkgYXQgbGVhc3Qgb25lIHRocmVhZCBpbiB0aGUgc3lzdGVtIHdpbGwgc2VlIGFuIHVwZGF0ZQotICAgYXQgYW55IHRpbWUgc2xpY2UuICovCi1ib29sIGdycGNfdGltZXJfY2hlY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdwcl90aW1lc3BlYyBub3csCi0gICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjICpuZXh0KTsKLXZvaWQgZ3JwY190aW1lcl9saXN0X2luaXQoZ3ByX3RpbWVzcGVjIG5vdyk7Ci12b2lkIGdycGNfdGltZXJfbGlzdF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCk7Ci0KLS8qIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBlYWNoIGlvbWdyIGltcGxlbWVudGF0aW9uICovCi0KLXZvaWQgZ3JwY19raWNrX3BvbGxlcih2b2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9USU1FUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmMgYi9zcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGY1NjYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotLyogQWRqdXN0cyBhIGhlYXAgc28gYXMgdG8gbW92ZSBhIGhvbGUgYXQgcG9zaXRpb24gaSBjbG9zZXIgdG8gdGhlIHJvb3QsCi0gICB1bnRpbCBhIHN1aXRhYmxlIHBvc2l0aW9uIGlzIGZvdW5kIGZvciBlbGVtZW50IHQuIFRoZW4sIGNvcGllcyB0IGludG8gdGhhdAotICAgcG9zaXRpb24uIFRoaXMgZnVuY3RvciBpcyBjYWxsZWQgZWFjaCB0aW1lIGltbWVkaWF0ZWx5IGFmdGVyIG1vZGlmeWluZyBhCi0gICB2YWx1ZSBpbiB0aGUgdW5kZXJseWluZyBjb250YWluZXIsIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgbW9kaWZpZWQgZWxlbWVudCBhcwotICAgaXRzIGFyZ3VtZW50LiAqLwotc3RhdGljIHZvaWQgYWRqdXN0X3Vwd2FyZHMoZ3JwY190aW1lciAqKmZpcnN0LCB1aW50MzJfdCBpLCBncnBjX3RpbWVyICp0KSB7Ci0gIHdoaWxlIChpID4gMCkgewotICAgIHVpbnQzMl90IHBhcmVudCA9ICh1aW50MzJfdCkoKChpbnQpaSAtIDEpIC8gMik7Ci0gICAgaWYgKGdwcl90aW1lX2NtcChmaXJzdFtwYXJlbnRdLT5kZWFkbGluZSwgdC0+ZGVhZGxpbmUpIDw9IDApIGJyZWFrOwotICAgIGZpcnN0W2ldID0gZmlyc3RbcGFyZW50XTsKLSAgICBmaXJzdFtpXS0+aGVhcF9pbmRleCA9IGk7Ci0gICAgaSA9IHBhcmVudDsKLSAgfQotICBmaXJzdFtpXSA9IHQ7Ci0gIHQtPmhlYXBfaW5kZXggPSBpOwotfQotCi0vKiBBZGp1c3RzIGEgaGVhcCBzbyBhcyB0byBtb3ZlIGEgaG9sZSBhdCBwb3NpdGlvbiBpIGZhcnRoZXIgYXdheSBmcm9tIHRoZSByb290LAotICAgdW50aWwgYSBzdWl0YWJsZSBwb3NpdGlvbiBpcyBmb3VuZCBmb3IgZWxlbWVudCB0LiAgVGhlbiwgY29waWVzIHQgaW50byB0aGF0Ci0gICBwb3NpdGlvbi4gKi8KLXN0YXRpYyB2b2lkIGFkanVzdF9kb3dud2FyZHMoZ3JwY190aW1lciAqKmZpcnN0LCB1aW50MzJfdCBpLCB1aW50MzJfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGltZXIgKnQpIHsKLSAgZm9yICg7OykgewotICAgIHVpbnQzMl90IGxlZnRfY2hpbGQgPSAxdSArIDJ1ICogaTsKLSAgICBpZiAobGVmdF9jaGlsZCA+PSBsZW5ndGgpIGJyZWFrOwotICAgIHVpbnQzMl90IHJpZ2h0X2NoaWxkID0gbGVmdF9jaGlsZCArIDE7Ci0gICAgdWludDMyX3QgbmV4dF9pID0gcmlnaHRfY2hpbGQgPCBsZW5ndGggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lX2NtcChmaXJzdFtsZWZ0X2NoaWxkXS0+ZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RbcmlnaHRfY2hpbGRdLT5kZWFkbGluZSkgPiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gcmlnaHRfY2hpbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZWZ0X2NoaWxkOwotICAgIGlmIChncHJfdGltZV9jbXAodC0+ZGVhZGxpbmUsIGZpcnN0W25leHRfaV0tPmRlYWRsaW5lKSA8PSAwKSBicmVhazsKLSAgICBmaXJzdFtpXSA9IGZpcnN0W25leHRfaV07Ci0gICAgZmlyc3RbaV0tPmhlYXBfaW5kZXggPSBpOwotICAgIGkgPSBuZXh0X2k7Ci0gIH0KLSAgZmlyc3RbaV0gPSB0OwotICB0LT5oZWFwX2luZGV4ID0gaTsKLX0KLQotI2RlZmluZSBTSFJJTktfTUlOX0VMRU1TIDgKLSNkZWZpbmUgU0hSSU5LX0ZVTExORVNTX0ZBQ1RPUiAyCi0KLXN0YXRpYyB2b2lkIG1heWJlX3NocmluayhncnBjX3RpbWVyX2hlYXAgKmhlYXApIHsKLSAgaWYgKGhlYXAtPnRpbWVyX2NvdW50ID49IDggJiYKLSAgICAgIGhlYXAtPnRpbWVyX2NvdW50IDw9IGhlYXAtPnRpbWVyX2NhcGFjaXR5IC8gU0hSSU5LX0ZVTExORVNTX0ZBQ1RPUiAvIDIpIHsKLSAgICBoZWFwLT50aW1lcl9jYXBhY2l0eSA9IGhlYXAtPnRpbWVyX2NvdW50ICogU0hSSU5LX0ZVTExORVNTX0ZBQ1RPUjsKLSAgICBoZWFwLT50aW1lcnMgPQotICAgICAgICBncHJfcmVhbGxvYyhoZWFwLT50aW1lcnMsIGhlYXAtPnRpbWVyX2NhcGFjaXR5ICogc2l6ZW9mKGdycGNfdGltZXIgKikpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGVfY2hhbmdlZF9wcmlvcml0eShncnBjX3RpbWVyX2hlYXAgKmhlYXAsIGdycGNfdGltZXIgKnRpbWVyKSB7Ci0gIHVpbnQzMl90IGkgPSB0aW1lci0+aGVhcF9pbmRleDsKLSAgdWludDMyX3QgcGFyZW50ID0gKHVpbnQzMl90KSgoKGludClpIC0gMSkgLyAyKTsKLSAgaWYgKGdwcl90aW1lX2NtcChoZWFwLT50aW1lcnNbcGFyZW50XS0+ZGVhZGxpbmUsIHRpbWVyLT5kZWFkbGluZSkgPiAwKSB7Ci0gICAgYWRqdXN0X3Vwd2FyZHMoaGVhcC0+dGltZXJzLCBpLCB0aW1lcik7Ci0gIH0gZWxzZSB7Ci0gICAgYWRqdXN0X2Rvd253YXJkcyhoZWFwLT50aW1lcnMsIGksIGhlYXAtPnRpbWVyX2NvdW50LCB0aW1lcik7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3RpbWVyX2hlYXBfaW5pdChncnBjX3RpbWVyX2hlYXAgKmhlYXApIHsKLSAgbWVtc2V0KGhlYXAsIDAsIHNpemVvZigqaGVhcCkpOwotfQotCi12b2lkIGdycGNfdGltZXJfaGVhcF9kZXN0cm95KGdycGNfdGltZXJfaGVhcCAqaGVhcCkgeyBncHJfZnJlZShoZWFwLT50aW1lcnMpOyB9Ci0KLWludCBncnBjX3RpbWVyX2hlYXBfYWRkKGdycGNfdGltZXJfaGVhcCAqaGVhcCwgZ3JwY190aW1lciAqdGltZXIpIHsKLSAgaWYgKGhlYXAtPnRpbWVyX2NvdW50ID09IGhlYXAtPnRpbWVyX2NhcGFjaXR5KSB7Ci0gICAgaGVhcC0+dGltZXJfY2FwYWNpdHkgPQotICAgICAgICBHUFJfTUFYKGhlYXAtPnRpbWVyX2NhcGFjaXR5ICsgMSwgaGVhcC0+dGltZXJfY2FwYWNpdHkgKiAzIC8gMik7Ci0gICAgaGVhcC0+dGltZXJzID0KLSAgICAgICAgZ3ByX3JlYWxsb2MoaGVhcC0+dGltZXJzLCBoZWFwLT50aW1lcl9jYXBhY2l0eSAqIHNpemVvZihncnBjX3RpbWVyICopKTsKLSAgfQotICB0aW1lci0+aGVhcF9pbmRleCA9IGhlYXAtPnRpbWVyX2NvdW50OwotICBhZGp1c3RfdXB3YXJkcyhoZWFwLT50aW1lcnMsIGhlYXAtPnRpbWVyX2NvdW50LCB0aW1lcik7Ci0gIGhlYXAtPnRpbWVyX2NvdW50Kys7Ci0gIHJldHVybiB0aW1lci0+aGVhcF9pbmRleCA9PSAwOwotfQotCi12b2lkIGdycGNfdGltZXJfaGVhcF9yZW1vdmUoZ3JwY190aW1lcl9oZWFwICpoZWFwLCBncnBjX3RpbWVyICp0aW1lcikgewotICB1aW50MzJfdCBpID0gdGltZXItPmhlYXBfaW5kZXg7Ci0gIGlmIChpID09IGhlYXAtPnRpbWVyX2NvdW50IC0gMSkgewotICAgIGhlYXAtPnRpbWVyX2NvdW50LS07Ci0gICAgbWF5YmVfc2hyaW5rKGhlYXApOwotICAgIHJldHVybjsKLSAgfQotICBoZWFwLT50aW1lcnNbaV0gPSBoZWFwLT50aW1lcnNbaGVhcC0+dGltZXJfY291bnQgLSAxXTsKLSAgaGVhcC0+dGltZXJzW2ldLT5oZWFwX2luZGV4ID0gaTsKLSAgaGVhcC0+dGltZXJfY291bnQtLTsKLSAgbWF5YmVfc2hyaW5rKGhlYXApOwotICBub3RlX2NoYW5nZWRfcHJpb3JpdHkoaGVhcCwgaGVhcC0+dGltZXJzW2ldKTsKLX0KLQotaW50IGdycGNfdGltZXJfaGVhcF9pc19lbXB0eShncnBjX3RpbWVyX2hlYXAgKmhlYXApIHsKLSAgcmV0dXJuIGhlYXAtPnRpbWVyX2NvdW50ID09IDA7Ci19Ci0KLWdycGNfdGltZXIgKmdycGNfdGltZXJfaGVhcF90b3AoZ3JwY190aW1lcl9oZWFwICpoZWFwKSB7Ci0gIHJldHVybiBoZWFwLT50aW1lcnNbMF07Ci19Ci0KLXZvaWQgZ3JwY190aW1lcl9oZWFwX3BvcChncnBjX3RpbWVyX2hlYXAgKmhlYXApIHsKLSAgZ3JwY190aW1lcl9oZWFwX3JlbW92ZShoZWFwLCBncnBjX3RpbWVyX2hlYXBfdG9wKGhlYXApKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCBiL3NyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5MTJlZi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9USU1FUl9IRUFQX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1RJTUVSX0hFQVBfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX3RpbWVyICoqdGltZXJzOwotICB1aW50MzJfdCB0aW1lcl9jb3VudDsKLSAgdWludDMyX3QgdGltZXJfY2FwYWNpdHk7Ci19IGdycGNfdGltZXJfaGVhcDsKLQotLyogcmV0dXJuIDEgaWYgdGhlIG5ldyB0aW1lciBpcyB0aGUgZmlyc3QgdGltZXIgaW4gdGhlIGhlYXAgKi8KLWludCBncnBjX3RpbWVyX2hlYXBfYWRkKGdycGNfdGltZXJfaGVhcCAqaGVhcCwgZ3JwY190aW1lciAqdGltZXIpOwotCi12b2lkIGdycGNfdGltZXJfaGVhcF9pbml0KGdycGNfdGltZXJfaGVhcCAqaGVhcCk7Ci12b2lkIGdycGNfdGltZXJfaGVhcF9kZXN0cm95KGdycGNfdGltZXJfaGVhcCAqaGVhcCk7Ci0KLXZvaWQgZ3JwY190aW1lcl9oZWFwX3JlbW92ZShncnBjX3RpbWVyX2hlYXAgKmhlYXAsIGdycGNfdGltZXIgKnRpbWVyKTsKLWdycGNfdGltZXIgKmdycGNfdGltZXJfaGVhcF90b3AoZ3JwY190aW1lcl9oZWFwICpoZWFwKTsKLXZvaWQgZ3JwY190aW1lcl9oZWFwX3BvcChncnBjX3RpbWVyX2hlYXAgKmhlYXApOwotCi1pbnQgZ3JwY190aW1lcl9oZWFwX2lzX2VtcHR5KGdycGNfdGltZXJfaGVhcCAqaGVhcCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfVElNRVJfSEVBUF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmMgYi9zcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDE1OTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLS8qIEZJWE1FOiAicG9zaXgiIGZpbGVzIHNob3VsZG4ndCBiZSBkZXBlbmRpbmcgb24gX0dOVV9TT1VSQ0UgKi8KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdSUENfTkVFRF9VRFAKLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotI2RlZmluZSBJTklUX1BPUlRfQ0FQIDIKLQotLyogb25lIGxpc3RlbmluZyBwb3J0ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBmZDsKLSAgZ3JwY19mZCAqZW1mZDsKLSAgZ3JwY191ZHBfc2VydmVyICpzZXJ2ZXI7Ci0gIHVuaW9uIHsKLSAgICB1aW50OF90IHVudHlwZWRbR1JQQ19NQVhfU09DS0FERFJfU0laRV07Ci0gICAgc3RydWN0IHNvY2thZGRyIHNvY2thZGRyOwotICB9IGFkZHI7Ci0gIHNpemVfdCBhZGRyX2xlbjsKLSAgZ3JwY19jbG9zdXJlIHJlYWRfY2xvc3VyZTsKLSAgZ3JwY19jbG9zdXJlIGRlc3Ryb3llZF9jbG9zdXJlOwotICBncnBjX3VkcF9zZXJ2ZXJfcmVhZF9jYiByZWFkX2NiOwotfSBzZXJ2ZXJfcG9ydDsKLQotLyogdGhlIG92ZXJhbGwgc2VydmVyICovCi1zdHJ1Y3QgZ3JwY191ZHBfc2VydmVyIHsKLSAgZ3ByX211IG11OwotICBncHJfY3YgY3Y7Ci0KLSAgLyogYWN0aXZlIHBvcnQgY291bnQ6IGhvdyBtYW55IHBvcnRzIGFyZSBhY3R1YWxseSBzdGlsbCBsaXN0ZW5pbmcgKi8KLSAgc2l6ZV90IGFjdGl2ZV9wb3J0czsKLSAgLyogZGVzdHJveWVkIHBvcnQgY291bnQ6IGhvdyBtYW55IHBvcnRzIGFyZSBjb21wbGV0ZWx5IGRlc3Ryb3llZCAqLwotICBzaXplX3QgZGVzdHJveWVkX3BvcnRzOwotCi0gIC8qIGlzIHRoaXMgc2VydmVyIHNodXR0aW5nIGRvd24/IChib29sZWFuKSAqLwotICBpbnQgc2h1dGRvd247Ci0KLSAgLyogYWxsIGxpc3RlbmluZyBwb3J0cyAqLwotICBzZXJ2ZXJfcG9ydCAqcG9ydHM7Ci0gIHNpemVfdCBucG9ydHM7Ci0gIHNpemVfdCBwb3J0X2NhcGFjaXR5OwotCi0gIC8qIHNodXRkb3duIGNhbGxiYWNrICovCi0gIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fY29tcGxldGU7Ci0KLSAgLyogYWxsIHBvbGxzZXRzIGludGVyZXN0ZWQgaW4gbmV3IGNvbm5lY3Rpb25zICovCi0gIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzOwotICAvKiBudW1iZXIgb2YgcG9sbHNldHMgaW4gdGhlIHBvbGxzZXRzIGFycmF5ICovCi0gIHNpemVfdCBwb2xsc2V0X2NvdW50OwotICAvKiBUaGUgcGFyZW50IGdycGMgc2VydmVyICovCi0gIGdycGNfc2VydmVyICpncnBjX3NlcnZlcjsKLX07Ci0KLWdycGNfdWRwX3NlcnZlciAqZ3JwY191ZHBfc2VydmVyX2NyZWF0ZSh2b2lkKSB7Ci0gIGdycGNfdWRwX3NlcnZlciAqcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfdWRwX3NlcnZlcikpOwotICBncHJfbXVfaW5pdCgmcy0+bXUpOwotICBncHJfY3ZfaW5pdCgmcy0+Y3YpOwotICBzLT5hY3RpdmVfcG9ydHMgPSAwOwotICBzLT5kZXN0cm95ZWRfcG9ydHMgPSAwOwotICBzLT5zaHV0ZG93biA9IDA7Ci0gIHMtPnBvcnRzID0gZ3ByX21hbGxvYyhzaXplb2Yoc2VydmVyX3BvcnQpICogSU5JVF9QT1JUX0NBUCk7Ci0gIHMtPm5wb3J0cyA9IDA7Ci0gIHMtPnBvcnRfY2FwYWNpdHkgPSBJTklUX1BPUlRfQ0FQOwotCi0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgdm9pZCBmaW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcykgewotICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHMtPnNodXRkb3duX2NvbXBsZXRlLCAxLCBOVUxMKTsKLQotICBncHJfbXVfZGVzdHJveSgmcy0+bXUpOwotICBncHJfY3ZfZGVzdHJveSgmcy0+Y3YpOwotCi0gIGdwcl9mcmVlKHMtPnBvcnRzKTsKLSAgZ3ByX2ZyZWUocyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3llZF9wb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY191ZHBfc2VydmVyICpzID0gc2VydmVyOwotICBncHJfbXVfbG9jaygmcy0+bXUpOwotICBzLT5kZXN0cm95ZWRfcG9ydHMrKzsKLSAgaWYgKHMtPmRlc3Ryb3llZF9wb3J0cyA9PSBzLT5ucG9ydHMpIHsKLSAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci0gICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Ci0gIH0KLX0KLQotLyogY2FsbGVkIHdoZW4gYWxsIGxpc3RlbmluZyBlbmRwb2ludHMgaGF2ZSBiZWVuIHNodXRkb3duLCBzbyBubyBmdXJ0aGVyCi0gICBldmVudHMgd2lsbCBiZSByZWNlaXZlZCBvbiB0aGVtIC0gYXQgdGhpcyBwb2ludCBpdCdzIHNhZmUgdG8gZGVzdHJveQotICAgdGhpbmdzICovCi1zdGF0aWMgdm9pZCBkZWFjdGl2YXRlZF9hbGxfcG9ydHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcykgewotICBzaXplX3QgaTsKLQotICAvKiBkZWxldGUgQUxMIHRoZSB0aGluZ3MgKi8KLSAgZ3ByX211X2xvY2soJnMtPm11KTsKLQotICBpZiAoIXMtPnNodXRkb3duKSB7Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChzLT5ucG9ydHMpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnBvcnRzOyBpKyspIHsKLSAgICAgIHNlcnZlcl9wb3J0ICpzcCA9ICZzLT5wb3J0c1tpXTsKLSAgICAgIGdycGNfdW5saW5rX2lmX3VuaXhfZG9tYWluX3NvY2tldCgmc3AtPmFkZHIuc29ja2FkZHIpOwotICAgICAgc3AtPmRlc3Ryb3llZF9jbG9zdXJlLmNiID0gZGVzdHJveWVkX3BvcnQ7Ci0gICAgICBzcC0+ZGVzdHJveWVkX2Nsb3N1cmUuY2JfYXJnID0gczsKLSAgICAgIGdycGNfZmRfb3JwaGFuKGV4ZWNfY3R4LCBzcC0+ZW1mZCwgJnNwLT5kZXN0cm95ZWRfY2xvc3VyZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJ1ZHBfbGlzdGVuZXJfc2h1dGRvd24iKTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICB9IGVsc2UgewotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICBmaW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHMpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY191ZHBfc2VydmVyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9kb25lKSB7Ci0gIHNpemVfdCBpOwotICBncHJfbXVfbG9jaygmcy0+bXUpOwotCi0gIEdQUl9BU1NFUlQoIXMtPnNodXRkb3duKTsKLSAgcy0+c2h1dGRvd24gPSAxOwotCi0gIHMtPnNodXRkb3duX2NvbXBsZXRlID0gb25fZG9uZTsKLQotICAvKiBzaHV0ZG93biBhbGwgZmQncyAqLwotICBpZiAocy0+YWN0aXZlX3BvcnRzKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHMtPm5wb3J0czsgaSsrKSB7Ci0gICAgICBncnBjX2ZkX3NodXRkb3duKGV4ZWNfY3R4LCBzLT5wb3J0c1tpXS5lbWZkKTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICB9IGVsc2UgewotICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKLSAgICBkZWFjdGl2YXRlZF9hbGxfcG9ydHMoZXhlY19jdHgsIHMpOwotICB9Ci19Ci0KLS8qIFByZXBhcmUgYSByZWNlbnRseS1jcmVhdGVkIHNvY2tldCBmb3IgbGlzdGVuaW5nLiAqLwotc3RhdGljIGludCBwcmVwYXJlX3NvY2tldChpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuKSB7Ci0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNvY2tuYW1lX3RlbXA7Ci0gIHNvY2tsZW5fdCBzb2NrbmFtZV9sZW47Ci0gIGludCBnZXRfbG9jYWxfaXA7Ci0gIGludCByYzsKLQotICBpZiAoZmQgPCAwKSB7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIGlmICghZ3JwY19zZXRfc29ja2V0X25vbmJsb2NraW5nKGZkLCAxKSB8fCAhZ3JwY19zZXRfc29ja2V0X2Nsb2V4ZWMoZmQsIDEpKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmFibGUgdG8gY29uZmlndXJlIHNvY2tldCAlZDogJXMiLCBmZCwKLSAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gIH0KLQotICBnZXRfbG9jYWxfaXAgPSAxOwotICByYyA9IHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVAsIElQX1BLVElORk8sICZnZXRfbG9jYWxfaXAsCi0gICAgICAgICAgICAgICAgICBzaXplb2YoZ2V0X2xvY2FsX2lwKSk7Ci0gIGlmIChyYyA9PSAwICYmIGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewotI2lmICFkZWZpbmVkKF9fQVBQTEVfXykKLSAgICByYyA9IHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9SRUNWUEtUSU5GTywgJmdldF9sb2NhbF9pcCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdldF9sb2NhbF9pcCkpOwotI2VuZGlmCi0gIH0KLQotICBHUFJfQVNTRVJUKGFkZHJfbGVuIDwgfihzb2NrbGVuX3QpMCk7Ci0gIGlmIChiaW5kKGZkLCBhZGRyLCAoc29ja2xlbl90KWFkZHJfbGVuKSA8IDApIHsKLSAgICBjaGFyICphZGRyX3N0cjsKLSAgICBncnBjX3NvY2thZGRyX3RvX3N0cmluZygmYWRkcl9zdHIsIGFkZHIsIDApOwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiYmluZCBhZGRyPSVzOiAlcyIsIGFkZHJfc3RyLCBzdHJlcnJvcihlcnJubykpOwotICAgIGdwcl9mcmVlKGFkZHJfc3RyKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgc29ja25hbWVfbGVuID0gc2l6ZW9mKHNvY2tuYW1lX3RlbXApOwotICBpZiAoZ2V0c29ja25hbWUoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCwgJnNvY2tuYW1lX2xlbikgPCAwKSB7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHJldHVybiBncnBjX3NvY2thZGRyX2dldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCk7Ci0KLWVycm9yOgotICBpZiAoZmQgPj0gMCkgewotICAgIGNsb3NlKGZkKTsKLSAgfQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIGV2ZW50IG1hbmFnZXIgY2FsbGJhY2sgd2hlbiByZWFkcyBhcmUgcmVhZHkgKi8KLXN0YXRpYyB2b2lkIG9uX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7Ci0gIHNlcnZlcl9wb3J0ICpzcCA9IGFyZzsKLQotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBncHJfbXVfbG9jaygmc3AtPnNlcnZlci0+bXUpOwotICAgIGlmICgwID09IC0tc3AtPnNlcnZlci0+YWN0aXZlX3BvcnRzKSB7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZzcC0+c2VydmVyLT5tdSk7Ci0gICAgICBkZWFjdGl2YXRlZF9hbGxfcG9ydHMoZXhlY19jdHgsIHNwLT5zZXJ2ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZzcC0+c2VydmVyLT5tdSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFRlbGwgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZSB0byByZWFkLiAqLwotICBHUFJfQVNTRVJUKHNwLT5yZWFkX2NiKTsKLSAgc3AtPnJlYWRfY2IoZXhlY19jdHgsIHNwLT5lbWZkLCBzcC0+c2VydmVyLT5ncnBjX3NlcnZlcik7Ci0KLSAgLyogUmUtYXJtIHRoZSBub3RpZmljYXRpb24gZXZlbnQgc28gd2UgZ2V0IGFub3RoZXIgY2hhbmNlIHRvIHJlYWQuICovCi0gIGdycGNfZmRfbm90aWZ5X29uX3JlYWQoZXhlY19jdHgsIHNwLT5lbWZkLCAmc3AtPnJlYWRfY2xvc3VyZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRkX3NvY2tldF90b19zZXJ2ZXIoZ3JwY191ZHBfc2VydmVyICpzLCBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VkcF9zZXJ2ZXJfcmVhZF9jYiByZWFkX2NiKSB7Ci0gIHNlcnZlcl9wb3J0ICpzcDsKLSAgaW50IHBvcnQ7Ci0gIGNoYXIgKmFkZHJfc3RyOwotICBjaGFyICpuYW1lOwotCi0gIHBvcnQgPSBwcmVwYXJlX3NvY2tldChmZCwgYWRkciwgYWRkcl9sZW4pOwotICBpZiAocG9ydCA+PSAwKSB7Ci0gICAgZ3JwY19zb2NrYWRkcl90b19zdHJpbmcoJmFkZHJfc3RyLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIDEpOwotICAgIGdwcl9hc3ByaW50ZigmbmFtZSwgInVkcC1zZXJ2ZXItbGlzdGVuZXI6JXMiLCBhZGRyX3N0cik7Ci0gICAgZ3ByX2ZyZWUoYWRkcl9zdHIpOwotICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7Ci0gICAgLyogYXBwZW5kIGl0IHRvIHRoZSBsaXN0IHVuZGVyIGEgbG9jayAqLwotICAgIGlmIChzLT5ucG9ydHMgPT0gcy0+cG9ydF9jYXBhY2l0eSkgewotICAgICAgcy0+cG9ydF9jYXBhY2l0eSAqPSAyOwotICAgICAgcy0+cG9ydHMgPSBncHJfcmVhbGxvYyhzLT5wb3J0cywgc2l6ZW9mKHNlcnZlcl9wb3J0KSAqIHMtPnBvcnRfY2FwYWNpdHkpOwotICAgIH0KLSAgICBzcCA9ICZzLT5wb3J0c1tzLT5ucG9ydHMrK107Ci0gICAgc3AtPnNlcnZlciA9IHM7Ci0gICAgc3AtPmZkID0gZmQ7Ci0gICAgc3AtPmVtZmQgPSBncnBjX2ZkX2NyZWF0ZShmZCwgbmFtZSk7Ci0gICAgbWVtY3B5KHNwLT5hZGRyLnVudHlwZWQsIGFkZHIsIGFkZHJfbGVuKTsKLSAgICBzcC0+YWRkcl9sZW4gPSBhZGRyX2xlbjsKLSAgICBzcC0+cmVhZF9jYiA9IHJlYWRfY2I7Ci0gICAgR1BSX0FTU0VSVChzcC0+ZW1mZCk7Ci0gICAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotICAgIGdwcl9mcmVlKG5hbWUpOwotICB9Ci0KLSAgcmV0dXJuIHBvcnQ7Ci19Ci0KLWludCBncnBjX3VkcF9zZXJ2ZXJfYWRkX3BvcnQoZ3JwY191ZHBfc2VydmVyICpzLCBjb25zdCB2b2lkICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4sIGdycGNfdWRwX3NlcnZlcl9yZWFkX2NiIHJlYWRfY2IpIHsKLSAgaW50IGFsbG9jYXRlZF9wb3J0MSA9IC0xOwotICBpbnQgYWxsb2NhdGVkX3BvcnQyID0gLTE7Ci0gIHVuc2lnbmVkIGk7Ci0gIGludCBmZDsKLSAgZ3JwY19kdWFsc3RhY2tfbW9kZSBkc21vZGU7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjZfdjRtYXBwZWQ7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiB3aWxkNDsKLSAgc3RydWN0IHNvY2thZGRyX2luNiB3aWxkNjsKLSAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI0X2NvcHk7Ci0gIHN0cnVjdCBzb2NrYWRkciAqYWxsb2NhdGVkX2FkZHIgPSBOVUxMOwotICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzb2NrbmFtZV90ZW1wOwotICBzb2NrbGVuX3Qgc29ja25hbWVfbGVuOwotICBpbnQgcG9ydDsKLQotICBncnBjX3VubGlua19pZl91bml4X2RvbWFpbl9zb2NrZXQoKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIpOwotCi0gIC8qIENoZWNrIGlmIHRoaXMgaXMgYSB3aWxkY2FyZCBwb3J0LCBhbmQgaWYgc28sIHRyeSB0byBrZWVwIHRoZSBwb3J0IHRoZSBzYW1lCi0gICAgIGFzIHNvbWUgcHJldmlvdXNseSBjcmVhdGVkIGxpc3RlbmVyLiAqLwotICBpZiAoZ3JwY19zb2NrYWRkcl9nZXRfcG9ydChhZGRyKSA9PSAwKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHMtPm5wb3J0czsgaSsrKSB7Ci0gICAgICBzb2NrbmFtZV9sZW4gPSBzaXplb2Yoc29ja25hbWVfdGVtcCk7Ci0gICAgICBpZiAoMCA9PSBnZXRzb2NrbmFtZShzLT5wb3J0c1tpXS5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrbmFtZV90ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tuYW1lX2xlbikpIHsKLSAgICAgICAgcG9ydCA9IGdycGNfc29ja2FkZHJfZ2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrbmFtZV90ZW1wKTsKLSAgICAgICAgaWYgKHBvcnQgPiAwKSB7Ci0gICAgICAgICAgYWxsb2NhdGVkX2FkZHIgPSBtYWxsb2MoYWRkcl9sZW4pOwotICAgICAgICAgIG1lbWNweShhbGxvY2F0ZWRfYWRkciwgYWRkciwgYWRkcl9sZW4pOwotICAgICAgICAgIGdycGNfc29ja2FkZHJfc2V0X3BvcnQoYWxsb2NhdGVkX2FkZHIsIHBvcnQpOwotICAgICAgICAgIGFkZHIgPSBhbGxvY2F0ZWRfYWRkcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChncnBjX3NvY2thZGRyX3RvX3Y0bWFwcGVkKGFkZHIsICZhZGRyNl92NG1hcHBlZCkpIHsKLSAgICBhZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyNl92NG1hcHBlZDsKLSAgICBhZGRyX2xlbiA9IHNpemVvZihhZGRyNl92NG1hcHBlZCk7Ci0gIH0KLQotICAvKiBUcmVhdCA6OiBvciAwLjAuMC4wIGFzIGEgZmFtaWx5LWFnbm9zdGljIHdpbGRjYXJkLiAqLwotICBpZiAoZ3JwY19zb2NrYWRkcl9pc193aWxkY2FyZChhZGRyLCAmcG9ydCkpIHsKLSAgICBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmRzKHBvcnQsICZ3aWxkNCwgJndpbGQ2KTsKLQotICAgIC8qIFRyeSBsaXN0ZW5pbmcgb24gSVB2NiBmaXJzdC4gKi8KLSAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZ3aWxkNjsKLSAgICBhZGRyX2xlbiA9IHNpemVvZih3aWxkNik7Ci0gICAgZmQgPSBncnBjX2NyZWF0ZV9kdWFsc3RhY2tfc29ja2V0KGFkZHIsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAmZHNtb2RlKTsKLSAgICBhbGxvY2F0ZWRfcG9ydDEgPSBhZGRfc29ja2V0X3RvX3NlcnZlcihzLCBmZCwgYWRkciwgYWRkcl9sZW4sIHJlYWRfY2IpOwotICAgIGlmIChmZCA+PSAwICYmIGRzbW9kZSA9PSBHUlBDX0RTTU9ERV9EVUFMU1RBQ0spIHsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICAvKiBJZiB3ZSBkaWRuJ3QgZ2V0IGEgZHVhbHN0YWNrIHNvY2tldCwgYWxzbyBsaXN0ZW4gb24gMC4wLjAuMC4gKi8KLSAgICBpZiAocG9ydCA9PSAwICYmIGFsbG9jYXRlZF9wb3J0MSA+IDApIHsKLSAgICAgIGdycGNfc29ja2FkZHJfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSZ3aWxkNCwgYWxsb2NhdGVkX3BvcnQxKTsKLSAgICB9Ci0gICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZDQ7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2Yod2lsZDQpOwotICB9Ci0KLSAgZmQgPSBncnBjX2NyZWF0ZV9kdWFsc3RhY2tfc29ja2V0KGFkZHIsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAmZHNtb2RlKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgfQotICBpZiAoZHNtb2RlID09IEdSUENfRFNNT0RFX0lQVjQgJiYKLSAgICAgIGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHI0X2NvcHkpKSB7Ci0gICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjRfY29weTsKLSAgICBhZGRyX2xlbiA9IHNpemVvZihhZGRyNF9jb3B5KTsKLSAgfQotICBhbGxvY2F0ZWRfcG9ydDIgPSBhZGRfc29ja2V0X3RvX3NlcnZlcihzLCBmZCwgYWRkciwgYWRkcl9sZW4sIHJlYWRfY2IpOwotCi1kb25lOgotICBncHJfZnJlZShhbGxvY2F0ZWRfYWRkcik7Ci0gIHJldHVybiBhbGxvY2F0ZWRfcG9ydDEgPj0gMCA/IGFsbG9jYXRlZF9wb3J0MSA6IGFsbG9jYXRlZF9wb3J0MjsKLX0KLQotaW50IGdycGNfdWRwX3NlcnZlcl9nZXRfZmQoZ3JwY191ZHBfc2VydmVyICpzLCB1bnNpZ25lZCBwb3J0X2luZGV4KSB7Ci0gIHJldHVybiAocG9ydF9pbmRleCA8IHMtPm5wb3J0cykgPyBzLT5wb3J0c1twb3J0X2luZGV4XS5mZCA6IC0xOwotfQotCi12b2lkIGdycGNfdWRwX3NlcnZlcl9zdGFydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY191ZHBfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZXJ2ZXIgKnNlcnZlcikgewotICBzaXplX3QgaSwgajsKLSAgZ3ByX211X2xvY2soJnMtPm11KTsKLSAgR1BSX0FTU0VSVChzLT5hY3RpdmVfcG9ydHMgPT0gMCk7Ci0gIHMtPnBvbGxzZXRzID0gcG9sbHNldHM7Ci0gIHMtPmdycGNfc2VydmVyID0gc2VydmVyOwotICBmb3IgKGkgPSAwOyBpIDwgcy0+bnBvcnRzOyBpKyspIHsKLSAgICBmb3IgKGogPSAwOyBqIDwgcG9sbHNldF9jb3VudDsgaisrKSB7Ci0gICAgICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0c1tqXSwgcy0+cG9ydHNbaV0uZW1mZCk7Ci0gICAgfQotICAgIHMtPnBvcnRzW2ldLnJlYWRfY2xvc3VyZS5jYiA9IG9uX3JlYWQ7Ci0gICAgcy0+cG9ydHNbaV0ucmVhZF9jbG9zdXJlLmNiX2FyZyA9ICZzLT5wb3J0c1tpXTsKLSAgICBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCBzLT5wb3J0c1tpXS5lbWZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnBvcnRzW2ldLnJlYWRfY2xvc3VyZSk7Ci0gICAgcy0+YWN0aXZlX3BvcnRzKys7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmcy0+bXUpOwotfQotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oIGIvc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDhjMDRmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1VEUF9TRVJWRVJfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfVURQX1NFUlZFUl9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgiCi0KLS8qIEZvcndhcmQgZGVjbCBvZiBzdHJ1Y3QgZ3JwY19zZXJ2ZXIgKi8KLS8qIFRoaXMgaXMgbm90IHR5cGVkZWYnZWQgdG8gYXZvaWQgYSB0eXBlZGVmLXJlZGVmaW5pdGlvbiBlcnJvciAqLwotc3RydWN0IGdycGNfc2VydmVyOwotCi0vKiBGb3J3YXJkIGRlY2wgb2YgZ3JwY191ZHBfc2VydmVyICovCi10eXBlZGVmIHN0cnVjdCBncnBjX3VkcF9zZXJ2ZXIgZ3JwY191ZHBfc2VydmVyOwotCi0vKiBDYWxsZWQgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIHNvY2tldC4gKi8KLXR5cGVkZWYgdm9pZCAoKmdycGNfdWRwX3NlcnZlcl9yZWFkX2NiKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZW1mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JwY19zZXJ2ZXIgKnNlcnZlcik7Ci0KLS8qIENyZWF0ZSBhIHNlcnZlciwgaW5pdGlhbGx5IG5vdCBib3VuZCB0byBhbnkgcG9ydHMgKi8KLWdycGNfdWRwX3NlcnZlciAqZ3JwY191ZHBfc2VydmVyX2NyZWF0ZSh2b2lkKTsKLQotLyogU3RhcnQgbGlzdGVuaW5nIHRvIGJvdW5kIHBvcnRzICovCi12b2lkIGdycGNfdWRwX3NlcnZlcl9zdGFydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY191ZHBfc2VydmVyICp1ZHBfc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdycGNfc2VydmVyICpzZXJ2ZXIpOwotCi1pbnQgZ3JwY191ZHBfc2VydmVyX2dldF9mZChncnBjX3VkcF9zZXJ2ZXIgKnMsIHVuc2lnbmVkIGluZGV4KTsKLQotLyogQWRkIGEgcG9ydCB0byB0aGUgc2VydmVyLCByZXR1cm5pbmcgcG9ydCBudW1iZXIgb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUKLSAgIG9uIGZhaWx1cmUuCi0KLSAgIFRoZSA6OiBhbmQgMC4wLjAuMCB3aWxkY2FyZCBhZGRyZXNzZXMgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHksIGFjY2VwdGluZwotICAgYm90aCBJUHY0IGFuZCBJUHY2IGNvbm5lY3Rpb25zLCBidXQgOjogaXMgdGhlIHByZWZlcnJlZCBzdHlsZS4gIFRoaXMgdXN1YWxseQotICAgY3JlYXRlcyBvbmUgc29ja2V0LCBidXQgcG9zc2libHkgdHdvIG9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBJUHY2LAotICAgYnV0IG5vdCBkdWFsc3RhY2sgc29ja2V0cy4gKi8KLQotLyogVE9ETyhjdGlsbGVyKTogZGVwcmVjYXRlIHRoaXMsIGFuZCBtYWtlIGdycGNfdWRwX3NlcnZlcl9hZGRfcG9ydHMgdG8gaGFuZGxlCi0gICAgICAgICAgICAgICAgICBhbGwgb2YgdGhlIG11bHRpcGxlIHNvY2tldCBwb3J0IG1hdGNoaW5nIGxvZ2ljIGluIG9uZSBwbGFjZSAqLwotaW50IGdycGNfdWRwX3NlcnZlcl9hZGRfcG9ydChncnBjX3VkcF9zZXJ2ZXIgKnMsIGNvbnN0IHZvaWQgKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZGRyX2xlbiwgZ3JwY191ZHBfc2VydmVyX3JlYWRfY2IgcmVhZF9jYik7Ci0KLXZvaWQgZ3JwY191ZHBfc2VydmVyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2RvbmUpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1VEUF9TRVJWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgYi9zcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0YTdlNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIgotCi0jaWZkZWYgR1BSX0hBVkVfVU5JWF9TT0NLRVQKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLQotdm9pZCBncnBjX2NyZWF0ZV9zb2NrZXRwYWlyX2lmX3VuaXgoaW50IHN2WzJdKSB7Ci0gIEdQUl9BU1NFUlQoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc3YpID09IDApOwotfQotCi1ncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqZ3JwY19yZXNvbHZlX3VuaXhfZG9tYWluX2FkZHJlc3MoY29uc3QgY2hhciAqbmFtZSkgewotICBzdHJ1Y3Qgc29ja2FkZHJfdW4gKnVuOwotCi0gIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzKSk7Ci0gIGFkZHJzLT5uYWRkcnMgPSAxOwotICBhZGRycy0+YWRkcnMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3Jlc29sdmVkX2FkZHJlc3MpKTsKLSAgdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuICopYWRkcnMtPmFkZHJzLT5hZGRyOwotICB1bi0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gIHN0cmNweSh1bi0+c3VuX3BhdGgsIG5hbWUpOwotICBhZGRycy0+YWRkcnMtPmxlbiA9IHN0cmxlbih1bi0+c3VuX3BhdGgpICsgc2l6ZW9mKHVuLT5zdW5fZmFtaWx5KSArIDE7Ci0gIHJldHVybiBhZGRyczsKLX0KLQotaW50IGdycGNfaXNfdW5peF9zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKSB7Ci0gIHJldHVybiBhZGRyLT5zYV9mYW1pbHkgPT0gQUZfVU5JWDsKLX0KLQotdm9pZCBncnBjX3VubGlua19pZl91bml4X2RvbWFpbl9zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKSB7Ci0gIGlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQUZfVU5JWCkgewotICAgIHJldHVybjsKLSAgfQotICBzdHJ1Y3Qgc29ja2FkZHJfdW4gKnVuID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKWFkZHI7Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gIGlmIChzdGF0KHVuLT5zdW5fcGF0aCwgJnN0KSA9PSAwICYmIChzdC5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGU09DSykgewotICAgIHVubGluayh1bi0+c3VuX3BhdGgpOwotICB9Ci19Ci0KLWludCBncnBjX3BhcnNlX3VuaXgoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIHNpemVfdCAqbGVuKSB7Ci0gIHN0cnVjdCBzb2NrYWRkcl91biAqdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuICopYWRkcjsKLQotICB1bi0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gIHN0cmNweSh1bi0+c3VuX3BhdGgsIHVyaS0+cGF0aCk7Ci0gICpsZW4gPSBzdHJsZW4odW4tPnN1bl9wYXRoKSArIHNpemVvZih1bi0+c3VuX2ZhbWlseSkgKyAxOwotCi0gIHJldHVybiAxOwotfQotCi1jaGFyICpncnBjX3VuaXhfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY191cmkgKnVyaSkgewotICByZXR1cm4gZ3ByX3N0cmR1cCgibG9jYWxob3N0Iik7Ci19Ci0KLWNoYXIgKmdycGNfc29ja2FkZHJfdG9fdXJpX3VuaXhfaWZfcG9zc2libGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKSB7Ci0gIGlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQUZfVU5JWCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY2hhciAqcmVzdWx0OwotICBncHJfYXNwcmludGYoJnJlc3VsdCwgInVuaXg6JXMiLCAoKHN0cnVjdCBzb2NrYWRkcl91biAqKWFkZHIpLT5zdW5fcGF0aCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmggYi9zcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0MmJhMy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9VTklYX1NPQ0tFVFNfUE9TSVhfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfVU5JWF9TT0NLRVRTX1BPU0lYX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0KLXZvaWQgZ3JwY19jcmVhdGVfc29ja2V0cGFpcl9pZl91bml4KGludCBzdlsyXSk7Ci0KLWdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpncnBjX3Jlc29sdmVfdW5peF9kb21haW5fYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lKTsKLQotaW50IGdycGNfaXNfdW5peF9zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKTsKLQotdm9pZCBncnBjX3VubGlua19pZl91bml4X2RvbWFpbl9zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKTsKLQotaW50IGdycGNfcGFyc2VfdW5peChncnBjX3VyaSAqdXJpLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgc2l6ZV90ICpsZW4pOwotCi1jaGFyICpncnBjX3VuaXhfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY191cmkgKnVyaSk7Ci0KLWNoYXIgKmdycGNfc29ja2FkZHJfdG9fdXJpX3VuaXhfaWZfcG9zc2libGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9VTklYX1NPQ0tFVFNfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyBiL3NyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTQ2N2IuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCi0KLSNpZm5kZWYgR1BSX0hBVkVfVU5JWF9TT0NLRVQKLQotdm9pZCBncnBjX2NyZWF0ZV9zb2NrZXRwYWlyX2lmX3VuaXgoaW50IHN2WzJdKSB7fQotCi1ncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqZ3JwY19yZXNvbHZlX3VuaXhfZG9tYWluX2FkZHJlc3MoY29uc3QgY2hhciAqbmFtZSkgewotICByZXR1cm4gTlVMTDsKLX0KLQotaW50IGdycGNfaXNfdW5peF9zb2NrZXQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKSB7IHJldHVybiBmYWxzZTsgfQotCi12b2lkIGdycGNfdW5saW5rX2lmX3VuaXhfZG9tYWluX3NvY2tldChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHt9Ci0KLWludCBncnBjX3BhcnNlX3VuaXgoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIHNpemVfdCAqbGVuKSB7Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICpncnBjX3VuaXhfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY191cmkgKnVyaSkgewotICByZXR1cm4gTlVMTDsKLX0KLQotY2hhciAqZ3JwY19zb2NrYWRkcl90b191cmlfdW5peF9pZl9wb3NzaWJsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBiL3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzM3OWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9MSU5VWF9FVkVOVEZECi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0KLXN0YXRpYyB2b2lkIGV2ZW50ZmRfY3JlYXRlKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKSB7Ci0gIGludCBlZmQgPSBldmVudGZkKDAsIEVGRF9OT05CTE9DSyB8IEVGRF9DTE9FWEVDKTsKLSAgLyogVE9ETyhrbGVtcG5lcik6IEhhbmRsZSBmYWlsdXJlIG1vcmUgZ3JhY2VmdWxseSAqLwotICBHUFJfQVNTRVJUKGVmZCA+PSAwKTsKLSAgZmRfaW5mby0+cmVhZF9mZCA9IGVmZDsKLSAgZmRfaW5mby0+d3JpdGVfZmQgPSAtMTsKLX0KLQotc3RhdGljIHZvaWQgZXZlbnRmZF9jb25zdW1lKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKSB7Ci0gIGV2ZW50ZmRfdCB2YWx1ZTsKLSAgaW50IGVycjsKLSAgZG8gewotICAgIGVyciA9IGV2ZW50ZmRfcmVhZChmZF9pbmZvLT5yZWFkX2ZkLCAmdmFsdWUpOwotICB9IHdoaWxlIChlcnIgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLX0KLQotc3RhdGljIHZvaWQgZXZlbnRmZF93YWtldXAoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKLSAgaW50IGVycjsKLSAgR1BSX1RJTUVSX0JFR0lOKCJldmVudGZkX3dha2V1cCIsIDApOwotICBkbyB7Ci0gICAgZXJyID0gZXZlbnRmZF93cml0ZShmZF9pbmZvLT5yZWFkX2ZkLCAxKTsKLSAgfSB3aGlsZSAoZXJyIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gIEdQUl9USU1FUl9FTkQoImV2ZW50ZmRfd2FrZXVwIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV2ZW50ZmRfZGVzdHJveShncnBjX3dha2V1cF9mZCogZmRfaW5mbykgewotICBpZiAoZmRfaW5mby0+cmVhZF9mZCAhPSAwKSBjbG9zZShmZF9pbmZvLT5yZWFkX2ZkKTsKLX0KLQotc3RhdGljIGludCBldmVudGZkX2NoZWNrX2F2YWlsYWJpbGl0eSh2b2lkKSB7Ci0gIC8qIFRPRE8oa2xlbXBuZXIpOiBBY3R1YWxseSBjaGVjayBpZiBldmVudGZkIGlzIGF2YWlsYWJsZSAqLwotICByZXR1cm4gMTsKLX0KLQotY29uc3QgZ3JwY193YWtldXBfZmRfdnRhYmxlIGdycGNfc3BlY2lhbGl6ZWRfd2FrZXVwX2ZkX3Z0YWJsZSA9IHsKLSAgICBldmVudGZkX2NyZWF0ZSwgZXZlbnRmZF9jb25zdW1lLCBldmVudGZkX3dha2V1cCwgZXZlbnRmZF9kZXN0cm95LAotICAgIGV2ZW50ZmRfY2hlY2tfYXZhaWxhYmlsaXR5fTsKLQotI2VuZGlmIC8qIEdQUl9MSU5VWF9FVkVOVEZEICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMgYi9zcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMmJlOWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyoKLSAqIFRoaXMgaXMgYSBkdW1teSBmaWxlIHRvIHByb3ZpZGUgYW4gaW52YWxpZCBzcGVjaWFsaXplZF93YWtldXBfZmRfdnRhYmxlIG9uCi0gKiBzeXN0ZW1zIHdpdGhvdXQgYW55dGhpbmcgYmV0dGVyIHRoYW4gcGlwZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9QT1NJWF9OT19TUEVDSUFMX1dBS0VVUF9GRAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCi0KLXN0YXRpYyBpbnQgY2hlY2tfYXZhaWxhYmlsaXR5X2ludmFsaWQodm9pZCkgeyByZXR1cm4gMDsgfQotCi1jb25zdCBncnBjX3dha2V1cF9mZF92dGFibGUgZ3JwY19zcGVjaWFsaXplZF93YWtldXBfZmRfdnRhYmxlID0gewotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGNoZWNrX2F2YWlsYWJpbGl0eV9pbnZhbGlkfTsKLQotI2VuZGlmIC8qIEdQUl9QT1NJWF9OT19TUEVDSUFMX1dBS0VVUF9GRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYyBiL3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMmZkMWYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9QT1NJWF9XQUtFVVBfRkQKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgotCi1zdGF0aWMgdm9pZCBwaXBlX2luaXQoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKLSAgaW50IHBpcGVmZFsyXTsKLSAgLyogVE9ETyhrbGVtcG5lcik6IE1ha2UgdGhpcyBub25mYXRhbCAqLwotICBpbnQgciA9IHBpcGUocGlwZWZkKTsKLSAgaWYgKDAgIT0gcikgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAicGlwZSBjcmVhdGlvbiBmYWlsZWQgKCVkKTogJXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIEdQUl9BU1NFUlQoZ3JwY19zZXRfc29ja2V0X25vbmJsb2NraW5nKHBpcGVmZFswXSwgMSkpOwotICBHUFJfQVNTRVJUKGdycGNfc2V0X3NvY2tldF9ub25ibG9ja2luZyhwaXBlZmRbMV0sIDEpKTsKLSAgZmRfaW5mby0+cmVhZF9mZCA9IHBpcGVmZFswXTsKLSAgZmRfaW5mby0+d3JpdGVfZmQgPSBwaXBlZmRbMV07Ci19Ci0KLXN0YXRpYyB2b2lkIHBpcGVfY29uc3VtZShncnBjX3dha2V1cF9mZCogZmRfaW5mbykgewotICBjaGFyIGJ1ZlsxMjhdOwotICBzc2l6ZV90IHI7Ci0KLSAgZm9yICg7OykgewotICAgIHIgPSByZWFkKGZkX2luZm8tPnJlYWRfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgIGlmIChyID4gMCkgY29udGludWU7Ci0gICAgaWYgKHIgPT0gMCkgcmV0dXJuOwotICAgIHN3aXRjaCAoZXJybm8pIHsKLSAgICAgIGNhc2UgRUFHQUlOOgotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIEVJTlRSOgotICAgICAgICBjb250aW51ZTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZXJyb3IgcmVhZGluZyBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcGlwZV93YWtldXAoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKLSAgY2hhciBjID0gMDsKLSAgd2hpbGUgKHdyaXRlKGZkX2luZm8tPndyaXRlX2ZkLCAmYywgMSkgIT0gMSAmJiBlcnJubyA9PSBFSU5UUikKLSAgICA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBpcGVfZGVzdHJveShncnBjX3dha2V1cF9mZCogZmRfaW5mbykgewotICBpZiAoZmRfaW5mby0+cmVhZF9mZCAhPSAwKSBjbG9zZShmZF9pbmZvLT5yZWFkX2ZkKTsKLSAgaWYgKGZkX2luZm8tPndyaXRlX2ZkICE9IDApIGNsb3NlKGZkX2luZm8tPndyaXRlX2ZkKTsKLX0KLQotc3RhdGljIGludCBwaXBlX2NoZWNrX2F2YWlsYWJpbGl0eSh2b2lkKSB7Ci0gIC8qIEFzc3VtZSB0aGF0IHBpcGVzIGFyZSBhbHdheXMgYXZhaWxhYmxlLiAqLwotICByZXR1cm4gMTsKLX0KLQotY29uc3QgZ3JwY193YWtldXBfZmRfdnRhYmxlIGdycGNfcGlwZV93YWtldXBfZmRfdnRhYmxlID0gewotICAgIHBpcGVfaW5pdCwgcGlwZV9jb25zdW1lLCBwaXBlX3dha2V1cCwgcGlwZV9kZXN0cm95LAotICAgIHBpcGVfY2hlY2tfYXZhaWxhYmlsaXR5fTsKLQotI2VuZGlmIC8qIEdQUl9QT1NJWF9XQUtVUF9GRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCBiL3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViM2UwMmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1dBS0VVUF9GRF9QSVBFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1dBS0VVUF9GRF9QSVBFX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIgotCi1leHRlcm4gZ3JwY193YWtldXBfZmRfdnRhYmxlIGdycGNfcGlwZV93YWtldXBfZmRfdnRhYmxlOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1dBS0VVUF9GRF9QSVBFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jIGIvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Nzc4YzQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9QT1NJWF9XQUtFVVBfRkQKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCi0KLXN0YXRpYyBjb25zdCBncnBjX3dha2V1cF9mZF92dGFibGUgKndha2V1cF9mZF92dGFibGUgPSBOVUxMOwotaW50IGdycGNfYWxsb3dfc3BlY2lhbGl6ZWRfd2FrZXVwX2ZkID0gMTsKLQotdm9pZCBncnBjX3dha2V1cF9mZF9nbG9iYWxfaW5pdCh2b2lkKSB7Ci0gIGlmIChncnBjX2FsbG93X3NwZWNpYWxpemVkX3dha2V1cF9mZCAmJgotICAgICAgZ3JwY19zcGVjaWFsaXplZF93YWtldXBfZmRfdnRhYmxlLmNoZWNrX2F2YWlsYWJpbGl0eSgpKSB7Ci0gICAgd2FrZXVwX2ZkX3Z0YWJsZSA9ICZncnBjX3NwZWNpYWxpemVkX3dha2V1cF9mZF92dGFibGU7Ci0gIH0gZWxzZSB7Ci0gICAgd2FrZXVwX2ZkX3Z0YWJsZSA9ICZncnBjX3BpcGVfd2FrZXVwX2ZkX3Z0YWJsZTsKLSAgfQotfQotCi12b2lkIGdycGNfd2FrZXVwX2ZkX2dsb2JhbF9kZXN0cm95KHZvaWQpIHsgd2FrZXVwX2ZkX3Z0YWJsZSA9IE5VTEw7IH0KLQotdm9pZCBncnBjX3dha2V1cF9mZF9pbml0KGdycGNfd2FrZXVwX2ZkICpmZF9pbmZvKSB7Ci0gIHdha2V1cF9mZF92dGFibGUtPmluaXQoZmRfaW5mbyk7Ci19Ci0KLXZvaWQgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoZ3JwY193YWtldXBfZmQgKmZkX2luZm8pIHsKLSAgd2FrZXVwX2ZkX3Z0YWJsZS0+Y29uc3VtZShmZF9pbmZvKTsKLX0KLQotdm9pZCBncnBjX3dha2V1cF9mZF93YWtldXAoZ3JwY193YWtldXBfZmQgKmZkX2luZm8pIHsKLSAgd2FrZXVwX2ZkX3Z0YWJsZS0+d2FrZXVwKGZkX2luZm8pOwotfQotCi12b2lkIGdycGNfd2FrZXVwX2ZkX2Rlc3Ryb3koZ3JwY193YWtldXBfZmQgKmZkX2luZm8pIHsKLSAgd2FrZXVwX2ZkX3Z0YWJsZS0+ZGVzdHJveShmZF9pbmZvKTsKLX0KLQotI2VuZGlmIC8qIEdQUl9QT1NJWF9XQUtFVVBfRkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIGIvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTNjZjQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyoKLSAqIHdha2V1cF9mZCBhYnN0cmFjdHMgdGhlIGNvbmNlcHQgb2YgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBwdXJwb3NlIG9mCi0gKiB3YWtpbmcgdXAgYSB0aHJlYWQgaW4gc2VsZWN0KCkvcG9sbCgpL2Vwb2xsX3dhaXQoKS9ldGMuCi0KLSAqIFRoZSBwb2xsKCkgZmFtaWx5IG9mIHN5c3RlbSBjYWxscyBwcm92aWRlIGEgd2F5IGZvciBhIHRocmVhZCB0byBibG9jayB1bnRpbAotICogdGhlcmUgaXMgYWN0aXZpdHkgb24gb25lIChvciBtb3JlKSBvZiBhIHNldCBvZiBmaWxlIGRlc2NyaXB0b3JzLiBBbgotICogYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gd2FrZSB1cCB0aGlzIHRocmVhZCB0byBkbyBub24gZmlsZSByZWxhdGVkIHdvcmsuIFRoZQotICogdHlwaWNhbCB3YXkgdG8gZG8gdGhpcyBpcyB0byBhZGQgYSBwaXBlIHRvIHRoZSBzZXQgb2YgZmlsZSBkZXNjcmlwdG9ycywgdGhlbgotICogd3JpdGUgdG8gdGhlIHBpcGUgdG8gd2FrZSB1cCB0aGUgdGhyZWFkIGluIHBvbGwoKS4KLSAqCi0gKiBMaW51eCBoYXMgYSBsaWdodGVyIHdlaWdodCBldmVudGZkIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgdGhpcyBwdXJwb3NlLgotICogd2FrZXVwX2ZkIGFic3RyYWN0cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28uCi0gKgotICogU2V0dXA6Ci0gKiAxLiBCZWZvcmUgY2FsbGluZyBhbnl0aGluZywgY2FsbCBnbG9iYWxfaW5pdCgpIGF0IGxlYXN0IG9uY2UuCi0gKiAxLiBDYWxsIGdycGNfd2FrZXVwX2ZkX2NyZWF0ZSgpIHRvIGdldCBhIHdha2V1cF9mZC4KLSAqIDIuIEFkZCB0aGUgcmVzdWx0IG9mIEdSUENfV0FLRVVQX0ZEX0ZEIHRvIHRoZSBzZXQgb2YgbW9uaXRvcmVkIGZpbGUKLSAqICAgIGRlc2NyaXB0b3JzIGZvciB0aGUgcG9sbCgpIHN0eWxlIEFQSSB5b3UgYXJlIHVzaW5nLiBNb25pdG9yIHRoZSBmaWxlCi0gKiAgICBkZXNjcmlwdG9yIGZvciByZWFkYWJpbGl0eS4KLSAqIDMuIFRvIHRlYXIgZG93biwgY2FsbCBncnBjX3dha2V1cF9mZF9kZXN0cm95KCkuIFRoaXMgY2xvc2VzIHRoZSB1bmRlcmx5aW5nCi0gKiAgICBmaWxlIGRlc2NyaXB0b3IuCi0gKgotICogVXNhZ2U6Ci0gKiAxLiBUbyB3YWtlIHVwIGEgcG9sbGluZyB0aHJlYWQsIGNhbGwgZ3JwY193YWtldXBfZmRfd2FrZXVwKCkgb24gYSB3YWtldXBfZmQKLSAqICAgIGl0IGlzIG1vbml0b3JpbmcuCi0gKiAyLiBJZiB0aGUgcG9sbGluZyB0aHJlYWQgd2FzIGF3YWtlbmVkIGJ5IGEgd2FrZXVwX2ZkIGV2ZW50LCBjYWxsCi0gKiAgICBncnBjX3dha2V1cF9mZF9jb25zdW1lX3dha2V1cCgpIG9uIGl0LgotICovCi0jaWZuZGVmIEdSUENfQ09SRV9JT01HUl9XQUtFVVBfRkRfUE9TSVhfSAotI2RlZmluZSBHUlBDX0NPUkVfSU9NR1JfV0FLRVVQX0ZEX1BPU0lYX0gKLQotdm9pZCBncnBjX3dha2V1cF9mZF9nbG9iYWxfaW5pdCh2b2lkKTsKLXZvaWQgZ3JwY193YWtldXBfZmRfZ2xvYmFsX2Rlc3Ryb3kodm9pZCk7Ci0KLS8qIEZvcmNlIHVzaW5nIHRoZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyBpbnRlbmRlZCBmb3IgdGVzdGluZwotICogcHVycG9zZXMgb25seS4qLwotdm9pZCBncnBjX3dha2V1cF9mZF9nbG9iYWxfaW5pdF9mb3JjZV9mYWxsYmFjayh2b2lkKTsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY193YWtldXBfZmQgZ3JwY193YWtldXBfZmQ7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfd2FrZXVwX2ZkX3Z0YWJsZSB7Ci0gIHZvaWQgKCppbml0KShncnBjX3dha2V1cF9mZCogZmRfaW5mbyk7Ci0gIHZvaWQgKCpjb25zdW1lKShncnBjX3dha2V1cF9mZCogZmRfaW5mbyk7Ci0gIHZvaWQgKCp3YWtldXApKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKLSAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKLSAgLyogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGZ1bmN0aW9ucyAqLwotICBpbnQgKCpjaGVja19hdmFpbGFiaWxpdHkpKHZvaWQpOwotfSBncnBjX3dha2V1cF9mZF92dGFibGU7Ci0KLXN0cnVjdCBncnBjX3dha2V1cF9mZCB7Ci0gIGludCByZWFkX2ZkOwotICBpbnQgd3JpdGVfZmQ7Ci19OwotCi1leHRlcm4gaW50IGdycGNfYWxsb3dfc3BlY2lhbGl6ZWRfd2FrZXVwX2ZkOwotCi0jZGVmaW5lIEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKGZkX2luZm8pICgoZmRfaW5mbyktPnJlYWRfZmQpCi0KLXZvaWQgZ3JwY193YWtldXBfZmRfaW5pdChncnBjX3dha2V1cF9mZCogZmRfaW5mbyk7Ci12b2lkIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKLXZvaWQgZ3JwY193YWtldXBfZmRfd2FrZXVwKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKLXZvaWQgZ3JwY193YWtldXBfZmRfZGVzdHJveShncnBjX3dha2V1cF9mZCogZmRfaW5mbyk7Ci0KLS8qIERlZmluZWQgaW4gc29tZSBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbidzIC5jIGZpbGUsIG9yIGJ5Ci0gKiB3YWtldXBfZmRfbm9zcGVjaWFsLmMgaWYgbm8gc3VjaCBpbXBsZW1lbnRhdGlvbiBleGlzdHMuICovCi1leHRlcm4gY29uc3QgZ3JwY193YWtldXBfZmRfdnRhYmxlIGdycGNfc3BlY2lhbGl6ZWRfd2FrZXVwX2ZkX3Z0YWJsZTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9XQUtFVVBfRkRfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlLmggYi9zcmMvY29yZS9pb21nci93b3JrcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5MjNiYS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci93b3JrcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1dPUktRVUVVRV9ICi0jZGVmaW5lIEdSUENfQ09SRV9JT01HUl9XT1JLUVVFVUVfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiCi0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiCi0jZW5kaWYKLQotI2lmZGVmIEdQUl9XSU4zMgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiCi0jZW5kaWYKLQotLyogZ3JwY193b3JrcXVldWUgaXMgZm9yd2FyZCBkZWNsYXJlZCBpbiBleGVjX2N0eC5oICovCi0KLS8qKiBDcmVhdGUgYSB3b3JrIHF1ZXVlICovCi1ncnBjX3dvcmtxdWV1ZSAqZ3JwY193b3JrcXVldWVfY3JlYXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4KTsKLQotdm9pZCBncnBjX3dvcmtxdWV1ZV9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSk7Ci0KLSNkZWZpbmUgR1JQQ19XT1JLUVVFVUVfUkVGQ09VTlRfREVCVUcKLSNpZmRlZiBHUlBDX1dPUktRVUVVRV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBHUlBDX1dPUktRVUVVRV9SRUYocCwgcikgXAotICBncnBjX3dvcmtxdWV1ZV9yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLSNkZWZpbmUgR1JQQ19XT1JLUVVFVUVfVU5SRUYoY2wsIHAsIHIpIFwKLSAgZ3JwY193b3JrcXVldWVfdW5yZWYoKGNsKSwgKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLXZvaWQgZ3JwY193b3JrcXVldWVfcmVmKGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKLXZvaWQgZ3JwY193b3JrcXVldWVfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpyZWFzb24pOwotI2Vsc2UKLSNkZWZpbmUgR1JQQ19XT1JLUVVFVUVfUkVGKHAsIHIpIGdycGNfd29ya3F1ZXVlX3JlZigocCkpCi0jZGVmaW5lIEdSUENfV09SS1FVRVVFX1VOUkVGKGNsLCBwLCByKSBncnBjX3dvcmtxdWV1ZV91bnJlZigoY2wpLCAocCkpCi12b2lkIGdycGNfd29ya3F1ZXVlX3JlZihncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlKTsKLXZvaWQgZ3JwY193b3JrcXVldWVfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUpOwotI2VuZGlmCi0KLS8qKiBCaW5kIHRoaXMgd29ya3F1ZXVlIHRvIGEgcG9sbHNldCAqLwotdm9pZCBncnBjX3dvcmtxdWV1ZV9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKLQotLyoqIEFkZCBhIHdvcmsgaXRlbSB0byBhIHdvcmtxdWV1ZSAqLwotdm9pZCBncnBjX3dvcmtxdWV1ZV9wdXNoKGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsIGdycGNfY2xvc3VyZSAqY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VjY2Vzcyk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfSU9NR1JfV09SS1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIGIvc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDJlNmQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCi0KLXN0YXRpYyB2b2lkIG9uX3JlYWRhYmxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2Vzcyk7Ci0KLWdycGNfd29ya3F1ZXVlICpncnBjX3dvcmtxdWV1ZV9jcmVhdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgpIHsKLSAgY2hhciBuYW1lWzMyXTsKLSAgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfd29ya3F1ZXVlKSk7Ci0gIGdwcl9yZWZfaW5pdCgmd29ya3F1ZXVlLT5yZWZzLCAxKTsKLSAgZ3ByX211X2luaXQoJndvcmtxdWV1ZS0+bXUpOwotICB3b3JrcXVldWUtPmNsb3N1cmVfbGlzdC5oZWFkID0gd29ya3F1ZXVlLT5jbG9zdXJlX2xpc3QudGFpbCA9IE5VTEw7Ci0gIGdycGNfd2FrZXVwX2ZkX2luaXQoJndvcmtxdWV1ZS0+d2FrZXVwX2ZkKTsKLSAgc3ByaW50ZihuYW1lLCAid29ya3F1ZXVlOiVwIiwgKHZvaWQgKil3b3JrcXVldWUpOwotICB3b3JrcXVldWUtPndha2V1cF9yZWFkX2ZkID0KLSAgICAgIGdycGNfZmRfY3JlYXRlKEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZ3b3JrcXVldWUtPndha2V1cF9mZCksIG5hbWUpOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmd29ya3F1ZXVlLT5yZWFkX2Nsb3N1cmUsIG9uX3JlYWRhYmxlLCB3b3JrcXVldWUpOwotICBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCB3b3JrcXVldWUtPndha2V1cF9yZWFkX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ3b3JrcXVldWUtPnJlYWRfY2xvc3VyZSk7Ci0gIHJldHVybiB3b3JrcXVldWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHdvcmtxdWV1ZV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSkgewotICBHUFJfQVNTRVJUKGdycGNfY2xvc3VyZV9saXN0X2VtcHR5KHdvcmtxdWV1ZS0+Y2xvc3VyZV9saXN0KSk7Ci0gIGdycGNfZmRfc2h1dGRvd24oZXhlY19jdHgsIHdvcmtxdWV1ZS0+d2FrZXVwX3JlYWRfZmQpOwotfQotCi0jaWZkZWYgR1JQQ19XT1JLUVVFVUVfUkVGQ09VTlRfREVCVUcKLXZvaWQgZ3JwY193b3JrcXVldWVfcmVmKGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKSB7Ci0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIldPUktRVUVVRTolcCAgIHJlZiAlZCAtPiAlZCAlcyIsCi0gICAgICAgICAgd29ya3F1ZXVlLCAoaW50KXdvcmtxdWV1ZS0+cmVmcy5jb3VudCwgKGludCl3b3JrcXVldWUtPnJlZnMuY291bnQgKyAxLAotICAgICAgICAgIHJlYXNvbik7Ci0jZWxzZQotdm9pZCBncnBjX3dvcmtxdWV1ZV9yZWYoZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSkgewotI2VuZGlmCi0gIGdwcl9yZWYoJndvcmtxdWV1ZS0+cmVmcyk7Ci19Ci0KLSNpZmRlZiBHUlBDX1dPUktRVUVVRV9SRUZDT1VOVF9ERUJVRwotdm9pZCBncnBjX3dvcmtxdWV1ZV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJXT1JLUVVFVUU6JXAgdW5yZWYgJWQgLT4gJWQgJXMiLAotICAgICAgICAgIHdvcmtxdWV1ZSwgKGludCl3b3JrcXVldWUtPnJlZnMuY291bnQsIChpbnQpd29ya3F1ZXVlLT5yZWZzLmNvdW50IC0gMSwKLSAgICAgICAgICByZWFzb24pOwotI2Vsc2UKLXZvaWQgZ3JwY193b3JrcXVldWVfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUpIHsKLSNlbmRpZgotICBpZiAoZ3ByX3VucmVmKCZ3b3JrcXVldWUtPnJlZnMpKSB7Ci0gICAgd29ya3F1ZXVlX2Rlc3Ryb3koZXhlY19jdHgsIHdvcmtxdWV1ZSk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3dvcmtxdWV1ZV9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7Ci0gIGdycGNfcG9sbHNldF9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXQsIHdvcmtxdWV1ZS0+d2FrZXVwX3JlYWRfZmQpOwotfQotCi12b2lkIGdycGNfd29ya3F1ZXVlX2ZsdXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlKSB7Ci0gIGdwcl9tdV9sb2NrKCZ3b3JrcXVldWUtPm11KTsKLSAgaWYgKGdycGNfY2xvc3VyZV9saXN0X2VtcHR5KHdvcmtxdWV1ZS0+Y2xvc3VyZV9saXN0KSkgewotICAgIGdycGNfd2FrZXVwX2ZkX3dha2V1cCgmd29ya3F1ZXVlLT53YWtldXBfZmQpOwotICB9Ci0gIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGV4ZWNfY3R4LCAmd29ya3F1ZXVlLT5jbG9zdXJlX2xpc3QsIE5VTEwpOwotICBncHJfbXVfdW5sb2NrKCZ3b3JrcXVldWUtPm11KTsKLX0KLQotc3RhdGljIHZvaWQgb25fcmVhZGFibGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUgPSBhcmc7Ci0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgZ3ByX211X2Rlc3Ryb3koJndvcmtxdWV1ZS0+bXUpOwotICAgIC8qIEhBQ0s6IGxldCB3YWtldXBfZmQgY29kZSBrbm93IHRoYXQgd2Ugc3RvbGUgdGhlIGZkICovCi0gICAgd29ya3F1ZXVlLT53YWtldXBfZmQucmVhZF9mZCA9IDA7Ci0gICAgZ3JwY193YWtldXBfZmRfZGVzdHJveSgmd29ya3F1ZXVlLT53YWtldXBfZmQpOwotICAgIGdycGNfZmRfb3JwaGFuKGV4ZWNfY3R4LCB3b3JrcXVldWUtPndha2V1cF9yZWFkX2ZkLCBOVUxMLCBOVUxMLCAiZGVzdHJveSIpOwotICAgIGdwcl9mcmVlKHdvcmtxdWV1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX211X2xvY2soJndvcmtxdWV1ZS0+bXUpOwotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGV4ZWNfY3R4LCAmd29ya3F1ZXVlLT5jbG9zdXJlX2xpc3QsIE5VTEwpOwotICAgIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKCZ3b3JrcXVldWUtPndha2V1cF9mZCk7Ci0gICAgZ3ByX211X3VubG9jaygmd29ya3F1ZXVlLT5tdSk7Ci0gICAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgd29ya3F1ZXVlLT53YWtldXBfcmVhZF9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3b3JrcXVldWUtPnJlYWRfY2xvc3VyZSk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3dvcmtxdWV1ZV9wdXNoKGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsIGdycGNfY2xvc3VyZSAqY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VjY2VzcykgewotICBncHJfbXVfbG9jaygmd29ya3F1ZXVlLT5tdSk7Ci0gIGlmIChncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eSh3b3JrcXVldWUtPmNsb3N1cmVfbGlzdCkpIHsKLSAgICBncnBjX3dha2V1cF9mZF93YWtldXAoJndvcmtxdWV1ZS0+d2FrZXVwX2ZkKTsKLSAgfQotICBncnBjX2Nsb3N1cmVfbGlzdF9hZGQoJndvcmtxdWV1ZS0+Y2xvc3VyZV9saXN0LCBjbG9zdXJlLCBzdWNjZXNzKTsKLSAgZ3ByX211X3VubG9jaygmd29ya3F1ZXVlLT5tdSk7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfUE9TSVhfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCBiL3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkzN2IxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSU9NR1JfV09SS1FVRVVFX1BPU0lYX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1dPUktRVUVVRV9QT1NJWF9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguaCIKLQotc3RydWN0IGdycGNfZmQ7Ci0KLXN0cnVjdCBncnBjX3dvcmtxdWV1ZSB7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotCi0gIGdwcl9tdSBtdTsKLSAgZ3JwY19jbG9zdXJlX2xpc3QgY2xvc3VyZV9saXN0OwotCi0gIGdycGNfd2FrZXVwX2ZkIHdha2V1cF9mZDsKLSAgc3RydWN0IGdycGNfZmQgKndha2V1cF9yZWFkX2ZkOwotCi0gIGdycGNfY2xvc3VyZSByZWFkX2Nsb3N1cmU7Ci19OwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0lPTUdSX1dPUktRVUVVRV9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5jIGIvc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYTU3NS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1dJTjMyCi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCIKLQotI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCBiL3NyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODE4NjkuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0lPTUdSX1dPUktRVUVVRV9XSU5ET1dTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0lPTUdSX1dPUktRVUVVRV9XSU5ET1dTX0gKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9JT01HUl9XT1JLUVVFVUVfV0lORE9XU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9qc29uL2pzb24uYyBiL3NyYy9jb3JlL2pzb24vanNvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmUxMWVlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2pzb24vanNvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uLmgiCi0KLWdycGNfanNvbiAqZ3JwY19qc29uX2NyZWF0ZShncnBjX2pzb25fdHlwZSB0eXBlKSB7Ci0gIGdycGNfanNvbiAqanNvbiA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpqc29uKSk7Ci0gIG1lbXNldChqc29uLCAwLCBzaXplb2YoKmpzb24pKTsKLSAganNvbi0+dHlwZSA9IHR5cGU7Ci0KLSAgcmV0dXJuIGpzb247Ci19Ci0KLXZvaWQgZ3JwY19qc29uX2Rlc3Ryb3koZ3JwY19qc29uICpqc29uKSB7Ci0gIHdoaWxlIChqc29uLT5jaGlsZCkgewotICAgIGdycGNfanNvbl9kZXN0cm95KGpzb24tPmNoaWxkKTsKLSAgfQotCi0gIGlmIChqc29uLT5uZXh0KSB7Ci0gICAganNvbi0+bmV4dC0+cHJldiA9IGpzb24tPnByZXY7Ci0gIH0KLQotICBpZiAoanNvbi0+cHJldikgewotICAgIGpzb24tPnByZXYtPm5leHQgPSBqc29uLT5uZXh0OwotICB9IGVsc2UgaWYgKGpzb24tPnBhcmVudCkgewotICAgIGpzb24tPnBhcmVudC0+Y2hpbGQgPSBqc29uLT5uZXh0OwotICB9Ci0KLSAgZ3ByX2ZyZWUoanNvbik7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9qc29uL2pzb24uaCBiL3NyYy9jb3JlL2pzb24vanNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWE5ZDVkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2pzb24vanNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfSlNPTl9KU09OX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0pTT05fSlNPTl9ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCIKLQotLyogQSB0cmVlLWxpa2Ugc3RydWN0dXJlIHRvIGhvbGQganNvbiB2YWx1ZXMuIFRoZSBrZXkgYW5kIHZhbHVlIHBvaW50ZXJzCi0gKiBhcmUgbm90IG93bmVkIGJ5IGl0LgotICovCi10eXBlZGVmIHN0cnVjdCBncnBjX2pzb24gewotICBzdHJ1Y3QgZ3JwY19qc29uICpuZXh0OwotICBzdHJ1Y3QgZ3JwY19qc29uICpwcmV2OwotICBzdHJ1Y3QgZ3JwY19qc29uICpjaGlsZDsKLSAgc3RydWN0IGdycGNfanNvbiAqcGFyZW50OwotCi0gIGdycGNfanNvbl90eXBlIHR5cGU7Ci0gIGNvbnN0IGNoYXIgKmtleTsKLSAgY29uc3QgY2hhciAqdmFsdWU7Ci19IGdycGNfanNvbjsKLQotLyogVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ29pbmcgdG8gcGFyc2UgdGhlIGlucHV0IHN0cmluZywgYW5kCi0gKiBtb2RpZnkgaXQgaW4gdGhlIHByb2Nlc3MsIGluIG9yZGVyIHRvIHVzZSBpdHMgc3BhY2UgdG8gc3RvcmUKLSAqIGFsbCBvZiB0aGUga2V5cyBhbmQgdmFsdWVzIGZvciB0aGUgcmV0dXJuZWQgb2JqZWN0IHRyZWUuCi0gKgotICogVGhleSBhc3N1bWUgVVRGLTggaW5wdXQgc3RyZWFtLCBhbmQgd2lsbCBvdXRwdXQgVVRGLTggZW5jb2RlZAotICogc3RyaW5ncyBpbiB0aGUgdHJlZS4gVGhlIGlucHV0IHN0cmVhbSdzIFVURi04IGlzbid0IHZhbGlkYXRlZCwKLSAqIGFzIGluLCB3aGF0IHlvdSBpbnB1dCBpcyB3aGF0IHlvdSBnZXQgYXMgYW4gb3V0cHV0LgotICoKLSAqIEFsbCB0aGUga2V5cyBhbmQgdmFsdWVzIGluIHRoZSBncnBjX2pzb24gb2JqZWN0cyB3aWxsIGJlIHN0cmluZ3MKLSAqIHBvaW50aW5nIGF0IHlvdXIgaW5wdXQgYnVmZmVyLgotICoKLSAqIERlbGV0ZSB0aGUgYWxsb2NhdGVkIHRyZWUgYWZ0ZXJ3YXJkIHVzaW5nIGdycGNfanNvbl9kZXN0cm95KCkuCi0gKi8KLWdycGNfanNvbiAqZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihjaGFyICppbnB1dCwgc2l6ZV90IHNpemUpOwotZ3JwY19qc29uICpncnBjX2pzb25fcGFyc2Vfc3RyaW5nKGNoYXIgKmlucHV0KTsKLQotLyogVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBzdHJpbmcgdXNpbmcgZ3ByX3JlYWxsb2MsIGFuZCB3aWxsCi0gKiBkZXNlcmlhbGl6ZSB0aGUgZ3JwY19qc29uIHRyZWUgaW50byBpdC4gSXQnbGwgYmUgemVyby10ZXJtaW5hdGVkLAotICogYnV0IHdpbGwgYmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiAyNTYgYnl0ZXMuCi0gKgotICogVGhlIGluZGVudCBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHdheSB0aGUgb3V0cHV0IGlzIGZvcm1hdHRlZC4KLSAqIElmIGluZGVudCBpcyAwLCB0aGVuIG5ld2xpbmVzIHdpbGwgYmUgc3VwcHJlc3NlZCBhcyB3ZWxsLCBhbmQgdGhlCi0gKiBvdXRwdXQgd2lsbCBiZSBjb25kZW5zZWQgYXQgaXRzIG1heGltdW0uCi0gKi8KLWNoYXIgKmdycGNfanNvbl9kdW1wX3RvX3N0cmluZyhncnBjX2pzb24gKmpzb24sIGludCBpbmRlbnQpOwotCi0vKiBVc2UgdGhlc2UgdG8gY3JlYXRlIG9yIGRlbGV0ZSBhIGdycGNfanNvbiBvYmplY3QuCi0gKiBEZWxldGlvbiBpcyByZWN1cnNpdmUuIFdlIHdpbGwgbm90IGF0dGVtcHQgdG8gZnJlZSBhbnkgb2YgdGhlIHN0cmluZ3MKLSAqIGluIGFueSBvZiB0aGUgb2JqZWN0cyBvZiB0aGF0IHRyZWUuCi0gKi8KLWdycGNfanNvbiAqZ3JwY19qc29uX2NyZWF0ZShncnBjX2pzb25fdHlwZSB0eXBlKTsKLXZvaWQgZ3JwY19qc29uX2Rlc3Ryb3koZ3JwY19qc29uICpqc29uKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9KU09OX0pTT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvanNvbi9qc29uX2NvbW1vbi5oIGIvc3JjL2NvcmUvanNvbi9qc29uX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA1YTk0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX0pTT05fSlNPTl9DT01NT05fSAotI2RlZmluZSBHUlBDX0NPUkVfSlNPTl9KU09OX0NPTU1PTl9ICi0KLS8qIFRoZSB2YXJpb3VzIGpzb24gdHlwZXMuICovCi10eXBlZGVmIGVudW0gewotICBHUlBDX0pTT05fT0JKRUNULAotICBHUlBDX0pTT05fQVJSQVksCi0gIEdSUENfSlNPTl9TVFJJTkcsCi0gIEdSUENfSlNPTl9OVU1CRVIsCi0gIEdSUENfSlNPTl9UUlVFLAotICBHUlBDX0pTT05fRkFMU0UsCi0gIEdSUENfSlNPTl9OVUxMLAotICBHUlBDX0pTT05fVE9QX0xFVkVMCi19IGdycGNfanNvbl90eXBlOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX0pTT05fSlNPTl9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5jIGIvc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRhNmYyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCIKLQotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc3RyaW5nX2NsZWFyKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgewotICByZWFkZXItPnZ0YWJsZS0+c3RyaW5nX2NsZWFyKHJlYWRlci0+dXNlcmRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyLCB1aW50MzJfdCBjKSB7Ci0gIHJlYWRlci0+dnRhYmxlLT5zdHJpbmdfYWRkX2NoYXIocmVhZGVyLT51c2VyZGF0YSwgYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfdXRmMzIoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1dGYzMikgewotICByZWFkZXItPnZ0YWJsZS0+c3RyaW5nX2FkZF91dGYzMihyZWFkZXItPnVzZXJkYXRhLCB1dGYzMik7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBncnBjX2pzb25fcmVhZGVyX3JlYWRfY2hhcihncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKLSAgcmV0dXJuIHJlYWRlci0+dnRhYmxlLT5yZWFkX2NoYXIocmVhZGVyLT51c2VyZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9iZWdpbnMoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2pzb25fdHlwZSB0eXBlKSB7Ci0gIHJlYWRlci0+dnRhYmxlLT5jb250YWluZXJfYmVnaW5zKHJlYWRlci0+dXNlcmRhdGEsIHR5cGUpOwotfQotCi1zdGF0aWMgZ3JwY19qc29uX3R5cGUgZ3JwY19qc29uX3JlYWRlcl9jb250YWluZXJfZW5kcygKLSAgICBncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKLSAgcmV0dXJuIHJlYWRlci0+dnRhYmxlLT5jb250YWluZXJfZW5kcyhyZWFkZXItPnVzZXJkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X2tleShncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKLSAgcmVhZGVyLT52dGFibGUtPnNldF9rZXkocmVhZGVyLT51c2VyZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3NldF9zdHJpbmcoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKSB7Ci0gIHJlYWRlci0+dnRhYmxlLT5zZXRfc3RyaW5nKHJlYWRlci0+dXNlcmRhdGEpOwotfQotCi1zdGF0aWMgaW50IGpzb25fcmVhZGVyX3NldF9udW1iZXIoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKSB7Ci0gIHJldHVybiByZWFkZXItPnZ0YWJsZS0+c2V0X251bWJlcihyZWFkZXItPnVzZXJkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X3RydWUoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKSB7Ci0gIHJlYWRlci0+dnRhYmxlLT5zZXRfdHJ1ZShyZWFkZXItPnVzZXJkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X2ZhbHNlKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgewotICByZWFkZXItPnZ0YWJsZS0+c2V0X2ZhbHNlKHJlYWRlci0+dXNlcmRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfbnVsbChncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKLSAgcmVhZGVyLT52dGFibGUtPnNldF9udWxsKHJlYWRlci0+dXNlcmRhdGEpOwotfQotCi0vKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgcmVhZGVyIHN0cnVjdHVyZS4gKi8KLXZvaWQgZ3JwY19qc29uX3JlYWRlcl9pbml0KGdycGNfanNvbl9yZWFkZXIgKnJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl9yZWFkZXJfdnRhYmxlICp2dGFibGUsIHZvaWQgKnVzZXJkYXRhKSB7Ci0gIG1lbXNldChyZWFkZXIsIDAsIHNpemVvZigqcmVhZGVyKSk7Ci0gIHJlYWRlci0+dnRhYmxlID0gdnRhYmxlOwotICByZWFkZXItPnVzZXJkYXRhID0gdXNlcmRhdGE7Ci0gIGpzb25fcmVhZGVyX3N0cmluZ19jbGVhcihyZWFkZXIpOwotICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOOwotfQotCi1pbnQgZ3JwY19qc29uX3JlYWRlcl9pc19jb21wbGV0ZShncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKLSAgcmV0dXJuICgocmVhZGVyLT5kZXB0aCA9PSAwKSAmJgotICAgICAgICAgICgocmVhZGVyLT5zdGF0ZSA9PSBHUlBDX0pTT05fU1RBVEVfRU5EKSB8fAotICAgICAgICAgICAocmVhZGVyLT5zdGF0ZSA9PSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EKSkpOwotfQotCi1ncnBjX2pzb25fcmVhZGVyX3N0YXR1cyBncnBjX2pzb25fcmVhZGVyX3J1bihncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKLSAgdWludDMyX3QgYywgc3VjY2VzczsKLQotICAvKiBUaGlzIHN0YXRlLW1hY2hpbmUgaXMgYSBzdHJpY3QgaW1wbGVtZW50YXRpb24gb2YgRUNNQS00MDQgKi8KLSAgZm9yICg7OykgewotICAgIGMgPSBncnBjX2pzb25fcmVhZGVyX3JlYWRfY2hhcihyZWFkZXIpOwotICAgIHN3aXRjaCAoYykgewotICAgICAgLyogTGV0J3MgcHJvY2VzcyB0aGUgZXJyb3IgY2FzZXMgZmlyc3QuICovCi0gICAgICBjYXNlIEdSUENfSlNPTl9SRUFEX0NIQVJfRVJST1I6Ci0gICAgICAgIHJldHVybiBHUlBDX0pTT05fUkVBRF9FUlJPUjsKLQotICAgICAgY2FzZSBHUlBDX0pTT05fUkVBRF9DSEFSX0VBR0FJTjoKLSAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9FQUdBSU47Ci0KLSAgICAgIGNhc2UgR1JQQ19KU09OX1JFQURfQ0hBUl9FT0Y6Ci0gICAgICAgIGlmIChncnBjX2pzb25fcmVhZGVyX2lzX2NvbXBsZXRlKHJlYWRlcikpIHsKLSAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX0RPTkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgLyogUHJvY2Vzc2luZyB3aGl0ZXNwYWNlcy4gKi8KLSAgICAgIGNhc2UgJyAnOgotICAgICAgY2FzZSAnXHQnOgotICAgICAgY2FzZSAnXG4nOgotICAgICAgY2FzZSAnXHInOgotICAgICAgICBzd2l0Y2ggKHJlYWRlci0+c3RhdGUpIHsKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0JFR0lOOgotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfRU5EOgotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOOgotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDoKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9FTkQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfU1RSSU5HOgotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzoKLSAgICAgICAgICAgIGlmIChjICE9ICcgJykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgIT0gMCkKLSAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVI6Ci0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX1dJVEhfREVDSU1BTDoKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfWkVSTzoKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRVBNOgotICAgICAgICAgICAgc3VjY2VzcyA9ICh1aW50MzJfdClqc29uX3JlYWRlcl9zZXRfbnVtYmVyKHJlYWRlcik7Ci0gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfY2xlYXIocmVhZGVyKTsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgLyogVmFsdWUsIG9iamVjdCBvciBhcnJheSB0ZXJtaW5hdGlvbnMuICovCi0gICAgICBjYXNlICcsJzoKLSAgICAgIGNhc2UgJ30nOgotICAgICAgY2FzZSAnXSc6Ci0gICAgICAgIHN3aXRjaCAocmVhZGVyLT5zdGF0ZSkgewotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfU1RSSU5HOgotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzoKLSAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgIT0gMCkKLSAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVI6Ci0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX1dJVEhfREVDSU1BTDoKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfWkVSTzoKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRVBNOgotICAgICAgICAgICAgc3VjY2VzcyA9ICh1aW50MzJfdClqc29uX3JlYWRlcl9zZXRfbnVtYmVyKHJlYWRlcik7Ci0gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfY2xlYXIocmVhZGVyKTsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOwotICAgICAgICAgIC8qIFRoZSBtaXNzaW5nIGJyZWFrIGhlcmUgaXMgaW50ZW50aW9uYWwuICovCi0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9FTkQ6Ci0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9CRUdJTjoKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9CRUdJTjoKLSAgICAgICAgICAgIGlmIChjID09ICcsJykgewotICAgICAgICAgICAgICBpZiAocmVhZGVyLT5zdGF0ZSAhPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAocmVhZGVyLT5pbl9vYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfQkVHSU47Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9CRUdJTjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKHJlYWRlci0+ZGVwdGgtLSA9PSAwKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgICBpZiAoKGMgPT0gJ30nKSAmJiAhcmVhZGVyLT5pbl9vYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICgoYyA9PSAnfScpICYmCi0gICAgICAgICAgICAgICAgICAocmVhZGVyLT5zdGF0ZSA9PSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9CRUdJTikgJiYKLSAgICAgICAgICAgICAgICAgICFyZWFkZXItPmNvbnRhaW5lcl9qdXN0X2JlZ3VuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoKGMgPT0gJ10nKSAmJiAhcmVhZGVyLT5pbl9hcnJheSkgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAgaWYgKChjID09ICddJykgJiYKLSAgICAgICAgICAgICAgICAgIChyZWFkZXItPnN0YXRlID09IEdSUENfSlNPTl9TVEFURV9WQUxVRV9CRUdJTikgJiYKLSAgICAgICAgICAgICAgICAgICFyZWFkZXItPmNvbnRhaW5lcl9qdXN0X2JlZ3VuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDsKLSAgICAgICAgICAgICAgc3dpdGNoIChncnBjX2pzb25fcmVhZGVyX2NvbnRhaW5lcl9lbmRzKHJlYWRlcikpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEdSUENfSlNPTl9PQkpFQ1Q6Ci0gICAgICAgICAgICAgICAgICByZWFkZXItPmluX29iamVjdCA9IDE7Ci0gICAgICAgICAgICAgICAgICByZWFkZXItPmluX2FycmF5ID0gMDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX0FSUkFZOgotICAgICAgICAgICAgICAgICAgcmVhZGVyLT5pbl9vYmplY3QgPSAwOwotICAgICAgICAgICAgICAgICAgcmVhZGVyLT5pbl9hcnJheSA9IDE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEdSUENfSlNPTl9UT1BfTEVWRUw6Ci0gICAgICAgICAgICAgICAgICBHUFJfQVNTRVJUKHJlYWRlci0+ZGVwdGggPT0gMCk7Ci0gICAgICAgICAgICAgICAgICByZWFkZXItPmluX29iamVjdCA9IDA7Ci0gICAgICAgICAgICAgICAgICByZWFkZXItPmluX2FycmF5ID0gMDsKLSAgICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfRU5EOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0pTT05fSU5URVJOQUxfRVJST1IpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBJbi1zdHJpbmcgZXNjYXBpbmcuICovCi0gICAgICBjYXNlICdcXCc6Ci0gICAgICAgIHN3aXRjaCAocmVhZGVyLT5zdGF0ZSkgewotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfU1RSSU5HOgotICAgICAgICAgICAgcmVhZGVyLT5lc2NhcGVkX3N0cmluZ193YXNfa2V5ID0gMTsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOgotICAgICAgICAgICAgcmVhZGVyLT5lc2NhcGVkX3N0cmluZ193YXNfa2V5ID0gMDsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgLyogVGhpcyBpcyB0aGUgXFwgY2FzZS4gKi8KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFOgotICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSAhPSAwKQotICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgJ1xcJyk7Ci0gICAgICAgICAgICBpZiAocmVhZGVyLT5lc2NhcGVkX3N0cmluZ193YXNfa2V5KSB7Ci0gICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlYWRlci0+Y29udGFpbmVyX2p1c3RfYmVndW4gPSAwOwotICAgICAgICBzd2l0Y2ggKHJlYWRlci0+c3RhdGUpIHsKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0JFR0lOOgotICAgICAgICAgICAgaWYgKGMgIT0gJyInKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX1NUUklORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc6Ci0gICAgICAgICAgICBHUFJfQVNTRVJUKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSA9PSAwKTsKLSAgICAgICAgICAgIGlmIChjID09ICciJykgewotICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfRU5EOwotICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zZXRfa2V5KHJlYWRlcik7Ci0gICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19jbGVhcihyZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGMgPD0gMHgwMDFmKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCBjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOgotICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSAhPSAwKQotICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgaWYgKGMgPT0gJyInKSB7Ci0gICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOwotICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zZXRfc3RyaW5nKHJlYWRlcik7Ci0gICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19jbGVhcihyZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGMgPCAzMikgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfRU5EOgotICAgICAgICAgICAgaWYgKGMgIT0gJzonKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9CRUdJTjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfQkVHSU46Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9UUlVFX1I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9BOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVMTF9VOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX1pFUk87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgIGNhc2UgJzInOgotICAgICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5jb250YWluZXJfanVzdF9iZWd1biA9IDE7Ci0gICAgICAgICAgICAgICAganNvbl9yZWFkZXJfY29udGFpbmVyX2JlZ2lucyhyZWFkZXIsIEdSUENfSlNPTl9PQkpFQ1QpOwotICAgICAgICAgICAgICAgIHJlYWRlci0+ZGVwdGgrKzsKLSAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfQkVHSU47Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5pbl9vYmplY3QgPSAxOwotICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fYXJyYXkgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICAgIHJlYWRlci0+Y29udGFpbmVyX2p1c3RfYmVndW4gPSAxOwotICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9iZWdpbnMocmVhZGVyLCBHUlBDX0pTT05fQVJSQVkpOwotICAgICAgICAgICAgICAgIHJlYWRlci0+ZGVwdGgrKzsKLSAgICAgICAgICAgICAgICByZWFkZXItPmluX29iamVjdCA9IDA7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5pbl9hcnJheSA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEU6Ci0gICAgICAgICAgICBpZiAocmVhZGVyLT5lc2NhcGVkX3N0cmluZ193YXNfa2V5KSB7Ci0gICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgJiYgYyAhPSAndScpCi0gICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCAnXGInKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgJ1xmJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsICdcbicpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCAnXHInKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgJ1x0Jyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMTsKLSAgICAgICAgICAgICAgICByZWFkZXItPnVuaWNvZGVfY2hhciA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMToKLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyOgotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTM6Ci0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VNDoKLSAgICAgICAgICAgIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKLSAgICAgICAgICAgICAgYyAtPSAnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkgewotICAgICAgICAgICAgICBjIC09ICdBJyAtIDEwOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA+PSAnYScpICYmIChjIDw9ICdmJykpIHsKLSAgICAgICAgICAgICAgYyAtPSAnYScgLSAxMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkZXItPnVuaWNvZGVfY2hhciA9ICh1aW50MTZfdCkocmVhZGVyLT51bmljb2RlX2NoYXIgPDwgNCk7Ci0gICAgICAgICAgICByZWFkZXItPnVuaWNvZGVfY2hhciA9ICh1aW50MTZfdCkocmVhZGVyLT51bmljb2RlX2NoYXIgfCBjKTsKLQotICAgICAgICAgICAgc3dpdGNoIChyZWFkZXItPnN0YXRlKSB7Ci0gICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTE6Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyOgotICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMzoKLSAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTQ6Ci0gICAgICAgICAgICAgICAgLyogU2VlIGdycGNfanNvbl93cml0ZXJfZXNjYXBlX3N0cmluZyB0byBoYXZlIGEgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgKiBvZiB3aGF0J3MgZ29pbmcgb24gaGVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKHJlYWRlci0+dW5pY29kZV9jaGFyICYgMHhmYzAwKSA9PSAweGQ4MDApIHsKLSAgICAgICAgICAgICAgICAgIC8qIGhpZ2ggc3Vycm9nYXRlIHV0Zi0xNiAqLwotICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSAhPSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgcmVhZGVyLT51bmljb2RlX2hpZ2hfc3Vycm9nYXRlID0gcmVhZGVyLT51bmljb2RlX2NoYXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocmVhZGVyLT51bmljb2RlX2NoYXIgJiAweGZjMDApID09IDB4ZGMwMCkgewotICAgICAgICAgICAgICAgICAgLyogbG93IHN1cnJvZ2F0ZSB1dGYtMTYgKi8KLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHV0ZjMyOwotICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgdXRmMzIgPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgdXRmMzIgKz0gKHVpbnQzMl90KSgKLSAgICAgICAgICAgICAgICAgICAgICAocmVhZGVyLT51bmljb2RlX2hpZ2hfc3Vycm9nYXRlIC0gMHhkODAwKSAqIDB4NDAwKTsKLSAgICAgICAgICAgICAgICAgIHV0ZjMyICs9ICh1aW50MzJfdCkocmVhZGVyLT51bmljb2RlX2NoYXIgLSAweGRjMDApOwotICAgICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF91dGYzMihyZWFkZXIsIHV0ZjMyKTsKLSAgICAgICAgICAgICAgICAgIHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgKi8KLSAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfdXRmMzIocmVhZGVyLCByZWFkZXItPnVuaWNvZGVfY2hhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFkZXItPmVzY2FwZWRfc3RyaW5nX3dhc19rZXkpIHsKLSAgICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gR1JQQ19KU09OX0lOVEVSTkFMX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSOgotICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9ET1Q7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX1dJVEhfREVDSU1BTDoKLSAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfWkVSTzoKLSAgICAgICAgICAgIGlmIChjICE9ICcuJykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRE9UOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRE9UOgotICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfV0lUSF9ERUNJTUFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FOgotICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FUE07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX0VQTToKLSAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1RSVUVfUjoKLSAgICAgICAgICAgIGlmIChjICE9ICdyJykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9VOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9UUlVFX1U6Ci0gICAgICAgICAgICBpZiAoYyAhPSAndScpIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1RSVUVfRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9FOgotICAgICAgICAgICAgaWYgKGMgIT0gJ2UnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X3RydWUocmVhZGVyKTsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9BOgotICAgICAgICAgICAgaWYgKGMgIT0gJ2EnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9MOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9MOgotICAgICAgICAgICAgaWYgKGMgIT0gJ2wnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9TOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9TOgotICAgICAgICAgICAgaWYgKGMgIT0gJ3MnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9FOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9FOgotICAgICAgICAgICAgaWYgKGMgIT0gJ2UnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X2ZhbHNlKHJlYWRlcik7Ci0gICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVMTF9VOgotICAgICAgICAgICAgaWYgKGMgIT0gJ3UnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wxOgotICAgICAgICAgICAgaWYgKGMgIT0gJ2wnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wyOgotICAgICAgICAgICAgaWYgKGMgIT0gJ2wnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOwotICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X251bGwocmVhZGVyKTsKLSAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvKiBBbGwgb2YgdGhlIFZBTFVFX0VORCBjYXNlcyBhcmUgaGFuZGxlZCBpbiB0aGUgc3BlY2lhbGl6ZWQgY2FzZQotICAgICAgICAgICAqIGFib3ZlLiAqLwotICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDoKLSAgICAgICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgICAgICBjYXNlICcsJzoKLSAgICAgICAgICAgICAgY2FzZSAnfSc6Ci0gICAgICAgICAgICAgIGNhc2UgJ10nOgotICAgICAgICAgICAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0pTT05fSU5URVJOQUxfRVJST1IpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfRU5EOgotICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0pTT05fSU5URVJOQUxfRVJST1IpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oIGIvc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmNDRiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9KU09OX0pTT05fUkVBREVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0pTT05fSlNPTl9SRUFERVJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmgiCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0JFR0lOLAotICBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkcsCi0gIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0VORCwKLSAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HLAotICBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRSwKLSAgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTEsCi0gIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyLAotICBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMywKLSAgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTQsCi0gIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVIsCi0gIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfV0lUSF9ERUNJTUFMLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX1pFUk8sCi0gIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRE9ULAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX0UsCi0gIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRVBNLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9SLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9VLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9FLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRkFMU0VfQSwKLSAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0ZBTFNFX0wsCi0gIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9TLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRkFMU0VfRSwKLSAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTExfVSwKLSAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTExfTDEsCi0gIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wyLAotICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5ELAotICBHUlBDX0pTT05fU1RBVEVfRU5ECi19IGdycGNfanNvbl9yZWFkZXJfc3RhdGU7Ci0KLWVudW0gewotICAvKiBUaGUgZmlyc3Qgbm9uLXVuaWNvZGUgdmFsdWUgaXMgMHgxMTAwMDAuIEJ1dCBsZXQncyBwaWNrCi0gICAqIGEgdmFsdWUgaGlnaCBlbm91Z2ggdG8gc3RhcnQgb3VyIGVycm9yIGNvZGVzIGZyb20uIFRoZXNlCi0gICAqIHZhbHVlcyBhcmUgc2FmZSB0byByZXR1cm4gZnJvbSB0aGUgcmVhZF9jaGFyIGZ1bmN0aW9uLgotICAgKi8KLSAgR1JQQ19KU09OX1JFQURfQ0hBUl9FT0YgPSAweDdmZmZmZmYwLAotICBHUlBDX0pTT05fUkVBRF9DSEFSX0VBR0FJTiwKLSAgR1JQQ19KU09OX1JFQURfQ0hBUl9FUlJPUgotfTsKLQotc3RydWN0IGdycGNfanNvbl9yZWFkZXI7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfanNvbl9yZWFkZXJfdnRhYmxlIHsKLSAgLyogQ2xlYXJzIHlvdXIgaW50ZXJuYWwgc3RyaW5nIHNjcmF0Y2hwYWQuICovCi0gIHZvaWQgKCpzdHJpbmdfY2xlYXIpKHZvaWQgKnVzZXJkYXRhKTsKLSAgLyogQWRkcyBhIGNoYXIgdG8gdGhlIHN0cmluZyBzY3JhdGNocGFkLiAqLwotICB2b2lkICgqc3RyaW5nX2FkZF9jaGFyKSh2b2lkICp1c2VyZGF0YSwgdWludDMyX3QgYyk7Ci0gIC8qIEFkZHMgYSB1dGYzMiBjaGFyIHRvIHRoZSBzdHJpbmcgc2NyYXRjaHBhZC4gKi8KLSAgdm9pZCAoKnN0cmluZ19hZGRfdXRmMzIpKHZvaWQgKnVzZXJkYXRhLCB1aW50MzJfdCBjKTsKLSAgLyogUmVhZHMgYSBjaGFyYWN0ZXIgZnJvbSB5b3VyIGlucHV0LiBNYXkgYmUgdXRmLTgsIDE2IG9yIDMyLiAqLwotICB1aW50MzJfdCAoKnJlYWRfY2hhcikodm9pZCAqdXNlcmRhdGEpOwotICAvKiBTdGFydHMgYSBjb250YWluZXIgb2YgdHlwZSBHUlBDX0pTT05fQVJSQVkgb3IgR1JQQ19KU09OX09CSkVDVC4gKi8KLSAgdm9pZCAoKmNvbnRhaW5lcl9iZWdpbnMpKHZvaWQgKnVzZXJkYXRhLCBncnBjX2pzb25fdHlwZSB0eXBlKTsKLSAgLyogRW5kcyB0aGUgY3VycmVudCBjb250YWluZXIuIE11c3QgcmV0dXJuIHRoZSB0eXBlIG9mIGl0cyBwYXJlbnQuICovCi0gIGdycGNfanNvbl90eXBlICgqY29udGFpbmVyX2VuZHMpKHZvaWQgKnVzZXJkYXRhKTsKLSAgLyogWW91ciBpbnRlcm5hbCBzdHJpbmcgc2NyYXRjaHBhZCBpcyBhbiBvYmplY3QncyBrZXkuICovCi0gIHZvaWQgKCpzZXRfa2V5KSh2b2lkICp1c2VyZGF0YSk7Ci0gIC8qIFlvdXIgaW50ZXJuYWwgc3RyaW5nIHNjcmF0Y2hwYWQgaXMgYSBzdHJpbmcgdmFsdWUuICovCi0gIHZvaWQgKCpzZXRfc3RyaW5nKSh2b2lkICp1c2VyZGF0YSk7Ci0gIC8qIFlvdXIgaW50ZXJuYWwgc3RyaW5nIHNjcmF0Y2hwYWQgaXMgYSBudW1lcmljYWwgdmFsdWUuIFJldHVybiAxIGlmIHZhbGlkLiAqLwotICBpbnQgKCpzZXRfbnVtYmVyKSh2b2lkICp1c2VyZGF0YSk7Ci0gIC8qIFNldHMgdGhlIHZhbHVlcyB0cnVlLCBmYWxzZSBvciBudWxsLiAqLwotICB2b2lkICgqc2V0X3RydWUpKHZvaWQgKnVzZXJkYXRhKTsKLSAgdm9pZCAoKnNldF9mYWxzZSkodm9pZCAqdXNlcmRhdGEpOwotICB2b2lkICgqc2V0X251bGwpKHZvaWQgKnVzZXJkYXRhKTsKLX0gZ3JwY19qc29uX3JlYWRlcl92dGFibGU7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfanNvbl9yZWFkZXIgewotICAvKiBUaGF0IHN0cnVjdHVyZSBpcyBmdWxseSBwcml2YXRlLCBhbmQgaW5pdGlhbGl6ZWQgYnkgZ3JwY19qc29uX3JlYWRlcl9pbml0LgotICAgKiBUaGUgZGVmaW5pdGlvbiBpcyBwdWJsaWMgc28geW91IGNhbiBwdXQgaXQgb24geW91ciBzdGFjay4KLSAgICovCi0KLSAgdm9pZCAqdXNlcmRhdGE7Ci0gIGdycGNfanNvbl9yZWFkZXJfdnRhYmxlICp2dGFibGU7Ci0gIGludCBkZXB0aDsKLSAgaW50IGluX29iamVjdDsKLSAgaW50IGluX2FycmF5OwotICBpbnQgZXNjYXBlZF9zdHJpbmdfd2FzX2tleTsKLSAgaW50IGNvbnRhaW5lcl9qdXN0X2JlZ3VuOwotICB1aW50MTZfdCB1bmljb2RlX2NoYXIsIHVuaWNvZGVfaGlnaF9zdXJyb2dhdGU7Ci0gIGdycGNfanNvbl9yZWFkZXJfc3RhdGUgc3RhdGU7Ci19IGdycGNfanNvbl9yZWFkZXI7Ci0KLS8qIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcGFyc2VyLiAqLwotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19KU09OX0RPTkUsICAgICAgICAgIC8qIFRoZSBwYXJzZXIgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LiAqLwotICBHUlBDX0pTT05fRUFHQUlOLCAgICAgICAgLyogVGhlIHBhcnNlciB5aWVsZHMgdG8gZ2V0IG1vcmUgZGF0YS4gKi8KLSAgR1JQQ19KU09OX1JFQURfRVJST1IsICAgIC8qIFRoZSBwYXJzZXIgcGFzc2VzIHRocm91Z2ggYSByZWFkIGVycm9yLiAqLwotICBHUlBDX0pTT05fUEFSU0VfRVJST1IsICAgLyogVGhlIHBhcnNlciBmb3VuZCBhbiBlcnJvciBpbiB0aGUganNvbiBzdHJlYW0uICovCi0gIEdSUENfSlNPTl9JTlRFUk5BTF9FUlJPUiAvKiBUaGUgcGFyc2VyIGdvdCBhbiBpbnRlcm5hbCBlcnJvci4gKi8KLX0gZ3JwY19qc29uX3JlYWRlcl9zdGF0dXM7Ci0KLS8qIENhbGwgdGhpcyBmdW5jdGlvbiB0byBzdGFydCBwYXJzaW5nIHRoZSBpbnB1dC4gSXQgd2lsbCByZXR1cm4gdGhlIGZvbGxvd2luZzoKLSAqICAgIC4gR1JQQ19KU09OX0RPTkUgaWYgdGhlIGlucHV0IGdvdCBlb2YsIGFuZCB0aGUgcGFyc2luZyBmaW5pc2hlZAotICogICAgICBzdWNjZXNzZnVsbHkuCi0gKiAgICAuIEdSUENfSlNPTl9FQUdBSU4gaWYgdGhlIHJlYWRfY2hhciBmdW5jdGlvbiByZXR1cm5lZCBhZ2Fpbi4gQ2FsbCB0aGUKLSAqICAgICAgcGFyc2VyIGFnYWluIGFzIG5lZWRlZC4gSXQgaXMgb2theSB0byBjYWxsIHRoZSBwYXJzZXIgaW4gcG9sbGluZyBtb2RlLAotICogICAgICBhbHRob3VnaCBhIGJpdCBkdWxsLgotICogICAgLiBHUlBDX0pTT05fUkVBRF9FUlJPUiBpZiB0aGUgcmVhZF9jaGFyIGZ1bmN0aW9uIHJldHVybmVkIGFuIGVycm9yLiBUaGUKLSAqICAgICAgc3RhdGUgaXNuJ3QgYnJva2VuIGhvd2V2ZXIsIGFuZCB0aGUgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhZ2FpbiBpZiB0aGUKLSAqICAgICAgZXJyb3IgaGFzIGJlZW4gY29ycmVjdGVkLiBCdXQgcGxlYXNlIHVzZSB0aGUgRUFHQUlOIGZlYXR1cmUgaW5zdGVhZCBmb3IKLSAqICAgICAgY29uc2lzdGVuY3kuCi0gKiAgICAuIEdSUENfSlNPTl9QQVJTRV9FUlJPUiBpZiB0aGUgaW5wdXQgd2FzIHNvbWVob3cgaW52YWxpZC4KLSAqICAgIC4gR1JQQ19KU09OX0lOVEVSTkFMX0VSUk9SIGlmIHRoZSBwYXJzZXIgc29tZWhvdyBlbmRlZCBpbnRvIGFuIGludmFsaWQKLSAqICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKi8KLWdycGNfanNvbl9yZWFkZXJfc3RhdHVzIGdycGNfanNvbl9yZWFkZXJfcnVuKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcik7Ci0KLS8qIENhbGwgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSByZWFkZXIgc3RydWN0dXJlLiAqLwotdm9pZCBncnBjX2pzb25fcmVhZGVyX2luaXQoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3JlYWRlcl92dGFibGUgKnZ0YWJsZSwgdm9pZCAqdXNlcmRhdGEpOwotCi0vKiBZb3UgbWF5IGNhbGwgdGhpcyBmcm9tIHRoZSByZWFkX2NoYXIgY2FsbGJhY2sgaWYgeW91IGRvbid0IGtub3cgd2hlcmUgaXMgdGhlCi0gKiBlbmQgb2YgeW91ciBpbnB1dCBzdHJlYW0sIGFuZCB5b3UnZCBsaWtlIHRoZSBqc29uIHJlYWRlciB0byBoaW50IHlvdSB0aGF0IGl0Ci0gKiBoYXMgY29tcGxldGVkIHJlYWRpbmcgaXRzIGlucHV0LCBzbyB5b3UgY2FuIHJldHVybiBhbiBFT0YgdG8gaXQuIE5vdGUgdGhhdAotICogdGhlcmUgbWlnaHQgc3RpbGwgYmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMgYWZ0ZXIgdGhhdCBwb2ludC4KLSAqLwotaW50IGdycGNfanNvbl9yZWFkZXJfaXNfY29tcGxldGUoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9KU09OX0pTT05fUkVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyBiL3NyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlYmNlMS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9qc29uL2pzb25fc3RyaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCIKLQotLyogVGhlIGpzb24gcmVhZGVyIHdpbGwgY29uc3RydWN0IGEgYnVuY2ggb2YgZ3JwY19qc29uIG9iamVjdHMgYW5kCi0gKiBsaW5rIHRoZW0gYWxsIHVwIHRvZ2V0aGVyIGluIGEgdHJlZS1saWtlIHN0cnVjdHVyZSB0aGF0IHdpbGwgcmVwcmVzZW50Ci0gKiB0aGUganNvbiBkYXRhIGluIG1lbW9yeS4KLSAqCi0gKiBJdCBhbHNvIHVzZXMgaXRzIG93biBpbnB1dCBhcyBhIHNjcmF0Y2hwYWQgdG8gc3RvcmUgYWxsIG9mIHRoZSBkZWNvZGVkLAotICogdW5lc2NhcGVkIHN0cmluZ3MuIFNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlc2UgcG9pbnRlcnMgaW4KLSAqIHRoYXQgb3BhcXVlIHN0cnVjdHVyZSB0aGUgcmVhZGVyIHdpbGwgY2FycnkgZm9yIHVzLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIHdvcmtzIGJlY2F1c2UgdGhlIGFjdCBvZiBwYXJzaW5nIGpzb24gYWx3YXlzIHJlZHVjZXMgaXRzCi0gKiBpbnB1dCBzaXplLCBhbmQgbmV2ZXIgZXhwYW5kcyBpdC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2pzb24gKnRvcDsKLSAgZ3JwY19qc29uICpjdXJyZW50X2NvbnRhaW5lcjsKLSAgZ3JwY19qc29uICpjdXJyZW50X3ZhbHVlOwotICB1aW50OF90ICppbnB1dDsKLSAgdWludDhfdCAqa2V5OwotICB1aW50OF90ICpzdHJpbmc7Ci0gIHVpbnQ4X3QgKnN0cmluZ19wdHI7Ci0gIHNpemVfdCByZW1haW5pbmdfaW5wdXQ7Ci19IGpzb25fcmVhZGVyX3VzZXJkYXRhOwotCi0vKiBUaGlzIGpzb24gd3JpdGVyIHdpbGwgcHV0IGV2ZXJ5dGhpbmcgaW4gYSBiaWcgc3RyaW5nLgotICogVGhlIHBvaW50IGlzIHRoYXQgd2UgYWxsb2NhdGUgdGhhdCBzdHJpbmcgaW4gY2h1bmtzIG9mIDI1NiBieXRlcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpvdXRwdXQ7Ci0gIHNpemVfdCBmcmVlX3NwYWNlOwotICBzaXplX3Qgc3RyaW5nX2xlbjsKLSAgc2l6ZV90IGFsbG9jYXRlZDsKLX0ganNvbl93cml0ZXJfdXNlcmRhdGE7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIGxlZnQgaW4gdGhlIG91dHB1dCBidWZmZXIsCi0gKiBhbmQgd2lsbCBlbmxhcmdlIGl0IGlmIG5lY2Vzc2FyeS4gV2UncmUgb25seSBhbGxvY2F0aW5nIGNodW5rcyBvZiAyNTYKLSAqIGJ5dGVzIGF0IGEgdGltZSAob3IgbXVsdGlwbGVzIHRoZXJlb2YpLgotICovCi1zdGF0aWMgdm9pZCBqc29uX3dyaXRlcl9vdXRwdXRfY2hlY2sodm9pZCAqdXNlcmRhdGEsIHNpemVfdCBuZWVkZWQpIHsKLSAganNvbl93cml0ZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7Ci0gIGlmIChzdGF0ZS0+ZnJlZV9zcGFjZSA+PSBuZWVkZWQpIHJldHVybjsKLSAgbmVlZGVkIC09IHN0YXRlLT5mcmVlX3NwYWNlOwotICAvKiBSb3VuZCB1cCBieSAyNTYgYnl0ZXMuICovCi0gIG5lZWRlZCA9IChuZWVkZWQgKyAweGZmKSAmIH4weGZmVTsKLSAgc3RhdGUtPm91dHB1dCA9IGdwcl9yZWFsbG9jKHN0YXRlLT5vdXRwdXQsIHN0YXRlLT5hbGxvY2F0ZWQgKyBuZWVkZWQpOwotICBzdGF0ZS0+ZnJlZV9zcGFjZSArPSBuZWVkZWQ7Ci0gIHN0YXRlLT5hbGxvY2F0ZWQgKz0gbmVlZGVkOwotfQotCi0vKiBUaGVzZSBhcmUgbmVlZGVkIGJ5IHRoZSB3cml0ZXIncyBpbXBsZW1lbnRhdGlvbi4gKi8KLXN0YXRpYyB2b2lkIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHZvaWQgKnVzZXJkYXRhLCBjaGFyIGMpIHsKLSAganNvbl93cml0ZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9jaGVjayh1c2VyZGF0YSwgMSk7Ci0gIHN0YXRlLT5vdXRwdXRbc3RhdGUtPnN0cmluZ19sZW4rK10gPSBjOwotICBzdGF0ZS0+ZnJlZV9zcGFjZS0tOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHZvaWQgKnVzZXJkYXRhLCBjb25zdCBjaGFyICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pIHsKLSAganNvbl93cml0ZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9jaGVjayh1c2VyZGF0YSwgbGVuKTsKLSAgbWVtY3B5KHN0YXRlLT5vdXRwdXQgKyBzdGF0ZS0+c3RyaW5nX2xlbiwgc3RyLCBsZW4pOwotICBzdGF0ZS0+c3RyaW5nX2xlbiArPSBsZW47Ci0gIHN0YXRlLT5mcmVlX3NwYWNlIC09IGxlbjsKLX0KLQotc3RhdGljIHZvaWQganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZyh2b2lkICp1c2VyZGF0YSwgY29uc3QgY2hhciAqc3RyKSB7Ci0gIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbih1c2VyZGF0YSwgc3RyLCBsZW4pOwotfQotCi0vKiBUaGUgcmVhZGVyIGFza3MgdXMgdG8gY2xlYXIgb3VyIHNjcmF0Y2hwYWQuIEluIG91ciBjYXNlLCB3ZSdsbCBzaW1wbHkgbWFyawotICogdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdHJpbmcsIGFuZCBhZHZhbmNlIG91ciBvdXRwdXQgcG9pbnRlci4KLSAqLwotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc3RyaW5nX2NsZWFyKHZvaWQgKnVzZXJkYXRhKSB7Ci0gIGpzb25fcmVhZGVyX3VzZXJkYXRhICpzdGF0ZSA9IHVzZXJkYXRhOwotICBpZiAoc3RhdGUtPnN0cmluZykgewotICAgIEdQUl9BU1NFUlQoc3RhdGUtPnN0cmluZ19wdHIgPCBzdGF0ZS0+aW5wdXQpOwotICAgICpzdGF0ZS0+c3RyaW5nX3B0cisrID0gMDsKLSAgfQotICBzdGF0ZS0+c3RyaW5nID0gc3RhdGUtPnN0cmluZ19wdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih2b2lkICp1c2VyZGF0YSwgdWludDMyX3QgYykgewotICBqc29uX3JlYWRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKLSAgR1BSX0FTU0VSVChzdGF0ZS0+c3RyaW5nX3B0ciA8IHN0YXRlLT5pbnB1dCk7Ci0gIEdQUl9BU1NFUlQoYyA8PSAweGZmKTsKLSAgKnN0YXRlLT5zdHJpbmdfcHRyKysgPSAodWludDhfdCljOwotfQotCi0vKiBXZSBhcmUgY29udmVydGluZyBhIFVURi0zMiBjaGFyYWN0ZXIgaW50byBVVEYtOCBoZXJlLAotICogYXMgZGVzY3JpYmVkIGJ5IFJGQzM2MjkuCi0gKi8KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfdXRmMzIodm9pZCAqdXNlcmRhdGEsIHVpbnQzMl90IGMpIHsKLSAgaWYgKGMgPD0gMHg3ZikgewotICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYyk7Ci0gIH0gZWxzZSBpZiAoYyA8PSAweDdmZikgewotICAgIHVpbnQzMl90IGIxID0gMHhjMCB8ICgoYyA+PiA2KSAmIDB4MWYpOwotICAgIHVpbnQzMl90IGIyID0gMHg4MCB8IChjICYgMHgzZik7Ci0gICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBiMSk7Ci0gICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBiMik7Ci0gIH0gZWxzZSBpZiAoYyA8PSAweGZmZmYpIHsKLSAgICB1aW50MzJfdCBiMSA9IDB4ZTAgfCAoKGMgPj4gMTIpICYgMHgwZik7Ci0gICAgdWludDMyX3QgYjIgPSAweDgwIHwgKChjID4+IDYpICYgMHgzZik7Ci0gICAgdWludDMyX3QgYjMgPSAweDgwIHwgKGMgJiAweDNmKTsKLSAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIodXNlcmRhdGEsIGIxKTsKLSAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIodXNlcmRhdGEsIGIyKTsKLSAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIodXNlcmRhdGEsIGIzKTsKLSAgfSBlbHNlIGlmIChjIDw9IDB4MWZmZmZmKSB7Ci0gICAgdWludDMyX3QgYjEgPSAweGYwIHwgKChjID4+IDE4KSAmIDB4MDcpOwotICAgIHVpbnQzMl90IGIyID0gMHg4MCB8ICgoYyA+PiAxMikgJiAweDNmKTsKLSAgICB1aW50MzJfdCBiMyA9IDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKTsKLSAgICB1aW50MzJfdCBiNCA9IDB4ODAgfCAoYyAmIDB4M2YpOwotICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjEpOwotICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjIpOwotICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjMpOwotICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjQpOwotICB9Ci19Ci0KLS8qIFdlIGNvbnNpZGVyIHRoYXQgdGhlIGlucHV0IG1heSBiZSBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcuIFNvIHdlCi0gKiBjYW4gZW5kIHVwIGhpdHRpbmcgZW9mIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBhbGxlZ2VkIHN0cmluZyBsZW5ndGguCi0gKi8KLXN0YXRpYyB1aW50MzJfdCBqc29uX3JlYWRlcl9yZWFkX2NoYXIodm9pZCAqdXNlcmRhdGEpIHsKLSAgdWludDMyX3QgcjsKLSAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7Ci0KLSAgaWYgKHN0YXRlLT5yZW1haW5pbmdfaW5wdXQgPT0gMCkgcmV0dXJuIEdSUENfSlNPTl9SRUFEX0NIQVJfRU9GOwotCi0gIHIgPSAqc3RhdGUtPmlucHV0Kys7Ci0gIHN0YXRlLT5yZW1haW5pbmdfaW5wdXQtLTsKLQotICBpZiAociA9PSAwKSB7Ci0gICAgc3RhdGUtPnJlbWFpbmluZ19pbnB1dCA9IDA7Ci0gICAgcmV0dXJuIEdSUENfSlNPTl9SRUFEX0NIQVJfRU9GOwotICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZ3JwY19qc29uIG9iamVjdCBhbmQgbGluayBpdCBpbnRvCi0gKiBvdXIgdHJlZS1pbi1wcm9ncmVzcyBpbnNpZGUgb3VyIG9wYXF1ZSBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBncnBjX2pzb24gKmpzb25fY3JlYXRlX2FuZF9saW5rKHZvaWQgKnVzZXJkYXRhLCBncnBjX2pzb25fdHlwZSB0eXBlKSB7Ci0gIGpzb25fcmVhZGVyX3VzZXJkYXRhICpzdGF0ZSA9IHVzZXJkYXRhOwotICBncnBjX2pzb24gKmpzb24gPSBncnBjX2pzb25fY3JlYXRlKHR5cGUpOwotCi0gIGpzb24tPnBhcmVudCA9IHN0YXRlLT5jdXJyZW50X2NvbnRhaW5lcjsKLSAganNvbi0+cHJldiA9IHN0YXRlLT5jdXJyZW50X3ZhbHVlOwotICBzdGF0ZS0+Y3VycmVudF92YWx1ZSA9IGpzb247Ci0KLSAgaWYgKGpzb24tPnByZXYpIHsKLSAgICBqc29uLT5wcmV2LT5uZXh0ID0ganNvbjsKLSAgfQotICBpZiAoanNvbi0+cGFyZW50KSB7Ci0gICAgaWYgKCFqc29uLT5wYXJlbnQtPmNoaWxkKSB7Ci0gICAgICBqc29uLT5wYXJlbnQtPmNoaWxkID0ganNvbjsKLSAgICB9Ci0gICAgaWYgKGpzb24tPnBhcmVudC0+dHlwZSA9PSBHUlBDX0pTT05fT0JKRUNUKSB7Ci0gICAgICBqc29uLT5rZXkgPSAoY2hhciAqKXN0YXRlLT5rZXk7Ci0gICAgfQotICB9Ci0gIGlmICghc3RhdGUtPnRvcCkgewotICAgIHN0YXRlLT50b3AgPSBqc29uOwotICB9Ci0KLSAgcmV0dXJuIGpzb247Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9iZWdpbnModm9pZCAqdXNlcmRhdGEsIGdycGNfanNvbl90eXBlIHR5cGUpIHsKLSAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7Ci0gIGdycGNfanNvbiAqY29udGFpbmVyOwotCi0gIEdQUl9BU1NFUlQodHlwZSA9PSBHUlBDX0pTT05fQVJSQVkgfHwgdHlwZSA9PSBHUlBDX0pTT05fT0JKRUNUKTsKLQotICBjb250YWluZXIgPSBqc29uX2NyZWF0ZV9hbmRfbGluayh1c2VyZGF0YSwgdHlwZSk7Ci0gIHN0YXRlLT5jdXJyZW50X2NvbnRhaW5lciA9IGNvbnRhaW5lcjsKLSAgc3RhdGUtPmN1cnJlbnRfdmFsdWUgPSBOVUxMOwotfQotCi0vKiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZSByZWFkZXIgaXMgbW9zdGx5IHN0YXRlbGVzcywgc28gaXQKLSAqIGlzbid0IHRyeWluZyB0byByZW1lbWJlciB3aGF0IHRoZSBjb250YWluZXIgd2FzIHByaW9yIHRoZSBvbmUgdGhhdCBqdXN0Ci0gKiBlbmRzLiBTaW5jZSB3ZSdyZSBrZWVwaW5nIHRyYWNrIG9mIHRoZXNlIGZvciBvdXIgb3duIHB1cnBvc2UsIHdlIGFyZQotICogYWJsZSB0byByZXR1cm4gdGhhdCBpbmZvcm1hdGlvbiBiYWNrLCB3aGljaCBpcyB1c2VmdWwgZm9yIGl0IHRvIHZhbGlkYXRlCi0gKiB0aGUgaW5wdXQganNvbiBzdHJlYW0uCi0gKgotICogQWxzbyBub3RlIHRoYXQgaWYgd2UncmUgYXQgdGhlIHRvcCBvZiB0aGUgdHJlZSwgYW5kIHRoZSBsYXN0IGNvbnRhaW5lcgotICogZW5kcywgd2UgaGF2ZSB0byByZXR1cm4gR1JQQ19KU09OX1RPUF9MRVZFTC4KLSAqLwotc3RhdGljIGdycGNfanNvbl90eXBlIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9lbmRzKHZvaWQgKnVzZXJkYXRhKSB7Ci0gIGdycGNfanNvbl90eXBlIGNvbnRhaW5lcl90eXBlID0gR1JQQ19KU09OX1RPUF9MRVZFTDsKLSAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7Ci0KLSAgR1BSX0FTU0VSVChzdGF0ZS0+Y3VycmVudF9jb250YWluZXIpOwotCi0gIHN0YXRlLT5jdXJyZW50X3ZhbHVlID0gc3RhdGUtPmN1cnJlbnRfY29udGFpbmVyOwotICBzdGF0ZS0+Y3VycmVudF9jb250YWluZXIgPSBzdGF0ZS0+Y3VycmVudF9jb250YWluZXItPnBhcmVudDsKLQotICBpZiAoc3RhdGUtPmN1cnJlbnRfY29udGFpbmVyKSB7Ci0gICAgY29udGFpbmVyX3R5cGUgPSBzdGF0ZS0+Y3VycmVudF9jb250YWluZXItPnR5cGU7Ci0gIH0KLQotICByZXR1cm4gY29udGFpbmVyX3R5cGU7Ci19Ci0KLS8qIFRoZSBuZXh0IDMgZnVuY3Rpb25zIGJhc2ljYWxseSBhcmUgdGhlIHJlYWRlciBhc2tpbmcgdXMgdG8gdXNlIG91ciBzdHJpbmcKLSAqIHNjcmF0Y2hwYWQgZm9yIG9uZSBvZiB0aGVzZSAzIHB1cnBvc2VzLgotICoKLSAqIE5vdGUgdGhhdCBpbiB0aGUgc2V0X251bWJlciBjYXNlLCB3ZSdyZSBub3QgZ29pbmcgdG8gdHJ5IGludGVycHJldGluZyBpdC4KLSAqIFdlJ2xsIGtlZXAgaXQgYXMgYSBzdHJpbmcsIGFuZCBsZWF2ZSBpdCB0byB0aGUgY2FsbGVyIHRvIGV2YWx1YXRlIGl0LgotICovCi1zdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfa2V5KHZvaWQgKnVzZXJkYXRhKSB7Ci0gIGpzb25fcmVhZGVyX3VzZXJkYXRhICpzdGF0ZSA9IHVzZXJkYXRhOwotICBzdGF0ZS0+a2V5ID0gc3RhdGUtPnN0cmluZzsKLX0KLQotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X3N0cmluZyh2b2lkICp1c2VyZGF0YSkgewotICBqc29uX3JlYWRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKLSAgZ3JwY19qc29uICpqc29uID0ganNvbl9jcmVhdGVfYW5kX2xpbmsodXNlcmRhdGEsIEdSUENfSlNPTl9TVFJJTkcpOwotICBqc29uLT52YWx1ZSA9IChjaGFyICopc3RhdGUtPnN0cmluZzsKLX0KLQotc3RhdGljIGludCBqc29uX3JlYWRlcl9zZXRfbnVtYmVyKHZvaWQgKnVzZXJkYXRhKSB7Ci0gIGpzb25fcmVhZGVyX3VzZXJkYXRhICpzdGF0ZSA9IHVzZXJkYXRhOwotICBncnBjX2pzb24gKmpzb24gPSBqc29uX2NyZWF0ZV9hbmRfbGluayh1c2VyZGF0YSwgR1JQQ19KU09OX05VTUJFUik7Ci0gIGpzb24tPnZhbHVlID0gKGNoYXIgKilzdGF0ZS0+c3RyaW5nOwotICByZXR1cm4gMTsKLX0KLQotLyogVGhlIG9iamVjdCB0eXBlcyB0cnVlLCBmYWxzZSBhbmQgbnVsbCBhcmUgc2VsZi1zdWZmaWNpZW50LCBhbmQgZG9uJ3QgbmVlZAotICogYW55IG1vcmUgaW5mb3JtYXRpb24gYmVzaWRlIHRoZWlyIHR5cGUuCi0gKi8KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3NldF90cnVlKHZvaWQgKnVzZXJkYXRhKSB7Ci0gIGpzb25fY3JlYXRlX2FuZF9saW5rKHVzZXJkYXRhLCBHUlBDX0pTT05fVFJVRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3NldF9mYWxzZSh2b2lkICp1c2VyZGF0YSkgewotICBqc29uX2NyZWF0ZV9hbmRfbGluayh1c2VyZGF0YSwgR1JQQ19KU09OX0ZBTFNFKTsKLX0KLQotc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X251bGwodm9pZCAqdXNlcmRhdGEpIHsKLSAganNvbl9jcmVhdGVfYW5kX2xpbmsodXNlcmRhdGEsIEdSUENfSlNPTl9OVUxMKTsKLX0KLQotc3RhdGljIGdycGNfanNvbl9yZWFkZXJfdnRhYmxlIHJlYWRlcl92dGFibGUgPSB7Ci0gICAganNvbl9yZWFkZXJfc3RyaW5nX2NsZWFyLCAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyLAotICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfdXRmMzIsIGpzb25fcmVhZGVyX3JlYWRfY2hhciwKLSAgICBqc29uX3JlYWRlcl9jb250YWluZXJfYmVnaW5zLCBqc29uX3JlYWRlcl9jb250YWluZXJfZW5kcywKLSAgICBqc29uX3JlYWRlcl9zZXRfa2V5LCAgICAgICAgICBqc29uX3JlYWRlcl9zZXRfc3RyaW5nLAotICAgIGpzb25fcmVhZGVyX3NldF9udW1iZXIsICAgICAgIGpzb25fcmVhZGVyX3NldF90cnVlLAotICAgIGpzb25fcmVhZGVyX3NldF9mYWxzZSwgICAgICAgIGpzb25fcmVhZGVyX3NldF9udWxsfTsKLQotLyogQW5kIGZpbmFsbHksIGxldCdzIGRlZmluZSBvdXIgcHVibGljIEFQSS4gKi8KLWdycGNfanNvbiAqZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihjaGFyICppbnB1dCwgc2l6ZV90IHNpemUpIHsKLSAgZ3JwY19qc29uX3JlYWRlciByZWFkZXI7Ci0gIGpzb25fcmVhZGVyX3VzZXJkYXRhIHN0YXRlOwotICBncnBjX2pzb24gKmpzb24gPSBOVUxMOwotICBncnBjX2pzb25fcmVhZGVyX3N0YXR1cyBzdGF0dXM7Ci0KLSAgaWYgKCFpbnB1dCkgcmV0dXJuIE5VTEw7Ci0KLSAgc3RhdGUudG9wID0gc3RhdGUuY3VycmVudF9jb250YWluZXIgPSBzdGF0ZS5jdXJyZW50X3ZhbHVlID0gTlVMTDsKLSAgc3RhdGUuc3RyaW5nID0gc3RhdGUua2V5ID0gTlVMTDsKLSAgc3RhdGUuc3RyaW5nX3B0ciA9IHN0YXRlLmlucHV0ID0gKHVpbnQ4X3QgKilpbnB1dDsKLSAgc3RhdGUucmVtYWluaW5nX2lucHV0ID0gc2l6ZTsKLSAgZ3JwY19qc29uX3JlYWRlcl9pbml0KCZyZWFkZXIsICZyZWFkZXJfdnRhYmxlLCAmc3RhdGUpOwotCi0gIHN0YXR1cyA9IGdycGNfanNvbl9yZWFkZXJfcnVuKCZyZWFkZXIpOwotICBqc29uID0gc3RhdGUudG9wOwotCi0gIGlmICgoc3RhdHVzICE9IEdSUENfSlNPTl9ET05FKSAmJiBqc29uKSB7Ci0gICAgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7Ci0gICAganNvbiA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4ganNvbjsKLX0KLQotI2RlZmluZSBVTkJPVU5EX0pTT05fU1RSSU5HX0xFTkdUSCAweDdmZmZmZmZmCi0KLWdycGNfanNvbiAqZ3JwY19qc29uX3BhcnNlX3N0cmluZyhjaGFyICppbnB1dCkgewotICByZXR1cm4gZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihpbnB1dCwgVU5CT1VORF9KU09OX1NUUklOR19MRU5HVEgpOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX2R1bXBfcmVjdXJzaXZlKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgZ3JwY19qc29uICpqc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fb2JqZWN0KSB7Ci0gIHdoaWxlIChqc29uKSB7Ci0gICAgaWYgKGluX29iamVjdCkgZ3JwY19qc29uX3dyaXRlcl9vYmplY3Rfa2V5KHdyaXRlciwganNvbi0+a2V5KTsKLQotICAgIHN3aXRjaCAoanNvbi0+dHlwZSkgewotICAgICAgY2FzZSBHUlBDX0pTT05fT0JKRUNUOgotICAgICAgY2FzZSBHUlBDX0pTT05fQVJSQVk6Ci0gICAgICAgIGdycGNfanNvbl93cml0ZXJfY29udGFpbmVyX2JlZ2lucyh3cml0ZXIsIGpzb24tPnR5cGUpOwotICAgICAgICBpZiAoanNvbi0+Y2hpbGQpCi0gICAgICAgICAganNvbl9kdW1wX3JlY3Vyc2l2ZSh3cml0ZXIsIGpzb24tPmNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi0+dHlwZSA9PSBHUlBDX0pTT05fT0JKRUNUKTsKLSAgICAgICAgZ3JwY19qc29uX3dyaXRlcl9jb250YWluZXJfZW5kcyh3cml0ZXIsIGpzb24tPnR5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19KU09OX1NUUklORzoKLSAgICAgICAgZ3JwY19qc29uX3dyaXRlcl92YWx1ZV9zdHJpbmcod3JpdGVyLCBqc29uLT52YWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHUlBDX0pTT05fTlVNQkVSOgotICAgICAgICBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3Jhdyh3cml0ZXIsIGpzb24tPnZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfSlNPTl9UUlVFOgotICAgICAgICBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3Jhd193aXRoX2xlbih3cml0ZXIsICJ0cnVlIiwgNCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHUlBDX0pTT05fRkFMU0U6Ci0gICAgICAgIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3X3dpdGhfbGVuKHdyaXRlciwgImZhbHNlIiwgNSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHUlBDX0pTT05fTlVMTDoKLSAgICAgICAgZ3JwY19qc29uX3dyaXRlcl92YWx1ZV9yYXdfd2l0aF9sZW4od3JpdGVyLCAibnVsbCIsIDQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKGFib3J0KCkpOwotICAgIH0KLSAgICBqc29uID0ganNvbi0+bmV4dDsKLSAgfQotfQotCi1zdGF0aWMgZ3JwY19qc29uX3dyaXRlcl92dGFibGUgd3JpdGVyX3Z0YWJsZSA9IHsKLSAgICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhciwganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZywKLSAgICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVufTsKLQotY2hhciAqZ3JwY19qc29uX2R1bXBfdG9fc3RyaW5nKGdycGNfanNvbiAqanNvbiwgaW50IGluZGVudCkgewotICBncnBjX2pzb25fd3JpdGVyIHdyaXRlcjsKLSAganNvbl93cml0ZXJfdXNlcmRhdGEgc3RhdGU7Ci0KLSAgc3RhdGUub3V0cHV0ID0gTlVMTDsKLSAgc3RhdGUuZnJlZV9zcGFjZSA9IHN0YXRlLnN0cmluZ19sZW4gPSBzdGF0ZS5hbGxvY2F0ZWQgPSAwOwotICBncnBjX2pzb25fd3JpdGVyX2luaXQoJndyaXRlciwgaW5kZW50LCAmd3JpdGVyX3Z0YWJsZSwgJnN0YXRlKTsKLQotICBqc29uX2R1bXBfcmVjdXJzaXZlKCZ3cml0ZXIsIGpzb24sIDApOwotCi0gIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKCZzdGF0ZSwgMCk7Ci0KLSAgcmV0dXJuIHN0YXRlLm91dHB1dDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYyBiL3NyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2ZWMyZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmgiCi0KLXN0YXRpYyB2b2lkIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgY2hhciBjKSB7Ci0gIHdyaXRlci0+dnRhYmxlLT5vdXRwdXRfY2hhcih3cml0ZXItPnVzZXJkYXRhLCBjKTsKLX0KLQotc3RhdGljIHZvaWQganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZyhncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cikgewotICB3cml0ZXItPnZ0YWJsZS0+b3V0cHV0X3N0cmluZyh3cml0ZXItPnVzZXJkYXRhLCBzdHIpOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKSB7Ci0gIHdyaXRlci0+dnRhYmxlLT5vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHdyaXRlci0+dXNlcmRhdGEsIHN0ciwgbGVuKTsKLX0KLQotdm9pZCBncnBjX2pzb25fd3JpdGVyX2luaXQoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLCBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3dyaXRlcl92dGFibGUgKnZ0YWJsZSwgdm9pZCAqdXNlcmRhdGEpIHsKLSAgbWVtc2V0KHdyaXRlciwgMCwgc2l6ZW9mKCp3cml0ZXIpKTsKLSAgd3JpdGVyLT5jb250YWluZXJfZW1wdHkgPSAxOwotICB3cml0ZXItPmluZGVudCA9IGluZGVudDsKLSAgd3JpdGVyLT52dGFibGUgPSB2dGFibGU7Ci0gIHdyaXRlci0+dXNlcmRhdGEgPSB1c2VyZGF0YTsKLX0KLQotc3RhdGljIHZvaWQganNvbl93cml0ZXJfb3V0cHV0X2luZGVudChncnBjX2pzb25fd3JpdGVyICp3cml0ZXIpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgc3BhY2Vzc3RyW10gPQotICAgICAgIiAgICAgICAgICAgICAgICAiCi0gICAgICAiICAgICAgICAgICAgICAgICIKLSAgICAgICIgICAgICAgICAgICAgICAgIgotICAgICAgIiAgICAgICAgICAgICAgICAiOwotCi0gIHVuc2lnbmVkIHNwYWNlcyA9ICh1bnNpZ25lZCkod3JpdGVyLT5kZXB0aCAqIHdyaXRlci0+aW5kZW50KTsKLQotICBpZiAod3JpdGVyLT5pbmRlbnQgPT0gMCkgcmV0dXJuOwotCi0gIGlmICh3cml0ZXItPmdvdF9rZXkpIHsKLSAgICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICcgJyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgd2hpbGUgKHNwYWNlcyA+PSAoc2l6ZW9mKHNwYWNlc3N0cikgLSAxKSkgewotICAgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCBzcGFjZXNzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3BhY2Vzc3RyKSAtIDEpOwotICAgIHNwYWNlcyAtPSAodW5zaWduZWQpKHNpemVvZihzcGFjZXNzdHIpIC0gMSk7Ci0gIH0KLQotICBpZiAoc3BhY2VzID09IDApIHJldHVybjsKLQotICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKAotICAgICAgd3JpdGVyLCBzcGFjZXNzdHIgKyBzaXplb2Yoc3BhY2Vzc3RyKSAtIDEgLSBzcGFjZXMsIHNwYWNlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzb25fd3JpdGVyX3ZhbHVlX2VuZChncnBjX2pzb25fd3JpdGVyICp3cml0ZXIpIHsKLSAgaWYgKHdyaXRlci0+Y29udGFpbmVyX2VtcHR5KSB7Ci0gICAgd3JpdGVyLT5jb250YWluZXJfZW1wdHkgPSAwOwotICAgIGlmICgod3JpdGVyLT5pbmRlbnQgPT0gMCkgfHwgKHdyaXRlci0+ZGVwdGggPT0gMCkpIHJldHVybjsKLSAgICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICdcbicpOwotICB9IGVsc2UgewotICAgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgJywnKTsKLSAgICBpZiAod3JpdGVyLT5pbmRlbnQgPT0gMCkgcmV0dXJuOwotICAgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgJ1xuJyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQganNvbl93cml0ZXJfZXNjYXBlX3V0ZjE2KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgdWludDE2X3QgdXRmMTYpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0KLSAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbih3cml0ZXIsICJcXHUiLCAyKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCBoZXhbKHV0ZjE2ID4+IDEyKSAmIDB4MGZdKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCBoZXhbKHV0ZjE2ID4+IDgpICYgMHgwZl0pOwotICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsIGhleFsodXRmMTYgPj4gNCkgJiAweDBmXSk7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgaGV4Wyh1dGYxNikmMHgwZl0pOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3dyaXRlcl9lc2NhcGVfc3RyaW5nKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nKSB7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgJyInKTsKLQotICBmb3IgKDs7KSB7Ci0gICAgdWludDhfdCBjID0gKHVpbnQ4X3QpKnN0cmluZysrOwotICAgIGlmIChjID09IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoKGMgPj0gMzIpICYmIChjIDw9IDEyNikpIHsKLSAgICAgIGlmICgoYyA9PSAnXFwnKSB8fCAoYyA9PSAnIicpKSBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICdcXCcpOwotICAgICAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCAoY2hhciljKTsKLSAgICB9IGVsc2UgaWYgKChjIDwgMzIpIHx8IChjID09IDEyNykpIHsKLSAgICAgIHN3aXRjaCAoYykgewotICAgICAgICBjYXNlICdcYic6Ci0gICAgICAgICAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbih3cml0ZXIsICJcXGIiLCAyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCAiXFxmIiwgMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHdyaXRlciwgIlxcbiIsIDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbih3cml0ZXIsICJcXHIiLCAyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCAiXFx0IiwgMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAganNvbl93cml0ZXJfZXNjYXBlX3V0ZjE2KHdyaXRlciwgYyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVpbnQzMl90IHV0ZjMyID0gMDsKLSAgICAgIGludCBleHRyYSA9IDA7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCB2YWxpZCA9IDE7Ci0gICAgICBpZiAoKGMgJiAweGUwKSA9PSAweGMwKSB7Ci0gICAgICAgIHV0ZjMyID0gYyAmIDB4MWY7Ci0gICAgICAgIGV4dHJhID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoKGMgJiAweGYwKSA9PSAweGUwKSB7Ci0gICAgICAgIHV0ZjMyID0gYyAmIDB4MGY7Ci0gICAgICAgIGV4dHJhID0gMjsKLSAgICAgIH0gZWxzZSBpZiAoKGMgJiAweGY4KSA9PSAweGYwKSB7Ci0gICAgICAgIHV0ZjMyID0gYyAmIDB4MDc7Ci0gICAgICAgIGV4dHJhID0gMzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZm9yIChpID0gMDsgaSA8IGV4dHJhOyBpKyspIHsKLSAgICAgICAgdXRmMzIgPDw9IDY7Ci0gICAgICAgIGMgPSAodWludDhfdCkoKnN0cmluZysrKTsKLSAgICAgICAgLyogQnJlYWtzIG91dCBhbmQgYmFpbCBvbiBhbnkgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZSwgaW5jbHVkaW5nIFwwLiAqLwotICAgICAgICBpZiAoKGMgJiAweGMwKSAhPSAweDgwKSB7Ci0gICAgICAgICAgdmFsaWQgPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHV0ZjMyIHw9IGMgJiAweDNmOwotICAgICAgfQotICAgICAgaWYgKCF2YWxpZCkgYnJlYWs7Ci0gICAgICAvKiBUaGUgcmFuZ2UgMHhkODAwIC0gMHhkZmZmIGlzIHJlc2VydmVkIGJ5IHRoZSBzdXJyb2dhdGVzIGFkIHZpdGFtLgotICAgICAgICogQW55IG90aGVyIHJhbmdlIGlzIHRlY2huaWNhbGx5IHJlc2VydmVkIGZvciBmdXR1cmUgdXNhZ2UsIHNvIGlmIHdlCi0gICAgICAgKiBkb24ndCB3YW50IHRoZSBzb2Z0d2FyZSB0byBicmVhayBpbiB0aGUgZnV0dXJlLCB3ZSBoYXZlIHRvIGFsbG93Ci0gICAgICAgKiBhbnl0aGluZyBlbHNlLiBUaGUgZmlyc3Qgbm9uLXVuaWNvZGUgY2hhcmFjdGVyIGlzIDB4MTEwMDAwLiAqLwotICAgICAgaWYgKCgodXRmMzIgPj0gMHhkODAwKSAmJiAodXRmMzIgPD0gMHhkZmZmKSkgfHwgKHV0ZjMyID49IDB4MTEwMDAwKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAodXRmMzIgPj0gMHgxMDAwMCkgewotICAgICAgICAvKiBJZiB1dGYzMiBjb250YWlucyBhIGNoYXJhY3RlciB0aGF0IGlzIGFib3ZlIDB4ZmZmZiwgaXQgbmVlZHMgdG8gYmUKLSAgICAgICAgICogYnJva2VuIGRvd24gaW50byBhIHV0Zi0xNiBzdXJyb2dhdGUgcGFpci4gQSBzdXJyb2dhdGUgcGFpciBpcyBmaXJzdAotICAgICAgICAgKiBhIGhpZ2ggc3Vycm9nYXRlLCBmb2xsb3dlZCBieSBhIGxvdyBzdXJyb2dhdGUuIEVhY2ggc3Vycm9nYXRlIGhvbGRzCi0gICAgICAgICAqIDEwIGJpdHMgb2YgdXNhYmxlIGRhdGEsIHRodXMgYWxsb3dpbmcgYSB0b3RhbCBvZiAyMCBiaXRzIG9mIGRhdGEuCi0gICAgICAgICAqIFRoZSBoaWdoIHN1cnJvZ2F0ZSBtYXJrZXIgaXMgMHhkODAwLCB3aGlsZSB0aGUgbG93IHN1cnJvZ2F0ZSBtYXJrZXIKLSAgICAgICAgICogaXMgMHhkYzAwLiBUaGUgbG93IDEwIGJpdHMgb2YgZWFjaCB3aWxsIGJlIHRoZSB1c2FibGUgZGF0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQWZ0ZXIgcmUtY29tYmluaW5nIHRoZSAyMCBiaXRzIG9mIGRhdGEsIG9uZSBoYXMgdG8gYWRkIDB4MTAwMDAgdG8KLSAgICAgICAgICogdGhlIHJlc3VsdGluZyB2YWx1ZSwgaW4gb3JkZXIgdG8gb2J0YWluIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIuCi0gICAgICAgICAqIFRoaXMgaXMgb2J2aW91c2x5IGJlY2F1c2UgdGhlIHJhbmdlIDB4MDAwMCAtIDB4ZmZmZiBjYW4gYmUgd3JpdHRlbgotICAgICAgICAgKiB3aXRob3V0IGFueSBzcGVjaWFsIHRyaWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBTaW5jZSAweDEwZmZmZiBpcyB0aGUgaGlnaGVzdCBhbGxvd2VkIGNoYXJhY3Rlciwgd2UncmUgd29ya2luZyBpbgotICAgICAgICAgKiB0aGUgcmFuZ2UgMHgwMDAwMCAtIDB4ZmZmZmYgYWZ0ZXIgd2UgZGVjcmVtZW50IGl0IGJ5IDB4MTAwMDAuCi0gICAgICAgICAqIFRoYXQgcmFuZ2UgaXMgZXhhY3RseSAyMCBiaXRzLgotICAgICAgICAgKi8KLSAgICAgICAgdXRmMzIgLT0gMHgxMDAwMDsKLSAgICAgICAganNvbl93cml0ZXJfZXNjYXBlX3V0ZjE2KHdyaXRlciwgKHVpbnQxNl90KSgweGQ4MDAgfCAodXRmMzIgPj4gMTApKSk7Ci0gICAgICAgIGpzb25fd3JpdGVyX2VzY2FwZV91dGYxNih3cml0ZXIsICh1aW50MTZfdCkoMHhkYzAwIHwgKHV0ZjMyICYgMHgzZmYpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqc29uX3dyaXRlcl9lc2NhcGVfdXRmMTYod3JpdGVyLCAodWludDE2X3QpdXRmMzIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgJyInKTsKLX0KLQotdm9pZCBncnBjX2pzb25fd3JpdGVyX2NvbnRhaW5lcl9iZWdpbnMoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3R5cGUgdHlwZSkgewotICBpZiAoIXdyaXRlci0+Z290X2tleSkganNvbl93cml0ZXJfdmFsdWVfZW5kKHdyaXRlcik7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9pbmRlbnQod3JpdGVyKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCB0eXBlID09IEdSUENfSlNPTl9PQkpFQ1QgPyAneycgOiAnWycpOwotICB3cml0ZXItPmNvbnRhaW5lcl9lbXB0eSA9IDE7Ci0gIHdyaXRlci0+Z290X2tleSA9IDA7Ci0gIHdyaXRlci0+ZGVwdGgrKzsKLX0KLQotdm9pZCBncnBjX2pzb25fd3JpdGVyX2NvbnRhaW5lcl9lbmRzKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2pzb25fdHlwZSB0eXBlKSB7Ci0gIGlmICh3cml0ZXItPmluZGVudCAmJiAhd3JpdGVyLT5jb250YWluZXJfZW1wdHkpCi0gICAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCAnXG4nKTsKLSAgd3JpdGVyLT5kZXB0aC0tOwotICBpZiAoIXdyaXRlci0+Y29udGFpbmVyX2VtcHR5KSBqc29uX3dyaXRlcl9vdXRwdXRfaW5kZW50KHdyaXRlcik7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgdHlwZSA9PSBHUlBDX0pTT05fT0JKRUNUID8gJ30nIDogJ10nKTsKLSAgd3JpdGVyLT5jb250YWluZXJfZW1wdHkgPSAwOwotICB3cml0ZXItPmdvdF9rZXkgPSAwOwotfQotCi12b2lkIGdycGNfanNvbl93cml0ZXJfb2JqZWN0X2tleShncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsIGNvbnN0IGNoYXIgKnN0cmluZykgewotICBqc29uX3dyaXRlcl92YWx1ZV9lbmQod3JpdGVyKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X2luZGVudCh3cml0ZXIpOwotICBqc29uX3dyaXRlcl9lc2NhcGVfc3RyaW5nKHdyaXRlciwgc3RyaW5nKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCAnOicpOwotICB3cml0ZXItPmdvdF9rZXkgPSAxOwotfQotCi12b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgY29uc3QgY2hhciAqc3RyaW5nKSB7Ci0gIGlmICghd3JpdGVyLT5nb3Rfa2V5KSBqc29uX3dyaXRlcl92YWx1ZV9lbmQod3JpdGVyKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X2luZGVudCh3cml0ZXIpOwotICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nKHdyaXRlciwgc3RyaW5nKTsKLSAgd3JpdGVyLT5nb3Rfa2V5ID0gMDsKLX0KLQotdm9pZCBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3Jhd193aXRoX2xlbihncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbikgewotICBpZiAoIXdyaXRlci0+Z290X2tleSkganNvbl93cml0ZXJfdmFsdWVfZW5kKHdyaXRlcik7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9pbmRlbnQod3JpdGVyKTsKLSAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbih3cml0ZXIsIHN0cmluZywgbGVuKTsKLSAgd3JpdGVyLT5nb3Rfa2V5ID0gMDsKLX0KLQotdm9pZCBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3N0cmluZyhncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZykgewotICBpZiAoIXdyaXRlci0+Z290X2tleSkganNvbl93cml0ZXJfdmFsdWVfZW5kKHdyaXRlcik7Ci0gIGpzb25fd3JpdGVyX291dHB1dF9pbmRlbnQod3JpdGVyKTsKLSAganNvbl93cml0ZXJfZXNjYXBlX3N0cmluZyh3cml0ZXIsIHN0cmluZyk7Ci0gIHdyaXRlci0+Z290X2tleSA9IDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmggYi9zcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTIxMjYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyogVGhlIGlkZWEgb2YgdGhlIHdyaXRlciBpcyBiYXNpY2FsbHkgc3ltbWV0cmljYWwgb2YgdGhlIHJlYWRlci4gV2hpbGUgdGhlCi0gKiByZWFkZXIgZW1pdHMgdmFyaW91cyBjYWxscyB0byB5b3VyIGNvZGUsIHRoZSB3cml0ZXIgdGFrZXMgYmFzaWNhbGx5IHRoZQotICogc2FtZSBjYWxscyBhbmQgZW1pdCBqc29uIG91dCBvZiBpdC4gSXQgZG9lc24ndCB0cnkgdG8gbWFrZSBhbnkgY2hlY2sgb24KLSAqIHRoZSBvcmRlciBvZiB0aGUgY2FsbHMgeW91IGRvIG9uIGl0LiBNZWFuaW5nIHlvdSBjYW4gdGhlb3JpY2FsbHkgZm9yY2UKLSAqIGl0IHRvIGdlbmVyYXRlIGludmFsaWQganNvbi4KLSAqCi0gKiBBbHNvLCB1bmxpa2UgdGhlIHJlYWRlciwgdGhlIHdyaXRlciBleHBlY3RzIFVURi04IGVuY29kZWQgaW5wdXQgc3RyaW5ncy4KLSAqIFRoZXNlIHN0cmluZ3Mgd2lsbCBiZSBVVEYtOCB2YWxpZGF0ZWQsIGFuZCBhbnkgaW52YWxpZCBjaGFyYWN0ZXIgd2lsbAotICogY3V0IHRoZSBjb252ZXJzaW9uIHNob3J0LCBiZWZvcmUgYW55IGludmFsaWQgVVRGLTggc2VxdWVuY2UsIHRodXMgZm9ybWluZwotICogYSB2YWxpZCBVVEYtOCBzdHJpbmcgb3ZlcmFsbC4KLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9KU09OX0pTT05fV1JJVEVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX0pTT05fSlNPTl9XUklURVJfSAotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmgiCi0KLXR5cGVkZWYgc3RydWN0IGdycGNfanNvbl93cml0ZXJfdnRhYmxlIHsKLSAgLyogQWRkcyBhIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IHN0cmVhbS4gKi8KLSAgdm9pZCAoKm91dHB1dF9jaGFyKSh2b2lkICp1c2VyZGF0YSwgY2hhcik7Ci0gIC8qIEFkZHMgYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAqLwotICB2b2lkICgqb3V0cHV0X3N0cmluZykodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKnN0cik7Ci0gIC8qIEFkZHMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAqLwotICB2b2lkICgqb3V0cHV0X3N0cmluZ193aXRoX2xlbikodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7Ci0KLX0gZ3JwY19qc29uX3dyaXRlcl92dGFibGU7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfanNvbl93cml0ZXIgewotICB2b2lkICp1c2VyZGF0YTsKLSAgZ3JwY19qc29uX3dyaXRlcl92dGFibGUgKnZ0YWJsZTsKLSAgaW50IGluZGVudDsKLSAgaW50IGRlcHRoOwotICBpbnQgY29udGFpbmVyX2VtcHR5OwotICBpbnQgZ290X2tleTsKLX0gZ3JwY19qc29uX3dyaXRlcjsKLQotLyogQ2FsbCB0aGlzIHRvIGluaXRpYWxpemUgeW91ciB3cml0ZXIgc3RydWN0dXJlLiBUaGUgaW5kZW50IHBhcmFtZXRlciBpcwotICogc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byB1c2UgZm9yIGluZGVudGluZyB0aGUgb3V0cHV0LiBJZiB5b3UKLSAqIHVzZSBpbmRlbnQ9MCwgdGhlbiB0aGUgb3V0cHV0IHdpbGwgbm90IGhhdmUgYW55IG5ld2xpbmVzIGVpdGhlciwgdGh1cwotICogZW1pdHRpbmcgYSBjb25kZW5zZWQganNvbiBvdXRwdXQuCi0gKi8KLXZvaWQgZ3JwY19qc29uX3dyaXRlcl9pbml0KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgaW50IGluZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl93cml0ZXJfdnRhYmxlICp2dGFibGUsIHZvaWQgKnVzZXJkYXRhKTsKLQotLyogU2lnbmFscyB0aGUgYmVnaW5uaW5nIG9mIGEgY29udGFpbmVyLiAqLwotdm9pZCBncnBjX2pzb25fd3JpdGVyX2NvbnRhaW5lcl9iZWdpbnMoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3R5cGUgdHlwZSk7Ci0vKiBTaWduYWxzIHRoZSBlbmQgb2YgYSBjb250YWluZXIuICovCi12b2lkIGdycGNfanNvbl93cml0ZXJfY29udGFpbmVyX2VuZHMoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl90eXBlIHR5cGUpOwotLyogV3JpdGVzIGRvd24gYW4gb2JqZWN0IGtleSBmb3IgdGhlIG5leHQgdmFsdWUuICovCi12b2lkIGdycGNfanNvbl93cml0ZXJfb2JqZWN0X2tleShncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsIGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0vKiBTZXRzIGEgcmF3IHZhbHVlLiBVc2VmdWwgZm9yIG51bWJlcnMuICovCi12b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgY29uc3QgY2hhciAqc3RyaW5nKTsKLS8qIFNldHMgYSByYXcgdmFsdWUgd2l0aCBpdHMgbGVuZ3RoLiBVc2VmdWwgZm9yIHZhbHVlcyBsaWtlIHRydWUgb3IgZmFsc2UuICovCi12b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3X3dpdGhfbGVuKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nLCBzaXplX3QgbGVuKTsKLS8qIFNldHMgYSBzdHJpbmcgdmFsdWUuIEl0J2xsIGJlIGVzY2FwZWQsIGFuZCB1dGYtOCB2YWxpZGF0ZWQuICovCi12b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfc3RyaW5nKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9KU09OX0pTT05fV1JJVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2NlbnN1cy9SRUFETUUubWQgYi9zcmMvY29yZS9saWIvY2Vuc3VzL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvY2Vuc3VzL1JFQURNRS5tZApyZW5hbWUgdG8gc3JjL2NvcmUvbGliL2NlbnN1cy9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jZW5zdXMvYWdncmVnYXRpb24uaCBiL3NyYy9jb3JlL2xpYi9jZW5zdXMvYWdncmVnYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzUzMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9hZ2dyZWdhdGlvbi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NFTlNVU19BR0dSRUdBVElPTl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0VOU1VTX0FHR1JFR0FUSU9OX0gKKworLyoqIFN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGFuIGFnZ3JlZ2F0aW9uIHR5cGUuICovCitzdHJ1Y3QgY2Vuc3VzX2FnZ3JlZ2F0aW9uX29wcyB7CisgIC8qIENyZWF0ZSBhIG5ldyBhZ2dyZWdhdGlvbi4gVGhlIHBvaW50ZXIgcmV0dXJuZWQgY2FuIGJlIHVzZWQgaW4gZnV0dXJlIGNhbGxzCisgICAgIHRvIGNsb25lKCksIGZyZWUoKSwgcmVjb3JkKCksIGRhdGEoKSBhbmQgcmVzZXQoKS4gKi8KKyAgdm9pZCAqKCpjcmVhdGUpKGNvbnN0IHZvaWQgKmNyZWF0ZV9hcmcpOworICAvKiBNYWtlIGEgY29weSBvZiBhbiBhZ2dyZWdhdGlvbiBjcmVhdGVkIGJ5IGNyZWF0ZSgpICovCisgIHZvaWQgKigqY2xvbmUpKGNvbnN0IHZvaWQgKmFnZ3JlZ2F0aW9uKTsKKyAgLyogRGVzdHJveSBhbiBhZ2dyZWdhdGlvbiBjcmVhdGVkIGJ5IGNyZWF0ZSgpICovCisgIHZvaWQgKCpmcmVlKSh2b2lkICphZ2dyZWdhdGlvbik7CisgIC8qIFJlY29yZCBhIG5ldyB2YWx1ZSBhZ2FpbnN0IGFnZ3JlZ2F0aW9uLiAqLworICB2b2lkICgqcmVjb3JkKSh2b2lkICphZ2dyZWdhdGlvbiwgZG91YmxlIHZhbHVlKTsKKyAgLyogUmV0dXJuIGN1cnJlbnQgYWdncmVnYXRpb24gZGF0YS4gVGhlIGNhbGxlciBtdXN0IGNhc3QgdGhpcyBvYmplY3QgaW50bworICAgICB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgYWdncmVnYXRpb24gcmVzdWx0LiBUaGUgb2JqZWN0IHJldHVybmVkIGNhbiBiZQorICAgICBmcmVlZCBieSB1c2luZyBmcmVlX2RhdGEoKS4gKi8KKyAgdm9pZCAqKCpkYXRhKShjb25zdCB2b2lkICphZ2dyZWdhdGlvbik7CisgIC8qIGZyZWUgZGF0YSByZXR1cm5lZCBieSBkYXRhKCkgKi8KKyAgdm9pZCAoKmZyZWVfZGF0YSkodm9pZCAqZGF0YSk7CisgIC8qIFJlc2V0IGFuIGFnZ3JlZ2F0aW9uIHRvIGRlZmF1bHQgKHplcm8pIHZhbHVlcy4gKi8KKyAgdm9pZCAoKnJlc2V0KSh2b2lkICphZ2dyZWdhdGlvbik7CisgIC8qIE1lcmdlICdmcm9tJyBhZ2dyZWdhdGlvbiBpbnRvICd0bycuIEJvdGggYWdncmVnYXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSAqLworICB2b2lkICgqbWVyZ2UpKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tKTsKKyAgLyogRmlsbCBidWZmZXIgd2l0aCBwcmludGFibGUgc3RyaW5nIHZlcnNpb24gb2YgYWdncmVnYXRpb24gY29udGVudHMuIEZvcgorICAgICBkZWJ1Z2dpbmcgb25seS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIHRvIGJ1ZmZlciAoYSB2YWx1ZSA9PSBuCisgICAgIGltcGxpZXMgdGhlIGJ1ZmZlciB3YXMgb2YgaW5zdWZmaWNpZW50IHNpemUpLiAqLworICBzaXplX3QgKCpwcmludCkoY29uc3Qgdm9pZCAqYWdncmVnYXRpb24sIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG4pOworfTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0VOU1VTX0FHR1JFR0FUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9jb250ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExMThmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCisvLyBGdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHN1cHBvcnQgdGhlIHB1YmxpYyBjb250ZXh0IEFQSSwgaW5jbHVkaW5nCisvLyBlbmNvZGluZy9kZWNvZGluZyBhcyBwYXJ0IG9mIGNvbnRleHQgcHJvcGFnYXRpb24gYWNyb3NzIFJQQydzLiBUaGUgb3ZlcmFsbAorLy8gcmVxdWlyZW1lbnRzIChpbiBhcHByb3hpbWF0ZSBwcmlvcml0eSBvcmRlcikgZm9yIHRoZQorLy8gY29udGV4dCByZXByZXNlbnRhdGlvbjoKKy8vIDEuIEVmZmljaWVudCBjb252ZXJzaW9uIHRvL2Zyb20gd2lyZSBmb3JtYXQKKy8vIDIuIE1pbmltYWwgYnl0ZXMgdXNlZCBvbi13aXJlCisvLyAzLiBFZmZpY2llbnQgY29udGV4dCBjcmVhdGlvbgorLy8gNC4gRWZmaWNpZW50IGxvb2t1cCBvZiB0YWcgdmFsdWUgZm9yIGEga2V5CisvLyA1LiBFZmZpY2llbnQgaXRlcmF0aW9uIG92ZXIgdGFncworLy8gNi4gTWluaW1hbCBtZW1vcnkgZm9vdHByaW50CisvLworLy8gTm90ZXMgb24gdHJhZGVvZmZzL2RlY2lzaW9uczoKKy8vICogdGFnIGluY2x1ZGVzIDEgYnl0ZSBsZW5ndGggb2Yga2V5LCBhcyB3ZWxsIGFzIG5pbC10ZXJtaW5hdGluZyBieXRlLiBUaGVzZQorLy8gICBhcmUgdG8gYWlkIGluIGVmZmljaWVudCBwYXJzaW5nIGFuZCB0aGUgYWJpbGl0eSB0byBkaXJlY3RseSByZXR1cm4ga2V5CisvLyAgIHN0cmluZ3MuIFRoaXMgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBzYXZpbmcgYSBzaW5nbGUgYnl0ZS90YWcgb24gdGhlIHdpcmUuCisvLyAqIFRoZSB3aXJlIGVuY29kaW5nIHVzZXMgb25seSBzaW5nbGUgYnl0ZSB2YWx1ZXMuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZAorLy8gICB0byBoYW5kbGUgZW5kaWFuLW5lc3MgY29udmVyc2lvbnMuIEl0IGFsc28gbWVhbnMgdGhlcmUgaXMgYSBoYXJkIHVwcGVyCisvLyAgIGxpbWl0IG9mIDI1NSBmb3IgYm90aCBDRU5TVVNfTUFYX1RBR19LVl9MRU4gYW5kIENFTlNVU19NQVhfUFJPUEFHQVRFRF9UQUdTLgorLy8gKiBLZWVwIGFsbCB0YWcgaW5mb3JtYXRpb24gKGtleXMvdmFsdWVzL2ZsYWdzKSBpbiBhIHNpbmdsZSBtZW1vcnkgYnVmZmVyLAorLy8gICB0aGF0IGNhbiBiZSBkaXJlY3RseSBjb3BpZWQgdG8gdGhlIHdpcmUuCisKKy8vIG1pbiBhbmQgbWF4IHZhbGlkIGNoYXJzIGluIHRhZyBrZXlzIGFuZCB2YWx1ZXMuIEFsbCBwcmludGFibGUgQVNDSUkgaXMgT0suCisjZGVmaW5lIE1JTl9WQUxJRF9UQUdfQ0hBUiAzMiAgIC8vICcgJworI2RlZmluZSBNQVhfVkFMSURfVEFHX0NIQVIgMTI2ICAvLyAnficKKworLy8gU3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNldCBvZiB0YWdzLiBFc3NlbnRpYWxseSBhIGNvdW50IG9mIG51bWJlciBvZiB0YWdzCisvLyBwcmVzZW50LCBhbmQgcG9pbnRlciB0byBhIGNodW5rIG9mIG1lbW9yeSB0aGF0IGNvbnRhaW5zIHRoZSBwZXItdGFnIGRldGFpbHMuCitzdHJ1Y3QgdGFnX3NldCB7CisgIGludCBudGFnczsgICAgICAgIC8vIG51bWJlciBvZiB0YWdzLgorICBpbnQgbnRhZ3NfYWxsb2M7ICAvLyBudGFncyArIG51bWJlciBvZiBkZWxldGVkIHRhZ3MgKHRvdGFsIG51bWJlciBvZiB0YWdzCisgIC8vIGluIGFsbCBvZiBrdm0pLiBUaGlzIHdpbGwgYWx3YXlzIGJlID09IG50YWdzLCBleGNlcHQgZHVyaW5nIHRoZSBwcm9jZXNzCisgIC8vIG9mIGJ1aWxkaW5nIGEgbmV3IHRhZyBzZXQuCisgIHNpemVfdCBrdm1fc2l6ZTsgIC8vIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIGtleS92YWx1ZSBzdG9yYWdlLgorICBzaXplX3Qga3ZtX3VzZWQ7ICAvLyBudW1iZXIgb2YgYnl0ZXMgb2YgdXNlZCBrZXkvdmFsdWUgbWVtb3J5CisgIGNoYXIgKmt2bTsgICAgICAgIC8vIGtleS92YWx1ZSBtZW1vcnkuIENvbnNpc3RzIG9mIHJlcGVhdGVkIGVudHJpZXMgb2Y6CisgIC8vICAgT2Zmc2V0ICBTaXplICBEZXNjcmlwdGlvbgorICAvLyAgICAgMCAgICAgIDEgICAgS2V5IGxlbmd0aCwgaW5jbHVkaW5nIHRyYWlsaW5nIDAuIChLKQorICAvLyAgICAgMSAgICAgIDEgICAgVmFsdWUgbGVuZ3RoLCBpbmNsdWRpbmcgdHJhaWxpbmcgMCAoVikKKyAgLy8gICAgIDIgICAgICAxICAgIEZsYWdzCisgIC8vICAgICAzICAgICAgSyAgICBLZXkgYnl0ZXMKKyAgLy8gICAgIDMgKyBLICBWICAgIFZhbHVlIGJ5dGVzCisgIC8vCisgIC8vIFdlIHJlZmVyIHRvIHRoZSBmaXJzdCAzIGVudHJpZXMgYXMgdGhlICd0YWcgaGVhZGVyJy4gSWYgZXh0cmEgdmFsdWVzIGFyZQorICAvLyBpbnRyb2R1Y2VkIGluIHRoZSBoZWFkZXIsIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoZSBUQUdfSEVBREVSX1NJWkUKKyAgLy8gY29uc3RhbnQsIHRoZSByYXdfdGFnIHN0cnVjdHVyZSAoYW5kIGV2ZXJ5dGhpbmcgdGhhdCB1c2VzIGl0KSBhbmQgdGhlCisgIC8vIGVuY29kZS9kZWNvZGUgZnVuY3Rpb25zIGFwcHJvcHJpYXRlbHkuCit9OworCisvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGFnIGhlYWRlci4KKyNkZWZpbmUgVEFHX0hFQURFUl9TSVpFIDMgIC8vIGtleSBsZW5ndGggKDEpICsgdmFsdWUgbGVuZ3RoICgxKSArIGZsYWdzICgxKQorLy8gT2Zmc2V0cyB0byB0YWcgaGVhZGVyIGVudHJpZXMuCisjZGVmaW5lIEtFWV9MRU5fT0ZGU0VUIDAKKyNkZWZpbmUgVkFMVUVfTEVOX09GRlNFVCAxCisjZGVmaW5lIEZMQUdfT0ZGU0VUIDIKKworLy8gcmF3X3RhZyByZXByZXNlbnRzIHRoZSByYXctc3RvcmFnZSBmb3JtIG9mIGEgdGFnIGluIHRoZSBrdm0gb2YgYSB0YWdfc2V0Lgorc3RydWN0IHJhd190YWcgeworICB1aW50OF90IGtleV9sZW47CisgIHVpbnQ4X3QgdmFsdWVfbGVuOworICB1aW50OF90IGZsYWdzOworICBjaGFyICprZXk7CisgIGNoYXIgKnZhbHVlOworfTsKKworLy8gVXNlIGEgcmVzZXJ2ZWQgZmxhZyBiaXQgZm9yIGluZGljYXRpb24gb2YgZGVsZXRlZCB0YWcuCisjZGVmaW5lIENFTlNVU19UQUdfREVMRVRFRCBDRU5TVVNfVEFHX1JFU0VSVkVECisjZGVmaW5lIENFTlNVU19UQUdfSVNfREVMRVRFRChmbGFncykgKGZsYWdzICYgQ0VOU1VTX1RBR19ERUxFVEVEKQorCisvLyBQcmltYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGEgY29udGV4dC4gQ29tcG9zZWQgb2YgMiB1bmRlcmx5aW5nIHRhZ19zZXQKKy8vIHN0cnVjdHMsIG9uZSBlYWNoIGZvciBwcm9wYWdhdGVkIGFuZCBsb2NhbCAobm9uLXByb3BhZ2F0ZWQpIHRhZ3MuIFRoaXMgaXMKKy8vIHRvIGVmZmljaWVudGx5IHN1cHBvcnQgdGFnIGVuY29kaW5nL2RlY29kaW5nLgorLy8gVE9ETyhhdmVpdGNoKTogbmVlZCB0byBhZGQgdHJhY2luZyBpZCdzL3N0cnVjdHVyZS4KK3N0cnVjdCBjZW5zdXNfY29udGV4dCB7CisgIHN0cnVjdCB0YWdfc2V0IHRhZ3NbMl07CisgIGNlbnN1c19jb250ZXh0X3N0YXR1cyBzdGF0dXM7Cit9OworCisvLyBJbmRpY2VzIGludG8gdGhlIHRhZ3MgbWVtYmVyIG9mIGNlbnN1c19jb250ZXh0CisjZGVmaW5lIFBST1BBR0FURURfVEFHUyAwCisjZGVmaW5lIExPQ0FMX1RBR1MgMQorCisvLyBWYWxpZGF0ZSAoY2hlY2sgYWxsIGNoYXJhY3RlcnMgYXJlIGluIHJhbmdlIGFuZCBzaXplIGlzIGxlc3MgdGhhbiBsaW1pdCkgYQorLy8ga2V5IG9yIHZhbHVlIHN0cmluZy4gUmV0dXJucyAwIGlmIHRoZSBzdHJpbmcgaXMgaW52YWxpZCwgb3IgdGhlIGxlbmd0aAorLy8gKGluY2x1ZGluZyB0ZXJtaW5hdG9yKSBpZiB2YWxpZC4KK3N0YXRpYyBzaXplX3QgdmFsaWRhdGVfdGFnKGNvbnN0IGNoYXIgKmt2KSB7CisgIHNpemVfdCBsZW4gPSAxOworICBjaGFyIGNoOworICB3aGlsZSAoKGNoID0gKmt2KyspICE9IDApIHsKKyAgICBpZiAoY2ggPCBNSU5fVkFMSURfVEFHX0NIQVIgfHwgY2ggPiBNQVhfVkFMSURfVEFHX0NIQVIpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4rKzsKKyAgfQorICBpZiAobGVuID4gQ0VOU1VTX01BWF9UQUdfS1ZfTEVOKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworLy8gRXh0cmFjdCBhIHJhdyB0YWcgZ2l2ZW4gYSBwb2ludGVyIChyYXcpIHRvIHRoZSB0YWcgaGVhZGVyLiBBbGxvdyBmb3Igc29tZQorLy8gZXh0cmEgYnl0ZXMgaW4gdGhlIHRhZyBoZWFkZXIgKHNlZSBlbmNvZGUvZGVjb2RlIGZ1bmN0aW9ucyBmb3IgdXNhZ2U6IHRoaXMKKy8vIGFsbG93cyBmb3IgZnV0dXJlIGV4cGFuc2lvbiBvZiB0aGUgdGFnIGhlYWRlcikuCitzdGF0aWMgY2hhciAqZGVjb2RlX3RhZyhzdHJ1Y3QgcmF3X3RhZyAqdGFnLCBjaGFyICpoZWFkZXIsIGludCBvZmZzZXQpIHsKKyAgdGFnLT5rZXlfbGVuID0gKHVpbnQ4X3QpKCpoZWFkZXIrKyk7CisgIHRhZy0+dmFsdWVfbGVuID0gKHVpbnQ4X3QpKCpoZWFkZXIrKyk7CisgIHRhZy0+ZmxhZ3MgPSAodWludDhfdCkoKmhlYWRlcisrKTsKKyAgaGVhZGVyICs9IG9mZnNldDsKKyAgdGFnLT5rZXkgPSBoZWFkZXI7CisgIGhlYWRlciArPSB0YWctPmtleV9sZW47CisgIHRhZy0+dmFsdWUgPSBoZWFkZXI7CisgIHJldHVybiBoZWFkZXIgKyB0YWctPnZhbHVlX2xlbjsKK30KKworLy8gTWFrZSBhIGNvcHkgKGluICd0bycpIG9mIGFuIGV4aXN0aW5nIHRhZ19zZXQuCitzdGF0aWMgdm9pZCB0YWdfc2V0X2NvcHkoc3RydWN0IHRhZ19zZXQgKnRvLCBjb25zdCBzdHJ1Y3QgdGFnX3NldCAqZnJvbSkgeworICBtZW1jcHkodG8sIGZyb20sIHNpemVvZihzdHJ1Y3QgdGFnX3NldCkpOworICB0by0+a3ZtID0gZ3ByX21hbGxvYyh0by0+a3ZtX3NpemUpOworICBtZW1jcHkodG8tPmt2bSwgZnJvbS0+a3ZtLCBmcm9tLT5rdm1fdXNlZCk7Cit9CisKKy8vIERlbGV0ZSBhIHRhZyBmcm9tIGEgdGFnX3NldCwgaWYgaXQgZXhpc3RzIChyZXR1cm5zIHRydWUgaWYgaXQgZGlkKS4KK3N0YXRpYyBib29sIHRhZ19zZXRfZGVsZXRlX3RhZyhzdHJ1Y3QgdGFnX3NldCAqdGFncywgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuKSB7CisgIGNoYXIgKmt2cCA9IHRhZ3MtPmt2bTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLT5udGFnc19hbGxvYzsgaSsrKSB7CisgICAgdWludDhfdCAqZmxhZ3MgPSAodWludDhfdCAqKShrdnAgKyBGTEFHX09GRlNFVCk7CisgICAgc3RydWN0IHJhd190YWcgdGFnOworICAgIGt2cCA9IGRlY29kZV90YWcoJnRhZywga3ZwLCAwKTsKKyAgICBpZiAoQ0VOU1VTX1RBR19JU19ERUxFVEVEKHRhZy5mbGFncykpIGNvbnRpbnVlOworICAgIGlmICgoa2V5X2xlbiA9PSB0YWcua2V5X2xlbikgJiYgKG1lbWNtcChrZXksIHRhZy5rZXksIGtleV9sZW4pID09IDApKSB7CisgICAgICAqZmxhZ3MgfD0gQ0VOU1VTX1RBR19ERUxFVEVEOworICAgICAgdGFncy0+bnRhZ3MtLTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIERlbGV0ZSBhIHRhZyBmcm9tIGEgY29udGV4dCwgcmV0dXJuIHRydWUgaWYgaXQgZXhpc3RlZC4KK3N0YXRpYyBib29sIGNvbnRleHRfZGVsZXRlX3RhZyhjZW5zdXNfY29udGV4dCAqY29udGV4dCwgY29uc3QgY2Vuc3VzX3RhZyAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuKSB7CisgIHJldHVybiAoCisgICAgICB0YWdfc2V0X2RlbGV0ZV90YWcoJmNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10sIHRhZy0+a2V5LCBrZXlfbGVuKSB8fAorICAgICAgdGFnX3NldF9kZWxldGVfdGFnKCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sIHRhZy0+a2V5LCBrZXlfbGVuKSk7Cit9CisKKy8vIEFkZCBhIHRhZyB0byBhIHRhZ19zZXQuIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSB0YWcgY291bGQKKy8vIG5vdCBiZSBhZGRlZCBiZWNhdXNlIG9mIGNvbnN0cmFpbnRzIG9uIHRhZyBzZXQgc2l6ZS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKy8vIG5vdCBiZSBjYWxsZWQgaWYgdGhlIHRhZyBtYXkgYWxyZWFkeSBleGlzdCAoaW4gYSBub24tZGVsZXRlZCBzdGF0ZSkgaW4KKy8vIHRoZSB0YWdfc2V0LCBhcyB0aGF0IHdvdWxkIHJlc3VsdCBpbiB0d28gdGFncyB3aXRoIHRoZSBzYW1lIGtleS4KK3N0YXRpYyBib29sIHRhZ19zZXRfYWRkX3RhZyhzdHJ1Y3QgdGFnX3NldCAqdGFncywgY29uc3QgY2Vuc3VzX3RhZyAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuLCBzaXplX3QgdmFsdWVfbGVuKSB7CisgIGlmICh0YWdzLT5udGFncyA9PSBDRU5TVVNfTUFYX1BST1BBR0FURURfVEFHUykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBzaXplX3QgdGFnX3NpemUgPSBrZXlfbGVuICsgdmFsdWVfbGVuICsgVEFHX0hFQURFUl9TSVpFOworICBpZiAodGFncy0+a3ZtX3VzZWQgKyB0YWdfc2l6ZSA+IHRhZ3MtPmt2bV9zaXplKSB7CisgICAgLy8gYWxsb2NhdGUgbmV3IG1lbW9yeSBpZiBuZWVkZWQKKyAgICB0YWdzLT5rdm1fc2l6ZSArPSAyICogQ0VOU1VTX01BWF9UQUdfS1ZfTEVOICsgVEFHX0hFQURFUl9TSVpFOworICAgIGNoYXIgKm5ld19rdm0gPSBncHJfbWFsbG9jKHRhZ3MtPmt2bV9zaXplKTsKKyAgICBtZW1jcHkobmV3X2t2bSwgdGFncy0+a3ZtLCB0YWdzLT5rdm1fdXNlZCk7CisgICAgZ3ByX2ZyZWUodGFncy0+a3ZtKTsKKyAgICB0YWdzLT5rdm0gPSBuZXdfa3ZtOworICB9CisgIGNoYXIgKmt2cCA9IHRhZ3MtPmt2bSArIHRhZ3MtPmt2bV91c2VkOworICAqa3ZwKysgPSAoY2hhcilrZXlfbGVuOworICAqa3ZwKysgPSAoY2hhcil2YWx1ZV9sZW47CisgIC8vIGVuc3VyZSByZXNlcnZlZCBmbGFncyBhcmUgbm90IHVzZWQuCisgICprdnArKyA9IChjaGFyKSh0YWctPmZsYWdzICYgKENFTlNVU19UQUdfUFJPUEFHQVRFIHwgQ0VOU1VTX1RBR19TVEFUUykpOworICBtZW1jcHkoa3ZwLCB0YWctPmtleSwga2V5X2xlbik7CisgIGt2cCArPSBrZXlfbGVuOworICBtZW1jcHkoa3ZwLCB0YWctPnZhbHVlLCB2YWx1ZV9sZW4pOworICB0YWdzLT5rdm1fdXNlZCArPSB0YWdfc2l6ZTsKKyAgdGFncy0+bnRhZ3MrKzsKKyAgdGFncy0+bnRhZ3NfYWxsb2MrKzsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEFkZC9tb2RpZnkvZGVsZXRlIGEgdGFnIHRvL2luIGEgY29udGV4dC4gQ2FsbGVyIG11c3QgdmFsaWRhdGUgdGhhdCB0YWcga2V5CisvLyBldGMuIGFyZSB2YWxpZC4KK3N0YXRpYyB2b2lkIGNvbnRleHRfbW9kaWZ5X3RhZyhjZW5zdXNfY29udGV4dCAqY29udGV4dCwgY29uc3QgY2Vuc3VzX3RhZyAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuLCBzaXplX3QgdmFsdWVfbGVuKSB7CisgIC8vIEZpcnN0IGRlbGV0ZSB0aGUgdGFnIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudC4KKyAgYm9vbCBkZWxldGVkID0gY29udGV4dF9kZWxldGVfdGFnKGNvbnRleHQsIHRhZywga2V5X2xlbik7CisgIGJvb2wgYWRkZWQgPSBmYWxzZTsKKyAgaWYgKENFTlNVU19UQUdfSVNfUFJPUEFHQVRFRCh0YWctPmZsYWdzKSkgeworICAgIGFkZGVkID0gdGFnX3NldF9hZGRfdGFnKCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sIHRhZywga2V5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9sZW4pOworICB9IGVsc2UgeworICAgIGFkZGVkID0KKyAgICAgICAgdGFnX3NldF9hZGRfdGFnKCZjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLCB0YWcsIGtleV9sZW4sIHZhbHVlX2xlbik7CisgIH0KKworICBpZiAoZGVsZXRlZCkgeworICAgIGNvbnRleHQtPnN0YXR1cy5uX21vZGlmaWVkX3RhZ3MrKzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgIGNvbnRleHQtPnN0YXR1cy5uX2FkZGVkX3RhZ3MrKzsKKyAgICB9IGVsc2UgeworICAgICAgY29udGV4dC0+c3RhdHVzLm5faWdub3JlZF90YWdzKys7CisgICAgfQorICB9Cit9CisKKy8vIFJlbW92ZSBtZW1vcnkgdXNlZCBmb3IgZGVsZXRlZCB0YWdzIGZyb20gYSB0YWcgc2V0LiBCYXNpYyBhbGdvcml0aG06CisvLyAxKSBXYWxrIHRocm91Z2ggdGFnIHNldCB0byBmaW5kIGZpcnN0IGRlbGV0ZWQgdGFnLiBSZWNvcmQgd2hlcmUgaXQgaXMuCisvLyAyKSBGaW5kIHRoZSBuZXh0IG5vdC1kZWxldGVkIHRhZy4gQ29weSBhbGwgb2Yga3ZtIGZyb20gdGhlcmUgdG8gdGhlIGVuZAorLy8gICAgIm92ZXIiIHRoZSBkZWxldGVkIHRhZ3MKKy8vIDMpIHJlcGVhdCAjMSBhbmQgIzIgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0YWdzCisvLyA0KSBpZiB3ZSBhcmUgc3RpbGwgbG9va2luZyBmb3IgYSBub3QtZGVsZXRlZCB0YWcsIHRoZW4gYWxsIHRoZSBlbmQgcG9ydGlvbgorLy8gICAgb2YgdGhlIGt2bSBpcyBkZWxldGVkLiBKdXN0IHJlZHVjZSB0aGUgdXNlZCBhbW91bnQgb2YgbWVtb3J5IGJ5IHRoZQorLy8gICAgYXBwcm9wcmlhdGUgYW1vdW50Lgorc3RhdGljIHZvaWQgdGFnX3NldF9mbGF0dGVuKHN0cnVjdCB0YWdfc2V0ICp0YWdzKSB7CisgIGlmICh0YWdzLT5udGFncyA9PSB0YWdzLT5udGFnc19hbGxvYykgcmV0dXJuOworICBib29sIGZvdW5kX2RlbGV0ZWQgPSBmYWxzZTsgIC8vIGZvdW5kIGEgZGVsZXRlZCB0YWcuCisgIGNoYXIgKmt2cCA9IHRhZ3MtPmt2bTsKKyAgY2hhciAqZGJhc2UgPSBOVUxMOyAgLy8gcmVjb3JkIGxvY2F0aW9uIG9mIGRlbGV0ZWQgdGFnCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFncy0+bnRhZ3NfYWxsb2M7IGkrKykgeworICAgIHN0cnVjdCByYXdfdGFnIHRhZzsKKyAgICBjaGFyICpuZXh0X2t2cCA9IGRlY29kZV90YWcoJnRhZywga3ZwLCAwKTsKKyAgICBpZiAoZm91bmRfZGVsZXRlZCkgeworICAgICAgaWYgKCFDRU5TVVNfVEFHX0lTX0RFTEVURUQodGFnLmZsYWdzKSkgeworICAgICAgICBwdHJkaWZmX3QgcmVkdWNlID0ga3ZwIC0gZGJhc2U7ICAvLyAjYnl0ZXMgaW4gZGVsZXRlZCB0YWdzCisgICAgICAgIEdQUl9BU1NFUlQocmVkdWNlID4gMCk7CisgICAgICAgIHB0cmRpZmZfdCBjb3B5X3NpemUgPSB0YWdzLT5rdm0gKyB0YWdzLT5rdm1fdXNlZCAtIGt2cDsKKyAgICAgICAgR1BSX0FTU0VSVChjb3B5X3NpemUgPiAwKTsKKyAgICAgICAgbWVtbW92ZShkYmFzZSwga3ZwLCAoc2l6ZV90KWNvcHlfc2l6ZSk7CisgICAgICAgIHRhZ3MtPmt2bV91c2VkIC09IChzaXplX3QpcmVkdWNlOworICAgICAgICBuZXh0X2t2cCAtPSByZWR1Y2U7CisgICAgICAgIGZvdW5kX2RlbGV0ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKENFTlNVU19UQUdfSVNfREVMRVRFRCh0YWcuZmxhZ3MpKSB7CisgICAgICAgIGRiYXNlID0ga3ZwOworICAgICAgICBmb3VuZF9kZWxldGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAga3ZwID0gbmV4dF9rdnA7CisgIH0KKyAgaWYgKGZvdW5kX2RlbGV0ZWQpIHsKKyAgICBHUFJfQVNTRVJUKGRiYXNlID4gdGFncy0+a3ZtKTsKKyAgICB0YWdzLT5rdm1fdXNlZCA9IChzaXplX3QpKGRiYXNlIC0gdGFncy0+a3ZtKTsKKyAgfQorICB0YWdzLT5udGFnc19hbGxvYyA9IHRhZ3MtPm50YWdzOworfQorCitjZW5zdXNfY29udGV4dCAqY2Vuc3VzX2NvbnRleHRfY3JlYXRlKGNvbnN0IGNlbnN1c19jb250ZXh0ICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW5zdXNfdGFnICp0YWdzLCBpbnQgbnRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnN1c19jb250ZXh0X3N0YXR1cyBjb25zdCAqKnN0YXR1cykgeworICBjZW5zdXNfY29udGV4dCAqY29udGV4dCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c19jb250ZXh0KSk7CisgIC8vIElmIHdlIGFyZSBnaXZlbiBhIGJhc2UsIGNvcHkgaXQgaW50byBvdXIgbmV3IHRhZyBzZXQuIE90aGVyd2lzZSBzZXQgaXQKKyAgLy8gdG8gemVyby9OVUxMIGV2ZXJ5dGhpbmcuCisgIGlmIChiYXNlID09IE5VTEwpIHsKKyAgICBtZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKGNlbnN1c19jb250ZXh0KSk7CisgIH0gZWxzZSB7CisgICAgdGFnX3NldF9jb3B5KCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sICZiYXNlLT50YWdzW1BST1BBR0FURURfVEFHU10pOworICAgIHRhZ19zZXRfY29weSgmY29udGV4dC0+dGFnc1tMT0NBTF9UQUdTXSwgJmJhc2UtPnRhZ3NbTE9DQUxfVEFHU10pOworICAgIG1lbXNldCgmY29udGV4dC0+c3RhdHVzLCAwLCBzaXplb2YoY29udGV4dC0+c3RhdHVzKSk7CisgIH0KKyAgLy8gV2FsayBvdmVyIHRoZSBhZGRpdGlvbmFsIHRhZ3MgYW5kLCBmb3IgdGhvc2UgdGhhdCBhcmVuJ3QgaW52YWxpZCwgbW9kaWZ5CisgIC8vIHRoZSBjb250ZXh0IHRvIGFkZC9yZXBsYWNlL2RlbGV0ZSBhcyByZXF1aXJlZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudGFnczsgaSsrKSB7CisgICAgY29uc3QgY2Vuc3VzX3RhZyAqdGFnID0gJnRhZ3NbaV07CisgICAgc2l6ZV90IGtleV9sZW4gPSB2YWxpZGF0ZV90YWcodGFnLT5rZXkpOworICAgIC8vIGlnbm9yZSB0aGUgdGFnIGlmIGl0IGlzIGludmFsaWQgb3IgdG9vIHNob3J0LgorICAgIGlmIChrZXlfbGVuIDw9IDEpIHsKKyAgICAgIGNvbnRleHQtPnN0YXR1cy5uX2ludmFsaWRfdGFncysrOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodGFnLT52YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIHNpemVfdCB2YWx1ZV9sZW4gPSB2YWxpZGF0ZV90YWcodGFnLT52YWx1ZSk7CisgICAgICAgIGlmICh2YWx1ZV9sZW4gIT0gMCkgeworICAgICAgICAgIGNvbnRleHRfbW9kaWZ5X3RhZyhjb250ZXh0LCB0YWcsIGtleV9sZW4sIHZhbHVlX2xlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udGV4dC0+c3RhdHVzLm5faW52YWxpZF90YWdzKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb250ZXh0X2RlbGV0ZV90YWcoY29udGV4dCwgdGFnLCBrZXlfbGVuKSkgeworICAgICAgICAgIGNvbnRleHQtPnN0YXR1cy5uX2RlbGV0ZWRfdGFncysrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8vIFJlbW92ZSBhbnkgZGVsZXRlZCB0YWdzLCB1cGRhdGUgc3RhdHVzIGlmIG5lZWRlZCwgYW5kIHJldHVybi4KKyAgdGFnX3NldF9mbGF0dGVuKCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10pOworICB0YWdfc2V0X2ZsYXR0ZW4oJmNvbnRleHQtPnRhZ3NbTE9DQUxfVEFHU10pOworICBjb250ZXh0LT5zdGF0dXMubl9wcm9wYWdhdGVkX3RhZ3MgPSBjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10ubnRhZ3M7CisgIGNvbnRleHQtPnN0YXR1cy5uX2xvY2FsX3RhZ3MgPSBjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLm50YWdzOworICBpZiAoc3RhdHVzKSB7CisgICAgKnN0YXR1cyA9ICZjb250ZXh0LT5zdGF0dXM7CisgIH0KKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK2NvbnN0IGNlbnN1c19jb250ZXh0X3N0YXR1cyAqY2Vuc3VzX2NvbnRleHRfZ2V0X3N0YXR1cygKKyAgICBjb25zdCBjZW5zdXNfY29udGV4dCAqY29udGV4dCkgeworICByZXR1cm4gJmNvbnRleHQtPnN0YXR1czsKK30KKwordm9pZCBjZW5zdXNfY29udGV4dF9kZXN0cm95KGNlbnN1c19jb250ZXh0ICpjb250ZXh0KSB7CisgIGdwcl9mcmVlKGNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXS5rdm0pOworICBncHJfZnJlZShjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLmt2bSk7CisgIGdwcl9mcmVlKGNvbnRleHQpOworfQorCit2b2lkIGNlbnN1c19jb250ZXh0X2luaXRpYWxpemVfaXRlcmF0b3IoY29uc3QgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Vuc3VzX2NvbnRleHRfaXRlcmF0b3IgKml0ZXJhdG9yKSB7CisgIGl0ZXJhdG9yLT5jb250ZXh0ID0gY29udGV4dDsKKyAgaXRlcmF0b3ItPmluZGV4ID0gMDsKKyAgaWYgKGNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXS5udGFncyAhPSAwKSB7CisgICAgaXRlcmF0b3ItPmJhc2UgPSBQUk9QQUdBVEVEX1RBR1M7CisgICAgaXRlcmF0b3ItPmt2bSA9IGNvbnRleHQtPnRhZ3NbUFJPUEFHQVRFRF9UQUdTXS5rdm07CisgIH0gZWxzZSBpZiAoY29udGV4dC0+dGFnc1tMT0NBTF9UQUdTXS5udGFncyAhPSAwKSB7CisgICAgaXRlcmF0b3ItPmJhc2UgPSBMT0NBTF9UQUdTOworICAgIGl0ZXJhdG9yLT5rdm0gPSBjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLmt2bTsKKyAgfSBlbHNlIHsKKyAgICBpdGVyYXRvci0+YmFzZSA9IC0xOworICB9Cit9CisKK2ludCBjZW5zdXNfY29udGV4dF9uZXh0X3RhZyhjZW5zdXNfY29udGV4dF9pdGVyYXRvciAqaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Vuc3VzX3RhZyAqdGFnKSB7CisgIGlmIChpdGVyYXRvci0+YmFzZSA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzdHJ1Y3QgcmF3X3RhZyByYXc7CisgIGl0ZXJhdG9yLT5rdm0gPSBkZWNvZGVfdGFnKCZyYXcsIGl0ZXJhdG9yLT5rdm0sIDApOworICB0YWctPmtleSA9IHJhdy5rZXk7CisgIHRhZy0+dmFsdWUgPSByYXcudmFsdWU7CisgIHRhZy0+ZmxhZ3MgPSByYXcuZmxhZ3M7CisgIGlmICgrK2l0ZXJhdG9yLT5pbmRleCA9PSBpdGVyYXRvci0+Y29udGV4dC0+dGFnc1tpdGVyYXRvci0+YmFzZV0ubnRhZ3MpIHsKKyAgICBkbyB7CisgICAgICBpZiAoaXRlcmF0b3ItPmJhc2UgPT0gTE9DQUxfVEFHUykgeworICAgICAgICBpdGVyYXRvci0+YmFzZSA9IC0xOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChpdGVyYXRvci0+Y29udGV4dC0+dGFnc1srK2l0ZXJhdG9yLT5iYXNlXS5udGFncyA9PSAwKTsKKyAgICBpdGVyYXRvci0+aW5kZXggPSAwOworICAgIGl0ZXJhdG9yLT5rdm0gPSBpdGVyYXRvci0+Y29udGV4dC0+dGFnc1tpdGVyYXRvci0+YmFzZV0ua3ZtOworICB9CisgIHJldHVybiAxOworfQorCisvLyBGaW5kIGEgdGFnIGluIGEgdGFnX3NldCBieSBrZXkuIFJldHVybiB0cnVlIGlmIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuCitzdGF0aWMgYm9vbCB0YWdfc2V0X2dldF90YWcoY29uc3Qgc3RydWN0IHRhZ19zZXQgKnRhZ3MsIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5X2xlbiwgY2Vuc3VzX3RhZyAqdGFnKSB7CisgIGNoYXIgKmt2cCA9IHRhZ3MtPmt2bTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLT5udGFnczsgaSsrKSB7CisgICAgc3RydWN0IHJhd190YWcgcmF3OworICAgIGt2cCA9IGRlY29kZV90YWcoJnJhdywga3ZwLCAwKTsKKyAgICBpZiAoa2V5X2xlbiA9PSByYXcua2V5X2xlbiAmJiBtZW1jbXAocmF3LmtleSwga2V5LCBrZXlfbGVuKSA9PSAwKSB7CisgICAgICB0YWctPmtleSA9IHJhdy5rZXk7CisgICAgICB0YWctPnZhbHVlID0gcmF3LnZhbHVlOworICAgICAgdGFnLT5mbGFncyA9IHJhdy5mbGFnczsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBjZW5zdXNfY29udGV4dF9nZXRfdGFnKGNvbnN0IGNlbnN1c19jb250ZXh0ICpjb250ZXh0LCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW5zdXNfdGFnICp0YWcpIHsKKyAgc2l6ZV90IGtleV9sZW4gPSBzdHJsZW4oa2V5KSArIDE7CisgIGlmIChrZXlfbGVuID09IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAodGFnX3NldF9nZXRfdGFnKCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sIGtleSwga2V5X2xlbiwgdGFnKSB8fAorICAgICAgdGFnX3NldF9nZXRfdGFnKCZjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLCBrZXksIGtleV9sZW4sIHRhZykpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gQ29udGV4dCBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIFdpcmUgZm9ybWF0IGZvciB0YWdfc2V0J3Mgb24gdGhlIHdpcmU6CisvLworLy8gRmlyc3QsIGEgdGFnIHNldCBoZWFkZXI6CisvLworLy8gb2Zmc2V0ICAgYnl0ZXMgIGRlc2NyaXB0aW9uCisvLyAgIDAgICAgICAgIDEgICAgdmVyc2lvbiBudW1iZXIKKy8vICAgMSAgICAgICAgMSAgICBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBoZWFkZXIuIFRoaXMgYWxsb3dzIGZvciBmdXR1cmUKKy8vICAgICAgICAgICAgICAgICBleHBhbnNpb24uCisvLyAgIDIgICAgICAgIDEgICAgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggdGFnIGhlYWRlci4KKy8vICAgMyAgICAgICAgMSAgICBudGFncyB2YWx1ZSBmcm9tIHRhZyBzZXQuCisvLworLy8gICBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBrZXkvdmFsdWUgbWVtb3J5IGZyb20gc3RydWN0IHRhZ19zZXQuCisKKyNkZWZpbmUgRU5DT0RFRF9WRVJTSU9OIDAgICAgICAvLyBWZXJzaW9uIG51bWJlcgorI2RlZmluZSBFTkNPREVEX0hFQURFUl9TSVpFIDQgIC8vIHNpemUgb2YgdGFnIHNldCBoZWFkZXIKKworLy8gRW5jb2RlIGEgdGFnIHNldC4gUmV0dXJucyAwIGlmIGJ1ZmZlciBpcyB0b28gc21hbGwuCitzdGF0aWMgc2l6ZV90IHRhZ19zZXRfZW5jb2RlKGNvbnN0IHN0cnVjdCB0YWdfc2V0ICp0YWdzLCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZfc2l6ZSkgeworICBpZiAoYnVmX3NpemUgPCBFTkNPREVEX0hFQURFUl9TSVpFICsgdGFncy0+a3ZtX3VzZWQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBidWZfc2l6ZSAtPSBFTkNPREVEX0hFQURFUl9TSVpFOworICAqYnVmZmVyKysgPSAoY2hhcilFTkNPREVEX1ZFUlNJT047CisgICpidWZmZXIrKyA9IChjaGFyKUVOQ09ERURfSEVBREVSX1NJWkU7CisgICpidWZmZXIrKyA9IChjaGFyKVRBR19IRUFERVJfU0laRTsKKyAgKmJ1ZmZlcisrID0gKGNoYXIpdGFncy0+bnRhZ3M7CisgIGlmICh0YWdzLT5udGFncyA9PSAwKSB7CisgICAgcmV0dXJuIEVOQ09ERURfSEVBREVSX1NJWkU7CisgIH0KKyAgbWVtY3B5KGJ1ZmZlciwgdGFncy0+a3ZtLCB0YWdzLT5rdm1fdXNlZCk7CisgIHJldHVybiBFTkNPREVEX0hFQURFUl9TSVpFICsgdGFncy0+a3ZtX3VzZWQ7Cit9CisKK3NpemVfdCBjZW5zdXNfY29udGV4dF9lbmNvZGUoY29uc3QgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQsIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zl9zaXplKSB7CisgIHJldHVybiB0YWdfc2V0X2VuY29kZSgmY29udGV4dC0+dGFnc1tQUk9QQUdBVEVEX1RBR1NdLCBidWZmZXIsIGJ1Zl9zaXplKTsKK30KKworLy8gRGVjb2RlIGEgdGFnIHNldC4KK3N0YXRpYyB2b2lkIHRhZ19zZXRfZGVjb2RlKHN0cnVjdCB0YWdfc2V0ICp0YWdzLCBjb25zdCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICB1aW50OF90IHZlcnNpb24gPSAodWludDhfdCkoKmJ1ZmZlcisrKTsKKyAgdWludDhfdCBoZWFkZXJfc2l6ZSA9ICh1aW50OF90KSgqYnVmZmVyKyspOworICB1aW50OF90IHRhZ19oZWFkZXJfc2l6ZSA9ICh1aW50OF90KSgqYnVmZmVyKyspOworICB0YWdzLT5udGFncyA9IHRhZ3MtPm50YWdzX2FsbG9jID0gKGludCkoKmJ1ZmZlcisrKTsKKyAgaWYgKHRhZ3MtPm50YWdzID09IDApIHsKKyAgICB0YWdzLT5udGFnc19hbGxvYyA9IDA7CisgICAgdGFncy0+a3ZtX3NpemUgPSAwOworICAgIHRhZ3MtPmt2bV91c2VkID0gMDsKKyAgICB0YWdzLT5rdm0gPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorICBpZiAoaGVhZGVyX3NpemUgIT0gRU5DT0RFRF9IRUFERVJfU0laRSkgeworICAgIEdQUl9BU1NFUlQodmVyc2lvbiAhPSBFTkNPREVEX1ZFUlNJT04pOworICAgIEdQUl9BU1NFUlQoRU5DT0RFRF9IRUFERVJfU0laRSA8IGhlYWRlcl9zaXplKTsKKyAgICBidWZmZXIgKz0gKGhlYWRlcl9zaXplIC0gRU5DT0RFRF9IRUFERVJfU0laRSk7CisgIH0KKyAgdGFncy0+a3ZtX3VzZWQgPSBzaXplIC0gaGVhZGVyX3NpemU7CisgIHRhZ3MtPmt2bV9zaXplID0gdGFncy0+a3ZtX3VzZWQgKyBDRU5TVVNfTUFYX1RBR19LVl9MRU47CisgIHRhZ3MtPmt2bSA9IGdwcl9tYWxsb2ModGFncy0+a3ZtX3NpemUpOworICBpZiAodGFnX2hlYWRlcl9zaXplICE9IFRBR19IRUFERVJfU0laRSkgeworICAgIC8vIHNvbWV0aGluZyBuZXcgaW4gdGhlIHRhZyBpbmZvcm1hdGlvbi4gSSBkb24ndCB1bmRlcnN0YW5kIGl0LCBzbworICAgIC8vIGRvbid0IGNvcHkgaXQgb3Zlci4KKyAgICBHUFJfQVNTRVJUKHZlcnNpb24gIT0gRU5DT0RFRF9WRVJTSU9OKTsKKyAgICBHUFJfQVNTRVJUKHRhZ19oZWFkZXJfc2l6ZSA+IFRBR19IRUFERVJfU0laRSk7CisgICAgY2hhciAqa3ZwID0gdGFncy0+a3ZtOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFncy0+bnRhZ3M7IGkrKykgeworICAgICAgbWVtY3B5KGt2cCwgYnVmZmVyLCBUQUdfSEVBREVSX1NJWkUpOworICAgICAga3ZwICs9IGhlYWRlcl9zaXplOworICAgICAgc3RydWN0IHJhd190YWcgcmF3OworICAgICAgYnVmZmVyID0KKyAgICAgICAgICBkZWNvZGVfdGFnKCZyYXcsIChjaGFyICopYnVmZmVyLCB0YWdfaGVhZGVyX3NpemUgLSBUQUdfSEVBREVSX1NJWkUpOworICAgICAgbWVtY3B5KGt2cCwgcmF3LmtleSwgKHNpemVfdClyYXcua2V5X2xlbiArIHJhdy52YWx1ZV9sZW4pOworICAgICAga3ZwICs9IHJhdy5rZXlfbGVuICsgcmF3LnZhbHVlX2xlbjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVtY3B5KHRhZ3MtPmt2bSwgYnVmZmVyLCB0YWdzLT5rdm1fdXNlZCk7CisgIH0KK30KKworY2Vuc3VzX2NvbnRleHQgKmNlbnN1c19jb250ZXh0X2RlY29kZShjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgIGNlbnN1c19jb250ZXh0ICpjb250ZXh0ID0gZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX2NvbnRleHQpKTsKKyAgbWVtc2V0KCZjb250ZXh0LT50YWdzW0xPQ0FMX1RBR1NdLCAwLCBzaXplb2Yoc3RydWN0IHRhZ19zZXQpKTsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgbWVtc2V0KCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sIDAsIHNpemVvZihzdHJ1Y3QgdGFnX3NldCkpOworICB9IGVsc2UgeworICAgIHRhZ19zZXRfZGVjb2RlKCZjb250ZXh0LT50YWdzW1BST1BBR0FURURfVEFHU10sIGJ1ZmZlciwgc2l6ZSk7CisgIH0KKyAgbWVtc2V0KCZjb250ZXh0LT5zdGF0dXMsIDAsIHNpemVvZihjb250ZXh0LT5zdGF0dXMpKTsKKyAgY29udGV4dC0+c3RhdHVzLm5fcHJvcGFnYXRlZF90YWdzID0gY29udGV4dC0+dGFnc1tQUk9QQUdBVEVEX1RBR1NdLm50YWdzOworICByZXR1cm4gY29udGV4dDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19jb250ZXh0LmMgYi9zcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1N2MxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfY29udGV4dC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL2NlbnN1cy5oPgorI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIKKwordm9pZCBncnBjX2NlbnN1c19jYWxsX3NldF9jb250ZXh0KGdycGNfY2FsbCAqY2FsbCwgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2Vuc3VzX2NhbGxfc2V0X2NvbnRleHQoY2FsbD0lcCwgY2Vuc3VzX2NvbnRleHQ9JXApIiwgMiwKKyAgICAgICAgICAgICAgICAgKGNhbGwsIGNvbnRleHQpKTsKKyAgaWYgKGNlbnN1c19lbmFibGVkKCkgPT0gQ0VOU1VTX0ZFQVRVUkVfTk9ORSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoY29udGV4dCAhPSBOVUxMKSB7CisgICAgZ3JwY19jYWxsX2NvbnRleHRfc2V0KGNhbGwsIEdSUENfQ09OVEVYVF9UUkFDSU5HLCBjb250ZXh0LCBOVUxMKTsKKyAgfQorfQorCitjZW5zdXNfY29udGV4dCAqZ3JwY19jZW5zdXNfY2FsbF9nZXRfY29udGV4dChncnBjX2NhbGwgKmNhbGwpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2Vuc3VzX2NhbGxfZ2V0X2NvbnRleHQoY2FsbD0lcCkiLCAxLCAoY2FsbCkpOworICByZXR1cm4gKGNlbnN1c19jb250ZXh0ICopZ3JwY19jYWxsX2NvbnRleHRfZ2V0KGNhbGwsIEdSUENfQ09OVEVYVF9UUkFDSU5HKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYyBiL3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdkNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5jCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvY2Vuc3VzLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgorCit0eXBlZGVmIHN0cnVjdCBjYWxsX2RhdGEgeworICBjZW5zdXNfb3BfaWQgb3BfaWQ7CisgIGNlbnN1c19jb250ZXh0ICpjdHh0OworICBncHJfdGltZXNwZWMgc3RhcnRfdHM7CisgIGludCBlcnJvcjsKKworICAvKiByZWN2IGNhbGxiYWNrICovCisgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKKyAgZ3JwY19jbG9zdXJlICpvbl9kb25lX3JlY3Y7CisgIGdycGNfY2xvc3VyZSBmaW5pc2hfcmVjdjsKK30gY2FsbF9kYXRhOworCit0eXBlZGVmIHN0cnVjdCBjaGFubmVsX2RhdGEgeyB1aW50OF90IHVudXNlZDsgfSBjaGFubmVsX2RhdGE7CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RfYW5kX2Fubm90YXRlX21ldGhvZF90YWcoZ3JwY19tZXRhZGF0YV9iYXRjaCAqbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfZGF0YSAqY2FsbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfZGF0YSAqY2hhbmQpIHsKKyAgZ3JwY19saW5rZWRfbWRlbGVtICptOworICBmb3IgKG0gPSBtZC0+bGlzdC5oZWFkOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KSB7CisgICAgaWYgKG0tPm1kLT5rZXkgPT0gR1JQQ19NRFNUUl9QQVRIKSB7CisgICAgICBncHJfbG9nKEdQUl9ERUJVRywgIiVzIiwKKyAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKG0tPm1kLT52YWx1ZS0+c2xpY2UpKTsKKyAgICAgIC8qIEFkZCBtZXRob2QgdGFnIGhlcmUgKi8KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgY2xpZW50X211dGF0ZV9vcChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBpZiAob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSkgeworICAgIGV4dHJhY3RfYW5kX2Fubm90YXRlX21ldGhvZF90YWcob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwgY2FsbGQsIGNoYW5kKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjbGllbnRfc3RhcnRfdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBjbGllbnRfbXV0YXRlX29wKGVsZW0sIG9wKTsKKyAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sIG9wKTsKK30KKworc3RhdGljIHZvaWQgc2VydmVyX29uX2RvbmVfcmVjdihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSBwdHI7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIGlmIChzdWNjZXNzKSB7CisgICAgZXh0cmFjdF9hbmRfYW5ub3RhdGVfbWV0aG9kX3RhZyhjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhLCBjYWxsZCwgY2hhbmQpOworICB9CisgIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiKGV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYl9hcmcsIHN1Y2Nlc3MpOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJfbXV0YXRlX29wKGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGlmIChvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhKSB7CisgICAgLyogc3Vic3RpdHV0ZSBvdXIgY2FsbGJhY2sgZm9yIHRoZSBvcCBjYWxsYmFjayAqLworICAgIGNhbGxkLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgPSBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhOworICAgIGNhbGxkLT5vbl9kb25lX3JlY3YgPSBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5OworICAgIG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgPSAmY2FsbGQtPmZpbmlzaF9yZWN2OworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlcnZlcl9zdGFydF90cmFuc3BvcnRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIC8qIFRPRE8oY3RpbGxlcik6IHRoaXMgY29kZSBmYWlscy4gSSBkb24ndCBrbm93IHdoeS4gSSBleHBlY3QgaXQncworICAgICAgICAgICAgICAgICAgICBpbmNvbXBsZXRlLCBhbmQgc29tZW9uZSBzaG91bGQgbG9vayBhdCBpdCBzb29uLgorCisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIEdQUl9BU1NFUlQoKGNhbGxkLT5vcF9pZC51cHBlciAhPSAwKSB8fCAoY2FsbGQtPm9wX2lkLmxvd2VyICE9IDApKTsgKi8KKyAgc2VydmVyX211dGF0ZV9vcChlbGVtLCBvcCk7CisgIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsaWVudF9pbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIGNhbGxfZGF0YSAqZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgR1BSX0FTU0VSVChkICE9IE5VTEwpOworICBtZW1zZXQoZCwgMCwgc2l6ZW9mKCpkKSk7CisgIGQtPnN0YXJ0X3RzID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOworfQorCitzdGF0aWMgdm9pZCBjbGllbnRfZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2FsbF9kYXRhICpkID0gZWxlbS0+Y2FsbF9kYXRhOworICBHUFJfQVNTRVJUKGQgIT0gTlVMTCk7CisgIC8qIFRPRE8oaG9uZ3l1KTogcmVjb3JkIHJwYyBjbGllbnQgc3RhdHMgYW5kIGNlbnN1c19ycGNfZW5kX29wIGhlcmUgKi8KK30KKworc3RhdGljIHZvaWQgc2VydmVyX2luaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgY2FsbF9kYXRhICpkID0gZWxlbS0+Y2FsbF9kYXRhOworICBHUFJfQVNTRVJUKGQgIT0gTlVMTCk7CisgIG1lbXNldChkLCAwLCBzaXplb2YoKmQpKTsKKyAgZC0+c3RhcnRfdHMgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7CisgIC8qIFRPRE8oaG9uZ3l1KTogY2FsbCBjZW5zdXNfdHJhY2luZ19zdGFydF9vcCBoZXJlLiAqLworICBncnBjX2Nsb3N1cmVfaW5pdCgmZC0+ZmluaXNoX3JlY3YsIHNlcnZlcl9vbl9kb25lX3JlY3YsIGVsZW0pOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJfZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2FsbF9kYXRhICpkID0gZWxlbS0+Y2FsbF9kYXRhOworICBHUFJfQVNTRVJUKGQgIT0gTlVMTCk7CisgIC8qIFRPRE8oaG9uZ3l1KTogcmVjb3JkIHJwYyBzZXJ2ZXIgc3RhdHMgYW5kIGNlbnN1c190cmFjaW5nX2VuZF9vcCBoZXJlICovCit9CisKK3N0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIEdQUl9BU1NFUlQoY2hhbmQgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgR1BSX0FTU0VSVChjaGFuZCAhPSBOVUxMKTsKK30KKworY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2NsaWVudF9jZW5zdXNfZmlsdGVyID0geworICAgIGNsaWVudF9zdGFydF90cmFuc3BvcnRfb3AsCisgICAgZ3JwY19jaGFubmVsX25leHRfb3AsCisgICAgc2l6ZW9mKGNhbGxfZGF0YSksCisgICAgY2xpZW50X2luaXRfY2FsbF9lbGVtLAorICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCisgICAgY2xpZW50X2Rlc3Ryb3lfY2FsbF9lbGVtLAorICAgIHNpemVvZihjaGFubmVsX2RhdGEpLAorICAgIGluaXRfY2hhbm5lbF9lbGVtLAorICAgIGRlc3Ryb3lfY2hhbm5lbF9lbGVtLAorICAgIGdycGNfY2FsbF9uZXh0X2dldF9wZWVyLAorICAgICJjZW5zdXMtY2xpZW50In07CisKK2NvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19zZXJ2ZXJfY2Vuc3VzX2ZpbHRlciA9IHsKKyAgICBzZXJ2ZXJfc3RhcnRfdHJhbnNwb3J0X29wLAorICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAorICAgIHNpemVvZihjYWxsX2RhdGEpLAorICAgIHNlcnZlcl9pbml0X2NhbGxfZWxlbSwKKyAgICBncnBjX2NhbGxfc3RhY2tfaWdub3JlX3NldF9wb2xsc2V0LAorICAgIHNlcnZlcl9kZXN0cm95X2NhbGxfZWxlbSwKKyAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKKyAgICBpbml0X2NoYW5uZWxfZWxlbSwKKyAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKKyAgICBncnBjX2NhbGxfbmV4dF9nZXRfcGVlciwKKyAgICAiY2Vuc3VzLXNlcnZlciJ9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZWFmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NFTlNVU19HUlBDX0ZJTFRFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0VOU1VTX0dSUENfRklMVEVSX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKKworLyogQ2Vuc3VzIGZpbHRlcnM6IHByb3ZpZGVzIHRyYWNpbmcgYW5kIHN0YXRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0aWVzLiBJdAorICAgbmVlZHMgdG8gcmVzaWRlIHJpZ2h0IGJlbG93IHRoZSBzdXJmYWNlIGZpbHRlciBpbiB0aGUgY2hhbm5lbCBzdGFjay4gKi8KK2V4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfY2xpZW50X2NlbnN1c19maWx0ZXI7CitleHRlcm4gY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX3NlcnZlcl9jZW5zdXNfZmlsdGVyOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DRU5TVVNfR1JQQ19GSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5jIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWNhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIKKworc3RhdGljIGJvb2wgbWF5YmVfYWRkX2NlbnN1c19maWx0ZXIoZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmdfbXVzdF9iZV9udWxsKSB7CisgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzID0KKyAgICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF9jaGFubmVsX2FyZ3VtZW50cyhidWlsZGVyKTsKKyAgaWYgKGdycGNfY2hhbm5lbF9hcmdzX2lzX2NlbnN1c19lbmFibGVkKGFyZ3MpKSB7CisgICAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3ByZXBlbmRfZmlsdGVyKAorICAgICAgICBidWlsZGVyLCAmZ3JwY19jbGllbnRfY2Vuc3VzX2ZpbHRlciwgTlVMTCwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgY2Vuc3VzX2dycGNfcGx1Z2luX2luaXQodm9pZCkgeworICAvKiBPbmx5IGluaXRpYWxpemUgY2Vuc3VzIGlmIG5vIG9uZSBlbHNlIGhhcyBhbmQgc29tZSBmZWF0dXJlcyBhcmUKKyAgICogYXZhaWxhYmxlLiAqLworICBpZiAoY2Vuc3VzX2VuYWJsZWQoKSA9PSBDRU5TVVNfRkVBVFVSRV9OT05FICYmCisgICAgICBjZW5zdXNfc3VwcG9ydGVkKCkgIT0gQ0VOU1VTX0ZFQVRVUkVfTk9ORSkgeworICAgIGlmIChjZW5zdXNfaW5pdGlhbGl6ZShjZW5zdXNfc3VwcG9ydGVkKCkpKSB7IC8qIGVuYWJsZSBhbGwgZmVhdHVyZXMuICovCisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGNlbnN1cy4iKTsKKyAgICB9CisgIH0KKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfQ0hBTk5FTCwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVfYWRkX2NlbnN1c19maWx0ZXIsIE5VTEwpOworICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX1NFUlZFUl9DSEFOTkVMLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZV9hZGRfY2Vuc3VzX2ZpbHRlciwgTlVMTCk7Cit9CisKK3ZvaWQgY2Vuc3VzX2dycGNfcGx1Z2luX2Rlc3Ryb3kodm9pZCkgeyBjZW5zdXNfc2h1dGRvd24oKTsgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5oIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTVmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NFTlNVU19HUlBDX1BMVUdJTl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0VOU1VTX0dSUENfUExVR0lOX0gKKwordm9pZCBjZW5zdXNfZ3JwY19wbHVnaW5faW5pdCh2b2lkKTsKK3ZvaWQgY2Vuc3VzX2dycGNfcGx1Z2luX2Rlc3Ryb3kodm9pZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NFTlNVU19HUlBDX1BMVUdJTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9pbml0aWFsaXplLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYyBiL3NyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDdlODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuYwpAQCAtMCwwICsxLDYwMCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gSW1wbGVtZW50cyBhbiBlZmZpY2llbnQgaW4tbWVtb3J5IGxvZywgb3B0aW1pemVkIGZvciBtdWx0aXBsZSB3cml0ZXJzIGFuZAorLy8gYSBzaW5nbGUgcmVhZGVyLiBBdmFpbGFibGUgbG9nIHNwYWNlIGlzIGRpdmlkZWQgdXAgaW4gYmxvY2tzIG9mCisvLyBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIGJ5dGVzLiBBIGJsb2NrIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZworLy8gdGhyZWUgZGF0YSBzdHJ1Y3R1cmVzOgorLy8gLSBGcmVlIGJsb2NrcyAoZnJlZV9ibG9ja19saXN0KQorLy8gLSBCbG9ja3Mgd2l0aCB1bnJlYWQgZGF0YSAoZGlydHlfYmxvY2tfbGlzdCkKKy8vIC0gQmxvY2tzIGN1cnJlbnRseSBhdHRhY2hlZCB0byBjb3JlcyAoY29yZV9sb2NhbF9ibG9ja3NbXSkKKy8vCisvLyBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgbW92ZXMgYSBibG9jayBmcm9tIGNvcmVfbG9jYWxfYmxvY2tzW10gdG8gdGhlIGVuZCBvZgorLy8gZGlydHlfYmxvY2tfbGlzdCB3aGVuIGJsb2NrOgorLy8gLSBpcyBvdXQtb2Ytc3BhY2UgT1IKKy8vIC0gaGFzIGFuIGluY29tcGxldGUgcmVjb3JkIChhbiBpbmNvbXBsZXRlIHJlY29yZCBvY2N1cnMgd2hlbiBhIHRocmVhZCBjYWxscworLy8gICBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgYW5kIGlzIGNvbnRleHQtc3dpdGNoZWQgYmVmb3JlIGNhbGxpbmcKKy8vICAgY2Vuc3VzX2xvZ19lbmRfd3JpdGUoKQorLy8gU28sIGJsb2NrcyBpbiBkaXJ0eV9ibG9ja19saXN0IGFyZSBvcmRlcmVkLCBmcm9tIG9sZGVzdCB0byBuZXdlc3QsIGJ5IHRoZQorLy8gdGltZSB3aGVuIGJsb2NrIGlzIGRldGFjaGVkIGZyb20gdGhlIGNvcmUuCisvLworLy8gY2Vuc3VzX2xvZ19yZWFkX25leHQoKSBmaXJzdCBpdGVyYXRlcyBvdmVyIGRpcnR5X2Jsb2NrX2xpc3QgYW5kIHRoZW4KKy8vIGNvcmVfbG9jYWxfYmxvY2tzW10uIEl0IG1vdmVzIGNvbXBsZXRlbHkgcmVhZCBibG9ja3MgZnJvbSBkaXJ0eV9ibG9ja19saXN0CisvLyB0byBmcmVlX2Jsb2NrX2xpc3QuIEJsb2NrcyBpbiBjb3JlX2xvY2FsX2Jsb2Nrc1tdIGFyZSBub3QgZnJlZWQsIGV2ZW4gd2hlbgorLy8gY29tcGxldGVseSByZWFkLgorLy8KKy8vIElmIHRoZSBsb2cgaXMgY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZCByZWNvcmRzIGFuZCBmcmVlX2Jsb2NrX2xpc3QgaXMgZW1wdHksCisvLyBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgaXRlcmF0ZXMgb3ZlciBkaXJ0eV9ibG9ja19saXN0IHRvIGFsbG9jYXRlIGEKKy8vIG5ldyBibG9jay4gSXQgbW92ZXMgdGhlIG9sZGVzdCBhdmFpbGFibGUgYmxvY2sgKG5vIHBlbmRpbmcgcmVhZC93cml0ZSkgdG8KKy8vIGNvcmVfbG9jYWxfYmxvY2tzW10uCisvLworLy8gY29yZV9sb2NhbF9ibG9ja19zdHJ1Y3QgaXMgdXNlZCB0byBpbXBsZW1lbnQgYSBtYXAgZnJvbSBjb3JlIGlkIHRvIHRoZSBibG9jaworLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgY29yZS4gVGhpcyBtYXBwaW5nIGlzIGFkdmlzb3J5LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZQorLy8gYmxvY2sgcmV0dXJuZWQgYnkgdGhpcyBtYXBwaW5nIGlzIG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBjb3JlLiBUaGlzCisvLyBtYXBwaW5nIGlzIHVwZGF0ZWQsIGxhemlseSwgYnkgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpLgorLy8KKy8vIExvY2tpbmcgaW4gYmxvY2sgc3RydWN0OgorLy8KKy8vIEV4Y2x1c2l2ZSBnX2xvZy5sb2NrIG11c3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb25zIG9wZXJhdGluZyBvbgorLy8gYmxvY2sgc3RydWN0cyBleGNlcHQgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpIGFuZCBjZW5zdXNfbG9nX2VuZF93cml0ZSgpLgorLy8KKy8vIFdyaXRlcyB0byBhIGJsb2NrIGFyZSBzZXJpYWxpemVkIHZpYSB3cml0ZXJfbG9jay4gY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpCisvLyBhY3F1aXJlcyB0aGlzIGxvY2sgYW5kIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkgcmVsZWFzZXMgaXQuIE9uIGZhaWx1cmUgdG8KKy8vIGFjcXVpcmUgdGhlIGxvY2ssIHdyaXRlciBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgZm9yIHRoZSBjdXJyZW50IGNvcmUgYW5kCisvLyB1cGRhdGVzIGNvcmVfbG9jYWxfYmxvY2sgYWNjb3JkaW5nbHkuCisvLworLy8gU2ltdWx0YW5lb3VzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyBhbGxvd2VkLiBSZWFkZXJzIGNhbiBzYWZlbHkgcmVhZCB1cCB0bworLy8gY29tbWl0dGVkIGJ5dGVzIChieXRlc19jb21taXR0ZWQpLgorLy8KKy8vIHJlYWRlcl9sb2NrIHByb3RlY3RzIHRoZSBibG9jaywgY3VycmVudGx5IGJlaW5nIHJlYWQsIGZyb20gZ2V0dGluZyByZWN5Y2xlZC4KKy8vIHN0YXJ0X3JlYWQoKSBhY3F1aXJlcyByZWFkZXJfbG9jayBhbmQgZW5kX3JlYWQoKSByZWxlYXNlcyB0aGUgbG9jay4KKy8vCisvLyBSZWFkL3dyaXRlIGFjY2VzcyB0byBhIGJsb2NrIGlzIGRpc2FibGVkIHZpYSB0cnlfZGlzYWJsZV9hY2Nlc3MoKS4gSXQgcmV0dXJucworLy8gd2l0aCBib3RoIHdyaXRlcl9sb2NrIGFuZCByZWFkZXJfbG9jayBoZWxkLiBUaGVzZSBsb2NrcyBhcmUgc3Vic2VxdWVudGx5CisvLyByZWxlYXNlZCBieSBlbmFibGVfYWNjZXNzKCkgdG8gZW5hYmxlIGFjY2VzcyB0byB0aGUgYmxvY2suCisvLworLy8gQSBub3RlIG9uIG5hbWluZzogTW9zdCBmdW5jdGlvbi9zdHJ1Y3QgbmFtZXMgYXJlIHByZXBlbmRlZCBieSBjbF8KKy8vIChzaG9ydGhhbmQgZm9yIGNlbnN1c19sb2cpLiBGdXJ0aGVyLCBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlIHN0cnVjdHVyZXMKKy8vIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisvLyBhcmd1bWVudC4gRS5nLiBjbF9ibG9ja19pbml0aWFsaXplKCkgd2lsbCBpbml0aWFsaXplIGEgY2xfYmxvY2suCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2NwdS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIEVuZCBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBjb2RlCisKK3R5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdF9zdHJ1Y3QgeworICBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9ja19saXN0X3N0cnVjdCogbmV4dDsKKyAgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdF9zdHJ1Y3QqIHByZXY7CisgIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrKiBibG9jazsKK30gY2xfYmxvY2tfbGlzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfYmxvY2sgeworICAvLyBQb2ludGVyIHRvIHVuZGVybHlpbmcgYnVmZmVyLgorICBjaGFyKiBidWZmZXI7CisgIGdwcl9hdG0gd3JpdGVyX2xvY2s7CisgIGdwcl9hdG0gcmVhZGVyX2xvY2s7CisgIC8vIEtlZXBzIGNvbXBsZXRlbHkgd3JpdHRlbiBieXRlcy4gRGVjbGFyZWQgYXRvbWljIGJlY2F1c2UgYWNjZXNzZWQKKyAgLy8gc2ltdWx0YW5lb3VzbHkgYnkgcmVhZGVyIGFuZCB3cml0ZXIuCisgIGdwcl9hdG0gYnl0ZXNfY29tbWl0dGVkOworICAvLyBCeXRlcyBhbHJlYWR5IHJlYWQuCisgIHNpemVfdCBieXRlc19yZWFkOworICAvLyBMaW5rcyBmb3IgbGlzdC4KKyAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3QgbGluazsKKy8vIFdlIHdhbnQgdGhpcyBzdHJ1Y3R1cmUgdG8gYmUgY2FjaGVsaW5lIGFsaWduZWQuIFdlIGFzc3VtZSB0aGUgZm9sbG93aW5nCisvLyBzaXplcyBmb3IgdGhlIHZhcmlvdXMgcGFydHMgb24gMzIvNjRiaXQgc3lzdGVtczoKKy8vIHR5cGUgICAgICAgICAgICAgICAgIDMyYiBzaXplICAgIDY0YiBzaXplCisvLyBjaGFyKiAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICA4CisvLyAzeCBncHJfYXRtICAgICAgICAgICAgIDEyICAgICAgICAgIDI0CisvLyBzaXplX3QgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICA4CisvLyBjbF9ibG9ja19saXN0X3N0cnVjdCAgIDEyICAgICAgICAgIDI0CisvLyBUT1RBTCAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgIDY0CisvLworLy8gRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIG91ciBjYWNoZWxpbmUgYW5kIHRoZSBhcmNoaXRlY3R1cmUsIHdlCisvLyBzZWxlY3RpdmVseSBhZGQgY2hhciBidWZmZXJpbmcgdG8gdGhpcyBzdHJ1Y3R1cmUuIFRoZSBzaXplIGlzIGNoZWNrZWQKKy8vIHZpYSBhc3NlcnQgaW4gY2Vuc3VzX2xvZ19pbml0aWFsaXplKCkuCisjaWYgZGVmaW5lZChHUFJfQVJDSF82NCkKKyNkZWZpbmUgQ0xfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDY0KQorI2Vsc2UKKyNpZiBkZWZpbmVkKEdQUl9BUkNIXzMyKQorI2RlZmluZSBDTF9CTE9DS19QQURfU0laRSAoR1BSX0NBQ0hFTElORV9TSVpFIC0gMzIpCisjZWxzZQorI2Vycm9yICJVbmtub3duIGFyY2hpdGVjdHVyZSIKKyNlbmRpZgorI2VuZGlmCisjaWYgQ0xfQkxPQ0tfUEFEX1NJWkUgPiAwCisgIGNoYXIgcGFkZGluZ1tDTF9CTE9DS19QQURfU0laRV07CisjZW5kaWYKK30gY2xfYmxvY2s7CisKKy8vIEEgbGlzdCBvZiBjbF9ibG9ja3MsIGRvdWJseS1saW5rZWQgdGhyb3VnaCBjbF9ibG9jazo6bGluay4KK3R5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdCB7CisgIGludDMyX3QgY291bnQ7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGl0ZW1zIGluIGxpc3QuCisgIGNsX2Jsb2NrX2xpc3Rfc3RydWN0IGh0OyAgLy8gaGVhZC90YWlsIG9mIGxpbmtlZCBsaXN0LgorfSBjbF9ibG9ja19saXN0OworCisvLyBDYWNoZWxpbmUgYWxpZ25lZCBibG9jayBwb2ludGVycyB0byBhdm9pZCBmYWxzZSBzaGFyaW5nLiBCbG9jayBwb2ludGVyIG11c3QKKy8vIGJlIGluaXRpYWxpemVkIHZpYSBzZXRfYmxvY2soKSwgYmVmb3JlIGNhbGxpbmcgb3RoZXIgZnVuY3Rpb25zCit0eXBlZGVmIHN0cnVjdCBjZW5zdXNfbG9nX2NvcmVfbG9jYWxfYmxvY2sgeworICBncHJfYXRtIGJsb2NrOworLy8gRW5zdXJlIGNhY2hsaW5lIGFsaWdubWVudDogd2UgYXNzdW1lIHNpemVvZihncHJfYXRtKSA9PSA0IG9yIDgKKyNpZiBkZWZpbmVkKEdQUl9BUkNIXzY0KQorI2RlZmluZSBDTF9DT1JFX0xPQ0FMX0JMT0NLX1BBRF9TSVpFIChHUFJfQ0FDSEVMSU5FX1NJWkUgLSA4KQorI2Vsc2UKKyNpZiBkZWZpbmVkKEdQUl9BUkNIXzMyKQorI2RlZmluZSBDTF9DT1JFX0xPQ0FMX0JMT0NLX1BBRF9TSVpFIChHUFJfQ0FDSEVMSU5FX1NJWkUgLSA0KQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBhcmNoaXRlY3R1cmUiCisjZW5kaWYKKyNlbmRpZgorI2lmIENMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkUgPiAwCisgIGNoYXIgcGFkZGluZ1tDTF9DT1JFX0xPQ0FMX0JMT0NLX1BBRF9TSVpFXTsKKyNlbmRpZgorfSBjbF9jb3JlX2xvY2FsX2Jsb2NrOworCitzdHJ1Y3QgY2Vuc3VzX2xvZyB7CisgIGludCBkaXNjYXJkX29sZF9yZWNvcmRzOworICAvLyBOdW1iZXIgb2YgY29yZXMgKGFrYSBoYXJkd2FyZS1jb250ZXh0cykKKyAgdW5zaWduZWQgbnVtX2NvcmVzOworICAvLyBudW1iZXIgb2YgQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRSBibG9ja3MgaW4gbG9nCisgIHVpbnQzMl90IG51bV9ibG9ja3M7CisgIGNsX2Jsb2NrKiBibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxvY2sgbWV0YWRhdGEuCisgIGNsX2NvcmVfbG9jYWxfYmxvY2sqIGNvcmVfbG9jYWxfYmxvY2tzOyAgLy8gS2VlcHMgY29yZSB0byBibG9jayBtYXBwaW5ncy4KKyAgZ3ByX211IGxvY2s7CisgIGludCBpbml0aWFsaXplZDsgIC8vIGhhcyBsb2cgYmVlbiBpbml0aWFsaXplZD8KKyAgLy8gS2VlcHMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgaXRlcmF0b3IuIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdAorICAvLyBpdGVyYXRvciBoYXMgcmVhY2hlZCB0aGUgZW5kLiBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKCkgcmVzZXRzIHRoZSB2YWx1ZQorICAvLyB0byBudW1fY29yZSB0byByZXN0YXJ0IGl0ZXJhdGlvbi4KKyAgdWludDMyX3QgcmVhZF9pdGVyYXRvcl9zdGF0ZTsKKyAgLy8gUG9pbnRzIHRvIHRoZSBibG9jayBiZWluZyByZWFkLiBJZiBub24tTlVMTCwgdGhlIGJsb2NrIGlzIGxvY2tlZCBmb3IKKyAgLy8gcmVhZGluZyhibG9ja19iZWluZ19yZWFkXy0+cmVhZGVyX2xvY2sgaXMgaGVsZCkuCisgIGNsX2Jsb2NrKiBibG9ja19iZWluZ19yZWFkOworICBjaGFyKiBidWZmZXI7CisgIGNsX2Jsb2NrX2xpc3QgZnJlZV9ibG9ja19saXN0OworICBjbF9ibG9ja19saXN0IGRpcnR5X2Jsb2NrX2xpc3Q7CisgIGdwcl9hdG0gb3V0X29mX3NwYWNlX2NvdW50OworfTsKKworLy8gU2luZ2xlIGludGVybmFsIGxvZy4KK3N0YXRpYyBzdHJ1Y3QgY2Vuc3VzX2xvZyBnX2xvZzsKKworLy8gRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBhbiBhdG9taWMgbWVtb3J5IGxvY2F0aW9uIHVzZWQgYXMgYSBsb2NrLgorCisvLyBSZXR1cm5zIG5vbi16ZXJvIGlmIGxvY2sgaXMgYWNxdWlyZWQuCitzdGF0aWMgaW50IGNsX3RyeV9sb2NrKGdwcl9hdG0qIGxvY2spIHsgcmV0dXJuIGdwcl9hdG1fYWNxX2Nhcyhsb2NrLCAwLCAxKTsgfQorCitzdGF0aWMgdm9pZCBjbF91bmxvY2soZ3ByX2F0bSogbG9jaykgeyBncHJfYXRtX3JlbF9zdG9yZShsb2NrLCAwKTsgfQorCisvLyBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2NvcmVfbG9jYWxfYmxvY2sncy4KKworc3RhdGljIHZvaWQgY2xfY29yZV9sb2NhbF9ibG9ja19zZXRfYmxvY2soY2xfY29yZV9sb2NhbF9ibG9jayogY2xiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfYmxvY2sqIGJsb2NrKSB7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZjbGItPmJsb2NrLCAoZ3ByX2F0bSlibG9jayk7Cit9CisKK3N0YXRpYyBjbF9ibG9jayogY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soY2xfY29yZV9sb2NhbF9ibG9jayogY2xiKSB7CisgIHJldHVybiAoY2xfYmxvY2sqKWdwcl9hdG1fYWNxX2xvYWQoJmNsYi0+YmxvY2spOworfQorCisvLyBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2Jsb2NrX2xpc3Rfc3RydWN0J3MuCisKK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3Rfc3RydWN0X2luaXRpYWxpemUoY2xfYmxvY2tfbGlzdF9zdHJ1Y3QqIGJscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfYmxvY2sqIGJsb2NrKSB7CisgIGJscy0+bmV4dCA9IGJscy0+cHJldiA9IGJsczsKKyAgYmxzLT5ibG9jayA9IGJsb2NrOworfQorCisvLyBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2Jsb2NrX2xpc3Qncy4KKworc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9pbml0aWFsaXplKGNsX2Jsb2NrX2xpc3QqIGxpc3QpIHsKKyAgbGlzdC0+Y291bnQgPSAwOworICBjbF9ibG9ja19saXN0X3N0cnVjdF9pbml0aWFsaXplKCZsaXN0LT5odCwgTlVMTCk7Cit9CisKKy8vIFJldHVybnMgaGVhZCBvZiAqdGhpcywgb3IgTlVMTCBpZiBlbXB0eS4KK3N0YXRpYyBjbF9ibG9jayogY2xfYmxvY2tfbGlzdF9oZWFkKGNsX2Jsb2NrX2xpc3QqIGxpc3QpIHsKKyAgcmV0dXJuIGxpc3QtPmh0Lm5leHQtPmJsb2NrOworfQorCisvLyBJbnNlcnQgZWxlbWVudCAqZSBhZnRlciAqcG9zLgorc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9pbnNlcnQoY2xfYmxvY2tfbGlzdCogbGlzdCwgY2xfYmxvY2tfbGlzdF9zdHJ1Y3QqIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2Jsb2NrX2xpc3Rfc3RydWN0KiBlKSB7CisgIGxpc3QtPmNvdW50Kys7CisgIGUtPm5leHQgPSBwb3MtPm5leHQ7CisgIGUtPnByZXYgPSBwb3M7CisgIGUtPm5leHQtPnByZXYgPSBlOworICBlLT5wcmV2LT5uZXh0ID0gZTsKK30KKworLy8gSW5zZXJ0IGJsb2NrIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CitzdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X2luc2VydF9hdF9oZWFkKGNsX2Jsb2NrX2xpc3QqIGxpc3QsIGNsX2Jsb2NrKiBibG9jaykgeworICBjbF9ibG9ja19saXN0X2luc2VydChsaXN0LCAmbGlzdC0+aHQsICZibG9jay0+bGluayk7Cit9CisKKy8vIEluc2VydCBibG9jayBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X3RhaWwoY2xfYmxvY2tfbGlzdCogbGlzdCwgY2xfYmxvY2sqIGJsb2NrKSB7CisgIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0KGxpc3QsIGxpc3QtPmh0LnByZXYsICZibG9jay0+bGluayk7Cit9CisKKy8vIFJlbW92ZXMgYmxvY2sgKmIuIFJlcXVpcmVzICpiIGJlIGluIHRoZSBsaXN0Lgorc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9yZW1vdmUoY2xfYmxvY2tfbGlzdCogbGlzdCwgY2xfYmxvY2sqIGIpIHsKKyAgbGlzdC0+Y291bnQtLTsKKyAgYi0+bGluay5uZXh0LT5wcmV2ID0gYi0+bGluay5wcmV2OworICBiLT5saW5rLnByZXYtPm5leHQgPSBiLT5saW5rLm5leHQ7Cit9CisKKy8vIEZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gY2xfYmxvY2sncworCitzdGF0aWMgdm9pZCBjbF9ibG9ja19pbml0aWFsaXplKGNsX2Jsb2NrKiBibG9jaywgY2hhciogYnVmZmVyKSB7CisgIGJsb2NrLT5idWZmZXIgPSBidWZmZXI7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZibG9jay0+d3JpdGVyX2xvY2ssIDApOworICBncHJfYXRtX3JlbF9zdG9yZSgmYmxvY2stPnJlYWRlcl9sb2NrLCAwKTsKKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJmJsb2NrLT5ieXRlc19jb21taXR0ZWQsIDApOworICBibG9jay0+Ynl0ZXNfcmVhZCA9IDA7CisgIGNsX2Jsb2NrX2xpc3Rfc3RydWN0X2luaXRpYWxpemUoJmJsb2NrLT5saW5rLCBibG9jayk7Cit9CisKKy8vIEd1YXJkcyBhZ2FpbnN0IGV4cG9zaW5nIHBhcnRpYWxseSB3cml0dGVuIGJ1ZmZlciB0byB0aGUgcmVhZGVyLgorc3RhdGljIHZvaWQgY2xfYmxvY2tfc2V0X2J5dGVzX2NvbW1pdHRlZChjbF9ibG9jayogYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc19jb21taXR0ZWQpIHsKKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJmJsb2NrLT5ieXRlc19jb21taXR0ZWQsIChncHJfYXRtKWJ5dGVzX2NvbW1pdHRlZCk7Cit9CisKK3N0YXRpYyBzaXplX3QgY2xfYmxvY2tfZ2V0X2J5dGVzX2NvbW1pdHRlZChjbF9ibG9jayogYmxvY2spIHsKKyAgcmV0dXJuIChzaXplX3QpZ3ByX2F0bV9hY3FfbG9hZCgmYmxvY2stPmJ5dGVzX2NvbW1pdHRlZCk7Cit9CisKKy8vIFRyaWVzIHRvIGRpc2FibGUgZnV0dXJlIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoaXMgYmxvY2suIFN1Y2NlZWRzIGlmOgorLy8gLSBubyBpbi1wcm9ncmVzcyB3cml0ZSBBTkQKKy8vIC0gbm8gaW4tcHJvZ3Jlc3MgcmVhZCBBTkQKKy8vIC0gJ2Rpc2NhcmRfZGF0YScgc2V0IHRvIHRydWUgT1Igbm8gdW5yZWFkIGRhdGEKKy8vIE9uIHN1Y2Nlc3MsIGNsZWFycyB0aGUgYmxvY2sgc3RhdGUgYW5kIHJldHVybnMgd2l0aCB3cml0ZXJfbG9ja18gYW5kCisvLyByZWFkZXJfbG9ja18gaGVsZC4gVGhlc2UgbG9ja3MgYXJlIHJlbGVhc2VkIGJ5IGEgc3Vic2VxdWVudAorLy8gY2xfYmxvY2tfYWNjZXNzX2VuYWJsZSgpIGNhbGwuCitzdGF0aWMgYm9vbCBjbF9ibG9ja190cnlfZGlzYWJsZV9hY2Nlc3MoY2xfYmxvY2sqIGJsb2NrLCBpbnQgZGlzY2FyZF9kYXRhKSB7CisgIGlmICghY2xfdHJ5X2xvY2soJmJsb2NrLT53cml0ZXJfbG9jaykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFjbF90cnlfbG9jaygmYmxvY2stPnJlYWRlcl9sb2NrKSkgeworICAgIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFkaXNjYXJkX2RhdGEgJiYKKyAgICAgIChibG9jay0+Ynl0ZXNfcmVhZCAhPSBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrKSkpIHsKKyAgICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7CisgICAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjbF9ibG9ja19zZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrLCAwKTsKKyAgYmxvY2stPmJ5dGVzX3JlYWQgPSAwOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgY2xfYmxvY2tfZW5hYmxlX2FjY2VzcyhjbF9ibG9jayogYmxvY2spIHsKKyAgY2xfdW5sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spOworICBjbF91bmxvY2soJmJsb2NrLT53cml0ZXJfbG9jayk7Cit9CisKKy8vIFJldHVybnMgd2l0aCB3cml0ZXJfbG9jayBoZWxkLgorc3RhdGljIHZvaWQqIGNsX2Jsb2NrX3N0YXJ0X3dyaXRlKGNsX2Jsb2NrKiBibG9jaywgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFjbF90cnlfbG9jaygmYmxvY2stPndyaXRlcl9sb2NrKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHNpemVfdCBieXRlc19jb21taXR0ZWQgPSBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrKTsKKyAgaWYgKGJ5dGVzX2NvbW1pdHRlZCArIHNpemUgPiBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSkgeworICAgIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gYmxvY2stPmJ1ZmZlciArIGJ5dGVzX2NvbW1pdHRlZDsKK30KKworLy8gUmVsZWFzZXMgd3JpdGVyX2xvY2sgYW5kIGluY3JlbWVudHMgY29tbWl0dGVkIGJ5dGVzIGJ5ICdieXRlc193cml0dGVuJy4KKy8vICdieXRlc193cml0dGVuJyBtdXN0IGJlIDw9ICdzaXplJyBzcGVjaWZpZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKy8vIFN0YXJ0V3JpdGUoKSBjYWxsLiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLgorc3RhdGljIHZvaWQgY2xfYmxvY2tfZW5kX3dyaXRlKGNsX2Jsb2NrKiBibG9jaywgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4pIHsKKyAgY2xfYmxvY2tfc2V0X2J5dGVzX2NvbW1pdHRlZCgKKyAgICAgIGJsb2NrLCBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrKSArIGJ5dGVzX3dyaXR0ZW4pOworICBjbF91bmxvY2soJmJsb2NrLT53cml0ZXJfbG9jayk7Cit9CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCB1bnJlYWQgYnl0ZSBpbiBidWZmZXIuIFRoZSBudW1iZXIgb2YgYnl0ZXMKKy8vIGF2YWlsYWJsZSBhcmUgcmV0dXJuZWQgaW4gJ2J5dGVzX2F2YWlsYWJsZScuIEFjcXVpcmVzIHJlYWRlciBsb2NrIHRoYXQgaXMKKy8vIHJlbGVhc2VkIGJ5IGEgc3Vic2VxdWVudCBjbF9ibG9ja19lbmRfcmVhZCgpIGNhbGwuIFJldHVybnMgTlVMTCBpZjoKKy8vIC0gcmVhZCBpbiBwcm9ncmVzcworLy8gLSBubyBkYXRhIGF2YWlsYWJsZQorc3RhdGljIHZvaWQqIGNsX2Jsb2NrX3N0YXJ0X3JlYWQoY2xfYmxvY2sqIGJsb2NrLCBzaXplX3QqIGJ5dGVzX2F2YWlsYWJsZSkgeworICBpZiAoIWNsX3RyeV9sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLy8gYnl0ZXNfY29tbWl0dGVkIG1heSBjaGFuZ2UgZnJvbSB1bmRlciB1cy4gVXNlIGJ5dGVzX2F2YWlsYWJsZSB0byB1cGRhdGUKKyAgLy8gYnl0ZXNfcmVhZCBiZWxvdy4KKyAgc2l6ZV90IGJ5dGVzX2NvbW1pdHRlZCA9IGNsX2Jsb2NrX2dldF9ieXRlc19jb21taXR0ZWQoYmxvY2spOworICBHUFJfQVNTRVJUKGJ5dGVzX2NvbW1pdHRlZCA+PSBibG9jay0+Ynl0ZXNfcmVhZCk7CisgICpieXRlc19hdmFpbGFibGUgPSBieXRlc19jb21taXR0ZWQgLSBibG9jay0+Ynl0ZXNfcmVhZDsKKyAgaWYgKCpieXRlc19hdmFpbGFibGUgPT0gMCkgeworICAgIGNsX3VubG9jaygmYmxvY2stPnJlYWRlcl9sb2NrKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiByZWNvcmQgPSBibG9jay0+YnVmZmVyICsgYmxvY2stPmJ5dGVzX3JlYWQ7CisgIGJsb2NrLT5ieXRlc19yZWFkICs9ICpieXRlc19hdmFpbGFibGU7CisgIHJldHVybiByZWNvcmQ7Cit9CisKK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2VuZF9yZWFkKGNsX2Jsb2NrKiBibG9jaykgeworICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7Cit9CisKKy8vIEludGVybmFsIGZ1bmN0aW9ucyBvcGVyYXRpbmcgb24gZ19sb2cKKworLy8gQWxsb2NhdGVzIGEgbmV3IGZyZWUgYmxvY2sgKG9yIHJlY3ljbGVzIGFuIGF2YWlsYWJsZSBkaXJ0eSBibG9jayBpZiBsb2cgaXMKKy8vIGNvbmZpZ3VyZWQgdG8gZGlzY2FyZCBvbGQgcmVjb3JkcykuIFJldHVybnMgTlVMTCBpZiBvdXQtb2Ytc3BhY2UuCitzdGF0aWMgY2xfYmxvY2sqIGNsX2FsbG9jYXRlX2Jsb2NrKHZvaWQpIHsKKyAgY2xfYmxvY2sqIGJsb2NrID0gY2xfYmxvY2tfbGlzdF9oZWFkKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QpOworICBpZiAoYmxvY2sgIT0gTlVMTCkgeworICAgIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QsIGJsb2NrKTsKKyAgICByZXR1cm4gYmxvY2s7CisgIH0KKyAgaWYgKCFnX2xvZy5kaXNjYXJkX29sZF9yZWNvcmRzKSB7CisgICAgLy8gTm8gZnJlZSBibG9jayBhbmQgbG9nIGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBvbGQgcmVjb3Jkcy4KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvLyBSZWN5Y2xlIGRpcnR5IGJsb2NrLiBTdGFydCBmcm9tIHRoZSBvbGRlc3QuCisgIGZvciAoYmxvY2sgPSBjbF9ibG9ja19saXN0X2hlYWQoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QpOyBibG9jayAhPSBOVUxMOworICAgICAgIGJsb2NrID0gYmxvY2stPmxpbmsubmV4dC0+YmxvY2spIHsKKyAgICBpZiAoY2xfYmxvY2tfdHJ5X2Rpc2FibGVfYWNjZXNzKGJsb2NrLCAxIC8qIGRpc2NhcmQgZGF0YSAqLykpIHsKKyAgICAgIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0LCBibG9jayk7CisgICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisvLyBBbGxvY2F0ZXMgYSBuZXcgYmxvY2sgYW5kIHVwZGF0ZXMgY29yZSBpZCA9PiBibG9jayBtYXBwaW5nLiAnb2xkX2Jsb2NrJworLy8gcG9pbnRzIHRvIHRoZSBibG9jayB0aGF0IHRoZSBjYWxsZXIgdGhpbmtzIGlzIGF0dGFjaGVkIHRvCisvLyAnY29yZV9pZCcuICdvbGRfYmxvY2snIG1heSBiZSBOVUxMLiBSZXR1cm5zIHRydWUgaWY6CisvLyAtIGFsbG9jYXRlZCBhIG5ldyBibG9jayBPUgorLy8gLSAnY29yZV9pZCcgPT4gJ29sZF9ibG9jaycgbWFwcGluZyBjaGFuZ2VkIChhbm90aGVyIHRocmVhZCBhbGxvY2F0ZWQgYQorLy8gICBibG9jayBiZWZvcmUgbG9jayB3YXMgYWNxdWlyZWQpLgorc3RhdGljIGJvb2wgY2xfYWxsb2NhdGVfY29yZV9sb2NhbF9ibG9jayh1aW50MzJfdCBjb3JlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ibG9jayogb2xkX2Jsb2NrKSB7CisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGxvY2ssIGNoZWNrIGlmIGNvcmUtbG9jYWwgbWFwcGluZyBoYXMgY2hhbmdlZC4KKyAgY2xfY29yZV9sb2NhbF9ibG9jayogY29yZV9sb2NhbF9ibG9jayA9ICZnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrc1tjb3JlX2lkXTsKKyAgY2xfYmxvY2sqIGJsb2NrID0gY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soY29yZV9sb2NhbF9ibG9jayk7CisgIGlmICgoYmxvY2sgIT0gTlVMTCkgJiYgKGJsb2NrICE9IG9sZF9ibG9jaykpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoYmxvY2sgIT0gTlVMTCkgeworICAgIGNsX2NvcmVfbG9jYWxfYmxvY2tfc2V0X2Jsb2NrKGNvcmVfbG9jYWxfYmxvY2ssIE5VTEwpOworICAgIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X3RhaWwoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QsIGJsb2NrKTsKKyAgfQorICBibG9jayA9IGNsX2FsbG9jYXRlX2Jsb2NrKCk7CisgIGlmIChibG9jayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNsX2NvcmVfbG9jYWxfYmxvY2tfc2V0X2Jsb2NrKGNvcmVfbG9jYWxfYmxvY2ssIGJsb2NrKTsKKyAgY2xfYmxvY2tfZW5hYmxlX2FjY2VzcyhibG9jayk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgY2xfYmxvY2sqIGNsX2dldF9ibG9jayh2b2lkKiByZWNvcmQpIHsKKyAgdWludHB0cl90IHAgPSAodWludHB0cl90KSgoY2hhciopcmVjb3JkIC0gZ19sb2cuYnVmZmVyKTsKKyAgdWludHB0cl90IGluZGV4ID0gcCA+PiBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFOworICByZXR1cm4gJmdfbG9nLmJsb2Nrc1tpbmRleF07Cit9CisKKy8vIEdldHMgdGhlIG5leHQgYmxvY2sgdG8gcmVhZCBhbmQgdHJpZXMgdG8gZnJlZSAncHJldicgYmxvY2sgKGlmIG5vdCBOVUxMKS4KKy8vIFJldHVybnMgTlVMTCBpZiByZWFjaGVkIHRoZSBlbmQuCitzdGF0aWMgY2xfYmxvY2sqIGNsX25leHRfYmxvY2tfdG9fcmVhZChjbF9ibG9jayogcHJldikgeworICBjbF9ibG9jayogYmxvY2sgPSBOVUxMOworICBpZiAoZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZSA9PSBnX2xvZy5udW1fY29yZXMpIHsKKyAgICAvLyBXZSBhcmUgdHJhdmVyc2luZyBkaXJ0eSBsaXN0OyBmaW5kIHRoZSBuZXh0IGRpcnR5IGJsb2NrLgorICAgIGlmIChwcmV2ICE9IE5VTEwpIHsKKyAgICAgIC8vIFRyeSB0byBmcmVlIHRoZSBwcmV2aW91cyBibG9jayBpZiB0aGVyZSBpcyBubyB1bnJlYWQgZGF0YS4gVGhpcworICAgICAgLy8gYmxvY2sKKyAgICAgIC8vIG1heSBoYXZlIHVucmVhZCBkYXRhIGlmIHByZXZpb3VzbHkgaW5jb21wbGV0ZSByZWNvcmQgY29tcGxldGVkCisgICAgICAvLyBiZXR3ZWVuCisgICAgICAvLyByZWFkX25leHQoKSBjYWxscy4KKyAgICAgIGJsb2NrID0gcHJldi0+bGluay5uZXh0LT5ibG9jazsKKyAgICAgIGlmIChjbF9ibG9ja190cnlfZGlzYWJsZV9hY2Nlc3MocHJldiwgMCAvKiBkbyBub3QgZGlzY2FyZCBkYXRhICovKSkgeworICAgICAgICBjbF9ibG9ja19saXN0X3JlbW92ZSgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCwgcHJldik7CisgICAgICAgIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X2hlYWQoJmdfbG9nLmZyZWVfYmxvY2tfbGlzdCwgcHJldik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJsb2NrID0gY2xfYmxvY2tfbGlzdF9oZWFkKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0KTsKKyAgICB9CisgICAgaWYgKGJsb2NrICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGUgZGlydHkgbGlzdDsgbW92aW5nIG9uIHRvIGNvcmUtbG9jYWwgYmxvY2tzLgorICB9CisgIHdoaWxlIChnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlID4gMCkgeworICAgIGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUtLTsKKyAgICBibG9jayA9IGNsX2NvcmVfbG9jYWxfYmxvY2tfZ2V0X2Jsb2NrKAorICAgICAgICAmZ19sb2cuY29yZV9sb2NhbF9ibG9ja3NbZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZV0pOworICAgIGlmIChibG9jayAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIENMX0xPR18yX01CIDIwICAvLyAyXjIwID0gMU1CCisKKy8vIEV4dGVybmFsIGZ1bmN0aW9uczogcHJpbWFyeSBzdGF0c19sb2cgaW50ZXJmYWNlCit2b2lkIGNlbnN1c19sb2dfaW5pdGlhbGl6ZShzaXplX3Qgc2l6ZV9pbl9tYiwgaW50IGRpc2NhcmRfb2xkX3JlY29yZHMpIHsKKyAgLy8gQ2hlY2sgY2FjaGVsaW5lIGFsaWdubWVudC4KKyAgR1BSX0FTU0VSVChzaXplb2YoY2xfYmxvY2spICUgR1BSX0NBQ0hFTElORV9TSVpFID09IDApOworICBHUFJfQVNTRVJUKHNpemVvZihjbF9jb3JlX2xvY2FsX2Jsb2NrKSAlIEdQUl9DQUNIRUxJTkVfU0laRSA9PSAwKTsKKyAgR1BSX0FTU0VSVCghZ19sb2cuaW5pdGlhbGl6ZWQpOworICBnX2xvZy5kaXNjYXJkX29sZF9yZWNvcmRzID0gZGlzY2FyZF9vbGRfcmVjb3JkczsKKyAgZ19sb2cubnVtX2NvcmVzID0gZ3ByX2NwdV9udW1fY29yZXMoKTsKKyAgLy8gRW5zdXJlIHRoYXQgd2Ugd2lsbCBub3QgZ2V0IGFueSBvdmVyZmxvdyBpbiBjYWxhY3VsYXRpbmcgbnVtX2Jsb2NrcworICBHUFJfQVNTRVJUKENMX0xPR18yX01CID49IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUpOworICBHUFJfQVNTRVJUKHNpemVfaW5fbWIgPCAxMDAwKTsKKyAgLy8gRW5zdXJlIGF0IGxlYXN0IDJ4IGFzIG1hbnkgYmxvY2tzIGFzIHRoZXJlIGFyZSBjb3Jlcy4KKyAgZ19sb2cubnVtX2Jsb2NrcyA9CisgICAgICAodWludDMyX3QpR1BSX01BWCgyICogZ19sb2cubnVtX2NvcmVzLCAoc2l6ZV9pbl9tYiA8PCBDTF9MT0dfMl9NQikgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFKTsKKyAgZ3ByX211X2luaXQoJmdfbG9nLmxvY2spOworICBnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlID0gMDsKKyAgZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCA9IE5VTEw7CisgIGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzID0gKGNsX2NvcmVfbG9jYWxfYmxvY2sqKWdwcl9tYWxsb2NfYWxpZ25lZCgKKyAgICAgIGdfbG9nLm51bV9jb3JlcyAqIHNpemVvZihjbF9jb3JlX2xvY2FsX2Jsb2NrKSwgR1BSX0NBQ0hFTElORV9TSVpFX0xPRyk7CisgIG1lbXNldChnX2xvZy5jb3JlX2xvY2FsX2Jsb2NrcywgMCwKKyAgICAgICAgIGdfbG9nLm51bV9jb3JlcyAqIHNpemVvZihjbF9jb3JlX2xvY2FsX2Jsb2NrKSk7CisgIGdfbG9nLmJsb2NrcyA9IChjbF9ibG9jayopZ3ByX21hbGxvY19hbGlnbmVkKAorICAgICAgZ19sb2cubnVtX2Jsb2NrcyAqIHNpemVvZihjbF9ibG9jayksIEdQUl9DQUNIRUxJTkVfU0laRV9MT0cpOworICBtZW1zZXQoZ19sb2cuYmxvY2tzLCAwLCBnX2xvZy5udW1fYmxvY2tzICogc2l6ZW9mKGNsX2Jsb2NrKSk7CisgIGdfbG9nLmJ1ZmZlciA9IGdwcl9tYWxsb2MoZ19sb2cubnVtX2Jsb2NrcyAqIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKTsKKyAgbWVtc2V0KGdfbG9nLmJ1ZmZlciwgMCwgZ19sb2cubnVtX2Jsb2NrcyAqIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKTsKKyAgY2xfYmxvY2tfbGlzdF9pbml0aWFsaXplKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QpOworICBjbF9ibG9ja19saXN0X2luaXRpYWxpemUoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QpOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZ19sb2cubnVtX2Jsb2NrczsgKytpKSB7CisgICAgY2xfYmxvY2sqIGJsb2NrID0gZ19sb2cuYmxvY2tzICsgaTsKKyAgICBjbF9ibG9ja19pbml0aWFsaXplKGJsb2NrLCBnX2xvZy5idWZmZXIgKyAoQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUgKiBpKSk7CisgICAgY2xfYmxvY2tfdHJ5X2Rpc2FibGVfYWNjZXNzKGJsb2NrLCAxIC8qIGRpc2NhcmQgZGF0YSAqLyk7CisgICAgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfdGFpbCgmZ19sb2cuZnJlZV9ibG9ja19saXN0LCBibG9jayk7CisgIH0KKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCwgMCk7CisgIGdfbG9nLmluaXRpYWxpemVkID0gMTsKK30KKwordm9pZCBjZW5zdXNfbG9nX3NodXRkb3duKHZvaWQpIHsKKyAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7CisgIGdwcl9tdV9kZXN0cm95KCZnX2xvZy5sb2NrKTsKKyAgZ3ByX2ZyZWVfYWxpZ25lZChnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrcyk7CisgIGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzID0gTlVMTDsKKyAgZ3ByX2ZyZWVfYWxpZ25lZChnX2xvZy5ibG9ja3MpOworICBnX2xvZy5ibG9ja3MgPSBOVUxMOworICBncHJfZnJlZShnX2xvZy5idWZmZXIpOworICBnX2xvZy5idWZmZXIgPSBOVUxMOworICBnX2xvZy5pbml0aWFsaXplZCA9IDA7Cit9CisKK3ZvaWQqIGNlbnN1c19sb2dfc3RhcnRfd3JpdGUoc2l6ZV90IHNpemUpIHsKKyAgLy8gVXNlZCB0byBib3VuZCBudW1iZXIgb2YgdGltZXMgYmxvY2sgYWxsb2NhdGlvbiBpcyBhdHRlbXB0ZWQuCisgIEdQUl9BU1NFUlQoc2l6ZSA+IDApOworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgaWYgKHNpemUgPiBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHVpbnQzMl90IGF0dGVtcHRzX3JlbWFpbmluZyA9IGdfbG9nLm51bV9ibG9ja3M7CisgIHVpbnQzMl90IGNvcmVfaWQgPSBncHJfY3B1X2N1cnJlbnRfY3B1KCk7CisgIGRvIHsKKyAgICB2b2lkKiByZWNvcmQgPSBOVUxMOworICAgIGNsX2Jsb2NrKiBibG9jayA9CisgICAgICAgIGNsX2NvcmVfbG9jYWxfYmxvY2tfZ2V0X2Jsb2NrKCZnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrc1tjb3JlX2lkXSk7CisgICAgaWYgKGJsb2NrICYmIChyZWNvcmQgPSBjbF9ibG9ja19zdGFydF93cml0ZShibG9jaywgc2l6ZSkpKSB7CisgICAgICByZXR1cm4gcmVjb3JkOworICAgIH0KKyAgICAvLyBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrLiBXZSBhcmUgaGVyZSBpZjoKKyAgICAvLyAtIE5vIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBPUgorICAgIC8vIC0gV3JpdGUgaW4tcHJvZ3Jlc3Mgb24gdGhlIGJsb2NrIE9SCisgICAgLy8gLSBibG9jayBpcyBvdXQgb2Ygc3BhY2UKKyAgICBncHJfbXVfbG9jaygmZ19sb2cubG9jayk7CisgICAgYm9vbCBhbGxvY2F0ZWQgPSBjbF9hbGxvY2F0ZV9jb3JlX2xvY2FsX2Jsb2NrKGNvcmVfaWQsIGJsb2NrKTsKKyAgICBncHJfbXVfdW5sb2NrKCZnX2xvZy5sb2NrKTsKKyAgICBpZiAoIWFsbG9jYXRlZCkgeworICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2ZldGNoX2FkZCgmZ19sb2cub3V0X29mX3NwYWNlX2NvdW50LCAxKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfSB3aGlsZSAoYXR0ZW1wdHNfcmVtYWluaW5nLS0pOworICAvLyBHaXZlIHVwLgorICBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZnX2xvZy5vdXRfb2Zfc3BhY2VfY291bnQsIDEpOworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBjZW5zdXNfbG9nX2VuZF93cml0ZSh2b2lkKiByZWNvcmQsIHNpemVfdCBieXRlc193cml0dGVuKSB7CisgIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOworICBjbF9ibG9ja19lbmRfd3JpdGUoY2xfZ2V0X2Jsb2NrKHJlY29yZCksIGJ5dGVzX3dyaXR0ZW4pOworfQorCit2b2lkIGNlbnN1c19sb2dfaW5pdF9yZWFkZXIodm9pZCkgeworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgZ3ByX211X2xvY2soJmdfbG9nLmxvY2spOworICAvLyBJZiBhIGJsb2NrIGlzIGxvY2tlZCBmb3IgcmVhZGluZyB1bmxvY2sgaXQuCisgIGlmIChnX2xvZy5ibG9ja19iZWluZ19yZWFkICE9IE5VTEwpIHsKKyAgICBjbF9ibG9ja19lbmRfcmVhZChnX2xvZy5ibG9ja19iZWluZ19yZWFkKTsKKyAgICBnX2xvZy5ibG9ja19iZWluZ19yZWFkID0gTlVMTDsKKyAgfQorICBnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlID0gZ19sb2cubnVtX2NvcmVzOworICBncHJfbXVfdW5sb2NrKCZnX2xvZy5sb2NrKTsKK30KKworY29uc3Qgdm9pZCogY2Vuc3VzX2xvZ19yZWFkX25leHQoc2l6ZV90KiBieXRlc19hdmFpbGFibGUpIHsKKyAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7CisgIGdwcl9tdV9sb2NrKCZnX2xvZy5sb2NrKTsKKyAgaWYgKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgIT0gTlVMTCkgeworICAgIGNsX2Jsb2NrX2VuZF9yZWFkKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQpOworICB9CisgIGRvIHsKKyAgICBnX2xvZy5ibG9ja19iZWluZ19yZWFkID0gY2xfbmV4dF9ibG9ja190b19yZWFkKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQpOworICAgIGlmIChnX2xvZy5ibG9ja19iZWluZ19yZWFkICE9IE5VTEwpIHsKKyAgICAgIHZvaWQqIHJlY29yZCA9CisgICAgICAgICAgY2xfYmxvY2tfc3RhcnRfcmVhZChnX2xvZy5ibG9ja19iZWluZ19yZWFkLCBieXRlc19hdmFpbGFibGUpOworICAgICAgaWYgKHJlY29yZCAhPSBOVUxMKSB7CisgICAgICAgIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOworICAgICAgICByZXR1cm4gcmVjb3JkOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCAhPSBOVUxMKTsKKyAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7CisgIHJldHVybiBOVUxMOworfQorCitzaXplX3QgY2Vuc3VzX2xvZ19yZW1haW5pbmdfc3BhY2Uodm9pZCkgeworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgc2l6ZV90IHNwYWNlID0gMDsKKyAgZ3ByX211X2xvY2soJmdfbG9nLmxvY2spOworICBpZiAoZ19sb2cuZGlzY2FyZF9vbGRfcmVjb3JkcykgeworICAgIC8vIFJlbWFpbmluZyBzcGFjZSBpcyBub3QgbWVhbmluZ2Z1bDsganVzdCByZXR1cm4gdGhlIGVudGlyZSBsb2cgc3BhY2UuCisgICAgc3BhY2UgPSBnX2xvZy5udW1fYmxvY2tzIDw8IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkU7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVChnX2xvZy5mcmVlX2Jsb2NrX2xpc3QuY291bnQgPj0gMCk7CisgICAgc3BhY2UgPSAoc2l6ZV90KWdfbG9nLmZyZWVfYmxvY2tfbGlzdC5jb3VudCAqIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFOworICB9CisgIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOworICByZXR1cm4gc3BhY2U7Cit9CisKK2ludDY0X3QgY2Vuc3VzX2xvZ19vdXRfb2Zfc3BhY2VfY291bnQodm9pZCkgeworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgcmV0dXJuIGdwcl9hdG1fYWNxX2xvYWQoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCBiL3NyYy9jb3JlL2xpYi9jZW5zdXMvbWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmRlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaApAQCAtMCwwICsxLDk1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKiBBIHZlcnkgZmFzdCBpbi1tZW1vcnkgbG9nLCBvcHRpbWl6ZWQgZm9yIG11bHRpcGxlIHdyaXRlcnMuICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DRU5TVVNfTUxPR19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0VOU1VTX01MT0dfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogTWF4aW11bSByZWNvcmQgc2l6ZSwgaW4gYnl0ZXMuICovCisjZGVmaW5lIENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUgMTQgLyogMl4xNCA9IDE2S0IgKi8KKyNkZWZpbmUgQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUgKDEgPDwgQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRSkKKworLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBsb2dnaW5nIHN1YnN5c3RlbSB3aXRoIHRoZSBnaXZlbiBsb2cgc2l6ZS4gQSBsb2cKKyAgIHNpemUgb2YgMCB3aWxsIHJlc3VsdCBpbiB0aGUgc21hbGxlc3QgcG9zc2libGUgbG9nIGZvciB0aGUgcGxhdGZvcm0KKyAgIChhcHByb3hpbWF0ZWx5IENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFICogZ3ByX2NwdV9udW1fY29yZXMoKSkuIElmCisgICBkaXNjYXJkX29sZF9yZWNvcmRzIGlzIG5vbi16ZXJvLCB0aGVuIG5ldyByZWNvcmRzIHdpbGwgZGlzcGxhY2Ugb2xkZXIgb25lcworICAgd2hlbiB0aGUgbG9nIGlzIGZ1bGwuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlcgorICAgY2Vuc3VzX2xvZyBmdW5jdGlvbnMuCisqLwordm9pZCBjZW5zdXNfbG9nX2luaXRpYWxpemUoc2l6ZV90IHNpemVfaW5fbWIsIGludCBkaXNjYXJkX29sZF9yZWNvcmRzKTsKKworLyogU2h1dGRvd24gdGhlIGxvZ2dpbmcgc3Vic3lzdGVtLiBDYWxsZXIgbXVzdCBlbnN1cmUgdGhhdDoKKyAgIC0gbm8gaW4gcHJvZ3Jlc3Mgb3IgZnV0dXJlIGNhbGwgdG8gYW55IGNlbnN1c19sb2cgZnVuY3Rpb25zCisgICAtIG5vIGluY29tcGxldGUgcmVjb3JkcworKi8KK3ZvaWQgY2Vuc3VzX2xvZ19zaHV0ZG93bih2b2lkKTsKKworLyogQWxsb2NhdGVzIGFuZCByZXR1cm5zIGEgJ3NpemUnIGJ5dGVzIHJlY29yZCBhbmQgbWFya3MgaXQgaW4gdXNlLiBBCisgICBzdWJzZXF1ZW50IGNlbnN1c19sb2dfZW5kX3dyaXRlKCkgbWFya3MgdGhlIHJlY29yZCBjb21wbGV0ZS4gVGhlCisgICAnYnl0ZXNfd3JpdHRlbicgY2Vuc3VzX2xvZ19lbmRfd3JpdGUoKSBhcmd1bWVudCBtdXN0IGJlIDw9CisgICAnc2l6ZScuIFJldHVybnMgTlVMTCBpZiBvdXQtb2Ytc3BhY2UgQU5EOgorICAgICAgIC0gbG9nIGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBvbGQgcmVjb3JkcyBPUgorICAgICAgIC0gYWxsIGJsb2NrcyBhcmUgcGlubmVkIGJ5IGluY29tcGxldGUgcmVjb3Jkcy4KKyovCit2b2lkKiBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKHNpemVfdCBzaXplKTsKKwordm9pZCBjZW5zdXNfbG9nX2VuZF93cml0ZSh2b2lkKiByZWNvcmQsIHNpemVfdCBieXRlc193cml0dGVuKTsKKwordm9pZCBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKHZvaWQpOworCisvKiBjZW5zdXNfbG9nX3JlYWRfbmV4dCgpIGl0ZXJhdGVzIG92ZXIgYmxvY2tzIHdpdGggZGF0YSBhbmQgZm9yIGVhY2ggYmxvY2sKKyAgIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCB1bnJlYWQgYnl0ZS4gVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZQorICAgcmVhZCBhcmUgcmV0dXJuZWQgaW4gJ2J5dGVzX2F2YWlsYWJsZScuIFJlYWRlciBpcyBleHBlY3RlZCB0byByZWFkIGFsbAorICAgYXZhaWxhYmxlIGRhdGEuIFJlYWRpbmcgdGhlIGRhdGEgY29uc3VtZXMgaXQgaS5lLiBpdCBjYW5ub3QgYmUgcmVhZCBhZ2Fpbi4KKyAgIGNlbnN1c19sb2dfcmVhZF9uZXh0KCkgcmV0dXJucyBOVUxMIGlmIHRoZSBlbmQgaXMgcmVhY2hlZCBpLmUgbGFzdCBibG9jaworICAgaXMgcmVhZC4gY2Vuc3VzX2xvZ19pbml0X3JlYWRlcigpIHN0YXJ0cyB0aGUgaXRlcmF0aW9uIG9yIGFib3J0cyB0aGUKKyAgIGN1cnJlbnQgaXRlcmF0aW9uLgorKi8KK2NvbnN0IHZvaWQqIGNlbnN1c19sb2dfcmVhZF9uZXh0KHNpemVfdCogYnl0ZXNfYXZhaWxhYmxlKTsKKworLyogUmV0dXJucyBlc3RpbWF0ZWQgcmVtYWluaW5nIHNwYWNlIGFjcm9zcyBhbGwgYmxvY2tzLCBpbiBieXRlcy4gSWYgbG9nIGlzCisgICBjb25maWd1cmVkIHRvIGRpc2NhcmQgb2xkIHJlY29yZHMsIHJldHVybnMgdG90YWwgbG9nIHNwYWNlLiBPdGhlcndpc2UsCisgICByZXR1cm5zIHNwYWNlIGF2YWlsYWJsZSBpbiBlbXB0eSBibG9ja3MgKHBhcnRpYWxseSBmaWxsZWQgYmxvY2tzIGFyZQorICAgdHJlYXRlZCBhcyBmdWxsKS4KKyovCitzaXplX3QgY2Vuc3VzX2xvZ19yZW1haW5pbmdfc3BhY2Uodm9pZCk7CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiB0aW1lcyBncHJjX3N0YXRzX2xvZ19zdGFydF93cml0ZSgpIGZhaWxlZCBkdWUgdG8KKyAgIG91dC1vZi1zcGFjZS4gKi8KK2ludDY0X3QgY2Vuc3VzX2xvZ19vdXRfb2Zfc3BhY2VfY291bnQodm9pZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NFTlNVU19NTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jZW5zdXMvb3BlcmF0aW9uLmMgYi9zcmMvY29yZS9saWIvY2Vuc3VzL29wZXJhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNWY5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL29wZXJhdGlvbi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvY2Vuc3VzLmg+CisKKy8qIFRPRE8oYXZlaXRjaCk6IFRoZXNlIGFyZSBhbGwgcGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb25zLiAqLworCitjZW5zdXNfdGltZXN0YW1wIGNlbnN1c19zdGFydF9ycGNfb3BfdGltZXN0YW1wKHZvaWQpIHsKKyAgY2Vuc3VzX3RpbWVzdGFtcCBjdDsKKyAgLyogVE9ETyhhdmVpdGNoKTogYXNzdW1lcyBncHJfdGltZXNwZWMgaW1wbGVtZW50YXRpb24gb2YgY2Vuc3VzX3RpbWVzdGFtcC4gKi8KKyAgY3QudHMgPSBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpOworICByZXR1cm4gY3Q7Cit9CisKK2NlbnN1c19jb250ZXh0ICpjZW5zdXNfc3RhcnRfY2xpZW50X3JwY19vcCgKKyAgICBjb25zdCBjZW5zdXNfY29udGV4dCAqY29udGV4dCwgaW50NjRfdCBycGNfbmFtZV9pZCwKKyAgICBjb25zdCBjZW5zdXNfcnBjX25hbWVfaW5mbyAqcnBjX25hbWVfaW5mbywgY29uc3QgY2hhciAqcGVlciwgaW50IHRyYWNlX21hc2ssCisgICAgY29uc3QgY2Vuc3VzX3RpbWVzdGFtcCAqc3RhcnRfdGltZSkgeworICByZXR1cm4gTlVMTDsKK30KKworY2Vuc3VzX2NvbnRleHQgKmNlbnN1c19zdGFydF9zZXJ2ZXJfcnBjX29wKAorICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50NjRfdCBycGNfbmFtZV9pZCwKKyAgICBjb25zdCBjZW5zdXNfcnBjX25hbWVfaW5mbyAqcnBjX25hbWVfaW5mbywgY29uc3QgY2hhciAqcGVlciwgaW50IHRyYWNlX21hc2ssCisgICAgY2Vuc3VzX3RpbWVzdGFtcCAqc3RhcnRfdGltZSkgeworICByZXR1cm4gTlVMTDsKK30KKworY2Vuc3VzX2NvbnRleHQgKmNlbnN1c19zdGFydF9vcChjZW5zdXNfY29udGV4dCAqY29udGV4dCwgY29uc3QgY2hhciAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgdHJhY2VfbWFzaykgeworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBjZW5zdXNfZW5kX29wKGNlbnN1c19jb250ZXh0ICpjb250ZXh0LCBpbnQgc3RhdHVzKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIGIvc3JjL2NvcmUvbGliL2NlbnN1cy9wbGFjZWhvbGRlcnMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jCnJlbmFtZSB0byBzcmMvY29yZS9saWIvY2Vuc3VzL3BsYWNlaG9sZGVycy5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCBiL3NyYy9jb3JlL2xpYi9jZW5zdXMvcnBjX21ldHJpY19pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDA1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaApAQCAtMCwwICsxLDUxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0VOU1VTX1JQQ19NRVRSSUNfSURfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NFTlNVU19SUENfTUVUUklDX0lEX0gKKworLyogTWV0cmljIElEJ3MgdXNlZCBmb3IgUlBDIG1lYXN1cmVtZW50cy4gKi8KKy8qIENvdW50IG9mIGNsaWVudCByZXF1ZXN0cyBzZW50LiAqLworI2RlZmluZSBDRU5TVVNfTUVUUklDX1JQQ19DTElFTlRfUkVRVUVTVFMgKCh1aW50MzJfdCkwKQorLyogQ291bnQgb2Ygc2VydmVyIHJlcXVlc3RzIHNlbnQuICovCisjZGVmaW5lIENFTlNVU19NRVRSSUNfUlBDX1NFUlZFUl9SRVFVRVNUUyAoKHVpbnQzMl90KTEpCisvKiBDbGllbnQgZXJyb3IgY291bnRzLiAqLworI2RlZmluZSBDRU5TVVNfTUVUUklDX1JQQ19DTElFTlRfRVJST1JTICgodWludDMyX3QpMikKKy8qIFNlcnZlciBlcnJvciBjb3VudHMuICovCisjZGVmaW5lIENFTlNVU19NRVRSSUNfUlBDX1NFUlZFUl9FUlJPUlMgKCh1aW50MzJfdCkzKQorLyogQ2xpZW50IHNpZGUgcmVxdWVzdCBsYXRlbmN5LiAqLworI2RlZmluZSBDRU5TVVNfTUVUUklDX1JQQ19DTElFTlRfTEFURU5DWSAoKHVpbnQzMl90KTQpCisvKiBTZXJ2ZXIgc2lkZSByZXF1ZXN0IGxhdGVuY3kuICovCisjZGVmaW5lIENFTlNVU19NRVRSSUNfUlBDX1NFUlZFUl9MQVRFTkNZICgodWludDMyX3QpNSkKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0VOU1VTX1JQQ19NRVRSSUNfSURfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMgYi9zcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTA4OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NlbnN1cy90cmFjaW5nLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvY2Vuc3VzLmg+CisKKy8qIFRPRE8oYXZlaXRjaCk6IFRoZXNlIGFyZSBhbGwgcGxhY2Vob2xkZXIgaW1wbGVtZW50YXRpb25zLiAqLworCitpbnQgY2Vuc3VzX3RyYWNlX21hc2soY29uc3QgY2Vuc3VzX2NvbnRleHQgKmNvbnRleHQpIHsKKyAgcmV0dXJuIENFTlNVU19UUkFDRV9NQVNLX05PTkU7Cit9CisKK3ZvaWQgY2Vuc3VzX3NldF90cmFjZV9tYXNrKGludCB0cmFjZV9tYXNrKSB7fQorCit2b2lkIGNlbnN1c190cmFjZV9wcmludChjZW5zdXNfY29udGV4dCAqY29udGV4dCwgdWludDMyX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG4pIHt9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDJmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCisjaW5jbHVkZSA8Z3JwYy9jZW5zdXMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBncnBjX2FyZyBjb3B5X2FyZyhjb25zdCBncnBjX2FyZyAqc3JjKSB7CisgIGdycGNfYXJnIGRzdDsKKyAgZHN0LnR5cGUgPSBzcmMtPnR5cGU7CisgIGRzdC5rZXkgPSBncHJfc3RyZHVwKHNyYy0+a2V5KTsKKyAgc3dpdGNoIChkc3QudHlwZSkgeworICAgIGNhc2UgR1JQQ19BUkdfU1RSSU5HOgorICAgICAgZHN0LnZhbHVlLnN0cmluZyA9IGdwcl9zdHJkdXAoc3JjLT52YWx1ZS5zdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHUlBDX0FSR19JTlRFR0VSOgorICAgICAgZHN0LnZhbHVlLmludGVnZXIgPSBzcmMtPnZhbHVlLmludGVnZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdSUENfQVJHX1BPSU5URVI6CisgICAgICBkc3QudmFsdWUucG9pbnRlciA9IHNyYy0+dmFsdWUucG9pbnRlcjsKKyAgICAgIGRzdC52YWx1ZS5wb2ludGVyLnAgPQorICAgICAgICAgIHNyYy0+dmFsdWUucG9pbnRlci52dGFibGUtPmNvcHkoc3JjLT52YWx1ZS5wb2ludGVyLnApOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGRzdDsKK30KKworZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX2NvcHlfYW5kX2FkZChjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2FyZyAqdG9fYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3RvX2FkZCkgeworICBncnBjX2NoYW5uZWxfYXJncyAqZHN0ID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jaGFubmVsX2FyZ3MpKTsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCBzcmNfbnVtX2FyZ3MgPSAoc3JjID09IE5VTEwpID8gMCA6IHNyYy0+bnVtX2FyZ3M7CisgIGlmICghc3JjICYmICF0b19hZGQpIHsKKyAgICBkc3QtPm51bV9hcmdzID0gMDsKKyAgICBkc3QtPmFyZ3MgPSBOVUxMOworICAgIHJldHVybiBkc3Q7CisgIH0KKyAgZHN0LT5udW1fYXJncyA9IHNyY19udW1fYXJncyArIG51bV90b19hZGQ7CisgIGRzdC0+YXJncyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfYXJnKSAqIGRzdC0+bnVtX2FyZ3MpOworICBmb3IgKGkgPSAwOyBpIDwgc3JjX251bV9hcmdzOyBpKyspIHsKKyAgICBkc3QtPmFyZ3NbaV0gPSBjb3B5X2FyZygmc3JjLT5hcmdzW2ldKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RvX2FkZDsgaSsrKSB7CisgICAgZHN0LT5hcmdzW2kgKyBzcmNfbnVtX2FyZ3NdID0gY29weV9hcmcoJnRvX2FkZFtpXSk7CisgIH0KKyAgcmV0dXJuIGRzdDsKK30KKworZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX2NvcHkoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKnNyYykgeworICByZXR1cm4gZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKHNyYywgTlVMTCwgMCk7Cit9CisKK2dycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19tZXJnZShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYikgeworICByZXR1cm4gZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKGEsIGItPmFyZ3MsIGItPm51bV9hcmdzKTsKK30KKworc3RhdGljIGludCBjbXBfYXJnKGNvbnN0IGdycGNfYXJnICphLCBjb25zdCBncnBjX2FyZyAqYikgeworICBpbnQgYyA9IEdQUl9JQ01QKGEtPnR5cGUsIGItPnR5cGUpOworICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKKyAgYyA9IHN0cmNtcChhLT5rZXksIGItPmtleSk7CisgIGlmIChjICE9IDApIHJldHVybiBjOworICBzd2l0Y2ggKGEtPnR5cGUpIHsKKyAgICBjYXNlIEdSUENfQVJHX1NUUklORzoKKyAgICAgIHJldHVybiBzdHJjbXAoYS0+dmFsdWUuc3RyaW5nLCBiLT52YWx1ZS5zdHJpbmcpOworICAgIGNhc2UgR1JQQ19BUkdfSU5URUdFUjoKKyAgICAgIHJldHVybiBHUFJfSUNNUChhLT52YWx1ZS5pbnRlZ2VyLCBiLT52YWx1ZS5pbnRlZ2VyKTsKKyAgICBjYXNlIEdSUENfQVJHX1BPSU5URVI6CisgICAgICBjID0gR1BSX0lDTVAoYS0+dmFsdWUucG9pbnRlci5wLCBiLT52YWx1ZS5wb2ludGVyLnApOworICAgICAgaWYgKGMgIT0gMCkgeworICAgICAgICBjID0gR1BSX0lDTVAoYS0+dmFsdWUucG9pbnRlci52dGFibGUsIGItPnZhbHVlLnBvaW50ZXIudnRhYmxlKTsKKyAgICAgICAgaWYgKGMgPT0gMCkgeworICAgICAgICAgIGMgPSBhLT52YWx1ZS5wb2ludGVyLnZ0YWJsZS0+Y21wKGEtPnZhbHVlLnBvaW50ZXIucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT52YWx1ZS5wb2ludGVyLnApOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gYzsKKyAgfQorICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Cit9CisKKy8qIHN0YWJpbGl6aW5nIGNvbXBhcmlzb24gZnVuY3Rpb246IHNpbmNlIGNoYW5uZWxfYXJncyBvcmRlcmluZyBtYXR0ZXJzIGZvcgorICoga2V5cyB3aXRoIHRoZSBzYW1lIG5hbWUsIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBvcmRlcmluZyAqLworc3RhdGljIGludCBjbXBfa2V5X3N0YWJsZShjb25zdCB2b2lkICphcCwgY29uc3Qgdm9pZCAqYnApIHsKKyAgY29uc3QgZ3JwY19hcmcgKmNvbnN0ICphID0gYXA7CisgIGNvbnN0IGdycGNfYXJnICpjb25zdCAqYiA9IGJwOworICBpbnQgYyA9IHN0cmNtcCgoKmEpLT5rZXksICgqYiktPmtleSk7CisgIGlmIChjID09IDApIGMgPSBHUFJfSUNNUCgqYSwgKmIpOworICByZXR1cm4gYzsKK30KKworZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX25vcm1hbGl6ZShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSkgeworICBncnBjX2FyZyAqKmFyZ3MgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2FyZyAqKSAqIGEtPm51bV9hcmdzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhLT5udW1fYXJnczsgaSsrKSB7CisgICAgYXJnc1tpXSA9ICZhLT5hcmdzW2ldOworICB9CisgIHFzb3J0KGFyZ3MsIGEtPm51bV9hcmdzLCBzaXplb2YoZ3JwY19hcmcgKiksIGNtcF9rZXlfc3RhYmxlKTsKKworICBncnBjX2NoYW5uZWxfYXJncyAqYiA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY2hhbm5lbF9hcmdzKSk7CisgIGItPm51bV9hcmdzID0gYS0+bnVtX2FyZ3M7CisgIGItPmFyZ3MgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2FyZykgKiBiLT5udW1fYXJncyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYS0+bnVtX2FyZ3M7IGkrKykgeworICAgIGItPmFyZ3NbaV0gPSBjb3B5X2FyZyhhcmdzW2ldKTsKKyAgfQorCisgIGdwcl9mcmVlKGFyZ3MpOworICByZXR1cm4gYjsKK30KKwordm9pZCBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGdycGNfY2hhbm5lbF9hcmdzICphKSB7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgYS0+bnVtX2FyZ3M7IGkrKykgeworICAgIHN3aXRjaCAoYS0+YXJnc1tpXS50eXBlKSB7CisgICAgICBjYXNlIEdSUENfQVJHX1NUUklORzoKKyAgICAgICAgZ3ByX2ZyZWUoYS0+YXJnc1tpXS52YWx1ZS5zdHJpbmcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19BUkdfSU5URUdFUjoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfQVJHX1BPSU5URVI6CisgICAgICAgIGEtPmFyZ3NbaV0udmFsdWUucG9pbnRlci52dGFibGUtPmRlc3Ryb3koYS0+YXJnc1tpXS52YWx1ZS5wb2ludGVyLnApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZ3ByX2ZyZWUoYS0+YXJnc1tpXS5rZXkpOworICB9CisgIGdwcl9mcmVlKGEtPmFyZ3MpOworICBncHJfZnJlZShhKTsKK30KKworaW50IGdycGNfY2hhbm5lbF9hcmdzX2lzX2NlbnN1c19lbmFibGVkKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphKSB7CisgIHNpemVfdCBpOworICBpZiAoYSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgZm9yIChpID0gMDsgaSA8IGEtPm51bV9hcmdzOyBpKyspIHsKKyAgICBpZiAoMCA9PSBzdHJjbXAoYS0+YXJnc1tpXS5rZXksIEdSUENfQVJHX0VOQUJMRV9DRU5TVVMpKSB7CisgICAgICByZXR1cm4gYS0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyICE9IDAgJiYgY2Vuc3VzX2VuYWJsZWQoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNlbnN1c19lbmFibGVkKCk7Cit9CisKK2dycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY2hhbm5lbF9hcmdzX2dldF9jb21wcmVzc2lvbl9hbGdvcml0aG0oCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEpIHsKKyAgc2l6ZV90IGk7CisgIGlmIChhID09IE5VTEwpIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgYS0+bnVtX2FyZ3M7ICsraSkgeworICAgIGlmIChhLT5hcmdzW2ldLnR5cGUgPT0gR1JQQ19BUkdfSU5URUdFUiAmJgorICAgICAgICAhc3RyY21wKEdSUENfQ09NUFJFU1NJT05fQUxHT1JJVEhNX0FSRywgYS0+YXJnc1tpXS5rZXkpKSB7CisgICAgICByZXR1cm4gKGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtKWEtPmFyZ3NbaV0udmFsdWUuaW50ZWdlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gR1JQQ19DT01QUkVTU19OT05FOworfQorCitncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3Nfc2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKKyAgICBncnBjX2NoYW5uZWxfYXJncyAqYSwgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtKSB7CisgIGdycGNfYXJnIHRtcDsKKyAgdG1wLnR5cGUgPSBHUlBDX0FSR19JTlRFR0VSOworICB0bXAua2V5ID0gR1JQQ19DT01QUkVTU0lPTl9BTEdPUklUSE1fQVJHOworICB0bXAudmFsdWUuaW50ZWdlciA9IGFsZ29yaXRobTsKKyAgcmV0dXJuIGdycGNfY2hhbm5lbF9hcmdzX2NvcHlfYW5kX2FkZChhLCAmdG1wLCAxKTsKK30KKworLyoqIFJldHVybnMgMSBpZiB0aGUgYXJndW1lbnQgZm9yIGNvbXByZXNzaW9uIGFsZ29yaXRobSdzIGVuYWJsZWQgc3RhdGVzIGJpdHNldAorICogd2FzIGZvdW5kIGluIFxhIGEsIHJldHVybmluZyB0aGUgYXJnJ3MgdmFsdWUgaW4gXGEgc3RhdGVzLiBPdGhlcndpc2UsIHJldHVybnMKKyAqIDAuICovCitzdGF0aWMgaW50IGZpbmRfY29tcHJlc3Npb25fYWxnb3JpdGhtX3N0YXRlc19iaXRzZXQoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICoqc3RhdGVzX2FyZykgeworICBpZiAoYSAhPSBOVUxMKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGEtPm51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChhLT5hcmdzW2ldLnR5cGUgPT0gR1JQQ19BUkdfSU5URUdFUiAmJgorICAgICAgICAgICFzdHJjbXAoR1JQQ19DT01QUkVTU0lPTl9BTEdPUklUSE1fU1RBVEVfQVJHLCBhLT5hcmdzW2ldLmtleSkpIHsKKyAgICAgICAgKnN0YXRlc19hcmcgPSAmYS0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyOworICAgICAgICByZXR1cm4gMTsgLyogR1BSX1RSVUUgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7IC8qIEdQUl9GQUxTRSAqLworfQorCitncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29tcHJlc3Npb25fYWxnb3JpdGhtX3NldF9zdGF0ZSgKKyAgICBncnBjX2NoYW5uZWxfYXJncyAqKmEsIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSwgaW50IHN0YXRlKSB7CisgIGludCAqc3RhdGVzX2FyZzsKKyAgZ3JwY19jaGFubmVsX2FyZ3MgKnJlc3VsdCA9ICphOworICBjb25zdCBpbnQgc3RhdGVzX2FyZ19mb3VuZCA9CisgICAgICBmaW5kX2NvbXByZXNzaW9uX2FsZ29yaXRobV9zdGF0ZXNfYml0c2V0KCphLCAmc3RhdGVzX2FyZyk7CisKKyAgaWYgKHN0YXRlc19hcmdfZm91bmQpIHsKKyAgICBpZiAoc3RhdGUgIT0gMCkgeworICAgICAgR1BSX0JJVFNFVCgodW5zaWduZWQgKilzdGF0ZXNfYXJnLCBhbGdvcml0aG0pOworICAgIH0gZWxzZSB7CisgICAgICBHUFJfQklUQ0xFQVIoKHVuc2lnbmVkICopc3RhdGVzX2FyZywgYWxnb3JpdGhtKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogY3JlYXRlIGEgbmV3IGFyZyAqLworICAgIGdycGNfYXJnIHRtcDsKKyAgICB0bXAudHlwZSA9IEdSUENfQVJHX0lOVEVHRVI7CisgICAgdG1wLmtleSA9IEdSUENfQ09NUFJFU1NJT05fQUxHT1JJVEhNX1NUQVRFX0FSRzsKKyAgICAvKiBhbGwgZW5hYmxlZCBieSBkZWZhdWx0ICovCisgICAgdG1wLnZhbHVlLmludGVnZXIgPSAoMXUgPDwgR1JQQ19DT01QUkVTU19BTEdPUklUSE1TX0NPVU5UKSAtIDE7CisgICAgaWYgKHN0YXRlICE9IDApIHsKKyAgICAgIEdQUl9CSVRTRVQoKHVuc2lnbmVkICopJnRtcC52YWx1ZS5pbnRlZ2VyLCBhbGdvcml0aG0pOworICAgIH0gZWxzZSB7CisgICAgICBHUFJfQklUQ0xFQVIoKHVuc2lnbmVkICopJnRtcC52YWx1ZS5pbnRlZ2VyLCBhbGdvcml0aG0pOworICAgIH0KKyAgICByZXN1bHQgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5X2FuZF9hZGQoKmEsICZ0bXAsIDEpOworICAgIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koKmEpOworICAgICphID0gcmVzdWx0OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBncnBjX2NoYW5uZWxfYXJnc19jb21wcmVzc2lvbl9hbGdvcml0aG1fZ2V0X3N0YXRlcygKKyAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSkgeworICBpbnQgKnN0YXRlc19hcmc7CisgIGlmIChmaW5kX2NvbXByZXNzaW9uX2FsZ29yaXRobV9zdGF0ZXNfYml0c2V0KGEsICZzdGF0ZXNfYXJnKSkgeworICAgIHJldHVybiAqc3RhdGVzX2FyZzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKDF1IDw8IEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVCkgLSAxOyAvKiBBbGwgYWxncy4gZW5hYmxlZCAqLworICB9Cit9CisKK2ludCBncnBjX2NoYW5uZWxfYXJnc19jb21wYXJlKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmIpIHsKKyAgaW50IGMgPSBHUFJfSUNNUChhLT5udW1fYXJncywgYi0+bnVtX2FyZ3MpOworICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhLT5udW1fYXJnczsgaSsrKSB7CisgICAgYyA9IGNtcF9hcmcoJmEtPmFyZ3NbaV0sICZiLT5hcmdzW2ldKTsKKyAgICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMjAyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0NIQU5ORUxfQVJHU19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9DSEFOTkVMX0FSR1NfSAorCisjaW5jbHVkZSA8Z3JwYy9jb21wcmVzc2lvbi5oPgorI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorCisvKiogQ29weSB0aGUgYXJndW1lbnRzIGluIFxhIHNyYyBpbnRvIGEgbmV3IGluc3RhbmNlICovCitncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29weShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqc3JjKTsKKworLyoqIENvcHkgdGhlIGFyZ3VtZW50cyBpbiBcYSBzcmMgaW50byBhIG5ldyBpbnN0YW5jZSwgc3RhYmx5IHNvcnRpbmcga2V5cyAqLworZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9hcmdzX25vcm1hbGl6ZShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqc3JjKTsKKworLyoqIENvcHkgdGhlIGFyZ3VtZW50cyBpbiBcYSBzcmMgYW5kIGFwcGVuZCBcYSB0b19hZGQuIElmIFxhIHRvX2FkZCBpcyBOVUxMLCBpdAorICogaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIFxhIGdycGNfY2hhbm5lbF9hcmdzX2NvcHkuICovCitncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfYXJnICp0b19hZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fdG9fYWRkKTsKKworLyoqIENvbmNhdGVuYXRlIGFyZ3MgZnJvbSBcYSBhIGFuZCBcYSBiIGludG8gYSBuZXcgaW5zdGFuY2UgKi8KK2dycGNfY2hhbm5lbF9hcmdzICpncnBjX2NoYW5uZWxfYXJnc19tZXJnZShjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYik7CisKKy8qKiBEZXN0cm95IGFyZ3VtZW50cyBjcmVhdGVkIGJ5IFxhIGdycGNfY2hhbm5lbF9hcmdzX2NvcHkgKi8KK3ZvaWQgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShncnBjX2NoYW5uZWxfYXJncyAqYSk7CisKKy8qKiBSZWFkcyBjZW5zdXNfZW5hYmxlZCBzZXR0aW5ncyBmcm9tIGNoYW5uZWwgYXJncy4gUmV0dXJucyAxIGlmIGNlbnN1c19lbmFibGVkCisgKiBpcyBzcGVjaWZpZWQgaW4gY2hhbm5lbCBhcmdzLCBvdGhlcndpc2UgcmV0dXJucyAwLiAqLworaW50IGdycGNfY2hhbm5lbF9hcmdzX2lzX2NlbnN1c19lbmFibGVkKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphKTsKKworLyoqIFJldHVybnMgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBzZXQgaW4gXGEgYS4gKi8KK2dycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY2hhbm5lbF9hcmdzX2dldF9jb21wcmVzc2lvbl9hbGdvcml0aG0oCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEpOworCisvKiogUmV0dXJucyBhIGNoYW5uZWwgYXJnIGluc3RhbmNlIHdpdGggY29tcHJlc3Npb24gZW5hYmxlZC4gSWYgXGEgYSBpcworICogbm9uLU5VTEwsIGl0cyBhcmdzIGFyZSBjb3BpZWQuIE4uQi4gR1JQQ19DT01QUkVTU19OT05FIGRpc2FibGVzIGNvbXByZXNzaW9uCisgKiBmb3IgdGhlIGNoYW5uZWwuICovCitncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3Nfc2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKKyAgICBncnBjX2NoYW5uZWxfYXJncyAqYSwgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtKTsKKworLyoqIFNldHMgdGhlIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBjb21wcmVzc2lvbiBhbGdvcml0aG0uIEJ5IGRlZmF1bHQsIGFsbAorICogY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhcmUgZW5hYmxlZC4gSXQncyBhbiBlcnJvciB0byBkaXNhYmxlIGFuIGFsZ29yaXRobSBzZXQKKyAqIGJ5IGdycGNfY2hhbm5lbF9hcmdzX3NldF9jb21wcmVzc2lvbl9hbGdvcml0aG0uCisgKgorICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSB1cGRhdGVkIGFsZ29yaXRobSBzdGF0ZXMuIFRoZSBcYSBhIHBvaW50ZXIgaXMKKyAqIG1vZGlmaWVkIHRvIHBvaW50IHRvIHRoZSByZXR1cm5lZCBpbnN0YW5jZSAod2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZQorICogaW5wdXQgdmFsdWUgb2YgXGEgYSkuICovCitncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX2FyZ3NfY29tcHJlc3Npb25fYWxnb3JpdGhtX3NldF9zdGF0ZSgKKyAgICBncnBjX2NoYW5uZWxfYXJncyAqKmEsIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSwgaW50IGVuYWJsZWQpOworCisvKiogUmV0dXJucyB0aGUgYml0c2V0IHJlcHJlc2VudGluZyB0aGUgc3VwcG9ydCBzdGF0ZSAodHJ1ZSBmb3IgZW5hYmxlZCwgZmFsc2UKKyAqIGZvciBkaXNhYmxlZCkgZm9yIGNvbXByZXNzaW9uIGFsZ29yaXRobXMuCisgKgorICogVGhlIGktdGggYml0IG9mIHRoZSByZXR1cm5lZCBiaXRzZXQgY29ycmVzcG9uZHMgdG8gdGhlIGktdGggZW50cnkgaW4gdGhlCisgKiBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBlbnVtLiAqLworaW50IGdycGNfY2hhbm5lbF9hcmdzX2NvbXByZXNzaW9uX2FsZ29yaXRobV9nZXRfc3RhdGVzKAorICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphKTsKKworaW50IGdycGNfY2hhbm5lbF9hcmdzX2NvbXBhcmUoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYik7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ0hBTk5FTF9BUkdTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI4M2UzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgZ3JwY190cmFjZV9jaGFubmVsID0gMDsKKworLyogTWVtb3J5IGxheW91dHMuCisKKyAgIENoYW5uZWwgc3RhY2sgaXMgbGFpZCBvdXQgYXM6IHsKKyAgICAgZ3JwY19jaGFubmVsX3N0YWNrIHN0azsKKyAgICAgcGFkZGluZyB0byBHUFJfTUFYX0FMSUdOTUVOVAorICAgICBncnBjX2NoYW5uZWxfZWxlbWVudFtzdGsuY291bnRdOworICAgICBwZXItZmlsdGVyIG1lbW9yeSwgYWxpZ25lZCB0byBHUFJfTUFYX0FMSUdOTUVOVAorICAgfQorCisgICBDYWxsIHN0YWNrIGlzIGxhaWQgb3V0IGFzOiB7CisgICAgIGdycGNfY2FsbF9zdGFjayBzdGs7CisgICAgIHBhZGRpbmcgdG8gR1BSX01BWF9BTElHTk1FTlQKKyAgICAgZ3JwY19jYWxsX2VsZW1lbnRbc3RrLmNvdW50XTsKKyAgICAgcGVyLWZpbHRlciBtZW1vcnksIGFsaWduZWQgdG8gR1BSX01BWF9BTElHTk1FTlQKKyAgIH0gKi8KKworLyogR2l2ZW4gYSBzaXplLCByb3VuZCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiBzaXplb2Yodm9pZCopICovCisjZGVmaW5lIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKHgpIFwKKyAgKCgoeCkgKyBHUFJfTUFYX0FMSUdOTUVOVCAtIDF1KSAmIH4oR1BSX01BWF9BTElHTk1FTlQgLSAxdSkpCisKK3NpemVfdCBncnBjX2NoYW5uZWxfc3RhY2tfc2l6ZShjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICoqZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmlsdGVyX2NvdW50KSB7CisgIC8qIGFsd2F5cyBuZWVkIHRoZSBoZWFkZXIsIGFuZCBzaXplIGZvciB0aGUgY2hhbm5lbCBlbGVtZW50cyAqLworICBzaXplX3Qgc2l6ZSA9CisgICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShzaXplb2YoZ3JwY19jaGFubmVsX3N0YWNrKSkgKworICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoZmlsdGVyX2NvdW50ICogc2l6ZW9mKGdycGNfY2hhbm5lbF9lbGVtZW50KSk7CisgIHNpemVfdCBpOworCisgIEdQUl9BU1NFUlQoKEdQUl9NQVhfQUxJR05NRU5UICYgKEdQUl9NQVhfQUxJR05NRU5UIC0gMSkpID09IDAgJiYKKyAgICAgICAgICAgICAiR1BSX01BWF9BTElHTk1FTlQgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byIpOworCisgIC8qIGFkZCB0aGUgc2l6ZSBmb3IgZWFjaCBmaWx0ZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZpbHRlcl9jb3VudDsgaSsrKSB7CisgICAgc2l6ZSArPSBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShmaWx0ZXJzW2ldLT5zaXplb2ZfY2hhbm5lbF9kYXRhKTsKKyAgfQorCisgIHJldHVybiBzaXplOworfQorCisjZGVmaW5lIENIQU5ORUxfRUxFTVNfRlJPTV9TVEFDSyhzdGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoZ3JwY19jaGFubmVsX2VsZW1lbnQgKikoKGNoYXIgKikoc3RrKSArIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ3JwY19jaGFubmVsX3N0YWNrKSkpKQorCisjZGVmaW5lIENBTExfRUxFTVNfRlJPTV9TVEFDSyhzdGspICAgICAgIFwKKyAgKChncnBjX2NhbGxfZWxlbWVudCAqKSgoY2hhciAqKShzdGspICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKHNpemVvZihncnBjX2NhbGxfc3RhY2spKSkpCisKK2dycGNfY2hhbm5lbF9lbGVtZW50ICpncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudCgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2ssIHNpemVfdCBpbmRleCkgeworICByZXR1cm4gQ0hBTk5FTF9FTEVNU19GUk9NX1NUQUNLKGNoYW5uZWxfc3RhY2spICsgaW5kZXg7Cit9CisKK2dycGNfY2hhbm5lbF9lbGVtZW50ICpncnBjX2NoYW5uZWxfc3RhY2tfbGFzdF9lbGVtZW50KAorICAgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjaykgeworICByZXR1cm4gZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoY2hhbm5lbF9zdGFjaywgY2hhbm5lbF9zdGFjay0+Y291bnQgLSAxKTsKK30KKworZ3JwY19jYWxsX2VsZW1lbnQgKmdycGNfY2FsbF9zdGFja19lbGVtZW50KGdycGNfY2FsbF9zdGFjayAqY2FsbF9zdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5kZXgpIHsKKyAgcmV0dXJuIENBTExfRUxFTVNfRlJPTV9TVEFDSyhjYWxsX3N0YWNrKSArIGluZGV4OworfQorCit2b2lkIGdycGNfY2hhbm5lbF9zdGFja19pbml0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBpbnQgaW5pdGlhbF9yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwgdm9pZCAqZGVzdHJveV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmlsdGVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqY2hhbm5lbF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBncnBjX2NoYW5uZWxfc3RhY2sgKnN0YWNrKSB7CisgIHNpemVfdCBjYWxsX3NpemUgPQorICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoc2l6ZW9mKGdycGNfY2FsbF9zdGFjaykpICsKKyAgICAgIFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKGZpbHRlcl9jb3VudCAqIHNpemVvZihncnBjX2NhbGxfZWxlbWVudCkpOworICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbXM7CisgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgYXJnczsKKyAgY2hhciAqdXNlcl9kYXRhOworICBzaXplX3QgaTsKKworICBzdGFjay0+Y291bnQgPSBmaWx0ZXJfY291bnQ7CisgIEdSUENfU1RSRUFNX1JFRl9JTklUKCZzdGFjay0+cmVmY291bnQsIGluaXRpYWxfcmVmcywgZGVzdHJveSwgZGVzdHJveV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICBlbGVtcyA9IENIQU5ORUxfRUxFTVNfRlJPTV9TVEFDSyhzdGFjayk7CisgIHVzZXJfZGF0YSA9CisgICAgICAoKGNoYXIgKillbGVtcykgKworICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoZmlsdGVyX2NvdW50ICogc2l6ZW9mKGdycGNfY2hhbm5lbF9lbGVtZW50KSk7CisKKyAgLyogaW5pdCBwZXItZmlsdGVyIGRhdGEgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZpbHRlcl9jb3VudDsgaSsrKSB7CisgICAgYXJncy5jaGFubmVsX3N0YWNrID0gc3RhY2s7CisgICAgYXJncy5jaGFubmVsX2FyZ3MgPSBjaGFubmVsX2FyZ3M7CisgICAgYXJncy5pc19maXJzdCA9IGkgPT0gMDsKKyAgICBhcmdzLmlzX2xhc3QgPSBpID09IChmaWx0ZXJfY291bnQgLSAxKTsKKyAgICBlbGVtc1tpXS5maWx0ZXIgPSBmaWx0ZXJzW2ldOworICAgIGVsZW1zW2ldLmNoYW5uZWxfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICBlbGVtc1tpXS5maWx0ZXItPmluaXRfY2hhbm5lbF9lbGVtKGV4ZWNfY3R4LCAmZWxlbXNbaV0sICZhcmdzKTsKKyAgICB1c2VyX2RhdGEgKz0gUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoZmlsdGVyc1tpXS0+c2l6ZW9mX2NoYW5uZWxfZGF0YSk7CisgICAgY2FsbF9zaXplICs9IFJPVU5EX1VQX1RPX0FMSUdOTUVOVF9TSVpFKGZpbHRlcnNbaV0tPnNpemVvZl9jYWxsX2RhdGEpOworICB9CisKKyAgR1BSX0FTU0VSVCh1c2VyX2RhdGEgPiAoY2hhciAqKXN0YWNrKTsKKyAgR1BSX0FTU0VSVCgodWludHB0cl90KSh1c2VyX2RhdGEgLSAoY2hhciAqKXN0YWNrKSA9PQorICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja19zaXplKGZpbHRlcnMsIGZpbHRlcl9jb3VudCkpOworCisgIHN0YWNrLT5jYWxsX3N0YWNrX3NpemUgPSBjYWxsX3NpemU7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFjayAqc3RhY2spIHsKKyAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmNoYW5uZWxfZWxlbXMgPSBDSEFOTkVMX0VMRU1TX0ZST01fU1RBQ0soc3RhY2spOworICBzaXplX3QgY291bnQgPSBzdGFjay0+Y291bnQ7CisgIHNpemVfdCBpOworCisgIC8qIGRlc3Ryb3kgcGVyLWZpbHRlciBkYXRhICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgY2hhbm5lbF9lbGVtc1tpXS5maWx0ZXItPmRlc3Ryb3lfY2hhbm5lbF9lbGVtKGV4ZWNfY3R4LCAmY2hhbm5lbF9lbGVtc1tpXSk7CisgIH0KK30KKwordm9pZCBncnBjX2NhbGxfc3RhY2tfaW5pdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrLCBpbnQgaW5pdGlhbF9yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwgdm9pZCAqZGVzdHJveV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9jb250ZXh0X2VsZW1lbnQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnRyYW5zcG9ydF9zZXJ2ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX3N0YWNrICpjYWxsX3N0YWNrKSB7CisgIGdycGNfY2hhbm5lbF9lbGVtZW50ICpjaGFubmVsX2VsZW1zID0gQ0hBTk5FTF9FTEVNU19GUk9NX1NUQUNLKGNoYW5uZWxfc3RhY2spOworICBncnBjX2NhbGxfZWxlbWVudF9hcmdzIGFyZ3M7CisgIHNpemVfdCBjb3VudCA9IGNoYW5uZWxfc3RhY2stPmNvdW50OworICBncnBjX2NhbGxfZWxlbWVudCAqY2FsbF9lbGVtczsKKyAgY2hhciAqdXNlcl9kYXRhOworICBzaXplX3QgaTsKKworICBjYWxsX3N0YWNrLT5jb3VudCA9IGNvdW50OworICBHUlBDX1NUUkVBTV9SRUZfSU5JVCgmY2FsbF9zdGFjay0+cmVmY291bnQsIGluaXRpYWxfcmVmcywgZGVzdHJveSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9hcmcsICJDQUxMX1NUQUNLIik7CisgIGNhbGxfZWxlbXMgPSBDQUxMX0VMRU1TX0ZST01fU1RBQ0soY2FsbF9zdGFjayk7CisgIHVzZXJfZGF0YSA9ICgoY2hhciAqKWNhbGxfZWxlbXMpICsKKyAgICAgICAgICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoY291bnQgKiBzaXplb2YoZ3JwY19jYWxsX2VsZW1lbnQpKTsKKworICAvKiBpbml0IHBlci1maWx0ZXIgZGF0YSAqLworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGFyZ3MuY2FsbF9zdGFjayA9IGNhbGxfc3RhY2s7CisgICAgYXJncy5zZXJ2ZXJfdHJhbnNwb3J0X2RhdGEgPSB0cmFuc3BvcnRfc2VydmVyX2RhdGE7CisgICAgYXJncy5jb250ZXh0ID0gY29udGV4dDsKKyAgICBjYWxsX2VsZW1zW2ldLmZpbHRlciA9IGNoYW5uZWxfZWxlbXNbaV0uZmlsdGVyOworICAgIGNhbGxfZWxlbXNbaV0uY2hhbm5lbF9kYXRhID0gY2hhbm5lbF9lbGVtc1tpXS5jaGFubmVsX2RhdGE7CisgICAgY2FsbF9lbGVtc1tpXS5jYWxsX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgY2FsbF9lbGVtc1tpXS5maWx0ZXItPmluaXRfY2FsbF9lbGVtKGV4ZWNfY3R4LCAmY2FsbF9lbGVtc1tpXSwgJmFyZ3MpOworICAgIHVzZXJfZGF0YSArPQorICAgICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShjYWxsX2VsZW1zW2ldLmZpbHRlci0+c2l6ZW9mX2NhbGxfZGF0YSk7CisgIH0KK30KKwordm9pZCBncnBjX2NhbGxfc3RhY2tfc2V0X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgc2l6ZV90IGNvdW50ID0gY2FsbF9zdGFjay0+Y291bnQ7CisgIGdycGNfY2FsbF9lbGVtZW50ICpjYWxsX2VsZW1zOworICBjaGFyICp1c2VyX2RhdGE7CisgIHNpemVfdCBpOworCisgIGNhbGxfZWxlbXMgPSBDQUxMX0VMRU1TX0ZST01fU1RBQ0soY2FsbF9zdGFjayk7CisgIHVzZXJfZGF0YSA9ICgoY2hhciAqKWNhbGxfZWxlbXMpICsKKyAgICAgICAgICAgICAgUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoY291bnQgKiBzaXplb2YoZ3JwY19jYWxsX2VsZW1lbnQpKTsKKworICAvKiBpbml0IHBlci1maWx0ZXIgZGF0YSAqLworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGNhbGxfZWxlbXNbaV0uZmlsdGVyLT5zZXRfcG9sbHNldChleGVjX2N0eCwgJmNhbGxfZWxlbXNbaV0sIHBvbGxzZXQpOworICAgIHVzZXJfZGF0YSArPQorICAgICAgICBST1VORF9VUF9UT19BTElHTk1FTlRfU0laRShjYWxsX2VsZW1zW2ldLmZpbHRlci0+c2l6ZW9mX2NhbGxfZGF0YSk7CisgIH0KK30KKwordm9pZCBncnBjX2NhbGxfc3RhY2tfaWdub3JlX3NldF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkge30KKwordm9pZCBncnBjX2NhbGxfc3RhY2tfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX3N0YWNrICpzdGFjaykgeworICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbXMgPSBDQUxMX0VMRU1TX0ZST01fU1RBQ0soc3RhY2spOworICBzaXplX3QgY291bnQgPSBzdGFjay0+Y291bnQ7CisgIHNpemVfdCBpOworCisgIC8qIGRlc3Ryb3kgcGVyLWZpbHRlciBkYXRhICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgZWxlbXNbaV0uZmlsdGVyLT5kZXN0cm95X2NhbGxfZWxlbShleGVjX2N0eCwgJmVsZW1zW2ldKTsKKyAgfQorfQorCit2b2lkIGdycGNfY2FsbF9uZXh0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBncnBjX2NhbGxfZWxlbWVudCAqbmV4dF9lbGVtID0gZWxlbSArIDE7CisgIG5leHRfZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGV4ZWNfY3R4LCBuZXh0X2VsZW0sIG9wKTsKK30KKworY2hhciAqZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgeworICBncnBjX2NhbGxfZWxlbWVudCAqbmV4dF9lbGVtID0gZWxlbSArIDE7CisgIHJldHVybiBuZXh0X2VsZW0tPmZpbHRlci0+Z2V0X3BlZXIoZXhlY19jdHgsIG5leHRfZWxlbSk7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX25leHRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3ApIHsKKyAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKm5leHRfZWxlbSA9IGVsZW0gKyAxOworICBuZXh0X2VsZW0tPmZpbHRlci0+c3RhcnRfdHJhbnNwb3J0X29wKGV4ZWNfY3R4LCBuZXh0X2VsZW0sIG9wKTsKK30KKworZ3JwY19jaGFubmVsX3N0YWNrICpncnBjX2NoYW5uZWxfc3RhY2tfZnJvbV90b3BfZWxlbWVudCgKKyAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkgeworICByZXR1cm4gKGdycGNfY2hhbm5lbF9zdGFjayAqKSgoY2hhciAqKShlbGVtKS1ST1VORF9VUF9UT19BTElHTk1FTlRfU0laRSgKKyAgICAgIHNpemVvZihncnBjX2NoYW5uZWxfc3RhY2spKSk7Cit9CisKK2dycGNfY2FsbF9zdGFjayAqZ3JwY19jYWxsX3N0YWNrX2Zyb21fdG9wX2VsZW1lbnQoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgcmV0dXJuIChncnBjX2NhbGxfc3RhY2sgKikoKGNoYXIgKikoZWxlbSktUk9VTkRfVVBfVE9fQUxJR05NRU5UX1NJWkUoCisgICAgICBzaXplb2YoZ3JwY19jYWxsX3N0YWNrKSkpOworfQorCit2b2lkIGdycGNfY2FsbF9lbGVtZW50X3NlbmRfY2FuY2VsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqY3VyX2VsZW0pIHsKKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIG9wOworICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKKyAgb3AuY2FuY2VsX3dpdGhfc3RhdHVzID0gR1JQQ19TVEFUVVNfQ0FOQ0VMTEVEOworICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgY3VyX2VsZW0sICZvcCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmggYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5YmVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ0hBTk5FTF9TVEFDS19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9DSEFOTkVMX1NUQUNLX0gKKworLyogQSBjaGFubmVsIGZpbHRlciBkZWZpbmVzIGhvdyBvcGVyYXRpb25zIG9uIGEgY2hhbm5lbCBhcmUgaW1wbGVtZW50ZWQuCisgICBDaGFubmVsIGZpbHRlcnMgYXJlIGNoYWluZWQgdG9nZXRoZXIgdG8gY3JlYXRlIGZ1bGwgY2hhbm5lbHMsIGFuZCBpZiB0aG9zZQorICAgY2hhaW5zIGFyZSBsaW5lYXIsIHRoZW4gY2hhbm5lbCBzdGFja3MgcHJvdmlkZSBhIG1lY2hhbmlzbSB0byBtaW5pbWl6ZQorICAgYWxsb2NhdGlvbnMgZm9yIHRoYXQgY2hhaW4uCisgICBDYWxsIHN0YWNrcyBhcmUgY3JlYXRlZCBieSBjaGFubmVsIHN0YWNrcyBhbmQgcmVwcmVzZW50IHRoZSBwZXItY2FsbCBkYXRhCisgICBmb3IgdGhhdCBzdGFjay4gKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfY2hhbm5lbF9lbGVtZW50IGdycGNfY2hhbm5lbF9lbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jYWxsX2VsZW1lbnQgZ3JwY19jYWxsX2VsZW1lbnQ7CisKK3R5cGVkZWYgc3RydWN0IGdycGNfY2hhbm5lbF9zdGFjayBncnBjX2NoYW5uZWxfc3RhY2s7Cit0eXBlZGVmIHN0cnVjdCBncnBjX2NhbGxfc3RhY2sgZ3JwY19jYWxsX3N0YWNrOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbm5lbF9zdGFjazsKKyAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmNoYW5uZWxfYXJnczsKKyAgaW50IGlzX2ZpcnN0OworICBpbnQgaXNfbGFzdDsKK30gZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJnczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2s7CisgIGNvbnN0IHZvaWQgKnNlcnZlcl90cmFuc3BvcnRfZGF0YTsKKyAgZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudCAqY29udGV4dDsKK30gZ3JwY19jYWxsX2VsZW1lbnRfYXJnczsKKworLyogQ2hhbm5lbCBmaWx0ZXJzIHNwZWNpZnk6CisgICAxLiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgaW4gdGhlIGNoYW5uZWwgJiBjYWxsICh2aWEgdGhlIHNpemVvZl9YWFgKKyAgICAgIG1lbWJlcnMpCisgICAyLiBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgZGVzdHJveSBjaGFubmVsICYgY2FsbCBkYXRhCisgICAgICAoaW5pdF9YWFgsIGRlc3Ryb3lfWFhYKQorICAgMy4gZnVuY3Rpb25zIHRvIGltcGxlbWVudCBjYWxsIG9wZXJhdGlvbnMgYW5kIGNoYW5uZWwgb3BlcmF0aW9ucyAoY2FsbF9vcCwKKyAgICAgIGNoYW5uZWxfb3ApCisgICA0LiBhIG5hbWUsIHdoaWNoIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZworCisgICBNZW1iZXJzIGFyZSBsYWlkIG91dCBpbiBhcHByb3hpbWF0ZSBmcmVxdWVuY3kgb2YgdXNlIG9yZGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBDYWxsZWQgdG8gZWcuIHNlbmQvcmVjZWl2ZSBkYXRhIG9uIGEgY2FsbC4KKyAgICAgU2VlIGdycGNfY2FsbF9uZXh0X29wIG9uIGhvdyB0byBjYWxsIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHN0YWNrICovCisgIHZvaWQgKCpzdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7CisgIC8qIENhbGxlZCB0byBoYW5kbGUgY2hhbm5lbCBsZXZlbCBvcGVyYXRpb25zIC0gZS5nLiBuZXcgY2FsbHMsIG9yIHRyYW5zcG9ydAorICAgICBjbG9zdXJlLgorICAgICBTZWUgZ3JwY19jaGFubmVsX25leHRfb3Agb24gaG93IHRvIGNhbGwgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RhY2sgKi8KKyAgdm9pZCAoKnN0YXJ0X3RyYW5zcG9ydF9vcCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLCBncnBjX3RyYW5zcG9ydF9vcCAqb3ApOworCisgIC8qIHNpemVvZihwZXIgY2FsbCBkYXRhKSAqLworICBzaXplX3Qgc2l6ZW9mX2NhbGxfZGF0YTsKKyAgLyogSW5pdGlhbGl6ZSBwZXIgY2FsbCBkYXRhLgorICAgICBlbGVtIGlzIGluaXRpYWxpemVkIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FsbCwgYW5kIGVsZW0tPmNhbGxfZGF0YSBpcyB3aGF0CisgICAgIG5lZWRzIGluaXRpYWxpemluZy4KKyAgICAgVGhlIGZpbHRlciBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueSBjaGFpbmluZy4KKyAgICAgc2VydmVyX3RyYW5zcG9ydF9kYXRhIGlzIGFuIG9wYXF1ZSBwb2ludGVyLiBJZiBpdCBpcyBOVUxMLCB0aGlzIGNhbGwgaXMKKyAgICAgb24gYSBjbGllbnQ7IGlmIGl0IGlzIG5vbi1OVUxMLCB0aGVuIGl0IHBvaW50cyB0byBtZW1vcnkgb3duZWQgYnkgdGhlCisgICAgIHRyYW5zcG9ydCBhbmQgaXMgb24gdGhlIHNlcnZlci4gTW9zdCBmaWx0ZXJzIHdhbnQgdG8gaWdub3JlIHRoaXMKKyAgICAgYXJndW1lbnQuICovCisgIHZvaWQgKCppbml0X2NhbGxfZWxlbSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpOworICB2b2lkICgqc2V0X3BvbGxzZXQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpOworICAvKiBEZXN0cm95IHBlciBjYWxsIGRhdGEuCisgICAgIFRoZSBmaWx0ZXIgZG9lcyBub3QgbmVlZCB0byBkbyBhbnkgY2hhaW5pbmcgKi8KKyAgdm9pZCAoKmRlc3Ryb3lfY2FsbF9lbGVtKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pOworCisgIC8qIHNpemVvZihwZXIgY2hhbm5lbCBkYXRhKSAqLworICBzaXplX3Qgc2l6ZW9mX2NoYW5uZWxfZGF0YTsKKyAgLyogSW5pdGlhbGl6ZSBwZXItY2hhbm5lbCBkYXRhLgorICAgICBlbGVtIGlzIGluaXRpYWxpemVkIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FsbCwgYW5kIGVsZW0tPmNoYW5uZWxfZGF0YSBpcworICAgICB3aGF0IG5lZWRzIGluaXRpYWxpemluZy4KKyAgICAgaXNfZmlyc3QsIGlzX2xhc3QgZGVzaWduYXRlIHRoaXMgZWxlbWVudHMgcG9zaXRpb24gaW4gdGhlIHN0YWNrLCBhbmQgYXJlCisgICAgIHVzZWZ1bCBmb3IgYXNzZXJ0aW5nIGNvcnJlY3QgY29uZmlndXJhdGlvbiBieSB1cHBlciBsYXllciBjb2RlLgorICAgICBUaGUgZmlsdGVyIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55IGNoYWluaW5nICovCisgIHZvaWQgKCppbml0X2NoYW5uZWxfZWxlbSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpOworICAvKiBEZXN0cm95IHBlciBjaGFubmVsIGRhdGEuCisgICAgIFRoZSBmaWx0ZXIgZG9lcyBub3QgbmVlZCB0byBkbyBhbnkgY2hhaW5pbmcgKi8KKyAgdm9pZCAoKmRlc3Ryb3lfY2hhbm5lbF9lbGVtKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSk7CisKKyAgLyogSW1wbGVtZW50IGdycGNfY2FsbF9nZXRfcGVlcigpICovCisgIGNoYXIgKigqZ2V0X3BlZXIpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSk7CisKKyAgLyogVGhlIG5hbWUgb2YgdGhpcyBmaWx0ZXIgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKK30gZ3JwY19jaGFubmVsX2ZpbHRlcjsKKworLyogQSBjaGFubmVsX2VsZW1lbnQgdHJhY2tzIGl0cyBmaWx0ZXIgYW5kIHRoZSBmaWx0ZXIgcmVxdWVzdGVkIG1lbW9yeSB3aXRoaW4KKyAgIGEgY2hhbm5lbCBhbGxvY2F0aW9uICovCitzdHJ1Y3QgZ3JwY19jaGFubmVsX2VsZW1lbnQgeworICBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXI7CisgIHZvaWQgKmNoYW5uZWxfZGF0YTsKK307CisKKy8qIEEgY2FsbF9lbGVtZW50IHRyYWNrcyBpdHMgZmlsdGVyLCB0aGUgZmlsdGVyIHJlcXVlc3RlZCBtZW1vcnkgd2l0aGluCisgICBhIGNoYW5uZWwgYWxsb2NhdGlvbiwgYW5kIHRoZSBmaWx0ZXIgcmVxdWVzdGVkIG1lbW9yeSB3aXRoaW4gYSBjYWxsCisgICBhbGxvY2F0aW9uICovCitzdHJ1Y3QgZ3JwY19jYWxsX2VsZW1lbnQgeworICBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXI7CisgIHZvaWQgKmNoYW5uZWxfZGF0YTsKKyAgdm9pZCAqY2FsbF9kYXRhOworfTsKKworLyogQSBjaGFubmVsIHN0YWNrIHRyYWNrcyBhIHNldCBvZiByZWxhdGVkIGZpbHRlcnMgZm9yIG9uZSBjaGFubmVsLCBhbmQKKyAgIGd1YXJhbnRlZXMgdGhleSBsaXZlIHdpdGhpbiBhIHNpbmdsZSBtYWxsb2MoKSBhbGxvY2F0aW9uICovCitzdHJ1Y3QgZ3JwY19jaGFubmVsX3N0YWNrIHsKKyAgZ3JwY19zdHJlYW1fcmVmY291bnQgcmVmY291bnQ7CisgIHNpemVfdCBjb3VudDsKKyAgLyogTWVtb3J5IHJlcXVpcmVkIGZvciBhIGNhbGwgc3RhY2sgKGNvbXB1dGVkIGF0IGNoYW5uZWwgc3RhY2sKKyAgICAgaW5pdGlhbGl6YXRpb24pICovCisgIHNpemVfdCBjYWxsX3N0YWNrX3NpemU7Cit9OworCisvKiBBIGNhbGwgc3RhY2sgdHJhY2tzIGEgc2V0IG9mIHJlbGF0ZWQgZmlsdGVycyBmb3Igb25lIGNhbGwsIGFuZCBndWFyYW50ZWVzCisgICB0aGV5IGxpdmUgd2l0aGluIGEgc2luZ2xlIG1hbGxvYygpIGFsbG9jYXRpb24gKi8KK3N0cnVjdCBncnBjX2NhbGxfc3RhY2sgeworICAvKiBzaGFyZWQgcmVmY291bnQgZm9yIHRoaXMgY2hhbm5lbCBzdGFjay4KKyAgICAgTVVTVCBiZSB0aGUgZmlyc3QgZWxlbWVudDogdGhlIHVuZGVybHlpbmcgY29kZSBjYWxscyBkZXN0cm95CisgICAgIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIHJlZmNvdW50LCBidXQgaGlnaGVyIGxheWVycyBwcmVmZXIgdG8gdGhpbmsKKyAgICAgYWJvdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGwgc3RhY2sgaXRzZWxmLiAqLworICBncnBjX3N0cmVhbV9yZWZjb3VudCByZWZjb3VudDsKKyAgc2l6ZV90IGNvdW50OworfTsKKworLyogR2V0IGEgY2hhbm5lbCBlbGVtZW50IGdpdmVuIGEgY2hhbm5lbCBzdGFjayBhbmQgaXRzIGluZGV4ICovCitncnBjX2NoYW5uZWxfZWxlbWVudCAqZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoZ3JwY19jaGFubmVsX3N0YWNrICpzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSk7CisvKiBHZXQgdGhlIGxhc3QgY2hhbm5lbCBlbGVtZW50IGluIGEgY2hhbm5lbCBzdGFjayAqLworZ3JwY19jaGFubmVsX2VsZW1lbnQgKmdycGNfY2hhbm5lbF9zdGFja19sYXN0X2VsZW1lbnQoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrICpzdGFjayk7CisvKiBHZXQgYSBjYWxsIHN0YWNrIGVsZW1lbnQgZ2l2ZW4gYSBjYWxsIHN0YWNrIGFuZCBhbiBpbmRleCAqLworZ3JwY19jYWxsX2VsZW1lbnQgKmdycGNfY2FsbF9zdGFja19lbGVtZW50KGdycGNfY2FsbF9zdGFjayAqc3RhY2ssIHNpemVfdCBpKTsKKworLyogRGV0ZXJtaW5lIG1lbW9yeSByZXF1aXJlZCBmb3IgYSBjaGFubmVsIHN0YWNrIGNvbnRhaW5pbmcgYSBzZXQgb2YgZmlsdGVycyAqLworc2l6ZV90IGdycGNfY2hhbm5lbF9zdGFja19zaXplKGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmaWx0ZXJfY291bnQpOworLyogSW5pdGlhbGl6ZSBhIGNoYW5uZWwgc3RhY2sgZ2l2ZW4gc29tZSBmaWx0ZXJzICovCit2b2lkIGdycGNfY2hhbm5lbF9zdGFja19pbml0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBpbnQgaW5pdGlhbF9yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwgdm9pZCAqZGVzdHJveV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmlsdGVyX2NvdW50LCBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgZ3JwY19jaGFubmVsX3N0YWNrICpzdGFjayk7CisvKiBEZXN0cm95IGEgY2hhbm5lbCBzdGFjayAqLwordm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrICpzdGFjayk7CisKKy8qIEluaXRpYWxpemUgYSBjYWxsIHN0YWNrIGdpdmVuIGEgY2hhbm5lbCBzdGFjay4gdHJhbnNwb3J0X3NlcnZlcl9kYXRhIGlzCisgICBleHBlY3RlZCB0byBiZSBOVUxMIG9uIGEgY2xpZW50LCBvciBhbiBvcGFxdWUgdHJhbnNwb3J0IG93bmVkIHBvaW50ZXIgb24gdGhlCisgICBzZXJ2ZXIuICovCit2b2lkIGdycGNfY2FsbF9zdGFja19pbml0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2ssIGludCBpbml0aWFsX3JlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaW9tZ3JfY2JfZnVuYyBkZXN0cm95LCB2b2lkICpkZXN0cm95X2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdHJhbnNwb3J0X3NlcnZlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2spOworLyogU2V0IGEgcG9sbHNldCBmb3IgYSBjYWxsIHN0YWNrOiBtdXN0IG9jY3VyIGJlZm9yZSB0aGUgZmlyc3Qgb3AgaXMgc3RhcnRlZCAqLwordm9pZCBncnBjX2NhbGxfc3RhY2tfc2V0X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfc3RhY2sgKmNhbGxfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpOworCisjaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgR1JQQ19DQUxMX1NUQUNLX1JFRihjYWxsX3N0YWNrLCByZWFzb24pIFwKKyAgZ3JwY19zdHJlYW1fcmVmKCYoY2FsbF9zdGFjayktPnJlZmNvdW50LCByZWFzb24pCisjZGVmaW5lIEdSUENfQ0FMTF9TVEFDS19VTlJFRihleGVjX2N0eCwgY2FsbF9zdGFjaywgcmVhc29uKSBcCisgIGdycGNfc3RyZWFtX3VucmVmKGV4ZWNfY3R4LCAmKGNhbGxfc3RhY2spLT5yZWZjb3VudCwgcmVhc29uKQorI2RlZmluZSBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKGNoYW5uZWxfc3RhY2ssIHJlYXNvbikgXAorICBncnBjX3N0cmVhbV9yZWYoJihjaGFubmVsX3N0YWNrKS0+cmVmY291bnQsIHJlYXNvbikKKyNkZWZpbmUgR1JQQ19DSEFOTkVMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBjaGFubmVsX3N0YWNrLCByZWFzb24pIFwKKyAgZ3JwY19zdHJlYW1fdW5yZWYoZXhlY19jdHgsICYoY2hhbm5lbF9zdGFjayktPnJlZmNvdW50LCByZWFzb24pCisjZWxzZQorI2RlZmluZSBHUlBDX0NBTExfU1RBQ0tfUkVGKGNhbGxfc3RhY2ssIHJlYXNvbikgXAorICBncnBjX3N0cmVhbV9yZWYoJihjYWxsX3N0YWNrKS0+cmVmY291bnQpCisjZGVmaW5lIEdSUENfQ0FMTF9TVEFDS19VTlJFRihleGVjX2N0eCwgY2FsbF9zdGFjaywgcmVhc29uKSBcCisgIGdycGNfc3RyZWFtX3VucmVmKGV4ZWNfY3R4LCAmKGNhbGxfc3RhY2spLT5yZWZjb3VudCkKKyNkZWZpbmUgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihjaGFubmVsX3N0YWNrLCByZWFzb24pIFwKKyAgZ3JwY19zdHJlYW1fcmVmKCYoY2hhbm5lbF9zdGFjayktPnJlZmNvdW50KQorI2RlZmluZSBHUlBDX0NIQU5ORUxfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIGNoYW5uZWxfc3RhY2ssIHJlYXNvbikgXAorICBncnBjX3N0cmVhbV91bnJlZihleGVjX2N0eCwgJihjaGFubmVsX3N0YWNrKS0+cmVmY291bnQpCisjZW5kaWYKKworLyogRGVzdHJveSBhIGNhbGwgc3RhY2sgKi8KK3ZvaWQgZ3JwY19jYWxsX3N0YWNrX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9zdGFjayAqc3RhY2spOworCisvKiBJZ25vcmUgc2V0IHBvbGxzZXQgLSB1c2VkIGJ5IGZpbHRlcnMgdG8gaW1wbGVtZW50IHRoZSBzZXRfcG9sbHNldCBtZXRob2QKKyAgIGlmIHRoZXkgZG9uJ3QgY2FyZSBhYm91dCBwb2xsc2V0cyBhdCBhbGwuIERvZXMgbm90aGluZy4gKi8KK3ZvaWQgZ3JwY19jYWxsX3N0YWNrX2lnbm9yZV9zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpOworLyogQ2FsbCB0aGUgbmV4dCBvcGVyYXRpb24gaW4gYSBjYWxsIHN0YWNrICovCit2b2lkIGdycGNfY2FsbF9uZXh0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7CisvKiBDYWxsIHRoZSBuZXh0IG9wZXJhdGlvbiAoZGVwZW5kaW5nIG9uIGNhbGwgZGlyZWN0aW9uYWxpdHkpIGluIGEgY2hhbm5lbAorICAgc3RhY2sgKi8KK3ZvaWQgZ3JwY19jaGFubmVsX25leHRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3ApOworLyogUGFzcyB0aHJvdWdoIGEgcmVxdWVzdCB0byBnZXRfcGVlciB0byB0aGUgbmV4dCBjaGlsZCBlbGVtZW50ICovCitjaGFyICpncnBjX2NhbGxfbmV4dF9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pOworCisvKiBHaXZlbiB0aGUgdG9wIGVsZW1lbnQgb2YgYSBjaGFubmVsIHN0YWNrLCBnZXQgdGhlIGNoYW5uZWwgc3RhY2sgaXRzZWxmICovCitncnBjX2NoYW5uZWxfc3RhY2sgKmdycGNfY2hhbm5lbF9zdGFja19mcm9tX3RvcF9lbGVtZW50KAorICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKTsKKy8qIEdpdmVuIHRoZSB0b3AgZWxlbWVudCBvZiBhIGNhbGwgc3RhY2ssIGdldCB0aGUgY2FsbCBzdGFjayBpdHNlbGYgKi8KK2dycGNfY2FsbF9zdGFjayAqZ3JwY19jYWxsX3N0YWNrX2Zyb21fdG9wX2VsZW1lbnQoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pOworCit2b2lkIGdycGNfY2FsbF9sb2dfb3AoY2hhciAqZmlsZSwgaW50IGxpbmUsIGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOworCit2b2lkIGdycGNfY2FsbF9lbGVtZW50X3NlbmRfY2FuY2VsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqY3VyX2VsZW0pOworCitleHRlcm4gaW50IGdycGNfdHJhY2VfY2hhbm5lbDsKKworI2RlZmluZSBHUlBDX0NBTExfTE9HX09QKHNldiwgZWxlbSwgb3ApIFwKKyAgaWYgKGdycGNfdHJhY2VfY2hhbm5lbCkgZ3JwY19jYWxsX2xvZ19vcChzZXYsIGVsZW0sIG9wKQorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0NIQU5ORUxfU1RBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2UwYzRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCitpbnQgZ3JwY190cmFjZV9jaGFubmVsX3N0YWNrX2J1aWxkZXIgPSAwOworCit0eXBlZGVmIHN0cnVjdCBmaWx0ZXJfbm9kZSB7CisgIHN0cnVjdCBmaWx0ZXJfbm9kZSAqbmV4dDsKKyAgc3RydWN0IGZpbHRlcl9ub2RlICpwcmV2OworICBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXI7CisgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBpbml0OworICB2b2lkICppbml0X2FyZzsKK30gZmlsdGVyX25vZGU7CisKK3N0cnVjdCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciB7CisgIC8vIHNlbnRpbmVsIG5vZGVzIGZvciBmaWx0ZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkCisgIGZpbHRlcl9ub2RlIGJlZ2luOworICBmaWx0ZXJfbm9kZSBlbmQ7CisgIC8vIHZhcmlvdXMgc2V0L2dldC1hYmxlIHBhcmFtZXRlcnMKKyAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3M7CisgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3QgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgeworICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcjsKKyAgZmlsdGVyX25vZGUgKm5vZGU7Cit9OworCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlKHZvaWQpIHsKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmIgPSBncHJfbWFsbG9jKHNpemVvZigqYikpOworICBtZW1zZXQoYiwgMCwgc2l6ZW9mKCpiKSk7CisKKyAgYi0+YmVnaW4uZmlsdGVyID0gTlVMTDsKKyAgYi0+ZW5kLmZpbHRlciA9IE5VTEw7CisgIGItPmJlZ2luLm5leHQgPSAmYi0+ZW5kOworICBiLT5iZWdpbi5wcmV2ID0gJmItPmVuZDsKKyAgYi0+ZW5kLm5leHQgPSAmYi0+YmVnaW47CisgIGItPmVuZC5wcmV2ID0gJmItPmJlZ2luOworCisgIHJldHVybiBiOworfQorCitzdGF0aWMgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKmNyZWF0ZV9pdGVyYXRvcl9hdF9maWx0ZXJfbm9kZSgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgZmlsdGVyX25vZGUgKm5vZGUpIHsKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ID0gZ3ByX21hbGxvYyhzaXplb2YoKml0KSk7CisgIGl0LT5idWlsZGVyID0gYnVpbGRlcjsKKyAgaXQtPm5vZGUgPSBub2RlOworICByZXR1cm4gaXQ7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3JfZGVzdHJveSgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXQpIHsKKyAgZ3ByX2ZyZWUoaXQpOworfQorCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9jcmVhdGVfaXRlcmF0b3JfYXRfZmlyc3QoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpIHsKKyAgcmV0dXJuIGNyZWF0ZV9pdGVyYXRvcl9hdF9maWx0ZXJfbm9kZShidWlsZGVyLCAmYnVpbGRlci0+YmVnaW4pOworfQorCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9jcmVhdGVfaXRlcmF0b3JfYXRfbGFzdCgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcikgeworICByZXR1cm4gY3JlYXRlX2l0ZXJhdG9yX2F0X2ZpbHRlcl9ub2RlKGJ1aWxkZXIsICZidWlsZGVyLT5lbmQpOworfQorCitib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX21vdmVfbmV4dCgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IpIHsKKyAgaWYgKGl0ZXJhdG9yLT5ub2RlID09ICZpdGVyYXRvci0+YnVpbGRlci0+ZW5kKSByZXR1cm4gZmFsc2U7CisgIGl0ZXJhdG9yLT5ub2RlID0gaXRlcmF0b3ItPm5vZGUtPm5leHQ7CisgIHJldHVybiB0cnVlOworfQorCitib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX21vdmVfcHJldigKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IpIHsKKyAgaWYgKGl0ZXJhdG9yLT5ub2RlID09ICZpdGVyYXRvci0+YnVpbGRlci0+YmVnaW4pIHJldHVybiBmYWxzZTsKKyAgaXRlcmF0b3ItPm5vZGUgPSBpdGVyYXRvci0+bm9kZS0+cHJldjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfbW92ZV9wcmV2KAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvcik7CisKK3ZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X25hbWUoZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgR1BSX0FTU0VSVChidWlsZGVyLT5uYW1lID09IE5VTEwpOworICBidWlsZGVyLT5uYW1lID0gbmFtZTsKK30KKwordm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9zZXRfY2hhbm5lbF9hcmd1bWVudHMoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKSB7CisgIEdQUl9BU1NFUlQoYnVpbGRlci0+YXJncyA9PSBOVUxMKTsKKyAgYnVpbGRlci0+YXJncyA9IGFyZ3M7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X3RyYW5zcG9ydCgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCkgeworICBHUFJfQVNTRVJUKGJ1aWxkZXItPnRyYW5zcG9ydCA9PSBOVUxMKTsKKyAgYnVpbGRlci0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OworfQorCitncnBjX3RyYW5zcG9ydCAqZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZ2V0X3RyYW5zcG9ydCgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcikgeworICByZXR1cm4gYnVpbGRlci0+dHJhbnNwb3J0OworfQorCitjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZ2V0X2NoYW5uZWxfYXJndW1lbnRzKAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKSB7CisgIHJldHVybiBidWlsZGVyLT5hcmdzOworfQorCitib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FwcGVuZF9maWx0ZXIoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlciwKKyAgICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgcG9zdF9pbml0X2Z1bmMsIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXQgPQorICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlX2l0ZXJhdG9yX2F0X2xhc3QoYnVpbGRlcik7CisgIGJvb2wgb2sgPSBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9hZGRfZmlsdGVyX2JlZm9yZSgKKyAgICAgIGl0LCBmaWx0ZXIsIHBvc3RfaW5pdF9mdW5jLCB1c2VyX2RhdGEpOworICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvcl9kZXN0cm95KGl0KTsKKyAgcmV0dXJuIG9rOworfQorCitib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3ByZXBlbmRfZmlsdGVyKAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXIsCisgICAgZ3JwY19wb3N0X2ZpbHRlcl9jcmVhdGVfaW5pdF9mdW5jIHBvc3RfaW5pdF9mdW5jLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ID0KKyAgICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2NyZWF0ZV9pdGVyYXRvcl9hdF9maXJzdChidWlsZGVyKTsKKyAgYm9vbCBvayA9IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FkZF9maWx0ZXJfYWZ0ZXIoCisgICAgICBpdCwgZmlsdGVyLCBwb3N0X2luaXRfZnVuYywgdXNlcl9kYXRhKTsKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3JfZGVzdHJveShpdCk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgYWRkX2FmdGVyKGZpbHRlcl9ub2RlICpiZWZvcmUsIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgcG9zdF9pbml0X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGZpbHRlcl9ub2RlICpuZXcgPSBncHJfbWFsbG9jKHNpemVvZigqbmV3KSk7CisgIG5ldy0+bmV4dCA9IGJlZm9yZS0+bmV4dDsKKyAgbmV3LT5wcmV2ID0gYmVmb3JlOworICBuZXctPm5leHQtPnByZXYgPSBuZXctPnByZXYtPm5leHQgPSBuZXc7CisgIG5ldy0+ZmlsdGVyID0gZmlsdGVyOworICBuZXctPmluaXQgPSBwb3N0X2luaXRfZnVuYzsKKyAgbmV3LT5pbml0X2FyZyA9IHVzZXJfZGF0YTsKK30KKworYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9hZGRfZmlsdGVyX2JlZm9yZSgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IsCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyLAorICAgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBwb3N0X2luaXRfZnVuYywgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChpdGVyYXRvci0+bm9kZSA9PSAmaXRlcmF0b3ItPmJ1aWxkZXItPmJlZ2luKSByZXR1cm4gZmFsc2U7CisgIGFkZF9hZnRlcihpdGVyYXRvci0+bm9kZS0+cHJldiwgZmlsdGVyLCBwb3N0X2luaXRfZnVuYywgdXNlcl9kYXRhKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfYWRkX2ZpbHRlcl9hZnRlcigKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IsCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyLAorICAgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBwb3N0X2luaXRfZnVuYywgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChpdGVyYXRvci0+bm9kZSA9PSAmaXRlcmF0b3ItPmJ1aWxkZXItPmVuZCkgcmV0dXJuIGZhbHNlOworICBhZGRfYWZ0ZXIoaXRlcmF0b3ItPm5vZGUsIGZpbHRlciwgcG9zdF9pbml0X2Z1bmMsIHVzZXJfZGF0YSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2Rlc3Ryb3koZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpIHsKKyAgZmlsdGVyX25vZGUgKnAgPSBidWlsZGVyLT5iZWdpbi5uZXh0OworICB3aGlsZSAocCAhPSAmYnVpbGRlci0+ZW5kKSB7CisgICAgZmlsdGVyX25vZGUgKm5leHQgPSBwLT5uZXh0OworICAgIGdwcl9mcmVlKHApOworICAgIHAgPSBuZXh0OworICB9CisgIGdwcl9mcmVlKGJ1aWxkZXIpOworfQorCit2b2lkICpncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9maW5pc2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZWZpeF9ieXRlcywgaW50IGluaXRpYWxfcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkZXN0cm95X2FyZykgeworICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGZpbHRlcnMKKyAgc2l6ZV90IG51bV9maWx0ZXJzID0gMDsKKyAgZm9yIChmaWx0ZXJfbm9kZSAqcCA9IGJ1aWxkZXItPmJlZ2luLm5leHQ7IHAgIT0gJmJ1aWxkZXItPmVuZDsgcCA9IHAtPm5leHQpIHsKKyAgICBudW1fZmlsdGVycysrOworICB9CisKKyAgLy8gY3JlYXRlIGFuIGFycmF5IG9mIGZpbHRlcnMKKyAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqKmZpbHRlcnMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoKmZpbHRlcnMpICogbnVtX2ZpbHRlcnMpOworICBzaXplX3QgaSA9IDA7CisgIGZvciAoZmlsdGVyX25vZGUgKnAgPSBidWlsZGVyLT5iZWdpbi5uZXh0OyBwICE9ICZidWlsZGVyLT5lbmQ7IHAgPSBwLT5uZXh0KSB7CisgICAgZmlsdGVyc1tpKytdID0gcC0+ZmlsdGVyOworICB9CisKKyAgLy8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjaGFubmVsIHN0YWNrCisgIHNpemVfdCBjaGFubmVsX3N0YWNrX3NpemUgPSBncnBjX2NoYW5uZWxfc3RhY2tfc2l6ZShmaWx0ZXJzLCBudW1fZmlsdGVycyk7CisKKyAgLy8gYWxsb2NhdGUgbWVtb3J5LCB3aXRoIHByZWZpeF9ieXRlcyBmb2xsb3dlZCBieSBjaGFubmVsX3N0YWNrX3NpemUKKyAgY2hhciAqcmVzdWx0ID0gZ3ByX21hbGxvYyhwcmVmaXhfYnl0ZXMgKyBjaGFubmVsX3N0YWNrX3NpemUpOworICAvLyBmZXRjaCBhIHBvaW50ZXIgdG8gdGhlIGNoYW5uZWwgc3RhY2sKKyAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrID0KKyAgICAgIChncnBjX2NoYW5uZWxfc3RhY2sgKikocmVzdWx0ICsgcHJlZml4X2J5dGVzKTsKKyAgLy8gYW5kIGluaXRpYWxpemUgaXQKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2luaXQoZXhlY19jdHgsIGluaXRpYWxfcmVmcywgZGVzdHJveSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9hcmcgPT0gTlVMTCA/IHJlc3VsdCA6IGRlc3Ryb3lfYXJnLCBmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZmlsdGVycywgYnVpbGRlci0+YXJncywgYnVpbGRlci0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9zdGFjayk7CisKKyAgLy8gcnVuIHBvc3QtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgIGkgPSAwOworICBmb3IgKGZpbHRlcl9ub2RlICpwID0gYnVpbGRlci0+YmVnaW4ubmV4dDsgcCAhPSAmYnVpbGRlci0+ZW5kOyBwID0gcC0+bmV4dCkgeworICAgIGlmIChwLT5pbml0ICE9IE5VTEwpIHsKKyAgICAgIHAtPmluaXQoY2hhbm5lbF9zdGFjaywgZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoY2hhbm5lbF9zdGFjaywgaSksCisgICAgICAgICAgICAgIHAtPmluaXRfYXJnKTsKKyAgICB9CisgICAgaSsrOworICB9CisKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZGVzdHJveShidWlsZGVyKTsKKyAgZ3ByX2ZyZWUoKGdycGNfY2hhbm5lbF9maWx0ZXIgKiopZmlsdGVycyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzMmM0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ0hBTk5FTF9TVEFDS19CVUlMREVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0NIQU5ORUxfU1RBQ0tfQlVJTERFUl9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisKKy8vLyBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciBvZmZlcnMgYSBwcm9ncmFtbWF0aWMgaW50ZXJmYWNlIHRvIHNlbGVjdGVkCisvLy8gYW5kIG9yZGVyIGNoYW5uZWwgZmlsdGVycwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXI7Cit0eXBlZGVmIHN0cnVjdCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvcgorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yOworCisvLy8gQ3JlYXRlIGEgbmV3IGNoYW5uZWwgc3RhY2sgYnVpbGRlcgorZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2NyZWF0ZSh2b2lkKTsKKworLy8vIEFzc2lnbiBhIG5hbWUgdG8gdGhlIGNoYW5uZWwgc3RhY2s6IFxhIG5hbWUgbXVzdCBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZAordm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9zZXRfbmFtZShncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKy8vLyBBdHRhY2ggXGEgdHJhbnNwb3J0IHRvIHRoZSBidWlsZGVyIChkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCkKK3ZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X3RyYW5zcG9ydCgKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKy8vLyBGZXRjaCBhdHRhY2hlZCB0cmFuc3BvcnQKK2dycGNfdHJhbnNwb3J0ICpncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9nZXRfdHJhbnNwb3J0KAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKTsKKworLy8vIFNldCBjaGFubmVsIGFyZ3VtZW50czogXGEgYXJncyBtdXN0IGNvbnRpbnVlIHRvIGV4aXN0IHVudGlsIGFmdGVyCisvLy8gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZmluaXNoIHJldHVybnMKK3ZvaWQgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X2NoYW5uZWxfYXJndW1lbnRzKAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncyk7CisKKy8vLyBSZXR1cm4gYSBib3Jyb3dlZCBwb2ludGVyIHRvIHRoZSBjaGFubmVsIGFyZ3VtZW50cworY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF9jaGFubmVsX2FyZ3VtZW50cygKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlcik7CisKKy8vLyBCZWdpbiBpdGVyYXRpbmcgb3ZlciBhbHJlYWR5IGRlZmluZWQgZmlsdGVycyBpbiB0aGUgYnVpbGRlciBhdCB0aGUgYmVnaW5uaW5nCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqCitncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9jcmVhdGVfaXRlcmF0b3JfYXRfZmlyc3QoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpOworCisvLy8gQmVnaW4gaXRlcmF0aW5nIG92ZXIgYWxyZWFkeSBkZWZpbmVkIGZpbHRlcnMgaW4gdGhlIGJ1aWxkZXIgYXQgdGhlIGVuZAorZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKgorZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlX2l0ZXJhdG9yX2F0X2xhc3QoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIpOworCisvLy8gSXMgYW4gaXRlcmF0b3IgYXQgdGhlIGZpcnN0IGVsZW1lbnQ/Citib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yX2lzX2ZpcnN0KAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvcik7CisKKy8vLyBJcyBhbiBpdGVyYXRvciBhdCB0aGUgZW5kPworYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvcl9pc19lbmQoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yKTsKKworLy8vIE1vdmUgYW4gaXRlcmF0b3IgdG8gdGhlIG5leHQgaXRlbQorYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9tb3ZlX25leHQoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yKTsKKworLy8vIE1vdmUgYW4gaXRlcmF0b3IgdG8gdGhlIHByZXZpb3VzIGl0ZW0KK2Jvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfbW92ZV9wcmV2KAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yICppdGVyYXRvcik7CisKK3R5cGVkZWYgdm9pZCAoKmdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYykoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrLCBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwgdm9pZCAqYXJnKTsKKworLy8vIEFkZCBcYSBmaWx0ZXIgdG8gdGhlIHN0YWNrLCBhZnRlciBcYSBpdGVyYXRvci4KKy8vLyBDYWxsIFxhIHBvc3RfaW5pdF9mdW5jKC4uLiwgXGEgdXNlcl9kYXRhKSBvbmNlIHRoZSBjaGFubmVsIHN0YWNrIGlzCisvLy8gY3JlYXRlZC4KK2Jvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfYWRkX2ZpbHRlcl9hZnRlcigKKyAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9pdGVyYXRvciAqaXRlcmF0b3IsCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqZmlsdGVyLAorICAgIGdycGNfcG9zdF9maWx0ZXJfY3JlYXRlX2luaXRfZnVuYyBwb3N0X2luaXRfZnVuYywKKyAgICB2b2lkICp1c2VyX2RhdGEpIEdSUENfTVVTVF9VU0VfUkVTVUxUOworCisvLy8gQWRkIFxhIGZpbHRlciB0byB0aGUgc3RhY2ssIGJlZm9yZSBcYSBpdGVyYXRvci4KKy8vLyBDYWxsIFxhIHBvc3RfaW5pdF9mdW5jKC4uLiwgXGEgdXNlcl9kYXRhKSBvbmNlIHRoZSBjaGFubmVsIHN0YWNrIGlzCisvLy8gY3JlYXRlZC4KK2Jvb2wgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfYWRkX2ZpbHRlcl9iZWZvcmUoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yLAorICAgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKmZpbHRlciwKKyAgICBncnBjX3Bvc3RfZmlsdGVyX2NyZWF0ZV9pbml0X2Z1bmMgcG9zdF9pbml0X2Z1bmMsCisgICAgdm9pZCAqdXNlcl9kYXRhKSBHUlBDX01VU1RfVVNFX1JFU1VMVDsKKworLy8vIEFkZCBcYSBmaWx0ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsdGVyIGxpc3QuCisvLy8gQ2FsbCBcYSBwb3N0X2luaXRfZnVuYyguLi4sIFxhIHVzZXJfZGF0YSkgb25jZSB0aGUgY2hhbm5lbCBzdGFjayBpcworLy8vIGNyZWF0ZWQuCitib29sIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3ByZXBlbmRfZmlsdGVyKAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXIsCisgICAgZ3JwY19wb3N0X2ZpbHRlcl9jcmVhdGVfaW5pdF9mdW5jIHBvc3RfaW5pdF9mdW5jLAorICAgIHZvaWQgKnVzZXJfZGF0YSkgR1JQQ19NVVNUX1VTRV9SRVNVTFQ7CisKKy8vLyBBZGQgXGEgZmlsdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGZpbHRlciBsaXN0LgorLy8vIENhbGwgXGEgcG9zdF9pbml0X2Z1bmMoLi4uLCBcYSB1c2VyX2RhdGEpIG9uY2UgdGhlIGNoYW5uZWwgc3RhY2sgaXMKKy8vLyBjcmVhdGVkLgorYm9vbCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9hcHBlbmRfZmlsdGVyKAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICpmaWx0ZXIsCisgICAgZ3JwY19wb3N0X2ZpbHRlcl9jcmVhdGVfaW5pdF9mdW5jIHBvc3RfaW5pdF9mdW5jLAorICAgIHZvaWQgKnVzZXJfZGF0YSkgR1JQQ19NVVNUX1VTRV9SRVNVTFQ7CisKKy8vLyBUZXJtaW5hdGUgaXRlcmF0aW9uIGFuZCBkZXN0cm95IFxhIGl0ZXJhdG9yCit2b2lkIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2l0ZXJhdG9yX2Rlc3Ryb3koCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfaXRlcmF0b3IgKml0ZXJhdG9yKTsKKworLy8vIERlc3Ryb3kgdGhlIGJ1aWxkZXIsIHJldHVybiB0aGUgZnJlc2hseSBtaW50ZWQgY2hhbm5lbCBzdGFjaworLy8vIEFsbG9jYXRlcyBcYSBwcmVmaXhfYnl0ZXMgYnl0ZXMgYmVmb3JlIHRoZSBjaGFubmVsIHN0YWNrCisvLy8gUmV0dXJucyB0aGUgYmFzZSBwb2ludGVyIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2sKKy8vLyBcYSBpbml0aWFsX3JlZnMsIFxhIGRlc3Ryb3ksIFxhIGRlc3Ryb3lfYXJnIGFyZSBhcyBwZXIKKy8vLyBncnBjX2NoYW5uZWxfc3RhY2tfaW5pdAordm9pZCAqZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZmluaXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcmVmaXhfYnl0ZXMsIGludCBpbml0aWFsX3JlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGRlc3Ryb3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGVzdHJveV9hcmcpOworCisvLy8gRGVzdHJveSB0aGUgYnVpbGRlciB3aXRob3V0IGNyZWF0aW5nIGEgY2hhbm5lbCBzdGFjawordm9pZCBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9kZXN0cm95KGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyKTsKKworZXh0ZXJuIGludCBncnBjX3RyYWNlX2NoYW5uZWxfc3RhY2tfYnVpbGRlcjsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9DSEFOTkVMX1NUQUNLX0JVSUxERVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkZjgwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiCisKKy8qIENsaWVudCBjaGFubmVsIGltcGxlbWVudGF0aW9uICovCisKK3R5cGVkZWYgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyIGNhbGxfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgY2xpZW50X2NoYW5uZWxfY2hhbm5lbF9kYXRhIHsKKyAgLyoqIHJlc29sdmVyIGZvciB0aGlzIGNoYW5uZWwgKi8KKyAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXI7CisgIC8qKiBoYXZlIHdlIHN0YXJ0ZWQgcmVzb2x2aW5nIHRoaXMgY2hhbm5lbCAqLworICBpbnQgc3RhcnRlZF9yZXNvbHZpbmc7CisKKyAgLyoqIG11dGV4IHByb3RlY3RpbmcgY2xpZW50IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBhbGwKKyAgICAgIHZhcmlhYmxlcyBiZWxvdyBpbiB0aGlzIGRhdGEgc3RydWN0dXJlICovCisgIGdwcl9tdSBtdV9jb25maWc7CisgIC8qKiBjdXJyZW50bHkgYWN0aXZlIGxvYWQgYmFsYW5jZXIgLSBndWFyZGVkIGJ5IG11X2NvbmZpZyAqLworICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5OworICAvKiogaW5jb21pbmcgY29uZmlndXJhdGlvbiAtIHNldCBieSByZXNvbHZlci5uZXh0CisgICAgICBndWFyZGVkIGJ5IG11X2NvbmZpZyAqLworICBncnBjX2NsaWVudF9jb25maWcgKmluY29taW5nX2NvbmZpZ3VyYXRpb247CisgIC8qKiBhIGxpc3Qgb2YgY2xvc3VyZXMgdGhhdCBhcmUgYWxsIHdhaXRpbmcgZm9yIGNvbmZpZyB0byBjb21lIGluICovCisgIGdycGNfY2xvc3VyZV9saXN0IHdhaXRpbmdfZm9yX2NvbmZpZ19jbG9zdXJlczsKKyAgLyoqIHJlc29sdmVyIGNhbGxiYWNrICovCisgIGdycGNfY2xvc3VyZSBvbl9jb25maWdfY2hhbmdlZDsKKyAgLyoqIGNvbm5lY3Rpdml0eSBzdGF0ZSBiZWluZyB0cmFja2VkICovCisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgc3RhdGVfdHJhY2tlcjsKKyAgLyoqIHdoZW4gYW4gbGJfcG9saWN5IGFycml2ZXMsIHNob3VsZCB3ZSB0cnkgdG8gZXhpdCBpZGxlICovCisgIGludCBleGl0X2lkbGVfd2hlbl9sYl9wb2xpY3lfYXJyaXZlczsKKyAgLyoqIG93bmluZyBzdGFjayAqLworICBncnBjX2NoYW5uZWxfc3RhY2sgKm93bmluZ19zdGFjazsKKyAgLyoqIGludGVyZXN0ZWQgcGFydGllcyAob3duZWQpICovCisgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllczsKK30gY2hhbm5lbF9kYXRhOworCisvKiogV2UgY3JlYXRlIG9uZSB3YXRjaGVyIGZvciBlYWNoIG5ldyBsYl9wb2xpY3kgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGEKKyAgIHJlc29sdmVyLAorICAgIHRvIHdhdGNoIGZvciBzdGF0ZSBjaGFuZ2VzIGZyb20gdGhlIGxiX3BvbGljeS4gV2hlbiBhIHN0YXRlIGNoYW5nZSBpcyBzZWVuLAorICAgd2UKKyAgICB1cGRhdGUgdGhlIGNoYW5uZWwsIGFuZCBjcmVhdGUgYSBuZXcgd2F0Y2hlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFubmVsX2RhdGEgKmNoYW5kOworICBncnBjX2Nsb3N1cmUgb25fY2hhbmdlZDsKKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGU7CisgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3k7Cit9IGxiX3BvbGljeV9jb25uZWN0aXZpdHlfd2F0Y2hlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW07Cit9IHdhaXRpbmdfY2FsbDsKKworc3RhdGljIGNoYXIgKmNjX2dldF9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgeworICByZXR1cm4gZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX2dldF9wZWVyKGV4ZWNfY3R4LCBlbGVtLT5jYWxsX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBjY19zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBHUlBDX0NBTExfTE9HX09QKEdQUl9JTkZPLCBlbGVtLCBvcCk7CisgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9wZXJmb3JtX29wKGV4ZWNfY3R4LCBlbGVtLT5jYWxsX2RhdGEsIG9wKTsKK30KKworc3RhdGljIHZvaWQgd2F0Y2hfbGJfcG9saWN5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjaGFubmVsX2RhdGEgKmNoYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgY3VycmVudF9zdGF0ZSk7CisKK3N0YXRpYyB2b2lkIG9uX2xiX3BvbGljeV9zdGF0ZV9jaGFuZ2VkX2xvY2tlZCgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgbGJfcG9saWN5X2Nvbm5lY3Rpdml0eV93YXRjaGVyICp3KSB7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHB1Ymxpc2hfc3RhdGUgPSB3LT5zdGF0ZTsKKyAgLyogY2hlY2sgaWYgdGhlIG5vdGlmaWNhdGlvbiBpcyBmb3IgYSBzdGFsZSBwb2xpY3kgKi8KKyAgaWYgKHctPmxiX3BvbGljeSAhPSB3LT5jaGFuZC0+bGJfcG9saWN5KSByZXR1cm47CisKKyAgaWYgKHB1Ymxpc2hfc3RhdGUgPT0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUgJiYKKyAgICAgIHctPmNoYW5kLT5yZXNvbHZlciAhPSBOVUxMKSB7CisgICAgcHVibGlzaF9zdGF0ZSA9IEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRTsKKyAgICBncnBjX3Jlc29sdmVyX2NoYW5uZWxfc2F3X2Vycm9yKGV4ZWNfY3R4LCB3LT5jaGFuZC0+cmVzb2x2ZXIpOworICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCB3LT5jaGFuZC0+bGJfcG9saWN5LCAiY2hhbm5lbCIpOworICAgIHctPmNoYW5kLT5sYl9wb2xpY3kgPSBOVUxMOworICB9CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnctPmNoYW5kLT5zdGF0ZV90cmFja2VyLCBwdWJsaXNoX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxiX2NoYW5nZWQiKTsKKyAgaWYgKHctPnN0YXRlICE9IEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFKSB7CisgICAgd2F0Y2hfbGJfcG9saWN5KGV4ZWNfY3R4LCB3LT5jaGFuZCwgdy0+bGJfcG9saWN5LCB3LT5zdGF0ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgb25fbGJfcG9saWN5X3N0YXRlX2NoYW5nZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgeworICBsYl9wb2xpY3lfY29ubmVjdGl2aXR5X3dhdGNoZXIgKncgPSBhcmc7CisKKyAgZ3ByX211X2xvY2soJnctPmNoYW5kLT5tdV9jb25maWcpOworICBvbl9sYl9wb2xpY3lfc3RhdGVfY2hhbmdlZF9sb2NrZWQoZXhlY19jdHgsIHcpOworICBncHJfbXVfdW5sb2NrKCZ3LT5jaGFuZC0+bXVfY29uZmlnKTsKKworICBHUlBDX0NIQU5ORUxfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIHctPmNoYW5kLT5vd25pbmdfc3RhY2ssICJ3YXRjaF9sYl9wb2xpY3kiKTsKKyAgZ3ByX2ZyZWUodyk7Cit9CisKK3N0YXRpYyB2b2lkIHdhdGNoX2xiX3BvbGljeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY2hhbm5lbF9kYXRhICpjaGFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGN1cnJlbnRfc3RhdGUpIHsKKyAgbGJfcG9saWN5X2Nvbm5lY3Rpdml0eV93YXRjaGVyICp3ID0gZ3ByX21hbGxvYyhzaXplb2YoKncpKTsKKyAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihjaGFuZC0+b3duaW5nX3N0YWNrLCAid2F0Y2hfbGJfcG9saWN5Iik7CisKKyAgdy0+Y2hhbmQgPSBjaGFuZDsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnctPm9uX2NoYW5nZWQsIG9uX2xiX3BvbGljeV9zdGF0ZV9jaGFuZ2VkLCB3KTsKKyAgdy0+c3RhdGUgPSBjdXJyZW50X3N0YXRlOworICB3LT5sYl9wb2xpY3kgPSBsYl9wb2xpY3k7CisgIGdycGNfbGJfcG9saWN5X25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZXhlY19jdHgsIGxiX3BvbGljeSwgJnctPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3LT5vbl9jaGFuZ2VkKTsKK30KKworc3RhdGljIHZvaWQgY2Nfb25fY29uZmlnX2NoYW5nZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gYXJnOworICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5ID0gTlVMTDsKKyAgZ3JwY19sYl9wb2xpY3kgKm9sZF9sYl9wb2xpY3k7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0YXRlID0gR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFOworICBpbnQgZXhpdF9pZGxlID0gMDsKKworICBpZiAoY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24gIT0gTlVMTCkgeworICAgIGxiX3BvbGljeSA9IGdycGNfY2xpZW50X2NvbmZpZ19nZXRfbGJfcG9saWN5KGNoYW5kLT5pbmNvbWluZ19jb25maWd1cmF0aW9uKTsKKyAgICBpZiAobGJfcG9saWN5ICE9IE5VTEwpIHsKKyAgICAgIEdSUENfTEJfUE9MSUNZX1JFRihsYl9wb2xpY3ksICJjaGFubmVsIik7CisgICAgICBHUlBDX0xCX1BPTElDWV9SRUYobGJfcG9saWN5LCAiY29uZmlnX2NoYW5nZSIpOworICAgICAgc3RhdGUgPSBncnBjX2xiX3BvbGljeV9jaGVja19jb25uZWN0aXZpdHkoZXhlY19jdHgsIGxiX3BvbGljeSk7CisgICAgfQorCisgICAgZ3JwY19jbGllbnRfY29uZmlnX3VucmVmKGV4ZWNfY3R4LCBjaGFuZC0+aW5jb21pbmdfY29uZmlndXJhdGlvbik7CisgIH0KKworICBjaGFuZC0+aW5jb21pbmdfY29uZmlndXJhdGlvbiA9IE5VTEw7CisKKyAgaWYgKGxiX3BvbGljeSAhPSBOVUxMKSB7CisgICAgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldF9zZXQoZXhlY19jdHgsIGxiX3BvbGljeS0+aW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMpOworICB9CisKKyAgZ3ByX211X2xvY2soJmNoYW5kLT5tdV9jb25maWcpOworICBvbGRfbGJfcG9saWN5ID0gY2hhbmQtPmxiX3BvbGljeTsKKyAgY2hhbmQtPmxiX3BvbGljeSA9IGxiX3BvbGljeTsKKyAgaWYgKGxiX3BvbGljeSAhPSBOVUxMIHx8IGNoYW5kLT5yZXNvbHZlciA9PSBOVUxMIC8qIGRpc2Nvbm5lY3RlZCAqLykgeworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGV4ZWNfY3R4LCAmY2hhbmQtPndhaXRpbmdfZm9yX2NvbmZpZ19jbG9zdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorICBpZiAobGJfcG9saWN5ICE9IE5VTEwgJiYgY2hhbmQtPmV4aXRfaWRsZV93aGVuX2xiX3BvbGljeV9hcnJpdmVzKSB7CisgICAgR1JQQ19MQl9QT0xJQ1lfUkVGKGxiX3BvbGljeSwgImV4aXRfaWRsZSIpOworICAgIGV4aXRfaWRsZSA9IDE7CisgICAgY2hhbmQtPmV4aXRfaWRsZV93aGVuX2xiX3BvbGljeV9hcnJpdmVzID0gMDsKKyAgfQorCisgIGlmIChpb21ncl9zdWNjZXNzICYmIGNoYW5kLT5yZXNvbHZlcikgeworICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJmNoYW5kLT5zdGF0ZV90cmFja2VyLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld19sYityZXNvbHZlciIpOworICAgIGlmIChsYl9wb2xpY3kgIT0gTlVMTCkgeworICAgICAgd2F0Y2hfbGJfcG9saWN5KGV4ZWNfY3R4LCBjaGFuZCwgbGJfcG9saWN5LCBzdGF0ZSk7CisgICAgfQorICAgIEdSUENfQ0hBTk5FTF9TVEFDS19SRUYoY2hhbmQtPm93bmluZ19zdGFjaywgInJlc29sdmVyIik7CisgICAgZ3JwY19yZXNvbHZlcl9uZXh0KGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+aW5jb21pbmdfY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5kLT5vbl9jb25maWdfY2hhbmdlZCk7CisgICAgZ3ByX211X3VubG9jaygmY2hhbmQtPm11X2NvbmZpZyk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNoYW5kLT5yZXNvbHZlciAhPSBOVUxMKSB7CisgICAgICBncnBjX3Jlc29sdmVyX3NodXRkb3duKGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIpOworICAgICAgR1JQQ19SRVNPTFZFUl9VTlJFRihleGVjX2N0eCwgY2hhbmQtPnJlc29sdmVyLCAiY2hhbm5lbCIpOworICAgICAgY2hhbmQtPnJlc29sdmVyID0gTlVMTDsKKyAgICB9CisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmY2hhbmQtPnN0YXRlX3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFLCAicmVzb2x2ZXJfZ29uZSIpOworICAgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOworICB9CisKKyAgaWYgKGV4aXRfaWRsZSkgeworICAgIGdycGNfbGJfcG9saWN5X2V4aXRfaWRsZShleGVjX2N0eCwgbGJfcG9saWN5KTsKKyAgICBHUlBDX0xCX1BPTElDWV9VTlJFRihleGVjX2N0eCwgbGJfcG9saWN5LCAiZXhpdF9pZGxlIik7CisgIH0KKworICBpZiAob2xkX2xiX3BvbGljeSAhPSBOVUxMKSB7CisgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldF9zZXQoCisgICAgICAgIGV4ZWNfY3R4LCBvbGRfbGJfcG9saWN5LT5pbnRlcmVzdGVkX3BhcnRpZXMsIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMpOworICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBvbGRfbGJfcG9saWN5LCAiY2hhbm5lbCIpOworICB9CisKKyAgaWYgKGxiX3BvbGljeSAhPSBOVUxMKSB7CisgICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGxiX3BvbGljeSwgImNvbmZpZ19jaGFuZ2UiKTsKKyAgfQorCisgIEdSUENfQ0hBTk5FTF9TVEFDS19VTlJFRihleGVjX2N0eCwgY2hhbmQtPm93bmluZ19zdGFjaywgInJlc29sdmVyIik7Cit9CisKK3N0YXRpYyB2b2lkIGNjX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3ApIHsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKworICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIG9wLT5vbl9jb25zdW1lZCwgdHJ1ZSwgTlVMTCk7CisKKyAgR1BSX0FTU0VSVChvcC0+c2V0X2FjY2VwdF9zdHJlYW0gPT0gZmFsc2UpOworICBpZiAob3AtPmJpbmRfcG9sbHNldCAhPSBOVUxMKSB7CisgICAgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldChleGVjX2N0eCwgY2hhbmQtPmludGVyZXN0ZWRfcGFydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5iaW5kX3BvbGxzZXQpOworICB9CisKKyAgZ3ByX211X2xvY2soJmNoYW5kLT5tdV9jb25maWcpOworICBpZiAob3AtPm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UgIT0gTlVMTCkgeworICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgIGV4ZWNfY3R4LCAmY2hhbmQtPnN0YXRlX3RyYWNrZXIsIG9wLT5jb25uZWN0aXZpdHlfc3RhdGUsCisgICAgICAgIG9wLT5vbl9jb25uZWN0aXZpdHlfc3RhdGVfY2hhbmdlKTsKKyAgICBvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSA9IE5VTEw7CisgICAgb3AtPmNvbm5lY3Rpdml0eV9zdGF0ZSA9IE5VTEw7CisgIH0KKworICBpZiAob3AtPnNlbmRfcGluZyAhPSBOVUxMKSB7CisgICAgaWYgKGNoYW5kLT5sYl9wb2xpY3kgPT0gTlVMTCkgeworICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBvcC0+c2VuZF9waW5nLCBmYWxzZSwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfbGJfcG9saWN5X3Bpbmdfb25lKGV4ZWNfY3R4LCBjaGFuZC0+bGJfcG9saWN5LCBvcC0+c2VuZF9waW5nKTsKKyAgICAgIG9wLT5iaW5kX3BvbGxzZXQgPSBOVUxMOworICAgIH0KKyAgICBvcC0+c2VuZF9waW5nID0gTlVMTDsKKyAgfQorCisgIGlmIChvcC0+ZGlzY29ubmVjdCAmJiBjaGFuZC0+cmVzb2x2ZXIgIT0gTlVMTCkgeworICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJmNoYW5kLT5zdGF0ZV90cmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSwgImRpc2Nvbm5lY3QiKTsKKyAgICBncnBjX3Jlc29sdmVyX3NodXRkb3duKGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIpOworICAgIEdSUENfUkVTT0xWRVJfVU5SRUYoZXhlY19jdHgsIGNoYW5kLT5yZXNvbHZlciwgImNoYW5uZWwiKTsKKyAgICBjaGFuZC0+cmVzb2x2ZXIgPSBOVUxMOworICAgIGlmIChjaGFuZC0+bGJfcG9saWN5ICE9IE5VTEwpIHsKKyAgICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmQtPmxiX3BvbGljeS0+aW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmQtPmludGVyZXN0ZWRfcGFydGllcyk7CisgICAgICBHUlBDX0xCX1BPTElDWV9VTlJFRihleGVjX2N0eCwgY2hhbmQtPmxiX3BvbGljeSwgImNoYW5uZWwiKTsKKyAgICAgIGNoYW5kLT5sYl9wb2xpY3kgPSBOVUxMOworICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhOworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqY29ubmVjdGVkX3N1YmNoYW5uZWw7CisgIGdycGNfY2xvc3VyZSAqb25fcmVhZHk7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtOworICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKK30gY29udGludWVfcGlja2luZ19hcmdzOworCitzdGF0aWMgaW50IGNjX3BpY2tfc3ViY2hhbm5lbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqaW5pdGlhbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKipjb25uZWN0ZWRfc3ViY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fcmVhZHkpOworCitzdGF0aWMgdm9pZCBjb250aW51ZV9waWNraW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBjb250aW51ZV9waWNraW5nX2FyZ3MgKmNwYSA9IGFyZzsKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjcGEtPm9uX3JlYWR5LCBmYWxzZSwgTlVMTCk7CisgIH0gZWxzZSBpZiAoY3BhLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCA9PSBOVUxMKSB7CisgICAgLyogY2FuY2VsbGVkLCBkbyBub3RoaW5nICovCisgIH0gZWxzZSBpZiAoY2NfcGlja19zdWJjaGFubmVsKGV4ZWNfY3R4LCBjcGEtPmVsZW0sIGNwYS0+aW5pdGlhbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BhLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgY3BhLT5vbl9yZWFkeSkpIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNwYS0+b25fcmVhZHksIHRydWUsIE5VTEwpOworICB9CisgIGdwcl9mcmVlKGNwYSk7Cit9CisKK3N0YXRpYyBpbnQgY2NfcGlja19zdWJjaGFubmVsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICplbGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmluaXRpYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqY29ubmVjdGVkX3N1YmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX3JlYWR5KSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gZWxlbXA7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGNvbnRpbnVlX3BpY2tpbmdfYXJncyAqY3BhOworICBncnBjX2Nsb3N1cmUgKmNsb3N1cmU7CisKKyAgR1BSX0FTU0VSVChjb25uZWN0ZWRfc3ViY2hhbm5lbCk7CisKKyAgZ3ByX211X2xvY2soJmNoYW5kLT5tdV9jb25maWcpOworICBpZiAoaW5pdGlhbF9tZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgaWYgKGNoYW5kLT5sYl9wb2xpY3kgIT0gTlVMTCkgeworICAgICAgZ3JwY19sYl9wb2xpY3lfY2FuY2VsX3BpY2soZXhlY19jdHgsIGNoYW5kLT5sYl9wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWRfc3ViY2hhbm5lbCk7CisgICAgfQorICAgIGZvciAoY2xvc3VyZSA9IGNoYW5kLT53YWl0aW5nX2Zvcl9jb25maWdfY2xvc3VyZXMuaGVhZDsgY2xvc3VyZSAhPSBOVUxMOworICAgICAgICAgY2xvc3VyZSA9IGdycGNfY2xvc3VyZV9uZXh0KGNsb3N1cmUpKSB7CisgICAgICBjcGEgPSBjbG9zdXJlLT5jYl9hcmc7CisgICAgICBpZiAoY3BhLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCA9PSBjb25uZWN0ZWRfc3ViY2hhbm5lbCkgeworICAgICAgICBjcGEtPmNvbm5lY3RlZF9zdWJjaGFubmVsID0gTlVMTDsKKyAgICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjcGEtPm9uX3JlYWR5LCBmYWxzZSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChjaGFuZC0+bGJfcG9saWN5ICE9IE5VTEwpIHsKKyAgICBncnBjX2xiX3BvbGljeSAqbGJfcG9saWN5ID0gY2hhbmQtPmxiX3BvbGljeTsKKyAgICBpbnQgcjsKKyAgICBHUlBDX0xCX1BPTElDWV9SRUYobGJfcG9saWN5LCAiY2NfcGlja19zdWJjaGFubmVsIik7CisgICAgZ3ByX211X3VubG9jaygmY2hhbmQtPm11X2NvbmZpZyk7CisgICAgciA9IGdycGNfbGJfcG9saWN5X3BpY2soZXhlY19jdHgsIGxiX3BvbGljeSwgY2FsbGQtPnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9tZXRhZGF0YSwgY29ubmVjdGVkX3N1YmNoYW5uZWwsIG9uX3JlYWR5KTsKKyAgICBHUlBDX0xCX1BPTElDWV9VTlJFRihleGVjX2N0eCwgbGJfcG9saWN5LCAiY2NfcGlja19zdWJjaGFubmVsIik7CisgICAgcmV0dXJuIHI7CisgIH0KKyAgaWYgKGNoYW5kLT5yZXNvbHZlciAhPSBOVUxMICYmICFjaGFuZC0+c3RhcnRlZF9yZXNvbHZpbmcpIHsKKyAgICBjaGFuZC0+c3RhcnRlZF9yZXNvbHZpbmcgPSAxOworICAgIEdSUENfQ0hBTk5FTF9TVEFDS19SRUYoY2hhbmQtPm93bmluZ19zdGFjaywgInJlc29sdmVyIik7CisgICAgZ3JwY19yZXNvbHZlcl9uZXh0KGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+aW5jb21pbmdfY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5kLT5vbl9jb25maWdfY2hhbmdlZCk7CisgIH0KKyAgY3BhID0gZ3ByX21hbGxvYyhzaXplb2YoKmNwYSkpOworICBjcGEtPmluaXRpYWxfbWV0YWRhdGEgPSBpbml0aWFsX21ldGFkYXRhOworICBjcGEtPmNvbm5lY3RlZF9zdWJjaGFubmVsID0gY29ubmVjdGVkX3N1YmNoYW5uZWw7CisgIGNwYS0+b25fcmVhZHkgPSBvbl9yZWFkeTsKKyAgY3BhLT5lbGVtID0gZWxlbTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJmNwYS0+Y2xvc3VyZSwgY29udGludWVfcGlja2luZywgY3BhKTsKKyAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZjaGFuZC0+d2FpdGluZ19mb3JfY29uZmlnX2Nsb3N1cmVzLCAmY3BhLT5jbG9zdXJlLCAxKTsKKyAgZ3ByX211X3VubG9jaygmY2hhbmQtPm11X2NvbmZpZyk7CisgIHJldHVybiAwOworfQorCisvKiBDb25zdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBpbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9pbml0KGVsZW0tPmNhbGxfZGF0YSwgY2NfcGlja19zdWJjaGFubmVsLCBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5jYWxsX3N0YWNrKTsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7CisgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9kZXN0cm95KGV4ZWNfY3R4LCBlbGVtLT5jYWxsX2RhdGEpOworfQorCisvKiBDb25zdHJ1Y3RvciBmb3IgY2hhbm5lbF9kYXRhICovCitzdGF0aWMgdm9pZCBpbml0X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJncyAqYXJncykgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworCisgIG1lbXNldChjaGFuZCwgMCwgc2l6ZW9mKCpjaGFuZCkpOworCisgIEdQUl9BU1NFUlQoYXJncy0+aXNfbGFzdCk7CisgIEdQUl9BU1NFUlQoZWxlbS0+ZmlsdGVyID09ICZncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlcik7CisKKyAgZ3ByX211X2luaXQoJmNoYW5kLT5tdV9jb25maWcpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmY2hhbmQtPm9uX2NvbmZpZ19jaGFuZ2VkLCBjY19vbl9jb25maWdfY2hhbmdlZCwgY2hhbmQpOworICBjaGFuZC0+b3duaW5nX3N0YWNrID0gYXJncy0+Y2hhbm5lbF9zdGFjazsKKworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9pbml0KCZjaGFuZC0+c3RhdGVfdHJhY2tlciwgR1JQQ19DSEFOTkVMX0lETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudF9jaGFubmVsIik7CisgIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMgPSBncnBjX3BvbGxzZXRfc2V0X2NyZWF0ZSgpOworfQorCisvKiBEZXN0cnVjdG9yIGZvciBjaGFubmVsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKworICBpZiAoY2hhbmQtPnJlc29sdmVyICE9IE5VTEwpIHsKKyAgICBncnBjX3Jlc29sdmVyX3NodXRkb3duKGV4ZWNfY3R4LCBjaGFuZC0+cmVzb2x2ZXIpOworICAgIEdSUENfUkVTT0xWRVJfVU5SRUYoZXhlY19jdHgsIGNoYW5kLT5yZXNvbHZlciwgImNoYW5uZWwiKTsKKyAgfQorICBpZiAoY2hhbmQtPmxiX3BvbGljeSAhPSBOVUxMKSB7CisgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldF9zZXQoZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmQtPmxiX3BvbGljeS0+aW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMpOworICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBjaGFuZC0+bGJfcG9saWN5LCAiY2hhbm5lbCIpOworICB9CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2Rlc3Ryb3koZXhlY19jdHgsICZjaGFuZC0+c3RhdGVfdHJhY2tlcik7CisgIGdycGNfcG9sbHNldF9zZXRfZGVzdHJveShjaGFuZC0+aW50ZXJlc3RlZF9wYXJ0aWVzKTsKKyAgZ3ByX211X2Rlc3Ryb3koJmNoYW5kLT5tdV9jb25maWcpOworfQorCitzdGF0aWMgdm9pZCBjY19zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2FsbGQtPnBvbGxzZXQgPSBwb2xsc2V0OworfQorCitjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfY2xpZW50X2NoYW5uZWxfZmlsdGVyID0geworICAgIGNjX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AsCisgICAgY2Nfc3RhcnRfdHJhbnNwb3J0X29wLAorICAgIHNpemVvZihjYWxsX2RhdGEpLAorICAgIGluaXRfY2FsbF9lbGVtLAorICAgIGNjX3NldF9wb2xsc2V0LAorICAgIGRlc3Ryb3lfY2FsbF9lbGVtLAorICAgIHNpemVvZihjaGFubmVsX2RhdGEpLAorICAgIGluaXRfY2hhbm5lbF9lbGVtLAorICAgIGRlc3Ryb3lfY2hhbm5lbF9lbGVtLAorICAgIGNjX2dldF9wZWVyLAorICAgICJjbGllbnQtY2hhbm5lbCIsCit9OworCit2b2lkIGdycGNfY2xpZW50X2NoYW5uZWxfc2V0X3Jlc29sdmVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7CisgIC8qIHBvc3QgY29uc3RydWN0aW9uIGluaXRpYWxpemF0aW9uOiBzZXQgdGhlIHRyYW5zcG9ydCBzZXR1cCBwb2ludGVyICovCisgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtID0gZ3JwY19jaGFubmVsX3N0YWNrX2xhc3RfZWxlbWVudChjaGFubmVsX3N0YWNrKTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgZ3ByX211X2xvY2soJmNoYW5kLT5tdV9jb25maWcpOworICBHUFJfQVNTRVJUKCFjaGFuZC0+cmVzb2x2ZXIpOworICBjaGFuZC0+cmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgR1JQQ19SRVNPTFZFUl9SRUYocmVzb2x2ZXIsICJjaGFubmVsIik7CisgIGlmICghZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkoY2hhbmQtPndhaXRpbmdfZm9yX2NvbmZpZ19jbG9zdXJlcykgfHwKKyAgICAgIGNoYW5kLT5leGl0X2lkbGVfd2hlbl9sYl9wb2xpY3lfYXJyaXZlcykgeworICAgIGNoYW5kLT5zdGFydGVkX3Jlc29sdmluZyA9IDE7CisgICAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihjaGFuZC0+b3duaW5nX3N0YWNrLCAicmVzb2x2ZXIiKTsKKyAgICBncnBjX3Jlc29sdmVyX25leHQoZXhlY19jdHgsIHJlc29sdmVyLCAmY2hhbmQtPmluY29taW5nX2NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+b25fY29uZmlnX2NoYW5nZWQpOworICB9CisgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOworfQorCitncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBncnBjX2NsaWVudF9jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sIGludCB0cnlfdG9fY29ubmVjdCkgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBvdXQ7CisgIGdwcl9tdV9sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKKyAgb3V0ID0gZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfY2hlY2soJmNoYW5kLT5zdGF0ZV90cmFja2VyKTsKKyAgaWYgKG91dCA9PSBHUlBDX0NIQU5ORUxfSURMRSAmJiB0cnlfdG9fY29ubmVjdCkgeworICAgIGlmIChjaGFuZC0+bGJfcG9saWN5ICE9IE5VTEwpIHsKKyAgICAgIGdycGNfbGJfcG9saWN5X2V4aXRfaWRsZShleGVjX2N0eCwgY2hhbmQtPmxiX3BvbGljeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYW5kLT5leGl0X2lkbGVfd2hlbl9sYl9wb2xpY3lfYXJyaXZlcyA9IDE7CisgICAgICBpZiAoIWNoYW5kLT5zdGFydGVkX3Jlc29sdmluZyAmJiBjaGFuZC0+cmVzb2x2ZXIgIT0gTlVMTCkgeworICAgICAgICBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKGNoYW5kLT5vd25pbmdfc3RhY2ssICJyZXNvbHZlciIpOworICAgICAgICBjaGFuZC0+c3RhcnRlZF9yZXNvbHZpbmcgPSAxOworICAgICAgICBncnBjX3Jlc29sdmVyX25leHQoZXhlY19jdHgsIGNoYW5kLT5yZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+aW5jb21pbmdfY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuZC0+b25fY29uZmlnX2NoYW5nZWQpOworICAgICAgfQorICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKKyAgcmV0dXJuIG91dDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFubmVsX2RhdGEgKmNoYW5kOworICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7CisgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGU7CisgIGdycGNfY2xvc3VyZSBteV9jbG9zdXJlOworfSBleHRlcm5hbF9jb25uZWN0aXZpdHlfd2F0Y2hlcjsKKworc3RhdGljIHZvaWQgb25fZXh0ZXJuYWxfd2F0Y2hfY29tcGxldGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgeworICBleHRlcm5hbF9jb25uZWN0aXZpdHlfd2F0Y2hlciAqdyA9IGFyZzsKKyAgZ3JwY19jbG9zdXJlICpmb2xsb3dfdXAgPSB3LT5vbl9jb21wbGV0ZTsKKyAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChleGVjX2N0eCwgdy0+Y2hhbmQtPmludGVyZXN0ZWRfcGFydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5wb2xsc2V0KTsKKyAgR1JQQ19DSEFOTkVMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCB3LT5jaGFuZC0+b3duaW5nX3N0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVybmFsX2Nvbm5lY3Rpdml0eV93YXRjaGVyIik7CisgIGdwcl9mcmVlKHcpOworICBmb2xsb3dfdXAtPmNiKGV4ZWNfY3R4LCBmb2xsb3dfdXAtPmNiX2FyZywgaW9tZ3Jfc3VjY2Vzcyk7Cit9CisKK3ZvaWQgZ3JwY19jbGllbnRfY2hhbm5lbF93YXRjaF9jb25uZWN0aXZpdHlfc3RhdGUoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIGV4dGVybmFsX2Nvbm5lY3Rpdml0eV93YXRjaGVyICp3ID0gZ3ByX21hbGxvYyhzaXplb2YoKncpKTsKKyAgdy0+Y2hhbmQgPSBjaGFuZDsKKyAgdy0+cG9sbHNldCA9IHBvbGxzZXQ7CisgIHctPm9uX2NvbXBsZXRlID0gb25fY29tcGxldGU7CisgIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXQoZXhlY19jdHgsIGNoYW5kLT5pbnRlcmVzdGVkX3BhcnRpZXMsIHBvbGxzZXQpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmdy0+bXlfY2xvc3VyZSwgb25fZXh0ZXJuYWxfd2F0Y2hfY29tcGxldGUsIHcpOworICBHUlBDX0NIQU5ORUxfU1RBQ0tfUkVGKHctPmNoYW5kLT5vd25pbmdfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVybmFsX2Nvbm5lY3Rpdml0eV93YXRjaGVyIik7CisgIGdwcl9tdV9sb2NrKCZjaGFuZC0+bXVfY29uZmlnKTsKKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICAgIGV4ZWNfY3R4LCAmY2hhbmQtPnN0YXRlX3RyYWNrZXIsIHN0YXRlLCAmdy0+bXlfY2xvc3VyZSk7CisgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5tdV9jb25maWcpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3Nzc5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ0xJRU5UX0NIQU5ORUxfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ0xJRU5UX0NIQU5ORUxfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiCisKKy8qIEEgY2xpZW50IGNoYW5uZWwgaXMgYSBjaGFubmVsIHRoYXQgYmVnaW5zIGRpc2Nvbm5lY3RlZCwgYW5kIGNhbiBjb25uZWN0CisgICB0byBzb21lIGVuZHBvaW50IG9uIGRlbWFuZC4gSWYgdGhhdCBlbmRwb2ludCBkaXNjb25uZWN0cywgaXQgd2lsbCBiZQorICAgY29ubmVjdGVkIHRvIGFnYWluIGxhdGVyLgorCisgICBDYWxscyBvbiBhIGRpc2Nvbm5lY3RlZCBjbGllbnQgY2hhbm5lbCBhcmUgcXVldWVkIHVudGlsIGEgY29ubmVjdGlvbiBpcworICAgZXN0YWJsaXNoZWQuICovCisKK2V4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfY2xpZW50X2NoYW5uZWxfZmlsdGVyOworCisvKiBwb3N0LWNvbnN0cnVjdGlvbiBpbml0aWFsaXplciB0byBsZXQgdGhlIGNsaWVudCBjaGFubmVsIGtub3cgd2hpY2gKKyAgIHRyYW5zcG9ydCBzZXR1cCBpdCBzaG91bGQgY2FuY2VsIHVwb24gZGVzdHJ1Y3Rpb24sIG9yIGluaXRpYXRlIHdoZW4gaXQgbmVlZHMKKyAgIGEgY29ubmVjdGlvbiAqLwordm9pZCBncnBjX2NsaWVudF9jaGFubmVsX3NldF9yZXNvbHZlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7CisKK2dycGNfY29ubmVjdGl2aXR5X3N0YXRlIGdycGNfY2xpZW50X2NoYW5uZWxfY2hlY2tfY29ubmVjdGl2aXR5X3N0YXRlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwgaW50IHRyeV90b19jb25uZWN0KTsKKwordm9pZCBncnBjX2NsaWVudF9jaGFubmVsX3dhdGNoX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqc3RhdGUsIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0NMSUVOVF9DSEFOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiYjdjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL2NvbXByZXNzaW9uLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2FsbF9kYXRhIHsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBzbGljZXM7IC8qKjwgQnVmZmVycyB1cCBpbnB1dCBzbGljZXMgdG8gYmUgY29tcHJlc3NlZCAqLworICBncnBjX2xpbmtlZF9tZGVsZW0gY29tcHJlc3Npb25fYWxnb3JpdGhtX3N0b3JhZ2U7CisgIGdycGNfbGlua2VkX21kZWxlbSBhY2NlcHRfZW5jb2Rpbmdfc3RvcmFnZTsKKyAgdWludDMyX3QgcmVtYWluaW5nX3NsaWNlX2J5dGVzOworICAvKiogQ29tcHJlc3Npb24gYWxnb3JpdGhtIHdlJ2xsIHRyeSB0byB1c2UuIEl0IG1heSBiZSBnaXZlbiBieSBpbmNvbWluZworICAgKiBtZXRhZGF0YSwgb3IgYnkgdGhlIGNoYW5uZWwncyBkZWZhdWx0IGNvbXByZXNzaW9uIHNldHRpbmdzLiAqLworICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBjb21wcmVzc2lvbl9hbGdvcml0aG07CisgIC8qKiBJZiB0cnVlLCBjb250ZW50cyBvZiBcYSBjb21wcmVzc2lvbl9hbGdvcml0aG0gYXJlIGF1dGhvcml0YXRpdmUgKi8KKyAgaW50IGhhc19jb21wcmVzc2lvbl9hbGdvcml0aG07CisKKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIHNlbmRfb3A7CisgIHVpbnQzMl90IHNlbmRfbGVuZ3RoOworICB1aW50MzJfdCBzZW5kX2ZsYWdzOworICBncHJfc2xpY2UgaW5jb21pbmdfc2xpY2U7CisgIGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbSByZXBsYWNlbWVudF9zdHJlYW07CisgIGdycGNfY2xvc3VyZSAqcG9zdF9zZW5kOworICBncnBjX2Nsb3N1cmUgc2VuZF9kb25lOworICBncnBjX2Nsb3N1cmUgZ290X3NsaWNlOworfSBjYWxsX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0IGNoYW5uZWxfZGF0YSB7CisgIC8qKiBUaGUgZGVmYXVsdCwgY2hhbm5lbC1sZXZlbCwgY29tcHJlc3Npb24gYWxnb3JpdGhtICovCisgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtOworICAvKiogQ29tcHJlc3Npb24gb3B0aW9ucyBmb3IgdGhlIGNoYW5uZWwgKi8KKyAgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zIGNvbXByZXNzaW9uX29wdGlvbnM7CisgIC8qKiBTdXBwb3J0ZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtcyAqLworICB1aW50MzJfdCBzdXBwb3J0ZWRfY29tcHJlc3Npb25fYWxnb3JpdGhtczsKK30gY2hhbm5lbF9kYXRhOworCisvKiogRm9yIGVhY2ggXGEgbWQgZWxlbWVudCBmcm9tIHRoZSBpbmNvbWluZyBtZXRhZGF0YSwgZmlsdGVyIG91dCB0aGUgZW50cnkgZm9yCisgKiAiZ3JwYy1lbmNvZGluZyIsIHVzaW5nIGl0cyB2YWx1ZSB0byBwb3B1bGF0ZSB0aGUgY2FsbCBkYXRhJ3MKKyAqIGNvbXByZXNzaW9uX2FsZ29yaXRobSBmaWVsZC4gKi8KK3N0YXRpYyBncnBjX21kZWxlbSAqY29tcHJlc3Npb25fbWRfZmlsdGVyKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gdXNlcl9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworCisgIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19JTlRFUk5BTF9FTkNPRElOR19SRVFVRVNUKSB7CisgICAgY29uc3QgY2hhciAqbWRfY19zdHIgPSBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKG1kLT52YWx1ZSk7CisgICAgaWYgKCFncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9wYXJzZShtZF9jX3N0ciwgc3RybGVuKG1kX2Nfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtKSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAgICJJbnZhbGlkIGNvbXByZXNzaW9uIGFsZ29yaXRobTogJyVzJyAodW5rbm93bikuIElnbm9yaW5nLiIsCisgICAgICAgICAgICAgIG1kX2Nfc3RyKTsKKyAgICAgIGNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBHUlBDX0NPTVBSRVNTX05PTkU7CisgICAgfQorICAgIGlmIChncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfaXNfYWxnb3JpdGhtX2VuYWJsZWQoCisgICAgICAgICAgICAmY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMsIGNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG0pID09CisgICAgICAgIDApIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgICAiSW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG06ICclcycgKHByZXZpb3VzbHkgZGlzYWJsZWQpLiAiCisgICAgICAgICAgICAgICJJZ25vcmluZy4iLAorICAgICAgICAgICAgICBtZF9jX3N0cik7CisgICAgICBjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtID0gR1JQQ19DT01QUkVTU19OT05FOworICAgIH0KKyAgICBjYWxsZC0+aGFzX2NvbXByZXNzaW9uX2FsZ29yaXRobSA9IDE7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gbWQ7Cit9CisKK3N0YXRpYyBpbnQgc2tpcF9jb21wcmVzc2lvbihncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBpZiAoY2FsbGQtPmhhc19jb21wcmVzc2lvbl9hbGdvcml0aG0pIHsKKyAgICBpZiAoY2FsbGQtPmNvbXByZXNzaW9uX2FsZ29yaXRobSA9PSBHUlBDX0NPTVBSRVNTX05PTkUpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsgLyogd2UgaGF2ZSBhbiBhY3R1YWwgY2FsbC1zcGVjaWZpYyBhbGdvcml0aG0gKi8KKyAgfQorICAvKiBubyBwZXItY2FsbCBjb21wcmVzc2lvbiBvdmVycmlkZSAqLworICByZXR1cm4gY2hhbm5lbGQtPmRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtID09IEdSUENfQ09NUFJFU1NfTk9ORTsKK30KKworLyoqIEZpbHRlciBpbml0aWFsIG1ldGFkYXRhICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3NlbmRfaW5pdGlhbF9tZXRhZGF0YSgKKyAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwgZ3JwY19tZXRhZGF0YV9iYXRjaCAqaW5pdGlhbF9tZXRhZGF0YSkgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICAvKiBQYXJzZSBpbmNvbWluZyByZXF1ZXN0IGZvciBjb21wcmVzc2lvbi4gSWYgYW55LCBpdCdsbCBiZSBhdmFpbGFibGUKKyAgICogYXQgY2FsbGQtPmNvbXByZXNzaW9uX2FsZ29yaXRobSAqLworICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihpbml0aWFsX21ldGFkYXRhLCBjb21wcmVzc2lvbl9tZF9maWx0ZXIsIGVsZW0pOworICBpZiAoIWNhbGxkLT5oYXNfY29tcHJlc3Npb25fYWxnb3JpdGhtKSB7CisgICAgLyogSWYgbm8gYWxnb3JpdGhtIHdhcyBmb3VuZCBpbiB0aGUgbWV0YWRhdGEgYW5kIHdlIGFyZW4ndAorICAgICAqIGV4Y2VwdGlvbmFsbHkgc2tpcHBpbmcgY29tcHJlc3Npb24sIGZhbGwgYmFjayB0byB0aGUgY2hhbm5lbAorICAgICAqIGRlZmF1bHQgKi8KKyAgICBjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtID0gY2hhbm5lbGQtPmRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtOworICAgIGNhbGxkLT5oYXNfY29tcHJlc3Npb25fYWxnb3JpdGhtID0gMTsgLyogR1BSX1RSVUUgKi8KKyAgfQorICAvKiBoaW50IGNvbXByZXNzaW9uIGFsZ29yaXRobSAqLworICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF90YWlsKAorICAgICAgaW5pdGlhbF9tZXRhZGF0YSwgJmNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG1fc3RvcmFnZSwKKyAgICAgIGdycGNfY29tcHJlc3Npb25fZW5jb2RpbmdfbWRlbGVtKGNhbGxkLT5jb21wcmVzc2lvbl9hbGdvcml0aG0pKTsKKworICAvKiBjb252ZXkgc3VwcG9ydGVkIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgKi8KKyAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfdGFpbChpbml0aWFsX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+YWNjZXB0X2VuY29kaW5nX3N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fQUNDRVBUX0VOQ09ESU5HX0ZPUl9BTEdPUklUSE1TKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsZC0+c3VwcG9ydGVkX2NvbXByZXNzaW9uX2FsZ29yaXRobXMpKTsKK30KKworc3RhdGljIHZvaWQgY29udGludWVfc2VuZF9tZXNzYWdlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKTsKKworc3RhdGljIHZvaWQgc2VuZF9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICplbGVtcCwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gZWxlbXA7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKCZjYWxsZC0+c2xpY2VzKTsKKyAgY2FsbGQtPnBvc3Rfc2VuZC0+Y2IoZXhlY19jdHgsIGNhbGxkLT5wb3N0X3NlbmQtPmNiX2FyZywgc3VjY2Vzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9zZW5kX21lc3NhZ2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGludCBkaWRfY29tcHJlc3M7CisgIGdwcl9zbGljZV9idWZmZXIgdG1wOworICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJnRtcCk7CisgIGRpZF9jb21wcmVzcyA9CisgICAgICBncnBjX21zZ19jb21wcmVzcyhjYWxsZC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtLCAmY2FsbGQtPnNsaWNlcywgJnRtcCk7CisgIGlmIChkaWRfY29tcHJlc3MpIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX3N3YXAoJmNhbGxkLT5zbGljZXMsICZ0bXApOworICAgIGNhbGxkLT5zZW5kX2ZsYWdzIHw9IEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1M7CisgIH0KKyAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZ0bXApOworCisgIGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbV9pbml0KCZjYWxsZC0+cmVwbGFjZW1lbnRfc3RyZWFtLCAmY2FsbGQtPnNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGQtPnNlbmRfZmxhZ3MpOworICBjYWxsZC0+c2VuZF9vcC5zZW5kX21lc3NhZ2UgPSAmY2FsbGQtPnJlcGxhY2VtZW50X3N0cmVhbS5iYXNlOworICBjYWxsZC0+cG9zdF9zZW5kID0gY2FsbGQtPnNlbmRfb3Aub25fY29tcGxldGU7CisgIGNhbGxkLT5zZW5kX29wLm9uX2NvbXBsZXRlID0gJmNhbGxkLT5zZW5kX2RvbmU7CisKKyAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sICZjYWxsZC0+c2VuZF9vcCk7Cit9CisKK3N0YXRpYyB2b2lkIGdvdF9zbGljZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZWxlbXAsIGJvb2wgc3VjY2VzcykgeworICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IGVsZW1wOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmY2FsbGQtPnNsaWNlcywgY2FsbGQtPmluY29taW5nX3NsaWNlKTsKKyAgaWYgKGNhbGxkLT5zZW5kX2xlbmd0aCA9PSBjYWxsZC0+c2xpY2VzLmxlbmd0aCkgeworICAgIGZpbmlzaF9zZW5kX21lc3NhZ2UoZXhlY19jdHgsIGVsZW0pOworICB9IGVsc2UgeworICAgIGNvbnRpbnVlX3NlbmRfbWVzc2FnZShleGVjX2N0eCwgZWxlbSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgY29udGludWVfc2VuZF9tZXNzYWdlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIHdoaWxlIChncnBjX2J5dGVfc3RyZWFtX25leHQoZXhlY19jdHgsIGNhbGxkLT5zZW5kX29wLnNlbmRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGQtPmluY29taW5nX3NsaWNlLCB+KHNpemVfdCkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+Z290X3NsaWNlKSkgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZjYWxsZC0+c2xpY2VzLCBjYWxsZC0+aW5jb21pbmdfc2xpY2UpOworICAgIGlmIChjYWxsZC0+c2VuZF9sZW5ndGggPT0gY2FsbGQtPnNsaWNlcy5sZW5ndGgpIHsKKyAgICAgIGZpbmlzaF9zZW5kX21lc3NhZ2UoZXhlY19jdHgsIGVsZW0pOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbXByZXNzX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJjb21wcmVzc19zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wIiwgMCk7CisKKyAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEpIHsKKyAgICBwcm9jZXNzX3NlbmRfaW5pdGlhbF9tZXRhZGF0YShlbGVtLCBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKTsKKyAgfQorICBpZiAob3AtPnNlbmRfbWVzc2FnZSAhPSBOVUxMICYmICFza2lwX2NvbXByZXNzaW9uKGVsZW0pICYmCisgICAgICAwID09IChvcC0+c2VuZF9tZXNzYWdlLT5mbGFncyAmIEdSUENfV1JJVEVfTk9fQ09NUFJFU1MpKSB7CisgICAgY2FsbGQtPnNlbmRfb3AgPSAqb3A7CisgICAgY2FsbGQtPnNlbmRfbGVuZ3RoID0gb3AtPnNlbmRfbWVzc2FnZS0+bGVuZ3RoOworICAgIGNhbGxkLT5zZW5kX2ZsYWdzID0gb3AtPnNlbmRfbWVzc2FnZS0+ZmxhZ3M7CisgICAgY29udGludWVfc2VuZF9tZXNzYWdlKGV4ZWNfY3R4LCBlbGVtKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXNzIGNvbnRyb2wgZG93biB0aGUgc3RhY2sgKi8KKyAgICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgZWxlbSwgb3ApOworICB9CisKKyAgR1BSX1RJTUVSX0VORCgiY29tcHJlc3Nfc3RhcnRfdHJhbnNwb3J0X3N0cmVhbV9vcCIsIDApOworfQorCisvKiBDb25zdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBpbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2FsbCBlbGVtZW50ICovCisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisKKyAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmY2FsbGQtPnNsaWNlcyk7CisgIGNhbGxkLT5oYXNfY29tcHJlc3Npb25fYWxnb3JpdGhtID0gMDsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5nb3Rfc2xpY2UsIGdvdF9zbGljZSwgZWxlbSk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsZC0+c2VuZF9kb25lLCBzZW5kX2RvbmUsIGVsZW0pOworfQorCisvKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjYWxsIGVsZW1lbnQgKi8KKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZjYWxsZC0+c2xpY2VzKTsKK30KKworLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLworc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgY2hhbm5lbF9kYXRhICpjaGFubmVsZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb19pZHg7CisKKyAgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zX2luaXQoJmNoYW5uZWxkLT5jb21wcmVzc2lvbl9vcHRpb25zKTsKKyAgY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMuZW5hYmxlZF9hbGdvcml0aG1zX2JpdHNldCA9CisgICAgICAodWludDMyX3QpZ3JwY19jaGFubmVsX2FyZ3NfY29tcHJlc3Npb25fYWxnb3JpdGhtX2dldF9zdGF0ZXMoCisgICAgICAgICAgYXJncy0+Y2hhbm5lbF9hcmdzKTsKKworICBjaGFubmVsZC0+ZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0gPQorICAgICAgZ3JwY19jaGFubmVsX2FyZ3NfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobShhcmdzLT5jaGFubmVsX2FyZ3MpOworICAvKiBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgaXNuJ3QgZGlzYWJsZWQuICovCisgIEdQUl9BU1NFUlQoZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zX2lzX2FsZ29yaXRobV9lbmFibGVkKAorICAgICAgJmNoYW5uZWxkLT5jb21wcmVzc2lvbl9vcHRpb25zLCBjaGFubmVsZC0+ZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0pKTsKKyAgY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMuZGVmYXVsdF9jb21wcmVzc2lvbl9hbGdvcml0aG0gPQorICAgICAgY2hhbm5lbGQtPmRlZmF1bHRfY29tcHJlc3Npb25fYWxnb3JpdGhtOworCisgIGNoYW5uZWxkLT5zdXBwb3J0ZWRfY29tcHJlc3Npb25fYWxnb3JpdGhtcyA9IDA7CisgIGZvciAoYWxnb19pZHggPSAwOyBhbGdvX2lkeCA8IEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDsgKythbGdvX2lkeCkgeworICAgIC8qIHNraXAgZGlzYWJsZWQgYWxnb3JpdGhtcyAqLworICAgIGlmIChncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfaXNfYWxnb3JpdGhtX2VuYWJsZWQoCisgICAgICAgICAgICAmY2hhbm5lbGQtPmNvbXByZXNzaW9uX29wdGlvbnMsIGFsZ29faWR4KSA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY2hhbm5lbGQtPnN1cHBvcnRlZF9jb21wcmVzc2lvbl9hbGdvcml0aG1zIHw9IDF1IDw8IGFsZ29faWR4OworICB9CisKKyAgR1BSX0FTU0VSVCghYXJncy0+aXNfbGFzdCk7Cit9CisKKy8qIERlc3RydWN0b3IgZm9yIGNoYW5uZWwgZGF0YSAqLworc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkge30KKworY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2NvbXByZXNzX2ZpbHRlciA9IHsKKyAgICBjb21wcmVzc19zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wLAorICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAorICAgIHNpemVvZihjYWxsX2RhdGEpLAorICAgIGluaXRfY2FsbF9lbGVtLAorICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCisgICAgZGVzdHJveV9jYWxsX2VsZW0sCisgICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCisgICAgaW5pdF9jaGFubmVsX2VsZW0sCisgICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCisgICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsCisgICAgImNvbXByZXNzIn07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTAwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaApAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9DT01QUkVTU19GSUxURVJfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ09NUFJFU1NfRklMVEVSX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKKworI2RlZmluZSBHUlBDX0NPTVBSRVNTX1JFUVVFU1RfQUxHT1JJVEhNX0tFWSAiZ3JwYy1pbnRlcm5hbC1lbmNvZGluZy1yZXF1ZXN0IgorCisvKiogQ29tcHJlc3Npb24gZmlsdGVyIGZvciBvdXRnb2luZyBkYXRhLgorICoKKyAqIFNlZSA8Z3JwYy9jb21wcmVzc2lvbi5oPiBmb3IgdGhlIGF2YWlsYWJsZSBjb21wcmVzc2lvbiBzZXR0aW5ncy4KKyAqCisgKiBDb21wcmVzc2lvbiBzZXR0aW5ncyBtYXkgY29tZSBmcm9tOgorICogIC0gQ2hhbm5lbCBjb25maWd1cmF0aW9uLCBhcyBlc3RhYmxpc2hlZCBhdCBjaGFubmVsIGNyZWF0aW9uIHRpbWUuCisgKiAgLSBUaGUgbWV0YWRhdGEgYWNjb21wYW55aW5nIHRoZSBvdXRnb2luZyBkYXRhIHRvIGJlIGNvbXByZXNzZWQuIFRoaXMgaXMKKyAqICAgIHRha2VuIGFzIGEgcmVxdWVzdCBvbmx5LiBXZSBtYXkgY2hvb3NlIG5vdCB0byBob25vciBpdC4gVGhlIG1ldGFkYXRhIGtleQorICogICAgaXMgZ2l2ZW4gYnkgXGEgR1JQQ19DT01QUkVTU19SRVFVRVNUX0FMR09SSVRITV9LRVkuCisgKgorICogQ29tcHJlc3Npb24gY2FuIGJlIGRpc2FibGVkIGZvciBjb25jcmV0ZSBtZXNzYWdlcyAoZm9yIGluc3RhbmNlIGluIG9yZGVyIHRvCisgKiBwcmV2ZW50IENSSU1FL0JFQVNUIHR5cGUgYXR0YWNrcykgYnkgaGF2aW5nIHRoZSBHUlBDX1dSSVRFX05PX0NPTVBSRVNTIHNldCBpbgorICogdGhlIEJFR0lOX01FU1NBR0UgZmxhZ3MuCisgKgorICogVGhlIGF0dGVtcHRlZCBjb21wcmVzc2lvbiBtZWNoYW5pc20gaXMgYWRkZWQgdG8gdGhlIHJlc3VsdGluZyBpbml0aWFsCisgKiBtZXRhZGF0YSB1bmRlciB0aGUnZ3JwYy1lbmNvZGluZycga2V5LgorICoKKyAqIElmIGNvbXByZXNzaW9uIGlzIGFjdHVhbGx5IHBlcmZvcm1lZCwgQkVHSU5fTUVTU0FHRSdzIGZsYWcgaXMgbW9kaWZpZWQgdG8KKyAqIGluY29ycG9yYXRlIEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1MuIE90aGVyd2lzZSwgYW5kIHJlZ2FyZGxlc3Mgb2YgdGhlCisgKiBhZm9yZW1lbnRpb25lZCAnZ3JwYy1lbmNvZGluZycgbWV0YWRhdGEgdmFsdWUsIGRhdGEgd2lsbCBwYXNzIHRocm91Z2gKKyAqIHVuY29tcHJlc3NlZC4gKi8KKworZXh0ZXJuIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19jb21wcmVzc19maWx0ZXI7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ09NUFJFU1NfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlM2E4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL2J5dGVfYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCisKKyNkZWZpbmUgTUFYX0JVRkZFUl9MRU5HVEggODE5MgorCit0eXBlZGVmIHN0cnVjdCBjb25uZWN0ZWRfY2hhbm5lbF9jaGFubmVsX2RhdGEgeworICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworfSBjaGFubmVsX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0IGNvbm5lY3RlZF9jaGFubmVsX2NhbGxfZGF0YSB7IHZvaWQgKnVudXNlZDsgfSBjYWxsX2RhdGE7CisKKy8qIFdlIHBlcmZvcm0gYSBzbWFsbCBoYWNrIHRvIGxvY2F0ZSB0cmFuc3BvcnQgZGF0YSBhbG9uZ3NpZGUgdGhlIGNvbm5lY3RlZAorICAgY2hhbm5lbCBkYXRhIGluIGNhbGwgYWxsb2NhdGlvbnMsIHRvIGFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcHVsbGVkIGluIG1pbmltYWwKKyAgIGNhY2hlIGxpbmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVFJBTlNQT1JUX1NUUkVBTV9GUk9NX0NBTExfREFUQShjYWxsZCkgKChncnBjX3N0cmVhbSAqKSgoY2FsbGQpICsgMSkpCisjZGVmaW5lIENBTExfREFUQV9GUk9NX1RSQU5TUE9SVF9TVFJFQU0odHJhbnNwb3J0X3N0cmVhbSkgXAorICAoKChjYWxsX2RhdGEgKikodHJhbnNwb3J0X3N0cmVhbSkpIC0gMSkKKworLyogSW50ZXJjZXB0IGEgY2FsbCBvcGVyYXRpb24gYW5kIGVpdGhlciBwdXNoIGl0IGRpcmVjdGx5IHVwIG9yIHRyYW5zbGF0ZSBpdAorICAgaW50byB0cmFuc3BvcnQgc3RyZWFtIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGNvbl9zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIEdSUENfQ0FMTF9MT0dfT1AoR1BSX0lORk8sIGVsZW0sIG9wKTsKKworICBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX3N0cmVhbV9vcChleGVjX2N0eCwgY2hhbmQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NUUkVBTV9GUk9NX0NBTExfREFUQShjYWxsZCksIG9wKTsKK30KKworc3RhdGljIHZvaWQgY29uX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCkgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGV4ZWNfY3R4LCBjaGFuZC0+dHJhbnNwb3J0LCBvcCk7Cit9CisKKy8qIENvbnN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgaW50IHI7CisKKyAgciA9IGdycGNfdHJhbnNwb3J0X2luaXRfc3RyZWFtKAorICAgICAgZXhlY19jdHgsIGNoYW5kLT50cmFuc3BvcnQsIFRSQU5TUE9SVF9TVFJFQU1fRlJPTV9DQUxMX0RBVEEoY2FsbGQpLAorICAgICAgJmFyZ3MtPmNhbGxfc3RhY2stPnJlZmNvdW50LCBhcmdzLT5zZXJ2ZXJfdHJhbnNwb3J0X2RhdGEpOworICBHUFJfQVNTRVJUKHIgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldChleGVjX2N0eCwgY2hhbmQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NUUkVBTV9GUk9NX0NBTExfREFUQShjYWxsZCksIHBvbGxzZXQpOworfQorCisvKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgZ3JwY190cmFuc3BvcnRfZGVzdHJveV9zdHJlYW0oZXhlY19jdHgsIGNoYW5kLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TVFJFQU1fRlJPTV9DQUxMX0RBVEEoY2FsbGQpKTsKK30KKworLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLworc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgY2hhbm5lbF9kYXRhICpjZCA9IChjaGFubmVsX2RhdGEgKillbGVtLT5jaGFubmVsX2RhdGE7CisgIEdQUl9BU1NFUlQoYXJncy0+aXNfbGFzdCk7CisgIGNkLT50cmFuc3BvcnQgPSBOVUxMOworfQorCisvKiBEZXN0cnVjdG9yIGZvciBjaGFubmVsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2hhbm5lbF9kYXRhICpjZCA9IChjaGFubmVsX2RhdGEgKillbGVtLT5jaGFubmVsX2RhdGE7CisgIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3koZXhlY19jdHgsIGNkLT50cmFuc3BvcnQpOworfQorCitzdGF0aWMgY2hhciAqY29uX2dldF9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICByZXR1cm4gZ3JwY190cmFuc3BvcnRfZ2V0X3BlZXIoZXhlY19jdHgsIGNoYW5kLT50cmFuc3BvcnQpOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBjb25uZWN0ZWRfY2hhbm5lbF9maWx0ZXIgPSB7CisgICAgY29uX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AsCisgICAgY29uX3N0YXJ0X3RyYW5zcG9ydF9vcCwKKyAgICBzaXplb2YoY2FsbF9kYXRhKSwKKyAgICBpbml0X2NhbGxfZWxlbSwKKyAgICBzZXRfcG9sbHNldCwKKyAgICBkZXN0cm95X2NhbGxfZWxlbSwKKyAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKKyAgICBpbml0X2NoYW5uZWxfZWxlbSwKKyAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKKyAgICBjb25fZ2V0X3BlZXIsCisgICAgImNvbm5lY3RlZCIsCit9OworCitzdGF0aWMgdm9pZCBiaW5kX3RyYW5zcG9ydChncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwgdm9pZCAqdCkgeworICBjaGFubmVsX2RhdGEgKmNkID0gKGNoYW5uZWxfZGF0YSAqKWVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgR1BSX0FTU0VSVChlbGVtLT5maWx0ZXIgPT0gJmNvbm5lY3RlZF9jaGFubmVsX2ZpbHRlcik7CisgIEdQUl9BU1NFUlQoY2QtPnRyYW5zcG9ydCA9PSBOVUxMKTsKKyAgY2QtPnRyYW5zcG9ydCA9IHQ7CisKKyAgLyogSEFDSyhjdGlsbGVyKTogaW5jcmVhc2UgY2FsbCBzdGFjayBzaXplIGZvciB0aGUgY2hhbm5lbCB0byBtYWtlIHNwYWNlCisgICAgIGZvciBjaGFubmVsIGRhdGEuIFdlIG5lZWQgYSBjbGVhbmVyIChidXQgcGVyZm9ybWFudCkgd2F5IHRvIGRvIHRoaXMsCisgICAgIGFuZCBJJ20gbm90IHN1cmUgd2hhdCB0aGF0IGlzIHlldC4KKyAgICAgVGhpcyBpcyBvbmx5ICJzYWZlIiBiZWNhdXNlIGNhbGwgc3RhY2tzIHBsYWNlIG5vIGFkZGl0aW9uYWwgZGF0YSBhZnRlcgorICAgICB0aGUgbGFzdCBjYWxsIGVsZW1lbnQsIGFuZCB0aGUgbGFzdCBjYWxsIGVsZW1lbnQgTVVTVCBiZSB0aGUgY29ubmVjdGVkCisgICAgIGNoYW5uZWwuICovCisgIGNoYW5uZWxfc3RhY2stPmNhbGxfc3RhY2tfc2l6ZSArPSBncnBjX3RyYW5zcG9ydF9zdHJlYW1fc2l6ZSh0KTsKK30KKworYm9vbCBncnBjX2FkZF9jb25uZWN0ZWRfZmlsdGVyKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZ19tdXN0X2JlX251bGwpIHsKKyAgR1BSX0FTU0VSVChhcmdfbXVzdF9iZV9udWxsID09IE5VTEwpOworICBncnBjX3RyYW5zcG9ydCAqdCA9IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF90cmFuc3BvcnQoYnVpbGRlcik7CisgIEdQUl9BU1NFUlQodCAhPSBOVUxMKTsKKyAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FwcGVuZF9maWx0ZXIoCisgICAgICBidWlsZGVyLCAmY29ubmVjdGVkX2NoYW5uZWxfZmlsdGVyLCBiaW5kX3RyYW5zcG9ydCwgdCk7Cit9CisKK2dycGNfc3RyZWFtICpncnBjX2Nvbm5lY3RlZF9jaGFubmVsX2dldF9zdHJlYW0oZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgcmV0dXJuIFRSQU5TUE9SVF9TVFJFQU1fRlJPTV9DQUxMX0RBVEEoY2FsbGQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyMGI3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ09OTkVDVEVEX0NIQU5ORUxfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ09OTkVDVEVEX0NIQU5ORUxfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiCisKK2Jvb2wgZ3JwY19hZGRfY29ubmVjdGVkX2ZpbHRlcihncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmdfbXVzdF9iZV9udWxsKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9DT05ORUNURURfQ0hBTk5FTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmggYi9zcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhMTAyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbnRleHQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9DT05URVhUX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0NPTlRFWFRfSAorCisvKiBDYWxsIG9iamVjdCBjb250ZXh0IHBvaW50ZXJzICovCit0eXBlZGVmIGVudW0geworICBHUlBDX0NPTlRFWFRfU0VDVVJJVFkgPSAwLAorICBHUlBDX0NPTlRFWFRfVFJBQ0lORywKKyAgR1JQQ19DT05URVhUX0NPVU5UCit9IGdycGNfY29udGV4dF9pbmRleDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICp2YWx1ZTsKKyAgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKik7Cit9IGdycGNfY2FsbF9jb250ZXh0X2VsZW1lbnQ7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmFjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2FsbF9kYXRhIHsKKyAgZ3JwY19saW5rZWRfbWRlbGVtIG1ldGhvZDsKKyAgZ3JwY19saW5rZWRfbWRlbGVtIHNjaGVtZTsKKyAgZ3JwY19saW5rZWRfbWRlbGVtIGF1dGhvcml0eTsKKyAgZ3JwY19saW5rZWRfbWRlbGVtIHRlX3RyYWlsZXJzOworICBncnBjX2xpbmtlZF9tZGVsZW0gY29udGVudF90eXBlOworICBncnBjX2xpbmtlZF9tZGVsZW0gdXNlcl9hZ2VudDsKKworICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7CisKKyAgLyoqIENsb3N1cmUgdG8gY2FsbCB3aGVuIGZpbmlzaGVkIHdpdGggdGhlIGhjX29uX3JlY3YgaG9vayAqLworICBncnBjX2Nsb3N1cmUgKm9uX2RvbmVfcmVjdjsKKyAgLyoqIFJlY2VpdmUgY2xvc3VyZXMgYXJlIGNoYWluZWQ6IHdlIGluamVjdCB0aGlzIGNsb3N1cmUgYXMgdGhlIG9uX2RvbmVfcmVjdgorICAgICAgdXAtY2FsbCBvbiB0cmFuc3BvcnRfb3AsIGFuZCByZW1lbWJlciB0byBjYWxsIG91ciBvbl9kb25lX3JlY3YgbWVtYmVyCisgICAgICBhZnRlciBoYW5kbGluZyBpdC4gKi8KKyAgZ3JwY19jbG9zdXJlIGhjX29uX3JlY3Y7Cit9IGNhbGxfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9kYXRhIHsKKyAgZ3JwY19tZGVsZW0gKnN0YXRpY19zY2hlbWU7CisgIGdycGNfbWRlbGVtICp1c2VyX2FnZW50OworfSBjaGFubmVsX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW07CisgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4OworfSBjbGllbnRfcmVjdl9maWx0ZXJfYXJnczsKKworc3RhdGljIGdycGNfbWRlbGVtICpjbGllbnRfcmVjdl9maWx0ZXIodm9pZCAqdXNlcl9kYXRhLCBncnBjX21kZWxlbSAqbWQpIHsKKyAgY2xpZW50X3JlY3ZfZmlsdGVyX2FyZ3MgKmEgPSB1c2VyX2RhdGE7CisgIGlmIChtZCA9PSBHUlBDX01ERUxFTV9TVEFUVVNfMjAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX1NUQVRVUykgeworICAgIGdycGNfY2FsbF9lbGVtZW50X3NlbmRfY2FuY2VsKGEtPmV4ZWNfY3R4LCBhLT5lbGVtKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfQ09OVEVOVF9UWVBFKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1kOworfQorCitzdGF0aWMgdm9pZCBoY19vbl9yZWN2KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2VzcykgeworICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IHVzZXJfZGF0YTsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2xpZW50X3JlY3ZfZmlsdGVyX2FyZ3MgYTsKKyAgYS5lbGVtID0gZWxlbTsKKyAgYS5leGVjX2N0eCA9IGV4ZWNfY3R4OworICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhLCBjbGllbnRfcmVjdl9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhKTsKKyAgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2IoZXhlY19jdHgsIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiX2FyZywgc3VjY2Vzcyk7Cit9CisKK3N0YXRpYyBncnBjX21kZWxlbSAqY2xpZW50X3N0cmlwX2ZpbHRlcih2b2lkICp1c2VyX2RhdGEsIGdycGNfbWRlbGVtICptZCkgeworICAvKiBlYXQgdGhlIHRoaW5ncyB3ZSdkIGxpa2UgdG8gc2V0IG91cnNlbHZlcyAqLworICBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX01FVEhPRCkgcmV0dXJuIE5VTEw7CisgIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfU0NIRU1FKSByZXR1cm4gTlVMTDsKKyAgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9URSkgcmV0dXJuIE5VTEw7CisgIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfQ09OVEVOVF9UWVBFKSByZXR1cm4gTlVMTDsKKyAgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9VU0VSX0FHRU5UKSByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG1kOworfQorCitzdGF0aWMgdm9pZCBoY19tdXRhdGVfb3AoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNhbGwgZWxlbWVudCAqLworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5uZWxkID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBpZiAob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwgY2xpZW50X3N0cmlwX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKTsKKyAgICAvKiBTZW5kIDogcHJlZml4ZWQgaGVhZGVycywgd2hpY2ggaGF2ZSB0byBiZSBiZWZvcmUgYW55IGFwcGxpY2F0aW9uCisgICAgICAgbGF5ZXIgaGVhZGVycy4gKi8KKyAgICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF9oZWFkKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsICZjYWxsZC0+bWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fTUVUSE9EX1BPU1QpOworICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX2hlYWQob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwgJmNhbGxkLT5zY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsZC0+c3RhdGljX3NjaGVtZSk7CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfdGFpbChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhLCAmY2FsbGQtPnRlX3RyYWlsZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fVEVfVFJBSUxFUlMpOworICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwoCisgICAgICAgIG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsICZjYWxsZC0+Y29udGVudF90eXBlLAorICAgICAgICBHUlBDX01ERUxFTV9DT05URU5UX1RZUEVfQVBQTElDQVRJT05fU0xBU0hfR1JQQyk7CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfdGFpbChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhLCAmY2FsbGQtPnVzZXJfYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX01ERUxFTV9SRUYoY2hhbm5lbGQtPnVzZXJfYWdlbnQpKTsKKyAgfQorCisgIGlmIChvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAvKiBzdWJzdGl0dXRlIG91ciBjYWxsYmFjayBmb3IgdGhlIGhpZ2hlciBjYWxsYmFjayAqLworICAgIGNhbGxkLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgPSBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhOworICAgIGNhbGxkLT5vbl9kb25lX3JlY3YgPSBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5OworICAgIG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgPSAmY2FsbGQtPmhjX29uX3JlY3Y7CisgIH0KK30KKworc3RhdGljIHZvaWQgaGNfc3RhcnRfdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgR1BSX1RJTUVSX0JFR0lOKCJoY19zdGFydF90cmFuc3BvcnRfb3AiLCAwKTsKKyAgR1JQQ19DQUxMX0xPR19PUChHUFJfSU5GTywgZWxlbSwgb3ApOworICBoY19tdXRhdGVfb3AoZWxlbSwgb3ApOworICBHUFJfVElNRVJfRU5EKCJoY19zdGFydF90cmFuc3BvcnRfb3AiLCAwKTsKKyAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sIG9wKTsKK30KKworLyogQ29uc3RydWN0b3IgZm9yIGNhbGxfZGF0YSAqLworc3RhdGljIHZvaWQgaW5pdF9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncykgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjYWxsZC0+b25fZG9uZV9yZWN2ID0gTlVMTDsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5oY19vbl9yZWN2LCBoY19vbl9yZWN2LCBlbGVtKTsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7fQorCitzdGF0aWMgZ3JwY19tZGVsZW0gKnNjaGVtZV9mcm9tX2FyZ3MoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpIHsKKyAgdW5zaWduZWQgaTsKKyAgc2l6ZV90IGo7CisgIGdycGNfbWRlbGVtICp2YWxpZF9zY2hlbWVzW10gPSB7R1JQQ19NREVMRU1fU0NIRU1FX0hUVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NREVMRU1fU0NIRU1FX0hUVFBTfTsKKyAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzLT5udW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoYXJncy0+YXJnc1tpXS50eXBlID09IEdSUENfQVJHX1NUUklORyAmJgorICAgICAgICAgIHN0cmNtcChhcmdzLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfSFRUUDJfU0NIRU1FKSA9PSAwKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBHUFJfQVJSQVlfU0laRSh2YWxpZF9zY2hlbWVzKTsgaisrKSB7CisgICAgICAgICAgaWYgKDAgPT0gc3RyY21wKGdycGNfbWRzdHJfYXNfY19zdHJpbmcodmFsaWRfc2NoZW1lc1tqXS0+dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5hcmdzW2ldLnZhbHVlLnN0cmluZykpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWxpZF9zY2hlbWVzW2pdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR1JQQ19NREVMRU1fU0NIRU1FX0hUVFA7Cit9CisKK3N0YXRpYyBncnBjX21kc3RyICp1c2VyX2FnZW50X2Zyb21fYXJncyhjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncykgeworICBncHJfc3RydmVjIHY7CisgIHNpemVfdCBpOworICBpbnQgaXNfZmlyc3QgPSAxOworICBjaGFyICp0bXA7CisgIGdycGNfbWRzdHIgKnJlc3VsdDsKKworICBncHJfc3RydmVjX2luaXQoJnYpOworCisgIGZvciAoaSA9IDA7IGFyZ3MgJiYgaSA8IGFyZ3MtPm51bV9hcmdzOyBpKyspIHsKKyAgICBpZiAoMCA9PSBzdHJjbXAoYXJncy0+YXJnc1tpXS5rZXksIEdSUENfQVJHX1BSSU1BUllfVVNFUl9BR0VOVF9TVFJJTkcpKSB7CisgICAgICBpZiAoYXJncy0+YXJnc1tpXS50eXBlICE9IEdSUENfQVJHX1NUUklORykgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNoYW5uZWwgYXJndW1lbnQgJyVzJyBzaG91bGQgYmUgYSBzdHJpbmciLAorICAgICAgICAgICAgICAgIEdSUENfQVJHX1BSSU1BUllfVVNFUl9BR0VOVF9TVFJJTkcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFpc19maXJzdCkgZ3ByX3N0cnZlY19hZGQoJnYsIGdwcl9zdHJkdXAoIiAiKSk7CisgICAgICAgIGlzX2ZpcnN0ID0gMDsKKyAgICAgICAgZ3ByX3N0cnZlY19hZGQoJnYsIGdwcl9zdHJkdXAoYXJncy0+YXJnc1tpXS52YWx1ZS5zdHJpbmcpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBncHJfYXNwcmludGYoJnRtcCwgIiVzZ3JwYy1jLyVzICglcykiLCBpc19maXJzdCA/ICIiIDogIiAiLAorICAgICAgICAgICAgICAgZ3JwY192ZXJzaW9uX3N0cmluZygpLCBHUFJfUExBVEZPUk1fU1RSSU5HKTsKKyAgaXNfZmlyc3QgPSAwOworICBncHJfc3RydmVjX2FkZCgmdiwgdG1wKTsKKworICBmb3IgKGkgPSAwOyBhcmdzICYmIGkgPCBhcmdzLT5udW1fYXJnczsgaSsrKSB7CisgICAgaWYgKDAgPT0gc3RyY21wKGFyZ3MtPmFyZ3NbaV0ua2V5LCBHUlBDX0FSR19TRUNPTkRBUllfVVNFUl9BR0VOVF9TVFJJTkcpKSB7CisgICAgICBpZiAoYXJncy0+YXJnc1tpXS50eXBlICE9IEdSUENfQVJHX1NUUklORykgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNoYW5uZWwgYXJndW1lbnQgJyVzJyBzaG91bGQgYmUgYSBzdHJpbmciLAorICAgICAgICAgICAgICAgIEdSUENfQVJHX1NFQ09OREFSWV9VU0VSX0FHRU5UX1NUUklORyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlzX2ZpcnN0KSBncHJfc3RydmVjX2FkZCgmdiwgZ3ByX3N0cmR1cCgiICIpKTsKKyAgICAgICAgaXNfZmlyc3QgPSAwOworICAgICAgICBncHJfc3RydmVjX2FkZCgmdiwgZ3ByX3N0cmR1cChhcmdzLT5hcmdzW2ldLnZhbHVlLnN0cmluZykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHRtcCA9IGdwcl9zdHJ2ZWNfZmxhdHRlbigmdiwgTlVMTCk7CisgIGdwcl9zdHJ2ZWNfZGVzdHJveSgmdik7CisgIHJlc3VsdCA9IGdycGNfbWRzdHJfZnJvbV9zdHJpbmcodG1wKTsKKyAgZ3ByX2ZyZWUodG1wKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBDb25zdHJ1Y3RvciBmb3IgY2hhbm5lbF9kYXRhICovCitzdGF0aWMgdm9pZCBpbml0X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJncyAqYXJncykgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBHUFJfQVNTRVJUKCFhcmdzLT5pc19sYXN0KTsKKyAgY2hhbmQtPnN0YXRpY19zY2hlbWUgPSBzY2hlbWVfZnJvbV9hcmdzKGFyZ3MtPmNoYW5uZWxfYXJncyk7CisgIGNoYW5kLT51c2VyX2FnZW50ID0gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKAorICAgICAgR1JQQ19NRFNUUl9VU0VSX0FHRU5ULCB1c2VyX2FnZW50X2Zyb21fYXJncyhhcmdzLT5jaGFubmVsX2FyZ3MpKTsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgY2hhbm5lbCBkYXRhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIEdSUENfTURFTEVNX1VOUkVGKGNoYW5kLT51c2VyX2FnZW50KTsKK30KKworY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2h0dHBfY2xpZW50X2ZpbHRlciA9IHsKKyAgICBoY19zdGFydF90cmFuc3BvcnRfb3AsCisgICAgZ3JwY19jaGFubmVsX25leHRfb3AsCisgICAgc2l6ZW9mKGNhbGxfZGF0YSksCisgICAgaW5pdF9jYWxsX2VsZW0sCisgICAgZ3JwY19jYWxsX3N0YWNrX2lnbm9yZV9zZXRfcG9sbHNldCwKKyAgICBkZXN0cm95X2NhbGxfZWxlbSwKKyAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKKyAgICBpbml0X2NoYW5uZWxfZWxlbSwKKyAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKKyAgICBncnBjX2NhbGxfbmV4dF9nZXRfcGVlciwKKyAgICAiaHR0cC1jbGllbnQifTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4NDI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0hUVFBfQ0xJRU5UX0ZJTFRFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0hBTk5FTF9IVFRQX0NMSUVOVF9GSUxURVJfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgorCisvKiBQcm9jZXNzZXMgbWV0YWRhdGEgb24gdGhlIGNsaWVudCBzaWRlIGZvciBIVFRQMiB0cmFuc3BvcnRzICovCitleHRlcm4gY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2h0dHBfY2xpZW50X2ZpbHRlcjsKKworI2RlZmluZSBHUlBDX0FSR19IVFRQMl9TQ0hFTUUgImdycGMuaHR0cDJfc2NoZW1lIgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0hUVFBfQ0xJRU5UX0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTliNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgY2FsbF9kYXRhIHsKKyAgdWludDhfdCBzZWVuX3BhdGg7CisgIHVpbnQ4X3Qgc2Vlbl9wb3N0OworICB1aW50OF90IHNlbnRfc3RhdHVzOworICB1aW50OF90IHNlZW5fc2NoZW1lOworICB1aW50OF90IHNlZW5fdGVfdHJhaWxlcnM7CisgIHVpbnQ4X3Qgc2Vlbl9hdXRob3JpdHk7CisgIGdycGNfbGlua2VkX21kZWxlbSBzdGF0dXM7CisgIGdycGNfbGlua2VkX21kZWxlbSBjb250ZW50X3R5cGU7CisKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl9pbml0aWFsX21ldGFkYXRhOworICAvKiogQ2xvc3VyZSB0byBjYWxsIHdoZW4gZmluaXNoZWQgd2l0aCB0aGUgaHNfb25fcmVjdiBob29rICovCisgIGdycGNfY2xvc3VyZSAqb25fZG9uZV9yZWN2OworICAvKiogUmVjZWl2ZSBjbG9zdXJlcyBhcmUgY2hhaW5lZDogd2UgaW5qZWN0IHRoaXMgY2xvc3VyZSBhcyB0aGUgb25fZG9uZV9yZWN2CisgICAgICB1cC1jYWxsIG9uIHRyYW5zcG9ydF9vcCwgYW5kIHJlbWVtYmVyIHRvIGNhbGwgb3VyIG9uX2RvbmVfcmVjdiBtZW1iZXIKKyAgICAgIGFmdGVyIGhhbmRsaW5nIGl0LiAqLworICBncnBjX2Nsb3N1cmUgaHNfb25fcmVjdjsKK30gY2FsbF9kYXRhOworCit0eXBlZGVmIHN0cnVjdCBjaGFubmVsX2RhdGEgeyB1aW50OF90IHVudXNlZDsgfSBjaGFubmVsX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW07CisgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4OworfSBzZXJ2ZXJfZmlsdGVyX2FyZ3M7CisKK3N0YXRpYyBncnBjX21kZWxlbSAqc2VydmVyX2ZpbHRlcih2b2lkICp1c2VyX2RhdGEsIGdycGNfbWRlbGVtICptZCkgeworICBzZXJ2ZXJfZmlsdGVyX2FyZ3MgKmEgPSB1c2VyX2RhdGE7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gYS0+ZWxlbTsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKworICAvKiBDaGVjayBpZiBpdCBpcyBvbmUgb2YgdGhlIGhlYWRlcnMgd2UgY2FyZSBhYm91dC4gKi8KKyAgaWYgKG1kID09IEdSUENfTURFTEVNX1RFX1RSQUlMRVJTIHx8IG1kID09IEdSUENfTURFTEVNX01FVEhPRF9QT1NUIHx8CisgICAgICBtZCA9PSBHUlBDX01ERUxFTV9TQ0hFTUVfSFRUUCB8fCBtZCA9PSBHUlBDX01ERUxFTV9TQ0hFTUVfSFRUUFMgfHwKKyAgICAgIG1kID09IEdSUENfTURFTEVNX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9TTEFTSF9HUlBDKSB7CisgICAgLyogc3dhbGxvdyBpdCAqLworICAgIGlmIChtZCA9PSBHUlBDX01ERUxFTV9NRVRIT0RfUE9TVCkgeworICAgICAgY2FsbGQtPnNlZW5fcG9zdCA9IDE7CisgICAgfSBlbHNlIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfU0NIRU1FKSB7CisgICAgICBjYWxsZC0+c2Vlbl9zY2hlbWUgPSAxOworICAgIH0gZWxzZSBpZiAobWQgPT0gR1JQQ19NREVMRU1fVEVfVFJBSUxFUlMpIHsKKyAgICAgIGNhbGxkLT5zZWVuX3RlX3RyYWlsZXJzID0gMTsKKyAgICB9CisgICAgLyogVE9ETyhrbGVtcG5lcik6IFRyYWNrIHRoYXQgd2UndmUgc2VlbiBhbGwgdGhlIGhlYWRlcnMgd2Ugc2hvdWxkCisgICAgICAgcmVxdWlyZSAqLworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9DT05URU5UX1RZUEUpIHsKKyAgICBpZiAoc3RybmNtcChncnBjX21kc3RyX2FzX2Nfc3RyaW5nKG1kLT52YWx1ZSksICJhcHBsaWNhdGlvbi9ncnBjKyIsIDE3KSA9PQorICAgICAgICAwKSB7CisgICAgICAvKiBBbHRob3VnaCB0aGUgQyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IChjdXJyZW50bHkpIGdlbmVyYXRlIHRoZW0sCisgICAgICAgICBhbnkgY3VzdG9tICstc3VmZml4IGlzIGV4cGxpY2l0bHkgdmFsaWQuICovCisgICAgICAvKiBUT0RPKGtsZW1wbmVyKTogV2Ugc2hvdWxkIGNvbnNpZGVyIHByZWFsbG9jYXRpbmcgY29tbW9uIHZhbHVlcyBzdWNoCisgICAgICAgICBhcyArcHJvdG8gb3IgK2pzb24sIG9yIGF0IGxlYXN0IHN0YXNoaW5nIHRoZW0gaWYgd2Ugc2VlIHRoZW0uICovCisgICAgICAvKiBUT0RPKGtsZW1wbmVyKTogU2hvdWxkIHdlIGJlIHN1cmZhY2luZyB0aGlzIHRvIGFwcGxpY2F0aW9uIGNvZGU/ICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBXZSdyZSBjdXJyZW50bHkgYWxsb3dpbmcgdGhpcywgYnV0IHdlIHNob3VsZG4ndAorICAgICAgICAgc2VlIGl0IHdpdGhvdXQgYSBwcm94eSBzbyBsb2cgZm9yIG5vdy4gKi8KKyAgICAgIGdwcl9sb2coR1BSX0lORk8sICJVbmV4cGVjdGVkIGNvbnRlbnQtdHlwZSAlcyIsCisgICAgICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9URSB8fCBtZC0+a2V5ID09IEdSUENfTURTVFJfTUVUSE9EIHx8CisgICAgICAgICAgICAgbWQtPmtleSA9PSBHUlBDX01EU1RSX1NDSEVNRSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCAlczogaGVhZGVyOiAnJXMnIiwKKyAgICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPmtleSksIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSk7CisgICAgLyogc3dhbGxvdyBpdCBhbmQgZXJyb3IgZXZlcnl0aGluZyBvdXQuICovCisgICAgLyogVE9ETyhrbGVtcG5lcik6IFdlIG91Z2h0IHRvIGdlbmVyYXRlIG1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMKKyAgICAgICBvbiB0aGUgd2lyZSBoZXJlLiAqLworICAgIGdycGNfY2FsbF9lbGVtZW50X3NlbmRfY2FuY2VsKGEtPmV4ZWNfY3R4LCBlbGVtKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfUEFUSCkgeworICAgIGlmIChjYWxsZC0+c2Vlbl9wYXRoKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlJlY2VpdmVkIDpwYXRoIHR3aWNlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2FsbGQtPnNlZW5fcGF0aCA9IDE7CisgICAgcmV0dXJuIG1kOworICB9IGVsc2UgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9BVVRIT1JJVFkpIHsKKyAgICBjYWxsZC0+c2Vlbl9hdXRob3JpdHkgPSAxOworICAgIHJldHVybiBtZDsKKyAgfSBlbHNlIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfSE9TVCkgeworICAgIC8qIHRyYW5zbGF0ZSBob3N0IHRvIDphdXRob3JpdHkgc2luY2UgOmF1dGhvcml0eSBtYXkgYmUKKyAgICAgICBvbWl0dGVkICovCisgICAgZ3JwY19tZGVsZW0gKmF1dGhvcml0eSA9IGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncygKKyAgICAgICAgR1JQQ19NRFNUUl9BVVRIT1JJVFksIEdSUENfTURTVFJfUkVGKG1kLT52YWx1ZSkpOworICAgIGNhbGxkLT5zZWVuX2F1dGhvcml0eSA9IDE7CisgICAgcmV0dXJuIGF1dGhvcml0eTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbWQ7CisgIH0KK30KKworc3RhdGljIHZvaWQgaHNfb25fcmVjdihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLCBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSB1c2VyX2RhdGE7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGlmIChzdWNjZXNzKSB7CisgICAgc2VydmVyX2ZpbHRlcl9hcmdzIGE7CisgICAgYS5lbGVtID0gZWxlbTsKKyAgICBhLmV4ZWNfY3R4ID0gZXhlY19jdHg7CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIoY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSwgc2VydmVyX2ZpbHRlciwgJmEpOworICAgIC8qIEhhdmUgd2Ugc2VlbiB0aGUgcmVxdWlyZWQgaHR0cDIgdHJhbnNwb3J0IGhlYWRlcnM/CisgICAgICAgKDptZXRob2QsIDpzY2hlbWUsIGNvbnRlbnQtdHlwZSwgd2l0aCA6cGF0aCBhbmQgOmF1dGhvcml0eSBjb3ZlcmVkCisgICAgICAgYXQgdGhlIGNoYW5uZWwgbGV2ZWwgcmlnaHQgbm93KSAqLworICAgIGlmIChjYWxsZC0+c2Vlbl9wb3N0ICYmIGNhbGxkLT5zZWVuX3NjaGVtZSAmJiBjYWxsZC0+c2Vlbl90ZV90cmFpbGVycyAmJgorICAgICAgICBjYWxsZC0+c2Vlbl9wYXRoICYmIGNhbGxkLT5zZWVuX2F1dGhvcml0eSkgeworICAgICAgLyogZG8gbm90aGluZyAqLworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWNhbGxkLT5zZWVuX3BhdGgpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIDpwYXRoIGhlYWRlciIpOworICAgICAgfQorICAgICAgaWYgKCFjYWxsZC0+c2Vlbl9hdXRob3JpdHkpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIDphdXRob3JpdHkgaGVhZGVyIik7CisgICAgICB9CisgICAgICBpZiAoIWNhbGxkLT5zZWVuX3Bvc3QpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIDptZXRob2QgaGVhZGVyIik7CisgICAgICB9CisgICAgICBpZiAoIWNhbGxkLT5zZWVuX3NjaGVtZSkgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgOnNjaGVtZSBoZWFkZXIiKTsKKyAgICAgIH0KKyAgICAgIGlmICghY2FsbGQtPnNlZW5fdGVfdHJhaWxlcnMpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIHRlIHRyYWlsZXJzIGhlYWRlciIpOworICAgICAgfQorICAgICAgLyogRXJyb3IgdGhpcyBjYWxsIG91dCAqLworICAgICAgc3VjY2VzcyA9IDA7CisgICAgICBncnBjX2NhbGxfZWxlbWVudF9zZW5kX2NhbmNlbChleGVjX2N0eCwgZWxlbSk7CisgICAgfQorICB9CisgIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiKGV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYl9hcmcsIHN1Y2Nlc3MpOworfQorCitzdGF0aWMgdm9pZCBoc19tdXRhdGVfb3AoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNhbGwgZWxlbWVudCAqLworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworCisgIGlmIChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwgJiYgIWNhbGxkLT5zZW50X3N0YXR1cykgeworICAgIGNhbGxkLT5zZW50X3N0YXR1cyA9IDE7CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfaGVhZChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhLCAmY2FsbGQtPnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURFTEVNX1NUQVRVU18yMDApOworICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwoCisgICAgICAgIG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsICZjYWxsZC0+Y29udGVudF90eXBlLAorICAgICAgICBHUlBDX01ERUxFTV9DT05URU5UX1RZUEVfQVBQTElDQVRJT05fU0xBU0hfR1JQQyk7CisgIH0KKworICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSkgeworICAgIC8qIHN1YnN0aXR1dGUgb3VyIGNhbGxiYWNrIGZvciB0aGUgaGlnaGVyIGNhbGxiYWNrICovCisgICAgY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSA9IG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGE7CisgICAgY2FsbGQtPm9uX2RvbmVfcmVjdiA9IG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7CisgICAgb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9ICZjYWxsZC0+aHNfb25fcmVjdjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBoc19zdGFydF90cmFuc3BvcnRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBHUlBDX0NBTExfTE9HX09QKEdQUl9JTkZPLCBlbGVtLCBvcCk7CisgIEdQUl9USU1FUl9CRUdJTigiaHNfc3RhcnRfdHJhbnNwb3J0X29wIiwgMCk7CisgIGhzX211dGF0ZV9vcChlbGVtLCBvcCk7CisgIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7CisgIEdQUl9USU1FUl9FTkQoImhzX3N0YXJ0X3RyYW5zcG9ydF9vcCIsIDApOworfQorCisvKiBDb25zdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBpbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2FsbCBlbGVtZW50ICovCisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIC8qIGluaXRpYWxpemUgbWVtYmVycyAqLworICBtZW1zZXQoY2FsbGQsIDAsIHNpemVvZigqY2FsbGQpKTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5oc19vbl9yZWN2LCBoc19vbl9yZWN2LCBlbGVtKTsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7fQorCisvKiBDb25zdHJ1Y3RvciBmb3IgY2hhbm5lbF9kYXRhICovCitzdGF0aWMgdm9pZCBpbml0X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnRfYXJncyAqYXJncykgeworICBHUFJfQVNTRVJUKCFhcmdzLT5pc19sYXN0KTsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgY2hhbm5lbCBkYXRhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7fQorCitjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfaHR0cF9zZXJ2ZXJfZmlsdGVyID0geworICAgIGhzX3N0YXJ0X3RyYW5zcG9ydF9vcCwKKyAgICBncnBjX2NoYW5uZWxfbmV4dF9vcCwKKyAgICBzaXplb2YoY2FsbF9kYXRhKSwKKyAgICBpbml0X2NhbGxfZWxlbSwKKyAgICBncnBjX2NhbGxfc3RhY2tfaWdub3JlX3NldF9wb2xsc2V0LAorICAgIGRlc3Ryb3lfY2FsbF9lbGVtLAorICAgIHNpemVvZihjaGFubmVsX2RhdGEpLAorICAgIGluaXRfY2hhbm5lbF9lbGVtLAorICAgIGRlc3Ryb3lfY2hhbm5lbF9lbGVtLAorICAgIGdycGNfY2FsbF9uZXh0X2dldF9wZWVyLAorICAgICJodHRwLXNlcnZlciJ9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmggYi9zcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNmOTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NIQU5ORUxfSFRUUF9TRVJWRVJfRklMVEVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0hUVFBfU0VSVkVSX0ZJTFRFUl9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisKKy8qIFByb2Nlc3NlcyBtZXRhZGF0YSBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIEhUVFAyIHRyYW5zcG9ydHMgKi8KK2V4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfaHR0cF9zZXJ2ZXJfZmlsdGVyOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DSEFOTkVMX0hUVFBfU0VSVkVSX0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMgYi9zcmMvY29yZS9saWIvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2ZDQyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKworI2RlZmluZSBHRVRfQ0FMTChob2xkZXIpIFwKKyAgKChncnBjX3N1YmNoYW5uZWxfY2FsbCAqKShncHJfYXRtX2FjcV9sb2FkKCYoaG9sZGVyKS0+c3ViY2hhbm5lbF9jYWxsKSkpCisKKyNkZWZpbmUgQ0FOQ0VMTEVEX0NBTEwgKChncnBjX3N1YmNoYW5uZWxfY2FsbCAqKTEpCisKK3N0YXRpYyB2b2lkIHN1YmNoYW5uZWxfcmVhZHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKK3N0YXRpYyB2b2lkIHJldHJ5X29wcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcmV0cnlfb3BzX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKKworc3RhdGljIHZvaWQgYWRkX3dhaXRpbmdfbG9ja2VkKGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOworc3RhdGljIHZvaWQgZmFpbF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcik7CitzdGF0aWMgdm9pZCByZXRyeV93YWl0aW5nX2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyKTsKKwordm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfaW5pdCgKKyAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlciwKKyAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGlja19zdWJjaGFubmVsIHBpY2tfc3ViY2hhbm5lbCwKKyAgICB2b2lkICpwaWNrX3N1YmNoYW5uZWxfYXJnLCBncnBjX2NhbGxfc3RhY2sgKm93bmluZ19jYWxsKSB7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZob2xkZXItPnN1YmNoYW5uZWxfY2FsbCwgMCk7CisgIGhvbGRlci0+cGlja19zdWJjaGFubmVsID0gcGlja19zdWJjaGFubmVsOworICBob2xkZXItPnBpY2tfc3ViY2hhbm5lbF9hcmcgPSBwaWNrX3N1YmNoYW5uZWxfYXJnOworICBncHJfbXVfaW5pdCgmaG9sZGVyLT5tdSk7CisgIGhvbGRlci0+Y29ubmVjdGVkX3N1YmNoYW5uZWwgPSBOVUxMOworICBob2xkZXItPndhaXRpbmdfb3BzID0gTlVMTDsKKyAgaG9sZGVyLT53YWl0aW5nX29wc19jb3VudCA9IDA7CisgIGhvbGRlci0+d2FpdGluZ19vcHNfY2FwYWNpdHkgPSAwOworICBob2xkZXItPmNyZWF0aW9uX3BoYXNlID0gR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX05PVF9DUkVBVElORzsKKyAgaG9sZGVyLT5vd25pbmdfY2FsbCA9IG93bmluZ19jYWxsOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlcikgeworICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqY2FsbCA9IEdFVF9DQUxMKGhvbGRlcik7CisgIGlmIChjYWxsICE9IE5VTEwgJiYgY2FsbCAhPSBDQU5DRUxMRURfQ0FMTCkgeworICAgIEdSUENfU1VCQ0hBTk5FTF9DQUxMX1VOUkVGKGV4ZWNfY3R4LCBjYWxsLCAiaG9sZGVyIik7CisgIH0KKyAgR1BSX0FTU0VSVChob2xkZXItPmNyZWF0aW9uX3BoYXNlID09CisgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX05PVF9DUkVBVElORyk7CisgIGdwcl9tdV9kZXN0cm95KCZob2xkZXItPm11KTsKKyAgR1BSX0FTU0VSVChob2xkZXItPndhaXRpbmdfb3BzX2NvdW50ID09IDApOworICBncHJfZnJlZShob2xkZXItPndhaXRpbmdfb3BzKTsKK30KKwordm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgLyogdHJ5IHRvIChhdG9taWNhbGx5KSBnZXQgdGhlIGNhbGwgKi8KKyAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGwgPSBHRVRfQ0FMTChob2xkZXIpOworICBHUFJfVElNRVJfQkVHSU4oImdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9wZXJmb3JtX29wIiwgMCk7CisgIGlmIChjYWxsID09IENBTkNFTExFRF9DQUxMKSB7CisgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2ZpbmlzaF93aXRoX2ZhaWx1cmUoZXhlY19jdHgsIG9wKTsKKyAgICBHUFJfVElNRVJfRU5EKCJncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcCIsIDApOworICAgIHJldHVybjsKKyAgfQorICBpZiAoY2FsbCAhPSBOVUxMKSB7CisgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfcHJvY2Vzc19vcChleGVjX2N0eCwgY2FsbCwgb3ApOworICAgIEdQUl9USU1FUl9FTkQoImdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9wZXJmb3JtX29wIiwgMCk7CisgICAgcmV0dXJuOworICB9CisgIC8qIHdlIGZhaWxlZDsgbG9jayBhbmQgZmlndXJlIG91dCB3aGF0IHRvIGRvICovCisgIGdwcl9tdV9sb2NrKCZob2xkZXItPm11KTsKK3JldHJ5OgorICAvKiBuZWVkIHRvIHJlY2hlY2sgdGhhdCBhbm90aGVyIHRocmVhZCBoYXNuJ3Qgc2V0IHRoZSBjYWxsICovCisgIGNhbGwgPSBHRVRfQ0FMTChob2xkZXIpOworICBpZiAoY2FsbCA9PSBDQU5DRUxMRURfQ0FMTCkgeworICAgIGdwcl9tdV91bmxvY2soJmhvbGRlci0+bXUpOworICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9maW5pc2hfd2l0aF9mYWlsdXJlKGV4ZWNfY3R4LCBvcCk7CisgICAgR1BSX1RJTUVSX0VORCgiZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX3BlcmZvcm1fb3AiLCAwKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNhbGwgIT0gTlVMTCkgeworICAgIGdwcl9tdV91bmxvY2soJmhvbGRlci0+bXUpOworICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX3Byb2Nlc3Nfb3AoZXhlY19jdHgsIGNhbGwsIG9wKTsKKyAgICBHUFJfVElNRVJfRU5EKCJncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcCIsIDApOworICAgIHJldHVybjsKKyAgfQorICAvKiBpZiB0aGlzIGlzIGEgY2FuY2VsbGF0aW9uLCB0aGVuIHdlIGNhbiByYWlzZSBvdXIgY2FuY2VsbGVkIGZsYWcgKi8KKyAgaWYgKG9wLT5jYW5jZWxfd2l0aF9zdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0spIHsKKyAgICBpZiAoIWdwcl9hdG1fcmVsX2NhcygmaG9sZGVyLT5zdWJjaGFubmVsX2NhbGwsIDAsIDEpKSB7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKGhvbGRlci0+Y3JlYXRpb25fcGhhc2UpIHsKKyAgICAgICAgY2FzZSBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfTk9UX0NSRUFUSU5HOgorICAgICAgICAgIGZhaWxfbG9ja2VkKGV4ZWNfY3R4LCBob2xkZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9QSUNLSU5HX1NVQkNIQU5ORUw6CisgICAgICAgICAgaG9sZGVyLT5waWNrX3N1YmNoYW5uZWwoZXhlY19jdHgsIGhvbGRlci0+cGlja19zdWJjaGFubmVsX2FyZywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9sZGVyLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgTlVMTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBncHJfbXVfdW5sb2NrKCZob2xkZXItPm11KTsKKyAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9maW5pc2hfd2l0aF9mYWlsdXJlKGV4ZWNfY3R4LCBvcCk7CisgICAgICBHUFJfVElNRVJfRU5EKCJncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcCIsIDApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgc3ViY2hhbm5lbCwgdHJ5IHRvIGdldCBvbmUgKi8KKyAgaWYgKGhvbGRlci0+Y3JlYXRpb25fcGhhc2UgPT0gR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX05PVF9DUkVBVElORyAmJgorICAgICAgaG9sZGVyLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCA9PSBOVUxMICYmCisgICAgICBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwpIHsKKyAgICBob2xkZXItPmNyZWF0aW9uX3BoYXNlID0gR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX1BJQ0tJTkdfU1VCQ0hBTk5FTDsKKyAgICBncnBjX2Nsb3N1cmVfaW5pdCgmaG9sZGVyLT5uZXh0X3N0ZXAsIHN1YmNoYW5uZWxfcmVhZHksIGhvbGRlcik7CisgICAgR1JQQ19DQUxMX1NUQUNLX1JFRihob2xkZXItPm93bmluZ19jYWxsLCAicGlja19zdWJjaGFubmVsIik7CisgICAgaWYgKGhvbGRlci0+cGlja19zdWJjaGFubmVsKAorICAgICAgICAgICAgZXhlY19jdHgsIGhvbGRlci0+cGlja19zdWJjaGFubmVsX2FyZywgb3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICZob2xkZXItPmNvbm5lY3RlZF9zdWJjaGFubmVsLCAmaG9sZGVyLT5uZXh0X3N0ZXApKSB7CisgICAgICBob2xkZXItPmNyZWF0aW9uX3BoYXNlID0gR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX05PVF9DUkVBVElORzsKKyAgICAgIEdSUENfQ0FMTF9TVEFDS19VTlJFRihleGVjX2N0eCwgaG9sZGVyLT5vd25pbmdfY2FsbCwgInBpY2tfc3ViY2hhbm5lbCIpOworICAgIH0KKyAgfQorICAvKiBpZiB3ZSd2ZSBnb3QgYSBzdWJjaGFubmVsLCB0aGVuIGxldCdzIGFzayBpdCB0byBjcmVhdGUgYSBjYWxsICovCisgIGlmIChob2xkZXItPmNyZWF0aW9uX3BoYXNlID09IEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9OT1RfQ1JFQVRJTkcgJiYKKyAgICAgIGhvbGRlci0+Y29ubmVjdGVkX3N1YmNoYW5uZWwgIT0gTlVMTCkgeworICAgIGdwcl9hdG1fcmVsX3N0b3JlKAorICAgICAgICAmaG9sZGVyLT5zdWJjaGFubmVsX2NhbGwsCisgICAgICAgIChncHJfYXRtKSh1aW50cHRyX3QpZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9jcmVhdGVfY2FsbCgKKyAgICAgICAgICAgIGV4ZWNfY3R4LCBob2xkZXItPmNvbm5lY3RlZF9zdWJjaGFubmVsLCBob2xkZXItPnBvbGxzZXQpKTsKKyAgICByZXRyeV93YWl0aW5nX2xvY2tlZChleGVjX2N0eCwgaG9sZGVyKTsKKyAgICBnb3RvIHJldHJ5OworICB9CisgIC8qIG5vdGhpbmcgdG8gYmUgZG9uZSBidXQgd2FpdCAqLworICBhZGRfd2FpdGluZ19sb2NrZWQoaG9sZGVyLCBvcCk7CisgIGdwcl9tdV91bmxvY2soJmhvbGRlci0+bXUpOworICBHUFJfVElNRVJfRU5EKCJncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGVyZm9ybV9vcCIsIDApOworfQorCitzdGF0aWMgdm9pZCBzdWJjaGFubmVsX3JlYWR5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlciA9IGFyZzsKKyAgZ3ByX211X2xvY2soJmhvbGRlci0+bXUpOworICBHUFJfQVNTRVJUKGhvbGRlci0+Y3JlYXRpb25fcGhhc2UgPT0KKyAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfUElDS0lOR19TVUJDSEFOTkVMKTsKKyAgaG9sZGVyLT5jcmVhdGlvbl9waGFzZSA9IEdSUENfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9OT1RfQ1JFQVRJTkc7CisgIGlmIChob2xkZXItPmNvbm5lY3RlZF9zdWJjaGFubmVsID09IE5VTEwpIHsKKyAgICBmYWlsX2xvY2tlZChleGVjX2N0eCwgaG9sZGVyKTsKKyAgfSBlbHNlIGlmICgxID09IGdwcl9hdG1fYWNxX2xvYWQoJmhvbGRlci0+c3ViY2hhbm5lbF9jYWxsKSkgeworICAgIC8qIGFscmVhZHkgY2FuY2VsbGVkIGJlZm9yZSBzdWJjaGFubmVsIGJlY2FtZSByZWFkeSAqLworICAgIGZhaWxfbG9ja2VkKGV4ZWNfY3R4LCBob2xkZXIpOworICB9IGVsc2UgeworICAgIGdwcl9hdG1fcmVsX3N0b3JlKAorICAgICAgICAmaG9sZGVyLT5zdWJjaGFubmVsX2NhbGwsCisgICAgICAgIChncHJfYXRtKSh1aW50cHRyX3QpZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9jcmVhdGVfY2FsbCgKKyAgICAgICAgICAgIGV4ZWNfY3R4LCBob2xkZXItPmNvbm5lY3RlZF9zdWJjaGFubmVsLCBob2xkZXItPnBvbGxzZXQpKTsKKyAgICByZXRyeV93YWl0aW5nX2xvY2tlZChleGVjX2N0eCwgaG9sZGVyKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZob2xkZXItPm11KTsKKyAgR1JQQ19DQUxMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBob2xkZXItPm93bmluZ19jYWxsLCAicGlja19zdWJjaGFubmVsIik7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcHM7CisgIHNpemVfdCBub3BzOworICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqY2FsbDsKK30gcmV0cnlfb3BzX2FyZ3M7CisKK3N0YXRpYyB2b2lkIHJldHJ5X3dhaXRpbmdfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIpIHsKKyAgcmV0cnlfb3BzX2FyZ3MgKmEgPSBncHJfbWFsbG9jKHNpemVvZigqYSkpOworICBhLT5vcHMgPSBob2xkZXItPndhaXRpbmdfb3BzOworICBhLT5ub3BzID0gaG9sZGVyLT53YWl0aW5nX29wc19jb3VudDsKKyAgYS0+Y2FsbCA9IEdFVF9DQUxMKGhvbGRlcik7CisgIGlmIChhLT5jYWxsID09IENBTkNFTExFRF9DQUxMKSB7CisgICAgZ3ByX2ZyZWUoYSk7CisgICAgZmFpbF9sb2NrZWQoZXhlY19jdHgsIGhvbGRlcik7CisgICAgcmV0dXJuOworICB9CisgIGhvbGRlci0+d2FpdGluZ19vcHMgPSBOVUxMOworICBob2xkZXItPndhaXRpbmdfb3BzX2NvdW50ID0gMDsKKyAgaG9sZGVyLT53YWl0aW5nX29wc19jYXBhY2l0eSA9IDA7CisgIEdSUENfU1VCQ0hBTk5FTF9DQUxMX1JFRihhLT5jYWxsLCAicmV0cnlfb3BzIik7CisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgZ3JwY19jbG9zdXJlX2NyZWF0ZShyZXRyeV9vcHMsIGEpLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJldHJ5X29wcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJncywgYm9vbCBzdWNjZXNzKSB7CisgIHJldHJ5X29wc19hcmdzICphID0gYXJnczsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBhLT5ub3BzOyBpKyspIHsKKyAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9wcm9jZXNzX29wKGV4ZWNfY3R4LCBhLT5jYWxsLCAmYS0+b3BzW2ldKTsKKyAgfQorICBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9VTlJFRihleGVjX2N0eCwgYS0+Y2FsbCwgInJldHJ5X29wcyIpOworICBncHJfZnJlZShhLT5vcHMpOworICBncHJfZnJlZShhKTsKK30KKworc3RhdGljIHZvaWQgYWRkX3dhaXRpbmdfbG9ja2VkKGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgR1BSX1RJTUVSX0JFR0lOKCJhZGRfd2FpdGluZ19sb2NrZWQiLCAwKTsKKyAgaWYgKGhvbGRlci0+d2FpdGluZ19vcHNfY291bnQgPT0gaG9sZGVyLT53YWl0aW5nX29wc19jYXBhY2l0eSkgeworICAgIGhvbGRlci0+d2FpdGluZ19vcHNfY2FwYWNpdHkgPSBHUFJfTUFYKDMsIDIgKiBob2xkZXItPndhaXRpbmdfb3BzX2NhcGFjaXR5KTsKKyAgICBob2xkZXItPndhaXRpbmdfb3BzID0KKyAgICAgICAgZ3ByX3JlYWxsb2MoaG9sZGVyLT53YWl0aW5nX29wcywgaG9sZGVyLT53YWl0aW5nX29wc19jYXBhY2l0eSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhvbGRlci0+d2FpdGluZ19vcHMpKTsKKyAgfQorICBob2xkZXItPndhaXRpbmdfb3BzW2hvbGRlci0+d2FpdGluZ19vcHNfY291bnQrK10gPSAqb3A7CisgIEdQUl9USU1FUl9FTkQoImFkZF93YWl0aW5nX2xvY2tlZCIsIDApOworfQorCitzdGF0aWMgdm9pZCBmYWlsX2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyKSB7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgaG9sZGVyLT53YWl0aW5nX29wc19jb3VudDsgaSsrKSB7CisgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2ZpbmlzaF93aXRoX2ZhaWx1cmUoZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvbGRlci0+d2FpdGluZ19vcHNbaV0pOworICB9CisgIGhvbGRlci0+d2FpdGluZ19vcHNfY291bnQgPSAwOworfQorCitjaGFyICpncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfZ2V0X3BlZXIoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyKSB7CisgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpzdWJjaGFubmVsX2NhbGwgPSBHRVRfQ0FMTChob2xkZXIpOworCisgIGlmIChzdWJjaGFubmVsX2NhbGwpIHsKKyAgICByZXR1cm4gZ3JwY19zdWJjaGFubmVsX2NhbGxfZ2V0X3BlZXIoZXhlY19jdHgsIHN1YmNoYW5uZWxfY2FsbCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCBiL3NyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJmMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DSEFOTkVMX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NIQU5ORUxfU1VCQ0hBTk5FTF9DQUxMX0hPTERFUl9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiCisKKy8qKiBQaWNrIGEgc3ViY2hhbm5lbCBmb3IgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyOworICAgIFJldHVybiAxIGlmIHN1YmNoYW5uZWwgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IChpbiB3aGljaCBjYXNlIG9uX3JlYWR5CisgICAgc2hvdWxkIG5vdCBiZSBjYWxsZWQpLCBvciAwIG90aGVyd2lzZSAoaW4gd2hpY2ggY2FzZSBvbl9yZWFkeSBzaG91bGQgYmUKKyAgICBjYWxsZWQgd2hlbiB0aGUgc3ViY2hhbm5lbCBpcyBhdmFpbGFibGUpICovCit0eXBlZGVmIGludCAoKmdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9waWNrX3N1YmNoYW5uZWwpKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmluaXRpYWxfbWV0YWRhdGEsCisgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKmNvbm5lY3RlZF9zdWJjaGFubmVsLCBncnBjX2Nsb3N1cmUgKm9uX3JlYWR5KTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX05PVF9DUkVBVElORywKKyAgR1JQQ19TVUJDSEFOTkVMX0NBTExfSE9MREVSX1BJQ0tJTkdfU1VCQ0hBTk5FTAorfSBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfY3JlYXRpb25fcGhhc2U7CisKKy8qKiBXcmFwcGVyIGZvciBob2xkaW5nIGEgcG9pbnRlciB0byBncnBjX3N1YmNoYW5uZWxfY2FsbCwgYW5kIHRoZQorICAgIGFzc29jaWF0ZWQgbWFjaGluZXJ5IHRvIGNyZWF0ZSBzdWNoIGEgcG9pbnRlci4KKyAgICBIYW5kbGVzIHF1ZXVlaW5nIG9mIHN0cmVhbSBvcHMgdW50aWwgYSBjYWxsIG9iamVjdCBpcyByZWFkeSwgd2FpdGluZworICAgIGZvciBpbml0aWFsIG1ldGFkYXRhIGJlZm9yZSB0cnlpbmcgdG8gY3JlYXRlIGEgY2FsbCBvYmplY3QsCisgICAgYW5kIGhhbmRsaW5nIGNhbmNlbGxhdGlvbiBncmFjZWZ1bGx5LgorCisgICAgVGhlIGNoYW5uZWwgZmlsdGVyIHVzZXMgdGhpcyBhcyB0aGVpciBjYWxsX2RhdGEuICovCit0eXBlZGVmIHN0cnVjdCBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgeworICAvKiogZWl0aGVyIDAgZm9yIG5vIGNhbGwsIDEgZm9yIGNhbmNlbGxlZCwgb3IgYSBwb2ludGVyIHRvIGEKKyAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICovCisgIGdwcl9hdG0gc3ViY2hhbm5lbF9jYWxsOworICAvKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNob29zZSB0aGUgc3ViY2hhbm5lbCBvbiB3aGljaCB0byBjcmVhdGUKKyAgICAgIHRoZSBjYWxsIG9iamVjdC4gQ2hhbm5lbCBmaWx0ZXIgZGVsZWdhdGVzIHRvIHRoZSBsb2FkCisgICAgICBiYWxhbmNpbmcgcG9saWN5IChvbmNlIGl0J3MgcmVhZHkpLiAqLworICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfcGlja19zdWJjaGFubmVsIHBpY2tfc3ViY2hhbm5lbDsKKyAgdm9pZCAqcGlja19zdWJjaGFubmVsX2FyZzsKKworICBncHJfbXUgbXU7CisKKyAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyX2NyZWF0aW9uX3BoYXNlIGNyZWF0aW9uX3BoYXNlOworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb25uZWN0ZWRfc3ViY2hhbm5lbDsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworCisgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqd2FpdGluZ19vcHM7CisgIHNpemVfdCB3YWl0aW5nX29wc19jb3VudDsKKyAgc2l6ZV90IHdhaXRpbmdfb3BzX2NhcGFjaXR5OworCisgIGdycGNfY2xvc3VyZSBuZXh0X3N0ZXA7CisKKyAgZ3JwY19jYWxsX3N0YWNrICpvd25pbmdfY2FsbDsKK30gZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyOworCit2b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9pbml0KAorICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlciAqaG9sZGVyLAorICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9waWNrX3N1YmNoYW5uZWwgcGlja19zdWJjaGFubmVsLAorICAgIHZvaWQgKnBpY2tfc3ViY2hhbm5lbF9hcmcsIGdycGNfY2FsbF9zdGFjayAqb3duaW5nX2NhbGwpOwordm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIpOworCit2b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX2hvbGRlcl9wZXJmb3JtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIgKmhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7CitjaGFyICpncnBjX3N1YmNoYW5uZWxfY2FsbF9ob2xkZXJfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGxfaG9sZGVyICpob2xkZXIpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DSEFOTkVMX1NVQkNIQU5ORUxfQ0FMTF9IT0xERVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9SRUFETUUubWQgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL2NsaWVudF9jb25maWcvUkVBRE1FLm1kCnJlbmFtZSB0byBzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmM4ZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCitzdHJ1Y3QgZ3JwY19jbGllbnRfY29uZmlnIHsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7CisgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3k7Cit9OworCitncnBjX2NsaWVudF9jb25maWcgKmdycGNfY2xpZW50X2NvbmZpZ19jcmVhdGUoKSB7CisgIGdycGNfY2xpZW50X2NvbmZpZyAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7CisgIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKyAgZ3ByX3JlZl9pbml0KCZjLT5yZWZzLCAxKTsKKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgZ3JwY19jbGllbnRfY29uZmlnX3JlZihncnBjX2NsaWVudF9jb25maWcgKmMpIHsgZ3ByX3JlZigmYy0+cmVmcyk7IH0KKwordm9pZCBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2xpZW50X2NvbmZpZyAqYykgeworICBpZiAoZ3ByX3VucmVmKCZjLT5yZWZzKSkgeworICAgIGlmIChjLT5sYl9wb2xpY3kgIT0gTlVMTCkgeworICAgICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGMtPmxiX3BvbGljeSwgImNsaWVudF9jb25maWciKTsKKyAgICB9CisgICAgZ3ByX2ZyZWUoYyk7CisgIH0KK30KKwordm9pZCBncnBjX2NsaWVudF9jb25maWdfc2V0X2xiX3BvbGljeShncnBjX2NsaWVudF9jb25maWcgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3kpIHsKKyAgR1BSX0FTU0VSVChjLT5sYl9wb2xpY3kgPT0gTlVMTCk7CisgIGlmIChsYl9wb2xpY3kpIHsKKyAgICBHUlBDX0xCX1BPTElDWV9SRUYobGJfcG9saWN5LCAiY2xpZW50X2NvbmZpZyIpOworICB9CisgIGMtPmxiX3BvbGljeSA9IGxiX3BvbGljeTsKK30KKworZ3JwY19sYl9wb2xpY3kgKmdycGNfY2xpZW50X2NvbmZpZ19nZXRfbGJfcG9saWN5KGdycGNfY2xpZW50X2NvbmZpZyAqYykgeworICByZXR1cm4gYy0+bGJfcG9saWN5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfQ0xJRU5UX0NPTkZJR19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19DTElFTlRfQ09ORklHX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIgorCisvKiogVG90YWwgY29uZmlndXJhdGlvbiBmb3IgYSBjbGllbnQuIFByb3ZpZGVkLCBhbmQgdXBkYXRlZCwgYnkKKyAgICBncnBjX3Jlc29sdmVyICovCit0eXBlZGVmIHN0cnVjdCBncnBjX2NsaWVudF9jb25maWcgZ3JwY19jbGllbnRfY29uZmlnOworCitncnBjX2NsaWVudF9jb25maWcgKmdycGNfY2xpZW50X2NvbmZpZ19jcmVhdGUoKTsKK3ZvaWQgZ3JwY19jbGllbnRfY29uZmlnX3JlZihncnBjX2NsaWVudF9jb25maWcgKmNsaWVudF9jb25maWcpOwordm9pZCBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKmNsaWVudF9jb25maWcpOworCit2b2lkIGdycGNfY2xpZW50X2NvbmZpZ19zZXRfbGJfcG9saWN5KGdycGNfY2xpZW50X2NvbmZpZyAqY2xpZW50X2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeSk7CitncnBjX2xiX3BvbGljeSAqZ3JwY19jbGllbnRfY29uZmlnX2dldF9sYl9wb2xpY3koCisgICAgZ3JwY19jbGllbnRfY29uZmlnICpjbGllbnRfY29uZmlnKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19DTElFTlRfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxZDg2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCIKKworZ3JwY19jb25uZWN0b3IqIGdycGNfY29ubmVjdG9yX3JlZihncnBjX2Nvbm5lY3RvciogY29ubmVjdG9yKSB7CisgIGNvbm5lY3Rvci0+dnRhYmxlLT5yZWYoY29ubmVjdG9yKTsKKyAgcmV0dXJuIGNvbm5lY3RvcjsKK30KKwordm9pZCBncnBjX2Nvbm5lY3Rvcl91bnJlZihncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IqIGNvbm5lY3RvcikgeworICBjb25uZWN0b3ItPnZ0YWJsZS0+dW5yZWYoZXhlY19jdHgsIGNvbm5lY3Rvcik7Cit9CisKK3ZvaWQgZ3JwY19jb25uZWN0b3JfY29ubmVjdChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IqIGNvbm5lY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2Nvbm5lY3RfaW5fYXJncyogaW5fYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MqIG91dF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSogbm90aWZ5KSB7CisgIGNvbm5lY3Rvci0+dnRhYmxlLT5jb25uZWN0KGV4ZWNfY3R4LCBjb25uZWN0b3IsIGluX2FyZ3MsIG91dF9hcmdzLCBub3RpZnkpOworfQorCit2b2lkIGdycGNfY29ubmVjdG9yX3NodXRkb3duKGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RvciogY29ubmVjdG9yKSB7CisgIGNvbm5lY3Rvci0+dnRhYmxlLT5zaHV0ZG93bihleGVjX2N0eCwgY29ubmVjdG9yKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiOTI1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0NPTk5FQ1RPUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19DT05ORUNUT1JfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfY29ubmVjdG9yIGdycGNfY29ubmVjdG9yOwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jb25uZWN0b3JfdnRhYmxlIGdycGNfY29ubmVjdG9yX3Z0YWJsZTsKKworc3RydWN0IGdycGNfY29ubmVjdG9yIHsKKyAgY29uc3QgZ3JwY19jb25uZWN0b3JfdnRhYmxlICp2dGFibGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qKiBzZXQgb2YgcG9sbHNldHMgaW50ZXJlc3RlZCBpbiB0aGlzIGNvbm5lY3Rpb24gKi8KKyAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzOworICAvKiogYWRkcmVzcyB0byBjb25uZWN0IHRvICovCisgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcjsKKyAgc2l6ZV90IGFkZHJfbGVuOworICAvKiogaW5pdGlhbCBjb25uZWN0IHN0cmluZyB0byBzZW5kICovCisgIGdwcl9zbGljZSBpbml0aWFsX2Nvbm5lY3Rfc3RyaW5nOworICAvKiogZGVhZGxpbmUgZm9yIGNvbm5lY3Rpb24gKi8KKyAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lOworICAvKiogY2hhbm5lbCBhcmd1bWVudHMgKHRvIGJlIHBhc3NlZCB0byB0cmFuc3BvcnQpICovCisgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3M7Cit9IGdycGNfY29ubmVjdF9pbl9hcmdzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qKiB0aGUgY29ubmVjdGVkIHRyYW5zcG9ydCAqLworICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCisgIC8qKiBjaGFubmVsIGFyZ3VtZW50cyAodG8gYmUgcGFzc2VkIHRvIHRoZSBmaWx0ZXJzKSAqLworICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqY2hhbm5lbF9hcmdzOworfSBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3M7CisKK3N0cnVjdCBncnBjX2Nvbm5lY3Rvcl92dGFibGUgeworICB2b2lkICgqcmVmKShncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKyAgdm9pZCAoKnVucmVmKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3Rvcik7CisgIC8qKiBJbXBsZW1lbnRhdGlvbiBvZiBncnBjX2Nvbm5lY3Rvcl9zaHV0ZG93biAqLworICB2b2lkICgqc2h1dGRvd24pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKyAgLyoqIEltcGxlbWVudGF0aW9uIG9mIGdycGNfY29ubmVjdG9yX2Nvbm5lY3QgKi8KKyAgdm9pZCAoKmNvbm5lY3QpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jb25uZWN0X2luX2FyZ3MgKmluX2FyZ3MsCisgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MgKm91dF9hcmdzLCBncnBjX2Nsb3N1cmUgKm5vdGlmeSk7Cit9OworCitncnBjX2Nvbm5lY3RvciAqZ3JwY19jb25uZWN0b3JfcmVmKGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IpOwordm9pZCBncnBjX2Nvbm5lY3Rvcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3Rvcik7CisvKiogQ29ubmVjdCB1c2luZyB0aGUgY29ubmVjdG9yOiBtYXggb25lIG91dHN0YW5kaW5nIGNhbGwgYXQgYSB0aW1lICovCit2b2lkIGdycGNfY29ubmVjdG9yX2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jb25uZWN0X2luX2FyZ3MgKmluX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0X291dF9hcmdzICpvdXRfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm5vdGlmeSk7CisvKiogQ2FuY2VsIGFueSBwZW5kaW5nIGNvbm5lY3Rpb24gKi8KK3ZvaWQgZ3JwY19jb25uZWN0b3Jfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3IpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0NPTk5FQ1RPUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWIzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiCisKK3ZvaWQgZ3JwY19zZXRfZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKHN0cnVjdCBzb2NrYWRkciAqKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFkZHJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICppbml0aWFsX3N0cikge30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFlNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHZvaWQgZ3JwY19zZXRfZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKHN0cnVjdCBzb2NrYWRkciAqKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKmluaXRpYWxfc3RyKTsKKworc3RhdGljIGdycGNfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfZnVuYyBnX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX2Z1bmMgPQorICAgIGdycGNfc2V0X2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZzsKKwordm9pZCBncnBjX3Rlc3Rfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfZnVuY3Rpb24oCisgICAgZ3JwY19zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ19mdW5jIGZ1bmMpIHsKKyAgZ19zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ19mdW5jID0gZnVuYzsKK30KKwordm9pZCBncnBjX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKHN0cnVjdCBzb2NrYWRkciAqKmFkZHIsIHNpemVfdCAqYWRkcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICppbml0aWFsX3N0cikgeworICBnX3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX2Z1bmMoYWRkciwgYWRkcl9sZW4sIGluaXRpYWxfc3RyKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM0MmZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0lOSVRJQUxfQ09OTkVDVF9TVFJJTkdfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfSU5JVElBTF9DT05ORUNUX1NUUklOR19ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIKKwordHlwZWRlZiB2b2lkICgqZ3JwY19zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ19mdW5jKShzdHJ1Y3Qgc29ja2FkZHIgKiphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFkZHJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKmluaXRpYWxfc3RyKTsKK3ZvaWQgZ3JwY190ZXN0X3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX2Z1bmN0aW9uKAorICAgIGdycGNfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfZnVuYyBmdW5jKTsKKworLyoqIFNldCBhIHN0cmluZyB0byBiZSBzZW50IG9uY2UgY29ubmVjdGVkLiBPcHRpb25hbGx5IHJlc2V0IGFkZHIuICovCit2b2lkIGdycGNfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcoc3RydWN0IHNvY2thZGRyICoqYWRkciwgc2l6ZV90ICphZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKmNvbm5lY3Rfc3RyaW5nKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19JTklUSUFMX0NPTk5FQ1RfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmVkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCit0eXBlZGVmIHN0cnVjdCBkZWNvZGVfc2VydmVybGlzdF9hcmcgeworICBpbnQgZmlyc3RfcGFzczsKKyAgaW50IGk7CisgIHNpemVfdCBudW1fc2VydmVyczsKKyAgZ3JwY19ncnBjbGJfc2VydmVyICoqc2VydmVyczsKK30gZGVjb2RlX3NlcnZlcmxpc3RfYXJnOworCisvKiBpbnZva2VkIG9uY2UgZm9yIGV2ZXJ5IFNlcnZlciBpbiBTZXJ2ZXJMaXN0ICovCitzdGF0aWMgYm9vbCBkZWNvZGVfc2VydmVybGlzdChwYl9pc3RyZWFtX3QgKnN0cmVhbSwgY29uc3QgcGJfZmllbGRfdCAqZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJnKSB7CisgIGRlY29kZV9zZXJ2ZXJsaXN0X2FyZyAqZGVjX2FyZyA9ICphcmc7CisgIGlmIChkZWNfYXJnLT5maXJzdF9wYXNzICE9IDApIHsgLyogZmlyc3QgcGFzcyAqLworICAgIGdycGNfZ3JwY2xiX3NlcnZlciBzZXJ2ZXI7CisgICAgaWYgKCFwYl9kZWNvZGUoc3RyZWFtLCBncnBjX2xiX3YwX1NlcnZlcl9maWVsZHMsICZzZXJ2ZXIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRlY19hcmctPm51bV9zZXJ2ZXJzKys7CisgIH0gZWxzZSB7IC8qIHNlY29uZCBwYXNzICovCisgICAgZ3JwY19ncnBjbGJfc2VydmVyICpzZXJ2ZXIgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9zZXJ2ZXIpKTsKKyAgICBHUFJfQVNTRVJUKGRlY19hcmctPm51bV9zZXJ2ZXJzID4gMCk7CisgICAgaWYgKGRlY19hcmctPmkgPT0gMCkgeyAvKiBmaXJzdCBpdGVyYXRpb24gb2Ygc2Vjb25kIHBhc3MgKi8KKyAgICAgIGRlY19hcmctPnNlcnZlcnMgPQorICAgICAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfZ3JwY2xiX3NlcnZlciAqKSAqIGRlY19hcmctPm51bV9zZXJ2ZXJzKTsKKyAgICB9CisgICAgaWYgKCFwYl9kZWNvZGUoc3RyZWFtLCBncnBjX2xiX3YwX1NlcnZlcl9maWVsZHMsIHNlcnZlcikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGVjX2FyZy0+c2VydmVyc1tkZWNfYXJnLT5pKytdID0gc2VydmVyOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2dycGNfZ3JwY2xiX3JlcXVlc3QgKmdycGNfZ3JwY2xiX3JlcXVlc3RfY3JlYXRlKGNvbnN0IGNoYXIgKmxiX3NlcnZpY2VfbmFtZSkgeworICBncnBjX2dycGNsYl9yZXF1ZXN0ICpyZXEgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9yZXF1ZXN0KSk7CisKKyAgcmVxLT5oYXNfY2xpZW50X3N0YXRzID0gMDsgLyogVE9ETyhkZ3EpOiBhZGQgc3VwcG9ydCBmb3Igc3RhdHMgb25jZSBkZWZpbmVkICovCisgIHJlcS0+aGFzX2luaXRpYWxfcmVxdWVzdCA9IDE7CisgIHJlcS0+aW5pdGlhbF9yZXF1ZXN0Lmhhc19uYW1lID0gMTsKKyAgc3RybmNweShyZXEtPmluaXRpYWxfcmVxdWVzdC5uYW1lLCBsYl9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgR1JQQ19HUlBDTEJfU0VSVklDRV9OQU1FX01BWF9MRU5HVEgpOworICByZXR1cm4gcmVxOworfQorCitncHJfc2xpY2UgZ3JwY19ncnBjbGJfcmVxdWVzdF9lbmNvZGUoY29uc3QgZ3JwY19ncnBjbGJfcmVxdWVzdCAqcmVxdWVzdCkgeworICBzaXplX3QgZW5jb2RlZF9sZW5ndGg7CisgIHBiX29zdHJlYW1fdCBzaXplc3RyZWFtOworICBwYl9vc3RyZWFtX3Qgb3V0cHV0c3RyZWFtOworICBncHJfc2xpY2Ugc2xpY2U7CisgIG1lbXNldCgmc2l6ZXN0cmVhbSwgMCwgc2l6ZW9mKHBiX29zdHJlYW1fdCkpOworICBwYl9lbmNvZGUoJnNpemVzdHJlYW0sIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0X2ZpZWxkcywgcmVxdWVzdCk7CisgIGVuY29kZWRfbGVuZ3RoID0gc2l6ZXN0cmVhbS5ieXRlc193cml0dGVuOworCisgIHNsaWNlID0gZ3ByX3NsaWNlX21hbGxvYyhlbmNvZGVkX2xlbmd0aCk7CisgIG91dHB1dHN0cmVhbSA9CisgICAgICBwYl9vc3RyZWFtX2Zyb21fYnVmZmVyKEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpLCBlbmNvZGVkX2xlbmd0aCk7CisgIEdQUl9BU1NFUlQocGJfZW5jb2RlKCZvdXRwdXRzdHJlYW0sIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0X2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCkgIT0gMCk7CisgIHJldHVybiBzbGljZTsKK30KKwordm9pZCBncnBjX2dycGNsYl9yZXF1ZXN0X2Rlc3Ryb3koZ3JwY19ncnBjbGJfcmVxdWVzdCAqcmVxdWVzdCkgeworICBncHJfZnJlZShyZXF1ZXN0KTsKK30KKworZ3JwY19ncnBjbGJfcmVzcG9uc2UgKmdycGNfZ3JwY2xiX3Jlc3BvbnNlX3BhcnNlKGdwcl9zbGljZSBlbmNvZGVkX3Jlc3BvbnNlKSB7CisgIGJvb2wgc3RhdHVzOworICBwYl9pc3RyZWFtX3Qgc3RyZWFtID0KKyAgICAgIHBiX2lzdHJlYW1fZnJvbV9idWZmZXIoR1BSX1NMSUNFX1NUQVJUX1BUUihlbmNvZGVkX3Jlc3BvbnNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChlbmNvZGVkX3Jlc3BvbnNlKSk7CisgIGdycGNfZ3JwY2xiX3Jlc3BvbnNlICpyZXMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9yZXNwb25zZSkpOworICBtZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOworICBzdGF0dXMgPSBwYl9kZWNvZGUoJnN0cmVhbSwgZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlc3BvbnNlX2ZpZWxkcywgcmVzKTsKKyAgR1BSX0FTU0VSVChzdGF0dXMgPT0gdHJ1ZSk7CisgIHJldHVybiByZXM7Cit9CisKK2dycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKmdycGNfZ3JwY2xiX3Jlc3BvbnNlX3BhcnNlX3NlcnZlcmxpc3QoCisgICAgZ3ByX3NsaWNlIGVuY29kZWRfcmVzcG9uc2UpIHsKKyAgZ3JwY19ncnBjbGJfc2VydmVybGlzdCAqc2wgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9zZXJ2ZXJsaXN0KSk7CisgIGJvb2wgc3RhdHVzOworICBkZWNvZGVfc2VydmVybGlzdF9hcmcgYXJnOworICBwYl9pc3RyZWFtX3Qgc3RyZWFtID0KKyAgICAgIHBiX2lzdHJlYW1fZnJvbV9idWZmZXIoR1BSX1NMSUNFX1NUQVJUX1BUUihlbmNvZGVkX3Jlc3BvbnNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChlbmNvZGVkX3Jlc3BvbnNlKSk7CisgIHBiX2lzdHJlYW1fdCBzdHJlYW1fYXRfc3RhcnQgPSBzdHJlYW07CisgIGdycGNfZ3JwY2xiX3Jlc3BvbnNlICpyZXMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dycGNsYl9yZXNwb25zZSkpOworICBtZW1zZXQocmVzLCAwLCBzaXplb2YoKnJlcykpOworICBtZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGRlY29kZV9zZXJ2ZXJsaXN0X2FyZykpOworCisgIHJlcy0+c2VydmVyX2xpc3Quc2VydmVycy5mdW5jcy5kZWNvZGUgPSBkZWNvZGVfc2VydmVybGlzdDsKKyAgcmVzLT5zZXJ2ZXJfbGlzdC5zZXJ2ZXJzLmFyZyA9ICZhcmc7CisgIGFyZy5maXJzdF9wYXNzID0gMTsKKyAgc3RhdHVzID0gcGJfZGVjb2RlKCZzdHJlYW0sIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZV9maWVsZHMsIHJlcyk7CisgIEdQUl9BU1NFUlQoc3RhdHVzID09IHRydWUpOworICBHUFJfQVNTRVJUKGFyZy5udW1fc2VydmVycyA+IDApOworCisgIGFyZy5maXJzdF9wYXNzID0gMDsKKyAgc3RhdHVzID0KKyAgICAgIHBiX2RlY29kZSgmc3RyZWFtX2F0X3N0YXJ0LCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2VfZmllbGRzLCByZXMpOworICBHUFJfQVNTRVJUKHN0YXR1cyA9PSB0cnVlKTsKKyAgR1BSX0FTU0VSVChhcmcuc2VydmVycyAhPSBOVUxMKTsKKworICBzbC0+bnVtX3NlcnZlcnMgPSBhcmcubnVtX3NlcnZlcnM7CisgIHNsLT5zZXJ2ZXJzID0gYXJnLnNlcnZlcnM7CisgIGlmIChyZXMtPnNlcnZlcl9saXN0Lmhhc19leHBpcmF0aW9uX2ludGVydmFsKSB7CisgICAgc2wtPmV4cGlyYXRpb25faW50ZXJ2YWwgPSByZXMtPnNlcnZlcl9saXN0LmV4cGlyYXRpb25faW50ZXJ2YWw7CisgIH0KKyAgZ3JwY19ncnBjbGJfcmVzcG9uc2VfZGVzdHJveShyZXMpOworICByZXR1cm4gc2w7Cit9CisKK3ZvaWQgZ3JwY19ncnBjbGJfZGVzdHJveV9zZXJ2ZXJsaXN0KGdycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKnNlcnZlcmxpc3QpIHsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJsaXN0LT5udW1fc2VydmVyczsgaSsrKSB7CisgICAgZ3ByX2ZyZWUoc2VydmVybGlzdC0+c2VydmVyc1tpXSk7CisgIH0KKyAgZ3ByX2ZyZWUoc2VydmVybGlzdC0+c2VydmVycyk7CisgIGdwcl9mcmVlKHNlcnZlcmxpc3QpOworfQorCit2b2lkIGdycGNfZ3JwY2xiX3Jlc3BvbnNlX2Rlc3Ryb3koZ3JwY19ncnBjbGJfcmVzcG9uc2UgKnJlc3BvbnNlKSB7CisgIGdwcl9mcmVlKHJlc3BvbnNlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjk5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19MT0FEX0JBTEFOQ0VSX0FQSV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19MT0FEX0JBTEFOQ0VSX0FQSV9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEdSUENfR1JQQ0xCX1NFUlZJQ0VfTkFNRV9NQVhfTEVOR1RIIDEyOAorCit0eXBlZGVmIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0IGdycGNfZ3JwY2xiX3JlcXVlc3Q7Cit0eXBlZGVmIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSBncnBjX2dycGNsYl9yZXNwb25zZTsKK3R5cGVkZWYgZ3JwY19sYl92MF9TZXJ2ZXIgZ3JwY19ncnBjbGJfc2VydmVyOwordHlwZWRlZiBncnBjX2xiX3YwX0R1cmF0aW9uIGdycGNfZ3JwY2xiX2R1cmF0aW9uOwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19ncnBjbGJfc2VydmVybGlzdCB7CisgIGdycGNfZ3JwY2xiX3NlcnZlciAqKnNlcnZlcnM7CisgIHNpemVfdCBudW1fc2VydmVyczsKKyAgZ3JwY19ncnBjbGJfZHVyYXRpb24gZXhwaXJhdGlvbl9pbnRlcnZhbDsKK30gZ3JwY19ncnBjbGJfc2VydmVybGlzdDsKKworLyoqIENyZWF0ZSBhIHJlcXVlc3QgZm9yIGEgZ1JQQyBMQiBzZXJ2aWNlIHVuZGVyIFxhIGxiX3NlcnZpY2VfbmFtZSAqLworZ3JwY19ncnBjbGJfcmVxdWVzdCAqZ3JwY19ncnBjbGJfcmVxdWVzdF9jcmVhdGUoY29uc3QgY2hhciAqbGJfc2VydmljZV9uYW1lKTsKKworLyoqIFByb3RvY29sIEJ1ZmZlcnMgdjMtZW5jb2RlIFxhIHJlcXVlc3QgKi8KK2dwcl9zbGljZSBncnBjX2dycGNsYl9yZXF1ZXN0X2VuY29kZShjb25zdCBncnBjX2dycGNsYl9yZXF1ZXN0ICpyZXF1ZXN0KTsKKworLyoqIERlc3Ryb3kgXGEgcmVxdWVzdCAqLwordm9pZCBncnBjX2dycGNsYl9yZXF1ZXN0X2Rlc3Ryb3koZ3JwY19ncnBjbGJfcmVxdWVzdCAqcmVxdWVzdCk7CisKKy8qKiBQYXJzZSAoaWUsIGRlY29kZSkgdGhlIGJ5dGVzIGluIFxhIGVuY29kZWRfcmVzcG9uc2UgYXMgYSBcYQorICogZ3JwY19ncnBjbGJfcmVzcG9uc2UgKi8KK2dycGNfZ3JwY2xiX3Jlc3BvbnNlICpncnBjX2dycGNsYl9yZXNwb25zZV9wYXJzZShncHJfc2xpY2UgZW5jb2RlZF9yZXNwb25zZSk7CisKKy8qKiBEZXN0cm95IFxhIHNlcnZlcmxpc3QgKi8KK3ZvaWQgZ3JwY19ncnBjbGJfZGVzdHJveV9zZXJ2ZXJsaXN0KGdycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKnNlcnZlcmxpc3QpOworCisvKiogUGFyc2UgdGhlIGxpc3Qgb2Ygc2VydmVycyBmcm9tIGFuIGVuY29kZWQgXGEgZ3JwY19ncnBjbGJfcmVzcG9uc2UgKi8KK2dycGNfZ3JwY2xiX3NlcnZlcmxpc3QgKmdycGNfZ3JwY2xiX3Jlc3BvbnNlX3BhcnNlX3NlcnZlcmxpc3QoCisgICAgZ3ByX3NsaWNlIGVuY29kZWRfcmVzcG9uc2UpOworCisvKiogRGVzdHJveSBcYSByZXNwb25zZSAqLwordm9pZCBncnBjX2dycGNsYl9yZXNwb25zZV9kZXN0cm95KGdycGNfZ3JwY2xiX3Jlc3BvbnNlICpyZXNwb25zZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNJRVNfTE9BRF9CQUxBTkNFUl9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzU1MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiCisKK3R5cGVkZWYgc3RydWN0IHBlbmRpbmdfcGljayB7CisgIHN0cnVjdCBwZW5kaW5nX3BpY2sgKm5leHQ7CisgIGdycGNfcG9sbHNldCAqcG9sbHNldDsKKyAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldDsKKyAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZTsKK30gcGVuZGluZ19waWNrOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qKiBiYXNlIHBvbGljeTogbXVzdCBiZSBmaXJzdCAqLworICBncnBjX2xiX3BvbGljeSBiYXNlOworICAvKiogYWxsIG91ciBzdWJjaGFubmVscyAqLworICBncnBjX3N1YmNoYW5uZWwgKipzdWJjaGFubmVsczsKKyAgc2l6ZV90IG51bV9zdWJjaGFubmVsczsKKworICBncnBjX2Nsb3N1cmUgY29ubmVjdGl2aXR5X2NoYW5nZWQ7CisKKyAgLyoqIHRoZSBzZWxlY3RlZCBjaGFubmVsIChhIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwpICovCisgIGdwcl9hdG0gc2VsZWN0ZWQ7CisKKyAgLyoqIG11dGV4IHByb3RlY3RpbmcgcmVtYWluaW5nIG1lbWJlcnMgKi8KKyAgZ3ByX211IG11OworICAvKiogaGF2ZSB3ZSBzdGFydGVkIHBpY2tpbmc/ICovCisgIGludCBzdGFydGVkX3BpY2tpbmc7CisgIC8qKiBhcmUgd2Ugc2h1dCBkb3duPyAqLworICBpbnQgc2h1dGRvd247CisgIC8qKiB3aGljaCBzdWJjaGFubmVsIGFyZSB3ZSB3YXRjaGluZz8gKi8KKyAgc2l6ZV90IGNoZWNraW5nX3N1YmNoYW5uZWw7CisgIC8qKiB3aGF0IGlzIHRoZSBjb25uZWN0aXZpdHkgb2YgdGhhdCBjaGFubmVsPyAqLworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBjaGVja2luZ19jb25uZWN0aXZpdHk7CisgIC8qKiBsaXN0IG9mIHBpY2tzIHRoYXQgYXJlIHdhaXRpbmcgb24gY29ubmVjdGl2aXR5ICovCisgIHBlbmRpbmdfcGljayAqcGVuZGluZ19waWNrczsKKworICAvKiogb3VyIGNvbm5lY3Rpdml0eSBzdGF0ZSB0cmFja2VyICovCisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgc3RhdGVfdHJhY2tlcjsKK30gcGlja19maXJzdF9sYl9wb2xpY3k7CisKKyNkZWZpbmUgR0VUX1NFTEVDVEVEKHApIFwKKyAgKChncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICopZ3ByX2F0bV9hY3FfbG9hZCgmKHApLT5zZWxlY3RlZCkpCisKK3ZvaWQgcGZfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCkgeworICBwaWNrX2ZpcnN0X2xiX3BvbGljeSAqcCA9IChwaWNrX2ZpcnN0X2xiX3BvbGljeSAqKXBvbDsKKyAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqc2VsZWN0ZWQgPSBHRVRfU0VMRUNURUQocCk7CisgIHNpemVfdCBpOworICBHUFJfQVNTRVJUKHAtPnBlbmRpbmdfcGlja3MgPT0gTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCBwLT5udW1fc3ViY2hhbm5lbHM7IGkrKykgeworICAgIEdSUENfU1VCQ0hBTk5FTF9VTlJFRihleGVjX2N0eCwgcC0+c3ViY2hhbm5lbHNbaV0sICJwaWNrX2ZpcnN0Iik7CisgIH0KKyAgaWYgKHNlbGVjdGVkICE9IE5VTEwpIHsKKyAgICBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1VOUkVGKGV4ZWNfY3R4LCBzZWxlY3RlZCwgInBpY2tlZF9maXJzdCIpOworICB9CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2Rlc3Ryb3koZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyKTsKKyAgZ3ByX2ZyZWUocC0+c3ViY2hhbm5lbHMpOworICBncHJfbXVfZGVzdHJveSgmcC0+bXUpOworICBncHJfZnJlZShwKTsKK30KKwordm9pZCBwZl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCkgeworICBwaWNrX2ZpcnN0X2xiX3BvbGljeSAqcCA9IChwaWNrX2ZpcnN0X2xiX3BvbGljeSAqKXBvbDsKKyAgcGVuZGluZ19waWNrICpwcDsKKyAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqc2VsZWN0ZWQ7CisgIGdwcl9tdV9sb2NrKCZwLT5tdSk7CisgIHNlbGVjdGVkID0gR0VUX1NFTEVDVEVEKHApOworICBwLT5zaHV0ZG93biA9IDE7CisgIHBwID0gcC0+cGVuZGluZ19waWNrczsKKyAgcC0+cGVuZGluZ19waWNrcyA9IE5VTEw7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSwgInNodXRkb3duIik7CisgIC8qIGNhbmNlbCBzdWJzY3JpcHRpb24gKi8KKyAgaWYgKHNlbGVjdGVkICE9IE5VTEwpIHsKKyAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgIGV4ZWNfY3R4LCBzZWxlY3RlZCwgTlVMTCwgTlVMTCwgJnAtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICAgICAgZXhlY19jdHgsIHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdLCBOVUxMLCBOVUxMLAorICAgICAgICAmcC0+Y29ubmVjdGl2aXR5X2NoYW5nZWQpOworICB9CisgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKKyAgd2hpbGUgKHBwICE9IE5VTEwpIHsKKyAgICBwZW5kaW5nX3BpY2sgKm5leHQgPSBwcC0+bmV4dDsKKyAgICAqcHAtPnRhcmdldCA9IE5VTEw7CisgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChleGVjX2N0eCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcC0+cG9sbHNldCk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIHRydWUsIE5VTEwpOworICAgIGdwcl9mcmVlKHBwKTsKKyAgICBwcCA9IG5leHQ7CisgIH0KK30KKworc3RhdGljIHZvaWQgcGZfY2FuY2VsX3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0KSB7CisgIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOworICBwZW5kaW5nX3BpY2sgKnBwOworICBncHJfbXVfbG9jaygmcC0+bXUpOworICBwcCA9IHAtPnBlbmRpbmdfcGlja3M7CisgIHAtPnBlbmRpbmdfcGlja3MgPSBOVUxMOworICB3aGlsZSAocHAgIT0gTlVMTCkgeworICAgIHBlbmRpbmdfcGljayAqbmV4dCA9IHBwLT5uZXh0OworICAgIGlmIChwcC0+dGFyZ2V0ID09IHRhcmdldCkgeworICAgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChleGVjX2N0eCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwLT5wb2xsc2V0KTsKKyAgICAgICp0YXJnZXQgPSBOVUxMOworICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIGZhbHNlLCBOVUxMKTsKKyAgICAgIGdwcl9mcmVlKHBwKTsKKyAgICB9IGVsc2UgeworICAgICAgcHAtPm5leHQgPSBwLT5wZW5kaW5nX3BpY2tzOworICAgICAgcC0+cGVuZGluZ19waWNrcyA9IHBwOworICAgIH0KKyAgICBwcCA9IG5leHQ7CisgIH0KKyAgZ3ByX211X3VubG9jaygmcC0+bXUpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9waWNraW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBwaWNrX2ZpcnN0X2xiX3BvbGljeSAqcCkgeworICBwLT5zdGFydGVkX3BpY2tpbmcgPSAxOworICBwLT5jaGVja2luZ19zdWJjaGFubmVsID0gMDsKKyAgcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5ID0gR1JQQ19DSEFOTkVMX0lETEU7CisgIEdSUENfTEJfUE9MSUNZX1dFQUtfUkVGKCZwLT5iYXNlLCAicGlja19maXJzdF9jb25uZWN0aXZpdHkiKTsKKyAgZ3JwY19zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICBleGVjX2N0eCwgcC0+c3ViY2hhbm5lbHNbcC0+Y2hlY2tpbmdfc3ViY2hhbm5lbF0sCisgICAgICBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywgJnAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSwKKyAgICAgICZwLT5jb25uZWN0aXZpdHlfY2hhbmdlZCk7Cit9CisKK3ZvaWQgcGZfZXhpdF9pZGxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sKSB7CisgIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOworICBncHJfbXVfbG9jaygmcC0+bXUpOworICBpZiAoIXAtPnN0YXJ0ZWRfcGlja2luZykgeworICAgIHN0YXJ0X3BpY2tpbmcoZXhlY19jdHgsIHApOworICB9CisgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKK30KKworaW50IHBmX3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmluaXRpYWxfbWV0YWRhdGEsCisgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7CisgIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOworICBwZW5kaW5nX3BpY2sgKnBwOworCisgIC8qIENoZWNrIGF0b21pY2FsbHkgZm9yIGEgc2VsZWN0ZWQgY2hhbm5lbCAqLworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpzZWxlY3RlZCA9IEdFVF9TRUxFQ1RFRChwKTsKKyAgaWYgKHNlbGVjdGVkICE9IE5VTEwpIHsKKyAgICAqdGFyZ2V0ID0gc2VsZWN0ZWQ7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBObyBzdWJjaGFubmVsIHNlbGVjdGVkIHlldCwgc28gYWNxdWlyZSBsb2NrIGFuZCB0aGVuIGF0dGVtcHQgYWdhaW4gKi8KKyAgZ3ByX211X2xvY2soJnAtPm11KTsKKyAgc2VsZWN0ZWQgPSBHRVRfU0VMRUNURUQocCk7CisgIGlmIChzZWxlY3RlZCkgeworICAgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKKyAgICAqdGFyZ2V0ID0gc2VsZWN0ZWQ7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgaWYgKCFwLT5zdGFydGVkX3BpY2tpbmcpIHsKKyAgICAgIHN0YXJ0X3BpY2tpbmcoZXhlY19jdHgsIHApOworICAgIH0KKyAgICBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGV4ZWNfY3R4LCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywgcG9sbHNldCk7CisgICAgcHAgPSBncHJfbWFsbG9jKHNpemVvZigqcHApKTsKKyAgICBwcC0+bmV4dCA9IHAtPnBlbmRpbmdfcGlja3M7CisgICAgcHAtPnBvbGxzZXQgPSBwb2xsc2V0OworICAgIHBwLT50YXJnZXQgPSB0YXJnZXQ7CisgICAgcHAtPm9uX2NvbXBsZXRlID0gb25fY29tcGxldGU7CisgICAgcC0+cGVuZGluZ19waWNrcyA9IHBwOworICAgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3N1YmNoYW5uZWxzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgeworICBwaWNrX2ZpcnN0X2xiX3BvbGljeSAqcCA9IGFyZzsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCBudW1fc3ViY2hhbm5lbHMgPSBwLT5udW1fc3ViY2hhbm5lbHM7CisgIGdycGNfc3ViY2hhbm5lbCAqKnN1YmNoYW5uZWxzOworCisgIGdwcl9tdV9sb2NrKCZwLT5tdSk7CisgIHN1YmNoYW5uZWxzID0gcC0+c3ViY2hhbm5lbHM7CisgIHAtPm51bV9zdWJjaGFubmVscyA9IDA7CisgIHAtPnN1YmNoYW5uZWxzID0gTlVMTDsKKyAgZ3ByX211X3VubG9jaygmcC0+bXUpOworICBHUlBDX0xCX1BPTElDWV9XRUFLX1VOUkVGKGV4ZWNfY3R4LCAmcC0+YmFzZSwgImRlc3Ryb3lfc3ViY2hhbm5lbHMiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N1YmNoYW5uZWxzOyBpKyspIHsKKyAgICBHUlBDX1NVQkNIQU5ORUxfVU5SRUYoZXhlY19jdHgsIHN1YmNoYW5uZWxzW2ldLCAicGlja19maXJzdCIpOworICB9CisKKyAgZ3ByX2ZyZWUoc3ViY2hhbm5lbHMpOworfQorCitzdGF0aWMgdm9pZCBwZl9jb25uZWN0aXZpdHlfY2hhbmdlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdWNjZXNzKSB7CisgIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gYXJnOworICBncnBjX3N1YmNoYW5uZWwgKnNlbGVjdGVkX3N1YmNoYW5uZWw7CisgIHBlbmRpbmdfcGljayAqcHA7CisgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKnNlbGVjdGVkOworCisgIGdwcl9tdV9sb2NrKCZwLT5tdSk7CisKKyAgc2VsZWN0ZWQgPSBHRVRfU0VMRUNURUQocCk7CisKKyAgaWYgKHAtPnNodXRkb3duKSB7CisgICAgZ3ByX211X3VubG9jaygmcC0+bXUpOworICAgIEdSUENfTEJfUE9MSUNZX1dFQUtfVU5SRUYoZXhlY19jdHgsICZwLT5iYXNlLCAicGlja19maXJzdF9jb25uZWN0aXZpdHkiKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoc2VsZWN0ZWQgIT0gTlVMTCkgeworICAgIGlmIChwLT5jaGVja2luZ19jb25uZWN0aXZpdHkgPT0gR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFKSB7CisgICAgICAvKiBpZiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBnb2VzIGJhZCwgd2UncmUgZG9uZSAqLworICAgICAgcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5ID0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU7CisgICAgfQorICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSwgInNlbGVjdGVkX2NoYW5nZWQiKTsKKyAgICBpZiAocC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5ICE9IEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFKSB7CisgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgICAgZXhlY19jdHgsIHNlbGVjdGVkLCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKKyAgICAgICAgICAmcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5LCAmcC0+Y29ubmVjdGl2aXR5X2NoYW5nZWQpOworICAgIH0gZWxzZSB7CisgICAgICBHUlBDX0xCX1BPTElDWV9XRUFLX1VOUkVGKGV4ZWNfY3R4LCAmcC0+YmFzZSwgInBpY2tfZmlyc3RfY29ubmVjdGl2aXR5Iik7CisgICAgfQorICB9IGVsc2UgeworICBsb29wOgorICAgIHN3aXRjaCAocC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5KSB7CisgICAgICBjYXNlIEdSUENfQ0hBTk5FTF9SRUFEWToKKyAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9SRUFEWSwgImNvbm5lY3RpbmdfcmVhZHkiKTsKKyAgICAgICAgc2VsZWN0ZWRfc3ViY2hhbm5lbCA9IHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdOworICAgICAgICBzZWxlY3RlZCA9CisgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfZ2V0X2Nvbm5lY3RlZF9zdWJjaGFubmVsKHNlbGVjdGVkX3N1YmNoYW5uZWwpOworICAgICAgICBHUFJfQVNTRVJUKHNlbGVjdGVkICE9IE5VTEwpOworICAgICAgICBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1JFRihzZWxlY3RlZCwgInBpY2tlZF9maXJzdCIpOworICAgICAgICAvKiBkcm9wIHRoZSBwaWNrIGxpc3Q6IHdlIGFyZSBjb25uZWN0ZWQgbm93ICovCisgICAgICAgIEdSUENfTEJfUE9MSUNZX1dFQUtfUkVGKCZwLT5iYXNlLCAiZGVzdHJveV9zdWJjaGFubmVscyIpOworICAgICAgICBncHJfYXRtX3JlbF9zdG9yZSgmcC0+c2VsZWN0ZWQsIChncHJfYXRtKXNlbGVjdGVkKTsKKyAgICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKAorICAgICAgICAgICAgZXhlY19jdHgsIGdycGNfY2xvc3VyZV9jcmVhdGUoZGVzdHJveV9zdWJjaGFubmVscywgcCksIHRydWUsIE5VTEwpOworICAgICAgICAvKiB1cGRhdGUgYW55IGNhbGxzIHRoYXQgd2VyZSB3YWl0aW5nIGZvciBhIHBpY2sgKi8KKyAgICAgICAgd2hpbGUgKChwcCA9IHAtPnBlbmRpbmdfcGlja3MpKSB7CisgICAgICAgICAgcC0+cGVuZGluZ19waWNrcyA9IHBwLT5uZXh0OworICAgICAgICAgICpwcC0+dGFyZ2V0ID0gc2VsZWN0ZWQ7CisgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChleGVjX2N0eCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcC0+cG9sbHNldCk7CisgICAgICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIHRydWUsIE5VTEwpOworICAgICAgICAgIGdwcl9mcmVlKHBwKTsKKyAgICAgICAgfQorICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgICAgICBleGVjX2N0eCwgc2VsZWN0ZWQsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgJnAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSwgJnAtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRToKKyAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW5nX3RyYW5zaWVudF9mYWlsdXJlIik7CisgICAgICAgIHAtPmNoZWNraW5nX3N1YmNoYW5uZWwgPQorICAgICAgICAgICAgKHAtPmNoZWNraW5nX3N1YmNoYW5uZWwgKyAxKSAlIHAtPm51bV9zdWJjaGFubmVsczsKKyAgICAgICAgcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5ID0gZ3JwY19zdWJjaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eSgKKyAgICAgICAgICAgIHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdKTsKKyAgICAgICAgaWYgKHAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSA9PSBHUlBDX0NIQU5ORUxfVFJBTlNJRU5UX0ZBSUxVUkUpIHsKKyAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICAgICAgICAgICAgZXhlY19jdHgsIHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdLAorICAgICAgICAgICAgICBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywgJnAtPmNoZWNraW5nX2Nvbm5lY3Rpdml0eSwKKyAgICAgICAgICAgICAgJnAtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGxvb3A7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfQ0hBTk5FTF9DT05ORUNUSU5HOgorICAgICAgY2FzZSBHUlBDX0NIQU5ORUxfSURMRToKKyAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RpbmdfY2hhbmdlZCIpOworICAgICAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICAgICAgICAgIGV4ZWNfY3R4LCBwLT5zdWJjaGFubmVsc1twLT5jaGVja2luZ19zdWJjaGFubmVsXSwKKyAgICAgICAgICAgIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLCAmcC0+Y2hlY2tpbmdfY29ubmVjdGl2aXR5LAorICAgICAgICAgICAgJnAtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFOgorICAgICAgICBwLT5udW1fc3ViY2hhbm5lbHMtLTsKKyAgICAgICAgR1BSX1NXQVAoZ3JwY19zdWJjaGFubmVsICosIHAtPnN1YmNoYW5uZWxzW3AtPmNoZWNraW5nX3N1YmNoYW5uZWxdLAorICAgICAgICAgICAgICAgICBwLT5zdWJjaGFubmVsc1twLT5udW1fc3ViY2hhbm5lbHNdKTsKKyAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1VOUkVGKGV4ZWNfY3R4LCBwLT5zdWJjaGFubmVsc1twLT5udW1fc3ViY2hhbm5lbHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpY2tfZmlyc3QiKTsKKyAgICAgICAgaWYgKHAtPm51bV9zdWJjaGFubmVscyA9PSAwKSB7CisgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub19tb3JlX2NoYW5uZWxzIik7CisgICAgICAgICAgd2hpbGUgKChwcCA9IHAtPnBlbmRpbmdfcGlja3MpKSB7CisgICAgICAgICAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHAtPm5leHQ7CisgICAgICAgICAgICAqcHAtPnRhcmdldCA9IE5VTEw7CisgICAgICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBwLT5vbl9jb21wbGV0ZSwgdHJ1ZSwgTlVMTCk7CisgICAgICAgICAgICBncHJfZnJlZShwcCk7CisgICAgICAgICAgfQorICAgICAgICAgIEdSUENfTEJfUE9MSUNZX1dFQUtfVU5SRUYoZXhlY19jdHgsICZwLT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpY2tfZmlyc3RfY29ubmVjdGl2aXR5Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ViY2hhbm5lbF9mYWlsZWQiKTsKKyAgICAgICAgICBwLT5jaGVja2luZ19zdWJjaGFubmVsICU9IHAtPm51bV9zdWJjaGFubmVsczsKKyAgICAgICAgICBwLT5jaGVja2luZ19jb25uZWN0aXZpdHkgPSBncnBjX3N1YmNoYW5uZWxfY2hlY2tfY29ubmVjdGl2aXR5KAorICAgICAgICAgICAgICBwLT5zdWJjaGFubmVsc1twLT5jaGVja2luZ19zdWJjaGFubmVsXSk7CisgICAgICAgICAgZ290byBsb29wOworICAgICAgICB9CisgICAgfQorICB9CisKKyAgZ3ByX211X3VubG9jaygmcC0+bXUpOworfQorCitzdGF0aWMgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgcGZfY2hlY2tfY29ubmVjdGl2aXR5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqcG9sKSB7CisgIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdDsKKyAgZ3ByX211X2xvY2soJnAtPm11KTsKKyAgc3QgPSBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGVjaygmcC0+c3RhdGVfdHJhY2tlcik7CisgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKKyAgcmV0dXJuIHN0OworfQorCit2b2lkIHBmX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpub3RpZnkpIHsKKyAgcGlja19maXJzdF9sYl9wb2xpY3kgKnAgPSAocGlja19maXJzdF9sYl9wb2xpY3kgKilwb2w7CisgIGdwcl9tdV9sb2NrKCZwLT5tdSk7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsIG5vdGlmeSk7CisgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKK30KKwordm9pZCBwZl9waW5nX29uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbCwKKyAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7CisgIHBpY2tfZmlyc3RfbGJfcG9saWN5ICpwID0gKHBpY2tfZmlyc3RfbGJfcG9saWN5ICopcG9sOworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpzZWxlY3RlZCA9IEdFVF9TRUxFQ1RFRChwKTsKKyAgaWYgKHNlbGVjdGVkKSB7CisgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9waW5nKGV4ZWNfY3R4LCBzZWxlY3RlZCwgY2xvc3VyZSk7CisgIH0gZWxzZSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCBmYWxzZSwgTlVMTCk7CisgIH0KK30KKworc3RhdGljIGNvbnN0IGdycGNfbGJfcG9saWN5X3Z0YWJsZSBwaWNrX2ZpcnN0X2xiX3BvbGljeV92dGFibGUgPSB7CisgICAgcGZfZGVzdHJveSwKKyAgICBwZl9zaHV0ZG93biwKKyAgICBwZl9waWNrLAorICAgIHBmX2NhbmNlbF9waWNrLAorICAgIHBmX3Bpbmdfb25lLAorICAgIHBmX2V4aXRfaWRsZSwKKyAgICBwZl9jaGVja19jb25uZWN0aXZpdHksCisgICAgcGZfbm90aWZ5X29uX3N0YXRlX2NoYW5nZX07CisKK3N0YXRpYyB2b2lkIHBpY2tfZmlyc3RfZmFjdG9yeV9yZWYoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSkge30KKworc3RhdGljIHZvaWQgcGlja19maXJzdF9mYWN0b3J5X3VucmVmKGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmZhY3RvcnkpIHt9CisKK3N0YXRpYyBncnBjX2xiX3BvbGljeSAqY3JlYXRlX3BpY2tfZmlyc3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5X2FyZ3MgKmFyZ3MpIHsKKyAgR1BSX0FTU0VSVChhcmdzLT5hZGRyZXNzZXMgIT0gTlVMTCk7CisgIEdQUl9BU1NFUlQoYXJncy0+c3ViY2hhbm5lbF9mYWN0b3J5ICE9IE5VTEwpOworCisgIGlmIChhcmdzLT5hZGRyZXNzZXMtPm5hZGRycyA9PSAwKSByZXR1cm4gTlVMTDsKKworICBwaWNrX2ZpcnN0X2xiX3BvbGljeSAqcCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpwKSk7CisgIG1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKworICBwLT5zdWJjaGFubmVscyA9CisgICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX3N1YmNoYW5uZWwgKikgKiBhcmdzLT5hZGRyZXNzZXMtPm5hZGRycyk7CisgIG1lbXNldChwLT5zdWJjaGFubmVscywgMCwgc2l6ZW9mKCpwLT5zdWJjaGFubmVscykgKiBhcmdzLT5hZGRyZXNzZXMtPm5hZGRycyk7CisgIGdycGNfc3ViY2hhbm5lbF9hcmdzIHNjX2FyZ3M7CisgIHNpemVfdCBzdWJjaGFubmVsX2lkeCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy0+YWRkcmVzc2VzLT5uYWRkcnM7IGkrKykgeworICAgIG1lbXNldCgmc2NfYXJncywgMCwgc2l6ZW9mKGdycGNfc3ViY2hhbm5lbF9hcmdzKSk7CisgICAgc2NfYXJncy5hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKShhcmdzLT5hZGRyZXNzZXMtPmFkZHJzW2ldLmFkZHIpOworICAgIHNjX2FyZ3MuYWRkcl9sZW4gPSAoc2l6ZV90KWFyZ3MtPmFkZHJlc3Nlcy0+YWRkcnNbaV0ubGVuOworCisgICAgZ3JwY19zdWJjaGFubmVsICpzdWJjaGFubmVsID0gZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfY3JlYXRlX3N1YmNoYW5uZWwoCisgICAgICAgIGV4ZWNfY3R4LCBhcmdzLT5zdWJjaGFubmVsX2ZhY3RvcnksICZzY19hcmdzKTsKKworICAgIGlmIChzdWJjaGFubmVsICE9IE5VTEwpIHsKKyAgICAgIHAtPnN1YmNoYW5uZWxzW3N1YmNoYW5uZWxfaWR4KytdID0gc3ViY2hhbm5lbDsKKyAgICB9CisgIH0KKyAgaWYgKHN1YmNoYW5uZWxfaWR4ID09IDApIHsKKyAgICBncHJfZnJlZShwLT5zdWJjaGFubmVscyk7CisgICAgZ3ByX2ZyZWUocCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcC0+bnVtX3N1YmNoYW5uZWxzID0gc3ViY2hhbm5lbF9pZHg7CisKKyAgZ3JwY19sYl9wb2xpY3lfaW5pdCgmcC0+YmFzZSwgJnBpY2tfZmlyc3RfbGJfcG9saWN5X3Z0YWJsZSk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZwLT5jb25uZWN0aXZpdHlfY2hhbmdlZCwgcGZfY29ubmVjdGl2aXR5X2NoYW5nZWQsIHApOworICBncHJfbXVfaW5pdCgmcC0+bXUpOworICByZXR1cm4gJnAtPmJhc2U7Cit9CisKK3N0YXRpYyBjb25zdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3Z0YWJsZSBwaWNrX2ZpcnN0X2ZhY3RvcnlfdnRhYmxlID0geworICAgIHBpY2tfZmlyc3RfZmFjdG9yeV9yZWYsIHBpY2tfZmlyc3RfZmFjdG9yeV91bnJlZiwgY3JlYXRlX3BpY2tfZmlyc3QsCisgICAgInBpY2tfZmlyc3QifTsKKworc3RhdGljIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgcGlja19maXJzdF9sYl9wb2xpY3lfZmFjdG9yeSA9IHsKKyAgICAmcGlja19maXJzdF9mYWN0b3J5X3Z0YWJsZX07CisKK2dycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmdycGNfcGlja19maXJzdF9sYl9mYWN0b3J5X2NyZWF0ZSgpIHsKKyAgcmV0dXJuICZwaWNrX2ZpcnN0X2xiX3BvbGljeV9mYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTg2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNJRVNfUElDS19GSVJTVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19QSUNLX0ZJUlNUX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiCisKKy8qKiBSZXR1cm5zIGEgbG9hZCBiYWxhbmNpbmcgZmFjdG9yeSBmb3IgdGhlIHBpY2sgZmlyc3QgcG9saWN5LCB3aGljaCBwaWNrcyB1cAorICogdGhlIGZpcnN0IHN1YmNoYW5uZWwgZnJvbSBcYSBzdWJjaGFubmVscyB0byBzdWNjZXNmdWxseSBjb25uZWN0ICovCitncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpncnBjX3BpY2tfZmlyc3RfbGJfZmFjdG9yeV9jcmVhdGUoKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19QSUNLX0ZJUlNUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmMyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5jCkBAIC0wLDAgKzEsNTYzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgcm91bmRfcm9iaW5fbGJfcG9saWN5IHJvdW5kX3JvYmluX2xiX3BvbGljeTsKKworaW50IGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2UgPSAwOworCisvKiogTGlzdCBvZiBlbnRpdGllcyB3YWl0aW5nIGZvciBhIHBpY2suCisgKgorICogT25jZSBhIHBpY2sgaXMgYXZhaWxhYmxlLCBcYSB0YXJnZXQgaXMgdXBkYXRlZCBhbmQgXGEgb25fY29tcGxldGUgY2FsbGVkLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGVuZGluZ19waWNrIHsKKyAgc3RydWN0IHBlbmRpbmdfcGljayAqbmV4dDsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0OworICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlOworfSBwZW5kaW5nX3BpY2s7CisKKy8qKiBMaXN0IG9mIHN1YmNoYW5uZWxzIGluIGEgY29ubmVjdGl2aXR5IFJFQURZIHN0YXRlICovCit0eXBlZGVmIHN0cnVjdCByZWFkeV9saXN0IHsKKyAgZ3JwY19zdWJjaGFubmVsICpzdWJjaGFubmVsOworICBzdHJ1Y3QgcmVhZHlfbGlzdCAqbmV4dDsKKyAgc3RydWN0IHJlYWR5X2xpc3QgKnByZXY7Cit9IHJlYWR5X2xpc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyoqIGluZGV4IHdpdGhpbiBwb2xpY3ktPnN1YmNoYW5uZWxzICovCisgIHNpemVfdCBpbmRleDsKKyAgLyoqIGJhY2twb2ludGVyIHRvIG93bmluZyBwb2xpY3kgKi8KKyAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwb2xpY3k7CisgIC8qKiBzdWJjaGFubmVsIGl0c2VsZiAqLworICBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWw7CisgIC8qKiBub3RpZmljYXRpb24gdGhhdCBjb25uZWN0aXZpdHkgaGFzIGNoYW5nZWQgb24gc3ViY2hhbm5lbCAqLworICBncnBjX2Nsb3N1cmUgY29ubmVjdGl2aXR5X2NoYW5nZWRfY2xvc3VyZTsKKyAgLyoqIHRoaXMgc3ViY2hhbm5lbHMgY3VycmVudCBwb3NpdGlvbiBpbiBzdWJjaGFubmVsLT5yZWFkeV9saXN0ICovCisgIHJlYWR5X2xpc3QgKnJlYWR5X2xpc3Rfbm9kZTsKKyAgLyoqIGxhc3Qgb2JzZXJ2ZWQgY29ubmVjdGl2aXR5ICovCisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGNvbm5lY3Rpdml0eV9zdGF0ZTsKK30gc3ViY2hhbm5lbF9kYXRhOworCitzdHJ1Y3Qgcm91bmRfcm9iaW5fbGJfcG9saWN5IHsKKyAgLyoqIGJhc2UgcG9saWN5OiBtdXN0IGJlIGZpcnN0ICovCisgIGdycGNfbGJfcG9saWN5IGJhc2U7CisKKyAgLyoqIGFsbCBvdXIgc3ViY2hhbm5lbHMgKi8KKyAgc2l6ZV90IG51bV9zdWJjaGFubmVsczsKKyAgc3ViY2hhbm5lbF9kYXRhICoqc3ViY2hhbm5lbHM7CisKKyAgLyoqIG11dGV4IHByb3RlY3RpbmcgcmVtYWluaW5nIG1lbWJlcnMgKi8KKyAgZ3ByX211IG11OworICAvKiogaGF2ZSB3ZSBzdGFydGVkIHBpY2tpbmc/ICovCisgIGludCBzdGFydGVkX3BpY2tpbmc7CisgIC8qKiBhcmUgd2Ugc2h1dHRpbmcgZG93bj8gKi8KKyAgaW50IHNodXRkb3duOworICAvKiogTGlzdCBvZiBwaWNrcyB0aGF0IGFyZSB3YWl0aW5nIG9uIGNvbm5lY3Rpdml0eSAqLworICBwZW5kaW5nX3BpY2sgKnBlbmRpbmdfcGlja3M7CisKKyAgLyoqIG91ciBjb25uZWN0aXZpdHkgc3RhdGUgdHJhY2tlciAqLworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyIHN0YXRlX3RyYWNrZXI7CisKKyAgLyoqIChEdW1teSkgcm9vdCBvZiB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IGNvbnRhaW5pbmcgUkVBRFkgc3ViY2hhbm5lbHMgKi8KKyAgcmVhZHlfbGlzdCByZWFkeV9saXN0OworICAvKiogTGFzdCBwaWNrIGZyb20gdGhlIHJlYWR5IGxpc3QuICovCisgIHJlYWR5X2xpc3QgKnJlYWR5X2xpc3RfbGFzdF9waWNrOworfTsKKworLyoqIFJldHVybnMgdGhlIG5leHQgc3ViY2hhbm5lbCBmcm9tIHRoZSBjb25uZWN0ZWQgbGlzdCBvciBOVUxMIGlmIHRoZSBsaXN0IGlzCisgKiBlbXB0eS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzICpub3QqIGFkdmFuY2UgcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2suIFVzZSBcYQorICogYWR2YW5jZV9sYXN0X3BpY2tlZF9sb2NrZWQoKSBmb3IgdGhhdC4gKi8KK3N0YXRpYyByZWFkeV9saXN0ICpwZWVrX25leHRfY29ubmVjdGVkX2xvY2tlZChjb25zdCByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnApIHsKKyAgcmVhZHlfbGlzdCAqc2VsZWN0ZWQ7CisgIHNlbGVjdGVkID0gcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2stPm5leHQ7CisKKyAgd2hpbGUgKHNlbGVjdGVkICE9IE5VTEwpIHsKKyAgICBpZiAoc2VsZWN0ZWQgPT0gJnAtPnJlYWR5X2xpc3QpIHsKKyAgICAgIEdQUl9BU1NFUlQoc2VsZWN0ZWQtPnN1YmNoYW5uZWwgPT0gTlVMTCk7CisgICAgICAvKiBza2lwIGR1bW15IHJvb3QgKi8KKyAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEdQUl9BU1NFUlQoc2VsZWN0ZWQtPnN1YmNoYW5uZWwgIT0gTlVMTCk7CisgICAgICByZXR1cm4gc2VsZWN0ZWQ7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiogQWR2YW5jZSB0aGUgXGEgcmVhZHlfbGlzdCBwaWNraW5nIGhlYWQuICovCitzdGF0aWMgdm9pZCBhZHZhbmNlX2xhc3RfcGlja2VkX2xvY2tlZChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnApIHsKKyAgaWYgKHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrLT5uZXh0ICE9IE5VTEwpIHsgLyogbm9uLWVtcHR5IGxpc3QgKi8KKyAgICBwLT5yZWFkeV9saXN0X2xhc3RfcGljayA9IHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrLT5uZXh0OworICAgIGlmIChwLT5yZWFkeV9saXN0X2xhc3RfcGljayA9PSAmcC0+cmVhZHlfbGlzdCkgeworICAgICAgLyogc2tpcCBkdW1teSByb290ICovCisgICAgICBwLT5yZWFkeV9saXN0X2xhc3RfcGljayA9IHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrLT5uZXh0OworICAgIH0KKyAgfSBlbHNlIHsgLyogc2hvdWxkIGJlIGFuIGVtcHR5IGxpc3QgKi8KKyAgICBHUFJfQVNTRVJUKHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrID09ICZwLT5yZWFkeV9saXN0KTsKKyAgfQorCisgIGlmIChncnBjX2xiX3JvdW5kX3JvYmluX3RyYWNlKSB7CisgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJbUkVBRFlMSVNUXSBBRFZBTkNFRCBMQVNUIFBJQ0suIE5PVyBBVCBOT0RFICVwIChTQyAlcCkiLAorICAgICAgICAgICAgcC0+cmVhZHlfbGlzdF9sYXN0X3BpY2ssIHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrLT5zdWJjaGFubmVsKTsKKyAgfQorfQorCisvKiogUHJlcGVuZHMgKHJlbGF0aXZlIHRvIHRoZSByb290IGF0IHAtPnJlYWR5X2xpc3QpIHRoZSBjb25uZWN0ZWQgc3ViY2hhbm5lbCBcYQorICogY3NjIHRvIHRoZSBsaXN0IG9mIHJlYWR5IHN1YmNoYW5uZWxzLiAqLworc3RhdGljIHJlYWR5X2xpc3QgKmFkZF9jb25uZWN0ZWRfc2NfbG9ja2VkKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKnNjKSB7CisgIHJlYWR5X2xpc3QgKm5ld19lbGVtID0gZ3ByX21hbGxvYyhzaXplb2YocmVhZHlfbGlzdCkpOworICBuZXdfZWxlbS0+c3ViY2hhbm5lbCA9IHNjOworICBpZiAocC0+cmVhZHlfbGlzdC5wcmV2ID09IE5VTEwpIHsKKyAgICAvKiBmaXJzdCBlbGVtZW50ICovCisgICAgbmV3X2VsZW0tPm5leHQgPSAmcC0+cmVhZHlfbGlzdDsKKyAgICBuZXdfZWxlbS0+cHJldiA9ICZwLT5yZWFkeV9saXN0OworICAgIHAtPnJlYWR5X2xpc3QubmV4dCA9IG5ld19lbGVtOworICAgIHAtPnJlYWR5X2xpc3QucHJldiA9IG5ld19lbGVtOworICB9IGVsc2UgeworICAgIG5ld19lbGVtLT5uZXh0ID0gJnAtPnJlYWR5X2xpc3Q7CisgICAgbmV3X2VsZW0tPnByZXYgPSBwLT5yZWFkeV9saXN0LnByZXY7CisgICAgcC0+cmVhZHlfbGlzdC5wcmV2LT5uZXh0ID0gbmV3X2VsZW07CisgICAgcC0+cmVhZHlfbGlzdC5wcmV2ID0gbmV3X2VsZW07CisgIH0KKyAgaWYgKGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2UpIHsKKyAgICBncHJfbG9nKEdQUl9ERUJVRywgIltSRUFEWUxJU1RdIEFERElORyBOT0RFICVwIChTQyAlcCkiLCBuZXdfZWxlbSwgc2MpOworICB9CisgIHJldHVybiBuZXdfZWxlbTsKK30KKworLyoqIFJlbW92ZXMgXGEgbm9kZSBmcm9tIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBzdWJjaGFubmVscyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2Rpc2Nvbm5lY3RlZF9zY19sb2NrZWQocm91bmRfcm9iaW5fbGJfcG9saWN5ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfbGlzdCAqbm9kZSkgeworICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChub2RlID09IHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrKSB7CisgICAgLyogSWYgcmVtb3ZpbmcgdGhlIGxhc3RseSBwaWNrZWQgbm9kZSwgcmVzZXQgdGhlIGxhc3QgcGljayBwb2ludGVyIHRvIHRoZQorICAgICAqIGR1bW15IHJvb3Qgb2YgdGhlIGxpc3QgKi8KKyAgICBwLT5yZWFkeV9saXN0X2xhc3RfcGljayA9ICZwLT5yZWFkeV9saXN0OworICB9CisKKyAgLyogcmVtb3ZpbmcgbGFzdCBpdGVtICovCisgIGlmIChub2RlLT5uZXh0ID09ICZwLT5yZWFkeV9saXN0ICYmIG5vZGUtPnByZXYgPT0gJnAtPnJlYWR5X2xpc3QpIHsKKyAgICBHUFJfQVNTRVJUKHAtPnJlYWR5X2xpc3QubmV4dCA9PSBub2RlKTsKKyAgICBHUFJfQVNTRVJUKHAtPnJlYWR5X2xpc3QucHJldiA9PSBub2RlKTsKKyAgICBwLT5yZWFkeV9saXN0Lm5leHQgPSBOVUxMOworICAgIHAtPnJlYWR5X2xpc3QucHJldiA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgIH0KKworICBpZiAoZ3JwY19sYl9yb3VuZF9yb2Jpbl90cmFjZSkgeworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiW1JFQURZTElTVF0gUkVNT1ZFRCBOT0RFICVwIChTQyAlcCkiLCBub2RlLAorICAgICAgICAgICAgbm9kZS0+c3ViY2hhbm5lbCk7CisgIH0KKworICBub2RlLT5uZXh0ID0gTlVMTDsKKyAgbm9kZS0+cHJldiA9IE5VTEw7CisgIG5vZGUtPnN1YmNoYW5uZWwgPSBOVUxMOworCisgIGdwcl9mcmVlKG5vZGUpOworfQorCit2b2lkIHJyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wpIHsKKyAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqKXBvbDsKKyAgc2l6ZV90IGk7CisgIHJlYWR5X2xpc3QgKmVsZW07CisgIGZvciAoaSA9IDA7IGkgPCBwLT5udW1fc3ViY2hhbm5lbHM7IGkrKykgeworICAgIHN1YmNoYW5uZWxfZGF0YSAqc2QgPSBwLT5zdWJjaGFubmVsc1tpXTsKKyAgICBHUlBDX1NVQkNIQU5ORUxfVU5SRUYoZXhlY19jdHgsIHNkLT5zdWJjaGFubmVsLCAicm91bmRfcm9iaW4iKTsKKyAgICBncHJfZnJlZShzZCk7CisgIH0KKworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlcik7CisgIGdwcl9mcmVlKHAtPnN1YmNoYW5uZWxzKTsKKyAgZ3ByX211X2Rlc3Ryb3koJnAtPm11KTsKKworICBlbGVtID0gcC0+cmVhZHlfbGlzdC5uZXh0OworICB3aGlsZSAoZWxlbSAhPSBOVUxMICYmIGVsZW0gIT0gJnAtPnJlYWR5X2xpc3QpIHsKKyAgICByZWFkeV9saXN0ICp0bXA7CisgICAgdG1wID0gZWxlbS0+bmV4dDsKKyAgICBlbGVtLT5uZXh0ID0gTlVMTDsKKyAgICBlbGVtLT5wcmV2ID0gTlVMTDsKKyAgICBlbGVtLT5zdWJjaGFubmVsID0gTlVMTDsKKyAgICBncHJfZnJlZShlbGVtKTsKKyAgICBlbGVtID0gdG1wOworICB9CisgIGdwcl9mcmVlKHApOworfQorCit2b2lkIHJyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sKSB7CisgIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCA9IChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKilwb2w7CisgIHBlbmRpbmdfcGljayAqcHA7CisgIHNpemVfdCBpOworCisgIGdwcl9tdV9sb2NrKCZwLT5tdSk7CisKKyAgcC0+c2h1dGRvd24gPSAxOworICB3aGlsZSAoKHBwID0gcC0+cGVuZGluZ19waWNrcykpIHsKKyAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHAtPm5leHQ7CisgICAgKnBwLT50YXJnZXQgPSBOVUxMOworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcHAtPm9uX2NvbXBsZXRlLCBmYWxzZSwgTlVMTCk7CisgICAgZ3ByX2ZyZWUocHApOworICB9CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSwgInNodXRkb3duIik7CisgIGZvciAoaSA9IDA7IGkgPCBwLT5udW1fc3ViY2hhbm5lbHM7IGkrKykgeworICAgIHN1YmNoYW5uZWxfZGF0YSAqc2QgPSBwLT5zdWJjaGFubmVsc1tpXTsKKyAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZShleGVjX2N0eCwgc2QtPnN1YmNoYW5uZWwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkLT5jb25uZWN0aXZpdHlfY2hhbmdlZF9jbG9zdXJlKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIHJyX2NhbmNlbF9waWNrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCkgeworICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAgPSAocm91bmRfcm9iaW5fbGJfcG9saWN5ICopcG9sOworICBwZW5kaW5nX3BpY2sgKnBwOworICBncHJfbXVfbG9jaygmcC0+bXUpOworICBwcCA9IHAtPnBlbmRpbmdfcGlja3M7CisgIHAtPnBlbmRpbmdfcGlja3MgPSBOVUxMOworICB3aGlsZSAocHAgIT0gTlVMTCkgeworICAgIHBlbmRpbmdfcGljayAqbmV4dCA9IHBwLT5uZXh0OworICAgIGlmIChwcC0+dGFyZ2V0ID09IHRhcmdldCkgeworICAgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChleGVjX2N0eCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwLT5wb2xsc2V0KTsKKyAgICAgICp0YXJnZXQgPSBOVUxMOworICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwcC0+b25fY29tcGxldGUsIGZhbHNlLCBOVUxMKTsKKyAgICAgIGdwcl9mcmVlKHBwKTsKKyAgICB9IGVsc2UgeworICAgICAgcHAtPm5leHQgPSBwLT5wZW5kaW5nX3BpY2tzOworICAgICAgcC0+cGVuZGluZ19waWNrcyA9IHBwOworICAgIH0KKyAgICBwcCA9IG5leHQ7CisgIH0KKyAgZ3ByX211X3VubG9jaygmcC0+bXUpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9waWNraW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnApIHsKKyAgc2l6ZV90IGk7CisgIHAtPnN0YXJ0ZWRfcGlja2luZyA9IDE7CisKKyAgZ3ByX2xvZyhHUFJfREVCVUcsICJMQl9QT0xJQ1k6IHA9JXAgbnVtX3N1YmNoYW5uZWxzPSVkIiwgcCwKKyAgICAgICAgICBwLT5udW1fc3ViY2hhbm5lbHMpOworCisgIGZvciAoaSA9IDA7IGkgPCBwLT5udW1fc3ViY2hhbm5lbHM7IGkrKykgeworICAgIHN1YmNoYW5uZWxfZGF0YSAqc2QgPSBwLT5zdWJjaGFubmVsc1tpXTsKKyAgICBzZC0+Y29ubmVjdGl2aXR5X3N0YXRlID0gR1JQQ19DSEFOTkVMX0lETEU7CisgICAgZ3JwY19zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgIGV4ZWNfY3R4LCBzZC0+c3ViY2hhbm5lbCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICZzZC0+Y29ubmVjdGl2aXR5X3N0YXRlLCAmc2QtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkX2Nsb3N1cmUpOworICAgIEdSUENfTEJfUE9MSUNZX1dFQUtfUkVGKCZwLT5iYXNlLCAicm91bmRfcm9iaW5fY29ubmVjdGl2aXR5Iik7CisgIH0KK30KKwordm9pZCBycl9leGl0X2lkbGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2wpIHsKKyAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gKHJvdW5kX3JvYmluX2xiX3BvbGljeSAqKXBvbDsKKyAgZ3ByX211X2xvY2soJnAtPm11KTsKKyAgaWYgKCFwLT5zdGFydGVkX3BpY2tpbmcpIHsKKyAgICBzdGFydF9waWNraW5nKGV4ZWNfY3R4LCBwKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Cit9CisKK2ludCBycl9waWNrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAorICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCwgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSkgeworICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAgPSAocm91bmRfcm9iaW5fbGJfcG9saWN5ICopcG9sOworICBwZW5kaW5nX3BpY2sgKnBwOworICByZWFkeV9saXN0ICpzZWxlY3RlZDsKKyAgZ3ByX211X2xvY2soJnAtPm11KTsKKyAgaWYgKChzZWxlY3RlZCA9IHBlZWtfbmV4dF9jb25uZWN0ZWRfbG9ja2VkKHApKSkgeworICAgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKKyAgICAqdGFyZ2V0ID0gZ3JwY19zdWJjaGFubmVsX2dldF9jb25uZWN0ZWRfc3ViY2hhbm5lbChzZWxlY3RlZC0+c3ViY2hhbm5lbCk7CisgICAgaWYgKGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2UpIHsKKyAgICAgIGdwcl9sb2coR1BSX0RFQlVHLAorICAgICAgICAgICAgICAiW1JSIFBJQ0tdIFRBUkdFVCA8LS0gQ09OTkVDVEVEIFNVQkNIQU5ORUwgJXAgKE5PREUgJXApIiwKKyAgICAgICAgICAgICAgc2VsZWN0ZWQtPnN1YmNoYW5uZWwsIHNlbGVjdGVkKTsKKyAgICB9CisgICAgLyogb25seSBhZHZhbmNlIHRoZSBsYXN0IHBpY2tlZCBwb2ludGVyIGlmIHRoZSBzZWxlY3Rpb24gd2FzIHVzZWQgKi8KKyAgICBhZHZhbmNlX2xhc3RfcGlja2VkX2xvY2tlZChwKTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXAtPnN0YXJ0ZWRfcGlja2luZykgeworICAgICAgc3RhcnRfcGlja2luZyhleGVjX2N0eCwgcCk7CisgICAgfQorICAgIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXQoZXhlY19jdHgsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLCBwb2xsc2V0KTsKKyAgICBwcCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpwcCkpOworICAgIHBwLT5uZXh0ID0gcC0+cGVuZGluZ19waWNrczsKKyAgICBwcC0+cG9sbHNldCA9IHBvbGxzZXQ7CisgICAgcHAtPnRhcmdldCA9IHRhcmdldDsKKyAgICBwcC0+b25fY29tcGxldGUgPSBvbl9jb21wbGV0ZTsKKyAgICBwLT5wZW5kaW5nX3BpY2tzID0gcHA7CisgICAgZ3ByX211X3VubG9jaygmcC0+bXUpOworICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHJyX2Nvbm5lY3Rpdml0eV9jaGFuZ2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKKyAgc3ViY2hhbm5lbF9kYXRhICpzZCA9IGFyZzsKKyAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gc2QtPnBvbGljeTsKKyAgcGVuZGluZ19waWNrICpwcDsKKyAgcmVhZHlfbGlzdCAqc2VsZWN0ZWQ7CisKKyAgaW50IHVucmVmID0gMDsKKworICBncHJfbXVfbG9jaygmcC0+bXUpOworCisgIGlmIChwLT5zaHV0ZG93bikgeworICAgIHVucmVmID0gMTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKHNkLT5jb25uZWN0aXZpdHlfc3RhdGUpIHsKKyAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX1JFQURZOgorICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1JFQURZLCAiY29ubmVjdGluZ19yZWFkeSIpOworICAgICAgICAvKiBhZGQgdGhlIG5ld2x5IGNvbm5lY3RlZCBzdWJjaGFubmVsIHRvIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBvbmVzLgorICAgICAgICAgKiBOb3RlIHRoYXQgaXQgZ29lcyB0byB0aGUgImVuZCBvZiB0aGUgbGluZSIuICovCisgICAgICAgIHNkLT5yZWFkeV9saXN0X25vZGUgPSBhZGRfY29ubmVjdGVkX3NjX2xvY2tlZChwLCBzZC0+c3ViY2hhbm5lbCk7CisgICAgICAgIC8qIGF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGVyZSdzIGF0IGxlYXN0IG9uZSBzdWl0YWJsZSBzdWJjaGFubmVsLiBHbworICAgICAgICAgKiBhaGVhZCBhbmQgcGljayBvbmUgYW5kIG5vdGlmeSB0aGUgcGVuZGluZyBzdWl0b3JzIGluCisgICAgICAgICAqIHAtPnBlbmRpbmdfcGlja3MuIFRoaXMgcHJlZW10aXZlbHkgcmVwbGljYXRlcyBycl9waWNrKCkncyBhY3Rpb25zLiAqLworICAgICAgICBzZWxlY3RlZCA9IHBlZWtfbmV4dF9jb25uZWN0ZWRfbG9ja2VkKHApOworICAgICAgICBpZiAocC0+cGVuZGluZ19waWNrcyAhPSBOVUxMKSB7CisgICAgICAgICAgLyogaWYgdGhlIHNlbGVjdGVkIHN1YmNoYW5uZWwgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdGhlIHBlbmRpbmcKKyAgICAgICAgICAgKiBwaWNrcywgdXBkYXRlIHRoZSBsYXN0IHBpY2tlZCBwb2ludGVyICovCisgICAgICAgICAgYWR2YW5jZV9sYXN0X3BpY2tlZF9sb2NrZWQocCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChwcCA9IHAtPnBlbmRpbmdfcGlja3MpKSB7CisgICAgICAgICAgcC0+cGVuZGluZ19waWNrcyA9IHBwLT5uZXh0OworICAgICAgICAgICpwcC0+dGFyZ2V0ID0KKyAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2dldF9jb25uZWN0ZWRfc3ViY2hhbm5lbChzZWxlY3RlZC0+c3ViY2hhbm5lbCk7CisgICAgICAgICAgaWYgKGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2UpIHsKKyAgICAgICAgICAgIGdwcl9sb2coR1BSX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAiW1JSIENPTk4gQ0hBTkdFRF0gVEFSR0VUIDwtLSBTVUJDSEFOTkVMICVwIChOT0RFICVwKSIsCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLT5zdWJjaGFubmVsLCBzZWxlY3RlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXQoZXhlY19jdHgsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHAtPnBvbGxzZXQpOworICAgICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcHAtPm9uX2NvbXBsZXRlLCB0cnVlLCBOVUxMKTsKKyAgICAgICAgICBncHJfZnJlZShwcCk7CisgICAgICAgIH0KKyAgICAgICAgZ3JwY19zdWJjaGFubmVsX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgICAgICBleGVjX2N0eCwgc2QtPnN1YmNoYW5uZWwsIHAtPmJhc2UuaW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgJnNkLT5jb25uZWN0aXZpdHlfc3RhdGUsICZzZC0+Y29ubmVjdGl2aXR5X2NoYW5nZWRfY2xvc3VyZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHUlBDX0NIQU5ORUxfQ09OTkVDVElORzoKKyAgICAgIGNhc2UgR1JQQ19DSEFOTkVMX0lETEU6CisgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJnAtPnN0YXRlX3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC0+Y29ubmVjdGl2aXR5X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RpbmdfY2hhbmdlZCIpOworICAgICAgICBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICAgICAgICAgIGV4ZWNfY3R4LCBzZC0+c3ViY2hhbm5lbCwgcC0+YmFzZS5pbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICAgICAmc2QtPmNvbm5lY3Rpdml0eV9zdGF0ZSwgJnNkLT5jb25uZWN0aXZpdHlfY2hhbmdlZF9jbG9zdXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRToKKyAgICAgICAgLyogcmVuZXcgc3RhdGUgbm90aWZpY2F0aW9uICovCisgICAgICAgIGdycGNfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAorICAgICAgICAgICAgZXhlY19jdHgsIHNkLT5zdWJjaGFubmVsLCBwLT5iYXNlLmludGVyZXN0ZWRfcGFydGllcywKKyAgICAgICAgICAgICZzZC0+Y29ubmVjdGl2aXR5X3N0YXRlLCAmc2QtPmNvbm5lY3Rpdml0eV9jaGFuZ2VkX2Nsb3N1cmUpOworCisgICAgICAgIC8qIHJlbW92ZSBmcm9tIHJlYWR5IGxpc3QgaWYgc3RpbGwgcHJlc2VudCAqLworICAgICAgICBpZiAoc2QtPnJlYWR5X2xpc3Rfbm9kZSAhPSBOVUxMKSB7CisgICAgICAgICAgcmVtb3ZlX2Rpc2Nvbm5lY3RlZF9zY19sb2NrZWQocCwgc2QtPnJlYWR5X2xpc3Rfbm9kZSk7CisgICAgICAgICAgc2QtPnJlYWR5X2xpc3Rfbm9kZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW5nX3RyYW5zaWVudF9mYWlsdXJlIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRToKKyAgICAgICAgaWYgKHNkLT5yZWFkeV9saXN0X25vZGUgIT0gTlVMTCkgeworICAgICAgICAgIHJlbW92ZV9kaXNjb25uZWN0ZWRfc2NfbG9ja2VkKHAsIHNkLT5yZWFkeV9saXN0X25vZGUpOworICAgICAgICAgIHNkLT5yZWFkeV9saXN0X25vZGUgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcC0+bnVtX3N1YmNoYW5uZWxzLS07CisgICAgICAgIEdQUl9TV0FQKHN1YmNoYW5uZWxfZGF0YSAqLCBwLT5zdWJjaGFubmVsc1tzZC0+aW5kZXhdLAorICAgICAgICAgICAgICAgICBwLT5zdWJjaGFubmVsc1twLT5udW1fc3ViY2hhbm5lbHNdKTsKKyAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1VOUkVGKGV4ZWNfY3R4LCBzZC0+c3ViY2hhbm5lbCwgInJvdW5kX3JvYmluIik7CisgICAgICAgIHAtPnN1YmNoYW5uZWxzW3NkLT5pbmRleF0tPmluZGV4ID0gc2QtPmluZGV4OworICAgICAgICBncHJfZnJlZShzZCk7CisKKyAgICAgICAgdW5yZWYgPSAxOworICAgICAgICBpZiAocC0+bnVtX3N1YmNoYW5uZWxzID09IDApIHsKKyAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZwLT5zdGF0ZV90cmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vX21vcmVfY2hhbm5lbHMiKTsKKyAgICAgICAgICB3aGlsZSAoKHBwID0gcC0+cGVuZGluZ19waWNrcykpIHsKKyAgICAgICAgICAgIHAtPnBlbmRpbmdfcGlja3MgPSBwcC0+bmV4dDsKKyAgICAgICAgICAgICpwcC0+dGFyZ2V0ID0gTlVMTDsKKyAgICAgICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcHAtPm9uX2NvbXBsZXRlLCB0cnVlLCBOVUxMKTsKKyAgICAgICAgICAgIGdwcl9mcmVlKHBwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ViY2hhbm5lbF9mYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0gLyogc3dpdGNoICovCisgIH0gICAvKiAhdW5yZWYgKi8KKworICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7CisKKyAgaWYgKHVucmVmKSB7CisgICAgR1JQQ19MQl9QT0xJQ1lfV0VBS19VTlJFRihleGVjX2N0eCwgJnAtPmJhc2UsICJyb3VuZF9yb2Jpbl9jb25uZWN0aXZpdHkiKTsKKyAgfQorfQorCitzdGF0aWMgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgcnJfY2hlY2tfY29ubmVjdGl2aXR5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqcG9sKSB7CisgIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCA9IChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKilwb2w7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0OworICBncHJfbXVfbG9jaygmcC0+bXUpOworICBzdCA9IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2NoZWNrKCZwLT5zdGF0ZV90cmFja2VyKTsKKyAgZ3ByX211X3VubG9jaygmcC0+bXUpOworICByZXR1cm4gc3Q7Cit9CisKK3N0YXRpYyB2b2lkIHJyX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm5vdGlmeSkgeworICByb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKnAgPSAocm91bmRfcm9iaW5fbGJfcG9saWN5ICopcG9sOworICBncHJfbXVfbG9jaygmcC0+bXUpOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKGV4ZWNfY3R4LCAmcC0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LCBub3RpZnkpOworICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIHJyX3Bpbmdfb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7CisgIHJvdW5kX3JvYmluX2xiX3BvbGljeSAqcCA9IChyb3VuZF9yb2Jpbl9sYl9wb2xpY3kgKilwb2w7CisgIHJlYWR5X2xpc3QgKnNlbGVjdGVkOworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICp0YXJnZXQ7CisgIGdwcl9tdV9sb2NrKCZwLT5tdSk7CisgIGlmICgoc2VsZWN0ZWQgPSBwZWVrX25leHRfY29ubmVjdGVkX2xvY2tlZChwKSkpIHsKKyAgICBncHJfbXVfdW5sb2NrKCZwLT5tdSk7CisgICAgdGFyZ2V0ID0gZ3JwY19zdWJjaGFubmVsX2dldF9jb25uZWN0ZWRfc3ViY2hhbm5lbChzZWxlY3RlZC0+c3ViY2hhbm5lbCk7CisgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9waW5nKGV4ZWNfY3R4LCB0YXJnZXQsIGNsb3N1cmUpOworICB9IGVsc2UgeworICAgIGdwcl9tdV91bmxvY2soJnAtPm11KTsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIGZhbHNlLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgZ3JwY19sYl9wb2xpY3lfdnRhYmxlIHJvdW5kX3JvYmluX2xiX3BvbGljeV92dGFibGUgPSB7CisgICAgcnJfZGVzdHJveSwKKyAgICBycl9zaHV0ZG93biwKKyAgICBycl9waWNrLAorICAgIHJyX2NhbmNlbF9waWNrLAorICAgIHJyX3Bpbmdfb25lLAorICAgIHJyX2V4aXRfaWRsZSwKKyAgICBycl9jaGVja19jb25uZWN0aXZpdHksCisgICAgcnJfbm90aWZ5X29uX3N0YXRlX2NoYW5nZX07CisKK3N0YXRpYyB2b2lkIHJvdW5kX3JvYmluX2ZhY3RvcnlfcmVmKGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmZhY3RvcnkpIHt9CisKK3N0YXRpYyB2b2lkIHJvdW5kX3JvYmluX2ZhY3RvcnlfdW5yZWYoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSkge30KKworc3RhdGljIGdycGNfbGJfcG9saWN5ICpjcmVhdGVfcm91bmRfcm9iaW4oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3lfYXJncyAqYXJncykgeworICBHUFJfQVNTRVJUKGFyZ3MtPmFkZHJlc3NlcyAhPSBOVUxMKTsKKyAgR1BSX0FTU0VSVChhcmdzLT5zdWJjaGFubmVsX2ZhY3RvcnkgIT0gTlVMTCk7CisKKyAgcm91bmRfcm9iaW5fbGJfcG9saWN5ICpwID0gZ3ByX21hbGxvYyhzaXplb2YoKnApKTsKKyAgbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCisgIHAtPnN1YmNoYW5uZWxzID0KKyAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKCpwLT5zdWJjaGFubmVscykgKiBhcmdzLT5hZGRyZXNzZXMtPm5hZGRycyk7CisgIG1lbXNldChwLT5zdWJjaGFubmVscywgMCwgc2l6ZW9mKCpwLT5zdWJjaGFubmVscykgKiBhcmdzLT5hZGRyZXNzZXMtPm5hZGRycyk7CisKKyAgZ3JwY19zdWJjaGFubmVsX2FyZ3Mgc2NfYXJnczsKKyAgc2l6ZV90IHN1YmNoYW5uZWxfaWR4ID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLT5hZGRyZXNzZXMtPm5hZGRyczsgaSsrKSB7CisgICAgbWVtc2V0KCZzY19hcmdzLCAwLCBzaXplb2YoZ3JwY19zdWJjaGFubmVsX2FyZ3MpKTsKKyAgICBzY19hcmdzLmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKGFyZ3MtPmFkZHJlc3Nlcy0+YWRkcnNbaV0uYWRkcik7CisgICAgc2NfYXJncy5hZGRyX2xlbiA9IChzaXplX3QpYXJncy0+YWRkcmVzc2VzLT5hZGRyc1tpXS5sZW47CisKKyAgICBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWwgPSBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbCgKKyAgICAgICAgZXhlY19jdHgsIGFyZ3MtPnN1YmNoYW5uZWxfZmFjdG9yeSwgJnNjX2FyZ3MpOworCisgICAgaWYgKHN1YmNoYW5uZWwgIT0gTlVMTCkgeworICAgICAgc3ViY2hhbm5lbF9kYXRhICpzZCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpzZCkpOworICAgICAgbWVtc2V0KHNkLCAwLCBzaXplb2YoKnNkKSk7CisgICAgICBwLT5zdWJjaGFubmVsc1tzdWJjaGFubmVsX2lkeF0gPSBzZDsKKyAgICAgIHNkLT5wb2xpY3kgPSBwOworICAgICAgc2QtPmluZGV4ID0gc3ViY2hhbm5lbF9pZHg7CisgICAgICBzZC0+c3ViY2hhbm5lbCA9IHN1YmNoYW5uZWw7CisgICAgICArK3N1YmNoYW5uZWxfaWR4OworICAgICAgZ3JwY19jbG9zdXJlX2luaXQoJnNkLT5jb25uZWN0aXZpdHlfY2hhbmdlZF9jbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgcnJfY29ubmVjdGl2aXR5X2NoYW5nZWQsIHNkKTsKKyAgICB9CisgIH0KKyAgaWYgKHN1YmNoYW5uZWxfaWR4ID09IDApIHsKKyAgICBncHJfZnJlZShwLT5zdWJjaGFubmVscyk7CisgICAgZ3ByX2ZyZWUocCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcC0+bnVtX3N1YmNoYW5uZWxzID0gc3ViY2hhbm5lbF9pZHg7CisKKyAgLyogVGhlIChkdW1teSBub2RlKSByb290IG9mIHRoZSByZWFkeSBsaXN0ICovCisgIHAtPnJlYWR5X2xpc3Quc3ViY2hhbm5lbCA9IE5VTEw7CisgIHAtPnJlYWR5X2xpc3QucHJldiA9IE5VTEw7CisgIHAtPnJlYWR5X2xpc3QubmV4dCA9IE5VTEw7CisgIHAtPnJlYWR5X2xpc3RfbGFzdF9waWNrID0gJnAtPnJlYWR5X2xpc3Q7CisKKyAgZ3JwY19sYl9wb2xpY3lfaW5pdCgmcC0+YmFzZSwgJnJvdW5kX3JvYmluX2xiX3BvbGljeV92dGFibGUpOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9pbml0KCZwLT5zdGF0ZV90cmFja2VyLCBHUlBDX0NIQU5ORUxfSURMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm91bmRfcm9iaW4iKTsKKyAgZ3ByX211X2luaXQoJnAtPm11KTsKKyAgcmV0dXJuICZwLT5iYXNlOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV92dGFibGUgcm91bmRfcm9iaW5fZmFjdG9yeV92dGFibGUgPSB7CisgICAgcm91bmRfcm9iaW5fZmFjdG9yeV9yZWYsIHJvdW5kX3JvYmluX2ZhY3RvcnlfdW5yZWYsIGNyZWF0ZV9yb3VuZF9yb2JpbiwKKyAgICAicm91bmRfcm9iaW4ifTsKKworc3RhdGljIGdycGNfbGJfcG9saWN5X2ZhY3Rvcnkgcm91bmRfcm9iaW5fbGJfcG9saWN5X2ZhY3RvcnkgPSB7CisgICAgJnJvdW5kX3JvYmluX2ZhY3RvcnlfdnRhYmxlfTsKKworZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZ3JwY19yb3VuZF9yb2Jpbl9sYl9mYWN0b3J5X2NyZWF0ZSgpIHsKKyAgcmV0dXJuICZyb3VuZF9yb2Jpbl9sYl9wb2xpY3lfZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZGIxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0xCX1BPTElDSUVTX1JPVU5EX1JPQklOX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0xCX1BPTElDSUVTX1JPVU5EX1JPQklOX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIgorCitleHRlcm4gaW50IGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2U7CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIgorCisvKiogUmV0dXJucyBhIGxvYWQgYmFsYW5jaW5nIGZhY3RvcnkgZm9yIHRoZSByb3VuZCByb2JpbiBwb2xpY3kgKi8KK2dycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmdycGNfcm91bmRfcm9iaW5fbGJfZmFjdG9yeV9jcmVhdGUoKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ0lFU19ST1VORF9ST0JJTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjBjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIgorCisjZGVmaW5lIFdFQUtfUkVGX0JJVFMgMTYKKwordm9pZCBncnBjX2xiX3BvbGljeV9pbml0KGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19sYl9wb2xpY3lfdnRhYmxlICp2dGFibGUpIHsKKyAgcG9saWN5LT52dGFibGUgPSB2dGFibGU7CisgIGdwcl9hdG1fbm9fYmFycmllcl9zdG9yZSgmcG9saWN5LT5yZWZfcGFpciwgMSA8PCBXRUFLX1JFRl9CSVRTKTsKKyAgcG9saWN5LT5pbnRlcmVzdGVkX3BhcnRpZXMgPSBncnBjX3BvbGxzZXRfc2V0X2NyZWF0ZSgpOworfQorCisjaWZkZWYgR1JQQ19MQl9QT0xJQ1lfUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgUkVGX0ZVTkNfRVhUUkFfQVJHUyAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpyZWFzb24KKyNkZWZpbmUgUkVGX01VVEFURV9FWFRSQV9BUkdTIFJFRl9GVU5DX0VYVFJBX0FSR1MsIGNvbnN0IGNoYXIgKnB1cnBvc2UKKyNkZWZpbmUgUkVGX0ZVTkNfUEFTU19BUkdTKG5ld19yZWFzb24pICwgZmlsZSwgbGluZSwgbmV3X3JlYXNvbgorI2RlZmluZSBSRUZfTVVUQVRFX1BBU1NfQVJHUyhwdXJwb3NlKSAsIGZpbGUsIGxpbmUsIHJlYXNvbiwgcHVycG9zZQorI2Vsc2UKKyNkZWZpbmUgUkVGX0ZVTkNfRVhUUkFfQVJHUworI2RlZmluZSBSRUZfTVVUQVRFX0VYVFJBX0FSR1MKKyNkZWZpbmUgUkVGX0ZVTkNfUEFTU19BUkdTKG5ld19yZWFzb24pCisjZGVmaW5lIFJFRl9NVVRBVEVfUEFTU19BUkdTKHgpCisjZW5kaWYKKworc3RhdGljIGdwcl9hdG0gcmVmX211dGF0ZShncnBjX2xiX3BvbGljeSAqYywgZ3ByX2F0bSBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhcnJpZXIgUkVGX01VVEFURV9FWFRSQV9BUkdTKSB7CisgIGdwcl9hdG0gb2xkX3ZhbCA9IGJhcnJpZXIgPyBncHJfYXRtX2Z1bGxfZmV0Y2hfYWRkKCZjLT5yZWZfcGFpciwgZGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZjLT5yZWZfcGFpciwgZGVsdGEpOworI2lmZGVmIEdSUENfTEJfUE9MSUNZX1JFRkNPVU5UX0RFQlVHCisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKKyAgICAgICAgICAiTEJfUE9MSUNZOiAlcCAlIDEycyAweCUwOHggLT4gMHglMDh4IFslc10iLCBjLCBwdXJwb3NlLCBvbGRfdmFsLAorICAgICAgICAgIG9sZF92YWwgKyBkZWx0YSwgcmVhc29uKTsKKyNlbmRpZgorICByZXR1cm4gb2xkX3ZhbDsKK30KKwordm9pZCBncnBjX2xiX3BvbGljeV9yZWYoZ3JwY19sYl9wb2xpY3kgKnBvbGljeSBSRUZfRlVOQ19FWFRSQV9BUkdTKSB7CisgIHJlZl9tdXRhdGUocG9saWN5LCAxIDw8IFdFQUtfUkVGX0JJVFMsIDAgUkVGX01VVEFURV9QQVNTX0FSR1MoIlNUUk9OR19SRUYiKSk7Cit9CisKK3ZvaWQgZ3JwY19sYl9wb2xpY3lfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2xpY3kgUkVGX0ZVTkNfRVhUUkFfQVJHUykgeworICBncHJfYXRtIG9sZF92YWwgPQorICAgICAgcmVmX211dGF0ZShwb2xpY3ksIChncHJfYXRtKTEgLSAoZ3ByX2F0bSkoMSA8PCBXRUFLX1JFRl9CSVRTKSwKKyAgICAgICAgICAgICAgICAgMSBSRUZfTVVUQVRFX1BBU1NfQVJHUygiU1RST05HX1VOUkVGIikpOworICBncHJfYXRtIG1hc2sgPSB+KGdwcl9hdG0pKCgxIDw8IFdFQUtfUkVGX0JJVFMpIC0gMSk7CisgIGdwcl9hdG0gY2hlY2sgPSAxIDw8IFdFQUtfUkVGX0JJVFM7CisgIGlmICgob2xkX3ZhbCAmIG1hc2spID09IGNoZWNrKSB7CisgICAgcG9saWN5LT52dGFibGUtPnNodXRkb3duKGV4ZWNfY3R4LCBwb2xpY3kpOworICB9CisgIGdycGNfbGJfcG9saWN5X3dlYWtfdW5yZWYoZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5IFJFRl9GVU5DX1BBU1NfQVJHUygic3Ryb25nLXVucmVmIikpOworfQorCit2b2lkIGdycGNfbGJfcG9saWN5X3dlYWtfcmVmKGdycGNfbGJfcG9saWN5ICpwb2xpY3kgUkVGX0ZVTkNfRVhUUkFfQVJHUykgeworICByZWZfbXV0YXRlKHBvbGljeSwgMSwgMCBSRUZfTVVUQVRFX1BBU1NfQVJHUygiV0VBS19SRUYiKSk7Cit9CisKK3ZvaWQgZ3JwY19sYl9wb2xpY3lfd2Vha191bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqcG9saWN5IFJFRl9GVU5DX0VYVFJBX0FSR1MpIHsKKyAgZ3ByX2F0bSBvbGRfdmFsID0KKyAgICAgIHJlZl9tdXRhdGUocG9saWN5LCAtKGdwcl9hdG0pMSwgMSBSRUZfTVVUQVRFX1BBU1NfQVJHUygiV0VBS19VTlJFRiIpKTsKKyAgaWYgKG9sZF92YWwgPT0gMSkgeworICAgIGdycGNfcG9sbHNldF9zZXRfZGVzdHJveShwb2xpY3ktPmludGVyZXN0ZWRfcGFydGllcyk7CisgICAgcG9saWN5LT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIHBvbGljeSk7CisgIH0KK30KKworaW50IGdycGNfbGJfcG9saWN5X3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpIHsKKyAgcmV0dXJuIHBvbGljeS0+dnRhYmxlLT5waWNrKGV4ZWNfY3R4LCBwb2xpY3ksIHBvbGxzZXQsIGluaXRpYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIG9uX2NvbXBsZXRlKTsKK30KKwordm9pZCBncnBjX2xiX3BvbGljeV9jYW5jZWxfcGljayhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCkgeworICBwb2xpY3ktPnZ0YWJsZS0+Y2FuY2VsX3BpY2soZXhlY19jdHgsIHBvbGljeSwgdGFyZ2V0KTsKK30KKwordm9pZCBncnBjX2xiX3BvbGljeV9leGl0X2lkbGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpIHsKKyAgcG9saWN5LT52dGFibGUtPmV4aXRfaWRsZShleGVjX2N0eCwgcG9saWN5KTsKK30KKwordm9pZCBncnBjX2xiX3BvbGljeV9waW5nX29uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7CisgIHBvbGljeS0+dnRhYmxlLT5waW5nX29uZShleGVjX2N0eCwgcG9saWN5LCBjbG9zdXJlKTsKK30KKwordm9pZCBncnBjX2xiX3BvbGljeV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgeworICBwb2xpY3ktPnZ0YWJsZS0+bm90aWZ5X29uX3N0YXRlX2NoYW5nZShleGVjX2N0eCwgcG9saWN5LCBzdGF0ZSwgY2xvc3VyZSk7Cit9CisKK2dycGNfY29ubmVjdGl2aXR5X3N0YXRlIGdycGNfbGJfcG9saWN5X2NoZWNrX2Nvbm5lY3Rpdml0eSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSkgeworICByZXR1cm4gcG9saWN5LT52dGFibGUtPmNoZWNrX2Nvbm5lY3Rpdml0eShleGVjX2N0eCwgcG9saWN5KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhMGEwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ1lfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNZX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgorCisvKiogQSBsb2FkIGJhbGFuY2luZyBwb2xpY3k6IHNwZWNpZmllZCBieSBhIHZ0YWJsZSBhbmQgYSBzdHJ1Y3QgKHdoaWNoCisgICAgaXMgZXhwZWN0ZWQgdG8gYmUgZXh0ZW5kZWQgdG8gY29udGFpbiBzb21lIHBhcmFtZXRlcnMpICovCit0eXBlZGVmIHN0cnVjdCBncnBjX2xiX3BvbGljeSBncnBjX2xiX3BvbGljeTsKK3R5cGVkZWYgc3RydWN0IGdycGNfbGJfcG9saWN5X3Z0YWJsZSBncnBjX2xiX3BvbGljeV92dGFibGU7CisKK3R5cGVkZWYgdm9pZCAoKmdycGNfbGJfY29tcGxldGlvbikodm9pZCAqY2JfYXJnLCBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLCBjb25zdCBjaGFyICplcnJtc2cpOworCitzdHJ1Y3QgZ3JwY19sYl9wb2xpY3kgeworICBjb25zdCBncnBjX2xiX3BvbGljeV92dGFibGUgKnZ0YWJsZTsKKyAgZ3ByX2F0bSByZWZfcGFpcjsKKyAgLyogb3duZWQgcG9pbnRlciB0byBpbnRlcmVzdGVkIHBhcnRpZXMgaW4gbG9hZCBiYWxhbmNpbmcgZGVjaXNpb25zICovCisgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllczsKK307CisKK3N0cnVjdCBncnBjX2xiX3BvbGljeV92dGFibGUgeworICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOworCisgIHZvaWQgKCpzaHV0ZG93bikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOworCisgIC8qKiBpbXBsZW1lbnQgZ3JwY19sYl9wb2xpY3lfcGljayAqLworICBpbnQgKCpwaWNrKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAorICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKKyAgdm9pZCAoKmNhbmNlbF9waWNrKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0KTsKKworICB2b2lkICgqcGluZ19vbmUpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7CisKKyAgLyoqIHRyeSB0byBlbnRlciBhIFJFQURZIGNvbm5lY3Rpdml0eSBzdGF0ZSAqLworICB2b2lkICgqZXhpdF9pZGxlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSk7CisKKyAgLyoqIGNoZWNrIHRoZSBjdXJyZW50IGNvbm5lY3Rpdml0eSBvZiB0aGUgbGJfcG9saWN5ICovCisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICgqY2hlY2tfY29ubmVjdGl2aXR5KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOworCisgIC8qKiBjYWxsIG5vdGlmeSB3aGVuIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBjaGFubmVsIGNoYW5nZXMgZnJvbSAqc3RhdGUuCisgICAgICBVcGRhdGVzICpzdGF0ZSB3aXRoIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHBvbGljeSAqLworICB2b2lkICgqbm90aWZ5X29uX3N0YXRlX2NoYW5nZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKK307CisKKy8qI2RlZmluZSBHUlBDX0xCX1BPTElDWV9SRUZDT1VOVF9ERUJVRyovCisjaWZkZWYgR1JQQ19MQl9QT0xJQ1lfUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfUkVGKHAsIHIpIFwKKyAgZ3JwY19sYl9wb2xpY3lfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBwLCByKSBcCisgIGdycGNfbGJfcG9saWN5X3VucmVmKChleGVjX2N0eCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfTEJfUE9MSUNZX1dFQUtfUkVGKHAsIHIpIFwKKyAgZ3JwY19sYl9wb2xpY3lfd2Vha19yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKKyNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfV0VBS19VTlJFRihleGVjX2N0eCwgcCwgcikgXAorICBncnBjX2xiX3BvbGljeV93ZWFrX3VucmVmKChleGVjX2N0eCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCit2b2lkIGdycGNfbGJfcG9saWN5X3JlZihncnBjX2xiX3BvbGljeSAqcG9saWN5LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfbGJfcG9saWN5X3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKTsKK3ZvaWQgZ3JwY19sYl9wb2xpY3lfd2Vha19yZWYoZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfbGJfcG9saWN5X3dlYWtfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnJlYXNvbik7CisjZWxzZQorI2RlZmluZSBHUlBDX0xCX1BPTElDWV9SRUYocCwgcikgZ3JwY19sYl9wb2xpY3lfcmVmKChwKSkKKyNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoY2wsIHAsIHIpIGdycGNfbGJfcG9saWN5X3VucmVmKChjbCksIChwKSkKKyNkZWZpbmUgR1JQQ19MQl9QT0xJQ1lfV0VBS19SRUYocCwgcikgZ3JwY19sYl9wb2xpY3lfd2Vha19yZWYoKHApKQorI2RlZmluZSBHUlBDX0xCX1BPTElDWV9XRUFLX1VOUkVGKGNsLCBwLCByKSBncnBjX2xiX3BvbGljeV93ZWFrX3VucmVmKChjbCksIChwKSkKK3ZvaWQgZ3JwY19sYl9wb2xpY3lfcmVmKGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwordm9pZCBncnBjX2xiX3BvbGljeV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSk7Cit2b2lkIGdycGNfbGJfcG9saWN5X3dlYWtfcmVmKGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOwordm9pZCBncnBjX2xiX3BvbGljeV93ZWFrX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5KTsKKyNlbmRpZgorCisvKiogY2FsbGVkIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyB0byBpbml0aWFsaXplIHRoZSBiYXNlIHN0cnVjdCAqLwordm9pZCBncnBjX2xiX3BvbGljeV9pbml0KGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19sYl9wb2xpY3lfdnRhYmxlICp2dGFibGUpOworCisvKiogR2l2ZW4gaW5pdGlhbCBtZXRhZGF0YSBpbiBcYSBpbml0aWFsX21ldGFkYXRhLCBmaW5kIGFuIGFwcHJvcHJpYXRlCisgICAgdGFyZ2V0IGZvciB0aGlzIHJwYywgYW5kICdyZXR1cm4nIGl0IGJ5IGNhbGxpbmcgXGEgb25fY29tcGxldGUgYWZ0ZXIgc2V0dGluZworICAgIFxhIHRhcmdldC4KKyAgICBQaWNraW5nIGNhbiBiZSBhc3luY2hyb25vdXMuIEFueSBJTyBzaG91bGQgYmUgZG9uZSB1bmRlciBcYSBwb2xsc2V0LiAqLworaW50IGdycGNfbGJfcG9saWN5X3BpY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICppbml0aWFsX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpOworCit2b2lkIGdycGNfbGJfcG9saWN5X3Bpbmdfb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOworCit2b2lkIGdycGNfbGJfcG9saWN5X2NhbmNlbF9waWNrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICoqdGFyZ2V0KTsKKwordm9pZCBncnBjX2xiX3BvbGljeV9leGl0X2lkbGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5ICpwb2xpY3kpOworCit2b2lkIGdycGNfbGJfcG9saWN5X25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKKworZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19sYl9wb2xpY3lfY2hlY2tfY29ubmVjdGl2aXR5KAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2xiX3BvbGljeSAqcG9saWN5KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19MQl9QT0xJQ1lfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiCisKK3ZvaWQgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV9yZWYoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSogZmFjdG9yeSkgeworICBmYWN0b3J5LT52dGFibGUtPnJlZihmYWN0b3J5KTsKK30KKwordm9pZCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3VucmVmKGdycGNfbGJfcG9saWN5X2ZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgZmFjdG9yeS0+dnRhYmxlLT51bnJlZihmYWN0b3J5KTsKK30KKworZ3JwY19sYl9wb2xpY3kqIGdycGNfbGJfcG9saWN5X2ZhY3RvcnlfY3JlYXRlX2xiX3BvbGljeSgKKyAgICBncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSogZmFjdG9yeSwKKyAgICBncnBjX2xiX3BvbGljeV9hcmdzKiBhcmdzKSB7CisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZmFjdG9yeS0+dnRhYmxlLT5jcmVhdGVfbGJfcG9saWN5KGV4ZWNfY3R4LCBmYWN0b3J5LCBhcmdzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTNhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0xCX1BPTElDWV9GQUNUT1JZX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0xCX1BPTElDWV9GQUNUT1JZX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5IGdycGNfbGJfcG9saWN5X2ZhY3Rvcnk7Cit0eXBlZGVmIHN0cnVjdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3Z0YWJsZSBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3Z0YWJsZTsKKworLyoqIGdycGNfbGJfcG9saWN5IHByb3ZpZGVzIGdycGNfY2xpZW50X2NvbmZpZyBvYmplY3RzIHRvIGdycGNfY2hhbm5lbAorICAgIG9iamVjdHMgKi8KK3N0cnVjdCBncnBjX2xiX3BvbGljeV9mYWN0b3J5IHsKKyAgY29uc3QgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV92dGFibGUgKnZ0YWJsZTsKK307CisKK3R5cGVkZWYgc3RydWN0IGdycGNfbGJfcG9saWN5X2FyZ3MgeworICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcmVzc2VzOworICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc3ViY2hhbm5lbF9mYWN0b3J5OworfSBncnBjX2xiX3BvbGljeV9hcmdzOworCitzdHJ1Y3QgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV92dGFibGUgeworICB2b2lkICgqcmVmKShncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKKyAgdm9pZCAoKnVucmVmKShncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKKworICAvKiogSW1wbGVtZW50YXRpb24gb2YgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV9jcmVhdGVfbGJfcG9saWN5ICovCisgIGdycGNfbGJfcG9saWN5ICooKmNyZWF0ZV9sYl9wb2xpY3kpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeV9hcmdzICphcmdzKTsKKworICAvKiogTmFtZSBmb3IgdGhlIExCIHBvbGljeSB0aGlzIGZhY3RvcnkgaW1wbGVtZW50cyAqLworICBjb25zdCBjaGFyICpuYW1lOworfTsKKwordm9pZCBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3JlZihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKK3ZvaWQgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV91bnJlZihncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpmYWN0b3J5KTsKKworLyoqIENyZWF0ZSBhIGxiX3BvbGljeSBpbnN0YW5jZS4gKi8KK2dycGNfbGJfcG9saWN5ICpncnBjX2xiX3BvbGljeV9mYWN0b3J5X2NyZWF0ZV9sYl9wb2xpY3koCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmZhY3RvcnksCisgICAgZ3JwY19sYl9wb2xpY3lfYXJncyAqYXJncyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNZX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAzZTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTUFYX1BPTElDSUVTIDEwCisKK3N0YXRpYyBncnBjX2xiX3BvbGljeV9mYWN0b3J5ICpnX2FsbF9vZl90aGVfbGJfcG9saWNpZXNbTUFYX1BPTElDSUVTXTsKK3N0YXRpYyBpbnQgZ19udW1iZXJfb2ZfbGJfcG9saWNpZXMgPSAwOworCitzdGF0aWMgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZ19kZWZhdWx0X2xiX3BvbGljeV9mYWN0b3J5OworCit2b2lkIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X2luaXQoZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZGVmYXVsdF9mYWN0b3J5KSB7CisgIGdfbnVtYmVyX29mX2xiX3BvbGljaWVzID0gMDsKKyAgZ19kZWZhdWx0X2xiX3BvbGljeV9mYWN0b3J5ID0gZGVmYXVsdF9mYWN0b3J5OworfQorCit2b2lkIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X3NodXRkb3duKHZvaWQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBnX251bWJlcl9vZl9sYl9wb2xpY2llczsgaSsrKSB7CisgICAgZ3JwY19sYl9wb2xpY3lfZmFjdG9yeV91bnJlZihnX2FsbF9vZl90aGVfbGJfcG9saWNpZXNbaV0pOworICB9Cit9CisKK3ZvaWQgZ3JwY19yZWdpc3Rlcl9sYl9wb2xpY3koZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX2xiX3BvbGljaWVzOyBpKyspIHsKKyAgICBHUFJfQVNTRVJUKDAgIT0gc3RyY21wKGZhY3RvcnktPnZ0YWJsZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfYWxsX29mX3RoZV9sYl9wb2xpY2llc1tpXS0+dnRhYmxlLT5uYW1lKSk7CisgIH0KKyAgR1BSX0FTU0VSVChnX251bWJlcl9vZl9sYl9wb2xpY2llcyAhPSBNQVhfUE9MSUNJRVMpOworICBncnBjX2xiX3BvbGljeV9mYWN0b3J5X3JlZihmYWN0b3J5KTsKKyAgZ19hbGxfb2ZfdGhlX2xiX3BvbGljaWVzW2dfbnVtYmVyX29mX2xiX3BvbGljaWVzKytdID0gZmFjdG9yeTsKK30KKworc3RhdGljIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmxvb2t1cF9mYWN0b3J5KGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgaW50IGk7CisKKyAgaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX2xiX3BvbGljaWVzOyBpKyspIHsKKyAgICBpZiAoMCA9PSBzdHJjbXAobmFtZSwgZ19hbGxfb2ZfdGhlX2xiX3BvbGljaWVzW2ldLT52dGFibGUtPm5hbWUpKSB7CisgICAgICByZXR1cm4gZ19hbGxfb2ZfdGhlX2xiX3BvbGljaWVzW2ldOworICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitncnBjX2xiX3BvbGljeSAqZ3JwY19sYl9wb2xpY3lfY3JlYXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xiX3BvbGljeV9hcmdzICphcmdzKSB7CisgIGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmZhY3RvcnkgPSBsb29rdXBfZmFjdG9yeShuYW1lKTsKKyAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeSA9CisgICAgICBncnBjX2xiX3BvbGljeV9mYWN0b3J5X2NyZWF0ZV9sYl9wb2xpY3koZXhlY19jdHgsIGZhY3RvcnksIGFyZ3MpOworICByZXR1cm4gbGJfcG9saWN5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODk4NTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNZX1JFR0lTVFJZX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX0xCX1BPTElDWV9SRUdJU1RSWV9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorCisvKiogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0cnkgYW5kIHNldCBcYSBkZWZhdWx0X2ZhY3RvcnkgYXMgdGhlIGZhY3RvcnkgdG8gYmUKKyAqIHJldHVybmVkIHdoZW4gbm8gbmFtZSBpcyBwcm92aWRlZCBpbiBhIGxvb2t1cCAqLwordm9pZCBncnBjX2xiX3BvbGljeV9yZWdpc3RyeV9pbml0KGdycGNfbGJfcG9saWN5X2ZhY3RvcnkgKmRlZmF1bHRfZmFjdG9yeSk7Cit2b2lkIGdycGNfbGJfcG9saWN5X3JlZ2lzdHJ5X3NodXRkb3duKHZvaWQpOworCisvKiogUmVnaXN0ZXIgYSBMQiBwb2xpY3kgZmFjdG9yeS4gKi8KK3ZvaWQgZ3JwY19yZWdpc3Rlcl9sYl9wb2xpY3koZ3JwY19sYl9wb2xpY3lfZmFjdG9yeSAqZmFjdG9yeSk7CisKKy8qKiBDcmVhdGUgYSBcYSBncnBjX2xiX3BvbGljeSBpbnN0YW5jZS4KKyAqCisgKiBJZiBcYSBuYW1lIGlzIE5VTEwsIHRoZSBkZWZhdWx0IGZhY3RvcnkgZnJvbSBcYSBncnBjX2xiX3BvbGljeV9yZWdpc3RyeV9pbml0CisgKiB3aWxsIGJlIHJldHVybmVkLiAqLworZ3JwY19sYl9wb2xpY3kgKmdycGNfbGJfcG9saWN5X2NyZWF0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19sYl9wb2xpY3lfYXJncyAqYXJncyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfTEJfUE9MSUNZX1JFR0lTVFJZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIgorCit2b2lkIGdycGNfcmVzb2x2ZXJfaW5pdChncnBjX3Jlc29sdmVyICpyZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfcmVzb2x2ZXJfdnRhYmxlICp2dGFibGUpIHsKKyAgcmVzb2x2ZXItPnZ0YWJsZSA9IHZ0YWJsZTsKKyAgZ3ByX3JlZl9pbml0KCZyZXNvbHZlci0+cmVmcywgMSk7Cit9CisKKyNpZmRlZiBHUlBDX1JFU09MVkVSX1JFRkNPVU5UX0RFQlVHCit2b2lkIGdycGNfcmVzb2x2ZXJfcmVmKGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyLCBncnBjX2Nsb3N1cmVfbGlzdCAqY2xvc3VyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKSB7CisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIlJFU09MVkVSOiVwICAgcmVmICVkIC0+ICVkICVzIiwKKyAgICAgICAgICByZXNvbHZlciwgKGludClyZXNvbHZlci0+cmVmcy5jb3VudCwgKGludClyZXNvbHZlci0+cmVmcy5jb3VudCArIDEsCisgICAgICAgICAgcmVhc29uKTsKKyNlbHNlCit2b2lkIGdycGNfcmVzb2x2ZXJfcmVmKGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7CisjZW5kaWYKKyAgZ3ByX3JlZigmcmVzb2x2ZXItPnJlZnMpOworfQorCisjaWZkZWYgR1JQQ19SRVNPTFZFUl9SRUZDT1VOVF9ERUJVRwordm9pZCBncnBjX3Jlc29sdmVyX3VucmVmKGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZV9saXN0ICpjbG9zdXJlX2xpc3QsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJSRVNPTFZFUjolcCB1bnJlZiAlZCAtPiAlZCAlcyIsCisgICAgICAgICAgcmVzb2x2ZXIsIChpbnQpcmVzb2x2ZXItPnJlZnMuY291bnQsIChpbnQpcmVzb2x2ZXItPnJlZnMuY291bnQgLSAxLAorICAgICAgICAgIHJlYXNvbik7CisjZWxzZQordm9pZCBncnBjX3Jlc29sdmVyX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgeworI2VuZGlmCisgIGlmIChncHJfdW5yZWYoJnJlc29sdmVyLT5yZWZzKSkgeworICAgIHJlc29sdmVyLT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIHJlc29sdmVyKTsKKyAgfQorfQorCit2b2lkIGdycGNfcmVzb2x2ZXJfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7CisgIHJlc29sdmVyLT52dGFibGUtPnNodXRkb3duKGV4ZWNfY3R4LCByZXNvbHZlcik7Cit9CisKK3ZvaWQgZ3JwY19yZXNvbHZlcl9jaGFubmVsX3Nhd19lcnJvcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgeworICByZXNvbHZlci0+dnRhYmxlLT5jaGFubmVsX3Nhd19lcnJvcihleGVjX2N0eCwgcmVzb2x2ZXIpOworfQorCit2b2lkIGdycGNfcmVzb2x2ZXJfbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSkgeworICByZXNvbHZlci0+dnRhYmxlLT5uZXh0KGV4ZWNfY3R4LCByZXNvbHZlciwgdGFyZ2V0X2NvbmZpZywgb25fY29tcGxldGUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlODc5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlciBncnBjX3Jlc29sdmVyOwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlcl92dGFibGUgZ3JwY19yZXNvbHZlcl92dGFibGU7CisKKy8qKiBncnBjX3Jlc29sdmVyIHByb3ZpZGVzIGdycGNfY2xpZW50X2NvbmZpZyBvYmplY3RzIHRvIGdycGNfY2hhbm5lbAorICAgIG9iamVjdHMgKi8KK3N0cnVjdCBncnBjX3Jlc29sdmVyIHsKKyAgY29uc3QgZ3JwY19yZXNvbHZlcl92dGFibGUgKnZ0YWJsZTsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7Cit9OworCitzdHJ1Y3QgZ3JwY19yZXNvbHZlcl92dGFibGUgeworICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKTsKKyAgdm9pZCAoKnNodXRkb3duKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpOworICB2b2lkICgqY2hhbm5lbF9zYXdfZXJyb3IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7CisgIHZvaWQgKCpuZXh0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCisgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKK307CisKKyNpZmRlZiBHUlBDX1JFU09MVkVSX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIEdSUENfUkVTT0xWRVJfUkVGKHAsIHIpIGdycGNfcmVzb2x2ZXJfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfUkVTT0xWRVJfVU5SRUYoY2wsIHAsIHIpIFwKKyAgZ3JwY19yZXNvbHZlcl91bnJlZigoY2wpLCAocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQordm9pZCBncnBjX3Jlc29sdmVyX3JlZihncnBjX3Jlc29sdmVyICpwb2xpY3ksIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwordm9pZCBncnBjX3Jlc29sdmVyX3VucmVmKGdycGNfcmVzb2x2ZXIgKnBvbGljeSwgZ3JwY19jbG9zdXJlX2xpc3QgKmNsb3N1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKTsKKyNlbHNlCisjZGVmaW5lIEdSUENfUkVTT0xWRVJfUkVGKHAsIHIpIGdycGNfcmVzb2x2ZXJfcmVmKChwKSkKKyNkZWZpbmUgR1JQQ19SRVNPTFZFUl9VTlJFRihjbCwgcCwgcikgZ3JwY19yZXNvbHZlcl91bnJlZigoY2wpLCAocCkpCit2b2lkIGdycGNfcmVzb2x2ZXJfcmVmKGdycGNfcmVzb2x2ZXIgKnBvbGljeSk7Cit2b2lkIGdycGNfcmVzb2x2ZXJfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnBvbGljeSk7CisjZW5kaWYKKwordm9pZCBncnBjX3Jlc29sdmVyX2luaXQoZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX3Jlc29sdmVyX3Z0YWJsZSAqdnRhYmxlKTsKKwordm9pZCBncnBjX3Jlc29sdmVyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7CisKKy8qKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgY2hhbm5lbCBoYXMgc2VlbiBhbiBlcnJvciBvbiBzb21lIGFkZHJlc3MuCisgICAgQ2FuIGJlIHVzZWQgYXMgYSBoaW50IHRoYXQgcmUtcmVzb2x1dGlvbiBpcyBkZXNpcmFibGUgc29vbi4gKi8KK3ZvaWQgZ3JwY19yZXNvbHZlcl9jaGFubmVsX3Nhd19lcnJvcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcik7CisKKy8qKiBHZXQgdGhlIG5leHQgY2xpZW50IGNvbmZpZy4gQ2FsbGVkIGJ5IHRoZSBjaGFubmVsIHRvIGZldGNoIGEgbmV3CisgICAgY29uZmlndXJhdGlvbi4gRXhwZWN0ZWQgdG8gc2V0ICp0YXJnZXRfY29uZmlnIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbiwKKyAgICBhbmQgdGhlbiBzY2hlZHVsZSBvbl9jb21wbGV0ZSBmb3IgZXhlY3V0aW9uLgorCisgICAgSWYgcmVzb2x1dGlvbiBpcyBmYXRhbGx5IGJyb2tlbiwgc2V0ICp0YXJnZXRfY29uZmlnIHRvIE5VTEwgYW5kCisgICAgc2NoZWR1bGUgb25fY29tcGxldGUuICovCit2b2lkIGdycGNfcmVzb2x2ZXJfbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzZjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIKKwordm9pZCBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfcmVmKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSogZmFjdG9yeSkgeworICBmYWN0b3J5LT52dGFibGUtPnJlZihmYWN0b3J5KTsKK30KKwordm9pZCBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfdW5yZWYoZ3JwY19yZXNvbHZlcl9mYWN0b3J5KiBmYWN0b3J5KSB7CisgIGZhY3RvcnktPnZ0YWJsZS0+dW5yZWYoZmFjdG9yeSk7Cit9CisKKy8qKiBDcmVhdGUgYSByZXNvbHZlciBpbnN0YW5jZSBmb3IgYSBuYW1lICovCitncnBjX3Jlc29sdmVyKiBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyKAorICAgIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSogZmFjdG9yeSwgZ3JwY19yZXNvbHZlcl9hcmdzKiBhcmdzKSB7CisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZmFjdG9yeS0+dnRhYmxlLT5jcmVhdGVfcmVzb2x2ZXIoZmFjdG9yeSwgYXJncyk7Cit9CisKK2NoYXIqIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9nZXRfZGVmYXVsdF9hdXRob3JpdHkoCisgICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5KiBmYWN0b3J5LCBncnBjX3VyaSogdXJpKSB7CisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZmFjdG9yeS0+dnRhYmxlLT5nZXRfZGVmYXVsdF9hdXRob3JpdHkoZmFjdG9yeSwgdXJpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY1YzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1JFU09MVkVSX0ZBQ1RPUllfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfRkFDVE9SWV9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5IGdycGNfcmVzb2x2ZXJfZmFjdG9yeTsKK3R5cGVkZWYgc3RydWN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV92dGFibGUgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZTsKKworLyoqIGdycGNfcmVzb2x2ZXIgcHJvdmlkZXMgZ3JwY19jbGllbnRfY29uZmlnIG9iamVjdHMgdG8gZ3JwY19jaGFubmVsCisgICAgb2JqZWN0cyAqLworc3RydWN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeSB7CisgIGNvbnN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV92dGFibGUgKnZ0YWJsZTsKK307CisKK3R5cGVkZWYgc3RydWN0IGdycGNfcmVzb2x2ZXJfYXJncyB7CisgIGdycGNfdXJpICp1cmk7CisgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzdWJjaGFubmVsX2ZhY3Rvcnk7Cit9IGdycGNfcmVzb2x2ZXJfYXJnczsKKworc3RydWN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV92dGFibGUgeworICB2b2lkICgqcmVmKShncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpOworICB2b2lkICgqdW5yZWYpKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSk7CisKKyAgLyoqIEltcGxlbWVudGF0aW9uIG9mIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIgKi8KKyAgZ3JwY19yZXNvbHZlciAqKCpjcmVhdGVfcmVzb2x2ZXIpKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncyk7CisKKyAgLyoqIEltcGxlbWVudGF0aW9uIG9mIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9nZXRfZGVmYXVsdF9hdXRob3JpdHkgKi8KKyAgY2hhciAqKCpnZXRfZGVmYXVsdF9hdXRob3JpdHkpKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwgZ3JwY191cmkgKnVyaSk7CisKKyAgLyoqIFVSSSBzY2hlbWUgdGhhdCB0aGlzIGZhY3RvcnkgaW1wbGVtZW50cyAqLworICBjb25zdCBjaGFyICpzY2hlbWU7Cit9OworCit2b2lkIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9yZWYoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpyZXNvbHZlcik7Cit2b2lkIGdycGNfcmVzb2x2ZXJfZmFjdG9yeV91bnJlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKnJlc29sdmVyKTsKKworLyoqIENyZWF0ZSBhIHJlc29sdmVyIGluc3RhbmNlIGZvciBhIG5hbWUgKi8KK2dycGNfcmVzb2x2ZXIgKmdycGNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIoCisgICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LCBncnBjX3Jlc29sdmVyX2FyZ3MgKmFyZ3MpOworCisvKiogUmV0dXJuIGEgKGZyZXNobHkgYWxsb2NhdGVkIHdpdGggZ3ByX21hbGxvYykgc3RyaW5nIHJlcHJlc2VudGluZworICAgIHRoZSBkZWZhdWx0IGF1dGhvcml0eSB0byB1c2UgZm9yIHRoaXMgc2NoZW1lLiAqLworY2hhciAqZ3JwY19yZXNvbHZlcl9mYWN0b3J5X2dldF9kZWZhdWx0X2F1dGhvcml0eSgKKyAgICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnksIGdycGNfdXJpICp1cmkpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1JFU09MVkVSX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliZDAwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisKKyNkZWZpbmUgTUFYX1JFU09MVkVSUyAxMAorCitzdGF0aWMgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpnX2FsbF9vZl90aGVfcmVzb2x2ZXJzW01BWF9SRVNPTFZFUlNdOworc3RhdGljIGludCBnX251bWJlcl9vZl9yZXNvbHZlcnMgPSAwOworCitzdGF0aWMgY2hhciAqZ19kZWZhdWx0X3Jlc29sdmVyX3ByZWZpeDsKKwordm9pZCBncnBjX3Jlc29sdmVyX3JlZ2lzdHJ5X2luaXQoY29uc3QgY2hhciAqZGVmYXVsdF9yZXNvbHZlcl9wcmVmaXgpIHsKKyAgZ19udW1iZXJfb2ZfcmVzb2x2ZXJzID0gMDsKKyAgZ19kZWZhdWx0X3Jlc29sdmVyX3ByZWZpeCA9IGdwcl9zdHJkdXAoZGVmYXVsdF9yZXNvbHZlcl9wcmVmaXgpOworfQorCit2b2lkIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfc2h1dGRvd24odm9pZCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX3Jlc29sdmVyczsgaSsrKSB7CisgICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3VucmVmKGdfYWxsX29mX3RoZV9yZXNvbHZlcnNbaV0pOworICB9CisgIGdwcl9mcmVlKGdfZGVmYXVsdF9yZXNvbHZlcl9wcmVmaXgpOworfQorCit2b2lkIGdycGNfcmVnaXN0ZXJfcmVzb2x2ZXJfdHlwZShncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBnX251bWJlcl9vZl9yZXNvbHZlcnM7IGkrKykgeworICAgIEdQUl9BU1NFUlQoMCAhPSBzdHJjbXAoZmFjdG9yeS0+dnRhYmxlLT5zY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2FsbF9vZl90aGVfcmVzb2x2ZXJzW2ldLT52dGFibGUtPnNjaGVtZSkpOworICB9CisgIEdQUl9BU1NFUlQoZ19udW1iZXJfb2ZfcmVzb2x2ZXJzICE9IE1BWF9SRVNPTFZFUlMpOworICBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfcmVmKGZhY3RvcnkpOworICBnX2FsbF9vZl90aGVfcmVzb2x2ZXJzW2dfbnVtYmVyX29mX3Jlc29sdmVycysrXSA9IGZhY3Rvcnk7Cit9CisKK3N0YXRpYyBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmxvb2t1cF9mYWN0b3J5KGdycGNfdXJpICp1cmkpIHsKKyAgaW50IGk7CisKKyAgLyogaGFuZGxpbmcgTlVMTCB1cmkncyBoZXJlIHNpbXBsaWZpZXMgZ3JwY19yZXNvbHZlcl9jcmVhdGUgKi8KKyAgaWYgKCF1cmkpIHJldHVybiBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBnX251bWJlcl9vZl9yZXNvbHZlcnM7IGkrKykgeworICAgIGlmICgwID09IHN0cmNtcCh1cmktPnNjaGVtZSwgZ19hbGxfb2ZfdGhlX3Jlc29sdmVyc1tpXS0+dnRhYmxlLT5zY2hlbWUpKSB7CisgICAgICByZXR1cm4gZ19hbGxfb2ZfdGhlX3Jlc29sdmVyc1tpXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqcmVzb2x2ZV9mYWN0b3J5KGNvbnN0IGNoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqKnVyaSkgeworICBjaGFyICp0bXA7CisgIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSA9IE5VTEw7CisKKyAgR1BSX0FTU0VSVCh1cmkgIT0gTlVMTCk7CisgICp1cmkgPSBncnBjX3VyaV9wYXJzZSh0YXJnZXQsIDEpOworICBmYWN0b3J5ID0gbG9va3VwX2ZhY3RvcnkoKnVyaSk7CisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICBpZiAoZ19kZWZhdWx0X3Jlc29sdmVyX3ByZWZpeCAhPSBOVUxMKSB7CisgICAgICBncnBjX3VyaV9kZXN0cm95KCp1cmkpOworICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICIlcyVzIiwgZ19kZWZhdWx0X3Jlc29sdmVyX3ByZWZpeCwgdGFyZ2V0KTsKKyAgICAgICp1cmkgPSBncnBjX3VyaV9wYXJzZSh0bXAsIDEpOworICAgICAgZmFjdG9yeSA9IGxvb2t1cF9mYWN0b3J5KCp1cmkpOworICAgICAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgICBncnBjX3VyaV9kZXN0cm95KGdycGNfdXJpX3BhcnNlKHRhcmdldCwgMCkpOworICAgICAgICBncnBjX3VyaV9kZXN0cm95KGdycGNfdXJpX3BhcnNlKHRtcCwgMCkpOworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImRvbid0IGtub3cgaG93IHRvIHJlc29sdmUgJyVzJyBvciAnJXMnIiwgdGFyZ2V0LAorICAgICAgICAgICAgICAgIHRtcCk7CisgICAgICB9CisgICAgICBncHJfZnJlZSh0bXApOworICAgIH0gZWxzZSB7CisgICAgICBncnBjX3VyaV9kZXN0cm95KGdycGNfdXJpX3BhcnNlKHRhcmdldCwgMCkpOworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJkb24ndCBrbm93IGhvdyB0byByZXNvbHZlICclcyciLCB0YXJnZXQpOworICAgIH0KKyAgfQorICByZXR1cm4gZmFjdG9yeTsKK30KKworZ3JwY19yZXNvbHZlciAqZ3JwY19yZXNvbHZlcl9jcmVhdGUoCisgICAgY29uc3QgY2hhciAqdGFyZ2V0LCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc3ViY2hhbm5lbF9mYWN0b3J5KSB7CisgIGdycGNfdXJpICp1cmkgPSBOVUxMOworICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkgPSByZXNvbHZlX2ZhY3RvcnkodGFyZ2V0LCAmdXJpKTsKKyAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXI7CisgIGdycGNfcmVzb2x2ZXJfYXJncyBhcmdzOworICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisgIGFyZ3MudXJpID0gdXJpOworICBhcmdzLnN1YmNoYW5uZWxfZmFjdG9yeSA9IHN1YmNoYW5uZWxfZmFjdG9yeTsKKyAgcmVzb2x2ZXIgPSBncnBjX3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyKGZhY3RvcnksICZhcmdzKTsKKyAgZ3JwY191cmlfZGVzdHJveSh1cmkpOworICByZXR1cm4gcmVzb2x2ZXI7Cit9CisKK2NoYXIgKmdycGNfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGNvbnN0IGNoYXIgKnRhcmdldCkgeworICBncnBjX3VyaSAqdXJpID0gTlVMTDsKKyAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5ID0gcmVzb2x2ZV9mYWN0b3J5KHRhcmdldCwgJnVyaSk7CisgIGNoYXIgKmF1dGhvcml0eSA9IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV9nZXRfZGVmYXVsdF9hdXRob3JpdHkoZmFjdG9yeSwgdXJpKTsKKyAgZ3JwY191cmlfZGVzdHJveSh1cmkpOworICByZXR1cm4gYXV0aG9yaXR5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyODljYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfUkVHSVNUUllfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJfUkVHSVNUUllfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgorCit2b2lkIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfaW5pdChjb25zdCBjaGFyICpkZWZhdWx0X3ByZWZpeCk7Cit2b2lkIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfc2h1dGRvd24odm9pZCk7CisKKy8qKiBSZWdpc3RlciBhIHJlc29sdmVyIHR5cGUuCisgICAgVVJJJ3Mgb2YgXGEgc2NoZW1lIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgZ2l2ZW4gcmVzb2x2ZXIuCisgICAgSWYgXGEgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZW4gdGhlIHJlc29sdmVyIHdpbGwgYmUgZWxpZ2libGUKKyAgICB0byByZXNvbHZlIG5hbWVzIHRoYXQgYXJlIHBhc3NlZCBpbiB3aXRoIG5vIHNjaGVtZS4gSGlnaGVyIHByaW9yaXR5CisgICAgcmVzb2x2ZXJzIHdpbGwgYmUgdHJpZWQgYmVmb3JlIGxvd2VyIHByaW9yaXR5IHNjaGVtZXMuICovCit2b2lkIGdycGNfcmVnaXN0ZXJfcmVzb2x2ZXJfdHlwZShncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpOworCisvKiogQ3JlYXRlIGEgcmVzb2x2ZXIgZ2l2ZW4gXGEgdGFyZ2V0LgorICAgIEZpcnN0IHRyaWVzIHRvIHBhcnNlIFxhIHRhcmdldCBhcyBhIFVSSS4gSWYgdGhpcyBzdWNjZWVkcywgdHJpZXMKKyAgICB0byBsb2NhdGUgYSByZWdpc3RlcmVkIHJlc29sdmVyIGZhY3RvcnkgYmFzZWQgb24gdGhlIFVSSSBzY2hlbWUuCisgICAgSWYgcGFyc2luZyBvciBsb2NhdGlvbiBmYWlscywgcHJlZml4ZXMgZGVmYXVsdF9wcmVmaXggZnJvbQorICAgIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfaW5pdCB0byB0YXJnZXQsIGFuZCB0cmllcyBhZ2FpbiAoaWYgZGVmYXVsdF9wcmVmaXgKKyAgICB3YXMgbm90IE5VTEwpLgorICAgIElmIGEgcmVzb2x2ZXIgZmFjdG9yeSB3YXMgZm91bmQsIHVzZSBpdCB0byBpbnN0YW50aWF0ZSBhIHJlc29sdmVyIGFuZAorICAgIHJldHVybiBpdC4KKyAgICBJZiBhIHJlc29sdmVyIGZhY3Rvcnkgd2FzIG5vdCBmb3VuZCwgcmV0dXJuIE5VTEwuICovCitncnBjX3Jlc29sdmVyICpncnBjX3Jlc29sdmVyX2NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICp0YXJnZXQsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzdWJjaGFubmVsX2ZhY3RvcnkpOworCisvKiogR2l2ZW4gYSB0YXJnZXQsIHJldHVybiBhIChmcmVzaGx5IGFsbG9jYXRlZCB3aXRoIGdwcl9tYWxsb2MpIHN0cmluZworICAgIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBhdXRob3JpdHkgdG8gcGFzcyBmcm9tIGEgY2xpZW50LiAqLworY2hhciAqZ3JwY19nZXRfZGVmYXVsdF9hdXRob3JpdHkoY29uc3QgY2hhciAqdGFyZ2V0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUl9SRUdJU1RSWV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiY2NkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKworI2RlZmluZSBCQUNLT0ZGX01VTFRJUExJRVIgMS42CisjZGVmaW5lIEJBQ0tPRkZfSklUVEVSIDAuMgorI2RlZmluZSBCQUNLT0ZGX01JTl9TRUNPTkRTIDEKKyNkZWZpbmUgQkFDS09GRl9NQVhfU0VDT05EUyAxMjAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiogYmFzZSBjbGFzczogbXVzdCBiZSBmaXJzdCAqLworICBncnBjX3Jlc29sdmVyIGJhc2U7CisgIC8qKiByZWZjb3VudCAqLworICBncHJfcmVmY291bnQgcmVmczsKKyAgLyoqIG5hbWUgdG8gcmVzb2x2ZSAqLworICBjaGFyICpuYW1lOworICAvKiogZGVmYXVsdCBwb3J0IHRvIHVzZSAqLworICBjaGFyICpkZWZhdWx0X3BvcnQ7CisgIC8qKiBzdWJjaGFubmVsIGZhY3RvcnkgKi8KKyAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnN1YmNoYW5uZWxfZmFjdG9yeTsKKyAgLyoqIGxvYWQgYmFsYW5jaW5nIHBvbGljeSBuYW1lICovCisgIGNoYXIgKmxiX3BvbGljeV9uYW1lOworCisgIC8qKiBtdXRleCBndWFyZGluZyB0aGUgcmVzdCBvZiB0aGUgc3RhdGUgKi8KKyAgZ3ByX211IG11OworICAvKiogYXJlIHdlIGN1cnJlbnRseSByZXNvbHZpbmc/ICovCisgIGludCByZXNvbHZpbmc7CisgIC8qKiB3aGljaCB2ZXJzaW9uIG9mIHJlc29sdmVkX2NvbmZpZyBoYXZlIHdlIHB1Ymxpc2hlZD8gKi8KKyAgaW50IHB1Ymxpc2hlZF92ZXJzaW9uOworICAvKiogd2hpY2ggdmVyc2lvbiBvZiByZXNvbHZlZF9jb25maWcgaXMgY3VycmVudD8gKi8KKyAgaW50IHJlc29sdmVkX3ZlcnNpb247CisgIC8qKiBwZW5kaW5nIG5leHQgY29tcGxldGlvbiwgb3IgTlVMTCAqLworICBncnBjX2Nsb3N1cmUgKm5leHRfY29tcGxldGlvbjsKKyAgLyoqIHRhcmdldCBjb25maWcgYWRkcmVzcyBmb3IgbmV4dCBjb21wbGV0aW9uICovCisgIGdycGNfY2xpZW50X2NvbmZpZyAqKnRhcmdldF9jb25maWc7CisgIC8qKiBjdXJyZW50IChmdWxseSByZXNvbHZlZCkgY29uZmlnICovCisgIGdycGNfY2xpZW50X2NvbmZpZyAqcmVzb2x2ZWRfY29uZmlnOworICAvKiogcmV0cnkgdGltZXIgKi8KKyAgYm9vbCBoYXZlX3JldHJ5X3RpbWVyOworICBncnBjX3RpbWVyIHJldHJ5X3RpbWVyOworICAvKiogcmV0cnkgYmFja29mZiBzdGF0ZSAqLworICBncHJfYmFja29mZiBiYWNrb2ZmX3N0YXRlOworfSBkbnNfcmVzb2x2ZXI7CisKK3N0YXRpYyB2b2lkIGRuc19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyKTsKKworc3RhdGljIHZvaWQgZG5zX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQoZG5zX3Jlc29sdmVyICpyKTsKK3N0YXRpYyB2b2lkIGRuc19tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuc19yZXNvbHZlciAqcik7CisKK3N0YXRpYyB2b2lkIGRuc19zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcik7CitzdGF0aWMgdm9pZCBkbnNfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnIpOworc3RhdGljIHZvaWQgZG5zX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnIsCisgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSk7CisKK3N0YXRpYyBjb25zdCBncnBjX3Jlc29sdmVyX3Z0YWJsZSBkbnNfcmVzb2x2ZXJfdnRhYmxlID0geworICAgIGRuc19kZXN0cm95LCBkbnNfc2h1dGRvd24sIGRuc19jaGFubmVsX3Nhd19lcnJvciwgZG5zX25leHR9OworCitzdGF0aWMgdm9pZCBkbnNfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7CisgIGRuc19yZXNvbHZlciAqciA9IChkbnNfcmVzb2x2ZXIgKilyZXNvbHZlcjsKKyAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgaWYgKHItPmhhdmVfcmV0cnlfdGltZXIpIHsKKyAgICBncnBjX3RpbWVyX2NhbmNlbChleGVjX2N0eCwgJnItPnJldHJ5X3RpbWVyKTsKKyAgfQorICBpZiAoci0+bmV4dF9jb21wbGV0aW9uICE9IE5VTEwpIHsKKyAgICAqci0+dGFyZ2V0X2NvbmZpZyA9IE5VTEw7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCByLT5uZXh0X2NvbXBsZXRpb24sIHRydWUsIE5VTEwpOworICAgIHItPm5leHRfY29tcGxldGlvbiA9IE5VTEw7CisgIH0KKyAgZ3ByX211X3VubG9jaygmci0+bXUpOworfQorCitzdGF0aWMgdm9pZCBkbnNfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKKyAgZG5zX3Jlc29sdmVyICpyID0gKGRuc19yZXNvbHZlciAqKXJlc29sdmVyOworICBncHJfbXVfbG9jaygmci0+bXUpOworICBpZiAoIXItPnJlc29sdmluZykgeworICAgIGdwcl9iYWNrb2ZmX3Jlc2V0KCZyLT5iYWNrb2ZmX3N0YXRlKTsKKyAgICBkbnNfc3RhcnRfcmVzb2x2aW5nX2xvY2tlZChyKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIGRuc19uZXh0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xpZW50X2NvbmZpZyAqKnRhcmdldF9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7CisgIGRuc19yZXNvbHZlciAqciA9IChkbnNfcmVzb2x2ZXIgKilyZXNvbHZlcjsKKyAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgR1BSX0FTU0VSVCghci0+bmV4dF9jb21wbGV0aW9uKTsKKyAgci0+bmV4dF9jb21wbGV0aW9uID0gb25fY29tcGxldGU7CisgIHItPnRhcmdldF9jb25maWcgPSB0YXJnZXRfY29uZmlnOworICBpZiAoci0+cmVzb2x2ZWRfdmVyc2lvbiA9PSAwICYmICFyLT5yZXNvbHZpbmcpIHsKKyAgICBncHJfYmFja29mZl9yZXNldCgmci0+YmFja29mZl9zdGF0ZSk7CisgICAgZG5zX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7CisgIH0gZWxzZSB7CisgICAgZG5zX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChleGVjX2N0eCwgcik7CisgIH0KKyAgZ3ByX211X3VubG9jaygmci0+bXUpOworfQorCitzdGF0aWMgdm9pZCBkbnNfb25fcmV0cnlfdGltZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZG5zX3Jlc29sdmVyICpyID0gYXJnOworCisgIGdwcl9tdV9sb2NrKCZyLT5tdSk7CisgIHItPmhhdmVfcmV0cnlfdGltZXIgPSBmYWxzZTsKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICBpZiAoIXItPnJlc29sdmluZykgeworICAgICAgZG5zX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7CisgICAgfQorICB9CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKKworICBHUlBDX1JFU09MVkVSX1VOUkVGKGV4ZWNfY3R4LCAmci0+YmFzZSwgInJldHJ5LXRpbWVyIik7Cit9CisKK3N0YXRpYyB2b2lkIGRuc19vbl9yZXNvbHZlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRyZXNzZXMpIHsKKyAgZG5zX3Jlc29sdmVyICpyID0gYXJnOworICBncnBjX2NsaWVudF9jb25maWcgKmNvbmZpZyA9IE5VTEw7CisgIGdycGNfbGJfcG9saWN5ICpsYl9wb2xpY3k7CisgIGdwcl9tdV9sb2NrKCZyLT5tdSk7CisgIEdQUl9BU1NFUlQoci0+cmVzb2x2aW5nKTsKKyAgci0+cmVzb2x2aW5nID0gMDsKKyAgaWYgKGFkZHJlc3NlcyAhPSBOVUxMKSB7CisgICAgZ3JwY19sYl9wb2xpY3lfYXJncyBsYl9wb2xpY3lfYXJnczsKKyAgICBjb25maWcgPSBncnBjX2NsaWVudF9jb25maWdfY3JlYXRlKCk7CisgICAgbWVtc2V0KCZsYl9wb2xpY3lfYXJncywgMCwgc2l6ZW9mKGxiX3BvbGljeV9hcmdzKSk7CisgICAgbGJfcG9saWN5X2FyZ3MuYWRkcmVzc2VzID0gYWRkcmVzc2VzOworICAgIGxiX3BvbGljeV9hcmdzLnN1YmNoYW5uZWxfZmFjdG9yeSA9IHItPnN1YmNoYW5uZWxfZmFjdG9yeTsKKyAgICBsYl9wb2xpY3kgPQorICAgICAgICBncnBjX2xiX3BvbGljeV9jcmVhdGUoZXhlY19jdHgsIHItPmxiX3BvbGljeV9uYW1lLCAmbGJfcG9saWN5X2FyZ3MpOworICAgIGlmIChsYl9wb2xpY3kgIT0gTlVMTCkgeworICAgICAgZ3JwY19jbGllbnRfY29uZmlnX3NldF9sYl9wb2xpY3koY29uZmlnLCBsYl9wb2xpY3kpOworICAgICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGxiX3BvbGljeSwgImNvbnN0cnVjdGlvbiIpOworICAgIH0KKyAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KGFkZHJlc3Nlcyk7CisgIH0gZWxzZSB7CisgICAgZ3ByX3RpbWVzcGVjIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQyk7CisgICAgZ3ByX3RpbWVzcGVjIG5leHRfdHJ5ID0gZ3ByX2JhY2tvZmZfc3RlcCgmci0+YmFja29mZl9zdGF0ZSwgbm93KTsKKyAgICBncHJfdGltZXNwZWMgdGltZW91dCA9IGdwcl90aW1lX3N1YihuZXh0X3RyeSwgbm93KTsKKyAgICBncHJfbG9nKEdQUl9ERUJVRywgImRucyByZXNvbHV0aW9uIGZhaWxlZDogcmV0cnlpbmcgaW4gJWQuJTA5ZCBzZWNvbmRzIiwKKyAgICAgICAgICAgIHRpbWVvdXQudHZfc2VjLCB0aW1lb3V0LnR2X25zZWMpOworICAgIEdQUl9BU1NFUlQoIXItPmhhdmVfcmV0cnlfdGltZXIpOworICAgIHItPmhhdmVfcmV0cnlfdGltZXIgPSB0cnVlOworICAgIEdSUENfUkVTT0xWRVJfUkVGKCZyLT5iYXNlLCAicmV0cnktdGltZXIiKTsKKyAgICBncnBjX3RpbWVyX2luaXQoZXhlY19jdHgsICZyLT5yZXRyeV90aW1lciwgbmV4dF90cnksIGRuc19vbl9yZXRyeV90aW1lciwgciwKKyAgICAgICAgICAgICAgICAgICAgbm93KTsKKyAgfQorICBpZiAoci0+cmVzb2x2ZWRfY29uZmlnKSB7CisgICAgZ3JwY19jbGllbnRfY29uZmlnX3VucmVmKGV4ZWNfY3R4LCByLT5yZXNvbHZlZF9jb25maWcpOworICB9CisgIHItPnJlc29sdmVkX2NvbmZpZyA9IGNvbmZpZzsKKyAgci0+cmVzb2x2ZWRfdmVyc2lvbisrOworICBkbnNfbWF5YmVfZmluaXNoX25leHRfbG9ja2VkKGV4ZWNfY3R4LCByKTsKKyAgZ3ByX211X3VubG9jaygmci0+bXUpOworCisgIEdSUENfUkVTT0xWRVJfVU5SRUYoZXhlY19jdHgsICZyLT5iYXNlLCAiZG5zLXJlc29sdmluZyIpOworfQorCitzdGF0aWMgdm9pZCBkbnNfc3RhcnRfcmVzb2x2aW5nX2xvY2tlZChkbnNfcmVzb2x2ZXIgKnIpIHsKKyAgR1JQQ19SRVNPTFZFUl9SRUYoJnItPmJhc2UsICJkbnMtcmVzb2x2aW5nIik7CisgIEdQUl9BU1NFUlQoIXItPnJlc29sdmluZyk7CisgIHItPnJlc29sdmluZyA9IDE7CisgIGdycGNfcmVzb2x2ZV9hZGRyZXNzKHItPm5hbWUsIHItPmRlZmF1bHRfcG9ydCwgZG5zX29uX3Jlc29sdmVkLCByKTsKK30KKworc3RhdGljIHZvaWQgZG5zX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zX3Jlc29sdmVyICpyKSB7CisgIGlmIChyLT5uZXh0X2NvbXBsZXRpb24gIT0gTlVMTCAmJgorICAgICAgci0+cmVzb2x2ZWRfdmVyc2lvbiAhPSByLT5wdWJsaXNoZWRfdmVyc2lvbikgeworICAgICpyLT50YXJnZXRfY29uZmlnID0gci0+cmVzb2x2ZWRfY29uZmlnOworICAgIGlmIChyLT5yZXNvbHZlZF9jb25maWcpIHsKKyAgICAgIGdycGNfY2xpZW50X2NvbmZpZ19yZWYoci0+cmVzb2x2ZWRfY29uZmlnKTsKKyAgICB9CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCByLT5uZXh0X2NvbXBsZXRpb24sIHRydWUsIE5VTEwpOworICAgIHItPm5leHRfY29tcGxldGlvbiA9IE5VTEw7CisgICAgci0+cHVibGlzaGVkX3ZlcnNpb24gPSByLT5yZXNvbHZlZF92ZXJzaW9uOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGRuc19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpncikgeworICBkbnNfcmVzb2x2ZXIgKnIgPSAoZG5zX3Jlc29sdmVyICopZ3I7CisgIGdwcl9tdV9kZXN0cm95KCZyLT5tdSk7CisgIGlmIChyLT5yZXNvbHZlZF9jb25maWcpIHsKKyAgICBncnBjX2NsaWVudF9jb25maWdfdW5yZWYoZXhlY19jdHgsIHItPnJlc29sdmVkX2NvbmZpZyk7CisgIH0KKyAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoZXhlY19jdHgsIHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7CisgIGdwcl9mcmVlKHItPm5hbWUpOworICBncHJfZnJlZShyLT5kZWZhdWx0X3BvcnQpOworICBncHJfZnJlZShyLT5sYl9wb2xpY3lfbmFtZSk7CisgIGdwcl9mcmVlKHIpOworfQorCitzdGF0aWMgZ3JwY19yZXNvbHZlciAqZG5zX2NyZWF0ZShncnBjX3Jlc29sdmVyX2FyZ3MgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYl9wb2xpY3lfbmFtZSkgeworICBkbnNfcmVzb2x2ZXIgKnI7CisgIGNvbnN0IGNoYXIgKnBhdGggPSBhcmdzLT51cmktPnBhdGg7CisKKyAgaWYgKDAgIT0gc3RyY21wKGFyZ3MtPnVyaS0+YXV0aG9yaXR5LCAiIikpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImF1dGhvcml0eSBiYXNlZCBkbnMgdXJpJ3Mgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKHBhdGhbMF0gPT0gJy8nKSArK3BhdGg7CisKKyAgciA9IGdwcl9tYWxsb2Moc2l6ZW9mKGRuc19yZXNvbHZlcikpOworICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisgIGdwcl9yZWZfaW5pdCgmci0+cmVmcywgMSk7CisgIGdwcl9tdV9pbml0KCZyLT5tdSk7CisgIGdycGNfcmVzb2x2ZXJfaW5pdCgmci0+YmFzZSwgJmRuc19yZXNvbHZlcl92dGFibGUpOworICByLT5uYW1lID0gZ3ByX3N0cmR1cChwYXRoKTsKKyAgci0+ZGVmYXVsdF9wb3J0ID0gZ3ByX3N0cmR1cChkZWZhdWx0X3BvcnQpOworICByLT5zdWJjaGFubmVsX2ZhY3RvcnkgPSBhcmdzLT5zdWJjaGFubmVsX2ZhY3Rvcnk7CisgIGdwcl9iYWNrb2ZmX2luaXQoJnItPmJhY2tvZmZfc3RhdGUsIEJBQ0tPRkZfTVVMVElQTElFUiwgQkFDS09GRl9KSVRURVIsCisgICAgICAgICAgICAgICAgICAgQkFDS09GRl9NSU5fU0VDT05EUyAqIDEwMDAsIEJBQ0tPRkZfTUFYX1NFQ09ORFMgKiAxMDAwKTsKKyAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfcmVmKHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7CisgIHItPmxiX3BvbGljeV9uYW1lID0gZ3ByX3N0cmR1cChsYl9wb2xpY3lfbmFtZSk7CisgIHJldHVybiAmci0+YmFzZTsKK30KKworLyoKKyAqIEZBQ1RPUlkKKyAqLworCitzdGF0aWMgdm9pZCBkbnNfZmFjdG9yeV9yZWYoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5KSB7fQorCitzdGF0aWMgdm9pZCBkbnNfZmFjdG9yeV91bnJlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHt9CisKK3N0YXRpYyBncnBjX3Jlc29sdmVyICpkbnNfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIoCisgICAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LCBncnBjX3Jlc29sdmVyX2FyZ3MgKmFyZ3MpIHsKKyAgcmV0dXJuIGRuc19jcmVhdGUoYXJncywgImh0dHBzIiwgInBpY2tfZmlyc3QiKTsKK30KKworY2hhciAqZG5zX2ZhY3RvcnlfZ2V0X2RlZmF1bHRfaG9zdF9uYW1lKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7CisgIGNvbnN0IGNoYXIgKnBhdGggPSB1cmktPnBhdGg7CisgIGlmIChwYXRoWzBdID09ICcvJykgKytwYXRoOworICByZXR1cm4gZ3ByX3N0cmR1cChwYXRoKTsKK30KKworc3RhdGljIGNvbnN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV92dGFibGUgZG5zX2ZhY3RvcnlfdnRhYmxlID0geworICAgIGRuc19mYWN0b3J5X3JlZiwgZG5zX2ZhY3RvcnlfdW5yZWYsIGRuc19mYWN0b3J5X2NyZWF0ZV9yZXNvbHZlciwKKyAgICBkbnNfZmFjdG9yeV9nZXRfZGVmYXVsdF9ob3N0X25hbWUsICJkbnMifTsKK3N0YXRpYyBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgZG5zX3Jlc29sdmVyX2ZhY3RvcnkgPSB7JmRuc19mYWN0b3J5X3Z0YWJsZX07CisKK2dycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZ3JwY19kbnNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUoKSB7CisgIHJldHVybiAmZG5zX3Jlc29sdmVyX2ZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0NmU0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfRE5TX1JFU09MVkVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1JFU09MVkVSU19ETlNfUkVTT0xWRVJfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgorCisvKiogQ3JlYXRlIGEgZG5zIHJlc29sdmVyIGZhY3RvcnkgKi8KK2dycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZ3JwY19kbnNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUodm9pZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJTX0ROU19SRVNPTFZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODdiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qKiBiYXNlIGNsYXNzOiBtdXN0IGJlIGZpcnN0ICovCisgIGdycGNfcmVzb2x2ZXIgYmFzZTsKKyAgLyoqIHJlZmNvdW50ICovCisgIGdwcl9yZWZjb3VudCByZWZzOworICAvKiogc3ViY2hhbm5lbCBmYWN0b3J5ICovCisgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzdWJjaGFubmVsX2ZhY3Rvcnk7CisgIC8qKiBsb2FkIGJhbGFuY2luZyBwb2xpY3kgbmFtZSAqLworICBjaGFyICpsYl9wb2xpY3lfbmFtZTsKKworICAvKiogdGhlIGFkZHJlc3NlcyB0aGF0IHdlJ3ZlICdyZXNvbHZlZCcgKi8KKyAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJlc3NlczsKKworICAvKiogbXV0ZXggZ3VhcmRpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlICovCisgIGdwcl9tdSBtdTsKKyAgLyoqIGhhdmUgd2UgcHVibGlzaGVkPyAqLworICBpbnQgcHVibGlzaGVkOworICAvKiogcGVuZGluZyBuZXh0IGNvbXBsZXRpb24sIG9yIE5VTEwgKi8KKyAgZ3JwY19jbG9zdXJlICpuZXh0X2NvbXBsZXRpb247CisgIC8qKiB0YXJnZXQgY29uZmlnIGFkZHJlc3MgZm9yIG5leHQgY29tcGxldGlvbiAqLworICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnOworfSBzb2NrYWRkcl9yZXNvbHZlcjsKKworc3RhdGljIHZvaWQgc29ja2FkZHJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcik7CisKK3N0YXRpYyB2b2lkIHNvY2thZGRyX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrYWRkcl9yZXNvbHZlciAqcik7CisKK3N0YXRpYyB2b2lkIHNvY2thZGRyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyKTsKK3N0YXRpYyB2b2lkIHNvY2thZGRyX2NoYW5uZWxfc2F3X2Vycm9yKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcik7CitzdGF0aWMgdm9pZCBzb2NrYWRkcl9uZXh0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKKworc3RhdGljIGNvbnN0IGdycGNfcmVzb2x2ZXJfdnRhYmxlIHNvY2thZGRyX3Jlc29sdmVyX3Z0YWJsZSA9IHsKKyAgICBzb2NrYWRkcl9kZXN0cm95LCBzb2NrYWRkcl9zaHV0ZG93biwgc29ja2FkZHJfY2hhbm5lbF9zYXdfZXJyb3IsCisgICAgc29ja2FkZHJfbmV4dH07CisKK3N0YXRpYyB2b2lkIHNvY2thZGRyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXIpIHsKKyAgc29ja2FkZHJfcmVzb2x2ZXIgKnIgPSAoc29ja2FkZHJfcmVzb2x2ZXIgKilyZXNvbHZlcjsKKyAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgaWYgKHItPm5leHRfY29tcGxldGlvbiAhPSBOVUxMKSB7CisgICAgKnItPnRhcmdldF9jb25maWcgPSBOVUxMOworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgci0+bmV4dF9jb21wbGV0aW9uLCB0cnVlLCBOVUxMKTsKKyAgICByLT5uZXh0X2NvbXBsZXRpb24gPSBOVUxMOworICB9CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKK30KKworc3RhdGljIHZvaWQgc29ja2FkZHJfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgeworICBzb2NrYWRkcl9yZXNvbHZlciAqciA9IChzb2NrYWRkcl9yZXNvbHZlciAqKXJlc29sdmVyOworICBncHJfbXVfbG9jaygmci0+bXUpOworICByLT5wdWJsaXNoZWQgPSAwOworICBzb2NrYWRkcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZXhlY19jdHgsIHIpOworICBncHJfbXVfdW5sb2NrKCZyLT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvY2thZGRyX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7CisgIHNvY2thZGRyX3Jlc29sdmVyICpyID0gKHNvY2thZGRyX3Jlc29sdmVyICopcmVzb2x2ZXI7CisgIGdwcl9tdV9sb2NrKCZyLT5tdSk7CisgIEdQUl9BU1NFUlQoIXItPm5leHRfY29tcGxldGlvbik7CisgIHItPm5leHRfY29tcGxldGlvbiA9IG9uX2NvbXBsZXRlOworICByLT50YXJnZXRfY29uZmlnID0gdGFyZ2V0X2NvbmZpZzsKKyAgc29ja2FkZHJfbWF5YmVfZmluaXNoX25leHRfbG9ja2VkKGV4ZWNfY3R4LCByKTsKKyAgZ3ByX211X3VubG9jaygmci0+bXUpOworfQorCitzdGF0aWMgdm9pZCBzb2NrYWRkcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2FkZHJfcmVzb2x2ZXIgKnIpIHsKKyAgaWYgKHItPm5leHRfY29tcGxldGlvbiAhPSBOVUxMICYmICFyLT5wdWJsaXNoZWQpIHsKKyAgICBncnBjX2NsaWVudF9jb25maWcgKmNmZyA9IGdycGNfY2xpZW50X2NvbmZpZ19jcmVhdGUoKTsKKyAgICBncnBjX2xiX3BvbGljeV9hcmdzIGxiX3BvbGljeV9hcmdzOworICAgIG1lbXNldCgmbGJfcG9saWN5X2FyZ3MsIDAsIHNpemVvZihsYl9wb2xpY3lfYXJncykpOworICAgIGxiX3BvbGljeV9hcmdzLmFkZHJlc3NlcyA9IHItPmFkZHJlc3NlczsKKyAgICBsYl9wb2xpY3lfYXJncy5zdWJjaGFubmVsX2ZhY3RvcnkgPSByLT5zdWJjaGFubmVsX2ZhY3Rvcnk7CisgICAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeSA9CisgICAgICAgIGdycGNfbGJfcG9saWN5X2NyZWF0ZShleGVjX2N0eCwgci0+bGJfcG9saWN5X25hbWUsICZsYl9wb2xpY3lfYXJncyk7CisgICAgZ3JwY19jbGllbnRfY29uZmlnX3NldF9sYl9wb2xpY3koY2ZnLCBsYl9wb2xpY3kpOworICAgIEdSUENfTEJfUE9MSUNZX1VOUkVGKGV4ZWNfY3R4LCBsYl9wb2xpY3ksICJzb2NrYWRkciIpOworICAgIHItPnB1Ymxpc2hlZCA9IDE7CisgICAgKnItPnRhcmdldF9jb25maWcgPSBjZmc7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCByLT5uZXh0X2NvbXBsZXRpb24sIHRydWUsIE5VTEwpOworICAgIHItPm5leHRfY29tcGxldGlvbiA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQgc29ja2FkZHJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqZ3IpIHsKKyAgc29ja2FkZHJfcmVzb2x2ZXIgKnIgPSAoc29ja2FkZHJfcmVzb2x2ZXIgKilncjsKKyAgZ3ByX211X2Rlc3Ryb3koJnItPm11KTsKKyAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoZXhlY19jdHgsIHItPnN1YmNoYW5uZWxfZmFjdG9yeSk7CisgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzX2Rlc3Ryb3koci0+YWRkcmVzc2VzKTsKKyAgZ3ByX2ZyZWUoci0+bGJfcG9saWN5X25hbWUpOworICBncHJfZnJlZShyKTsKK30KKworc3RhdGljIGNoYXIgKmlwX2dldF9kZWZhdWx0X2F1dGhvcml0eShncnBjX3VyaSAqdXJpKSB7CisgIGNvbnN0IGNoYXIgKnBhdGggPSB1cmktPnBhdGg7CisgIGlmIChwYXRoWzBdID09ICcvJykgKytwYXRoOworICByZXR1cm4gZ3ByX3N0cmR1cChwYXRoKTsKK30KKworc3RhdGljIGNoYXIgKmlwdjRfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7CisgIHJldHVybiBpcF9nZXRfZGVmYXVsdF9hdXRob3JpdHkodXJpKTsKK30KKworc3RhdGljIGNoYXIgKmlwdjZfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7CisgIHJldHVybiBpcF9nZXRfZGVmYXVsdF9hdXRob3JpdHkodXJpKTsKK30KKworc3RhdGljIGludCBwYXJzZV9pcHY0KGdycGNfdXJpICp1cmksIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbGVuKSB7CisgIGNvbnN0IGNoYXIgKmhvc3RfcG9ydCA9IHVyaS0+cGF0aDsKKyAgY2hhciAqaG9zdDsKKyAgY2hhciAqcG9ydDsKKyAgaW50IHBvcnRfbnVtOworICBpbnQgcmVzdWx0ID0gMDsKKyAgc3RydWN0IHNvY2thZGRyX2luICppbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworCisgIGlmICgqaG9zdF9wb3J0ID09ICcvJykgKytob3N0X3BvcnQ7CisgIGlmICghZ3ByX3NwbGl0X2hvc3RfcG9ydChob3N0X3BvcnQsICZob3N0LCAmcG9ydCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG1lbXNldChpbiwgMCwgc2l6ZW9mKCppbikpOworICAqbGVuID0gc2l6ZW9mKCppbik7CisgIGluLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgaWYgKGluZXRfcHRvbihBRl9JTkVULCBob3N0LCAmaW4tPnNpbl9hZGRyKSA9PSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIGlwdjQgYWRkcmVzczogJyVzJyIsIGhvc3QpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmIChwb3J0ICE9IE5VTEwpIHsKKyAgICBpZiAoc3NjYW5mKHBvcnQsICIlZCIsICZwb3J0X251bSkgIT0gMSB8fCBwb3J0X251bSA8IDAgfHwKKyAgICAgICAgcG9ydF9udW0gPiA2NTUzNSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIGlwdjQgcG9ydDogJyVzJyIsIHBvcnQpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBpbi0+c2luX3BvcnQgPSBodG9ucygodWludDE2X3QpcG9ydF9udW0pOworICB9IGVsc2UgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAibm8gcG9ydCBnaXZlbiBmb3IgaXB2NCBzY2hlbWUiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICByZXN1bHQgPSAxOworZG9uZToKKyAgZ3ByX2ZyZWUoaG9zdCk7CisgIGdwcl9mcmVlKHBvcnQpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBhcnNlX2lwdjYoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW4pIHsKKyAgY29uc3QgY2hhciAqaG9zdF9wb3J0ID0gdXJpLT5wYXRoOworICBjaGFyICpob3N0OworICBjaGFyICpwb3J0OworICBpbnQgcG9ydF9udW07CisgIGludCByZXN1bHQgPSAwOworICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7CisKKyAgaWYgKCpob3N0X3BvcnQgPT0gJy8nKSArK2hvc3RfcG9ydDsKKyAgaWYgKCFncHJfc3BsaXRfaG9zdF9wb3J0KGhvc3RfcG9ydCwgJmhvc3QsICZwb3J0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgbWVtc2V0KGluNiwgMCwgc2l6ZW9mKCppbjYpKTsKKyAgKmxlbiA9IHNpemVvZigqaW42KTsKKyAgaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBob3N0LCAmaW42LT5zaW42X2FkZHIpID09IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImludmFsaWQgaXB2NiBhZGRyZXNzOiAnJXMnIiwgaG9zdCk7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKHBvcnQgIT0gTlVMTCkgeworICAgIGlmIChzc2NhbmYocG9ydCwgIiVkIiwgJnBvcnRfbnVtKSAhPSAxIHx8IHBvcnRfbnVtIDwgMCB8fAorICAgICAgICBwb3J0X251bSA+IDY1NTM1KSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImludmFsaWQgaXB2NiBwb3J0OiAnJXMnIiwgcG9ydCk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGluNi0+c2luNl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KXBvcnRfbnVtKTsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm5vIHBvcnQgZ2l2ZW4gZm9yIGlwdjYgc2NoZW1lIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgcmVzdWx0ID0gMTsKK2RvbmU6CisgIGdwcl9mcmVlKGhvc3QpOworICBncHJfZnJlZShwb3J0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZG9fbm90aGluZyh2b2lkICppZ25vcmVkKSB7fQorCitzdGF0aWMgZ3JwY19yZXNvbHZlciAqc29ja2FkZHJfY3JlYXRlKAorICAgIGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncywgY29uc3QgY2hhciAqZGVmYXVsdF9sYl9wb2xpY3lfbmFtZSwKKyAgICBpbnQgcGFyc2UoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmRzdCwgc2l6ZV90ICpsZW4pKSB7CisgIGludCBlcnJvcnNfZm91bmQgPSAwOyAvKiBHUFJfRkFMU0UgKi8KKyAgc29ja2FkZHJfcmVzb2x2ZXIgKnI7CisgIGdwcl9zbGljZSBwYXRoX3NsaWNlOworICBncHJfc2xpY2VfYnVmZmVyIHBhdGhfcGFydHM7CisKKyAgaWYgKDAgIT0gc3RyY21wKGFyZ3MtPnVyaS0+YXV0aG9yaXR5LCAiIikpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImF1dGhvcml0eSBiYXNlZCB1cmkncyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSAlcyBzY2hlbWUiLAorICAgICAgICAgICAgYXJncy0+dXJpLT5zY2hlbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgciA9IGdwcl9tYWxsb2Moc2l6ZW9mKHNvY2thZGRyX3Jlc29sdmVyKSk7CisgIG1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKKworICByLT5sYl9wb2xpY3lfbmFtZSA9IE5VTEw7CisgIGlmICgwICE9IHN0cmNtcChhcmdzLT51cmktPnF1ZXJ5LCAiIikpIHsKKyAgICBncHJfc2xpY2UgcXVlcnlfc2xpY2U7CisgICAgZ3ByX3NsaWNlX2J1ZmZlciBxdWVyeV9wYXJ0czsKKworICAgIHF1ZXJ5X3NsaWNlID0KKyAgICAgICAgZ3ByX3NsaWNlX25ldyhhcmdzLT51cmktPnF1ZXJ5LCBzdHJsZW4oYXJncy0+dXJpLT5xdWVyeSksIGRvX25vdGhpbmcpOworICAgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmcXVlcnlfcGFydHMpOworICAgIGdwcl9zbGljZV9zcGxpdChxdWVyeV9zbGljZSwgIj0iLCAmcXVlcnlfcGFydHMpOworICAgIEdQUl9BU1NFUlQocXVlcnlfcGFydHMuY291bnQgPT0gMik7CisgICAgaWYgKDAgPT0gZ3ByX3NsaWNlX3N0cl9jbXAocXVlcnlfcGFydHMuc2xpY2VzWzBdLCAibGJfcG9saWN5IikpIHsKKyAgICAgIHItPmxiX3BvbGljeV9uYW1lID0gZ3ByX2R1bXBfc2xpY2UocXVlcnlfcGFydHMuc2xpY2VzWzFdLCBHUFJfRFVNUF9BU0NJSSk7CisgICAgfQorICAgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmcXVlcnlfcGFydHMpOworICAgIGdwcl9zbGljZV91bnJlZihxdWVyeV9zbGljZSk7CisgIH0KKyAgaWYgKHItPmxiX3BvbGljeV9uYW1lID09IE5VTEwpIHsKKyAgICByLT5sYl9wb2xpY3lfbmFtZSA9IGdwcl9zdHJkdXAoZGVmYXVsdF9sYl9wb2xpY3lfbmFtZSk7CisgIH0KKworICBwYXRoX3NsaWNlID0KKyAgICAgIGdwcl9zbGljZV9uZXcoYXJncy0+dXJpLT5wYXRoLCBzdHJsZW4oYXJncy0+dXJpLT5wYXRoKSwgZG9fbm90aGluZyk7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmcGF0aF9wYXJ0cyk7CisKKyAgZ3ByX3NsaWNlX3NwbGl0KHBhdGhfc2xpY2UsICIsIiwgJnBhdGhfcGFydHMpOworICByLT5hZGRyZXNzZXMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3Jlc29sdmVkX2FkZHJlc3NlcykpOworICByLT5hZGRyZXNzZXMtPm5hZGRycyA9IHBhdGhfcGFydHMuY291bnQ7CisgIHItPmFkZHJlc3Nlcy0+YWRkcnMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzKSAqIHItPmFkZHJlc3Nlcy0+bmFkZHJzKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHItPmFkZHJlc3Nlcy0+bmFkZHJzOyBpKyspIHsKKyAgICBncnBjX3VyaSBpdGhfdXJpID0gKmFyZ3MtPnVyaTsKKyAgICBjaGFyICpwYXJ0X3N0ciA9IGdwcl9kdW1wX3NsaWNlKHBhdGhfcGFydHMuc2xpY2VzW2ldLCBHUFJfRFVNUF9BU0NJSSk7CisgICAgaXRoX3VyaS5wYXRoID0gcGFydF9zdHI7CisgICAgaWYgKCFwYXJzZSgmaXRoX3VyaSwKKyAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKSgmci0+YWRkcmVzc2VzLT5hZGRyc1tpXS5hZGRyKSwKKyAgICAgICAgICAgICAgICZyLT5hZGRyZXNzZXMtPmFkZHJzW2ldLmxlbikpIHsKKyAgICAgIGVycm9yc19mb3VuZCA9IDE7IC8qIEdQUl9UUlVFICovCisgICAgfQorICAgIGdwcl9mcmVlKHBhcnRfc3RyKTsKKyAgICBpZiAoZXJyb3JzX2ZvdW5kKSBicmVhazsKKyAgfQorCisgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmcGF0aF9wYXJ0cyk7CisgIGdwcl9zbGljZV91bnJlZihwYXRoX3NsaWNlKTsKKyAgaWYgKGVycm9yc19mb3VuZCkgeworICAgIGdwcl9mcmVlKHItPmxiX3BvbGljeV9uYW1lKTsKKyAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHItPmFkZHJlc3Nlcyk7CisgICAgZ3ByX2ZyZWUocik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBncHJfcmVmX2luaXQoJnItPnJlZnMsIDEpOworICBncHJfbXVfaW5pdCgmci0+bXUpOworICBncnBjX3Jlc29sdmVyX2luaXQoJnItPmJhc2UsICZzb2NrYWRkcl9yZXNvbHZlcl92dGFibGUpOworICByLT5zdWJjaGFubmVsX2ZhY3RvcnkgPSBhcmdzLT5zdWJjaGFubmVsX2ZhY3Rvcnk7CisgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3JlZihyLT5zdWJjaGFubmVsX2ZhY3RvcnkpOworCisgIHJldHVybiAmci0+YmFzZTsKK30KKworLyoKKyAqIEZBQ1RPUlkKKyAqLworCitzdGF0aWMgdm9pZCBzb2NrYWRkcl9mYWN0b3J5X3JlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHt9CisKK3N0YXRpYyB2b2lkIHNvY2thZGRyX2ZhY3RvcnlfdW5yZWYoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5KSB7fQorCisjZGVmaW5lIERFQ0xfRkFDVE9SWShuYW1lLCBwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ3JwY19yZXNvbHZlciAqbmFtZSMjX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwgZ3JwY19yZXNvbHZlcl9hcmdzICphcmdzKSB7ICAgICAgICAgICBcCisgICAgcmV0dXJuIHNvY2thZGRyX2NyZWF0ZShhcmdzLCAicGlja19maXJzdCIsIHByZWZpeCMjcGFyc2VfIyNuYW1lKTsgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IGdycGNfcmVzb2x2ZXJfZmFjdG9yeV92dGFibGUgbmFtZSMjX2ZhY3RvcnlfdnRhYmxlID0geyAgICAgICBcCisgICAgICBzb2NrYWRkcl9mYWN0b3J5X3JlZiwgc29ja2FkZHJfZmFjdG9yeV91bnJlZiwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmFtZSMjX2ZhY3RvcnlfY3JlYXRlX3Jlc29sdmVyLCBwcmVmaXgjI25hbWUjI19nZXRfZGVmYXVsdF9hdXRob3JpdHksIFwKKyAgICAgICNuYW1lfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgbmFtZSMjX3Jlc29sdmVyX2ZhY3RvcnkgPSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgJm5hbWUjI19mYWN0b3J5X3Z0YWJsZX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpncnBjXyMjbmFtZSMjX3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlKCkgeyAgICAgICAgICBcCisgICAgcmV0dXJuICZuYW1lIyNfcmVzb2x2ZXJfZmFjdG9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNpZmRlZiBHUFJfSEFWRV9VTklYX1NPQ0tFVAorREVDTF9GQUNUT1JZKHVuaXgsIGdycGNfKQorI2VuZGlmCitERUNMX0ZBQ1RPUlkoaXB2NCwgKSBERUNMX0ZBQ1RPUlkoaXB2NiwgKQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM1NWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJTX1NPQ0tBRERSX1JFU09MVkVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1JFU09MVkVSU19TT0NLQUREUl9SRVNPTFZFUl9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIgorCitncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdycGNfaXB2NF9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSh2b2lkKTsKKworZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpncnBjX2lwdjZfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUodm9pZCk7CisKKyNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCisvKiogQ3JlYXRlIGEgdW5peCByZXNvbHZlciBmYWN0b3J5ICovCitncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmdycGNfdW5peF9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1JFU09MVkVSU19TT0NLQUREUl9SRVNPTFZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvem9va2VlcGVyX3Jlc29sdmVyLmMgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvem9va2VlcGVyX3Jlc29sdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0ZGZjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisKKyNpbmNsdWRlIDxncnBjL2dycGNfem9va2VlcGVyLmg+CisjaW5jbHVkZSA8em9va2VlcGVyL3pvb2tlZXBlci5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorCisvKiogWm9va2VlcGVyIHNlc3Npb24gZXhwaXJhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBHUlBDX1pPT0tFRVBFUl9TRVNTSU9OX1RJTUVPVVQgMTUwMDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiogYmFzZSBjbGFzczogbXVzdCBiZSBmaXJzdCAqLworICBncnBjX3Jlc29sdmVyIGJhc2U7CisgIC8qKiByZWZjb3VudCAqLworICBncHJfcmVmY291bnQgcmVmczsKKyAgLyoqIG5hbWUgdG8gcmVzb2x2ZSAqLworICBjaGFyICpuYW1lOworICAvKiogc3ViY2hhbm5lbCBmYWN0b3J5ICovCisgIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzdWJjaGFubmVsX2ZhY3Rvcnk7CisgIC8qKiBsb2FkIGJhbGFuY2luZyBwb2xpY3kgbmFtZSAqLworICBjaGFyICpsYl9wb2xpY3lfbmFtZTsKKworICAvKiogbXV0ZXggZ3VhcmRpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlICovCisgIGdwcl9tdSBtdTsKKyAgLyoqIGFyZSB3ZSBjdXJyZW50bHkgcmVzb2x2aW5nPyAqLworICBpbnQgcmVzb2x2aW5nOworICAvKiogd2hpY2ggdmVyc2lvbiBvZiByZXNvbHZlZF9jb25maWcgaGF2ZSB3ZSBwdWJsaXNoZWQ/ICovCisgIGludCBwdWJsaXNoZWRfdmVyc2lvbjsKKyAgLyoqIHdoaWNoIHZlcnNpb24gb2YgcmVzb2x2ZWRfY29uZmlnIGlzIGN1cnJlbnQ/ICovCisgIGludCByZXNvbHZlZF92ZXJzaW9uOworICAvKiogcGVuZGluZyBuZXh0IGNvbXBsZXRpb24sIG9yIE5VTEwgKi8KKyAgZ3JwY19jbG9zdXJlICpuZXh0X2NvbXBsZXRpb247CisgIC8qKiB0YXJnZXQgY29uZmlnIGFkZHJlc3MgZm9yIG5leHQgY29tcGxldGlvbiAqLworICBncnBjX2NsaWVudF9jb25maWcgKip0YXJnZXRfY29uZmlnOworICAvKiogY3VycmVudCAoZnVsbHkgcmVzb2x2ZWQpIGNvbmZpZyAqLworICBncnBjX2NsaWVudF9jb25maWcgKnJlc29sdmVkX2NvbmZpZzsKKworICAvKiogem9va2VlcGVyIGhhbmRsZSAqLworICB6aGFuZGxlX3QgKnpvb2tlZXBlcl9oYW5kbGU7CisgIC8qKiB6b29rZWVwZXIgcmVzb2x2ZWQgYWRkcmVzc2VzICovCisgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpyZXNvbHZlZF9hZGRyczsKKyAgLyoqIHRvdGFsIG51bWJlciBvZiBhZGRyZXNzZXMgdG8gYmUgcmVzb2x2ZWQgKi8KKyAgaW50IHJlc29sdmVkX3RvdGFsOworICAvKiogbnVtYmVyIG9mIGFkZHJlc3NlcyByZXNvbHZlZCAqLworICBpbnQgcmVzb2x2ZWRfbnVtOworfSB6b29rZWVwZXJfcmVzb2x2ZXI7CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpyKTsKKworc3RhdGljIHZvaWQgem9va2VlcGVyX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQoem9va2VlcGVyX3Jlc29sdmVyICpyKTsKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb2tlZXBlcl9yZXNvbHZlciAqcik7CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqcik7CitzdGF0aWMgdm9pZCB6b29rZWVwZXJfY2hhbm5lbF9zYXdfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlciAqcik7CitzdGF0aWMgdm9pZCB6b29rZWVwZXJfbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19yZXNvbHZlciAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xpZW50X2NvbmZpZyAqKnRhcmdldF9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKKworc3RhdGljIGNvbnN0IGdycGNfcmVzb2x2ZXJfdnRhYmxlIHpvb2tlZXBlcl9yZXNvbHZlcl92dGFibGUgPSB7CisgICAgem9va2VlcGVyX2Rlc3Ryb3ksIHpvb2tlZXBlcl9zaHV0ZG93biwgem9va2VlcGVyX2NoYW5uZWxfc2F3X2Vycm9yLAorICAgIHpvb2tlZXBlcl9uZXh0fTsKKworc3RhdGljIHZvaWQgem9va2VlcGVyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyKSB7CisgIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9ICh6b29rZWVwZXJfcmVzb2x2ZXIgKilyZXNvbHZlcjsKKyAgZ3JwY19jbG9zdXJlICpjYWxsID0gTlVMTDsKKyAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgaWYgKHItPm5leHRfY29tcGxldGlvbiAhPSBOVUxMKSB7CisgICAgKnItPnRhcmdldF9jb25maWcgPSBOVUxMOworICAgIGNhbGwgPSByLT5uZXh0X2NvbXBsZXRpb247CisgICAgci0+bmV4dF9jb21wbGV0aW9uID0gTlVMTDsKKyAgfQorICB6b29rZWVwZXJfY2xvc2Uoci0+em9va2VlcGVyX2hhbmRsZSk7CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKKyAgaWYgKGNhbGwgIT0gTlVMTCkgeworICAgIGNhbGwtPmNiKGV4ZWNfY3R4LCBjYWxsLT5jYl9hcmcsIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9jaGFubmVsX3Nhd19lcnJvcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVyICpyZXNvbHZlcikgeworICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSAoem9va2VlcGVyX3Jlc29sdmVyICopcmVzb2x2ZXI7CisgIGdwcl9tdV9sb2NrKCZyLT5tdSk7CisgIGlmIChyLT5yZXNvbHZpbmcgPT0gMCkgeworICAgIHpvb2tlZXBlcl9zdGFydF9yZXNvbHZpbmdfbG9ja2VkKHIpOworICB9CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKK30KKworc3RhdGljIHZvaWQgem9va2VlcGVyX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcmVzb2x2ZXIgKnJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbGllbnRfY29uZmlnICoqdGFyZ2V0X2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpIHsKKyAgem9va2VlcGVyX3Jlc29sdmVyICpyID0gKHpvb2tlZXBlcl9yZXNvbHZlciAqKXJlc29sdmVyOworICBncHJfbXVfbG9jaygmci0+bXUpOworICBHUFJfQVNTRVJUKHItPm5leHRfY29tcGxldGlvbiA9PSBOVUxMKTsKKyAgci0+bmV4dF9jb21wbGV0aW9uID0gb25fY29tcGxldGU7CisgIHItPnRhcmdldF9jb25maWcgPSB0YXJnZXRfY29uZmlnOworICBpZiAoci0+cmVzb2x2ZWRfdmVyc2lvbiA9PSAwICYmIHItPnJlc29sdmluZyA9PSAwKSB7CisgICAgem9va2VlcGVyX3N0YXJ0X3Jlc29sdmluZ19sb2NrZWQocik7CisgIH0gZWxzZSB7CisgICAgem9va2VlcGVyX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChleGVjX2N0eCwgcik7CisgIH0KKyAgZ3ByX211X3VubG9jaygmci0+bXUpOworfQorCisvKiogWm9va2VlcGVyIGdsb2JhbCB3YXRjaGVyIGZvciBjb25uZWN0aW9uIG1hbmFnZW1lbnQKKyAgICBUT0RPOiBiZXR0ZXIgY29ubmVjdGlvbiBtYW5hZ2VtZW50IGJlc2lkZXMgbG9ncyAqLworc3RhdGljIHZvaWQgem9va2VlcGVyX2dsb2JhbF93YXRjaGVyKHpoYW5kbGVfdCAqem9va2VlcGVyX2hhbmRsZSwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLCBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKndhdGNoZXJfY3R4KSB7CisgIGlmICh0eXBlID09IFpPT19TRVNTSU9OX0VWRU5UKSB7CisgICAgaWYgKHN0YXRlID09IFpPT19FWFBJUkVEX1NFU1NJT05fU1RBVEUpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiWm9va2VlcGVyIHNlc3Npb24gZXhwaXJlZCIpOworICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gWk9PX0FVVEhfRkFJTEVEX1NUQVRFKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlpvb2tlZXBlciBhdXRoZW50aWNhdGlvbiBmYWlsZWQiKTsKKyAgICB9CisgIH0KK30KKworLyoqIFpvb2tlZXBlciB3YXRjaGVyIHRyaWdnZXJlZCBieSBjaGFuZ2VzIHRvIHdhdGNoZWQgbm9kZXMKKyAgICBPbmNlIHRyaWdnZXJlZCwgaXQgdHJpZXMgdG8gcmVzb2x2ZSBhZ2FpbiB0byBnZXQgdXBkYXRlZCBhZGRyZXNzZXMgKi8KK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl93YXRjaGVyKHpoYW5kbGVfdCAqem9va2VlcGVyX2hhbmRsZSwgaW50IHR5cGUsIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIHZvaWQgKndhdGNoZXJfY3R4KSB7CisgIGlmICh3YXRjaGVyX2N0eCAhPSBOVUxMKSB7CisgICAgem9va2VlcGVyX3Jlc29sdmVyICpyID0gKHpvb2tlZXBlcl9yZXNvbHZlciAqKXdhdGNoZXJfY3R4OworICAgIGlmIChzdGF0ZSA9PSBaT09fQ09OTkVDVEVEX1NUQVRFKSB7CisgICAgICBncHJfbXVfbG9jaygmci0+bXUpOworICAgICAgaWYgKHItPnJlc29sdmluZyA9PSAwKSB7CisgICAgICAgIHpvb2tlZXBlcl9zdGFydF9yZXNvbHZpbmdfbG9ja2VkKHIpOworICAgICAgfQorICAgICAgZ3ByX211X3VubG9jaygmci0+bXUpOworICAgIH0KKyAgfQorfQorCisvKiogQ2FsbGJhY2sgZnVuY3Rpb24gYWZ0ZXIgZ2V0dGluZyBhbGwgcmVzb2x2ZWQgYWRkcmVzc2VzCisgICAgQ3JlYXRlcyBhIHN1YmNoYW5uZWwgZm9yIGVhY2ggYWRkcmVzcyAqLworc3RhdGljIHZvaWQgem9va2VlcGVyX29uX3Jlc29sdmVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJlc3NlcykgeworICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSBhcmc7CisgIGdycGNfY2xpZW50X2NvbmZpZyAqY29uZmlnID0gTlVMTDsKKyAgZ3JwY19sYl9wb2xpY3kgKmxiX3BvbGljeTsKKworICBpZiAoYWRkcmVzc2VzICE9IE5VTEwpIHsKKyAgICBncnBjX2xiX3BvbGljeV9hcmdzIGxiX3BvbGljeV9hcmdzOworICAgIGNvbmZpZyA9IGdycGNfY2xpZW50X2NvbmZpZ19jcmVhdGUoKTsKKworICAgIGxiX3BvbGljeV9hcmdzLmFkZHJlc3NlcyA9IGFkZHJlc3NlczsKKyAgICBsYl9wb2xpY3lfYXJncy5zdWJjaGFubmVsX2ZhY3RvcnkgPSByLT5zdWJjaGFubmVsX2ZhY3Rvcnk7CisgICAgbGJfcG9saWN5ID0KKyAgICAgICAgZ3JwY19sYl9wb2xpY3lfY3JlYXRlKGV4ZWNfY3R4LCByLT5sYl9wb2xpY3lfbmFtZSwgJmxiX3BvbGljeV9hcmdzKTsKKworICAgIGlmIChsYl9wb2xpY3kgIT0gTlVMTCkgeworICAgICAgZ3JwY19jbGllbnRfY29uZmlnX3NldF9sYl9wb2xpY3koY29uZmlnLCBsYl9wb2xpY3kpOworICAgICAgR1JQQ19MQl9QT0xJQ1lfVU5SRUYoZXhlY19jdHgsIGxiX3BvbGljeSwgImNvbnN0cnVjdGlvbiIpOworICAgIH0KKyAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KGFkZHJlc3Nlcyk7CisgIH0KKyAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgR1BSX0FTU0VSVChyLT5yZXNvbHZpbmcgPT0gMSk7CisgIHItPnJlc29sdmluZyA9IDA7CisgIGlmIChyLT5yZXNvbHZlZF9jb25maWcgIT0gTlVMTCkgeworICAgIGdycGNfY2xpZW50X2NvbmZpZ191bnJlZihleGVjX2N0eCwgci0+cmVzb2x2ZWRfY29uZmlnKTsKKyAgfQorICByLT5yZXNvbHZlZF9jb25maWcgPSBjb25maWc7CisgIHItPnJlc29sdmVkX3ZlcnNpb24rKzsKKyAgem9va2VlcGVyX21heWJlX2ZpbmlzaF9uZXh0X2xvY2tlZChleGVjX2N0eCwgcik7CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKKworICBHUlBDX1JFU09MVkVSX1VOUkVGKGV4ZWNfY3R4LCAmci0+YmFzZSwgInpvb2tlZXBlci1yZXNvbHZpbmciKTsKK30KKworLyoqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIEROUyByZXNvbHZlZCBhZGRyZXNzICovCitzdGF0aWMgdm9pZCB6b29rZWVwZXJfZG5zX3Jlc29sdmVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRyZXNzZXMpIHsKKyAgc2l6ZV90IGk7CisgIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9IGFyZzsKKyAgaW50IHJlc29sdmVfZG9uZSA9IDA7CisKKyAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgci0+cmVzb2x2ZWRfbnVtKys7CisgIHItPnJlc29sdmVkX2FkZHJzLT5hZGRycyA9CisgICAgICBncHJfcmVhbGxvYyhyLT5yZXNvbHZlZF9hZGRycy0+YWRkcnMsCisgICAgICAgICAgICAgICAgICBzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzKSAqCisgICAgICAgICAgICAgICAgICAgICAgKHItPnJlc29sdmVkX2FkZHJzLT5uYWRkcnMgKyBhZGRyZXNzZXMtPm5hZGRycykpOworICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzc2VzLT5uYWRkcnM7IGkrKykgeworICAgIG1lbWNweShyLT5yZXNvbHZlZF9hZGRycy0+YWRkcnNbaSArIHItPnJlc29sdmVkX2FkZHJzLT5uYWRkcnNdLmFkZHIsCisgICAgICAgICAgIGFkZHJlc3Nlcy0+YWRkcnNbaV0uYWRkciwgYWRkcmVzc2VzLT5hZGRyc1tpXS5sZW4pOworICAgIHItPnJlc29sdmVkX2FkZHJzLT5hZGRyc1tpICsgci0+cmVzb2x2ZWRfYWRkcnMtPm5hZGRyc10ubGVuID0KKyAgICAgICAgYWRkcmVzc2VzLT5hZGRyc1tpXS5sZW47CisgIH0KKworICByLT5yZXNvbHZlZF9hZGRycy0+bmFkZHJzICs9IGFkZHJlc3Nlcy0+bmFkZHJzOworICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KGFkZHJlc3Nlcyk7CisKKyAgLyoqIFdhaXQgZm9yIGFsbCBhZGRyZXNzZXMgdG8gYmUgcmVzb2x2ZWQgKi8KKyAgcmVzb2x2ZV9kb25lID0gKHItPnJlc29sdmVkX251bSA9PSByLT5yZXNvbHZlZF90b3RhbCk7CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKKyAgaWYgKHJlc29sdmVfZG9uZSkgeworICAgIHpvb2tlZXBlcl9vbl9yZXNvbHZlZChleGVjX2N0eCwgciwgci0+cmVzb2x2ZWRfYWRkcnMpOworICB9Cit9CisKKy8qKiBQYXJzZXMgSlNPTiBmb3JtYXQgYWRkcmVzcyBvZiBhIHpvb2tlZXBlciBub2RlICovCitzdGF0aWMgY2hhciAqem9va2VlcGVyX3BhcnNlX2FkZHJlc3MoY29uc3QgY2hhciAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4pIHsKKyAgZ3JwY19qc29uICpqc29uOworICBncnBjX2pzb24gKmN1cjsKKyAgY29uc3QgY2hhciAqaG9zdDsKKyAgY29uc3QgY2hhciAqcG9ydDsKKyAgY2hhciAqYnVmZmVyOworICBjaGFyICphZGRyZXNzID0gTlVMTDsKKworICBidWZmZXIgPSBncHJfbWFsbG9jKHZhbHVlX2xlbik7CisgIG1lbWNweShidWZmZXIsIHZhbHVlLCB2YWx1ZV9sZW4pOworICBqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihidWZmZXIsIHZhbHVlX2xlbik7CisgIGlmIChqc29uICE9IE5VTEwpIHsKKyAgICBob3N0ID0gTlVMTDsKKyAgICBwb3J0ID0gTlVMTDsKKyAgICBmb3IgKGN1ciA9IGpzb24tPmNoaWxkOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICBpZiAoIXN0cmNtcChjdXItPmtleSwgImhvc3QiKSkgeworICAgICAgICBob3N0ID0gY3VyLT52YWx1ZTsKKyAgICAgICAgaWYgKHBvcnQgIT0gTlVMTCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3VyLT5rZXksICJwb3J0IikpIHsKKyAgICAgICAgcG9ydCA9IGN1ci0+dmFsdWU7CisgICAgICAgIGlmIChob3N0ICE9IE5VTEwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoaG9zdCAhPSBOVUxMICYmIHBvcnQgIT0gTlVMTCkgeworICAgICAgZ3ByX2FzcHJpbnRmKCZhZGRyZXNzLCAiJXM6JXMiLCBob3N0LCBwb3J0KTsKKyAgICB9CisgICAgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7CisgIH0KKyAgZ3ByX2ZyZWUoYnVmZmVyKTsKKworICByZXR1cm4gYWRkcmVzczsKK30KKworc3RhdGljIHZvaWQgem9va2VlcGVyX2dldF9jaGlsZHJlbl9ub2RlX2NvbXBsZXRpb24oaW50IHJjLCBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgU3RhdCAqc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFyZykgeworICBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgem9va2VlcGVyX3Jlc29sdmVyICpyID0gKHpvb2tlZXBlcl9yZXNvbHZlciAqKWFyZzsKKyAgaW50IHJlc29sdmVfZG9uZSA9IDA7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgaWYgKHJjICE9IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVycm9yIGluIGdldHRpbmcgYSBjaGlsZCBub2RlIG9mICVzIiwgci0+bmFtZSk7CisgICAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgICByZXR1cm47CisgIH0KKworICBhZGRyZXNzID0gem9va2VlcGVyX3BhcnNlX2FkZHJlc3ModmFsdWUsIChzaXplX3QpdmFsdWVfbGVuKTsKKyAgaWYgKGFkZHJlc3MgIT0gTlVMTCkgeworICAgIC8qKiBGdXJ0aGVyIHJlc29sdmVzIGFkZHJlc3MgYnkgRE5TICovCisgICAgZ3JwY19yZXNvbHZlX2FkZHJlc3MoYWRkcmVzcywgTlVMTCwgem9va2VlcGVyX2Ruc19yZXNvbHZlZCwgcik7CisgICAgZ3ByX2ZyZWUoYWRkcmVzcyk7CisgIH0gZWxzZSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBpbiByZXNvbHZpbmcgYSBjaGlsZCBub2RlIG9mICVzIiwgci0+bmFtZSk7CisgICAgZ3ByX211X2xvY2soJnItPm11KTsKKyAgICByLT5yZXNvbHZlZF90b3RhbC0tOworICAgIHJlc29sdmVfZG9uZSA9IChyLT5yZXNvbHZlZF9udW0gPT0gci0+cmVzb2x2ZWRfdG90YWwpOworICAgIGdwcl9tdV91bmxvY2soJnItPm11KTsKKyAgICBpZiAocmVzb2x2ZV9kb25lKSB7CisgICAgICB6b29rZWVwZXJfb25fcmVzb2x2ZWQoJmV4ZWNfY3R4LCByLCByLT5yZXNvbHZlZF9hZGRycyk7CisgICAgfQorICB9CisKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKK30KKworc3RhdGljIHZvaWQgem9va2VlcGVyX2dldF9jaGlsZHJlbl9jb21wbGV0aW9uKAorICAgIGludCByYywgY29uc3Qgc3RydWN0IFN0cmluZ192ZWN0b3IgKmNoaWxkcmVuLCBjb25zdCB2b2lkICphcmcpIHsKKyAgY2hhciAqcGF0aDsKKyAgaW50IHN0YXR1czsKKyAgaW50IGk7CisgIHpvb2tlZXBlcl9yZXNvbHZlciAqciA9ICh6b29rZWVwZXJfcmVzb2x2ZXIgKilhcmc7CisKKyAgaWYgKHJjICE9IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVycm9yIGluIGdldHRpbmcgem9va2VlcGVyIGNoaWxkcmVuIG9mICVzIiwgci0+bmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGNoaWxkcmVuLT5jb3VudCA9PSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBpbiByZXNvbHZpbmcgem9va2VlcGVyIGFkZHJlc3MgJXMiLCByLT5uYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICByLT5yZXNvbHZlZF9hZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzKSk7CisgIHItPnJlc29sdmVkX2FkZHJzLT5hZGRycyA9IE5VTEw7CisgIHItPnJlc29sdmVkX2FkZHJzLT5uYWRkcnMgPSAwOworICByLT5yZXNvbHZlZF90b3RhbCA9IGNoaWxkcmVuLT5jb3VudDsKKworICAvKiogVE9ETzogUmVwbGFjZSBleHBlbnNpdmUgaGVhcCBhbGxvY2F0aW9uIHdpdGggc3RhY2sKKyAgICAgIGlmIHdlIGNhbiBnZXQgbWF4aW11bSBsZW5ndGggb2Ygem9va2VlcGVyIHBhdGggKi8KKyAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLT5jb3VudDsgaSsrKSB7CisgICAgZ3ByX2FzcHJpbnRmKCZwYXRoLCAiJXMvJXMiLCByLT5uYW1lLCBjaGlsZHJlbi0+ZGF0YVtpXSk7CisgICAgc3RhdHVzID0gem9vX2F3Z2V0KHItPnpvb2tlZXBlcl9oYW5kbGUsIHBhdGgsIHpvb2tlZXBlcl93YXRjaGVyLCByLAorICAgICAgICAgICAgICAgICAgICAgICB6b29rZWVwZXJfZ2V0X2NoaWxkcmVuX25vZGVfY29tcGxldGlvbiwgcik7CisgICAgZ3ByX2ZyZWUocGF0aCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVycm9yIGluIGdldHRpbmcgem9va2VlcGVyIG5vZGUgJXMiLCBwYXRoKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgem9va2VlcGVyX2dldF9ub2RlX2NvbXBsZXRpb24oaW50IHJjLCBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgU3RhdCAqc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFyZykgeworICBpbnQgc3RhdHVzOworICBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgem9va2VlcGVyX3Jlc29sdmVyICpyID0gKHpvb2tlZXBlcl9yZXNvbHZlciAqKWFyZzsKKyAgci0+cmVzb2x2ZWRfYWRkcnMgPSBOVUxMOworICByLT5yZXNvbHZlZF90b3RhbCA9IDA7CisgIHItPnJlc29sdmVkX251bSA9IDA7CisKKyAgaWYgKHJjICE9IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVycm9yIGluIGdldHRpbmcgem9va2VlcGVyIG5vZGUgJXMiLCByLT5uYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiogSWYgem9va2VlcGVyIG5vZGUgb2YgcGF0aCByLT5uYW1lIGRvZXMgbm90IGhhdmUgYWRkcmVzcworICAgICAgKGkuZS4gc2VydmljZSBub2RlKSwgZ2V0IGl0cyBjaGlsZHJlbiAqLworICBhZGRyZXNzID0gem9va2VlcGVyX3BhcnNlX2FkZHJlc3ModmFsdWUsIChzaXplX3QpdmFsdWVfbGVuKTsKKyAgaWYgKGFkZHJlc3MgIT0gTlVMTCkgeworICAgIHItPnJlc29sdmVkX2FkZHJzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMpKTsKKyAgICByLT5yZXNvbHZlZF9hZGRycy0+YWRkcnMgPSBOVUxMOworICAgIHItPnJlc29sdmVkX2FkZHJzLT5uYWRkcnMgPSAwOworICAgIHItPnJlc29sdmVkX3RvdGFsID0gMTsKKyAgICAvKiogRnVydGhlciByZXNvbHZlcyBhZGRyZXNzIGJ5IEROUyAqLworICAgIGdycGNfcmVzb2x2ZV9hZGRyZXNzKGFkZHJlc3MsIE5VTEwsIHpvb2tlZXBlcl9kbnNfcmVzb2x2ZWQsIHIpOworICAgIGdwcl9mcmVlKGFkZHJlc3MpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0YXR1cyA9IHpvb19hd2dldF9jaGlsZHJlbihyLT56b29rZWVwZXJfaGFuZGxlLCByLT5uYW1lLCB6b29rZWVwZXJfd2F0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIHpvb2tlZXBlcl9nZXRfY2hpbGRyZW5fY29tcGxldGlvbiwgcik7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRXJyb3IgaW4gZ2V0dGluZyB6b29rZWVwZXIgY2hpbGRyZW4gb2YgJXMiLCByLT5uYW1lKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB6b29rZWVwZXJfcmVzb2x2ZV9hZGRyZXNzKHpvb2tlZXBlcl9yZXNvbHZlciAqcikgeworICBpbnQgc3RhdHVzOworICBzdGF0dXMgPSB6b29fYXdnZXQoci0+em9va2VlcGVyX2hhbmRsZSwgci0+bmFtZSwgem9va2VlcGVyX3dhdGNoZXIsIHIsCisgICAgICAgICAgICAgICAgICAgICB6b29rZWVwZXJfZ2V0X25vZGVfY29tcGxldGlvbiwgcik7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRXJyb3IgaW4gZ2V0dGluZyB6b29rZWVwZXIgbm9kZSAlcyIsIHItPm5hbWUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9zdGFydF9yZXNvbHZpbmdfbG9ja2VkKHpvb2tlZXBlcl9yZXNvbHZlciAqcikgeworICBHUlBDX1JFU09MVkVSX1JFRigmci0+YmFzZSwgInpvb2tlZXBlci1yZXNvbHZpbmciKTsKKyAgR1BSX0FTU0VSVChyLT5yZXNvbHZpbmcgPT0gMCk7CisgIHItPnJlc29sdmluZyA9IDE7CisgIHpvb2tlZXBlcl9yZXNvbHZlX2FkZHJlc3Mocik7Cit9CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9tYXliZV9maW5pc2hfbmV4dF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb2tlZXBlcl9yZXNvbHZlciAqcikgeworICBpZiAoci0+bmV4dF9jb21wbGV0aW9uICE9IE5VTEwgJiYKKyAgICAgIHItPnJlc29sdmVkX3ZlcnNpb24gIT0gci0+cHVibGlzaGVkX3ZlcnNpb24pIHsKKyAgICAqci0+dGFyZ2V0X2NvbmZpZyA9IHItPnJlc29sdmVkX2NvbmZpZzsKKyAgICBpZiAoci0+cmVzb2x2ZWRfY29uZmlnICE9IE5VTEwpIHsKKyAgICAgIGdycGNfY2xpZW50X2NvbmZpZ19yZWYoci0+cmVzb2x2ZWRfY29uZmlnKTsKKyAgICB9CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCByLT5uZXh0X2NvbXBsZXRpb24sIHRydWUsIE5VTEwpOworICAgIHItPm5leHRfY29tcGxldGlvbiA9IE5VTEw7CisgICAgci0+cHVibGlzaGVkX3ZlcnNpb24gPSByLT5yZXNvbHZlZF92ZXJzaW9uOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3Jlc29sdmVyICpncikgeworICB6b29rZWVwZXJfcmVzb2x2ZXIgKnIgPSAoem9va2VlcGVyX3Jlc29sdmVyICopZ3I7CisgIGdwcl9tdV9kZXN0cm95KCZyLT5tdSk7CisgIGlmIChyLT5yZXNvbHZlZF9jb25maWcgIT0gTlVMTCkgeworICAgIGdycGNfY2xpZW50X2NvbmZpZ191bnJlZihleGVjX2N0eCwgci0+cmVzb2x2ZWRfY29uZmlnKTsKKyAgfQorICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV91bnJlZihleGVjX2N0eCwgci0+c3ViY2hhbm5lbF9mYWN0b3J5KTsKKyAgZ3ByX2ZyZWUoci0+bmFtZSk7CisgIGdwcl9mcmVlKHItPmxiX3BvbGljeV9uYW1lKTsKKyAgZ3ByX2ZyZWUocik7Cit9CisKK3N0YXRpYyBncnBjX3Jlc29sdmVyICp6b29rZWVwZXJfY3JlYXRlKGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxiX3BvbGljeV9uYW1lKSB7CisgIHpvb2tlZXBlcl9yZXNvbHZlciAqcjsKKyAgc2l6ZV90IGxlbmd0aDsKKyAgY2hhciAqcGF0aCA9IGFyZ3MtPnVyaS0+cGF0aDsKKworICBpZiAoMCA9PSBzdHJjbXAoYXJncy0+dXJpLT5hdXRob3JpdHksICIiKSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTm8gYXV0aG9yaXR5IHNwZWNpZmllZCBpbiB6b29rZWVwZXIgdXJpIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiogUmVtb3ZlcyB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgZXhpc3RzICovCisgIGxlbmd0aCA9IHN0cmxlbihwYXRoKTsKKyAgaWYgKGxlbmd0aCA+IDEgJiYgcGF0aFtsZW5ndGggLSAxXSA9PSAnLycpIHsKKyAgICBwYXRoW2xlbmd0aCAtIDFdID0gMDsKKyAgfQorCisgIHIgPSBncHJfbWFsbG9jKHNpemVvZih6b29rZWVwZXJfcmVzb2x2ZXIpKTsKKyAgbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworICBncHJfcmVmX2luaXQoJnItPnJlZnMsIDEpOworICBncHJfbXVfaW5pdCgmci0+bXUpOworICBncnBjX3Jlc29sdmVyX2luaXQoJnItPmJhc2UsICZ6b29rZWVwZXJfcmVzb2x2ZXJfdnRhYmxlKTsKKyAgci0+bmFtZSA9IGdwcl9zdHJkdXAocGF0aCk7CisKKyAgci0+c3ViY2hhbm5lbF9mYWN0b3J5ID0gYXJncy0+c3ViY2hhbm5lbF9mYWN0b3J5OworICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9yZWYoci0+c3ViY2hhbm5lbF9mYWN0b3J5KTsKKworICByLT5sYl9wb2xpY3lfbmFtZSA9IGdwcl9zdHJkdXAobGJfcG9saWN5X25hbWUpOworCisgIC8qKiBJbml0aWFsaXplcyB6b29rZWVwZXIgY2xpZW50ICovCisgIHpvb19zZXRfZGVidWdfbGV2ZWwoWk9PX0xPR19MRVZFTF9XQVJOKTsKKyAgci0+em9va2VlcGVyX2hhbmRsZSA9CisgICAgICB6b29rZWVwZXJfaW5pdChhcmdzLT51cmktPmF1dGhvcml0eSwgem9va2VlcGVyX2dsb2JhbF93YXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgR1JQQ19aT09LRUVQRVJfU0VTU0lPTl9USU1FT1VULCAwLCAwLCAwKTsKKyAgaWYgKHItPnpvb2tlZXBlcl9oYW5kbGUgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIGNvbm5lY3QgdG8gem9va2VlcGVyIHNlcnZlciIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuICZyLT5iYXNlOworfQorCitzdGF0aWMgdm9pZCB6b29rZWVwZXJfcGx1Z2luX2luaXQoKSB7CisgIGdycGNfcmVnaXN0ZXJfcmVzb2x2ZXJfdHlwZShncnBjX3pvb2tlZXBlcl9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSgpKTsKK30KKwordm9pZCBncnBjX3pvb2tlZXBlcl9yZWdpc3RlcigpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfem9va2VlcGVyX3JlZ2lzdGVyKHZvaWQpIiwgMCwgKCkpOworICBncnBjX3JlZ2lzdGVyX3BsdWdpbih6b29rZWVwZXJfcGx1Z2luX2luaXQsIE5VTEwpOworfQorCisvKgorICogRkFDVE9SWQorICovCisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9mYWN0b3J5X3JlZihncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnkpIHt9CisKK3N0YXRpYyB2b2lkIHpvb2tlZXBlcl9mYWN0b3J5X3VucmVmKGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSkge30KKworc3RhdGljIGNoYXIgKnpvb2tlZXBlcl9mYWN0b3J5X2dldF9kZWZhdWx0X2hvc3RuYW1lKAorICAgIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSAqZmFjdG9yeSwgZ3JwY191cmkgKnVyaSkgeworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdycGNfcmVzb2x2ZXIgKnpvb2tlZXBlcl9mYWN0b3J5X2NyZWF0ZV9yZXNvbHZlcigKKyAgICBncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnksIGdycGNfcmVzb2x2ZXJfYXJncyAqYXJncykgeworICByZXR1cm4gem9va2VlcGVyX2NyZWF0ZShhcmdzLCAicGlja19maXJzdCIpOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19yZXNvbHZlcl9mYWN0b3J5X3Z0YWJsZSB6b29rZWVwZXJfZmFjdG9yeV92dGFibGUgPSB7CisgICAgem9va2VlcGVyX2ZhY3RvcnlfcmVmLCB6b29rZWVwZXJfZmFjdG9yeV91bnJlZiwKKyAgICB6b29rZWVwZXJfZmFjdG9yeV9jcmVhdGVfcmVzb2x2ZXIsIHpvb2tlZXBlcl9mYWN0b3J5X2dldF9kZWZhdWx0X2hvc3RuYW1lLAorICAgICJ6b29rZWVwZXIifTsKKworc3RhdGljIGdycGNfcmVzb2x2ZXJfZmFjdG9yeSB6b29rZWVwZXJfcmVzb2x2ZXJfZmFjdG9yeSA9IHsKKyAgICAmem9va2VlcGVyX2ZhY3RvcnlfdnRhYmxlfTsKKworZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpncnBjX3pvb2tlZXBlcl9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSgpIHsKKyAgcmV0dXJuICZ6b29rZWVwZXJfcmVzb2x2ZXJfZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaCBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU3NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1JFU09MVkVSU19aT09LRUVQRVJfUkVTT0xWRVJfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfUkVTT0xWRVJTX1pPT0tFRVBFUl9SRVNPTFZFUl9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiCisKKy8qKiBDcmVhdGUgYSB6b29rZWVwZXIgcmVzb2x2ZXIgZmFjdG9yeSAqLworZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpncnBjX3pvb2tlZXBlcl9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSh2b2lkKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19SRVNPTFZFUlNfWk9PS0VFUEVSX1JFU09MVkVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI0MmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jCkBAIC0wLDAgKzEsNjc4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXZsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIKKworI2RlZmluZSBJTlRFUk5BTF9SRUZfQklUUyAxNgorI2RlZmluZSBTVFJPTkdfUkVGX01BU0sgKH4oZ3ByX2F0bSkoKDEgPDwgSU5URVJOQUxfUkVGX0JJVFMpIC0gMSkpCisKKyNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX01JTl9DT05ORUNUX1RJTUVPVVRfU0VDT05EUyAyMAorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfSU5JVElBTF9DT05ORUNUX0JBQ0tPRkZfU0VDT05EUyAxCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUNPTk5FQ1RfQkFDS09GRl9NVUxUSVBMSUVSIDEuNgorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfUkVDT05ORUNUX01BWF9CQUNLT0ZGX1NFQ09ORFMgMTIwCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUNPTk5FQ1RfSklUVEVSIDAuMgorCisjZGVmaW5lIEdFVF9DT05ORUNURURfU1VCQ0hBTk5FTChzdWJjaGFubmVsLCBiYXJyaWVyKSAgICAgIFwKKyAgKChncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICopKGdwcl9hdG1fIyNiYXJyaWVyIyNfbG9hZCggXAorICAgICAgJihzdWJjaGFubmVsKS0+Y29ubmVjdGVkX3N1YmNoYW5uZWwpKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKKyAgZ3JwY19zdWJjaGFubmVsICpzdWJjaGFubmVsOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBjb25uZWN0aXZpdHlfc3RhdGU7Cit9IHN0YXRlX3dhdGNoZXI7CisKK3R5cGVkZWYgc3RydWN0IGV4dGVybmFsX3N0YXRlX3dhdGNoZXIgeworICBncnBjX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWw7CisgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0OworICBncnBjX2Nsb3N1cmUgKm5vdGlmeTsKKyAgZ3JwY19jbG9zdXJlIGNsb3N1cmU7CisgIHN0cnVjdCBleHRlcm5hbF9zdGF0ZV93YXRjaGVyICpuZXh0OworICBzdHJ1Y3QgZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlciAqcHJldjsKK30gZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlcjsKKworc3RydWN0IGdycGNfc3ViY2hhbm5lbCB7CisgIGdycGNfY29ubmVjdG9yICpjb25uZWN0b3I7CisKKyAgLyoqIHJlZmNvdW50CisgICAgICAtIGxvd2VyIElOVEVSTkFMX1JFRl9CSVRTIGJpdHMgYXJlIGZvciBpbnRlcm5hbCByZWZlcmVuY2VzOgorICAgICAgICB0aGVzZSBkbyBub3Qga2VlcCB0aGUgc3ViY2hhbm5lbCBvcGVuLgorICAgICAgLSB1cHBlciByZW1haW5pbmcgYml0cyBhcmUgZm9yIHB1YmxpYyByZWZlcmVuY2VzOiB0aGVzZSBkbworICAgICAgICBrZWVwIHRoZSBzdWJjaGFubmVsIG9wZW4gKi8KKyAgZ3ByX2F0bSByZWZfcGFpcjsKKworICAvKiogbm9uLXRyYW5zcG9ydCByZWxhdGVkIGNoYW5uZWwgZmlsdGVycyAqLworICBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICoqZmlsdGVyczsKKyAgc2l6ZV90IG51bV9maWx0ZXJzOworICAvKiogY2hhbm5lbCBhcmd1bWVudHMgKi8KKyAgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3M7CisgIC8qKiBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gKi8KKyAgc3RydWN0IHNvY2thZGRyICphZGRyOworICBzaXplX3QgYWRkcl9sZW47CisKKyAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5OworCisgIC8qKiBpbml0aWFsIHN0cmluZyB0byBzZW5kIHRvIHBlZXIgKi8KKyAgZ3ByX3NsaWNlIGluaXRpYWxfY29ubmVjdF9zdHJpbmc7CisKKyAgLyoqIHNldCBkdXJpbmcgY29ubmVjdGlvbiAqLworICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MgY29ubmVjdGluZ19yZXN1bHQ7CisKKyAgLyoqIGNhbGxiYWNrIGZvciBjb25uZWN0aW9uIGZpbmlzaGluZyAqLworICBncnBjX2Nsb3N1cmUgY29ubmVjdGVkOworCisgIC8qKiBwb2xsc2V0X3NldCB0cmFja2luZyB3aG8ncyBpbnRlcmVzdGVkIGluIGEgY29ubmVjdGlvbgorICAgICAgYmVpbmcgc2V0dXAgKi8KKyAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQ7CisKKyAgLyoqIGFjdGl2ZSBjb25uZWN0aW9uLCBvciBudWxsOyBvZiB0eXBlIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKi8KKyAgZ3ByX2F0bSBjb25uZWN0ZWRfc3ViY2hhbm5lbDsKKworICAvKiogbXV0ZXggcHJvdGVjdGluZyByZW1haW5pbmcgZWxlbWVudHMgKi8KKyAgZ3ByX211IG11OworCisgIC8qKiBoYXZlIHdlIHNlZW4gYSBkaXNjb25uZWN0aW9uPyAqLworICBpbnQgZGlzY29ubmVjdGVkOworICAvKiogYXJlIHdlIGNvbm5lY3RpbmcgKi8KKyAgaW50IGNvbm5lY3Rpbmc7CisgIC8qKiBjb25uZWN0aXZpdHkgc3RhdGUgdHJhY2tpbmcgKi8KKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciBzdGF0ZV90cmFja2VyOworCisgIGV4dGVybmFsX3N0YXRlX3dhdGNoZXIgcm9vdF9leHRlcm5hbF9zdGF0ZV93YXRjaGVyOworCisgIC8qKiBuZXh0IGNvbm5lY3QgYXR0ZW1wdCB0aW1lICovCisgIGdwcl90aW1lc3BlYyBuZXh0X2F0dGVtcHQ7CisgIC8qKiBiYWNrb2ZmIHN0YXRlICovCisgIGdwcl9iYWNrb2ZmIGJhY2tvZmZfc3RhdGU7CisgIC8qKiBkbyB3ZSBoYXZlIGFuIGFjdGl2ZSBhbGFybT8gKi8KKyAgaW50IGhhdmVfYWxhcm07CisgIC8qKiBvdXIgYWxhcm0gKi8KKyAgZ3JwY190aW1lciBhbGFybTsKKyAgLyoqIGN1cnJlbnQgcmFuZG9tIHZhbHVlICovCisgIHVpbnQzMl90IHJhbmRvbTsKK307CisKK3N0cnVjdCBncnBjX3N1YmNoYW5uZWxfY2FsbCB7CisgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbm5lY3Rpb247Cit9OworCisjZGVmaW5lIFNVQkNIQU5ORUxfQ0FMTF9UT19DQUxMX1NUQUNLKGNhbGwpICgoZ3JwY19jYWxsX3N0YWNrICopKChjYWxsKSArIDEpKQorI2RlZmluZSBDSEFOTkVMX1NUQUNLX0ZST01fQ09OTkVDVElPTihjb24pICgoZ3JwY19jaGFubmVsX3N0YWNrICopKGNvbikpCisjZGVmaW5lIENBTExTVEFDS19UT19TVUJDSEFOTkVMX0NBTEwoY2FsbHN0YWNrKSBcCisgICgoKGdycGNfc3ViY2hhbm5lbF9jYWxsICopKGNhbGxzdGFjaykpIC0gMSkKKworc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9jb25uZWN0ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnN1YmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N1Y2Nlc3MpOworCisjaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgUkVGX1JFQVNPTiByZWFzb24KKyNkZWZpbmUgUkVGX0xPRyhuYW1lLCBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICIlczogJXAgICByZWYgJWQgLT4gJWQgJXMiLCBcCisgICAgICAgICAgKG5hbWUpLCAocCksIChwKS0+cmVmcy5jb3VudCwgKHApLT5yZWZzLmNvdW50ICsgMSwgcmVhc29uKQorI2RlZmluZSBVTlJFRl9MT0cobmFtZSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIiVzOiAlcCB1bnJlZiAlZCAtPiAlZCAlcyIsIFwKKyAgICAgICAgICAobmFtZSksIChwKSwgKHApLT5yZWZzLmNvdW50LCAocCktPnJlZnMuY291bnQgLSAxLCByZWFzb24pCisjZGVmaW5lIFJFRl9NVVRBVEVfRVhUUkFfQVJHUyBcCisgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUywgY29uc3QgY2hhciAqcHVycG9zZQorI2RlZmluZSBSRUZfTVVUQVRFX1BVUlBPU0UoeCkgLCBmaWxlLCBsaW5lLCByZWFzb24sIHgKKyNlbHNlCisjZGVmaW5lIFJFRl9SRUFTT04gIiIKKyNkZWZpbmUgUkVGX0xPRyhuYW1lLCBwKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVTlJFRl9MT0cobmFtZSwgcCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBSRUZfTVVUQVRFX0VYVFJBX0FSR1MKKyNkZWZpbmUgUkVGX01VVEFURV9QVVJQT1NFKHgpCisjZW5kaWYKKworLyoKKyAqIGNvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBjb25uZWN0aW9uX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqYyA9IGFyZzsKKyAgZ3JwY19jaGFubmVsX3N0YWNrX2Rlc3Ryb3koZXhlY19jdHgsIENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGMpKTsKKyAgZ3ByX2ZyZWUoYyk7Cit9CisKK3ZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9yZWYoCisgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqYyBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpIHsKKyAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihDSEFOTkVMX1NUQUNLX0ZST01fQ09OTkVDVElPTihjKSwgUkVGX1JFQVNPTik7Cit9CisKK3ZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgeworICBHUlBDX0NIQU5ORUxfU1RBQ0tfVU5SRUYoZXhlY19jdHgsIENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1JFQVNPTik7Cit9CisKKy8qCisgKiBncnBjX3N1YmNoYW5uZWwgaW1wbGVtZW50YXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBzdWJjaGFubmVsX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY19zdWJjaGFubmVsICpjID0gYXJnOworICBncHJfZnJlZSgodm9pZCAqKWMtPmZpbHRlcnMpOworICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGMtPmFyZ3MpOworICBncHJfZnJlZShjLT5hZGRyKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGMtPmluaXRpYWxfY29ubmVjdF9zdHJpbmcpOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGV4ZWNfY3R4LCAmYy0+c3RhdGVfdHJhY2tlcik7CisgIGdycGNfY29ubmVjdG9yX3VucmVmKGV4ZWNfY3R4LCBjLT5jb25uZWN0b3IpOworICBncnBjX3BvbGxzZXRfc2V0X2Rlc3Ryb3koYy0+cG9sbHNldF9zZXQpOworICBncnBjX3N1YmNoYW5uZWxfa2V5X2Rlc3Ryb3koZXhlY19jdHgsIGMtPmtleSk7CisgIGdwcl9mcmVlKGMpOworfQorCitzdGF0aWMgZ3ByX2F0bSByZWZfbXV0YXRlKGdycGNfc3ViY2hhbm5lbCAqYywgZ3ByX2F0bSBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhcnJpZXIgUkVGX01VVEFURV9FWFRSQV9BUkdTKSB7CisgIGdwcl9hdG0gb2xkX3ZhbCA9IGJhcnJpZXIgPyBncHJfYXRtX2Z1bGxfZmV0Y2hfYWRkKCZjLT5yZWZfcGFpciwgZGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZjLT5yZWZfcGFpciwgZGVsdGEpOworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKKyAgICAgICAgICAiU1VCQ0hBTk5FTDogJXAgJSAxMnMgMHglMDh4IC0+IDB4JTA4eCBbJXNdIiwgYywgcHVycG9zZSwgb2xkX3ZhbCwKKyAgICAgICAgICBvbGRfdmFsICsgZGVsdGEsIHJlYXNvbik7CisjZW5kaWYKKyAgcmV0dXJuIG9sZF92YWw7Cit9CisKK2dycGNfc3ViY2hhbm5lbCAqZ3JwY19zdWJjaGFubmVsX3JlZigKKyAgICBncnBjX3N1YmNoYW5uZWwgKmMgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKSB7CisgIGdwcl9hdG0gb2xkX3JlZnM7CisgIG9sZF9yZWZzID0gcmVmX211dGF0ZShjLCAoMSA8PCBJTlRFUk5BTF9SRUZfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAwIFJFRl9NVVRBVEVfUFVSUE9TRSgiU1RST05HX1JFRiIpKTsKKyAgR1BSX0FTU0VSVCgob2xkX3JlZnMgJiBTVFJPTkdfUkVGX01BU0spICE9IDApOworICByZXR1cm4gYzsKK30KKworZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfd2Vha19yZWYoCisgICAgZ3JwY19zdWJjaGFubmVsICpjIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgeworICBncHJfYXRtIG9sZF9yZWZzOworICBvbGRfcmVmcyA9IHJlZl9tdXRhdGUoYywgMSwgMCBSRUZfTVVUQVRFX1BVUlBPU0UoIldFQUtfUkVGIikpOworICBHUFJfQVNTRVJUKG9sZF9yZWZzICE9IDApOworICByZXR1cm4gYzsKK30KKworZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfcmVmX2Zyb21fd2Vha19yZWYoCisgICAgZ3JwY19zdWJjaGFubmVsICpjIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgeworICBpZiAoIWMpIHJldHVybiBOVUxMOworICBmb3IgKDs7KSB7CisgICAgZ3ByX2F0bSBvbGRfcmVmcyA9IGdwcl9hdG1fYWNxX2xvYWQoJmMtPnJlZl9wYWlyKTsKKyAgICBpZiAob2xkX3JlZnMgPj0gKDEgPDwgSU5URVJOQUxfUkVGX0JJVFMpKSB7CisgICAgICBncHJfYXRtIG5ld19yZWZzID0gb2xkX3JlZnMgKyAoMSA8PCBJTlRFUk5BTF9SRUZfQklUUyk7CisgICAgICBpZiAoZ3ByX2F0bV9yZWxfY2FzKCZjLT5yZWZfcGFpciwgb2xkX3JlZnMsIG5ld19yZWZzKSkgeworICAgICAgICByZXR1cm4gYzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGRpc2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbCAqYykgeworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb247CisgIGdycGNfc3ViY2hhbm5lbF9pbmRleF91bnJlZ2lzdGVyKGV4ZWNfY3R4LCBjLT5rZXksIGMpOworICBncHJfbXVfbG9jaygmYy0+bXUpOworICBHUFJfQVNTRVJUKCFjLT5kaXNjb25uZWN0ZWQpOworICBjLT5kaXNjb25uZWN0ZWQgPSAxOworICBncnBjX2Nvbm5lY3Rvcl9zaHV0ZG93bihleGVjX2N0eCwgYy0+Y29ubmVjdG9yKTsKKyAgY29uID0gR0VUX0NPTk5FQ1RFRF9TVUJDSEFOTkVMKGMsIG5vX2JhcnJpZXIpOworICBpZiAoY29uICE9IE5VTEwpIHsKKyAgICBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1VOUkVGKGV4ZWNfY3R4LCBjb24sICJjb25uZWN0aW9uIik7CisgICAgZ3ByX2F0bV9ub19iYXJyaWVyX3N0b3JlKCZjLT5jb25uZWN0ZWRfc3ViY2hhbm5lbCwgMHhkZWFkYmVlZik7CisgIH0KKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqYyBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpIHsKKyAgZ3ByX2F0bSBvbGRfcmVmczsKKyAgb2xkX3JlZnMgPSByZWZfbXV0YXRlKGMsIChncHJfYXRtKTEgLSAoZ3ByX2F0bSkoMSA8PCBJTlRFUk5BTF9SRUZfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAxIFJFRl9NVVRBVEVfUFVSUE9TRSgiU1RST05HX1VOUkVGIikpOworICBpZiAoKG9sZF9yZWZzICYgU1RST05HX1JFRl9NQVNLKSA9PSAoMSA8PCBJTlRFUk5BTF9SRUZfQklUUykpIHsKKyAgICBkaXNjb25uZWN0KGV4ZWNfY3R4LCBjKTsKKyAgfQorICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgYywgInN0cm9uZy11bnJlZiIpOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF93ZWFrX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUykgeworICBncHJfYXRtIG9sZF9yZWZzOworICBvbGRfcmVmcyA9IHJlZl9tdXRhdGUoYywgLShncHJfYXRtKTEsIDEgUkVGX01VVEFURV9QVVJQT1NFKCJXRUFLX1VOUkVGIikpOworICBpZiAob2xkX3JlZnMgPT0gMSkgeworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgZ3JwY19jbG9zdXJlX2NyZWF0ZShzdWJjaGFubmVsX2Rlc3Ryb3ksIGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgdWludDMyX3QgcmFuZG9tX3NlZWQoKSB7CisgIHJldHVybiAodWludDMyX3QpKGdwcl90aW1lX3RvX21pbGxpcyhncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKSk7Cit9CisKK2dycGNfc3ViY2hhbm5lbCAqZ3JwY19zdWJjaGFubmVsX2NyZWF0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9hcmdzICphcmdzKSB7CisgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmtleSA9IGdycGNfc3ViY2hhbm5lbF9rZXlfY3JlYXRlKGNvbm5lY3RvciwgYXJncyk7CisgIGdycGNfc3ViY2hhbm5lbCAqYyA9IGdycGNfc3ViY2hhbm5lbF9pbmRleF9maW5kKGV4ZWNfY3R4LCBrZXkpOworICBpZiAoYykgeworICAgIGdycGNfc3ViY2hhbm5lbF9rZXlfZGVzdHJveShleGVjX2N0eCwga2V5KTsKKyAgICByZXR1cm4gYzsKKyAgfQorCisgIGMgPSBncHJfbWFsbG9jKHNpemVvZigqYykpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CisgIGMtPmtleSA9IGtleTsKKyAgZ3ByX2F0bV9ub19iYXJyaWVyX3N0b3JlKCZjLT5yZWZfcGFpciwgMSA8PCBJTlRFUk5BTF9SRUZfQklUUyk7CisgIGMtPmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKKyAgZ3JwY19jb25uZWN0b3JfcmVmKGMtPmNvbm5lY3Rvcik7CisgIGMtPm51bV9maWx0ZXJzID0gYXJncy0+ZmlsdGVyX2NvdW50OworICBpZiAoYy0+bnVtX2ZpbHRlcnMgPiAwKSB7CisgICAgYy0+ZmlsdGVycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY2hhbm5lbF9maWx0ZXIgKikgKiBjLT5udW1fZmlsdGVycyk7CisgICAgbWVtY3B5KCh2b2lkICopYy0+ZmlsdGVycywgYXJncy0+ZmlsdGVycywKKyAgICAgICAgICAgc2l6ZW9mKGdycGNfY2hhbm5lbF9maWx0ZXIgKikgKiBjLT5udW1fZmlsdGVycyk7CisgIH0gZWxzZSB7CisgICAgYy0+ZmlsdGVycyA9IE5VTEw7CisgIH0KKyAgYy0+YWRkciA9IGdwcl9tYWxsb2MoYXJncy0+YWRkcl9sZW4pOworICBtZW1jcHkoYy0+YWRkciwgYXJncy0+YWRkciwgYXJncy0+YWRkcl9sZW4pOworICBjLT5wb2xsc2V0X3NldCA9IGdycGNfcG9sbHNldF9zZXRfY3JlYXRlKCk7CisgIGMtPmFkZHJfbGVuID0gYXJncy0+YWRkcl9sZW47CisgIGdycGNfc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcoJmMtPmFkZHIsICZjLT5hZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+aW5pdGlhbF9jb25uZWN0X3N0cmluZyk7CisgIGMtPmFyZ3MgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5KGFyZ3MtPmFyZ3MpOworICBjLT5yYW5kb20gPSByYW5kb21fc2VlZCgpOworICBjLT5yb290X2V4dGVybmFsX3N0YXRlX3dhdGNoZXIubmV4dCA9IGMtPnJvb3RfZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlci5wcmV2ID0KKyAgICAgICZjLT5yb290X2V4dGVybmFsX3N0YXRlX3dhdGNoZXI7CisgIGdycGNfY2xvc3VyZV9pbml0KCZjLT5jb25uZWN0ZWQsIHN1YmNoYW5uZWxfY29ubmVjdGVkLCBjKTsKKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfaW5pdCgmYy0+c3RhdGVfdHJhY2tlciwgR1JQQ19DSEFOTkVMX0lETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YmNoYW5uZWwiKTsKKyAgZ3ByX2JhY2tvZmZfaW5pdCgmYy0+YmFja29mZl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfUkVDT05ORUNUX0JBQ0tPRkZfTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfUkVDT05ORUNUX0pJVFRFUiwKKyAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfSU5JVElBTF9DT05ORUNUX0JBQ0tPRkZfU0VDT05EUyAqIDEwMDAsCisgICAgICAgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFQ09OTkVDVF9NQVhfQkFDS09GRl9TRUNPTkRTICogMTAwMCk7CisgIGlmIChjLT5hcmdzKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjLT5hcmdzLT5udW1fYXJnczsgaSsrKSB7CisgICAgICBpZiAoMCA9PSBzdHJjbXAoYy0+YXJncy0+YXJnc1tpXS5rZXksCisgICAgICAgICAgICAgICAgICAgICAgImdycGMudGVzdGluZy5maXhlZF9yZWNvbm5lY3RfYmFja29mZiIpKSB7CisgICAgICAgIEdQUl9BU1NFUlQoYy0+YXJncy0+YXJnc1tpXS50eXBlID09IEdSUENfQVJHX0lOVEVHRVIpOworICAgICAgICBncHJfYmFja29mZl9pbml0KCZjLT5iYWNrb2ZmX3N0YXRlLCAxLjAsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZ3ByX211X2luaXQoJmMtPm11KTsKKworICByZXR1cm4gZ3JwY19zdWJjaGFubmVsX2luZGV4X3JlZ2lzdGVyKGV4ZWNfY3R4LCBrZXksIGMpOworfQorCitzdGF0aWMgdm9pZCBjb250aW51ZV9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWwgKmMpIHsKKyAgZ3JwY19jb25uZWN0X2luX2FyZ3MgYXJnczsKKworICBhcmdzLmludGVyZXN0ZWRfcGFydGllcyA9IGMtPnBvbGxzZXRfc2V0OworICBhcmdzLmFkZHIgPSBjLT5hZGRyOworICBhcmdzLmFkZHJfbGVuID0gYy0+YWRkcl9sZW47CisgIGFyZ3MuZGVhZGxpbmUgPSBjLT5uZXh0X2F0dGVtcHQ7CisgIGFyZ3MuY2hhbm5lbF9hcmdzID0gYy0+YXJnczsKKyAgYXJncy5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nID0gYy0+aW5pdGlhbF9jb25uZWN0X3N0cmluZzsKKworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZjLT5zdGF0ZV90cmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX0NPTk5FQ1RJTkcsICJzdGF0ZV9jaGFuZ2UiKTsKKyAgZ3JwY19jb25uZWN0b3JfY29ubmVjdChleGVjX2N0eCwgYy0+Y29ubmVjdG9yLCAmYXJncywgJmMtPmNvbm5lY3RpbmdfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5jb25uZWN0ZWQpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWwgKmMpIHsKKyAgYy0+bmV4dF9hdHRlbXB0ID0KKyAgICAgIGdwcl9iYWNrb2ZmX2JlZ2luKCZjLT5iYWNrb2ZmX3N0YXRlLCBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKKyAgY29udGludWVfY29ubmVjdChleGVjX2N0eCwgYyk7Cit9CisKK2dycGNfY29ubmVjdGl2aXR5X3N0YXRlIGdycGNfc3ViY2hhbm5lbF9jaGVja19jb25uZWN0aXZpdHkoZ3JwY19zdWJjaGFubmVsICpjKSB7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0YXRlOworICBncHJfbXVfbG9jaygmYy0+bXUpOworICBzdGF0ZSA9IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2NoZWNrKCZjLT5zdGF0ZV90cmFja2VyKTsKKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICByZXR1cm4gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2V4dGVybmFsX3N0YXRlX3dhdGNoZXJfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgeworICBleHRlcm5hbF9zdGF0ZV93YXRjaGVyICp3ID0gYXJnOworICBncnBjX2Nsb3N1cmUgKmZvbGxvd191cCA9IHctPm5vdGlmeTsKKyAgaWYgKHctPnBvbGxzZXRfc2V0ICE9IE5VTEwpIHsKKyAgICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0X3NldChleGVjX2N0eCwgdy0+c3ViY2hhbm5lbC0+cG9sbHNldF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+cG9sbHNldF9zZXQpOworICB9CisgIGdwcl9tdV9sb2NrKCZ3LT5zdWJjaGFubmVsLT5tdSk7CisgIHctPm5leHQtPnByZXYgPSB3LT5wcmV2OworICB3LT5wcmV2LT5uZXh0ID0gdy0+bmV4dDsKKyAgZ3ByX211X3VubG9jaygmdy0+c3ViY2hhbm5lbC0+bXUpOworICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgdy0+c3ViY2hhbm5lbCwgImV4dGVybmFsX3N0YXRlX3dhdGNoZXIiKTsKKyAgZ3ByX2ZyZWUodyk7CisgIGZvbGxvd191cC0+Y2IoZXhlY19jdHgsIGZvbGxvd191cC0+Y2JfYXJnLCBzdWNjZXNzKTsKK30KKwordm9pZCBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zdWJjaGFubmVsICpjLAorICAgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllcywgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAorICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KSB7CisgIGV4dGVybmFsX3N0YXRlX3dhdGNoZXIgKnc7CisKKyAgaWYgKHN0YXRlID09IE5VTEwpIHsKKyAgICBncHJfbXVfbG9jaygmYy0+bXUpOworICAgIGZvciAodyA9IGMtPnJvb3RfZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlci5uZXh0OworICAgICAgICAgdyAhPSAmYy0+cm9vdF9leHRlcm5hbF9zdGF0ZV93YXRjaGVyOyB3ID0gdy0+bmV4dCkgeworICAgICAgaWYgKHctPm5vdGlmeSA9PSBub3RpZnkpIHsKKyAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICAgICAgICAgIGV4ZWNfY3R4LCAmYy0+c3RhdGVfdHJhY2tlciwgTlVMTCwgJnctPmNsb3N1cmUpOworICAgICAgfQorICAgIH0KKyAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7CisgIH0gZWxzZSB7CisgICAgdyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp3KSk7CisgICAgdy0+c3ViY2hhbm5lbCA9IGM7CisgICAgdy0+cG9sbHNldF9zZXQgPSBpbnRlcmVzdGVkX3BhcnRpZXM7CisgICAgdy0+bm90aWZ5ID0gbm90aWZ5OworICAgIGdycGNfY2xvc3VyZV9pbml0KCZ3LT5jbG9zdXJlLCBvbl9leHRlcm5hbF9zdGF0ZV93YXRjaGVyX2RvbmUsIHcpOworICAgIGlmIChpbnRlcmVzdGVkX3BhcnRpZXMgIT0gTlVMTCkgeworICAgICAgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldF9zZXQoZXhlY19jdHgsIGMtPnBvbGxzZXRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RlZF9wYXJ0aWVzKTsKKyAgICB9CisgICAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfUkVGKGMsICJleHRlcm5hbF9zdGF0ZV93YXRjaGVyIik7CisgICAgZ3ByX211X2xvY2soJmMtPm11KTsKKyAgICB3LT5uZXh0ID0gJmMtPnJvb3RfZXh0ZXJuYWxfc3RhdGVfd2F0Y2hlcjsKKyAgICB3LT5wcmV2ID0gdy0+bmV4dC0+cHJldjsKKyAgICB3LT5uZXh0LT5wcmV2ID0gdy0+cHJldi0+bmV4dCA9IHc7CisgICAgaWYgKGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgICAgICAgICBleGVjX2N0eCwgJmMtPnN0YXRlX3RyYWNrZXIsIHN0YXRlLCAmdy0+Y2xvc3VyZSkpIHsKKyAgICAgIGMtPmNvbm5lY3RpbmcgPSAxOworICAgICAgLyogcmVsZWFzZWQgYnkgY29ubmVjdGlvbiAqLworICAgICAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfUkVGKGMsICJjb25uZWN0aW5nIik7CisgICAgICBzdGFydF9jb25uZWN0KGV4ZWNfY3R4LCBjKTsKKyAgICB9CisgICAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICB9Cit9CisKK3ZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9wcm9jZXNzX3RyYW5zcG9ydF9vcCgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqY29uLAorICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCkgeworICBncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2sgPSBDSEFOTkVMX1NUQUNLX0ZST01fQ09OTkVDVElPTihjb24pOworICBncnBjX2NoYW5uZWxfZWxlbWVudCAqdG9wX2VsZW0gPSBncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudChjaGFubmVsX3N0YWNrLCAwKTsKKyAgdG9wX2VsZW0tPmZpbHRlci0+c3RhcnRfdHJhbnNwb3J0X29wKGV4ZWNfY3R4LCB0b3BfZWxlbSwgb3ApOworfQorCitzdGF0aWMgdm9pZCBzdWJjaGFubmVsX29uX2NoaWxkX3N0YXRlX2NoYW5nZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdWNjZXNzKSB7CisgIHN0YXRlX3dhdGNoZXIgKnN3ID0gcDsKKyAgZ3JwY19zdWJjaGFubmVsICpjID0gc3ctPnN1YmNoYW5uZWw7CisgIGdwcl9tdSAqbXUgPSAmYy0+bXU7CisKKyAgZ3ByX211X2xvY2sobXUpOworCisgIC8qIGlmIHdlIGZhaWxlZCBqdXN0IGxlYXZlIHRoaXMgY2xvc3VyZSAqLworICBpZiAoaW9tZ3Jfc3VjY2VzcykgeworICAgIGlmIChzdy0+Y29ubmVjdGl2aXR5X3N0YXRlID09IEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRSkgeworICAgICAgLyogYW55IGVycm9ycyBvbiBhIHN1YmNoYW5uZWwgPT0+IHdlJ3JlIGRvbmUsIGNyZWF0ZSBhIG5ldyBvbmUgKi8KKyAgICAgIHN3LT5jb25uZWN0aXZpdHlfc3RhdGUgPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRTsKKyAgICB9CisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmYy0+c3RhdGVfdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ctPmNvbm5lY3Rpdml0eV9zdGF0ZSwgInJlZmxlY3RfY2hpbGQiKTsKKyAgICBpZiAoc3ctPmNvbm5lY3Rpdml0eV9zdGF0ZSAhPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSkgeworICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAorICAgICAgICAgIGV4ZWNfY3R4LCBHRVRfQ09OTkVDVEVEX1NVQkNIQU5ORUwoYywgbm9fYmFycmllciksIE5VTEwsCisgICAgICAgICAgJnN3LT5jb25uZWN0aXZpdHlfc3RhdGUsICZzdy0+Y2xvc3VyZSk7CisgICAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYoYywgInN0YXRlX3dhdGNoZXIiKTsKKyAgICAgIHN3ID0gTlVMTDsKKyAgICB9CisgIH0KKworICBncHJfbXVfdW5sb2NrKG11KTsKKyAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfVU5SRUYoZXhlY19jdHgsIGMsICJzdGF0ZV93YXRjaGVyIik7CisgIGdwcl9mcmVlKHN3KTsKK30KKworc3RhdGljIHZvaWQgY29ubmVjdGVkX3N1YmNoYW5uZWxfc3RhdGVfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICppbnRlcmVzdGVkX3BhcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgZ3JwY190cmFuc3BvcnRfb3Agb3A7CisgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtOworICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKKyAgb3AuY29ubmVjdGl2aXR5X3N0YXRlID0gc3RhdGU7CisgIG9wLm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UgPSBjbG9zdXJlOworICBvcC5iaW5kX3BvbGxzZXRfc2V0ID0gaW50ZXJlc3RlZF9wYXJ0aWVzOworICBlbGVtID0gZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoQ0hBTk5FTF9TVEFDS19GUk9NX0NPTk5FQ1RJT04oY29uKSwgMCk7CisgIGVsZW0tPmZpbHRlci0+c3RhcnRfdHJhbnNwb3J0X29wKGV4ZWNfY3R4LCBlbGVtLCAmb3ApOworfQorCit2b2lkIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqY29uLAorICAgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllcywgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAorICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgeworICBjb25uZWN0ZWRfc3ViY2hhbm5lbF9zdGF0ZV9vcChleGVjX2N0eCwgY29uLCBpbnRlcmVzdGVkX3BhcnRpZXMsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlKTsKK30KKwordm9pZCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3BpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgZ3JwY190cmFuc3BvcnRfb3Agb3A7CisgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtOworICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKKyAgb3Auc2VuZF9waW5nID0gY2xvc3VyZTsKKyAgZWxlbSA9IGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGNvbiksIDApOworICBlbGVtLT5maWx0ZXItPnN0YXJ0X3RyYW5zcG9ydF9vcChleGVjX2N0eCwgZWxlbSwgJm9wKTsKK30KKworc3RhdGljIHZvaWQgcHVibGlzaF90cmFuc3BvcnRfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqYykgeworICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb247CisgIGdycGNfY2hhbm5lbF9zdGFjayAqc3RrOworICBzdGF0ZV93YXRjaGVyICpzd19zdWJjaGFubmVsOworCisgIC8qIGNvbnN0cnVjdCBjaGFubmVsIHN0YWNrICovCisgIGNvbiA9IGdycGNfY2hhbm5lbF9pbml0X2NyZWF0ZV9zdGFjaygKKyAgICAgIGV4ZWNfY3R4LCBHUlBDX0NMSUVOVF9TVUJDSEFOTkVMLCAwLCBjLT5jb25uZWN0aW5nX3Jlc3VsdC5jaGFubmVsX2FyZ3MsIDEsCisgICAgICBjb25uZWN0aW9uX2Rlc3Ryb3ksIE5VTEwsIGMtPmNvbm5lY3RpbmdfcmVzdWx0LnRyYW5zcG9ydCk7CisgIHN0ayA9IENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGNvbik7CisgIG1lbXNldCgmYy0+Y29ubmVjdGluZ19yZXN1bHQsIDAsIHNpemVvZihjLT5jb25uZWN0aW5nX3Jlc3VsdCkpOworCisgIC8qIGluaXRpYWxpemUgc3RhdGUgd2F0Y2hlciAqLworICBzd19zdWJjaGFubmVsID0gZ3ByX21hbGxvYyhzaXplb2YoKnN3X3N1YmNoYW5uZWwpKTsKKyAgc3dfc3ViY2hhbm5lbC0+c3ViY2hhbm5lbCA9IGM7CisgIHN3X3N1YmNoYW5uZWwtPmNvbm5lY3Rpdml0eV9zdGF0ZSA9IEdSUENfQ0hBTk5FTF9SRUFEWTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnN3X3N1YmNoYW5uZWwtPmNsb3N1cmUsIHN1YmNoYW5uZWxfb25fY2hpbGRfc3RhdGVfY2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgc3dfc3ViY2hhbm5lbCk7CisKKyAgaWYgKGMtPmRpc2Nvbm5lY3RlZCkgeworICAgIGdwcl9mcmVlKHN3X3N1YmNoYW5uZWwpOworICAgIGdycGNfY2hhbm5lbF9zdGFja19kZXN0cm95KGV4ZWNfY3R4LCBzdGspOworICAgIGdwcl9mcmVlKGNvbik7CisgICAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfVU5SRUYoZXhlY19jdHgsIGMsICJjb25uZWN0aW5nIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogcHVibGlzaCAqLworICAvKiBUT0RPKGN0aWxsZXIpOiB0aGlzIGZ1bGwgYmFycmllciBzZWVtcyB0byBjbGVhciB1cCBhIFRTQU4gZmFpbHVyZS4KKyAgICAgICAgICAgICAgICAgICAgSSdkIGhhdmUgZXhwZWN0ZWQgdGhlIHJlbF9jYXMgYmVsb3cgdG8gYmUgZW5vdWdoLCBidXQKKyAgICAgICAgICAgICAgICAgICAgc2VlbWluZ2x5IGl0J3Mgbm90LgorICAgICAgICAgICAgICAgICAgICBSZS1ldmFsdWF0ZSBpZiB3ZSByZWFsbHkgbmVlZCB0aGlzLiAqLworICBncHJfYXRtX2Z1bGxfYmFycmllcigpOworICBHUFJfQVNTRVJUKGdwcl9hdG1fcmVsX2NhcygmYy0+Y29ubmVjdGVkX3N1YmNoYW5uZWwsIDAsIChncHJfYXRtKWNvbikpOworICBjLT5jb25uZWN0aW5nID0gMDsKKworICAvKiBzZXR1cCBzdWJjaGFubmVsIHdhdGNoaW5nIGNvbm5lY3RlZCBzdWJjaGFubmVsIGZvciBjaGFuZ2VzOyBzdWJjaGFubmVsIHJlZgorICAgICBmb3IgY29ubmVjdGluZyBpcyBkb25hdGVkCisgICAgIHRvIHRoZSBzdGF0ZSB3YXRjaGVyICovCisgIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1JFRihjLCAic3RhdGVfd2F0Y2hlciIpOworICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgYywgImNvbm5lY3RpbmciKTsKKyAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAorICAgICAgZXhlY19jdHgsIGNvbiwgYy0+cG9sbHNldF9zZXQsICZzd19zdWJjaGFubmVsLT5jb25uZWN0aXZpdHlfc3RhdGUsCisgICAgICAmc3dfc3ViY2hhbm5lbC0+Y2xvc3VyZSk7CisKKyAgLyogc2lnbmFsIGNvbXBsZXRpb24gKi8KKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGV4ZWNfY3R4LCAmYy0+c3RhdGVfdHJhY2tlciwgR1JQQ19DSEFOTkVMX1JFQURZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RlZCIpOworfQorCitzdGF0aWMgdm9pZCBvbl9hbGFybShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIGlvbWdyX3N1Y2Nlc3MpIHsKKyAgZ3JwY19zdWJjaGFubmVsICpjID0gYXJnOworICBncHJfbXVfbG9jaygmYy0+bXUpOworICBjLT5oYXZlX2FsYXJtID0gMDsKKyAgaWYgKGMtPmRpc2Nvbm5lY3RlZCkgeworICAgIGlvbWdyX3N1Y2Nlc3MgPSAwOworICB9CisgIGlmIChpb21ncl9zdWNjZXNzKSB7CisgICAgYy0+bmV4dF9hdHRlbXB0ID0KKyAgICAgICAgZ3ByX2JhY2tvZmZfc3RlcCgmYy0+YmFja29mZl9zdGF0ZSwgZ3ByX25vdyhHUFJfQ0xPQ0tfTU9OT1RPTklDKSk7CisgICAgY29udGludWVfY29ubmVjdChleGVjX2N0eCwgYyk7CisgICAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICB9IGVsc2UgeworICAgIGdwcl9tdV91bmxvY2soJmMtPm11KTsKKyAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgYywgImNvbm5lY3RpbmciKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzdWJjaGFubmVsX2Nvbm5lY3RlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdWNjZXNzKSB7CisgIGdycGNfc3ViY2hhbm5lbCAqYyA9IGFyZzsKKworICBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYoYywgImNvbm5lY3RlZCIpOworICBncHJfbXVfbG9jaygmYy0+bXUpOworICBpZiAoYy0+Y29ubmVjdGluZ19yZXN1bHQudHJhbnNwb3J0ICE9IE5VTEwpIHsKKyAgICBwdWJsaXNoX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIGMpOworICB9IGVsc2UgaWYgKGMtPmRpc2Nvbm5lY3RlZCkgeworICAgIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1VOUkVGKGV4ZWNfY3R4LCBjLCAiY29ubmVjdGluZyIpOworICB9IGVsc2UgeworICAgIGdwcl90aW1lc3BlYyBub3cgPSBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpOworICAgIEdQUl9BU1NFUlQoIWMtPmhhdmVfYWxhcm0pOworICAgIGMtPmhhdmVfYWxhcm0gPSAxOworICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgJmMtPnN0YXRlX3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3RfZmFpbGVkIik7CisgICAgZ3JwY190aW1lcl9pbml0KGV4ZWNfY3R4LCAmYy0+YWxhcm0sIGMtPm5leHRfYXR0ZW1wdCwgb25fYWxhcm0sIGMsIG5vdyk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihleGVjX2N0eCwgYywgImNvbm5lY3RpbmciKTsKK30KKworLyoKKyAqIGdycGNfc3ViY2hhbm5lbF9jYWxsIGltcGxlbWVudGF0aW9uCisgKi8KKworc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9jYWxsX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmMgPSBjYWxsOworICBHUFJfVElNRVJfQkVHSU4oImdycGNfc3ViY2hhbm5lbF9jYWxsX3VucmVmLmRlc3Ryb3kiLCAwKTsKKyAgZ3JwY19jYWxsX3N0YWNrX2Rlc3Ryb3koZXhlY19jdHgsIFNVQkNIQU5ORUxfQ0FMTF9UT19DQUxMX1NUQUNLKGMpKTsKKyAgR1JQQ19DT05ORUNURURfU1VCQ0hBTk5FTF9VTlJFRihleGVjX2N0eCwgYy0+Y29ubmVjdGlvbiwgInN1YmNoYW5uZWxfY2FsbCIpOworICBncHJfZnJlZShjKTsKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19zdWJjaGFubmVsX2NhbGxfdW5yZWYuZGVzdHJveSIsIDApOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX3JlZigKKyAgICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqYyBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpIHsKKyAgR1JQQ19DQUxMX1NUQUNLX1JFRihTVUJDSEFOTkVMX0NBTExfVE9fQ0FMTF9TVEFDSyhjKSwgUkVGX1JFQVNPTik7Cit9CisKK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpIHsKKyAgR1JQQ19DQUxMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBTVUJDSEFOTkVMX0NBTExfVE9fQ0FMTF9TVEFDSyhjKSwgUkVGX1JFQVNPTik7Cit9CisKK2NoYXIgKmdycGNfc3ViY2hhbm5lbF9jYWxsX2dldF9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKmNhbGwpIHsKKyAgZ3JwY19jYWxsX3N0YWNrICpjYWxsX3N0YWNrID0gU1VCQ0hBTk5FTF9DQUxMX1RPX0NBTExfU1RBQ0soY2FsbCk7CisgIGdycGNfY2FsbF9lbGVtZW50ICp0b3BfZWxlbSA9IGdycGNfY2FsbF9zdGFja19lbGVtZW50KGNhbGxfc3RhY2ssIDApOworICByZXR1cm4gdG9wX2VsZW0tPmZpbHRlci0+Z2V0X3BlZXIoZXhlY19jdHgsIHRvcF9lbGVtKTsKK30KKwordm9pZCBncnBjX3N1YmNoYW5uZWxfY2FsbF9wcm9jZXNzX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgZ3JwY19jYWxsX3N0YWNrICpjYWxsX3N0YWNrID0gU1VCQ0hBTk5FTF9DQUxMX1RPX0NBTExfU1RBQ0soY2FsbCk7CisgIGdycGNfY2FsbF9lbGVtZW50ICp0b3BfZWxlbSA9IGdycGNfY2FsbF9zdGFja19lbGVtZW50KGNhbGxfc3RhY2ssIDApOworICB0b3BfZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGV4ZWNfY3R4LCB0b3BfZWxlbSwgb3ApOworfQorCitncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfZ2V0X2Nvbm5lY3RlZF9zdWJjaGFubmVsKAorICAgIGdycGNfc3ViY2hhbm5lbCAqYykgeworICByZXR1cm4gR0VUX0NPTk5FQ1RFRF9TVUJDSEFOTkVMKGMsIGFjcSk7Cit9CisKK2dycGNfc3ViY2hhbm5lbF9jYWxsICpncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX2NyZWF0ZV9jYWxsKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjb24sCisgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7CisgIGdycGNfY2hhbm5lbF9zdGFjayAqY2hhbnN0ayA9IENIQU5ORUxfU1RBQ0tfRlJPTV9DT05ORUNUSU9OKGNvbik7CisgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpjYWxsID0KKyAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc3ViY2hhbm5lbF9jYWxsKSArIGNoYW5zdGstPmNhbGxfc3RhY2tfc2l6ZSk7CisgIGdycGNfY2FsbF9zdGFjayAqY2FsbHN0ayA9IFNVQkNIQU5ORUxfQ0FMTF9UT19DQUxMX1NUQUNLKGNhbGwpOworICBjYWxsLT5jb25uZWN0aW9uID0gY29uOworICBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1JFRihjb24sICJzdWJjaGFubmVsX2NhbGwiKTsKKyAgZ3JwY19jYWxsX3N0YWNrX2luaXQoZXhlY19jdHgsIGNoYW5zdGssIDEsIHN1YmNoYW5uZWxfY2FsbF9kZXN0cm95LCBjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBjYWxsc3RrKTsKKyAgZ3JwY19jYWxsX3N0YWNrX3NldF9wb2xsc2V0KGV4ZWNfY3R4LCBjYWxsc3RrLCBwb2xsc2V0KTsKKyAgcmV0dXJuIGNhbGw7Cit9CisKK2dycGNfY2FsbF9zdGFjayAqZ3JwY19zdWJjaGFubmVsX2NhbGxfZ2V0X2NhbGxfc3RhY2soCisgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKnN1YmNoYW5uZWxfY2FsbCkgeworICByZXR1cm4gU1VCQ0hBTk5FTF9DQUxMX1RPX0NBTExfU1RBQ0soc3ViY2hhbm5lbF9jYWxsKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY1NDViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19TVUJDSEFOTkVMX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1NVQkNIQU5ORUxfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiCisKKy8qKiBBIChzdWItKWNoYW5uZWwgdGhhdCBrbm93cyBob3cgdG8gY29ubmVjdCB0byBleGFjdGx5IG9uZSB0YXJnZXQKKyAgICBhZGRyZXNzLiBQcm92aWRlcyBhIHRhcmdldCBmb3IgbG9hZCBiYWxhbmNpbmcuICovCit0eXBlZGVmIHN0cnVjdCBncnBjX3N1YmNoYW5uZWwgZ3JwY19zdWJjaGFubmVsOwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsOwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2NhbGwgZ3JwY19zdWJjaGFubmVsX2NhbGw7Cit0eXBlZGVmIHN0cnVjdCBncnBjX3N1YmNoYW5uZWxfYXJncyBncnBjX3N1YmNoYW5uZWxfYXJnczsKKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUYocCwgcikgXAorICBncnBjX3N1YmNoYW5uZWxfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9SRUZfRlJPTV9XRUFLX1JFRihwLCByKSBcCisgIGdycGNfc3ViY2hhbm5lbF9yZWZfZnJvbV93ZWFrX3JlZigocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfVU5SRUYoY2wsIHAsIHIpIFwKKyAgZ3JwY19zdWJjaGFubmVsX3VucmVmKChjbCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1JFRihwLCByKSBcCisgIGdycGNfc3ViY2hhbm5lbF93ZWFrX3JlZigocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihjbCwgcCwgcikgXAorICBncnBjX3N1YmNoYW5uZWxfd2Vha191bnJlZigoY2wpLCAocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQorI2RlZmluZSBHUlBDX0NPTk5FQ1RFRF9TVUJDSEFOTkVMX1JFRihwLCByKSBcCisgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfVU5SRUYoY2wsIHAsIHIpIFwKKyAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF91bnJlZigoY2wpLCAocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfQ0FMTF9SRUYocCwgcikgXAorICBncnBjX3N1YmNoYW5uZWxfY2FsbF9yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKKyNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX0NBTExfVU5SRUYoY2wsIHAsIHIpIFwKKyAgZ3JwY19zdWJjaGFubmVsX2NhbGxfdW5yZWYoKGNsKSwgKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKKyNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTIFwKKyAgLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uCisjZWxzZQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfUkVGKHAsIHIpIGdycGNfc3ViY2hhbm5lbF9yZWYoKHApKQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfUkVGX0ZST01fV0VBS19SRUYocCwgcikgXAorICBncnBjX3N1YmNoYW5uZWxfcmVmX2Zyb21fd2Vha19yZWYoKHApKQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfVU5SRUYoY2wsIHAsIHIpIGdycGNfc3ViY2hhbm5lbF91bnJlZigoY2wpLCAocCkpCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9XRUFLX1JFRihwLCByKSBncnBjX3N1YmNoYW5uZWxfd2Vha19yZWYoKHApKQorI2RlZmluZSBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihjbCwgcCwgcikgXAorICBncnBjX3N1YmNoYW5uZWxfd2Vha191bnJlZigoY2wpLCAocCkpCisjZGVmaW5lIEdSUENfQ09OTkVDVEVEX1NVQkNIQU5ORUxfUkVGKHAsIHIpIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfcmVmKChwKSkKKyNkZWZpbmUgR1JQQ19DT05ORUNURURfU1VCQ0hBTk5FTF9VTlJFRihjbCwgcCwgcikgXAorICBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3VucmVmKChjbCksIChwKSkKKyNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX0NBTExfUkVGKHAsIHIpIGdycGNfc3ViY2hhbm5lbF9jYWxsX3JlZigocCkpCisjZGVmaW5lIEdSUENfU1VCQ0hBTk5FTF9DQUxMX1VOUkVGKGNsLCBwLCByKSBcCisgIGdycGNfc3ViY2hhbm5lbF9jYWxsX3VucmVmKChjbCksIChwKSkKKyNkZWZpbmUgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTCisjZW5kaWYKKworZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfcmVmKAorICAgIGdycGNfc3ViY2hhbm5lbCAqY2hhbm5lbCBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpOworZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfcmVmX2Zyb21fd2Vha19yZWYoCisgICAgZ3JwY19zdWJjaGFubmVsICpjaGFubmVsIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7Cit2b2lkIGdycGNfc3ViY2hhbm5lbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7CitncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF93ZWFrX3JlZigKKyAgICBncnBjX3N1YmNoYW5uZWwgKmNoYW5uZWwgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKTsKK3ZvaWQgZ3JwY19zdWJjaGFubmVsX3dlYWtfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbCAqY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKTsKK3ZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9yZWYoCisgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqY2hhbm5lbCBHUlBDX1NVQkNIQU5ORUxfUkVGX0VYVFJBX0FSR1MpOwordm9pZCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKTsKK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfcmVmKAorICAgIGdycGNfc3ViY2hhbm5lbF9jYWxsICpjYWxsIEdSUENfU1VCQ0hBTk5FTF9SRUZfRVhUUkFfQVJHUyk7Cit2b2lkIGdycGNfc3ViY2hhbm5lbF9jYWxsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFRl9FWFRSQV9BUkdTKTsKKworLyoqIGNvbnN0cnVjdCBhIHN1YmNoYW5uZWwgY2FsbCAqLworZ3JwY19zdWJjaGFubmVsX2NhbGwgKmdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfY3JlYXRlX2NhbGwoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmNvbm5lY3RlZF9zdWJjaGFubmVsLAorICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7CisKKy8qKiBwcm9jZXNzIGEgdHJhbnNwb3J0IGxldmVsIG9wICovCit2b2lkIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWxfcHJvY2Vzc190cmFuc3BvcnRfb3AoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKnN1YmNoYW5uZWwsCisgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKTsKKworLyoqIHBvbGwgdGhlIGN1cnJlbnQgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgY2hhbm5lbCAqLworZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19zdWJjaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eSgKKyAgICBncnBjX3N1YmNoYW5uZWwgKmNoYW5uZWwpOworCisvKiogY2FsbCBub3RpZnkgd2hlbiB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgY2hhbm5lbCBjaGFuZ2VzIGZyb20gKnN0YXRlLgorICAgIFVwZGF0ZXMgKnN0YXRlIHdpdGggdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY2hhbm5lbCAqLwordm9pZCBncnBjX3N1YmNoYW5uZWxfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zdWJjaGFubmVsICpjaGFubmVsLAorICAgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllcywgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAorICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KTsKK3ZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsICpjaGFubmVsLAorICAgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllcywgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKnN0YXRlLAorICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KTsKK3ZvaWQgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbF9waW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0ZWRfc3ViY2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KTsKKworLyoqIHJldHJpZXZlIHRoZSBncnBjX2Nvbm5lY3RlZF9zdWJjaGFubmVsIC0gb3IgTlVMTCBpZiBjYWxsZWQgYmVmb3JlCisgICAgdGhlIHN1YmNoYW5uZWwgYmVjb21lcyBjb25uZWN0ZWQgKi8KK2dycGNfY29ubmVjdGVkX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9nZXRfY29ubmVjdGVkX3N1YmNoYW5uZWwoCisgICAgZ3JwY19zdWJjaGFubmVsICpzdWJjaGFubmVsKTsKKworLyoqIGNvbnRpbnVlIHByb2Nlc3NpbmcgYSB0cmFuc3BvcnQgb3AgKi8KK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2NhbGxfcHJvY2Vzc19vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfY2FsbCAqc3ViY2hhbm5lbF9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOworCisvKiogY29udGludWUgcXVlcnlpbmcgZm9yIHBlZXIgKi8KK2NoYXIgKmdycGNfc3ViY2hhbm5lbF9jYWxsX2dldF9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKnN1YmNoYW5uZWxfY2FsbCk7CisKK2dycGNfY2FsbF9zdGFjayAqZ3JwY19zdWJjaGFubmVsX2NhbGxfZ2V0X2NhbGxfc3RhY2soCisgICAgZ3JwY19zdWJjaGFubmVsX2NhbGwgKnN1YmNoYW5uZWxfY2FsbCk7CisKK3N0cnVjdCBncnBjX3N1YmNoYW5uZWxfYXJncyB7CisgIC8qIFdoZW4gdXBkYXRpbmcgdGhpcyBzdHJ1Y3QsIGFsc28gdXBkYXRlIHN1YmNoYW5uZWxfaW5kZXguYyAqLworCisgIC8qKiBDaGFubmVsIGZpbHRlcnMgZm9yIHRoaXMgY2hhbm5lbCAtIHdyYXBwZWQgZmFjdG9yaWVzIHdpbGwgbGlrZWx5CisgICAgICB3YW50IHRvIG11dGF0ZSB0aGlzICovCisgIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKipmaWx0ZXJzOworICAvKiogVGhlIG51bWJlciBvZiBmaWx0ZXJzIGluIHRoZSBhYm92ZSBhcnJheSAqLworICBzaXplX3QgZmlsdGVyX2NvdW50OworICAvKiogQ2hhbm5lbCBhcmd1bWVudHMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgY2hhbm5lbCAqLworICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJnczsKKyAgLyoqIEFkZHJlc3MgdG8gY29ubmVjdCB0byAqLworICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHI7CisgIHNpemVfdCBhZGRyX2xlbjsKK307CisKKy8qKiBjcmVhdGUgYSBzdWJjaGFubmVsIGdpdmVuIGEgY29ubmVjdG9yICovCitncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9jcmVhdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2E0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgiCisKK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfcmVmKGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5KiBmYWN0b3J5KSB7CisgIGZhY3RvcnktPnZ0YWJsZS0+cmVmKGZhY3RvcnkpOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3VucmVmKGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSogZmFjdG9yeSkgeworICBmYWN0b3J5LT52dGFibGUtPnVucmVmKGV4ZWNfY3R4LCBmYWN0b3J5KTsKK30KKworZ3JwY19zdWJjaGFubmVsKiBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV9jcmVhdGVfc3ViY2hhbm5lbCgKKyAgICBncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkqIGZhY3RvcnksCisgICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MqIGFyZ3MpIHsKKyAgcmV0dXJuIGZhY3RvcnktPnZ0YWJsZS0+Y3JlYXRlX3N1YmNoYW5uZWwoZXhlY19jdHgsIGZhY3RvcnksIGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmEyZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9GQUNUT1JZX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1NVQkNIQU5ORUxfRkFDVE9SWV9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeTsKK3R5cGVkZWYgc3RydWN0IGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3Z0YWJsZSBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV92dGFibGU7CisKKy8qKiBDb25zdHJ1Y3RvciBmb3IgbmV3IGNvbmZpZ3VyZWQgY2hhbm5lbHMuCisgICAgQ3JlYXRpbmcgZGVjb3JhdG9ycyBhcm91bmQgdGhpcyB0eXBlIGlzIGVuY291cmFnZWQgdG8gYWRhcHQgYmVoYXZpb3IuICovCitzdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgeworICBjb25zdCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV92dGFibGUgKnZ0YWJsZTsKK307CisKK3N0cnVjdCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV92dGFibGUgeworICB2b2lkICgqcmVmKShncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqZmFjdG9yeSk7CisgIHZvaWQgKCp1bnJlZikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpmYWN0b3J5KTsKKyAgZ3JwY19zdWJjaGFubmVsICooKmNyZWF0ZV9zdWJjaGFubmVsKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncyk7Cit9OworCit2b2lkIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3JlZihncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqZmFjdG9yeSk7Cit2b2lkIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqZmFjdG9yeSk7CisKKy8qKiBDcmVhdGUgYSBuZXcgZ3JwY19zdWJjaGFubmVsICovCitncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X2NyZWF0ZV9zdWJjaGFubmVsKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqZmFjdG9yeSwKKyAgICBncnBjX3N1YmNoYW5uZWxfYXJncyAqYXJncyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzU0NTAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jCkBAIC0wLDAgKzEsMjYyIEBACisvLworLy8KKy8vIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2F2bC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90bHMuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorCisvLyBhIG1hcCBvZiBzdWJjaGFubmVsX2tleSAtLT4gc3ViY2hhbm5lbCwgdXNlZCBmb3IgZGV0ZWN0aW5nIGNvbm5lY3Rpb25zCisvLyB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiBpbiBvcmRlciB0byBzaGFyZSB0aGVtCitzdGF0aWMgZ3ByX2F2bCBnX3N1YmNoYW5uZWxfaW5kZXg7CisKK3N0YXRpYyBncHJfbXUgZ19tdTsKKworc3RydWN0IGdycGNfc3ViY2hhbm5lbF9rZXkgeworICBncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yOworICBncnBjX3N1YmNoYW5uZWxfYXJncyBhcmdzOworfTsKKworR1BSX1RMU19ERUNMKHN1YmNoYW5uZWxfaW5kZXhfZXhlY19jdHgpOworCitzdGF0aWMgdm9pZCBlbnRlcl9jdHgoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgpIHsKKyAgR1BSX0FTU0VSVChncHJfdGxzX2dldCgmc3ViY2hhbm5lbF9pbmRleF9leGVjX2N0eCkgPT0gMCk7CisgIGdwcl90bHNfc2V0KCZzdWJjaGFubmVsX2luZGV4X2V4ZWNfY3R4LCAoaW50cHRyX3QpZXhlY19jdHgpOworfQorCitzdGF0aWMgdm9pZCBsZWF2ZV9jdHgoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgpIHsKKyAgR1BSX0FTU0VSVChncHJfdGxzX2dldCgmc3ViY2hhbm5lbF9pbmRleF9leGVjX2N0eCkgPT0gKGludHB0cl90KWV4ZWNfY3R4KTsKKyAgZ3ByX3Rsc19zZXQoJnN1YmNoYW5uZWxfaW5kZXhfZXhlY19jdHgsIDApOworfQorCitzdGF0aWMgZ3JwY19leGVjX2N0eCAqY3VycmVudF9jdHgoKSB7CisgIGdycGNfZXhlY19jdHggKmMgPSAoZ3JwY19leGVjX2N0eCAqKWdwcl90bHNfZ2V0KCZzdWJjaGFubmVsX2luZGV4X2V4ZWNfY3R4KTsKKyAgR1BSX0FTU0VSVChjICE9IE5VTEwpOworICByZXR1cm4gYzsKK30KKworc3RhdGljIGdycGNfc3ViY2hhbm5lbF9rZXkgKmNyZWF0ZV9rZXkoCisgICAgZ3JwY19jb25uZWN0b3IgKmNvbm5lY3RvciwgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MsCisgICAgZ3JwY19jaGFubmVsX2FyZ3MgKigqY29weV9jaGFubmVsX2FyZ3MpKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKSkgeworICBncnBjX3N1YmNoYW5uZWxfa2V5ICprID0gZ3ByX21hbGxvYyhzaXplb2YoKmspKTsKKyAgay0+Y29ubmVjdG9yID0gZ3JwY19jb25uZWN0b3JfcmVmKGNvbm5lY3Rvcik7CisgIGstPmFyZ3MuZmlsdGVyX2NvdW50ID0gYXJncy0+ZmlsdGVyX2NvdW50OworICBrLT5hcmdzLmZpbHRlcnMgPSBncHJfbWFsbG9jKHNpemVvZigqay0+YXJncy5maWx0ZXJzKSAqIGstPmFyZ3MuZmlsdGVyX2NvdW50KTsKKyAgbWVtY3B5KChncnBjX2NoYW5uZWxfZmlsdGVyICopay0+YXJncy5maWx0ZXJzLCBhcmdzLT5maWx0ZXJzLAorICAgICAgICAgc2l6ZW9mKCprLT5hcmdzLmZpbHRlcnMpICogay0+YXJncy5maWx0ZXJfY291bnQpOworICBrLT5hcmdzLmFkZHJfbGVuID0gYXJncy0+YWRkcl9sZW47CisgIGstPmFyZ3MuYWRkciA9IGdwcl9tYWxsb2MoYXJncy0+YWRkcl9sZW4pOworICBtZW1jcHkoay0+YXJncy5hZGRyLCBhcmdzLT5hZGRyLCBrLT5hcmdzLmFkZHJfbGVuKTsKKyAgay0+YXJncy5hcmdzID0gY29weV9jaGFubmVsX2FyZ3MoYXJncy0+YXJncyk7CisgIHJldHVybiBrOworfQorCitncnBjX3N1YmNoYW5uZWxfa2V5ICpncnBjX3N1YmNoYW5uZWxfa2V5X2NyZWF0ZShncnBjX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpIHsKKyAgcmV0dXJuIGNyZWF0ZV9rZXkoY29ubmVjdG9yLCBhcmdzLCBncnBjX2NoYW5uZWxfYXJnc19ub3JtYWxpemUpOworfQorCitzdGF0aWMgZ3JwY19zdWJjaGFubmVsX2tleSAqc3ViY2hhbm5lbF9rZXlfY29weShncnBjX3N1YmNoYW5uZWxfa2V5ICprKSB7CisgIHJldHVybiBjcmVhdGVfa2V5KGstPmNvbm5lY3RvciwgJmstPmFyZ3MsIGdycGNfY2hhbm5lbF9hcmdzX2NvcHkpOworfQorCitzdGF0aWMgaW50IHN1YmNoYW5uZWxfa2V5X2NvbXBhcmUoZ3JwY19zdWJjaGFubmVsX2tleSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfa2V5ICpiKSB7CisgIGludCBjID0gR1BSX0lDTVAoYS0+Y29ubmVjdG9yLCBiLT5jb25uZWN0b3IpOworICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKKyAgYyA9IEdQUl9JQ01QKGEtPmFyZ3MuYWRkcl9sZW4sIGItPmFyZ3MuYWRkcl9sZW4pOworICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKKyAgYyA9IEdQUl9JQ01QKGEtPmFyZ3MuZmlsdGVyX2NvdW50LCBiLT5hcmdzLmZpbHRlcl9jb3VudCk7CisgIGlmIChjICE9IDApIHJldHVybiBjOworICBjID0gbWVtY21wKGEtPmFyZ3MuYWRkciwgYi0+YXJncy5hZGRyLCBhLT5hcmdzLmFkZHJfbGVuKTsKKyAgaWYgKGMgIT0gMCkgcmV0dXJuIGM7CisgIGMgPSBtZW1jbXAoYS0+YXJncy5maWx0ZXJzLCBiLT5hcmdzLmZpbHRlcnMsCisgICAgICAgICAgICAgYS0+YXJncy5maWx0ZXJfY291bnQgKiBzaXplb2YoKmEtPmFyZ3MuZmlsdGVycykpOworICBpZiAoYyAhPSAwKSByZXR1cm4gYzsKKyAgcmV0dXJuIGdycGNfY2hhbm5lbF9hcmdzX2NvbXBhcmUoYS0+YXJncy5hcmdzLCBiLT5hcmdzLmFyZ3MpOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF9rZXlfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmspIHsKKyAgZ3JwY19jb25uZWN0b3JfdW5yZWYoZXhlY19jdHgsIGstPmNvbm5lY3Rvcik7CisgIGdwcl9mcmVlKGstPmFyZ3MuYWRkcik7CisgIGdwcl9mcmVlKChncnBjX2NoYW5uZWxfYXJncyAqKWstPmFyZ3MuZmlsdGVycyk7CisgIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koKGdycGNfY2hhbm5lbF9hcmdzICopay0+YXJncy5hcmdzKTsKKyAgZ3ByX2ZyZWUoayk7Cit9CisKK3N0YXRpYyB2b2lkIHNja19hdmxfZGVzdHJveSh2b2lkICpwKSB7CisgIGdycGNfc3ViY2hhbm5lbF9rZXlfZGVzdHJveShjdXJyZW50X2N0eCgpLCBwKTsKK30KKworc3RhdGljIHZvaWQgKnNja19hdmxfY29weSh2b2lkICpwKSB7IHJldHVybiBzdWJjaGFubmVsX2tleV9jb3B5KHApOyB9CisKK3N0YXRpYyBsb25nIHNja19hdmxfY29tcGFyZSh2b2lkICphLCB2b2lkICpiKSB7CisgIHJldHVybiBzdWJjaGFubmVsX2tleV9jb21wYXJlKGEsIGIpOworfQorCitzdGF0aWMgdm9pZCBzY3ZfYXZsX2Rlc3Ryb3kodm9pZCAqcCkgeworICBHUlBDX1NVQkNIQU5ORUxfV0VBS19VTlJFRihjdXJyZW50X2N0eCgpLCBwLCAic3ViY2hhbm5lbF9pbmRleCIpOworfQorCitzdGF0aWMgdm9pZCAqc2N2X2F2bF9jb3B5KHZvaWQgKnApIHsKKyAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfUkVGKHAsICJzdWJjaGFubmVsX2luZGV4Iik7CisgIHJldHVybiBwOworfQorCitzdGF0aWMgY29uc3QgZ3ByX2F2bF92dGFibGUgc3ViY2hhbm5lbF9hdmxfdnRhYmxlID0geworICAgIC5kZXN0cm95X2tleSA9IHNja19hdmxfZGVzdHJveSwKKyAgICAuY29weV9rZXkgPSBzY2tfYXZsX2NvcHksCisgICAgLmNvbXBhcmVfa2V5cyA9IHNja19hdmxfY29tcGFyZSwKKyAgICAuZGVzdHJveV92YWx1ZSA9IHNjdl9hdmxfZGVzdHJveSwKKyAgICAuY29weV92YWx1ZSA9IHNjdl9hdmxfY29weX07CisKK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2luZGV4X2luaXQodm9pZCkgeworICBnX3N1YmNoYW5uZWxfaW5kZXggPSBncHJfYXZsX2NyZWF0ZSgmc3ViY2hhbm5lbF9hdmxfdnRhYmxlKTsKKyAgZ3ByX211X2luaXQoJmdfbXUpOworICBncHJfdGxzX2luaXQoJnN1YmNoYW5uZWxfaW5kZXhfZXhlY19jdHgpOworfQorCit2b2lkIGdycGNfc3ViY2hhbm5lbF9pbmRleF9zaHV0ZG93bih2b2lkKSB7CisgIGdwcl9tdV9kZXN0cm95KCZnX211KTsKKyAgZ3ByX2F2bF91bnJlZihnX3N1YmNoYW5uZWxfaW5kZXgpOworICBncHJfdGxzX2Rlc3Ryb3koJnN1YmNoYW5uZWxfaW5kZXhfZXhlY19jdHgpOworfQorCitncnBjX3N1YmNoYW5uZWwgKmdycGNfc3ViY2hhbm5lbF9pbmRleF9maW5kKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfa2V5ICprZXkpIHsKKyAgZW50ZXJfY3R4KGV4ZWNfY3R4KTsKKworICAvLyBMb2NrLCBhbmQgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgc3ViY2hhbm5lbCBpbmRleC4KKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgc2VhcmNoIHVuZGVyIGEgbG9jayBhcyBhdmwncyBhcmUgaW1tdXRhYmxlLgorICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGdwcl9hdmwgaW5kZXggPSBncHJfYXZsX3JlZihnX3N1YmNoYW5uZWxfaW5kZXgpOworICBncHJfbXVfdW5sb2NrKCZnX211KTsKKworICBncnBjX3N1YmNoYW5uZWwgKmMgPQorICAgICAgR1JQQ19TVUJDSEFOTkVMX1JFRl9GUk9NX1dFQUtfUkVGKGdwcl9hdmxfZ2V0KGluZGV4LCBrZXkpLCAiaW5kZXhfZmluZCIpOworICBncHJfYXZsX3VucmVmKGluZGV4KTsKKworICBsZWF2ZV9jdHgoZXhlY19jdHgpOworICByZXR1cm4gYzsKK30KKworZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfaW5kZXhfcmVnaXN0ZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWxfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmNvbnN0cnVjdGVkKSB7CisgIGVudGVyX2N0eChleGVjX2N0eCk7CisKKyAgZ3JwY19zdWJjaGFubmVsICpjID0gTlVMTDsKKworICB3aGlsZSAoYyA9PSBOVUxMKSB7CisgICAgLy8gQ29tcGFyZSBhbmQgc3dhcCBsb29wOgorICAgIC8vIC0gdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbmRleAorICAgIGdwcl9tdV9sb2NrKCZnX211KTsKKyAgICBncHJfYXZsIGluZGV4ID0gZ3ByX2F2bF9yZWYoZ19zdWJjaGFubmVsX2luZGV4KTsKKyAgICBncHJfbXVfdW5sb2NrKCZnX211KTsKKworICAgIC8vIC0gQ2hlY2sgdG8gc2VlIGlmIGEgc3ViY2hhbm5lbCBhbHJlYWR5IGV4aXN0cworICAgIGMgPSBncHJfYXZsX2dldChpbmRleCwga2V5KTsKKyAgICBpZiAoYyAhPSBOVUxMKSB7CisgICAgICAvLyB5ZXMgLT4gd2UncmUgZG9uZQorICAgICAgR1JQQ19TVUJDSEFOTkVMX1dFQUtfVU5SRUYoZXhlY19jdHgsIGNvbnN0cnVjdGVkLCAiaW5kZXhfcmVnaXN0ZXIiKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gbm8gLT4gdXBkYXRlIHRoZSBhdmwgYW5kIGNvbXBhcmUvc3dhcAorICAgICAgZ3ByX2F2bCB1cGRhdGVkID0KKyAgICAgICAgICBncHJfYXZsX2FkZChncHJfYXZsX3JlZihpbmRleCksIHN1YmNoYW5uZWxfa2V5X2NvcHkoa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICBHUlBDX1NVQkNIQU5ORUxfV0VBS19SRUYoY29uc3RydWN0ZWQsICJpbmRleF9yZWdpc3RlciIpKTsKKworICAgICAgLy8gaXQgbWF5IGhhcHBlbiAoYnV0IGl0J3MgZXhwZWN0ZWQgdG8gYmUgdW5saWtlbHkpCisgICAgICAvLyB0aGF0IHNvbWUgb3RoZXIgdGhyZWFkIGhhcyBjaGFuZ2VkIHRoZSBpbmRleDoKKyAgICAgIC8vIGNvbXBhcmUvc3dhcCBoZXJlIHRvIGNoZWNrIHRoYXQsIGFuZCByZXRyeSBhcyBuZWNlc3NhcnkKKyAgICAgIGdwcl9tdV9sb2NrKCZnX211KTsKKyAgICAgIGlmIChpbmRleC5yb290ID09IGdfc3ViY2hhbm5lbF9pbmRleC5yb290KSB7CisgICAgICAgIEdQUl9TV0FQKGdwcl9hdmwsIHVwZGF0ZWQsIGdfc3ViY2hhbm5lbF9pbmRleCk7CisgICAgICAgIGMgPSBjb25zdHJ1Y3RlZDsKKyAgICAgIH0KKyAgICAgIGdwcl9tdV91bmxvY2soJmdfbXUpOworCisgICAgICBncHJfYXZsX3VucmVmKHVwZGF0ZWQpOworICAgIH0KKyAgICBncHJfYXZsX3VucmVmKGluZGV4KTsKKyAgfQorCisgIGxlYXZlX2N0eChleGVjX2N0eCk7CisKKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2luZGV4X3VucmVnaXN0ZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsICpjb25zdHJ1Y3RlZCkgeworICBlbnRlcl9jdHgoZXhlY19jdHgpOworCisgIGJvb2wgZG9uZSA9IGZhbHNlOworICB3aGlsZSAoIWRvbmUpIHsKKyAgICAvLyBDb21wYXJlIGFuZCBzd2FwIGxvb3A6CisgICAgLy8gLSB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluZGV4CisgICAgZ3ByX211X2xvY2soJmdfbXUpOworICAgIGdwcl9hdmwgaW5kZXggPSBncHJfYXZsX3JlZihnX3N1YmNoYW5uZWxfaW5kZXgpOworICAgIGdwcl9tdV91bmxvY2soJmdfbXUpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMga2V5IHN0aWxsIHJlZmVycyB0byB0aGUgcHJldmlvdXNseQorICAgIC8vIHJlZ2lzdGVyZWQgc3ViY2hhbm5lbAorICAgIGdycGNfc3ViY2hhbm5lbCAqYyA9IGdwcl9hdmxfZ2V0KGluZGV4LCBrZXkpOworICAgIGlmIChjICE9IGNvbnN0cnVjdGVkKSB7CisgICAgICBncHJfYXZsX3VucmVmKGluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNvbXBhcmUgYW5kIHN3YXAgdGhlIHVwZGF0ZSAoc29tZSBvdGhlciB0aHJlYWQgbWF5IGhhdmUKKyAgICAvLyBtdXRhdGVkIHRoZSBpbmRleCBiZWhpbmQgdXMpCisgICAgZ3ByX2F2bCB1cGRhdGVkID0gZ3ByX2F2bF9yZW1vdmUoZ3ByX2F2bF9yZWYoaW5kZXgpLCBrZXkpOworCisgICAgZ3ByX211X2xvY2soJmdfbXUpOworICAgIGlmIChpbmRleC5yb290ID09IGdfc3ViY2hhbm5lbF9pbmRleC5yb290KSB7CisgICAgICBHUFJfU1dBUChncHJfYXZsLCB1cGRhdGVkLCBnX3N1YmNoYW5uZWxfaW5kZXgpOworICAgICAgZG9uZSA9IHRydWU7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJmdfbXUpOworCisgICAgZ3ByX2F2bF91bnJlZih1cGRhdGVkKTsKKyAgICBncHJfYXZsX3VucmVmKGluZGV4KTsKKyAgfQorCisgIGxlYXZlX2N0eChleGVjX2N0eCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmggYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1ZjAzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaApAQCAtMCwwICsxLDc3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfU1VCQ0hBTk5FTF9JTkRFWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19TVUJDSEFOTkVMX0lOREVYX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKKworLyoqIFxmaWxlIFByb3ZpZGVzIGFuIGluZGV4IG9mIGFjdGl2ZSBzdWJjaGFubmVscyBzbyB0aGF0IHRoZXkgY2FuIGJlCisgICAgc2hhcmVkIGFtb25nc3QgY2hhbm5lbHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19zdWJjaGFubmVsX2tleSBncnBjX3N1YmNoYW5uZWxfa2V5OworCisvKiogQ3JlYXRlIGEga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBzdWJjaGFubmVsICovCitncnBjX3N1YmNoYW5uZWxfa2V5ICpncnBjX3N1YmNoYW5uZWxfa2V5X2NyZWF0ZShncnBjX2Nvbm5lY3RvciAqY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpOworCisvKiogRGVzdHJveSBhIHN1YmNoYW5uZWwga2V5ICovCit2b2lkIGdycGNfc3ViY2hhbm5lbF9rZXlfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3ViY2hhbm5lbF9rZXkgKmtleSk7CisKKy8qKiBHaXZlbiBhIHN1YmNoYW5uZWwga2V5LCBmaW5kIHRoZSBzdWJjaGFubmVsIHJlZ2lzdGVyZWQgZm9yIGl0LgorICAgIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIGNoYW5uZWwgZXhpc3RzLgorICAgIFRocmVhZC1zYWZlLiAqLworZ3JwY19zdWJjaGFubmVsICpncnBjX3N1YmNoYW5uZWxfaW5kZXhfZmluZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5KTsKKworLyoqIFJlZ2lzdGVyIGEgc3ViY2hhbm5lbCBhZ2FpbnN0IGEga2V5LgorICAgIFRha2VzIG93bmVyc2hpcCBvZiBcYSBjb25zdHJ1Y3RlZC4KKyAgICBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIHN1YmNoYW5uZWwuIFRoaXMgbWF5IGJlIGRpZmZlcmVudCBmcm9tCisgICAgXGEgY29uc3RydWN0ZWQgaW4gdGhlIGNhc2Ugb2YgYSByZWdpc3RyYXRpb24gcmFjZS4gKi8KK2dycGNfc3ViY2hhbm5lbCAqZ3JwY19zdWJjaGFubmVsX2luZGV4X3JlZ2lzdGVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsICpjb25zdHJ1Y3RlZCk7CisKKy8qKiBSZW1vdmUgXGEgY29uc3RydWN0ZWQgYXMgdGhlIHJlZ2lzdGVyZWQgc3ViY2hhbm5lbCBmb3IgXGEga2V5LiAqLwordm9pZCBncnBjX3N1YmNoYW5uZWxfaW5kZXhfdW5yZWdpc3RlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N1YmNoYW5uZWwgKmNvbnN0cnVjdGVkKTsKKworLyoqIEluaXRpYWxpemUgdGhlIHN1YmNoYW5uZWwgaW5kZXggKGdsb2JhbCkgKi8KK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2luZGV4X2luaXQodm9pZCk7CisvKiogU2h1dGRvd24gdGhlIHN1YmNoYW5uZWwgaW5kZXggKGdsb2JhbCkgKi8KK3ZvaWQgZ3JwY19zdWJjaGFubmVsX2luZGV4X3NodXRkb3duKHZvaWQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1NVQkNIQU5ORUxfSU5ERVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjI4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisvKiogYSBzaXplX3QgZGVmYXVsdCB2YWx1ZS4uLiBtYXBzIHRvIGFsbCAxJ3MgKi8KKyNkZWZpbmUgTk9UX1NFVCAofihzaXplX3QpMCkKKworc3RhdGljIGdycGNfdXJpICpiYWRfdXJpKGNvbnN0IGNoYXIgKnVyaV90ZXh0LCBzaXplX3QgcG9zLCBjb25zdCBjaGFyICpzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXBwcmVzc19lcnJvcnMpIHsKKyAgY2hhciAqbGluZV9wcmVmaXg7CisgIHNpemVfdCBwZnhfbGVuOworCisgIGlmICghc3VwcHJlc3NfZXJyb3JzKSB7CisgICAgZ3ByX2FzcHJpbnRmKCZsaW5lX3ByZWZpeCwgImJhZCB1cmkuJXM6ICciLCBzZWN0aW9uKTsKKyAgICBwZnhfbGVuID0gc3RybGVuKGxpbmVfcHJlZml4KSArIHBvczsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzJXMnIiwgbGluZV9wcmVmaXgsIHVyaV90ZXh0KTsKKyAgICBncHJfZnJlZShsaW5lX3ByZWZpeCk7CisKKyAgICBsaW5lX3ByZWZpeCA9IGdwcl9tYWxsb2MocGZ4X2xlbiArIDEpOworICAgIG1lbXNldChsaW5lX3ByZWZpeCwgJyAnLCBwZnhfbGVuKTsKKyAgICBsaW5lX3ByZWZpeFtwZnhfbGVuXSA9IDA7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlc14gaGVyZSIsIGxpbmVfcHJlZml4KTsKKyAgICBncHJfZnJlZShsaW5lX3ByZWZpeCk7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyoqIFJldHVybnMgYSBjb3B5IG9mIFxhIHNyY1tiZWdpbiwgZW5kKSAqLworc3RhdGljIGNoYXIgKmNvcHlfY29tcG9uZW50KGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kKSB7CisgIGNoYXIgKm91dCA9IGdwcl9tYWxsb2MoZW5kIC0gYmVnaW4gKyAxKTsKKyAgbWVtY3B5KG91dCwgc3JjICsgYmVnaW4sIGVuZCAtIGJlZ2luKTsKKyAgb3V0W2VuZCAtIGJlZ2luXSA9IDA7CisgIHJldHVybiBvdXQ7Cit9CisKKy8qKiBSZXR1cm5zIGhvdyBtYW55IGNoYXJzIHRvIGFkdmFuY2UgaWYgXGEgdXJpX3RleHRbaV0gYmVnaW5zIGEgdmFsaWQgXGEgcGNoYXIKKyAqIHByb2R1Y3Rpb24uIElmIFxhIHVyaV90ZXh0W2ldIGludHJvZHVjZXMgYW4gaW52YWxpZCBcYSBwY2hhciAoc3VjaCBhcyBwZXJjZW50CisgKiBzaWduIG5vdCBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cyksIE5PVF9TRVQgaXMgcmV0dXJuZWQuICovCitzdGF0aWMgc2l6ZV90IHBhcnNlX3BjaGFyKGNvbnN0IGNoYXIgKnVyaV90ZXh0LCBzaXplX3QgaSkgeworICAvKiBwY2hhciA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgLyAiQCIKKyAgICogdW5yZXNlcnZlZCA9IEFMUEhBIC8gRElHSVQgLyAiLSIgLyAiLiIgLyAiXyIgLyAifiIKKyAgICogcGN0LWVuY29kZWQgPSAiJSIgSEVYRElHIEhFWERJRworICAgKiBzdWItZGVsaW1zID0gIiEiIC8gIiQiIC8gIiYiIC8gIiciIC8gIigiIC8gIikiCisgICAvICIqIiAvICIrIiAvICIsIiAvICI7IiAvICI9IiAqLworICBjaGFyIGMgPSB1cmlfdGV4dFtpXTsKKyAgaWYgKCgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHx8ICgoYyA+PSAnYScpICYmIChjIDw9ICd6JykpIHx8CisgICAgICAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB8fAorICAgICAgKGMgPT0gJy0nIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ18nIHx8IGMgPT0gJ34nKSB8fCAvKiB1bnJlc2VydmVkICovCisgICAgICAoYyA9PSAnIScgfHwgYyA9PSAnJCcgfHwgYyA9PSAnJicgfHwgYyA9PSAnXCcnIHx8IGMgPT0gJyQnIHx8IGMgPT0gJyYnIHx8CisgICAgICAgYyA9PSAnKCcgfHwgYyA9PSAnKScgfHwgYyA9PSAnKicgfHwgYyA9PSAnKycgfHwgYyA9PSAnLCcgfHwgYyA9PSAnOycgfHwKKyAgICAgICBjID09ICc9JykgLyogc3ViLWRlbGltcyAqLykgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChjID09ICclJykgeyAvKiBwY3QtZW5jb2RlZCAqLworICAgIHNpemVfdCBqOworICAgIGlmICh1cmlfdGV4dFtpICsgMV0gPT0gMCB8fCB1cmlfdGV4dFtpICsgMl0gPT0gMCkgeworICAgICAgcmV0dXJuIE5PVF9TRVQ7CisgICAgfQorICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgMjsgaisrKSB7CisgICAgICBjID0gdXJpX3RleHRbal07CisgICAgICBpZiAoISgoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB8fCAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKSB8fAorICAgICAgICAgICAgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkpKSB7CisgICAgICAgIHJldHVybiBOT1RfU0VUOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMjsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogKiggcGNoYXIgLyAiPyIgLyAiLyIgKSAqLworc3RhdGljIGludCBwYXJzZV9mcmFnbWVudF9vcl9xdWVyeShjb25zdCBjaGFyICp1cmlfdGV4dCwgc2l6ZV90ICppKSB7CisgIGNoYXIgYzsKKyAgd2hpbGUgKChjID0gdXJpX3RleHRbKmldKSAhPSAwKSB7CisgICAgY29uc3Qgc2l6ZV90IGFkdmFuY2UgPSBwYXJzZV9wY2hhcih1cmlfdGV4dCwgKmkpOyAvKiBwY2hhciAqLworICAgIHN3aXRjaCAoYWR2YW5jZSkgeworICAgICAgY2FzZSAwOiAvKiB1cmlfdGV4dFtpXSBpc24ndCBpbiBwY2hhciAqLworICAgICAgICAvKiBtYXliZSBpdCdzID8gb3IgLyAqLworICAgICAgICBpZiAodXJpX3RleHRbKmldID09ICc/JyB8fCB1cmlfdGV4dFsqaV0gPT0gJy8nKSB7CisgICAgICAgICAgKCppKSsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICgqaSkgKz0gYWR2YW5jZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5PVF9TRVQ6IC8qIHVyaV90ZXh0W2ldIGludHJvZHVjZXMgYW4gaW52YWxpZCBVUkkgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIC8qICppIGlzIHRoZSBmaXJzdCB1cmlfdGV4dCBwb3NpdGlvbiBwYXN0IHRoZSBcYSBxdWVyeSBwcm9kdWN0aW9uLCBtYXliZSBcMCAqLworICByZXR1cm4gMTsKK30KKworZ3JwY191cmkgKmdycGNfdXJpX3BhcnNlKGNvbnN0IGNoYXIgKnVyaV90ZXh0LCBpbnQgc3VwcHJlc3NfZXJyb3JzKSB7CisgIGdycGNfdXJpICp1cmk7CisgIHNpemVfdCBzY2hlbWVfYmVnaW4gPSAwOworICBzaXplX3Qgc2NoZW1lX2VuZCA9IE5PVF9TRVQ7CisgIHNpemVfdCBhdXRob3JpdHlfYmVnaW4gPSBOT1RfU0VUOworICBzaXplX3QgYXV0aG9yaXR5X2VuZCA9IE5PVF9TRVQ7CisgIHNpemVfdCBwYXRoX2JlZ2luID0gTk9UX1NFVDsKKyAgc2l6ZV90IHBhdGhfZW5kID0gTk9UX1NFVDsKKyAgc2l6ZV90IHF1ZXJ5X2JlZ2luID0gTk9UX1NFVDsKKyAgc2l6ZV90IHF1ZXJ5X2VuZCA9IE5PVF9TRVQ7CisgIHNpemVfdCBmcmFnbWVudF9iZWdpbiA9IE5PVF9TRVQ7CisgIHNpemVfdCBmcmFnbWVudF9lbmQgPSBOT1RfU0VUOworICBzaXplX3QgaTsKKworICBmb3IgKGkgPSBzY2hlbWVfYmVnaW47IHVyaV90ZXh0W2ldICE9IDA7IGkrKykgeworICAgIGlmICh1cmlfdGV4dFtpXSA9PSAnOicpIHsKKyAgICAgIHNjaGVtZV9lbmQgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh1cmlfdGV4dFtpXSA+PSAnYScgJiYgdXJpX3RleHRbaV0gPD0gJ3onKSBjb250aW51ZTsKKyAgICBpZiAodXJpX3RleHRbaV0gPj0gJ0EnICYmIHVyaV90ZXh0W2ldIDw9ICdaJykgY29udGludWU7CisgICAgaWYgKGkgIT0gc2NoZW1lX2JlZ2luKSB7CisgICAgICBpZiAodXJpX3RleHRbaV0gPj0gJzAnICYmIHVyaV90ZXh0W2ldIDw9ICc5JykgY29udGludWU7CisgICAgICBpZiAodXJpX3RleHRbaV0gPT0gJysnKSBjb250aW51ZTsKKyAgICAgIGlmICh1cmlfdGV4dFtpXSA9PSAnLScpIGNvbnRpbnVlOworICAgICAgaWYgKHVyaV90ZXh0W2ldID09ICcuJykgY29udGludWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGlmIChzY2hlbWVfZW5kID09IE5PVF9TRVQpIHsKKyAgICByZXR1cm4gYmFkX3VyaSh1cmlfdGV4dCwgaSwgInNjaGVtZSIsIHN1cHByZXNzX2Vycm9ycyk7CisgIH0KKworICBpZiAodXJpX3RleHRbc2NoZW1lX2VuZCArIDFdID09ICcvJyAmJiB1cmlfdGV4dFtzY2hlbWVfZW5kICsgMl0gPT0gJy8nKSB7CisgICAgYXV0aG9yaXR5X2JlZ2luID0gc2NoZW1lX2VuZCArIDM7CisgICAgZm9yIChpID0gYXV0aG9yaXR5X2JlZ2luOyB1cmlfdGV4dFtpXSAhPSAwICYmIGF1dGhvcml0eV9lbmQgPT0gTk9UX1NFVDsKKyAgICAgICAgIGkrKykgeworICAgICAgaWYgKHVyaV90ZXh0W2ldID09ICcvJyB8fCB1cmlfdGV4dFtpXSA9PSAnPycgfHwgdXJpX3RleHRbaV0gPT0gJyMnKSB7CisgICAgICAgIGF1dGhvcml0eV9lbmQgPSBpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYXV0aG9yaXR5X2VuZCA9PSBOT1RfU0VUICYmIHVyaV90ZXh0W2ldID09IDApIHsKKyAgICAgIGF1dGhvcml0eV9lbmQgPSBpOworICAgIH0KKyAgICBpZiAoYXV0aG9yaXR5X2VuZCA9PSBOT1RfU0VUKSB7CisgICAgICByZXR1cm4gYmFkX3VyaSh1cmlfdGV4dCwgaSwgImF1dGhvcml0eSIsIHN1cHByZXNzX2Vycm9ycyk7CisgICAgfQorICAgIC8qIFRPRE8oY3RpbGxlcik6IHBhcnNlIHRoZSBhdXRob3JpdHkgY29ycmVjdGx5ICovCisgICAgcGF0aF9iZWdpbiA9IGF1dGhvcml0eV9lbmQ7CisgIH0gZWxzZSB7CisgICAgcGF0aF9iZWdpbiA9IHNjaGVtZV9lbmQgKyAxOworICB9CisKKyAgZm9yIChpID0gcGF0aF9iZWdpbjsgdXJpX3RleHRbaV0gIT0gMDsgaSsrKSB7CisgICAgaWYgKHVyaV90ZXh0W2ldID09ICc/JyB8fCB1cmlfdGV4dFtpXSA9PSAnIycpIHsKKyAgICAgIHBhdGhfZW5kID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocGF0aF9lbmQgPT0gTk9UX1NFVCAmJiB1cmlfdGV4dFtpXSA9PSAwKSB7CisgICAgcGF0aF9lbmQgPSBpOworICB9CisgIGlmIChwYXRoX2VuZCA9PSBOT1RfU0VUKSB7CisgICAgcmV0dXJuIGJhZF91cmkodXJpX3RleHQsIGksICJwYXRoIiwgc3VwcHJlc3NfZXJyb3JzKTsKKyAgfQorCisgIGlmICh1cmlfdGV4dFtpXSA9PSAnPycpIHsKKyAgICBxdWVyeV9iZWdpbiA9ICsraTsKKyAgICBpZiAoIXBhcnNlX2ZyYWdtZW50X29yX3F1ZXJ5KHVyaV90ZXh0LCAmaSkpIHsKKyAgICAgIHJldHVybiBiYWRfdXJpKHVyaV90ZXh0LCBpLCAicXVlcnkiLCBzdXBwcmVzc19lcnJvcnMpOworICAgIH0gZWxzZSBpZiAodXJpX3RleHRbaV0gIT0gMCAmJiB1cmlfdGV4dFtpXSAhPSAnIycpIHsKKyAgICAgIC8qIFdlIG11c3QgYmUgYXQgdGhlIGVuZCBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZnJhZ21lbnQgKi8KKyAgICAgIHJldHVybiBiYWRfdXJpKHVyaV90ZXh0LCBpLCAicXVlcnkiLCBzdXBwcmVzc19lcnJvcnMpOworICAgIH0KKyAgICBxdWVyeV9lbmQgPSBpOworICB9CisgIGlmICh1cmlfdGV4dFtpXSA9PSAnIycpIHsKKyAgICBmcmFnbWVudF9iZWdpbiA9ICsraTsKKyAgICBpZiAoIXBhcnNlX2ZyYWdtZW50X29yX3F1ZXJ5KHVyaV90ZXh0LCAmaSkpIHsKKyAgICAgIHJldHVybiBiYWRfdXJpKHVyaV90ZXh0LCBpIC0gZnJhZ21lbnRfZW5kLCAiZnJhZ21lbnQiLCBzdXBwcmVzc19lcnJvcnMpOworICAgIH0gZWxzZSBpZiAodXJpX3RleHRbaV0gIT0gMCkgeworICAgICAgLyogV2UgbXVzdCBiZSBhdCB0aGUgZW5kICovCisgICAgICByZXR1cm4gYmFkX3VyaSh1cmlfdGV4dCwgaSwgImZyYWdtZW50Iiwgc3VwcHJlc3NfZXJyb3JzKTsKKyAgICB9CisgICAgZnJhZ21lbnRfZW5kID0gaTsKKyAgfQorCisgIHVyaSA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp1cmkpKTsKKyAgbWVtc2V0KHVyaSwgMCwgc2l6ZW9mKCp1cmkpKTsKKyAgdXJpLT5zY2hlbWUgPSBjb3B5X2NvbXBvbmVudCh1cmlfdGV4dCwgc2NoZW1lX2JlZ2luLCBzY2hlbWVfZW5kKTsKKyAgdXJpLT5hdXRob3JpdHkgPSBjb3B5X2NvbXBvbmVudCh1cmlfdGV4dCwgYXV0aG9yaXR5X2JlZ2luLCBhdXRob3JpdHlfZW5kKTsKKyAgdXJpLT5wYXRoID0gY29weV9jb21wb25lbnQodXJpX3RleHQsIHBhdGhfYmVnaW4sIHBhdGhfZW5kKTsKKyAgdXJpLT5xdWVyeSA9IGNvcHlfY29tcG9uZW50KHVyaV90ZXh0LCBxdWVyeV9iZWdpbiwgcXVlcnlfZW5kKTsKKyAgdXJpLT5mcmFnbWVudCA9IGNvcHlfY29tcG9uZW50KHVyaV90ZXh0LCBmcmFnbWVudF9iZWdpbiwgZnJhZ21lbnRfZW5kKTsKKworICByZXR1cm4gdXJpOworfQorCit2b2lkIGdycGNfdXJpX2Rlc3Ryb3koZ3JwY191cmkgKnVyaSkgeworICBpZiAoIXVyaSkgcmV0dXJuOworICBncHJfZnJlZSh1cmktPnNjaGVtZSk7CisgIGdwcl9mcmVlKHVyaS0+YXV0aG9yaXR5KTsKKyAgZ3ByX2ZyZWUodXJpLT5wYXRoKTsKKyAgZ3ByX2ZyZWUodXJpLT5xdWVyeSk7CisgIGdwcl9mcmVlKHVyaS0+ZnJhZ21lbnQpOworICBncHJfZnJlZSh1cmkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIGIvc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MGQ0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NMSUVOVF9DT05GSUdfVVJJX1BBUlNFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ0xJRU5UX0NPTkZJR19VUklfUEFSU0VSX0gKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpzY2hlbWU7CisgIGNoYXIgKmF1dGhvcml0eTsKKyAgY2hhciAqcGF0aDsKKyAgY2hhciAqcXVlcnk7CisgIGNoYXIgKmZyYWdtZW50OworfSBncnBjX3VyaTsKKworLyoqIHBhcnNlIGEgdXJpLCByZXR1cm4gTlVMTCBvbiBmYWlsdXJlICovCitncnBjX3VyaSAqZ3JwY191cmlfcGFyc2UoY29uc3QgY2hhciAqdXJpX3RleHQsIGludCBzdXBwcmVzc19lcnJvcnMpOworCisvKiogZGVzdHJveSBhIHVyaSAqLwordm9pZCBncnBjX3VyaV9kZXN0cm95KGdycGNfdXJpICp1cmkpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DTElFTlRfQ09ORklHX1VSSV9QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIGIvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjMzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0NPTVBSRVNTSU9OX0FMR09SSVRITV9NRVRBREFUQV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ09NUFJFU1NJT05fQUxHT1JJVEhNX01FVEFEQVRBX0gKKworI2luY2x1ZGUgPGdycGMvY29tcHJlc3Npb24uaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmgiCisKKy8qKiBSZXR1cm4gY29tcHJlc3Npb24gYWxnb3JpdGhtIGJhc2VkIG1ldGFkYXRhIHZhbHVlICovCitncnBjX21kc3RyICpncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9tZHN0cigKKyAgICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pOworCisvKiogUmV0dXJuIGNvbXByZXNzaW9uIGFsZ29yaXRobSBiYXNlZCBtZXRhZGF0YSBlbGVtZW50IChncnBjLWVuY29kaW5nOiB4eHgpICovCitncnBjX21kZWxlbSAqZ3JwY19jb21wcmVzc2lvbl9lbmNvZGluZ19tZGVsZW0oCisgICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtKTsKKworLyoqIEZpbmQgY29tcHJlc3Npb24gYWxnb3JpdGhtIGJhc2VkIG9uIHBhc3NlZCBpbiBtZHN0ciAtIHJldHVybnMKKyAqIEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNX0NPVU5UIG9uIGZhaWx1cmUgKi8KK2dycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX2Zyb21fbWRzdHIoCisgICAgZ3JwY19tZHN0ciAqc3RyKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfQ09NUFJFU1NJT05fQUxHT1JJVEhNX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyBiL3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzgxYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL2NvbXByZXNzaW9uLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCisKK2ludCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9wYXJzZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gKmFsZ29yaXRobSkgeworICAvKiB3ZSB1c2Ugc3RybmNtcCBub3Qgb25seSBiZWNhdXNlIGl0J3Mgc2FmZXIgKGV2ZW4gdGhvdWdoIGluIHRoaXMgY2FzZSBpdAorICAgKiBkb2Vzbid0IG1hdHRlciwgZ2l2ZW4gdGhhdCB3ZSBhcmUgY29tcGFyaW5nIGFnYWluc3Qgc3RyaW5nIGxpdGVyYWxzLCBidXQKKyAgICogYmVjYXVzZSB0aGlzIHdheSB3ZSBuZWVkbid0IGhhdmUgIm5hbWUiIG5pbC10ZXJtaW5hdGVkICh1c2VmdWwgZm9yIHNsaWNlCisgICAqIGRhdGEsIGZvciBleGFtcGxlKSAqLworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9wYXJzZSgiCisgICAgICAibmFtZT0lKi4qcywgbmFtZV9sZW5ndGg9JWx1LCBhbGdvcml0aG09JXApIiwKKyAgICAgIDUsICgoaW50KW5hbWVfbGVuZ3RoLCAoaW50KW5hbWVfbGVuZ3RoLCBuYW1lLCAodW5zaWduZWQgbG9uZyluYW1lX2xlbmd0aCwKKyAgICAgICAgICBhbGdvcml0aG0pKTsKKyAgaWYgKG5hbWVfbGVuZ3RoID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoc3RybmNtcChuYW1lLCAiaWRlbnRpdHkiLCBuYW1lX2xlbmd0aCkgPT0gMCkgeworICAgICphbGdvcml0aG0gPSBHUlBDX0NPTVBSRVNTX05PTkU7CisgIH0gZWxzZSBpZiAoc3RybmNtcChuYW1lLCAiZ3ppcCIsIG5hbWVfbGVuZ3RoKSA9PSAwKSB7CisgICAgKmFsZ29yaXRobSA9IEdSUENfQ09NUFJFU1NfR1pJUDsKKyAgfSBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJkZWZsYXRlIiwgbmFtZV9sZW5ndGgpID09IDApIHsKKyAgICAqYWxnb3JpdGhtID0gR1JQQ19DT01QUkVTU19ERUZMQVRFOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fbmFtZShncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbmFtZSkgeworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fcGFyc2UoYWxnb3JpdGhtPSVkLCBuYW1lPSVwKSIsIDIsCisgICAgICAgICAgICAgICAgICgoaW50KWFsZ29yaXRobSwgbmFtZSkpOworICBzd2l0Y2ggKGFsZ29yaXRobSkgeworICAgIGNhc2UgR1JQQ19DT01QUkVTU19OT05FOgorICAgICAgKm5hbWUgPSAiaWRlbnRpdHkiOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX0RFRkxBVEU6CisgICAgICAqbmFtZSA9ICJkZWZsYXRlIjsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgR1JQQ19DT01QUkVTU19HWklQOgorICAgICAgKm5hbWUgPSAiZ3ppcCI7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDoKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwOworfQorCitncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9mcm9tX21kc3RyKAorICAgIGdycGNfbWRzdHIgKnN0cikgeworICBpZiAoc3RyID09IEdSUENfTURTVFJfSURFTlRJVFkpIHJldHVybiBHUlBDX0NPTVBSRVNTX05PTkU7CisgIGlmIChzdHIgPT0gR1JQQ19NRFNUUl9ERUZMQVRFKSByZXR1cm4gR1JQQ19DT01QUkVTU19ERUZMQVRFOworICBpZiAoc3RyID09IEdSUENfTURTVFJfR1pJUCkgcmV0dXJuIEdSUENfQ09NUFJFU1NfR1pJUDsKKyAgcmV0dXJuIEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDsKK30KKworZ3JwY19tZHN0ciAqZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fbWRzdHIoCisgICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtKSB7CisgIHN3aXRjaCAoYWxnb3JpdGhtKSB7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX05PTkU6CisgICAgICByZXR1cm4gR1JQQ19NRFNUUl9JREVOVElUWTsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfREVGTEFURToKKyAgICAgIHJldHVybiBHUlBDX01EU1RSX0RFRkxBVEU7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX0daSVA6CisgICAgICByZXR1cm4gR1JQQ19NRFNUUl9HWklQOworICAgIGNhc2UgR1JQQ19DT01QUkVTU19BTEdPUklUSE1TX0NPVU5UOgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2dycGNfbWRlbGVtICpncnBjX2NvbXByZXNzaW9uX2VuY29kaW5nX21kZWxlbSgKKyAgICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0pIHsKKyAgc3dpdGNoIChhbGdvcml0aG0pIHsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfTk9ORToKKyAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX0VOQ09ESU5HX0lERU5USVRZOworICAgIGNhc2UgR1JQQ19DT01QUkVTU19ERUZMQVRFOgorICAgICAgcmV0dXJuIEdSUENfTURFTEVNX0dSUENfRU5DT0RJTkdfREVGTEFURTsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfR1pJUDoKKyAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX0VOQ09ESU5HX0daSVA7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBUT0RPKGRncSk6IEFkZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHBhcmFtZXRlcnMgdG8gdGhlIGluZGl2aWR1YWwKKyAqIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgKi8KK2dycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX2Zvcl9sZXZlbCgKKyAgICBncnBjX2NvbXByZXNzaW9uX2xldmVsIGxldmVsLCB1aW50MzJfdCBhY2NlcHRlZF9lbmNvZGluZ3MpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX2Zvcl9sZXZlbChsZXZlbD0lZCkiLCAxLAorICAgICAgICAgICAgICAgICAoKGludClsZXZlbCkpOworICBpZiAobGV2ZWwgPiBHUlBDX0NPTVBSRVNTX0xFVkVMX0hJR0gpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gY29tcHJlc3Npb24gbGV2ZWwgJWQuIiwgKGludClsZXZlbCk7CisgICAgYWJvcnQoKTsKKyAgfQorCisgIGNvbnN0IHNpemVfdCBudW1fc3VwcG9ydGVkID0KKyAgICAgIEdQUl9CSVRDT1VOVChhY2NlcHRlZF9lbmNvZGluZ3MpIC0gMTsgLyogZGlzY2FyZCBOT05FICovCisgIGlmIChsZXZlbCA9PSBHUlBDX0NPTVBSRVNTX0xFVkVMX05PTkUgfHwgbnVtX3N1cHBvcnRlZCA9PSAwKSB7CisgICAgcmV0dXJuIEdSUENfQ09NUFJFU1NfTk9ORTsKKyAgfQorCisgIEdQUl9BU1NFUlQobGV2ZWwgPiAwKTsKKworICAvKiBFc3RhYmxpc2ggYSAicmFua2luZyIgb3IgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mCisgICAqIGNvbXByZXNzaW9uLgorICAgKiBUaGlzIGlzIHNpbXBsaXN0aWMgYW5kIHdlIHdpbGwgcHJvYmFibHkgd2FudCB0byBpbnRyb2R1Y2Ugb3RoZXIgZGltZW5zaW9ucworICAgKiBpbiB0aGUgZnV0dXJlIChjcHUvbWVtb3J5IGNvc3QsIGV0YykuICovCisgIGNvbnN0IGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29zX3JhbmtpbmdbXSA9IHtHUlBDX0NPTVBSRVNTX0daSVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NPTVBSRVNTX0RFRkxBVEV9OworCisgIC8qIGludGVyc2VjdCBhbGdvc19yYW5raW5nIHdpdGggdGhlIHN1cHBvcnRlZCBvbmVzIGtlZXBpbmcgdGhlIHJhbmtlZCBvcmRlciAqLworICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobQorICAgICAgc29ydGVkX3N1cHBvcnRlZF9hbGdvc1tHUlBDX0NPTVBSRVNTX0FMR09SSVRITVNfQ09VTlRdOworICBzaXplX3QgYWxnb3Nfc3VwcG9ydGVkX2lkeCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR1BSX0FSUkFZX1NJWkUoYWxnb3NfcmFua2luZyk7IGkrKykgeworICAgIGNvbnN0IGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZyA9IGFsZ29zX3JhbmtpbmdbaV07CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBudW1fc3VwcG9ydGVkOyBqKyspIHsKKyAgICAgIGlmIChHUFJfQklUR0VUKGFjY2VwdGVkX2VuY29kaW5ncywgYWxnKSA9PSAxKSB7CisgICAgICAgIC8qIGlmIFxhIGFsZyBpbiBzdXBwb3J0ZWQgKi8KKyAgICAgICAgc29ydGVkX3N1cHBvcnRlZF9hbGdvc1thbGdvc19zdXBwb3J0ZWRfaWR4KytdID0gYWxnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsZ29zX3N1cHBvcnRlZF9pZHggPT0gbnVtX3N1cHBvcnRlZCkgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKGxldmVsKSB7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX0xFVkVMX05PTkU6CisgICAgICBhYm9ydCgpOyAvKiBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeSAqLworICAgIGNhc2UgR1JQQ19DT01QUkVTU19MRVZFTF9MT1c6CisgICAgICByZXR1cm4gc29ydGVkX3N1cHBvcnRlZF9hbGdvc1swXTsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfTEVWRUxfTUVEOgorICAgICAgcmV0dXJuIHNvcnRlZF9zdXBwb3J0ZWRfYWxnb3NbbnVtX3N1cHBvcnRlZCAvIDJdOworICAgIGNhc2UgR1JQQ19DT01QUkVTU19MRVZFTF9ISUdIOgorICAgICAgcmV0dXJuIHNvcnRlZF9zdXBwb3J0ZWRfYWxnb3NbbnVtX3N1cHBvcnRlZCAtIDFdOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICB9OworfQorCit2b2lkIGdycGNfY29tcHJlc3Npb25fb3B0aW9uc19pbml0KGdycGNfY29tcHJlc3Npb25fb3B0aW9ucyAqb3B0cykgeworICBvcHRzLT5lbmFibGVkX2FsZ29yaXRobXNfYml0c2V0ID0gKDF1IDw8IEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVCkgLSAxOworICBvcHRzLT5kZWZhdWx0X2NvbXByZXNzaW9uX2FsZ29yaXRobSA9IEdSUENfQ09NUFJFU1NfTk9ORTsKK30KKwordm9pZCBncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfZW5hYmxlX2FsZ29yaXRobSgKKyAgICBncnBjX2NvbXByZXNzaW9uX29wdGlvbnMgKm9wdHMsIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSkgeworICBHUFJfQklUU0VUKCZvcHRzLT5lbmFibGVkX2FsZ29yaXRobXNfYml0c2V0LCBhbGdvcml0aG0pOworfQorCit2b2lkIGdycGNfY29tcHJlc3Npb25fb3B0aW9uc19kaXNhYmxlX2FsZ29yaXRobSgKKyAgICBncnBjX2NvbXByZXNzaW9uX29wdGlvbnMgKm9wdHMsIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSkgeworICBHUFJfQklUQ0xFQVIoJm9wdHMtPmVuYWJsZWRfYWxnb3JpdGhtc19iaXRzZXQsIGFsZ29yaXRobSk7Cit9CisKK2ludCBncnBjX2NvbXByZXNzaW9uX29wdGlvbnNfaXNfYWxnb3JpdGhtX2VuYWJsZWQoCisgICAgY29uc3QgZ3JwY19jb21wcmVzc2lvbl9vcHRpb25zICpvcHRzLAorICAgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSkgeworICByZXR1cm4gR1BSX0JJVEdFVChvcHRzLT5lbmFibGVkX2FsZ29yaXRobXNfYml0c2V0LCBhbGdvcml0aG0pOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyBiL3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNmEyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKKyNpbmNsdWRlIDx6bGliLmg+CisKKyNkZWZpbmUgT1VUUFVUX0JMT0NLX1NJWkUgMTAyNAorCitzdGF0aWMgaW50IHpsaWJfYm9keSh6X3N0cmVhbSogenMsIGdwcl9zbGljZV9idWZmZXIqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgaW50ICgqZmxhdGUpKHpfc3RyZWFtKiB6cywgaW50IGZsdXNoKSkgeworICBpbnQgcjsKKyAgaW50IGZsdXNoOworICBzaXplX3QgaTsKKyAgZ3ByX3NsaWNlIG91dGJ1ZiA9IGdwcl9zbGljZV9tYWxsb2MoT1VUUFVUX0JMT0NLX1NJWkUpOworICBjb25zdCB1SW50IHVpbnRfbWF4ID0gfih1SW50KTA7CisKKyAgR1BSX0FTU0VSVChHUFJfU0xJQ0VfTEVOR1RIKG91dGJ1ZikgPD0gdWludF9tYXgpOworICB6cy0+YXZhaWxfb3V0ID0gKHVJbnQpR1BSX1NMSUNFX0xFTkdUSChvdXRidWYpOworICB6cy0+bmV4dF9vdXQgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKG91dGJ1Zik7CisgIGZsdXNoID0gWl9OT19GTFVTSDsKKyAgZm9yIChpID0gMDsgaSA8IGlucHV0LT5jb3VudDsgaSsrKSB7CisgICAgaWYgKGkgPT0gaW5wdXQtPmNvdW50IC0gMSkgZmx1c2ggPSBaX0ZJTklTSDsKKyAgICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgoaW5wdXQtPnNsaWNlc1tpXSkgPD0gdWludF9tYXgpOworICAgIHpzLT5hdmFpbF9pbiA9ICh1SW50KUdQUl9TTElDRV9MRU5HVEgoaW5wdXQtPnNsaWNlc1tpXSk7CisgICAgenMtPm5leHRfaW4gPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGlucHV0LT5zbGljZXNbaV0pOworICAgIGRvIHsKKyAgICAgIGlmICh6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChvdXRwdXQsIG91dGJ1Zik7CisgICAgICAgIG91dGJ1ZiA9IGdwcl9zbGljZV9tYWxsb2MoT1VUUFVUX0JMT0NLX1NJWkUpOworICAgICAgICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgob3V0YnVmKSA8PSB1aW50X21heCk7CisgICAgICAgIHpzLT5hdmFpbF9vdXQgPSAodUludClHUFJfU0xJQ0VfTEVOR1RIKG91dGJ1Zik7CisgICAgICAgIHpzLT5uZXh0X291dCA9IEdQUl9TTElDRV9TVEFSVF9QVFIob3V0YnVmKTsKKyAgICAgIH0KKyAgICAgIHIgPSBmbGF0ZSh6cywgZmx1c2gpOworICAgICAgaWYgKHIgPCAwICYmIHIgIT0gWl9CVUZfRVJST1IgLyogbm90IGZhdGFsICovKSB7CisgICAgICAgIGdwcl9sb2coR1BSX0lORk8sICJ6bGliIGVycm9yICglZCkiLCByKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICh6cy0+YXZhaWxfb3V0ID09IDApOworICAgIGlmICh6cy0+YXZhaWxfaW4pIHsKKyAgICAgIGdwcl9sb2coR1BSX0lORk8sICJ6bGliOiBub3QgYWxsIGlucHV0IGNvbnN1bWVkIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgfQorCisgIEdQUl9BU1NFUlQob3V0YnVmLnJlZmNvdW50KTsKKyAgb3V0YnVmLmRhdGEucmVmY291bnRlZC5sZW5ndGggLT0genMtPmF2YWlsX291dDsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChvdXRwdXQsIG91dGJ1Zik7CisKKyAgcmV0dXJuIDE7CisKK2Vycm9yOgorICBncHJfc2xpY2VfdW5yZWYob3V0YnVmKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkKiB6YWxsb2NfZ3ByKHZvaWQqIG9wYXF1ZSwgdW5zaWduZWQgaW50IGl0ZW1zLCB1bnNpZ25lZCBpbnQgc2l6ZSkgeworICByZXR1cm4gZ3ByX21hbGxvYyhpdGVtcyAqIHNpemUpOworfQorCitzdGF0aWMgdm9pZCB6ZnJlZV9ncHIodm9pZCogb3BhcXVlLCB2b2lkKiBhZGRyZXNzKSB7IGdwcl9mcmVlKGFkZHJlc3MpOyB9CisKK3N0YXRpYyBpbnQgemxpYl9jb21wcmVzcyhncHJfc2xpY2VfYnVmZmVyKiBpbnB1dCwgZ3ByX3NsaWNlX2J1ZmZlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnemlwKSB7CisgIHpfc3RyZWFtIHpzOworICBpbnQgcjsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCBjb3VudF9iZWZvcmUgPSBvdXRwdXQtPmNvdW50OworICBzaXplX3QgbGVuZ3RoX2JlZm9yZSA9IG91dHB1dC0+bGVuZ3RoOworICBtZW1zZXQoJnpzLCAwLCBzaXplb2YoenMpKTsKKyAgenMuemFsbG9jID0gemFsbG9jX2dwcjsKKyAgenMuemZyZWUgPSB6ZnJlZV9ncHI7CisgIHIgPSBkZWZsYXRlSW5pdDIoJnpzLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIFpfREVGTEFURUQsIDE1IHwgKGd6aXAgPyAxNiA6IDApLAorICAgICAgICAgICAgICAgICAgIDgsIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgIEdQUl9BU1NFUlQociA9PSBaX09LKTsKKyAgciA9IHpsaWJfYm9keSgmenMsIGlucHV0LCBvdXRwdXQsIGRlZmxhdGUpICYmIG91dHB1dC0+bGVuZ3RoIDwgaW5wdXQtPmxlbmd0aDsKKyAgaWYgKCFyKSB7CisgICAgZm9yIChpID0gY291bnRfYmVmb3JlOyBpIDwgb3V0cHV0LT5jb3VudDsgaSsrKSB7CisgICAgICBncHJfc2xpY2VfdW5yZWYob3V0cHV0LT5zbGljZXNbaV0pOworICAgIH0KKyAgICBvdXRwdXQtPmNvdW50ID0gY291bnRfYmVmb3JlOworICAgIG91dHB1dC0+bGVuZ3RoID0gbGVuZ3RoX2JlZm9yZTsKKyAgfQorICBkZWZsYXRlRW5kKCZ6cyk7CisgIHJldHVybiByOworfQorCitzdGF0aWMgaW50IHpsaWJfZGVjb21wcmVzcyhncHJfc2xpY2VfYnVmZmVyKiBpbnB1dCwgZ3ByX3NsaWNlX2J1ZmZlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd6aXApIHsKKyAgel9zdHJlYW0genM7CisgIGludCByOworICBzaXplX3QgaTsKKyAgc2l6ZV90IGNvdW50X2JlZm9yZSA9IG91dHB1dC0+Y291bnQ7CisgIHNpemVfdCBsZW5ndGhfYmVmb3JlID0gb3V0cHV0LT5sZW5ndGg7CisgIG1lbXNldCgmenMsIDAsIHNpemVvZih6cykpOworICB6cy56YWxsb2MgPSB6YWxsb2NfZ3ByOworICB6cy56ZnJlZSA9IHpmcmVlX2dwcjsKKyAgciA9IGluZmxhdGVJbml0MigmenMsIDE1IHwgKGd6aXAgPyAxNiA6IDApKTsKKyAgR1BSX0FTU0VSVChyID09IFpfT0spOworICByID0gemxpYl9ib2R5KCZ6cywgaW5wdXQsIG91dHB1dCwgaW5mbGF0ZSk7CisgIGlmICghcikgeworICAgIGZvciAoaSA9IGNvdW50X2JlZm9yZTsgaSA8IG91dHB1dC0+Y291bnQ7IGkrKykgeworICAgICAgZ3ByX3NsaWNlX3VucmVmKG91dHB1dC0+c2xpY2VzW2ldKTsKKyAgICB9CisgICAgb3V0cHV0LT5jb3VudCA9IGNvdW50X2JlZm9yZTsKKyAgICBvdXRwdXQtPmxlbmd0aCA9IGxlbmd0aF9iZWZvcmU7CisgIH0KKyAgaW5mbGF0ZUVuZCgmenMpOworICByZXR1cm4gcjsKK30KKworc3RhdGljIGludCBjb3B5KGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQpIHsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBpbnB1dC0+Y291bnQ7IGkrKykgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKG91dHB1dCwgZ3ByX3NsaWNlX3JlZihpbnB1dC0+c2xpY2VzW2ldKSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29tcHJlc3NfaW5uZXIoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyKiBpbnB1dCwgZ3ByX3NsaWNlX2J1ZmZlciogb3V0cHV0KSB7CisgIHN3aXRjaCAoYWxnb3JpdGhtKSB7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX05PTkU6CisgICAgICAvKiB0aGUgZmFsbGJhY2sgcGF0aCBhbHdheXMgbmVlZHMgdG8gYmUgc2VuZCB1bmNvbXByZXNzZWQ6IHdlIHNpbXBseQorICAgICAgICAgcmVseSBvbiB0aGF0IGhlcmUgKi8KKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgR1JQQ19DT01QUkVTU19ERUZMQVRFOgorICAgICAgcmV0dXJuIHpsaWJfY29tcHJlc3MoaW5wdXQsIG91dHB1dCwgMCk7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX0daSVA6CisgICAgICByZXR1cm4gemxpYl9jb21wcmVzcyhpbnB1dCwgb3V0cHV0LCAxKTsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVDoKKyAgICAgIGJyZWFrOworICB9CisgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG0gJWQiLCBhbGdvcml0aG0pOworICByZXR1cm4gMDsKK30KKworaW50IGdycGNfbXNnX2NvbXByZXNzKGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyKiBpbnB1dCwgZ3ByX3NsaWNlX2J1ZmZlciogb3V0cHV0KSB7CisgIGlmICghY29tcHJlc3NfaW5uZXIoYWxnb3JpdGhtLCBpbnB1dCwgb3V0cHV0KSkgeworICAgIGNvcHkoaW5wdXQsIG91dHB1dCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBncnBjX21zZ19kZWNvbXByZXNzKGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQpIHsKKyAgc3dpdGNoIChhbGdvcml0aG0pIHsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfTk9ORToKKyAgICAgIHJldHVybiBjb3B5KGlucHV0LCBvdXRwdXQpOworICAgIGNhc2UgR1JQQ19DT01QUkVTU19ERUZMQVRFOgorICAgICAgcmV0dXJuIHpsaWJfZGVjb21wcmVzcyhpbnB1dCwgb3V0cHV0LCAwKTsKKyAgICBjYXNlIEdSUENfQ09NUFJFU1NfR1pJUDoKKyAgICAgIHJldHVybiB6bGliX2RlY29tcHJlc3MoaW5wdXQsIG91dHB1dCwgMSk7CisgICAgY2FzZSBHUlBDX0NPTVBSRVNTX0FMR09SSVRITVNfQ09VTlQ6CisgICAgICBicmVhazsKKyAgfQorICBncHJfbG9nKEdQUl9FUlJPUiwgImludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtICVkIiwgYWxnb3JpdGhtKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIGIvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzE2MDgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaApAQCAtMCwwICsxLDUyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfQ09NUFJFU1NJT05fTUVTU0FHRV9DT01QUkVTU19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfQ09NUFJFU1NJT05fTUVTU0FHRV9DT01QUkVTU19ICisKKyNpbmNsdWRlIDxncnBjL2NvbXByZXNzaW9uLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgorCisvKiBjb21wcmVzcyAnaW5wdXQnIHRvICdvdXRwdXQnIHVzaW5nICdhbGdvcml0aG0nLgorICAgT24gc3VjY2VzcywgYXBwZW5kcyBjb21wcmVzc2VkIHNsaWNlcyB0byBvdXRwdXQgYW5kIHJldHVybnMgMS4KKyAgIE9uIGZhaWx1cmUsIGFwcGVuZHMgdW5jb21wcmVzc2VkIHNsaWNlcyB0byBvdXRwdXQgYW5kIHJldHVybnMgMC4gKi8KK2ludCBncnBjX21zZ19jb21wcmVzcyhncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciogaW5wdXQsIGdwcl9zbGljZV9idWZmZXIqIG91dHB1dCk7CisKKy8qIGRlY29tcHJlc3MgJ2lucHV0JyB0byAnb3V0cHV0JyB1c2luZyAnYWxnb3JpdGhtJy4KKyAgIE9uIHN1Y2Nlc3MsIGFwcGVuZHMgc2xpY2VzIHRvIG91dHB1dCBhbmQgcmV0dXJucyAxLgorICAgT24gZmFpbHVyZSwgb3V0cHV0IGlzIHVuY2hhbmdlZCwgYW5kIHJldHVybnMgMC4gKi8KK2ludCBncnBjX21zZ19kZWNvbXByZXNzKGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIGlucHV0LCBncHJfc2xpY2VfYnVmZmVyKiBvdXRwdXQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9DT01QUkVTU0lPTl9NRVNTQUdFX0NPTVBSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIGIvc3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2ZGQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgdHJhY2VyIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50ICpmbGFnOworICBzdHJ1Y3QgdHJhY2VyICpuZXh0OworfSB0cmFjZXI7CitzdGF0aWMgdHJhY2VyICp0cmFjZXJzOworCit2b2lkIGdycGNfcmVnaXN0ZXJfdHJhY2VyKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZmxhZykgeworICB0cmFjZXIgKnQgPSBncHJfbWFsbG9jKHNpemVvZigqdCkpOworICB0LT5uYW1lID0gbmFtZTsKKyAgdC0+ZmxhZyA9IGZsYWc7CisgIHQtPm5leHQgPSB0cmFjZXJzOworICAqZmxhZyA9IDA7CisgIHRyYWNlcnMgPSB0OworfQorCitzdGF0aWMgdm9pZCBhZGQoY29uc3QgY2hhciAqYmVnLCBjb25zdCBjaGFyICplbmQsIGNoYXIgKioqc3MsIHNpemVfdCAqbnMpIHsKKyAgc2l6ZV90IG4gPSAqbnM7CisgIHNpemVfdCBucCA9IG4gKyAxOworICBjaGFyICpzOworICBzaXplX3QgbGVuOworICBHUFJfQVNTRVJUKGVuZCA+PSBiZWcpOworICBsZW4gPSAoc2l6ZV90KShlbmQgLSBiZWcpOworICBzID0gZ3ByX21hbGxvYyhsZW4gKyAxKTsKKyAgbWVtY3B5KHMsIGJlZywgbGVuKTsKKyAgc1tsZW5dID0gMDsKKyAgKnNzID0gZ3ByX3JlYWxsb2MoKnNzLCBzaXplb2YoY2hhciAqKikgKiBucCk7CisgICgqc3MpW25dID0gczsKKyAgKm5zID0gbnA7Cit9CisKK3N0YXRpYyB2b2lkIHNwbGl0KGNvbnN0IGNoYXIgKnMsIGNoYXIgKioqc3MsIHNpemVfdCAqbnMpIHsKKyAgY29uc3QgY2hhciAqYyA9IHN0cmNocihzLCAnLCcpOworICBpZiAoYyA9PSBOVUxMKSB7CisgICAgYWRkKHMsIHMgKyBzdHJsZW4ocyksIHNzLCBucyk7CisgIH0gZWxzZSB7CisgICAgYWRkKHMsIGMsIHNzLCBucyk7CisgICAgc3BsaXQoYyArIDEsIHNzLCBucyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgcGFyc2UoY29uc3QgY2hhciAqcykgeworICBjaGFyICoqc3RyaW5ncyA9IE5VTEw7CisgIHNpemVfdCBuc3RyaW5ncyA9IDA7CisgIHNpemVfdCBpOworICBzcGxpdChzLCAmc3RyaW5ncywgJm5zdHJpbmdzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnN0cmluZ3M7IGkrKykgeworICAgIGdycGNfdHJhY2VyX3NldF9lbmFibGVkKHN0cmluZ3NbaV0sIDEpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG5zdHJpbmdzOyBpKyspIHsKKyAgICBncHJfZnJlZShzdHJpbmdzW2ldKTsKKyAgfQorICBncHJfZnJlZShzdHJpbmdzKTsKK30KKwordm9pZCBncnBjX3RyYWNlcl9pbml0KGNvbnN0IGNoYXIgKmVudl92YXIpIHsKKyAgY2hhciAqZSA9IGdwcl9nZXRlbnYoZW52X3Zhcik7CisgIGlmIChlICE9IE5VTEwpIHsKKyAgICBwYXJzZShlKTsKKyAgICBncHJfZnJlZShlKTsKKyAgfQorfQorCit2b2lkIGdycGNfdHJhY2VyX3NodXRkb3duKHZvaWQpIHsKKyAgd2hpbGUgKHRyYWNlcnMpIHsKKyAgICB0cmFjZXIgKnQgPSB0cmFjZXJzOworICAgIHRyYWNlcnMgPSB0LT5uZXh0OworICAgIGdwcl9mcmVlKHQpOworICB9Cit9CisKK2ludCBncnBjX3RyYWNlcl9zZXRfZW5hYmxlZChjb25zdCBjaGFyICpuYW1lLCBpbnQgZW5hYmxlZCkgeworICB0cmFjZXIgKnQ7CisgIGlmICgwID09IHN0cmNtcChuYW1lLCAiYWxsIikpIHsKKyAgICBmb3IgKHQgPSB0cmFjZXJzOyB0OyB0ID0gdC0+bmV4dCkgeworICAgICAgKnQtPmZsYWcgPSAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGZvciAodCA9IHRyYWNlcnM7IHQ7IHQgPSB0LT5uZXh0KSB7CisgICAgICBpZiAoMCA9PSBzdHJjbXAobmFtZSwgdC0+bmFtZSkpIHsKKyAgICAgICAgKnQtPmZsYWcgPSBlbmFibGVkOworICAgICAgICBmb3VuZCA9IDE7CisgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biB0cmFjZSB2YXI6ICclcyciLCBuYW1lKTsKKyAgICAgIHJldHVybiAwOyAvKiBlYXJseSByZXR1cm4gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaCBiL3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWE1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaApAQCAtMCwwICsxLDQzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfREVCVUdfVFJBQ0VfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0RFQlVHX1RSQUNFX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKK3ZvaWQgZ3JwY19yZWdpc3Rlcl90cmFjZXIoY29uc3QgY2hhciAqbmFtZSwgaW50ICpmbGFnKTsKK3ZvaWQgZ3JwY190cmFjZXJfaW5pdChjb25zdCBjaGFyICplbnZfdmFyX25hbWUpOwordm9pZCBncnBjX3RyYWNlcl9zaHV0ZG93bih2b2lkKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfREVCVUdfVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyBiL3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMzkxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKworc3RhdGljIHZvaWQgZmlsbF9jb21tb25faGVhZGVyKGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zdHJ2ZWMgKmJ1ZikgeworICBzaXplX3QgaTsKKyAgZ3ByX3N0cnZlY19hZGQoYnVmLCBncHJfc3RyZHVwKHJlcXVlc3QtPmh0dHAucGF0aCkpOworICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAoIiBIVFRQLzEuMFxyXG4iKSk7CisgIC8qIGp1c3QgaW4gY2FzZSBzb21lIGNyYXp5IHNlcnZlciByZWFsbHkgZXhwZWN0cyBIVFRQLzEuMSAqLworICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAoIkhvc3Q6ICIpKTsKKyAgZ3ByX3N0cnZlY19hZGQoYnVmLCBncHJfc3RyZHVwKHJlcXVlc3QtPmhvc3QpKTsKKyAgZ3ByX3N0cnZlY19hZGQoYnVmLCBncHJfc3RyZHVwKCJcclxuIikpOworICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAoIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIpKTsKKyAgZ3ByX3N0cnZlY19hZGQoYnVmLAorICAgICAgICAgICAgICAgICBncHJfc3RyZHVwKCJVc2VyLUFnZW50OiAiIEdSUENfSFRUUENMSV9VU0VSX0FHRU5UICJcclxuIikpOworICAvKiB1c2VyIHN1cHBsaWVkIGhlYWRlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPmh0dHAuaGRyX2NvdW50OyBpKyspIHsKKyAgICBncHJfc3RydmVjX2FkZChidWYsIGdwcl9zdHJkdXAocmVxdWVzdC0+aHR0cC5oZHJzW2ldLmtleSkpOworICAgIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgZ3ByX3N0cmR1cCgiOiAiKSk7CisgICAgZ3ByX3N0cnZlY19hZGQoYnVmLCBncHJfc3RyZHVwKHJlcXVlc3QtPmh0dHAuaGRyc1tpXS52YWx1ZSkpOworICAgIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgZ3ByX3N0cmR1cCgiXHJcbiIpKTsKKyAgfQorfQorCitncHJfc2xpY2UgZ3JwY19odHRwY2xpX2Zvcm1hdF9nZXRfcmVxdWVzdChjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCkgeworICBncHJfc3RydmVjIG91dDsKKyAgY2hhciAqZmxhdDsKKyAgc2l6ZV90IGZsYXRfbGVuOworCisgIGdwcl9zdHJ2ZWNfaW5pdCgmb3V0KTsKKyAgZ3ByX3N0cnZlY19hZGQoJm91dCwgZ3ByX3N0cmR1cCgiR0VUICIpKTsKKyAgZmlsbF9jb21tb25faGVhZGVyKHJlcXVlc3QsICZvdXQpOworICBncHJfc3RydmVjX2FkZCgmb3V0LCBncHJfc3RyZHVwKCJcclxuIikpOworCisgIGZsYXQgPSBncHJfc3RydmVjX2ZsYXR0ZW4oJm91dCwgJmZsYXRfbGVuKTsKKyAgZ3ByX3N0cnZlY19kZXN0cm95KCZvdXQpOworCisgIHJldHVybiBncHJfc2xpY2VfbmV3KGZsYXQsIGZsYXRfbGVuLCBncHJfZnJlZSk7Cit9CisKK2dwcl9zbGljZSBncnBjX2h0dHBjbGlfZm9ybWF0X3Bvc3RfcmVxdWVzdChjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpib2R5X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBib2R5X3NpemUpIHsKKyAgZ3ByX3N0cnZlYyBvdXQ7CisgIGNoYXIgKnRtcDsKKyAgc2l6ZV90IG91dF9sZW47CisgIHNpemVfdCBpOworCisgIGdwcl9zdHJ2ZWNfaW5pdCgmb3V0KTsKKworICBncHJfc3RydmVjX2FkZCgmb3V0LCBncHJfc3RyZHVwKCJQT1NUICIpKTsKKyAgZmlsbF9jb21tb25faGVhZGVyKHJlcXVlc3QsICZvdXQpOworICBpZiAoYm9keV9ieXRlcykgeworICAgIHVpbnQ4X3QgaGFzX2NvbnRlbnRfdHlwZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPmh0dHAuaGRyX2NvdW50OyBpKyspIHsKKyAgICAgIGlmIChzdHJjbXAocmVxdWVzdC0+aHR0cC5oZHJzW2ldLmtleSwgIkNvbnRlbnQtVHlwZSIpID09IDApIHsKKyAgICAgICAgaGFzX2NvbnRlbnRfdHlwZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhhc19jb250ZW50X3R5cGUpIHsKKyAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZvdXQsIGdwcl9zdHJkdXAoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblxyXG4iKSk7CisgICAgfQorICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiQ29udGVudC1MZW5ndGg6ICVsdVxyXG4iLCAodW5zaWduZWQgbG9uZylib2R5X3NpemUpOworICAgIGdwcl9zdHJ2ZWNfYWRkKCZvdXQsIHRtcCk7CisgIH0KKyAgZ3ByX3N0cnZlY19hZGQoJm91dCwgZ3ByX3N0cmR1cCgiXHJcbiIpKTsKKyAgdG1wID0gZ3ByX3N0cnZlY19mbGF0dGVuKCZvdXQsICZvdXRfbGVuKTsKKyAgZ3ByX3N0cnZlY19kZXN0cm95KCZvdXQpOworCisgIGlmIChib2R5X2J5dGVzKSB7CisgICAgdG1wID0gZ3ByX3JlYWxsb2ModG1wLCBvdXRfbGVuICsgYm9keV9zaXplKTsKKyAgICBtZW1jcHkodG1wICsgb3V0X2xlbiwgYm9keV9ieXRlcywgYm9keV9zaXplKTsKKyAgICBvdXRfbGVuICs9IGJvZHlfc2l6ZTsKKyAgfQorCisgIHJldHVybiBncHJfc2xpY2VfbmV3KHRtcCwgb3V0X2xlbiwgZ3ByX2ZyZWUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCBiL3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5MzNkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0hUVFBfRk9STUFUX1JFUVVFU1RfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0hUVFBfRk9STUFUX1JFUVVFU1RfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oIgorCitncHJfc2xpY2UgZ3JwY19odHRwY2xpX2Zvcm1hdF9nZXRfcmVxdWVzdChjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCk7CitncHJfc2xpY2UgZ3JwY19odHRwY2xpX2Zvcm1hdF9wb3N0X3JlcXVlc3QoY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYm9keV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYm9keV9zaXplKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSFRUUF9GT1JNQVRfUkVRVUVTVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMgYi9zcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiMjhhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncHJfc2xpY2UgcmVxdWVzdF90ZXh0OworICBncnBjX2h0dHBfcGFyc2VyIHBhcnNlcjsKKyAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJlc3NlczsKKyAgc2l6ZV90IG5leHRfYWRkcmVzczsKKyAgZ3JwY19lbmRwb2ludCAqZXA7CisgIGNoYXIgKmhvc3Q7CisgIGNoYXIgKnNzbF9ob3N0X292ZXJyaWRlOworICBncHJfdGltZXNwZWMgZGVhZGxpbmU7CisgIGludCBoYXZlX3JlYWRfYnl0ZTsKKyAgY29uc3QgZ3JwY19odHRwY2xpX2hhbmRzaGFrZXIgKmhhbmRzaGFrZXI7CisgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZTsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dDsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworICBncnBjX2lvbWdyX29iamVjdCBpb21ncl9vYmo7CisgIGdwcl9zbGljZV9idWZmZXIgaW5jb21pbmc7CisgIGdwcl9zbGljZV9idWZmZXIgb3V0Z29pbmc7CisgIGdycGNfY2xvc3VyZSBvbl9yZWFkOworICBncnBjX2Nsb3N1cmUgZG9uZV93cml0ZTsKKyAgZ3JwY19jbG9zdXJlIGNvbm5lY3RlZDsKK30gaW50ZXJuYWxfcmVxdWVzdDsKKworc3RhdGljIGdycGNfaHR0cGNsaV9nZXRfb3ZlcnJpZGUgZ19nZXRfb3ZlcnJpZGUgPSBOVUxMOworc3RhdGljIGdycGNfaHR0cGNsaV9wb3N0X292ZXJyaWRlIGdfcG9zdF9vdmVycmlkZSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHBsYWludGV4dF9oYW5kc2hha2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpvbl9kb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50KSkgeworICBvbl9kb25lKGV4ZWNfY3R4LCBhcmcsIGVuZHBvaW50KTsKK30KKworY29uc3QgZ3JwY19odHRwY2xpX2hhbmRzaGFrZXIgZ3JwY19odHRwY2xpX3BsYWludGV4dCA9IHsiaHR0cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dF9oYW5kc2hha2V9OworCit2b2lkIGdycGNfaHR0cGNsaV9jb250ZXh0X2luaXQoZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQpIHsKKyAgY29udGV4dC0+cG9sbHNldF9zZXQgPSBncnBjX3BvbGxzZXRfc2V0X2NyZWF0ZSgpOworfQorCit2b2lkIGdycGNfaHR0cGNsaV9jb250ZXh0X2Rlc3Ryb3koZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQpIHsKKyAgZ3JwY19wb2xsc2V0X3NldF9kZXN0cm95KGNvbnRleHQtPnBvbGxzZXRfc2V0KTsKK30KKworc3RhdGljIHZvaWQgbmV4dF9hZGRyZXNzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBpbnRlcm5hbF9yZXF1ZXN0ICpyZXEpOworCitzdGF0aWMgdm9pZCBmaW5pc2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludGVybmFsX3JlcXVlc3QgKnJlcSwKKyAgICAgICAgICAgICAgICAgICBpbnQgc3VjY2VzcykgeworICBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGV4ZWNfY3R4LCByZXEtPmNvbnRleHQtPnBvbGxzZXRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS0+cG9sbHNldCk7CisgIHJlcS0+b25fcmVzcG9uc2UoZXhlY19jdHgsIHJlcS0+dXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAmcmVxLT5wYXJzZXIuaHR0cC5yZXNwb25zZSA6IE5VTEwpOworICBncnBjX2h0dHBfcGFyc2VyX2Rlc3Ryb3koJnJlcS0+cGFyc2VyKTsKKyAgaWYgKHJlcS0+YWRkcmVzc2VzICE9IE5VTEwpIHsKKyAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlcS0+YWRkcmVzc2VzKTsKKyAgfQorICBpZiAocmVxLT5lcCAhPSBOVUxMKSB7CisgICAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCByZXEtPmVwKTsKKyAgfQorICBncHJfc2xpY2VfdW5yZWYocmVxLT5yZXF1ZXN0X3RleHQpOworICBncHJfZnJlZShyZXEtPmhvc3QpOworICBncHJfZnJlZShyZXEtPnNzbF9ob3N0X292ZXJyaWRlKTsKKyAgZ3JwY19pb21ncl91bnJlZ2lzdGVyX29iamVjdCgmcmVxLT5pb21ncl9vYmopOworICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnJlcS0+aW5jb21pbmcpOworICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnJlcS0+b3V0Z29pbmcpOworICBncHJfZnJlZShyZXEpOworfQorCitzdGF0aWMgdm9pZCBvbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2Vzcyk7CisKK3N0YXRpYyB2b2lkIGRvX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludGVybmFsX3JlcXVlc3QgKnJlcSkgeworICBncnBjX2VuZHBvaW50X3JlYWQoZXhlY19jdHgsIHJlcS0+ZXAsICZyZXEtPmluY29taW5nLCAmcmVxLT5vbl9yZWFkKTsKK30KKworc3RhdGljIHZvaWQgb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLCBib29sIHN1Y2Nlc3MpIHsKKyAgaW50ZXJuYWxfcmVxdWVzdCAqcmVxID0gdXNlcl9kYXRhOworICBzaXplX3QgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVxLT5pbmNvbWluZy5jb3VudDsgaSsrKSB7CisgICAgaWYgKEdQUl9TTElDRV9MRU5HVEgocmVxLT5pbmNvbWluZy5zbGljZXNbaV0pKSB7CisgICAgICByZXEtPmhhdmVfcmVhZF9ieXRlID0gMTsKKyAgICAgIGlmICghZ3JwY19odHRwX3BhcnNlcl9wYXJzZSgmcmVxLT5wYXJzZXIsIHJlcS0+aW5jb21pbmcuc2xpY2VzW2ldKSkgeworICAgICAgICBmaW5pc2goZXhlY19jdHgsIHJlcSwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoc3VjY2VzcykgeworICAgIGRvX3JlYWQoZXhlY19jdHgsIHJlcSk7CisgIH0gZWxzZSBpZiAoIXJlcS0+aGF2ZV9yZWFkX2J5dGUpIHsKKyAgICBuZXh0X2FkZHJlc3MoZXhlY19jdHgsIHJlcSk7CisgIH0gZWxzZSB7CisgICAgaW50IHBhcnNlX3N1Y2Nlc3MgPSBncnBjX2h0dHBfcGFyc2VyX2VvZigmcmVxLT5wYXJzZXIpOworICAgIGlmIChwYXJzZV9zdWNjZXNzICYmIChyZXEtPnBhcnNlci50eXBlICE9IEdSUENfSFRUUF9SRVNQT05TRSkpIHsKKyAgICAgIHBhcnNlX3N1Y2Nlc3MgPSAwOworICAgIH0KKyAgICBmaW5pc2goZXhlY19jdHgsIHJlcSwgcGFyc2Vfc3VjY2Vzcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgb25fd3JpdHRlbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgaW50ZXJuYWxfcmVxdWVzdCAqcmVxKSB7CisgIGRvX3JlYWQoZXhlY19jdHgsIHJlcSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvbmVfd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7CisgIGludGVybmFsX3JlcXVlc3QgKnJlcSA9IGFyZzsKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICBvbl93cml0dGVuKGV4ZWNfY3R4LCByZXEpOworICB9IGVsc2UgeworICAgIG5leHRfYWRkcmVzcyhleGVjX2N0eCwgcmVxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgaW50ZXJuYWxfcmVxdWVzdCAqcmVxKSB7CisgIGdwcl9zbGljZV9yZWYocmVxLT5yZXF1ZXN0X3RleHQpOworICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmcmVxLT5vdXRnb2luZywgcmVxLT5yZXF1ZXN0X3RleHQpOworICBncnBjX2VuZHBvaW50X3dyaXRlKGV4ZWNfY3R4LCByZXEtPmVwLCAmcmVxLT5vdXRnb2luZywgJnJlcS0+ZG9uZV93cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2hhbmRzaGFrZV9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICplcCkgeworICBpbnRlcm5hbF9yZXF1ZXN0ICpyZXEgPSBhcmc7CisKKyAgaWYgKCFlcCkgeworICAgIG5leHRfYWRkcmVzcyhleGVjX2N0eCwgcmVxKTsKKyAgICByZXR1cm47CisgIH0KKworICByZXEtPmVwID0gZXA7CisgIHN0YXJ0X3dyaXRlKGV4ZWNfY3R4LCByZXEpOworfQorCitzdGF0aWMgdm9pZCBvbl9jb25uZWN0ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7CisgIGludGVybmFsX3JlcXVlc3QgKnJlcSA9IGFyZzsKKworICBpZiAoIXJlcS0+ZXApIHsKKyAgICBuZXh0X2FkZHJlc3MoZXhlY19jdHgsIHJlcSk7CisgICAgcmV0dXJuOworICB9CisgIHJlcS0+aGFuZHNoYWtlci0+aGFuZHNoYWtlKAorICAgICAgZXhlY19jdHgsIHJlcSwgcmVxLT5lcCwKKyAgICAgIHJlcS0+c3NsX2hvc3Rfb3ZlcnJpZGUgPyByZXEtPnNzbF9ob3N0X292ZXJyaWRlIDogcmVxLT5ob3N0LAorICAgICAgb25faGFuZHNoYWtlX2RvbmUpOworfQorCitzdGF0aWMgdm9pZCBuZXh0X2FkZHJlc3MoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGludGVybmFsX3JlcXVlc3QgKnJlcSkgeworICBncnBjX3Jlc29sdmVkX2FkZHJlc3MgKmFkZHI7CisgIGlmIChyZXEtPm5leHRfYWRkcmVzcyA9PSByZXEtPmFkZHJlc3Nlcy0+bmFkZHJzKSB7CisgICAgZmluaXNoKGV4ZWNfY3R4LCByZXEsIDApOworICAgIHJldHVybjsKKyAgfQorICBhZGRyID0gJnJlcS0+YWRkcmVzc2VzLT5hZGRyc1tyZXEtPm5leHRfYWRkcmVzcysrXTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnJlcS0+Y29ubmVjdGVkLCBvbl9jb25uZWN0ZWQsIHJlcSk7CisgIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KAorICAgICAgZXhlY19jdHgsICZyZXEtPmNvbm5lY3RlZCwgJnJlcS0+ZXAsIHJlcS0+Y29udGV4dC0+cG9sbHNldF9zZXQsCisgICAgICAoc3RydWN0IHNvY2thZGRyICopJmFkZHItPmFkZHIsIGFkZHItPmxlbiwgcmVxLT5kZWFkbGluZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX3Jlc29sdmVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcmVzc2VzKSB7CisgIGludGVybmFsX3JlcXVlc3QgKnJlcSA9IGFyZzsKKyAgaWYgKCFhZGRyZXNzZXMpIHsKKyAgICBmaW5pc2goZXhlY19jdHgsIHJlcSwgMCk7CisgICAgcmV0dXJuOworICB9CisgIHJlcS0+YWRkcmVzc2VzID0gYWRkcmVzc2VzOworICByZXEtPm5leHRfYWRkcmVzcyA9IDA7CisgIG5leHRfYWRkcmVzcyhleGVjX2N0eCwgcmVxKTsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfcmVxdWVzdF9iZWdpbigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQsCisgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKKyAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZSwKKyAgICB2b2lkICp1c2VyX2RhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGdwcl9zbGljZSByZXF1ZXN0X3RleHQpIHsKKyAgaW50ZXJuYWxfcmVxdWVzdCAqcmVxID0gZ3ByX21hbGxvYyhzaXplb2YoaW50ZXJuYWxfcmVxdWVzdCkpOworICBtZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOworICByZXEtPnJlcXVlc3RfdGV4dCA9IHJlcXVlc3RfdGV4dDsKKyAgZ3JwY19odHRwX3BhcnNlcl9pbml0KCZyZXEtPnBhcnNlcik7CisgIHJlcS0+b25fcmVzcG9uc2UgPSBvbl9yZXNwb25zZTsKKyAgcmVxLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIHJlcS0+ZGVhZGxpbmUgPSBkZWFkbGluZTsKKyAgcmVxLT5oYW5kc2hha2VyID0KKyAgICAgIHJlcXVlc3QtPmhhbmRzaGFrZXIgPyByZXF1ZXN0LT5oYW5kc2hha2VyIDogJmdycGNfaHR0cGNsaV9wbGFpbnRleHQ7CisgIHJlcS0+Y29udGV4dCA9IGNvbnRleHQ7CisgIHJlcS0+cG9sbHNldCA9IHBvbGxzZXQ7CisgIGdycGNfY2xvc3VyZV9pbml0KCZyZXEtPm9uX3JlYWQsIG9uX3JlYWQsIHJlcSk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZyZXEtPmRvbmVfd3JpdGUsIGRvbmVfd3JpdGUsIHJlcSk7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmcmVxLT5pbmNvbWluZyk7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmcmVxLT5vdXRnb2luZyk7CisgIGdycGNfaW9tZ3JfcmVnaXN0ZXJfb2JqZWN0KCZyZXEtPmlvbWdyX29iaiwgbmFtZSk7CisgIHJlcS0+aG9zdCA9IGdwcl9zdHJkdXAocmVxdWVzdC0+aG9zdCk7CisgIHJlcS0+c3NsX2hvc3Rfb3ZlcnJpZGUgPSBncHJfc3RyZHVwKHJlcXVlc3QtPnNzbF9ob3N0X292ZXJyaWRlKTsKKworICBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGV4ZWNfY3R4LCByZXEtPmNvbnRleHQtPnBvbGxzZXRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS0+cG9sbHNldCk7CisgIGdycGNfcmVzb2x2ZV9hZGRyZXNzKHJlcXVlc3QtPmhvc3QsIHJlcS0+aGFuZHNoYWtlci0+ZGVmYXVsdF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICBvbl9yZXNvbHZlZCwgcmVxKTsKK30KKwordm9pZCBncnBjX2h0dHBjbGlfZ2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiBvbl9yZXNwb25zZSwgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGNoYXIgKm5hbWU7CisgIGlmIChnX2dldF9vdmVycmlkZSAmJgorICAgICAgZ19nZXRfb3ZlcnJpZGUoZXhlY19jdHgsIHJlcXVlc3QsIGRlYWRsaW5lLCBvbl9yZXNwb25zZSwgdXNlcl9kYXRhKSkgeworICAgIHJldHVybjsKKyAgfQorICBncHJfYXNwcmludGYoJm5hbWUsICJIVFRQOkdFVDolczolcyIsIHJlcXVlc3QtPmhvc3QsIHJlcXVlc3QtPmh0dHAucGF0aCk7CisgIGludGVybmFsX3JlcXVlc3RfYmVnaW4oZXhlY19jdHgsIGNvbnRleHQsIHBvbGxzZXQsIHJlcXVlc3QsIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3Jlc3BvbnNlLCB1c2VyX2RhdGEsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19odHRwY2xpX2Zvcm1hdF9nZXRfcmVxdWVzdChyZXF1ZXN0KSk7CisgIGdwcl9mcmVlKG5hbWUpOworfQorCit2b2lkIGdycGNfaHR0cGNsaV9wb3N0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2h0dHBjbGlfcmVxdWVzdCAqcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYm9keV9ieXRlcywgc2l6ZV90IGJvZHlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2Igb25fcmVzcG9uc2UsIHZvaWQgKnVzZXJfZGF0YSkgeworICBjaGFyICpuYW1lOworICBpZiAoZ19wb3N0X292ZXJyaWRlICYmCisgICAgICBnX3Bvc3Rfb3ZlcnJpZGUoZXhlY19jdHgsIHJlcXVlc3QsIGJvZHlfYnl0ZXMsIGJvZHlfc2l6ZSwgZGVhZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgb25fcmVzcG9uc2UsIHVzZXJfZGF0YSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZ3ByX2FzcHJpbnRmKCZuYW1lLCAiSFRUUDpQT1NUOiVzOiVzIiwgcmVxdWVzdC0+aG9zdCwgcmVxdWVzdC0+aHR0cC5wYXRoKTsKKyAgaW50ZXJuYWxfcmVxdWVzdF9iZWdpbigKKyAgICAgIGV4ZWNfY3R4LCBjb250ZXh0LCBwb2xsc2V0LCByZXF1ZXN0LCBkZWFkbGluZSwgb25fcmVzcG9uc2UsIHVzZXJfZGF0YSwKKyAgICAgIG5hbWUsIGdycGNfaHR0cGNsaV9mb3JtYXRfcG9zdF9yZXF1ZXN0KHJlcXVlc3QsIGJvZHlfYnl0ZXMsIGJvZHlfc2l6ZSkpOworICBncHJfZnJlZShuYW1lKTsKK30KKwordm9pZCBncnBjX2h0dHBjbGlfc2V0X292ZXJyaWRlKGdycGNfaHR0cGNsaV9nZXRfb3ZlcnJpZGUgZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9wb3N0X292ZXJyaWRlIHBvc3QpIHsKKyAgZ19nZXRfb3ZlcnJpZGUgPSBnZXQ7CisgIGdfcG9zdF9vdmVycmlkZSA9IHBvc3Q7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmggYi9zcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkNTRhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0hUVFBfSFRUUENMSV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSFRUUF9IVFRQQ0xJX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIgorCisvKiBVc2VyIGFnZW50IHRoaXMgbGlicmFyeSByZXBvcnRzICovCisjZGVmaW5lIEdSUENfSFRUUENMSV9VU0VSX0FHRU5UICJncnBjLWh0dHBjbGkvMC4wIgorCisvKiBUcmFja3MgaW4tcHJvZ3Jlc3MgaHR0cCByZXF1ZXN0cworICAgVE9ETyhjdGlsbGVyKTogYWxsb3cgY2FjaGluZyBhbmQgY2FwdHVyaW5nIG11bHRpcGxlIHJlcXVlc3RzIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgIHNhbWUgY29udGVudCBhbmQgY29tYmluaW5nIHRoZW0gKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfaHR0cGNsaV9jb250ZXh0IHsKKyAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQ7Cit9IGdycGNfaHR0cGNsaV9jb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9ydDsKKyAgdm9pZCAoKmhhbmRzaGFrZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpvbl9kb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQpKTsKK30gZ3JwY19odHRwY2xpX2hhbmRzaGFrZXI7CisKK2V4dGVybiBjb25zdCBncnBjX2h0dHBjbGlfaGFuZHNoYWtlciBncnBjX2h0dHBjbGlfcGxhaW50ZXh0OworZXh0ZXJuIGNvbnN0IGdycGNfaHR0cGNsaV9oYW5kc2hha2VyIGdycGNfaHR0cGNsaV9zc2w7CisKKy8qIEEgcmVxdWVzdCAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgeworICAvKiBUaGUgaG9zdCBuYW1lIHRvIGNvbm5lY3QgdG8gKi8KKyAgY2hhciAqaG9zdDsKKyAgLyogVGhlIGhvc3QgdG8gdmVyaWZ5IGluIHRoZSBTU0wgaGFuZHNoYWtlIChvciBOVUxMKSAqLworICBjaGFyICpzc2xfaG9zdF9vdmVycmlkZTsKKyAgLyogVGhlIG1haW4gcGFydCBvZiB0aGUgcmVxdWVzdAorICAgICBUaGUgZm9sbG93aW5nIGhlYWRlcnMgYXJlIHN1cHBsaWVkIGF1dG9tYXRpY2FsbHkgYW5kIE1VU1QgTk9UIGJlIHNldCBoZXJlOgorICAgICBIb3N0LCBDb25uZWN0aW9uLCBVc2VyLUFnZW50ICovCisgIGdycGNfaHR0cF9yZXF1ZXN0IGh0dHA7CisgIC8qIGhhbmRzaGFrZXIgdG8gdXNlIHNzbCBmb3IgdGhlIHJlcXVlc3QgKi8KKyAgY29uc3QgZ3JwY19odHRwY2xpX2hhbmRzaGFrZXIgKmhhbmRzaGFrZXI7Cit9IGdycGNfaHR0cGNsaV9yZXF1ZXN0OworCisvKiBFeHBvc2UgdGhlIHBhcnNlciByZXNwb25zZSB0eXBlIGFzIGEgaHR0cGNsaSByZXNwb25zZSB0b28gKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfaHR0cF9yZXNwb25zZSBncnBjX2h0dHBjbGlfcmVzcG9uc2U7CisKKy8qIENhbGxiYWNrIGZvciBncnBjX2h0dHBjbGlfZ2V0IGFuZCBncnBjX2h0dHBjbGlfcG9zdC4gKi8KK3R5cGVkZWYgdm9pZCAoKmdycGNfaHR0cGNsaV9yZXNwb25zZV9jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19odHRwX3Jlc3BvbnNlICpyZXNwb25zZSk7CisKK3ZvaWQgZ3JwY19odHRwY2xpX2NvbnRleHRfaW5pdChncnBjX2h0dHBjbGlfY29udGV4dCAqY29udGV4dCk7Cit2b2lkIGdycGNfaHR0cGNsaV9jb250ZXh0X2Rlc3Ryb3koZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQpOworCisvKiBBc3luY2hyb25vdXNseSBwZXJmb3JtIGEgSFRUUCBHRVQuCisgICAnY29udGV4dCcgc3BlY2lmaWVzIHRoZSBodHRwIGNvbnRleHQgdW5kZXIgd2hpY2ggdG8gZG8gdGhlIGdldAorICAgJ3BvbGxzZXQnIGluZGljYXRlcyBhIGdycGNfcG9sbHNldCB0aGF0IGlzIGludGVyZXN0ZWQgaW4gdGhlIHJlc3VsdAorICAgICBvZiB0aGUgZ2V0IC0gd29yayBvbiB0aGlzIHBvbGxzZXQgbWF5IGJlIHVzZWQgdG8gcHJvZ3Jlc3MgdGhlIGdldAorICAgICBvcGVyYXRpb24KKyAgICdyZXF1ZXN0JyBjb250YWlucyByZXF1ZXN0IHBhcmFtZXRlcnMgLSB0aGVzZSBhcmUgY2FsbGVyIG93bmVkIGFuZCBjYW4gYmUKKyAgICAgZGVzdHJveWVkIG9uY2UgdGhlIGNhbGwgcmV0dXJucworICAgJ2RlYWRsaW5lJyBjb250YWlucyBhIGRlYWRsaW5lIGZvciB0aGUgcmVxdWVzdCAob3IgZ3ByX2luZl9mdXR1cmUpCisgICAnb25fcmVzcG9uc2UnIGlzIGEgY2FsbGJhY2sgdG8gcmVwb3J0IHJlc3VsdHMgdG8gKGFuZCAndXNlcl9kYXRhJyBpcyBhIHVzZXIKKyAgICAgc3VwcGxpZWQgcG9pbnRlciB0byBwYXNzIHRvIHNhaWQgY2FsbCkgKi8KK3ZvaWQgZ3JwY19odHRwY2xpX2dldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2Igb25fcmVzcG9uc2UsIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIEFzeW5jaHJvbm91c2x5IHBlcmZvcm0gYSBIVFRQIFBPU1QuCisgICAnY29udGV4dCcgc3BlY2lmaWVzIHRoZSBodHRwIGNvbnRleHQgdW5kZXIgd2hpY2ggdG8gZG8gdGhlIHBvc3QKKyAgICdwb2xsc2V0JyBpbmRpY2F0ZXMgYSBncnBjX3BvbGxzZXQgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHRoZSByZXN1bHQKKyAgICAgb2YgdGhlIHBvc3QgLSB3b3JrIG9uIHRoaXMgcG9sbHNldCBtYXkgYmUgdXNlZCB0byBwcm9ncmVzcyB0aGUgcG9zdAorICAgICBvcGVyYXRpb24KKyAgICdyZXF1ZXN0JyBjb250YWlucyByZXF1ZXN0IHBhcmFtZXRlcnMgLSB0aGVzZSBhcmUgY2FsbGVyIG93bmVkIGFuZCBjYW4gYmUKKyAgICAgZGVzdHJveWVkIG9uY2UgdGhlIGNhbGwgcmV0dXJucworICAgJ2JvZHlfYnl0ZXMnIGFuZCAnYm9keV9zaXplJyBzcGVjaWZ5IHRoZSBwYXlsb2FkIGZvciB0aGUgcG9zdC4KKyAgICAgV2hlbiB0aGVyZSBpcyBubyBib2R5LCBwYXNzIGluIE5VTEwgYXMgYm9keV9ieXRlcy4KKyAgICdkZWFkbGluZScgY29udGFpbnMgYSBkZWFkbGluZSBmb3IgdGhlIHJlcXVlc3QgKG9yIGdwcl9pbmZfZnV0dXJlKQorICAgJ2VtJyBwb2ludHMgdG8gYSBjYWxsZXIgb3duZWQgZXZlbnQgbWFuYWdlciB0aGF0IG11c3QgYmUgYWxpdmUgZm9yIHRoZQorICAgICBsaWZldGltZSBvZiB0aGUgcmVxdWVzdAorICAgJ29uX3Jlc3BvbnNlJyBpcyBhIGNhbGxiYWNrIHRvIHJlcG9ydCByZXN1bHRzIHRvIChhbmQgJ3VzZXJfZGF0YScgaXMgYSB1c2VyCisgICAgIHN1cHBsaWVkIHBvaW50ZXIgdG8gcGFzcyB0byBzYWlkIGNhbGwpCisgICBEb2VzIG5vdCBzdXBwb3J0ID92YXIxPXZhbDEmdmFyMj12YWwyIGluIHRoZSBwYXRoLiAqLwordm9pZCBncnBjX2h0dHBjbGlfcG9zdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19odHRwY2xpX2NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJvZHlfYnl0ZXMsIHNpemVfdCBib2R5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIG9uX3Jlc3BvbnNlLCB2b2lkICp1c2VyX2RhdGEpOworCisvKiBvdmVycmlkZSBmdW5jdGlvbnMgcmV0dXJuIDEgaWYgdGhleSBoYW5kbGVkIHRoZSByZXF1ZXN0LCAwIG90aGVyd2lzZSAqLwordHlwZWRlZiBpbnQgKCpncnBjX2h0dHBjbGlfZ2V0X292ZXJyaWRlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19odHRwY2xpX3JlcXVlc3QgKnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIG9uX3Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOwordHlwZWRlZiBpbnQgKCpncnBjX2h0dHBjbGlfcG9zdF9vdmVycmlkZSkoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGNvbnN0IGdycGNfaHR0cGNsaV9yZXF1ZXN0ICpyZXF1ZXN0LAorICAgIGNvbnN0IGNoYXIgKmJvZHlfYnl0ZXMsIHNpemVfdCBib2R5X3NpemUsIGdwcl90aW1lc3BlYyBkZWFkbGluZSwKKyAgICBncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2Igb25fcmVzcG9uc2UsIHZvaWQgKnVzZXJfZGF0YSk7CisKK3ZvaWQgZ3JwY19odHRwY2xpX3NldF9vdmVycmlkZShncnBjX2h0dHBjbGlfZ2V0X292ZXJyaWRlIGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2h0dHBjbGlfcG9zdF9vdmVycmlkZSBwb3N0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSFRUUF9IVFRQQ0xJX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgYi9zcmMvY29yZS9saWIvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTYzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgYmFzZTsKKyAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKmhhbmRzaGFrZXJfZmFjdG9yeTsKKyAgY2hhciAqc2VjdXJlX3BlZXJfbmFtZTsKK30gZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcjsKKworc3RhdGljIHZvaWQgaHR0cGNsaV9zc2xfZGVzdHJveShncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MpIHsKKyAgZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9CisgICAgICAoZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworICBpZiAoYy0+aGFuZHNoYWtlcl9mYWN0b3J5ICE9IE5VTEwpIHsKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KGMtPmhhbmRzaGFrZXJfZmFjdG9yeSk7CisgIH0KKyAgaWYgKGMtPnNlY3VyZV9wZWVyX25hbWUgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+c2VjdXJlX3BlZXJfbmFtZSk7CisgIGdwcl9mcmVlKHNjKTsKK30KKworc3RhdGljIHZvaWQgaHR0cGNsaV9zc2xfZG9faGFuZHNoYWtlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KKyAgICAgIChncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICB0c2lfaGFuZHNoYWtlciAqaGFuZHNoYWtlcjsKKyAgaWYgKGMtPmhhbmRzaGFrZXJfZmFjdG9yeSA9PSBOVUxMKSB7CisgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUiwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuOworICB9CisgIHJlc3VsdCA9IHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2NyZWF0ZV9oYW5kc2hha2VyKAorICAgICAgYy0+aGFuZHNoYWtlcl9mYWN0b3J5LCBjLT5zZWN1cmVfcGVlcl9uYW1lLCAmaGFuZHNoYWtlcik7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJIYW5kc2hha2VyIGNyZWF0aW9uIGZhaWxlZCB3aXRoIGVycm9yICVzLiIsCisgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKKyAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBHUlBDX1NFQ1VSSVRZX0VSUk9SLCBOVUxMLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2RvX3NlY3VyaXR5X2hhbmRzaGFrZShleGVjX2N0eCwgaGFuZHNoYWtlciwgJnNjLT5iYXNlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlY3VyZV9lbmRwb2ludCwgY2IsIHVzZXJfZGF0YSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgaHR0cGNsaV9zc2xfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjLCB0c2lfcGVlciBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KKyAgICAgIChncnBjX2h0dHBjbGlfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7CisgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBlZXIgbmFtZS4gKi8KKyAgaWYgKGMtPnNlY3VyZV9wZWVyX25hbWUgIT0gTlVMTCAmJgorICAgICAgIXRzaV9zc2xfcGVlcl9tYXRjaGVzX25hbWUoJnBlZXIsIGMtPnNlY3VyZV9wZWVyX25hbWUpKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJQZWVyIG5hbWUgJXMgaXMgbm90IGluIHBlZXIgY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgYy0+c2VjdXJlX3BlZXJfbmFtZSk7CisgICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9FUlJPUjsKKyAgfQorICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBzdGF0dXMsIE5VTEwpOworICB0c2lfcGVlcl9kZXN0cnVjdCgmcGVlcik7Cit9CisKK3N0YXRpYyBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl92dGFibGUgaHR0cGNsaV9zc2xfdnRhYmxlID0geworICAgIGh0dHBjbGlfc3NsX2Rlc3Ryb3ksIGh0dHBjbGlfc3NsX2NoZWNrX3BlZXJ9OworCitzdGF0aWMgZ3JwY19zZWN1cml0eV9zdGF0dXMgaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9yb290X2NlcnRzLCBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZSwKKyAgICBjb25zdCBjaGFyICpzZWN1cmVfcGVlcl9uYW1lLCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIGdycGNfaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmM7CisKKyAgaWYgKHNlY3VyZV9wZWVyX25hbWUgIT0gTlVMTCAmJiBwZW1fcm9vdF9jZXJ0cyA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAiQ2Fubm90IGFzc2VydCBhIHNlY3VyZSBwZWVyIG5hbWUgd2l0aG91dCBhIHRydXN0IHJvb3QuIik7CisgICAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7CisgIH0KKworICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19odHRwY2xpX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcikpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IpKTsKKworICBncHJfcmVmX2luaXQoJmMtPmJhc2UuYmFzZS5yZWZjb3VudCwgMSk7CisgIGMtPmJhc2UuYmFzZS52dGFibGUgPSAmaHR0cGNsaV9zc2xfdnRhYmxlOworICBpZiAoc2VjdXJlX3BlZXJfbmFtZSAhPSBOVUxMKSB7CisgICAgYy0+c2VjdXJlX3BlZXJfbmFtZSA9IGdwcl9zdHJkdXAoc2VjdXJlX3BlZXJfbmFtZSk7CisgIH0KKyAgcmVzdWx0ID0gdHNpX2NyZWF0ZV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSgKKyAgICAgIE5VTEwsIDAsIE5VTEwsIDAsIHBlbV9yb290X2NlcnRzLCBwZW1fcm9vdF9jZXJ0c19zaXplLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgMCwgJmMtPmhhbmRzaGFrZXJfZmFjdG9yeSk7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJIYW5kc2hha2VyIGZhY3RvcnkgY3JlYXRpb24gZmFpbGVkIHdpdGggJXMuIiwKKyAgICAgICAgICAgIHRzaV9yZXN1bHRfdG9fc3RyaW5nKHJlc3VsdCkpOworICAgIGh0dHBjbGlfc3NsX2Rlc3Ryb3koJmMtPmJhc2UuYmFzZSk7CisgICAgKnNjID0gTlVMTDsKKyAgICByZXR1cm4gR1JQQ19TRUNVUklUWV9FUlJPUjsKKyAgfQorICBjLT5iYXNlLmRvX2hhbmRzaGFrZSA9IGh0dHBjbGlfc3NsX2RvX2hhbmRzaGFrZTsKKyAgKnNjID0gJmMtPmJhc2U7CisgIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOworfQorCisvKiBoYW5kc2hha2VyICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAoKmZ1bmMpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50KTsKKyAgdm9pZCAqYXJnOworfSBvbl9kb25lX2Nsb3N1cmU7CisKK3N0YXRpYyB2b2lkIG9uX3NlY3VyZV90cmFuc3BvcnRfc2V0dXBfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0KSB7CisgIG9uX2RvbmVfY2xvc3VyZSAqYyA9IHJwOworICBpZiAoc3RhdHVzICE9IEdSUENfU0VDVVJJVFlfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNlY3VyZSB0cmFuc3BvcnQgc2V0dXAgZmFpbGVkIHdpdGggZXJyb3IgJWQuIiwgc3RhdHVzKTsKKyAgICBjLT5mdW5jKGV4ZWNfY3R4LCBjLT5hcmcsIE5VTEwpOworICB9IGVsc2UgeworICAgIGMtPmZ1bmMoZXhlY19jdHgsIGMtPmFyZywgc2VjdXJlX2VuZHBvaW50KTsKKyAgfQorICBncHJfZnJlZShjKTsKK30KKworc3RhdGljIHZvaWQgc3NsX2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICp0Y3AsIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpvbl9kb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQpKSB7CisgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjID0gTlVMTDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX3Jvb3RfY2VydHMgPSBOVUxMOworICBvbl9kb25lX2Nsb3N1cmUgKmMgPSBncHJfbWFsbG9jKHNpemVvZigqYykpOworICBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZSA9IGdycGNfZ2V0X2RlZmF1bHRfc3NsX3Jvb3RzKCZwZW1fcm9vdF9jZXJ0cyk7CisgIGlmIChwZW1fcm9vdF9jZXJ0cyA9PSBOVUxMIHx8IHBlbV9yb290X2NlcnRzX3NpemUgPT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBkZWZhdWx0IHBlbSByb290IGNlcnRzLiIpOworICAgIG9uX2RvbmUoZXhlY19jdHgsIGFyZywgTlVMTCk7CisgICAgZ3ByX2ZyZWUoYyk7CisgICAgcmV0dXJuOworICB9CisgIGMtPmZ1bmMgPSBvbl9kb25lOworICBjLT5hcmcgPSBhcmc7CisgIEdQUl9BU1NFUlQoaHR0cGNsaV9zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAorICAgICAgICAgICAgICAgICBwZW1fcm9vdF9jZXJ0cywgcGVtX3Jvb3RfY2VydHNfc2l6ZSwgaG9zdCwgJnNjKSA9PQorICAgICAgICAgICAgIEdSUENfU0VDVVJJVFlfT0spOworICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKKyAgICAgIGV4ZWNfY3R4LCBzYywgdGNwLCBvbl9zZWN1cmVfdHJhbnNwb3J0X3NldHVwX2RvbmUsIGMpOworICBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9VTlJFRigmc2MtPmJhc2UsICJodHRwY2xpIik7Cit9CisKK2NvbnN0IGdycGNfaHR0cGNsaV9oYW5kc2hha2VyIGdycGNfaHR0cGNsaV9zc2wgPSB7Imh0dHBzIiwgc3NsX2hhbmRzaGFrZX07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYyBiL3NyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODJhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCitleHRlcm4gaW50IGdycGNfaHR0cF90cmFjZTsKKworc3RhdGljIGNoYXIgKmJ1ZjJzdHIodm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CisgIGNoYXIgKm91dCA9IGdwcl9tYWxsb2MobGVuZ3RoICsgMSk7CisgIG1lbWNweShvdXQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgb3V0W2xlbmd0aF0gPSAwOworICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW50IGhhbmRsZV9yZXNwb25zZV9saW5lKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgeworICB1aW50OF90ICpiZWcgPSBwYXJzZXItPmN1cl9saW5lOworICB1aW50OF90ICpjdXIgPSBiZWc7CisgIHVpbnQ4X3QgKmVuZCA9IGJlZyArIHBhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoOworCisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnSCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnVCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnVCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnUCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnLycpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnMScpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnLicpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIgPCAnMCcgfHwgKmN1cisrID4gJzEnKSBnb3RvIGVycm9yOworICBpZiAoY3VyID09IGVuZCB8fCAqY3VyKysgIT0gJyAnKSBnb3RvIGVycm9yOworICBpZiAoY3VyID09IGVuZCB8fCAqY3VyIDwgJzEnIHx8ICpjdXIrKyA+ICc5JykgZ290byBlcnJvcjsKKyAgaWYgKGN1ciA9PSBlbmQgfHwgKmN1ciA8ICcwJyB8fCAqY3VyKysgPiAnOScpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIgPCAnMCcgfHwgKmN1cisrID4gJzknKSBnb3RvIGVycm9yOworICBwYXJzZXItPmh0dHAucmVzcG9uc2Uuc3RhdHVzID0KKyAgICAgIChjdXJbLTNdIC0gJzAnKSAqIDEwMCArIChjdXJbLTJdIC0gJzAnKSAqIDEwICsgKGN1clstMV0gLSAnMCcpOworICBpZiAoY3VyID09IGVuZCB8fCAqY3VyKysgIT0gJyAnKSBnb3RvIGVycm9yOworCisgIC8qIHdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSBzdGF0dXMgY29kZSBtZXNzYWdlICovCisKKyAgcmV0dXJuIDE7CisKK2Vycm9yOgorICBpZiAoZ3JwY19odHRwX3RyYWNlKSBncHJfbG9nKEdQUl9FUlJPUiwgIkZhaWxlZCBwYXJzaW5nIHJlc3BvbnNlIGxpbmUiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3JlcXVlc3RfbGluZShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpIHsKKyAgdWludDhfdCAqYmVnID0gcGFyc2VyLT5jdXJfbGluZTsKKyAgdWludDhfdCAqY3VyID0gYmVnOworICB1aW50OF90ICplbmQgPSBiZWcgKyBwYXJzZXItPmN1cl9saW5lX2xlbmd0aDsKKyAgdWludDhfdCB2ZXJzX21ham9yID0gMDsKKyAgdWludDhfdCB2ZXJzX21pbm9yID0gMDsKKworICB3aGlsZSAoY3VyICE9IGVuZCAmJiAqY3VyKysgIT0gJyAnKQorICAgIDsKKyAgaWYgKGN1ciA9PSBlbmQpIGdvdG8gZXJyb3I7CisgIHBhcnNlci0+aHR0cC5yZXF1ZXN0Lm1ldGhvZCA9IGJ1ZjJzdHIoYmVnLCAoc2l6ZV90KShjdXIgLSBiZWcgLSAxKSk7CisKKyAgYmVnID0gY3VyOworICB3aGlsZSAoY3VyICE9IGVuZCAmJiAqY3VyKysgIT0gJyAnKQorICAgIDsKKyAgaWYgKGN1ciA9PSBlbmQpIGdvdG8gZXJyb3I7CisgIHBhcnNlci0+aHR0cC5yZXF1ZXN0LnBhdGggPSBidWYyc3RyKGJlZywgKHNpemVfdCkoY3VyIC0gYmVnIC0gMSkpOworCisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnSCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnVCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnVCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnUCcpIGdvdG8gZXJyb3I7CisgIGlmIChjdXIgPT0gZW5kIHx8ICpjdXIrKyAhPSAnLycpIGdvdG8gZXJyb3I7CisgIHZlcnNfbWFqb3IgPSAodWludDhfdCkoKmN1cisrIC0gJzEnICsgMSk7CisgICsrY3VyOworICBpZiAoY3VyID09IGVuZCkgZ290byBlcnJvcjsKKyAgdmVyc19taW5vciA9ICh1aW50OF90KSgqY3VyKysgLSAnMScgKyAxKTsKKworICBpZiAodmVyc19tYWpvciA9PSAxKSB7CisgICAgaWYgKHZlcnNfbWlub3IgPT0gMCkgeworICAgICAgcGFyc2VyLT5odHRwLnJlcXVlc3QudmVyc2lvbiA9IEdSUENfSFRUUF9IVFRQMTA7CisgICAgfSBlbHNlIGlmICh2ZXJzX21pbm9yID09IDEpIHsKKyAgICAgIHBhcnNlci0+aHR0cC5yZXF1ZXN0LnZlcnNpb24gPSBHUlBDX0hUVFBfSFRUUDExOworICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgfSBlbHNlIGlmICh2ZXJzX21ham9yID09IDIpIHsKKyAgICBpZiAodmVyc19taW5vciA9PSAwKSB7CisgICAgICBwYXJzZXItPmh0dHAucmVxdWVzdC52ZXJzaW9uID0gR1JQQ19IVFRQX0hUVFAyMDsKKyAgICB9IGVsc2UgeworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHJldHVybiAxOworCitlcnJvcjoKKyAgaWYgKGdycGNfaHR0cF90cmFjZSkgZ3ByX2xvZyhHUFJfRVJST1IsICJGYWlsZWQgcGFyc2luZyByZXF1ZXN0IGxpbmUiKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2ZpcnN0X2xpbmUoZ3JwY19odHRwX3BhcnNlciAqcGFyc2VyKSB7CisgIGlmIChwYXJzZXItPmN1cl9saW5lWzBdID09ICdIJykgeworICAgIHBhcnNlci0+dHlwZSA9IEdSUENfSFRUUF9SRVNQT05TRTsKKyAgICByZXR1cm4gaGFuZGxlX3Jlc3BvbnNlX2xpbmUocGFyc2VyKTsKKyAgfSBlbHNlIHsKKyAgICBwYXJzZXItPnR5cGUgPSBHUlBDX0hUVFBfUkVRVUVTVDsKKyAgICByZXR1cm4gaGFuZGxlX3JlcXVlc3RfbGluZShwYXJzZXIpOworICB9Cit9CisKK3N0YXRpYyBpbnQgYWRkX2hlYWRlcihncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpIHsKKyAgdWludDhfdCAqYmVnID0gcGFyc2VyLT5jdXJfbGluZTsKKyAgdWludDhfdCAqY3VyID0gYmVnOworICB1aW50OF90ICplbmQgPSBiZWcgKyBwYXJzZXItPmN1cl9saW5lX2xlbmd0aDsKKyAgc2l6ZV90ICpoZHJfY291bnQgPSBOVUxMOworICBncnBjX2h0dHBfaGVhZGVyICoqaGRycyA9IE5VTEw7CisgIGdycGNfaHR0cF9oZWFkZXIgaGRyID0ge05VTEwsIE5VTEx9OworCisgIEdQUl9BU1NFUlQoY3VyICE9IGVuZCk7CisKKyAgaWYgKCpjdXIgPT0gJyAnIHx8ICpjdXIgPT0gJ1x0JykgeworICAgIGlmIChncnBjX2h0dHBfdHJhY2UpCisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvbnRpbnVlZCBoZWFkZXIgbGluZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgd2hpbGUgKGN1ciAhPSBlbmQgJiYgKmN1ciAhPSAnOicpIHsKKyAgICBjdXIrKzsKKyAgfQorICBpZiAoY3VyID09IGVuZCkgeworICAgIGlmIChncnBjX2h0dHBfdHJhY2UpIGdwcl9sb2coR1BSX0VSUk9SLCAiRGlkbid0IGZpbmQgJzonIGluIGhlYWRlciBzdHJpbmciKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIEdQUl9BU1NFUlQoY3VyID49IGJlZyk7CisgIGhkci5rZXkgPSBidWYyc3RyKGJlZywgKHNpemVfdCkoY3VyIC0gYmVnKSk7CisgIGN1cisrOyAvKiBza2lwIDogKi8KKworICB3aGlsZSAoY3VyICE9IGVuZCAmJiAoKmN1ciA9PSAnICcgfHwgKmN1ciA9PSAnXHQnKSkgeworICAgIGN1cisrOworICB9CisgIEdQUl9BU1NFUlQoZW5kIC0gY3VyID49IDIpOworICBoZHIudmFsdWUgPSBidWYyc3RyKGN1ciwgKHNpemVfdCkoZW5kIC0gY3VyKSAtIDIpOworCisgIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFU1BPTlNFKSB7CisgICAgaGRyX2NvdW50ID0gJnBhcnNlci0+aHR0cC5yZXNwb25zZS5oZHJfY291bnQ7CisgICAgaGRycyA9ICZwYXJzZXItPmh0dHAucmVzcG9uc2UuaGRyczsKKyAgfSBlbHNlIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFUVVFU1QpIHsKKyAgICBoZHJfY291bnQgPSAmcGFyc2VyLT5odHRwLnJlcXVlc3QuaGRyX2NvdW50OworICAgIGhkcnMgPSAmcGFyc2VyLT5odHRwLnJlcXVlc3QuaGRyczsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICgqaGRyX2NvdW50ID09IHBhcnNlci0+aGRyX2NhcGFjaXR5KSB7CisgICAgcGFyc2VyLT5oZHJfY2FwYWNpdHkgPQorICAgICAgICBHUFJfTUFYKHBhcnNlci0+aGRyX2NhcGFjaXR5ICsgMSwgcGFyc2VyLT5oZHJfY2FwYWNpdHkgKiAzIC8gMik7CisgICAgKmhkcnMgPSBncHJfcmVhbGxvYygqaGRycywgcGFyc2VyLT5oZHJfY2FwYWNpdHkgKiBzaXplb2YoKipoZHJzKSk7CisgIH0KKyAgKCpoZHJzKVsoKmhkcl9jb3VudCkrK10gPSBoZHI7CisgIHJldHVybiAxOworCitlcnJvcjoKKyAgZ3ByX2ZyZWUoaGRyLmtleSk7CisgIGdwcl9mcmVlKGhkci52YWx1ZSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmlzaF9saW5lKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgeworICBzd2l0Y2ggKHBhcnNlci0+c3RhdGUpIHsKKyAgICBjYXNlIEdSUENfSFRUUF9GSVJTVF9MSU5FOgorICAgICAgaWYgKCFoYW5kbGVfZmlyc3RfbGluZShwYXJzZXIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcGFyc2VyLT5zdGF0ZSA9IEdSUENfSFRUUF9IRUFERVJTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHUlBDX0hUVFBfSEVBREVSUzoKKyAgICAgIGlmIChwYXJzZXItPmN1cl9saW5lX2xlbmd0aCA9PSAyKSB7CisgICAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0hUVFBfQk9EWTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoIWFkZF9oZWFkZXIocGFyc2VyKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1JQQ19IVFRQX0JPRFk6CisgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7CisgIH0KKworICBwYXJzZXItPmN1cl9saW5lX2xlbmd0aCA9IDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFkZGJ5dGVfYm9keShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIsIHVpbnQ4X3QgYnl0ZSkgeworICBzaXplX3QgKmJvZHlfbGVuZ3RoID0gTlVMTDsKKyAgY2hhciAqKmJvZHkgPSBOVUxMOworCisgIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFU1BPTlNFKSB7CisgICAgYm9keV9sZW5ndGggPSAmcGFyc2VyLT5odHRwLnJlc3BvbnNlLmJvZHlfbGVuZ3RoOworICAgIGJvZHkgPSAmcGFyc2VyLT5odHRwLnJlc3BvbnNlLmJvZHk7CisgIH0gZWxzZSBpZiAocGFyc2VyLT50eXBlID09IEdSUENfSFRUUF9SRVFVRVNUKSB7CisgICAgYm9keV9sZW5ndGggPSAmcGFyc2VyLT5odHRwLnJlcXVlc3QuYm9keV9sZW5ndGg7CisgICAgYm9keSA9ICZwYXJzZXItPmh0dHAucmVxdWVzdC5ib2R5OworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCpib2R5X2xlbmd0aCA9PSBwYXJzZXItPmJvZHlfY2FwYWNpdHkpIHsKKyAgICBwYXJzZXItPmJvZHlfY2FwYWNpdHkgPSBHUFJfTUFYKDgsIHBhcnNlci0+Ym9keV9jYXBhY2l0eSAqIDMgLyAyKTsKKyAgICAqYm9keSA9IGdwcl9yZWFsbG9jKCh2b2lkICopKmJvZHksIHBhcnNlci0+Ym9keV9jYXBhY2l0eSk7CisgIH0KKyAgKCpib2R5KVsqYm9keV9sZW5ndGhdID0gKGNoYXIpYnl0ZTsKKyAgKCpib2R5X2xlbmd0aCkrKzsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhZGRieXRlKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlciwgdWludDhfdCBieXRlKSB7CisgIHN3aXRjaCAocGFyc2VyLT5zdGF0ZSkgeworICAgIGNhc2UgR1JQQ19IVFRQX0ZJUlNUX0xJTkU6CisgICAgY2FzZSBHUlBDX0hUVFBfSEVBREVSUzoKKyAgICAgIGlmIChwYXJzZXItPmN1cl9saW5lX2xlbmd0aCA+PSBHUlBDX0hUVFBfUEFSU0VSX01BWF9IRUFERVJfTEVOR1RIKSB7CisgICAgICAgIGlmIChncnBjX2h0dHBfdHJhY2UpCisgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJIVFRQIGNsaWVudCBtYXggbGluZSBsZW5ndGggKCVkKSBleGNlZWRlZCIsCisgICAgICAgICAgICAgICAgICBHUlBDX0hUVFBfUEFSU0VSX01BWF9IRUFERVJfTEVOR1RIKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBwYXJzZXItPmN1cl9saW5lW3BhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoXSA9IGJ5dGU7CisgICAgICBwYXJzZXItPmN1cl9saW5lX2xlbmd0aCsrOworICAgICAgaWYgKHBhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoID49IDIgJiYKKyAgICAgICAgICBwYXJzZXItPmN1cl9saW5lW3BhcnNlci0+Y3VyX2xpbmVfbGVuZ3RoIC0gMl0gPT0gJ1xyJyAmJgorICAgICAgICAgIHBhcnNlci0+Y3VyX2xpbmVbcGFyc2VyLT5jdXJfbGluZV9sZW5ndGggLSAxXSA9PSAnXG4nKSB7CisgICAgICAgIHJldHVybiBmaW5pc2hfbGluZShwYXJzZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7CisgICAgY2FzZSBHUlBDX0hUVFBfQk9EWToKKyAgICAgIHJldHVybiBhZGRieXRlX2JvZHkocGFyc2VyLCBieXRlKTsKKyAgfQorICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Cit9CisKK3ZvaWQgZ3JwY19odHRwX3BhcnNlcl9pbml0KGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgeworICBtZW1zZXQocGFyc2VyLCAwLCBzaXplb2YoKnBhcnNlcikpOworICBwYXJzZXItPnN0YXRlID0gR1JQQ19IVFRQX0ZJUlNUX0xJTkU7CisgIHBhcnNlci0+dHlwZSA9IEdSUENfSFRUUF9VTktOT1dOOworfQorCit2b2lkIGdycGNfaHR0cF9wYXJzZXJfZGVzdHJveShncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpIHsKKyAgc2l6ZV90IGk7CisgIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFU1BPTlNFKSB7CisgICAgZ3ByX2ZyZWUocGFyc2VyLT5odHRwLnJlc3BvbnNlLmJvZHkpOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJzZXItPmh0dHAucmVzcG9uc2UuaGRyX2NvdW50OyBpKyspIHsKKyAgICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXNwb25zZS5oZHJzW2ldLmtleSk7CisgICAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVzcG9uc2UuaGRyc1tpXS52YWx1ZSk7CisgICAgfQorICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXNwb25zZS5oZHJzKTsKKyAgfSBlbHNlIGlmIChwYXJzZXItPnR5cGUgPT0gR1JQQ19IVFRQX1JFUVVFU1QpIHsKKyAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVxdWVzdC5ib2R5KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyc2VyLT5odHRwLnJlcXVlc3QuaGRyX2NvdW50OyBpKyspIHsKKyAgICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXF1ZXN0LmhkcnNbaV0ua2V5KTsKKyAgICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXF1ZXN0LmhkcnNbaV0udmFsdWUpOworICAgIH0KKyAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVxdWVzdC5oZHJzKTsKKyAgICBncHJfZnJlZShwYXJzZXItPmh0dHAucmVxdWVzdC5tZXRob2QpOworICAgIGdwcl9mcmVlKHBhcnNlci0+aHR0cC5yZXF1ZXN0LnBhdGgpOworICB9Cit9CisKK2ludCBncnBjX2h0dHBfcGFyc2VyX3BhcnNlKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlciwgZ3ByX3NsaWNlIHNsaWNlKSB7CisgIHNpemVfdCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKTsgaSsrKSB7CisgICAgaWYgKCFhZGRieXRlKHBhcnNlciwgR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSlbaV0pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gMTsKK30KKworaW50IGdycGNfaHR0cF9wYXJzZXJfZW9mKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcikgeworICByZXR1cm4gcGFyc2VyLT5zdGF0ZSA9PSBHUlBDX0hUVFBfQk9EWTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIGIvc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MjE3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSFRUUF9QQVJTRVJfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0hUVFBfUEFSU0VSX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgaGVhZGVyIHN0cmluZyBvZiB0aGUgZm9ybSAnS2V5OiBWYWx1ZVxyXG4nICovCisjZGVmaW5lIEdSUENfSFRUUF9QQVJTRVJfTUFYX0hFQURFUl9MRU5HVEggNDA5NgorCisvKiBBIHNpbmdsZSBoZWFkZXIgdG8gYmUgcGFzc2VkIGluIGEgcmVxdWVzdCAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19odHRwX2hlYWRlciB7CisgIGNoYXIgKmtleTsKKyAgY2hhciAqdmFsdWU7Cit9IGdycGNfaHR0cF9oZWFkZXI7CisKK3R5cGVkZWYgZW51bSB7CisgIEdSUENfSFRUUF9GSVJTVF9MSU5FLAorICBHUlBDX0hUVFBfSEVBREVSUywKKyAgR1JQQ19IVFRQX0JPRFkKK30gZ3JwY19odHRwX3BhcnNlcl9zdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19IVFRQX0hUVFAxMCwKKyAgR1JQQ19IVFRQX0hUVFAxMSwKKyAgR1JQQ19IVFRQX0hUVFAyMCwKK30gZ3JwY19odHRwX3ZlcnNpb247CisKK3R5cGVkZWYgZW51bSB7CisgIEdSUENfSFRUUF9SRVNQT05TRSwKKyAgR1JQQ19IVFRQX1JFUVVFU1QsCisgIEdSUENfSFRUUF9VTktOT1dOCit9IGdycGNfaHR0cF90eXBlOworCisvKiBBIHJlcXVlc3QgKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfaHR0cF9yZXF1ZXN0IHsKKyAgLyogTWV0aG9kIG9mIHRoZSByZXF1ZXN0IChlLmcuIEdFVCwgUE9TVCkgKi8KKyAgY2hhciAqbWV0aG9kOworICAvKiBUaGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgdG8gZmV0Y2ggKi8KKyAgY2hhciAqcGF0aDsKKyAgLyogSFRUUCB2ZXJzaW9uIHRvIHVzZSAqLworICBncnBjX2h0dHBfdmVyc2lvbiB2ZXJzaW9uOworICAvKiBIZWFkZXJzIGF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0ICovCisgIHNpemVfdCBoZHJfY291bnQ7CisgIGdycGNfaHR0cF9oZWFkZXIgKmhkcnM7CisgIC8qIEJvZHk6IGxlbmd0aCBhbmQgY29udGVudHM7IGNvbnRlbnRzIGFyZSBOT1QgbnVsbC10ZXJtaW5hdGVkICovCisgIHNpemVfdCBib2R5X2xlbmd0aDsKKyAgY2hhciAqYm9keTsKK30gZ3JwY19odHRwX3JlcXVlc3Q7CisKKy8qIEEgcmVzcG9uc2UgKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfaHR0cF9yZXNwb25zZSB7CisgIC8qIEhUVFAgc3RhdHVzIGNvZGUgKi8KKyAgaW50IHN0YXR1czsKKyAgLyogSGVhZGVyczogY291bnQgYW5kIGtleS92YWx1ZXMgKi8KKyAgc2l6ZV90IGhkcl9jb3VudDsKKyAgZ3JwY19odHRwX2hlYWRlciAqaGRyczsKKyAgLyogQm9keTogbGVuZ3RoIGFuZCBjb250ZW50czsgY29udGVudHMgYXJlIE5PVCBudWxsLXRlcm1pbmF0ZWQgKi8KKyAgc2l6ZV90IGJvZHlfbGVuZ3RoOworICBjaGFyICpib2R5OworfSBncnBjX2h0dHBfcmVzcG9uc2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19odHRwX3BhcnNlcl9zdGF0ZSBzdGF0ZTsKKyAgZ3JwY19odHRwX3R5cGUgdHlwZTsKKworICB1bmlvbiB7CisgICAgZ3JwY19odHRwX3Jlc3BvbnNlIHJlc3BvbnNlOworICAgIGdycGNfaHR0cF9yZXF1ZXN0IHJlcXVlc3Q7CisgIH0gaHR0cDsKKyAgc2l6ZV90IGJvZHlfY2FwYWNpdHk7CisgIHNpemVfdCBoZHJfY2FwYWNpdHk7CisKKyAgdWludDhfdCBjdXJfbGluZVtHUlBDX0hUVFBfUEFSU0VSX01BWF9IRUFERVJfTEVOR1RIXTsKKyAgc2l6ZV90IGN1cl9saW5lX2xlbmd0aDsKK30gZ3JwY19odHRwX3BhcnNlcjsKKwordm9pZCBncnBjX2h0dHBfcGFyc2VyX2luaXQoZ3JwY19odHRwX3BhcnNlciAqcGFyc2VyKTsKK3ZvaWQgZ3JwY19odHRwX3BhcnNlcl9kZXN0cm95KGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlcik7CisKK2ludCBncnBjX2h0dHBfcGFyc2VyX3BhcnNlKGdycGNfaHR0cF9wYXJzZXIgKnBhcnNlciwgZ3ByX3NsaWNlIHNsaWNlKTsKK2ludCBncnBjX2h0dHBfcGFyc2VyX2VvZihncnBjX2h0dHBfcGFyc2VyICpwYXJzZXIpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9IVFRQX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRlYmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCit2b2lkIGdycGNfY2xvc3VyZV9pbml0KGdycGNfY2xvc3VyZSAqY2xvc3VyZSwgZ3JwY19pb21ncl9jYl9mdW5jIGNiLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9hcmcpIHsKKyAgY2xvc3VyZS0+Y2IgPSBjYjsKKyAgY2xvc3VyZS0+Y2JfYXJnID0gY2JfYXJnOworICBjbG9zdXJlLT5maW5hbF9kYXRhID0gMDsKK30KKwordm9pZCBncnBjX2Nsb3N1cmVfbGlzdF9hZGQoZ3JwY19jbG9zdXJlX2xpc3QgKmNsb3N1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSwgYm9vbCBzdWNjZXNzKSB7CisgIGlmIChjbG9zdXJlID09IE5VTEwpIHJldHVybjsKKyAgY2xvc3VyZS0+ZmluYWxfZGF0YSA9IChzdWNjZXNzICE9IDApOworICBpZiAoY2xvc3VyZV9saXN0LT5oZWFkID09IE5VTEwpIHsKKyAgICBjbG9zdXJlX2xpc3QtPmhlYWQgPSBjbG9zdXJlOworICB9IGVsc2UgeworICAgIGNsb3N1cmVfbGlzdC0+dGFpbC0+ZmluYWxfZGF0YSB8PSAodWludHB0cl90KWNsb3N1cmU7CisgIH0KKyAgY2xvc3VyZV9saXN0LT50YWlsID0gY2xvc3VyZTsKK30KKworYm9vbCBncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShncnBjX2Nsb3N1cmVfbGlzdCBjbG9zdXJlX2xpc3QpIHsKKyAgcmV0dXJuIGNsb3N1cmVfbGlzdC5oZWFkID09IE5VTEw7Cit9CisKK3ZvaWQgZ3JwY19jbG9zdXJlX2xpc3RfbW92ZShncnBjX2Nsb3N1cmVfbGlzdCAqc3JjLCBncnBjX2Nsb3N1cmVfbGlzdCAqZHN0KSB7CisgIGlmIChzcmMtPmhlYWQgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZHN0LT5oZWFkID09IE5VTEwpIHsKKyAgICAqZHN0ID0gKnNyYzsKKyAgfSBlbHNlIHsKKyAgICBkc3QtPnRhaWwtPmZpbmFsX2RhdGEgfD0gKHVpbnRwdHJfdClzcmMtPmhlYWQ7CisgICAgZHN0LT50YWlsID0gc3JjLT50YWlsOworICB9CisgIHNyYy0+aGVhZCA9IHNyYy0+dGFpbCA9IE5VTEw7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19pb21ncl9jYl9mdW5jIGNiOworICB2b2lkICpjYl9hcmc7CisgIGdycGNfY2xvc3VyZSB3cmFwcGVyOworfSB3cmFwcGVkX2Nsb3N1cmU7CisKK3N0YXRpYyB2b2lkIGNsb3N1cmVfd3JhcHBlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKKyAgd3JhcHBlZF9jbG9zdXJlICp3YyA9IGFyZzsKKyAgZ3JwY19pb21ncl9jYl9mdW5jIGNiID0gd2MtPmNiOworICB2b2lkICpjYl9hcmcgPSB3Yy0+Y2JfYXJnOworICBncHJfZnJlZSh3Yyk7CisgIGNiKGV4ZWNfY3R4LCBjYl9hcmcsIHN1Y2Nlc3MpOworfQorCitncnBjX2Nsb3N1cmUgKmdycGNfY2xvc3VyZV9jcmVhdGUoZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcpIHsKKyAgd3JhcHBlZF9jbG9zdXJlICp3YyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp3YykpOworICB3Yy0+Y2IgPSBjYjsKKyAgd2MtPmNiX2FyZyA9IGNiX2FyZzsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJndjLT53cmFwcGVyLCBjbG9zdXJlX3dyYXBwZXIsIHdjKTsKKyAgcmV0dXJuICZ3Yy0+d3JhcHBlcjsKK30KKworZ3JwY19jbG9zdXJlICpncnBjX2Nsb3N1cmVfbmV4dChncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIChncnBjX2Nsb3N1cmUgKikoY2xvc3VyZS0+ZmluYWxfZGF0YSAmIH4odWludHB0cl90KTEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCBiL3NyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5N2NmMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX0NMT1NVUkVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX0NMT1NVUkVfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCBncnBjX2Nsb3N1cmU7Cit0eXBlZGVmIHN0cnVjdCBncnBjX2Nsb3N1cmUgZ3JwY19jbG9zdXJlOworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBleGVjX2N0eC5oICovCitzdHJ1Y3QgZ3JwY19leGVjX2N0eDsKK3R5cGVkZWYgc3RydWN0IGdycGNfZXhlY19jdHggZ3JwY19leGVjX2N0eDsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jbG9zdXJlX2xpc3QgeworICBncnBjX2Nsb3N1cmUgKmhlYWQ7CisgIGdycGNfY2xvc3VyZSAqdGFpbDsKK30gZ3JwY19jbG9zdXJlX2xpc3Q7CisKKy8qKiBnUlBDIENhbGxiYWNrIGRlZmluaXRpb24uCisgKgorICogXHBhcmFtIGFyZyBBcmJpdHJhcnkgaW5wdXQuCisgKiBccGFyYW0gc3VjY2VzcyBBbiBpbmRpY2F0aW9uIG9uIHRoZSBzdGF0ZSBvZiB0aGUgaW9tZ3IuIE9uIGZhbHNlLCBjbGVhbnVwCisgKiBhY3Rpb25zIHNob3VsZCBiZSB0YWtlbiAoZWcsIHNodXRkb3duKS4gKi8KK3R5cGVkZWYgdm9pZCAoKmdycGNfaW9tZ3JfY2JfZnVuYykoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKKworLyoqIEEgY2xvc3VyZSBvdmVyIGEgZ3JwY19pb21ncl9jYl9mdW5jLiAqLworc3RydWN0IGdycGNfY2xvc3VyZSB7CisgIC8qKiBCb3VuZCBjYWxsYmFjay4gKi8KKyAgZ3JwY19pb21ncl9jYl9mdW5jIGNiOworCisgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvICJjYiIuICovCisgIHZvaWQgKmNiX2FyZzsKKworICAvKiogT25jZSBlbnF1ZXVlZCwgY29udGFpbnMgaW4gdGhlIGxvd2VyIGJpdCB0aGUgc3VjY2VzcyBvZiB0aGUgY2xvc3VyZSwKKyAgICAgIGFuZCBpbiB0aGUgdXBwZXIgYml0cyB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBjbG9zdXJlIGluIHRoZSBsaXN0LgorICAgICAgQmVmb3JlIGVucXVlaW5nIGZvciBleGVjdXRpb24sIHRoaXMgaXMgdXNhYmxlIGZvciBzY3JhdGNoIGRhdGEuICovCisgIHVpbnRwdHJfdCBmaW5hbF9kYXRhOworfTsKKworLyoqIEluaXRpYWxpemVzIFxhIGNsb3N1cmUgd2l0aCBcYSBjYiBhbmQgXGEgY2JfYXJnLiAqLwordm9pZCBncnBjX2Nsb3N1cmVfaW5pdChncnBjX2Nsb3N1cmUgKmNsb3N1cmUsIGdycGNfaW9tZ3JfY2JfZnVuYyBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKTsKKworLyogQ3JlYXRlIGEgaGVhcCBhbGxvY2F0ZWQgY2xvc3VyZTogdHJ5IHRvIGF2b2lkIGV4Y2VwdCBmb3IgdmVyeSByYXJlIGV2ZW50cyAqLworZ3JwY19jbG9zdXJlICpncnBjX2Nsb3N1cmVfY3JlYXRlKGdycGNfaW9tZ3JfY2JfZnVuYyBjYiwgdm9pZCAqY2JfYXJnKTsKKworI2RlZmluZSBHUlBDX0NMT1NVUkVfTElTVF9JTklUIFwKKyAgeyBOVUxMLCBOVUxMIH0KKworLyoqIGFkZCBcYSBjbG9zdXJlIHRvIHRoZSBlbmQgb2YgXGEgbGlzdCBhbmQgc2V0IFxhIGNsb3N1cmUncyBzdWNjZXNzIHRvIFxhCisgKiBzdWNjZXNzICovCit2b2lkIGdycGNfY2xvc3VyZV9saXN0X2FkZChncnBjX2Nsb3N1cmVfbGlzdCAqbGlzdCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKKworLyoqIGFwcGVuZCBhbGwgY2xvc3VyZXMgZnJvbSBcYSBzcmMgdG8gXGEgZHN0IGFuZCBlbXB0eSBcYSBzcmMuICovCit2b2lkIGdycGNfY2xvc3VyZV9saXN0X21vdmUoZ3JwY19jbG9zdXJlX2xpc3QgKnNyYywgZ3JwY19jbG9zdXJlX2xpc3QgKmRzdCk7CisKKy8qKiByZXR1cm4gd2hldGhlciBcYSBsaXN0IGlzIGVtcHR5LiAqLworYm9vbCBncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShncnBjX2Nsb3N1cmVfbGlzdCBsaXN0KTsKKworLyoqIHJldHVybiB0aGUgbmV4dCBwb2ludGVyIGZvciBhIHF1ZXVlZCBjbG9zdXJlIGxpc3QgKi8KK2dycGNfY2xvc3VyZSAqZ3JwY19jbG9zdXJlX25leHQoZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfQ0xPU1VSRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmI1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgiCisKK3ZvaWQgZ3JwY19lbmRwb2ludF9yZWFkKGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LCBncnBjX2VuZHBvaW50KiBlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIqIHNsaWNlcywgZ3JwY19jbG9zdXJlKiBjYikgeworICBlcC0+dnRhYmxlLT5yZWFkKGV4ZWNfY3R4LCBlcCwgc2xpY2VzLCBjYik7Cit9CisKK3ZvaWQgZ3JwY19lbmRwb2ludF93cml0ZShncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19lbmRwb2ludCogZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciogc2xpY2VzLCBncnBjX2Nsb3N1cmUqIGNiKSB7CisgIGVwLT52dGFibGUtPndyaXRlKGV4ZWNfY3R4LCBlcCwgc2xpY2VzLCBjYik7Cit9CisKK3ZvaWQgZ3JwY19lbmRwb2ludF9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19lbmRwb2ludCogZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0KiBwb2xsc2V0KSB7CisgIGVwLT52dGFibGUtPmFkZF90b19wb2xsc2V0KGV4ZWNfY3R4LCBlcCwgcG9sbHNldCk7Cit9CisKK3ZvaWQgZ3JwY19lbmRwb2ludF9hZGRfdG9fcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCogZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQqIGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBwb2xsc2V0X3NldCkgeworICBlcC0+dnRhYmxlLT5hZGRfdG9fcG9sbHNldF9zZXQoZXhlY19jdHgsIGVwLCBwb2xsc2V0X3NldCk7Cit9CisKK3ZvaWQgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwgZ3JwY19lbmRwb2ludCogZXApIHsKKyAgZXAtPnZ0YWJsZS0+c2h1dGRvd24oZXhlY19jdHgsIGVwKTsKK30KKwordm9pZCBncnBjX2VuZHBvaW50X2Rlc3Ryb3koZ3JwY19leGVjX2N0eCogZXhlY19jdHgsIGdycGNfZW5kcG9pbnQqIGVwKSB7CisgIGVwLT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIGVwKTsKK30KKworY2hhciogZ3JwY19lbmRwb2ludF9nZXRfcGVlcihncnBjX2VuZHBvaW50KiBlcCkgeworICByZXR1cm4gZXAtPnZ0YWJsZS0+Z2V0X3BlZXIoZXApOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmggYi9zcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThlNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9FTkRQT0lOVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfRU5EUE9JTlRfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXQuaCIKKworLyogQW4gZW5kcG9pbnQgY2FwcyBhIHN0cmVhbWluZyBjaGFubmVsIGJldHdlZW4gdHdvIGNvbW11bmljYXRpbmcgcHJvY2Vzc2VzLgorICAgRXhhbXBsZXMgbWF5IGJlOiBhIHRjcCBzb2NrZXQsIDxzdGRpbitzdGRvdXQ+LCBvciBzb21lIHNoYXJlZCBtZW1vcnkuICovCisKK3R5cGVkZWYgc3RydWN0IGdycGNfZW5kcG9pbnQgZ3JwY19lbmRwb2ludDsKK3R5cGVkZWYgc3RydWN0IGdycGNfZW5kcG9pbnRfdnRhYmxlIGdycGNfZW5kcG9pbnRfdnRhYmxlOworCitzdHJ1Y3QgZ3JwY19lbmRwb2ludF92dGFibGUgeworICB2b2lkICgqcmVhZCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKKyAgdm9pZCAoKndyaXRlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKKyAgdm9pZCAoKmFkZF90b19wb2xsc2V0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKKyAgdm9pZCAoKmFkZF90b19wb2xsc2V0X3NldCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0KTsKKyAgdm9pZCAoKnNodXRkb3duKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApOworICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwKTsKKyAgY2hhciAqKCpnZXRfcGVlcikoZ3JwY19lbmRwb2ludCAqZXApOworfTsKKworLyogV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgY29ubmVjdGlvbiwgY2FsbHMgdGhlIGNhbGxiYWNrIHdpdGggc2xpY2VzLgorICAgQ2FsbGJhY2sgc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCB0aGUgZW5kcG9pbnQgY2FuIGFjY2VwdCBtb3JlIHJlYWRzLCBmYWlsdXJlCisgICBpbmRpY2F0ZXMgdGhlIGVuZHBvaW50IGlzIGNsb3NlZC4KKyAgIFZhbGlkIHNsaWNlcyBtYXkgYmUgcGxhY2VkIGludG8gXGEgc2xpY2VzIGV2ZW4gb24gY2FsbGJhY2sgc3VjY2VzcyA9PSAwLiAqLwordm9pZCBncnBjX2VuZHBvaW50X3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKKworY2hhciAqZ3JwY19lbmRwb2ludF9nZXRfcGVlcihncnBjX2VuZHBvaW50ICplcCk7CisKKy8qIFdyaXRlIHNsaWNlcyBvdXQgdG8gdGhlIHNvY2tldC4KKworICAgSWYgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgZm9yIG1vcmUgZGF0YSBhZnRlciB0aGUgZW5kIG9mIHRoZSBjYWxsLCBpdAorICAgcmV0dXJucyBHUlBDX0VORFBPSU5UX0RPTkUuCisgICBPdGhlcndpc2UgaXQgcmV0dXJucyBHUlBDX0VORFBPSU5UX1BFTkRJTkcgYW5kIGNhbGxzIGNiIHdoZW4gdGhlCisgICBjb25uZWN0aW9uIGlzIHJlYWR5IGZvciBtb3JlIGRhdGEuCisgICBcYSBzbGljZXMgbWF5IGJlIG11dGF0ZWQgYXQgd2lsbCBieSB0aGUgZW5kcG9pbnQgdW50aWwgY2IgaXMgY2FsbGVkLgorICAgTm8gZ3VhcmFudGVlIGlzIG1hZGUgdG8gdGhlIGNvbnRlbnQgb2Ygc2xpY2VzIGFmdGVyIGEgd3JpdGUgRVhDRVBUIHRoYXQKKyAgIGl0IGlzIGEgdmFsaWQgc2xpY2UgYnVmZmVyLgorICAgKi8KK3ZvaWQgZ3JwY19lbmRwb2ludF93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKTsKKworLyogQ2F1c2VzIGFueSBwZW5kaW5nIHJlYWQvd3JpdGUgY2FsbGJhY2tzIHRvIHJ1biBpbW1lZGlhdGVseSB3aXRoCisgICBzdWNjZXNzPT0wICovCit2b2lkIGdycGNfZW5kcG9pbnRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwKTsKK3ZvaWQgZ3JwY19lbmRwb2ludF9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCk7CisKKy8qIEFkZCBhbiBlbmRwb2ludCB0byBhIHBvbGxzZXQsIHNvIHRoYXQgd2hlbiB0aGUgcG9sbHNldCBpcyBwb2xsZWQsIGV2ZW50cyBmcm9tCisgICB0aGlzIGVuZHBvaW50IGFyZSBjb25zaWRlcmVkICovCit2b2lkIGdycGNfZW5kcG9pbnRfYWRkX3RvX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Cit2b2lkIGdycGNfZW5kcG9pbnRfYWRkX3RvX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICplcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpOworCitzdHJ1Y3QgZ3JwY19lbmRwb2ludCB7CisgIGNvbnN0IGdycGNfZW5kcG9pbnRfdnRhYmxlICp2dGFibGU7Cit9OworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9FTkRQT0lOVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWY4YmIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfRU5EUE9JTlRfUEFJUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfRU5EUE9JTlRfUEFJUl9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2VuZHBvaW50ICpjbGllbnQ7CisgIGdycGNfZW5kcG9pbnQgKnNlcnZlcjsKK30gZ3JwY19lbmRwb2ludF9wYWlyOworCitncnBjX2VuZHBvaW50X3BhaXIgZ3JwY19pb21ncl9jcmVhdGVfZW5kcG9pbnRfcGFpcihjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlYWRfc2xpY2Vfc2l6ZSk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX0VORFBPSU5UX1BBSVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjZTQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9zb2NrZXRzKGludCBzdlsyXSkgeworICBpbnQgZmxhZ3M7CisgIGdycGNfY3JlYXRlX3NvY2tldHBhaXJfaWZfdW5peChzdik7CisgIGZsYWdzID0gZmNudGwoc3ZbMF0sIEZfR0VURkwsIDApOworICBHUFJfQVNTRVJUKGZjbnRsKHN2WzBdLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spID09IDApOworICBmbGFncyA9IGZjbnRsKHN2WzFdLCBGX0dFVEZMLCAwKTsKKyAgR1BSX0FTU0VSVChmY250bChzdlsxXSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA9PSAwKTsKKyAgR1BSX0FTU0VSVChncnBjX3NldF9zb2NrZXRfbm9fc2lncGlwZV9pZl9wb3NzaWJsZShzdlswXSkpOworICBHUFJfQVNTRVJUKGdycGNfc2V0X3NvY2tldF9ub19zaWdwaXBlX2lmX3Bvc3NpYmxlKHN2WzFdKSk7Cit9CisKK2dycGNfZW5kcG9pbnRfcGFpciBncnBjX2lvbWdyX2NyZWF0ZV9lbmRwb2ludF9wYWlyKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVhZF9zbGljZV9zaXplKSB7CisgIGludCBzdlsyXTsKKyAgZ3JwY19lbmRwb2ludF9wYWlyIHA7CisgIGNoYXIgKmZpbmFsX25hbWU7CisgIGNyZWF0ZV9zb2NrZXRzKHN2KTsKKworICBncHJfYXNwcmludGYoJmZpbmFsX25hbWUsICIlczpjbGllbnQiLCBuYW1lKTsKKyAgcC5jbGllbnQgPSBncnBjX3RjcF9jcmVhdGUoZ3JwY19mZF9jcmVhdGUoc3ZbMV0sIGZpbmFsX25hbWUpLCByZWFkX3NsaWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXRwYWlyLXNlcnZlciIpOworICBncHJfZnJlZShmaW5hbF9uYW1lKTsKKyAgZ3ByX2FzcHJpbnRmKCZmaW5hbF9uYW1lLCAiJXM6c2VydmVyIiwgbmFtZSk7CisgIHAuc2VydmVyID0gZ3JwY190Y3BfY3JlYXRlKGdycGNfZmRfY3JlYXRlKHN2WzBdLCBmaW5hbF9uYW1lKSwgcmVhZF9zbGljZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0cGFpci1jbGllbnQiKTsKKyAgZ3ByX2ZyZWUoZmluYWxfbmFtZSk7CisgIHJldHVybiBwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmExOGRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCIKKworc3RhdGljIHZvaWQgY3JlYXRlX3NvY2tldHMoU09DS0VUIHN2WzJdKSB7CisgIFNPQ0tFVCBzdnJfc29jayA9IElOVkFMSURfU09DS0VUOworICBTT0NLRVQgbHN0X3NvY2sgPSBJTlZBTElEX1NPQ0tFVDsKKyAgU09DS0VUIGNsaV9zb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgIFNPQ0tBRERSX0lOIGFkZHI7CisgIGludCBhZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKKworICBsc3Rfc29jayA9IFdTQVNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIFdTQV9GTEFHX09WRVJMQVBQRUQpOworICBHUFJfQVNTRVJUKGxzdF9zb2NrICE9IElOVkFMSURfU09DS0VUKTsKKworICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKyAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgR1BSX0FTU0VSVChiaW5kKGxzdF9zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgIT0KKyAgICAgICAgICAgICBTT0NLRVRfRVJST1IpOworICBHUFJfQVNTRVJUKGxpc3Rlbihsc3Rfc29jaywgU09NQVhDT05OKSAhPSBTT0NLRVRfRVJST1IpOworICBHUFJfQVNTRVJUKGdldHNvY2tuYW1lKGxzdF9zb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRyX2xlbikgIT0KKyAgICAgICAgICAgICBTT0NLRVRfRVJST1IpOworCisgIGNsaV9zb2NrID0gV1NBU29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgV1NBX0ZMQUdfT1ZFUkxBUFBFRCk7CisgIEdQUl9BU1NFUlQoY2xpX3NvY2sgIT0gSU5WQUxJRF9TT0NLRVQpOworCisgIEdQUl9BU1NFUlQoV1NBQ29ubmVjdChjbGlfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBhZGRyX2xlbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpID09IDApOworICBzdnJfc29jayA9IGFjY2VwdChsc3Rfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcl9sZW4pOworICBHUFJfQVNTRVJUKHN2cl9zb2NrICE9IElOVkFMSURfU09DS0VUKTsKKworICBjbG9zZXNvY2tldChsc3Rfc29jayk7CisgIGdycGNfdGNwX3ByZXBhcmVfc29ja2V0KGNsaV9zb2NrKTsKKyAgZ3JwY190Y3BfcHJlcGFyZV9zb2NrZXQoc3ZyX3NvY2spOworCisgIHN2WzFdID0gY2xpX3NvY2s7CisgIHN2WzBdID0gc3ZyX3NvY2s7Cit9CisKK2dycGNfZW5kcG9pbnRfcGFpciBncnBjX2lvbWdyX2NyZWF0ZV9lbmRwb2ludF9wYWlyKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVhZF9zbGljZV9zaXplKSB7CisgIFNPQ0tFVCBzdlsyXTsKKyAgZ3JwY19lbmRwb2ludF9wYWlyIHA7CisgIGNyZWF0ZV9zb2NrZXRzKHN2KTsKKyAgcC5jbGllbnQgPSBncnBjX3RjcF9jcmVhdGUoZ3JwY193aW5zb2NrZXRfY3JlYXRlKHN2WzFdLCAiZW5kcG9pbnQ6Y2xpZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRwb2ludDpzZXJ2ZXIiKTsKKyAgcC5zZXJ2ZXIgPSBncnBjX3RjcF9jcmVhdGUoZ3JwY193aW5zb2NrZXRfY3JlYXRlKHN2WzBdLCAiZW5kcG9pbnQ6c2VydmVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRwb2ludDpjbGllbnQiKTsKKyAgcmV0dXJuIHA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ2ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisKKyNpZm5kZWYgR1JQQ19FWEVDVVRJT05fQ09OVEVYVF9TQU5JVElaRVIKK2Jvb2wgZ3JwY19leGVjX2N0eF9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkgeworICBib29sIGRpZF9zb21ldGhpbmcgPSAwOworICBHUFJfVElNRVJfQkVHSU4oImdycGNfZXhlY19jdHhfZmx1c2giLCAwKTsKKyAgd2hpbGUgKCFncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShleGVjX2N0eC0+Y2xvc3VyZV9saXN0KSkgeworICAgIGdycGNfY2xvc3VyZSAqYyA9IGV4ZWNfY3R4LT5jbG9zdXJlX2xpc3QuaGVhZDsKKyAgICBleGVjX2N0eC0+Y2xvc3VyZV9saXN0LmhlYWQgPSBleGVjX2N0eC0+Y2xvc3VyZV9saXN0LnRhaWwgPSBOVUxMOworICAgIHdoaWxlIChjICE9IE5VTEwpIHsKKyAgICAgIGJvb2wgc3VjY2VzcyA9IChib29sKShjLT5maW5hbF9kYXRhICYgMSk7CisgICAgICBncnBjX2Nsb3N1cmUgKm5leHQgPSAoZ3JwY19jbG9zdXJlICopKGMtPmZpbmFsX2RhdGEgJiB+KHVpbnRwdHJfdCkxKTsKKyAgICAgIGRpZF9zb21ldGhpbmcgPSB0cnVlOworICAgICAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2V4ZWNfY3R4X2ZsdXNoLmNiIiwgMCk7CisgICAgICBjLT5jYihleGVjX2N0eCwgYy0+Y2JfYXJnLCBzdWNjZXNzKTsKKyAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfZXhlY19jdHhfZmx1c2guY2IiLCAwKTsKKyAgICAgIGMgPSBuZXh0OworICAgIH0KKyAgfQorICBHUFJfVElNRVJfRU5EKCJncnBjX2V4ZWNfY3R4X2ZsdXNoIiwgMCk7CisgIHJldHVybiBkaWRfc29tZXRoaW5nOworfQorCit2b2lkIGdycGNfZXhlY19jdHhfZmluaXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4KSB7CisgIGdycGNfZXhlY19jdHhfZmx1c2goZXhlY19jdHgpOworfQorCit2b2lkIGdycGNfZXhlY19jdHhfZW5xdWV1ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKm9mZmxvYWRfdGFyZ2V0X29yX251bGwpIHsKKyAgR1BSX0FTU0VSVChvZmZsb2FkX3RhcmdldF9vcl9udWxsID09IE5VTEwpOworICBncnBjX2Nsb3N1cmVfbGlzdF9hZGQoJmV4ZWNfY3R4LT5jbG9zdXJlX2xpc3QsIGNsb3N1cmUsIHN1Y2Nlc3MpOworfQorCit2b2lkIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmVfbGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKm9mZmxvYWRfdGFyZ2V0X29yX251bGwpIHsKKyAgR1BSX0FTU0VSVChvZmZsb2FkX3RhcmdldF9vcl9udWxsID09IE5VTEwpOworICBncnBjX2Nsb3N1cmVfbGlzdF9tb3ZlKGxpc3QsICZleGVjX2N0eC0+Y2xvc3VyZV9saXN0KTsKK30KKwordm9pZCBncnBjX2V4ZWNfY3R4X2dsb2JhbF9pbml0KHZvaWQpIHt9Cit2b2lkIGdycGNfZXhlY19jdHhfZ2xvYmFsX3NodXRkb3duKHZvaWQpIHt9CisjZWxzZQorc3RhdGljIGdwcl9tdSBnX211Oworc3RhdGljIGdwcl9jdiBnX2N2Oworc3RhdGljIGludCBnX3RocmVhZHMgPSAwOworCitzdGF0aWMgdm9pZCBydW5fY2xvc3VyZSh2b2lkICphcmcpIHsKKyAgZ3JwY19jbG9zdXJlICpjbG9zdXJlID0gYXJnOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICBjbG9zdXJlLT5jYigmZXhlY19jdHgsIGNsb3N1cmUtPmNiX2FyZywgKGNsb3N1cmUtPmZpbmFsX2RhdGEgJiAxKSAhPSAwKTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgZ3ByX211X2xvY2soJmdfbXUpOworICBpZiAoLS1nX3RocmVhZHMgPT0gMCkgeworICAgIGdwcl9jdl9zaWduYWwoJmdfY3YpOworICB9CisgIGdwcl9tdV91bmxvY2soJmdfbXUpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9jbG9zdXJlKGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgeworICBncHJfdGhkX2lkIGlkOworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGdfdGhyZWFkcysrOworICBncHJfbXVfdW5sb2NrKCZnX211KTsKKyAgZ3ByX3RoZF9uZXcoJmlkLCBydW5fY2xvc3VyZSwgY2xvc3VyZSwgTlVMTCk7Cit9CisKK2Jvb2wgZ3JwY19leGVjX2N0eF9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkgeyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCBncnBjX2V4ZWNfY3R4X2ZpbmlzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCkge30KKwordm9pZCBncnBjX2V4ZWNfY3R4X2VucXVldWUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2xvc3VyZSAqY2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICpvZmZsb2FkX3RhcmdldF9vcl9udWxsKSB7CisgIEdQUl9BU1NFUlQob2ZmbG9hZF90YXJnZXRfb3JfbnVsbCA9PSBOVUxMKTsKKyAgaWYgKGNsb3N1cmUgPT0gTlVMTCkgcmV0dXJuOworICBjbG9zdXJlLT5maW5hbF9kYXRhID0gc3VjY2VzczsKKyAgc3RhcnRfY2xvc3VyZShjbG9zdXJlKTsKK30KKwordm9pZCBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlX2xpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICpvZmZsb2FkX3RhcmdldF9vcl9udWxsKSB7CisgIEdQUl9BU1NFUlQob2ZmbG9hZF90YXJnZXRfb3JfbnVsbCA9PSBOVUxMKTsKKyAgaWYgKGxpc3QgPT0gTlVMTCkgcmV0dXJuOworICBncnBjX2Nsb3N1cmUgKnAgPSBsaXN0LT5oZWFkOworICB3aGlsZSAocCkgeworICAgIGdycGNfY2xvc3VyZSAqc3RhcnQgPSBwOworICAgIHAgPSBncnBjX2Nsb3N1cmVfbmV4dChzdGFydCk7CisgICAgc3RhcnRfY2xvc3VyZShzdGFydCk7CisgIH0KKyAgZ3JwY19jbG9zdXJlX2xpc3QgciA9IEdSUENfQ0xPU1VSRV9MSVNUX0lOSVQ7CisgICpsaXN0ID0gcjsKK30KKwordm9pZCBncnBjX2V4ZWNfY3R4X2dsb2JhbF9pbml0KHZvaWQpIHsKKyAgZ3ByX211X2luaXQoJmdfbXUpOworICBncHJfY3ZfaW5pdCgmZ19jdik7Cit9CisKK3ZvaWQgZ3JwY19leGVjX2N0eF9nbG9iYWxfc2h1dGRvd24odm9pZCkgeworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIHdoaWxlIChnX3RocmVhZHMgIT0gMCkgeworICAgIGdwcl9jdl93YWl0KCZnX2N2LCAmZ19tdSwgZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKSk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19tdSk7CisKKyAgZ3ByX211X2Rlc3Ryb3koJmdfbXUpOworICBncHJfY3ZfZGVzdHJveSgmZ19jdik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyZWEyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9FWEVDX0NUWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfRVhFQ19DVFhfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIKKworLyogI2RlZmluZSBHUlBDX0VYRUNVVElPTl9DT05URVhUX1NBTklUSVpFUiAxICovCisKKy8qKiBBIHdvcmtxdWV1ZSByZXByZXNlbnRzIGEgbGlzdCBvZiB3b3JrIHRvIGJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5LgorICAgIEZvcndhcmQgZGVjbGFyZWQgaGVyZSB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCB3b3JrcXVldWUuaC4gKi8KK3N0cnVjdCBncnBjX3dvcmtxdWV1ZTsKK3R5cGVkZWYgc3RydWN0IGdycGNfd29ya3F1ZXVlIGdycGNfd29ya3F1ZXVlOworCisjaWZuZGVmIEdSUENfRVhFQ1VUSU9OX0NPTlRFWFRfU0FOSVRJWkVSCisvKiogRXhlY3V0aW9uIGNvbnRleHQuCisgKiAgQSBiYWcgb2YgZGF0YSB0aGF0IGNvbGxlY3RzIGluZm9ybWF0aW9uIGFsb25nIGEgY2FsbHN0YWNrLgorICogIEdlbmVyYWxseSBjcmVhdGVkIGF0IHB1YmxpYyBBUEkgZW50cnkgcG9pbnRzLCBhbmQgcGFzc2VkIGRvd24gYXMKKyAqICBwb2ludGVyIHRvIGNoaWxkIGZ1bmN0aW9ucyB0aGF0IG1hbmlwdWxhdGUgaXQuCisgKgorICogIFNwZWNpZmljIHJlc3BvbnNpYmlsaXRpZXMgKHRoaXMgbWF5IGdyb3cgaW4gdGhlIGZ1dHVyZSk6CisgKiAgLSB0cmFjayBhIGxpc3Qgb2Ygd29yayB0aGF0IG5lZWRzIHRvIGJlIGRlbGF5ZWQgdW50aWwgdGhlIHRvcCBvZiB0aGUKKyAqICAgIGNhbGwgc3RhY2sgKHRoaXMgcHJvdmlkZXMgYSBjb252ZW5pZW50IG1lY2hhbmlzbSB0byBydW4gY2FsbGJhY2tzCisgKiAgICB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGxvY2tpbmcgaXNzdWVzKQorICoKKyAqICBDT05WRU5USU9OUzoKKyAqICBJbnN0YW5jZSBvZiB0aGlzIG11c3QgQUxXQVlTIGJlIGNvbnN0cnVjdGVkIG9uIHRoZSBzdGFjaywgbmV2ZXIKKyAqICBoZWFwIGFsbG9jYXRlZC4gSW5zdGFuY2VzIGFuZCBwb2ludGVycyB0byB0aGVtIG11c3QgYWx3YXlzIGJlIGNhbGxlZAorICogIGV4ZWNfY3R4LiBJbnN0YW5jZXMgYXJlIGFsd2F5cyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CisgKiAgdG8gYSBmdW5jdGlvbiB0aGF0IHRha2VzIGl0LCBhbmQgYWx3YXlzIGFzIGEgcG9pbnRlciAoZ3JwY19leGVjX2N0eAorICogIGlzIG5ldmVyIGNvcGllZCkuCisgKi8KK3N0cnVjdCBncnBjX2V4ZWNfY3R4IHsKKyAgZ3JwY19jbG9zdXJlX2xpc3QgY2xvc3VyZV9saXN0OworfTsKKworI2RlZmluZSBHUlBDX0VYRUNfQ1RYX0lOSVQgXAorICB7IEdSUENfQ0xPU1VSRV9MSVNUX0lOSVQgfQorI2Vsc2UKK3N0cnVjdCBncnBjX2V4ZWNfY3R4IHsKKyAgaW50IHVudXNlZDsKK307CisjZGVmaW5lIEdSUENfRVhFQ19DVFhfSU5JVCBcCisgIHsgMCB9CisjZW5kaWYKKworLyoqIEZsdXNoIGFueSB3b3JrIHRoYXQgaGFzIGJlZW4gZW5xdWV1ZWQgb250byB0aGlzIGdycGNfZXhlY19jdHguCisgKiAgQ2FsbGVyIG11c3QgZ3VhcmFudGVlIHRoYXQgbm8gaW50ZXJmZXJpbmcgbG9ja3MgYXJlIGhlbGQuCisgKiAgUmV0dXJucyB0cnVlIGlmIHdvcmsgd2FzIHBlcmZvcm1lZCwgZmFsc2Ugb3RoZXJ3aXNlLiAqLworYm9vbCBncnBjX2V4ZWNfY3R4X2ZsdXNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4KTsKKy8qKiBGaW5pc2ggYW55IHBlbmRpbmcgd29yayBmb3IgYSBncnBjX2V4ZWNfY3R4LiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAqICB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLCBvciB3b3JrIG1heSBiZSBsb3N0LiAqLwordm9pZCBncnBjX2V4ZWNfY3R4X2ZpbmlzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCk7CisvKiogQWRkIGEgY2xvc3VyZSB0byBiZSBleGVjdXRlZCBhdCB0aGUgbmV4dCBmbHVzaC9maW5pc2ggcG9pbnQgKi8KK3ZvaWQgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nsb3N1cmUgKmNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3dvcmtxdWV1ZSAqb2ZmbG9hZF90YXJnZXRfb3JfbnVsbCk7CisvKiogQWRkIGEgbGlzdCBvZiBjbG9zdXJlcyB0byBiZSBleGVjdXRlZCBhdCB0aGUgbmV4dCBmbHVzaC9maW5pc2ggcG9pbnQuCisgKiAgTGVhdmVzIFxhIGxpc3QgZW1wdHkuICovCit2b2lkIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmVfbGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193b3JrcXVldWUgKm9mZmxvYWRfdGFyZ2V0X29yX251bGwpOworCit2b2lkIGdycGNfZXhlY19jdHhfZ2xvYmFsX2luaXQodm9pZCk7Cit2b2lkIGdycGNfZXhlY19jdHhfZ2xvYmFsX3NodXRkb3duKHZvaWQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9FWEVDX0NUWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTlkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfZXhlY3V0b3JfZGF0YSB7CisgIGludCBidXN5OyAgICAgICAgICAvKio8IGlzIHRoZSB0aHJlYWQgY3VycmVudGx5IHJ1bm5pbmc/ICovCisgIGludCBzaHV0dGluZ19kb3duOyAvKio8IGhhcyBcYSBncnBjX3NodXRkb3duKCkgYmVlbiBpbnZva2VkPyAqLworICBpbnQgcGVuZGluZ19qb2luOyAgLyoqPCBoYXMgdGhlIHRocmVhZCBmaW5pc2hlZCBidXQgbm90IGJlZW4gam9pbmVkPyAqLworICBncnBjX2Nsb3N1cmVfbGlzdCBjbG9zdXJlczsgLyoqPCBjb2xsZWN0aW9uIG9mIHBlbmRpbmcgd29yayAqLworICBncHJfdGhkX2lkIHRpZDsgLyoqPCB0aHJlYWQgaWQgb2YgdGhlIHRocmVhZCwgb25seSB2YWxpZCBpZiBcYSBidXN5IG9yIFxhCisgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2pvaW4gYXJlIHRydWUgKi8KKyAgZ3ByX3RoZF9vcHRpb25zIG9wdGlvbnM7CisgIGdwcl9tdSBtdTsKK30gZ3JwY19leGVjdXRvcjsKKworc3RhdGljIGdycGNfZXhlY3V0b3IgZ19leGVjdXRvcjsKKwordm9pZCBncnBjX2V4ZWN1dG9yX2luaXQoKSB7CisgIG1lbXNldCgmZ19leGVjdXRvciwgMCwgc2l6ZW9mKGdycGNfZXhlY3V0b3IpKTsKKyAgZ3ByX211X2luaXQoJmdfZXhlY3V0b3IubXUpOworICBnX2V4ZWN1dG9yLm9wdGlvbnMgPSBncHJfdGhkX29wdGlvbnNfZGVmYXVsdCgpOworICBncHJfdGhkX29wdGlvbnNfc2V0X2pvaW5hYmxlKCZnX2V4ZWN1dG9yLm9wdGlvbnMpOworfQorCisvKiB0aHJlYWQgYm9keSAqLworc3RhdGljIHZvaWQgY2xvc3VyZV9leGVjX3RocmVhZF9mdW5jKHZvaWQgKmlnbm9yZWQpIHsKKyAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKKyAgd2hpbGUgKDEpIHsKKyAgICBncHJfbXVfbG9jaygmZ19leGVjdXRvci5tdSk7CisgICAgaWYgKGdfZXhlY3V0b3Iuc2h1dHRpbmdfZG93biAhPSAwKSB7CisgICAgICBncHJfbXVfdW5sb2NrKCZnX2V4ZWN1dG9yLm11KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkoZ19leGVjdXRvci5jbG9zdXJlcykpIHsKKyAgICAgIC8qIG5vIG1vcmUgd29yaywgdGltZSB0byBkaWUgKi8KKyAgICAgIEdQUl9BU1NFUlQoZ19leGVjdXRvci5idXN5ID09IDEpOworICAgICAgZ19leGVjdXRvci5idXN5ID0gMDsKKyAgICAgIGdwcl9tdV91bmxvY2soJmdfZXhlY3V0b3IubXUpOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KCZleGVjX2N0eCwgJmdfZXhlY3V0b3IuY2xvc3VyZXMsIE5VTEwpOworICAgIH0KKyAgICBncHJfbXVfdW5sb2NrKCZnX2V4ZWN1dG9yLm11KTsKKyAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKCZleGVjX2N0eCk7CisgIH0KKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKK30KKworLyogU3Bhd24gdGhlIHRocmVhZCBpZiBuZXcgd29yayBoYXMgYXJyaXZlZCBhIG5vIHRocmVhZCBpcyB1cCAqLworc3RhdGljIHZvaWQgbWF5YmVfc3Bhd25fbG9ja2VkKCkgeworICBpZiAoZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkoZ19leGVjdXRvci5jbG9zdXJlcykgPT0gMSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZ19leGVjdXRvci5zaHV0dGluZ19kb3duID09IDEpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZ19leGVjdXRvci5idXN5ICE9IDApIHsKKyAgICAvKiBUaHJlYWQgc3RpbGwgd29ya2luZy4gTmV3IHdvcmsgd2lsbCBiZSBwaWNrZWQgdXAgYnkgYWxyZWFkeSBydW5uaW5nCisgICAgICogdGhyZWFkLiBOb3Qgc3Bhd25pbmcgYW55dGhpbmcuICovCisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGdfZXhlY3V0b3IucGVuZGluZ19qb2luICE9IDApIHsKKyAgICAvKiBQaWNrdXAgdGhlIHJlbWFpbnMgb2YgdGhlIHByZXZpb3VzIGluY2FybmF0aW9ucyBvZiB0aGUgdGhyZWFkLiAqLworICAgIGdwcl90aGRfam9pbihnX2V4ZWN1dG9yLnRpZCk7CisgICAgZ19leGVjdXRvci5wZW5kaW5nX2pvaW4gPSAwOworICB9CisKKyAgLyogQWxsIHByZXZpb3VzIGluc3RhbmNlcyBvZiB0aGUgdGhyZWFkIHNob3VsZCBoYXZlIGJlZW4gam9pbmVkIGF0IHRoaXMgcG9pbnQuCisgICAqIFNwYXduIHRpbWUhICovCisgIGdfZXhlY3V0b3IuYnVzeSA9IDE7CisgIGdwcl90aGRfbmV3KCZnX2V4ZWN1dG9yLnRpZCwgY2xvc3VyZV9leGVjX3RocmVhZF9mdW5jLCBOVUxMLAorICAgICAgICAgICAgICAmZ19leGVjdXRvci5vcHRpb25zKTsKKyAgZ19leGVjdXRvci5wZW5kaW5nX2pvaW4gPSAxOworfQorCit2b2lkIGdycGNfZXhlY3V0b3JfZW5xdWV1ZShncnBjX2Nsb3N1cmUgKmNsb3N1cmUsIGJvb2wgc3VjY2VzcykgeworICBncHJfbXVfbG9jaygmZ19leGVjdXRvci5tdSk7CisgIGlmIChnX2V4ZWN1dG9yLnNodXR0aW5nX2Rvd24gPT0gMCkgeworICAgIGdycGNfY2xvc3VyZV9saXN0X2FkZCgmZ19leGVjdXRvci5jbG9zdXJlcywgY2xvc3VyZSwgc3VjY2Vzcyk7CisgICAgbWF5YmVfc3Bhd25fbG9ja2VkKCk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19leGVjdXRvci5tdSk7Cit9CisKK3ZvaWQgZ3JwY19leGVjdXRvcl9zaHV0ZG93bigpIHsKKyAgaW50IHBlbmRpbmdfam9pbjsKKyAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKKworICBncHJfbXVfbG9jaygmZ19leGVjdXRvci5tdSk7CisgIHBlbmRpbmdfam9pbiA9IGdfZXhlY3V0b3IucGVuZGluZ19qb2luOworICBnX2V4ZWN1dG9yLnNodXR0aW5nX2Rvd24gPSAxOworICBncHJfbXVfdW5sb2NrKCZnX2V4ZWN1dG9yLm11KTsKKyAgLyogd2UgY2FuIHJlbGVhc2UgdGhlIGxvY2sgYXQgdGhpcyBwb2ludCBkZXNwaXRlIHRoZSBhY2Nlc3MgdG8gdGhlIGNsb3N1cmUKKyAgICogbGlzdCBiZWxvdyBiZWNhdXNlIHdlIGFyZW4ndCBhY2NlcHRpbmcgbmV3IHdvcmsgKi8KKworICAvKiBFeGVjdXRlIHBlbmRpbmcgY2FsbGJhY2tzLCBzb21lIG1heSBiZSBwZXJmb3JtaW5nIGNsZWFudXBzICovCisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZV9saXN0KCZleGVjX2N0eCwgJmdfZXhlY3V0b3IuY2xvc3VyZXMsIE5VTEwpOworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICBHUFJfQVNTRVJUKGdycGNfY2xvc3VyZV9saXN0X2VtcHR5KGdfZXhlY3V0b3IuY2xvc3VyZXMpKTsKKyAgaWYgKHBlbmRpbmdfam9pbikgeworICAgIGdwcl90aGRfam9pbihnX2V4ZWN1dG9yLnRpZCk7CisgIH0KKyAgZ3ByX211X2Rlc3Ryb3koJmdfZXhlY3V0b3IubXUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmggYi9zcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTg3MTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX0VYRUNVVE9SX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9FWEVDVVRPUl9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5oIgorCisvKiogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIGV4ZWN1dG9yLgorICoKKyAqIFRoaXMgbWVjaGFuaXNtIGlzIG1lYW50IHRvIG91dHNvdXJjZSB3b3JrIChncnBjX2Nsb3N1cmUgaW5zdGFuY2VzKSB0byBhCisgKiB0aHJlYWQsIGZvciB0aG9zZSBjYXNlcyB3aGVyZSBibG9ja2luZyBpc24ndCBhbiBvcHRpb24gYnV0IHRoZXJlIGlzbid0IGEKKyAqIG5vbi1ibG9ja2luZyBzb2x1dGlvbiBhdmFpbGFibGUuICovCit2b2lkIGdycGNfZXhlY3V0b3JfaW5pdCgpOworCisvKiogRW5xdWV1ZSBcYSBjbG9zdXJlIGZvciBpdHMgZXZlbnR1YWwgZXhlY3V0aW9uIG9mIFxhIGYoYXJnKSBvbiBhIHNlcGFyYXRlCisgKiB0aHJlYWQgKi8KK3ZvaWQgZ3JwY19leGVjdXRvcl9lbnF1ZXVlKGdycGNfY2xvc3VyZSAqY2xvc3VyZSwgYm9vbCBzdWNjZXNzKTsKKworLyoqIFNodXRkb3duIHRoZSBleGVjdXRvciwgcnVubmluZyBhbGwgcGVuZGluZyB3b3JrIGFzIHBhcnQgb2YgdGhlIGNhbGwgKi8KK3ZvaWQgZ3JwY19leGVjdXRvcl9zaHV0ZG93bigpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9FWEVDVVRPUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzkyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgorCisjZGVmaW5lIENMT1NVUkVfTk9UX1JFQURZICgoZ3JwY19jbG9zdXJlICopMCkKKyNkZWZpbmUgQ0xPU1VSRV9SRUFEWSAoKGdycGNfY2xvc3VyZSAqKTEpCisKKy8qIFdlIG5lZWQgdG8ga2VlcCBhIGZyZWVsaXN0IG5vdCBiZWNhdXNlIG9mIGFueSBjb25jZXJucyBvZiBtYWxsb2MgcGVyZm9ybWFuY2UKKyAqIGJ1dCBpbnN0ZWFkIHNvIHRoYXQgaW1wbGVtZW50YXRpb25zIHdpdGggbXVsdGlwbGUgdGhyZWFkcyBpbiAoZm9yIGV4YW1wbGUpCisgKiBlcG9sbF93YWl0IGRlYWwgd2l0aCB0aGUgcmFjZSBiZXR3ZWVuIHBvbGxzZXQgcmVtb3ZhbCBhbmQgaW5jb21pbmcgcG9sbAorICogbm90aWZpY2F0aW9ucy4KKyAqCisgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBwb2xsZXIgdWx0aW1hdGVseSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGlzCisgKiBvYmplY3QsIHNvIGl0IGlzIHZlcnkgZGlmZmljdWx0IHRvIGtub3cgd2hlbiBpcyBzYWZlIHRvIGZyZWUgaXQsIGF0IGxlYXN0CisgKiB3aXRob3V0IHNvbWUgZXhwZW5zaXZlIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBJZiB3ZSBrZWVwIHRoZSBvYmplY3QgZnJlZWxpc3RlZCwgaW4gdGhlIHdvcnN0IGNhc2UgbG9zaW5nIHRoaXMgcmFjZSBqdXN0CisgKiBiZWNvbWVzIGEgc3B1cmlvdXMgcmVhZCBub3RpZmljYXRpb24gb24gYSByZXVzZWQgZmQuCisgKi8KKy8qIFRPRE8oa2xlbXBuZXIpOiBXZSBjb3VsZCB1c2Ugc29tZSBmb3JtIG9mIHBvbGxpbmcgZ2VuZXJhdGlvbiBjb3VudCB0byBrbm93CisgKiB3aGVuIHRoZXNlIGFyZSBzYWZlIHRvIGZyZWUuICovCisvKiBUT0RPKGtsZW1wbmVyKTogQ29uc2lkZXIgZGlzYWJsaW5nIGZyZWVsaXN0aW5nIGlmIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUKKyAqIHRocmVhZHMgaW4gcG9sbCBvbiB0aGUgc2FtZSBmZCAqLworLyogVE9ETyhrbGVtcG5lcik6IEJhdGNoIHRoZXNlIGFsbG9jYXRpb25zIHRvIHJlZHVjZSBmcmFnbWVudGF0aW9uICovCitzdGF0aWMgZ3JwY19mZCAqZmRfZnJlZWxpc3QgPSBOVUxMOworc3RhdGljIGdwcl9tdSBmZF9mcmVlbGlzdF9tdTsKKworc3RhdGljIHZvaWQgZnJlZWxpc3RfZmQoZ3JwY19mZCAqZmQpIHsKKyAgZ3ByX211X2xvY2soJmZkX2ZyZWVsaXN0X211KTsKKyAgZmQtPmZyZWVsaXN0X25leHQgPSBmZF9mcmVlbGlzdDsKKyAgZmRfZnJlZWxpc3QgPSBmZDsKKyAgZ3JwY19pb21ncl91bnJlZ2lzdGVyX29iamVjdCgmZmQtPmlvbWdyX29iamVjdCk7CisgIGdwcl9tdV91bmxvY2soJmZkX2ZyZWVsaXN0X211KTsKK30KKworc3RhdGljIGdycGNfZmQgKmFsbG9jX2ZkKGludCBmZCkgeworICBncnBjX2ZkICpyID0gTlVMTDsKKyAgZ3ByX211X2xvY2soJmZkX2ZyZWVsaXN0X211KTsKKyAgaWYgKGZkX2ZyZWVsaXN0ICE9IE5VTEwpIHsKKyAgICByID0gZmRfZnJlZWxpc3Q7CisgICAgZmRfZnJlZWxpc3QgPSBmZF9mcmVlbGlzdC0+ZnJlZWxpc3RfbmV4dDsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZmZF9mcmVlbGlzdF9tdSk7CisgIGlmIChyID09IE5VTEwpIHsKKyAgICByID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19mZCkpOworICAgIGdwcl9tdV9pbml0KCZyLT5tdSk7CisgIH0KKworICBncHJfbXVfbG9jaygmci0+bXUpOworICByLT5zaHV0ZG93biA9IDA7CisgIHItPnJlYWRfY2xvc3VyZSA9IENMT1NVUkVfTk9UX1JFQURZOworICByLT53cml0ZV9jbG9zdXJlID0gQ0xPU1VSRV9OT1RfUkVBRFk7CisgIHItPmZkID0gZmQ7CisgIHItPmluYWN0aXZlX3dhdGNoZXJfcm9vdC5uZXh0ID0gci0+aW5hY3RpdmVfd2F0Y2hlcl9yb290LnByZXYgPQorICAgICAgJnItPmluYWN0aXZlX3dhdGNoZXJfcm9vdDsKKyAgci0+ZnJlZWxpc3RfbmV4dCA9IE5VTEw7CisgIHItPnJlYWRfd2F0Y2hlciA9IHItPndyaXRlX3dhdGNoZXIgPSBOVUxMOworICByLT5vbl9kb25lX2Nsb3N1cmUgPSBOVUxMOworICByLT5jbG9zZWQgPSAwOworICByLT5yZWxlYXNlZCA9IDA7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZyLT5yZWZzdCwgMSk7CisgIGdwcl9tdV91bmxvY2soJnItPm11KTsKKworICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveShncnBjX2ZkICpmZCkgeworICBncHJfbXVfZGVzdHJveSgmZmQtPm11KTsKKyAgZ3ByX2ZyZWUoZmQpOworfQorCisjaWZkZWYgR1JQQ19GRF9SRUZfQ09VTlRfREVCVUcKKyNkZWZpbmUgUkVGX0JZKGZkLCBuLCByZWFzb24pIHJlZl9ieShmZCwgbiwgcmVhc29uLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIFVOUkVGX0JZKGZkLCBuLCByZWFzb24pIHVucmVmX2J5KGZkLCBuLCByZWFzb24sIF9fRklMRV9fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIHJlZl9ieShncnBjX2ZkICpmZCwgaW50IG4sIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBncHJfbG9nKEdQUl9ERUJVRywgIkZEICVkICVwICAgcmVmICVkICVkIC0+ICVkIFslczsgJXM6JWRdIiwgZmQtPmZkLCBmZCwgbiwKKyAgICAgICAgICBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmZmQtPnJlZnN0KSwKKyAgICAgICAgICBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmZmQtPnJlZnN0KSArIG4sIHJlYXNvbiwgZmlsZSwgbGluZSk7CisjZWxzZQorI2RlZmluZSBSRUZfQlkoZmQsIG4sIHJlYXNvbikgcmVmX2J5KGZkLCBuKQorI2RlZmluZSBVTlJFRl9CWShmZCwgbiwgcmVhc29uKSB1bnJlZl9ieShmZCwgbikKK3N0YXRpYyB2b2lkIHJlZl9ieShncnBjX2ZkICpmZCwgaW50IG4pIHsKKyNlbmRpZgorICBHUFJfQVNTRVJUKGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJmZkLT5yZWZzdCwgbikgPiAwKTsKK30KKworI2lmZGVmIEdSUENfRkRfUkVGX0NPVU5UX0RFQlVHCitzdGF0aWMgdm9pZCB1bnJlZl9ieShncnBjX2ZkICpmZCwgaW50IG4sIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIGdwcl9hdG0gb2xkOworICBncHJfbG9nKEdQUl9ERUJVRywgIkZEICVkICVwIHVucmVmICVkICVkIC0+ICVkIFslczsgJXM6JWRdIiwgZmQtPmZkLCBmZCwgbiwKKyAgICAgICAgICBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmZmQtPnJlZnN0KSwKKyAgICAgICAgICBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmZmQtPnJlZnN0KSAtIG4sIHJlYXNvbiwgZmlsZSwgbGluZSk7CisjZWxzZQorc3RhdGljIHZvaWQgdW5yZWZfYnkoZ3JwY19mZCAqZmQsIGludCBuKSB7CisgIGdwcl9hdG0gb2xkOworI2VuZGlmCisgIG9sZCA9IGdwcl9hdG1fZnVsbF9mZXRjaF9hZGQoJmZkLT5yZWZzdCwgLW4pOworICBpZiAob2xkID09IG4pIHsKKyAgICBmcmVlbGlzdF9mZChmZCk7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVChvbGQgPiBuKTsKKyAgfQorfQorCit2b2lkIGdycGNfZmRfZ2xvYmFsX2luaXQodm9pZCkgeyBncHJfbXVfaW5pdCgmZmRfZnJlZWxpc3RfbXUpOyB9CisKK3ZvaWQgZ3JwY19mZF9nbG9iYWxfc2h1dGRvd24odm9pZCkgeworICBncHJfbXVfbG9jaygmZmRfZnJlZWxpc3RfbXUpOworICBncHJfbXVfdW5sb2NrKCZmZF9mcmVlbGlzdF9tdSk7CisgIHdoaWxlIChmZF9mcmVlbGlzdCAhPSBOVUxMKSB7CisgICAgZ3JwY19mZCAqZmQgPSBmZF9mcmVlbGlzdDsKKyAgICBmZF9mcmVlbGlzdCA9IGZkX2ZyZWVsaXN0LT5mcmVlbGlzdF9uZXh0OworICAgIGRlc3Ryb3koZmQpOworICB9CisgIGdwcl9tdV9kZXN0cm95KCZmZF9mcmVlbGlzdF9tdSk7Cit9CisKK2dycGNfZmQgKmdycGNfZmRfY3JlYXRlKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSkgeworICBncnBjX2ZkICpyID0gYWxsb2NfZmQoZmQpOworICBjaGFyICpuYW1lMjsKKyAgZ3ByX2FzcHJpbnRmKCZuYW1lMiwgIiVzIGZkPSVkIiwgbmFtZSwgZmQpOworICBncnBjX2lvbWdyX3JlZ2lzdGVyX29iamVjdCgmci0+aW9tZ3Jfb2JqZWN0LCBuYW1lMik7CisgIGdwcl9mcmVlKG5hbWUyKTsKKyNpZmRlZiBHUlBDX0ZEX1JFRl9DT1VOVF9ERUJVRworICBncHJfbG9nKEdQUl9ERUJVRywgIkZEICVkICVwIGNyZWF0ZSAlcyIsIGZkLCByLCBuYW1lKTsKKyNlbmRpZgorICByZXR1cm4gcjsKK30KKworaW50IGdycGNfZmRfaXNfb3JwaGFuZWQoZ3JwY19mZCAqZmQpIHsKKyAgcmV0dXJuIChncHJfYXRtX2FjcV9sb2FkKCZmZC0+cmVmc3QpICYgMSkgPT0gMDsKK30KKworc3RhdGljIHZvaWQgcG9sbHNldF9raWNrX2xvY2tlZChncnBjX2ZkX3dhdGNoZXIgKndhdGNoZXIpIHsKKyAgZ3ByX211X2xvY2soJndhdGNoZXItPnBvbGxzZXQtPm11KTsKKyAgR1BSX0FTU0VSVCh3YXRjaGVyLT53b3JrZXIpOworICBncnBjX3BvbGxzZXRfa2lja19leHQod2F0Y2hlci0+cG9sbHNldCwgd2F0Y2hlci0+d29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19QT0xMU0VUX1JFRVZBTFVBVEVfUE9MTElOR19PTl9XQUtFVVApOworICBncHJfbXVfdW5sb2NrKCZ3YXRjaGVyLT5wb2xsc2V0LT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3dha2Vfb25lX3dhdGNoZXJfbG9ja2VkKGdycGNfZmQgKmZkKSB7CisgIGlmIChmZC0+aW5hY3RpdmVfd2F0Y2hlcl9yb290Lm5leHQgIT0gJmZkLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3QpIHsKKyAgICBwb2xsc2V0X2tpY2tfbG9ja2VkKGZkLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3QubmV4dCk7CisgIH0gZWxzZSBpZiAoZmQtPnJlYWRfd2F0Y2hlcikgeworICAgIHBvbGxzZXRfa2lja19sb2NrZWQoZmQtPnJlYWRfd2F0Y2hlcik7CisgIH0gZWxzZSBpZiAoZmQtPndyaXRlX3dhdGNoZXIpIHsKKyAgICBwb2xsc2V0X2tpY2tfbG9ja2VkKGZkLT53cml0ZV93YXRjaGVyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB3YWtlX2FsbF93YXRjaGVyc19sb2NrZWQoZ3JwY19mZCAqZmQpIHsKKyAgZ3JwY19mZF93YXRjaGVyICp3YXRjaGVyOworICBmb3IgKHdhdGNoZXIgPSBmZC0+aW5hY3RpdmVfd2F0Y2hlcl9yb290Lm5leHQ7CisgICAgICAgd2F0Y2hlciAhPSAmZmQtPmluYWN0aXZlX3dhdGNoZXJfcm9vdDsgd2F0Y2hlciA9IHdhdGNoZXItPm5leHQpIHsKKyAgICBwb2xsc2V0X2tpY2tfbG9ja2VkKHdhdGNoZXIpOworICB9CisgIGlmIChmZC0+cmVhZF93YXRjaGVyKSB7CisgICAgcG9sbHNldF9raWNrX2xvY2tlZChmZC0+cmVhZF93YXRjaGVyKTsKKyAgfQorICBpZiAoZmQtPndyaXRlX3dhdGNoZXIgJiYgZmQtPndyaXRlX3dhdGNoZXIgIT0gZmQtPnJlYWRfd2F0Y2hlcikgeworICAgIHBvbGxzZXRfa2lja19sb2NrZWQoZmQtPndyaXRlX3dhdGNoZXIpOworICB9Cit9CisKK3N0YXRpYyBpbnQgaGFzX3dhdGNoZXJzKGdycGNfZmQgKmZkKSB7CisgIHJldHVybiBmZC0+cmVhZF93YXRjaGVyICE9IE5VTEwgfHwgZmQtPndyaXRlX3dhdGNoZXIgIT0gTlVMTCB8fAorICAgICAgICAgZmQtPmluYWN0aXZlX3dhdGNoZXJfcm9vdC5uZXh0ICE9ICZmZC0+aW5hY3RpdmVfd2F0Y2hlcl9yb290OworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9mZF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkKSB7CisgIGZkLT5jbG9zZWQgPSAxOworICBpZiAoIWZkLT5yZWxlYXNlZCkgeworICAgIGNsb3NlKGZkLT5mZCk7CisgIH0gZWxzZSB7CisgICAgZ3JwY19yZW1vdmVfZmRfZnJvbV9hbGxfZXBvbGxfc2V0cyhmZC0+ZmQpOworICB9CisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgZmQtPm9uX2RvbmVfY2xvc3VyZSwgdHJ1ZSwgTlVMTCk7Cit9CisKK2ludCBncnBjX2ZkX3dyYXBwZWRfZmQoZ3JwY19mZCAqZmQpIHsKKyAgaWYgKGZkLT5yZWxlYXNlZCB8fCBmZC0+Y2xvc2VkKSB7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIHJldHVybiBmZC0+ZmQ7CisgIH0KK30KKwordm9pZCBncnBjX2ZkX29ycGhhbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZmQsIGdycGNfY2xvc3VyZSAqb25fZG9uZSwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpyZWxlYXNlX2ZkLCBjb25zdCBjaGFyICpyZWFzb24pIHsKKyAgZmQtPm9uX2RvbmVfY2xvc3VyZSA9IG9uX2RvbmU7CisgIGZkLT5yZWxlYXNlZCA9IHJlbGVhc2VfZmQgIT0gTlVMTDsKKyAgaWYgKCFmZC0+cmVsZWFzZWQpIHsKKyAgICBzaHV0ZG93bihmZC0+ZmQsIFNIVVRfUkRXUik7CisgIH0gZWxzZSB7CisgICAgKnJlbGVhc2VfZmQgPSBmZC0+ZmQ7CisgIH0KKyAgZ3ByX211X2xvY2soJmZkLT5tdSk7CisgIFJFRl9CWShmZCwgMSwgcmVhc29uKTsgLyogcmVtb3ZlIGFjdGl2ZSBzdGF0dXMsIGJ1dCBrZWVwIHJlZmVyZW5jZWQgKi8KKyAgaWYgKCFoYXNfd2F0Y2hlcnMoZmQpKSB7CisgICAgY2xvc2VfZmRfbG9ja2VkKGV4ZWNfY3R4LCBmZCk7CisgIH0gZWxzZSB7CisgICAgd2FrZV9hbGxfd2F0Y2hlcnNfbG9ja2VkKGZkKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZmZC0+bXUpOworICBVTlJFRl9CWShmZCwgMiwgcmVhc29uKTsgLyogZHJvcCB0aGUgcmVmZXJlbmNlICovCit9CisKKy8qIGluY3JlbWVudCByZWZjb3VudCBieSB0d28gdG8gYXZvaWQgY2hhbmdpbmcgdGhlIG9ycGhhbiBiaXQgKi8KKyNpZmRlZiBHUlBDX0ZEX1JFRl9DT1VOVF9ERUJVRwordm9pZCBncnBjX2ZkX3JlZihncnBjX2ZkICpmZCwgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICByZWZfYnkoZmQsIDIsIHJlYXNvbiwgZmlsZSwgbGluZSk7Cit9CisKK3ZvaWQgZ3JwY19mZF91bnJlZihncnBjX2ZkICpmZCwgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIHVucmVmX2J5KGZkLCAyLCByZWFzb24sIGZpbGUsIGxpbmUpOworfQorI2Vsc2UKK3ZvaWQgZ3JwY19mZF9yZWYoZ3JwY19mZCAqZmQpIHsgcmVmX2J5KGZkLCAyKTsgfQorCit2b2lkIGdycGNfZmRfdW5yZWYoZ3JwY19mZCAqZmQpIHsgdW5yZWZfYnkoZmQsIDIpOyB9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbm90aWZ5X29uX2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqKnN0LCBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgaWYgKCpzdCA9PSBDTE9TVVJFX05PVF9SRUFEWSkgeworICAgIC8qIG5vdCByZWFkeSA9PT4gc3dpdGNoIHRvIGEgd2FpdGluZyBzdGF0ZSBieSBzZXR0aW5nIHRoZSBjbG9zdXJlICovCisgICAgKnN0ID0gY2xvc3VyZTsKKyAgfSBlbHNlIGlmICgqc3QgPT0gQ0xPU1VSRV9SRUFEWSkgeworICAgIC8qIGFscmVhZHkgcmVhZHkgPT0+IHF1ZXVlIHRoZSBjbG9zdXJlIHRvIHJ1biBpbW1lZGlhdGVseSAqLworICAgICpzdCA9IENMT1NVUkVfTk9UX1JFQURZOworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2xvc3VyZSwgIWZkLT5zaHV0ZG93biwgTlVMTCk7CisgICAgbWF5YmVfd2FrZV9vbmVfd2F0Y2hlcl9sb2NrZWQoZmQpOworICB9IGVsc2UgeworICAgIC8qIHVwY2FsbHB0ciB3YXMgc2V0IHRvIGEgZGlmZmVyZW50IGNsb3N1cmUuICBUaGlzIGlzIGFuIGVycm9yISAqLworICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgIlVzZXIgY2FsbGVkIGEgbm90aWZ5X29uIGZ1bmN0aW9uIHdpdGggYSBwcmV2aW91cyBjYWxsYmFjayBzdGlsbCAiCisgICAgICAgICAgICAicGVuZGluZyIpOworICAgIGFib3J0KCk7CisgIH0KK30KKworLyogcmV0dXJucyAxIGlmIHN0YXRlIGJlY29tZXMgbm90IHJlYWR5ICovCitzdGF0aWMgaW50IHNldF9yZWFkeV9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqKnN0KSB7CisgIGlmICgqc3QgPT0gQ0xPU1VSRV9SRUFEWSkgeworICAgIC8qIGR1cGxpY2F0ZSByZWFkeSA9PT4gaWdub3JlICovCisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSBpZiAoKnN0ID09IENMT1NVUkVfTk9UX1JFQURZKSB7CisgICAgLyogbm90IHJlYWR5LCBhbmQgbm90IHdhaXRpbmcgPT0+IGZsYWcgcmVhZHkgKi8KKyAgICAqc3QgPSBDTE9TVVJFX1JFQURZOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIC8qIHdhaXRpbmcgPT0+IHF1ZXVlIGNsb3N1cmUgKi8KKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICpzdCwgIWZkLT5zaHV0ZG93biwgTlVMTCk7CisgICAgKnN0ID0gQ0xPU1VSRV9OT1RfUkVBRFk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2V0X3JlYWR5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwgZ3JwY19jbG9zdXJlICoqc3QpIHsKKyAgLyogb25seSBvbmUgc2V0X3JlYWR5IGNhbiBiZSBhY3RpdmUgYXQgb25jZSAoYnV0IHRoZXJlIG1heSBiZSBhIHJhY2luZworICAgICBub3RpZnlfb24pICovCisgIGdwcl9tdV9sb2NrKCZmZC0+bXUpOworICBzZXRfcmVhZHlfbG9ja2VkKGV4ZWNfY3R4LCBmZCwgc3QpOworICBncHJfbXVfdW5sb2NrKCZmZC0+bXUpOworfQorCit2b2lkIGdycGNfZmRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkKSB7CisgIGdwcl9tdV9sb2NrKCZmZC0+bXUpOworICBHUFJfQVNTRVJUKCFmZC0+c2h1dGRvd24pOworICBmZC0+c2h1dGRvd24gPSAxOworICBzZXRfcmVhZHlfbG9ja2VkKGV4ZWNfY3R4LCBmZCwgJmZkLT5yZWFkX2Nsb3N1cmUpOworICBzZXRfcmVhZHlfbG9ja2VkKGV4ZWNfY3R4LCBmZCwgJmZkLT53cml0ZV9jbG9zdXJlKTsKKyAgZ3ByX211X3VubG9jaygmZmQtPm11KTsKK30KKwordm9pZCBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgZ3ByX211X2xvY2soJmZkLT5tdSk7CisgIG5vdGlmeV9vbl9sb2NrZWQoZXhlY19jdHgsIGZkLCAmZmQtPnJlYWRfY2xvc3VyZSwgY2xvc3VyZSk7CisgIGdwcl9tdV91bmxvY2soJmZkLT5tdSk7Cit9CisKK3ZvaWQgZ3JwY19mZF9ub3RpZnlfb25fd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgZ3ByX211X2xvY2soJmZkLT5tdSk7CisgIG5vdGlmeV9vbl9sb2NrZWQoZXhlY19jdHgsIGZkLCAmZmQtPndyaXRlX2Nsb3N1cmUsIGNsb3N1cmUpOworICBncHJfbXVfdW5sb2NrKCZmZC0+bXUpOworfQorCit1aW50MzJfdCBncnBjX2ZkX2JlZ2luX3BvbGwoZ3JwY19mZCAqZmQsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIsIHVpbnQzMl90IHJlYWRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9tYXNrLCBncnBjX2ZkX3dhdGNoZXIgKndhdGNoZXIpIHsKKyAgdWludDMyX3QgbWFzayA9IDA7CisgIGdycGNfY2xvc3VyZSAqY3VyOworICBpbnQgcmVxdWVzdGVkOworICAvKiBrZWVwIHRyYWNrIG9mIHBvbGxlcnMgdGhhdCBoYXZlIHJlcXVlc3RlZCBvdXIgZXZlbnRzLCBpbiBjYXNlIHRoZXkgY2hhbmdlCisgICAqLworICBHUlBDX0ZEX1JFRihmZCwgInBvbGwiKTsKKworICBncHJfbXVfbG9jaygmZmQtPm11KTsKKworICAvKiBpZiB3ZSBhcmUgc2h1dGRvd24sIHRoZW4gZG9uJ3QgYWRkIHRvIHRoZSB3YXRjaGVyIHNldCAqLworICBpZiAoZmQtPnNodXRkb3duKSB7CisgICAgd2F0Y2hlci0+ZmQgPSBOVUxMOworICAgIHdhdGNoZXItPnBvbGxzZXQgPSBOVUxMOworICAgIHdhdGNoZXItPndvcmtlciA9IE5VTEw7CisgICAgZ3ByX211X3VubG9jaygmZmQtPm11KTsKKyAgICBHUlBDX0ZEX1VOUkVGKGZkLCAicG9sbCIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogaWYgdGhlcmUgaXMgbm9ib2R5IHBvbGxpbmcgZm9yIHJlYWQsIGJ1dCB3ZSBuZWVkIHRvLCB0aGVuIHN0YXJ0IGRvaW5nIHNvICovCisgIGN1ciA9IGZkLT5yZWFkX2Nsb3N1cmU7CisgIHJlcXVlc3RlZCA9IGN1ciAhPSBDTE9TVVJFX1JFQURZOworICBpZiAocmVhZF9tYXNrICYmIGZkLT5yZWFkX3dhdGNoZXIgPT0gTlVMTCAmJiByZXF1ZXN0ZWQpIHsKKyAgICBmZC0+cmVhZF93YXRjaGVyID0gd2F0Y2hlcjsKKyAgICBtYXNrIHw9IHJlYWRfbWFzazsKKyAgfQorICAvKiBpZiB0aGVyZSBpcyBub2JvZHkgcG9sbGluZyBmb3Igd3JpdGUsIGJ1dCB3ZSBuZWVkIHRvLCB0aGVuIHN0YXJ0IGRvaW5nIHNvCisgICAqLworICBjdXIgPSBmZC0+d3JpdGVfY2xvc3VyZTsKKyAgcmVxdWVzdGVkID0gY3VyICE9IENMT1NVUkVfUkVBRFk7CisgIGlmICh3cml0ZV9tYXNrICYmIGZkLT53cml0ZV93YXRjaGVyID09IE5VTEwgJiYgcmVxdWVzdGVkKSB7CisgICAgZmQtPndyaXRlX3dhdGNoZXIgPSB3YXRjaGVyOworICAgIG1hc2sgfD0gd3JpdGVfbWFzazsKKyAgfQorICAvKiBpZiBub3QgcG9sbGluZywgcmVtZW1iZXIgdGhpcyB3YXRjaGVyIGluIGNhc2Ugd2UgbmVlZCBzb21lb25lIHRvIGxhdGVyICovCisgIGlmIChtYXNrID09IDAgJiYgd29ya2VyICE9IE5VTEwpIHsKKyAgICB3YXRjaGVyLT5uZXh0ID0gJmZkLT5pbmFjdGl2ZV93YXRjaGVyX3Jvb3Q7CisgICAgd2F0Y2hlci0+cHJldiA9IHdhdGNoZXItPm5leHQtPnByZXY7CisgICAgd2F0Y2hlci0+bmV4dC0+cHJldiA9IHdhdGNoZXItPnByZXYtPm5leHQgPSB3YXRjaGVyOworICB9CisgIHdhdGNoZXItPnBvbGxzZXQgPSBwb2xsc2V0OworICB3YXRjaGVyLT53b3JrZXIgPSB3b3JrZXI7CisgIHdhdGNoZXItPmZkID0gZmQ7CisgIGdwcl9tdV91bmxvY2soJmZkLT5tdSk7CisKKyAgcmV0dXJuIG1hc2s7Cit9CisKK3ZvaWQgZ3JwY19mZF9lbmRfcG9sbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZF93YXRjaGVyICp3YXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBnb3RfcmVhZCwgaW50IGdvdF93cml0ZSkgeworICBpbnQgd2FzX3BvbGxpbmcgPSAwOworICBpbnQga2ljayA9IDA7CisgIGdycGNfZmQgKmZkID0gd2F0Y2hlci0+ZmQ7CisKKyAgaWYgKGZkID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBncHJfbXVfbG9jaygmZmQtPm11KTsKKworICBpZiAod2F0Y2hlciA9PSBmZC0+cmVhZF93YXRjaGVyKSB7CisgICAgLyogcmVtb3ZlIHJlYWQgd2F0Y2hlciwga2ljayBpZiB3ZSBzdGlsbCBuZWVkIGEgcmVhZCAqLworICAgIHdhc19wb2xsaW5nID0gMTsKKyAgICBpZiAoIWdvdF9yZWFkKSB7CisgICAgICBraWNrID0gMTsKKyAgICB9CisgICAgZmQtPnJlYWRfd2F0Y2hlciA9IE5VTEw7CisgIH0KKyAgaWYgKHdhdGNoZXIgPT0gZmQtPndyaXRlX3dhdGNoZXIpIHsKKyAgICAvKiByZW1vdmUgd3JpdGUgd2F0Y2hlciwga2ljayBpZiB3ZSBzdGlsbCBuZWVkIGEgd3JpdGUgKi8KKyAgICB3YXNfcG9sbGluZyA9IDE7CisgICAgaWYgKCFnb3Rfd3JpdGUpIHsKKyAgICAgIGtpY2sgPSAxOworICAgIH0KKyAgICBmZC0+d3JpdGVfd2F0Y2hlciA9IE5VTEw7CisgIH0KKyAgaWYgKCF3YXNfcG9sbGluZyAmJiB3YXRjaGVyLT53b3JrZXIgIT0gTlVMTCkgeworICAgIC8qIHJlbW92ZSBmcm9tIGluYWN0aXZlIGxpc3QgKi8KKyAgICB3YXRjaGVyLT5uZXh0LT5wcmV2ID0gd2F0Y2hlci0+cHJldjsKKyAgICB3YXRjaGVyLT5wcmV2LT5uZXh0ID0gd2F0Y2hlci0+bmV4dDsKKyAgfQorICBpZiAoZ290X3JlYWQpIHsKKyAgICBpZiAoc2V0X3JlYWR5X2xvY2tlZChleGVjX2N0eCwgZmQsICZmZC0+cmVhZF9jbG9zdXJlKSkgeworICAgICAga2ljayA9IDE7CisgICAgfQorICB9CisgIGlmIChnb3Rfd3JpdGUpIHsKKyAgICBpZiAoc2V0X3JlYWR5X2xvY2tlZChleGVjX2N0eCwgZmQsICZmZC0+d3JpdGVfY2xvc3VyZSkpIHsKKyAgICAgIGtpY2sgPSAxOworICAgIH0KKyAgfQorICBpZiAoa2ljaykgeworICAgIG1heWJlX3dha2Vfb25lX3dhdGNoZXJfbG9ja2VkKGZkKTsKKyAgfQorICBpZiAoZ3JwY19mZF9pc19vcnBoYW5lZChmZCkgJiYgIWhhc193YXRjaGVycyhmZCkgJiYgIWZkLT5jbG9zZWQpIHsKKyAgICBjbG9zZV9mZF9sb2NrZWQoZXhlY19jdHgsIGZkKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZmZC0+bXUpOworCisgIEdSUENfRkRfVU5SRUYoZmQsICJwb2xsIik7Cit9CisKK3ZvaWQgZ3JwY19mZF9iZWNvbWVfcmVhZGFibGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkKSB7CisgIHNldF9yZWFkeShleGVjX2N0eCwgZmQsICZmZC0+cmVhZF9jbG9zdXJlKTsKK30KKwordm9pZCBncnBjX2ZkX2JlY29tZV93cml0YWJsZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZCAqZmQpIHsKKyAgc2V0X3JlYWR5KGV4ZWNfY3R4LCBmZCwgJmZkLT53cml0ZV9jbG9zdXJlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCBiL3NyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDA5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX0ZEX1BPU0lYX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9GRF9QT1NJWF9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfZmQgZ3JwY19mZDsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19mZF93YXRjaGVyIHsKKyAgc3RydWN0IGdycGNfZmRfd2F0Y2hlciAqbmV4dDsKKyAgc3RydWN0IGdycGNfZmRfd2F0Y2hlciAqcHJldjsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXI7CisgIGdycGNfZmQgKmZkOworfSBncnBjX2ZkX3dhdGNoZXI7CisKK3N0cnVjdCBncnBjX2ZkIHsKKyAgaW50IGZkOworICAvKiByZWZzdCBmb3JtYXQ6CisgICAgIGJpdDA6ICAgMT1hY3RpdmUvMD1vcnBoYW5lZAorICAgICBiaXQxLW46IHJlZmNvdW50CisgICAgIG1lYW5pbmcgdGhhdCBtb3N0bHkgd2UgcmVmIGJ5IHR3byB0byBhdm9pZCBhbHRlcmluZyB0aGUgb3JwaGFuZWQgYml0LAorICAgICBhbmQganVzdCB1bnJlZiBieSAxIHdoZW4gd2UncmUgcmVhZHkgdG8gZmxhZyB0aGUgb2JqZWN0IGFzIG9ycGhhbmVkICovCisgIGdwcl9hdG0gcmVmc3Q7CisKKyAgZ3ByX211IG11OworICBpbnQgc2h1dGRvd247CisgIGludCBjbG9zZWQ7CisgIGludCByZWxlYXNlZDsKKworICAvKiBUaGUgd2F0Y2hlciBsaXN0LgorCisgICAgIFRoZSBmb2xsb3dpbmcgd2F0Y2hlciByZWxhdGVkIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IHdhdGNoZXJfbXUuCisKKyAgICAgQW4gZmRfd2F0Y2hlciBpcyBhbiBlcGhlbWVyYWwgb2JqZWN0IGNyZWF0ZWQgd2hlbiBhbiBmZCB3YW50cyB0bworICAgICBiZWdpbiBwb2xsaW5nLCBhbmQgZGVzdHJveWVkIGFmdGVyIHRoZSBwb2xsLgorCisgICAgIEl0IGRlbm90ZXMgdGhlIGZkJ3MgaW50ZXJlc3QgaW4gd2hldGhlciB0byByZWFkIHBvbGwgb3Igd3JpdGUgcG9sbAorICAgICBvciBib3RoIG9yIG5laXRoZXIgb24gdGhpcyBmZC4KKworICAgICBJZiBhIHdhdGNoZXIgaXMgYXNrZWQgdG8gcG9sbCBmb3IgcmVhZHMgb3Igd3JpdGVzLCB0aGUgcmVhZF93YXRjaGVyCisgICAgIG9yIHdyaXRlX3dhdGNoZXIgZmllbGRzIGFyZSBzZXQgcmVzcGVjdGl2ZWx5LiBBIHdhdGNoZXIgbWF5IGJlIGFza2VkCisgICAgIHRvIHBvbGwgZm9yIGJvdGgsIGluIHdoaWNoIGNhc2UgYm90aCBmaWVsZHMgd2lsbCBiZSBzZXQuCisKKyAgICAgcmVhZF93YXRjaGVyIGFuZCB3cml0ZV93YXRjaGVyIG1heSBiZSBOVUxMIGlmIG5vIHdhdGNoZXIgaGFzIGJlZW4KKyAgICAgYXNrZWQgdG8gcG9sbCBmb3IgcmVhZHMgb3Igd3JpdGVzLgorCisgICAgIElmIGFuIGZkX3dhdGNoZXIgaXMgbm90IGFza2VkIHRvIHBvbGwgZm9yIHJlYWRzIG9yIHdyaXRlcywgaXQncyBhZGRlZAorICAgICB0byBhIGxpbmtlZCBsaXN0IG9mIGluYWN0aXZlIHdhdGNoZXJzLCByb290ZWQgYXQgaW5hY3RpdmVfd2F0Y2hlcl9yb290LgorICAgICBJZiBhdCBhIGxhdGVyIHRpbWUgdGhlcmUgYmVjb21lcyBuZWVkIG9mIGEgcG9sbGVyIHRvIHBvbGwsIG9uZSBvZgorICAgICB0aGUgaW5hY3RpdmUgcG9sbGVycyBtYXkgYmUga2lja2VkIG91dCBvZiB0aGVpciBwb2xsIGxvb3BzIHRvIHRha2UKKyAgICAgdGhhdCByZXNwb25zaWJpbGl0eS4gKi8KKyAgZ3JwY19mZF93YXRjaGVyIGluYWN0aXZlX3dhdGNoZXJfcm9vdDsKKyAgZ3JwY19mZF93YXRjaGVyICpyZWFkX3dhdGNoZXI7CisgIGdycGNfZmRfd2F0Y2hlciAqd3JpdGVfd2F0Y2hlcjsKKworICBncnBjX2Nsb3N1cmUgKnJlYWRfY2xvc3VyZTsKKyAgZ3JwY19jbG9zdXJlICp3cml0ZV9jbG9zdXJlOworCisgIHN0cnVjdCBncnBjX2ZkICpmcmVlbGlzdF9uZXh0OworCisgIGdycGNfY2xvc3VyZSAqb25fZG9uZV9jbG9zdXJlOworCisgIGdycGNfaW9tZ3Jfb2JqZWN0IGlvbWdyX29iamVjdDsKK307CisKKy8qIENyZWF0ZSBhIHdyYXBwZWQgZmlsZSBkZXNjcmlwdG9yLgorICAgUmVxdWlyZXMgZmQgaXMgYSBub24tYmxvY2tpbmcgZmlsZSBkZXNjcmlwdG9yLgorICAgVGhpcyB0YWtlcyBvd25lcnNoaXAgb2YgY2xvc2luZyBmZC4gKi8KK2dycGNfZmQgKmdycGNfZmRfY3JlYXRlKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIFJldHVybiB0aGUgd3JhcHBlZCBmZCwgb3IgLTEgaWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQgb3IgY2xvc2VkLiAqLworaW50IGdycGNfZmRfd3JhcHBlZF9mZChncnBjX2ZkICpmZCk7CisKKy8qIFJlbGVhc2VzIGZkIHRvIGJlIGFzeW5jaHJvbm91c2x5IGRlc3Ryb3llZC4KKyAgIG9uX2RvbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIGlzIGRlZmluaXRlbHkgY2xvc2UoKWQuCisgICBJZiBvbl9kb25lIGlzIE5VTEwsIG5vIGNhbGxiYWNrIHdpbGwgYmUgbWFkZS4KKyAgIElmIHJlbGVhc2VfZmQgaXMgbm90IE5VTEwsIGl0J3Mgc2V0IHRvIGZkIGFuZCBmZCB3aWxsIG5vdCBiZSBjbG9zZWQuCisgICBSZXF1aXJlczogKmZkIGluaXRpYWxpemVkOyBubyBvdXRzdGFuZGluZyBub3RpZnlfb25fcmVhZCBvcgorICAgbm90aWZ5X29uX3dyaXRlLgorICAgTVVTVCBOT1QgYmUgY2FsbGVkIHdpdGggYSBwb2xsc2V0IGxvY2sgdGFrZW4gKi8KK3ZvaWQgZ3JwY19mZF9vcnBoYW4oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLCBncnBjX2Nsb3N1cmUgKm9uX2RvbmUsCisgICAgICAgICAgICAgICAgICAgIGludCAqcmVsZWFzZV9mZCwgY29uc3QgY2hhciAqcmVhc29uKTsKKworLyogQmVnaW4gcG9sbGluZyBvbiBhbiBmZC4KKyAgIFJlZ2lzdGVycyB0aGF0IHRoZSBnaXZlbiBwb2xsc2V0IGlzIGludGVyZXN0ZWQgaW4gdGhpcyBmZCAtIHNvIHRoYXQgaWYgcmVhZAorICAgb3Igd3JpdGFiaWxpdHkgaW50ZXJlc3QgY2hhbmdlcywgdGhlIHBvbGxzZXQgY2FuIGJlIGtpY2tlZCB0byBwaWNrIHVwIHRoYXQKKyAgIG5ldyBpbnRlcmVzdC4KKyAgIFJldHVybiB2YWx1ZSBpczoKKyAgICAgKGZkX25lZWRzX3JlYWQ/IHJlYWRfbWFzayA6IDApIHwgKGZkX25lZWRzX3dyaXRlPyB3cml0ZV9tYXNrIDogMCkKKyAgIGkuZS4gYSBjb21iaW5hdGlvbiBvZiByZWFkX21hc2sgYW5kIHdyaXRlX21hc2sgZGV0ZXJtaW5lZCBieSB0aGUgZmQncyBjdXJyZW50CisgICBpbnRlcmVzdCBpbiBzYWlkIGV2ZW50cy4KKyAgIFBvbGxpbmcgc3RyYXRlZ2llcyB0aGF0IGRvIG5vdCBuZWVkIHRvIGFsdGVyIHRoZWlyIGJlaGF2aW9yIGRlcGVuZGluZyBvbiB0aGUKKyAgIGZkJ3MgY3VycmVudCBpbnRlcmVzdCAoc3VjaCBhcyBlcG9sbCkgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICAgTVVTVCBOT1QgYmUgY2FsbGVkIHdpdGggYSBwb2xsc2V0IGxvY2sgdGFrZW4gKi8KK3VpbnQzMl90IGdycGNfZmRfYmVnaW5fcG9sbChncnBjX2ZkICpmZCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwgdWludDMyX3QgcmVhZF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX21hc2ssIGdycGNfZmRfd2F0Y2hlciAqcmVjKTsKKy8qIENvbXBsZXRlIHBvbGxpbmcgcHJldmlvdXNseSBzdGFydGVkIHdpdGggZ3JwY19mZF9iZWdpbl9wb2xsCisgICBNVVNUIE5PVCBiZSBjYWxsZWQgd2l0aCBhIHBvbGxzZXQgbG9jayB0YWtlbgorICAgaWYgZ290X3JlYWQgb3IgZ290X3dyaXRlIGFyZSAxLCBhbHNvIGRvZXMgdGhlIGJlY29tZV97cmVhZGFibGUsd3JpdGFibGV9IGFzCisgICBhcHByb3ByaWF0ZS4gKi8KK3ZvaWQgZ3JwY19mZF9lbmRfcG9sbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19mZF93YXRjaGVyICpyZWMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGdvdF9yZWFkLCBpbnQgZ290X3dyaXRlKTsKKworLyogUmV0dXJuIDEgaWYgdGhpcyBmZCBpcyBvcnBoYW5lZCwgMCBvdGhlcndpc2UgKi8KK2ludCBncnBjX2ZkX2lzX29ycGhhbmVkKGdycGNfZmQgKmZkKTsKKworLyogQ2F1c2UgYW55IGN1cnJlbnQgY2FsbGJhY2tzIHRvIGVycm9yIG91dCB3aXRoIEdSUENfQ0FMTEJBQ0tfQ0FOQ0VMTEVELiAqLwordm9pZCBncnBjX2ZkX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2ZkICpmZCk7CisKKy8qIFJlZ2lzdGVyIHJlYWQgaW50ZXJlc3QsIGNhdXNpbmcgcmVhZF9jYiB0byBiZSBjYWxsZWQgb25jZSB3aGVuIGZkIGJlY29tZXMKKyAgIHJlYWRhYmxlLCBvbiBkZWFkbGluZSBzcGVjaWZpZWQgYnkgZGVhZGxpbmUsIG9yIG9uIHNodXRkb3duIHRyaWdnZXJlZCBieQorICAgZ3JwY19mZF9zaHV0ZG93bi4KKyAgIHJlYWRfY2Igd2lsbCBiZSBjYWxsZWQgd2l0aCByZWFkX2NiX2FyZyB3aGVuICpmZCBiZWNvbWVzIHJlYWRhYmxlLgorICAgcmVhZF9jYiBpcyBDYWxsZWQgd2l0aCBzdGF0dXMgb2YgR1JQQ19DQUxMQkFDS19TVUNDRVNTIGlmIHJlYWRhYmxlLAorICAgR1JQQ19DQUxMQkFDS19USU1FRF9PVVQgaWYgdGhlIGNhbGwgdGltZWQgb3V0LAorICAgYW5kIENBTkNFTExFRCBpZiB0aGUgY2FsbCB3YXMgY2FuY2VsbGVkLgorCisgICBSZXF1aXJlczpUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSByZWFkX2NiIGZvciBhbnkgcHJldmlvdXMKKyAgIGNhbGwgcnVucy4gRWRnZSB0cmlnZ2VyZWQgZXZlbnRzIGFyZSB1c2VkIHdoZW5ldmVyIHRoZXkgYXJlIHN1cHBvcnRlZCBieSB0aGUKKyAgIHVuZGVybHlpbmcgcGxhdGZvcm0uIFRoaXMgbWVhbnMgdGhhdCB1c2VycyBtdXN0IGRyYWluIGZkIGluIHJlYWRfY2IgYmVmb3JlCisgICBjYWxsaW5nIG5vdGlmeV9vbl9yZWFkIGFnYWluLiBVc2VycyBhcmUgYWxzbyBleHBlY3RlZCB0byBoYW5kbGUgc3B1cmlvdXMKKyAgIGV2ZW50cywgaS5lIHJlYWRfY2IgaXMgY2FsbGVkIHdoaWxlIG5vdGhpbmcgY2FuIGJlIHJlYWRhYmxlIGZyb20gZmQgICovCit2b2lkIGdycGNfZmRfbm90aWZ5X29uX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7CisKKy8qIEV4YWN0bHkgdGhlIHNhbWUgc2VtYW50aWNzIGFzIGFib3ZlLCBleGNlcHQgYmFzZWQgb24gd3JpdGFibGUgZXZlbnRzLiAgKi8KK3ZvaWQgZ3JwY19mZF9ub3RpZnlfb25fd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOworCisvKiBOb3RpZmljYXRpb24gZnJvbSB0aGUgcG9sbGVyIHRvIGFuIGZkIHRoYXQgaXQgaGFzIGJlY29tZSByZWFkYWJsZSBvcgorICAgd3JpdGFibGUuCisgICBJZiBhbGxvd19zeW5jaHJvbm91c19jYWxsYmFjayBpcyAxLCBhbGxvdyBydW5uaW5nIHRoZSBmZCBjYWxsYmFjayBpbmxpbmUKKyAgIGluIHRoaXMgY2FsbHN0YWNrLCBvdGhlcndpc2UgcmVnaXN0ZXIgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGFuZCByZXR1cm4gKi8KK3ZvaWQgZ3JwY19mZF9iZWNvbWVfcmVhZGFibGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkKTsKK3ZvaWQgZ3JwY19mZF9iZWNvbWVfd3JpdGFibGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmZkKTsKKworLyogUmVmZXJlbmNlIGNvdW50aW5nIGZvciBmZHMgKi8KKy8qI2RlZmluZSBHUlBDX0ZEX1JFRl9DT1VOVF9ERUJVRyovCisjaWZkZWYgR1JQQ19GRF9SRUZfQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19mZF9yZWYoZ3JwY19mZCAqZmQsIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwordm9pZCBncnBjX2ZkX3VucmVmKGdycGNfZmQgKmZkLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKyNkZWZpbmUgR1JQQ19GRF9SRUYoZmQsIHJlYXNvbikgZ3JwY19mZF9yZWYoZmQsIHJlYXNvbiwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBHUlBDX0ZEX1VOUkVGKGZkLCByZWFzb24pIGdycGNfZmRfdW5yZWYoZmQsIHJlYXNvbiwgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKK3ZvaWQgZ3JwY19mZF9yZWYoZ3JwY19mZCAqZmQpOwordm9pZCBncnBjX2ZkX3VucmVmKGdycGNfZmQgKmZkKTsKKyNkZWZpbmUgR1JQQ19GRF9SRUYoZmQsIHJlYXNvbikgZ3JwY19mZF9yZWYoZmQpCisjZGVmaW5lIEdSUENfRkRfVU5SRUYoZmQsIHJlYXNvbikgZ3JwY19mZF91bnJlZihmZCkKKyNlbmRpZgorCit2b2lkIGdycGNfZmRfZ2xvYmFsX2luaXQodm9pZCk7Cit2b2lkIGdycGNfZmRfZ2xvYmFsX3NodXRkb3duKHZvaWQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9GRF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyYTMyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuYwpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKKworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZ193aW4zMi5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIKKworc3RhdGljIFVMT05HIGdfaW9jcF9raWNrX3Rva2VuOworc3RhdGljIE9WRVJMQVBQRUQgZ19pb2NwX2N1c3RvbV9vdmVybGFwOworCitzdGF0aWMgZ3ByX2F0bSBnX2N1c3RvbV9ldmVudHMgPSAwOworCitzdGF0aWMgSEFORExFIGdfaW9jcDsKKworc3RhdGljIERXT1JEIGRlYWRsaW5lX3RvX21pbGxpc190aW1lb3V0KGdwcl90aW1lc3BlYyBkZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93KSB7CisgIGdwcl90aW1lc3BlYyB0aW1lb3V0OworICBzdGF0aWMgY29uc3QgaW50NjRfdCBtYXhfc3Bpbl9wb2xsaW5nX3VzID0gMTA7CisgIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIGdwcl9pbmZfZnV0dXJlKGRlYWRsaW5lLmNsb2NrX3R5cGUpKSA9PSAwKSB7CisgICAgcmV0dXJuIElORklOSVRFOworICB9CisgIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIGdwcl90aW1lX2FkZChub3csIGdwcl90aW1lX2Zyb21fbWljcm9zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3NwaW5fcG9sbGluZ191cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9USU1FU1BBTikpKSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdGltZW91dCA9IGdwcl90aW1lX3N1YihkZWFkbGluZSwgbm93KTsKKyAgcmV0dXJuIChEV09SRClncHJfdGltZV90b19taWxsaXMoZ3ByX3RpbWVfYWRkKAorICAgICAgdGltZW91dCwgZ3ByX3RpbWVfZnJvbV9uYW5vcyhHUFJfTlNfUEVSX01TIC0gMSwgR1BSX1RJTUVTUEFOKSkpOworfQorCitncnBjX2lvY3Bfd29ya19zdGF0dXMgZ3JwY19pb2NwX3dvcmsoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7CisgIEJPT0wgc3VjY2VzczsKKyAgRFdPUkQgYnl0ZXMgPSAwOworICBEV09SRCBmbGFncyA9IDA7CisgIFVMT05HX1BUUiBjb21wbGV0aW9uX2tleTsKKyAgTFBPVkVSTEFQUEVEIG92ZXJsYXBwZWQ7CisgIGdycGNfd2luc29ja2V0ICpzb2NrZXQ7CisgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm87CisgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSA9IE5VTEw7CisgIHN1Y2Nlc3MgPSBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKAorICAgICAgZ19pb2NwLCAmYnl0ZXMsICZjb21wbGV0aW9uX2tleSwgJm92ZXJsYXBwZWQsCisgICAgICBkZWFkbGluZV90b19taWxsaXNfdGltZW91dChkZWFkbGluZSwgZ3ByX25vdyhkZWFkbGluZS5jbG9ja190eXBlKSkpOworICBpZiAoc3VjY2VzcyA9PSAwICYmIG92ZXJsYXBwZWQgPT0gTlVMTCkgeworICAgIHJldHVybiBHUlBDX0lPQ1BfV09SS19USU1FT1VUOworICB9CisgIEdQUl9BU1NFUlQoY29tcGxldGlvbl9rZXkgJiYgb3ZlcmxhcHBlZCk7CisgIGlmIChvdmVybGFwcGVkID09ICZnX2lvY3BfY3VzdG9tX292ZXJsYXApIHsKKyAgICBncHJfYXRtX2Z1bGxfZmV0Y2hfYWRkKCZnX2N1c3RvbV9ldmVudHMsIC0xKTsKKyAgICBpZiAoY29tcGxldGlvbl9rZXkgPT0gKFVMT05HX1BUUikmZ19pb2NwX2tpY2tfdG9rZW4pIHsKKyAgICAgIC8qIFdlIHdlcmUgYXdva2VuIGZyb20gYSBraWNrLiAqLworICAgICAgcmV0dXJuIEdSUENfSU9DUF9XT1JLX0tJQ0s7CisgICAgfQorICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biBjdXN0b20gY29tcGxldGlvbiBrZXkuIik7CisgICAgYWJvcnQoKTsKKyAgfQorCisgIHNvY2tldCA9IChncnBjX3dpbnNvY2tldCAqKWNvbXBsZXRpb25fa2V5OworICBpZiAob3ZlcmxhcHBlZCA9PSAmc29ja2V0LT53cml0ZV9pbmZvLm92ZXJsYXBwZWQpIHsKKyAgICBpbmZvID0gJnNvY2tldC0+d3JpdGVfaW5mbzsKKyAgfSBlbHNlIGlmIChvdmVybGFwcGVkID09ICZzb2NrZXQtPnJlYWRfaW5mby5vdmVybGFwcGVkKSB7CisgICAgaW5mbyA9ICZzb2NrZXQtPnJlYWRfaW5mbzsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gSU9DUCBvcGVyYXRpb24iKTsKKyAgICBhYm9ydCgpOworICB9CisgIHN1Y2Nlc3MgPSBXU0FHZXRPdmVybGFwcGVkUmVzdWx0KHNvY2tldC0+c29ja2V0LCAmaW5mby0+b3ZlcmxhcHBlZCwgJmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgJmZsYWdzKTsKKyAgaW5mby0+Ynl0ZXNfdHJhbnNmZXJlZCA9IGJ5dGVzOworICBpbmZvLT53c2FfZXJyb3IgPSBzdWNjZXNzID8gMCA6IFdTQUdldExhc3RFcnJvcigpOworICBHUFJfQVNTRVJUKG92ZXJsYXBwZWQgPT0gJmluZm8tPm92ZXJsYXBwZWQpOworICBHUFJfQVNTRVJUKCFpbmZvLT5oYXNfcGVuZGluZ19pb2NwKTsKKyAgZ3ByX211X2xvY2soJnNvY2tldC0+c3RhdGVfbXUpOworICBpZiAoaW5mby0+Y2xvc3VyZSkgeworICAgIGNsb3N1cmUgPSBpbmZvLT5jbG9zdXJlOworICAgIGluZm8tPmNsb3N1cmUgPSBOVUxMOworICB9IGVsc2UgeworICAgIGluZm8tPmhhc19wZW5kaW5nX2lvY3AgPSAxOworICB9CisgIGdwcl9tdV91bmxvY2soJnNvY2tldC0+c3RhdGVfbXUpOworICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIHRydWUsIE5VTEwpOworICByZXR1cm4gR1JQQ19JT0NQX1dPUktfV09SSzsKK30KKwordm9pZCBncnBjX2lvY3BfaW5pdCh2b2lkKSB7CisgIGdfaW9jcCA9CisgICAgICBDcmVhdGVJb0NvbXBsZXRpb25Qb3J0KElOVkFMSURfSEFORExFX1ZBTFVFLCBOVUxMLCAoVUxPTkdfUFRSKU5VTEwsIDApOworICBHUFJfQVNTRVJUKGdfaW9jcCk7Cit9CisKK3ZvaWQgZ3JwY19pb2NwX2tpY2sodm9pZCkgeworICBCT09MIHN1Y2Nlc3M7CisKKyAgZ3ByX2F0bV9mdWxsX2ZldGNoX2FkZCgmZ19jdXN0b21fZXZlbnRzLCAxKTsKKyAgc3VjY2VzcyA9IFBvc3RRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKGdfaW9jcCwgMCwgKFVMT05HX1BUUikmZ19pb2NwX2tpY2tfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ19pb2NwX2N1c3RvbV9vdmVybGFwKTsKKyAgR1BSX0FTU0VSVChzdWNjZXNzKTsKK30KKwordm9pZCBncnBjX2lvY3BfZmx1c2godm9pZCkgeworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICBncnBjX2lvY3Bfd29ya19zdGF0dXMgd29ya19zdGF0dXM7CisKKyAgZG8geworICAgIHdvcmtfc3RhdHVzID0gZ3JwY19pb2NwX3dvcmsoJmV4ZWNfY3R4LCBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX01PTk9UT05JQykpOworICB9IHdoaWxlICh3b3JrX3N0YXR1cyA9PSBHUlBDX0lPQ1BfV09SS19LSUNLIHx8CisgICAgICAgICAgIGdycGNfZXhlY19jdHhfZmx1c2goJmV4ZWNfY3R4KSk7Cit9CisKK3ZvaWQgZ3JwY19pb2NwX3NodXRkb3duKHZvaWQpIHsKKyAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKKyAgd2hpbGUgKGdwcl9hdG1fYWNxX2xvYWQoJmdfY3VzdG9tX2V2ZW50cykpIHsKKyAgICBncnBjX2lvY3Bfd29yaygmZXhlY19jdHgsIGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19NT05PVE9OSUMpKTsKKyAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKCZleGVjX2N0eCk7CisgIH0KKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgR1BSX0FTU0VSVChDbG9zZUhhbmRsZShnX2lvY3ApKTsKK30KKwordm9pZCBncnBjX2lvY3BfYWRkX3NvY2tldChncnBjX3dpbnNvY2tldCAqc29ja2V0KSB7CisgIEhBTkRMRSByZXQ7CisgIGlmIChzb2NrZXQtPmFkZGVkX3RvX2lvY3ApIHJldHVybjsKKyAgcmV0ID0gQ3JlYXRlSW9Db21wbGV0aW9uUG9ydCgoSEFORExFKXNvY2tldC0+c29ja2V0LCBnX2lvY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnRwdHJfdClzb2NrZXQsIDApOworICBpZiAoIXJldCkgeworICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmFibGUgdG8gYWRkIHNvY2tldCB0byBpb2NwOiAlcyIsIHV0ZjhfbWVzc2FnZSk7CisgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgICBfX2RlYnVnYnJlYWsoKTsKKyAgICBhYm9ydCgpOworICB9CisgIHNvY2tldC0+YWRkZWRfdG9faW9jcCA9IDE7CisgIEdQUl9BU1NFUlQocmV0ID09IGdfaW9jcCk7Cit9CisKKy8qIENhbGxpbmcgbm90aWZ5X29uX3JlYWQgb3Igd3JpdGUgbWVhbnMgZWl0aGVyIG9mIHR3byB0aGluZ3M6CisgICAtKSBUaGUgSU9DUCBhbHJlYWR5IGNvbXBsZXRlZCBpbiB0aGUgYmFja2dyb3VuZCwgYW5kIHdlIG5lZWQgdG8gY2FsbAorICAgdGhlIGNhbGxiYWNrIG5vdy4KKyAgIC0pIFRoZSBJT0NQIGhhc24ndCBjb21wbGV0ZWQgeWV0LCBhbmQgd2UncmUgcXVldWluZyBpdCBmb3IgbGF0ZXIuICovCitzdGF0aWMgdm9pZCBzb2NrZXRfbm90aWZ5X29uX2lvY3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY193aW5zb2NrZXQgKnNvY2tldCwgZ3JwY19jbG9zdXJlICpjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8pIHsKKyAgR1BSX0FTU0VSVChpbmZvLT5jbG9zdXJlID09IE5VTEwpOworICBncHJfbXVfbG9jaygmc29ja2V0LT5zdGF0ZV9tdSk7CisgIGlmIChpbmZvLT5oYXNfcGVuZGluZ19pb2NwKSB7CisgICAgaW5mby0+aGFzX3BlbmRpbmdfaW9jcCA9IDA7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCB0cnVlLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBpbmZvLT5jbG9zdXJlID0gY2xvc3VyZTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZzb2NrZXQtPnN0YXRlX211KTsKK30KKwordm9pZCBncnBjX3NvY2tldF9ub3RpZnlfb25fd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3dpbnNvY2tldCAqc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7CisgIHNvY2tldF9ub3RpZnlfb25faW9jcChleGVjX2N0eCwgc29ja2V0LCBjbG9zdXJlLCAmc29ja2V0LT53cml0ZV9pbmZvKTsKK30KKwordm9pZCBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY193aW5zb2NrZXQgKnNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7CisgIHNvY2tldF9ub3RpZnlfb25faW9jcChleGVjX2N0eCwgc29ja2V0LCBjbG9zdXJlLCAmc29ja2V0LT5yZWFkX2luZm8pOworfQorCisjZW5kaWYgLyogR1BSX1dJTlNPQ0tfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmggYi9zcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2YzgzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaApAQCAtMCwwICsxLDYzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfSU9DUF9XSU5ET1dTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9JT0NQX1dJTkRPV1NfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIgorCit0eXBlZGVmIGVudW0geworICBHUlBDX0lPQ1BfV09SS19XT1JLLAorICBHUlBDX0lPQ1BfV09SS19USU1FT1VULAorICBHUlBDX0lPQ1BfV09SS19LSUNLCit9IGdycGNfaW9jcF93b3JrX3N0YXR1czsKKworZ3JwY19pb2NwX3dvcmtfc3RhdHVzIGdycGNfaW9jcF93b3JrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSk7Cit2b2lkIGdycGNfaW9jcF9pbml0KHZvaWQpOwordm9pZCBncnBjX2lvY3Bfa2ljayh2b2lkKTsKK3ZvaWQgZ3JwY19pb2NwX2ZsdXNoKHZvaWQpOwordm9pZCBncnBjX2lvY3Bfc2h1dGRvd24odm9pZCk7Cit2b2lkIGdycGNfaW9jcF9hZGRfc29ja2V0KGdycGNfd2luc29ja2V0ICopOworCit2b2lkIGdycGNfc29ja2V0X25vdGlmeV9vbl93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd2luc29ja2V0ICp3aW5zb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOworCit2b2lkIGdycGNfc29ja2V0X25vdGlmeV9vbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3dpbnNvY2tldCAqd2luc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9JT0NQX1dJTkRPV1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU0NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCitzdGF0aWMgZ3ByX211IGdfbXU7CitzdGF0aWMgZ3ByX2N2IGdfcmN2Oworc3RhdGljIGludCBnX3NodXRkb3duOworc3RhdGljIGdycGNfaW9tZ3Jfb2JqZWN0IGdfcm9vdF9vYmplY3Q7CisKK3ZvaWQgZ3JwY19pb21ncl9pbml0KHZvaWQpIHsKKyAgZ19zaHV0ZG93biA9IDA7CisgIGdwcl9tdV9pbml0KCZnX211KTsKKyAgZ3ByX2N2X2luaXQoJmdfcmN2KTsKKyAgZ3JwY19leGVjX2N0eF9nbG9iYWxfaW5pdCgpOworICBncnBjX3RpbWVyX2xpc3RfaW5pdChncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKKyAgZ19yb290X29iamVjdC5uZXh0ID0gZ19yb290X29iamVjdC5wcmV2ID0gJmdfcm9vdF9vYmplY3Q7CisgIGdfcm9vdF9vYmplY3QubmFtZSA9ICJyb290IjsKKyAgZ3JwY19pb21ncl9wbGF0Zm9ybV9pbml0KCk7CisgIGdycGNfcG9sbHNldF9nbG9iYWxfaW5pdCgpOworfQorCitzdGF0aWMgc2l6ZV90IGNvdW50X29iamVjdHModm9pZCkgeworICBncnBjX2lvbWdyX29iamVjdCAqb2JqOworICBzaXplX3QgbiA9IDA7CisgIGZvciAob2JqID0gZ19yb290X29iamVjdC5uZXh0OyBvYmogIT0gJmdfcm9vdF9vYmplY3Q7IG9iaiA9IG9iai0+bmV4dCkgeworICAgIG4rKzsKKyAgfQorICByZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgZHVtcF9vYmplY3RzKGNvbnN0IGNoYXIgKmtpbmQpIHsKKyAgZ3JwY19pb21ncl9vYmplY3QgKm9iajsKKyAgZm9yIChvYmogPSBnX3Jvb3Rfb2JqZWN0Lm5leHQ7IG9iaiAhPSAmZ19yb290X29iamVjdDsgb2JqID0gb2JqLT5uZXh0KSB7CisgICAgZ3ByX2xvZyhHUFJfREVCVUcsICIlcyBPQkpFQ1Q6ICVzICVwIiwga2luZCwgb2JqLT5uYW1lLCBvYmopOworICB9Cit9CisKK3ZvaWQgZ3JwY19pb21ncl9zaHV0ZG93bih2b2lkKSB7CisgIGdwcl90aW1lc3BlYyBzaHV0ZG93bl9kZWFkbGluZSA9IGdwcl90aW1lX2FkZCgKKyAgICAgIGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgZ3ByX3RpbWVfZnJvbV9zZWNvbmRzKDEwLCBHUFJfVElNRVNQQU4pKTsKKyAgZ3ByX3RpbWVzcGVjIGxhc3Rfd2FybmluZ190aW1lID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworCisgIGdycGNfaW9tZ3JfcGxhdGZvcm1fZmx1c2goKTsKKworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGdfc2h1dGRvd24gPSAxOworICB3aGlsZSAoZ19yb290X29iamVjdC5uZXh0ICE9ICZnX3Jvb3Rfb2JqZWN0KSB7CisgICAgaWYgKGdwcl90aW1lX2NtcCgKKyAgICAgICAgICAgIGdwcl90aW1lX3N1YihncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGxhc3Rfd2FybmluZ190aW1lKSwKKyAgICAgICAgICAgIGdwcl90aW1lX2Zyb21fc2Vjb25kcygxLCBHUFJfVElNRVNQQU4pKSA+PSAwKSB7CisgICAgICBpZiAoZ19yb290X29iamVjdC5uZXh0ICE9ICZnX3Jvb3Rfb2JqZWN0KSB7CisgICAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiV2FpdGluZyBmb3IgJWQgaW9tZ3Igb2JqZWN0cyB0byBiZSBkZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgIGNvdW50X29iamVjdHMoKSk7CisgICAgICB9CisgICAgICBsYXN0X3dhcm5pbmdfdGltZSA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgICB9CisgICAgaWYgKGdycGNfdGltZXJfY2hlY2soJmV4ZWNfY3R4LCBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfTU9OT1RPTklDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgICAgZ3ByX211X3VubG9jaygmZ19tdSk7CisgICAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKCZleGVjX2N0eCk7CisgICAgICBncHJfbXVfbG9jaygmZ19tdSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGdfcm9vdF9vYmplY3QubmV4dCAhPSAmZ19yb290X29iamVjdCkgeworICAgICAgZ3ByX3RpbWVzcGVjIHNob3J0X2RlYWRsaW5lID0gZ3ByX3RpbWVfYWRkKAorICAgICAgICAgIGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgZ3ByX3RpbWVfZnJvbV9taWxsaXMoMTAwLCBHUFJfVElNRVNQQU4pKTsKKyAgICAgIGlmIChncHJfY3Zfd2FpdCgmZ19yY3YsICZnX211LCBzaG9ydF9kZWFkbGluZSkpIHsKKyAgICAgICAgaWYgKGdwcl90aW1lX2NtcChncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIHNodXRkb3duX2RlYWRsaW5lKSA+IDApIHsKKyAgICAgICAgICBpZiAoZ19yb290X29iamVjdC5uZXh0ICE9ICZnX3Jvb3Rfb2JqZWN0KSB7CisgICAgICAgICAgICBncHJfbG9nKEdQUl9ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmcmVlICVkIGlvbWdyIG9iamVjdHMgYmVmb3JlIHNodXRkb3duIGRlYWRsaW5lOiAiCisgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgbGVha3MgYXJlIGxpa2VseSIsCisgICAgICAgICAgICAgICAgICAgIGNvdW50X29iamVjdHMoKSk7CisgICAgICAgICAgICBkdW1wX29iamVjdHMoIkxFQUtFRCIpOworICAgICAgICAgICAgaWYgKGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3MoKSkgeworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX211KTsKKworICBncnBjX3RpbWVyX2xpc3Rfc2h1dGRvd24oJmV4ZWNfY3R4KTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKworICAvKiBlbnN1cmUgYWxsIHRocmVhZHMgaGF2ZSBsZWZ0IGdfbXUgKi8KKyAgZ3ByX211X2xvY2soJmdfbXUpOworICBncHJfbXVfdW5sb2NrKCZnX211KTsKKworICBncnBjX3BvbGxzZXRfZ2xvYmFsX3NodXRkb3duKCk7CisgIGdycGNfaW9tZ3JfcGxhdGZvcm1fc2h1dGRvd24oKTsKKyAgZ3JwY19leGVjX2N0eF9nbG9iYWxfc2h1dGRvd24oKTsKKyAgZ3ByX211X2Rlc3Ryb3koJmdfbXUpOworICBncHJfY3ZfZGVzdHJveSgmZ19yY3YpOworfQorCit2b2lkIGdycGNfaW9tZ3JfcmVnaXN0ZXJfb2JqZWN0KGdycGNfaW9tZ3Jfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgb2JqLT5uYW1lID0gZ3ByX3N0cmR1cChuYW1lKTsKKyAgZ3ByX211X2xvY2soJmdfbXUpOworICBvYmotPm5leHQgPSAmZ19yb290X29iamVjdDsKKyAgb2JqLT5wcmV2ID0gZ19yb290X29iamVjdC5wcmV2OworICBvYmotPm5leHQtPnByZXYgPSBvYmotPnByZXYtPm5leHQgPSBvYmo7CisgIGdwcl9tdV91bmxvY2soJmdfbXUpOworfQorCit2b2lkIGdycGNfaW9tZ3JfdW5yZWdpc3Rlcl9vYmplY3QoZ3JwY19pb21ncl9vYmplY3QgKm9iaikgeworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIG9iai0+bmV4dC0+cHJldiA9IG9iai0+cHJldjsKKyAgb2JqLT5wcmV2LT5uZXh0ID0gb2JqLT5uZXh0OworICBncHJfY3Zfc2lnbmFsKCZnX3Jjdik7CisgIGdwcl9tdV91bmxvY2soJmdfbXUpOworICBncHJfZnJlZShvYmotPm5hbWUpOworfQorCitib29sIGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3Modm9pZCkgeworICBjaGFyICplbnYgPSBncHJfZ2V0ZW52KCJHUlBDX0FCT1JUX09OX0xFQUtTIik7CisgIGlmIChlbnYgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICBzdGF0aWMgY29uc3QgY2hhciAqdHJ1dGh5W10gPSB7InllcyIsICAiWWVzIiwgICJZRVMiLCAidHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ1ZSIsICJUUlVFIiwgIjEifTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHUFJfQVJSQVlfU0laRSh0cnV0aHkpOyBpKyspIHsKKyAgICBpZiAoMCA9PSBzdHJjbXAoZW52LCB0cnV0aHlbaV0pKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCBiL3NyYy9jb3JlL2xpYi9pb21nci9pb21nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmYwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaApAQCAtMCwwICsxLDQzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfSU9NR1JfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX0lPTUdSX0gKKworLyoqIEluaXRpYWxpemVzIHRoZSBpb21nci4gKi8KK3ZvaWQgZ3JwY19pb21ncl9pbml0KHZvaWQpOworCisvKiogU2lnbmFscyB0aGUgaW50ZW50aW9uIHRvIHNodXRkb3duIHRoZSBpb21nci4gKi8KK3ZvaWQgZ3JwY19pb21ncl9zaHV0ZG93bih2b2lkKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfSU9NR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmggYi9zcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTYzNjMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX0lPTUdSX0lOVEVSTkFMX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9JT01HUl9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX2lvbWdyX29iamVjdCB7CisgIGNoYXIgKm5hbWU7CisgIHN0cnVjdCBncnBjX2lvbWdyX29iamVjdCAqbmV4dDsKKyAgc3RydWN0IGdycGNfaW9tZ3Jfb2JqZWN0ICpwcmV2OworfSBncnBjX2lvbWdyX29iamVjdDsKKwordm9pZCBncnBjX3BvbGxzZXRfZ2xvYmFsX2luaXQodm9pZCk7Cit2b2lkIGdycGNfcG9sbHNldF9nbG9iYWxfc2h1dGRvd24odm9pZCk7CisKK3ZvaWQgZ3JwY19pb21ncl9yZWdpc3Rlcl9vYmplY3QoZ3JwY19pb21ncl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGdycGNfaW9tZ3JfdW5yZWdpc3Rlcl9vYmplY3QoZ3JwY19pb21ncl9vYmplY3QgKm9iaik7CisKK3ZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9pbml0KHZvaWQpOworLyoqIGZsdXNoIGFueSBnbG9iYWxseSBxdWV1ZWQgd29yayBmcm9tIGlvbWdyICovCit2b2lkIGdycGNfaW9tZ3JfcGxhdGZvcm1fZmx1c2godm9pZCk7CisvKiogdGVhciBkb3duIGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyBnbG9iYWwgaW9tZ3Igc3RydWN0dXJlcyAqLwordm9pZCBncnBjX2lvbWdyX3BsYXRmb3JtX3NodXRkb3duKHZvaWQpOworCitib29sIGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3Modm9pZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX0lPTUdSX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5OTBmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oIgorCit2b2lkIGdycGNfaW9tZ3JfcGxhdGZvcm1faW5pdCh2b2lkKSB7CisgIGdycGNfZmRfZ2xvYmFsX2luaXQoKTsKKyAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoInRjcCIsICZncnBjX3RjcF90cmFjZSk7Cit9CisKK3ZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9mbHVzaCh2b2lkKSB7fQorCit2b2lkIGdycGNfaW9tZ3JfcGxhdGZvcm1fc2h1dGRvd24odm9pZCkgeyBncnBjX2ZkX2dsb2JhbF9zaHV0ZG93bigpOyB9CisKKyNlbmRpZiAvKiBHUlBDX1BPU0lYX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmggYi9zcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg5OTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX0lPTUdSX1BPU0lYX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9JT01HUl9QT1NJWF9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfSU9NR1JfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl93aW5kb3dzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3ZTYxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9pb21ncl93aW5kb3dzLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIgorCisvKiBXaW5kb3dzJyBpbyBtYW5hZ2VyIGlzIGdvaW5nIHRvIGJlIGZ1bGx5IGRlc2lnbmVkIHVzaW5nIElPIGNvbXBsZXRpb24KKyAgIHBvcnRzLiBBbGwgb2Ygd2hhdCB3ZSdyZSBkb2luZyBoZXJlIGlzIGJhc2ljYWxseSBtYWtlIHN1cmUgdGhhdAorICAgV2luZG93cyBzb2NrZXRzIGFyZSBpbml0aWFsaXplZCBpbiBhbmQgb3V0LiAqLworCitzdGF0aWMgdm9pZCB3aW5zb2NrX2luaXQodm9pZCkgeworICBXU0FEQVRBIHdzYURhdGE7CisgIGludCBzdGF0dXMgPSBXU0FTdGFydHVwKE1BS0VXT1JEKDIsIDApLCAmd3NhRGF0YSk7CisgIEdQUl9BU1NFUlQoc3RhdHVzID09IDApOworfQorCitzdGF0aWMgdm9pZCB3aW5zb2NrX3NodXRkb3duKHZvaWQpIHsKKyAgaW50IHN0YXR1cyA9IFdTQUNsZWFudXAoKTsKKyAgR1BSX0FTU0VSVChzdGF0dXMgPT0gMCk7Cit9CisKK3ZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9pbml0KHZvaWQpIHsKKyAgd2luc29ja19pbml0KCk7CisgIGdycGNfaW9jcF9pbml0KCk7Cit9CisKK3ZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9mbHVzaCh2b2lkKSB7IGdycGNfaW9jcF9mbHVzaCgpOyB9CisKK3ZvaWQgZ3JwY19pb21ncl9wbGF0Zm9ybV9zaHV0ZG93bih2b2lkKSB7CisgIGdycGNfaW9jcF9zaHV0ZG93bigpOworICB3aW5zb2NrX3NodXRkb3duKCk7Cit9CisKKyNlbmRpZiAvKiBHUlBDX1dJTlNPQ0tfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTU2MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaApAQCAtMCwwICsxLDk0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorCisjZGVmaW5lIEdSUENfUE9MTFNFVF9LSUNLX0JST0FEQ0FTVCAoKGdycGNfcG9sbHNldF93b3JrZXIgKikxKQorCisvKiBBIGdycGNfcG9sbHNldCBpcyBhIHNldCBvZiBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgYSBoaWdoZXIgbGV2ZWwgaXRlbSBpcworICAgaW50ZXJlc3RlZCBpbi4gRm9yIGV4YW1wbGU6CisgICAgLSBhIHNlcnZlciB3aWxsIHR5cGljYWxseSBrZWVwIGEgcG9sbHNldCBjb250YWluaW5nIGFsbCBjb25uZWN0ZWQgY2hhbm5lbHMsCisgICAgICBzbyB0aGF0IGl0IGNhbiBmaW5kIG5ldyBjYWxscyB0byBzZXJ2aWNlCisgICAgLSBhIGNvbXBsZXRpb24gcXVldWUgbWlnaHQga2VlcCBhIHBvbGxzZXQgd2l0aCBhbiBlbnRyeSBmb3IgZWFjaCB0cmFuc3BvcnQKKyAgICAgIHRoYXQgaXMgc2VydmljaW5nIGEgY2FsbCB0aGF0IGl0J3MgdHJhY2tpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19wb2xsc2V0IGdycGNfcG9sbHNldDsKK3R5cGVkZWYgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgZ3JwY19wb2xsc2V0X3dvcmtlcjsKKworc2l6ZV90IGdycGNfcG9sbHNldF9zaXplKHZvaWQpOwordm9pZCBncnBjX3BvbGxzZXRfaW5pdChncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdwcl9tdSAqKm11KTsKKy8qIEJlZ2luIHNodXR0aW5nIGRvd24gdGhlIHBvbGxzZXQsIGFuZCBjYWxsIGNsb3N1cmUgd2hlbiBkb25lLgorICogcG9sbHNldCdzIG11dGV4IG11c3QgYmUgaGVsZCAqLwordm9pZCBncnBjX3BvbGxzZXRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7CisvKiogUmVzZXQgdGhlIHBvbGxzZXQgdG8gaXRzIGluaXRpYWwgc3RhdGUgKHBlcmhhcHMgd2l0aCBzb21lIGNhY2hlZCBvYmplY3RzKTsKKyAqICBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHNodXRkb3duICovCit2b2lkIGdycGNfcG9sbHNldF9yZXNldChncnBjX3BvbGxzZXQgKnBvbGxzZXQpOwordm9pZCBncnBjX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpOworCisvKiBEbyBzb21lIHdvcmsgb24gYSBwb2xsc2V0LgorICAgTWF5IGludm9sdmUgaW52b2tpbmcgYXN5bmNocm9ub3VzIGNhbGxiYWNrcywgb3IgYWN0dWFsbHkgcG9sbGluZyBmaWxlCisgICBkZXNjcmlwdG9ycy4KKyAgIFJlcXVpcmVzIHBvbGxzZXQncyBtdXRleCBsb2NrZWQuCisgICBNYXkgdW5sb2NrIGl0cyBtdXRleCBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4KKworICAgd29ya2VyIGlzIGEgKHBsYXRmb3JtLXNwZWNpZmljKSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWtlIHVwCisgICBmcm9tIGdycGNfcG9sbHNldF93b3JrIGJlZm9yZSBhbnkgZXZlbnRzIGFyZSByZWNlaXZlZCBhbmQgYmVmb3JlIHRoZSB0aW1lb3V0CisgICBoYXMgZXhwaXJlZC4gSXQgaXMgYm90aCBpbml0aWFsaXplZCBhbmQgZGVzdHJveWVkIGJ5IGdycGNfcG9sbHNldF93b3JrLgorICAgSW5pdGlhbGl6YXRpb24gb2Ygd29ya2VyIGlzIGd1YXJhbnRlZWQgdG8gb2NjdXIgQkVGT1JFIHRoZQorICAgcG9sbHNldCdzIG11dGV4IGlzIHJlbGVhc2VkIGZvciB0aGUgZmlyc3QgdGltZSBieSBncnBjX3BvbGxzZXRfd29yaworICAgYW5kIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBpdCB3aWxsIG5vdCBiZSByZWxlYXNlZCBieSBncnBjX3BvbGxzZXRfd29yaworICAgQUZURVIgd29ya2VyIGhhcyBiZWVuIGRlc3Ryb3llZC4KKworICAgVHJpZXMgbm90IHRvIGJsb2NrIHBhc3QgZGVhZGxpbmUuCisgICBNYXkgY2FsbCBncnBjX2Nsb3N1cmVfbGlzdF9ydW4gb24gZ3JwY19jbG9zdXJlX2xpc3QsIHdpdGhvdXQgaG9sZGluZyB0aGUKKyAgIHBvbGxzZXQKKyAgIGxvY2sgKi8KK3ZvaWQgZ3JwY19wb2xsc2V0X3dvcmsoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqKndvcmtlciwgZ3ByX3RpbWVzcGVjIG5vdywKKyAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKTsKKworLyogQnJlYWsgb25lIHBvbGxpbmcgdGhyZWFkIG91dCBvZiBwb2xsaW5nIHdvcmsgZm9yIHRoaXMgcG9sbHNldC4KKyAgIElmIHNwZWNpZmljX3dvcmtlciBpcyBHUlBDX1BPTExTRVRfS0lDS19CUk9BRENBU1QsIGtpY2sgQUxMIHRoZSB3b3JrZXJzLgorICAgT3RoZXJ3aXNlLCBpZiBzcGVjaWZpY193b3JrZXIgaXMgbm9uLU5VTEwsIHRoZW4ga2ljayB0aGF0IHdvcmtlci4gKi8KK3ZvaWQgZ3JwY19wb2xsc2V0X2tpY2soZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICpzcGVjaWZpY193b3JrZXIpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFiMGQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9MSU5VWF9NVUxUSVBPTExfV0lUSF9FUE9MTAorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgorCitzdHJ1Y3QgZXBvbGxfZmRfbGlzdCB7CisgIGludCAqZXBvbGxfZmRzOworICBzaXplX3QgY291bnQ7CisgIHNpemVfdCBjYXBhY2l0eTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXBvbGxfZmRfbGlzdCBlcG9sbF9mZF9nbG9iYWxfbGlzdDsKK3N0YXRpYyBncHJfb25jZSBpbml0X2Vwb2xsX2ZkX2xpc3RfbXUgPSBHUFJfT05DRV9JTklUOworc3RhdGljIGdwcl9tdSBlcG9sbF9mZF9saXN0X211OworCitzdGF0aWMgdm9pZCBpbml0X211KHZvaWQpIHsgZ3ByX211X2luaXQoJmVwb2xsX2ZkX2xpc3RfbXUpOyB9CisKK3N0YXRpYyB2b2lkIGFkZF9lcG9sbF9mZF90b19nbG9iYWxfbGlzdChpbnQgZXBvbGxfZmQpIHsKKyAgZ3ByX29uY2VfaW5pdCgmaW5pdF9lcG9sbF9mZF9saXN0X211LCBpbml0X211KTsKKworICBncHJfbXVfbG9jaygmZXBvbGxfZmRfbGlzdF9tdSk7CisgIGlmIChlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudCA9PSBlcG9sbF9mZF9nbG9iYWxfbGlzdC5jYXBhY2l0eSkgeworICAgIGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNhcGFjaXR5ID0KKyAgICAgICAgR1BSX01BWCgoc2l6ZV90KTgsIGVwb2xsX2ZkX2dsb2JhbF9saXN0LmNhcGFjaXR5ICogMik7CisgICAgZXBvbGxfZmRfZ2xvYmFsX2xpc3QuZXBvbGxfZmRzID0KKyAgICAgICAgZ3ByX3JlYWxsb2MoZXBvbGxfZmRfZ2xvYmFsX2xpc3QuZXBvbGxfZmRzLAorICAgICAgICAgICAgICAgICAgICBlcG9sbF9mZF9nbG9iYWxfbGlzdC5jYXBhY2l0eSAqIHNpemVvZihpbnQpKTsKKyAgfQorICBlcG9sbF9mZF9nbG9iYWxfbGlzdC5lcG9sbF9mZHNbZXBvbGxfZmRfZ2xvYmFsX2xpc3QuY291bnQrK10gPSBlcG9sbF9mZDsKKyAgZ3ByX211X3VubG9jaygmZXBvbGxfZmRfbGlzdF9tdSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9lcG9sbF9mZF9mcm9tX2dsb2JhbF9saXN0KGludCBlcG9sbF9mZCkgeworICBncHJfbXVfbG9jaygmZXBvbGxfZmRfbGlzdF9tdSk7CisgIEdQUl9BU1NFUlQoZXBvbGxfZmRfZ2xvYmFsX2xpc3QuY291bnQgPiAwKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudDsgaSsrKSB7CisgICAgaWYgKGVwb2xsX2ZkID09IGVwb2xsX2ZkX2dsb2JhbF9saXN0LmVwb2xsX2Zkc1tpXSkgeworICAgICAgZXBvbGxfZmRfZ2xvYmFsX2xpc3QuZXBvbGxfZmRzW2ldID0KKyAgICAgICAgICBlcG9sbF9mZF9nbG9iYWxfbGlzdC5lcG9sbF9mZHNbLS0oZXBvbGxfZmRfZ2xvYmFsX2xpc3QuY291bnQpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKK30KKwordm9pZCBncnBjX3JlbW92ZV9mZF9mcm9tX2FsbF9lcG9sbF9zZXRzKGludCBmZCkgeworICBpbnQgZXJyOworICBncHJfb25jZV9pbml0KCZpbml0X2Vwb2xsX2ZkX2xpc3RfbXUsIGluaXRfbXUpOworICBncHJfbXVfbG9jaygmZXBvbGxfZmRfbGlzdF9tdSk7CisgIGlmIChlcG9sbF9mZF9nbG9iYWxfbGlzdC5jb3VudCA9PSAwKSB7CisgICAgZ3ByX211X3VubG9jaygmZXBvbGxfZmRfbGlzdF9tdSk7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXBvbGxfZmRfZ2xvYmFsX2xpc3QuY291bnQ7IGkrKykgeworICAgIGVyciA9IGVwb2xsX2N0bChlcG9sbF9mZF9nbG9iYWxfbGlzdC5lcG9sbF9mZHNbaV0sIEVQT0xMX0NUTF9ERUwsIGZkLCBOVUxMKTsKKyAgICBpZiAoZXJyIDwgMCAmJiBlcnJubyAhPSBFTk9FTlQpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZXBvbGxfY3RsIGRlbCBmb3IgJWQgZmFpbGVkOiAlcyIsIGZkLAorICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZlcG9sbF9mZF9saXN0X211KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7CisgIGdycGNfZmQgKmZkOworICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKK30gZGVsYXllZF9hZGQ7CisKK3R5cGVkZWYgc3RydWN0IHsgaW50IGVwb2xsX2ZkOyB9IHBvbGxzZXRfaGRyOworCitzdGF0aWMgdm9pZCBmaW5hbGx5X2FkZF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19mZCAqZmQpIHsKKyAgcG9sbHNldF9oZHIgKmggPSBwb2xsc2V0LT5kYXRhLnB0cjsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2OworICBpbnQgZXJyOworICBncnBjX2ZkX3dhdGNoZXIgd2F0Y2hlcjsKKworICAvKiBXZSBwcmV0ZW5kIHRvIGJlIHBvbGxpbmcgd2hpbHN0IGFkZGluZyBhbiBmZCB0byBrZWVwIHRoZSBmZCBmcm9tIGJlaW5nCisgICAgIGNsb3NlZCBkdXJpbmcgdGhlIGFkZC4gVGhpcyBtYXkgcmVzdWx0IGluIGEgc3B1cmlvdXMgd2FrZXVwIGJlaW5nIGFzc2lnbmVkCisgICAgIHRvIHRoaXMgcG9sbHNldCB3aGlsc3QgYWRkaW5nLCBidXQgdGhhdCBzaG91bGQgYmUgYmVuaWduLiAqLworICBHUFJfQVNTRVJUKGdycGNfZmRfYmVnaW5fcG9sbChmZCwgcG9sbHNldCwgTlVMTCwgMCwgMCwgJndhdGNoZXIpID09IDApOworICBpZiAod2F0Y2hlci5mZCAhPSBOVUxMKSB7CisgICAgZXYuZXZlbnRzID0gKHVpbnQzMl90KShFUE9MTElOIHwgRVBPTExPVVQgfCBFUE9MTEVUKTsKKyAgICBldi5kYXRhLnB0ciA9IGZkOworICAgIGVyciA9IGVwb2xsX2N0bChoLT5lcG9sbF9mZCwgRVBPTExfQ1RMX0FERCwgZmQtPmZkLCAmZXYpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAvKiBGRHMgbWF5IGJlIGFkZGVkIHRvIGEgcG9sbHNldCBtdWx0aXBsZSB0aW1lcywgc28gRUVYSVNUIGlzIG5vcm1hbC4gKi8KKyAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJlcG9sbF9jdGwgYWRkIGZvciAlZCBmYWlsZWQ6ICVzIiwgZmQtPmZkLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGdycGNfZmRfZW5kX3BvbGwoZXhlY19jdHgsICZ3YXRjaGVyLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgcGVyZm9ybV9kZWxheWVkX2FkZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N0YXR1cykgeworICBkZWxheWVkX2FkZCAqZGEgPSBhcmc7CisKKyAgaWYgKCFncnBjX2ZkX2lzX29ycGhhbmVkKGRhLT5mZCkpIHsKKyAgICBmaW5hbGx5X2FkZF9mZChleGVjX2N0eCwgZGEtPnBvbGxzZXQsIGRhLT5mZCk7CisgIH0KKworICBncHJfbXVfbG9jaygmZGEtPnBvbGxzZXQtPm11KTsKKyAgZGEtPnBvbGxzZXQtPmluX2ZsaWdodF9jYnMtLTsKKyAgaWYgKGRhLT5wb2xsc2V0LT5zaHV0dGluZ19kb3duKSB7CisgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBvbGxzZXQgYW55bW9yZS4gKi8KKyAgICBpZiAoZGEtPnBvbGxzZXQtPmluX2ZsaWdodF9jYnMgPT0gMCAmJiAhZGEtPnBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93bikgeworICAgICAgZGEtPnBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93biA9IDE7CisgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGRhLT5wb2xsc2V0LT5zaHV0ZG93bl9kb25lLCB0cnVlLCBOVUxMKTsKKyAgICB9CisgIH0KKyAgZ3ByX211X3VubG9jaygmZGEtPnBvbGxzZXQtPm11KTsKKworICBHUlBDX0ZEX1VOUkVGKGRhLT5mZCwgImRlbGF5ZWRfYWRkIik7CisKKyAgZ3ByX2ZyZWUoZGEpOworfQorCitzdGF0aWMgdm9pZCBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2FkZF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZmQgKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuZF91bmxvY2tfcG9sbHNldCkgeworICBpZiAoYW5kX3VubG9ja19wb2xsc2V0KSB7CisgICAgZ3ByX211X3VubG9jaygmcG9sbHNldC0+bXUpOworICAgIGZpbmFsbHlfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0LCBmZCk7CisgIH0gZWxzZSB7CisgICAgZGVsYXllZF9hZGQgKmRhID0gZ3ByX21hbGxvYyhzaXplb2YoKmRhKSk7CisgICAgZGEtPnBvbGxzZXQgPSBwb2xsc2V0OworICAgIGRhLT5mZCA9IGZkOworICAgIEdSUENfRkRfUkVGKGZkLCAiZGVsYXllZF9hZGQiKTsKKyAgICBncnBjX2Nsb3N1cmVfaW5pdCgmZGEtPmNsb3N1cmUsIHBlcmZvcm1fZGVsYXllZF9hZGQsIGRhKTsKKyAgICBwb2xsc2V0LT5pbl9mbGlnaHRfY2JzKys7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmZGEtPmNsb3N1cmUsIHRydWUsIE5VTEwpOworICB9Cit9CisKKy8qIFRPRE8oa2xlbXBuZXIpOiBXZSBwcm9iYWJseSB3YW50IHRvIHR1cm4gdGhpcyBkb3duIGEgYml0ICovCisjZGVmaW5lIEdSUENfRVBPTExfTUFYX0VWRU5UUyAxMDAwCisKK3N0YXRpYyB2b2lkIG11bHRpcG9sbF93aXRoX2Vwb2xsX3BvbGxzZXRfbWF5YmVfd29ya19hbmRfdW5sb2NrKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwKKyAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdwcl90aW1lc3BlYyBub3cpIHsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGVwX2V2W0dSUENfRVBPTExfTUFYX0VWRU5UU107CisgIGludCBlcF9ydjsKKyAgaW50IHBvbGxfcnY7CisgIHBvbGxzZXRfaGRyICpoID0gcG9sbHNldC0+ZGF0YS5wdHI7CisgIGludCB0aW1lb3V0X21zOworICBzdHJ1Y3QgcG9sbGZkIHBmZHNbMl07CisKKyAgLyogSWYgeW91IHdhbnQgdG8gaWdub3JlIGVwb2xsJ3MgYWJpbGl0eSB0byBzYW5lbHkgaGFuZGxlIHBhcmFsbGVsIHBvbGxlcnMsCisgICAqIGZvciBhIG1vcmUgYXBwbGVzLXRvLWFwcGxlcyBwZXJmb3JtYW5jZSBjb21wYXJpc29uIHdpdGggcG9sbCwgYWRkIGEKKyAgICogaWYgKHBvbGxzZXQtPmNvdW50ZXIgIT0gMCkgeyByZXR1cm4gMDsgfQorICAgKiBoZXJlLgorICAgKi8KKworICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7CisKKyAgdGltZW91dF9tcyA9IGdycGNfcG9sbF9kZWFkbGluZV90b19taWxsaXNfdGltZW91dChkZWFkbGluZSwgbm93KTsKKworICBwZmRzWzBdLmZkID0gR1JQQ19XQUtFVVBfRkRfR0VUX1JFQURfRkQoJndvcmtlci0+d2FrZXVwX2ZkLT5mZCk7CisgIHBmZHNbMF0uZXZlbnRzID0gUE9MTElOOworICBwZmRzWzBdLnJldmVudHMgPSAwOworICBwZmRzWzFdLmZkID0gaC0+ZXBvbGxfZmQ7CisgIHBmZHNbMV0uZXZlbnRzID0gUE9MTElOOworICBwZmRzWzFdLnJldmVudHMgPSAwOworCisgIC8qIFRPRE8odnBhaSk6IENvbnNpZGVyIGZpcnN0IGRvaW5nIGEgMCB0aW1lb3V0IHBvbGwgaGVyZSB0byBhdm9pZAorICAgICBldmVuIGdvaW5nIGludG8gdGhlIGJsb2NraW5nIGFubm90YXRpb24gaWYgcG9zc2libGUgKi8KKyAgR1BSX1RJTUVSX0JFR0lOKCJwb2xsIiwgMCk7CisgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047CisgIHBvbGxfcnYgPSBncnBjX3BvbGxfZnVuY3Rpb24ocGZkcywgMiwgdGltZW91dF9tcyk7CisgIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OOworICBHUFJfVElNRVJfRU5EKCJwb2xsIiwgMCk7CisKKyAgaWYgKHBvbGxfcnYgPCAwKSB7CisgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInBvbGwoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisgIH0gZWxzZSBpZiAocG9sbF9ydiA9PSAwKSB7CisgICAgLyogZG8gbm90aGluZyAqLworICB9IGVsc2UgeworICAgIGlmIChwZmRzWzBdLnJldmVudHMpIHsKKyAgICAgIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKCZ3b3JrZXItPndha2V1cF9mZC0+ZmQpOworICAgIH0KKyAgICBpZiAocGZkc1sxXS5yZXZlbnRzKSB7CisgICAgICBkbyB7CisgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZXBvbGxfd2FpdCBuZXZlciBibG9ja3M7IGl0IGhhcyBhIHRpbWVvdXQgb2YgMCAqLworICAgICAgICBlcF9ydiA9IGVwb2xsX3dhaXQoaC0+ZXBvbGxfZmQsIGVwX2V2LCBHUlBDX0VQT0xMX01BWF9FVkVOVFMsIDApOworICAgICAgICBpZiAoZXBfcnYgPCAwKSB7CisgICAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImVwb2xsX3dhaXQoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGVwX3J2OyArK2kpIHsKKyAgICAgICAgICAgIGdycGNfZmQgKmZkID0gZXBfZXZbaV0uZGF0YS5wdHI7CisgICAgICAgICAgICAvKiBUT0RPKGtsZW1wbmVyKTogV2UgbWlnaHQgd2FudCB0byBjb25zaWRlciBtYWtpbmcgZXJyIGFuZCBwcmkKKyAgICAgICAgICAgICAqIHNlcGFyYXRlIGV2ZW50cyAqLworICAgICAgICAgICAgaW50IGNhbmNlbCA9IGVwX2V2W2ldLmV2ZW50cyAmIChFUE9MTEVSUiB8IEVQT0xMSFVQKTsKKyAgICAgICAgICAgIGludCByZWFkX2V2ID0gZXBfZXZbaV0uZXZlbnRzICYgKEVQT0xMSU4gfCBFUE9MTFBSSSk7CisgICAgICAgICAgICBpbnQgd3JpdGVfZXYgPSBlcF9ldltpXS5ldmVudHMgJiBFUE9MTE9VVDsKKyAgICAgICAgICAgIGlmIChmZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKCZncnBjX2dsb2JhbF93YWtldXBfZmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHJlYWRfZXYgfHwgY2FuY2VsKSB7CisgICAgICAgICAgICAgICAgZ3JwY19mZF9iZWNvbWVfcmVhZGFibGUoZXhlY19jdHgsIGZkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAod3JpdGVfZXYgfHwgY2FuY2VsKSB7CisgICAgICAgICAgICAgICAgZ3JwY19mZF9iZWNvbWVfd3JpdGFibGUoZXhlY19jdHgsIGZkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoZXBfcnYgPT0gR1JQQ19FUE9MTF9NQVhfRVZFTlRTKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgbXVsdGlwb2xsX3dpdGhfZXBvbGxfcG9sbHNldF9maW5pc2hfc2h1dGRvd24oCisgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7fQorCitzdGF0aWMgdm9pZCBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2Rlc3Ryb3koZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7CisgIHBvbGxzZXRfaGRyICpoID0gcG9sbHNldC0+ZGF0YS5wdHI7CisgIGNsb3NlKGgtPmVwb2xsX2ZkKTsKKyAgcmVtb3ZlX2Vwb2xsX2ZkX2Zyb21fZ2xvYmFsX2xpc3QoaC0+ZXBvbGxfZmQpOworICBncHJfZnJlZShoKTsKK30KKworc3RhdGljIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgbXVsdGlwb2xsX3dpdGhfZXBvbGxfcG9sbHNldCA9IHsKKyAgICBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2FkZF9mZCwKKyAgICBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X21heWJlX3dvcmtfYW5kX3VubG9jaywKKyAgICBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2ZpbmlzaF9zaHV0ZG93biwKKyAgICBtdWx0aXBvbGxfd2l0aF9lcG9sbF9wb2xsc2V0X2Rlc3Ryb3l9OworCitzdGF0aWMgdm9pZCBlcG9sbF9iZWNvbWVfbXVsdGlwb2xsZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2ZkICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZmRzKSB7CisgIHNpemVfdCBpOworICBwb2xsc2V0X2hkciAqaCA9IGdwcl9tYWxsb2Moc2l6ZW9mKHBvbGxzZXRfaGRyKSk7CisgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKKyAgaW50IGVycjsKKworICBwb2xsc2V0LT52dGFibGUgPSAmbXVsdGlwb2xsX3dpdGhfZXBvbGxfcG9sbHNldDsKKyAgcG9sbHNldC0+ZGF0YS5wdHIgPSBoOworICBoLT5lcG9sbF9mZCA9IGVwb2xsX2NyZWF0ZTEoRVBPTExfQ0xPRVhFQyk7CisgIGlmIChoLT5lcG9sbF9mZCA8IDApIHsKKyAgICAvKiBUT0RPKGtsZW1wbmVyKTogRmFsbCBiYWNrIHRvIHBvbGwgaGVyZSwgZXNwZWNpYWxseSBvbiBFTk9TWVMgKi8KKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImVwb2xsX2NyZWF0ZTEgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgYWJvcnQoKTsKKyAgfQorICBhZGRfZXBvbGxfZmRfdG9fZ2xvYmFsX2xpc3QoaC0+ZXBvbGxfZmQpOworCisgIGV2LmV2ZW50cyA9ICh1aW50MzJfdCkoRVBPTExJTiB8IEVQT0xMRVQpOworICBldi5kYXRhLnB0ciA9IE5VTEw7CisgIGVyciA9IGVwb2xsX2N0bChoLT5lcG9sbF9mZCwgRVBPTExfQ1RMX0FERCwKKyAgICAgICAgICAgICAgICAgIEdSUENfV0FLRVVQX0ZEX0dFVF9SRUFEX0ZEKCZncnBjX2dsb2JhbF93YWtldXBfZmQpLCAmZXYpOworICBpZiAoZXJyIDwgMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZXBvbGxfY3RsIGFkZCBmb3IgJWQgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBHUlBDX1dBS0VVUF9GRF9HRVRfUkVBRF9GRCgmZ3JwY19nbG9iYWxfd2FrZXVwX2ZkKSwKKyAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgbXVsdGlwb2xsX3dpdGhfZXBvbGxfcG9sbHNldF9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXQsIGZkc1tpXSwgMCk7CisgIH0KK30KKworZ3JwY19wbGF0Zm9ybV9iZWNvbWVfbXVsdGlwb2xsZXJfdHlwZSBncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlciA9CisgICAgZXBvbGxfYmVjb21lX211bHRpcG9sbGVyOworCisjZWxzZSAvKiBHUFJfTElOVVhfTVVMVElQT0xMX1dJVEhfRVBPTEwgKi8KKwordm9pZCBncnBjX3JlbW92ZV9mZF9mcm9tX2FsbF9lcG9sbF9zZXRzKGludCBmZCkge30KKworI2VuZGlmIC8qIEdQUl9MSU5VWF9NVUxUSVBPTExfV0lUSF9FUE9MTCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjMzZjZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBhbGwgcG9sbGVkIGZkcyAqLworICBzaXplX3QgZmRfY291bnQ7CisgIHNpemVfdCBmZF9jYXBhY2l0eTsKKyAgZ3JwY19mZCAqKmZkczsKKyAgLyogZmRzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcG9sbHNldCBleHBsaWNpdGx5ICovCisgIHNpemVfdCBkZWxfY291bnQ7CisgIHNpemVfdCBkZWxfY2FwYWNpdHk7CisgIGdycGNfZmQgKipkZWxzOworfSBwb2xsc2V0X2hkcjsKKworc3RhdGljIHZvaWQgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X2FkZF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2ZkICpmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuZF91bmxvY2tfcG9sbHNldCkgeworICBzaXplX3QgaTsKKyAgcG9sbHNldF9oZHIgKmggPSBwb2xsc2V0LT5kYXRhLnB0cjsKKyAgLyogVE9ETyhjdGlsbGVyKTogdGhpcyBpcyBPKG51bV9mZHNeMik7IG1heWJlIHN3aXRjaCB0byBhIGhhc2ggc2V0IGhlcmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IGgtPmZkX2NvdW50OyBpKyspIHsKKyAgICBpZiAoaC0+ZmRzW2ldID09IGZkKSBnb3RvIGV4aXQ7CisgIH0KKyAgaWYgKGgtPmZkX2NvdW50ID09IGgtPmZkX2NhcGFjaXR5KSB7CisgICAgaC0+ZmRfY2FwYWNpdHkgPSBHUFJfTUFYKGgtPmZkX2NhcGFjaXR5ICsgOCwgaC0+ZmRfY291bnQgKiAzIC8gMik7CisgICAgaC0+ZmRzID0gZ3ByX3JlYWxsb2MoaC0+ZmRzLCBzaXplb2YoZ3JwY19mZCAqKSAqIGgtPmZkX2NhcGFjaXR5KTsKKyAgfQorICBoLT5mZHNbaC0+ZmRfY291bnQrK10gPSBmZDsKKyAgR1JQQ19GRF9SRUYoZmQsICJtdWx0aXBvbGxlciIpOworZXhpdDoKKyAgaWYgKGFuZF91bmxvY2tfcG9sbHNldCkgeworICAgIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXRfbWF5YmVfd29ya19hbmRfdW5sb2NrKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwKKyAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdwcl90aW1lc3BlYyBub3cpIHsKKyNkZWZpbmUgUE9MTE9VVF9DSEVDSyAoUE9MTE9VVCB8IFBPTExIVVAgfCBQT0xMRVJSKQorI2RlZmluZSBQT0xMSU5fQ0hFQ0sgKFBPTExJTiB8IFBPTExIVVAgfCBQT0xMRVJSKQorCisgIGludCB0aW1lb3V0OworICBpbnQgcjsKKyAgc2l6ZV90IGksIGosIGZkX2NvdW50OworICBuZmRzX3QgcGZkX2NvdW50OworICBwb2xsc2V0X2hkciAqaDsKKyAgLyogVE9ETyhjdGlsbGVyKTogaW5saW5lIHNvbWUgZWxlbWVudHMgdG8gYXZvaWQgYW4gYWxsb2NhdGlvbiAqLworICBncnBjX2ZkX3dhdGNoZXIgKndhdGNoZXJzOworICBzdHJ1Y3QgcG9sbGZkICpwZmRzOworCisgIGggPSBwb2xsc2V0LT5kYXRhLnB0cjsKKyAgdGltZW91dCA9IGdycGNfcG9sbF9kZWFkbGluZV90b19taWxsaXNfdGltZW91dChkZWFkbGluZSwgbm93KTsKKyAgLyogVE9ETyhjdGlsbGVyKTogcGVyZm9ybSBqdXN0IG9uZSBtYWxsb2MgaGVyZSBpZiB3ZSBleGNlZWQgdGhlIGlubGluZSBjYXNlICovCisgIHBmZHMgPSBncHJfbWFsbG9jKHNpemVvZigqcGZkcykgKiAoaC0+ZmRfY291bnQgKyAyKSk7CisgIHdhdGNoZXJzID0gZ3ByX21hbGxvYyhzaXplb2YoKndhdGNoZXJzKSAqIChoLT5mZF9jb3VudCArIDIpKTsKKyAgZmRfY291bnQgPSAwOworICBwZmRfY291bnQgPSAyOworICBwZmRzWzBdLmZkID0gR1JQQ19XQUtFVVBfRkRfR0VUX1JFQURfRkQoJmdycGNfZ2xvYmFsX3dha2V1cF9mZCk7CisgIHBmZHNbMF0uZXZlbnRzID0gUE9MTElOOworICBwZmRzWzBdLnJldmVudHMgPSAwOworICBwZmRzWzFdLmZkID0gR1JQQ19XQUtFVVBfRkRfR0VUX1JFQURfRkQoJndvcmtlci0+d2FrZXVwX2ZkLT5mZCk7CisgIHBmZHNbMV0uZXZlbnRzID0gUE9MTElOOworICBwZmRzWzFdLnJldmVudHMgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgaC0+ZmRfY291bnQ7IGkrKykgeworICAgIGludCByZW1vdmUgPSBncnBjX2ZkX2lzX29ycGhhbmVkKGgtPmZkc1tpXSk7CisgICAgZm9yIChqID0gMDsgIXJlbW92ZSAmJiBqIDwgaC0+ZGVsX2NvdW50OyBqKyspIHsKKyAgICAgIGlmIChoLT5mZHNbaV0gPT0gaC0+ZGVsc1tqXSkgcmVtb3ZlID0gMTsKKyAgICB9CisgICAgaWYgKHJlbW92ZSkgeworICAgICAgR1JQQ19GRF9VTlJFRihoLT5mZHNbaV0sICJtdWx0aXBvbGxlciIpOworICAgIH0gZWxzZSB7CisgICAgICBoLT5mZHNbZmRfY291bnQrK10gPSBoLT5mZHNbaV07CisgICAgICB3YXRjaGVyc1twZmRfY291bnRdLmZkID0gaC0+ZmRzW2ldOworICAgICAgR1JQQ19GRF9SRUYod2F0Y2hlcnNbcGZkX2NvdW50XS5mZCwgIm11bHRpcG9sbGVyX3N0YXJ0Iik7CisgICAgICBwZmRzW3BmZF9jb3VudF0uZmQgPSBoLT5mZHNbaV0tPmZkOworICAgICAgcGZkc1twZmRfY291bnRdLnJldmVudHMgPSAwOworICAgICAgcGZkX2NvdW50Kys7CisgICAgfQorICB9CisgIGZvciAoaiA9IDA7IGogPCBoLT5kZWxfY291bnQ7IGorKykgeworICAgIEdSUENfRkRfVU5SRUYoaC0+ZGVsc1tqXSwgIm11bHRpcG9sbGVyX2RlbCIpOworICB9CisgIGgtPmRlbF9jb3VudCA9IDA7CisgIGgtPmZkX2NvdW50ID0gZmRfY291bnQ7CisgIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKKworICBmb3IgKGkgPSAyOyBpIDwgcGZkX2NvdW50OyBpKyspIHsKKyAgICBncnBjX2ZkICpmZCA9IHdhdGNoZXJzW2ldLmZkOworICAgIHBmZHNbaV0uZXZlbnRzID0gKHNob3J0KWdycGNfZmRfYmVnaW5fcG9sbChmZCwgcG9sbHNldCwgd29ya2VyLCBQT0xMSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExPVVQsICZ3YXRjaGVyc1tpXSk7CisgICAgR1JQQ19GRF9VTlJFRihmZCwgIm11bHRpcG9sbGVyX3N0YXJ0Iik7CisgIH0KKworICAvKiBUT0RPKHZwYWkpOiBDb25zaWRlciBmaXJzdCBkb2luZyBhIDAgdGltZW91dCBwb2xsIGhlcmUgdG8gYXZvaWQKKyAgICAgZXZlbiBnb2luZyBpbnRvIHRoZSBibG9ja2luZyBhbm5vdGF0aW9uIGlmIHBvc3NpYmxlICovCisgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047CisgIHIgPSBncnBjX3BvbGxfZnVuY3Rpb24ocGZkcywgcGZkX2NvdW50LCB0aW1lb3V0KTsKKyAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047CisKKyAgaWYgKHIgPCAwKSB7CisgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInBvbGwoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisgICAgZm9yIChpID0gMjsgaSA8IHBmZF9jb3VudDsgaSsrKSB7CisgICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmd2F0Y2hlcnNbaV0sIDAsIDApOworICAgIH0KKyAgfSBlbHNlIGlmIChyID09IDApIHsKKyAgICBmb3IgKGkgPSAyOyBpIDwgcGZkX2NvdW50OyBpKyspIHsKKyAgICAgIGdycGNfZmRfZW5kX3BvbGwoZXhlY19jdHgsICZ3YXRjaGVyc1tpXSwgMCwgMCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwZmRzWzBdLnJldmVudHMgJiBQT0xMSU5fQ0hFQ0spIHsKKyAgICAgIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKCZncnBjX2dsb2JhbF93YWtldXBfZmQpOworICAgIH0KKyAgICBpZiAocGZkc1sxXS5yZXZlbnRzICYgUE9MTElOX0NIRUNLKSB7CisgICAgICBncnBjX3dha2V1cF9mZF9jb25zdW1lX3dha2V1cCgmd29ya2VyLT53YWtldXBfZmQtPmZkKTsKKyAgICB9CisgICAgZm9yIChpID0gMjsgaSA8IHBmZF9jb3VudDsgaSsrKSB7CisgICAgICBpZiAod2F0Y2hlcnNbaV0uZmQgPT0gTlVMTCkgeworICAgICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmd2F0Y2hlcnNbaV0sIDAsIDApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGdycGNfZmRfZW5kX3BvbGwoZXhlY19jdHgsICZ3YXRjaGVyc1tpXSwgcGZkc1tpXS5yZXZlbnRzICYgUE9MTElOX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICBwZmRzW2ldLnJldmVudHMgJiBQT0xMT1VUX0NIRUNLKTsKKyAgICB9CisgIH0KKworICBncHJfZnJlZShwZmRzKTsKKyAgZ3ByX2ZyZWUod2F0Y2hlcnMpOworfQorCitzdGF0aWMgdm9pZCBtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXRfZmluaXNoX3NodXRkb3duKGdycGNfcG9sbHNldCAqcG9sbHNldCkgeworICBzaXplX3QgaTsKKyAgcG9sbHNldF9oZHIgKmggPSBwb2xsc2V0LT5kYXRhLnB0cjsKKyAgZm9yIChpID0gMDsgaSA8IGgtPmZkX2NvdW50OyBpKyspIHsKKyAgICBHUlBDX0ZEX1VOUkVGKGgtPmZkc1tpXSwgIm11bHRpcG9sbGVyIik7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGgtPmRlbF9jb3VudDsgaSsrKSB7CisgICAgR1JQQ19GRF9VTlJFRihoLT5kZWxzW2ldLCAibXVsdGlwb2xsZXJfZGVsIik7CisgIH0KKyAgaC0+ZmRfY291bnQgPSAwOworICBoLT5kZWxfY291bnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgcG9sbHNldF9oZHIgKmggPSBwb2xsc2V0LT5kYXRhLnB0cjsKKyAgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X2ZpbmlzaF9zaHV0ZG93bihwb2xsc2V0KTsKKyAgZ3ByX2ZyZWUoaC0+ZmRzKTsKKyAgZ3ByX2ZyZWUoaC0+ZGVscyk7CisgIGdwcl9mcmVlKGgpOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19wb2xsc2V0X3Z0YWJsZSBtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXQgPSB7CisgICAgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X2FkZF9mZCwKKyAgICBtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXRfbWF5YmVfd29ya19hbmRfdW5sb2NrLAorICAgIG11bHRpcG9sbF93aXRoX3BvbGxfcG9sbHNldF9maW5pc2hfc2h1dGRvd24sCisgICAgbXVsdGlwb2xsX3dpdGhfcG9sbF9wb2xsc2V0X2Rlc3Ryb3l9OworCit2b2lkIGdycGNfcG9sbF9iZWNvbWVfbXVsdGlwb2xsZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2ZkICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZmRzKSB7CisgIHNpemVfdCBpOworICBwb2xsc2V0X2hkciAqaCA9IGdwcl9tYWxsb2Moc2l6ZW9mKHBvbGxzZXRfaGRyKSk7CisgIHBvbGxzZXQtPnZ0YWJsZSA9ICZtdWx0aXBvbGxfd2l0aF9wb2xsX3BvbGxzZXQ7CisgIHBvbGxzZXQtPmRhdGEucHRyID0gaDsKKyAgaC0+ZmRfY291bnQgPSBuZmRzOworICBoLT5mZF9jYXBhY2l0eSA9IG5mZHM7CisgIGgtPmZkcyA9IGdwcl9tYWxsb2MobmZkcyAqIHNpemVvZihncnBjX2ZkICopKTsKKyAgaC0+ZGVsX2NvdW50ID0gMDsKKyAgaC0+ZGVsX2NhcGFjaXR5ID0gMDsKKyAgaC0+ZGVscyA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICBoLT5mZHNbaV0gPSBmZHNbaV07CisgICAgR1JQQ19GRF9SRUYoZmRzW2ldLCAibXVsdGlwb2xsZXIiKTsKKyAgfQorfQorCisjZW5kaWYgLyogR1BSX1BPU0lYX1NPQ0tFVCAqLworCisjaWZkZWYgR1BSX1BPU0lYX01VTFRJUE9MTF9XSVRIX1BPTEwKK2dycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyX3R5cGUgZ3JwY19wbGF0Zm9ybV9iZWNvbWVfbXVsdGlwb2xsZXIgPQorICAgIGdycGNfcG9sbF9iZWNvbWVfbXVsdGlwb2xsZXI7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5jCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9QT1NJWF9TT0NLRVQKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGxzLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiCisKK0dQUl9UTFNfREVDTChnX2N1cnJlbnRfdGhyZWFkX3BvbGxlcik7CitHUFJfVExTX0RFQ0woZ19jdXJyZW50X3RocmVhZF93b3JrZXIpOworCisvKiogRGVmYXVsdCBwb2xsKCkgZnVuY3Rpb24gLSBhIHBvaW50ZXIgc28gdGhhdCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzb21lCisgKiAgdGVzdHMgKi8KK2dycGNfcG9sbF9mdW5jdGlvbl90eXBlIGdycGNfcG9sbF9mdW5jdGlvbiA9IHBvbGw7CisKKy8qKiBUaGUgYWxhcm0gc3lzdGVtIG5lZWRzIHRvIGJlIGFibGUgdG8gd2FrZXVwICdzb21lIHBvbGxlcicgc29tZXRpbWVzCisgKiAgKHNwZWNpZmljYWxseSB3aGVuIGEgbmV3IGFsYXJtIG5lZWRzIHRvIGJlIHRyaWdnZXJlZCBlYXJsaWVyIHRoYW4gdGhlIG5leHQKKyAqICBhbGFybSAnZXBvY2gnKS4KKyAqICBUaGlzIHdha2V1cF9mZCBnaXZlcyB1cyBzb21ldGhpbmcgdG8gYWxlcnQgb24gd2hlbiBzdWNoIGEgY2FzZSBvY2N1cnMuICovCitncnBjX3dha2V1cF9mZCBncnBjX2dsb2JhbF93YWtldXBfZmQ7CisKK3N0YXRpYyB2b2lkIHJlbW92ZV93b3JrZXIoZ3JwY19wb2xsc2V0ICpwLCBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIpIHsKKyAgd29ya2VyLT5wcmV2LT5uZXh0ID0gd29ya2VyLT5uZXh0OworICB3b3JrZXItPm5leHQtPnByZXYgPSB3b3JrZXItPnByZXY7Cit9CisKK2ludCBncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMoZ3JwY19wb2xsc2V0ICpwKSB7CisgIHJldHVybiBwLT5yb290X3dvcmtlci5uZXh0ICE9ICZwLT5yb290X3dvcmtlcjsKK30KKworc3RhdGljIGdycGNfcG9sbHNldF93b3JrZXIgKnBvcF9mcm9udF93b3JrZXIoZ3JwY19wb2xsc2V0ICpwKSB7CisgIGlmIChncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocCkpIHsKKyAgICBncnBjX3BvbGxzZXRfd29ya2VyICp3ID0gcC0+cm9vdF93b3JrZXIubmV4dDsKKyAgICByZW1vdmVfd29ya2VyKHAsIHcpOworICAgIHJldHVybiB3OworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfYmFja193b3JrZXIoZ3JwY19wb2xsc2V0ICpwLCBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIpIHsKKyAgd29ya2VyLT5uZXh0ID0gJnAtPnJvb3Rfd29ya2VyOworICB3b3JrZXItPnByZXYgPSB3b3JrZXItPm5leHQtPnByZXY7CisgIHdvcmtlci0+cHJldi0+bmV4dCA9IHdvcmtlci0+bmV4dC0+cHJldiA9IHdvcmtlcjsKK30KKworc3RhdGljIHZvaWQgcHVzaF9mcm9udF93b3JrZXIoZ3JwY19wb2xsc2V0ICpwLCBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIpIHsKKyAgd29ya2VyLT5wcmV2ID0gJnAtPnJvb3Rfd29ya2VyOworICB3b3JrZXItPm5leHQgPSB3b3JrZXItPnByZXYtPm5leHQ7CisgIHdvcmtlci0+cHJldi0+bmV4dCA9IHdvcmtlci0+bmV4dC0+cHJldiA9IHdvcmtlcjsKK30KKworc2l6ZV90IGdycGNfcG9sbHNldF9zaXplKHZvaWQpIHsgcmV0dXJuIHNpemVvZihncnBjX3BvbGxzZXQpOyB9CisKK3ZvaWQgZ3JwY19wb2xsc2V0X2tpY2tfZXh0KGdycGNfcG9sbHNldCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKnNwZWNpZmljX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19wb2xsc2V0X2tpY2tfZXh0IiwgMCk7CisKKyAgLyogcG9sbHNldC0+bXUgYWxyZWFkeSBoZWxkICovCisgIGlmIChzcGVjaWZpY193b3JrZXIgIT0gTlVMTCkgeworICAgIGlmIChzcGVjaWZpY193b3JrZXIgPT0gR1JQQ19QT0xMU0VUX0tJQ0tfQlJPQURDQVNUKSB7CisgICAgICBHUFJfVElNRVJfQkVHSU4oImdycGNfcG9sbHNldF9raWNrX2V4dC5icm9hZGNhc3QiLCAwKTsKKyAgICAgIEdQUl9BU1NFUlQoKGZsYWdzICYgR1JQQ19QT0xMU0VUX1JFRVZBTFVBVEVfUE9MTElOR19PTl9XQUtFVVApID09IDApOworICAgICAgZm9yIChzcGVjaWZpY193b3JrZXIgPSBwLT5yb290X3dvcmtlci5uZXh0OworICAgICAgICAgICBzcGVjaWZpY193b3JrZXIgIT0gJnAtPnJvb3Rfd29ya2VyOworICAgICAgICAgICBzcGVjaWZpY193b3JrZXIgPSBzcGVjaWZpY193b3JrZXItPm5leHQpIHsKKyAgICAgICAgZ3JwY193YWtldXBfZmRfd2FrZXVwKCZzcGVjaWZpY193b3JrZXItPndha2V1cF9mZC0+ZmQpOworICAgICAgfQorICAgICAgcC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDE7CisgICAgICBHUFJfVElNRVJfRU5EKCJncnBjX3BvbGxzZXRfa2lja19leHQuYnJvYWRjYXN0IiwgMCk7CisgICAgfSBlbHNlIGlmIChncHJfdGxzX2dldCgmZ19jdXJyZW50X3RocmVhZF93b3JrZXIpICE9CisgICAgICAgICAgICAgICAoaW50cHRyX3Qpc3BlY2lmaWNfd29ya2VyKSB7CisgICAgICBHUFJfVElNRVJfTUFSSygiZGlmZmVyZW50X3RocmVhZF93b3JrZXIiLCAwKTsKKyAgICAgIGlmICgoZmxhZ3MgJiBHUlBDX1BPTExTRVRfUkVFVkFMVUFURV9QT0xMSU5HX09OX1dBS0VVUCkgIT0gMCkgeworICAgICAgICBzcGVjaWZpY193b3JrZXItPnJlZXZhbHVhdGVfcG9sbGluZ19vbl93YWtldXAgPSAxOworICAgICAgfQorICAgICAgc3BlY2lmaWNfd29ya2VyLT5raWNrZWRfc3BlY2lmaWNhbGx5ID0gMTsKKyAgICAgIGdycGNfd2FrZXVwX2ZkX3dha2V1cCgmc3BlY2lmaWNfd29ya2VyLT53YWtldXBfZmQtPmZkKTsKKyAgICB9IGVsc2UgaWYgKChmbGFncyAmIEdSUENfUE9MTFNFVF9DQU5fS0lDS19TRUxGKSAhPSAwKSB7CisgICAgICBHUFJfVElNRVJfTUFSSygia2lja195b3NlbGYiLCAwKTsKKyAgICAgIGlmICgoZmxhZ3MgJiBHUlBDX1BPTExTRVRfUkVFVkFMVUFURV9QT0xMSU5HX09OX1dBS0VVUCkgIT0gMCkgeworICAgICAgICBzcGVjaWZpY193b3JrZXItPnJlZXZhbHVhdGVfcG9sbGluZ19vbl93YWtldXAgPSAxOworICAgICAgfQorICAgICAgc3BlY2lmaWNfd29ya2VyLT5raWNrZWRfc3BlY2lmaWNhbGx5ID0gMTsKKyAgICAgIGdycGNfd2FrZXVwX2ZkX3dha2V1cCgmc3BlY2lmaWNfd29ya2VyLT53YWtldXBfZmQtPmZkKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ3ByX3Rsc19nZXQoJmdfY3VycmVudF90aHJlYWRfcG9sbGVyKSAhPSAoaW50cHRyX3QpcCkgeworICAgIEdQUl9BU1NFUlQoKGZsYWdzICYgR1JQQ19QT0xMU0VUX1JFRVZBTFVBVEVfUE9MTElOR19PTl9XQUtFVVApID09IDApOworICAgIEdQUl9USU1FUl9NQVJLKCJraWNrX2Fub255bW91cyIsIDApOworICAgIHNwZWNpZmljX3dvcmtlciA9IHBvcF9mcm9udF93b3JrZXIocCk7CisgICAgaWYgKHNwZWNpZmljX3dvcmtlciAhPSBOVUxMKSB7CisgICAgICBpZiAoZ3ByX3Rsc19nZXQoJmdfY3VycmVudF90aHJlYWRfd29ya2VyKSA9PSAoaW50cHRyX3Qpc3BlY2lmaWNfd29ya2VyKSB7CisgICAgICAgIEdQUl9USU1FUl9NQVJLKCJraWNrX2Fub255bW91c19ub3Rfc2VsZiIsIDApOworICAgICAgICBwdXNoX2JhY2tfd29ya2VyKHAsIHNwZWNpZmljX3dvcmtlcik7CisgICAgICAgIHNwZWNpZmljX3dvcmtlciA9IHBvcF9mcm9udF93b3JrZXIocCk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBHUlBDX1BPTExTRVRfQ0FOX0tJQ0tfU0VMRikgPT0gMCAmJgorICAgICAgICAgICAgZ3ByX3Rsc19nZXQoJmdfY3VycmVudF90aHJlYWRfd29ya2VyKSA9PQorICAgICAgICAgICAgICAgIChpbnRwdHJfdClzcGVjaWZpY193b3JrZXIpIHsKKyAgICAgICAgICBwdXNoX2JhY2tfd29ya2VyKHAsIHNwZWNpZmljX3dvcmtlcik7CisgICAgICAgICAgc3BlY2lmaWNfd29ya2VyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNwZWNpZmljX3dvcmtlciAhPSBOVUxMKSB7CisgICAgICAgIEdQUl9USU1FUl9NQVJLKCJmaW5hbGx5X2tpY2siLCAwKTsKKyAgICAgICAgcHVzaF9iYWNrX3dvcmtlcihwLCBzcGVjaWZpY193b3JrZXIpOworICAgICAgICBncnBjX3dha2V1cF9mZF93YWtldXAoJnNwZWNpZmljX3dvcmtlci0+d2FrZXVwX2ZkLT5mZCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdQUl9USU1FUl9NQVJLKCJraWNrZWRfbm9fcG9sbGVycyIsIDApOworICAgICAgcC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDE7CisgICAgfQorICB9CisKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19wb2xsc2V0X2tpY2tfZXh0IiwgMCk7Cit9CisKK3ZvaWQgZ3JwY19wb2xsc2V0X2tpY2soZ3JwY19wb2xsc2V0ICpwLCBncnBjX3BvbGxzZXRfd29ya2VyICpzcGVjaWZpY193b3JrZXIpIHsKKyAgZ3JwY19wb2xsc2V0X2tpY2tfZXh0KHAsIHNwZWNpZmljX3dvcmtlciwgMCk7Cit9CisKKy8qIGdsb2JhbCBzdGF0ZSBtYW5hZ2VtZW50ICovCisKK3ZvaWQgZ3JwY19wb2xsc2V0X2dsb2JhbF9pbml0KHZvaWQpIHsKKyAgZ3ByX3Rsc19pbml0KCZnX2N1cnJlbnRfdGhyZWFkX3BvbGxlcik7CisgIGdwcl90bHNfaW5pdCgmZ19jdXJyZW50X3RocmVhZF93b3JrZXIpOworICBncnBjX3dha2V1cF9mZF9nbG9iYWxfaW5pdCgpOworICBncnBjX3dha2V1cF9mZF9pbml0KCZncnBjX2dsb2JhbF93YWtldXBfZmQpOworfQorCit2b2lkIGdycGNfcG9sbHNldF9nbG9iYWxfc2h1dGRvd24odm9pZCkgeworICBncnBjX3dha2V1cF9mZF9kZXN0cm95KCZncnBjX2dsb2JhbF93YWtldXBfZmQpOworICBncHJfdGxzX2Rlc3Ryb3koJmdfY3VycmVudF90aHJlYWRfcG9sbGVyKTsKKyAgZ3ByX3Rsc19kZXN0cm95KCZnX2N1cnJlbnRfdGhyZWFkX3dvcmtlcik7CisgIGdycGNfd2FrZXVwX2ZkX2dsb2JhbF9kZXN0cm95KCk7Cit9CisKK3ZvaWQgZ3JwY19raWNrX3BvbGxlcih2b2lkKSB7IGdycGNfd2FrZXVwX2ZkX3dha2V1cCgmZ3JwY19nbG9iYWxfd2FrZXVwX2ZkKTsgfQorCisvKiBtYWluIGludGVyZmFjZSAqLworCitzdGF0aWMgdm9pZCBiZWNvbWVfYmFzaWNfcG9sbHNldChncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfZmQgKmZkX29yX251bGwpOworCit2b2lkIGdycGNfcG9sbHNldF9pbml0KGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3ByX211ICoqbXUpIHsKKyAgZ3ByX211X2luaXQoJnBvbGxzZXQtPm11KTsKKyAgKm11ID0gJnBvbGxzZXQtPm11OworICBwb2xsc2V0LT5yb290X3dvcmtlci5uZXh0ID0gcG9sbHNldC0+cm9vdF93b3JrZXIucHJldiA9ICZwb2xsc2V0LT5yb290X3dvcmtlcjsKKyAgcG9sbHNldC0+aW5fZmxpZ2h0X2NicyA9IDA7CisgIHBvbGxzZXQtPnNodXR0aW5nX2Rvd24gPSAwOworICBwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24gPSAwOworICBwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMDsKKyAgcG9sbHNldC0+aWRsZV9qb2JzLmhlYWQgPSBwb2xsc2V0LT5pZGxlX2pvYnMudGFpbCA9IE5VTEw7CisgIHBvbGxzZXQtPmxvY2FsX3dha2V1cF9jYWNoZSA9IE5VTEw7CisgIHBvbGxzZXQtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMgPSAwOworICBiZWNvbWVfYmFzaWNfcG9sbHNldChwb2xsc2V0LCBOVUxMKTsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgR1BSX0FTU0VSVChwb2xsc2V0LT5pbl9mbGlnaHRfY2JzID09IDApOworICBHUFJfQVNTRVJUKCFncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocG9sbHNldCkpOworICBHUFJfQVNTRVJUKHBvbGxzZXQtPmlkbGVfam9icy5oZWFkID09IHBvbGxzZXQtPmlkbGVfam9icy50YWlsKTsKKyAgcG9sbHNldC0+dnRhYmxlLT5kZXN0cm95KHBvbGxzZXQpOworICB3aGlsZSAocG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlKSB7CisgICAgZ3JwY19jYWNoZWRfd2FrZXVwX2ZkICpuZXh0ID0gcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlLT5uZXh0OworICAgIGdycGNfd2FrZXVwX2ZkX2Rlc3Ryb3koJnBvbGxzZXQtPmxvY2FsX3dha2V1cF9jYWNoZS0+ZmQpOworICAgIGdwcl9mcmVlKHBvbGxzZXQtPmxvY2FsX3dha2V1cF9jYWNoZSk7CisgICAgcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlID0gbmV4dDsKKyAgfQorfQorCit2b2lkIGdycGNfcG9sbHNldF9yZXNldChncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgR1BSX0FTU0VSVChwb2xsc2V0LT5zaHV0dGluZ19kb3duKTsKKyAgR1BSX0FTU0VSVChwb2xsc2V0LT5pbl9mbGlnaHRfY2JzID09IDApOworICBHUFJfQVNTRVJUKCFncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocG9sbHNldCkpOworICBHUFJfQVNTRVJUKHBvbGxzZXQtPmlkbGVfam9icy5oZWFkID09IHBvbGxzZXQtPmlkbGVfam9icy50YWlsKTsKKyAgcG9sbHNldC0+dnRhYmxlLT5kZXN0cm95KHBvbGxzZXQpOworICBwb2xsc2V0LT5zaHV0dGluZ19kb3duID0gMDsKKyAgcG9sbHNldC0+Y2FsbGVkX3NodXRkb3duID0gMDsKKyAgcG9sbHNldC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDA7CisgIGJlY29tZV9iYXNpY19wb2xsc2V0KHBvbGxzZXQsIE5VTEwpOworfQorCit2b2lkIGdycGNfcG9sbHNldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2ZkICpmZCkgeworICBncHJfbXVfbG9jaygmcG9sbHNldC0+bXUpOworICBwb2xsc2V0LT52dGFibGUtPmFkZF9mZChleGVjX2N0eCwgcG9sbHNldCwgZmQsIDEpOworLyogdGhlIGZvbGxvd2luZyAoZW5hYmxlZCBvbmx5IGluIGRlYnVnKSB3aWxsIHJlYWNxdWlyZSBhbmQgdGhlbiByZWxlYXNlCisgICBvdXIgbG9jayAtIG1lYW5pbmcgdGhhdCBpZiB0aGUgdW5sb2NraW5nIGZsYWcgcGFzc2VkIHRvIGFkZF9mZCBhYm92ZSBpcworICAgbm90IHJlc3BlY3RlZCwgdGhlIGNvZGUgd2lsbCBkZWFkbG9jayAoaW4gYSB3YXkgdGhhdCB3ZSBoYXZlIGEgY2hhbmNlIG9mCisgICBkZWJ1Z2dpbmcpICovCisjaWZuZGVmIE5ERUJVRworICBncHJfbXVfbG9jaygmcG9sbHNldC0+bXUpOworICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZmluaXNoX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgR1BSX0FTU0VSVChncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShwb2xsc2V0LT5pZGxlX2pvYnMpKTsKKyAgcG9sbHNldC0+dnRhYmxlLT5maW5pc2hfc2h1dGRvd24ocG9sbHNldCk7CisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcG9sbHNldC0+c2h1dGRvd25fZG9uZSwgdHJ1ZSwgTlVMTCk7Cit9CisKK3ZvaWQgZ3JwY19wb2xsc2V0X3dvcmsoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqKndvcmtlcl9oZGwsIGdwcl90aW1lc3BlYyBub3csCisgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSkgeworICBncnBjX3BvbGxzZXRfd29ya2VyIHdvcmtlcjsKKyAgKndvcmtlcl9oZGwgPSAmd29ya2VyOworCisgIC8qIHBvbGxzZXQtPm11IGFscmVhZHkgaGVsZCAqLworICBpbnQgYWRkZWRfd29ya2VyID0gMDsKKyAgaW50IGxvY2tlZCA9IDE7CisgIGludCBxdWV1ZWRfd29yayA9IDA7CisgIGludCBrZWVwX3BvbGxpbmcgPSAwOworICBHUFJfVElNRVJfQkVHSU4oImdycGNfcG9sbHNldF93b3JrIiwgMCk7CisgIC8qIHRoaXMgbXVzdCBoYXBwZW4gYmVmb3JlIHdlIChwb3RlbnRpYWxseSkgZHJvcCBwb2xsc2V0LT5tdSAqLworICB3b3JrZXIubmV4dCA9IHdvcmtlci5wcmV2ID0gTlVMTDsKKyAgd29ya2VyLnJlZXZhbHVhdGVfcG9sbGluZ19vbl93YWtldXAgPSAwOworICBpZiAocG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlICE9IE5VTEwpIHsKKyAgICB3b3JrZXIud2FrZXVwX2ZkID0gcG9sbHNldC0+bG9jYWxfd2FrZXVwX2NhY2hlOworICAgIHBvbGxzZXQtPmxvY2FsX3dha2V1cF9jYWNoZSA9IHdvcmtlci53YWtldXBfZmQtPm5leHQ7CisgIH0gZWxzZSB7CisgICAgd29ya2VyLndha2V1cF9mZCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp3b3JrZXIud2FrZXVwX2ZkKSk7CisgICAgZ3JwY193YWtldXBfZmRfaW5pdCgmd29ya2VyLndha2V1cF9mZC0+ZmQpOworICB9CisgIHdvcmtlci5raWNrZWRfc3BlY2lmaWNhbGx5ID0gMDsKKyAgLyogSWYgdGhlcmUncyB3b3JrIHdhaXRpbmcgZm9yIHRoZSBwb2xsc2V0IHRvIGJlIGlkbGUsIGFuZCB0aGUKKyAgICAgcG9sbHNldCBpcyBpZGxlLCB0aGVuIGRvIHRoYXQgd29yayAqLworICBpZiAoIWdycGNfcG9sbHNldF9oYXNfd29ya2Vycyhwb2xsc2V0KSAmJgorICAgICAgIWdycGNfY2xvc3VyZV9saXN0X2VtcHR5KHBvbGxzZXQtPmlkbGVfam9icykpIHsKKyAgICBHUFJfVElNRVJfTUFSSygiZ3JwY19wb2xsc2V0X3dvcmsuaWRsZV9qb2JzIiwgMCk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoZXhlY19jdHgsICZwb2xsc2V0LT5pZGxlX2pvYnMsIE5VTEwpOworICAgIGdvdG8gZG9uZTsKKyAgfQorICAvKiBJZiB3ZSdyZSBzaHV0dGluZyBkb3duIHRoZW4gd2UgZG9uJ3QgZXhlY3V0ZSBhbnkgZXh0ZW5kZWQgd29yayAqLworICBpZiAocG9sbHNldC0+c2h1dHRpbmdfZG93bikgeworICAgIEdQUl9USU1FUl9NQVJLKCJncnBjX3BvbGxzZXRfd29yay5zaHV0dGluZ19kb3duIiwgMCk7CisgICAgZ290byBkb25lOworICB9CisgIC8qIEdpdmUgZG9fcHJvbW90ZSBwcmlvcml0eSBzbyB3ZSBkb24ndCBzdGFydmUgaXQgb3V0ICovCisgIGlmIChwb2xsc2V0LT5pbl9mbGlnaHRfY2JzKSB7CisgICAgR1BSX1RJTUVSX01BUksoImdycGNfcG9sbHNldF93b3JrLmluX2ZsaWdodF9jYnMiLCAwKTsKKyAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7CisgICAgbG9ja2VkID0gMDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgLyogU3RhcnQgcG9sbGluZywgYW5kIGtlZXAgZG9pbmcgc28gd2hpbGUgd2UncmUgYmVpbmcgYXNrZWQgdG8KKyAgICAgcmUtZXZhbHVhdGUgb3VyIHBvbGxlcnMgKHRoaXMgYWxsb3dzIHBvbGwoKSBiYXNlZCBwb2xsZXJzIHRvCisgICAgIGVuc3VyZSB0aGV5IGRvbid0IG1pc3Mgd2FrZXVwcykgKi8KKyAga2VlcF9wb2xsaW5nID0gMTsKKyAgd2hpbGUgKGtlZXBfcG9sbGluZykgeworICAgIGtlZXBfcG9sbGluZyA9IDA7CisgICAgaWYgKCFwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzKSB7CisgICAgICBpZiAoIWFkZGVkX3dvcmtlcikgeworICAgICAgICBwdXNoX2Zyb250X3dvcmtlcihwb2xsc2V0LCAmd29ya2VyKTsKKyAgICAgICAgYWRkZWRfd29ya2VyID0gMTsKKyAgICAgICAgZ3ByX3Rsc19zZXQoJmdfY3VycmVudF90aHJlYWRfd29ya2VyLCAoaW50cHRyX3QpJndvcmtlcik7CisgICAgICB9CisgICAgICBncHJfdGxzX3NldCgmZ19jdXJyZW50X3RocmVhZF9wb2xsZXIsIChpbnRwdHJfdClwb2xsc2V0KTsKKyAgICAgIEdQUl9USU1FUl9CRUdJTigibWF5YmVfd29ya19hbmRfdW5sb2NrIiwgMCk7CisgICAgICBwb2xsc2V0LT52dGFibGUtPm1heWJlX3dvcmtfYW5kX3VubG9jayhleGVjX2N0eCwgcG9sbHNldCwgJndvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lLCBub3cpOworICAgICAgR1BSX1RJTUVSX0VORCgibWF5YmVfd29ya19hbmRfdW5sb2NrIiwgMCk7CisgICAgICBsb2NrZWQgPSAwOworICAgICAgZ3ByX3Rsc19zZXQoJmdfY3VycmVudF90aHJlYWRfcG9sbGVyLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgR1BSX1RJTUVSX01BUksoImdycGNfcG9sbHNldF93b3JrLmtpY2tlZF93aXRob3V0X3BvbGxlcnMiLCAwKTsKKyAgICAgIHBvbGxzZXQtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMgPSAwOworICAgIH0KKyAgLyogRmluaXNoZWQgZXhlY3V0aW9uIC0gc3RhcnQgY2xlYW5pbmcgdXAuCisgICAgIE5vdGUgdGhhdCB3ZSBtYXkgYXJyaXZlIGhlcmUgZnJvbSBvdXRzaWRlIHRoZSBlbmNsb3Npbmcgd2hpbGUoKSBsb29wLgorICAgICBJbiB0aGF0IGNhc2Ugd2Ugd29uJ3QgbG9vcCB0aG91Z2ggYXMgd2UgaGF2ZW4ndCBhZGRlZCB3b3JrZXIgdG8gdGhlCisgICAgIHdvcmtlciBsaXN0LCB3aGljaCBtZWFucyBub2JvZHkgY291bGQgYXNrIHVzIHRvIHJlLWV2YWx1YXRlIHBvbGxpbmcpLiAqLworICBkb25lOgorICAgIGlmICghbG9ja2VkKSB7CisgICAgICBxdWV1ZWRfd29yayB8PSBncnBjX2V4ZWNfY3R4X2ZsdXNoKGV4ZWNfY3R4KTsKKyAgICAgIGdwcl9tdV9sb2NrKCZwb2xsc2V0LT5tdSk7CisgICAgICBsb2NrZWQgPSAxOworICAgIH0KKyAgICAvKiBJZiB3ZSdyZSBmb3JjZWQgdG8gcmUtZXZhbHVhdGUgcG9sbGluZyAodmlhIGdycGNfcG9sbHNldF9raWNrIHdpdGgKKyAgICAgICBHUlBDX1BPTExTRVRfUkVFVkFMVUFURV9QT0xMSU5HX09OX1dBS0VVUCkgdGhlbiB3ZSBsYW5kIGhlcmUgYW5kIGZvcmNlCisgICAgICAgYSBsb29wICovCisgICAgaWYgKHdvcmtlci5yZWV2YWx1YXRlX3BvbGxpbmdfb25fd2FrZXVwKSB7CisgICAgICB3b3JrZXIucmVldmFsdWF0ZV9wb2xsaW5nX29uX3dha2V1cCA9IDA7CisgICAgICBwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMDsKKyAgICAgIGlmIChxdWV1ZWRfd29yayB8fCB3b3JrZXIua2lja2VkX3NwZWNpZmljYWxseSkgeworICAgICAgICAvKiBJZiB0aGVyZSdzIHF1ZXVlZCB3b3JrIG9uIHRoZSBsaXN0LCB0aGVuIHNldCB0aGUgZGVhZGxpbmUgdG8gYmUKKyAgICAgICAgICAgaW1tZWRpYXRlIHNvIHdlIGdldCBiYWNrIG91dCBvZiB0aGUgcG9sbGluZyBsb29wIHF1aWNrbHkgKi8KKyAgICAgICAgZGVhZGxpbmUgPSBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX01PTk9UT05JQyk7CisgICAgICB9CisgICAgICBrZWVwX3BvbGxpbmcgPSAxOworICAgIH0KKyAgfQorICBpZiAoYWRkZWRfd29ya2VyKSB7CisgICAgcmVtb3ZlX3dvcmtlcihwb2xsc2V0LCAmd29ya2VyKTsKKyAgICBncHJfdGxzX3NldCgmZ19jdXJyZW50X3RocmVhZF93b3JrZXIsIDApOworICB9CisgIC8qIHJlbGVhc2Ugd2FrZXVwIGZkIHRvIHRoZSBsb2NhbCBwb29sICovCisgIHdvcmtlci53YWtldXBfZmQtPm5leHQgPSBwb2xsc2V0LT5sb2NhbF93YWtldXBfY2FjaGU7CisgIHBvbGxzZXQtPmxvY2FsX3dha2V1cF9jYWNoZSA9IHdvcmtlci53YWtldXBfZmQ7CisgIC8qIGNoZWNrIHNodXRkb3duIGNvbmRpdGlvbnMgKi8KKyAgaWYgKHBvbGxzZXQtPnNodXR0aW5nX2Rvd24pIHsKKyAgICBpZiAoZ3JwY19wb2xsc2V0X2hhc193b3JrZXJzKHBvbGxzZXQpKSB7CisgICAgICBncnBjX3BvbGxzZXRfa2ljayhwb2xsc2V0LCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKCFwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24gJiYgcG9sbHNldC0+aW5fZmxpZ2h0X2NicyA9PSAwKSB7CisgICAgICBwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24gPSAxOworICAgICAgZ3ByX211X3VubG9jaygmcG9sbHNldC0+bXUpOworICAgICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBwb2xsc2V0KTsKKyAgICAgIGdycGNfZXhlY19jdHhfZmx1c2goZXhlY19jdHgpOworICAgICAgLyogQ29udGludWluZyB0byBhY2Nlc3MgcG9sbHNldCBoZXJlIGlzIHNhZmUgLS0gaXQgaXMgdGhlIGNhbGxlcidzCisgICAgICAgKiByZXNwb25zaWJpbGl0eSB0byBub3QgZGVzdHJveSB3aGVuIGl0IGhhcyBvdXRzdGFuZGluZyBjYWxscyB0bworICAgICAgICogZ3JwY19wb2xsc2V0X3dvcmsuCisgICAgICAgKiBUT0RPKGRrbGVtcG5lcik6IENhbiB3ZSByZWZhY3RvciB0aGUgc2h1dGRvd24gbG9naWMgdG8gYXZvaWQgdGhpcz8gKi8KKyAgICAgIGdwcl9tdV9sb2NrKCZwb2xsc2V0LT5tdSk7CisgICAgfSBlbHNlIGlmICghZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkocG9sbHNldC0+aWRsZV9qb2JzKSkgeworICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoZXhlY19jdHgsICZwb2xsc2V0LT5pZGxlX2pvYnMsIE5VTEwpOworICAgICAgZ3ByX211X3VubG9jaygmcG9sbHNldC0+bXUpOworICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaChleGVjX2N0eCk7CisgICAgICBncHJfbXVfbG9jaygmcG9sbHNldC0+bXUpOworICAgIH0KKyAgfQorICAqd29ya2VyX2hkbCA9IE5VTEw7CisgIEdQUl9USU1FUl9FTkQoImdycGNfcG9sbHNldF93b3JrIiwgMCk7Cit9CisKK3ZvaWQgZ3JwY19wb2xsc2V0X3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgR1BSX0FTU0VSVCghcG9sbHNldC0+c2h1dHRpbmdfZG93bik7CisgIHBvbGxzZXQtPnNodXR0aW5nX2Rvd24gPSAxOworICBwb2xsc2V0LT5zaHV0ZG93bl9kb25lID0gY2xvc3VyZTsKKyAgZ3JwY19wb2xsc2V0X2tpY2socG9sbHNldCwgR1JQQ19QT0xMU0VUX0tJQ0tfQlJPQURDQVNUKTsKKyAgaWYgKCFncnBjX3BvbGxzZXRfaGFzX3dvcmtlcnMocG9sbHNldCkpIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChleGVjX2N0eCwgJnBvbGxzZXQtPmlkbGVfam9icywgTlVMTCk7CisgIH0KKyAgaWYgKCFwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24gJiYgcG9sbHNldC0+aW5fZmxpZ2h0X2NicyA9PSAwICYmCisgICAgICAhZ3JwY19wb2xsc2V0X2hhc193b3JrZXJzKHBvbGxzZXQpKSB7CisgICAgcG9sbHNldC0+Y2FsbGVkX3NodXRkb3duID0gMTsKKyAgICBmaW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHBvbGxzZXQpOworICB9Cit9CisKK2ludCBncnBjX3BvbGxfZGVhZGxpbmVfdG9fbWlsbGlzX3RpbWVvdXQoZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93KSB7CisgIGdwcl90aW1lc3BlYyB0aW1lb3V0OworICBzdGF0aWMgY29uc3QgaW50NjRfdCBtYXhfc3Bpbl9wb2xsaW5nX3VzID0gMTA7CisgIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIGdwcl9pbmZfZnV0dXJlKGRlYWRsaW5lLmNsb2NrX3R5cGUpKSA9PSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIGdwcl90aW1lX2FkZChub3csIGdwcl90aW1lX2Zyb21fbWljcm9zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3NwaW5fcG9sbGluZ191cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9USU1FU1BBTikpKSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdGltZW91dCA9IGdwcl90aW1lX3N1YihkZWFkbGluZSwgbm93KTsKKyAgcmV0dXJuIGdwcl90aW1lX3RvX21pbGxpcyhncHJfdGltZV9hZGQoCisgICAgICB0aW1lb3V0LCBncHJfdGltZV9mcm9tX25hbm9zKEdQUl9OU19QRVJfTVMgLSAxLCBHUFJfVElNRVNQQU4pKSk7Cit9CisKKy8qCisgKiBiYXNpY19wb2xsc2V0IC0gYSB2dGFibGUgdGhhdCBwcm92aWRlcyBwb2xsaW5nIGZvciB6ZXJvIG9yIG9uZSBmaWxlCisgKiAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB2aWEgcG9sbCgpCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY191bmFyeV9wcm9tb3RlX2FyZ3MgeworICBjb25zdCBncnBjX3BvbGxzZXRfdnRhYmxlICpvcmlnaW5hbF92dGFibGU7CisgIGdycGNfcG9sbHNldCAqcG9sbHNldDsKKyAgZ3JwY19mZCAqZmQ7CisgIGdycGNfY2xvc3VyZSBwcm9tb3Rpb25fY2xvc3VyZTsKK30gZ3JwY191bmFyeV9wcm9tb3RlX2FyZ3M7CisKK3N0YXRpYyB2b2lkIGJhc2ljX2RvX3Byb21vdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgeworICBncnBjX3VuYXJ5X3Byb21vdGVfYXJncyAqdXBfYXJncyA9IGFyZ3M7CisgIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgKm9yaWdpbmFsX3Z0YWJsZSA9IHVwX2FyZ3MtPm9yaWdpbmFsX3Z0YWJsZTsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0ID0gdXBfYXJncy0+cG9sbHNldDsKKyAgZ3JwY19mZCAqZmQgPSB1cF9hcmdzLT5mZDsKKworICAvKgorICAgKiBUaGlzIGlzIHF1aXRlIHRyaWNreS4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNhc2VzIHRvIGtlZXAgaW4gbWluZCBoZXJlOgorICAgKiAxLiBmZCBtYXkgaGF2ZSBiZWVuIG9ycGhhbmVkCisgICAqIDIuIFRoZSBwb2xsc2V0IG1heSBubyBsb25nZXIgYmUgYSB1bmFyeSBwb2xsZXIgKGFuZCB3ZSBjYW4ndCBsZXQgY2FzZSAjMQorICAgKiBsZWFrIHRvIG90aGVyIHBvbGxzZXQgdHlwZXMhKQorICAgKiAzLiBwb2xsc2V0J3MgZmQgKHdoaWNoIG1heSBoYXZlIGNoYW5nZWQpIG1heSBoYXZlIGJlZW4gb3JwaGFuZWQKKyAgICogNC4gVGhlIHBvbGxzZXQgbWF5IGJlIHNodXR0aW5nIGRvd24uCisgICAqLworCisgIGdwcl9tdV9sb2NrKCZwb2xsc2V0LT5tdSk7CisgIC8qIEZpcnN0IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgbm9ib2R5IGlzIHBvbGxpbmcgY29uY3VycmVudGx5ICovCisgIEdQUl9BU1NFUlQoIWdycGNfcG9sbHNldF9oYXNfd29ya2Vycyhwb2xsc2V0KSk7CisKKyAgZ3ByX2ZyZWUodXBfYXJncyk7CisgIC8qIEF0IHRoaXMgcG9pbnQgdGhlIHBvbGxzZXQgbWF5IG5vIGxvbmdlciBiZSBhIHVuYXJ5IHBvbGxlci4gSW4gdGhhdCBjYXNlCisgICAqIHdlIHNob3VsZCBqdXN0IGNhbGwgdGhlIHJpZ2h0IGFkZCBmdW5jdGlvbiBhbmQgYmUgZG9uZS4gKi8KKyAgLyogVE9ETyhrbGVtcG5lcik6IElmIHdlJ3JlIG5vdCBjYXJlZnVsIHRoaXMgY291bGQgY2F1c2UgaW5maW5pdGUgcmVjdXJzaW9uLgorICAgKiBUaGF0J3Mgbm90IGEgcHJvYmxlbSBmb3Igbm93IGJlY2F1c2UgZW1wdHlfcG9sbHNldCBoYXMgYSB0cml2aWFsIHBvbGxlcgorICAgKiBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgbWVjaGFuaXNtIHRvIHVuYmVjb21lIG11bHRpcG9sbGVyLiAqLworICBwb2xsc2V0LT5pbl9mbGlnaHRfY2JzLS07CisgIGlmIChwb2xsc2V0LT5zaHV0dGluZ19kb3duKSB7CisgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBvbGxzZXQgYW55bW9yZS4gKi8KKyAgICBpZiAocG9sbHNldC0+aW5fZmxpZ2h0X2NicyA9PSAwICYmICFwb2xsc2V0LT5jYWxsZWRfc2h1dGRvd24pIHsKKyAgICAgIHBvbGxzZXQtPmNhbGxlZF9zaHV0ZG93biA9IDE7CisgICAgICBmaW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHBvbGxzZXQpOworICAgIH0KKyAgfSBlbHNlIGlmIChncnBjX2ZkX2lzX29ycGhhbmVkKGZkKSkgeworICAgIC8qIERvbid0IHRyeSB0byBhZGQgaXQgdG8gYW55dGhpbmcsIHdlJ2xsIGRyb3Agb3VyIHJlZiBvbiBpdCBiZWxvdyAqLworICB9IGVsc2UgaWYgKHBvbGxzZXQtPnZ0YWJsZSAhPSBvcmlnaW5hbF92dGFibGUpIHsKKyAgICBwb2xsc2V0LT52dGFibGUtPmFkZF9mZChleGVjX2N0eCwgcG9sbHNldCwgZmQsIDApOworICB9IGVsc2UgaWYgKGZkICE9IHBvbGxzZXQtPmRhdGEucHRyKSB7CisgICAgZ3JwY19mZCAqZmRzWzJdOworICAgIGZkc1swXSA9IHBvbGxzZXQtPmRhdGEucHRyOworICAgIGZkc1sxXSA9IGZkOworCisgICAgaWYgKGZkc1swXSAmJiAhZ3JwY19mZF9pc19vcnBoYW5lZChmZHNbMF0pKSB7CisgICAgICBncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcihleGVjX2N0eCwgcG9sbHNldCwgZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX0FSUkFZX1NJWkUoZmRzKSk7CisgICAgICBHUlBDX0ZEX1VOUkVGKGZkc1swXSwgImJhc2ljcG9sbCIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvbGQgZmQgaXMgb3JwaGFuZWQgYW5kIHdlIGhhdmVuJ3QgY2xlYW5lZCBpdCB1cCB1bnRpbCBub3csIHNvIHJlbWFpbiBhCisgICAgICAgKiB1bmFyeSBwb2xsZXIgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0IGZkc1sxXSBpcyBhbHNvIG9ycGhhbmVkIGF0IHRoaXMgcG9pbnQuCisgICAgICAgKiBUaGF0J3Mgb2theSwgd2UnbGwgY29ycmVjdCBpdCBhdCB0aGUgbmV4dCBhZGQgb3IgcG9sbC4gKi8KKyAgICAgIGlmIChmZHNbMF0pIEdSUENfRkRfVU5SRUYoZmRzWzBdLCAiYmFzaWNwb2xsIik7CisgICAgICBwb2xsc2V0LT5kYXRhLnB0ciA9IGZkOworICAgICAgR1JQQ19GRF9SRUYoZmQsICJiYXNpY3BvbGwiKTsKKyAgICB9CisgIH0KKworICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7CisKKyAgLyogTWF0Y2hpbmcgcmVmIGluIGJhc2ljX3BvbGxzZXRfYWRkX2ZkICovCisgIEdSUENfRkRfVU5SRUYoZmQsICJiYXNpY3BvbGxfYWRkIik7Cit9CisKK3N0YXRpYyB2b2lkIGJhc2ljX3BvbGxzZXRfYWRkX2ZkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2ZkICpmZCwgaW50IGFuZF91bmxvY2tfcG9sbHNldCkgeworICBncnBjX3VuYXJ5X3Byb21vdGVfYXJncyAqdXBfYXJnczsKKyAgR1BSX0FTU0VSVChmZCk7CisgIGlmIChmZCA9PSBwb2xsc2V0LT5kYXRhLnB0cikgZ290byBleGl0OworCisgIGlmICghZ3JwY19wb2xsc2V0X2hhc193b3JrZXJzKHBvbGxzZXQpKSB7CisgICAgLyogRmFzdCBwYXRoIC0tIG5vIGluIGZsaWdodCBjYnMgKi8KKyAgICAvKiBUT0RPKGtsZW1wbmVyKTogQ29tbWVudCB0aGlzIG91dCBhbmQgZml4IGFueSB0ZXN0IGZhaWx1cmVzIG9yIGVzdGFibGlzaAorICAgICAqIHRoZXkgYXJlIGR1ZSB0byB0aW1pbmcgaXNzdWVzICovCisgICAgZ3JwY19mZCAqZmRzWzJdOworICAgIGZkc1swXSA9IHBvbGxzZXQtPmRhdGEucHRyOworICAgIGZkc1sxXSA9IGZkOworCisgICAgaWYgKGZkc1swXSA9PSBOVUxMKSB7CisgICAgICBwb2xsc2V0LT5kYXRhLnB0ciA9IGZkOworICAgICAgR1JQQ19GRF9SRUYoZmQsICJiYXNpY3BvbGwiKTsKKyAgICB9IGVsc2UgaWYgKCFncnBjX2ZkX2lzX29ycGhhbmVkKGZkc1swXSkpIHsKKyAgICAgIGdycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyKGV4ZWNfY3R4LCBwb2xsc2V0LCBmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfQVJSQVlfU0laRShmZHMpKTsKKyAgICAgIEdSUENfRkRfVU5SRUYoZmRzWzBdLCAiYmFzaWNwb2xsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG9sZCBmZCBpcyBvcnBoYW5lZCBhbmQgd2UgaGF2ZW4ndCBjbGVhbmVkIGl0IHVwIHVudGlsIG5vdywgc28gcmVtYWluIGEKKyAgICAgICAqIHVuYXJ5IHBvbGxlciAqLworICAgICAgR1JQQ19GRF9VTlJFRihmZHNbMF0sICJiYXNpY3BvbGwiKTsKKyAgICAgIHBvbGxzZXQtPmRhdGEucHRyID0gZmQ7CisgICAgICBHUlBDX0ZEX1JFRihmZCwgImJhc2ljcG9sbCIpOworICAgIH0KKyAgICBnb3RvIGV4aXQ7CisgIH0KKworICAvKiBOb3cgd2UgbmVlZCB0byBwcm9tb3RlLiBUaGlzIG5lZWRzIHRvIGhhcHBlbiB3aGVuIHdlJ3JlIG5vdCBwb2xsaW5nLiBTaW5jZQorICAgKiB0aGlzIG1heSBiZSBjYWxsZWQgZnJvbSBwb2xsLCB0aGUgd2FpdCBuZWVkcyB0byBoYXBwZW4gYXN5bmNocm9ub3VzbHkuICovCisgIEdSUENfRkRfUkVGKGZkLCAiYmFzaWNwb2xsX2FkZCIpOworICBwb2xsc2V0LT5pbl9mbGlnaHRfY2JzKys7CisgIHVwX2FyZ3MgPSBncHJfbWFsbG9jKHNpemVvZigqdXBfYXJncykpOworICB1cF9hcmdzLT5mZCA9IGZkOworICB1cF9hcmdzLT5vcmlnaW5hbF92dGFibGUgPSBwb2xsc2V0LT52dGFibGU7CisgIHVwX2FyZ3MtPnBvbGxzZXQgPSBwb2xsc2V0OworICB1cF9hcmdzLT5wcm9tb3Rpb25fY2xvc3VyZS5jYiA9IGJhc2ljX2RvX3Byb21vdGU7CisgIHVwX2FyZ3MtPnByb21vdGlvbl9jbG9zdXJlLmNiX2FyZyA9IHVwX2FyZ3M7CisKKyAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZwb2xsc2V0LT5pZGxlX2pvYnMsICZ1cF9hcmdzLT5wcm9tb3Rpb25fY2xvc3VyZSwgMSk7CisgIGdycGNfcG9sbHNldF9raWNrKHBvbGxzZXQsIEdSUENfUE9MTFNFVF9LSUNLX0JST0FEQ0FTVCk7CisKK2V4aXQ6CisgIGlmIChhbmRfdW5sb2NrX3BvbGxzZXQpIHsKKyAgICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0LT5tdSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgYmFzaWNfcG9sbHNldF9tYXliZV93b3JrX2FuZF91bmxvY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93KSB7CisjZGVmaW5lIFBPTExPVVRfQ0hFQ0sgKFBPTExPVVQgfCBQT0xMSFVQIHwgUE9MTEVSUikKKyNkZWZpbmUgUE9MTElOX0NIRUNLIChQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikKKworICBzdHJ1Y3QgcG9sbGZkIHBmZFszXTsKKyAgZ3JwY19mZCAqZmQ7CisgIGdycGNfZmRfd2F0Y2hlciBmZF93YXRjaGVyOworICBpbnQgdGltZW91dDsKKyAgaW50IHI7CisgIG5mZHNfdCBuZmRzOworCisgIGZkID0gcG9sbHNldC0+ZGF0YS5wdHI7CisgIGlmIChmZCAmJiBncnBjX2ZkX2lzX29ycGhhbmVkKGZkKSkgeworICAgIEdSUENfRkRfVU5SRUYoZmQsICJiYXNpY3BvbGwiKTsKKyAgICBmZCA9IHBvbGxzZXQtPmRhdGEucHRyID0gTlVMTDsKKyAgfQorICB0aW1lb3V0ID0gZ3JwY19wb2xsX2RlYWRsaW5lX3RvX21pbGxpc190aW1lb3V0KGRlYWRsaW5lLCBub3cpOworICBwZmRbMF0uZmQgPSBHUlBDX1dBS0VVUF9GRF9HRVRfUkVBRF9GRCgmZ3JwY19nbG9iYWxfd2FrZXVwX2ZkKTsKKyAgcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKyAgcGZkWzBdLnJldmVudHMgPSAwOworICBwZmRbMV0uZmQgPSBHUlBDX1dBS0VVUF9GRF9HRVRfUkVBRF9GRCgmd29ya2VyLT53YWtldXBfZmQtPmZkKTsKKyAgcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKyAgcGZkWzFdLnJldmVudHMgPSAwOworICBuZmRzID0gMjsKKyAgaWYgKGZkKSB7CisgICAgcGZkWzJdLmZkID0gZmQtPmZkOworICAgIHBmZFsyXS5yZXZlbnRzID0gMDsKKyAgICBHUlBDX0ZEX1JFRihmZCwgImJhc2ljcG9sbF9iZWdpbiIpOworICAgIGdwcl9tdV91bmxvY2soJnBvbGxzZXQtPm11KTsKKyAgICBwZmRbMl0uZXZlbnRzID0gKHNob3J0KWdycGNfZmRfYmVnaW5fcG9sbChmZCwgcG9sbHNldCwgd29ya2VyLCBQT0xMSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9MTE9VVCwgJmZkX3dhdGNoZXIpOworICAgIGlmIChwZmRbMl0uZXZlbnRzICE9IDApIHsKKyAgICAgIG5mZHMrKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3ByX211X3VubG9jaygmcG9sbHNldC0+bXUpOworICB9CisKKyAgLyogVE9ETyh2cGFpKTogQ29uc2lkZXIgZmlyc3QgZG9pbmcgYSAwIHRpbWVvdXQgcG9sbCBoZXJlIHRvIGF2b2lkCisgICAgIGV2ZW4gZ29pbmcgaW50byB0aGUgYmxvY2tpbmcgYW5ub3RhdGlvbiBpZiBwb3NzaWJsZSAqLworICAvKiBwb2xsIGZkIGNvdW50IChhcmd1bWVudCAyKSBpcyBzaG9ydGVuZWQgYnkgb25lIGlmIHdlIGhhdmUgbm8gZXZlbnRzCisgICAgIHRvIHBvbGwgb24gLSBzdWNoIHRoYXQgaXQgb25seSBpbmNsdWRlcyB0aGUga2lja2VyICovCisgIEdQUl9USU1FUl9CRUdJTigicG9sbCIsIDApOworICBHUlBDX1NDSEVEVUxJTkdfU1RBUlRfQkxPQ0tJTkdfUkVHSU9OOworICByID0gZ3JwY19wb2xsX2Z1bmN0aW9uKHBmZCwgbmZkcywgdGltZW91dCk7CisgIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OOworICBHUFJfVElNRVJfRU5EKCJwb2xsIiwgMCk7CisKKyAgaWYgKHIgPCAwKSB7CisgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInBvbGwoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisgICAgaWYgKGZkKSB7CisgICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmZmRfd2F0Y2hlciwgMCwgMCk7CisgICAgfQorICB9IGVsc2UgaWYgKHIgPT0gMCkgeworICAgIGlmIChmZCkgeworICAgICAgZ3JwY19mZF9lbmRfcG9sbChleGVjX2N0eCwgJmZkX3dhdGNoZXIsIDAsIDApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocGZkWzBdLnJldmVudHMgJiBQT0xMSU5fQ0hFQ0spIHsKKyAgICAgIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKCZncnBjX2dsb2JhbF93YWtldXBfZmQpOworICAgIH0KKyAgICBpZiAocGZkWzFdLnJldmVudHMgJiBQT0xMSU5fQ0hFQ0spIHsKKyAgICAgIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKCZ3b3JrZXItPndha2V1cF9mZC0+ZmQpOworICAgIH0KKyAgICBpZiAobmZkcyA+IDIpIHsKKyAgICAgIGdycGNfZmRfZW5kX3BvbGwoZXhlY19jdHgsICZmZF93YXRjaGVyLCBwZmRbMl0ucmV2ZW50cyAmIFBPTExJTl9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgcGZkWzJdLnJldmVudHMgJiBQT0xMT1VUX0NIRUNLKTsKKyAgICB9IGVsc2UgaWYgKGZkKSB7CisgICAgICBncnBjX2ZkX2VuZF9wb2xsKGV4ZWNfY3R4LCAmZmRfd2F0Y2hlciwgMCwgMCk7CisgICAgfQorICB9CisKKyAgaWYgKGZkKSB7CisgICAgR1JQQ19GRF9VTlJFRihmZCwgImJhc2ljcG9sbF9iZWdpbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGJhc2ljX3BvbGxzZXRfZGVzdHJveShncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgaWYgKHBvbGxzZXQtPmRhdGEucHRyICE9IE5VTEwpIHsKKyAgICBHUlBDX0ZEX1VOUkVGKHBvbGxzZXQtPmRhdGEucHRyLCAiYmFzaWNwb2xsIik7CisgICAgcG9sbHNldC0+ZGF0YS5wdHIgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBjb25zdCBncnBjX3BvbGxzZXRfdnRhYmxlIGJhc2ljX3BvbGxzZXQgPSB7CisgICAgYmFzaWNfcG9sbHNldF9hZGRfZmQsIGJhc2ljX3BvbGxzZXRfbWF5YmVfd29ya19hbmRfdW5sb2NrLAorICAgIGJhc2ljX3BvbGxzZXRfZGVzdHJveSwgYmFzaWNfcG9sbHNldF9kZXN0cm95fTsKKworc3RhdGljIHZvaWQgYmVjb21lX2Jhc2ljX3BvbGxzZXQoZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2ZkICpmZF9vcl9udWxsKSB7CisgIHBvbGxzZXQtPnZ0YWJsZSA9ICZiYXNpY19wb2xsc2V0OworICBwb2xsc2V0LT5kYXRhLnB0ciA9IGZkX29yX251bGw7CisgIGlmIChmZF9vcl9udWxsICE9IE5VTEwpIHsKKyAgICBHUlBDX0ZEX1JFRihmZF9vcl9udWxsLCAiYmFzaWNwb2xsIik7CisgIH0KK30KKworI2VuZGlmIC8qIEdQUl9QT1NJWF9QT0xMU0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhlOWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1BPTExTRVRfUE9TSVhfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX1BPTExTRVRfUE9TSVhfSAorCisjaW5jbHVkZSA8cG9sbC5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXRfdnRhYmxlIGdycGNfcG9sbHNldF92dGFibGU7CisKKy8qIGZvcndhcmQgZGVjbGFyZSBvbmx5IGluIHRoaXMgZmlsZSB0byBhdm9pZCBsZWFraW5nIGltcGwgZGV0YWlscyB2aWEKKyAgIHBvbGxzZXQuaDsgcmVhbCB1c2VycyBvZiBncnBjX2ZkIHNob3VsZCBhbHdheXMgaW5jbHVkZSAnZmRfcG9zaXguaCcgYW5kIG5vdAorICAgdXNlIHRoZSBzdHJ1Y3QgdGFnICovCitzdHJ1Y3QgZ3JwY19mZDsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19jYWNoZWRfd2FrZXVwX2ZkIHsKKyAgZ3JwY193YWtldXBfZmQgZmQ7CisgIHN0cnVjdCBncnBjX2NhY2hlZF93YWtldXBfZmQgKm5leHQ7Cit9IGdycGNfY2FjaGVkX3dha2V1cF9mZDsKKworc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgeworICBncnBjX2NhY2hlZF93YWtldXBfZmQgKndha2V1cF9mZDsKKyAgaW50IHJlZXZhbHVhdGVfcG9sbGluZ19vbl93YWtldXA7CisgIGludCBraWNrZWRfc3BlY2lmaWNhbGx5OworICBzdHJ1Y3QgZ3JwY19wb2xsc2V0X3dvcmtlciAqbmV4dDsKKyAgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgKnByZXY7Cit9OworCitzdHJ1Y3QgZ3JwY19wb2xsc2V0IHsKKyAgLyogcG9sbHNldHMgdW5kZXIgcG9zaXggY2FuIG11dGF0ZSByZXByZXNlbnRhdGlvbiBhcyBmZHMgYXJlIGFkZGVkIGFuZAorICAgICByZW1vdmVkLgorICAgICBGb3IgZXhhbXBsZSwgd2UgbWF5IGNob29zZSBhIHBvbGwoKSBiYXNlZCBpbXBsZW1lbnRhdGlvbiBvbiBsaW51eCBmb3IKKyAgICAgZmV3IGZkcywgYW5kIGFuIGVwb2xsKCkgYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIG1hbnkgZmRzICovCisgIGNvbnN0IGdycGNfcG9sbHNldF92dGFibGUgKnZ0YWJsZTsKKyAgZ3ByX211IG11OworICBncnBjX3BvbGxzZXRfd29ya2VyIHJvb3Rfd29ya2VyOworICBpbnQgaW5fZmxpZ2h0X2NiczsKKyAgaW50IHNodXR0aW5nX2Rvd247CisgIGludCBjYWxsZWRfc2h1dGRvd247CisgIGludCBraWNrZWRfd2l0aG91dF9wb2xsZXJzOworICBncnBjX2Nsb3N1cmUgKnNodXRkb3duX2RvbmU7CisgIGdycGNfY2xvc3VyZV9saXN0IGlkbGVfam9iczsKKyAgdW5pb24geworICAgIGludCBmZDsKKyAgICB2b2lkICpwdHI7CisgIH0gZGF0YTsKKyAgLyogTG9jYWwgY2FjaGUgb2YgZXZlbnRmZHMgZm9yIHdvcmtlcnMgKi8KKyAgZ3JwY19jYWNoZWRfd2FrZXVwX2ZkICpsb2NhbF93YWtldXBfY2FjaGU7Cit9OworCitzdHJ1Y3QgZ3JwY19wb2xsc2V0X3Z0YWJsZSB7CisgIHZvaWQgKCphZGRfZmQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBncnBjX2ZkICpmZCwgaW50IGFuZF91bmxvY2tfcG9sbHNldCk7CisgIHZvaWQgKCptYXliZV93b3JrX2FuZF91bmxvY2spKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCBncHJfdGltZXNwZWMgbm93KTsKKyAgdm9pZCAoKmZpbmlzaF9zaHV0ZG93bikoZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKKyAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfcG9sbHNldCAqcG9sbHNldCk7Cit9OworCisvKiBBZGQgYW4gZmQgdG8gYSBwb2xsc2V0ICovCit2b2lkIGdycGNfcG9sbHNldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JwY19mZCAqZmQpOworCisvKiBSZXR1cm5zIHRoZSBmZCB0byBsaXN0ZW4gb24gZm9yIGtpY2tzICovCitpbnQgZ3JwY19raWNrX3JlYWRfZmQoZ3JwY19wb2xsc2V0ICpwKTsKKy8qIENhbGwgYWZ0ZXIgcG9sbGluZyBoYXMgYmVlbiBraWNrZWQgdG8gbGVhdmUgdGhlIGtpY2tlZCBzdGF0ZSAqLwordm9pZCBncnBjX2tpY2tfZHJhaW4oZ3JwY19wb2xsc2V0ICpwKTsKKworLyogQ29udmVydCBhIHRpbWVzcGVjIHRvIG1pbGxpc2Vjb25kczoKKyAgIC0gdmVyeSBzbWFsbCBvciBuZWdhdGl2ZSBwb2xsIHRpbWVzIGFyZSBjbGFtcGVkIHRvIHplcm8gdG8gZG8gYQorICAgICBub24tYmxvY2tpbmcgcG9sbCAod2hpY2ggYmVjb21lcyBzcGluIHBvbGxpbmcpCisgICAtIG90aGVyIHNtYWxsIHZhbHVlcyBhcmUgcm91bmRlZCB1cCB0byBvbmUgbWlsbGlzZWNvbmQKKyAgIC0gbG9uZ2VyIHRoYW4gYSBtaWxsaXNlY29uZCBwb2xscyBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBuZWFyZXN0CisgICAgIG1pbGxpc2Vjb25kIHRvIGF2b2lkIHNwaW5uaW5nCisgICAtIGluZmluaXRlIHRpbWVvdXRzIGFyZSBjb252ZXJ0ZWQgdG8gLTEgKi8KK2ludCBncnBjX3BvbGxfZGVhZGxpbmVfdG9fbWlsbGlzX3RpbWVvdXQoZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93KTsKKworLyogQWxsb3cga2ljayB0byB3YWtldXAgdGhlIGN1cnJlbnRseSBwb2xsaW5nIHdvcmtlciAqLworI2RlZmluZSBHUlBDX1BPTExTRVRfQ0FOX0tJQ0tfU0VMRiAxCisvKiBGb3JjZSB0aGUgd2FrZWUgdG8gcmVwb2xsIHdoZW4gYXdva2VuICovCisjZGVmaW5lIEdSUENfUE9MTFNFVF9SRUVWQUxVQVRFX1BPTExJTkdfT05fV0FLRVVQIDIKKy8qIEFzIHBlciBncnBjX3BvbGxzZXRfa2ljaywgd2l0aCBhbiBleHRlbmRlZCBzZXQgb2YgZmxhZ3MgKGRlZmluZWQgYWJvdmUpCisgICAtLSBtb3N0bHkgZm9yIGZkX3Bvc2l4J3MgdXNlLiAqLwordm9pZCBncnBjX3BvbGxzZXRfa2lja19leHQoZ3JwY19wb2xsc2V0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqc3BlY2lmaWNfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisvKiB0dXJuIGEgcG9sbHNldCBpbnRvIGEgbXVsdGlwb2xsZXI6IHBsYXRmb3JtIHNwZWNpZmljICovCit0eXBlZGVmIHZvaWQgKCpncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcl90eXBlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBncnBjX2ZkICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZkX2NvdW50KTsKK2V4dGVybiBncnBjX3BsYXRmb3JtX2JlY29tZV9tdWx0aXBvbGxlcl90eXBlIGdycGNfcGxhdGZvcm1fYmVjb21lX211bHRpcG9sbGVyOworCit2b2lkIGdycGNfcG9sbF9iZWNvbWVfbXVsdGlwb2xsZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBzdHJ1Y3QgZ3JwY19mZCAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmRfY291bnQpOworCisvKiBSZXR1cm4gMSBpZiB0aGUgcG9sbHNldCBoYXMgYWN0aXZlIHRocmVhZHMgaW4gZ3JwY19wb2xsc2V0X3dvcmsgKHBvbGxzZXQgbXVzdAorICogYmUgbG9ja2VkKSAqLworaW50IGdycGNfcG9sbHNldF9oYXNfd29ya2VycyhncnBjX3BvbGxzZXQgKnBvbGxzZXQpOworCit2b2lkIGdycGNfcmVtb3ZlX2ZkX2Zyb21fYWxsX2Vwb2xsX3NldHMoaW50IGZkKTsKKworLyogb3ZlcnJpZGUgdG8gYWxsb3cgdGVzdHMgdG8gaG9vayBwb2xsKCkgdXNhZ2UgKi8KKy8qIE5PVEU6IEFueSBjaGFuZ2VzIHRvIGdycGNfcG9sbF9mdW5jdGlvbiBtdXN0IHRha2UgcGxhY2Ugd2hlbiB0aGUgZ1JQQworICAgaXMgY2VydGFpbmx5IG5vdCBkb2luZyBhbnkgcG9sbGluZyBhbnl3aGVyZS4KKyAgIE90aGVyd2lzZSwgdGhlcmUgbWlnaHQgYmUgYSByYWNlIGJldHdlZW4gY2hhbmdpbmcgdGhlIHZhcmlhYmxlIGFuZCBhY3R1YWxseQorICAgZG9pbmcgYSBwb2xsaW5nIG9wZXJhdGlvbiAqLwordHlwZWRlZiBpbnQgKCpncnBjX3BvbGxfZnVuY3Rpb25fdHlwZSkoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIGludCk7CitleHRlcm4gZ3JwY19wb2xsX2Z1bmN0aW9uX3R5cGUgZ3JwY19wb2xsX2Z1bmN0aW9uOworZXh0ZXJuIGdycGNfd2FrZXVwX2ZkIGdycGNfZ2xvYmFsX3dha2V1cF9mZDsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXQuaCBiL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjlkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXQuaApAQCAtMCwwICsxLDYxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9TRVRfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX1BPTExTRVRfU0VUX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiCisKKy8qIEEgZ3JwY19wb2xsc2V0X3NldCBpcyBhIHNldCBvZiBwb2xsc2V0cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGFuCisgICBhY3Rpb24uIEFkZGluZyBhIHBvbGxzZXQgdG8gYSBwb2xsc2V0X3NldCBhdXRvbWF0aWNhbGx5IGFkZHMgYW55CisgICBmZCdzIChldGMpIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2V0X3NldCB0byB0aGF0IHBvbGxzZXQuCisgICBSZWdpc3RlcmluZyBmZCdzIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGVtIHRvIGFsbCBjdXJyZW50IHBvbGxzZXRzLiAqLworCit0eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXRfc2V0IGdycGNfcG9sbHNldF9zZXQ7CisKK2dycGNfcG9sbHNldF9zZXQgKmdycGNfcG9sbHNldF9zZXRfY3JlYXRlKHZvaWQpOwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2Rlc3Ryb3koZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpOwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7Cit2b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKK3ZvaWQgZ3JwY19wb2xsc2V0X3NldF9hZGRfcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKmJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqaXRlbSk7Cit2b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpiYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKml0ZW0pOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX1NFVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTQyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiCisKK3N0cnVjdCBncnBjX3BvbGxzZXRfc2V0IHsKKyAgZ3ByX211IG11OworCisgIHNpemVfdCBwb2xsc2V0X2NvdW50OworICBzaXplX3QgcG9sbHNldF9jYXBhY2l0eTsKKyAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHM7CisKKyAgc2l6ZV90IHBvbGxzZXRfc2V0X2NvdW50OworICBzaXplX3QgcG9sbHNldF9zZXRfY2FwYWNpdHk7CisgIHN0cnVjdCBncnBjX3BvbGxzZXRfc2V0ICoqcG9sbHNldF9zZXRzOworCisgIHNpemVfdCBmZF9jb3VudDsKKyAgc2l6ZV90IGZkX2NhcGFjaXR5OworICBncnBjX2ZkICoqZmRzOworfTsKKworZ3JwY19wb2xsc2V0X3NldCAqZ3JwY19wb2xsc2V0X3NldF9jcmVhdGUodm9pZCkgeworICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpwb2xsc2V0X3NldCkpOworICBtZW1zZXQocG9sbHNldF9zZXQsIDAsIHNpemVvZigqcG9sbHNldF9zZXQpKTsKKyAgZ3ByX211X2luaXQoJnBvbGxzZXRfc2V0LT5tdSk7CisgIHJldHVybiBwb2xsc2V0X3NldDsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2Rlc3Ryb3koZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpIHsKKyAgc2l6ZV90IGk7CisgIGdwcl9tdV9kZXN0cm95KCZwb2xsc2V0X3NldC0+bXUpOworICBmb3IgKGkgPSAwOyBpIDwgcG9sbHNldF9zZXQtPmZkX2NvdW50OyBpKyspIHsKKyAgICBHUlBDX0ZEX1VOUkVGKHBvbGxzZXRfc2V0LT5mZHNbaV0sICJwb2xsc2V0X3NldCIpOworICB9CisgIGdwcl9mcmVlKHBvbGxzZXRfc2V0LT5wb2xsc2V0cyk7CisgIGdwcl9mcmVlKHBvbGxzZXRfc2V0LT5wb2xsc2V0X3NldHMpOworICBncHJfZnJlZShwb2xsc2V0X3NldC0+ZmRzKTsKKyAgZ3ByX2ZyZWUocG9sbHNldF9zZXQpOworfQorCit2b2lkIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7CisgIHNpemVfdCBpLCBqOworICBncHJfbXVfbG9jaygmcG9sbHNldF9zZXQtPm11KTsKKyAgaWYgKHBvbGxzZXRfc2V0LT5wb2xsc2V0X2NvdW50ID09IHBvbGxzZXRfc2V0LT5wb2xsc2V0X2NhcGFjaXR5KSB7CisgICAgcG9sbHNldF9zZXQtPnBvbGxzZXRfY2FwYWNpdHkgPQorICAgICAgICBHUFJfTUFYKDgsIDIgKiBwb2xsc2V0X3NldC0+cG9sbHNldF9jYXBhY2l0eSk7CisgICAgcG9sbHNldF9zZXQtPnBvbGxzZXRzID0KKyAgICAgICAgZ3ByX3JlYWxsb2MocG9sbHNldF9zZXQtPnBvbGxzZXRzLCBwb2xsc2V0X3NldC0+cG9sbHNldF9jYXBhY2l0eSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcG9sbHNldF9zZXQtPnBvbGxzZXRzKSk7CisgIH0KKyAgcG9sbHNldF9zZXQtPnBvbGxzZXRzW3BvbGxzZXRfc2V0LT5wb2xsc2V0X2NvdW50KytdID0gcG9sbHNldDsKKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBwb2xsc2V0X3NldC0+ZmRfY291bnQ7IGkrKykgeworICAgIGlmIChncnBjX2ZkX2lzX29ycGhhbmVkKHBvbGxzZXRfc2V0LT5mZHNbaV0pKSB7CisgICAgICBHUlBDX0ZEX1VOUkVGKHBvbGxzZXRfc2V0LT5mZHNbaV0sICJwb2xsc2V0X3NldCIpOworICAgIH0gZWxzZSB7CisgICAgICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0LCBwb2xsc2V0X3NldC0+ZmRzW2ldKTsKKyAgICAgIHBvbGxzZXRfc2V0LT5mZHNbaisrXSA9IHBvbGxzZXRfc2V0LT5mZHNbaV07CisgICAgfQorICB9CisgIHBvbGxzZXRfc2V0LT5mZF9jb3VudCA9IGo7CisgIGdwcl9tdV91bmxvY2soJnBvbGxzZXRfc2V0LT5tdSk7Cit9CisKK3ZvaWQgZ3JwY19wb2xsc2V0X3NldF9kZWxfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgc2l6ZV90IGk7CisgIGdwcl9tdV9sb2NrKCZwb2xsc2V0X3NldC0+bXUpOworICBmb3IgKGkgPSAwOyBpIDwgcG9sbHNldF9zZXQtPnBvbGxzZXRfY291bnQ7IGkrKykgeworICAgIGlmIChwb2xsc2V0X3NldC0+cG9sbHNldHNbaV0gPT0gcG9sbHNldCkgeworICAgICAgcG9sbHNldF9zZXQtPnBvbGxzZXRfY291bnQtLTsKKyAgICAgIEdQUl9TV0FQKGdycGNfcG9sbHNldCAqLCBwb2xsc2V0X3NldC0+cG9sbHNldHNbaV0sCisgICAgICAgICAgICAgICBwb2xsc2V0X3NldC0+cG9sbHNldHNbcG9sbHNldF9zZXQtPnBvbGxzZXRfY291bnRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZwb2xsc2V0X3NldC0+bXUpOworfQorCit2b2lkIGdycGNfcG9sbHNldF9zZXRfYWRkX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpiYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKml0ZW0pIHsKKyAgc2l6ZV90IGksIGo7CisgIGdwcl9tdV9sb2NrKCZiYWctPm11KTsKKyAgaWYgKGJhZy0+cG9sbHNldF9zZXRfY291bnQgPT0gYmFnLT5wb2xsc2V0X3NldF9jYXBhY2l0eSkgeworICAgIGJhZy0+cG9sbHNldF9zZXRfY2FwYWNpdHkgPSBHUFJfTUFYKDgsIDIgKiBiYWctPnBvbGxzZXRfc2V0X2NhcGFjaXR5KTsKKyAgICBiYWctPnBvbGxzZXRfc2V0cyA9CisgICAgICAgIGdwcl9yZWFsbG9jKGJhZy0+cG9sbHNldF9zZXRzLAorICAgICAgICAgICAgICAgICAgICBiYWctPnBvbGxzZXRfc2V0X2NhcGFjaXR5ICogc2l6ZW9mKCpiYWctPnBvbGxzZXRfc2V0cykpOworICB9CisgIGJhZy0+cG9sbHNldF9zZXRzW2JhZy0+cG9sbHNldF9zZXRfY291bnQrK10gPSBpdGVtOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGJhZy0+ZmRfY291bnQ7IGkrKykgeworICAgIGlmIChncnBjX2ZkX2lzX29ycGhhbmVkKGJhZy0+ZmRzW2ldKSkgeworICAgICAgR1JQQ19GRF9VTlJFRihiYWctPmZkc1tpXSwgInBvbGxzZXRfc2V0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfcG9sbHNldF9zZXRfYWRkX2ZkKGV4ZWNfY3R4LCBpdGVtLCBiYWctPmZkc1tpXSk7CisgICAgICBiYWctPmZkc1tqKytdID0gYmFnLT5mZHNbaV07CisgICAgfQorICB9CisgIGJhZy0+ZmRfY291bnQgPSBqOworICBncHJfbXVfdW5sb2NrKCZiYWctPm11KTsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqYmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICppdGVtKSB7CisgIHNpemVfdCBpOworICBncHJfbXVfbG9jaygmYmFnLT5tdSk7CisgIGZvciAoaSA9IDA7IGkgPCBiYWctPnBvbGxzZXRfc2V0X2NvdW50OyBpKyspIHsKKyAgICBpZiAoYmFnLT5wb2xsc2V0X3NldHNbaV0gPT0gaXRlbSkgeworICAgICAgYmFnLT5wb2xsc2V0X3NldF9jb3VudC0tOworICAgICAgR1BSX1NXQVAoZ3JwY19wb2xsc2V0X3NldCAqLCBiYWctPnBvbGxzZXRfc2V0c1tpXSwKKyAgICAgICAgICAgICAgIGJhZy0+cG9sbHNldF9zZXRzW2JhZy0+cG9sbHNldF9zZXRfY291bnRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBncHJfbXVfdW5sb2NrKCZiYWctPm11KTsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsIGdycGNfZmQgKmZkKSB7CisgIHNpemVfdCBpOworICBncHJfbXVfbG9jaygmcG9sbHNldF9zZXQtPm11KTsKKyAgaWYgKHBvbGxzZXRfc2V0LT5mZF9jb3VudCA9PSBwb2xsc2V0X3NldC0+ZmRfY2FwYWNpdHkpIHsKKyAgICBwb2xsc2V0X3NldC0+ZmRfY2FwYWNpdHkgPSBHUFJfTUFYKDgsIDIgKiBwb2xsc2V0X3NldC0+ZmRfY2FwYWNpdHkpOworICAgIHBvbGxzZXRfc2V0LT5mZHMgPSBncHJfcmVhbGxvYygKKyAgICAgICAgcG9sbHNldF9zZXQtPmZkcywgcG9sbHNldF9zZXQtPmZkX2NhcGFjaXR5ICogc2l6ZW9mKCpwb2xsc2V0X3NldC0+ZmRzKSk7CisgIH0KKyAgR1JQQ19GRF9SRUYoZmQsICJwb2xsc2V0X3NldCIpOworICBwb2xsc2V0X3NldC0+ZmRzW3BvbGxzZXRfc2V0LT5mZF9jb3VudCsrXSA9IGZkOworICBmb3IgKGkgPSAwOyBpIDwgcG9sbHNldF9zZXQtPnBvbGxzZXRfY291bnQ7IGkrKykgeworICAgIGdycGNfcG9sbHNldF9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXRfc2V0LT5wb2xsc2V0c1tpXSwgZmQpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBwb2xsc2V0X3NldC0+cG9sbHNldF9zZXRfY291bnQ7IGkrKykgeworICAgIGdycGNfcG9sbHNldF9zZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0X3NldC0+cG9sbHNldF9zZXRzW2ldLCBmZCk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmcG9sbHNldF9zZXQtPm11KTsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2RlbF9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQsIGdycGNfZmQgKmZkKSB7CisgIHNpemVfdCBpOworICBncHJfbXVfbG9jaygmcG9sbHNldF9zZXQtPm11KTsKKyAgZm9yIChpID0gMDsgaSA8IHBvbGxzZXRfc2V0LT5mZF9jb3VudDsgaSsrKSB7CisgICAgaWYgKHBvbGxzZXRfc2V0LT5mZHNbaV0gPT0gZmQpIHsKKyAgICAgIHBvbGxzZXRfc2V0LT5mZF9jb3VudC0tOworICAgICAgR1BSX1NXQVAoZ3JwY19mZCAqLCBwb2xsc2V0X3NldC0+ZmRzW2ldLAorICAgICAgICAgICAgICAgcG9sbHNldF9zZXQtPmZkc1twb2xsc2V0X3NldC0+ZmRfY291bnRdKTsKKyAgICAgIEdSUENfRkRfVU5SRUYoZmQsICJwb2xsc2V0X3NldCIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBwb2xsc2V0X3NldC0+cG9sbHNldF9zZXRfY291bnQ7IGkrKykgeworICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0X3NldC0+cG9sbHNldF9zZXRzW2ldLCBmZCk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmcG9sbHNldF9zZXQtPm11KTsKK30KKworI2VuZGlmIC8qIEdQUl9QT1NJWF9TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2YjA2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX1NFVF9QT1NJWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9TRVRfUE9TSVhfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiCisKK3ZvaWQgZ3JwY19wb2xsc2V0X3NldF9hZGRfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0LCBncnBjX2ZkICpmZCk7Cit2b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX2ZkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldCwgZ3JwY19mZCAqZmQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX1NFVF9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBmYzMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIKKworZ3JwY19wb2xsc2V0X3NldCogZ3JwY19wb2xsc2V0X3NldF9jcmVhdGUodm9pZCkgeyByZXR1cm4gTlVMTDsgfQorCit2b2lkIGdycGNfcG9sbHNldF9zZXRfZGVzdHJveShncnBjX3BvbGxzZXRfc2V0KiBwb2xsc2V0X3NldCkge30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0KGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQqIHBvbGxzZXRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCogcG9sbHNldCkge30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2RlbF9wb2xsc2V0KGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQqIHBvbGxzZXRfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCogcG9sbHNldCkge30KKwordm9pZCBncnBjX3BvbGxzZXRfc2V0X2FkZF9wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4KiBleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCogYmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBpdGVtKSB7fQorCit2b2lkIGdycGNfcG9sbHNldF9zZXRfZGVsX3BvbGxzZXRfc2V0KGdycGNfZXhlY19jdHgqIGV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0KiBiYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQqIGl0ZW0pIHt9CisKKyNlbmRpZiAvKiBHUFJfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmggYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmNlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX1NFVF9XSU5ET1dTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX1NFVF9XSU5ET1dTX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9QT0xMU0VUX1NFVF9XSU5ET1dTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjMzOTEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIKKworZ3ByX211IGdycGNfcG9sbGluZ19tdTsKK3N0YXRpYyBncnBjX3BvbGxzZXRfd29ya2VyICpnX2FjdGl2ZV9wb2xsZXI7CitzdGF0aWMgZ3JwY19wb2xsc2V0X3dvcmtlciBnX2dsb2JhbF9yb290X3dvcmtlcjsKKwordm9pZCBncnBjX3BvbGxzZXRfZ2xvYmFsX2luaXQoKSB7CisgIGdwcl9tdV9pbml0KCZncnBjX3BvbGxpbmdfbXUpOworICBnX2FjdGl2ZV9wb2xsZXIgPSBOVUxMOworICBnX2dsb2JhbF9yb290X3dvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfR0xPQkFMXS5uZXh0ID0KKyAgICAgIGdfZ2xvYmFsX3Jvb3Rfd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19HTE9CQUxdLnByZXYgPQorICAgICAgICAgICZnX2dsb2JhbF9yb290X3dvcmtlcjsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfZ2xvYmFsX3NodXRkb3duKCkgeyBncHJfbXVfZGVzdHJveSgmZ3JwY19wb2xsaW5nX211KTsgfQorCitzdGF0aWMgdm9pZCByZW1vdmVfd29ya2VyKGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlcl9saW5rX3R5cGUgdHlwZSkgeworICB3b3JrZXItPmxpbmtzW3R5cGVdLnByZXYtPmxpbmtzW3R5cGVdLm5leHQgPSB3b3JrZXItPmxpbmtzW3R5cGVdLm5leHQ7CisgIHdvcmtlci0+bGlua3NbdHlwZV0ubmV4dC0+bGlua3NbdHlwZV0ucHJldiA9IHdvcmtlci0+bGlua3NbdHlwZV0ucHJldjsKKyAgd29ya2VyLT5saW5rc1t0eXBlXS5uZXh0ID0gd29ya2VyLT5saW5rc1t0eXBlXS5wcmV2ID0gd29ya2VyOworfQorCitzdGF0aWMgaW50IGhhc193b3JrZXJzKGdycGNfcG9sbHNldF93b3JrZXIgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXJfbGlua190eXBlIHR5cGUpIHsKKyAgcmV0dXJuIHJvb3QtPmxpbmtzW3R5cGVdLm5leHQgIT0gcm9vdDsKK30KKworc3RhdGljIGdycGNfcG9sbHNldF93b3JrZXIgKnBvcF9mcm9udF93b3JrZXIoCisgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqcm9vdCwgZ3JwY19wb2xsc2V0X3dvcmtlcl9saW5rX3R5cGUgdHlwZSkgeworICBpZiAoaGFzX3dvcmtlcnMocm9vdCwgdHlwZSkpIHsKKyAgICBncnBjX3BvbGxzZXRfd29ya2VyICp3ID0gcm9vdC0+bGlua3NbdHlwZV0ubmV4dDsKKyAgICByZW1vdmVfd29ya2VyKHcsIHR5cGUpOworICAgIHJldHVybiB3OworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfZnJvbnRfd29ya2VyKGdycGNfcG9sbHNldF93b3JrZXIgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfd29ya2VyX2xpbmtfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqd29ya2VyKSB7CisgIHdvcmtlci0+bGlua3NbdHlwZV0ucHJldiA9IHJvb3Q7CisgIHdvcmtlci0+bGlua3NbdHlwZV0ubmV4dCA9IHdvcmtlci0+bGlua3NbdHlwZV0ucHJldi0+bGlua3NbdHlwZV0ubmV4dDsKKyAgd29ya2VyLT5saW5rc1t0eXBlXS5wcmV2LT5saW5rc1t0eXBlXS5uZXh0ID0KKyAgICAgIHdvcmtlci0+bGlua3NbdHlwZV0ubmV4dC0+bGlua3NbdHlwZV0ucHJldiA9IHdvcmtlcjsKK30KKworc2l6ZV90IGdycGNfcG9sbHNldF9zaXplKHZvaWQpIHsgcmV0dXJuIHNpemVvZihncnBjX3BvbGxzZXQpOyB9CisKKy8qIFRoZXJlIGlzbid0IHJlYWxseSBhbnkgc3VjaCB0aGluZyBhcyBhIHBvbGxzZXQgdW5kZXIgV2luZG93cywgZHVlIHRvIHRoZQorICAgbmF0dXJlIG9mIHRoZSBJTyBjb21wbGV0aW9uIHBvcnRzLiBXZSdyZSBzdGlsbCBnb2luZyB0byBwcm92aWRlIGEgbWluaW1hbAorICAgc2V0IG9mIGZlYXR1cmVzIGZvciB0aGUgc2FrZSBvZiB0aGUgcmVzdCBvZiBncnBjLiBCdXQgZ3JwY19wb2xsc2V0X3dvcmsKKyAgIHdvbid0IGFjdHVhbGx5IGRvIGFueSBwb2xsaW5nLCBhbmQgcmV0dXJuIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuICovCisKK3ZvaWQgZ3JwY19wb2xsc2V0X2luaXQoZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncHJfbXUgKiptdSkgeworICAqbXUgPSAmZ3JwY19wb2xsaW5nX211OworICBtZW1zZXQocG9sbHNldCwgMCwgc2l6ZW9mKCpwb2xsc2V0KSk7CisgIHBvbGxzZXQtPnJvb3Rfd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUXS5uZXh0ID0KKyAgICAgIHBvbGxzZXQtPnJvb3Rfd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUXS5wcmV2ID0KKyAgICAgICAgICAmcG9sbHNldC0+cm9vdF93b3JrZXI7Cit9CisKK3ZvaWQgZ3JwY19wb2xsc2V0X3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgcG9sbHNldC0+c2h1dHRpbmdfZG93biA9IDE7CisgIGdycGNfcG9sbHNldF9raWNrKHBvbGxzZXQsIEdSUENfUE9MTFNFVF9LSUNLX0JST0FEQ0FTVCk7CisgIGlmICghcG9sbHNldC0+aXNfaW9jcF93b3JrZXIpIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIHRydWUsIE5VTEwpOworICB9IGVsc2UgeworICAgIHBvbGxzZXQtPm9uX3NodXRkb3duID0gY2xvc3VyZTsKKyAgfQorfQorCit2b2lkIGdycGNfcG9sbHNldF9kZXN0cm95KGdycGNfcG9sbHNldCAqcG9sbHNldCkge30KKwordm9pZCBncnBjX3BvbGxzZXRfcmVzZXQoZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7CisgIEdQUl9BU1NFUlQocG9sbHNldC0+c2h1dHRpbmdfZG93bik7CisgIEdQUl9BU1NFUlQoCisgICAgICAhaGFzX3dvcmtlcnMoJnBvbGxzZXQtPnJvb3Rfd29ya2VyLCBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVCkpOworICBwb2xsc2V0LT5zaHV0dGluZ19kb3duID0gMDsKKyAgcG9sbHNldC0+aXNfaW9jcF93b3JrZXIgPSAwOworICBwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMDsKKyAgcG9sbHNldC0+b25fc2h1dGRvd24gPSBOVUxMOworfQorCit2b2lkIGdycGNfcG9sbHNldF93b3JrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKip3b3JrZXJfaGRsLCBncHJfdGltZXNwZWMgbm93LAorICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKKyAgZ3JwY19wb2xsc2V0X3dvcmtlciB3b3JrZXI7CisgICp3b3JrZXJfaGRsID0gJndvcmtlcjsKKworICBpbnQgYWRkZWRfd29ya2VyID0gMDsKKyAgd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUXS5uZXh0ID0KKyAgICAgIHdvcmtlci5saW5rc1tHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVF0ucHJldiA9CisgICAgICAgICAgd29ya2VyLmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19HTE9CQUxdLm5leHQgPQorICAgICAgICAgICAgICB3b3JrZXIubGlua3NbR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX0dMT0JBTF0ucHJldiA9IE5VTEw7CisgIHdvcmtlci5raWNrZWQgPSAwOworICB3b3JrZXIucG9sbHNldCA9IHBvbGxzZXQ7CisgIGdwcl9jdl9pbml0KCZ3b3JrZXIuY3YpOworICBpZiAoIXBvbGxzZXQtPmtpY2tlZF93aXRob3V0X3BvbGxlcnMgJiYgIXBvbGxzZXQtPnNodXR0aW5nX2Rvd24pIHsKKyAgICBpZiAoZ19hY3RpdmVfcG9sbGVyID09IE5VTEwpIHsKKyAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKm5leHRfd29ya2VyOworICAgICAgLyogYmVjb21lIHBvbGxlciAqLworICAgICAgcG9sbHNldC0+aXNfaW9jcF93b3JrZXIgPSAxOworICAgICAgZ19hY3RpdmVfcG9sbGVyID0gJndvcmtlcjsKKyAgICAgIGdwcl9tdV91bmxvY2soJmdycGNfcG9sbGluZ19tdSk7CisgICAgICBncnBjX2lvY3Bfd29yayhleGVjX2N0eCwgZGVhZGxpbmUpOworICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaChleGVjX2N0eCk7CisgICAgICBncHJfbXVfbG9jaygmZ3JwY19wb2xsaW5nX211KTsKKyAgICAgIHBvbGxzZXQtPmlzX2lvY3Bfd29ya2VyID0gMDsKKyAgICAgIGdfYWN0aXZlX3BvbGxlciA9IE5VTEw7CisgICAgICAvKiB0cnkgdG8gZ2V0IGEgd29ya2VyIGZyb20gdGhpcyBwb2xsc2V0cyB3b3JrZXIgbGlzdCAqLworICAgICAgbmV4dF93b3JrZXIgPSBwb3BfZnJvbnRfd29ya2VyKCZwb2xsc2V0LT5yb290X3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVCk7CisgICAgICBpZiAobmV4dF93b3JrZXIgPT0gTlVMTCkgeworICAgICAgICAvKiB0cnkgdG8gZ2V0IGEgd29ya2VyIGZyb20gdGhlIGdsb2JhbCBsaXN0ICovCisgICAgICAgIG5leHRfd29ya2VyID0gcG9wX2Zyb250X3dvcmtlcigmZ19nbG9iYWxfcm9vdF93b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfR0xPQkFMKTsKKyAgICAgIH0KKyAgICAgIGlmIChuZXh0X3dvcmtlciAhPSBOVUxMKSB7CisgICAgICAgIG5leHRfd29ya2VyLT5raWNrZWQgPSAxOworICAgICAgICBncHJfY3Zfc2lnbmFsKCZuZXh0X3dvcmtlci0+Y3YpOworICAgICAgfQorCisgICAgICBpZiAocG9sbHNldC0+c2h1dHRpbmdfZG93biAmJiBwb2xsc2V0LT5vbl9zaHV0ZG93biAhPSBOVUxMKSB7CisgICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcG9sbHNldC0+b25fc2h1dGRvd24sIHRydWUsIE5VTEwpOworICAgICAgICBwb2xsc2V0LT5vbl9zaHV0ZG93biA9IE5VTEw7CisgICAgICB9CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHB1c2hfZnJvbnRfd29ya2VyKCZnX2dsb2JhbF9yb290X3dvcmtlciwgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX0dMT0JBTCwKKyAgICAgICAgICAgICAgICAgICAgICAmd29ya2VyKTsKKyAgICBwdXNoX2Zyb250X3dvcmtlcigmcG9sbHNldC0+cm9vdF93b3JrZXIsIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VULAorICAgICAgICAgICAgICAgICAgICAgICZ3b3JrZXIpOworICAgIGFkZGVkX3dvcmtlciA9IDE7CisgICAgd2hpbGUgKCF3b3JrZXIua2lja2VkKSB7CisgICAgICBpZiAoZ3ByX2N2X3dhaXQoJndvcmtlci5jdiwgJmdycGNfcG9sbGluZ19tdSwgZGVhZGxpbmUpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwb2xsc2V0LT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMDsKKyAgfQorZG9uZToKKyAgaWYgKCFncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eShleGVjX2N0eC0+Y2xvc3VyZV9saXN0KSkgeworICAgIGdwcl9tdV91bmxvY2soJmdycGNfcG9sbGluZ19tdSk7CisgICAgZ3JwY19leGVjX2N0eF9mbHVzaChleGVjX2N0eCk7CisgICAgZ3ByX211X2xvY2soJmdycGNfcG9sbGluZ19tdSk7CisgIH0KKyAgaWYgKGFkZGVkX3dvcmtlcikgeworICAgIHJlbW92ZV93b3JrZXIoJndvcmtlciwgR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX0dMT0JBTCk7CisgICAgcmVtb3ZlX3dvcmtlcigmd29ya2VyLCBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVCk7CisgIH0KKyAgZ3ByX2N2X2Rlc3Ryb3koJndvcmtlci5jdik7CisgICp3b3JrZXJfaGRsID0gTlVMTDsKK30KKwordm9pZCBncnBjX3BvbGxzZXRfa2ljayhncnBjX3BvbGxzZXQgKnAsIGdycGNfcG9sbHNldF93b3JrZXIgKnNwZWNpZmljX3dvcmtlcikgeworICBpZiAoc3BlY2lmaWNfd29ya2VyICE9IE5VTEwpIHsKKyAgICBpZiAoc3BlY2lmaWNfd29ya2VyID09IEdSUENfUE9MTFNFVF9LSUNLX0JST0FEQ0FTVCkgeworICAgICAgZm9yIChzcGVjaWZpY193b3JrZXIgPQorICAgICAgICAgICAgICAgcC0+cm9vdF93b3JrZXIubGlua3NbR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1BPTExTRVRdLm5leHQ7CisgICAgICAgICAgIHNwZWNpZmljX3dvcmtlciAhPSAmcC0+cm9vdF93b3JrZXI7CisgICAgICAgICAgIHNwZWNpZmljX3dvcmtlciA9CisgICAgICAgICAgICAgICBzcGVjaWZpY193b3JrZXItPmxpbmtzW0dSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUXS5uZXh0KSB7CisgICAgICAgIHNwZWNpZmljX3dvcmtlci0+a2lja2VkID0gMTsKKyAgICAgICAgZ3ByX2N2X3NpZ25hbCgmc3BlY2lmaWNfd29ya2VyLT5jdik7CisgICAgICB9CisgICAgICBwLT5raWNrZWRfd2l0aG91dF9wb2xsZXJzID0gMTsKKyAgICAgIGlmIChwLT5pc19pb2NwX3dvcmtlcikgeworICAgICAgICBncnBjX2lvY3Bfa2ljaygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocC0+aXNfaW9jcF93b3JrZXIgJiYgZ19hY3RpdmVfcG9sbGVyID09IHNwZWNpZmljX3dvcmtlcikgeworICAgICAgICBncnBjX2lvY3Bfa2ljaygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3BlY2lmaWNfd29ya2VyLT5raWNrZWQgPSAxOworICAgICAgICBncHJfY3Zfc2lnbmFsKCZzcGVjaWZpY193b3JrZXItPmN2KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3BlY2lmaWNfd29ya2VyID0KKyAgICAgICAgcG9wX2Zyb250X3dvcmtlcigmcC0+cm9vdF93b3JrZXIsIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19QT0xMU0VUKTsKKyAgICBpZiAoc3BlY2lmaWNfd29ya2VyICE9IE5VTEwpIHsKKyAgICAgIGdycGNfcG9sbHNldF9raWNrKHAsIHNwZWNpZmljX3dvcmtlcik7CisgICAgfSBlbHNlIGlmIChwLT5pc19pb2NwX3dvcmtlcikgeworICAgICAgZ3JwY19pb2NwX2tpY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgcC0+a2lja2VkX3dpdGhvdXRfcG9sbGVycyA9IDE7CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ3JwY19raWNrX3BvbGxlcih2b2lkKSB7IGdycGNfaW9jcF9raWNrKCk7IH0KKworI2VuZGlmIC8qIEdQUl9XSU5TT0NLX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTU1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1BPTExTRVRfV0lORE9XU19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9XSU5ET1dTX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIKKworLyogVGhlcmUgaXNuJ3QgcmVhbGx5IGFueSBzdWNoIHRoaW5nIGFzIGEgcG9sbHNldCB1bmRlciBXaW5kb3dzLCBkdWUgdG8gdGhlCisgICBuYXR1cmUgb2YgdGhlIElPIGNvbXBsZXRpb24gcG9ydHMuIEEgV2luZG93cyAicG9sbHNldCIgaXMgbWVyZWx5IGEgbXV0ZXgKKyAgIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgSU9DUCwgYW5kIHdvcmtlcnMgYXJlIGNvbmRpdGlvbiB2YXJpYWJsZXMKKyAgIHVzZWQgdG8gYmxvY2sgdGhyZWFkcyB1bnRpbCB3b3JrIGlzIHJlYWR5LiAqLworCit0eXBlZGVmIGVudW0geworICBHUlBDX1BPTExTRVRfV09SS0VSX0xJTktfUE9MTFNFVCA9IDAsCisgIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19HTE9CQUwsCisgIEdSUENfUE9MTFNFVF9XT1JLRVJfTElOS19UWVBFUworfSBncnBjX3BvbGxzZXRfd29ya2VyX2xpbmtfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19wb2xsc2V0X3dvcmtlcl9saW5rIHsKKyAgc3RydWN0IGdycGNfcG9sbHNldF93b3JrZXIgKm5leHQ7CisgIHN0cnVjdCBncnBjX3BvbGxzZXRfd29ya2VyICpwcmV2OworfSBncnBjX3BvbGxzZXRfd29ya2VyX2xpbms7CisKK3N0cnVjdCBncnBjX3BvbGxzZXQ7Cit0eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXQgZ3JwY19wb2xsc2V0OworCit0eXBlZGVmIHN0cnVjdCBncnBjX3BvbGxzZXRfd29ya2VyIHsKKyAgZ3ByX2N2IGN2OworICBpbnQga2lja2VkOworICBzdHJ1Y3QgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworICBncnBjX3BvbGxzZXRfd29ya2VyX2xpbmsgbGlua3NbR1JQQ19QT0xMU0VUX1dPUktFUl9MSU5LX1RZUEVTXTsKK30gZ3JwY19wb2xsc2V0X3dvcmtlcjsKKworc3RydWN0IGdycGNfcG9sbHNldCB7CisgIGludCBzaHV0dGluZ19kb3duOworICBpbnQga2lja2VkX3dpdGhvdXRfcG9sbGVyczsKKyAgaW50IGlzX2lvY3Bfd29ya2VyOworICBncnBjX3BvbGxzZXRfd29ya2VyIHJvb3Rfd29ya2VyOworICBncnBjX2Nsb3N1cmUgKm9uX3NodXRkb3duOworfTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfUE9MTFNFVF9XSU5ET1dTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCBiL3NyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ4Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9SRVNPTFZFX0FERFJFU1NfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX1JFU09MVkVfQUREUkVTU19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKworI2RlZmluZSBHUlBDX01BWF9TT0NLQUREUl9TSVpFIDEyOAorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgYWRkcltHUlBDX01BWF9TT0NLQUREUl9TSVpFXTsKKyAgc2l6ZV90IGxlbjsKK30gZ3JwY19yZXNvbHZlZF9hZGRyZXNzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBuYWRkcnM7CisgIGdycGNfcmVzb2x2ZWRfYWRkcmVzcyAqYWRkcnM7Cit9IGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzOworCisvKiBBc3luYyByZXN1bHQgY2FsbGJhY2s6CisgICBPbiBzdWNjZXNzOiBhZGRyZXNzZXMgaXMgdGhlIHJlc3VsdCwgYW5kIHRoZSBjYWxsZWUgbXVzdCBjYWxsCisgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95IHdoZW4gaXQncyBkb25lIHdpdGggdGhlbQorICAgT24gZmFpbHVyZTogYWRkcmVzc2VzIGlzIE5VTEwgKi8KK3R5cGVkZWYgdm9pZCAoKmdycGNfcmVzb2x2ZV9jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJlc3Nlcyk7CisvKiBBc3luY2hyb25vdXNseSByZXNvbHZlIGFkZHIuIFVzZSBkZWZhdWx0X3BvcnQgaWYgYSBwb3J0IGlzbid0IGRlc2lnbmF0ZWQKKyAgIGluIGFkZHIsIG90aGVyd2lzZSB1c2UgdGhlIHBvcnQgaW4gYWRkci4gKi8KKy8qIFRPRE8oY3RpbGxlcik6IGFkZCBhIHRpbWVvdXQgaGVyZSAqLwordm9pZCBncnBjX3Jlc29sdmVfYWRkcmVzcyhjb25zdCBjaGFyICphZGRyLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZV9jYiBjYiwgdm9pZCAqYXJnKTsKKy8qIERlc3Ryb3kgcmVzb2x2ZWQgYWRkcmVzc2VzICovCit2b2lkIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzX2Rlc3Ryb3koZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJlc3Nlcyk7CisKKy8qIFJlc29sdmUgYWRkciBpbiBhIGJsb2NraW5nIGZhc2hpb24uIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLAorICAgcmVzdWx0IG11c3QgYmUgZnJlZWQgd2l0aCBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95LiAqLworZXh0ZXJuIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICooKmdycGNfYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzKSgKKyAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9SRVNPTFZFX0FERFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWNiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2lmZGVmIEdQUl9QT1NJWF9TT0NLRVQKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZGVmYXVsdF9wb3J0OworICBncnBjX3Jlc29sdmVfY2IgY2I7CisgIGdycGNfY2xvc3VyZSByZXF1ZXN0X2Nsb3N1cmU7CisgIHZvaWQgKmFyZzsKK30gcmVxdWVzdDsKKworc3RhdGljIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpibG9ja2luZ19yZXNvbHZlX2FkZHJlc3NfaW1wbCgKKyAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQpIHsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKnJlc3VsdCA9IE5VTEwsICpyZXNwOworICBjaGFyICpob3N0OworICBjaGFyICpwb3J0OworICBpbnQgczsKKyAgc2l6ZV90IGk7CisgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRycyA9IE5VTEw7CisKKyAgaWYgKG5hbWVbMF0gPT0gJ3UnICYmIG5hbWVbMV0gPT0gJ24nICYmIG5hbWVbMl0gPT0gJ2knICYmIG5hbWVbM10gPT0gJ3gnICYmCisgICAgICBuYW1lWzRdID09ICc6JyAmJiBuYW1lWzVdICE9IDApIHsKKyAgICByZXR1cm4gZ3JwY19yZXNvbHZlX3VuaXhfZG9tYWluX2FkZHJlc3MobmFtZSArIDUpOworICB9CisKKyAgLyogcGFyc2UgbmFtZSwgc3BsaXR0aW5nIGl0IGludG8gaG9zdCBhbmQgcG9ydCBwYXJ0cyAqLworICBncHJfc3BsaXRfaG9zdF9wb3J0KG5hbWUsICZob3N0LCAmcG9ydCk7CisgIGlmIChob3N0ID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgInVucGFyc2VhYmxlIGhvc3Q6cG9ydDogJyVzJyIsIG5hbWUpOworICAgIGdvdG8gZG9uZTsKKyAgfQorICBpZiAocG9ydCA9PSBOVUxMKSB7CisgICAgaWYgKGRlZmF1bHRfcG9ydCA9PSBOVUxMKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm5vIHBvcnQgaW4gbmFtZSAnJXMnIiwgbmFtZSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHBvcnQgPSBncHJfc3RyZHVwKGRlZmF1bHRfcG9ydCk7CisgIH0KKworICAvKiBDYWxsIGdldGFkZHJpbmZvICovCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7ICAgICAvKiBpcHY0IG9yIGlwdjYgKi8KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsgLyogc3RyZWFtIHNvY2tldCAqLworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7ICAgICAvKiBmb3Igd2lsZGNhcmQgSVAgYWRkcmVzcyAqLworCisgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047CisgIHMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZyZXN1bHQpOworICBHUlBDX1NDSEVEVUxJTkdfRU5EX0JMT0NLSU5HX1JFR0lPTjsKKworICBpZiAocyAhPSAwKSB7CisgICAgLyogUmV0cnkgaWYgd2VsbC1rbm93biBzZXJ2aWNlIG5hbWUgaXMgcmVjb2duaXplZCAqLworICAgIGNoYXIgKnN2Y1tdWzJdID0ge3siaHR0cCIsICI4MCJ9LCB7Imh0dHBzIiwgIjQ0MyJ9fTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR1BSX0FSUkFZX1NJWkUoc3ZjKTsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKHBvcnQsIHN2Y1tpXVswXSkgPT0gMCkgeworICAgICAgICBHUlBDX1NDSEVEVUxJTkdfU1RBUlRfQkxPQ0tJTkdfUkVHSU9OOworICAgICAgICBzID0gZ2V0YWRkcmluZm8oaG9zdCwgc3ZjW2ldWzFdLCAmaGludHMsICZyZXN1bHQpOworICAgICAgICBHUlBDX1NDSEVEVUxJTkdfRU5EX0JMT0NLSU5HX1JFR0lPTjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHMgIT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZ2V0YWRkcmluZm86ICVzIiwgZ2FpX3N0cmVycm9yKHMpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBTdWNjZXNzIHBhdGg6IHNldCBhZGRycyBub24tTlVMTCwgZmlsbCBpdCBpbiAqLworICBhZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzKSk7CisgIGFkZHJzLT5uYWRkcnMgPSAwOworICBmb3IgKHJlc3AgPSByZXN1bHQ7IHJlc3AgIT0gTlVMTDsgcmVzcCA9IHJlc3AtPmFpX25leHQpIHsKKyAgICBhZGRycy0+bmFkZHJzKys7CisgIH0KKyAgYWRkcnMtPmFkZHJzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzKSAqIGFkZHJzLT5uYWRkcnMpOworICBpID0gMDsKKyAgZm9yIChyZXNwID0gcmVzdWx0OyByZXNwICE9IE5VTEw7IHJlc3AgPSByZXNwLT5haV9uZXh0KSB7CisgICAgbWVtY3B5KCZhZGRycy0+YWRkcnNbaV0uYWRkciwgcmVzcC0+YWlfYWRkciwgcmVzcC0+YWlfYWRkcmxlbik7CisgICAgYWRkcnMtPmFkZHJzW2ldLmxlbiA9IHJlc3AtPmFpX2FkZHJsZW47CisgICAgaSsrOworICB9CisKK2RvbmU6CisgIGdwcl9mcmVlKGhvc3QpOworICBncHJfZnJlZShwb3J0KTsKKyAgaWYgKHJlc3VsdCkgeworICAgIGZyZWVhZGRyaW5mbyhyZXN1bHQpOworICB9CisgIHJldHVybiBhZGRyczsKK30KKworZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKigqZ3JwY19ibG9ja2luZ19yZXNvbHZlX2FkZHJlc3MpKAorICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9ydCkgPSBibG9ja2luZ19yZXNvbHZlX2FkZHJlc3NfaW1wbDsKKworLyogQ2FsbGJhY2sgdG8gYmUgcGFzc2VkIHRvIGdycGNfZXhlY3V0b3IgdG8gYXN5bmNoLWlmeQorICogZ3JwY19ibG9ja2luZ19yZXNvbHZlX2FkZHJlc3MgKi8KK3N0YXRpYyB2b2lkIGRvX3JlcXVlc3RfdGhyZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpycCwgYm9vbCBzdWNjZXNzKSB7CisgIHJlcXVlc3QgKnIgPSBycDsKKyAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKnJlc29sdmVkID0KKyAgICAgIGdycGNfYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzKHItPm5hbWUsIHItPmRlZmF1bHRfcG9ydCk7CisgIHZvaWQgKmFyZyA9IHItPmFyZzsKKyAgZ3JwY19yZXNvbHZlX2NiIGNiID0gci0+Y2I7CisgIGdwcl9mcmVlKHItPm5hbWUpOworICBncHJfZnJlZShyLT5kZWZhdWx0X3BvcnQpOworICBjYihleGVjX2N0eCwgYXJnLCByZXNvbHZlZCk7CisgIGdwcl9mcmVlKHIpOworfQorCit2b2lkIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzX2Rlc3Ryb3koZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJzKSB7CisgIGdwcl9mcmVlKGFkZHJzLT5hZGRycyk7CisgIGdwcl9mcmVlKGFkZHJzKTsKK30KKwordm9pZCBncnBjX3Jlc29sdmVfYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcmVzb2x2ZV9jYiBjYiwgdm9pZCAqYXJnKSB7CisgIHJlcXVlc3QgKnIgPSBncHJfbWFsbG9jKHNpemVvZihyZXF1ZXN0KSk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZyLT5yZXF1ZXN0X2Nsb3N1cmUsIGRvX3JlcXVlc3RfdGhyZWFkLCByKTsKKyAgci0+bmFtZSA9IGdwcl9zdHJkdXAobmFtZSk7CisgIHItPmRlZmF1bHRfcG9ydCA9IGdwcl9zdHJkdXAoZGVmYXVsdF9wb3J0KTsKKyAgci0+Y2IgPSBjYjsKKyAgci0+YXJnID0gYXJnOworICBncnBjX2V4ZWN1dG9yX2VucXVldWUoJnItPnJlcXVlc3RfY2xvc3VyZSwgMSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGUxZjFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2dfd2luMzIuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKmRlZmF1bHRfcG9ydDsKKyAgZ3JwY19yZXNvbHZlX2NiIGNiOworICBncnBjX2Nsb3N1cmUgcmVxdWVzdF9jbG9zdXJlOworICB2b2lkICphcmc7Cit9IHJlcXVlc3Q7CisKK3N0YXRpYyBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzX2ltcGwoCisgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVmYXVsdF9wb3J0KSB7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvICpyZXN1bHQgPSBOVUxMLCAqcmVzcDsKKyAgY2hhciAqaG9zdDsKKyAgY2hhciAqcG9ydDsKKyAgaW50IHM7CisgIHNpemVfdCBpOworICBncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqYWRkcnMgPSBOVUxMOworCisgIC8qIHBhcnNlIG5hbWUsIHNwbGl0dGluZyBpdCBpbnRvIGhvc3QgYW5kIHBvcnQgcGFydHMgKi8KKyAgZ3ByX3NwbGl0X2hvc3RfcG9ydChuYW1lLCAmaG9zdCwgJnBvcnQpOworICBpZiAoaG9zdCA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJ1bnBhcnNlYWJsZSBob3N0OnBvcnQ6ICclcyciLCBuYW1lKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgaWYgKHBvcnQgPT0gTlVMTCkgeworICAgIGlmIChkZWZhdWx0X3BvcnQgPT0gTlVMTCkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJubyBwb3J0IGluIG5hbWUgJyVzJyIsIG5hbWUpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBwb3J0ID0gZ3ByX3N0cmR1cChkZWZhdWx0X3BvcnQpOworICB9CisKKyAgLyogQ2FsbCBnZXRhZGRyaW5mbyAqLworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgICAgLyogaXB2NCBvciBpcHY2ICovCisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07IC8qIHN0cmVhbSBzb2NrZXQgKi8KKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOyAgICAgLyogZm9yIHdpbGRjYXJkIElQIGFkZHJlc3MgKi8KKworICBHUlBDX1NDSEVEVUxJTkdfU1RBUlRfQkxPQ0tJTkdfUkVHSU9OOworICBzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmcmVzdWx0KTsKKyAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047CisgIGlmIChzICE9IDApIHsKKyAgICBjaGFyICplcnJvcl9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKHMpOworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZ2V0YWRkcmluZm86ICVzIiwgZXJyb3JfbWVzc2FnZSk7CisgICAgZ3ByX2ZyZWUoZXJyb3JfbWVzc2FnZSk7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogU3VjY2VzcyBwYXRoOiBzZXQgYWRkcnMgbm9uLU5VTEwsIGZpbGwgaXQgaW4gKi8KKyAgYWRkcnMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3Jlc29sdmVkX2FkZHJlc3NlcykpOworICBhZGRycy0+bmFkZHJzID0gMDsKKyAgZm9yIChyZXNwID0gcmVzdWx0OyByZXNwICE9IE5VTEw7IHJlc3AgPSByZXNwLT5haV9uZXh0KSB7CisgICAgYWRkcnMtPm5hZGRycysrOworICB9CisgIGFkZHJzLT5hZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzcykgKiBhZGRycy0+bmFkZHJzKTsKKyAgaSA9IDA7CisgIGZvciAocmVzcCA9IHJlc3VsdDsgcmVzcCAhPSBOVUxMOyByZXNwID0gcmVzcC0+YWlfbmV4dCkgeworICAgIG1lbWNweSgmYWRkcnMtPmFkZHJzW2ldLmFkZHIsIHJlc3AtPmFpX2FkZHIsIHJlc3AtPmFpX2FkZHJsZW4pOworICAgIGFkZHJzLT5hZGRyc1tpXS5sZW4gPSByZXNwLT5haV9hZGRybGVuOworICAgIGkrKzsKKyAgfQorCisgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWRkcnMtPm5hZGRyczsgaSsrKSB7CisgICAgICBjaGFyICpidWY7CisgICAgICBncnBjX3NvY2thZGRyX3RvX3N0cmluZygmYnVmLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHJzLT5hZGRyc1tpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBncHJfZnJlZShidWYpOworICAgIH0KKyAgfQorCitkb25lOgorICBncHJfZnJlZShob3N0KTsKKyAgZ3ByX2ZyZWUocG9ydCk7CisgIGlmIChyZXN1bHQpIHsKKyAgICBmcmVlYWRkcmluZm8ocmVzdWx0KTsKKyAgfQorICByZXR1cm4gYWRkcnM7Cit9CisKK2dycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICooKmdycGNfYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzKSgKKyAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWZhdWx0X3BvcnQpID0gYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzX2ltcGw7CisKKy8qIENhbGxiYWNrIHRvIGJlIHBhc3NlZCB0byBncnBjX2V4ZWN1dG9yIHRvIGFzeW5jaC1pZnkKKyAqIGdycGNfYmxvY2tpbmdfcmVzb2x2ZV9hZGRyZXNzICovCitzdGF0aWMgdm9pZCBkb19yZXF1ZXN0X3RocmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcnAsIGJvb2wgc3VjY2VzcykgeworICByZXF1ZXN0ICpyID0gcnA7CisgIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpyZXNvbHZlZCA9CisgICAgICBncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcyhyLT5uYW1lLCByLT5kZWZhdWx0X3BvcnQpOworICB2b2lkICphcmcgPSByLT5hcmc7CisgIGdycGNfcmVzb2x2ZV9jYiBjYiA9IHItPmNiOworICBncHJfZnJlZShyLT5uYW1lKTsKKyAgZ3ByX2ZyZWUoci0+ZGVmYXVsdF9wb3J0KTsKKyAgY2IoZXhlY19jdHgsIGFyZywgcmVzb2x2ZWQpOworICBncHJfZnJlZShyKTsKK30KKwordm9pZCBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICphZGRycykgeworICBncHJfZnJlZShhZGRycy0+YWRkcnMpOworICBncHJfZnJlZShhZGRycyk7Cit9CisKK3ZvaWQgZ3JwY19yZXNvbHZlX2FkZHJlc3MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVmYXVsdF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3Jlc29sdmVfY2IgY2IsIHZvaWQgKmFyZykgeworICByZXF1ZXN0ICpyID0gZ3ByX21hbGxvYyhzaXplb2YocmVxdWVzdCkpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmci0+cmVxdWVzdF9jbG9zdXJlLCBkb19yZXF1ZXN0X3RocmVhZCwgcik7CisgIHItPm5hbWUgPSBncHJfc3RyZHVwKG5hbWUpOworICByLT5kZWZhdWx0X3BvcnQgPSBncHJfc3RyZHVwKGRlZmF1bHRfcG9ydCk7CisgIHItPmNiID0gY2I7CisgIHItPmFyZyA9IGFyZzsKKyAgZ3JwY19leGVjdXRvcl9lbnF1ZXVlKCZyLT5yZXF1ZXN0X2Nsb3N1cmUsIDEpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhOTMwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLQUREUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfU09DS0FERFJfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU4zMgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oIgorI2VuZGlmCisKKyNpZmRlZiBHUFJfUE9TSVhfU09DS0VUQUREUgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIgorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX1NPQ0tBRERSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhNzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLQUREUl9QT1NJWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfU09DS0FERFJfUE9TSVhfSAorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLQUREUl9QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2Q5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtWNE1hcHBlZFByZWZpeFtdID0gezAsIDAsIDAsIDAsIDAsICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAweGZmLCAweGZmfTsKKworaW50IGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICphZGRyNF9vdXQpIHsKKyAgR1BSX0FTU0VSVChhZGRyICE9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyNF9vdXQpOworICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7CisgICAgaWYgKG1lbWNtcChhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsIGtWNE1hcHBlZFByZWZpeCwKKyAgICAgICAgICAgICAgIHNpemVvZihrVjRNYXBwZWRQcmVmaXgpKSA9PSAwKSB7CisgICAgICBpZiAoYWRkcjRfb3V0ICE9IE5VTEwpIHsKKyAgICAgICAgLyogTm9ybWFsaXplIDo6ZmZmZjowLjAuMC4wLzk2IHRvIElQdjQuICovCisgICAgICAgIG1lbXNldChhZGRyNF9vdXQsIDAsIHNpemVvZigqYWRkcjRfb3V0KSk7CisgICAgICAgIGFkZHI0X291dC0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIC8qIHM2X2FkZHIzMiB3b3VsZCBiZSBuaWNlLCBidXQgaXQncyBub24tc3RhbmRhcmQuICovCisgICAgICAgIG1lbWNweSgmYWRkcjRfb3V0LT5zaW5fYWRkciwgJmFkZHI2LT5zaW42X2FkZHIuczZfYWRkclsxMl0sIDQpOworICAgICAgICBhZGRyNF9vdXQtPnNpbl9wb3J0ID0gYWRkcjYtPnNpbjZfcG9ydDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGdycGNfc29ja2FkZHJfdG9fdjRtYXBwZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjZfb3V0KSB7CisgIEdQUl9BU1NFUlQoYWRkciAhPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjZfb3V0KTsKKyAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworICAgIG1lbXNldChhZGRyNl9vdXQsIDAsIHNpemVvZigqYWRkcjZfb3V0KSk7CisgICAgYWRkcjZfb3V0LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgIG1lbWNweSgmYWRkcjZfb3V0LT5zaW42X2FkZHIuczZfYWRkclswXSwga1Y0TWFwcGVkUHJlZml4LCAxMik7CisgICAgbWVtY3B5KCZhZGRyNl9vdXQtPnNpbjZfYWRkci5zNl9hZGRyWzEyXSwgJmFkZHI0LT5zaW5fYWRkciwgNCk7CisgICAgYWRkcjZfb3V0LT5zaW42X3BvcnQgPSBhZGRyNC0+c2luX3BvcnQ7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBncnBjX3NvY2thZGRyX2lzX3dpbGRjYXJkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50ICpwb3J0X291dCkgeworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjRfbm9ybWFsaXplZDsKKyAgaWYgKGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHI0X25vcm1hbGl6ZWQpKSB7CisgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjRfbm9ybWFsaXplZDsKKyAgfQorICBpZiAoYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAvKiBDaGVjayBmb3IgMC4wLjAuMCAqLworICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopYWRkcjsKKyAgICBpZiAoYWRkcjQtPnNpbl9hZGRyLnNfYWRkciAhPSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBvcnRfb3V0ID0gbnRvaHMoYWRkcjQtPnNpbl9wb3J0KTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAvKiBDaGVjayBmb3IgOjogKi8KKyAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgaWYgKGFkZHI2LT5zaW42X2FkZHIuczZfYWRkcltpXSAhPSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICAqcG9ydF9vdXQgPSBudG9ocyhhZGRyNi0+c2luNl9wb3J0KTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZHMoaW50IHBvcnQsIHN0cnVjdCBzb2NrYWRkcl9pbiAqd2lsZDRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKndpbGQ2X291dCkgeworICBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ0KHBvcnQsIHdpbGQ0X291dCk7CisgIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZDYocG9ydCwgd2lsZDZfb3V0KTsKK30KKwordm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ0KGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKndpbGRfb3V0KSB7CisgIEdQUl9BU1NFUlQocG9ydCA+PSAwICYmIHBvcnQgPCA2NTUzNik7CisgIG1lbXNldCh3aWxkX291dCwgMCwgc2l6ZW9mKCp3aWxkX291dCkpOworICB3aWxkX291dC0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHdpbGRfb3V0LT5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClwb3J0KTsKK30KKwordm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ2KGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp3aWxkX291dCkgeworICBHUFJfQVNTRVJUKHBvcnQgPj0gMCAmJiBwb3J0IDwgNjU1MzYpOworICBtZW1zZXQod2lsZF9vdXQsIDAsIHNpemVvZigqd2lsZF9vdXQpKTsKKyAgd2lsZF9vdXQtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgIHdpbGRfb3V0LT5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpcG9ydCk7Cit9CisKK2ludCBncnBjX3NvY2thZGRyX3RvX3N0cmluZyhjaGFyICoqb3V0LCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1hbGl6ZSkgeworICBjb25zdCBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcl9ub3JtYWxpemVkOworICBjaGFyIG50b3BfYnVmW0lORVQ2X0FERFJTVFJMRU5dOworICBjb25zdCB2b2lkICppcCA9IE5VTEw7CisgIGludCBwb3J0OworICBpbnQgcmV0OworCisgICpvdXQgPSBOVUxMOworICBpZiAobm9ybWFsaXplICYmIGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHJfbm9ybWFsaXplZCkpIHsKKyAgICBhZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX25vcm1hbGl6ZWQ7CisgIH0KKyAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworICAgIGlwID0gJmFkZHI0LT5zaW5fYWRkcjsKKyAgICBwb3J0ID0gbnRvaHMoYWRkcjQtPnNpbl9wb3J0KTsKKyAgfSBlbHNlIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKKyAgICBpcCA9ICZhZGRyNi0+c2luNl9hZGRyOworICAgIHBvcnQgPSBudG9ocyhhZGRyNi0+c2luNl9wb3J0KTsKKyAgfQorICAvKiBXaW5kb3dzIGluZXRfbnRvcCB3YW50cyBhIG11dGFibGUgaXAgcG9pbnRlciAqLworICBpZiAoaXAgIT0gTlVMTCAmJgorICAgICAgaW5ldF9udG9wKGFkZHItPnNhX2ZhbWlseSwgKHZvaWQgKilpcCwgbnRvcF9idWYsIHNpemVvZihudG9wX2J1ZikpICE9CisgICAgICAgICAgTlVMTCkgeworICAgIHJldCA9IGdwcl9qb2luX2hvc3RfcG9ydChvdXQsIG50b3BfYnVmLCBwb3J0KTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBncHJfYXNwcmludGYob3V0LCAiKHNvY2thZGRyIGZhbWlseT0lZCkiLCBhZGRyLT5zYV9mYW1pbHkpOworICB9CisgIC8qIFRoaXMgaXMgcHJvYmFibHkgcmVkdW5kYW50LCBidXQgd2Ugd291bGRuJ3Qgd2FudCB0byBsb2cgdGhlIHdyb25nIGVycm9yLiAqLworICBlcnJubyA9IHNhdmVfZXJybm87CisgIHJldHVybiByZXQ7Cit9CisKK2NoYXIgKmdycGNfc29ja2FkZHJfdG9fdXJpKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcikgeworICBjaGFyICp0ZW1wOworICBjaGFyICpyZXN1bHQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyX25vcm1hbGl6ZWQ7CisKKyAgaWYgKGdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgJmFkZHJfbm9ybWFsaXplZCkpIHsKKyAgICBhZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX25vcm1hbGl6ZWQ7CisgIH0KKworICBzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgeworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgIGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKCZ0ZW1wLCBhZGRyLCAwKTsKKyAgICAgIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAiaXB2NDolcyIsIHRlbXApOworICAgICAgZ3ByX2ZyZWUodGVtcCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICBncnBjX3NvY2thZGRyX3RvX3N0cmluZygmdGVtcCwgYWRkciwgMCk7CisgICAgICBncHJfYXNwcmludGYoJnJlc3VsdCwgImlwdjY6JXMiLCB0ZW1wKTsKKyAgICAgIGdwcl9mcmVlKHRlbXApOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGdycGNfc29ja2FkZHJfdG9fdXJpX3VuaXhfaWZfcG9zc2libGUoYWRkcik7CisgIH0KK30KKworaW50IGdycGNfc29ja2FkZHJfZ2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKSB7CisgIHN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CisgICAgY2FzZSBBRl9JTkVUOgorICAgICAgcmV0dXJuIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkciktPnNpbl9wb3J0KTsKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgcmV0dXJuIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHIpLT5zaW42X3BvcnQpOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoZ3JwY19pc191bml4X3NvY2tldChhZGRyKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5rbm93biBzb2NrZXQgZmFtaWx5ICVkIGluIGdycGNfc29ja2FkZHJfZ2V0X3BvcnQiLAorICAgICAgICAgICAgICBhZGRyLT5zYV9mYW1pbHkpOworICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworaW50IGdycGNfc29ja2FkZHJfc2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgcG9ydCkgeworICBzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgeworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgIEdQUl9BU1NFUlQocG9ydCA+PSAwICYmIHBvcnQgPCA2NTUzNik7CisgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHIpLT5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClwb3J0KTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICBHUFJfQVNTRVJUKHBvcnQgPj0gMCAmJiBwb3J0IDwgNjU1MzYpOworICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkciktPnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdClwb3J0KTsKKyAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gc29ja2V0IGZhbWlseSAlZCBpbiBncnBjX3NvY2thZGRyX3NldF9wb3J0IiwKKyAgICAgICAgICAgICAgYWRkci0+c2FfZmFtaWx5KTsKKyAgICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTNlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfU09DS0FERFJfVVRJTFNfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX1NPQ0tBRERSX1VUSUxTX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIgorCisvKiBSZXR1cm5zIHRydWUgaWYgYWRkciBpcyBhbiBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3Mgd2l0aGluIHRoZQorICAgOjpmZmZmOjAuMC4wLjAvOTYgcmFuZ2UsIG9yIGZhbHNlIG90aGVyd2lzZS4KKworICAgSWYgYWRkcjRfb3V0IGlzIG5vbi1OVUxMLCB0aGUgaW5uZXIgSVB2NCBhZGRyZXNzIHdpbGwgYmUgY29waWVkIGhlcmUgd2hlbgorICAgcmV0dXJuaW5nIHRydWUuICovCitpbnQgZ3JwY19zb2NrYWRkcl9pc192NG1hcHBlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0X291dCk7CisKKy8qIElmIGFkZHIgaXMgYW4gQUZfSU5FVCBhZGRyZXNzLCB3cml0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgOjpmZmZmOjAuMC4wLjAvOTYKKyAgIGFkZHJlc3MgdG8gYWRkcjZfb3V0IGFuZCByZXR1cm5zIHRydWUuICBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4gKi8KK2ludCBncnBjX3NvY2thZGRyX3RvX3Y0bWFwcGVkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2X291dCk7CisKKy8qIElmIGFkZHIgaXMgOjosIDAuMC4wLjAsIG9yIDo6ZmZmZjowLjAuMC4wLCB3cml0ZXMgdGhlIHBvcnQgbnVtYmVyIHRvCisgICAqcG9ydF9vdXQgKGlmIG5vdCBOVUxMKSBhbmQgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4gKi8KK2ludCBncnBjX3NvY2thZGRyX2lzX3dpbGRjYXJkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50ICpwb3J0X291dCk7CisKKy8qIFdyaXRlcyAwLjAuMC4wOnBvcnQgYW5kIFs6Ol06cG9ydCB0byBzZXBhcmF0ZSBzb2NrYWRkcnMuICovCit2b2lkIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZHMoaW50IHBvcnQsIHN0cnVjdCBzb2NrYWRkcl9pbiAqd2lsZDRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKndpbGQ2X291dCk7CisKKy8qIFdyaXRlcyAwLjAuMC4wOnBvcnQuICovCit2b2lkIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZDQoaW50IHBvcnQsIHN0cnVjdCBzb2NrYWRkcl9pbiAqd2lsZF9vdXQpOworCisvKiBXcml0ZXMgWzo6XTpwb3J0LiAqLwordm9pZCBncnBjX3NvY2thZGRyX21ha2Vfd2lsZGNhcmQ2KGludCBwb3J0LCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp3aWxkX291dCk7CisKKy8qIFJldHVybiB0aGUgSVAgcG9ydCBudW1iZXIgb2YgYSBzb2NrYWRkciAqLworaW50IGdycGNfc29ja2FkZHJfZ2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKTsKKworLyogU2V0IElQIHBvcnQgbnVtYmVyIG9mIGEgc29ja2FkZHIgKi8KK2ludCBncnBjX3NvY2thZGRyX3NldF9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IHBvcnQpOworCisvKiBDb252ZXJ0cyBhIHNvY2thZGRyIGludG8gYSBuZXdseS1hbGxvY2F0ZWQgaHVtYW4tcmVhZGFibGUgc3RyaW5nLgorCisgICBDdXJyZW50bHksIG9ubHkgdGhlIEFGX0lORVQgYW5kIEFGX0lORVQ2IGZhbWlsaWVzIGFyZSByZWNvZ25pemVkLgorICAgSWYgdGhlIG5vcm1hbGl6ZSBmbGFnIGlzIGVuYWJsZWQsIDo6ZmZmZjowLjAuMC4wLzk2IElQdjYgYWRkcmVzc2VzIGFyZQorICAgZGlzcGxheWVkIGFzIHBsYWluIElQdjQuCisKKyAgIFVzYWdlIGlzIHNpbWlsYXIgdG8gZ3ByX2FzcHJpbnRmOiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICAgKGV4Y2x1ZGluZyB0aGUgZmluYWwgJ1wwJyksIGFuZCAqb3V0IHBvaW50cyB0byBhIHN0cmluZyB3aGljaCBtdXN0IGxhdGVyIGJlCisgICBkZXN0cm95ZWQgdXNpbmcgZ3ByX2ZyZWUoKS4KKworICAgSW4gdGhlIHVubGlrZWx5IGV2ZW50IG9mIGFuIGVycm9yLCByZXR1cm5zIC0xIGFuZCBzZXRzICpvdXQgdG8gTlVMTC4KKyAgIFRoZSBleGlzdGluZyB2YWx1ZSBvZiBlcnJubyBpcyBhbHdheXMgcHJlc2VydmVkLiAqLworaW50IGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKGNoYXIgKipvdXQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9ybWFsaXplKTsKKworY2hhciAqZ3JwY19zb2NrYWRkcl90b191cmkoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfU09DS0FERFJfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmggYi9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ3MTExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1NPQ0tBRERSX1dJTjMyX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLQUREUl9XSU4zMl9ICisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisKKy8vIG11c3QgYmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIGFib3ZlCisjaW5jbHVkZSA8bXN3c29jay5oPgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLQUREUl9XSU4zMl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMzYWVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKworLyogc2V0IGEgc29ja2V0IHRvIG5vbiBibG9ja2luZyBtb2RlICovCitpbnQgZ3JwY19zZXRfc29ja2V0X25vbmJsb2NraW5nKGludCBmZCwgaW50IG5vbl9ibG9ja2luZykgeworICBpbnQgb2xkZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisgIGlmIChvbGRmbGFncyA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChub25fYmxvY2tpbmcpIHsKKyAgICBvbGRmbGFncyB8PSBPX05PTkJMT0NLOworICB9IGVsc2UgeworICAgIG9sZGZsYWdzICY9IH5PX05PTkJMT0NLOworICB9CisKKyAgaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCBvbGRmbGFncykgIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBncnBjX3NldF9zb2NrZXRfbm9fc2lncGlwZV9pZl9wb3NzaWJsZShpbnQgZmQpIHsKKyNpZmRlZiBHUFJfSEFWRV9TT19OT1NJR1BJUEUKKyAgaW50IHZhbCA9IDE7CisgIGludCBuZXd2YWw7CisgIHNvY2tsZW5fdCBpbnRsZW4gPSBzaXplb2YobmV3dmFsKTsKKyAgcmV0dXJuIDAgPT0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmdmFsLCBzaXplb2YodmFsKSkgJiYKKyAgICAgICAgIDAgPT0gZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmbmV3dmFsLCAmaW50bGVuKSAmJgorICAgICAgICAgKG5ld3ZhbCAhPSAwKSA9PSB2YWw7CisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfQorCitpbnQgZ3JwY19zZXRfc29ja2V0X2lwX3BrdGluZm9faWZfcG9zc2libGUoaW50IGZkKSB7CisjaWZkZWYgR1BSX0hBVkVfSVBfUEtUSU5GTworICBpbnQgZ2V0X2xvY2FsX2lwID0gMTsKKyAgcmV0dXJuIDAgPT0gc2V0c29ja29wdChmZCwgSVBQUk9UT19JUCwgSVBfUEtUSU5GTywgJmdldF9sb2NhbF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2V0X2xvY2FsX2lwKSk7CisjZWxzZQorICAodm9pZClmZDsKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworaW50IGdycGNfc2V0X3NvY2tldF9pcHY2X3JlY3Zwa3RpbmZvX2lmX3Bvc3NpYmxlKGludCBmZCkgeworI2lmZGVmIEdQUl9IQVZFX0lQVjZfUkVDVlBLVElORk8KKyAgaW50IGdldF9sb2NhbF9pcCA9IDE7CisgIHJldHVybiAwID09IHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9SRUNWUEtUSU5GTywgJmdldF9sb2NhbF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2V0X2xvY2FsX2lwKSk7CisjZWxzZQorICAodm9pZClmZDsKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworLyogc2V0IGEgc29ja2V0IHRvIGNsb3NlIG9uIGV4ZWMgKi8KK2ludCBncnBjX3NldF9zb2NrZXRfY2xvZXhlYyhpbnQgZmQsIGludCBjbG9zZV9vbl9leGVjKSB7CisgIGludCBvbGRmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZELCAwKTsKKyAgaWYgKG9sZGZsYWdzIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGNsb3NlX29uX2V4ZWMpIHsKKyAgICBvbGRmbGFncyB8PSBGRF9DTE9FWEVDOworICB9IGVsc2UgeworICAgIG9sZGZsYWdzICY9IH5GRF9DTE9FWEVDOworICB9CisKKyAgaWYgKGZjbnRsKGZkLCBGX1NFVEZELCBvbGRmbGFncykgIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIHNldCBhIHNvY2tldCB0byByZXVzZSBvbGQgYWRkcmVzc2VzICovCitpbnQgZ3JwY19zZXRfc29ja2V0X3JldXNlX2FkZHIoaW50IGZkLCBpbnQgcmV1c2UpIHsKKyAgaW50IHZhbCA9IChyZXVzZSAhPSAwKTsKKyAgaW50IG5ld3ZhbDsKKyAgc29ja2xlbl90IGludGxlbiA9IHNpemVvZihuZXd2YWwpOworICByZXR1cm4gMCA9PSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ2YWwsIHNpemVvZih2YWwpKSAmJgorICAgICAgICAgMCA9PSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZuZXd2YWwsICZpbnRsZW4pICYmCisgICAgICAgICAobmV3dmFsICE9IDApID09IHZhbDsKK30KKworLyogZGlzYWJsZSBuYWdsZSAqLworaW50IGdycGNfc2V0X3NvY2tldF9sb3dfbGF0ZW5jeShpbnQgZmQsIGludCBsb3dfbGF0ZW5jeSkgeworICBpbnQgdmFsID0gKGxvd19sYXRlbmN5ICE9IDApOworICBpbnQgbmV3dmFsOworICBzb2NrbGVuX3QgaW50bGVuID0gc2l6ZW9mKG5ld3ZhbCk7CisgIHJldHVybiAwID09IHNldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJnZhbCwgc2l6ZW9mKHZhbCkpICYmCisgICAgICAgICAwID09IGdldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJm5ld3ZhbCwgJmludGxlbikgJiYKKyAgICAgICAgIChuZXd2YWwgIT0gMCkgPT0gdmFsOworfQorCitzdGF0aWMgZ3ByX29uY2UgZ19wcm9iZV9pcHY2X29uY2UgPSBHUFJfT05DRV9JTklUOworc3RhdGljIGludCBnX2lwdjZfbG9vcGJhY2tfYXZhaWxhYmxlOworCitzdGF0aWMgdm9pZCBwcm9iZV9pcHY2X29uY2Uodm9pZCkgeworICBpbnQgZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgZ19pcHY2X2xvb3BiYWNrX2F2YWlsYWJsZSA9IDA7CisgIGlmIChmZCA8IDApIHsKKyAgICBncHJfbG9nKEdQUl9JTkZPLCAiRGlzYWJsaW5nIEFGX0lORVQ2IHNvY2tldHMgYmVjYXVzZSBzb2NrZXQoKSBmYWlsZWQuIik7CisgIH0gZWxzZSB7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyOworICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBhZGRyLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgYWRkci5zaW42X2FkZHIuczZfYWRkclsxNV0gPSAxOyAvKiBbOjoxXTowICovCisgICAgaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAwKSB7CisgICAgICBnX2lwdjZfbG9vcGJhY2tfYXZhaWxhYmxlID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgZ3ByX2xvZyhHUFJfSU5GTywKKyAgICAgICAgICAgICAgIkRpc2FibGluZyBBRl9JTkVUNiBzb2NrZXRzIGJlY2F1c2UgOjoxIGlzIG5vdCBhdmFpbGFibGUuIik7CisgICAgfQorICAgIGNsb3NlKGZkKTsKKyAgfQorfQorCitpbnQgZ3JwY19pcHY2X2xvb3BiYWNrX2F2YWlsYWJsZSh2b2lkKSB7CisgIGdwcl9vbmNlX2luaXQoJmdfcHJvYmVfaXB2Nl9vbmNlLCBwcm9iZV9pcHY2X29uY2UpOworICByZXR1cm4gZ19pcHY2X2xvb3BiYWNrX2F2YWlsYWJsZTsKK30KKworLyogVGhpcyBzaG91bGQgYmUgMCBpbiBwcm9kdWN0aW9uLCBidXQgaXQgbWF5IGJlIGVuYWJsZWQgZm9yIHRlc3Rpbmcgb3IKKyAgIGRlYnVnZ2luZyBwdXJwb3NlcywgdG8gc2ltdWxhdGUgYW4gZW52aXJvbm1lbnQgd2hlcmUgSVB2NiBzb2NrZXRzIGNhbid0CisgICBhbHNvIHNwZWFrIElQdjQuICovCitpbnQgZ3JwY19mb3JiaWRfZHVhbHN0YWNrX3NvY2tldHNfZm9yX3Rlc3RpbmcgPSAwOworCitzdGF0aWMgaW50IHNldF9zb2NrZXRfZHVhbHN0YWNrKGludCBmZCkgeworICBpZiAoIWdycGNfZm9yYmlkX2R1YWxzdGFja19zb2NrZXRzX2Zvcl90ZXN0aW5nKSB7CisgICAgY29uc3QgaW50IG9mZiA9IDA7CisgICAgcmV0dXJuIDAgPT0gc2V0c29ja29wdChmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJm9mZiwgc2l6ZW9mKG9mZikpOworICB9IGVsc2UgeworICAgIC8qIEZvcmNlIGFuIElQdjYtb25seSBzb2NrZXQsIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIGNvbnN0IGludCBvbiA9IDE7CisgICAgc2V0c29ja29wdChmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJm9uLCBzaXplb2Yob24pKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitpbnQgZ3JwY19jcmVhdGVfZHVhbHN0YWNrX3NvY2tldChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3RvY29sLCBncnBjX2R1YWxzdGFja19tb2RlICpkc21vZGUpIHsKKyAgaW50IGZhbWlseSA9IGFkZHItPnNhX2ZhbWlseTsKKyAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNikgeworICAgIGludCBmZDsKKyAgICBpZiAoZ3JwY19pcHY2X2xvb3BiYWNrX2F2YWlsYWJsZSgpKSB7CisgICAgICBmZCA9IHNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvY29sKTsKKyAgICB9IGVsc2UgeworICAgICAgZmQgPSAtMTsKKyAgICAgIGVycm5vID0gRUFGTk9TVVBQT1JUOworICAgIH0KKyAgICAvKiBDaGVjayBpZiB3ZSd2ZSBnb3QgYSB2YWxpZCBkdWFsc3RhY2sgc29ja2V0LiAqLworICAgIGlmIChmZCA+PSAwICYmIHNldF9zb2NrZXRfZHVhbHN0YWNrKGZkKSkgeworICAgICAgKmRzbW9kZSA9IEdSUENfRFNNT0RFX0RVQUxTVEFDSzsKKyAgICAgIHJldHVybiBmZDsKKyAgICB9CisgICAgLyogSWYgdGhpcyBpc24ndCBhbiBJUHY0IGFkZHJlc3MsIHRoZW4gcmV0dXJuIHdoYXRldmVyIHdlJ3ZlIGdvdC4gKi8KKyAgICBpZiAoIWdycGNfc29ja2FkZHJfaXNfdjRtYXBwZWQoYWRkciwgTlVMTCkpIHsKKyAgICAgICpkc21vZGUgPSBHUlBDX0RTTU9ERV9JUFY2OworICAgICAgcmV0dXJuIGZkOworICAgIH0KKyAgICAvKiBGYWxsIGJhY2sgdG8gQUZfSU5FVC4gKi8KKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgY2xvc2UoZmQpOworICAgIH0KKyAgICBmYW1pbHkgPSBBRl9JTkVUOworICB9CisgICpkc21vZGUgPSBmYW1pbHkgPT0gQUZfSU5FVCA/IEdSUENfRFNNT0RFX0lQVjQgOiBHUlBDX0RTTU9ERV9OT05FOworICByZXR1cm4gc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG9jb2wpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RmZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX0xJTlVYX1NPQ0tFVFVUSUxTCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK2ludCBncnBjX2FjY2VwdDQoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgKmFkZHJsZW4sCisgICAgICAgICAgICAgICAgIGludCBub25ibG9jaywgaW50IGNsb2V4ZWMpIHsKKyAgaW50IGZsYWdzID0gMDsKKyAgZmxhZ3MgfD0gbm9uYmxvY2sgPyBTT0NLX05PTkJMT0NLIDogMDsKKyAgZmxhZ3MgfD0gY2xvZXhlYyA/IFNPQ0tfQ0xPRVhFQyA6IDA7CisgIHJldHVybiBhY2NlcHQ0KHNvY2tmZCwgYWRkciwgYWRkcmxlbiwgZmxhZ3MpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZhMDBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVFVUSUxTCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworaW50IGdycGNfYWNjZXB0NChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCAqYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgaW50IG5vbmJsb2NrLCBpbnQgY2xvZXhlYykgeworICBpbnQgZmQsIGZsYWdzOworCisgIGZkID0gYWNjZXB0KHNvY2tmZCwgYWRkciwgYWRkcmxlbik7CisgIGlmIChmZCA+PSAwKSB7CisgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKKyAgICAgIGlmIChmbGFncyA8IDApIGdvdG8gY2xvc2VfYW5kX2Vycm9yOworICAgICAgaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spICE9IDApIGdvdG8gY2xvc2VfYW5kX2Vycm9yOworICAgIH0KKyAgICBpZiAoY2xvZXhlYykgeworICAgICAgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGRCwgMCk7CisgICAgICBpZiAoZmxhZ3MgPCAwKSBnb3RvIGNsb3NlX2FuZF9lcnJvcjsKKyAgICAgIGlmIChmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSAhPSAwKSBnb3RvIGNsb3NlX2FuZF9lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZkOworCitjbG9zZV9hbmRfZXJyb3I6CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogR1BSX1BPU0lYX1NPQ0tFVFVUSUxTICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmggYi9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczYWQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1NPQ0tFVF9VVElMU19QT1NJWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfU09DS0VUX1VUSUxTX1BPU0lYX0gKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogYSB3cmFwcGVyIGZvciBhY2NlcHQgb3IgYWNjZXB0NCAqLworaW50IGdycGNfYWNjZXB0NChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCAqYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgaW50IG5vbmJsb2NrLCBpbnQgY2xvZXhlYyk7CisKKy8qIHNldCBhIHNvY2tldCB0byBub24gYmxvY2tpbmcgbW9kZSAqLworaW50IGdycGNfc2V0X3NvY2tldF9ub25ibG9ja2luZyhpbnQgZmQsIGludCBub25fYmxvY2tpbmcpOworCisvKiBzZXQgYSBzb2NrZXQgdG8gY2xvc2Ugb24gZXhlYyAqLworaW50IGdycGNfc2V0X3NvY2tldF9jbG9leGVjKGludCBmZCwgaW50IGNsb3NlX29uX2V4ZWMpOworCisvKiBzZXQgYSBzb2NrZXQgdG8gcmV1c2Ugb2xkIGFkZHJlc3NlcyAqLworaW50IGdycGNfc2V0X3NvY2tldF9yZXVzZV9hZGRyKGludCBmZCwgaW50IHJldXNlKTsKKworLyogZGlzYWJsZSBuYWdsZSAqLworaW50IGdycGNfc2V0X3NvY2tldF9sb3dfbGF0ZW5jeShpbnQgZmQsIGludCBsb3dfbGF0ZW5jeSk7CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN5c3RlbSBjYW4gY3JlYXRlIEFGX0lORVQ2IHNvY2tldHMgYm91bmQgdG8gOjoxLgorICAgVGhlIHZhbHVlIGlzIHByb2JlZCBvbmNlLCBhbmQgY2FjaGVkIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2Vzcy4KKworICAgVGhpcyBpcyBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gY2hlY2tpbmcgZm9yIHNvY2tldChBRl9JTkVUNikgdG8gc3VjY2VlZCwKKyAgIGJlY2F1c2UgTGludXggd2l0aCAibmV0LmlwdjYuY29uZi5hbGwuZGlzYWJsZV9pcHY2ID0gMSIgaXMgYWJsZSB0byBjcmVhdGUKKyAgIGFuZCBiaW5kIElQdjYgc29ja2V0cywgYnV0IGNhbm5vdCBjb25uZWN0IHRvIGEgZ2V0c29ja25hbWUoKSBvZiBbOjpdOnBvcnQKKyAgIHdpdGhvdXQgYSB2YWxpZCBsb29wYmFjayBpbnRlcmZhY2UuICBSYXRoZXIgdGhhbiBleHBvc2UgdGhpcyBoYWxmLWJyb2tlbgorICAgc3RhdGUgdG8gbGlicmFyeSB1c2Vycywgd2UgdHVybiBvZmYgSVB2NiBzb2NrZXRzLiAqLworaW50IGdycGNfaXB2Nl9sb29wYmFja19hdmFpbGFibGUodm9pZCk7CisKKy8qIFRyaWVzIHRvIHNldCBTT19OT1NJR1BJUEUgaWYgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uCisgICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLgorICAgSWYgU09fTk9fU0lHUElQRSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm5zIDEuICovCitpbnQgZ3JwY19zZXRfc29ja2V0X25vX3NpZ3BpcGVfaWZfcG9zc2libGUoaW50IGZkKTsKKworLyogVHJpZXMgdG8gc2V0IElQX1BLVElORk8gaWYgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uCisgICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLgorICAgSWYgSVBfUEtUSU5GTyBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm5zIDEuICovCitpbnQgZ3JwY19zZXRfc29ja2V0X2lwX3BrdGluZm9faWZfcG9zc2libGUoaW50IGZkKTsKKworLyogVHJpZXMgdG8gc2V0IElQVjZfUkVDVlBLVElORk8gaWYgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uCisgICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLgorICAgSWYgSVBWNl9SRUNWUEtUSU5GTyBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm5zIDEuICovCitpbnQgZ3JwY19zZXRfc29ja2V0X2lwdjZfcmVjdnBrdGluZm9faWZfcG9zc2libGUoaW50IGZkKTsKKworLyogQW4gZW51bSB0byBrZWVwIHRyYWNrIG9mIElQdjQvSVB2NiBzb2NrZXQgbW9kZXMuCisKKyAgIEN1cnJlbnRseSwgdGhpcyBpbmZvcm1hdGlvbiBpcyBvbmx5IHVzZWQgd2hlbiBhIHNvY2tldCBpcyBmaXJzdCBjcmVhdGVkLCBidXQKKyAgIGluIHRoZSBmdXR1cmUgd2UgbWF5IHdpc2ggdG8gc3RvcmUgaXQgYWxvbmdzaWRlIHRoZSBmZC4gIFRoaXMgd291bGQgbGV0IGNhbGxzCisgICBsaWtlIHNlbmR0bygpIGtub3cgd2hpY2ggZmFtaWx5IHRvIHVzZSB3aXRob3V0IGFza2luZyB0aGUga2VybmVsIGZpcnN0LiAqLwordHlwZWRlZiBlbnVtIGdycGNfZHVhbHN0YWNrX21vZGUgeworICAvKiBVbmluaXRpYWxpemVkLCBvciBhIG5vbi1JUCBzb2NrZXQuICovCisgIEdSUENfRFNNT0RFX05PTkUsCisgIC8qIEFGX0lORVQgb25seS4gKi8KKyAgR1JQQ19EU01PREVfSVBWNCwKKyAgLyogQUZfSU5FVDYgb25seSwgYmVjYXVzZSBJUFY2X1Y2T05MWSBjb3VsZCBub3QgYmUgY2xlYXJlZC4gKi8KKyAgR1JQQ19EU01PREVfSVBWNiwKKyAgLyogQUZfSU5FVDYsIHdoaWNoIGFsc28gc3VwcG9ydHMgOjpmZmZmLW1hcHBlZCBJUHY0IGFkZHJlc3Nlcy4gKi8KKyAgR1JQQ19EU01PREVfRFVBTFNUQUNLCit9IGdycGNfZHVhbHN0YWNrX21vZGU7CisKKy8qIE9ubHkgdGVzdHMgc2hvdWxkIHVzZSB0aGlzIGZsYWcuICovCitleHRlcm4gaW50IGdycGNfZm9yYmlkX2R1YWxzdGFja19zb2NrZXRzX2Zvcl90ZXN0aW5nOworCisvKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBmb3IgY29ubmVjdGluZyB0byAob3IgbGlzdGVuaW5nIG9uKSBhbiBhZGRyZXNzLgorCisgICBJZiBhZGRyIGlzIEFGX0lORVQ2LCB0aGlzIGNyZWF0ZXMgYW4gSVB2NiBzb2NrZXQgZmlyc3QuICBJZiB0aGF0IGZhaWxzLAorICAgYW5kIGFkZHIgaXMgd2l0aGluIDo6ZmZmZjowLjAuMC4wLzk2LCB0aGVuIGl0IGF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjayB0bworICAgYW4gSVB2NCBzb2NrZXQuCisKKyAgIElmIGFkZHIgaXMgQUZfSU5FVCwgQUZfVU5JWCwgb3IgYW55dGhpbmcgZWxzZSwgdGhlbiB0aGlzIGlzIHNpbWlsYXIgdG8KKyAgIGNhbGxpbmcgc29ja2V0KCkgZGlyZWN0bHkuCisKKyAgIFJldHVybnMgYW4gZmQgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHJldHVybnMgLTEgd2l0aCBlcnJubyBzZXQgdG8gdGhlIHJlc3VsdAorICAgb2YgYSBmYWlsZWQgc29ja2V0KCkgY2FsbC4KKworICAgVGhlICpkc21vZGUgb3V0cHV0IGluZGljYXRlcyB3aGljaCBhZGRyZXNzIGZhbWlseSB3YXMgYWN0dWFsbHkgY3JlYXRlZC4KKyAgIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gdXNlIHRoaXMgaXM6CisgICAtIEZpcnN0IGNvbnZlcnQgdG8gSVB2NiB1c2luZyBncnBjX3NvY2thZGRyX3RvX3Y0bWFwcGVkKCkuCisgICAtIENyZWF0ZSB0aGUgc29ja2V0LgorICAgLSBJZiAqZHNtb2RlIGlzIElQVjQsIHVzZSBncnBjX3NvY2thZGRyX2lzX3Y0bWFwcGVkKCkgdG8gY29udmVydCBiYWNrIHRvCisgICAgIElQdjQsIHNvIHRoYXQgYmluZCgpIG9yIGNvbm5lY3QoKSBzZWUgdGhlIGNvcnJlY3QgZmFtaWx5LgorICAgQWxzbywgaXQncyBpbXBvcnRhbnQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBEVUFMU1RBQ0sgYW5kIElQVjYgd2hlbgorICAgbGlzdGVuaW5nIG9uIHRoZSBbOjpdIHdpbGRjYXJkIGFkZHJlc3MuICovCitpbnQgZ3JwY19jcmVhdGVfZHVhbHN0YWNrX3NvY2tldChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3RvY29sLCBncnBjX2R1YWxzdGFja19tb2RlICpkc21vZGUpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLRVRfVVRJTFNfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDIzYTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisvLyBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIHdpbnNvY2syLmgKKyNpbmNsdWRlIDxtc3dzb2NrLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZ193aW4zMi5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIgorCitncnBjX3dpbnNvY2tldCAqZ3JwY193aW5zb2NrZXRfY3JlYXRlKFNPQ0tFVCBzb2NrZXQsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgY2hhciAqZmluYWxfbmFtZTsKKyAgZ3JwY193aW5zb2NrZXQgKnIgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3dpbnNvY2tldCkpOworICBtZW1zZXQociwgMCwgc2l6ZW9mKGdycGNfd2luc29ja2V0KSk7CisgIHItPnNvY2tldCA9IHNvY2tldDsKKyAgZ3ByX211X2luaXQoJnItPnN0YXRlX211KTsKKyAgZ3ByX2FzcHJpbnRmKCZmaW5hbF9uYW1lLCAiJXM6c29ja2V0PTB4JXAiLCBuYW1lLCByKTsKKyAgZ3JwY19pb21ncl9yZWdpc3Rlcl9vYmplY3QoJnItPmlvbWdyX29iamVjdCwgZmluYWxfbmFtZSk7CisgIGdwcl9mcmVlKGZpbmFsX25hbWUpOworICBncnBjX2lvY3BfYWRkX3NvY2tldChyKTsKKyAgcmV0dXJuIHI7Cit9CisKKy8qIFNjaGVkdWxlIGEgc2h1dGRvd24gb2YgdGhlIHNvY2tldCBvcGVyYXRpb25zLiBXaWxsIGNhbGwgdGhlIHBlbmRpbmcKKyAgIG9wZXJhdGlvbnMgdG8gYWJvcnQgdGhlbS4gV2UgbmVlZCB0byBkbyB0aGF0IHRoaXMgd2F5IGJlY2F1c2Ugb2YgdGhlCisgICB2YXJpb3VzIGNhbGxzaXRlcyBvZiB0aGF0IGZ1bmN0aW9uLCB3aGljaCBoYXBwZW5zIHRvIGJlIGluIHZhcmlvdXMKKyAgIG11dGV4IGhvbGQgc3RhdGVzLCBhbmQgdGhhdCdkIGJlIHVuc2FmZSB0byBjYWxsIHRoZW0gZGlyZWN0bHkuICovCit2b2lkIGdycGNfd2luc29ja2V0X3NodXRkb3duKGdycGNfd2luc29ja2V0ICp3aW5zb2NrZXQpIHsKKyAgLyogR3JhYiB0aGUgZnVuY3Rpb24gcG9pbnRlciBmb3IgRGlzY29ubmVjdEV4IGZvciB0aGF0IHNwZWNpZmljIHNvY2tldC4KKyAgICAgSXQgbWF5IGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIGludGVyZmFjZS4gKi8KKyAgaW50IHN0YXR1czsKKyAgR1VJRCBndWlkID0gV1NBSURfRElTQ09OTkVDVEVYOworICBMUEZOX0RJU0NPTk5FQ1RFWCBEaXNjb25uZWN0RXg7CisgIERXT1JEIGlvY3RsX251bV9ieXRlczsKKworICBzdGF0dXMgPSBXU0FJb2N0bCh3aW5zb2NrZXQtPnNvY2tldCwgU0lPX0dFVF9FWFRFTlNJT05fRlVOQ1RJT05fUE9JTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgJmd1aWQsIHNpemVvZihndWlkKSwgJkRpc2Nvbm5lY3RFeCwgc2l6ZW9mKERpc2Nvbm5lY3RFeCksCisgICAgICAgICAgICAgICAgICAgICZpb2N0bF9udW1fYnl0ZXMsIE5VTEwsIE5VTEwpOworCisgIGlmIChzdGF0dXMgPT0gMCkgeworICAgIERpc2Nvbm5lY3RFeCh3aW5zb2NrZXQtPnNvY2tldCwgTlVMTCwgMCwgMCk7CisgIH0gZWxzZSB7CisgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byByZXRyaWV2ZSBEaXNjb25uZWN0RXggcG9pbnRlciA6ICVzIiwKKyAgICAgICAgICAgIHV0ZjhfbWVzc2FnZSk7CisgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgfQorICBjbG9zZXNvY2tldCh3aW5zb2NrZXQtPnNvY2tldCk7Cit9CisKK3ZvaWQgZ3JwY193aW5zb2NrZXRfZGVzdHJveShncnBjX3dpbnNvY2tldCAqd2luc29ja2V0KSB7CisgIGdycGNfaW9tZ3JfdW5yZWdpc3Rlcl9vYmplY3QoJndpbnNvY2tldC0+aW9tZ3Jfb2JqZWN0KTsKKyAgZ3ByX211X2Rlc3Ryb3koJndpbnNvY2tldC0+c3RhdGVfbXUpOworICBncHJfZnJlZSh3aW5zb2NrZXQpOworfQorCisjZW5kaWYgLyogR1BSX1dJTlNPQ0tfU09DS0VUICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCBiL3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDQ3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1NPQ0tFVF9XSU5ET1dTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9TT0NLRVRfV0lORE9XU19ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorCisvKiBUaGlzIGhvbGRzIHRoZSBkYXRhIGZvciBhbiBvdXRzdGFuZGluZyByZWFkIG9yIHdyaXRlIG9uIGEgc29ja2V0LgorICAgVGhlIG11dGV4IHRvIHByb3RlY3QgdGhlIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoYXQgZGF0YSBpcyB0aGUgb25lCisgICBpbnNpZGUgdGhlIHdpbnNvY2tldCB3cmFwcGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyB7CisgIC8qIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgYSBXU0FPVkVSTEFQUEVELCBidXQgaW4gb3JkZXIgdG8gZ2V0IHRoYXQKKyAgICAgZGVmaW5pdGlvbiwgd2UgbmVlZCB0byBpbmNsdWRlIHdzMnRjcGlwLmgsIHdoaWNoIG5lZWRzIHRvIGJlIGluY2x1ZGVkCisgICAgIGZyb20gdGhlIHRvcCwgb3RoZXJ3aXNlIGl0J2xsIGNsYXNoIHdpdGggYSBwcmV2aW91cyBpbmNsdXNpb24gb2YKKyAgICAgd2luZG93cy5oIHRoYXQgaW4gdHVybnMgaW5jbHVkZXMgd2luc29jay5oLiBJZiBhbnlvbmUga25vd3MgYSB3YXkKKyAgICAgdG8gZG8gaXQgcHJvcGVybHksIGZlZWwgZnJlZSB0byBzZW5kIGEgcGF0Y2guICovCisgIE9WRVJMQVBQRUQgb3ZlcmxhcHBlZDsKKyAgLyogVGhlIGNhbGxiYWNrIGluZm9ybWF0aW9uIGZvciB0aGUgcGVuZGluZyBvcGVyYXRpb24uIE1heSBiZSBlbXB0eSBpZiB0aGUKKyAgICAgY2FsbGVyIGhhc24ndCByZWdpc3RlcmVkIGEgY2FsbGJhY2sgeWV0LiAqLworICBncnBjX2Nsb3N1cmUgKmNsb3N1cmU7CisgIC8qIEEgYm9vbGVhbiB0byBkZXNjcmliZSBpZiB0aGUgSU8gQ29tcGxldGlvbiBQb3J0IGdvdCBhIG5vdGlmaWNhdGlvbiBmb3IKKyAgICAgdGhhdCBvcGVyYXRpb24uIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgYmVmb3JlIHRoZQorICAgICBjYWxsZWQgaGFkIHRpbWUgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjay4gV2UgY291bGQgYXZvaWQgdGhhdCBiZWhhdmlvcgorICAgICBhbHRvZ2V0aGVyIGJ5IGZvcmNpbmcgdGhlIGNhbGxlciB0byBhbHdheXMgcmVnaXN0ZXIgaXRzIGNhbGxiYWNrIGJlZm9yZQorICAgICBwcm9jZWVkaW5nIHF1ZXVlIGFuIG9wZXJhdGlvbiwgYnV0IGl0IGlzIGZyZXF1ZW50IGZvciBhbiBJTyBDb21wbGV0aW9uCisgICAgIFBvcnQgdG8gdHJpZ2dlciBxdWlja2x5LiBUaGlzIHdheSB3ZSBhdm9pZCBhIGNvbnRleHQgc3dpdGNoIGZvciBjYWxsaW5nCisgICAgIHRoZSBjYWxsYmFjay4gV2UgYWxzbyBzaW1wbGlmeSB0aGUgcmVhZCAvIHdyaXRlIG9wZXJhdGlvbnMgdG8gYXZvaWQgaGF2aW5nCisgICAgIHRvIGhvbGQgYSBtdXRleCBmb3IgYSBsb25nIGFtb3VudCBvZiB0aW1lLiAqLworICBpbnQgaGFzX3BlbmRpbmdfaW9jcDsKKyAgLyogVGhlIHJlc3VsdHMgb2YgdGhlIG92ZXJsYXBwZWQgb3BlcmF0aW9uLiAqLworICBEV09SRCBieXRlc190cmFuc2ZlcmVkOworICBpbnQgd3NhX2Vycm9yOworfSBncnBjX3dpbnNvY2tldF9jYWxsYmFja19pbmZvOworCisvKiBUaGlzIGlzIGEgd3JhcHBlciB0byBhIFdpbmRvd3Mgc29ja2V0LiBBIHNvY2tldCBjYW4gaGF2ZSBvbmUgb3V0c3RhbmRpbmcKKyAgIHJlYWQsIGFuZCBvbmUgb3V0c3RhbmRpbmcgd3JpdGUuIERvaW5nIGFuIGFzeW5jaHJvbm91cyBhY2NlcHQgbWVhbnMgd2FpdGluZworICAgZm9yIGEgcmVhZCBvcGVyYXRpb24uIERvaW5nIGFuIGFzeW5jaHJvbm91cyBjb25uZWN0IG1lYW5zIHdhaXRpbmcgZm9yIGEKKyAgIHdyaXRlIG9wZXJhdGlvbi4gVGhlc2UgYXJlIGNvbXBsZXRlbHkgYXJiaXRyYXJ5IHRpZXMgYmV0d2VlbiB0aGUgb3BlcmF0aW9uCisgICBhbmQgdGhlIGtpbmQgb2YgZXZlbnQsIGJlY2F1c2Ugd2UgY2FuIGhhdmUgb25lIG92ZXJsYXBwZWQgcGVyIHBlbmRpbmcKKyAgIG9wZXJhdGlvbiwgd2hpY2hldmVyIGl0cyBuYXR1cmUgaXMuIFNvIHdlIGNvdWxkIGhhdmUgbW9yZSBkZWRpY2F0ZWQgcGVuZGluZworICAgb3BlcmF0aW9uIGNhbGxiYWNrcyBmb3IgY29ubmVjdCBhbmQgbGlzdGVuLiBCdXQgZ2l2ZW4gdGhlIHNjb3BlIG9mIGxpc3RlbgorICAgYW5kIGFjY2VwdCwgd2UgZG9uJ3QgbmVlZCB0byBnbyB0byB0aGF0IGV4dGVudCBhbmQgd2FzdGUgbWVtb3J5LiBBbHNvLCB0aGlzCisgICBpcyBjbG9zZXIgdG8gd2hhdCBoYXBwZW5zIGluIHBvc2l4IHdvcmxkLiAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY193aW5zb2NrZXQgeworICBTT0NLRVQgc29ja2V0OworCisgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gd3JpdGVfaW5mbzsKKyAgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyByZWFkX2luZm87CisKKyAgZ3ByX211IHN0YXRlX211OworCisgIC8qIFlvdSBjYW4ndCBhZGQgdGhlIHNhbWUgc29ja2V0IHR3aWNlIHRvIHRoZSBzYW1lIElPIENvbXBsZXRpb24gUG9ydC4KKyAgICAgVGhpcyBwcmV2ZW50cyB0aGF0LiAqLworICBpbnQgYWRkZWRfdG9faW9jcDsKKworICBncnBjX2Nsb3N1cmUgc2h1dGRvd25fY2xvc3VyZTsKKworICAvKiBBIGxhYmVsIGZvciBpb21nciB0byB0cmFjayBvdXRzdGFuZGluZyBvYmplY3RzICovCisgIGdycGNfaW9tZ3Jfb2JqZWN0IGlvbWdyX29iamVjdDsKK30gZ3JwY193aW5zb2NrZXQ7CisKKy8qIENyZWF0ZSBhIHdyYXBwZWQgd2luZG93cyBoYW5kbGUuIFRoaXMgdGFrZXMgb3duZXJzaGlwIG9mIGl0LCBtZWFuaW5nIHRoYXQKKyAgIGl0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQuICovCitncnBjX3dpbnNvY2tldCAqZ3JwY193aW5zb2NrZXRfY3JlYXRlKFNPQ0tFVCBzb2NrZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBJbml0aWF0ZSBhbiBhc3luY2hyb25vdXMgc2h1dGRvd24gb2YgdGhlIHNvY2tldC4gV2lsbCBjYWxsIG9mZiBhbnkgcGVuZGluZworICAgb3BlcmF0aW9uIHRvIGNhbmNlbCB0aGVtLiAqLwordm9pZCBncnBjX3dpbnNvY2tldF9zaHV0ZG93bihncnBjX3dpbnNvY2tldCAqc29ja2V0KTsKKworLyogRGVzdHJveSBhIHNvY2tldC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyBvcGVyYXRpb24uICovCit2b2lkIGdycGNfd2luc29ja2V0X2Rlc3Ryb3koZ3JwY193aW5zb2NrZXQgKnNvY2tldCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX1NPQ0tFVF9XSU5ET1dTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmggYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmUyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9UQ1BfQ0xJRU5UX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9UQ1BfQ0xJRU5UX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiCisKKy8qIEFzeW5jaHJvbm91c2x5IGNvbm5lY3QgdG8gYW4gYWRkcmVzcyAoc3BlY2lmaWVkIGFzIChhZGRyLCBsZW4pKSwgYW5kIGNhbGwKKyAgIGNiIHdpdGggYXJnIGFuZCB0aGUgY29tcGxldGVkIGNvbm5lY3Rpb24gd2hlbiBkb25lIChvciBjYWxsIGNiIHdpdGggYXJnIGFuZAorICAgTlVMTCBvbiBmYWlsdXJlKS4KKyAgIGludGVyZXN0ZWRfcGFydGllcyBwb2ludHMgdG8gYSBzZXQgb2YgcG9sbHNldHMgdGhhdCB3b3VsZCBiZSBpbnRlcmVzdGVkCisgICBpbiB0aGlzIGNvbm5lY3Rpb24gYmVpbmcgZXN0YWJsaXNoZWQgKGluIG9yZGVyIHRvIGNvbnRpbnVlIHRoZWlyIHdvcmspICovCit2b2lkIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nsb3N1cmUgKm9uX2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKiplbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNpemVfdCBhZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfVENQX0NMSUVOVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVmNjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK2V4dGVybiBpbnQgZ3JwY190Y3BfdHJhY2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3ByX211IG11OworICBncnBjX2ZkICpmZDsKKyAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lOworICBncnBjX3RpbWVyIGFsYXJtOworICBpbnQgcmVmczsKKyAgZ3JwY19jbG9zdXJlIHdyaXRlX2Nsb3N1cmU7CisgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllczsKKyAgY2hhciAqYWRkcl9zdHI7CisgIGdycGNfZW5kcG9pbnQgKiplcDsKKyAgZ3JwY19jbG9zdXJlICpjbG9zdXJlOworfSBhc3luY19jb25uZWN0OworCitzdGF0aWMgaW50IHByZXBhcmVfc29ja2V0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGZkKSB7CisgIGlmIChmZCA8IDApIHsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKCFncnBjX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcoZmQsIDEpIHx8ICFncnBjX3NldF9zb2NrZXRfY2xvZXhlYyhmZCwgMSkgfHwKKyAgICAgICghZ3JwY19pc191bml4X3NvY2tldChhZGRyKSAmJiAhZ3JwY19zZXRfc29ja2V0X2xvd19sYXRlbmN5KGZkLCAxKSkgfHwKKyAgICAgICFncnBjX3NldF9zb2NrZXRfbm9fc2lncGlwZV9pZl9wb3NzaWJsZShmZCkpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBjb25maWd1cmUgc29ja2V0ICVkOiAlcyIsIGZkLAorICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIHJldHVybiAxOworCitlcnJvcjoKKyAgaWYgKGZkID49IDApIHsKKyAgICBjbG9zZShmZCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRjX29uX2FsYXJtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphY3AsIGJvb2wgc3VjY2VzcykgeworICBpbnQgZG9uZTsKKyAgYXN5bmNfY29ubmVjdCAqYWMgPSBhY3A7CisgIGlmIChncnBjX3RjcF90cmFjZSkgeworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiQ0xJRU5UX0NPTk5FQ1Q6ICVzOiBvbl9hbGFybTogc3VjY2Vzcz0lZCIsIGFjLT5hZGRyX3N0ciwKKyAgICAgICAgICAgIHN1Y2Nlc3MpOworICB9CisgIGdwcl9tdV9sb2NrKCZhYy0+bXUpOworICBpZiAoYWMtPmZkICE9IE5VTEwpIHsKKyAgICBncnBjX2ZkX3NodXRkb3duKGV4ZWNfY3R4LCBhYy0+ZmQpOworICB9CisgIGRvbmUgPSAoLS1hYy0+cmVmcyA9PSAwKTsKKyAgZ3ByX211X3VubG9jaygmYWMtPm11KTsKKyAgaWYgKGRvbmUpIHsKKyAgICBncHJfbXVfZGVzdHJveSgmYWMtPm11KTsKKyAgICBncHJfZnJlZShhYy0+YWRkcl9zdHIpOworICAgIGdwcl9mcmVlKGFjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBvbl93cml0YWJsZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYWNwLCBib29sIHN1Y2Nlc3MpIHsKKyAgYXN5bmNfY29ubmVjdCAqYWMgPSBhY3A7CisgIGludCBzb19lcnJvciA9IDA7CisgIHNvY2tsZW5fdCBzb19lcnJvcl9zaXplOworICBpbnQgZXJyOworICBpbnQgZG9uZTsKKyAgZ3JwY19lbmRwb2ludCAqKmVwID0gYWMtPmVwOworICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUgPSBhYy0+Y2xvc3VyZTsKKyAgZ3JwY19mZCAqZmQ7CisKKyAgaWYgKGdycGNfdGNwX3RyYWNlKSB7CisgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJDTElFTlRfQ09OTkVDVDogJXM6IG9uX3dyaXRhYmxlOiBzdWNjZXNzPSVkIiwKKyAgICAgICAgICAgIGFjLT5hZGRyX3N0ciwgc3VjY2Vzcyk7CisgIH0KKworICBncHJfbXVfbG9jaygmYWMtPm11KTsKKyAgR1BSX0FTU0VSVChhYy0+ZmQpOworICBmZCA9IGFjLT5mZDsKKyAgYWMtPmZkID0gTlVMTDsKKyAgZ3ByX211X3VubG9jaygmYWMtPm11KTsKKworICBncnBjX3RpbWVyX2NhbmNlbChleGVjX2N0eCwgJmFjLT5hbGFybSk7CisKKyAgZ3ByX211X2xvY2soJmFjLT5tdSk7CisgIGlmIChzdWNjZXNzKSB7CisgICAgZG8geworICAgICAgc29fZXJyb3Jfc2l6ZSA9IHNpemVvZihzb19lcnJvcik7CisgICAgICBlcnIgPSBnZXRzb2Nrb3B0KGZkLT5mZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZzb19lcnJvciwgJnNvX2Vycm9yX3NpemUpOworICAgIH0gd2hpbGUgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImZhaWxlZCB0byBjb25uZWN0IHRvICclcyc6IGdldHNvY2tvcHQoRVJST1IpOiAlcyIsCisgICAgICAgICAgICAgIGFjLT5hZGRyX3N0ciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0gZWxzZSBpZiAoc29fZXJyb3IgIT0gMCkgeworICAgICAgaWYgKHNvX2Vycm9yID09IEVOT0JVRlMpIHsKKyAgICAgICAgLyogV2Ugd2lsbCBnZXQgb25lIG9mIHRoZXNlIGVycm9ycyBpZiB3ZSBoYXZlIHJ1biBvdXQgb2YKKyAgICAgICAgICAgbWVtb3J5IGluIHRoZSBrZXJuZWwgZm9yIHRoZSBkYXRhIHN0cnVjdHVyZXMgYWxsb2NhdGVkCisgICAgICAgICAgIHdoZW4geW91IGNvbm5lY3QgYSBzb2NrZXQuICBJZiB0aGlzIGhhcHBlbnMgaXQgaXMgdmVyeQorICAgICAgICAgICBsaWtlbHkgdGhhdCBpZiB3ZSB3YWl0IGEgbGl0dGxlIGJpdCB0aGVuIHRyeSBhZ2FpbiB0aGUKKyAgICAgICAgICAgY29ubmVjdGlvbiB3aWxsIHdvcmsgKHNpbmNlIG90aGVyIHByb2dyYW1zIG9yIHRoaXMKKyAgICAgICAgICAgcHJvZ3JhbSB3aWxsIGNsb3NlIHRoZWlyIG5ldHdvcmsgY29ubmVjdGlvbnMgYW5kIGZyZWUgdXAKKyAgICAgICAgICAgbWVtb3J5KS4gIFRoaXMgZG9lcyBfbm90XyBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIGFueXRoaW5nCisgICAgICAgICAgIHdyb25nIHdpdGggdGhlIHNlcnZlciB3ZSBhcmUgY29ubmVjdGluZyB0bywgdGhpcyBpcyBhCisgICAgICAgICAgIGxvY2FsIHByb2JsZW0uCisKKyAgICAgICAgICAgSWYgeW91IGFyZSBsb29raW5nIGF0IHRoaXMgY29kZSwgdGhlbiBjaGFuY2VzIGFyZSB0aGF0CisgICAgICAgICAgIHlvdXIgcHJvZ3JhbSBvciBhbm90aGVyIHByb2dyYW0gb24gdGhlIHNhbWUgY29tcHV0ZXIKKyAgICAgICAgICAgb3BlbmVkIHRvbyBtYW55IG5ldHdvcmsgY29ubmVjdGlvbnMuICBUaGUgImVhc3kiIGZpeDoKKyAgICAgICAgICAgZG9uJ3QgZG8gdGhhdCEgKi8KKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJrZXJuZWwgb3V0IG9mIGJ1ZmZlcnMiKTsKKyAgICAgICAgZ3ByX211X3VubG9jaygmYWMtPm11KTsKKyAgICAgICAgZ3JwY19mZF9ub3RpZnlfb25fd3JpdGUoZXhlY19jdHgsIGZkLCAmYWMtPndyaXRlX2Nsb3N1cmUpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKHNvX2Vycm9yKSB7CisgICAgICAgICAgY2FzZSBFQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICBncHJfbG9nKAorICAgICAgICAgICAgICAgIEdQUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJzogc29ja2V0IGVycm9yOiBjb25uZWN0aW9uIHJlZnVzZWQiLAorICAgICAgICAgICAgICAgIGFjLT5hZGRyX3N0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJmYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnOiBzb2NrZXQgZXJyb3I6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYWMtPmFkZHJfc3RyLCBzb19lcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ3JwY19wb2xsc2V0X3NldF9kZWxfZmQoZXhlY19jdHgsIGFjLT5pbnRlcmVzdGVkX3BhcnRpZXMsIGZkKTsKKyAgICAgICplcCA9IGdycGNfdGNwX2NyZWF0ZShmZCwgR1JQQ19UQ1BfREVGQVVMVF9SRUFEX1NMSUNFX1NJWkUsIGFjLT5hZGRyX3N0cik7CisgICAgICBmZCA9IE5VTEw7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJmYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnOiB0aW1lb3V0IG9jY3VycmVkIiwKKyAgICAgICAgICAgIGFjLT5hZGRyX3N0cik7CisgICAgZ290byBmaW5pc2g7CisgIH0KKworICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKKworZmluaXNoOgorICBpZiAoZmQgIT0gTlVMTCkgeworICAgIGdycGNfcG9sbHNldF9zZXRfZGVsX2ZkKGV4ZWNfY3R4LCBhYy0+aW50ZXJlc3RlZF9wYXJ0aWVzLCBmZCk7CisgICAgZ3JwY19mZF9vcnBoYW4oZXhlY19jdHgsIGZkLCBOVUxMLCBOVUxMLCAidGNwX2NsaWVudF9vcnBoYW4iKTsKKyAgICBmZCA9IE5VTEw7CisgIH0KKyAgZG9uZSA9ICgtLWFjLT5yZWZzID09IDApOworICBncHJfbXVfdW5sb2NrKCZhYy0+bXUpOworICBpZiAoZG9uZSkgeworICAgIGdwcl9tdV9kZXN0cm95KCZhYy0+bXUpOworICAgIGdwcl9mcmVlKGFjLT5hZGRyX3N0cik7CisgICAgZ3ByX2ZyZWUoYWMpOworICB9CisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2xvc3VyZSwgKmVwICE9IE5VTEwsIE5VTEwpOworfQorCit2b2lkIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nsb3N1cmUgKmNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKiplcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqaW50ZXJlc3RlZF9wYXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNpemVfdCBhZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7CisgIGludCBmZDsKKyAgZ3JwY19kdWFsc3RhY2tfbW9kZSBkc21vZGU7CisgIGludCBlcnI7CisgIGFzeW5jX2Nvbm5lY3QgKmFjOworICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI2X3Y0bWFwcGVkOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjRfY29weTsKKyAgZ3JwY19mZCAqZmRvYmo7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKmFkZHJfc3RyOworCisgICplcCA9IE5VTEw7CisKKyAgLyogVXNlIGR1YWxzdGFjayBzb2NrZXRzIHdoZXJlIGF2YWlsYWJsZS4gKi8KKyAgaWYgKGdycGNfc29ja2FkZHJfdG9fdjRtYXBwZWQoYWRkciwgJmFkZHI2X3Y0bWFwcGVkKSkgeworICAgIGFkZHIgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHI2X3Y0bWFwcGVkOworICAgIGFkZHJfbGVuID0gc2l6ZW9mKGFkZHI2X3Y0bWFwcGVkKTsKKyAgfQorCisgIGZkID0gZ3JwY19jcmVhdGVfZHVhbHN0YWNrX3NvY2tldChhZGRyLCBTT0NLX1NUUkVBTSwgMCwgJmRzbW9kZSk7CisgIGlmIChmZCA8IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgIH0KKyAgaWYgKGRzbW9kZSA9PSBHUlBDX0RTTU9ERV9JUFY0KSB7CisgICAgLyogSWYgd2UgZ290IGFuIEFGX0lORVQgc29ja2V0LCBtYXAgdGhlIGFkZHJlc3MgYmFjayB0byBJUHY0LiAqLworICAgIEdQUl9BU1NFUlQoZ3JwY19zb2NrYWRkcl9pc192NG1hcHBlZChhZGRyLCAmYWRkcjRfY29weSkpOworICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI0X2NvcHk7CisgICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjRfY29weSk7CisgIH0KKyAgaWYgKCFwcmVwYXJlX3NvY2tldChhZGRyLCBmZCkpIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIGZhbHNlLCBOVUxMKTsKKyAgICByZXR1cm47CisgIH0KKworICBkbyB7CisgICAgR1BSX0FTU0VSVChhZGRyX2xlbiA8IH4oc29ja2xlbl90KTApOworICAgIGVyciA9IGNvbm5lY3QoZmQsIGFkZHIsIChzb2NrbGVuX3QpYWRkcl9sZW4pOworICB9IHdoaWxlIChlcnIgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBhZGRyX3N0ciA9IGdycGNfc29ja2FkZHJfdG9fdXJpKGFkZHIpOworICBncHJfYXNwcmludGYoJm5hbWUsICJ0Y3AtY2xpZW50OiVzIiwgYWRkcl9zdHIpOworCisgIGZkb2JqID0gZ3JwY19mZF9jcmVhdGUoZmQsIG5hbWUpOworCisgIGlmIChlcnIgPj0gMCkgeworICAgICplcCA9IGdycGNfdGNwX2NyZWF0ZShmZG9iaiwgR1JQQ19UQ1BfREVGQVVMVF9SRUFEX1NMSUNFX1NJWkUsIGFkZHJfc3RyKTsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNsb3N1cmUsIHRydWUsIE5VTEwpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmIChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFSU5QUk9HUkVTUykgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiY29ubmVjdCBlcnJvciB0byAnJXMnOiAlcyIsIGFkZHJfc3RyLCBzdHJlcnJvcihlcnJubykpOworICAgIGdycGNfZmRfb3JwaGFuKGV4ZWNfY3R4LCBmZG9iaiwgTlVMTCwgTlVMTCwgInRjcF9jbGllbnRfY29ubmVjdF9lcnJvciIpOworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgY2xvc3VyZSwgZmFsc2UsIE5VTEwpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGdycGNfcG9sbHNldF9zZXRfYWRkX2ZkKGV4ZWNfY3R4LCBpbnRlcmVzdGVkX3BhcnRpZXMsIGZkb2JqKTsKKworICBhYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGFzeW5jX2Nvbm5lY3QpKTsKKyAgYWMtPmNsb3N1cmUgPSBjbG9zdXJlOworICBhYy0+ZXAgPSBlcDsKKyAgYWMtPmZkID0gZmRvYmo7CisgIGFjLT5pbnRlcmVzdGVkX3BhcnRpZXMgPSBpbnRlcmVzdGVkX3BhcnRpZXM7CisgIGFjLT5hZGRyX3N0ciA9IGFkZHJfc3RyOworICBhZGRyX3N0ciA9IE5VTEw7CisgIGdwcl9tdV9pbml0KCZhYy0+bXUpOworICBhYy0+cmVmcyA9IDI7CisgIGFjLT53cml0ZV9jbG9zdXJlLmNiID0gb25fd3JpdGFibGU7CisgIGFjLT53cml0ZV9jbG9zdXJlLmNiX2FyZyA9IGFjOworCisgIGlmIChncnBjX3RjcF90cmFjZSkgeworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiQ0xJRU5UX0NPTk5FQ1Q6ICVzOiBhc3luY2hyb25vdXNseSBjb25uZWN0aW5nIiwKKyAgICAgICAgICAgIGFjLT5hZGRyX3N0cik7CisgIH0KKworICBncHJfbXVfbG9jaygmYWMtPm11KTsKKyAgZ3JwY190aW1lcl9pbml0KGV4ZWNfY3R4LCAmYWMtPmFsYXJtLAorICAgICAgICAgICAgICAgICAgZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShkZWFkbGluZSwgR1BSX0NMT0NLX01PTk9UT05JQyksCisgICAgICAgICAgICAgICAgICB0Y19vbl9hbGFybSwgYWMsIGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQykpOworICBncnBjX2ZkX25vdGlmeV9vbl93cml0ZShleGVjX2N0eCwgYWMtPmZkLCAmYWMtPndyaXRlX2Nsb3N1cmUpOworICBncHJfbXVfdW5sb2NrKCZhYy0+bXUpOworCitkb25lOgorICBncHJfZnJlZShuYW1lKTsKKyAgZ3ByX2ZyZWUoYWRkcl9zdHIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyBiL3NyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI4ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU5TT0NLX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZ193aW4zMi5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2Nsb3N1cmUgKm9uX2RvbmU7CisgIGdwcl9tdSBtdTsKKyAgZ3JwY193aW5zb2NrZXQgKnNvY2tldDsKKyAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lOworICBncnBjX3RpbWVyIGFsYXJtOworICBjaGFyICphZGRyX25hbWU7CisgIGludCByZWZzOworICBncnBjX2Nsb3N1cmUgb25fY29ubmVjdDsKKyAgZ3JwY19lbmRwb2ludCAqKmVuZHBvaW50OworfSBhc3luY19jb25uZWN0OworCitzdGF0aWMgdm9pZCBhc3luY19jb25uZWN0X3VubG9ja19hbmRfY2xlYW51cChhc3luY19jb25uZWN0ICphYykgeworICBpbnQgZG9uZSA9ICgtLWFjLT5yZWZzID09IDApOworICBncHJfbXVfdW5sb2NrKCZhYy0+bXUpOworICBpZiAoZG9uZSkgeworICAgIGlmIChhYy0+c29ja2V0ICE9IE5VTEwpIGdycGNfd2luc29ja2V0X2Rlc3Ryb3koYWMtPnNvY2tldCk7CisgICAgZ3ByX211X2Rlc3Ryb3koJmFjLT5tdSk7CisgICAgZ3ByX2ZyZWUoYWMtPmFkZHJfbmFtZSk7CisgICAgZ3ByX2ZyZWUoYWMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uX2FsYXJtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphY3AsIGJvb2wgb2NjdXJlZCkgeworICBhc3luY19jb25uZWN0ICphYyA9IGFjcDsKKyAgZ3ByX211X2xvY2soJmFjLT5tdSk7CisgIC8qIElmIHRoZSBhbGFybSBkaWRuJ3Qgb2NjdXIsIGl0IGdvdCBjYW5jZWxsZWQuICovCisgIGlmIChhYy0+c29ja2V0ICE9IE5VTEwgJiYgb2NjdXJlZCkgeworICAgIGdycGNfd2luc29ja2V0X3NodXRkb3duKGFjLT5zb2NrZXQpOworICB9CisgIGFzeW5jX2Nvbm5lY3RfdW5sb2NrX2FuZF9jbGVhbnVwKGFjKTsKK30KKworc3RhdGljIHZvaWQgb25fY29ubmVjdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYWNwLCBib29sIGZyb21faW9jcCkgeworICBhc3luY19jb25uZWN0ICphYyA9IGFjcDsKKyAgU09DS0VUIHNvY2sgPSBhYy0+c29ja2V0LT5zb2NrZXQ7CisgIGdycGNfZW5kcG9pbnQgKiplcCA9IGFjLT5lbmRwb2ludDsKKyAgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyAqaW5mbyA9ICZhYy0+c29ja2V0LT53cml0ZV9pbmZvOworICBncnBjX2Nsb3N1cmUgKm9uX2RvbmUgPSBhYy0+b25fZG9uZTsKKworICBncnBjX3RpbWVyX2NhbmNlbChleGVjX2N0eCwgJmFjLT5hbGFybSk7CisKKyAgZ3ByX211X2xvY2soJmFjLT5tdSk7CisKKyAgaWYgKGZyb21faW9jcCkgeworICAgIERXT1JEIHRyYW5zZmVyZWRfYnl0ZXMgPSAwOworICAgIERXT1JEIGZsYWdzOworICAgIEJPT0wgd3NhX3N1Y2Nlc3MgPSBXU0FHZXRPdmVybGFwcGVkUmVzdWx0KHNvY2ssICZpbmZvLT5vdmVybGFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2ZlcmVkX2J5dGVzLCBGQUxTRSwgJmZsYWdzKTsKKyAgICBHUFJfQVNTRVJUKHRyYW5zZmVyZWRfYnl0ZXMgPT0gMCk7CisgICAgaWYgKCF3c2Ffc3VjY2VzcykgeworICAgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAib25fY29ubmVjdCBlcnJvcjogJXMiLCB1dGY4X21lc3NhZ2UpOworICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgKmVwID0gZ3JwY190Y3BfY3JlYXRlKGFjLT5zb2NrZXQsIGFjLT5hZGRyX25hbWUpOworICAgICAgYWMtPnNvY2tldCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgYXN5bmNfY29ubmVjdF91bmxvY2tfYW5kX2NsZWFudXAoYWMpOworICAvKiBJZiB0aGUgY29ubmVjdGlvbiB3YXMgYWJvcnRlZCwgdGhlIGNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZCB3aGVuCisgICAgIHRoZSBkZWFkbGluZSB3YXMgbWV0LiAqLworICBvbl9kb25lLT5jYihleGVjX2N0eCwgb25fZG9uZS0+Y2JfYXJnLCAqZXAgIT0gTlVMTCk7Cit9CisKKy8qIFRyaWVzIHRvIGlzc3VlIG9uZSBhc3luYyBjb25uZWN0aW9uLCB0aGVuIHNjaGVkdWxlcyBib3RoIGFuIElPQ1AKKyAgIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZvciB0aGUgY29ubmVjdGlvbiwgYW5kIG9uZSB0aW1lb3V0IGFsZXJ0LiAqLwordm9pZCBncnBjX3RjcF9jbGllbnRfY29ubmVjdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jbG9zdXJlICpvbl9kb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICoqZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKmludGVyZXN0ZWRfcGFydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSkgeworICBTT0NLRVQgc29jayA9IElOVkFMSURfU09DS0VUOworICBCT09MIHN1Y2Nlc3M7CisgIGludCBzdGF0dXM7CisgIHN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjZfdjRtYXBwZWQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbjYgbG9jYWxfYWRkcmVzczsKKyAgYXN5bmNfY29ubmVjdCAqYWM7CisgIGdycGNfd2luc29ja2V0ICpzb2NrZXQgPSBOVUxMOworICBMUEZOX0NPTk5FQ1RFWCBDb25uZWN0RXg7CisgIEdVSUQgZ3VpZCA9IFdTQUlEX0NPTk5FQ1RFWDsKKyAgRFdPUkQgaW9jdGxfbnVtX2J5dGVzOworICBjb25zdCBjaGFyICptZXNzYWdlID0gTlVMTDsKKyAgY2hhciAqdXRmOF9tZXNzYWdlOworICBncnBjX3dpbnNvY2tldF9jYWxsYmFja19pbmZvICppbmZvOworCisgICplbmRwb2ludCA9IE5VTEw7CisKKyAgLyogVXNlIGR1YWxzdGFjayBzb2NrZXRzIHdoZXJlIGF2YWlsYWJsZS4gKi8KKyAgaWYgKGdycGNfc29ja2FkZHJfdG9fdjRtYXBwZWQoYWRkciwgJmFkZHI2X3Y0bWFwcGVkKSkgeworICAgIGFkZHIgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHI2X3Y0bWFwcGVkOworICAgIGFkZHJfbGVuID0gc2l6ZW9mKGFkZHI2X3Y0bWFwcGVkKTsKKyAgfQorCisgIHNvY2sgPSBXU0FTb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICBXU0FfRkxBR19PVkVSTEFQUEVEKTsKKyAgaWYgKHNvY2sgPT0gSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBtZXNzYWdlID0gIlVuYWJsZSB0byBjcmVhdGUgc29ja2V0OiAlcyI7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgaWYgKCFncnBjX3RjcF9wcmVwYXJlX3NvY2tldChzb2NrKSkgeworICAgIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIHNldCBzb2NrZXQgb3B0aW9uczogJXMiOworICAgIGdvdG8gZmFpbHVyZTsKKyAgfQorCisgIC8qIEdyYWIgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIENvbm5lY3RFeCBmb3IgdGhhdCBzcGVjaWZpYyBzb2NrZXQuCisgICAgIEl0IG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSBpbnRlcmZhY2UuICovCisgIHN0YXR1cyA9CisgICAgICBXU0FJb2N0bChzb2NrLCBTSU9fR0VUX0VYVEVOU0lPTl9GVU5DVElPTl9QT0lOVEVSLCAmZ3VpZCwgc2l6ZW9mKGd1aWQpLAorICAgICAgICAgICAgICAgJkNvbm5lY3RFeCwgc2l6ZW9mKENvbm5lY3RFeCksICZpb2N0bF9udW1fYnl0ZXMsIE5VTEwsIE5VTEwpOworCisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIHJldHJpZXZlIENvbm5lY3RFeCBwb2ludGVyOiAlcyI7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgZ3JwY19zb2NrYWRkcl9tYWtlX3dpbGRjYXJkNigwLCAmbG9jYWxfYWRkcmVzcyk7CisKKyAgc3RhdHVzID0gYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmxvY2FsX2FkZHJlc3MsIHNpemVvZihsb2NhbF9hZGRyZXNzKSk7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGJpbmQgc29ja2V0OiAlcyI7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgc29ja2V0ID0gZ3JwY193aW5zb2NrZXRfY3JlYXRlKHNvY2ssICJjbGllbnQiKTsKKyAgaW5mbyA9ICZzb2NrZXQtPndyaXRlX2luZm87CisgIHN1Y2Nlc3MgPQorICAgICAgQ29ubmVjdEV4KHNvY2ssIGFkZHIsIChpbnQpYWRkcl9sZW4sIE5VTEwsIDAsIE5VTEwsICZpbmZvLT5vdmVybGFwcGVkKTsKKworICAvKiBJdCB3b3VsZG4ndCBiZSB1bnVzdWFsIHRvIGdldCBhIHN1Y2Nlc3MgaW1tZWRpYXRlbHkuIEJ1dCB3ZSdsbCBzdGlsbCBnZXQKKyAgICAgYW4gSU9DUCBub3RpZmljYXRpb24sIHNvIGxldCdzIGlnbm9yZSBpdC4gKi8KKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgaW50IGVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKGVycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICAgIG1lc3NhZ2UgPSAiQ29ubmVjdEV4IGZhaWxlZDogJXMiOworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgfQorCisgIGFjID0gZ3ByX21hbGxvYyhzaXplb2YoYXN5bmNfY29ubmVjdCkpOworICBhYy0+b25fZG9uZSA9IG9uX2RvbmU7CisgIGFjLT5zb2NrZXQgPSBzb2NrZXQ7CisgIGdwcl9tdV9pbml0KCZhYy0+bXUpOworICBhYy0+cmVmcyA9IDI7CisgIGFjLT5hZGRyX25hbWUgPSBncnBjX3NvY2thZGRyX3RvX3VyaShhZGRyKTsKKyAgYWMtPmVuZHBvaW50ID0gZW5kcG9pbnQ7CisgIGdycGNfY2xvc3VyZV9pbml0KCZhYy0+b25fY29ubmVjdCwgb25fY29ubmVjdCwgYWMpOworCisgIGdycGNfdGltZXJfaW5pdChleGVjX2N0eCwgJmFjLT5hbGFybSwgZGVhZGxpbmUsIG9uX2FsYXJtLCBhYywKKyAgICAgICAgICAgICAgICAgIGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQykpOworICBncnBjX3NvY2tldF9ub3RpZnlfb25fd3JpdGUoZXhlY19jdHgsIHNvY2tldCwgJmFjLT5vbl9jb25uZWN0KTsKKyAgcmV0dXJuOworCitmYWlsdXJlOgorICB1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOworICBncHJfbG9nKEdQUl9FUlJPUiwgbWVzc2FnZSwgdXRmOF9tZXNzYWdlKTsKKyAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgaWYgKHNvY2tldCAhPSBOVUxMKSB7CisgICAgZ3JwY193aW5zb2NrZXRfZGVzdHJveShzb2NrZXQpOworICB9IGVsc2UgaWYgKHNvY2sgIT0gSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBjbG9zZXNvY2tldChzb2NrKTsKKyAgfQorICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIG9uX2RvbmUsIGZhbHNlLCBOVUxMKTsKK30KKworI2VuZGlmIC8qIEdQUl9XSU5TT0NLX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OThkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmMKQEAgLTAsMCArMSw0OTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCisjaWZkZWYgR1BSX0hBVkVfTVNHX05PU0lHTkFMCisjZGVmaW5lIFNFTkRNU0dfRkxBR1MgTVNHX05PU0lHTkFMCisjZWxzZQorI2RlZmluZSBTRU5ETVNHX0ZMQUdTIDAKKyNlbmRpZgorCisjaWZkZWYgR1BSX01TR19JT1ZMRU5fVFlQRQordHlwZWRlZiBHUFJfTVNHX0lPVkxFTl9UWVBFIG1zZ19pb3ZsZW5fdHlwZTsKKyNlbHNlCit0eXBlZGVmIHNpemVfdCBtc2dfaW92bGVuX3R5cGU7CisjZW5kaWYKKworaW50IGdycGNfdGNwX3RyYWNlID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2VuZHBvaW50IGJhc2U7CisgIGdycGNfZmQgKmVtX2ZkOworICBpbnQgZmQ7CisgIGludCBmaW5pc2hlZF9lZGdlOworICBtc2dfaW92bGVuX3R5cGUgaW92X3NpemU7IC8qIE51bWJlciBvZiBzbGljZXMgdG8gYWxsb2NhdGUgcGVyIHJlYWQgYXR0ZW1wdCAqLworICBzaXplX3Qgc2xpY2Vfc2l6ZTsKKyAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OworCisgIC8qIGdhcmJhZ2UgYWZ0ZXIgdGhlIGxhc3QgcmVhZCAqLworICBncHJfc2xpY2VfYnVmZmVyIGxhc3RfcmVhZF9idWZmZXI7CisKKyAgZ3ByX3NsaWNlX2J1ZmZlciAqaW5jb21pbmdfYnVmZmVyOworICBncHJfc2xpY2VfYnVmZmVyICpvdXRnb2luZ19idWZmZXI7CisgIC8qKiBzbGljZSB3aXRoaW4gb3V0Z29pbmdfYnVmZmVyIHRvIHdyaXRlIG5leHQgKi8KKyAgc2l6ZV90IG91dGdvaW5nX3NsaWNlX2lkeDsKKyAgLyoqIGJ5dGUgd2l0aGluIG91dGdvaW5nX2J1ZmZlci0+c2xpY2VzW291dGdvaW5nX3NsaWNlX2lkeF0gdG8gd3JpdGUgbmV4dCAqLworICBzaXplX3Qgb3V0Z29pbmdfYnl0ZV9pZHg7CisKKyAgZ3JwY19jbG9zdXJlICpyZWFkX2NiOworICBncnBjX2Nsb3N1cmUgKndyaXRlX2NiOworICBncnBjX2Nsb3N1cmUgKnJlbGVhc2VfZmRfY2I7CisgIGludCAqcmVsZWFzZV9mZDsKKworICBncnBjX2Nsb3N1cmUgcmVhZF9jbG9zdXJlOworICBncnBjX2Nsb3N1cmUgd3JpdGVfY2xvc3VyZTsKKworICBjaGFyICpwZWVyX3N0cmluZzsKK30gZ3JwY190Y3A7CisKK3N0YXRpYyB2b2lkIHRjcF9oYW5kbGVfcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnIC8qIGdycGNfdGNwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7CitzdGF0aWMgdm9pZCB0Y3BfaGFuZGxlX3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcgLyogZ3JwY190Y3AgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7CisKK3N0YXRpYyB2b2lkIHRjcF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOworICBncnBjX2ZkX3NodXRkb3duKGV4ZWNfY3R4LCB0Y3AtPmVtX2ZkKTsKK30KKworc3RhdGljIHZvaWQgdGNwX2ZyZWUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwICp0Y3ApIHsKKyAgZ3JwY19mZF9vcnBoYW4oZXhlY19jdHgsIHRjcC0+ZW1fZmQsIHRjcC0+cmVsZWFzZV9mZF9jYiwgdGNwLT5yZWxlYXNlX2ZkLAorICAgICAgICAgICAgICAgICAidGNwX3VucmVmX29ycGhhbiIpOworICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnRjcC0+bGFzdF9yZWFkX2J1ZmZlcik7CisgIGdwcl9mcmVlKHRjcC0+cGVlcl9zdHJpbmcpOworICBncHJfZnJlZSh0Y3ApOworfQorCisvKiNkZWZpbmUgR1JQQ19UQ1BfUkVGQ09VTlRfREVCVUcqLworI2lmZGVmIEdSUENfVENQX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIFRDUF9VTlJFRihjbCwgdGNwLCByZWFzb24pIFwKKyAgdGNwX3VucmVmKChjbCksICh0Y3ApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBUQ1BfUkVGKHRjcCwgcmVhc29uKSB0Y3BfcmVmKCh0Y3ApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgdGNwX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RjcCAqdGNwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiVENQIHVucmVmICVwIDogJXMgJWQgLT4gJWQiLCB0Y3AsCisgICAgICAgICAgcmVhc29uLCB0Y3AtPnJlZmNvdW50LmNvdW50LCB0Y3AtPnJlZmNvdW50LmNvdW50IC0gMSk7CisgIGlmIChncHJfdW5yZWYoJnRjcC0+cmVmY291bnQpKSB7CisgICAgdGNwX2ZyZWUoZXhlY19jdHgsIHRjcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgdGNwX3JlZihncnBjX3RjcCAqdGNwLCBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIlRDUCAgIHJlZiAlcCA6ICVzICVkIC0+ICVkIiwgdGNwLAorICAgICAgICAgIHJlYXNvbiwgdGNwLT5yZWZjb3VudC5jb3VudCwgdGNwLT5yZWZjb3VudC5jb3VudCArIDEpOworICBncHJfcmVmKCZ0Y3AtPnJlZmNvdW50KTsKK30KKyNlbHNlCisjZGVmaW5lIFRDUF9VTlJFRihjbCwgdGNwLCByZWFzb24pIHRjcF91bnJlZigoY2wpLCAodGNwKSkKKyNkZWZpbmUgVENQX1JFRih0Y3AsIHJlYXNvbikgdGNwX3JlZigodGNwKSkKK3N0YXRpYyB2b2lkIHRjcF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3AgKnRjcCkgeworICBpZiAoZ3ByX3VucmVmKCZ0Y3AtPnJlZmNvdW50KSkgeworICAgIHRjcF9mcmVlKGV4ZWNfY3R4LCB0Y3ApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9yZWYoZ3JwY190Y3AgKnRjcCkgeyBncHJfcmVmKCZ0Y3AtPnJlZmNvdW50KTsgfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRjcF9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCkgeworICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7CisgIFRDUF9VTlJFRihleGVjX2N0eCwgdGNwLCAiZGVzdHJveSIpOworfQorCitzdGF0aWMgdm9pZCBjYWxsX3JlYWRfY2IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwICp0Y3AsIGludCBzdWNjZXNzKSB7CisgIGdycGNfY2xvc3VyZSAqY2IgPSB0Y3AtPnJlYWRfY2I7CisKKyAgaWYgKGdycGNfdGNwX3RyYWNlKSB7CisgICAgc2l6ZV90IGk7CisgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJyZWFkOiBzdWNjZXNzPSVkIiwgc3VjY2Vzcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHRjcC0+aW5jb21pbmdfYnVmZmVyLT5jb3VudDsgaSsrKSB7CisgICAgICBjaGFyICpkdW1wID0gZ3ByX2R1bXBfc2xpY2UodGNwLT5pbmNvbWluZ19idWZmZXItPnNsaWNlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfRFVNUF9IRVggfCBHUFJfRFVNUF9BU0NJSSk7CisgICAgICBncHJfbG9nKEdQUl9ERUJVRywgIlJFQUQgJXA6ICVzIiwgdGNwLCBkdW1wKTsKKyAgICAgIGdwcl9mcmVlKGR1bXApOworICAgIH0KKyAgfQorCisgIHRjcC0+cmVhZF9jYiA9IE5VTEw7CisgIHRjcC0+aW5jb21pbmdfYnVmZmVyID0gTlVMTDsKKyAgY2ItPmNiKGV4ZWNfY3R4LCBjYi0+Y2JfYXJnLCBzdWNjZXNzKTsKK30KKworI2RlZmluZSBNQVhfUkVBRF9JT1ZFQyA0CitzdGF0aWMgdm9pZCB0Y3BfY29udGludWVfcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3AgKnRjcCkgeworICBzdHJ1Y3QgbXNnaGRyIG1zZzsKKyAgc3RydWN0IGlvdmVjIGlvdltNQVhfUkVBRF9JT1ZFQ107CisgIHNzaXplX3QgcmVhZF9ieXRlczsKKyAgc2l6ZV90IGk7CisKKyAgR1BSX0FTU0VSVCghdGNwLT5maW5pc2hlZF9lZGdlKTsKKyAgR1BSX0FTU0VSVCh0Y3AtPmlvdl9zaXplIDw9IE1BWF9SRUFEX0lPVkVDKTsKKyAgR1BSX0FTU0VSVCh0Y3AtPmluY29taW5nX2J1ZmZlci0+Y291bnQgPD0gTUFYX1JFQURfSU9WRUMpOworICBHUFJfVElNRVJfQkVHSU4oInRjcF9jb250aW51ZV9yZWFkIiwgMCk7CisKKyAgd2hpbGUgKHRjcC0+aW5jb21pbmdfYnVmZmVyLT5jb3VudCA8IChzaXplX3QpdGNwLT5pb3Zfc2l6ZSkgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkX2luZGV4ZWQodGNwLT5pbmNvbWluZ19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfbWFsbG9jKHRjcC0+c2xpY2Vfc2l6ZSkpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCB0Y3AtPmluY29taW5nX2J1ZmZlci0+Y291bnQ7IGkrKykgeworICAgIGlvdltpXS5pb3ZfYmFzZSA9IEdQUl9TTElDRV9TVEFSVF9QVFIodGNwLT5pbmNvbWluZ19idWZmZXItPnNsaWNlc1tpXSk7CisgICAgaW92W2ldLmlvdl9sZW4gPSBHUFJfU0xJQ0VfTEVOR1RIKHRjcC0+aW5jb21pbmdfYnVmZmVyLT5zbGljZXNbaV0pOworICB9CisKKyAgbXNnLm1zZ19uYW1lID0gTlVMTDsKKyAgbXNnLm1zZ19uYW1lbGVuID0gMDsKKyAgbXNnLm1zZ19pb3YgPSBpb3Y7CisgIG1zZy5tc2dfaW92bGVuID0gdGNwLT5pb3Zfc2l6ZTsKKyAgbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKyAgbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKyAgbXNnLm1zZ19mbGFncyA9IDA7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJyZWN2bXNnIiwgMSk7CisgIGRvIHsKKyAgICByZWFkX2J5dGVzID0gcmVjdm1zZyh0Y3AtPmZkLCAmbXNnLCAwKTsKKyAgfSB3aGlsZSAocmVhZF9ieXRlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICBHUFJfVElNRVJfRU5EKCJyZWN2bXNnIiwgMCk7CisKKyAgaWYgKHJlYWRfYnl0ZXMgPCAwKSB7CisgICAgLyogTkI6IEFmdGVyIGNhbGxpbmcgY2FsbF9yZWFkX2NiIGEgcGFyYWxsZWwgY2FsbCBvZiB0aGUgcmVhZCBoYW5kbGVyIG1heQorICAgICAqIGJlIHJ1bm5pbmcuICovCisgICAgaWYgKGVycm5vID09IEVBR0FJTikgeworICAgICAgaWYgKHRjcC0+aW92X3NpemUgPiAxKSB7CisgICAgICAgIHRjcC0+aW92X3NpemUgLz0gMjsKKyAgICAgIH0KKyAgICAgIC8qIFdlJ3ZlIGNvbnN1bWVkIHRoZSBlZGdlLCByZXF1ZXN0IGEgbmV3IG9uZSAqLworICAgICAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgdGNwLT5lbV9mZCwgJnRjcC0+cmVhZF9jbG9zdXJlKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogVE9ETyhrbGVtcG5lcik6IExvZyBpbnRlcmVzdGluZyBlcnJvcnMgKi8KKyAgICAgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKHRjcC0+aW5jb21pbmdfYnVmZmVyKTsKKyAgICAgIGNhbGxfcmVhZF9jYihleGVjX2N0eCwgdGNwLCAwKTsKKyAgICAgIFRDUF9VTlJFRihleGVjX2N0eCwgdGNwLCAicmVhZCIpOworICAgIH0KKyAgfSBlbHNlIGlmIChyZWFkX2J5dGVzID09IDApIHsKKyAgICAvKiAwIHJlYWQgc2l6ZSA9PT4gZW5kIG9mIHN0cmVhbSAqLworICAgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKHRjcC0+aW5jb21pbmdfYnVmZmVyKTsKKyAgICBjYWxsX3JlYWRfY2IoZXhlY19jdHgsIHRjcCwgMCk7CisgICAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJyZWFkIik7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVCgoc2l6ZV90KXJlYWRfYnl0ZXMgPD0gdGNwLT5pbmNvbWluZ19idWZmZXItPmxlbmd0aCk7CisgICAgaWYgKChzaXplX3QpcmVhZF9ieXRlcyA8IHRjcC0+aW5jb21pbmdfYnVmZmVyLT5sZW5ndGgpIHsKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfdHJpbV9lbmQoCisgICAgICAgICAgdGNwLT5pbmNvbWluZ19idWZmZXIsCisgICAgICAgICAgdGNwLT5pbmNvbWluZ19idWZmZXItPmxlbmd0aCAtIChzaXplX3QpcmVhZF9ieXRlcywKKyAgICAgICAgICAmdGNwLT5sYXN0X3JlYWRfYnVmZmVyKTsKKyAgICB9IGVsc2UgaWYgKHRjcC0+aW92X3NpemUgPCBNQVhfUkVBRF9JT1ZFQykgeworICAgICAgKyt0Y3AtPmlvdl9zaXplOworICAgIH0KKyAgICBHUFJfQVNTRVJUKChzaXplX3QpcmVhZF9ieXRlcyA9PSB0Y3AtPmluY29taW5nX2J1ZmZlci0+bGVuZ3RoKTsKKyAgICBjYWxsX3JlYWRfY2IoZXhlY19jdHgsIHRjcCwgMSk7CisgICAgVENQX1VOUkVGKGV4ZWNfY3R4LCB0Y3AsICJyZWFkIik7CisgIH0KKworICBHUFJfVElNRVJfRU5EKCJ0Y3BfY29udGludWVfcmVhZCIsIDApOworfQorCitzdGF0aWMgdm9pZCB0Y3BfaGFuZGxlX3JlYWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZyAvKiBncnBjX3RjcCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWFyZzsKKyAgR1BSX0FTU0VSVCghdGNwLT5maW5pc2hlZF9lZGdlKTsKKworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZih0Y3AtPmluY29taW5nX2J1ZmZlcik7CisgICAgY2FsbF9yZWFkX2NiKGV4ZWNfY3R4LCB0Y3AsIDApOworICAgIFRDUF9VTlJFRihleGVjX2N0eCwgdGNwLCAicmVhZCIpOworICB9IGVsc2UgeworICAgIHRjcF9jb250aW51ZV9yZWFkKGV4ZWNfY3R4LCB0Y3ApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKKyAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKmluY29taW5nX2J1ZmZlciwgZ3JwY19jbG9zdXJlICpjYikgeworICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7CisgIEdQUl9BU1NFUlQodGNwLT5yZWFkX2NiID09IE5VTEwpOworICB0Y3AtPnJlYWRfY2IgPSBjYjsKKyAgdGNwLT5pbmNvbWluZ19idWZmZXIgPSBpbmNvbWluZ19idWZmZXI7CisgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKGluY29taW5nX2J1ZmZlcik7CisgIGdwcl9zbGljZV9idWZmZXJfc3dhcChpbmNvbWluZ19idWZmZXIsICZ0Y3AtPmxhc3RfcmVhZF9idWZmZXIpOworICBUQ1BfUkVGKHRjcCwgInJlYWQiKTsKKyAgaWYgKHRjcC0+ZmluaXNoZWRfZWRnZSkgeworICAgIHRjcC0+ZmluaXNoZWRfZWRnZSA9IDA7CisgICAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgdGNwLT5lbV9mZCwgJnRjcC0+cmVhZF9jbG9zdXJlKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZ0Y3AtPnJlYWRfY2xvc3VyZSwgdHJ1ZSwgTlVMTCk7CisgIH0KK30KKwordHlwZWRlZiBlbnVtIHsgRkxVU0hfRE9ORSwgRkxVU0hfUEVORElORywgRkxVU0hfRVJST1IgfSBmbHVzaF9yZXN1bHQ7CisKKyNkZWZpbmUgTUFYX1dSSVRFX0lPVkVDIDE2CitzdGF0aWMgZmx1c2hfcmVzdWx0IHRjcF9mbHVzaChncnBjX3RjcCAqdGNwKSB7CisgIHN0cnVjdCBtc2doZHIgbXNnOworICBzdHJ1Y3QgaW92ZWMgaW92W01BWF9XUklURV9JT1ZFQ107CisgIG1zZ19pb3ZsZW5fdHlwZSBpb3Zfc2l6ZTsKKyAgc3NpemVfdCBzZW50X2xlbmd0aDsKKyAgc2l6ZV90IHNlbmRpbmdfbGVuZ3RoOworICBzaXplX3QgdHJhaWxpbmc7CisgIHNpemVfdCB1bndpbmRfc2xpY2VfaWR4OworICBzaXplX3QgdW53aW5kX2J5dGVfaWR4OworCisgIGZvciAoOzspIHsKKyAgICBzZW5kaW5nX2xlbmd0aCA9IDA7CisgICAgdW53aW5kX3NsaWNlX2lkeCA9IHRjcC0+b3V0Z29pbmdfc2xpY2VfaWR4OworICAgIHVud2luZF9ieXRlX2lkeCA9IHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHg7CisgICAgZm9yIChpb3Zfc2l6ZSA9IDA7IHRjcC0+b3V0Z29pbmdfc2xpY2VfaWR4ICE9IHRjcC0+b3V0Z29pbmdfYnVmZmVyLT5jb3VudCAmJgorICAgICAgICAgICAgICAgICAgICAgICBpb3Zfc2l6ZSAhPSBNQVhfV1JJVEVfSU9WRUM7CisgICAgICAgICBpb3Zfc2l6ZSsrKSB7CisgICAgICBpb3ZbaW92X3NpemVdLmlvdl9iYXNlID0KKyAgICAgICAgICBHUFJfU0xJQ0VfU1RBUlRfUFRSKAorICAgICAgICAgICAgICB0Y3AtPm91dGdvaW5nX2J1ZmZlci0+c2xpY2VzW3RjcC0+b3V0Z29pbmdfc2xpY2VfaWR4XSkgKworICAgICAgICAgIHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHg7CisgICAgICBpb3ZbaW92X3NpemVdLmlvdl9sZW4gPQorICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoCisgICAgICAgICAgICAgIHRjcC0+b3V0Z29pbmdfYnVmZmVyLT5zbGljZXNbdGNwLT5vdXRnb2luZ19zbGljZV9pZHhdKSAtCisgICAgICAgICAgdGNwLT5vdXRnb2luZ19ieXRlX2lkeDsKKyAgICAgIHNlbmRpbmdfbGVuZ3RoICs9IGlvdltpb3Zfc2l6ZV0uaW92X2xlbjsKKyAgICAgIHRjcC0+b3V0Z29pbmdfc2xpY2VfaWR4Kys7CisgICAgICB0Y3AtPm91dGdvaW5nX2J5dGVfaWR4ID0gMDsKKyAgICB9CisgICAgR1BSX0FTU0VSVChpb3Zfc2l6ZSA+IDApOworCisgICAgbXNnLm1zZ19uYW1lID0gTlVMTDsKKyAgICBtc2cubXNnX25hbWVsZW4gPSAwOworICAgIG1zZy5tc2dfaW92ID0gaW92OworICAgIG1zZy5tc2dfaW92bGVuID0gaW92X3NpemU7CisgICAgbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKyAgICBtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworICAgIG1zZy5tc2dfZmxhZ3MgPSAwOworCisgICAgR1BSX1RJTUVSX0JFR0lOKCJzZW5kbXNnIiwgMSk7CisgICAgZG8geworICAgICAgLyogVE9ETyhrbGVtcG5lcik6IENvcmsgaWYgdGhpcyBpcyBhIHBhcnRpYWwgd3JpdGUgKi8KKyAgICAgIHNlbnRfbGVuZ3RoID0gc2VuZG1zZyh0Y3AtPmZkLCAmbXNnLCBTRU5ETVNHX0ZMQUdTKTsKKyAgICB9IHdoaWxlIChzZW50X2xlbmd0aCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgIEdQUl9USU1FUl9FTkQoInNlbmRtc2ciLCAwKTsKKworICAgIGlmIChzZW50X2xlbmd0aCA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgdGNwLT5vdXRnb2luZ19zbGljZV9pZHggPSB1bndpbmRfc2xpY2VfaWR4OworICAgICAgICB0Y3AtPm91dGdvaW5nX2J5dGVfaWR4ID0gdW53aW5kX2J5dGVfaWR4OworICAgICAgICByZXR1cm4gRkxVU0hfUEVORElORzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRPRE8oa2xlbXBuZXIpOiBMb2cgc29tZSBvZiB0aGVzZSAqLworICAgICAgICByZXR1cm4gRkxVU0hfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgR1BSX0FTU0VSVCh0Y3AtPm91dGdvaW5nX2J5dGVfaWR4ID09IDApOworICAgIHRyYWlsaW5nID0gc2VuZGluZ19sZW5ndGggLSAoc2l6ZV90KXNlbnRfbGVuZ3RoOworICAgIHdoaWxlICh0cmFpbGluZyA+IDApIHsKKyAgICAgIHNpemVfdCBzbGljZV9sZW5ndGg7CisKKyAgICAgIHRjcC0+b3V0Z29pbmdfc2xpY2VfaWR4LS07CisgICAgICBzbGljZV9sZW5ndGggPSBHUFJfU0xJQ0VfTEVOR1RIKAorICAgICAgICAgIHRjcC0+b3V0Z29pbmdfYnVmZmVyLT5zbGljZXNbdGNwLT5vdXRnb2luZ19zbGljZV9pZHhdKTsKKyAgICAgIGlmIChzbGljZV9sZW5ndGggPiB0cmFpbGluZykgeworICAgICAgICB0Y3AtPm91dGdvaW5nX2J5dGVfaWR4ID0gc2xpY2VfbGVuZ3RoIC0gdHJhaWxpbmc7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhaWxpbmcgLT0gc2xpY2VfbGVuZ3RoOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0Y3AtPm91dGdvaW5nX3NsaWNlX2lkeCA9PSB0Y3AtPm91dGdvaW5nX2J1ZmZlci0+Y291bnQpIHsKKyAgICAgIHJldHVybiBGTFVTSF9ET05FOworICAgIH0KKyAgfTsKK30KKworc3RhdGljIHZvaWQgdGNwX2hhbmRsZV93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnIC8qIGdycGNfdGNwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWFyZzsKKyAgZmx1c2hfcmVzdWx0IHN0YXR1czsKKyAgZ3JwY19jbG9zdXJlICpjYjsKKworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBjYiA9IHRjcC0+d3JpdGVfY2I7CisgICAgdGNwLT53cml0ZV9jYiA9IE5VTEw7CisgICAgY2ItPmNiKGV4ZWNfY3R4LCBjYi0+Y2JfYXJnLCAwKTsKKyAgICBUQ1BfVU5SRUYoZXhlY19jdHgsIHRjcCwgIndyaXRlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RhdHVzID0gdGNwX2ZsdXNoKHRjcCk7CisgIGlmIChzdGF0dXMgPT0gRkxVU0hfUEVORElORykgeworICAgIGdycGNfZmRfbm90aWZ5X29uX3dyaXRlKGV4ZWNfY3R4LCB0Y3AtPmVtX2ZkLCAmdGNwLT53cml0ZV9jbG9zdXJlKTsKKyAgfSBlbHNlIHsKKyAgICBjYiA9IHRjcC0+d3JpdGVfY2I7CisgICAgdGNwLT53cml0ZV9jYiA9IE5VTEw7CisgICAgR1BSX1RJTUVSX0JFR0lOKCJ0Y3BfaGFuZGxlX3dyaXRlLmNiIiwgMCk7CisgICAgY2ItPmNiKGV4ZWNfY3R4LCBjYi0+Y2JfYXJnLCBzdGF0dXMgPT0gRkxVU0hfRE9ORSk7CisgICAgR1BSX1RJTUVSX0VORCgidGNwX2hhbmRsZV93cml0ZS5jYiIsIDApOworICAgIFRDUF9VTlJFRihleGVjX2N0eCwgdGNwLCAid3JpdGUiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0Y3Bfd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKmJ1ZiwgZ3JwY19jbG9zdXJlICpjYikgeworICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7CisgIGZsdXNoX3Jlc3VsdCBzdGF0dXM7CisKKyAgaWYgKGdycGNfdGNwX3RyYWNlKSB7CisgICAgc2l6ZV90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLT5jb3VudDsgaSsrKSB7CisgICAgICBjaGFyICpkYXRhID0KKyAgICAgICAgICBncHJfZHVtcF9zbGljZShidWYtPnNsaWNlc1tpXSwgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpOworICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJXUklURSAlcDogJXMiLCB0Y3AsIGRhdGEpOworICAgICAgZ3ByX2ZyZWUoZGF0YSk7CisgICAgfQorICB9CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJ0Y3Bfd3JpdGUiLCAwKTsKKyAgR1BSX0FTU0VSVCh0Y3AtPndyaXRlX2NiID09IE5VTEwpOworCisgIGlmIChidWYtPmxlbmd0aCA9PSAwKSB7CisgICAgR1BSX1RJTUVSX0VORCgidGNwX3dyaXRlIiwgMCk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjYiwgdHJ1ZSwgTlVMTCk7CisgICAgcmV0dXJuOworICB9CisgIHRjcC0+b3V0Z29pbmdfYnVmZmVyID0gYnVmOworICB0Y3AtPm91dGdvaW5nX3NsaWNlX2lkeCA9IDA7CisgIHRjcC0+b3V0Z29pbmdfYnl0ZV9pZHggPSAwOworCisgIHN0YXR1cyA9IHRjcF9mbHVzaCh0Y3ApOworICBpZiAoc3RhdHVzID09IEZMVVNIX1BFTkRJTkcpIHsKKyAgICBUQ1BfUkVGKHRjcCwgIndyaXRlIik7CisgICAgdGNwLT53cml0ZV9jYiA9IGNiOworICAgIGdycGNfZmRfbm90aWZ5X29uX3dyaXRlKGV4ZWNfY3R4LCB0Y3AtPmVtX2ZkLCAmdGNwLT53cml0ZV9jbG9zdXJlKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBzdGF0dXMgPT0gRkxVU0hfRE9ORSwgTlVMTCk7CisgIH0KKworICBHUFJfVElNRVJfRU5EKCJ0Y3Bfd3JpdGUiLCAwKTsKK30KKworc3RhdGljIHZvaWQgdGNwX2FkZF90b19wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOworICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0LCB0Y3AtPmVtX2ZkKTsKK30KKworc3RhdGljIHZvaWQgdGNwX2FkZF90b19wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0KSB7CisgIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKKyAgZ3JwY19wb2xsc2V0X3NldF9hZGRfZmQoZXhlY19jdHgsIHBvbGxzZXRfc2V0LCB0Y3AtPmVtX2ZkKTsKK30KKworc3RhdGljIGNoYXIgKnRjcF9nZXRfcGVlcihncnBjX2VuZHBvaW50ICplcCkgeworICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7CisgIHJldHVybiBncHJfc3RyZHVwKHRjcC0+cGVlcl9zdHJpbmcpOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19lbmRwb2ludF92dGFibGUgdnRhYmxlID0geworICAgIHRjcF9yZWFkLCAgICAgdGNwX3dyaXRlLCAgIHRjcF9hZGRfdG9fcG9sbHNldCwgdGNwX2FkZF90b19wb2xsc2V0X3NldCwKKyAgICB0Y3Bfc2h1dGRvd24sIHRjcF9kZXN0cm95LCB0Y3BfZ2V0X3BlZXJ9OworCitncnBjX2VuZHBvaW50ICpncnBjX3RjcF9jcmVhdGUoZ3JwY19mZCAqZW1fZmQsIHNpemVfdCBzbGljZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBlZXJfc3RyaW5nKSB7CisgIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKilncHJfbWFsbG9jKHNpemVvZihncnBjX3RjcCkpOworICB0Y3AtPmJhc2UudnRhYmxlID0gJnZ0YWJsZTsKKyAgdGNwLT5wZWVyX3N0cmluZyA9IGdwcl9zdHJkdXAocGVlcl9zdHJpbmcpOworICB0Y3AtPmZkID0gZW1fZmQtPmZkOworICB0Y3AtPnJlYWRfY2IgPSBOVUxMOworICB0Y3AtPndyaXRlX2NiID0gTlVMTDsKKyAgdGNwLT5yZWxlYXNlX2ZkX2NiID0gTlVMTDsKKyAgdGNwLT5yZWxlYXNlX2ZkID0gTlVMTDsKKyAgdGNwLT5pbmNvbWluZ19idWZmZXIgPSBOVUxMOworICB0Y3AtPnNsaWNlX3NpemUgPSBzbGljZV9zaXplOworICB0Y3AtPmlvdl9zaXplID0gMTsKKyAgdGNwLT5maW5pc2hlZF9lZGdlID0gMTsKKyAgLyogcGFpcmVkIHdpdGggdW5yZWYgaW4gZ3JwY190Y3BfZGVzdHJveSAqLworICBncHJfcmVmX2luaXQoJnRjcC0+cmVmY291bnQsIDEpOworICB0Y3AtPmVtX2ZkID0gZW1fZmQ7CisgIHRjcC0+cmVhZF9jbG9zdXJlLmNiID0gdGNwX2hhbmRsZV9yZWFkOworICB0Y3AtPnJlYWRfY2xvc3VyZS5jYl9hcmcgPSB0Y3A7CisgIHRjcC0+d3JpdGVfY2xvc3VyZS5jYiA9IHRjcF9oYW5kbGVfd3JpdGU7CisgIHRjcC0+d3JpdGVfY2xvc3VyZS5jYl9hcmcgPSB0Y3A7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmdGNwLT5sYXN0X3JlYWRfYnVmZmVyKTsKKworICByZXR1cm4gJnRjcC0+YmFzZTsKK30KKworaW50IGdycGNfdGNwX2ZkKGdycGNfZW5kcG9pbnQgKmVwKSB7CisgIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKKyAgR1BSX0FTU0VSVChlcC0+dnRhYmxlID09ICZ2dGFibGUpOworICByZXR1cm4gZ3JwY19mZF93cmFwcGVkX2ZkKHRjcC0+ZW1fZmQpOworfQorCit2b2lkIGdycGNfdGNwX2Rlc3Ryb3lfYW5kX3JlbGVhc2VfZmQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmQsIGdycGNfY2xvc3VyZSAqZG9uZSkgeworICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZXA7CisgIEdQUl9BU1NFUlQoZXAtPnZ0YWJsZSA9PSAmdnRhYmxlKTsKKyAgdGNwLT5yZWxlYXNlX2ZkID0gZmQ7CisgIHRjcC0+cmVsZWFzZV9mZF9jYiA9IGRvbmU7CisgIFRDUF9VTlJFRihleGVjX2N0eCwgdGNwLCAiZGVzdHJveSIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCBiL3NyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWM0NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9UQ1BfUE9TSVhfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX1RDUF9QT1NJWF9ICisvKgorICAgTG93IGxldmVsIFRDUCAiYm90dG9tIGhhbGYiIGltcGxlbWVudGF0aW9uLCBmb3IgdXNlIGJ5IHRyYW5zcG9ydHMgYnVpbHQgb24KKyAgIHRvcCBvZiBhIFRDUCBjb25uZWN0aW9uLgorCisgICBOb3RlIHRoYXQgdGhpcyBmaWxlIGRvZXMgbm90ICh5ZXQpIGluY2x1ZGUgQVBJcyBmb3IgY3JlYXRpbmcgdGhlIHNvY2tldCBpbgorICAgdGhlIGZpcnN0IHBsYWNlLgorCisgICBBbGwgY2FsbHMgcGFzc2luZyBzbGljZSB0cmFuc2ZlciBvd25lcnNoaXAgb2YgYSBzbGljZSByZWZjb3VudCB1bmxlc3MKKyAgIG90aGVyd2lzZSBzcGVjaWZpZWQuCisqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiCisKKyNkZWZpbmUgR1JQQ19UQ1BfREVGQVVMVF9SRUFEX1NMSUNFX1NJWkUgODE5MgorCitleHRlcm4gaW50IGdycGNfdGNwX3RyYWNlOworCisvKiBDcmVhdGUgYSB0Y3AgZW5kcG9pbnQgZ2l2ZW4gYSBmaWxlIGRlc2NpcHRvciBhbmQgYSByZWFkIHNsaWNlIHNpemUuCisgICBUYWtlcyBvd25lcnNoaXAgb2YgZmQuICovCitncnBjX2VuZHBvaW50ICpncnBjX3RjcF9jcmVhdGUoZ3JwY19mZCAqZmQsIHNpemVfdCByZWFkX3NsaWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGVlcl9zdHJpbmcpOworCisvKiBSZXR1cm4gdGhlIHRjcCBlbmRwb2ludCdzIGZkLCBvciAtMSBpZiB0aGlzIGlzIG5vdCBhdmFpbGFibGUuIERvZXMgbm90CisgICByZWxlYXNlIHRoZSBmZC4KKyAgIFJlcXVpcmVzOiBlcCBtdXN0IGJlIGEgdGNwIGVuZHBvaW50LgorICovCitpbnQgZ3JwY190Y3BfZmQoZ3JwY19lbmRwb2ludCAqZXApOworCisvKiBEZXN0cm95IHRoZSB0Y3AgZW5kcG9pbnQgd2l0aG91dCBjbG9zaW5nIGl0cyBmZC4gKmZkIHdpbGwgYmUgc2V0IGFuZCBkb25lCisgKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBlbmRwb2ludCBpcyBkZXN0cm95ZWQuCisgKiBSZXF1aXJlczogZXAgbXVzdCBiZSBhIHRjcCBlbmRwb2ludCBhbmQgZmQgbXVzdCBub3QgYmUgTlVMTC4gKi8KK3ZvaWQgZ3JwY190Y3BfZGVzdHJveV9hbmRfcmVsZWFzZV9mZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmZCwgZ3JwY19jbG9zdXJlICpkb25lKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfVENQX1BPU0lYX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmggYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWRiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfVENQX1NFUlZFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfVENQX1NFUlZFUl9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorCisvKiBGb3J3YXJkIGRlY2wgb2YgZ3JwY190Y3Bfc2VydmVyICovCit0eXBlZGVmIHN0cnVjdCBncnBjX3RjcF9zZXJ2ZXIgZ3JwY190Y3Bfc2VydmVyOworCit0eXBlZGVmIHN0cnVjdCBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgeworICAvKiBncnBjX3RjcF9zZXJ2ZXJfY2IgZnVuY3Rpb25zIHNoYXJlIGEgcmVmIG9uIGZyb21fc2VydmVyIHRoYXQgaXMgdmFsaWQKKyAgICAgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMuICovCisgIGdycGNfdGNwX3NlcnZlciAqZnJvbV9zZXJ2ZXI7CisgIC8qIEluZGljZXMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvIGdycGNfdGNwX3NlcnZlcl9wb3J0X2ZkKCkuICovCisgIHVuc2lnbmVkIHBvcnRfaW5kZXg7CisgIHVuc2lnbmVkIGZkX2luZGV4OworfSBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3I7CisKKy8qIENhbGxlZCBmb3IgbmV3bHkgY29ubmVjdGVkIFRDUCBjb25uZWN0aW9ucy4gKi8KK3R5cGVkZWYgdm9pZCAoKmdycGNfdGNwX3NlcnZlcl9jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9hY2NlcHRvciAqYWNjZXB0b3IpOworCisvKiBDcmVhdGUgYSBzZXJ2ZXIsIGluaXRpYWxseSBub3QgYm91bmQgdG8gYW55IHBvcnRzLiBUaGUgY2FsbGVyIG93bnMgb25lIHJlZi4KKyAgIElmIHNodXRkb3duX2NvbXBsZXRlIGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIHVzZWQgYnkKKyAgIGdycGNfdGNwX3NlcnZlcl91bnJlZigpIHdoZW4gdGhlIHJlZiBjb3VudCByZWFjaGVzIHplcm8uICovCitncnBjX3RjcF9zZXJ2ZXIgKmdycGNfdGNwX3NlcnZlcl9jcmVhdGUoZ3JwY19jbG9zdXJlICpzaHV0ZG93bl9jb21wbGV0ZSk7CisKKy8qIFN0YXJ0IGxpc3RlbmluZyB0byBib3VuZCBwb3J0cyAqLwordm9pZCBncnBjX3RjcF9zZXJ2ZXJfc3RhcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190Y3Bfc2VydmVyX2NiIG9uX2FjY2VwdF9jYiwgdm9pZCAqY2JfYXJnKTsKKworLyogQWRkIGEgcG9ydCB0byB0aGUgc2VydmVyLCByZXR1cm5pbmcgdGhlIG5ld2x5IGFsbG9jYXRlZCBwb3J0IG9uIHN1Y2Nlc3MsIG9yCisgICAtMSBvbiBmYWlsdXJlLgorCisgICBUaGUgOjogYW5kIDAuMC4wLjAgd2lsZGNhcmQgYWRkcmVzc2VzIGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhY2NlcHRpbmcKKyAgIGJvdGggSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucywgYnV0IDo6IGlzIHRoZSBwcmVmZXJyZWQgc3R5bGUuICBUaGlzIHVzdWFsbHkKKyAgIGNyZWF0ZXMgb25lIHNvY2tldCwgYnV0IHBvc3NpYmx5IHR3byBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgSVB2NiwKKyAgIGJ1dCBub3QgZHVhbHN0YWNrIHNvY2tldHMuICovCisvKiBUT0RPKGN0aWxsZXIpOiBkZXByZWNhdGUgdGhpcywgYW5kIG1ha2UgZ3JwY190Y3Bfc2VydmVyX2FkZF9wb3J0cyB0byBoYW5kbGUKKyAgICAgICAgICAgICAgICAgIGFsbCBvZiB0aGUgbXVsdGlwbGUgc29ja2V0IHBvcnQgbWF0Y2hpbmcgbG9naWMgaW4gb25lIHBsYWNlICovCitpbnQgZ3JwY190Y3Bfc2VydmVyX2FkZF9wb3J0KGdycGNfdGNwX3NlcnZlciAqcywgY29uc3Qgdm9pZCAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuKTsKKworLyogTnVtYmVyIG9mIGZkcyBhdCB0aGUgZ2l2ZW4gcG9ydF9pbmRleCwgb3IgMCBpZiBwb3J0X2luZGV4IGlzIG91dCBvZgorICAgYm91bmRzLiAqLwordW5zaWduZWQgZ3JwY190Y3Bfc2VydmVyX3BvcnRfZmRfY291bnQoZ3JwY190Y3Bfc2VydmVyICpzLCB1bnNpZ25lZCBwb3J0X2luZGV4KTsKKworLyogUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBNdGggKGZkX2luZGV4KSBsaXN0ZW5pbmcgc29ja2V0IG9mIHRoZSBOdGgKKyAgIChwb3J0X2luZGV4KSBjYWxsIHRvIGFkZF9wb3J0KCkgb24gdGhpcyBzZXJ2ZXIsIG9yIC0xIGlmIHRoZSBpbmRpY2VzIGFyZSBvdXQKKyAgIG9mIGJvdW5kcy4gVGhlIGZpbGUgZGVzY3JpcHRvciByZW1haW5zIG93bmVkIGJ5IHRoZSBzZXJ2ZXIsIGFuZCB3aWxsIGJlCisgICBjbGVhbmVkIHVwIHdoZW4gdGhlIHJlZiBjb3VudCByZWFjaGVzIHplcm8uICovCitpbnQgZ3JwY190Y3Bfc2VydmVyX3BvcnRfZmQoZ3JwY190Y3Bfc2VydmVyICpzLCB1bnNpZ25lZCBwb3J0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZkX2luZGV4KTsKKworLyogUmVmIHMgYW5kIHJldHVybiBzLiAqLworZ3JwY190Y3Bfc2VydmVyICpncnBjX3RjcF9zZXJ2ZXJfcmVmKGdycGNfdGNwX3NlcnZlciAqcyk7CisKKy8qIHNodXRkb3duX3N0YXJ0aW5nIGlzIGNhbGxlZCB3aGVuIHJlZiBjb3VudCBoYXMgcmVhY2hlZCB6ZXJvIGFuZCB0aGUgc2VydmVyIGlzCisgICBhYm91dCB0byBiZSBkZXN0cm95ZWQuIFRoZSBzZXJ2ZXIgd2lsbCBiZSBkZWxldGVkIGFmdGVyIGl0IHJldHVybnMuIENhbGxpbmcKKyAgIGdycGNfdGNwX3NlcnZlcl9yZWYoKSBmcm9tIGl0IGhhcyBubyBlZmZlY3QuICovCit2b2lkIGdycGNfdGNwX3NlcnZlcl9zaHV0ZG93bl9zdGFydGluZ19hZGQoZ3JwY190Y3Bfc2VydmVyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fc3RhcnRpbmcpOworCisvKiBJZiB0aGUgcmVmY291bnQgZHJvcHMgdG8gemVybywgZGVsZXRlIHMsIGFuZCBjYWxsIChleGVjX2N0eD09TlVMTCkgb3IgZW5xdWV1ZQorICAgYSBjYWxsIChleGVjX2N0eCE9TlVMTCkgdG8gc2h1dGRvd25fY29tcGxldGUuICovCit2b2lkIGdycGNfdGNwX3NlcnZlcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfVENQX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjFiZjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYwpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyogRklYTUU6ICJwb3NpeCIgZmlsZXMgc2hvdWxkbid0IGJlIGRlcGVuZGluZyBvbiBfR05VX1NPVVJDRSAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKworI2RlZmluZSBNSU5fU0FGRV9BQ0NFUFRfUVVFVUVfU0laRSAxMDAKKworc3RhdGljIGdwcl9vbmNlIHNfaW5pdF9tYXhfYWNjZXB0X3F1ZXVlX3NpemU7CitzdGF0aWMgaW50IHNfbWF4X2FjY2VwdF9xdWV1ZV9zaXplOworCisvKiBvbmUgbGlzdGVuaW5nIHBvcnQgKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyIGdycGNfdGNwX2xpc3RlbmVyOworc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyIHsKKyAgaW50IGZkOworICBncnBjX2ZkICplbWZkOworICBncnBjX3RjcF9zZXJ2ZXIgKnNlcnZlcjsKKyAgdW5pb24geworICAgIHVpbnQ4X3QgdW50eXBlZFtHUlBDX01BWF9TT0NLQUREUl9TSVpFXTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgc29ja2FkZHI7CisgIH0gYWRkcjsKKyAgc2l6ZV90IGFkZHJfbGVuOworICBpbnQgcG9ydDsKKyAgdW5zaWduZWQgcG9ydF9pbmRleDsKKyAgdW5zaWduZWQgZmRfaW5kZXg7CisgIGdycGNfY2xvc3VyZSByZWFkX2Nsb3N1cmU7CisgIGdycGNfY2xvc3VyZSBkZXN0cm95ZWRfY2xvc3VyZTsKKyAgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyICpuZXh0OworICAvKiBXaGVuIHdlIGFkZCBhIGxpc3RlbmVyLCBtb3JlIHRoYW4gb25lIGNhbiBiZSBjcmVhdGVkLCBtYWlubHkgYmVjYXVzZSBvZgorICAgICBJUHY2LiBBIHNpYmxpbmcgd2lsbCBzdGlsbCBiZSBpbiB0aGUgbm9ybWFsIGxpc3QsIGJ1dCB3aWxsIGJlIGZsYWdnZWQKKyAgICAgYXMgc3VjaC4gQW55IGFjdGlvbiwgc3VjaCBhcyByZWYgb3IgdW5yZWYsIHdpbGwgYWZmZWN0IGFsbCBvZiB0aGUKKyAgICAgc2libGluZ3MgaW4gdGhlIGxpc3QuICovCisgIHN0cnVjdCBncnBjX3RjcF9saXN0ZW5lciAqc2libGluZzsKKyAgaW50IGlzX3NpYmxpbmc7Cit9OworCisvKiB0aGUgb3ZlcmFsbCBzZXJ2ZXIgKi8KK3N0cnVjdCBncnBjX3RjcF9zZXJ2ZXIgeworICBncHJfcmVmY291bnQgcmVmczsKKyAgLyogQ2FsbGVkIHdoZW5ldmVyIGFjY2VwdCgpIHN1Y2NlZWRzIG9uIGEgc2VydmVyIHBvcnQuICovCisgIGdycGNfdGNwX3NlcnZlcl9jYiBvbl9hY2NlcHRfY2I7CisgIHZvaWQgKm9uX2FjY2VwdF9jYl9hcmc7CisKKyAgZ3ByX211IG11OworCisgIC8qIGFjdGl2ZSBwb3J0IGNvdW50OiBob3cgbWFueSBwb3J0cyBhcmUgYWN0dWFsbHkgc3RpbGwgbGlzdGVuaW5nICovCisgIHNpemVfdCBhY3RpdmVfcG9ydHM7CisgIC8qIGRlc3Ryb3llZCBwb3J0IGNvdW50OiBob3cgbWFueSBwb3J0cyBhcmUgY29tcGxldGVseSBkZXN0cm95ZWQgKi8KKyAgc2l6ZV90IGRlc3Ryb3llZF9wb3J0czsKKworICAvKiBpcyB0aGlzIHNlcnZlciBzaHV0dGluZyBkb3duPyAoYm9vbGVhbikgKi8KKyAgaW50IHNodXRkb3duOworCisgIC8qIGxpbmtlZCBsaXN0IG9mIHNlcnZlciBwb3J0cyAqLworICBncnBjX3RjcF9saXN0ZW5lciAqaGVhZDsKKyAgZ3JwY190Y3BfbGlzdGVuZXIgKnRhaWw7CisgIHVuc2lnbmVkIG5wb3J0czsKKworICAvKiBMaXN0IG9mIGNsb3N1cmVzIHBhc3NlZCB0byBzaHV0ZG93bl9zdGFydGluZ19hZGQoKS4gKi8KKyAgZ3JwY19jbG9zdXJlX2xpc3Qgc2h1dGRvd25fc3RhcnRpbmc7CisKKyAgLyogc2h1dGRvd24gY2FsbGJhY2sgKi8KKyAgZ3JwY19jbG9zdXJlICpzaHV0ZG93bl9jb21wbGV0ZTsKKworICAvKiBhbGwgcG9sbHNldHMgaW50ZXJlc3RlZCBpbiBuZXcgY29ubmVjdGlvbnMgKi8KKyAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHM7CisgIC8qIG51bWJlciBvZiBwb2xsc2V0cyBpbiB0aGUgcG9sbHNldHMgYXJyYXkgKi8KKyAgc2l6ZV90IHBvbGxzZXRfY291bnQ7Cit9OworCitncnBjX3RjcF9zZXJ2ZXIgKmdycGNfdGNwX3NlcnZlcl9jcmVhdGUoZ3JwY19jbG9zdXJlICpzaHV0ZG93bl9jb21wbGV0ZSkgeworICBncnBjX3RjcF9zZXJ2ZXIgKnMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3RjcF9zZXJ2ZXIpKTsKKyAgZ3ByX3JlZl9pbml0KCZzLT5yZWZzLCAxKTsKKyAgZ3ByX211X2luaXQoJnMtPm11KTsKKyAgcy0+YWN0aXZlX3BvcnRzID0gMDsKKyAgcy0+ZGVzdHJveWVkX3BvcnRzID0gMDsKKyAgcy0+c2h1dGRvd24gPSAwOworICBzLT5zaHV0ZG93bl9zdGFydGluZy5oZWFkID0gTlVMTDsKKyAgcy0+c2h1dGRvd25fc3RhcnRpbmcudGFpbCA9IE5VTEw7CisgIHMtPnNodXRkb3duX2NvbXBsZXRlID0gc2h1dGRvd25fY29tcGxldGU7CisgIHMtPm9uX2FjY2VwdF9jYiA9IE5VTEw7CisgIHMtPm9uX2FjY2VwdF9jYl9hcmcgPSBOVUxMOworICBzLT5oZWFkID0gTlVMTDsKKyAgcy0+dGFpbCA9IE5VTEw7CisgIHMtPm5wb3J0cyA9IDA7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqcykgeworICBpZiAocy0+c2h1dGRvd25fY29tcGxldGUgIT0gTlVMTCkgeworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcy0+c2h1dGRvd25fY29tcGxldGUsIHRydWUsIE5VTEwpOworICB9CisKKyAgZ3ByX211X2Rlc3Ryb3koJnMtPm11KTsKKworICB3aGlsZSAocy0+aGVhZCkgeworICAgIGdycGNfdGNwX2xpc3RlbmVyICpzcCA9IHMtPmhlYWQ7CisgICAgcy0+aGVhZCA9IHNwLT5uZXh0OworICAgIGdwcl9mcmVlKHNwKTsKKyAgfQorCisgIGdwcl9mcmVlKHMpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95ZWRfcG9ydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfdGNwX3NlcnZlciAqcyA9IHNlcnZlcjsKKyAgZ3ByX211X2xvY2soJnMtPm11KTsKKyAgcy0+ZGVzdHJveWVkX3BvcnRzKys7CisgIGlmIChzLT5kZXN0cm95ZWRfcG9ydHMgPT0gcy0+bnBvcnRzKSB7CisgICAgZ3ByX211X3VubG9jaygmcy0+bXUpOworICAgIGZpbmlzaF9zaHV0ZG93bihleGVjX2N0eCwgcyk7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVChzLT5kZXN0cm95ZWRfcG9ydHMgPCBzLT5ucG9ydHMpOworICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgfQorfQorCisvKiBjYWxsZWQgd2hlbiBhbGwgbGlzdGVuaW5nIGVuZHBvaW50cyBoYXZlIGJlZW4gc2h1dGRvd24sIHNvIG5vIGZ1cnRoZXIKKyAgIGV2ZW50cyB3aWxsIGJlIHJlY2VpdmVkIG9uIHRoZW0gLSBhdCB0aGlzIHBvaW50IGl0J3Mgc2FmZSB0byBkZXN0cm95CisgICB0aGluZ3MgKi8KK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVkX2FsbF9wb3J0cyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7CisgIC8qIGRlbGV0ZSBBTEwgdGhlIHRoaW5ncyAqLworICBncHJfbXVfbG9jaygmcy0+bXUpOworCisgIGlmICghcy0+c2h1dGRvd24pIHsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHMtPmhlYWQpIHsKKyAgICBncnBjX3RjcF9saXN0ZW5lciAqc3A7CisgICAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CisgICAgICBncnBjX3VubGlua19pZl91bml4X2RvbWFpbl9zb2NrZXQoJnNwLT5hZGRyLnNvY2thZGRyKTsKKyAgICAgIHNwLT5kZXN0cm95ZWRfY2xvc3VyZS5jYiA9IGRlc3Ryb3llZF9wb3J0OworICAgICAgc3AtPmRlc3Ryb3llZF9jbG9zdXJlLmNiX2FyZyA9IHM7CisgICAgICBncnBjX2ZkX29ycGhhbihleGVjX2N0eCwgc3AtPmVtZmQsICZzcC0+ZGVzdHJveWVkX2Nsb3N1cmUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAidGNwX2xpc3RlbmVyX3NodXRkb3duIik7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgfSBlbHNlIHsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0Y3Bfc2VydmVyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqcykgeworICBncHJfbXVfbG9jaygmcy0+bXUpOworCisgIEdQUl9BU1NFUlQoIXMtPnNodXRkb3duKTsKKyAgcy0+c2h1dGRvd24gPSAxOworCisgIC8qIHNodXRkb3duIGFsbCBmZCdzICovCisgIGlmIChzLT5hY3RpdmVfcG9ydHMpIHsKKyAgICBncnBjX3RjcF9saXN0ZW5lciAqc3A7CisgICAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CisgICAgICBncnBjX2ZkX3NodXRkb3duKGV4ZWNfY3R4LCBzcC0+ZW1mZCk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgfSBlbHNlIHsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgICAgZGVhY3RpdmF0ZWRfYWxsX3BvcnRzKGV4ZWNfY3R4LCBzKTsKKyAgfQorfQorCisvKiBnZXQgbWF4IGxpc3RlbiBxdWV1ZSBzaXplIG9uIGxpbnV4ICovCitzdGF0aWMgdm9pZCBpbml0X21heF9hY2NlcHRfcXVldWVfc2l6ZSh2b2lkKSB7CisgIGludCBuID0gU09NQVhDT05OOworICBjaGFyIGJ1Zls2NF07CisgIEZJTEUgKmZwID0gZm9wZW4oIi9wcm9jL3N5cy9uZXQvY29yZS9zb21heGNvbm4iLCAiciIpOworICBpZiAoZnAgPT0gTlVMTCkgeworICAgIC8qIDIuNCBrZXJuZWwuICovCisgICAgc19tYXhfYWNjZXB0X3F1ZXVlX3NpemUgPSBTT01BWENPTk47CisgICAgcmV0dXJuOworICB9CisgIGlmIChmZ2V0cyhidWYsIHNpemVvZiBidWYsIGZwKSkgeworICAgIGNoYXIgKmVuZDsKKyAgICBsb25nIGkgPSBzdHJ0b2woYnVmLCAmZW5kLCAxMCk7CisgICAgaWYgKGkgPiAwICYmIGkgPD0gSU5UX01BWCAmJiBlbmQgJiYgKmVuZCA9PSAwKSB7CisgICAgICBuID0gKGludClpOworICAgIH0KKyAgfQorICBmY2xvc2UoZnApOworICBzX21heF9hY2NlcHRfcXVldWVfc2l6ZSA9IG47CisKKyAgaWYgKHNfbWF4X2FjY2VwdF9xdWV1ZV9zaXplIDwgTUlOX1NBRkVfQUNDRVBUX1FVRVVFX1NJWkUpIHsKKyAgICBncHJfbG9nKEdQUl9JTkZPLAorICAgICAgICAgICAgIlN1c3BpY2lvdXNseSBzbWFsbCBhY2NlcHQgcXVldWUgKCVkKSB3aWxsIHByb2JhYmx5IGxlYWQgdG8gIgorICAgICAgICAgICAgImNvbm5lY3Rpb24gZHJvcHMiLAorICAgICAgICAgICAgc19tYXhfYWNjZXB0X3F1ZXVlX3NpemUpOworICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X21heF9hY2NlcHRfcXVldWVfc2l6ZSh2b2lkKSB7CisgIGdwcl9vbmNlX2luaXQoJnNfaW5pdF9tYXhfYWNjZXB0X3F1ZXVlX3NpemUsIGluaXRfbWF4X2FjY2VwdF9xdWV1ZV9zaXplKTsKKyAgcmV0dXJuIHNfbWF4X2FjY2VwdF9xdWV1ZV9zaXplOworfQorCisvKiBQcmVwYXJlIGEgcmVjZW50bHktY3JlYXRlZCBzb2NrZXQgZm9yIGxpc3RlbmluZy4gKi8KK3N0YXRpYyBpbnQgcHJlcGFyZV9zb2NrZXQoaW50IGZkLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZGRyX2xlbikgeworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzb2NrbmFtZV90ZW1wOworICBzb2NrbGVuX3Qgc29ja25hbWVfbGVuOworCisgIGlmIChmZCA8IDApIHsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKCFncnBjX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcoZmQsIDEpIHx8ICFncnBjX3NldF9zb2NrZXRfY2xvZXhlYyhmZCwgMSkgfHwKKyAgICAgICghZ3JwY19pc191bml4X3NvY2tldChhZGRyKSAmJiAoIWdycGNfc2V0X3NvY2tldF9sb3dfbGF0ZW5jeShmZCwgMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWdycGNfc2V0X3NvY2tldF9yZXVzZV9hZGRyKGZkLCAxKSkpIHx8CisgICAgICAhZ3JwY19zZXRfc29ja2V0X25vX3NpZ3BpcGVfaWZfcG9zc2libGUoZmQpKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmFibGUgdG8gY29uZmlndXJlIHNvY2tldCAlZDogJXMiLCBmZCwKKyAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIEdQUl9BU1NFUlQoYWRkcl9sZW4gPCB+KHNvY2tsZW5fdCkwKTsKKyAgaWYgKGJpbmQoZmQsIGFkZHIsIChzb2NrbGVuX3QpYWRkcl9sZW4pIDwgMCkgeworICAgIGNoYXIgKmFkZHJfc3RyOworICAgIGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKCZhZGRyX3N0ciwgYWRkciwgMCk7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJiaW5kIGFkZHI9JXM6ICVzIiwgYWRkcl9zdHIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZ3ByX2ZyZWUoYWRkcl9zdHIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAobGlzdGVuKGZkLCBnZXRfbWF4X2FjY2VwdF9xdWV1ZV9zaXplKCkpIDwgMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAibGlzdGVuOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHNvY2tuYW1lX2xlbiA9IHNpemVvZihzb2NrbmFtZV90ZW1wKTsKKyAgaWYgKGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXAsICZzb2NrbmFtZV9sZW4pIDwgMCkgeworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByZXR1cm4gZ3JwY19zb2NrYWRkcl9nZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXApOworCitlcnJvcjoKKyAgaWYgKGZkID49IDApIHsKKyAgICBjbG9zZShmZCk7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvKiBldmVudCBtYW5hZ2VyIGNhbGxiYWNrIHdoZW4gcmVhZHMgYXJlIHJlYWR5ICovCitzdGF0aWMgdm9pZCBvbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBncnBjX3RjcF9saXN0ZW5lciAqc3AgPSBhcmc7CisgIGdycGNfdGNwX3NlcnZlcl9hY2NlcHRvciBhY2NlcHRvciA9IHtzcC0+c2VydmVyLCBzcC0+cG9ydF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5mZF9pbmRleH07CisgIGdycGNfZmQgKmZkb2JqOworICBzaXplX3QgaTsKKworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogbG9vcCB1bnRpbCBhY2NlcHQ0IHJldHVybnMgRUFHQUlOLCBhbmQgdGhlbiByZS1hcm0gbm90aWZpY2F0aW9uICovCisgIGZvciAoOzspIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworICAgIGNoYXIgKmFkZHJfc3RyOworICAgIGNoYXIgKm5hbWU7CisgICAgLyogTm90ZTogSWYgd2UgZXZlciBkZWNpZGUgdG8gcmV0dXJuIHRoaXMgYWRkcmVzcyB0byB0aGUgdXNlciwgcmVtZW1iZXIgdG8KKyAgICAgICBzdHJpcCBvZmYgdGhlIDo6ZmZmZjowLjAuMC4wLzk2IHByZWZpeCBmaXJzdC4gKi8KKyAgICBpbnQgZmQgPSBncnBjX2FjY2VwdDQoc3AtPmZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuLCAxLCAxKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgIGNhc2UgRUlOVFI6CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgICAgIGdycGNfZmRfbm90aWZ5X29uX3JlYWQoZXhlY19jdHgsIHNwLT5lbWZkLCAmc3AtPnJlYWRfY2xvc3VyZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRmFpbGVkIGFjY2VwdDQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgIH0KKworICAgIGdycGNfc2V0X3NvY2tldF9ub19zaWdwaXBlX2lmX3Bvc3NpYmxlKGZkKTsKKworICAgIGFkZHJfc3RyID0gZ3JwY19zb2NrYWRkcl90b191cmkoKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyKTsKKyAgICBncHJfYXNwcmludGYoJm5hbWUsICJ0Y3Atc2VydmVyLWNvbm5lY3Rpb246JXMiLCBhZGRyX3N0cik7CisKKyAgICBpZiAoZ3JwY190Y3BfdHJhY2UpIHsKKyAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiU0VSVkVSX0NPTk5FQ1Q6IGluY29taW5nIGNvbm5lY3Rpb246ICVzIiwgYWRkcl9zdHIpOworICAgIH0KKworICAgIGZkb2JqID0gZ3JwY19mZF9jcmVhdGUoZmQsIG5hbWUpOworICAgIC8qIFRPRE8oY3RpbGxlcik6IHJldmlzZSB0aGlzIHdoZW4gd2UgaGF2ZSBzZXJ2ZXItc2lkZSBzaGFyZGluZworICAgICAgIG9mIGNoYW5uZWxzIC0tIHdlIGNlcnRhaW5seSBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgYWRkaW5nIGV2ZXJ5CisgICAgICAgaW5jb21pbmcgY2hhbm5lbCB0byBldmVyeSBwb2xsc2V0IG93bmVkIGJ5IHRoZSBzZXJ2ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3AtPnNlcnZlci0+cG9sbHNldF9jb3VudDsgaSsrKSB7CisgICAgICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBzcC0+c2VydmVyLT5wb2xsc2V0c1tpXSwgZmRvYmopOworICAgIH0KKyAgICBzcC0+c2VydmVyLT5vbl9hY2NlcHRfY2IoCisgICAgICAgIGV4ZWNfY3R4LCBzcC0+c2VydmVyLT5vbl9hY2NlcHRfY2JfYXJnLAorICAgICAgICBncnBjX3RjcF9jcmVhdGUoZmRvYmosIEdSUENfVENQX0RFRkFVTFRfUkVBRF9TTElDRV9TSVpFLCBhZGRyX3N0ciksCisgICAgICAgICZhY2NlcHRvcik7CisKKyAgICBncHJfZnJlZShuYW1lKTsKKyAgICBncHJfZnJlZShhZGRyX3N0cik7CisgIH0KKworICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKKworZXJyb3I6CisgIGdwcl9tdV9sb2NrKCZzcC0+c2VydmVyLT5tdSk7CisgIGlmICgwID09IC0tc3AtPnNlcnZlci0+YWN0aXZlX3BvcnRzKSB7CisgICAgZ3ByX211X3VubG9jaygmc3AtPnNlcnZlci0+bXUpOworICAgIGRlYWN0aXZhdGVkX2FsbF9wb3J0cyhleGVjX2N0eCwgc3AtPnNlcnZlcik7CisgIH0gZWxzZSB7CisgICAgZ3ByX211X3VubG9jaygmc3AtPnNlcnZlci0+bXUpOworICB9Cit9CisKK3N0YXRpYyBncnBjX3RjcF9saXN0ZW5lciAqYWRkX3NvY2tldF90b19zZXJ2ZXIoZ3JwY190Y3Bfc2VydmVyICpzLCBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3J0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmZF9pbmRleCkgeworICBncnBjX3RjcF9saXN0ZW5lciAqc3AgPSBOVUxMOworICBpbnQgcG9ydDsKKyAgY2hhciAqYWRkcl9zdHI7CisgIGNoYXIgKm5hbWU7CisKKyAgcG9ydCA9IHByZXBhcmVfc29ja2V0KGZkLCBhZGRyLCBhZGRyX2xlbik7CisgIGlmIChwb3J0ID49IDApIHsKKyAgICBncnBjX3NvY2thZGRyX3RvX3N0cmluZygmYWRkcl9zdHIsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgMSk7CisgICAgZ3ByX2FzcHJpbnRmKCZuYW1lLCAidGNwLXNlcnZlci1saXN0ZW5lcjolcyIsIGFkZHJfc3RyKTsKKyAgICBncHJfbXVfbG9jaygmcy0+bXUpOworICAgIHMtPm5wb3J0cysrOworICAgIEdQUl9BU1NFUlQoIXMtPm9uX2FjY2VwdF9jYiAmJiAibXVzdCBhZGQgcG9ydHMgYmVmb3JlIHN0YXJ0aW5nIHNlcnZlciIpOworICAgIHNwID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY190Y3BfbGlzdGVuZXIpKTsKKyAgICBzcC0+bmV4dCA9IE5VTEw7CisgICAgaWYgKHMtPmhlYWQgPT0gTlVMTCkgeworICAgICAgcy0+aGVhZCA9IHNwOworICAgIH0gZWxzZSB7CisgICAgICBzLT50YWlsLT5uZXh0ID0gc3A7CisgICAgfQorICAgIHMtPnRhaWwgPSBzcDsKKyAgICBzcC0+c2VydmVyID0gczsKKyAgICBzcC0+ZmQgPSBmZDsKKyAgICBzcC0+ZW1mZCA9IGdycGNfZmRfY3JlYXRlKGZkLCBuYW1lKTsKKyAgICBtZW1jcHkoc3AtPmFkZHIudW50eXBlZCwgYWRkciwgYWRkcl9sZW4pOworICAgIHNwLT5hZGRyX2xlbiA9IGFkZHJfbGVuOworICAgIHNwLT5wb3J0ID0gcG9ydDsKKyAgICBzcC0+cG9ydF9pbmRleCA9IHBvcnRfaW5kZXg7CisgICAgc3AtPmZkX2luZGV4ID0gZmRfaW5kZXg7CisgICAgc3AtPmlzX3NpYmxpbmcgPSAwOworICAgIHNwLT5zaWJsaW5nID0gTlVMTDsKKyAgICBHUFJfQVNTRVJUKHNwLT5lbWZkKTsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgICAgZ3ByX2ZyZWUoYWRkcl9zdHIpOworICAgIGdwcl9mcmVlKG5hbWUpOworICB9CisKKyAgcmV0dXJuIHNwOworfQorCitpbnQgZ3JwY190Y3Bfc2VydmVyX2FkZF9wb3J0KGdycGNfdGNwX3NlcnZlciAqcywgY29uc3Qgdm9pZCAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuKSB7CisgIGdycGNfdGNwX2xpc3RlbmVyICpzcDsKKyAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwMiA9IE5VTEw7CisgIGludCBmZDsKKyAgZ3JwY19kdWFsc3RhY2tfbW9kZSBkc21vZGU7CisgIHN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjZfdjRtYXBwZWQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiB3aWxkNDsKKyAgc3RydWN0IHNvY2thZGRyX2luNiB3aWxkNjsKKyAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI0X2NvcHk7CisgIHN0cnVjdCBzb2NrYWRkciAqYWxsb2NhdGVkX2FkZHIgPSBOVUxMOworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzb2NrbmFtZV90ZW1wOworICBzb2NrbGVuX3Qgc29ja25hbWVfbGVuOworICBpbnQgcG9ydDsKKyAgdW5zaWduZWQgcG9ydF9pbmRleCA9IDA7CisgIHVuc2lnbmVkIGZkX2luZGV4ID0gMDsKKyAgaWYgKHMtPnRhaWwgIT0gTlVMTCkgeworICAgIHBvcnRfaW5kZXggPSBzLT50YWlsLT5wb3J0X2luZGV4ICsgMTsKKyAgfQorICBncnBjX3VubGlua19pZl91bml4X2RvbWFpbl9zb2NrZXQoKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIpOworCisgIC8qIENoZWNrIGlmIHRoaXMgaXMgYSB3aWxkY2FyZCBwb3J0LCBhbmQgaWYgc28sIHRyeSB0byBrZWVwIHRoZSBwb3J0IHRoZSBzYW1lCisgICAgIGFzIHNvbWUgcHJldmlvdXNseSBjcmVhdGVkIGxpc3RlbmVyLiAqLworICBpZiAoZ3JwY19zb2NrYWRkcl9nZXRfcG9ydChhZGRyKSA9PSAwKSB7CisgICAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CisgICAgICBzb2NrbmFtZV9sZW4gPSBzaXplb2Yoc29ja25hbWVfdGVtcCk7CisgICAgICBpZiAoMCA9PSBnZXRzb2NrbmFtZShzcC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrbmFtZV9sZW4pKSB7CisgICAgICAgIHBvcnQgPSBncnBjX3NvY2thZGRyX2dldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCk7CisgICAgICAgIGlmIChwb3J0ID4gMCkgeworICAgICAgICAgIGFsbG9jYXRlZF9hZGRyID0gbWFsbG9jKGFkZHJfbGVuKTsKKyAgICAgICAgICBtZW1jcHkoYWxsb2NhdGVkX2FkZHIsIGFkZHIsIGFkZHJfbGVuKTsKKyAgICAgICAgICBncnBjX3NvY2thZGRyX3NldF9wb3J0KGFsbG9jYXRlZF9hZGRyLCBwb3J0KTsKKyAgICAgICAgICBhZGRyID0gYWxsb2NhdGVkX2FkZHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzcCA9IE5VTEw7CisKKyAgaWYgKGdycGNfc29ja2FkZHJfdG9fdjRtYXBwZWQoYWRkciwgJmFkZHI2X3Y0bWFwcGVkKSkgeworICAgIGFkZHIgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHI2X3Y0bWFwcGVkOworICAgIGFkZHJfbGVuID0gc2l6ZW9mKGFkZHI2X3Y0bWFwcGVkKTsKKyAgfQorCisgIC8qIFRyZWF0IDo6IG9yIDAuMC4wLjAgYXMgYSBmYW1pbHktYWdub3N0aWMgd2lsZGNhcmQuICovCisgIGlmIChncnBjX3NvY2thZGRyX2lzX3dpbGRjYXJkKGFkZHIsICZwb3J0KSkgeworICAgIGdycGNfc29ja2FkZHJfbWFrZV93aWxkY2FyZHMocG9ydCwgJndpbGQ0LCAmd2lsZDYpOworCisgICAgLyogVHJ5IGxpc3RlbmluZyBvbiBJUHY2IGZpcnN0LiAqLworICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJndpbGQ2OworICAgIGFkZHJfbGVuID0gc2l6ZW9mKHdpbGQ2KTsKKyAgICBmZCA9IGdycGNfY3JlYXRlX2R1YWxzdGFja19zb2NrZXQoYWRkciwgU09DS19TVFJFQU0sIDAsICZkc21vZGUpOworICAgIHNwID0gYWRkX3NvY2tldF90b19zZXJ2ZXIocywgZmQsIGFkZHIsIGFkZHJfbGVuLCBwb3J0X2luZGV4LCBmZF9pbmRleCk7CisgICAgaWYgKGZkID49IDAgJiYgZHNtb2RlID09IEdSUENfRFNNT0RFX0RVQUxTVEFDSykgeworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBpZiAoc3AgIT0gTlVMTCkgeworICAgICAgKytmZF9pbmRleDsKKyAgICB9CisgICAgLyogSWYgd2UgZGlkbid0IGdldCBhIGR1YWxzdGFjayBzb2NrZXQsIGFsc28gbGlzdGVuIG9uIDAuMC4wLjAuICovCisgICAgaWYgKHBvcnQgPT0gMCAmJiBzcCAhPSBOVUxMKSB7CisgICAgICBncnBjX3NvY2thZGRyX3NldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZDQsIHNwLT5wb3J0KTsKKyAgICB9CisgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZDQ7CisgICAgYWRkcl9sZW4gPSBzaXplb2Yod2lsZDQpOworICB9CisKKyAgZmQgPSBncnBjX2NyZWF0ZV9kdWFsc3RhY2tfc29ja2V0KGFkZHIsIFNPQ0tfU1RSRUFNLCAwLCAmZHNtb2RlKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZHNtb2RlID09IEdSUENfRFNNT0RFX0lQVjQgJiYKKyAgICAgICAgZ3JwY19zb2NrYWRkcl9pc192NG1hcHBlZChhZGRyLCAmYWRkcjRfY29weSkpIHsKKyAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI0X2NvcHk7CisgICAgICBhZGRyX2xlbiA9IHNpemVvZihhZGRyNF9jb3B5KTsKKyAgICB9CisgICAgc3AyID0gc3A7CisgICAgc3AgPSBhZGRfc29ja2V0X3RvX3NlcnZlcihzLCBmZCwgYWRkciwgYWRkcl9sZW4sIHBvcnRfaW5kZXgsIGZkX2luZGV4KTsKKyAgICBpZiAoc3AyICE9IE5VTEwgJiYgc3AgIT0gTlVMTCkgeworICAgICAgc3AyLT5zaWJsaW5nID0gc3A7CisgICAgICBzcC0+aXNfc2libGluZyA9IDE7CisgICAgfQorICB9CisKK2RvbmU6CisgIGdwcl9mcmVlKGFsbG9jYXRlZF9hZGRyKTsKKyAgaWYgKHNwICE9IE5VTEwpIHsKKyAgICByZXR1cm4gc3AtPnBvcnQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK3Vuc2lnbmVkIGdycGNfdGNwX3NlcnZlcl9wb3J0X2ZkX2NvdW50KGdycGNfdGNwX3NlcnZlciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvcnRfaW5kZXgpIHsKKyAgdW5zaWduZWQgbnVtX2ZkcyA9IDA7CisgIGdycGNfdGNwX2xpc3RlbmVyICpzcDsKKyAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwICYmIHBvcnRfaW5kZXggIT0gMDsgc3AgPSBzcC0+bmV4dCkgeworICAgIGlmICghc3AtPmlzX3NpYmxpbmcpIHsKKyAgICAgIC0tcG9ydF9pbmRleDsKKyAgICB9CisgIH0KKyAgZm9yICg7IHNwOyBzcCA9IHNwLT5zaWJsaW5nLCArK251bV9mZHMpCisgICAgOworICByZXR1cm4gbnVtX2ZkczsKK30KKworaW50IGdycGNfdGNwX3NlcnZlcl9wb3J0X2ZkKGdycGNfdGNwX3NlcnZlciAqcywgdW5zaWduZWQgcG9ydF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmZF9pbmRleCkgeworICBncnBjX3RjcF9saXN0ZW5lciAqc3A7CisgIGZvciAoc3AgPSBzLT5oZWFkOyBzcCAmJiBwb3J0X2luZGV4ICE9IDA7IHNwID0gc3AtPm5leHQpIHsKKyAgICBpZiAoIXNwLT5pc19zaWJsaW5nKSB7CisgICAgICAtLXBvcnRfaW5kZXg7CisgICAgfQorICB9CisgIGZvciAoOyBzcCAmJiBmZF9pbmRleCAhPSAwOyBzcCA9IHNwLT5zaWJsaW5nLCAtLWZkX2luZGV4KQorICAgIDsKKyAgaWYgKHNwKSB7CisgICAgcmV0dXJuIHNwLT5mZDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKwordm9pZCBncnBjX3RjcF9zZXJ2ZXJfc3RhcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzLCBzaXplX3QgcG9sbHNldF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9jYiBvbl9hY2NlcHRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvbl9hY2NlcHRfY2JfYXJnKSB7CisgIHNpemVfdCBpOworICBncnBjX3RjcF9saXN0ZW5lciAqc3A7CisgIEdQUl9BU1NFUlQob25fYWNjZXB0X2NiKTsKKyAgZ3ByX211X2xvY2soJnMtPm11KTsKKyAgR1BSX0FTU0VSVCghcy0+b25fYWNjZXB0X2NiKTsKKyAgR1BSX0FTU0VSVChzLT5hY3RpdmVfcG9ydHMgPT0gMCk7CisgIHMtPm9uX2FjY2VwdF9jYiA9IG9uX2FjY2VwdF9jYjsKKyAgcy0+b25fYWNjZXB0X2NiX2FyZyA9IG9uX2FjY2VwdF9jYl9hcmc7CisgIHMtPnBvbGxzZXRzID0gcG9sbHNldHM7CisgIHMtPnBvbGxzZXRfY291bnQgPSBwb2xsc2V0X2NvdW50OworICBmb3IgKHNwID0gcy0+aGVhZDsgc3A7IHNwID0gc3AtPm5leHQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcG9sbHNldF9jb3VudDsgaSsrKSB7CisgICAgICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0c1tpXSwgc3AtPmVtZmQpOworICAgIH0KKyAgICBzcC0+cmVhZF9jbG9zdXJlLmNiID0gb25fcmVhZDsKKyAgICBzcC0+cmVhZF9jbG9zdXJlLmNiX2FyZyA9IHNwOworICAgIGdycGNfZmRfbm90aWZ5X29uX3JlYWQoZXhlY19jdHgsIHNwLT5lbWZkLCAmc3AtPnJlYWRfY2xvc3VyZSk7CisgICAgcy0+YWN0aXZlX3BvcnRzKys7CisgIH0KKyAgZ3ByX211X3VubG9jaygmcy0+bXUpOworfQorCitncnBjX3RjcF9zZXJ2ZXIgKmdycGNfdGNwX3NlcnZlcl9yZWYoZ3JwY190Y3Bfc2VydmVyICpzKSB7CisgIGdwcl9yZWYoJnMtPnJlZnMpOworICByZXR1cm4gczsKK30KKwordm9pZCBncnBjX3RjcF9zZXJ2ZXJfc2h1dGRvd25fc3RhcnRpbmdfYWRkKGdycGNfdGNwX3NlcnZlciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKnNodXRkb3duX3N0YXJ0aW5nKSB7CisgIGdwcl9tdV9sb2NrKCZzLT5tdSk7CisgIGdycGNfY2xvc3VyZV9saXN0X2FkZCgmcy0+c2h1dGRvd25fc3RhcnRpbmcsIHNodXRkb3duX3N0YXJ0aW5nLCAxKTsKKyAgZ3ByX211X3VubG9jaygmcy0+bXUpOworfQorCit2b2lkIGdycGNfdGNwX3NlcnZlcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7CisgIGlmIChncHJfdW5yZWYoJnMtPnJlZnMpKSB7CisgICAgLyogQ29tcGxldGUgc2h1dGRvd25fc3RhcnRpbmcgd29yayBiZWZvcmUgZGVzdHJveWluZy4gKi8KKyAgICBncnBjX2V4ZWNfY3R4IGxvY2FsX2V4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoJmxvY2FsX2V4ZWNfY3R4LCAmcy0+c2h1dGRvd25fc3RhcnRpbmcsIE5VTEwpOworICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgICBpZiAoZXhlY19jdHggPT0gTlVMTCkgeworICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaCgmbG9jYWxfZXhlY19jdHgpOworICAgICAgdGNwX3NlcnZlcl9kZXN0cm95KCZsb2NhbF9leGVjX2N0eCwgcyk7CisgICAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmbG9jYWxfZXhlY19jdHgpOworICAgIH0gZWxzZSB7CisgICAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmbG9jYWxfZXhlY19jdHgpOworICAgICAgdGNwX3NlcnZlcl9kZXN0cm95KGV4ZWNfY3R4LCBzKTsKKyAgICB9CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2YTI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfV0lOU09DS19TT0NLRVQKKworI2luY2x1ZGUgPGlvLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nX3dpbjMyLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oIgorCisjZGVmaW5lIE1JTl9TQUZFX0FDQ0VQVF9RVUVVRV9TSVpFIDEwMAorCisvKiBvbmUgbGlzdGVuaW5nIHBvcnQgKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyIGdycGNfdGNwX2xpc3RlbmVyOworc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyIHsKKyAgLyogVGhpcyBzZWVtaW5nbHkgbWFnaWMgbnVtYmVyIGNvbWVzIGZyb20gQWNjZXB0RXgncyBkb2N1bWVudGF0aW9uLiBlYWNoCisgICAgIGFkZHJlc3MgYnVmZmVyIG5lZWRzIHRvIGhhdmUgYXQgbGVhc3QgMTYgbW9yZSBieXRlcyBhdCB0aGVpciBlbmQuICovCisgIHVpbnQ4X3QgYWRkcmVzc2VzWyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgKyAxNikgKiAyXTsKKyAgLyogVGhpcyB3aWxsIGhvbGQgdGhlIHNvY2tldCBmb3IgdGhlIG5leHQgYWNjZXB0LiAqLworICBTT0NLRVQgbmV3X3NvY2tldDsKKyAgLyogVGhlIGxpc3RlbmVyIHdpbnNvY2tldC4gKi8KKyAgZ3JwY193aW5zb2NrZXQgKnNvY2tldDsKKyAgLyogVGhlIGFjdHVhbCBUQ1AgcG9ydCBudW1iZXIuICovCisgIGludCBwb3J0OworICB1bnNpZ25lZCBwb3J0X2luZGV4OworICBncnBjX3RjcF9zZXJ2ZXIgKnNlcnZlcjsKKyAgLyogVGhlIGNhY2hlZCBBY2NlcHRFeCBmb3IgdGhhdCBwb3J0LiAqLworICBMUEZOX0FDQ0VQVEVYIEFjY2VwdEV4OworICBpbnQgc2h1dHRpbmdfZG93bjsKKyAgLyogY2xvc3VyZSBmb3Igc29ja2V0IG5vdGlmaWNhdGlvbiBvZiBhY2NlcHQgYmVpbmcgcmVhZHkgKi8KKyAgZ3JwY19jbG9zdXJlIG9uX2FjY2VwdDsKKyAgLyogbGlua2VkIGxpc3QgKi8KKyAgc3RydWN0IGdycGNfdGNwX2xpc3RlbmVyICpuZXh0OworfTsKKworLyogdGhlIG92ZXJhbGwgc2VydmVyICovCitzdHJ1Y3QgZ3JwY190Y3Bfc2VydmVyIHsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7CisgIC8qIENhbGxlZCB3aGVuZXZlciBhY2NlcHQoKSBzdWNjZWVkcyBvbiBhIHNlcnZlciBwb3J0LiAqLworICBncnBjX3RjcF9zZXJ2ZXJfY2Igb25fYWNjZXB0X2NiOworICB2b2lkICpvbl9hY2NlcHRfY2JfYXJnOworCisgIGdwcl9tdSBtdTsKKworICAvKiBhY3RpdmUgcG9ydCBjb3VudDogaG93IG1hbnkgcG9ydHMgYXJlIGFjdHVhbGx5IHN0aWxsIGxpc3RlbmluZyAqLworICBpbnQgYWN0aXZlX3BvcnRzOworCisgIC8qIGxpbmtlZCBsaXN0IG9mIHNlcnZlciBwb3J0cyAqLworICBncnBjX3RjcF9saXN0ZW5lciAqaGVhZDsKKyAgZ3JwY190Y3BfbGlzdGVuZXIgKnRhaWw7CisKKyAgLyogTGlzdCBvZiBjbG9zdXJlcyBwYXNzZWQgdG8gc2h1dGRvd25fc3RhcnRpbmdfYWRkKCkuICovCisgIGdycGNfY2xvc3VyZV9saXN0IHNodXRkb3duX3N0YXJ0aW5nOworCisgIC8qIHNodXRkb3duIGNhbGxiYWNrICovCisgIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fY29tcGxldGU7Cit9OworCisvKiBQdWJsaWMgZnVuY3Rpb24uIEFsbG9jYXRlcyB0aGUgcHJvcGVyIGRhdGEgc3RydWN0dXJlcyB0byBob2xkIGEKKyAgIGdycGNfdGNwX3NlcnZlci4gKi8KK2dycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX2NyZWF0ZShncnBjX2Nsb3N1cmUgKnNodXRkb3duX2NvbXBsZXRlKSB7CisgIGdycGNfdGNwX3NlcnZlciAqcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfdGNwX3NlcnZlcikpOworICBncHJfcmVmX2luaXQoJnMtPnJlZnMsIDEpOworICBncHJfbXVfaW5pdCgmcy0+bXUpOworICBzLT5hY3RpdmVfcG9ydHMgPSAwOworICBzLT5vbl9hY2NlcHRfY2IgPSBOVUxMOworICBzLT5vbl9hY2NlcHRfY2JfYXJnID0gTlVMTDsKKyAgcy0+aGVhZCA9IE5VTEw7CisgIHMtPnRhaWwgPSBOVUxMOworICBzLT5zaHV0ZG93bl9zdGFydGluZy5oZWFkID0gTlVMTDsKKyAgcy0+c2h1dGRvd25fc3RhcnRpbmcudGFpbCA9IE5VTEw7CisgIHMtPnNodXRkb3duX2NvbXBsZXRlID0gc2h1dGRvd25fY29tcGxldGU7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGNwX3NlcnZlciAqcykgeworICBpZiAocy0+c2h1dGRvd25fY29tcGxldGUgIT0gTlVMTCkgeworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgcy0+c2h1dGRvd25fY29tcGxldGUsIHRydWUsIE5VTEwpOworICB9CisKKyAgLyogTm93IHRoYXQgdGhlIGFjY2VwdHMgaGF2ZSBiZWVuIGFib3J0ZWQsIHdlIGNhbiBkZXN0cm95IHRoZSBzb2NrZXRzLgorICAgICBUaGUgSU9DUCB3b24ndCBnZXQgbm90aWZpZWQgb24gdGhlc2UsIHNvIHdlIGNhbiBmbGFnIHRoZW0gYXMgYWxyZWFkeQorICAgICBjbG9zZWQgYnkgdGhlIHN5c3RlbS4gKi8KKyAgd2hpbGUgKHMtPmhlYWQpIHsKKyAgICBncnBjX3RjcF9saXN0ZW5lciAqc3AgPSBzLT5oZWFkOworICAgIHMtPmhlYWQgPSBzcC0+bmV4dDsKKyAgICBzcC0+bmV4dCA9IE5VTEw7CisgICAgZ3JwY193aW5zb2NrZXRfZGVzdHJveShzcC0+c29ja2V0KTsKKyAgICBncHJfZnJlZShzcCk7CisgIH0KKyAgZ3ByX2ZyZWUocyk7Cit9CisKK2dycGNfdGNwX3NlcnZlciAqZ3JwY190Y3Bfc2VydmVyX3JlZihncnBjX3RjcF9zZXJ2ZXIgKnMpIHsKKyAgZ3ByX3JlZigmcy0+cmVmcyk7CisgIHJldHVybiBzOworfQorCit2b2lkIGdycGNfdGNwX3NlcnZlcl9zaHV0ZG93bl9zdGFydGluZ19hZGQoZ3JwY190Y3Bfc2VydmVyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fc3RhcnRpbmcpIHsKKyAgZ3ByX211X2xvY2soJnMtPm11KTsKKyAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZzLT5zaHV0ZG93bl9zdGFydGluZywgc2h1dGRvd25fc3RhcnRpbmcsIDEpOworICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9zZXJ2ZXJfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7CisgIGludCBpbW1lZGlhdGVseV9kb25lID0gMDsKKyAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOworICBncHJfbXVfbG9jaygmcy0+bXUpOworCisgIC8qIEZpcnN0LCBzaHV0ZG93biBhbGwgZmQncy4gVGhpcyB3aWxsIHF1ZXVlIGFib3J0aW9uIGNhbGxzIGZvciBhbGwKKyAgICAgb2YgdGhlIHBlbmRpbmcgYWNjZXB0cyBkdWUgdG8gdGhlIG5vcm1hbCBvcGVyYXRpb24gbWVjaGFuaXNtLiAqLworICBpZiAocy0+YWN0aXZlX3BvcnRzID09IDApIHsKKyAgICBpbW1lZGlhdGVseV9kb25lID0gMTsKKyAgfQorICBmb3IgKHNwID0gcy0+aGVhZDsgc3A7IHNwID0gc3AtPm5leHQpIHsKKyAgICBzcC0+c2h1dHRpbmdfZG93biA9IDE7CisgICAgZ3JwY193aW5zb2NrZXRfc2h1dGRvd24oc3AtPnNvY2tldCk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmcy0+bXUpOworCisgIGlmIChpbW1lZGlhdGVseV9kb25lKSB7CisgICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzKTsKKyAgfQorfQorCit2b2lkIGdycGNfdGNwX3NlcnZlcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzKSB7CisgIGlmIChncHJfdW5yZWYoJnMtPnJlZnMpKSB7CisgICAgLyogQ29tcGxldGUgc2h1dGRvd25fc3RhcnRpbmcgd29yayBiZWZvcmUgZGVzdHJveWluZy4gKi8KKyAgICBncnBjX2V4ZWNfY3R4IGxvY2FsX2V4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlX2xpc3QoJmxvY2FsX2V4ZWNfY3R4LCAmcy0+c2h1dGRvd25fc3RhcnRpbmcsIE5VTEwpOworICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgICBpZiAoZXhlY19jdHggPT0gTlVMTCkgeworICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaCgmbG9jYWxfZXhlY19jdHgpOworICAgICAgdGNwX3NlcnZlcl9kZXN0cm95KCZsb2NhbF9leGVjX2N0eCwgcyk7CisgICAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmbG9jYWxfZXhlY19jdHgpOworICAgIH0gZWxzZSB7CisgICAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmbG9jYWxfZXhlY19jdHgpOworICAgICAgdGNwX3NlcnZlcl9kZXN0cm95KGV4ZWNfY3R4LCBzKTsKKyAgICB9CisgIH0KK30KKworLyogUHJlcGFyZSAoYmluZCkgYSByZWNlbnRseS1jcmVhdGVkIHNvY2tldCBmb3IgbGlzdGVuaW5nLiAqLworc3RhdGljIGludCBwcmVwYXJlX3NvY2tldChTT0NLRVQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4pIHsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc29ja25hbWVfdGVtcDsKKyAgc29ja2xlbl90IHNvY2tuYW1lX2xlbjsKKworICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgZ290byBlcnJvcjsKKworICBpZiAoIWdycGNfdGNwX3ByZXBhcmVfc29ja2V0KHNvY2spKSB7CisgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBwcmVwYXJlIHNvY2tldDogJXMiLCB1dGY4X21lc3NhZ2UpOworICAgIGdwcl9mcmVlKHV0ZjhfbWVzc2FnZSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmIChiaW5kKHNvY2ssIGFkZHIsIChpbnQpYWRkcl9sZW4pID09IFNPQ0tFVF9FUlJPUikgeworICAgIGNoYXIgKmFkZHJfc3RyOworICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7CisgICAgZ3JwY19zb2NrYWRkcl90b19zdHJpbmcoJmFkZHJfc3RyLCBhZGRyLCAwKTsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImJpbmQgYWRkcj0lczogJXMiLCBhZGRyX3N0ciwgdXRmOF9tZXNzYWdlKTsKKyAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOworICAgIGdwcl9mcmVlKGFkZHJfc3RyKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKGxpc3Rlbihzb2NrLCBTT01BWENPTk4pID09IFNPQ0tFVF9FUlJPUikgeworICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJsaXN0ZW46ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBzb2NrbmFtZV9sZW4gPSBzaXplb2Yoc29ja25hbWVfdGVtcCk7CisgIGlmIChnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXAsICZzb2NrbmFtZV9sZW4pID09CisgICAgICBTT0NLRVRfRVJST1IpIHsKKyAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZ2V0c29ja25hbWU6ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByZXR1cm4gZ3JwY19zb2NrYWRkcl9nZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXApOworCitlcnJvcjoKKyAgaWYgKHNvY2sgIT0gSU5WQUxJRF9TT0NLRVQpIGNsb3Nlc29ja2V0KHNvY2spOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGRlY3JlbWVudF9hY3RpdmVfcG9ydHNfYW5kX25vdGlmeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9saXN0ZW5lciAqc3ApIHsKKyAgaW50IG5vdGlmeSA9IDA7CisgIHNwLT5zaHV0dGluZ19kb3duID0gMDsKKyAgZ3ByX211X2xvY2soJnNwLT5zZXJ2ZXItPm11KTsKKyAgR1BSX0FTU0VSVChzcC0+c2VydmVyLT5hY3RpdmVfcG9ydHMgPiAwKTsKKyAgaWYgKDAgPT0gLS1zcC0+c2VydmVyLT5hY3RpdmVfcG9ydHMpIHsKKyAgICBub3RpZnkgPSAxOworICB9CisgIGdwcl9tdV91bmxvY2soJnNwLT5zZXJ2ZXItPm11KTsKKyAgaWYgKG5vdGlmeSkgeworICAgIGZpbmlzaF9zaHV0ZG93bihleGVjX2N0eCwgc3AtPnNlcnZlcik7CisgIH0KK30KKworLyogSW4gb3JkZXIgdG8gZG8gYW4gYXN5bmMgYWNjZXB0LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNvY2tldCBmaXJzdCB3aGljaAorICAgd2lsbCBiZSB0aGUgb25lIGFzc2lnbmVkIHRvIHRoZSBuZXcgaW5jb21pbmcgY29ubmVjdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X2FjY2VwdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3BfbGlzdGVuZXIgKnBvcnQpIHsKKyAgU09DS0VUIHNvY2sgPSBJTlZBTElEX1NPQ0tFVDsKKyAgY2hhciAqbWVzc2FnZTsKKyAgY2hhciAqdXRmOF9tZXNzYWdlOworICBCT09MIHN1Y2Nlc3M7CisgIERXT1JEIGFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgKyAxNjsKKyAgRFdPUkQgYnl0ZXNfcmVjZWl2ZWQgPSAwOworCisgIHNvY2sgPSBXU0FTb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICBXU0FfRkxBR19PVkVSTEFQUEVEKTsKKworICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgeworICAgIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQ6ICVzIjsKKyAgICBnb3RvIGZhaWx1cmU7CisgIH0KKworICBpZiAoIWdycGNfdGNwX3ByZXBhcmVfc29ja2V0KHNvY2spKSB7CisgICAgbWVzc2FnZSA9ICJVbmFibGUgdG8gcHJlcGFyZSBzb2NrZXQ6ICVzIjsKKyAgICBnb3RvIGZhaWx1cmU7CisgIH0KKworICAvKiBTdGFydCB0aGUgImFjY2VwdCIgYXN5bmNocm9ub3VzbHkuICovCisgIHN1Y2Nlc3MgPSBwb3J0LT5BY2NlcHRFeChwb3J0LT5zb2NrZXQtPnNvY2tldCwgc29jaywgcG9ydC0+YWRkcmVzc2VzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmxlbiwgYWRkcmxlbiwgJmJ5dGVzX3JlY2VpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQtPnNvY2tldC0+cmVhZF9pbmZvLm92ZXJsYXBwZWQpOworCisgIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGdldCBhbiBhY2NlcHQgaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4gSG93ZXZlciwgd2UKKyAgICAgd2lsbCBzdGlsbCBnZXQgYW4gSU9DUCBub3RpZmljYXRpb24gZm9yIGl0LiBTbyBsZXQncyBqdXN0IGlnbm9yZSBpdC4gKi8KKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgaW50IGVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKGVycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICAgIG1lc3NhZ2UgPSAiQWNjZXB0RXggZmFpbGVkOiAlcyI7CisgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICB9CisKKyAgLyogV2UncmUgcmVhZHkgdG8gZG8gdGhlIGFjY2VwdC4gQ2FsbGluZyBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZCBtYXkKKyAgICAgaW1tZWRpYXRlbHkgcHJvY2VzcyBhbiBhY2NlcHQgdGhhdCBoYXBwZW5lZCBpbiB0aGUgbWVhbnRpbWUuICovCisgIHBvcnQtPm5ld19zb2NrZXQgPSBzb2NrOworICBncnBjX3NvY2tldF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgcG9ydC0+c29ja2V0LCAmcG9ydC0+b25fYWNjZXB0KTsKKyAgcmV0dXJuOworCitmYWlsdXJlOgorICBpZiAocG9ydC0+c2h1dHRpbmdfZG93bikgeworICAgIC8qIFdlIGFyZSBhYmFuZG9uaW5nIHRoZSBsaXN0ZW5lciBwb3J0LCB0YWtlIHRoYXQgaW50byBhY2NvdW50IHRvIHByZXZlbnQKKyAgICAgICBvY2Nhc2lvbmFsIGhhbmdzIG9uIHNodXRkb3duLiBUaGUgaGFuZyBoYXBwZW5zIHdoZW4gc3AtPnNodXR0aW5nX2Rvd24KKyAgICAgICBjaGFuZ2UgaXMgbm90IHNlZW4gYnkgb25fYWNjZXB0IGFuZCB3ZSBwcm9jZWVkIHRvIHRyeWluZyBuZXcgYWNjZXB0LAorICAgICAgIGJ1dCB3ZSBmYWlsIHRoZXJlIGJlY2F1c2UgdGhlIGxpc3RlbmluZyBwb3J0IGhhcyBiZWVuIGNsb3NlZCBpbiB0aGUKKyAgICAgICBtZWFudGltZS4gKi8KKyAgICBkZWNyZW1lbnRfYWN0aXZlX3BvcnRzX2FuZF9ub3RpZnkoZXhlY19jdHgsIHBvcnQpOworICAgIHJldHVybjsKKyAgfQorICB1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOworICBncHJfbG9nKEdQUl9FUlJPUiwgbWVzc2FnZSwgdXRmOF9tZXNzYWdlKTsKKyAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgaWYgKHNvY2sgIT0gSU5WQUxJRF9TT0NLRVQpIGNsb3Nlc29ja2V0KHNvY2spOworfQorCisvKiBFdmVudCBtYW5hZ2VyIGNhbGxiYWNrIHdoZW4gcmVhZHMgYXJlIHJlYWR5LiAqLworc3RhdGljIHZvaWQgb25fYWNjZXB0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgZnJvbV9pb2NwKSB7CisgIGdycGNfdGNwX2xpc3RlbmVyICpzcCA9IGFyZzsKKyAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yIGFjY2VwdG9yID0ge3NwLT5zZXJ2ZXIsIHNwLT5wb3J0X2luZGV4LCAwfTsKKyAgU09DS0VUIHNvY2sgPSBzcC0+bmV3X3NvY2tldDsKKyAgZ3JwY193aW5zb2NrZXRfY2FsbGJhY2tfaW5mbyAqaW5mbyA9ICZzcC0+c29ja2V0LT5yZWFkX2luZm87CisgIGdycGNfZW5kcG9pbnQgKmVwID0gTlVMTDsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcl9uYW1lOworICBjaGFyICpwZWVyX25hbWVfc3RyaW5nOworICBjaGFyICpmZF9uYW1lOworICBpbnQgcGVlcl9uYW1lX2xlbiA9IHNpemVvZihwZWVyX25hbWUpOworICBEV09SRCB0cmFuc2ZlcmVkX2J5dGVzOworICBEV09SRCBmbGFnczsKKyAgQk9PTCB3c2Ffc3VjY2VzczsKKyAgaW50IGVycjsKKworICAvKiBUaGUgZ2VuZXJhbCBtZWNoYW5pc20gZm9yIHNodXR0aW5nIGRvd24gaXMgdG8gcXVldWUgYWJvcnRpb24gY2FsbHMuIFdoaWxlCisgICAgIHRoaXMgaXMgbmVjZXNzYXJ5IGluIHRoZSByZWFkL3dyaXRlIGNhc2UsIGl0J3MgdXNlbGVzcyBmb3IgdGhlIGFjY2VwdAorICAgICBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gYWRqdXN0IHRoZSBwZW5kaW5nIGNhbGxiYWNrIGNvdW50ICovCisgIGlmICghZnJvbV9pb2NwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVGhlIElPQ1Agbm90aWZpZWQgdXMgb2YgYSBjb21wbGV0ZWQgb3BlcmF0aW9uLiBMZXQncyBncmFiIHRoZSByZXN1bHRzLAorICAgICBhbmQgYWN0IGFjY29yZGluZ2x5LiAqLworICB0cmFuc2ZlcmVkX2J5dGVzID0gMDsKKyAgd3NhX3N1Y2Nlc3MgPSBXU0FHZXRPdmVybGFwcGVkUmVzdWx0KHNvY2ssICZpbmZvLT5vdmVybGFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZmVyZWRfYnl0ZXMsIEZBTFNFLCAmZmxhZ3MpOworICBpZiAoIXdzYV9zdWNjZXNzKSB7CisgICAgaWYgKHNwLT5zaHV0dGluZ19kb3duKSB7CisgICAgICAvKiBEdXJpbmcgdGhlIHNodXRkb3duIGNhc2UsIHdlIEFSRSBleHBlY3RpbmcgYW4gZXJyb3IuIFNvIHRoYXQncyB3ZWxsLAorICAgICAgICAgYW5kIHdlIGNhbiB3YWtlIHVwIHRoZSBzaHV0ZG93biB0aHJlYWQuICovCisgICAgICBkZWNyZW1lbnRfYWN0aXZlX3BvcnRzX2FuZF9ub3RpZnkoZXhlY19jdHgsIHNwKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAib25fYWNjZXB0IGVycm9yOiAlcyIsIHV0ZjhfbWVzc2FnZSk7CisgICAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOworICAgICAgY2xvc2Vzb2NrZXQoc29jayk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghc3AtPnNodXR0aW5nX2Rvd24pIHsKKyAgICAgIHBlZXJfbmFtZV9zdHJpbmcgPSBOVUxMOworICAgICAgZXJyID0gc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19VUERBVEVfQUNDRVBUX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnNwLT5zb2NrZXQtPnNvY2tldCwgc2l6ZW9mKHNwLT5zb2NrZXQtPnNvY2tldCkpOworICAgICAgaWYgKGVycikgeworICAgICAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKCkpOworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInNldHNvY2tvcHQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGVyciA9IGdldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmcGVlcl9uYW1lLCAmcGVlcl9uYW1lX2xlbik7CisgICAgICBpZiAoIWVycikgeworICAgICAgICBwZWVyX25hbWVfc3RyaW5nID0gZ3JwY19zb2NrYWRkcl90b191cmkoKHN0cnVjdCBzb2NrYWRkciAqKSZwZWVyX25hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJnZXRwZWVybmFtZSBlcnJvcjogJXMiLCB1dGY4X21lc3NhZ2UpOworICAgICAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOworICAgICAgfQorICAgICAgZ3ByX2FzcHJpbnRmKCZmZF9uYW1lLCAidGNwX3NlcnZlcjolcyIsIHBlZXJfbmFtZV9zdHJpbmcpOworICAgICAgZXAgPSBncnBjX3RjcF9jcmVhdGUoZ3JwY193aW5zb2NrZXRfY3JlYXRlKHNvY2ssIGZkX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVlcl9uYW1lX3N0cmluZyk7CisgICAgICBncHJfZnJlZShmZF9uYW1lKTsKKyAgICAgIGdwcl9mcmVlKHBlZXJfbmFtZV9zdHJpbmcpOworICAgIH0gZWxzZSB7CisgICAgICBjbG9zZXNvY2tldChzb2NrKTsKKyAgICB9CisgIH0KKworICAvKiBUaGUgb25seSB0aW1lIHdlIHNob3VsZCBjYWxsIG91ciBjYWxsYmFjaywgaXMgd2hlcmUgd2Ugc3VjY2Vzc2Z1bGx5CisgICAgIG1hbmFnZWQgdG8gYWNjZXB0IGEgY29ubmVjdGlvbiwgYW5kIGNyZWF0ZWQgYW4gZW5kcG9pbnQuICovCisgIGlmIChlcCkKKyAgICBzcC0+c2VydmVyLT5vbl9hY2NlcHRfY2IoZXhlY19jdHgsIHNwLT5zZXJ2ZXItPm9uX2FjY2VwdF9jYl9hcmcsIGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjZXB0b3IpOworICAvKiBBcyB3ZSB3ZXJlIG5vdGlmaWVkIGZyb20gdGhlIElPQ1Agb2Ygb25lIGFuZCBleGFjdGx5IG9uZSBhY2NlcHQsCisgICAgIHRoZSBmb3JtZXIgc29ja2VkIHdlIGNyZWF0ZWQgaGFzIG5vdyBlaXRoZXIgYmVlbiBkZXN0cm95IG9yIGFzc2lnbmVkCisgICAgIHRvIHRoZSBuZXcgY29ubmVjdGlvbi4gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lIGZvciB0aGUgbmV4dAorICAgICBjb25uZWN0aW9uLiAqLworICBzdGFydF9hY2NlcHQoZXhlY19jdHgsIHNwKTsKK30KKworc3RhdGljIGdycGNfdGNwX2xpc3RlbmVyICphZGRfc29ja2V0X3RvX3NlcnZlcihncnBjX3RjcF9zZXJ2ZXIgKnMsIFNPQ0tFVCBzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydF9pbmRleCkgeworICBncnBjX3RjcF9saXN0ZW5lciAqc3AgPSBOVUxMOworICBpbnQgcG9ydDsKKyAgaW50IHN0YXR1czsKKyAgR1VJRCBndWlkID0gV1NBSURfQUNDRVBURVg7CisgIERXT1JEIGlvY3RsX251bV9ieXRlczsKKyAgTFBGTl9BQ0NFUFRFWCBBY2NlcHRFeDsKKworICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgcmV0dXJuIE5VTEw7CisKKyAgLyogV2UgbmVlZCB0byBncmFiIHRoZSBBY2NlcHRFeCBwb2ludGVyIGZvciB0aGF0IHBvcnQsIGFzIGl0IG1heSBiZQorICAgICBpbnRlcmZhY2UtZGVwZW5kZW50LiBXZSdsbCBjYWNoZSBpdCB0byBhdm9pZCBkb2luZyB0aGF0IGFnYWluLiAqLworICBzdGF0dXMgPQorICAgICAgV1NBSW9jdGwoc29jaywgU0lPX0dFVF9FWFRFTlNJT05fRlVOQ1RJT05fUE9JTlRFUiwgJmd1aWQsIHNpemVvZihndWlkKSwKKyAgICAgICAgICAgICAgICZBY2NlcHRFeCwgc2l6ZW9mKEFjY2VwdEV4KSwgJmlvY3RsX251bV9ieXRlcywgTlVMTCwgTlVMTCk7CisKKyAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgY2hhciAqdXRmOF9tZXNzYWdlID0gZ3ByX2Zvcm1hdF9tZXNzYWdlKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm9uX2Nvbm5lY3QgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICBncHJfZnJlZSh1dGY4X21lc3NhZ2UpOworICAgIGNsb3Nlc29ja2V0KHNvY2spOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcG9ydCA9IHByZXBhcmVfc29ja2V0KHNvY2ssIGFkZHIsIGFkZHJfbGVuKTsKKyAgaWYgKHBvcnQgPj0gMCkgeworICAgIGdwcl9tdV9sb2NrKCZzLT5tdSk7CisgICAgR1BSX0FTU0VSVCghcy0+b25fYWNjZXB0X2NiICYmICJtdXN0IGFkZCBwb3J0cyBiZWZvcmUgc3RhcnRpbmcgc2VydmVyIik7CisgICAgc3AgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3RjcF9saXN0ZW5lcikpOworICAgIHNwLT5uZXh0ID0gTlVMTDsKKyAgICBpZiAocy0+aGVhZCA9PSBOVUxMKSB7CisgICAgICBzLT5oZWFkID0gc3A7CisgICAgfSBlbHNlIHsKKyAgICAgIHMtPnRhaWwtPm5leHQgPSBzcDsKKyAgICB9CisgICAgcy0+dGFpbCA9IHNwOworICAgIHNwLT5zZXJ2ZXIgPSBzOworICAgIHNwLT5zb2NrZXQgPSBncnBjX3dpbnNvY2tldF9jcmVhdGUoc29jaywgImxpc3RlbmVyIik7CisgICAgc3AtPnNodXR0aW5nX2Rvd24gPSAwOworICAgIHNwLT5BY2NlcHRFeCA9IEFjY2VwdEV4OworICAgIHNwLT5uZXdfc29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgc3AtPnBvcnQgPSBwb3J0OworICAgIHNwLT5wb3J0X2luZGV4ID0gcG9ydF9pbmRleDsKKyAgICBncnBjX2Nsb3N1cmVfaW5pdCgmc3AtPm9uX2FjY2VwdCwgb25fYWNjZXB0LCBzcCk7CisgICAgR1BSX0FTU0VSVChzcC0+c29ja2V0KTsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgIH0KKworICByZXR1cm4gc3A7Cit9CisKK2ludCBncnBjX3RjcF9zZXJ2ZXJfYWRkX3BvcnQoZ3JwY190Y3Bfc2VydmVyICpzLCBjb25zdCB2b2lkICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4pIHsKKyAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOworICBTT0NLRVQgc29jazsKKyAgc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNl92NG1hcHBlZDsKKyAgc3RydWN0IHNvY2thZGRyX2luNiB3aWxkY2FyZDsKKyAgc3RydWN0IHNvY2thZGRyICphbGxvY2F0ZWRfYWRkciA9IE5VTEw7CisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNvY2tuYW1lX3RlbXA7CisgIHNvY2tsZW5fdCBzb2NrbmFtZV9sZW47CisgIGludCBwb3J0OworICB1bnNpZ25lZCBwb3J0X2luZGV4ID0gMDsKKyAgaWYgKHMtPnRhaWwgIT0gTlVMTCkgeworICAgIHBvcnRfaW5kZXggPSBzLT50YWlsLT5wb3J0X2luZGV4ICsgMTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoaXMgaXMgYSB3aWxkY2FyZCBwb3J0LCBhbmQgaWYgc28sIHRyeSB0byBrZWVwIHRoZSBwb3J0IHRoZSBzYW1lCisgICAgIGFzIHNvbWUgcHJldmlvdXNseSBjcmVhdGVkIGxpc3RlbmVyLiAqLworICBpZiAoZ3JwY19zb2NrYWRkcl9nZXRfcG9ydChhZGRyKSA9PSAwKSB7CisgICAgZm9yIChzcCA9IHMtPmhlYWQ7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CisgICAgICBzb2NrbmFtZV9sZW4gPSBzaXplb2Yoc29ja25hbWVfdGVtcCk7CisgICAgICBpZiAoMCA9PSBnZXRzb2NrbmFtZShzcC0+c29ja2V0LT5zb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXAsICZzb2NrbmFtZV9sZW4pKSB7CisgICAgICAgIHBvcnQgPSBncnBjX3NvY2thZGRyX2dldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCk7CisgICAgICAgIGlmIChwb3J0ID4gMCkgeworICAgICAgICAgIGFsbG9jYXRlZF9hZGRyID0gbWFsbG9jKGFkZHJfbGVuKTsKKyAgICAgICAgICBtZW1jcHkoYWxsb2NhdGVkX2FkZHIsIGFkZHIsIGFkZHJfbGVuKTsKKyAgICAgICAgICBncnBjX3NvY2thZGRyX3NldF9wb3J0KGFsbG9jYXRlZF9hZGRyLCBwb3J0KTsKKyAgICAgICAgICBhZGRyID0gYWxsb2NhdGVkX2FkZHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZChhZGRyLCAmYWRkcjZfdjRtYXBwZWQpKSB7CisgICAgYWRkciA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjZfdjRtYXBwZWQ7CisgICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjZfdjRtYXBwZWQpOworICB9CisKKyAgLyogVHJlYXQgOjogb3IgMC4wLjAuMCBhcyBhIGZhbWlseS1hZ25vc3RpYyB3aWxkY2FyZC4gKi8KKyAgaWYgKGdycGNfc29ja2FkZHJfaXNfd2lsZGNhcmQoYWRkciwgJnBvcnQpKSB7CisgICAgZ3JwY19zb2NrYWRkcl9tYWtlX3dpbGRjYXJkNihwb3J0LCAmd2lsZGNhcmQpOworCisgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZGNhcmQ7CisgICAgYWRkcl9sZW4gPSBzaXplb2Yod2lsZGNhcmQpOworICB9CisKKyAgc29jayA9IFdTQVNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgIFdTQV9GTEFHX09WRVJMQVBQRUQpOworICBpZiAoc29jayA9PSBJTlZBTElEX1NPQ0tFVCkgeworICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShXU0FHZXRMYXN0RXJyb3IoKSk7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldDogJXMiLCB1dGY4X21lc3NhZ2UpOworICAgIGdwcl9mcmVlKHV0ZjhfbWVzc2FnZSk7CisgIH0KKworICBzcCA9IGFkZF9zb2NrZXRfdG9fc2VydmVyKHMsIHNvY2ssIGFkZHIsIGFkZHJfbGVuLCBwb3J0X2luZGV4KTsKKyAgZ3ByX2ZyZWUoYWxsb2NhdGVkX2FkZHIpOworCisgIGlmIChzcCkgeworICAgIHJldHVybiBzcC0+cG9ydDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKwordW5zaWduZWQgZ3JwY190Y3Bfc2VydmVyX3BvcnRfZmRfY291bnQoZ3JwY190Y3Bfc2VydmVyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydF9pbmRleCkgeworICBncnBjX3RjcF9saXN0ZW5lciAqc3A7CisgIGZvciAoc3AgPSBzLT5oZWFkOyBzcCAmJiBwb3J0X2luZGV4ICE9IDA7IHNwID0gc3AtPm5leHQsIC0tcG9ydF9pbmRleCkKKyAgICA7CisgIGlmIChzcCkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKK2ludCBncnBjX3RjcF9zZXJ2ZXJfcG9ydF9mZChncnBjX3RjcF9zZXJ2ZXIgKnMsIHVuc2lnbmVkIHBvcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmRfaW5kZXgpIHsKKyAgZ3JwY190Y3BfbGlzdGVuZXIgKnNwOworICBpZiAoZmRfaW5kZXggIT0gMCkgeworICAgIC8qIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gaGFzIG9ubHkgb25lIGZkIHBlciBwb3J0X2luZGV4LiAqLworICAgIHJldHVybiAtMTsKKyAgfQorICBmb3IgKHNwID0gcy0+aGVhZDsgc3AgJiYgcG9ydF9pbmRleCAhPSAwOyBzcCA9IHNwLT5uZXh0LCAtLXBvcnRfaW5kZXgpCisgICAgOworICBpZiAoc3ApIHsKKyAgICByZXR1cm4gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdClzcC0+c29ja2V0LT5zb2NrZXQsIDApOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCit2b2lkIGdycGNfdGNwX3NlcnZlcl9zdGFydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190Y3Bfc2VydmVyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldCwgc2l6ZV90IHBvbGxzZXRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9zZXJ2ZXJfY2Igb25fYWNjZXB0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb25fYWNjZXB0X2NiX2FyZykgeworICBncnBjX3RjcF9saXN0ZW5lciAqc3A7CisgIEdQUl9BU1NFUlQob25fYWNjZXB0X2NiKTsKKyAgZ3ByX211X2xvY2soJnMtPm11KTsKKyAgR1BSX0FTU0VSVCghcy0+b25fYWNjZXB0X2NiKTsKKyAgR1BSX0FTU0VSVChzLT5hY3RpdmVfcG9ydHMgPT0gMCk7CisgIHMtPm9uX2FjY2VwdF9jYiA9IG9uX2FjY2VwdF9jYjsKKyAgcy0+b25fYWNjZXB0X2NiX2FyZyA9IG9uX2FjY2VwdF9jYl9hcmc7CisgIGZvciAoc3AgPSBzLT5oZWFkOyBzcDsgc3AgPSBzcC0+bmV4dCkgeworICAgIHN0YXJ0X2FjY2VwdChleGVjX2N0eCwgc3ApOworICAgIHMtPmFjdGl2ZV9wb3J0cysrOworICB9CisgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKK30KKworI2VuZGlmIC8qIEdQUl9XSU5TT0NLX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNlNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nX3dpbjMyLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIgorCitzdGF0aWMgaW50IHNldF9ub25fYmxvY2soU09DS0VUIHNvY2spIHsKKyAgaW50IHN0YXR1czsKKyAgdW5zaWduZWQgbG9uZyBwYXJhbSA9IDE7CisgIERXT1JEIHJldDsKKyAgc3RhdHVzID0KKyAgICAgIFdTQUlvY3RsKHNvY2ssIEZJT05CSU8sICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSwgTlVMTCwgMCwgJnJldCwgTlVMTCwgTlVMTCk7CisgIHJldHVybiBzdGF0dXMgPT0gMDsKK30KKworc3RhdGljIGludCBzZXRfZHVhbHN0YWNrKFNPQ0tFVCBzb2NrKSB7CisgIGludCBzdGF0dXM7CisgIHVuc2lnbmVkIGxvbmcgcGFyYW0gPSAwOworICBzdGF0dXMgPSBzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIChjb25zdCBjaGFyICopJnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbSkpOworICByZXR1cm4gc3RhdHVzID09IDA7Cit9CisKK2ludCBncnBjX3RjcF9wcmVwYXJlX3NvY2tldChTT0NLRVQgc29jaykgeworICBpZiAoIXNldF9ub25fYmxvY2soc29jaykpIHJldHVybiAwOworICBpZiAoIXNldF9kdWFsc3RhY2soc29jaykpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY190Y3AgeworICAvKiBUaGlzIGlzIG91ciBDKysgY2xhc3MgZGVyaXZhdGlvbiBlbXVsYXRpb24uICovCisgIGdycGNfZW5kcG9pbnQgYmFzZTsKKyAgLyogVGhlIG9uZSBzb2NrZXQgdGhpcyBlbmRwb2ludCBpcyB1c2luZy4gKi8KKyAgZ3JwY193aW5zb2NrZXQgKnNvY2tldDsKKyAgLyogUmVmY291bnRpbmcgaG93IG1hbnkgb3BlcmF0aW9ucyBhcmUgaW4gcHJvZ3Jlc3MuICovCisgIGdwcl9yZWZjb3VudCByZWZjb3VudDsKKworICBncnBjX2Nsb3N1cmUgb25fcmVhZDsKKyAgZ3JwY19jbG9zdXJlIG9uX3dyaXRlOworCisgIGdycGNfY2xvc3VyZSAqcmVhZF9jYjsKKyAgZ3JwY19jbG9zdXJlICp3cml0ZV9jYjsKKyAgZ3ByX3NsaWNlIHJlYWRfc2xpY2U7CisgIGdwcl9zbGljZV9idWZmZXIgKndyaXRlX3NsaWNlczsKKyAgZ3ByX3NsaWNlX2J1ZmZlciAqcmVhZF9zbGljZXM7CisKKyAgLyogVGhlIElPIENvbXBsZXRpb24gUG9ydCBydW5zIGZyb20gYW5vdGhlciB0aHJlYWQuIFdlIG5lZWQgc29tZSBtZWNoYW5pc20KKyAgICAgdG8gcHJvdGVjdCBvdXJzZWx2ZXMgd2hlbiByZXF1ZXN0aW5nIGEgc2h1dGRvd24uICovCisgIGdwcl9tdSBtdTsKKyAgaW50IHNodXR0aW5nX2Rvd247CisKKyAgY2hhciAqcGVlcl9zdHJpbmc7Cit9IGdycGNfdGNwOworCitzdGF0aWMgdm9pZCB0Y3BfZnJlZShncnBjX3RjcCAqdGNwKSB7CisgIGdycGNfd2luc29ja2V0X2Rlc3Ryb3kodGNwLT5zb2NrZXQpOworICBncHJfbXVfZGVzdHJveSgmdGNwLT5tdSk7CisgIGdwcl9mcmVlKHRjcC0+cGVlcl9zdHJpbmcpOworICBncHJfZnJlZSh0Y3ApOworfQorCisvKiNkZWZpbmUgR1JQQ19UQ1BfUkVGQ09VTlRfREVCVUcqLworI2lmZGVmIEdSUENfVENQX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIFRDUF9VTlJFRih0Y3AsIHJlYXNvbikgdGNwX3VucmVmKCh0Y3ApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBUQ1BfUkVGKHRjcCwgcmVhc29uKSB0Y3BfcmVmKCh0Y3ApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgdGNwX3VucmVmKGdycGNfdGNwICp0Y3AsIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJUQ1AgdW5yZWYgJXAgOiAlcyAlZCAtPiAlZCIsIHRjcCwKKyAgICAgICAgICByZWFzb24sIHRjcC0+cmVmY291bnQuY291bnQsIHRjcC0+cmVmY291bnQuY291bnQgLSAxKTsKKyAgaWYgKGdwcl91bnJlZigmdGNwLT5yZWZjb3VudCkpIHsKKyAgICB0Y3BfZnJlZSh0Y3ApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9yZWYoZ3JwY190Y3AgKnRjcCwgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJUQ1AgICByZWYgJXAgOiAlcyAlZCAtPiAlZCIsIHRjcCwKKyAgICAgICAgICByZWFzb24sIHRjcC0+cmVmY291bnQuY291bnQsIHRjcC0+cmVmY291bnQuY291bnQgKyAxKTsKKyAgZ3ByX3JlZigmdGNwLT5yZWZjb3VudCk7Cit9CisjZWxzZQorI2RlZmluZSBUQ1BfVU5SRUYodGNwLCByZWFzb24pIHRjcF91bnJlZigodGNwKSkKKyNkZWZpbmUgVENQX1JFRih0Y3AsIHJlYXNvbikgdGNwX3JlZigodGNwKSkKK3N0YXRpYyB2b2lkIHRjcF91bnJlZihncnBjX3RjcCAqdGNwKSB7CisgIGlmIChncHJfdW5yZWYoJnRjcC0+cmVmY291bnQpKSB7CisgICAgdGNwX2ZyZWUodGNwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB0Y3BfcmVmKGdycGNfdGNwICp0Y3ApIHsgZ3ByX3JlZigmdGNwLT5yZWZjb3VudCk7IH0KKyNlbmRpZgorCisvKiBBc3luY2hyb25vdXMgY2FsbGJhY2sgZnJvbSB0aGUgSU9DUCwgb3IgdGhlIGJhY2tncm91bmQgdGhyZWFkLiAqLworc3RhdGljIHZvaWQgb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdGNwcCwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfdGNwICp0Y3AgPSB0Y3BwOworICBncnBjX2Nsb3N1cmUgKmNiID0gdGNwLT5yZWFkX2NiOworICBncnBjX3dpbnNvY2tldCAqc29ja2V0ID0gdGNwLT5zb2NrZXQ7CisgIGdwcl9zbGljZSBzdWI7CisgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmc29ja2V0LT5yZWFkX2luZm87CisKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICBpZiAoaW5mby0+d3NhX2Vycm9yICE9IDAgJiYgIXRjcC0+c2h1dHRpbmdfZG93bikgeworICAgICAgaWYgKGluZm8tPndzYV9lcnJvciAhPSBXU0FFQ09OTlJFU0VUKSB7CisgICAgICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShpbmZvLT53c2FfZXJyb3IpOworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlJlYWRGaWxlIG92ZXJsYXBwZWQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgZ3ByX3NsaWNlX3VucmVmKHRjcC0+cmVhZF9zbGljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpbmZvLT5ieXRlc190cmFuc2ZlcmVkICE9IDAgJiYgIXRjcC0+c2h1dHRpbmdfZG93bikgeworICAgICAgICBzdWIgPSBncHJfc2xpY2Vfc3ViX25vX3JlZih0Y3AtPnJlYWRfc2xpY2UsIDAsIGluZm8tPmJ5dGVzX3RyYW5zZmVyZWQpOworICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCh0Y3AtPnJlYWRfc2xpY2VzLCBzdWIpOworICAgICAgICBzdWNjZXNzID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdwcl9zbGljZV91bnJlZih0Y3AtPnJlYWRfc2xpY2UpOworICAgICAgICBzdWNjZXNzID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0Y3AtPnJlYWRfY2IgPSBOVUxMOworICBUQ1BfVU5SRUYodGNwLCAicmVhZCIpOworICBpZiAoY2IpIHsKKyAgICBjYi0+Y2IoZXhlY19jdHgsIGNiLT5jYl9hcmcsIHN1Y2Nlc3MpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHdpbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKKyAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnJlYWRfc2xpY2VzLCBncnBjX2Nsb3N1cmUgKmNiKSB7CisgIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKKyAgZ3JwY193aW5zb2NrZXQgKmhhbmRsZSA9IHRjcC0+c29ja2V0OworICBncnBjX3dpbnNvY2tldF9jYWxsYmFja19pbmZvICppbmZvID0gJmhhbmRsZS0+cmVhZF9pbmZvOworICBpbnQgc3RhdHVzOworICBEV09SRCBieXRlc19yZWFkID0gMDsKKyAgRFdPUkQgZmxhZ3MgPSAwOworICBXU0FCVUYgYnVmZmVyOworCisgIGlmICh0Y3AtPnNodXR0aW5nX2Rvd24pIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBmYWxzZSwgTlVMTCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdGNwLT5yZWFkX2NiID0gY2I7CisgIHRjcC0+cmVhZF9zbGljZXMgPSByZWFkX3NsaWNlczsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYocmVhZF9zbGljZXMpOworCisgIHRjcC0+cmVhZF9zbGljZSA9IGdwcl9zbGljZV9tYWxsb2MoODE5Mik7CisKKyAgYnVmZmVyLmxlbiA9IChVTE9ORylHUFJfU0xJQ0VfTEVOR1RIKAorICAgICAgdGNwLT5yZWFkX3NsaWNlKTsgIC8vIHdlIGtub3cgc2xpY2Ugc2l6ZSBmaXRzIGluIDMyYml0LgorICBidWZmZXIuYnVmID0gKGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKHRjcC0+cmVhZF9zbGljZSk7CisKKyAgVENQX1JFRih0Y3AsICJyZWFkIik7CisKKyAgLyogRmlyc3QgbGV0J3MgdHJ5IGEgc3luY2hyb25vdXMsIG5vbi1ibG9ja2luZyByZWFkLiAqLworICBzdGF0dXMgPQorICAgICAgV1NBUmVjdih0Y3AtPnNvY2tldC0+c29ja2V0LCAmYnVmZmVyLCAxLCAmYnl0ZXNfcmVhZCwgJmZsYWdzLCBOVUxMLCBOVUxMKTsKKyAgaW5mby0+d3NhX2Vycm9yID0gc3RhdHVzID09IDAgPyAwIDogV1NBR2V0TGFzdEVycm9yKCk7CisKKyAgLyogRGlkIHdlIGdldCBkYXRhIGltbWVkaWF0ZWx5ID8gWWF5LiAqLworICBpZiAoaW5mby0+d3NhX2Vycm9yICE9IFdTQUVXT1VMREJMT0NLKSB7CisgICAgaW5mby0+Ynl0ZXNfdHJhbnNmZXJlZCA9IGJ5dGVzX3JlYWQ7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmdGNwLT5vbl9yZWFkLCB0cnVlLCBOVUxMKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBPdGhlcndpc2UsIGxldCdzIHJldHJ5LCBieSBxdWV1aW5nIGEgcmVhZC4gKi8KKyAgbWVtc2V0KCZ0Y3AtPnNvY2tldC0+cmVhZF9pbmZvLm92ZXJsYXBwZWQsIDAsIHNpemVvZihPVkVSTEFQUEVEKSk7CisgIHN0YXR1cyA9IFdTQVJlY3YodGNwLT5zb2NrZXQtPnNvY2tldCwgJmJ1ZmZlciwgMSwgJmJ5dGVzX3JlYWQsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAmaW5mby0+b3ZlcmxhcHBlZCwgTlVMTCk7CisKKyAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgaW50IHdzYV9lcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworICAgIGlmICh3c2FfZXJyb3IgIT0gV1NBX0lPX1BFTkRJTkcpIHsKKyAgICAgIGluZm8tPndzYV9lcnJvciA9IHdzYV9lcnJvcjsKKyAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJnRjcC0+b25fcmVhZCwgZmFsc2UsIE5VTEwpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGdycGNfc29ja2V0X25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCB0Y3AtPnNvY2tldCwgJnRjcC0+b25fcmVhZCk7Cit9CisKKy8qIEFzeW5jaHJvbm91cyBjYWxsYmFjayBmcm9tIHRoZSBJT0NQLCBvciB0aGUgYmFja2dyb3VuZCB0aHJlYWQuICovCitzdGF0aWMgdm9pZCBvbl93cml0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdGNwcCwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKil0Y3BwOworICBncnBjX3dpbnNvY2tldCAqaGFuZGxlID0gdGNwLT5zb2NrZXQ7CisgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmaGFuZGxlLT53cml0ZV9pbmZvOworICBncnBjX2Nsb3N1cmUgKmNiOworCisgIGdwcl9tdV9sb2NrKCZ0Y3AtPm11KTsKKyAgY2IgPSB0Y3AtPndyaXRlX2NiOworICB0Y3AtPndyaXRlX2NiID0gTlVMTDsKKyAgZ3ByX211X3VubG9jaygmdGNwLT5tdSk7CisKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICBpZiAoaW5mby0+d3NhX2Vycm9yICE9IDApIHsKKyAgICAgIGlmIChpbmZvLT53c2FfZXJyb3IgIT0gV1NBRUNPTk5SRVNFVCkgeworICAgICAgICBjaGFyICp1dGY4X21lc3NhZ2UgPSBncHJfZm9ybWF0X21lc3NhZ2UoaW5mby0+d3NhX2Vycm9yKTsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJXU0FTZW5kIG92ZXJsYXBwZWQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHN1Y2Nlc3MgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBHUFJfQVNTRVJUKGluZm8tPmJ5dGVzX3RyYW5zZmVyZWQgPT0gdGNwLT53cml0ZV9zbGljZXMtPmxlbmd0aCk7CisgICAgfQorICB9CisKKyAgVENQX1VOUkVGKHRjcCwgIndyaXRlIik7CisgIGNiLT5jYihleGVjX2N0eCwgY2ItPmNiX2FyZywgc3VjY2Vzcyk7Cit9CisKKy8qIEluaXRpYXRlcyBhIHdyaXRlLiAqLworc3RhdGljIHZvaWQgd2luX3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICplcCwKKyAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZXMsIGdycGNfY2xvc3VyZSAqY2IpIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOworICBncnBjX3dpbnNvY2tldCAqc29ja2V0ID0gdGNwLT5zb2NrZXQ7CisgIGdycGNfd2luc29ja2V0X2NhbGxiYWNrX2luZm8gKmluZm8gPSAmc29ja2V0LT53cml0ZV9pbmZvOworICB1bnNpZ25lZCBpOworICBEV09SRCBieXRlc19zZW50OworICBpbnQgc3RhdHVzOworICBXU0FCVUYgbG9jYWxfYnVmZmVyc1sxNl07CisgIFdTQUJVRiAqYWxsb2NhdGVkID0gTlVMTDsKKyAgV1NBQlVGICpidWZmZXJzID0gbG9jYWxfYnVmZmVyczsKKyAgc2l6ZV90IGxlbjsKKworICBpZiAodGNwLT5zaHV0dGluZ19kb3duKSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjYiwgZmFsc2UsIE5VTEwpOworICAgIHJldHVybjsKKyAgfQorCisgIHRjcC0+d3JpdGVfY2IgPSBjYjsKKyAgdGNwLT53cml0ZV9zbGljZXMgPSBzbGljZXM7CisgIEdQUl9BU1NFUlQodGNwLT53cml0ZV9zbGljZXMtPmNvdW50IDw9IFVJTlRfTUFYKTsKKyAgaWYgKHRjcC0+d3JpdGVfc2xpY2VzLT5jb3VudCA+IEdQUl9BUlJBWV9TSVpFKGxvY2FsX2J1ZmZlcnMpKSB7CisgICAgYnVmZmVycyA9IChXU0FCVUYgKilncHJfbWFsbG9jKHNpemVvZihXU0FCVUYpICogdGNwLT53cml0ZV9zbGljZXMtPmNvdW50KTsKKyAgICBhbGxvY2F0ZWQgPSBidWZmZXJzOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHRjcC0+d3JpdGVfc2xpY2VzLT5jb3VudDsgaSsrKSB7CisgICAgbGVuID0gR1BSX1NMSUNFX0xFTkdUSCh0Y3AtPndyaXRlX3NsaWNlcy0+c2xpY2VzW2ldKTsKKyAgICBHUFJfQVNTRVJUKGxlbiA8PSBVTE9OR19NQVgpOworICAgIGJ1ZmZlcnNbaV0ubGVuID0gKFVMT05HKWxlbjsKKyAgICBidWZmZXJzW2ldLmJ1ZiA9IChjaGFyICopR1BSX1NMSUNFX1NUQVJUX1BUUih0Y3AtPndyaXRlX3NsaWNlcy0+c2xpY2VzW2ldKTsKKyAgfQorCisgIC8qIEZpcnN0LCBsZXQncyB0cnkgYSBzeW5jaHJvbm91cywgbm9uLWJsb2NraW5nIHdyaXRlLiAqLworICBzdGF0dXMgPSBXU0FTZW5kKHNvY2tldC0+c29ja2V0LCBidWZmZXJzLCAoRFdPUkQpdGNwLT53cml0ZV9zbGljZXMtPmNvdW50LAorICAgICAgICAgICAgICAgICAgICZieXRlc19zZW50LCAwLCBOVUxMLCBOVUxMKTsKKyAgaW5mby0+d3NhX2Vycm9yID0gc3RhdHVzID09IDAgPyAwIDogV1NBR2V0TGFzdEVycm9yKCk7CisKKyAgLyogV2Ugd291bGQga2luZCBvZiBleHBlY3QgdG8gZ2V0IGEgV1NBRVdPVUxEQkxPQ0sgaGVyZSwgZXNwZWNpYWxseSBvbiBhIGJ1c3kKKyAgICAgY29ubmVjdGlvbiB0aGF0IGhhcyBpdHMgc2VuZCBxdWV1ZSBmaWxsZWQgdXAuIEJ1dCBpZiB3ZSBkb24ndCwgdGhlbiB3ZSBjYW4KKyAgICAgYXZvaWQgZG9pbmcgYW4gYXN5bmMgd3JpdGUgb3BlcmF0aW9uIGF0IGFsbC4gKi8KKyAgaWYgKGluZm8tPndzYV9lcnJvciAhPSBXU0FFV09VTERCTE9DSykgeworICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgIG9rID0gdHJ1ZTsKKyAgICAgIEdQUl9BU1NFUlQoYnl0ZXNfc2VudCA9PSB0Y3AtPndyaXRlX3NsaWNlcy0+bGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGluZm8tPndzYV9lcnJvciAhPSBXU0FFQ09OTlJFU0VUKSB7CisgICAgICAgIGNoYXIgKnV0ZjhfbWVzc2FnZSA9IGdwcl9mb3JtYXRfbWVzc2FnZShpbmZvLT53c2FfZXJyb3IpOworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIldTQVNlbmQgZXJyb3I6ICVzIiwgdXRmOF9tZXNzYWdlKTsKKyAgICAgICAgZ3ByX2ZyZWUodXRmOF9tZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsbG9jYXRlZCkgZ3ByX2ZyZWUoYWxsb2NhdGVkKTsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBvaywgTlVMTCk7CisgICAgcmV0dXJuOworICB9CisKKyAgVENQX1JFRih0Y3AsICJ3cml0ZSIpOworCisgIC8qIElmIHdlIGdvdCBhIFdTQUVXT1VMREJMT0NLIGVhcmxpZXIsIHRoZW4gd2UgbmVlZCB0byByZS1kbyB0aGUgc2FtZQorICAgICBvcGVyYXRpb24sIHRoaXMgdGltZSBhc3luY2hyb25vdXNseS4gKi8KKyAgbWVtc2V0KCZzb2NrZXQtPndyaXRlX2luZm8ub3ZlcmxhcHBlZCwgMCwgc2l6ZW9mKE9WRVJMQVBQRUQpKTsKKyAgc3RhdHVzID0gV1NBU2VuZChzb2NrZXQtPnNvY2tldCwgYnVmZmVycywgKERXT1JEKXRjcC0+d3JpdGVfc2xpY2VzLT5jb3VudCwKKyAgICAgICAgICAgICAgICAgICAmYnl0ZXNfc2VudCwgMCwgJnNvY2tldC0+d3JpdGVfaW5mby5vdmVybGFwcGVkLCBOVUxMKTsKKyAgaWYgKGFsbG9jYXRlZCkgZ3ByX2ZyZWUoYWxsb2NhdGVkKTsKKworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBpbnQgd3NhX2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKHdzYV9lcnJvciAhPSBXU0FfSU9fUEVORElORykgeworICAgICAgVENQX1VOUkVGKHRjcCwgIndyaXRlIik7CisgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBmYWxzZSwgTlVMTCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogQXMgYWxsIGlzIG5vdyBzZXR1cCwgd2UgY2FuIG5vdyBhc2sgZm9yIHRoZSBJT0NQIG5vdGlmaWNhdGlvbi4gSXQgbWF5CisgICAgIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5IGhvd2V2ZXIsIGJ1dCBubyBtYXR0ZXIuICovCisgIGdycGNfc29ja2V0X25vdGlmeV9vbl93cml0ZShleGVjX2N0eCwgc29ja2V0LCAmdGNwLT5vbl93cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdpbl9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwcykgeworICBncnBjX3RjcCAqdGNwOworICAodm9pZClwczsKKyAgdGNwID0gKGdycGNfdGNwICopZXA7CisgIGdycGNfaW9jcF9hZGRfc29ja2V0KHRjcC0+c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQgd2luX2FkZF90b19wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBzcykgeworICBncnBjX3RjcCAqdGNwOworICAodm9pZClwc3M7CisgIHRjcCA9IChncnBjX3RjcCAqKWVwOworICBncnBjX2lvY3BfYWRkX3NvY2tldCh0Y3AtPnNvY2tldCk7Cit9CisKKy8qIEluaXRpYXRlcyBhIHNodXRkb3duIG9mIHRoZSBUQ1AgZW5kcG9pbnQuIFRoaXMgd2lsbCBxdWV1ZSBhYm9ydCBjYWxsYmFja3MKKyAgIGZvciB0aGUgcG90ZW50aWFsIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8KKyAgIGd1YXJhbnRlZSB0aGlzIGlzbid0IGNhbGxlZCBpbiBwYXJhbGxlbCB0byBhIHJlYWQgb3Igd3JpdGUgcmVxdWVzdCwgc28KKyAgIHdlJ3JlIG5vdCBnb2luZyB0byBwcm90ZWN0IGFnYWluc3QgdGhlc2UuIEhvd2V2ZXIgdGhlIElPIENvbXBsZXRpb24gUG9ydAorICAgY2FsbGJhY2sgd2lsbCBoYXBwZW4gZnJvbSBhbm90aGVyIHRocmVhZCwgc28gd2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QKKyAgIGNvbmN1cnJlbnQgYWNjZXNzIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiB0aGF0IHJlZ2FyZC4gKi8KK3N0YXRpYyB2b2lkIHdpbl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOworICBncHJfbXVfbG9jaygmdGNwLT5tdSk7CisgIC8qIEF0IHRoYXQgcG9pbnQsIHdoYXQgbWF5IGhhcHBlbiBpcyB0aGF0IHdlJ3JlIGFscmVhZHkgaW5zaWRlIHRoZSBJT0NQCisgICAgIGNhbGxiYWNrLiBTZWUgdGhlIGNvbW1lbnRzIGluIG9uX3JlYWQgYW5kIG9uX3dyaXRlLiAqLworICB0Y3AtPnNodXR0aW5nX2Rvd24gPSAxOworICBncnBjX3dpbnNvY2tldF9zaHV0ZG93bih0Y3AtPnNvY2tldCk7CisgIGdwcl9tdV91bmxvY2soJnRjcC0+bXUpOworfQorCitzdGF0aWMgdm9pZCB3aW5fZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqZXApIHsKKyAgZ3JwY190Y3AgKnRjcCA9IChncnBjX3RjcCAqKWVwOworICBUQ1BfVU5SRUYodGNwLCAiZGVzdHJveSIpOworfQorCitzdGF0aWMgY2hhciAqd2luX2dldF9wZWVyKGdycGNfZW5kcG9pbnQgKmVwKSB7CisgIGdycGNfdGNwICp0Y3AgPSAoZ3JwY190Y3AgKillcDsKKyAgcmV0dXJuIGdwcl9zdHJkdXAodGNwLT5wZWVyX3N0cmluZyk7Cit9CisKK3N0YXRpYyBncnBjX2VuZHBvaW50X3Z0YWJsZSB2dGFibGUgPSB7CisgICAgd2luX3JlYWQsICAgICB3aW5fd3JpdGUsICAgd2luX2FkZF90b19wb2xsc2V0LCB3aW5fYWRkX3RvX3BvbGxzZXRfc2V0LAorICAgIHdpbl9zaHV0ZG93biwgd2luX2Rlc3Ryb3ksIHdpbl9nZXRfcGVlcn07CisKK2dycGNfZW5kcG9pbnQgKmdycGNfdGNwX2NyZWF0ZShncnBjX3dpbnNvY2tldCAqc29ja2V0LCBjaGFyICpwZWVyX3N0cmluZykgeworICBncnBjX3RjcCAqdGNwID0gKGdycGNfdGNwICopZ3ByX21hbGxvYyhzaXplb2YoZ3JwY190Y3ApKTsKKyAgbWVtc2V0KHRjcCwgMCwgc2l6ZW9mKGdycGNfdGNwKSk7CisgIHRjcC0+YmFzZS52dGFibGUgPSAmdnRhYmxlOworICB0Y3AtPnNvY2tldCA9IHNvY2tldDsKKyAgZ3ByX211X2luaXQoJnRjcC0+bXUpOworICBncHJfcmVmX2luaXQoJnRjcC0+cmVmY291bnQsIDEpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmdGNwLT5vbl9yZWFkLCBvbl9yZWFkLCB0Y3ApOworICBncnBjX2Nsb3N1cmVfaW5pdCgmdGNwLT5vbl93cml0ZSwgb25fd3JpdGUsIHRjcCk7CisgIHRjcC0+cGVlcl9zdHJpbmcgPSBncHJfc3RyZHVwKHBlZXJfc3RyaW5nKTsKKyAgcmV0dXJuICZ0Y3AtPmJhc2U7Cit9CisKKyNlbmRpZiAvKiBHUFJfV0lOU09DS19TT0NLRVQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ZWJkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9UQ1BfV0lORE9XU19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfVENQX1dJTkRPV1NfSAorLyoKKyAgIExvdyBsZXZlbCBUQ1AgImJvdHRvbSBoYWxmIiBpbXBsZW1lbnRhdGlvbiwgZm9yIHVzZSBieSB0cmFuc3BvcnRzIGJ1aWx0IG9uCisgICB0b3Agb2YgYSBUQ1AgY29ubmVjdGlvbi4KKworICAgTm90ZSB0aGF0IHRoaXMgZmlsZSBkb2VzIG5vdCAoeWV0KSBpbmNsdWRlIEFQSXMgZm9yIGNyZWF0aW5nIHRoZSBzb2NrZXQgaW4KKyAgIHRoZSBmaXJzdCBwbGFjZS4KKworICAgQWxsIGNhbGxzIHBhc3Npbmcgc2xpY2UgdHJhbnNmZXIgb3duZXJzaGlwIG9mIGEgc2xpY2UgcmVmY291bnQgdW5sZXNzCisgICBvdGhlcndpc2Ugc3BlY2lmaWVkLgorKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIgorCisvKiBDcmVhdGUgYSB0Y3AgZW5kcG9pbnQgZ2l2ZW4gYSB3aW5zb2NrIGhhbmRsZS4KKyAqIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlLgorICovCitncnBjX2VuZHBvaW50ICpncnBjX3RjcF9jcmVhdGUoZ3JwY193aW5zb2NrZXQgKnNvY2tldCwgY2hhciAqcGVlcl9zdHJpbmcpOworCitpbnQgZ3JwY190Y3BfcHJlcGFyZV9zb2NrZXQoU09DS0VUIHNvY2spOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9UQ1BfV0lORE9XU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRkNjgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaCIKKwordm9pZCBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfaW5pdChncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW5pdF9hdmcsIGRvdWJsZSByZWdyZXNzX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBlcnNpc3RlbmNlX2ZhY3RvcikgeworICBzdGF0cy0+aW5pdF9hdmcgPSBpbml0X2F2ZzsKKyAgc3RhdHMtPnJlZ3Jlc3Nfd2VpZ2h0ID0gcmVncmVzc193ZWlnaHQ7CisgIHN0YXRzLT5wZXJzaXN0ZW5jZV9mYWN0b3IgPSBwZXJzaXN0ZW5jZV9mYWN0b3I7CisgIHN0YXRzLT5iYXRjaF90b3RhbF92YWx1ZSA9IDA7CisgIHN0YXRzLT5iYXRjaF9udW1fc2FtcGxlcyA9IDA7CisgIHN0YXRzLT5hZ2dyZWdhdGVfdG90YWxfd2VpZ2h0ID0gMDsKKyAgc3RhdHMtPmFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmcgPSBpbml0X2F2ZzsKK30KKwordm9pZCBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfYWRkX3NhbXBsZShncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIHsKKyAgc3RhdHMtPmJhdGNoX3RvdGFsX3ZhbHVlICs9IHZhbHVlOworICArK3N0YXRzLT5iYXRjaF9udW1fc2FtcGxlczsKK30KKworZG91YmxlIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c191cGRhdGVfYXZlcmFnZSgKKyAgICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzKSB7CisgIC8qIFN0YXJ0IHdpdGggdGhlIGN1cnJlbnQgYmF0Y2g6ICovCisgIGRvdWJsZSB3ZWlnaHRlZF9zdW0gPSBzdGF0cy0+YmF0Y2hfdG90YWxfdmFsdWU7CisgIGRvdWJsZSB0b3RhbF93ZWlnaHQgPSBzdGF0cy0+YmF0Y2hfbnVtX3NhbXBsZXM7CisgIGlmIChzdGF0cy0+cmVncmVzc193ZWlnaHQgPiAwKSB7CisgICAgLyogQWRkIGluIHRoZSByZWdyZXNzaW9uIHRvd2FyZHMgaW5pdF9hdmdfOiAqLworICAgIHdlaWdodGVkX3N1bSArPSBzdGF0cy0+cmVncmVzc193ZWlnaHQgKiBzdGF0cy0+aW5pdF9hdmc7CisgICAgdG90YWxfd2VpZ2h0ICs9IHN0YXRzLT5yZWdyZXNzX3dlaWdodDsKKyAgfQorICBpZiAoc3RhdHMtPnBlcnNpc3RlbmNlX2ZhY3RvciA+IDApIHsKKyAgICAvKiBBZGQgaW4gdGhlIHBlcnNpc3RlbmNlOiAqLworICAgIGNvbnN0IGRvdWJsZSBwcmV2X3NhbXBsZV93ZWlnaHQgPQorICAgICAgICBzdGF0cy0+cGVyc2lzdGVuY2VfZmFjdG9yICogc3RhdHMtPmFnZ3JlZ2F0ZV90b3RhbF93ZWlnaHQ7CisgICAgd2VpZ2h0ZWRfc3VtICs9IHByZXZfc2FtcGxlX3dlaWdodCAqIHN0YXRzLT5hZ2dyZWdhdGVfd2VpZ2h0ZWRfYXZnOworICAgIHRvdGFsX3dlaWdodCArPSBwcmV2X3NhbXBsZV93ZWlnaHQ7CisgIH0KKyAgc3RhdHMtPmFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmcgPQorICAgICAgKHRvdGFsX3dlaWdodCA+IDApID8gKHdlaWdodGVkX3N1bSAvIHRvdGFsX3dlaWdodCkgOiBzdGF0cy0+aW5pdF9hdmc7CisgIHN0YXRzLT5hZ2dyZWdhdGVfdG90YWxfd2VpZ2h0ID0gdG90YWxfd2VpZ2h0OworICBzdGF0cy0+YmF0Y2hfbnVtX3NhbXBsZXMgPSAwOworICBzdGF0cy0+YmF0Y2hfdG90YWxfdmFsdWUgPSAwOworICByZXR1cm4gc3RhdHMtPmFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmc7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTY2MmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaApAQCAtMCwwICsxLDg4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfVElNRV9BVkVSQUdFRF9TVEFUU19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfVElNRV9BVkVSQUdFRF9TVEFUU19ICisKKy8qIFRoaXMgdHJhY2tzIGEgdGltZS1kZWNheWluZyB3ZWlnaHRlZCBhdmVyYWdlLiAgSXQgd29ya3MgYnkgY29sbGVjdGluZworICAgYmF0Y2hlcyBvZiBzYW1wbGVzIGFuZCB0aGVuIG1peGluZyB0aGVpciBhdmVyYWdlIGludG8gYSB0aW1lLWRlY2F5aW5nCisgICB3ZWlnaHRlZCBtZWFuLiAgSXQgaXMgZGVzaWduZWQgZm9yIGJhdGNoIG9wZXJhdGlvbnMgd2hlcmUgd2UgZG8gbWFueSBhZGRzCisgICBiZWZvcmUgdXBkYXRpbmcgdGhlIGF2ZXJhZ2UuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhlIGluaXRpYWwgYXZlcmFnZSB2YWx1ZS4gIFRoaXMgaXMgdGhlIHJlcG9ydGVkIGF2ZXJhZ2UgdW50aWwgdGhlIGZpcnN0CisgICAgIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c191cGRhdGVfYXZlcmFnZSBjYWxsLiAgSWYgYSBwb3NpdGl2ZSByZWdyZXNzX3dlaWdodAorICAgICBpcyB1c2VkLCB3ZSBhbHNvIHJlZ3Jlc3MgdG93YXJkcyB0aGlzIHZhbHVlIG9uIGVhY2ggdXBkYXRlLiAqLworICBkb3VibGUgaW5pdF9hdmc7CisgIC8qIFRoZSBzYW1wbGUgd2VpZ2h0IG9mICJpbml0X2F2ZyIgdGhhdCBpcyBtaXhlZCBpbiB3aXRoIGVhY2ggY2FsbCB0bworICAgICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfdXBkYXRlX2F2ZXJhZ2UuICBJZiB0aGUgY2FsbHMgdG8KKyAgICAgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX2FkZF9zYW1wbGUgc3RvcCwgdGhpcyB3aWxsIGNhdXNlIHRoZSBhdmVyYWdlIHRvCisgICAgIHJlZ3Jlc3MgYmFjayB0byB0aGUgbWVhbi4gIFRoaXMgc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZS4gIFNldCBpdCB0byAwIHRvCisgICAgIGRpc2FibGUgdGhlIGJpYXMuICBBIHZhbHVlIG9mIDEgaGFzIHRoZSBlZmZlY3Qgb2YgYWRkaW5nIGluIDEgYm9udXMgc2FtcGxlCisgICAgIHdpdGggdmFsdWUgaW5pdF9hdmcgdG8gZWFjaCBzYW1wbGUgcGVyaW9kLiAqLworICBkb3VibGUgcmVncmVzc193ZWlnaHQ7CisgIC8qIFRoaXMgZGV0ZXJtaW5lcyB0aGUgcmF0ZSBvZiBkZWNheSBvZiB0aGUgdGltZS1hdmVyYWdpbmcgZnJvbSBvbmUgcGVyaW9kCisgICAgIHRvIHRoZSBuZXh0IGJ5IHNjYWxpbmcgdGhlIGFnZ3JlZ2F0ZV90b3RhbF93ZWlnaHQgb2Ygc2FtcGxlcyBmcm9tIHByaW9yCisgICAgIHBlcmlvZHMgd2hlbiBjb21iaW5pbmcgd2l0aCB0aGUgbGF0ZXN0IHBlcmlvZC4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UKKyAgICAgWzAsMV0uICBBIGhpZ2hlciB2YWx1ZSBhZGFwdHMgbW9yZSBzbG93bHkuICBXaXRoIGEgdmFsdWUgb2YgMC41LCBpZiB0aGUKKyAgICAgYmF0Y2hlcyBlYWNoIGhhdmUgayBzYW1wbGVzLCB0aGUgc2FtcGxlc19pbl9hdmdfIHdpbGwgZ3JvdyB0byAyIGssIHNvIHRoZQorICAgICB3ZWlnaHRpbmcgb2YgdGhlIHRpbWUgYXZlcmFnZSB3aWxsIGV2ZW50dWFsbHkgYmUgMS8zIG5ldyBiYXRjaCBhbmQgMi8zCisgICAgIG9sZCBhdmVyYWdlLiAqLworICBkb3VibGUgcGVyc2lzdGVuY2VfZmFjdG9yOworCisgIC8qIFRoZSB0b3RhbCB2YWx1ZSBvZiBzYW1wbGVzIHNpbmNlIHRoZSBsYXN0IFVwZGF0ZUF2ZXJhZ2UoKS4gKi8KKyAgZG91YmxlIGJhdGNoX3RvdGFsX3ZhbHVlOworICAvKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgc2luY2UgdGhlIGxhc3QgVXBkYXRlQXZlcmFnZSgpLiAqLworICBkb3VibGUgYmF0Y2hfbnVtX3NhbXBsZXM7CisgIC8qIFRoZSB0aW1lLWRlY2F5ZWQgc3VtIG9mIGJhdGNoX251bV9zYW1wbGVzXyBvdmVyIHByZXZpb3VzIGJhdGNoZXMuICBUaGlzIGlzCisgICAgIHRoZSAid2VpZ2h0IiBvZiB0aGUgb2xkIGFnZ3JlZ2F0ZV93ZWlnaHRlZF9hdmdfIHdoZW4gdXBkYXRpbmcgdGhlCisgICAgIGF2ZXJhZ2UuICovCisgIGRvdWJsZSBhZ2dyZWdhdGVfdG90YWxfd2VpZ2h0OworICAvKiBBIHRpbWUtZGVjYXllZCBhdmVyYWdlIG9mIHRoZSAoYmF0Y2hfdG90YWxfdmFsdWVfIC8gYmF0Y2hfbnVtX3NhbXBsZXNfKSwKKyAgICAgY29tcHV0ZWQgYnkgZGVjYXlpbmcgdGhlIHNhbXBsZXNfaW5fYXZnXyB3ZWlnaHQgaW4gdGhlIHdlaWdodGVkIGF2ZXJhZ2UuICovCisgIGRvdWJsZSBhZ2dyZWdhdGVfd2VpZ2h0ZWRfYXZnOworfSBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHM7CisKKy8qIFNlZSB0aGUgY29tbWVudHMgb24gdGhlIG1lbWJlcnMgYWJvdmUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGluaXRfYXZnLAorICAgcmVncmVzc193ZWlnaHQsIGFuZCBwZXJzaXN0ZW5jZV9mYWN0b3IuICovCit2b2lkIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c19pbml0KGdycGNfdGltZV9hdmVyYWdlZF9zdGF0cyogc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbml0X2F2ZywgZG91YmxlIHJlZ3Jlc3Nfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyc2lzdGVuY2VfZmFjdG9yKTsKKy8qIEFkZCBhIHNhbXBsZSB0byB0aGUgY3VycmVudCBiYXRjaC4gKi8KK3ZvaWQgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX2FkZF9zYW1wbGUoZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzKiBzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKKy8qIENvbXBsZXRlIGEgYmF0Y2ggYW5kIGNvbXB1dGUgdGhlIG5ldyBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBzYW1wbGUKKyAgIHZhbHVlLiAqLworZG91YmxlIGdycGNfdGltZV9hdmVyYWdlZF9zdGF0c191cGRhdGVfYXZlcmFnZShncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHMqIHN0YXRzKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfVElNRV9BVkVSQUdFRF9TVEFUU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuYyBiL3NyYy9jb3JlL2xpYi9pb21nci90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDhmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuYwpAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCIKKworI2RlZmluZSBJTlZBTElEX0hFQVBfSU5ERVggMHhmZmZmZmZmZnUKKworI2RlZmluZSBMT0cyX05VTV9TSEFSRFMgNQorI2RlZmluZSBOVU1fU0hBUkRTICgxIDw8IExPRzJfTlVNX1NIQVJEUykKKyNkZWZpbmUgQUREX0RFQURMSU5FX1NDQUxFIDAuMzMKKyNkZWZpbmUgTUlOX1FVRVVFX1dJTkRPV19EVVJBVElPTiAwLjAxCisjZGVmaW5lIE1BWF9RVUVVRV9XSU5ET1dfRFVSQVRJT04gMQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGdwcl9tdSBtdTsKKyAgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzIHN0YXRzOworICAvKiBBbGwgYW5kIG9ubHkgdGltZXJzIHdpdGggZGVhZGxpbmVzIDw9IHRoaXMgd2lsbCBiZSBpbiB0aGUgaGVhcC4gKi8KKyAgZ3ByX3RpbWVzcGVjIHF1ZXVlX2RlYWRsaW5lX2NhcDsKKyAgZ3ByX3RpbWVzcGVjIG1pbl9kZWFkbGluZTsKKyAgLyogSW5kZXggaW4gdGhlIGdfc2hhcmRfcXVldWUgKi8KKyAgdWludDMyX3Qgc2hhcmRfcXVldWVfaW5kZXg7CisgIC8qIFRoaXMgaG9sZHMgYWxsIHRpbWVycyB3aXRoIGRlYWRsaW5lcyA8IHF1ZXVlX2RlYWRsaW5lX2NhcC4gVGltZXJzIGluIHRoaXMKKyAgICAgbGlzdCBoYXZlIHRoZSB0b3AgYml0IG9mIHRoZWlyIGRlYWRsaW5lIHNldCB0byAwLiAqLworICBncnBjX3RpbWVyX2hlYXAgaGVhcDsKKyAgLyogVGhpcyBob2xkcyB0aW1lcnMgd2hvc2UgZGVhZGxpbmUgaXMgPj0gcXVldWVfZGVhZGxpbmVfY2FwLiAqLworICBncnBjX3RpbWVyIGxpc3Q7Cit9IHNoYXJkX3R5cGU7CisKKy8qIFByb3RlY3RzIGdfc2hhcmRfcXVldWUgKi8KK3N0YXRpYyBncHJfbXUgZ19tdTsKKy8qIEFsbG93IG9ubHkgb25lIHJ1bl9zb21lX2V4cGlyZWRfdGltZXJzIGF0IG9uY2UgKi8KK3N0YXRpYyBncHJfbXUgZ19jaGVja2VyX211Oworc3RhdGljIGdwcl9jbG9ja190eXBlIGdfY2xvY2tfdHlwZTsKK3N0YXRpYyBzaGFyZF90eXBlIGdfc2hhcmRzW05VTV9TSEFSRFNdOworLyogUHJvdGVjdGVkIGJ5IGdfbXUgKi8KK3N0YXRpYyBzaGFyZF90eXBlICpnX3NoYXJkX3F1ZXVlW05VTV9TSEFSRFNdOworCitzdGF0aWMgaW50IHJ1bl9zb21lX2V4cGlyZWRfdGltZXJzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncHJfdGltZXNwZWMgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgKm5leHQsIGludCBzdWNjZXNzKTsKKworc3RhdGljIGdwcl90aW1lc3BlYyBjb21wdXRlX21pbl9kZWFkbGluZShzaGFyZF90eXBlICpzaGFyZCkgeworICByZXR1cm4gZ3JwY190aW1lcl9oZWFwX2lzX2VtcHR5KCZzaGFyZC0+aGVhcCkKKyAgICAgICAgICAgICA/IHNoYXJkLT5xdWV1ZV9kZWFkbGluZV9jYXAKKyAgICAgICAgICAgICA6IGdycGNfdGltZXJfaGVhcF90b3AoJnNoYXJkLT5oZWFwKS0+ZGVhZGxpbmU7Cit9CisKK3ZvaWQgZ3JwY190aW1lcl9saXN0X2luaXQoZ3ByX3RpbWVzcGVjIG5vdykgeworICB1aW50MzJfdCBpOworCisgIGdwcl9tdV9pbml0KCZnX211KTsKKyAgZ3ByX211X2luaXQoJmdfY2hlY2tlcl9tdSk7CisgIGdfY2xvY2tfdHlwZSA9IG5vdy5jbG9ja190eXBlOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUkRTOyBpKyspIHsKKyAgICBzaGFyZF90eXBlICpzaGFyZCA9ICZnX3NoYXJkc1tpXTsKKyAgICBncHJfbXVfaW5pdCgmc2hhcmQtPm11KTsKKyAgICBncnBjX3RpbWVfYXZlcmFnZWRfc3RhdHNfaW5pdCgmc2hhcmQtPnN0YXRzLCAxLjAgLyBBRERfREVBRExJTkVfU0NBTEUsIDAuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUpOworICAgIHNoYXJkLT5xdWV1ZV9kZWFkbGluZV9jYXAgPSBub3c7CisgICAgc2hhcmQtPnNoYXJkX3F1ZXVlX2luZGV4ID0gaTsKKyAgICBncnBjX3RpbWVyX2hlYXBfaW5pdCgmc2hhcmQtPmhlYXApOworICAgIHNoYXJkLT5saXN0Lm5leHQgPSBzaGFyZC0+bGlzdC5wcmV2ID0gJnNoYXJkLT5saXN0OworICAgIHNoYXJkLT5taW5fZGVhZGxpbmUgPSBjb21wdXRlX21pbl9kZWFkbGluZShzaGFyZCk7CisgICAgZ19zaGFyZF9xdWV1ZVtpXSA9IHNoYXJkOworICB9Cit9CisKK3ZvaWQgZ3JwY190aW1lcl9saXN0X3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4KSB7CisgIGludCBpOworICBydW5fc29tZV9leHBpcmVkX3RpbWVycyhleGVjX2N0eCwgZ3ByX2luZl9mdXR1cmUoZ19jbG9ja190eXBlKSwgTlVMTCwgMCk7CisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0hBUkRTOyBpKyspIHsKKyAgICBzaGFyZF90eXBlICpzaGFyZCA9ICZnX3NoYXJkc1tpXTsKKyAgICBncHJfbXVfZGVzdHJveSgmc2hhcmQtPm11KTsKKyAgICBncnBjX3RpbWVyX2hlYXBfZGVzdHJveSgmc2hhcmQtPmhlYXApOworICB9CisgIGdwcl9tdV9kZXN0cm95KCZnX211KTsKKyAgZ3ByX211X2Rlc3Ryb3koJmdfY2hlY2tlcl9tdSk7Cit9CisKKy8qIFRoaXMgaXMgYSBjaGVhcCwgYnV0IGdvb2QgZW5vdWdoLCBwb2ludGVyIGhhc2ggZm9yIHNoYXJkaW5nIHRoZSB0YXNrczogKi8KK3N0YXRpYyBzaXplX3Qgc2hhcmRfaWR4KGNvbnN0IGdycGNfdGltZXIgKmluZm8pIHsKKyAgc2l6ZV90IHggPSAoc2l6ZV90KWluZm87CisgIHJldHVybiAoKHggPj4gNCkgXiAoeCA+PiA5KSBeICh4ID4+IDE0KSkgJiAoTlVNX1NIQVJEUyAtIDEpOworfQorCitzdGF0aWMgZG91YmxlIHRzX3RvX2RibChncHJfdGltZXNwZWMgdHMpIHsKKyAgcmV0dXJuIChkb3VibGUpdHMudHZfc2VjICsgMWUtOSAqIHRzLnR2X25zZWM7Cit9CisKK3N0YXRpYyBncHJfdGltZXNwZWMgZGJsX3RvX3RzKGRvdWJsZSBkKSB7CisgIGdwcl90aW1lc3BlYyB0czsKKyAgdHMudHZfc2VjID0gKGludDY0X3QpZDsKKyAgdHMudHZfbnNlYyA9IChpbnQzMl90KSgxZTkgKiAoZCAtIChkb3VibGUpdHMudHZfc2VjKSk7CisgIHRzLmNsb2NrX3R5cGUgPSBHUFJfVElNRVNQQU47CisgIHJldHVybiB0czsKK30KKworc3RhdGljIHZvaWQgbGlzdF9qb2luKGdycGNfdGltZXIgKmhlYWQsIGdycGNfdGltZXIgKnRpbWVyKSB7CisgIHRpbWVyLT5uZXh0ID0gaGVhZDsKKyAgdGltZXItPnByZXYgPSBoZWFkLT5wcmV2OworICB0aW1lci0+bmV4dC0+cHJldiA9IHRpbWVyLT5wcmV2LT5uZXh0ID0gdGltZXI7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfcmVtb3ZlKGdycGNfdGltZXIgKnRpbWVyKSB7CisgIHRpbWVyLT5uZXh0LT5wcmV2ID0gdGltZXItPnByZXY7CisgIHRpbWVyLT5wcmV2LT5uZXh0ID0gdGltZXItPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfYWRqYWNlbnRfc2hhcmRzX2luX3F1ZXVlKHVpbnQzMl90IGZpcnN0X3NoYXJkX3F1ZXVlX2luZGV4KSB7CisgIHNoYXJkX3R5cGUgKnRlbXA7CisgIHRlbXAgPSBnX3NoYXJkX3F1ZXVlW2ZpcnN0X3NoYXJkX3F1ZXVlX2luZGV4XTsKKyAgZ19zaGFyZF9xdWV1ZVtmaXJzdF9zaGFyZF9xdWV1ZV9pbmRleF0gPQorICAgICAgZ19zaGFyZF9xdWV1ZVtmaXJzdF9zaGFyZF9xdWV1ZV9pbmRleCArIDFdOworICBnX3NoYXJkX3F1ZXVlW2ZpcnN0X3NoYXJkX3F1ZXVlX2luZGV4ICsgMV0gPSB0ZW1wOworICBnX3NoYXJkX3F1ZXVlW2ZpcnN0X3NoYXJkX3F1ZXVlX2luZGV4XS0+c2hhcmRfcXVldWVfaW5kZXggPQorICAgICAgZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXg7CisgIGdfc2hhcmRfcXVldWVbZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXggKyAxXS0+c2hhcmRfcXVldWVfaW5kZXggPQorICAgICAgZmlyc3Rfc2hhcmRfcXVldWVfaW5kZXggKyAxOworfQorCitzdGF0aWMgdm9pZCBub3RlX2RlYWRsaW5lX2NoYW5nZShzaGFyZF90eXBlICpzaGFyZCkgeworICB3aGlsZSAoc2hhcmQtPnNoYXJkX3F1ZXVlX2luZGV4ID4gMCAmJgorICAgICAgICAgZ3ByX3RpbWVfY21wKAorICAgICAgICAgICAgIHNoYXJkLT5taW5fZGVhZGxpbmUsCisgICAgICAgICAgICAgZ19zaGFyZF9xdWV1ZVtzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggLSAxXS0+bWluX2RlYWRsaW5lKSA8IDApIHsKKyAgICBzd2FwX2FkamFjZW50X3NoYXJkc19pbl9xdWV1ZShzaGFyZC0+c2hhcmRfcXVldWVfaW5kZXggLSAxKTsKKyAgfQorICB3aGlsZSAoc2hhcmQtPnNoYXJkX3F1ZXVlX2luZGV4IDwgTlVNX1NIQVJEUyAtIDEgJiYKKyAgICAgICAgIGdwcl90aW1lX2NtcCgKKyAgICAgICAgICAgICBzaGFyZC0+bWluX2RlYWRsaW5lLAorICAgICAgICAgICAgIGdfc2hhcmRfcXVldWVbc2hhcmQtPnNoYXJkX3F1ZXVlX2luZGV4ICsgMV0tPm1pbl9kZWFkbGluZSkgPiAwKSB7CisgICAgc3dhcF9hZGphY2VudF9zaGFyZHNfaW5fcXVldWUoc2hhcmQtPnNoYXJkX3F1ZXVlX2luZGV4KTsKKyAgfQorfQorCit2b2lkIGdycGNfdGltZXJfaW5pdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190aW1lciAqdGltZXIsCisgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdycGNfaW9tZ3JfY2JfZnVuYyB0aW1lcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRpbWVyX2NiX2FyZywgZ3ByX3RpbWVzcGVjIG5vdykgeworICBpbnQgaXNfZmlyc3RfdGltZXIgPSAwOworICBzaGFyZF90eXBlICpzaGFyZCA9ICZnX3NoYXJkc1tzaGFyZF9pZHgodGltZXIpXTsKKyAgR1BSX0FTU0VSVChkZWFkbGluZS5jbG9ja190eXBlID09IGdfY2xvY2tfdHlwZSk7CisgIEdQUl9BU1NFUlQobm93LmNsb2NrX3R5cGUgPT0gZ19jbG9ja190eXBlKTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnRpbWVyLT5jbG9zdXJlLCB0aW1lcl9jYiwgdGltZXJfY2JfYXJnKTsKKyAgdGltZXItPmRlYWRsaW5lID0gZGVhZGxpbmU7CisgIHRpbWVyLT50cmlnZ2VyZWQgPSAwOworCisgIC8qIFRPRE8oY3RpbGxlcik6IGNoZWNrIGRlYWRsaW5lIGV4cGlyZWQgKi8KKworICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKKyAgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX2FkZF9zYW1wbGUoJnNoYXJkLT5zdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfdG9fZGJsKGdwcl90aW1lX3N1YihkZWFkbGluZSwgbm93KSkpOworICBpZiAoZ3ByX3RpbWVfY21wKGRlYWRsaW5lLCBzaGFyZC0+cXVldWVfZGVhZGxpbmVfY2FwKSA8IDApIHsKKyAgICBpc19maXJzdF90aW1lciA9IGdycGNfdGltZXJfaGVhcF9hZGQoJnNoYXJkLT5oZWFwLCB0aW1lcik7CisgIH0gZWxzZSB7CisgICAgdGltZXItPmhlYXBfaW5kZXggPSBJTlZBTElEX0hFQVBfSU5ERVg7CisgICAgbGlzdF9qb2luKCZzaGFyZC0+bGlzdCwgdGltZXIpOworICB9CisgIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7CisKKyAgLyogRGVhZGxpbmUgbWF5IGhhdmUgZGVjcmVhc2VkLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbWFzdGVyIHF1ZXVlLiAgTm90ZQorICAgICB0aGF0IHRoZXJlIGlzIGEgcG90ZW50aWFsIHJhY3kgdW5sb2NrZWQgcmVnaW9uIGhlcmUuICBUaGVyZSBjb3VsZCBiZSBhCisgICAgIHJlb3JkZXJpbmcgb2YgbXVsdGlwbGUgZ3JwY190aW1lcl9pbml0IGNhbGxzLCBhdCB0aGlzIHBvaW50LCBidXQgdGhlIDwgdGVzdAorICAgICBiZWxvdyBzaG91bGQgZW5zdXJlIHRoYXQgd2UgZXJyIG9uIHRoZSBzaWRlIG9mIGNhdXRpb24uICBUaGVyZSBjb3VsZAorICAgICBhbHNvIGJlIGEgcmFjZSB3aXRoIGdycGNfdGltZXJfY2hlY2ssIHdoaWNoIG1pZ2h0IGJlYXQgdXMgdG8gdGhlIGxvY2suICBJbgorICAgICB0aGF0IGNhc2UsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRpbWVyIHRoYXQgd2UgYWRkZWQgd2lsbCBoYXZlIGFscmVhZHkKKyAgICAgcnVuIGJ5IHRoZSB0aW1lIHdlIGhvbGQgdGhlIGxvY2ssIGJ1dCB0aGF0IHRvbyBpcyBhIHNhZmUgZXJyb3IuCisgICAgIEZpbmFsbHksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgZ3JwY190aW1lcl9jaGVjayB0aGF0IGludGVydmVuZWQgZmFpbGVkIHRvCisgICAgIHRyaWdnZXIgdGhlIG5ldyB0aW1lciBiZWNhdXNlIHRoZSBtaW5fZGVhZGxpbmUgaGFkbid0IHlldCBiZWVuIHJlZHVjZWQuCisgICAgIEluIHRoYXQgY2FzZSwgdGhlIHRpbWVyIHdpbGwgc2ltcGx5IGhhdmUgdG8gd2FpdCBmb3IgdGhlIG5leHQKKyAgICAgZ3JwY190aW1lcl9jaGVjay4gKi8KKyAgaWYgKGlzX2ZpcnN0X3RpbWVyKSB7CisgICAgZ3ByX211X2xvY2soJmdfbXUpOworICAgIGlmIChncHJfdGltZV9jbXAoZGVhZGxpbmUsIHNoYXJkLT5taW5fZGVhZGxpbmUpIDwgMCkgeworICAgICAgZ3ByX3RpbWVzcGVjIG9sZF9taW5fZGVhZGxpbmUgPSBnX3NoYXJkX3F1ZXVlWzBdLT5taW5fZGVhZGxpbmU7CisgICAgICBzaGFyZC0+bWluX2RlYWRsaW5lID0gZGVhZGxpbmU7CisgICAgICBub3RlX2RlYWRsaW5lX2NoYW5nZShzaGFyZCk7CisgICAgICBpZiAoc2hhcmQtPnNoYXJkX3F1ZXVlX2luZGV4ID09IDAgJiYKKyAgICAgICAgICBncHJfdGltZV9jbXAoZGVhZGxpbmUsIG9sZF9taW5fZGVhZGxpbmUpIDwgMCkgeworICAgICAgICBncnBjX2tpY2tfcG9sbGVyKCk7CisgICAgICB9CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJmdfbXUpOworICB9Cit9CisKK3ZvaWQgZ3JwY190aW1lcl9jYW5jZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGltZXIgKnRpbWVyKSB7CisgIHNoYXJkX3R5cGUgKnNoYXJkID0gJmdfc2hhcmRzW3NoYXJkX2lkeCh0aW1lcildOworICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKKyAgaWYgKCF0aW1lci0+dHJpZ2dlcmVkKSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmdGltZXItPmNsb3N1cmUsIGZhbHNlLCBOVUxMKTsKKyAgICB0aW1lci0+dHJpZ2dlcmVkID0gMTsKKyAgICBpZiAodGltZXItPmhlYXBfaW5kZXggPT0gSU5WQUxJRF9IRUFQX0lOREVYKSB7CisgICAgICBsaXN0X3JlbW92ZSh0aW1lcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfdGltZXJfaGVhcF9yZW1vdmUoJnNoYXJkLT5oZWFwLCB0aW1lcik7CisgICAgfQorICB9CisgIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCAibm93IiBoYXMgcmVhY2hlZCB0aGUKKyAgIHF1ZXVlX2RlYWRsaW5lX2NhcC4gIFdlIGNvbXB1dGUgYSBuZXcgcXVldWUgZGVhZGxpbmUgYW5kIHRoZW4gc2NhbiB0aGUgbWFwCisgICBmb3IgdGltZXJzIHRoYXQgZmFsbCBhdCBvciB1bmRlciBpdC4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVldWUgaXMgbm8KKyAgIGxvbmdlciBlbXB0eS4KKyAgIFJFUVVJUkVTOiBzaGFyZC0+bXUgbG9ja2VkICovCitzdGF0aWMgaW50IHJlZmlsbF9xdWV1ZShzaGFyZF90eXBlICpzaGFyZCwgZ3ByX3RpbWVzcGVjIG5vdykgeworICAvKiBDb21wdXRlIHRoZSBuZXcgcXVldWUgd2luZG93IHdpZHRoIGFuZCBib3VuZCBieSB0aGUgbGltaXRzOiAqLworICBkb3VibGUgY29tcHV0ZWRfZGVhZGxpbmVfZGVsdGEgPQorICAgICAgZ3JwY190aW1lX2F2ZXJhZ2VkX3N0YXRzX3VwZGF0ZV9hdmVyYWdlKCZzaGFyZC0+c3RhdHMpICoKKyAgICAgIEFERF9ERUFETElORV9TQ0FMRTsKKyAgZG91YmxlIGRlYWRsaW5lX2RlbHRhID0KKyAgICAgIEdQUl9DTEFNUChjb21wdXRlZF9kZWFkbGluZV9kZWx0YSwgTUlOX1FVRVVFX1dJTkRPV19EVVJBVElPTiwKKyAgICAgICAgICAgICAgICBNQVhfUVVFVUVfV0lORE9XX0RVUkFUSU9OKTsKKyAgZ3JwY190aW1lciAqdGltZXIsICpuZXh0OworCisgIC8qIENvbXB1dGUgdGhlIG5ldyBjYXAgYW5kIHB1dCBhbGwgdGltZXJzIHVuZGVyIGl0IGludG8gdGhlIHF1ZXVlOiAqLworICBzaGFyZC0+cXVldWVfZGVhZGxpbmVfY2FwID0gZ3ByX3RpbWVfYWRkKAorICAgICAgZ3ByX3RpbWVfbWF4KG5vdywgc2hhcmQtPnF1ZXVlX2RlYWRsaW5lX2NhcCksIGRibF90b190cyhkZWFkbGluZV9kZWx0YSkpOworICBmb3IgKHRpbWVyID0gc2hhcmQtPmxpc3QubmV4dDsgdGltZXIgIT0gJnNoYXJkLT5saXN0OyB0aW1lciA9IG5leHQpIHsKKyAgICBuZXh0ID0gdGltZXItPm5leHQ7CisKKyAgICBpZiAoZ3ByX3RpbWVfY21wKHRpbWVyLT5kZWFkbGluZSwgc2hhcmQtPnF1ZXVlX2RlYWRsaW5lX2NhcCkgPCAwKSB7CisgICAgICBsaXN0X3JlbW92ZSh0aW1lcik7CisgICAgICBncnBjX3RpbWVyX2hlYXBfYWRkKCZzaGFyZC0+aGVhcCwgdGltZXIpOworICAgIH0KKyAgfQorICByZXR1cm4gIWdycGNfdGltZXJfaGVhcF9pc19lbXB0eSgmc2hhcmQtPmhlYXApOworfQorCisvKiBUaGlzIHBvcHMgdGhlIG5leHQgbm9uLWNhbmNlbGxlZCB0aW1lciB3aXRoIGRlYWRsaW5lIDw9IG5vdyBmcm9tIHRoZSBxdWV1ZSwKKyAgIG9yIHJldHVybnMgTlVMTCBpZiB0aGVyZSBpc24ndCBvbmUuCisgICBSRVFVSVJFUzogc2hhcmQtPm11IGxvY2tlZCAqLworc3RhdGljIGdycGNfdGltZXIgKnBvcF9vbmUoc2hhcmRfdHlwZSAqc2hhcmQsIGdwcl90aW1lc3BlYyBub3cpIHsKKyAgZ3JwY190aW1lciAqdGltZXI7CisgIGZvciAoOzspIHsKKyAgICBpZiAoZ3JwY190aW1lcl9oZWFwX2lzX2VtcHR5KCZzaGFyZC0+aGVhcCkpIHsKKyAgICAgIGlmIChncHJfdGltZV9jbXAobm93LCBzaGFyZC0+cXVldWVfZGVhZGxpbmVfY2FwKSA8IDApIHJldHVybiBOVUxMOworICAgICAgaWYgKCFyZWZpbGxfcXVldWUoc2hhcmQsIG5vdykpIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0aW1lciA9IGdycGNfdGltZXJfaGVhcF90b3AoJnNoYXJkLT5oZWFwKTsKKyAgICBpZiAoZ3ByX3RpbWVfY21wKHRpbWVyLT5kZWFkbGluZSwgbm93KSA+IDApIHJldHVybiBOVUxMOworICAgIHRpbWVyLT50cmlnZ2VyZWQgPSAxOworICAgIGdycGNfdGltZXJfaGVhcF9wb3AoJnNoYXJkLT5oZWFwKTsKKyAgICByZXR1cm4gdGltZXI7CisgIH0KK30KKworLyogUkVRVUlSRVM6IHNoYXJkLT5tdSB1bmxvY2tlZCAqLworc3RhdGljIHNpemVfdCBwb3BfdGltZXJzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBzaGFyZF90eXBlICpzaGFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgbm93LCBncHJfdGltZXNwZWMgKm5ld19taW5fZGVhZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1Y2Nlc3MpIHsKKyAgc2l6ZV90IG4gPSAwOworICBncnBjX3RpbWVyICp0aW1lcjsKKyAgZ3ByX211X2xvY2soJnNoYXJkLT5tdSk7CisgIHdoaWxlICgodGltZXIgPSBwb3Bfb25lKHNoYXJkLCBub3cpKSkgeworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJnRpbWVyLT5jbG9zdXJlLCBzdWNjZXNzLCBOVUxMKTsKKyAgICBuKys7CisgIH0KKyAgKm5ld19taW5fZGVhZGxpbmUgPSBjb21wdXRlX21pbl9kZWFkbGluZShzaGFyZCk7CisgIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7CisgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IHJ1bl9zb21lX2V4cGlyZWRfdGltZXJzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncHJfdGltZXNwZWMgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgKm5leHQsIGludCBzdWNjZXNzKSB7CisgIHNpemVfdCBuID0gMDsKKworICAvKiBUT0RPKGN0aWxsZXIpOiB2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgYW55IHRpbWVycyAoYXRvbWljYWxseSkgaGVyZSAqLworCisgIGlmIChncHJfbXVfdHJ5bG9jaygmZ19jaGVja2VyX211KSkgeworICAgIGdwcl9tdV9sb2NrKCZnX211KTsKKworICAgIHdoaWxlIChncHJfdGltZV9jbXAoZ19zaGFyZF9xdWV1ZVswXS0+bWluX2RlYWRsaW5lLCBub3cpIDwgMCkgeworICAgICAgZ3ByX3RpbWVzcGVjIG5ld19taW5fZGVhZGxpbmU7CisKKyAgICAgIC8qIEZvciBlZmZpY2llbmN5LCB3ZSBwb3AgYXMgbWFueSBhdmFpbGFibGUgdGltZXJzIGFzIHdlIGNhbiBmcm9tIHRoZQorICAgICAgICAgc2hhcmQuICBUaGlzIG1heSB2aW9sYXRlIHBlcmZlY3QgdGltZXIgZGVhZGxpbmUgb3JkZXJpbmcsIGJ1dCB0aGF0CisgICAgICAgICBzaG91bGRuJ3QgYmUgYSBiaWcgZGVhbCBiZWNhdXNlIHdlIGRvbid0IG1ha2Ugb3JkZXJpbmcgZ3VhcmFudGVlcy4gKi8KKyAgICAgIG4gKz0gcG9wX3RpbWVycyhleGVjX2N0eCwgZ19zaGFyZF9xdWV1ZVswXSwgbm93LCAmbmV3X21pbl9kZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKTsKKworICAgICAgLyogQW4gZ3JwY190aW1lcl9pbml0KCkgb24gdGhlIHNoYXJkIGNvdWxkIGludGVydmVuZSBoZXJlLCBhZGRpbmcgYSBuZXcKKyAgICAgICAgIHRpbWVyIHRoYXQgaXMgZWFybGllciB0aGFuIG5ld19taW5fZGVhZGxpbmUuICBIb3dldmVyLAorICAgICAgICAgZ3JwY190aW1lcl9pbml0KCkgd2lsbCBibG9jayBvbiB0aGUgbWFzdGVyX2xvY2sgYmVmb3JlIGl0IGNhbiBjYWxsCisgICAgICAgICBzZXRfbWluX2RlYWRsaW5lLCBzbyB0aGlzIG9uZSB3aWxsIGNvbXBsZXRlIGZpcnN0IGFuZCB0aGVuIHRoZSBBZGR0aW1lcgorICAgICAgICAgd2lsbCByZWR1Y2UgdGhlIG1pbl9kZWFkbGluZSAocGVyaGFwcyB1bm5lY2Vzc2FyaWx5KS4gKi8KKyAgICAgIGdfc2hhcmRfcXVldWVbMF0tPm1pbl9kZWFkbGluZSA9IG5ld19taW5fZGVhZGxpbmU7CisgICAgICBub3RlX2RlYWRsaW5lX2NoYW5nZShnX3NoYXJkX3F1ZXVlWzBdKTsKKyAgICB9CisKKyAgICBpZiAobmV4dCkgeworICAgICAgKm5leHQgPSBncHJfdGltZV9taW4oKm5leHQsIGdfc2hhcmRfcXVldWVbMF0tPm1pbl9kZWFkbGluZSk7CisgICAgfQorCisgICAgZ3ByX211X3VubG9jaygmZ19tdSk7CisgICAgZ3ByX211X3VubG9jaygmZ19jaGVja2VyX211KTsKKyAgfSBlbHNlIGlmIChuZXh0ICE9IE5VTEwpIHsKKyAgICAvKiBUT0RPKGN0aWxsZXIpOiB0aGlzIGZvcmNlcyBjYWxsaW5nIGNvZGUgdG8gZG8gYW4gc2hvcnQgcG9sbCwgYW5kCisgICAgICAgdGhlbiByZXRyeSB0aGUgdGltZXIgY2hlY2sgKGJlY2F1c2UgdGhpcyB0aW1lIHRocm91Z2ggdGhlIHRpbWVyIGxpc3Qgd2FzCisgICAgICAgY29udGVuZGVkKS4KKworICAgICAgIFdlIGNvdWxkIHJlZHVjZSB0aGUgY29zdCBoZXJlIGRyYW1hdGljYWxseSBieSBrZWVwaW5nIGEgY291bnQgb2YgaG93IG1hbnkKKyAgICAgICBjdXJyZW50bHkgYWN0aXZlIHBvbGxlcnMgZ290IHRocm91Z2ggdGhlIHVuY29udGVuZGVkIGNhc2UgYWJvdmUKKyAgICAgICBzdWNjZXNzZnVsbHksIGFuZCB3YWtpbmcgdXAgb3RoZXIgcG9sbGVycyBJRkYgdGhhdCBjb3VudCBkcm9wcyB0byB6ZXJvLgorCisgICAgICAgT25jZSB0aGF0IGNvdW50IGlzIGluIHBsYWNlLCB0aGlzIGVudGlyZSBlbHNlIGJyYW5jaCBjb3VsZCBkaXNhcHBlYXIuICovCisgICAgKm5leHQgPSBncHJfdGltZV9taW4oCisgICAgICAgICpuZXh0LCBncHJfdGltZV9hZGQobm93LCBncHJfdGltZV9mcm9tX21pbGxpcygxLCBHUFJfVElNRVNQQU4pKSk7CisgIH0KKworICByZXR1cm4gKGludCluOworfQorCitib29sIGdycGNfdGltZXJfY2hlY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdwcl90aW1lc3BlYyBub3csCisgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjICpuZXh0KSB7CisgIEdQUl9BU1NFUlQobm93LmNsb2NrX3R5cGUgPT0gZ19jbG9ja190eXBlKTsKKyAgcmV0dXJuIHJ1bl9zb21lX2V4cGlyZWRfdGltZXJzKAorICAgICAgZXhlY19jdHgsIG5vdywgbmV4dCwKKyAgICAgIGdwcl90aW1lX2NtcChub3csIGdwcl9pbmZfZnV0dXJlKG5vdy5jbG9ja190eXBlKSkgIT0gMCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCBiL3NyYy9jb3JlL2xpYi9pb21nci90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjMwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1RJTUVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9USU1FUl9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfdGltZXIgeworICBncHJfdGltZXNwZWMgZGVhZGxpbmU7CisgIHVpbnQzMl90IGhlYXBfaW5kZXg7IC8qIElOVkFMSURfSEVBUF9JTkRFWCBpZiBub3QgaW4gaGVhcCAqLworICBpbnQgdHJpZ2dlcmVkOworICBzdHJ1Y3QgZ3JwY190aW1lciAqbmV4dDsKKyAgc3RydWN0IGdycGNfdGltZXIgKnByZXY7CisgIGdycGNfY2xvc3VyZSBjbG9zdXJlOworfSBncnBjX3RpbWVyOworCisvKiBJbml0aWFsaXplICp0aW1lci4gV2hlbiBleHBpcmVkIG9yIGNhbmNlbGVkLCB0aW1lcl9jYiB3aWxsIGJlIGNhbGxlZCB3aXRoCisgICAqdGltZXJfY2JfYXJnIGFuZCBzdGF0dXMgdG8gaW5kaWNhdGUgaWYgaXQgZXhwaXJlZCAoU1VDQ0VTUykgb3Igd2FzCisgICBjYW5jZWxlZCAoQ0FOQ0VMTEVEKS4gdGltZXJfY2IgaXMgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLAorICAgYW5kIGFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIGNoZWNrIHRoZSBzdGF0dXMgdG8gZGV0ZXJtaW5lIGhvdyBpdCB3YXMKKyAgIGludm9rZWQuIFRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZworICAgaW5mb3JtYXRpb24gYWJvdXQgd2hlbiB0byBmcmVlIHVwIGFueSB1c2VyLWxldmVsIHN0YXRlLiAqLwordm9pZCBncnBjX3RpbWVyX2luaXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdGltZXIgKnRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCBncnBjX2lvbWdyX2NiX2Z1bmMgdGltZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICp0aW1lcl9jYl9hcmcsIGdwcl90aW1lc3BlYyBub3cpOworCisvKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gdGltZXIgZGVzdHJveSBmdW5jdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHRoZQorICAgdGltZXIgaXMgYSBvbmUtdGltZSBvY2N1cnJlbmNlIHdpdGggYSBndWFyYW50ZWUgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbAorICAgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSwgZWl0aGVyIGF0IGV4cGlyYXRpb24gb3IgY2FuY2VsbGF0aW9uLiBUaHVzLCBhbGwKKyAgIHRoZSBpbnRlcm5hbCB0aW1lciBldmVudCBtYW5hZ2VtZW50IHN0YXRlIGlzIGRlc3Ryb3llZCBqdXN0IGJlZm9yZQorICAgdGhhdCBjYWxsYmFjayBpcyBpbnZva2VkLiBJZiB0aGUgdXNlciBoYXMgYWRkaXRpb25hbCBzdGF0ZSBhc3NvY2lhdGVkIHdpdGgKKyAgIHRoZSB0aW1lciwgdGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHdoZW4gaXQgaXMgc2FmZSB0bworICAgZGVzdHJveSB0aGF0IHN0YXRlLiAqLworCisvKiBDYW5jZWwgYW4gKnRpbWVyLgorICAgVGhlcmUgYXJlIHRocmVlIGNhc2VzOgorICAgMS4gV2Ugbm9ybWFsbHkgY2FuY2VsIHRoZSB0aW1lcgorICAgMi4gVGhlIHRpbWVyIGhhcyBhbHJlYWR5IHJ1bgorICAgMy4gV2UgY2FuJ3QgY2FuY2VsIHRoZSB0aW1lciBiZWNhdXNlIGl0IGlzICJpbiBmbGlnaHQiLgorCisgICBJbiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZSBjYW5jZWxsYXRpb24gaXMgc3RpbGwgY29uc2lkZXJlZCBzdWNjZXNzZnVsLgorICAgVGhleSBhcmUgZXNzZW50aWFsbHkgZGlzdGluZ3Vpc2hlZCBpbiB0aGF0IHRoZSB0aW1lcl9jYiB3aWxsIGJlIHJ1bgorICAgZXhhY3RseSBvbmNlIGZyb20gZWl0aGVyIHRoZSBjYW5jZWxsYXRpb24gKHdpdGggc3RhdHVzIENBTkNFTExFRCkKKyAgIG9yIGZyb20gdGhlIGFjdGl2YXRpb24gKHdpdGggc3RhdHVzIFNVQ0NFU1MpCisKKyAgIE5vdGUgY2FyZWZ1bGx5IHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIE1BWSBvY2N1ciBpbiB0aGUgc2FtZSBjYWxsc3RhY2sKKyAgIGFzIGdycGNfdGltZXJfY2FuY2VsLiBJdCdzIGV4cGVjdGVkIHRoYXQgbW9zdCB0aW1lcnMgd2lsbCBiZSBjYW5jZWxsZWQgKHRoZWlyCisgICBwcmltYXJ5IHVzZSBpcyB0byBpbXBsZW1lbnQgZGVhZGxpbmVzKSwgYW5kIHNvIHRoaXMgY29kZSBpcyBvcHRpbWl6ZWQgc3VjaAorICAgdGhhdCBjYW5jZWxsYXRpb24gY29zdHMgYXMgbGl0dGxlIGFzIHBvc3NpYmxlLiBNYWtpbmcgY2FsbGJhY2tzIHJ1biBpbmxpbmUKKyAgIG1hdGNoZXMgdGhpcyBhaW0uCisKKyAgIFJlcXVpcmVzOiAgY2FuY2VsKCkgbXVzdCBoYXBwZW4gYWZ0ZXIgYWRkKCkgb24gYSBnaXZlbiB0aW1lciAqLwordm9pZCBncnBjX3RpbWVyX2NhbmNlbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190aW1lciAqdGltZXIpOworCisvKiBpb21nciBpbnRlcm5hbCBhcGkgZm9yIGRlYWxpbmcgd2l0aCB0aW1lcnMgKi8KKworLyogQ2hlY2sgZm9yIHRpbWVycyB0byBiZSBydW4sIGFuZCBydW4gdGhlbS4KKyAgIFJldHVybiB0cnVlIGlmIHRpbWVyIGNhbGxiYWNrcyB3ZXJlIGV4ZWN1dGVkLgorICAgRHJvcHMgZHJvcF9tdSBpZiBpdCBpcyBub24tbnVsbCBiZWZvcmUgZXhlY3V0aW5nIGNhbGxiYWNrcy4KKyAgIElmIG5leHQgaXMgbm9uLW51bGwsIFRSWSB0byB1cGRhdGUgKm5leHQgd2l0aCB0aGUgbmV4dCBydW5uaW5nIHRpbWVyCisgICBJRiB0aGF0IHRpbWVyIG9jY3VycyBiZWZvcmUgKm5leHQgY3VycmVudCB2YWx1ZS4KKyAgICpuZXh0IGlzIG5ldmVyIGd1YXJhbnRlZWQgdG8gYmUgdXBkYXRlZCBvbiBhbnkgZ2l2ZW4gZXhlY3V0aW9uOyBob3dldmVyLAorICAgd2l0aCBoaWdoIHByb2JhYmlsaXR5IGF0IGxlYXN0IG9uZSB0aHJlYWQgaW4gdGhlIHN5c3RlbSB3aWxsIHNlZSBhbiB1cGRhdGUKKyAgIGF0IGFueSB0aW1lIHNsaWNlLiAqLworYm9vbCBncnBjX3RpbWVyX2NoZWNrKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncHJfdGltZXNwZWMgbm93LAorICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyAqbmV4dCk7Cit2b2lkIGdycGNfdGltZXJfbGlzdF9pbml0KGdwcl90aW1lc3BlYyBub3cpOwordm9pZCBncnBjX3RpbWVyX2xpc3Rfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgpOworCisvKiB0aGUgZm9sbG93aW5nIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBpb21nciBpbXBsZW1lbnRhdGlvbiAqLworCit2b2lkIGdycGNfa2lja19wb2xsZXIodm9pZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2I2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCisvKiBBZGp1c3RzIGEgaGVhcCBzbyBhcyB0byBtb3ZlIGEgaG9sZSBhdCBwb3NpdGlvbiBpIGNsb3NlciB0byB0aGUgcm9vdCwKKyAgIHVudGlsIGEgc3VpdGFibGUgcG9zaXRpb24gaXMgZm91bmQgZm9yIGVsZW1lbnQgdC4gVGhlbiwgY29waWVzIHQgaW50byB0aGF0CisgICBwb3NpdGlvbi4gVGhpcyBmdW5jdG9yIGlzIGNhbGxlZCBlYWNoIHRpbWUgaW1tZWRpYXRlbHkgYWZ0ZXIgbW9kaWZ5aW5nIGEKKyAgIHZhbHVlIGluIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lciwgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBtb2RpZmllZCBlbGVtZW50IGFzCisgICBpdHMgYXJndW1lbnQuICovCitzdGF0aWMgdm9pZCBhZGp1c3RfdXB3YXJkcyhncnBjX3RpbWVyICoqZmlyc3QsIHVpbnQzMl90IGksIGdycGNfdGltZXIgKnQpIHsKKyAgd2hpbGUgKGkgPiAwKSB7CisgICAgdWludDMyX3QgcGFyZW50ID0gKHVpbnQzMl90KSgoKGludClpIC0gMSkgLyAyKTsKKyAgICBpZiAoZ3ByX3RpbWVfY21wKGZpcnN0W3BhcmVudF0tPmRlYWRsaW5lLCB0LT5kZWFkbGluZSkgPD0gMCkgYnJlYWs7CisgICAgZmlyc3RbaV0gPSBmaXJzdFtwYXJlbnRdOworICAgIGZpcnN0W2ldLT5oZWFwX2luZGV4ID0gaTsKKyAgICBpID0gcGFyZW50OworICB9CisgIGZpcnN0W2ldID0gdDsKKyAgdC0+aGVhcF9pbmRleCA9IGk7Cit9CisKKy8qIEFkanVzdHMgYSBoZWFwIHNvIGFzIHRvIG1vdmUgYSBob2xlIGF0IHBvc2l0aW9uIGkgZmFydGhlciBhd2F5IGZyb20gdGhlIHJvb3QsCisgICB1bnRpbCBhIHN1aXRhYmxlIHBvc2l0aW9uIGlzIGZvdW5kIGZvciBlbGVtZW50IHQuICBUaGVuLCBjb3BpZXMgdCBpbnRvIHRoYXQKKyAgIHBvc2l0aW9uLiAqLworc3RhdGljIHZvaWQgYWRqdXN0X2Rvd253YXJkcyhncnBjX3RpbWVyICoqZmlyc3QsIHVpbnQzMl90IGksIHVpbnQzMl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190aW1lciAqdCkgeworICBmb3IgKDs7KSB7CisgICAgdWludDMyX3QgbGVmdF9jaGlsZCA9IDF1ICsgMnUgKiBpOworICAgIGlmIChsZWZ0X2NoaWxkID49IGxlbmd0aCkgYnJlYWs7CisgICAgdWludDMyX3QgcmlnaHRfY2hpbGQgPSBsZWZ0X2NoaWxkICsgMTsKKyAgICB1aW50MzJfdCBuZXh0X2kgPSByaWdodF9jaGlsZCA8IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVfY21wKGZpcnN0W2xlZnRfY2hpbGRdLT5kZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFtyaWdodF9jaGlsZF0tPmRlYWRsaW5lKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyByaWdodF9jaGlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxlZnRfY2hpbGQ7CisgICAgaWYgKGdwcl90aW1lX2NtcCh0LT5kZWFkbGluZSwgZmlyc3RbbmV4dF9pXS0+ZGVhZGxpbmUpIDw9IDApIGJyZWFrOworICAgIGZpcnN0W2ldID0gZmlyc3RbbmV4dF9pXTsKKyAgICBmaXJzdFtpXS0+aGVhcF9pbmRleCA9IGk7CisgICAgaSA9IG5leHRfaTsKKyAgfQorICBmaXJzdFtpXSA9IHQ7CisgIHQtPmhlYXBfaW5kZXggPSBpOworfQorCisjZGVmaW5lIFNIUklOS19NSU5fRUxFTVMgOAorI2RlZmluZSBTSFJJTktfRlVMTE5FU1NfRkFDVE9SIDIKKworc3RhdGljIHZvaWQgbWF5YmVfc2hyaW5rKGdycGNfdGltZXJfaGVhcCAqaGVhcCkgeworICBpZiAoaGVhcC0+dGltZXJfY291bnQgPj0gOCAmJgorICAgICAgaGVhcC0+dGltZXJfY291bnQgPD0gaGVhcC0+dGltZXJfY2FwYWNpdHkgLyBTSFJJTktfRlVMTE5FU1NfRkFDVE9SIC8gMikgeworICAgIGhlYXAtPnRpbWVyX2NhcGFjaXR5ID0gaGVhcC0+dGltZXJfY291bnQgKiBTSFJJTktfRlVMTE5FU1NfRkFDVE9SOworICAgIGhlYXAtPnRpbWVycyA9CisgICAgICAgIGdwcl9yZWFsbG9jKGhlYXAtPnRpbWVycywgaGVhcC0+dGltZXJfY2FwYWNpdHkgKiBzaXplb2YoZ3JwY190aW1lciAqKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgbm90ZV9jaGFuZ2VkX3ByaW9yaXR5KGdycGNfdGltZXJfaGVhcCAqaGVhcCwgZ3JwY190aW1lciAqdGltZXIpIHsKKyAgdWludDMyX3QgaSA9IHRpbWVyLT5oZWFwX2luZGV4OworICB1aW50MzJfdCBwYXJlbnQgPSAodWludDMyX3QpKCgoaW50KWkgLSAxKSAvIDIpOworICBpZiAoZ3ByX3RpbWVfY21wKGhlYXAtPnRpbWVyc1twYXJlbnRdLT5kZWFkbGluZSwgdGltZXItPmRlYWRsaW5lKSA+IDApIHsKKyAgICBhZGp1c3RfdXB3YXJkcyhoZWFwLT50aW1lcnMsIGksIHRpbWVyKTsKKyAgfSBlbHNlIHsKKyAgICBhZGp1c3RfZG93bndhcmRzKGhlYXAtPnRpbWVycywgaSwgaGVhcC0+dGltZXJfY291bnQsIHRpbWVyKTsKKyAgfQorfQorCit2b2lkIGdycGNfdGltZXJfaGVhcF9pbml0KGdycGNfdGltZXJfaGVhcCAqaGVhcCkgeworICBtZW1zZXQoaGVhcCwgMCwgc2l6ZW9mKCpoZWFwKSk7Cit9CisKK3ZvaWQgZ3JwY190aW1lcl9oZWFwX2Rlc3Ryb3koZ3JwY190aW1lcl9oZWFwICpoZWFwKSB7IGdwcl9mcmVlKGhlYXAtPnRpbWVycyk7IH0KKworaW50IGdycGNfdGltZXJfaGVhcF9hZGQoZ3JwY190aW1lcl9oZWFwICpoZWFwLCBncnBjX3RpbWVyICp0aW1lcikgeworICBpZiAoaGVhcC0+dGltZXJfY291bnQgPT0gaGVhcC0+dGltZXJfY2FwYWNpdHkpIHsKKyAgICBoZWFwLT50aW1lcl9jYXBhY2l0eSA9CisgICAgICAgIEdQUl9NQVgoaGVhcC0+dGltZXJfY2FwYWNpdHkgKyAxLCBoZWFwLT50aW1lcl9jYXBhY2l0eSAqIDMgLyAyKTsKKyAgICBoZWFwLT50aW1lcnMgPQorICAgICAgICBncHJfcmVhbGxvYyhoZWFwLT50aW1lcnMsIGhlYXAtPnRpbWVyX2NhcGFjaXR5ICogc2l6ZW9mKGdycGNfdGltZXIgKikpOworICB9CisgIHRpbWVyLT5oZWFwX2luZGV4ID0gaGVhcC0+dGltZXJfY291bnQ7CisgIGFkanVzdF91cHdhcmRzKGhlYXAtPnRpbWVycywgaGVhcC0+dGltZXJfY291bnQsIHRpbWVyKTsKKyAgaGVhcC0+dGltZXJfY291bnQrKzsKKyAgcmV0dXJuIHRpbWVyLT5oZWFwX2luZGV4ID09IDA7Cit9CisKK3ZvaWQgZ3JwY190aW1lcl9oZWFwX3JlbW92ZShncnBjX3RpbWVyX2hlYXAgKmhlYXAsIGdycGNfdGltZXIgKnRpbWVyKSB7CisgIHVpbnQzMl90IGkgPSB0aW1lci0+aGVhcF9pbmRleDsKKyAgaWYgKGkgPT0gaGVhcC0+dGltZXJfY291bnQgLSAxKSB7CisgICAgaGVhcC0+dGltZXJfY291bnQtLTsKKyAgICBtYXliZV9zaHJpbmsoaGVhcCk7CisgICAgcmV0dXJuOworICB9CisgIGhlYXAtPnRpbWVyc1tpXSA9IGhlYXAtPnRpbWVyc1toZWFwLT50aW1lcl9jb3VudCAtIDFdOworICBoZWFwLT50aW1lcnNbaV0tPmhlYXBfaW5kZXggPSBpOworICBoZWFwLT50aW1lcl9jb3VudC0tOworICBtYXliZV9zaHJpbmsoaGVhcCk7CisgIG5vdGVfY2hhbmdlZF9wcmlvcml0eShoZWFwLCBoZWFwLT50aW1lcnNbaV0pOworfQorCitpbnQgZ3JwY190aW1lcl9oZWFwX2lzX2VtcHR5KGdycGNfdGltZXJfaGVhcCAqaGVhcCkgeworICByZXR1cm4gaGVhcC0+dGltZXJfY291bnQgPT0gMDsKK30KKworZ3JwY190aW1lciAqZ3JwY190aW1lcl9oZWFwX3RvcChncnBjX3RpbWVyX2hlYXAgKmhlYXApIHsKKyAgcmV0dXJuIGhlYXAtPnRpbWVyc1swXTsKK30KKwordm9pZCBncnBjX3RpbWVyX2hlYXBfcG9wKGdycGNfdGltZXJfaGVhcCAqaGVhcCkgeworICBncnBjX3RpbWVyX2hlYXBfcmVtb3ZlKGhlYXAsIGdycGNfdGltZXJfaGVhcF90b3AoaGVhcCkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCBiL3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxMTJjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1RJTUVSX0hFQVBfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX0lPTUdSX1RJTUVSX0hFQVBfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY190aW1lciAqKnRpbWVyczsKKyAgdWludDMyX3QgdGltZXJfY291bnQ7CisgIHVpbnQzMl90IHRpbWVyX2NhcGFjaXR5OworfSBncnBjX3RpbWVyX2hlYXA7CisKKy8qIHJldHVybiAxIGlmIHRoZSBuZXcgdGltZXIgaXMgdGhlIGZpcnN0IHRpbWVyIGluIHRoZSBoZWFwICovCitpbnQgZ3JwY190aW1lcl9oZWFwX2FkZChncnBjX3RpbWVyX2hlYXAgKmhlYXAsIGdycGNfdGltZXIgKnRpbWVyKTsKKwordm9pZCBncnBjX3RpbWVyX2hlYXBfaW5pdChncnBjX3RpbWVyX2hlYXAgKmhlYXApOwordm9pZCBncnBjX3RpbWVyX2hlYXBfZGVzdHJveShncnBjX3RpbWVyX2hlYXAgKmhlYXApOworCit2b2lkIGdycGNfdGltZXJfaGVhcF9yZW1vdmUoZ3JwY190aW1lcl9oZWFwICpoZWFwLCBncnBjX3RpbWVyICp0aW1lcik7CitncnBjX3RpbWVyICpncnBjX3RpbWVyX2hlYXBfdG9wKGdycGNfdGltZXJfaGVhcCAqaGVhcCk7Cit2b2lkIGdycGNfdGltZXJfaGVhcF9wb3AoZ3JwY190aW1lcl9oZWFwICpoZWFwKTsKKworaW50IGdycGNfdGltZXJfaGVhcF9pc19lbXB0eShncnBjX3RpbWVyX2hlYXAgKmhlYXApOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9USU1FUl9IRUFQX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjgxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKiBGSVhNRTogInBvc2l4IiBmaWxlcyBzaG91bGRuJ3QgYmUgZGVwZW5kaW5nIG9uIF9HTlVfU09VUkNFICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUlBDX05FRURfVURQCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKworI2RlZmluZSBJTklUX1BPUlRfQ0FQIDIKKworLyogb25lIGxpc3RlbmluZyBwb3J0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBmZDsKKyAgZ3JwY19mZCAqZW1mZDsKKyAgZ3JwY191ZHBfc2VydmVyICpzZXJ2ZXI7CisgIHVuaW9uIHsKKyAgICB1aW50OF90IHVudHlwZWRbR1JQQ19NQVhfU09DS0FERFJfU0laRV07CisgICAgc3RydWN0IHNvY2thZGRyIHNvY2thZGRyOworICB9IGFkZHI7CisgIHNpemVfdCBhZGRyX2xlbjsKKyAgZ3JwY19jbG9zdXJlIHJlYWRfY2xvc3VyZTsKKyAgZ3JwY19jbG9zdXJlIGRlc3Ryb3llZF9jbG9zdXJlOworICBncnBjX3VkcF9zZXJ2ZXJfcmVhZF9jYiByZWFkX2NiOworfSBzZXJ2ZXJfcG9ydDsKKworLyogdGhlIG92ZXJhbGwgc2VydmVyICovCitzdHJ1Y3QgZ3JwY191ZHBfc2VydmVyIHsKKyAgZ3ByX211IG11OworICBncHJfY3YgY3Y7CisKKyAgLyogYWN0aXZlIHBvcnQgY291bnQ6IGhvdyBtYW55IHBvcnRzIGFyZSBhY3R1YWxseSBzdGlsbCBsaXN0ZW5pbmcgKi8KKyAgc2l6ZV90IGFjdGl2ZV9wb3J0czsKKyAgLyogZGVzdHJveWVkIHBvcnQgY291bnQ6IGhvdyBtYW55IHBvcnRzIGFyZSBjb21wbGV0ZWx5IGRlc3Ryb3llZCAqLworICBzaXplX3QgZGVzdHJveWVkX3BvcnRzOworCisgIC8qIGlzIHRoaXMgc2VydmVyIHNodXR0aW5nIGRvd24/IChib29sZWFuKSAqLworICBpbnQgc2h1dGRvd247CisKKyAgLyogYWxsIGxpc3RlbmluZyBwb3J0cyAqLworICBzZXJ2ZXJfcG9ydCAqcG9ydHM7CisgIHNpemVfdCBucG9ydHM7CisgIHNpemVfdCBwb3J0X2NhcGFjaXR5OworCisgIC8qIHNodXRkb3duIGNhbGxiYWNrICovCisgIGdycGNfY2xvc3VyZSAqc2h1dGRvd25fY29tcGxldGU7CisKKyAgLyogYWxsIHBvbGxzZXRzIGludGVyZXN0ZWQgaW4gbmV3IGNvbm5lY3Rpb25zICovCisgIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzOworICAvKiBudW1iZXIgb2YgcG9sbHNldHMgaW4gdGhlIHBvbGxzZXRzIGFycmF5ICovCisgIHNpemVfdCBwb2xsc2V0X2NvdW50OworICAvKiBUaGUgcGFyZW50IGdycGMgc2VydmVyICovCisgIGdycGNfc2VydmVyICpncnBjX3NlcnZlcjsKK307CisKK2dycGNfdWRwX3NlcnZlciAqZ3JwY191ZHBfc2VydmVyX2NyZWF0ZSh2b2lkKSB7CisgIGdycGNfdWRwX3NlcnZlciAqcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfdWRwX3NlcnZlcikpOworICBncHJfbXVfaW5pdCgmcy0+bXUpOworICBncHJfY3ZfaW5pdCgmcy0+Y3YpOworICBzLT5hY3RpdmVfcG9ydHMgPSAwOworICBzLT5kZXN0cm95ZWRfcG9ydHMgPSAwOworICBzLT5zaHV0ZG93biA9IDA7CisgIHMtPnBvcnRzID0gZ3ByX21hbGxvYyhzaXplb2Yoc2VydmVyX3BvcnQpICogSU5JVF9QT1JUX0NBUCk7CisgIHMtPm5wb3J0cyA9IDA7CisgIHMtPnBvcnRfY2FwYWNpdHkgPSBJTklUX1BPUlRfQ0FQOworCisgIHJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcykgeworICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHMtPnNodXRkb3duX2NvbXBsZXRlLCAxLCBOVUxMKTsKKworICBncHJfbXVfZGVzdHJveSgmcy0+bXUpOworICBncHJfY3ZfZGVzdHJveSgmcy0+Y3YpOworCisgIGdwcl9mcmVlKHMtPnBvcnRzKTsKKyAgZ3ByX2ZyZWUocyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3llZF9wb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY191ZHBfc2VydmVyICpzID0gc2VydmVyOworICBncHJfbXVfbG9jaygmcy0+bXUpOworICBzLT5kZXN0cm95ZWRfcG9ydHMrKzsKKyAgaWYgKHMtPmRlc3Ryb3llZF9wb3J0cyA9PSBzLT5ucG9ydHMpIHsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgICAgZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzKTsKKyAgfSBlbHNlIHsKKyAgICBncHJfbXVfdW5sb2NrKCZzLT5tdSk7CisgIH0KK30KKworLyogY2FsbGVkIHdoZW4gYWxsIGxpc3RlbmluZyBlbmRwb2ludHMgaGF2ZSBiZWVuIHNodXRkb3duLCBzbyBubyBmdXJ0aGVyCisgICBldmVudHMgd2lsbCBiZSByZWNlaXZlZCBvbiB0aGVtIC0gYXQgdGhpcyBwb2ludCBpdCdzIHNhZmUgdG8gZGVzdHJveQorICAgdGhpbmdzICovCitzdGF0aWMgdm9pZCBkZWFjdGl2YXRlZF9hbGxfcG9ydHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcykgeworICBzaXplX3QgaTsKKworICAvKiBkZWxldGUgQUxMIHRoZSB0aGluZ3MgKi8KKyAgZ3ByX211X2xvY2soJnMtPm11KTsKKworICBpZiAoIXMtPnNodXRkb3duKSB7CisgICAgZ3ByX211X3VubG9jaygmcy0+bXUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzLT5ucG9ydHMpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnBvcnRzOyBpKyspIHsKKyAgICAgIHNlcnZlcl9wb3J0ICpzcCA9ICZzLT5wb3J0c1tpXTsKKyAgICAgIGdycGNfdW5saW5rX2lmX3VuaXhfZG9tYWluX3NvY2tldCgmc3AtPmFkZHIuc29ja2FkZHIpOworICAgICAgc3AtPmRlc3Ryb3llZF9jbG9zdXJlLmNiID0gZGVzdHJveWVkX3BvcnQ7CisgICAgICBzcC0+ZGVzdHJveWVkX2Nsb3N1cmUuY2JfYXJnID0gczsKKyAgICAgIGdycGNfZmRfb3JwaGFuKGV4ZWNfY3R4LCBzcC0+ZW1mZCwgJnNwLT5kZXN0cm95ZWRfY2xvc3VyZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICJ1ZHBfbGlzdGVuZXJfc2h1dGRvd24iKTsKKyAgICB9CisgICAgZ3ByX211X3VubG9jaygmcy0+bXUpOworICB9IGVsc2UgeworICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgICBmaW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHMpOworICB9Cit9CisKK3ZvaWQgZ3JwY191ZHBfc2VydmVyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9kb25lKSB7CisgIHNpemVfdCBpOworICBncHJfbXVfbG9jaygmcy0+bXUpOworCisgIEdQUl9BU1NFUlQoIXMtPnNodXRkb3duKTsKKyAgcy0+c2h1dGRvd24gPSAxOworCisgIHMtPnNodXRkb3duX2NvbXBsZXRlID0gb25fZG9uZTsKKworICAvKiBzaHV0ZG93biBhbGwgZmQncyAqLworICBpZiAocy0+YWN0aXZlX3BvcnRzKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5wb3J0czsgaSsrKSB7CisgICAgICBncnBjX2ZkX3NodXRkb3duKGV4ZWNfY3R4LCBzLT5wb3J0c1tpXS5lbWZkKTsKKyAgICB9CisgICAgZ3ByX211X3VubG9jaygmcy0+bXUpOworICB9IGVsc2UgeworICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgICBkZWFjdGl2YXRlZF9hbGxfcG9ydHMoZXhlY19jdHgsIHMpOworICB9Cit9CisKKy8qIFByZXBhcmUgYSByZWNlbnRseS1jcmVhdGVkIHNvY2tldCBmb3IgbGlzdGVuaW5nLiAqLworc3RhdGljIGludCBwcmVwYXJlX3NvY2tldChpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuKSB7CisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNvY2tuYW1lX3RlbXA7CisgIHNvY2tsZW5fdCBzb2NrbmFtZV9sZW47CisKKyAgaWYgKGZkIDwgMCkgeworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoIWdycGNfc2V0X3NvY2tldF9ub25ibG9ja2luZyhmZCwgMSkgfHwgIWdycGNfc2V0X3NvY2tldF9jbG9leGVjKGZkLCAxKSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBzb2NrZXQgJWQ6ICVzIiwgZmQsCisgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICB9CisKKyAgaWYgKGdycGNfc2V0X3NvY2tldF9pcF9wa3RpbmZvX2lmX3Bvc3NpYmxlKGZkKSAmJgorICAgICAgYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgZ3JwY19zZXRfc29ja2V0X2lwdjZfcmVjdnBrdGluZm9faWZfcG9zc2libGUoZmQpOworICB9CisKKyAgR1BSX0FTU0VSVChhZGRyX2xlbiA8IH4oc29ja2xlbl90KTApOworICBpZiAoYmluZChmZCwgYWRkciwgKHNvY2tsZW5fdClhZGRyX2xlbikgPCAwKSB7CisgICAgY2hhciAqYWRkcl9zdHI7CisgICAgZ3JwY19zb2NrYWRkcl90b19zdHJpbmcoJmFkZHJfc3RyLCBhZGRyLCAwKTsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgImJpbmQgYWRkcj0lczogJXMiLCBhZGRyX3N0ciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBncHJfZnJlZShhZGRyX3N0cik7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHNvY2tuYW1lX2xlbiA9IHNpemVvZihzb2NrbmFtZV90ZW1wKTsKKyAgaWYgKGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXAsICZzb2NrbmFtZV9sZW4pIDwgMCkgeworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByZXR1cm4gZ3JwY19zb2NrYWRkcl9nZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopJnNvY2tuYW1lX3RlbXApOworCitlcnJvcjoKKyAgaWYgKGZkID49IDApIHsKKyAgICBjbG9zZShmZCk7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisvKiBldmVudCBtYW5hZ2VyIGNhbGxiYWNrIHdoZW4gcmVhZHMgYXJlIHJlYWR5ICovCitzdGF0aWMgdm9pZCBvbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBzZXJ2ZXJfcG9ydCAqc3AgPSBhcmc7CisKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgZ3ByX211X2xvY2soJnNwLT5zZXJ2ZXItPm11KTsKKyAgICBpZiAoMCA9PSAtLXNwLT5zZXJ2ZXItPmFjdGl2ZV9wb3J0cykgeworICAgICAgZ3ByX211X3VubG9jaygmc3AtPnNlcnZlci0+bXUpOworICAgICAgZGVhY3RpdmF0ZWRfYWxsX3BvcnRzKGV4ZWNfY3R4LCBzcC0+c2VydmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3ByX211X3VubG9jaygmc3AtPnNlcnZlci0+bXUpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBUZWxsIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIHRoYXQgZGF0YSBpcyBhdmFpbGFibGUgdG8gcmVhZC4gKi8KKyAgR1BSX0FTU0VSVChzcC0+cmVhZF9jYik7CisgIHNwLT5yZWFkX2NiKGV4ZWNfY3R4LCBzcC0+ZW1mZCwgc3AtPnNlcnZlci0+Z3JwY19zZXJ2ZXIpOworCisgIC8qIFJlLWFybSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50IHNvIHdlIGdldCBhbm90aGVyIGNoYW5jZSB0byByZWFkLiAqLworICBncnBjX2ZkX25vdGlmeV9vbl9yZWFkKGV4ZWNfY3R4LCBzcC0+ZW1mZCwgJnNwLT5yZWFkX2Nsb3N1cmUpOworfQorCitzdGF0aWMgaW50IGFkZF9zb2NrZXRfdG9fc2VydmVyKGdycGNfdWRwX3NlcnZlciAqcywgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNpemVfdCBhZGRyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY191ZHBfc2VydmVyX3JlYWRfY2IgcmVhZF9jYikgeworICBzZXJ2ZXJfcG9ydCAqc3A7CisgIGludCBwb3J0OworICBjaGFyICphZGRyX3N0cjsKKyAgY2hhciAqbmFtZTsKKworICBwb3J0ID0gcHJlcGFyZV9zb2NrZXQoZmQsIGFkZHIsIGFkZHJfbGVuKTsKKyAgaWYgKHBvcnQgPj0gMCkgeworICAgIGdycGNfc29ja2FkZHJfdG9fc3RyaW5nKCZhZGRyX3N0ciwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAxKTsKKyAgICBncHJfYXNwcmludGYoJm5hbWUsICJ1ZHAtc2VydmVyLWxpc3RlbmVyOiVzIiwgYWRkcl9zdHIpOworICAgIGdwcl9mcmVlKGFkZHJfc3RyKTsKKyAgICBncHJfbXVfbG9jaygmcy0+bXUpOworICAgIC8qIGFwcGVuZCBpdCB0byB0aGUgbGlzdCB1bmRlciBhIGxvY2sgKi8KKyAgICBpZiAocy0+bnBvcnRzID09IHMtPnBvcnRfY2FwYWNpdHkpIHsKKyAgICAgIHMtPnBvcnRfY2FwYWNpdHkgKj0gMjsKKyAgICAgIHMtPnBvcnRzID0gZ3ByX3JlYWxsb2Mocy0+cG9ydHMsIHNpemVvZihzZXJ2ZXJfcG9ydCkgKiBzLT5wb3J0X2NhcGFjaXR5KTsKKyAgICB9CisgICAgc3AgPSAmcy0+cG9ydHNbcy0+bnBvcnRzKytdOworICAgIHNwLT5zZXJ2ZXIgPSBzOworICAgIHNwLT5mZCA9IGZkOworICAgIHNwLT5lbWZkID0gZ3JwY19mZF9jcmVhdGUoZmQsIG5hbWUpOworICAgIG1lbWNweShzcC0+YWRkci51bnR5cGVkLCBhZGRyLCBhZGRyX2xlbik7CisgICAgc3AtPmFkZHJfbGVuID0gYWRkcl9sZW47CisgICAgc3AtPnJlYWRfY2IgPSByZWFkX2NiOworICAgIEdQUl9BU1NFUlQoc3AtPmVtZmQpOworICAgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKKyAgICBncHJfZnJlZShuYW1lKTsKKyAgfQorCisgIHJldHVybiBwb3J0OworfQorCitpbnQgZ3JwY191ZHBfc2VydmVyX2FkZF9wb3J0KGdycGNfdWRwX3NlcnZlciAqcywgY29uc3Qgdm9pZCAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZHJfbGVuLCBncnBjX3VkcF9zZXJ2ZXJfcmVhZF9jYiByZWFkX2NiKSB7CisgIGludCBhbGxvY2F0ZWRfcG9ydDEgPSAtMTsKKyAgaW50IGFsbG9jYXRlZF9wb3J0MiA9IC0xOworICB1bnNpZ25lZCBpOworICBpbnQgZmQ7CisgIGdycGNfZHVhbHN0YWNrX21vZGUgZHNtb2RlOworICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI2X3Y0bWFwcGVkOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gd2lsZDQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbjYgd2lsZDY7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyNF9jb3B5OworICBzdHJ1Y3Qgc29ja2FkZHIgKmFsbG9jYXRlZF9hZGRyID0gTlVMTDsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc29ja25hbWVfdGVtcDsKKyAgc29ja2xlbl90IHNvY2tuYW1lX2xlbjsKKyAgaW50IHBvcnQ7CisKKyAgZ3JwY191bmxpbmtfaWZfdW5peF9kb21haW5fc29ja2V0KChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyKTsKKworICAvKiBDaGVjayBpZiB0aGlzIGlzIGEgd2lsZGNhcmQgcG9ydCwgYW5kIGlmIHNvLCB0cnkgdG8ga2VlcCB0aGUgcG9ydCB0aGUgc2FtZQorICAgICBhcyBzb21lIHByZXZpb3VzbHkgY3JlYXRlZCBsaXN0ZW5lci4gKi8KKyAgaWYgKGdycGNfc29ja2FkZHJfZ2V0X3BvcnQoYWRkcikgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ucG9ydHM7IGkrKykgeworICAgICAgc29ja25hbWVfbGVuID0gc2l6ZW9mKHNvY2tuYW1lX3RlbXApOworICAgICAgaWYgKDAgPT0gZ2V0c29ja25hbWUocy0+cG9ydHNbaV0uZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrbmFtZV9sZW4pKSB7CisgICAgICAgIHBvcnQgPSBncnBjX3NvY2thZGRyX2dldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja25hbWVfdGVtcCk7CisgICAgICAgIGlmIChwb3J0ID4gMCkgeworICAgICAgICAgIGFsbG9jYXRlZF9hZGRyID0gbWFsbG9jKGFkZHJfbGVuKTsKKyAgICAgICAgICBtZW1jcHkoYWxsb2NhdGVkX2FkZHIsIGFkZHIsIGFkZHJfbGVuKTsKKyAgICAgICAgICBncnBjX3NvY2thZGRyX3NldF9wb3J0KGFsbG9jYXRlZF9hZGRyLCBwb3J0KTsKKyAgICAgICAgICBhZGRyID0gYWxsb2NhdGVkX2FkZHI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZ3JwY19zb2NrYWRkcl90b192NG1hcHBlZChhZGRyLCAmYWRkcjZfdjRtYXBwZWQpKSB7CisgICAgYWRkciA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjZfdjRtYXBwZWQ7CisgICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjZfdjRtYXBwZWQpOworICB9CisKKyAgLyogVHJlYXQgOjogb3IgMC4wLjAuMCBhcyBhIGZhbWlseS1hZ25vc3RpYyB3aWxkY2FyZC4gKi8KKyAgaWYgKGdycGNfc29ja2FkZHJfaXNfd2lsZGNhcmQoYWRkciwgJnBvcnQpKSB7CisgICAgZ3JwY19zb2NrYWRkcl9tYWtlX3dpbGRjYXJkcyhwb3J0LCAmd2lsZDQsICZ3aWxkNik7CisKKyAgICAvKiBUcnkgbGlzdGVuaW5nIG9uIElQdjYgZmlyc3QuICovCisgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZDY7CisgICAgYWRkcl9sZW4gPSBzaXplb2Yod2lsZDYpOworICAgIGZkID0gZ3JwY19jcmVhdGVfZHVhbHN0YWNrX3NvY2tldChhZGRyLCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgJmRzbW9kZSk7CisgICAgYWxsb2NhdGVkX3BvcnQxID0gYWRkX3NvY2tldF90b19zZXJ2ZXIocywgZmQsIGFkZHIsIGFkZHJfbGVuLCByZWFkX2NiKTsKKyAgICBpZiAoZmQgPj0gMCAmJiBkc21vZGUgPT0gR1JQQ19EU01PREVfRFVBTFNUQUNLKSB7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogSWYgd2UgZGlkbid0IGdldCBhIGR1YWxzdGFjayBzb2NrZXQsIGFsc28gbGlzdGVuIG9uIDAuMC4wLjAuICovCisgICAgaWYgKHBvcnQgPT0gMCAmJiBhbGxvY2F0ZWRfcG9ydDEgPiAwKSB7CisgICAgICBncnBjX3NvY2thZGRyX3NldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikmd2lsZDQsIGFsbG9jYXRlZF9wb3J0MSk7CisgICAgfQorICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJndpbGQ0OworICAgIGFkZHJfbGVuID0gc2l6ZW9mKHdpbGQ0KTsKKyAgfQorCisgIGZkID0gZ3JwY19jcmVhdGVfZHVhbHN0YWNrX3NvY2tldChhZGRyLCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgJmRzbW9kZSk7CisgIGlmIChmZCA8IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgIH0KKyAgaWYgKGRzbW9kZSA9PSBHUlBDX0RTTU9ERV9JUFY0ICYmCisgICAgICBncnBjX3NvY2thZGRyX2lzX3Y0bWFwcGVkKGFkZHIsICZhZGRyNF9jb3B5KSkgeworICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI0X2NvcHk7CisgICAgYWRkcl9sZW4gPSBzaXplb2YoYWRkcjRfY29weSk7CisgIH0KKyAgYWxsb2NhdGVkX3BvcnQyID0gYWRkX3NvY2tldF90b19zZXJ2ZXIocywgZmQsIGFkZHIsIGFkZHJfbGVuLCByZWFkX2NiKTsKKworZG9uZToKKyAgZ3ByX2ZyZWUoYWxsb2NhdGVkX2FkZHIpOworICByZXR1cm4gYWxsb2NhdGVkX3BvcnQxID49IDAgPyBhbGxvY2F0ZWRfcG9ydDEgOiBhbGxvY2F0ZWRfcG9ydDI7Cit9CisKK2ludCBncnBjX3VkcF9zZXJ2ZXJfZ2V0X2ZkKGdycGNfdWRwX3NlcnZlciAqcywgdW5zaWduZWQgcG9ydF9pbmRleCkgeworICByZXR1cm4gKHBvcnRfaW5kZXggPCBzLT5ucG9ydHMpID8gcy0+cG9ydHNbcG9ydF9pbmRleF0uZmQgOiAtMTsKK30KKwordm9pZCBncnBjX3VkcF9zZXJ2ZXJfc3RhcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzLCBzaXplX3QgcG9sbHNldF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKKyAgc2l6ZV90IGksIGo7CisgIGdwcl9tdV9sb2NrKCZzLT5tdSk7CisgIEdQUl9BU1NFUlQocy0+YWN0aXZlX3BvcnRzID09IDApOworICBzLT5wb2xsc2V0cyA9IHBvbGxzZXRzOworICBzLT5ncnBjX3NlcnZlciA9IHNlcnZlcjsKKyAgZm9yIChpID0gMDsgaSA8IHMtPm5wb3J0czsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHBvbGxzZXRfY291bnQ7IGorKykgeworICAgICAgZ3JwY19wb2xsc2V0X2FkZF9mZChleGVjX2N0eCwgcG9sbHNldHNbal0sIHMtPnBvcnRzW2ldLmVtZmQpOworICAgIH0KKyAgICBzLT5wb3J0c1tpXS5yZWFkX2Nsb3N1cmUuY2IgPSBvbl9yZWFkOworICAgIHMtPnBvcnRzW2ldLnJlYWRfY2xvc3VyZS5jYl9hcmcgPSAmcy0+cG9ydHNbaV07CisgICAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgcy0+cG9ydHNbaV0uZW1mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5wb3J0c1tpXS5yZWFkX2Nsb3N1cmUpOworICAgIHMtPmFjdGl2ZV9wb3J0cysrOworICB9CisgIGdwcl9tdV91bmxvY2soJnMtPm11KTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmggYi9zcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjg0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9JT01HUl9VRFBfU0VSVkVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9VRFBfU0VSVkVSX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oIgorCisvKiBGb3J3YXJkIGRlY2wgb2Ygc3RydWN0IGdycGNfc2VydmVyICovCisvKiBUaGlzIGlzIG5vdCB0eXBlZGVmJ2VkIHRvIGF2b2lkIGEgdHlwZWRlZi1yZWRlZmluaXRpb24gZXJyb3IgKi8KK3N0cnVjdCBncnBjX3NlcnZlcjsKKworLyogRm9yd2FyZCBkZWNsIG9mIGdycGNfdWRwX3NlcnZlciAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY191ZHBfc2VydmVyIGdycGNfdWRwX3NlcnZlcjsKKworLyogQ2FsbGVkIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIHRoZSBzb2NrZXQuICovCit0eXBlZGVmIHZvaWQgKCpncnBjX3VkcF9zZXJ2ZXJfcmVhZF9jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZmQgKmVtZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdycGNfc2VydmVyICpzZXJ2ZXIpOworCisvKiBDcmVhdGUgYSBzZXJ2ZXIsIGluaXRpYWxseSBub3QgYm91bmQgdG8gYW55IHBvcnRzICovCitncnBjX3VkcF9zZXJ2ZXIgKmdycGNfdWRwX3NlcnZlcl9jcmVhdGUodm9pZCk7CisKKy8qIFN0YXJ0IGxpc3RlbmluZyB0byBib3VuZCBwb3J0cyAqLwordm9pZCBncnBjX3VkcF9zZXJ2ZXJfc3RhcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdWRwX3NlcnZlciAqdWRwX3NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzLCBzaXplX3QgcG9sbHNldF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBncnBjX3NlcnZlciAqc2VydmVyKTsKKworaW50IGdycGNfdWRwX3NlcnZlcl9nZXRfZmQoZ3JwY191ZHBfc2VydmVyICpzLCB1bnNpZ25lZCBpbmRleCk7CisKKy8qIEFkZCBhIHBvcnQgdG8gdGhlIHNlcnZlciwgcmV0dXJuaW5nIHBvcnQgbnVtYmVyIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlCisgICBvbiBmYWlsdXJlLgorCisgICBUaGUgOjogYW5kIDAuMC4wLjAgd2lsZGNhcmQgYWRkcmVzc2VzIGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhY2NlcHRpbmcKKyAgIGJvdGggSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucywgYnV0IDo6IGlzIHRoZSBwcmVmZXJyZWQgc3R5bGUuICBUaGlzIHVzdWFsbHkKKyAgIGNyZWF0ZXMgb25lIHNvY2tldCwgYnV0IHBvc3NpYmx5IHR3byBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgSVB2NiwKKyAgIGJ1dCBub3QgZHVhbHN0YWNrIHNvY2tldHMuICovCisKKy8qIFRPRE8oY3RpbGxlcik6IGRlcHJlY2F0ZSB0aGlzLCBhbmQgbWFrZSBncnBjX3VkcF9zZXJ2ZXJfYWRkX3BvcnRzIHRvIGhhbmRsZQorICAgICAgICAgICAgICAgICAgYWxsIG9mIHRoZSBtdWx0aXBsZSBzb2NrZXQgcG9ydCBtYXRjaGluZyBsb2dpYyBpbiBvbmUgcGxhY2UgKi8KK2ludCBncnBjX3VkcF9zZXJ2ZXJfYWRkX3BvcnQoZ3JwY191ZHBfc2VydmVyICpzLCBjb25zdCB2b2lkICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkcl9sZW4sIGdycGNfdWRwX3NlcnZlcl9yZWFkX2NiIHJlYWRfY2IpOworCit2b2lkIGdycGNfdWRwX3NlcnZlcl9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3VkcF9zZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9kb25lKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSU9NR1JfVURQX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNDQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiCisKKyNpZmRlZiBHUFJfSEFWRV9VTklYX1NPQ0tFVAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCit2b2lkIGdycGNfY3JlYXRlX3NvY2tldHBhaXJfaWZfdW5peChpbnQgc3ZbMl0pIHsKKyAgR1BSX0FTU0VSVChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzdikgPT0gMCk7Cit9CisKK2dycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpncnBjX3Jlc29sdmVfdW5peF9kb21haW5fYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lKSB7CisgIHN0cnVjdCBzb2NrYWRkcl91biAqdW47CisKKyAgZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMgKmFkZHJzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19yZXNvbHZlZF9hZGRyZXNzZXMpKTsKKyAgYWRkcnMtPm5hZGRycyA9IDE7CisgIGFkZHJzLT5hZGRycyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcmVzb2x2ZWRfYWRkcmVzcykpOworICB1biA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKilhZGRycy0+YWRkcnMtPmFkZHI7CisgIHVuLT5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RyY3B5KHVuLT5zdW5fcGF0aCwgbmFtZSk7CisgIGFkZHJzLT5hZGRycy0+bGVuID0gc3RybGVuKHVuLT5zdW5fcGF0aCkgKyBzaXplb2YodW4tPnN1bl9mYW1pbHkpICsgMTsKKyAgcmV0dXJuIGFkZHJzOworfQorCitpbnQgZ3JwY19pc191bml4X3NvY2tldChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHsKKyAgcmV0dXJuIGFkZHItPnNhX2ZhbWlseSA9PSBBRl9VTklYOworfQorCit2b2lkIGdycGNfdW5saW5rX2lmX3VuaXhfZG9tYWluX3NvY2tldChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHsKKyAgaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBRl9VTklYKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0cnVjdCBzb2NrYWRkcl91biAqdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuICopYWRkcjsKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgaWYgKHN0YXQodW4tPnN1bl9wYXRoLCAmc3QpID09IDAgJiYgKHN0LnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZTT0NLKSB7CisgICAgdW5saW5rKHVuLT5zdW5fcGF0aCk7CisgIH0KK30KKworaW50IGdycGNfcGFyc2VfdW5peChncnBjX3VyaSAqdXJpLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgc2l6ZV90ICpsZW4pIHsKKyAgc3RydWN0IHNvY2thZGRyX3VuICp1biA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKilhZGRyOworCisgIHVuLT5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgc3RyY3B5KHVuLT5zdW5fcGF0aCwgdXJpLT5wYXRoKTsKKyAgKmxlbiA9IHN0cmxlbih1bi0+c3VuX3BhdGgpICsgc2l6ZW9mKHVuLT5zdW5fZmFtaWx5KSArIDE7CisKKyAgcmV0dXJuIDE7Cit9CisKK2NoYXIgKmdycGNfdW5peF9nZXRfZGVmYXVsdF9hdXRob3JpdHkoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7CisgIHJldHVybiBncHJfc3RyZHVwKCJsb2NhbGhvc3QiKTsKK30KKworY2hhciAqZ3JwY19zb2NrYWRkcl90b191cmlfdW5peF9pZl9wb3NzaWJsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHsKKyAgaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBRl9VTklYKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjaGFyICpyZXN1bHQ7CisgIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAidW5peDolcyIsICgoc3RydWN0IHNvY2thZGRyX3VuICopYWRkciktPnN1bl9wYXRoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmggYi9zcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyY2FiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaApAQCAtMCwwICsxLDYxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1VOSVhfU09DS0VUU19QT1NJWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfVU5JWF9TT0NLRVRTX1BPU0lYX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIgorCit2b2lkIGdycGNfY3JlYXRlX3NvY2tldHBhaXJfaWZfdW5peChpbnQgc3ZbMl0pOworCitncnBjX3Jlc29sdmVkX2FkZHJlc3NlcyAqZ3JwY19yZXNvbHZlX3VuaXhfZG9tYWluX2FkZHJlc3MoY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBncnBjX2lzX3VuaXhfc29ja2V0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcik7CisKK3ZvaWQgZ3JwY191bmxpbmtfaWZfdW5peF9kb21haW5fc29ja2V0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcik7CisKK2ludCBncnBjX3BhcnNlX3VuaXgoZ3JwY191cmkgKnVyaSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIHNpemVfdCAqbGVuKTsKKworY2hhciAqZ3JwY191bml4X2dldF9kZWZhdWx0X2F1dGhvcml0eShncnBjX3Jlc29sdmVyX2ZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdXJpICp1cmkpOworCitjaGFyICpncnBjX3NvY2thZGRyX3RvX3VyaV91bml4X2lmX3Bvc3NpYmxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcik7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX1VOSVhfU09DS0VUU19QT1NJWF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyBiL3NyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZjZlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIKKworI2lmbmRlZiBHUFJfSEFWRV9VTklYX1NPQ0tFVAorCit2b2lkIGdycGNfY3JlYXRlX3NvY2tldHBhaXJfaWZfdW5peChpbnQgc3ZbMl0pIHt9CisKK2dycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpncnBjX3Jlc29sdmVfdW5peF9kb21haW5fYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lKSB7CisgIHJldHVybiBOVUxMOworfQorCitpbnQgZ3JwY19pc191bml4X3NvY2tldChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHsgcmV0dXJuIGZhbHNlOyB9CisKK3ZvaWQgZ3JwY191bmxpbmtfaWZfdW5peF9kb21haW5fc29ja2V0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcikge30KKworaW50IGdycGNfcGFyc2VfdW5peChncnBjX3VyaSAqdXJpLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgc2l6ZV90ICpsZW4pIHsKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKmdycGNfdW5peF9nZXRfZGVmYXVsdF9hdXRob3JpdHkoZ3JwY19yZXNvbHZlcl9mYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3VyaSAqdXJpKSB7CisgIHJldHVybiBOVUxMOworfQorCitjaGFyICpncnBjX3NvY2thZGRyX3RvX3VyaV91bml4X2lmX3Bvc3NpYmxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcikgeworICByZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyBiL3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGVkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9MSU5VWF9FVkVOVEZECisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKworc3RhdGljIHZvaWQgZXZlbnRmZF9jcmVhdGUoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKKyAgaW50IGVmZCA9IGV2ZW50ZmQoMCwgRUZEX05PTkJMT0NLIHwgRUZEX0NMT0VYRUMpOworICAvKiBUT0RPKGtsZW1wbmVyKTogSGFuZGxlIGZhaWx1cmUgbW9yZSBncmFjZWZ1bGx5ICovCisgIEdQUl9BU1NFUlQoZWZkID49IDApOworICBmZF9pbmZvLT5yZWFkX2ZkID0gZWZkOworICBmZF9pbmZvLT53cml0ZV9mZCA9IC0xOworfQorCitzdGF0aWMgdm9pZCBldmVudGZkX2NvbnN1bWUoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKKyAgZXZlbnRmZF90IHZhbHVlOworICBpbnQgZXJyOworICBkbyB7CisgICAgZXJyID0gZXZlbnRmZF9yZWFkKGZkX2luZm8tPnJlYWRfZmQsICZ2YWx1ZSk7CisgIH0gd2hpbGUgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworfQorCitzdGF0aWMgdm9pZCBldmVudGZkX3dha2V1cChncnBjX3dha2V1cF9mZCogZmRfaW5mbykgeworICBpbnQgZXJyOworICBHUFJfVElNRVJfQkVHSU4oImV2ZW50ZmRfd2FrZXVwIiwgMCk7CisgIGRvIHsKKyAgICBlcnIgPSBldmVudGZkX3dyaXRlKGZkX2luZm8tPnJlYWRfZmQsIDEpOworICB9IHdoaWxlIChlcnIgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgR1BSX1RJTUVSX0VORCgiZXZlbnRmZF93YWtldXAiLCAwKTsKK30KKworc3RhdGljIHZvaWQgZXZlbnRmZF9kZXN0cm95KGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKSB7CisgIGlmIChmZF9pbmZvLT5yZWFkX2ZkICE9IDApIGNsb3NlKGZkX2luZm8tPnJlYWRfZmQpOworfQorCitzdGF0aWMgaW50IGV2ZW50ZmRfY2hlY2tfYXZhaWxhYmlsaXR5KHZvaWQpIHsKKyAgLyogVE9ETyhrbGVtcG5lcik6IEFjdHVhbGx5IGNoZWNrIGlmIGV2ZW50ZmQgaXMgYXZhaWxhYmxlICovCisgIHJldHVybiAxOworfQorCitjb25zdCBncnBjX3dha2V1cF9mZF92dGFibGUgZ3JwY19zcGVjaWFsaXplZF93YWtldXBfZmRfdnRhYmxlID0geworICAgIGV2ZW50ZmRfY3JlYXRlLCBldmVudGZkX2NvbnN1bWUsIGV2ZW50ZmRfd2FrZXVwLCBldmVudGZkX2Rlc3Ryb3ksCisgICAgZXZlbnRmZF9jaGVja19hdmFpbGFiaWxpdHl9OworCisjZW5kaWYgLyogR1BSX0xJTlVYX0VWRU5URkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZGVmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qCisgKiBUaGlzIGlzIGEgZHVtbXkgZmlsZSB0byBwcm92aWRlIGFuIGludmFsaWQgc3BlY2lhbGl6ZWRfd2FrZXVwX2ZkX3Z0YWJsZSBvbgorICogc3lzdGVtcyB3aXRob3V0IGFueXRoaW5nIGJldHRlciB0aGFuIHBpcGUuCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUE9TSVhfTk9fU1BFQ0lBTF9XQUtFVVBfRkQKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaCIKKworc3RhdGljIGludCBjaGVja19hdmFpbGFiaWxpdHlfaW52YWxpZCh2b2lkKSB7IHJldHVybiAwOyB9CisKK2NvbnN0IGdycGNfd2FrZXVwX2ZkX3Z0YWJsZSBncnBjX3NwZWNpYWxpemVkX3dha2V1cF9mZF92dGFibGUgPSB7CisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgY2hlY2tfYXZhaWxhYmlsaXR5X2ludmFsaWR9OworCisjZW5kaWYgLyogR1BSX1BPU0lYX05PX1NQRUNJQUxfV0FLRVVQX0ZEICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYyBiL3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDkxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUE9TSVhfV0FLRVVQX0ZECisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgorCitzdGF0aWMgdm9pZCBwaXBlX2luaXQoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKKyAgaW50IHBpcGVmZFsyXTsKKyAgLyogVE9ETyhrbGVtcG5lcik6IE1ha2UgdGhpcyBub25mYXRhbCAqLworICBpbnQgciA9IHBpcGUocGlwZWZkKTsKKyAgaWYgKDAgIT0gcikgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAicGlwZSBjcmVhdGlvbiBmYWlsZWQgKCVkKTogJXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBhYm9ydCgpOworICB9CisgIEdQUl9BU1NFUlQoZ3JwY19zZXRfc29ja2V0X25vbmJsb2NraW5nKHBpcGVmZFswXSwgMSkpOworICBHUFJfQVNTRVJUKGdycGNfc2V0X3NvY2tldF9ub25ibG9ja2luZyhwaXBlZmRbMV0sIDEpKTsKKyAgZmRfaW5mby0+cmVhZF9mZCA9IHBpcGVmZFswXTsKKyAgZmRfaW5mby0+d3JpdGVfZmQgPSBwaXBlZmRbMV07Cit9CisKK3N0YXRpYyB2b2lkIHBpcGVfY29uc3VtZShncnBjX3dha2V1cF9mZCogZmRfaW5mbykgeworICBjaGFyIGJ1ZlsxMjhdOworICBzc2l6ZV90IHI7CisKKyAgZm9yICg7OykgeworICAgIHIgPSByZWFkKGZkX2luZm8tPnJlYWRfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGlmIChyID4gMCkgY29udGludWU7CisgICAgaWYgKHIgPT0gMCkgcmV0dXJuOworICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEVJTlRSOgorICAgICAgICBjb250aW51ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZXJyb3IgcmVhZGluZyBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgcGlwZV93YWtldXAoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pIHsKKyAgY2hhciBjID0gMDsKKyAgd2hpbGUgKHdyaXRlKGZkX2luZm8tPndyaXRlX2ZkLCAmYywgMSkgIT0gMSAmJiBlcnJubyA9PSBFSU5UUikKKyAgICA7Cit9CisKK3N0YXRpYyB2b2lkIHBpcGVfZGVzdHJveShncnBjX3dha2V1cF9mZCogZmRfaW5mbykgeworICBpZiAoZmRfaW5mby0+cmVhZF9mZCAhPSAwKSBjbG9zZShmZF9pbmZvLT5yZWFkX2ZkKTsKKyAgaWYgKGZkX2luZm8tPndyaXRlX2ZkICE9IDApIGNsb3NlKGZkX2luZm8tPndyaXRlX2ZkKTsKK30KKworc3RhdGljIGludCBwaXBlX2NoZWNrX2F2YWlsYWJpbGl0eSh2b2lkKSB7CisgIC8qIEFzc3VtZSB0aGF0IHBpcGVzIGFyZSBhbHdheXMgYXZhaWxhYmxlLiAqLworICByZXR1cm4gMTsKK30KKworY29uc3QgZ3JwY193YWtldXBfZmRfdnRhYmxlIGdycGNfcGlwZV93YWtldXBfZmRfdnRhYmxlID0geworICAgIHBpcGVfaW5pdCwgcGlwZV9jb25zdW1lLCBwaXBlX3dha2V1cCwgcGlwZV9kZXN0cm95LAorICAgIHBpcGVfY2hlY2tfYXZhaWxhYmlsaXR5fTsKKworI2VuZGlmIC8qIEdQUl9QT1NJWF9XQUtVUF9GRCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmggYi9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRiMWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1dBS0VVUF9GRF9QSVBFX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9XQUtFVVBfRkRfUElQRV9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCisKK2V4dGVybiBncnBjX3dha2V1cF9mZF92dGFibGUgZ3JwY19waXBlX3dha2V1cF9mZF92dGFibGU7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX1dBS0VVUF9GRF9QSVBFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQxNzRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1dBS0VVUF9GRAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIgorCitzdGF0aWMgY29uc3QgZ3JwY193YWtldXBfZmRfdnRhYmxlICp3YWtldXBfZmRfdnRhYmxlID0gTlVMTDsKK2ludCBncnBjX2FsbG93X3NwZWNpYWxpemVkX3dha2V1cF9mZCA9IDE7CisKK3ZvaWQgZ3JwY193YWtldXBfZmRfZ2xvYmFsX2luaXQodm9pZCkgeworICBpZiAoZ3JwY19hbGxvd19zcGVjaWFsaXplZF93YWtldXBfZmQgJiYKKyAgICAgIGdycGNfc3BlY2lhbGl6ZWRfd2FrZXVwX2ZkX3Z0YWJsZS5jaGVja19hdmFpbGFiaWxpdHkoKSkgeworICAgIHdha2V1cF9mZF92dGFibGUgPSAmZ3JwY19zcGVjaWFsaXplZF93YWtldXBfZmRfdnRhYmxlOworICB9IGVsc2UgeworICAgIHdha2V1cF9mZF92dGFibGUgPSAmZ3JwY19waXBlX3dha2V1cF9mZF92dGFibGU7CisgIH0KK30KKwordm9pZCBncnBjX3dha2V1cF9mZF9nbG9iYWxfZGVzdHJveSh2b2lkKSB7IHdha2V1cF9mZF92dGFibGUgPSBOVUxMOyB9CisKK3ZvaWQgZ3JwY193YWtldXBfZmRfaW5pdChncnBjX3dha2V1cF9mZCAqZmRfaW5mbykgeworICB3YWtldXBfZmRfdnRhYmxlLT5pbml0KGZkX2luZm8pOworfQorCit2b2lkIGdycGNfd2FrZXVwX2ZkX2NvbnN1bWVfd2FrZXVwKGdycGNfd2FrZXVwX2ZkICpmZF9pbmZvKSB7CisgIHdha2V1cF9mZF92dGFibGUtPmNvbnN1bWUoZmRfaW5mbyk7Cit9CisKK3ZvaWQgZ3JwY193YWtldXBfZmRfd2FrZXVwKGdycGNfd2FrZXVwX2ZkICpmZF9pbmZvKSB7CisgIHdha2V1cF9mZF92dGFibGUtPndha2V1cChmZF9pbmZvKTsKK30KKwordm9pZCBncnBjX3dha2V1cF9mZF9kZXN0cm95KGdycGNfd2FrZXVwX2ZkICpmZF9pbmZvKSB7CisgIHdha2V1cF9mZF92dGFibGUtPmRlc3Ryb3koZmRfaW5mbyk7Cit9CisKKyNlbmRpZiAvKiBHUFJfUE9TSVhfV0FLRVVQX0ZEICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmggYi9zcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5ODhkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyoKKyAqIHdha2V1cF9mZCBhYnN0cmFjdHMgdGhlIGNvbmNlcHQgb2YgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBwdXJwb3NlIG9mCisgKiB3YWtpbmcgdXAgYSB0aHJlYWQgaW4gc2VsZWN0KCkvcG9sbCgpL2Vwb2xsX3dhaXQoKS9ldGMuCisKKyAqIFRoZSBwb2xsKCkgZmFtaWx5IG9mIHN5c3RlbSBjYWxscyBwcm92aWRlIGEgd2F5IGZvciBhIHRocmVhZCB0byBibG9jayB1bnRpbAorICogdGhlcmUgaXMgYWN0aXZpdHkgb24gb25lIChvciBtb3JlKSBvZiBhIHNldCBvZiBmaWxlIGRlc2NyaXB0b3JzLiBBbgorICogYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gd2FrZSB1cCB0aGlzIHRocmVhZCB0byBkbyBub24gZmlsZSByZWxhdGVkIHdvcmsuIFRoZQorICogdHlwaWNhbCB3YXkgdG8gZG8gdGhpcyBpcyB0byBhZGQgYSBwaXBlIHRvIHRoZSBzZXQgb2YgZmlsZSBkZXNjcmlwdG9ycywgdGhlbgorICogd3JpdGUgdG8gdGhlIHBpcGUgdG8gd2FrZSB1cCB0aGUgdGhyZWFkIGluIHBvbGwoKS4KKyAqCisgKiBMaW51eCBoYXMgYSBsaWdodGVyIHdlaWdodCBldmVudGZkIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgdGhpcyBwdXJwb3NlLgorICogd2FrZXVwX2ZkIGFic3RyYWN0cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28uCisgKgorICogU2V0dXA6CisgKiAxLiBCZWZvcmUgY2FsbGluZyBhbnl0aGluZywgY2FsbCBnbG9iYWxfaW5pdCgpIGF0IGxlYXN0IG9uY2UuCisgKiAxLiBDYWxsIGdycGNfd2FrZXVwX2ZkX2NyZWF0ZSgpIHRvIGdldCBhIHdha2V1cF9mZC4KKyAqIDIuIEFkZCB0aGUgcmVzdWx0IG9mIEdSUENfV0FLRVVQX0ZEX0ZEIHRvIHRoZSBzZXQgb2YgbW9uaXRvcmVkIGZpbGUKKyAqICAgIGRlc2NyaXB0b3JzIGZvciB0aGUgcG9sbCgpIHN0eWxlIEFQSSB5b3UgYXJlIHVzaW5nLiBNb25pdG9yIHRoZSBmaWxlCisgKiAgICBkZXNjcmlwdG9yIGZvciByZWFkYWJpbGl0eS4KKyAqIDMuIFRvIHRlYXIgZG93biwgY2FsbCBncnBjX3dha2V1cF9mZF9kZXN0cm95KCkuIFRoaXMgY2xvc2VzIHRoZSB1bmRlcmx5aW5nCisgKiAgICBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogVXNhZ2U6CisgKiAxLiBUbyB3YWtlIHVwIGEgcG9sbGluZyB0aHJlYWQsIGNhbGwgZ3JwY193YWtldXBfZmRfd2FrZXVwKCkgb24gYSB3YWtldXBfZmQKKyAqICAgIGl0IGlzIG1vbml0b3JpbmcuCisgKiAyLiBJZiB0aGUgcG9sbGluZyB0aHJlYWQgd2FzIGF3YWtlbmVkIGJ5IGEgd2FrZXVwX2ZkIGV2ZW50LCBjYWxsCisgKiAgICBncnBjX3dha2V1cF9mZF9jb25zdW1lX3dha2V1cCgpIG9uIGl0LgorICovCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSU9NR1JfV0FLRVVQX0ZEX1BPU0lYX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9XQUtFVVBfRkRfUE9TSVhfSAorCit2b2lkIGdycGNfd2FrZXVwX2ZkX2dsb2JhbF9pbml0KHZvaWQpOwordm9pZCBncnBjX3dha2V1cF9mZF9nbG9iYWxfZGVzdHJveSh2b2lkKTsKKworLyogRm9yY2UgdXNpbmcgdGhlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIGludGVuZGVkIGZvciB0ZXN0aW5nCisgKiBwdXJwb3NlcyBvbmx5LiovCit2b2lkIGdycGNfd2FrZXVwX2ZkX2dsb2JhbF9pbml0X2ZvcmNlX2ZhbGxiYWNrKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBncnBjX3dha2V1cF9mZCBncnBjX3dha2V1cF9mZDsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY193YWtldXBfZmRfdnRhYmxlIHsKKyAgdm9pZCAoKmluaXQpKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKKyAgdm9pZCAoKmNvbnN1bWUpKGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKKyAgdm9pZCAoKndha2V1cCkoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pOworICB2b2lkICgqZGVzdHJveSkoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pOworICAvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBhbnkgb3RoZXIgZnVuY3Rpb25zICovCisgIGludCAoKmNoZWNrX2F2YWlsYWJpbGl0eSkodm9pZCk7Cit9IGdycGNfd2FrZXVwX2ZkX3Z0YWJsZTsKKworc3RydWN0IGdycGNfd2FrZXVwX2ZkIHsKKyAgaW50IHJlYWRfZmQ7CisgIGludCB3cml0ZV9mZDsKK307CisKK2V4dGVybiBpbnQgZ3JwY19hbGxvd19zcGVjaWFsaXplZF93YWtldXBfZmQ7CisKKyNkZWZpbmUgR1JQQ19XQUtFVVBfRkRfR0VUX1JFQURfRkQoZmRfaW5mbykgKChmZF9pbmZvKS0+cmVhZF9mZCkKKwordm9pZCBncnBjX3dha2V1cF9mZF9pbml0KGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKK3ZvaWQgZ3JwY193YWtldXBfZmRfY29uc3VtZV93YWtldXAoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pOwordm9pZCBncnBjX3dha2V1cF9mZF93YWtldXAoZ3JwY193YWtldXBfZmQqIGZkX2luZm8pOwordm9pZCBncnBjX3dha2V1cF9mZF9kZXN0cm95KGdycGNfd2FrZXVwX2ZkKiBmZF9pbmZvKTsKKworLyogRGVmaW5lZCBpbiBzb21lIHNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9uJ3MgLmMgZmlsZSwgb3IgYnkKKyAqIHdha2V1cF9mZF9ub3NwZWNpYWwuYyBpZiBubyBzdWNoIGltcGxlbWVudGF0aW9uIGV4aXN0cy4gKi8KK2V4dGVybiBjb25zdCBncnBjX3dha2V1cF9mZF92dGFibGUgZ3JwY19zcGVjaWFsaXplZF93YWtldXBfZmRfdnRhYmxlOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9XQUtFVVBfRkRfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNDIwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1dPUktRVUVVRV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfV09SS1FVRVVFX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaCIKKworI2lmZGVmIEdQUl9QT1NJWF9TT0NLRVQKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiCisjZW5kaWYKKworI2lmZGVmIEdQUl9XSU4zMgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5oIgorI2VuZGlmCisKKy8qIGdycGNfd29ya3F1ZXVlIGlzIGZvcndhcmQgZGVjbGFyZWQgaW4gZXhlY19jdHguaCAqLworCisvKiogQ3JlYXRlIGEgd29yayBxdWV1ZSAqLworZ3JwY193b3JrcXVldWUgKmdycGNfd29ya3F1ZXVlX2NyZWF0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCk7CisKK3ZvaWQgZ3JwY193b3JrcXVldWVfZmx1c2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUpOworCisjZGVmaW5lIEdSUENfV09SS1FVRVVFX1JFRkNPVU5UX0RFQlVHCisjaWZkZWYgR1JQQ19XT1JLUVVFVUVfUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgR1JQQ19XT1JLUVVFVUVfUkVGKHAsIHIpIFwKKyAgZ3JwY193b3JrcXVldWVfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfV09SS1FVRVVFX1VOUkVGKGNsLCBwLCByKSBcCisgIGdycGNfd29ya3F1ZXVlX3VucmVmKChjbCksIChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCit2b2lkIGdycGNfd29ya3F1ZXVlX3JlZihncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfd29ya3F1ZXVlX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKTsKKyNlbHNlCisjZGVmaW5lIEdSUENfV09SS1FVRVVFX1JFRihwLCByKSBncnBjX3dvcmtxdWV1ZV9yZWYoKHApKQorI2RlZmluZSBHUlBDX1dPUktRVUVVRV9VTlJFRihjbCwgcCwgcikgZ3JwY193b3JrcXVldWVfdW5yZWYoKGNsKSwgKHApKQordm9pZCBncnBjX3dvcmtxdWV1ZV9yZWYoZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSk7Cit2b2lkIGdycGNfd29ya3F1ZXVlX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlKTsKKyNlbmRpZgorCisvKiogQmluZCB0aGlzIHdvcmtxdWV1ZSB0byBhIHBvbGxzZXQgKi8KK3ZvaWQgZ3JwY193b3JrcXVldWVfYWRkX3RvX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCk7CisKKy8qKiBBZGQgYSB3b3JrIGl0ZW0gdG8gYSB3b3JrcXVldWUgKi8KK3ZvaWQgZ3JwY193b3JrcXVldWVfcHVzaChncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlLCBncnBjX2Nsb3N1cmUgKmNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1Y2Nlc3MpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9XT1JLUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODMwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgorCitzdGF0aWMgdm9pZCBvbl9yZWFkYWJsZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpOworCitncnBjX3dvcmtxdWV1ZSAqZ3JwY193b3JrcXVldWVfY3JlYXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4KSB7CisgIGNoYXIgbmFtZVszMl07CisgIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3dvcmtxdWV1ZSkpOworICBncHJfcmVmX2luaXQoJndvcmtxdWV1ZS0+cmVmcywgMSk7CisgIGdwcl9tdV9pbml0KCZ3b3JrcXVldWUtPm11KTsKKyAgd29ya3F1ZXVlLT5jbG9zdXJlX2xpc3QuaGVhZCA9IHdvcmtxdWV1ZS0+Y2xvc3VyZV9saXN0LnRhaWwgPSBOVUxMOworICBncnBjX3dha2V1cF9mZF9pbml0KCZ3b3JrcXVldWUtPndha2V1cF9mZCk7CisgIHNwcmludGYobmFtZSwgIndvcmtxdWV1ZTolcCIsICh2b2lkICopd29ya3F1ZXVlKTsKKyAgd29ya3F1ZXVlLT53YWtldXBfcmVhZF9mZCA9CisgICAgICBncnBjX2ZkX2NyZWF0ZShHUlBDX1dBS0VVUF9GRF9HRVRfUkVBRF9GRCgmd29ya3F1ZXVlLT53YWtldXBfZmQpLCBuYW1lKTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJndvcmtxdWV1ZS0+cmVhZF9jbG9zdXJlLCBvbl9yZWFkYWJsZSwgd29ya3F1ZXVlKTsKKyAgZ3JwY19mZF9ub3RpZnlfb25fcmVhZChleGVjX2N0eCwgd29ya3F1ZXVlLT53YWtldXBfcmVhZF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmd29ya3F1ZXVlLT5yZWFkX2Nsb3N1cmUpOworICByZXR1cm4gd29ya3F1ZXVlOworfQorCitzdGF0aWMgdm9pZCB3b3JrcXVldWVfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUpIHsKKyAgR1BSX0FTU0VSVChncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eSh3b3JrcXVldWUtPmNsb3N1cmVfbGlzdCkpOworICBncnBjX2ZkX3NodXRkb3duKGV4ZWNfY3R4LCB3b3JrcXVldWUtPndha2V1cF9yZWFkX2ZkKTsKK30KKworI2lmZGVmIEdSUENfV09SS1FVRVVFX1JFRkNPVU5UX0RFQlVHCit2b2lkIGdycGNfd29ya3F1ZXVlX3JlZihncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJXT1JLUVVFVUU6JXAgICByZWYgJWQgLT4gJWQgJXMiLAorICAgICAgICAgIHdvcmtxdWV1ZSwgKGludCl3b3JrcXVldWUtPnJlZnMuY291bnQsIChpbnQpd29ya3F1ZXVlLT5yZWZzLmNvdW50ICsgMSwKKyAgICAgICAgICByZWFzb24pOworI2Vsc2UKK3ZvaWQgZ3JwY193b3JrcXVldWVfcmVmKGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUpIHsKKyNlbmRpZgorICBncHJfcmVmKCZ3b3JrcXVldWUtPnJlZnMpOworfQorCisjaWZkZWYgR1JQQ19XT1JLUVVFVUVfUkVGQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY193b3JrcXVldWVfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpyZWFzb24pIHsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiV09SS1FVRVVFOiVwIHVucmVmICVkIC0+ICVkICVzIiwKKyAgICAgICAgICB3b3JrcXVldWUsIChpbnQpd29ya3F1ZXVlLT5yZWZzLmNvdW50LCAoaW50KXdvcmtxdWV1ZS0+cmVmcy5jb3VudCAtIDEsCisgICAgICAgICAgcmVhc29uKTsKKyNlbHNlCit2b2lkIGdycGNfd29ya3F1ZXVlX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlKSB7CisjZW5kaWYKKyAgaWYgKGdwcl91bnJlZigmd29ya3F1ZXVlLT5yZWZzKSkgeworICAgIHdvcmtxdWV1ZV9kZXN0cm95KGV4ZWNfY3R4LCB3b3JrcXVldWUpOworICB9Cit9CisKK3ZvaWQgZ3JwY193b3JrcXVldWVfYWRkX3RvX3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfd29ya3F1ZXVlICp3b3JrcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgeworICBncnBjX3BvbGxzZXRfYWRkX2ZkKGV4ZWNfY3R4LCBwb2xsc2V0LCB3b3JrcXVldWUtPndha2V1cF9yZWFkX2ZkKTsKK30KKwordm9pZCBncnBjX3dvcmtxdWV1ZV9mbHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY193b3JrcXVldWUgKndvcmtxdWV1ZSkgeworICBncHJfbXVfbG9jaygmd29ya3F1ZXVlLT5tdSk7CisgIGlmIChncnBjX2Nsb3N1cmVfbGlzdF9lbXB0eSh3b3JrcXVldWUtPmNsb3N1cmVfbGlzdCkpIHsKKyAgICBncnBjX3dha2V1cF9mZF93YWtldXAoJndvcmtxdWV1ZS0+d2FrZXVwX2ZkKTsKKyAgfQorICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChleGVjX2N0eCwgJndvcmtxdWV1ZS0+Y2xvc3VyZV9saXN0LCBOVUxMKTsKKyAgZ3ByX211X3VubG9jaygmd29ya3F1ZXVlLT5tdSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX3JlYWRhYmxlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlID0gYXJnOworCisgIGlmICghc3VjY2VzcykgeworICAgIGdwcl9tdV9kZXN0cm95KCZ3b3JrcXVldWUtPm11KTsKKyAgICAvKiBIQUNLOiBsZXQgd2FrZXVwX2ZkIGNvZGUga25vdyB0aGF0IHdlIHN0b2xlIHRoZSBmZCAqLworICAgIHdvcmtxdWV1ZS0+d2FrZXVwX2ZkLnJlYWRfZmQgPSAwOworICAgIGdycGNfd2FrZXVwX2ZkX2Rlc3Ryb3koJndvcmtxdWV1ZS0+d2FrZXVwX2ZkKTsKKyAgICBncnBjX2ZkX29ycGhhbihleGVjX2N0eCwgd29ya3F1ZXVlLT53YWtldXBfcmVhZF9mZCwgTlVMTCwgTlVMTCwgImRlc3Ryb3kiKTsKKyAgICBncHJfZnJlZSh3b3JrcXVldWUpOworICB9IGVsc2UgeworICAgIGdwcl9tdV9sb2NrKCZ3b3JrcXVldWUtPm11KTsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWVfbGlzdChleGVjX2N0eCwgJndvcmtxdWV1ZS0+Y2xvc3VyZV9saXN0LCBOVUxMKTsKKyAgICBncnBjX3dha2V1cF9mZF9jb25zdW1lX3dha2V1cCgmd29ya3F1ZXVlLT53YWtldXBfZmQpOworICAgIGdwcl9tdV91bmxvY2soJndvcmtxdWV1ZS0+bXUpOworICAgIGdycGNfZmRfbm90aWZ5X29uX3JlYWQoZXhlY19jdHgsIHdvcmtxdWV1ZS0+d2FrZXVwX3JlYWRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmd29ya3F1ZXVlLT5yZWFkX2Nsb3N1cmUpOworICB9Cit9CisKK3ZvaWQgZ3JwY193b3JrcXVldWVfcHVzaChncnBjX3dvcmtxdWV1ZSAqd29ya3F1ZXVlLCBncnBjX2Nsb3N1cmUgKmNsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1Y2Nlc3MpIHsKKyAgZ3ByX211X2xvY2soJndvcmtxdWV1ZS0+bXUpOworICBpZiAoZ3JwY19jbG9zdXJlX2xpc3RfZW1wdHkod29ya3F1ZXVlLT5jbG9zdXJlX2xpc3QpKSB7CisgICAgZ3JwY193YWtldXBfZmRfd2FrZXVwKCZ3b3JrcXVldWUtPndha2V1cF9mZCk7CisgIH0KKyAgZ3JwY19jbG9zdXJlX2xpc3RfYWRkKCZ3b3JrcXVldWUtPmNsb3N1cmVfbGlzdCwgY2xvc3VyZSwgc3VjY2Vzcyk7CisgIGdwcl9tdV91bmxvY2soJndvcmtxdWV1ZS0+bXUpOworfQorCisjZW5kaWYgLyogR1BSX1BPU0lYX1NPQ0tFVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmRlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1dPUktRVUVVRV9QT1NJWF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSU9NR1JfV09SS1FVRVVFX1BPU0lYX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaCIKKworc3RydWN0IGdycGNfZmQ7CisKK3N0cnVjdCBncnBjX3dvcmtxdWV1ZSB7CisgIGdwcl9yZWZjb3VudCByZWZzOworCisgIGdwcl9tdSBtdTsKKyAgZ3JwY19jbG9zdXJlX2xpc3QgY2xvc3VyZV9saXN0OworCisgIGdycGNfd2FrZXVwX2ZkIHdha2V1cF9mZDsKKyAgc3RydWN0IGdycGNfZmQgKndha2V1cF9yZWFkX2ZkOworCisgIGdycGNfY2xvc3VyZSByZWFkX2Nsb3N1cmU7Cit9OworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9JT01HUl9XT1JLUVVFVUVfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk3ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfV0lOMzIKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWUuaCIKKworI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmggYi9zcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY5ODBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0lPTUdSX1dPUktRVUVVRV9XSU5ET1dTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9JT01HUl9XT1JLUVVFVUVfV0lORE9XU19ICisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0lPTUdSX1dPUktRVUVVRV9XSU5ET1dTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9qc29uL2pzb24uYyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzkzMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL2pzb24vanNvbi5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbi5oIgorCitncnBjX2pzb24gKmdycGNfanNvbl9jcmVhdGUoZ3JwY19qc29uX3R5cGUgdHlwZSkgeworICBncnBjX2pzb24gKmpzb24gPSBncHJfbWFsbG9jKHNpemVvZigqanNvbikpOworICBtZW1zZXQoanNvbiwgMCwgc2l6ZW9mKCpqc29uKSk7CisgIGpzb24tPnR5cGUgPSB0eXBlOworCisgIHJldHVybiBqc29uOworfQorCit2b2lkIGdycGNfanNvbl9kZXN0cm95KGdycGNfanNvbiAqanNvbikgeworICB3aGlsZSAoanNvbi0+Y2hpbGQpIHsKKyAgICBncnBjX2pzb25fZGVzdHJveShqc29uLT5jaGlsZCk7CisgIH0KKworICBpZiAoanNvbi0+bmV4dCkgeworICAgIGpzb24tPm5leHQtPnByZXYgPSBqc29uLT5wcmV2OworICB9CisKKyAgaWYgKGpzb24tPnByZXYpIHsKKyAgICBqc29uLT5wcmV2LT5uZXh0ID0ganNvbi0+bmV4dDsKKyAgfSBlbHNlIGlmIChqc29uLT5wYXJlbnQpIHsKKyAgICBqc29uLT5wYXJlbnQtPmNoaWxkID0ganNvbi0+bmV4dDsKKyAgfQorCisgIGdwcl9mcmVlKGpzb24pOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2pzb24vanNvbi5oIGIvc3JjL2NvcmUvbGliL2pzb24vanNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDg3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvanNvbi9qc29uLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX0pTT05fSlNPTl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSlNPTl9KU09OX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaCIKKworLyogQSB0cmVlLWxpa2Ugc3RydWN0dXJlIHRvIGhvbGQganNvbiB2YWx1ZXMuIFRoZSBrZXkgYW5kIHZhbHVlIHBvaW50ZXJzCisgKiBhcmUgbm90IG93bmVkIGJ5IGl0LgorICovCit0eXBlZGVmIHN0cnVjdCBncnBjX2pzb24geworICBzdHJ1Y3QgZ3JwY19qc29uICpuZXh0OworICBzdHJ1Y3QgZ3JwY19qc29uICpwcmV2OworICBzdHJ1Y3QgZ3JwY19qc29uICpjaGlsZDsKKyAgc3RydWN0IGdycGNfanNvbiAqcGFyZW50OworCisgIGdycGNfanNvbl90eXBlIHR5cGU7CisgIGNvbnN0IGNoYXIgKmtleTsKKyAgY29uc3QgY2hhciAqdmFsdWU7Cit9IGdycGNfanNvbjsKKworLyogVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ29pbmcgdG8gcGFyc2UgdGhlIGlucHV0IHN0cmluZywgYW5kCisgKiBtb2RpZnkgaXQgaW4gdGhlIHByb2Nlc3MsIGluIG9yZGVyIHRvIHVzZSBpdHMgc3BhY2UgdG8gc3RvcmUKKyAqIGFsbCBvZiB0aGUga2V5cyBhbmQgdmFsdWVzIGZvciB0aGUgcmV0dXJuZWQgb2JqZWN0IHRyZWUuCisgKgorICogVGhleSBhc3N1bWUgVVRGLTggaW5wdXQgc3RyZWFtLCBhbmQgd2lsbCBvdXRwdXQgVVRGLTggZW5jb2RlZAorICogc3RyaW5ncyBpbiB0aGUgdHJlZS4gVGhlIGlucHV0IHN0cmVhbSdzIFVURi04IGlzbid0IHZhbGlkYXRlZCwKKyAqIGFzIGluLCB3aGF0IHlvdSBpbnB1dCBpcyB3aGF0IHlvdSBnZXQgYXMgYW4gb3V0cHV0LgorICoKKyAqIEFsbCB0aGUga2V5cyBhbmQgdmFsdWVzIGluIHRoZSBncnBjX2pzb24gb2JqZWN0cyB3aWxsIGJlIHN0cmluZ3MKKyAqIHBvaW50aW5nIGF0IHlvdXIgaW5wdXQgYnVmZmVyLgorICoKKyAqIERlbGV0ZSB0aGUgYWxsb2NhdGVkIHRyZWUgYWZ0ZXJ3YXJkIHVzaW5nIGdycGNfanNvbl9kZXN0cm95KCkuCisgKi8KK2dycGNfanNvbiAqZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihjaGFyICppbnB1dCwgc2l6ZV90IHNpemUpOworZ3JwY19qc29uICpncnBjX2pzb25fcGFyc2Vfc3RyaW5nKGNoYXIgKmlucHV0KTsKKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBzdHJpbmcgdXNpbmcgZ3ByX3JlYWxsb2MsIGFuZCB3aWxsCisgKiBkZXNlcmlhbGl6ZSB0aGUgZ3JwY19qc29uIHRyZWUgaW50byBpdC4gSXQnbGwgYmUgemVyby10ZXJtaW5hdGVkLAorICogYnV0IHdpbGwgYmUgYWxsb2NhdGVkIGluIGNodW5rcyBvZiAyNTYgYnl0ZXMuCisgKgorICogVGhlIGluZGVudCBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHdheSB0aGUgb3V0cHV0IGlzIGZvcm1hdHRlZC4KKyAqIElmIGluZGVudCBpcyAwLCB0aGVuIG5ld2xpbmVzIHdpbGwgYmUgc3VwcHJlc3NlZCBhcyB3ZWxsLCBhbmQgdGhlCisgKiBvdXRwdXQgd2lsbCBiZSBjb25kZW5zZWQgYXQgaXRzIG1heGltdW0uCisgKi8KK2NoYXIgKmdycGNfanNvbl9kdW1wX3RvX3N0cmluZyhncnBjX2pzb24gKmpzb24sIGludCBpbmRlbnQpOworCisvKiBVc2UgdGhlc2UgdG8gY3JlYXRlIG9yIGRlbGV0ZSBhIGdycGNfanNvbiBvYmplY3QuCisgKiBEZWxldGlvbiBpcyByZWN1cnNpdmUuIFdlIHdpbGwgbm90IGF0dGVtcHQgdG8gZnJlZSBhbnkgb2YgdGhlIHN0cmluZ3MKKyAqIGluIGFueSBvZiB0aGUgb2JqZWN0cyBvZiB0aGF0IHRyZWUuCisgKi8KK2dycGNfanNvbiAqZ3JwY19qc29uX2NyZWF0ZShncnBjX2pzb25fdHlwZSB0eXBlKTsKK3ZvaWQgZ3JwY19qc29uX2Rlc3Ryb3koZ3JwY19qc29uICpqc29uKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSlNPTl9KU09OX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmggYi9zcmMvY29yZS9saWIvanNvbi9qc29uX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTgwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvanNvbi9qc29uX2NvbW1vbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9KU09OX0pTT05fQ09NTU9OX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9KU09OX0pTT05fQ09NTU9OX0gKKworLyogVGhlIHZhcmlvdXMganNvbiB0eXBlcy4gKi8KK3R5cGVkZWYgZW51bSB7CisgIEdSUENfSlNPTl9PQkpFQ1QsCisgIEdSUENfSlNPTl9BUlJBWSwKKyAgR1JQQ19KU09OX1NUUklORywKKyAgR1JQQ19KU09OX05VTUJFUiwKKyAgR1JQQ19KU09OX1RSVUUsCisgIEdSUENfSlNPTl9GQUxTRSwKKyAgR1JQQ19KU09OX05VTEwsCisgIEdSUENfSlNPTl9UT1BfTEVWRUwKK30gZ3JwY19qc29uX3R5cGU7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX0pTT05fSlNPTl9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuYyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmZjEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmMKQEAgLTAsMCArMSw2NjIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oIgorCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zdHJpbmdfY2xlYXIoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKSB7CisgIHJlYWRlci0+dnRhYmxlLT5zdHJpbmdfY2xlYXIocmVhZGVyLT51c2VyZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihncnBjX2pzb25fcmVhZGVyICpyZWFkZXIsIHVpbnQzMl90IGMpIHsKKyAgcmVhZGVyLT52dGFibGUtPnN0cmluZ19hZGRfY2hhcihyZWFkZXItPnVzZXJkYXRhLCBjKTsKK30KKworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc3RyaW5nX2FkZF91dGYzMihncnBjX2pzb25fcmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHV0ZjMyKSB7CisgIHJlYWRlci0+dnRhYmxlLT5zdHJpbmdfYWRkX3V0ZjMyKHJlYWRlci0+dXNlcmRhdGEsIHV0ZjMyKTsKK30KKworc3RhdGljIHVpbnQzMl90IGdycGNfanNvbl9yZWFkZXJfcmVhZF9jaGFyKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgeworICByZXR1cm4gcmVhZGVyLT52dGFibGUtPnJlYWRfY2hhcihyZWFkZXItPnVzZXJkYXRhKTsKK30KKworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfY29udGFpbmVyX2JlZ2lucyhncnBjX2pzb25fcmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl90eXBlIHR5cGUpIHsKKyAgcmVhZGVyLT52dGFibGUtPmNvbnRhaW5lcl9iZWdpbnMocmVhZGVyLT51c2VyZGF0YSwgdHlwZSk7Cit9CisKK3N0YXRpYyBncnBjX2pzb25fdHlwZSBncnBjX2pzb25fcmVhZGVyX2NvbnRhaW5lcl9lbmRzKAorICAgIGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgeworICByZXR1cm4gcmVhZGVyLT52dGFibGUtPmNvbnRhaW5lcl9lbmRzKHJlYWRlci0+dXNlcmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfa2V5KGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgeworICByZWFkZXItPnZ0YWJsZS0+c2V0X2tleShyZWFkZXItPnVzZXJkYXRhKTsKK30KKworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X3N0cmluZyhncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKKyAgcmVhZGVyLT52dGFibGUtPnNldF9zdHJpbmcocmVhZGVyLT51c2VyZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQganNvbl9yZWFkZXJfc2V0X251bWJlcihncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKKyAgcmV0dXJuIHJlYWRlci0+dnRhYmxlLT5zZXRfbnVtYmVyKHJlYWRlci0+dXNlcmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfdHJ1ZShncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpIHsKKyAgcmVhZGVyLT52dGFibGUtPnNldF90cnVlKHJlYWRlci0+dXNlcmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfZmFsc2UoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKSB7CisgIHJlYWRlci0+dnRhYmxlLT5zZXRfZmFsc2UocmVhZGVyLT51c2VyZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3NldF9udWxsKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgeworICByZWFkZXItPnZ0YWJsZS0+c2V0X251bGwocmVhZGVyLT51c2VyZGF0YSk7Cit9CisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSByZWFkZXIgc3RydWN0dXJlLiAqLwordm9pZCBncnBjX2pzb25fcmVhZGVyX2luaXQoZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3JlYWRlcl92dGFibGUgKnZ0YWJsZSwgdm9pZCAqdXNlcmRhdGEpIHsKKyAgbWVtc2V0KHJlYWRlciwgMCwgc2l6ZW9mKCpyZWFkZXIpKTsKKyAgcmVhZGVyLT52dGFibGUgPSB2dGFibGU7CisgIHJlYWRlci0+dXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAganNvbl9yZWFkZXJfc3RyaW5nX2NsZWFyKHJlYWRlcik7CisgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfQkVHSU47Cit9CisKK2ludCBncnBjX2pzb25fcmVhZGVyX2lzX2NvbXBsZXRlKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgeworICByZXR1cm4gKChyZWFkZXItPmRlcHRoID09IDApICYmCisgICAgICAgICAgKChyZWFkZXItPnN0YXRlID09IEdSUENfSlNPTl9TVEFURV9FTkQpIHx8CisgICAgICAgICAgIChyZWFkZXItPnN0YXRlID09IEdSUENfSlNPTl9TVEFURV9WQUxVRV9FTkQpKSk7Cit9CisKK2dycGNfanNvbl9yZWFkZXJfc3RhdHVzIGdycGNfanNvbl9yZWFkZXJfcnVuKGdycGNfanNvbl9yZWFkZXIgKnJlYWRlcikgeworICB1aW50MzJfdCBjLCBzdWNjZXNzOworCisgIC8qIFRoaXMgc3RhdGUtbWFjaGluZSBpcyBhIHN0cmljdCBpbXBsZW1lbnRhdGlvbiBvZiBFQ01BLTQwNCAqLworICBmb3IgKDs7KSB7CisgICAgYyA9IGdycGNfanNvbl9yZWFkZXJfcmVhZF9jaGFyKHJlYWRlcik7CisgICAgc3dpdGNoIChjKSB7CisgICAgICAvKiBMZXQncyBwcm9jZXNzIHRoZSBlcnJvciBjYXNlcyBmaXJzdC4gKi8KKyAgICAgIGNhc2UgR1JQQ19KU09OX1JFQURfQ0hBUl9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9SRUFEX0VSUk9SOworCisgICAgICBjYXNlIEdSUENfSlNPTl9SRUFEX0NIQVJfRUFHQUlOOgorICAgICAgICByZXR1cm4gR1JQQ19KU09OX0VBR0FJTjsKKworICAgICAgY2FzZSBHUlBDX0pTT05fUkVBRF9DSEFSX0VPRjoKKyAgICAgICAgaWYgKGdycGNfanNvbl9yZWFkZXJfaXNfY29tcGxldGUocmVhZGVyKSkgeworICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fRE9ORTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBQcm9jZXNzaW5nIHdoaXRlc3BhY2VzLiAqLworICAgICAgY2FzZSAnICc6CisgICAgICBjYXNlICdcdCc6CisgICAgICBjYXNlICdcbic6CisgICAgICBjYXNlICdccic6CisgICAgICAgIHN3aXRjaCAocmVhZGVyLT5zdGF0ZSkgeworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfQkVHSU46CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9FTkQ6CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfQkVHSU46CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX0VORDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc6CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOgorICAgICAgICAgICAgaWYgKGMgIT0gJyAnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSAhPSAwKQorICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUjoKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfV0lUSF9ERUNJTUFMOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9aRVJPOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FUE06CisgICAgICAgICAgICBzdWNjZXNzID0gKHVpbnQzMl90KWpzb25fcmVhZGVyX3NldF9udW1iZXIocmVhZGVyKTsKKyAgICAgICAgICAgIGlmICghc3VjY2VzcykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19jbGVhcihyZWFkZXIpOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9FTkQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBWYWx1ZSwgb2JqZWN0IG9yIGFycmF5IHRlcm1pbmF0aW9ucy4gKi8KKyAgICAgIGNhc2UgJywnOgorICAgICAgY2FzZSAnfSc6CisgICAgICBjYXNlICddJzoKKyAgICAgICAgc3dpdGNoIChyZWFkZXItPnN0YXRlKSB7CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc6CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOgorICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSAhPSAwKQorICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUjoKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfV0lUSF9ERUNJTUFMOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9aRVJPOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FUE06CisgICAgICAgICAgICBzdWNjZXNzID0gKHVpbnQzMl90KWpzb25fcmVhZGVyX3NldF9udW1iZXIocmVhZGVyKTsKKyAgICAgICAgICAgIGlmICghc3VjY2VzcykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19jbGVhcihyZWFkZXIpOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9FTkQ7CisgICAgICAgICAgLyogVGhlIG1pc3NpbmcgYnJlYWsgaGVyZSBpcyBpbnRlbnRpb25hbC4gKi8KKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDoKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0JFR0lOOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOOgorICAgICAgICAgICAgaWYgKGMgPT0gJywnKSB7CisgICAgICAgICAgICAgIGlmIChyZWFkZXItPnN0YXRlICE9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9FTkQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChyZWFkZXItPmluX29iamVjdCkgeworICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9CRUdJTjsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAocmVhZGVyLT5kZXB0aC0tID09IDApIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIGlmICgoYyA9PSAnfScpICYmICFyZWFkZXItPmluX29iamVjdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKChjID09ICd9JykgJiYKKyAgICAgICAgICAgICAgICAgIChyZWFkZXItPnN0YXRlID09IEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0JFR0lOKSAmJgorICAgICAgICAgICAgICAgICAgIXJlYWRlci0+Y29udGFpbmVyX2p1c3RfYmVndW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICgoYyA9PSAnXScpICYmICFyZWFkZXItPmluX2FycmF5KSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICBpZiAoKGMgPT0gJ10nKSAmJgorICAgICAgICAgICAgICAgICAgKHJlYWRlci0+c3RhdGUgPT0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOKSAmJgorICAgICAgICAgICAgICAgICAgIXJlYWRlci0+Y29udGFpbmVyX2p1c3RfYmVndW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOworICAgICAgICAgICAgICBzd2l0Y2ggKGdycGNfanNvbl9yZWFkZXJfY29udGFpbmVyX2VuZHMocmVhZGVyKSkgeworICAgICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX09CSkVDVDoKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fb2JqZWN0ID0gMTsKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fYXJyYXkgPSAwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHUlBDX0pTT05fQVJSQVk6CisgICAgICAgICAgICAgICAgICByZWFkZXItPmluX29iamVjdCA9IDA7CisgICAgICAgICAgICAgICAgICByZWFkZXItPmluX2FycmF5ID0gMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1RPUF9MRVZFTDoKKyAgICAgICAgICAgICAgICAgIEdQUl9BU1NFUlQocmVhZGVyLT5kZXB0aCA9PSAwKTsKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fb2JqZWN0ID0gMDsKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fYXJyYXkgPSAwOworICAgICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9FTkQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuIEdSUENfSlNPTl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEluLXN0cmluZyBlc2NhcGluZy4gKi8KKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgc3dpdGNoIChyZWFkZXItPnN0YXRlKSB7CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc6CisgICAgICAgICAgICByZWFkZXItPmVzY2FwZWRfc3RyaW5nX3dhc19rZXkgPSAxOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9TVFJJTkc6CisgICAgICAgICAgICByZWFkZXItPmVzY2FwZWRfc3RyaW5nX3dhc19rZXkgPSAwOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBcXCBjYXNlLiAqLworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEU6CisgICAgICAgICAgICBpZiAocmVhZGVyLT51bmljb2RlX2hpZ2hfc3Vycm9nYXRlICE9IDApCisgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCAnXFwnKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXItPmVzY2FwZWRfc3RyaW5nX3dhc19rZXkpIHsKKyAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX1NUUklORzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVhZGVyLT5jb250YWluZXJfanVzdF9iZWd1biA9IDA7CisgICAgICAgIHN3aXRjaCAocmVhZGVyLT5zdGF0ZSkgeworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfQkVHSU46CisgICAgICAgICAgICBpZiAoYyAhPSAnIicpIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfU1RSSU5HOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX1NUUklORzoKKyAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgIT0gMCkKKyAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfRU5EOworICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zZXRfa2V5KHJlYWRlcik7CisgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19jbGVhcihyZWFkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKGMgPCAzMikgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzoKKyAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgIT0gMCkKKyAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDsKKyAgICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X3N0cmluZyhyZWFkZXIpOworICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfY2xlYXIocmVhZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChjIDwgMzIpIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0VORDoKKyAgICAgICAgICAgIGlmIChjICE9ICc6JykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfQkVHSU47CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0JFR0lOOgorICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9SOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRkFMU0VfQTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTExfVTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCBjKTsKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9aRVJPOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOworICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAgIHJlYWRlci0+Y29udGFpbmVyX2p1c3RfYmVndW4gPSAxOworICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9iZWdpbnMocmVhZGVyLCBHUlBDX0pTT05fT0JKRUNUKTsKKyAgICAgICAgICAgICAgICByZWFkZXItPmRlcHRoKys7CisgICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX0JFR0lOOworICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fb2JqZWN0ID0gMTsKKyAgICAgICAgICAgICAgICByZWFkZXItPmluX2FycmF5ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICByZWFkZXItPmNvbnRhaW5lcl9qdXN0X2JlZ3VuID0gMTsKKyAgICAgICAgICAgICAgICBqc29uX3JlYWRlcl9jb250YWluZXJfYmVnaW5zKHJlYWRlciwgR1JQQ19KU09OX0FSUkFZKTsKKyAgICAgICAgICAgICAgICByZWFkZXItPmRlcHRoKys7CisgICAgICAgICAgICAgICAgcmVhZGVyLT5pbl9vYmplY3QgPSAwOworICAgICAgICAgICAgICAgIHJlYWRlci0+aW5fYXJyYXkgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEU6CisgICAgICAgICAgICBpZiAocmVhZGVyLT5lc2NhcGVkX3N0cmluZ193YXNfa2V5KSB7CisgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1NUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgJiYgYyAhPSAndScpCisgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCAnXGInKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgJ1xmJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsICdcbicpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIocmVhZGVyLCAnXHInKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgJ1x0Jyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMTsKKyAgICAgICAgICAgICAgICByZWFkZXItPnVuaWNvZGVfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMToKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyOgorICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTM6CisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VNDoKKyAgICAgICAgICAgIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgYyAtPSAnMCc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkgeworICAgICAgICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA+PSAnYScpICYmIChjIDw9ICdmJykpIHsKKyAgICAgICAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFkZXItPnVuaWNvZGVfY2hhciA9ICh1aW50MTZfdCkocmVhZGVyLT51bmljb2RlX2NoYXIgPDwgNCk7CisgICAgICAgICAgICByZWFkZXItPnVuaWNvZGVfY2hhciA9ICh1aW50MTZfdCkocmVhZGVyLT51bmljb2RlX2NoYXIgfCBjKTsKKworICAgICAgICAgICAgc3dpdGNoIChyZWFkZXItPnN0YXRlKSB7CisgICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTE6CisgICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UyOgorICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMzoKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTQ6CisgICAgICAgICAgICAgICAgLyogU2VlIGdycGNfanNvbl93cml0ZXJfZXNjYXBlX3N0cmluZyB0byBoYXZlIGEgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgKiBvZiB3aGF0J3MgZ29pbmcgb24gaGVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJlYWRlci0+dW5pY29kZV9jaGFyICYgMHhmYzAwKSA9PSAweGQ4MDApIHsKKyAgICAgICAgICAgICAgICAgIC8qIGhpZ2ggc3Vycm9nYXRlIHV0Zi0xNiAqLworICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgICAgcmVhZGVyLT51bmljb2RlX2hpZ2hfc3Vycm9nYXRlID0gcmVhZGVyLT51bmljb2RlX2NoYXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocmVhZGVyLT51bmljb2RlX2NoYXIgJiAweGZjMDApID09IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgICAgLyogbG93IHN1cnJvZ2F0ZSB1dGYtMTYgKi8KKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHV0ZjMyOworICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgICAgdXRmMzIgPSAweDEwMDAwOworICAgICAgICAgICAgICAgICAgdXRmMzIgKz0gKHVpbnQzMl90KSgKKyAgICAgICAgICAgICAgICAgICAgICAocmVhZGVyLT51bmljb2RlX2hpZ2hfc3Vycm9nYXRlIC0gMHhkODAwKSAqIDB4NDAwKTsKKyAgICAgICAgICAgICAgICAgIHV0ZjMyICs9ICh1aW50MzJfdCkocmVhZGVyLT51bmljb2RlX2NoYXIgLSAweGRjMDApOworICAgICAgICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF91dGYzMihyZWFkZXIsIHV0ZjMyKTsKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+dW5pY29kZV9oaWdoX3N1cnJvZ2F0ZSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXItPnVuaWNvZGVfaGlnaF9zdXJyb2dhdGUgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfdXRmMzIocmVhZGVyLCByZWFkZXItPnVuaWNvZGVfY2hhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWFkZXItPmVzY2FwZWRfc3RyaW5nX3dhc19rZXkpIHsKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfT0JKRUNUX0tFWV9TVFJJTkc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfU1RSSU5HOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gR1JQQ19KU09OX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSOgorICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9ET1Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX1dJVEhfREVDSU1BTDoKKyAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfWkVSTzoKKyAgICAgICAgICAgIGlmIChjICE9ICcuJykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRE9UOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRE9UOgorICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfV0lUSF9ERUNJTUFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FOgorICAgICAgICAgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHJlYWRlciwgYyk7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FUE07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVNQkVSX0VQTToKKyAgICAgICAgICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcihyZWFkZXIsIGMpOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1RSVUVfUjoKKyAgICAgICAgICAgIGlmIChjICE9ICdyJykgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9VOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9UUlVFX1U6CisgICAgICAgICAgICBpZiAoYyAhPSAndScpIHJldHVybiBHUlBDX0pTT05fUEFSU0VfRVJST1I7CisgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX1RSVUVfRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfVFJVRV9FOgorICAgICAgICAgICAgaWYgKGMgIT0gJ2UnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X3RydWUocmVhZGVyKTsKKyAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9BOgorICAgICAgICAgICAgaWYgKGMgIT0gJ2EnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9MOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9MOgorICAgICAgICAgICAgaWYgKGMgIT0gJ2wnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9TOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9TOgorICAgICAgICAgICAgaWYgKGMgIT0gJ3MnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9FOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9FOgorICAgICAgICAgICAgaWYgKGMgIT0gJ2UnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X2ZhbHNlKHJlYWRlcik7CisgICAgICAgICAgICByZWFkZXItPnN0YXRlID0gR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVMTF9VOgorICAgICAgICAgICAgaWYgKGMgIT0gJ3UnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wxOgorICAgICAgICAgICAgaWYgKGMgIT0gJ2wnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgcmVhZGVyLT5zdGF0ZSA9IEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVUxMX0wyOgorICAgICAgICAgICAgaWYgKGMgIT0gJ2wnKSByZXR1cm4gR1JQQ19KU09OX1BBUlNFX0VSUk9SOworICAgICAgICAgICAganNvbl9yZWFkZXJfc2V0X251bGwocmVhZGVyKTsKKyAgICAgICAgICAgIHJlYWRlci0+c3RhdGUgPSBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRU5EOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAvKiBBbGwgb2YgdGhlIFZBTFVFX0VORCBjYXNlcyBhcmUgaGFuZGxlZCBpbiB0aGUgc3BlY2lhbGl6ZWQgY2FzZQorICAgICAgICAgICAqIGFib3ZlLiAqLworICAgICAgICAgIGNhc2UgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0VORDoKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0pTT05fSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBHUlBDX0pTT05fU1RBVEVfRU5EOgorICAgICAgICAgICAgcmV0dXJuIEdSUENfSlNPTl9QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgfQorCisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBHUlBDX0pTT05fSU5URVJOQUxfRVJST1IpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhODM4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9KU09OX0pTT05fUkVBREVSX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9KU09OX0pTT05fUkVBREVSX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfQkVHSU4sCisgIEdSUENfSlNPTl9TVEFURV9PQkpFQ1RfS0VZX1NUUklORywKKyAgR1JQQ19KU09OX1NUQVRFX09CSkVDVF9LRVlfRU5ELAorICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfQkVHSU4sCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9TVFJJTkcsCisgIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFLAorICBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VMSwKKyAgR1JQQ19KU09OX1NUQVRFX1NUUklOR19FU0NBUEVfVTIsCisgIEdSUENfSlNPTl9TVEFURV9TVFJJTkdfRVNDQVBFX1UzLAorICBHUlBDX0pTT05fU1RBVEVfU1RSSU5HX0VTQ0FQRV9VNCwKKyAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUiwKKyAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9XSVRIX0RFQ0lNQUwsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfWkVSTywKKyAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9ET1QsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9OVU1CRVJfRSwKKyAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTUJFUl9FUE0sCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9UUlVFX1IsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9UUlVFX1UsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9UUlVFX0UsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9BLAorICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfRkFMU0VfTCwKKyAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX0ZBTFNFX1MsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9GQUxTRV9FLAorICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVMTF9VLAorICBHUlBDX0pTT05fU1RBVEVfVkFMVUVfTlVMTF9MMSwKKyAgR1JQQ19KU09OX1NUQVRFX1ZBTFVFX05VTExfTDIsCisgIEdSUENfSlNPTl9TVEFURV9WQUxVRV9FTkQsCisgIEdSUENfSlNPTl9TVEFURV9FTkQKK30gZ3JwY19qc29uX3JlYWRlcl9zdGF0ZTsKKworZW51bSB7CisgIC8qIFRoZSBmaXJzdCBub24tdW5pY29kZSB2YWx1ZSBpcyAweDExMDAwMC4gQnV0IGxldCdzIHBpY2sKKyAgICogYSB2YWx1ZSBoaWdoIGVub3VnaCB0byBzdGFydCBvdXIgZXJyb3IgY29kZXMgZnJvbS4gVGhlc2UKKyAgICogdmFsdWVzIGFyZSBzYWZlIHRvIHJldHVybiBmcm9tIHRoZSByZWFkX2NoYXIgZnVuY3Rpb24uCisgICAqLworICBHUlBDX0pTT05fUkVBRF9DSEFSX0VPRiA9IDB4N2ZmZmZmZjAsCisgIEdSUENfSlNPTl9SRUFEX0NIQVJfRUFHQUlOLAorICBHUlBDX0pTT05fUkVBRF9DSEFSX0VSUk9SCit9OworCitzdHJ1Y3QgZ3JwY19qc29uX3JlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19qc29uX3JlYWRlcl92dGFibGUgeworICAvKiBDbGVhcnMgeW91ciBpbnRlcm5hbCBzdHJpbmcgc2NyYXRjaHBhZC4gKi8KKyAgdm9pZCAoKnN0cmluZ19jbGVhcikodm9pZCAqdXNlcmRhdGEpOworICAvKiBBZGRzIGEgY2hhciB0byB0aGUgc3RyaW5nIHNjcmF0Y2hwYWQuICovCisgIHZvaWQgKCpzdHJpbmdfYWRkX2NoYXIpKHZvaWQgKnVzZXJkYXRhLCB1aW50MzJfdCBjKTsKKyAgLyogQWRkcyBhIHV0ZjMyIGNoYXIgdG8gdGhlIHN0cmluZyBzY3JhdGNocGFkLiAqLworICB2b2lkICgqc3RyaW5nX2FkZF91dGYzMikodm9pZCAqdXNlcmRhdGEsIHVpbnQzMl90IGMpOworICAvKiBSZWFkcyBhIGNoYXJhY3RlciBmcm9tIHlvdXIgaW5wdXQuIE1heSBiZSB1dGYtOCwgMTYgb3IgMzIuICovCisgIHVpbnQzMl90ICgqcmVhZF9jaGFyKSh2b2lkICp1c2VyZGF0YSk7CisgIC8qIFN0YXJ0cyBhIGNvbnRhaW5lciBvZiB0eXBlIEdSUENfSlNPTl9BUlJBWSBvciBHUlBDX0pTT05fT0JKRUNULiAqLworICB2b2lkICgqY29udGFpbmVyX2JlZ2lucykodm9pZCAqdXNlcmRhdGEsIGdycGNfanNvbl90eXBlIHR5cGUpOworICAvKiBFbmRzIHRoZSBjdXJyZW50IGNvbnRhaW5lci4gTXVzdCByZXR1cm4gdGhlIHR5cGUgb2YgaXRzIHBhcmVudC4gKi8KKyAgZ3JwY19qc29uX3R5cGUgKCpjb250YWluZXJfZW5kcykodm9pZCAqdXNlcmRhdGEpOworICAvKiBZb3VyIGludGVybmFsIHN0cmluZyBzY3JhdGNocGFkIGlzIGFuIG9iamVjdCdzIGtleS4gKi8KKyAgdm9pZCAoKnNldF9rZXkpKHZvaWQgKnVzZXJkYXRhKTsKKyAgLyogWW91ciBpbnRlcm5hbCBzdHJpbmcgc2NyYXRjaHBhZCBpcyBhIHN0cmluZyB2YWx1ZS4gKi8KKyAgdm9pZCAoKnNldF9zdHJpbmcpKHZvaWQgKnVzZXJkYXRhKTsKKyAgLyogWW91ciBpbnRlcm5hbCBzdHJpbmcgc2NyYXRjaHBhZCBpcyBhIG51bWVyaWNhbCB2YWx1ZS4gUmV0dXJuIDEgaWYgdmFsaWQuICovCisgIGludCAoKnNldF9udW1iZXIpKHZvaWQgKnVzZXJkYXRhKTsKKyAgLyogU2V0cyB0aGUgdmFsdWVzIHRydWUsIGZhbHNlIG9yIG51bGwuICovCisgIHZvaWQgKCpzZXRfdHJ1ZSkodm9pZCAqdXNlcmRhdGEpOworICB2b2lkICgqc2V0X2ZhbHNlKSh2b2lkICp1c2VyZGF0YSk7CisgIHZvaWQgKCpzZXRfbnVsbCkodm9pZCAqdXNlcmRhdGEpOworfSBncnBjX2pzb25fcmVhZGVyX3Z0YWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19qc29uX3JlYWRlciB7CisgIC8qIFRoYXQgc3RydWN0dXJlIGlzIGZ1bGx5IHByaXZhdGUsIGFuZCBpbml0aWFsaXplZCBieSBncnBjX2pzb25fcmVhZGVyX2luaXQuCisgICAqIFRoZSBkZWZpbml0aW9uIGlzIHB1YmxpYyBzbyB5b3UgY2FuIHB1dCBpdCBvbiB5b3VyIHN0YWNrLgorICAgKi8KKworICB2b2lkICp1c2VyZGF0YTsKKyAgZ3JwY19qc29uX3JlYWRlcl92dGFibGUgKnZ0YWJsZTsKKyAgaW50IGRlcHRoOworICBpbnQgaW5fb2JqZWN0OworICBpbnQgaW5fYXJyYXk7CisgIGludCBlc2NhcGVkX3N0cmluZ193YXNfa2V5OworICBpbnQgY29udGFpbmVyX2p1c3RfYmVndW47CisgIHVpbnQxNl90IHVuaWNvZGVfY2hhciwgdW5pY29kZV9oaWdoX3N1cnJvZ2F0ZTsKKyAgZ3JwY19qc29uX3JlYWRlcl9zdGF0ZSBzdGF0ZTsKK30gZ3JwY19qc29uX3JlYWRlcjsKKworLyogVGhlIHJldHVybiB0eXBlIG9mIHRoZSBwYXJzZXIuICovCit0eXBlZGVmIGVudW0geworICBHUlBDX0pTT05fRE9ORSwgICAgICAgICAgLyogVGhlIHBhcnNlciBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuICovCisgIEdSUENfSlNPTl9FQUdBSU4sICAgICAgICAvKiBUaGUgcGFyc2VyIHlpZWxkcyB0byBnZXQgbW9yZSBkYXRhLiAqLworICBHUlBDX0pTT05fUkVBRF9FUlJPUiwgICAgLyogVGhlIHBhcnNlciBwYXNzZXMgdGhyb3VnaCBhIHJlYWQgZXJyb3IuICovCisgIEdSUENfSlNPTl9QQVJTRV9FUlJPUiwgICAvKiBUaGUgcGFyc2VyIGZvdW5kIGFuIGVycm9yIGluIHRoZSBqc29uIHN0cmVhbS4gKi8KKyAgR1JQQ19KU09OX0lOVEVSTkFMX0VSUk9SIC8qIFRoZSBwYXJzZXIgZ290IGFuIGludGVybmFsIGVycm9yLiAqLworfSBncnBjX2pzb25fcmVhZGVyX3N0YXR1czsKKworLyogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHN0YXJ0IHBhcnNpbmcgdGhlIGlucHV0LiBJdCB3aWxsIHJldHVybiB0aGUgZm9sbG93aW5nOgorICogICAgLiBHUlBDX0pTT05fRE9ORSBpZiB0aGUgaW5wdXQgZ290IGVvZiwgYW5kIHRoZSBwYXJzaW5nIGZpbmlzaGVkCisgKiAgICAgIHN1Y2Nlc3NmdWxseS4KKyAqICAgIC4gR1JQQ19KU09OX0VBR0FJTiBpZiB0aGUgcmVhZF9jaGFyIGZ1bmN0aW9uIHJldHVybmVkIGFnYWluLiBDYWxsIHRoZQorICogICAgICBwYXJzZXIgYWdhaW4gYXMgbmVlZGVkLiBJdCBpcyBva2F5IHRvIGNhbGwgdGhlIHBhcnNlciBpbiBwb2xsaW5nIG1vZGUsCisgKiAgICAgIGFsdGhvdWdoIGEgYml0IGR1bGwuCisgKiAgICAuIEdSUENfSlNPTl9SRUFEX0VSUk9SIGlmIHRoZSByZWFkX2NoYXIgZnVuY3Rpb24gcmV0dXJuZWQgYW4gZXJyb3IuIFRoZQorICogICAgICBzdGF0ZSBpc24ndCBicm9rZW4gaG93ZXZlciwgYW5kIHRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFnYWluIGlmIHRoZQorICogICAgICBlcnJvciBoYXMgYmVlbiBjb3JyZWN0ZWQuIEJ1dCBwbGVhc2UgdXNlIHRoZSBFQUdBSU4gZmVhdHVyZSBpbnN0ZWFkIGZvcgorICogICAgICBjb25zaXN0ZW5jeS4KKyAqICAgIC4gR1JQQ19KU09OX1BBUlNFX0VSUk9SIGlmIHRoZSBpbnB1dCB3YXMgc29tZWhvdyBpbnZhbGlkLgorICogICAgLiBHUlBDX0pTT05fSU5URVJOQUxfRVJST1IgaWYgdGhlIHBhcnNlciBzb21laG93IGVuZGVkIGludG8gYW4gaW52YWxpZAorICogICAgICBpbnRlcm5hbCBzdGF0ZS4KKyAqLworZ3JwY19qc29uX3JlYWRlcl9zdGF0dXMgZ3JwY19qc29uX3JlYWRlcl9ydW4oZ3JwY19qc29uX3JlYWRlciAqcmVhZGVyKTsKKworLyogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIHJlYWRlciBzdHJ1Y3R1cmUuICovCit2b2lkIGdycGNfanNvbl9yZWFkZXJfaW5pdChncnBjX2pzb25fcmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2pzb25fcmVhZGVyX3Z0YWJsZSAqdnRhYmxlLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qIFlvdSBtYXkgY2FsbCB0aGlzIGZyb20gdGhlIHJlYWRfY2hhciBjYWxsYmFjayBpZiB5b3UgZG9uJ3Qga25vdyB3aGVyZSBpcyB0aGUKKyAqIGVuZCBvZiB5b3VyIGlucHV0IHN0cmVhbSwgYW5kIHlvdSdkIGxpa2UgdGhlIGpzb24gcmVhZGVyIHRvIGhpbnQgeW91IHRoYXQgaXQKKyAqIGhhcyBjb21wbGV0ZWQgcmVhZGluZyBpdHMgaW5wdXQsIHNvIHlvdSBjYW4gcmV0dXJuIGFuIEVPRiB0byBpdC4gTm90ZSB0aGF0CisgKiB0aGVyZSBtaWdodCBzdGlsbCBiZSB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhZnRlciB0aGF0IHBvaW50LgorICovCitpbnQgZ3JwY19qc29uX3JlYWRlcl9pc19jb21wbGV0ZShncnBjX2pzb25fcmVhZGVyICpyZWFkZXIpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9KU09OX0pTT05fUkVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fc3RyaW5nLmMgYi9zcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNmYxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oIgorCisvKiBUaGUganNvbiByZWFkZXIgd2lsbCBjb25zdHJ1Y3QgYSBidW5jaCBvZiBncnBjX2pzb24gb2JqZWN0cyBhbmQKKyAqIGxpbmsgdGhlbSBhbGwgdXAgdG9nZXRoZXIgaW4gYSB0cmVlLWxpa2Ugc3RydWN0dXJlIHRoYXQgd2lsbCByZXByZXNlbnQKKyAqIHRoZSBqc29uIGRhdGEgaW4gbWVtb3J5LgorICoKKyAqIEl0IGFsc28gdXNlcyBpdHMgb3duIGlucHV0IGFzIGEgc2NyYXRjaHBhZCB0byBzdG9yZSBhbGwgb2YgdGhlIGRlY29kZWQsCisgKiB1bmVzY2FwZWQgc3RyaW5ncy4gU28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGVzZSBwb2ludGVycyBpbgorICogdGhhdCBvcGFxdWUgc3RydWN0dXJlIHRoZSByZWFkZXIgd2lsbCBjYXJyeSBmb3IgdXMuCisgKgorICogTm90ZSB0aGF0IHRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYWN0IG9mIHBhcnNpbmcganNvbiBhbHdheXMgcmVkdWNlcyBpdHMKKyAqIGlucHV0IHNpemUsIGFuZCBuZXZlciBleHBhbmRzIGl0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfanNvbiAqdG9wOworICBncnBjX2pzb24gKmN1cnJlbnRfY29udGFpbmVyOworICBncnBjX2pzb24gKmN1cnJlbnRfdmFsdWU7CisgIHVpbnQ4X3QgKmlucHV0OworICB1aW50OF90ICprZXk7CisgIHVpbnQ4X3QgKnN0cmluZzsKKyAgdWludDhfdCAqc3RyaW5nX3B0cjsKKyAgc2l6ZV90IHJlbWFpbmluZ19pbnB1dDsKK30ganNvbl9yZWFkZXJfdXNlcmRhdGE7CisKKy8qIFRoaXMganNvbiB3cml0ZXIgd2lsbCBwdXQgZXZlcnl0aGluZyBpbiBhIGJpZyBzdHJpbmcuCisgKiBUaGUgcG9pbnQgaXMgdGhhdCB3ZSBhbGxvY2F0ZSB0aGF0IHN0cmluZyBpbiBjaHVua3Mgb2YgMjU2IGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKm91dHB1dDsKKyAgc2l6ZV90IGZyZWVfc3BhY2U7CisgIHNpemVfdCBzdHJpbmdfbGVuOworICBzaXplX3QgYWxsb2NhdGVkOworfSBqc29uX3dyaXRlcl91c2VyZGF0YTsKKworLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlcmUncyBlbm91Z2ggc3BhY2UgbGVmdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKKyAqIGFuZCB3aWxsIGVubGFyZ2UgaXQgaWYgbmVjZXNzYXJ5LiBXZSdyZSBvbmx5IGFsbG9jYXRpbmcgY2h1bmtzIG9mIDI1NgorICogYnl0ZXMgYXQgYSB0aW1lIChvciBtdWx0aXBsZXMgdGhlcmVvZikuCisgKi8KK3N0YXRpYyB2b2lkIGpzb25fd3JpdGVyX291dHB1dF9jaGVjayh2b2lkICp1c2VyZGF0YSwgc2l6ZV90IG5lZWRlZCkgeworICBqc29uX3dyaXRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKKyAgaWYgKHN0YXRlLT5mcmVlX3NwYWNlID49IG5lZWRlZCkgcmV0dXJuOworICBuZWVkZWQgLT0gc3RhdGUtPmZyZWVfc3BhY2U7CisgIC8qIFJvdW5kIHVwIGJ5IDI1NiBieXRlcy4gKi8KKyAgbmVlZGVkID0gKG5lZWRlZCArIDB4ZmYpICYgfjB4ZmZVOworICBzdGF0ZS0+b3V0cHV0ID0gZ3ByX3JlYWxsb2Moc3RhdGUtPm91dHB1dCwgc3RhdGUtPmFsbG9jYXRlZCArIG5lZWRlZCk7CisgIHN0YXRlLT5mcmVlX3NwYWNlICs9IG5lZWRlZDsKKyAgc3RhdGUtPmFsbG9jYXRlZCArPSBuZWVkZWQ7Cit9CisKKy8qIFRoZXNlIGFyZSBuZWVkZWQgYnkgdGhlIHdyaXRlcidzIGltcGxlbWVudGF0aW9uLiAqLworc3RhdGljIHZvaWQganNvbl93cml0ZXJfb3V0cHV0X2NoYXIodm9pZCAqdXNlcmRhdGEsIGNoYXIgYykgeworICBqc29uX3dyaXRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKKyAganNvbl93cml0ZXJfb3V0cHV0X2NoZWNrKHVzZXJkYXRhLCAxKTsKKyAgc3RhdGUtPm91dHB1dFtzdGF0ZS0+c3RyaW5nX2xlbisrXSA9IGM7CisgIHN0YXRlLT5mcmVlX3NwYWNlLS07Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4odm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgeworICBqc29uX3dyaXRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKKyAganNvbl93cml0ZXJfb3V0cHV0X2NoZWNrKHVzZXJkYXRhLCBsZW4pOworICBtZW1jcHkoc3RhdGUtPm91dHB1dCArIHN0YXRlLT5zdHJpbmdfbGVuLCBzdHIsIGxlbik7CisgIHN0YXRlLT5zdHJpbmdfbGVuICs9IGxlbjsKKyAgc3RhdGUtPmZyZWVfc3BhY2UgLT0gbGVuOworfQorCitzdGF0aWMgdm9pZCBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nKHZvaWQgKnVzZXJkYXRhLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHVzZXJkYXRhLCBzdHIsIGxlbik7Cit9CisKKy8qIFRoZSByZWFkZXIgYXNrcyB1cyB0byBjbGVhciBvdXIgc2NyYXRjaHBhZC4gSW4gb3VyIGNhc2UsIHdlJ2xsIHNpbXBseSBtYXJrCisgKiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0cmluZywgYW5kIGFkdmFuY2Ugb3VyIG91dHB1dCBwb2ludGVyLgorICovCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zdHJpbmdfY2xlYXIodm9pZCAqdXNlcmRhdGEpIHsKKyAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7CisgIGlmIChzdGF0ZS0+c3RyaW5nKSB7CisgICAgR1BSX0FTU0VSVChzdGF0ZS0+c3RyaW5nX3B0ciA8IHN0YXRlLT5pbnB1dCk7CisgICAgKnN0YXRlLT5zdHJpbmdfcHRyKysgPSAwOworICB9CisgIHN0YXRlLT5zdHJpbmcgPSBzdGF0ZS0+c3RyaW5nX3B0cjsKK30KKworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHZvaWQgKnVzZXJkYXRhLCB1aW50MzJfdCBjKSB7CisgIGpzb25fcmVhZGVyX3VzZXJkYXRhICpzdGF0ZSA9IHVzZXJkYXRhOworICBHUFJfQVNTRVJUKHN0YXRlLT5zdHJpbmdfcHRyIDwgc3RhdGUtPmlucHV0KTsKKyAgR1BSX0FTU0VSVChjIDw9IDB4ZmYpOworICAqc3RhdGUtPnN0cmluZ19wdHIrKyA9ICh1aW50OF90KWM7Cit9CisKKy8qIFdlIGFyZSBjb252ZXJ0aW5nIGEgVVRGLTMyIGNoYXJhY3RlciBpbnRvIFVURi04IGhlcmUsCisgKiBhcyBkZXNjcmliZWQgYnkgUkZDMzYyOS4KKyAqLworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc3RyaW5nX2FkZF91dGYzMih2b2lkICp1c2VyZGF0YSwgdWludDMyX3QgYykgeworICBpZiAoYyA8PSAweDdmKSB7CisgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBjKTsKKyAgfSBlbHNlIGlmIChjIDw9IDB4N2ZmKSB7CisgICAgdWludDMyX3QgYjEgPSAweGMwIHwgKChjID4+IDYpICYgMHgxZik7CisgICAgdWludDMyX3QgYjIgPSAweDgwIHwgKGMgJiAweDNmKTsKKyAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIodXNlcmRhdGEsIGIxKTsKKyAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIodXNlcmRhdGEsIGIyKTsKKyAgfSBlbHNlIGlmIChjIDw9IDB4ZmZmZikgeworICAgIHVpbnQzMl90IGIxID0gMHhlMCB8ICgoYyA+PiAxMikgJiAweDBmKTsKKyAgICB1aW50MzJfdCBiMiA9IDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKTsKKyAgICB1aW50MzJfdCBiMyA9IDB4ODAgfCAoYyAmIDB4M2YpOworICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjEpOworICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjIpOworICAgIGpzb25fcmVhZGVyX3N0cmluZ19hZGRfY2hhcih1c2VyZGF0YSwgYjMpOworICB9IGVsc2UgaWYgKGMgPD0gMHgxZmZmZmYpIHsKKyAgICB1aW50MzJfdCBiMSA9IDB4ZjAgfCAoKGMgPj4gMTgpICYgMHgwNyk7CisgICAgdWludDMyX3QgYjIgPSAweDgwIHwgKChjID4+IDEyKSAmIDB4M2YpOworICAgIHVpbnQzMl90IGIzID0gMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpOworICAgIHVpbnQzMl90IGI0ID0gMHg4MCB8IChjICYgMHgzZik7CisgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBiMSk7CisgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBiMik7CisgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBiMyk7CisgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF9jaGFyKHVzZXJkYXRhLCBiNCk7CisgIH0KK30KKworLyogV2UgY29uc2lkZXIgdGhhdCB0aGUgaW5wdXQgbWF5IGJlIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZy4gU28gd2UKKyAqIGNhbiBlbmQgdXAgaGl0dGluZyBlb2YgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGFsbGVnZWQgc3RyaW5nIGxlbmd0aC4KKyAqLworc3RhdGljIHVpbnQzMl90IGpzb25fcmVhZGVyX3JlYWRfY2hhcih2b2lkICp1c2VyZGF0YSkgeworICB1aW50MzJfdCByOworICBqc29uX3JlYWRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKKworICBpZiAoc3RhdGUtPnJlbWFpbmluZ19pbnB1dCA9PSAwKSByZXR1cm4gR1JQQ19KU09OX1JFQURfQ0hBUl9FT0Y7CisKKyAgciA9ICpzdGF0ZS0+aW5wdXQrKzsKKyAgc3RhdGUtPnJlbWFpbmluZ19pbnB1dC0tOworCisgIGlmIChyID09IDApIHsKKyAgICBzdGF0ZS0+cmVtYWluaW5nX2lucHV0ID0gMDsKKyAgICByZXR1cm4gR1JQQ19KU09OX1JFQURfQ0hBUl9FT0Y7CisgIH0KKworICByZXR1cm4gcjsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBncnBjX2pzb24gb2JqZWN0IGFuZCBsaW5rIGl0IGludG8KKyAqIG91ciB0cmVlLWluLXByb2dyZXNzIGluc2lkZSBvdXIgb3BhcXVlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGdycGNfanNvbiAqanNvbl9jcmVhdGVfYW5kX2xpbmsodm9pZCAqdXNlcmRhdGEsIGdycGNfanNvbl90eXBlIHR5cGUpIHsKKyAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7CisgIGdycGNfanNvbiAqanNvbiA9IGdycGNfanNvbl9jcmVhdGUodHlwZSk7CisKKyAganNvbi0+cGFyZW50ID0gc3RhdGUtPmN1cnJlbnRfY29udGFpbmVyOworICBqc29uLT5wcmV2ID0gc3RhdGUtPmN1cnJlbnRfdmFsdWU7CisgIHN0YXRlLT5jdXJyZW50X3ZhbHVlID0ganNvbjsKKworICBpZiAoanNvbi0+cHJldikgeworICAgIGpzb24tPnByZXYtPm5leHQgPSBqc29uOworICB9CisgIGlmIChqc29uLT5wYXJlbnQpIHsKKyAgICBpZiAoIWpzb24tPnBhcmVudC0+Y2hpbGQpIHsKKyAgICAgIGpzb24tPnBhcmVudC0+Y2hpbGQgPSBqc29uOworICAgIH0KKyAgICBpZiAoanNvbi0+cGFyZW50LT50eXBlID09IEdSUENfSlNPTl9PQkpFQ1QpIHsKKyAgICAgIGpzb24tPmtleSA9IChjaGFyICopc3RhdGUtPmtleTsKKyAgICB9CisgIH0KKyAgaWYgKCFzdGF0ZS0+dG9wKSB7CisgICAgc3RhdGUtPnRvcCA9IGpzb247CisgIH0KKworICByZXR1cm4ganNvbjsKK30KKworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfY29udGFpbmVyX2JlZ2lucyh2b2lkICp1c2VyZGF0YSwgZ3JwY19qc29uX3R5cGUgdHlwZSkgeworICBqc29uX3JlYWRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKKyAgZ3JwY19qc29uICpjb250YWluZXI7CisKKyAgR1BSX0FTU0VSVCh0eXBlID09IEdSUENfSlNPTl9BUlJBWSB8fCB0eXBlID09IEdSUENfSlNPTl9PQkpFQ1QpOworCisgIGNvbnRhaW5lciA9IGpzb25fY3JlYXRlX2FuZF9saW5rKHVzZXJkYXRhLCB0eXBlKTsKKyAgc3RhdGUtPmN1cnJlbnRfY29udGFpbmVyID0gY29udGFpbmVyOworICBzdGF0ZS0+Y3VycmVudF92YWx1ZSA9IE5VTEw7Cit9CisKKy8qIEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgdGhlIHJlYWRlciBpcyBtb3N0bHkgc3RhdGVsZXNzLCBzbyBpdAorICogaXNuJ3QgdHJ5aW5nIHRvIHJlbWVtYmVyIHdoYXQgdGhlIGNvbnRhaW5lciB3YXMgcHJpb3IgdGhlIG9uZSB0aGF0IGp1c3QKKyAqIGVuZHMuIFNpbmNlIHdlJ3JlIGtlZXBpbmcgdHJhY2sgb2YgdGhlc2UgZm9yIG91ciBvd24gcHVycG9zZSwgd2UgYXJlCisgKiBhYmxlIHRvIHJldHVybiB0aGF0IGluZm9ybWF0aW9uIGJhY2ssIHdoaWNoIGlzIHVzZWZ1bCBmb3IgaXQgdG8gdmFsaWRhdGUKKyAqIHRoZSBpbnB1dCBqc29uIHN0cmVhbS4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCBpZiB3ZSdyZSBhdCB0aGUgdG9wIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGxhc3QgY29udGFpbmVyCisgKiBlbmRzLCB3ZSBoYXZlIHRvIHJldHVybiBHUlBDX0pTT05fVE9QX0xFVkVMLgorICovCitzdGF0aWMgZ3JwY19qc29uX3R5cGUganNvbl9yZWFkZXJfY29udGFpbmVyX2VuZHModm9pZCAqdXNlcmRhdGEpIHsKKyAgZ3JwY19qc29uX3R5cGUgY29udGFpbmVyX3R5cGUgPSBHUlBDX0pTT05fVE9QX0xFVkVMOworICBqc29uX3JlYWRlcl91c2VyZGF0YSAqc3RhdGUgPSB1c2VyZGF0YTsKKworICBHUFJfQVNTRVJUKHN0YXRlLT5jdXJyZW50X2NvbnRhaW5lcik7CisKKyAgc3RhdGUtPmN1cnJlbnRfdmFsdWUgPSBzdGF0ZS0+Y3VycmVudF9jb250YWluZXI7CisgIHN0YXRlLT5jdXJyZW50X2NvbnRhaW5lciA9IHN0YXRlLT5jdXJyZW50X2NvbnRhaW5lci0+cGFyZW50OworCisgIGlmIChzdGF0ZS0+Y3VycmVudF9jb250YWluZXIpIHsKKyAgICBjb250YWluZXJfdHlwZSA9IHN0YXRlLT5jdXJyZW50X2NvbnRhaW5lci0+dHlwZTsKKyAgfQorCisgIHJldHVybiBjb250YWluZXJfdHlwZTsKK30KKworLyogVGhlIG5leHQgMyBmdW5jdGlvbnMgYmFzaWNhbGx5IGFyZSB0aGUgcmVhZGVyIGFza2luZyB1cyB0byB1c2Ugb3VyIHN0cmluZworICogc2NyYXRjaHBhZCBmb3Igb25lIG9mIHRoZXNlIDMgcHVycG9zZXMuCisgKgorICogTm90ZSB0aGF0IGluIHRoZSBzZXRfbnVtYmVyIGNhc2UsIHdlJ3JlIG5vdCBnb2luZyB0byB0cnkgaW50ZXJwcmV0aW5nIGl0LgorICogV2UnbGwga2VlcCBpdCBhcyBhIHN0cmluZywgYW5kIGxlYXZlIGl0IHRvIHRoZSBjYWxsZXIgdG8gZXZhbHVhdGUgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGpzb25fcmVhZGVyX3NldF9rZXkodm9pZCAqdXNlcmRhdGEpIHsKKyAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7CisgIHN0YXRlLT5rZXkgPSBzdGF0ZS0+c3RyaW5nOworfQorCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfc3RyaW5nKHZvaWQgKnVzZXJkYXRhKSB7CisgIGpzb25fcmVhZGVyX3VzZXJkYXRhICpzdGF0ZSA9IHVzZXJkYXRhOworICBncnBjX2pzb24gKmpzb24gPSBqc29uX2NyZWF0ZV9hbmRfbGluayh1c2VyZGF0YSwgR1JQQ19KU09OX1NUUklORyk7CisgIGpzb24tPnZhbHVlID0gKGNoYXIgKilzdGF0ZS0+c3RyaW5nOworfQorCitzdGF0aWMgaW50IGpzb25fcmVhZGVyX3NldF9udW1iZXIodm9pZCAqdXNlcmRhdGEpIHsKKyAganNvbl9yZWFkZXJfdXNlcmRhdGEgKnN0YXRlID0gdXNlcmRhdGE7CisgIGdycGNfanNvbiAqanNvbiA9IGpzb25fY3JlYXRlX2FuZF9saW5rKHVzZXJkYXRhLCBHUlBDX0pTT05fTlVNQkVSKTsKKyAganNvbi0+dmFsdWUgPSAoY2hhciAqKXN0YXRlLT5zdHJpbmc7CisgIHJldHVybiAxOworfQorCisvKiBUaGUgb2JqZWN0IHR5cGVzIHRydWUsIGZhbHNlIGFuZCBudWxsIGFyZSBzZWxmLXN1ZmZpY2llbnQsIGFuZCBkb24ndCBuZWVkCisgKiBhbnkgbW9yZSBpbmZvcm1hdGlvbiBiZXNpZGUgdGhlaXIgdHlwZS4KKyAqLworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X3RydWUodm9pZCAqdXNlcmRhdGEpIHsKKyAganNvbl9jcmVhdGVfYW5kX2xpbmsodXNlcmRhdGEsIEdSUENfSlNPTl9UUlVFKTsKK30KKworc3RhdGljIHZvaWQganNvbl9yZWFkZXJfc2V0X2ZhbHNlKHZvaWQgKnVzZXJkYXRhKSB7CisgIGpzb25fY3JlYXRlX2FuZF9saW5rKHVzZXJkYXRhLCBHUlBDX0pTT05fRkFMU0UpOworfQorCitzdGF0aWMgdm9pZCBqc29uX3JlYWRlcl9zZXRfbnVsbCh2b2lkICp1c2VyZGF0YSkgeworICBqc29uX2NyZWF0ZV9hbmRfbGluayh1c2VyZGF0YSwgR1JQQ19KU09OX05VTEwpOworfQorCitzdGF0aWMgZ3JwY19qc29uX3JlYWRlcl92dGFibGUgcmVhZGVyX3Z0YWJsZSA9IHsKKyAgICBqc29uX3JlYWRlcl9zdHJpbmdfY2xlYXIsICAgICBqc29uX3JlYWRlcl9zdHJpbmdfYWRkX2NoYXIsCisgICAganNvbl9yZWFkZXJfc3RyaW5nX2FkZF91dGYzMiwganNvbl9yZWFkZXJfcmVhZF9jaGFyLAorICAgIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9iZWdpbnMsIGpzb25fcmVhZGVyX2NvbnRhaW5lcl9lbmRzLAorICAgIGpzb25fcmVhZGVyX3NldF9rZXksICAgICAgICAgIGpzb25fcmVhZGVyX3NldF9zdHJpbmcsCisgICAganNvbl9yZWFkZXJfc2V0X251bWJlciwgICAgICAganNvbl9yZWFkZXJfc2V0X3RydWUsCisgICAganNvbl9yZWFkZXJfc2V0X2ZhbHNlLCAgICAgICAganNvbl9yZWFkZXJfc2V0X251bGx9OworCisvKiBBbmQgZmluYWxseSwgbGV0J3MgZGVmaW5lIG91ciBwdWJsaWMgQVBJLiAqLworZ3JwY19qc29uICpncnBjX2pzb25fcGFyc2Vfc3RyaW5nX3dpdGhfbGVuKGNoYXIgKmlucHV0LCBzaXplX3Qgc2l6ZSkgeworICBncnBjX2pzb25fcmVhZGVyIHJlYWRlcjsKKyAganNvbl9yZWFkZXJfdXNlcmRhdGEgc3RhdGU7CisgIGdycGNfanNvbiAqanNvbiA9IE5VTEw7CisgIGdycGNfanNvbl9yZWFkZXJfc3RhdHVzIHN0YXR1czsKKworICBpZiAoIWlucHV0KSByZXR1cm4gTlVMTDsKKworICBzdGF0ZS50b3AgPSBzdGF0ZS5jdXJyZW50X2NvbnRhaW5lciA9IHN0YXRlLmN1cnJlbnRfdmFsdWUgPSBOVUxMOworICBzdGF0ZS5zdHJpbmcgPSBzdGF0ZS5rZXkgPSBOVUxMOworICBzdGF0ZS5zdHJpbmdfcHRyID0gc3RhdGUuaW5wdXQgPSAodWludDhfdCAqKWlucHV0OworICBzdGF0ZS5yZW1haW5pbmdfaW5wdXQgPSBzaXplOworICBncnBjX2pzb25fcmVhZGVyX2luaXQoJnJlYWRlciwgJnJlYWRlcl92dGFibGUsICZzdGF0ZSk7CisKKyAgc3RhdHVzID0gZ3JwY19qc29uX3JlYWRlcl9ydW4oJnJlYWRlcik7CisgIGpzb24gPSBzdGF0ZS50b3A7CisKKyAgaWYgKChzdGF0dXMgIT0gR1JQQ19KU09OX0RPTkUpICYmIGpzb24pIHsKKyAgICBncnBjX2pzb25fZGVzdHJveShqc29uKTsKKyAgICBqc29uID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBqc29uOworfQorCisjZGVmaW5lIFVOQk9VTkRfSlNPTl9TVFJJTkdfTEVOR1RIIDB4N2ZmZmZmZmYKKworZ3JwY19qc29uICpncnBjX2pzb25fcGFyc2Vfc3RyaW5nKGNoYXIgKmlucHV0KSB7CisgIHJldHVybiBncnBjX2pzb25fcGFyc2Vfc3RyaW5nX3dpdGhfbGVuKGlucHV0LCBVTkJPVU5EX0pTT05fU1RSSU5HX0xFTkdUSCk7Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fZHVtcF9yZWN1cnNpdmUoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLCBncnBjX2pzb24gKmpzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9vYmplY3QpIHsKKyAgd2hpbGUgKGpzb24pIHsKKyAgICBpZiAoaW5fb2JqZWN0KSBncnBjX2pzb25fd3JpdGVyX29iamVjdF9rZXkod3JpdGVyLCBqc29uLT5rZXkpOworCisgICAgc3dpdGNoIChqc29uLT50eXBlKSB7CisgICAgICBjYXNlIEdSUENfSlNPTl9PQkpFQ1Q6CisgICAgICBjYXNlIEdSUENfSlNPTl9BUlJBWToKKyAgICAgICAgZ3JwY19qc29uX3dyaXRlcl9jb250YWluZXJfYmVnaW5zKHdyaXRlciwganNvbi0+dHlwZSk7CisgICAgICAgIGlmIChqc29uLT5jaGlsZCkKKyAgICAgICAgICBqc29uX2R1bXBfcmVjdXJzaXZlKHdyaXRlciwganNvbi0+Y2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uLT50eXBlID09IEdSUENfSlNPTl9PQkpFQ1QpOworICAgICAgICBncnBjX2pzb25fd3JpdGVyX2NvbnRhaW5lcl9lbmRzKHdyaXRlciwganNvbi0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHUlBDX0pTT05fU1RSSU5HOgorICAgICAgICBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3N0cmluZyh3cml0ZXIsIGpzb24tPnZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfSlNPTl9OVU1CRVI6CisgICAgICAgIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3KHdyaXRlciwganNvbi0+dmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19KU09OX1RSVUU6CisgICAgICAgIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3X3dpdGhfbGVuKHdyaXRlciwgInRydWUiLCA0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfSlNPTl9GQUxTRToKKyAgICAgICAgZ3JwY19qc29uX3dyaXRlcl92YWx1ZV9yYXdfd2l0aF9sZW4od3JpdGVyLCAiZmFsc2UiLCA1KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfSlNPTl9OVUxMOgorICAgICAgICBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3Jhd193aXRoX2xlbih3cml0ZXIsICJudWxsIiwgNCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUoYWJvcnQoKSk7CisgICAgfQorICAgIGpzb24gPSBqc29uLT5uZXh0OworICB9Cit9CisKK3N0YXRpYyBncnBjX2pzb25fd3JpdGVyX3Z0YWJsZSB3cml0ZXJfdnRhYmxlID0geworICAgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyLCBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nLAorICAgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW59OworCitjaGFyICpncnBjX2pzb25fZHVtcF90b19zdHJpbmcoZ3JwY19qc29uICpqc29uLCBpbnQgaW5kZW50KSB7CisgIGdycGNfanNvbl93cml0ZXIgd3JpdGVyOworICBqc29uX3dyaXRlcl91c2VyZGF0YSBzdGF0ZTsKKworICBzdGF0ZS5vdXRwdXQgPSBOVUxMOworICBzdGF0ZS5mcmVlX3NwYWNlID0gc3RhdGUuc3RyaW5nX2xlbiA9IHN0YXRlLmFsbG9jYXRlZCA9IDA7CisgIGdycGNfanNvbl93cml0ZXJfaW5pdCgmd3JpdGVyLCBpbmRlbnQsICZ3cml0ZXJfdnRhYmxlLCAmc3RhdGUpOworCisgIGpzb25fZHVtcF9yZWN1cnNpdmUoJndyaXRlciwganNvbiwgMCk7CisKKyAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIoJnN0YXRlLCAwKTsKKworICByZXR1cm4gc3RhdGUub3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuYyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxNGE3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oIgorCitzdGF0aWMgdm9pZCBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcihncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsIGNoYXIgYykgeworICB3cml0ZXItPnZ0YWJsZS0+b3V0cHV0X2NoYXIod3JpdGVyLT51c2VyZGF0YSwgYyk7Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmcoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIpIHsKKyAgd3JpdGVyLT52dGFibGUtPm91dHB1dF9zdHJpbmcod3JpdGVyLT51c2VyZGF0YSwgc3RyKTsKK30KKworc3RhdGljIHZvaWQganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbihncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikgeworICB3cml0ZXItPnZ0YWJsZS0+b3V0cHV0X3N0cmluZ193aXRoX2xlbih3cml0ZXItPnVzZXJkYXRhLCBzdHIsIGxlbik7Cit9CisKK3ZvaWQgZ3JwY19qc29uX3dyaXRlcl9pbml0KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl93cml0ZXJfdnRhYmxlICp2dGFibGUsIHZvaWQgKnVzZXJkYXRhKSB7CisgIG1lbXNldCh3cml0ZXIsIDAsIHNpemVvZigqd3JpdGVyKSk7CisgIHdyaXRlci0+Y29udGFpbmVyX2VtcHR5ID0gMTsKKyAgd3JpdGVyLT5pbmRlbnQgPSBpbmRlbnQ7CisgIHdyaXRlci0+dnRhYmxlID0gdnRhYmxlOworICB3cml0ZXItPnVzZXJkYXRhID0gdXNlcmRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fd3JpdGVyX291dHB1dF9pbmRlbnQoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIHNwYWNlc3N0cltdID0KKyAgICAgICIgICAgICAgICAgICAgICAgIgorICAgICAgIiAgICAgICAgICAgICAgICAiCisgICAgICAiICAgICAgICAgICAgICAgICIKKyAgICAgICIgICAgICAgICAgICAgICAgIjsKKworICB1bnNpZ25lZCBzcGFjZXMgPSAodW5zaWduZWQpKHdyaXRlci0+ZGVwdGggKiB3cml0ZXItPmluZGVudCk7CisKKyAgaWYgKHdyaXRlci0+aW5kZW50ID09IDApIHJldHVybjsKKworICBpZiAod3JpdGVyLT5nb3Rfa2V5KSB7CisgICAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCAnICcpOworICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlIChzcGFjZXMgPj0gKHNpemVvZihzcGFjZXNzdHIpIC0gMSkpIHsKKyAgICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHdyaXRlciwgc3BhY2Vzc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNwYWNlc3N0cikgLSAxKTsKKyAgICBzcGFjZXMgLT0gKHVuc2lnbmVkKShzaXplb2Yoc3BhY2Vzc3RyKSAtIDEpOworICB9CisKKyAgaWYgKHNwYWNlcyA9PSAwKSByZXR1cm47CisKKyAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbigKKyAgICAgIHdyaXRlciwgc3BhY2Vzc3RyICsgc2l6ZW9mKHNwYWNlc3N0cikgLSAxIC0gc3BhY2VzLCBzcGFjZXMpOworfQorCitzdGF0aWMgdm9pZCBqc29uX3dyaXRlcl92YWx1ZV9lbmQoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyKSB7CisgIGlmICh3cml0ZXItPmNvbnRhaW5lcl9lbXB0eSkgeworICAgIHdyaXRlci0+Y29udGFpbmVyX2VtcHR5ID0gMDsKKyAgICBpZiAoKHdyaXRlci0+aW5kZW50ID09IDApIHx8ICh3cml0ZXItPmRlcHRoID09IDApKSByZXR1cm47CisgICAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCAnXG4nKTsKKyAgfSBlbHNlIHsKKyAgICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICcsJyk7CisgICAgaWYgKHdyaXRlci0+aW5kZW50ID09IDApIHJldHVybjsKKyAgICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICdcbicpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGpzb25fd3JpdGVyX2VzY2FwZV91dGYxNihncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsIHVpbnQxNl90IHV0ZjE2KSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCisgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCAiXFx1IiwgMik7CisgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgaGV4Wyh1dGYxNiA+PiAxMikgJiAweDBmXSk7CisgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgaGV4Wyh1dGYxNiA+PiA4KSAmIDB4MGZdKTsKKyAganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCBoZXhbKHV0ZjE2ID4+IDQpICYgMHgwZl0pOworICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsIGhleFsodXRmMTYpJjB4MGZdKTsKK30KKworc3RhdGljIHZvaWQganNvbl93cml0ZXJfZXNjYXBlX3N0cmluZyhncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZykgeworICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICciJyk7CisKKyAgZm9yICg7OykgeworICAgIHVpbnQ4X3QgYyA9ICh1aW50OF90KSpzdHJpbmcrKzsKKyAgICBpZiAoYyA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKChjID49IDMyKSAmJiAoYyA8PSAxMjYpKSB7CisgICAgICBpZiAoKGMgPT0gJ1xcJykgfHwgKGMgPT0gJyInKSkganNvbl93cml0ZXJfb3V0cHV0X2NoYXIod3JpdGVyLCAnXFwnKTsKKyAgICAgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgKGNoYXIpYyk7CisgICAgfSBlbHNlIGlmICgoYyA8IDMyKSB8fCAoYyA9PSAxMjcpKSB7CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCAiXFxiIiwgMik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHdyaXRlciwgIlxcZiIsIDIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZ193aXRoX2xlbih3cml0ZXIsICJcXG4iLCAyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCAiXFxyIiwgMik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICBqc29uX3dyaXRlcl9vdXRwdXRfc3RyaW5nX3dpdGhfbGVuKHdyaXRlciwgIlxcdCIsIDIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpzb25fd3JpdGVyX2VzY2FwZV91dGYxNih3cml0ZXIsIGMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCB1dGYzMiA9IDA7CisgICAgICBpbnQgZXh0cmEgPSAwOworICAgICAgaW50IGk7CisgICAgICBpbnQgdmFsaWQgPSAxOworICAgICAgaWYgKChjICYgMHhlMCkgPT0gMHhjMCkgeworICAgICAgICB1dGYzMiA9IGMgJiAweDFmOworICAgICAgICBleHRyYSA9IDE7CisgICAgICB9IGVsc2UgaWYgKChjICYgMHhmMCkgPT0gMHhlMCkgeworICAgICAgICB1dGYzMiA9IGMgJiAweDBmOworICAgICAgICBleHRyYSA9IDI7CisgICAgICB9IGVsc2UgaWYgKChjICYgMHhmOCkgPT0gMHhmMCkgeworICAgICAgICB1dGYzMiA9IGMgJiAweDA3OworICAgICAgICBleHRyYSA9IDM7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYTsgaSsrKSB7CisgICAgICAgIHV0ZjMyIDw8PSA2OworICAgICAgICBjID0gKHVpbnQ4X3QpKCpzdHJpbmcrKyk7CisgICAgICAgIC8qIEJyZWFrcyBvdXQgYW5kIGJhaWwgb24gYW55IGludmFsaWQgVVRGLTggc2VxdWVuY2UsIGluY2x1ZGluZyBcMC4gKi8KKyAgICAgICAgaWYgKChjICYgMHhjMCkgIT0gMHg4MCkgeworICAgICAgICAgIHZhbGlkID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1dGYzMiB8PSBjICYgMHgzZjsKKyAgICAgIH0KKyAgICAgIGlmICghdmFsaWQpIGJyZWFrOworICAgICAgLyogVGhlIHJhbmdlIDB4ZDgwMCAtIDB4ZGZmZiBpcyByZXNlcnZlZCBieSB0aGUgc3Vycm9nYXRlcyBhZCB2aXRhbS4KKyAgICAgICAqIEFueSBvdGhlciByYW5nZSBpcyB0ZWNobmljYWxseSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzYWdlLCBzbyBpZiB3ZQorICAgICAgICogZG9uJ3Qgd2FudCB0aGUgc29mdHdhcmUgdG8gYnJlYWsgaW4gdGhlIGZ1dHVyZSwgd2UgaGF2ZSB0byBhbGxvdworICAgICAgICogYW55dGhpbmcgZWxzZS4gVGhlIGZpcnN0IG5vbi11bmljb2RlIGNoYXJhY3RlciBpcyAweDExMDAwMC4gKi8KKyAgICAgIGlmICgoKHV0ZjMyID49IDB4ZDgwMCkgJiYgKHV0ZjMyIDw9IDB4ZGZmZikpIHx8ICh1dGYzMiA+PSAweDExMDAwMCkpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKHV0ZjMyID49IDB4MTAwMDApIHsKKyAgICAgICAgLyogSWYgdXRmMzIgY29udGFpbnMgYSBjaGFyYWN0ZXIgdGhhdCBpcyBhYm92ZSAweGZmZmYsIGl0IG5lZWRzIHRvIGJlCisgICAgICAgICAqIGJyb2tlbiBkb3duIGludG8gYSB1dGYtMTYgc3Vycm9nYXRlIHBhaXIuIEEgc3Vycm9nYXRlIHBhaXIgaXMgZmlyc3QKKyAgICAgICAgICogYSBoaWdoIHN1cnJvZ2F0ZSwgZm9sbG93ZWQgYnkgYSBsb3cgc3Vycm9nYXRlLiBFYWNoIHN1cnJvZ2F0ZSBob2xkcworICAgICAgICAgKiAxMCBiaXRzIG9mIHVzYWJsZSBkYXRhLCB0aHVzIGFsbG93aW5nIGEgdG90YWwgb2YgMjAgYml0cyBvZiBkYXRhLgorICAgICAgICAgKiBUaGUgaGlnaCBzdXJyb2dhdGUgbWFya2VyIGlzIDB4ZDgwMCwgd2hpbGUgdGhlIGxvdyBzdXJyb2dhdGUgbWFya2VyCisgICAgICAgICAqIGlzIDB4ZGMwMC4gVGhlIGxvdyAxMCBiaXRzIG9mIGVhY2ggd2lsbCBiZSB0aGUgdXNhYmxlIGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIEFmdGVyIHJlLWNvbWJpbmluZyB0aGUgMjAgYml0cyBvZiBkYXRhLCBvbmUgaGFzIHRvIGFkZCAweDEwMDAwIHRvCisgICAgICAgICAqIHRoZSByZXN1bHRpbmcgdmFsdWUsIGluIG9yZGVyIHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLgorICAgICAgICAgKiBUaGlzIGlzIG9idmlvdXNseSBiZWNhdXNlIHRoZSByYW5nZSAweDAwMDAgLSAweGZmZmYgY2FuIGJlIHdyaXR0ZW4KKyAgICAgICAgICogd2l0aG91dCBhbnkgc3BlY2lhbCB0cmljay4KKyAgICAgICAgICoKKyAgICAgICAgICogU2luY2UgMHgxMGZmZmYgaXMgdGhlIGhpZ2hlc3QgYWxsb3dlZCBjaGFyYWN0ZXIsIHdlJ3JlIHdvcmtpbmcgaW4KKyAgICAgICAgICogdGhlIHJhbmdlIDB4MDAwMDAgLSAweGZmZmZmIGFmdGVyIHdlIGRlY3JlbWVudCBpdCBieSAweDEwMDAwLgorICAgICAgICAgKiBUaGF0IHJhbmdlIGlzIGV4YWN0bHkgMjAgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIHV0ZjMyIC09IDB4MTAwMDA7CisgICAgICAgIGpzb25fd3JpdGVyX2VzY2FwZV91dGYxNih3cml0ZXIsICh1aW50MTZfdCkoMHhkODAwIHwgKHV0ZjMyID4+IDEwKSkpOworICAgICAgICBqc29uX3dyaXRlcl9lc2NhcGVfdXRmMTYod3JpdGVyLCAodWludDE2X3QpKDB4ZGMwMCB8ICh1dGYzMiAmIDB4M2ZmKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAganNvbl93cml0ZXJfZXNjYXBlX3V0ZjE2KHdyaXRlciwgKHVpbnQxNl90KXV0ZjMyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsICciJyk7Cit9CisKK3ZvaWQgZ3JwY19qc29uX3dyaXRlcl9jb250YWluZXJfYmVnaW5zKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl90eXBlIHR5cGUpIHsKKyAgaWYgKCF3cml0ZXItPmdvdF9rZXkpIGpzb25fd3JpdGVyX3ZhbHVlX2VuZCh3cml0ZXIpOworICBqc29uX3dyaXRlcl9vdXRwdXRfaW5kZW50KHdyaXRlcik7CisgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgdHlwZSA9PSBHUlBDX0pTT05fT0JKRUNUID8gJ3snIDogJ1snKTsKKyAgd3JpdGVyLT5jb250YWluZXJfZW1wdHkgPSAxOworICB3cml0ZXItPmdvdF9rZXkgPSAwOworICB3cml0ZXItPmRlcHRoKys7Cit9CisKK3ZvaWQgZ3JwY19qc29uX3dyaXRlcl9jb250YWluZXJfZW5kcyhncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3R5cGUgdHlwZSkgeworICBpZiAod3JpdGVyLT5pbmRlbnQgJiYgIXdyaXRlci0+Y29udGFpbmVyX2VtcHR5KQorICAgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgJ1xuJyk7CisgIHdyaXRlci0+ZGVwdGgtLTsKKyAgaWYgKCF3cml0ZXItPmNvbnRhaW5lcl9lbXB0eSkganNvbl93cml0ZXJfb3V0cHV0X2luZGVudCh3cml0ZXIpOworICBqc29uX3dyaXRlcl9vdXRwdXRfY2hhcih3cml0ZXIsIHR5cGUgPT0gR1JQQ19KU09OX09CSkVDVCA/ICd9JyA6ICddJyk7CisgIHdyaXRlci0+Y29udGFpbmVyX2VtcHR5ID0gMDsKKyAgd3JpdGVyLT5nb3Rfa2V5ID0gMDsKK30KKwordm9pZCBncnBjX2pzb25fd3JpdGVyX29iamVjdF9rZXkoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLCBjb25zdCBjaGFyICpzdHJpbmcpIHsKKyAganNvbl93cml0ZXJfdmFsdWVfZW5kKHdyaXRlcik7CisgIGpzb25fd3JpdGVyX291dHB1dF9pbmRlbnQod3JpdGVyKTsKKyAganNvbl93cml0ZXJfZXNjYXBlX3N0cmluZyh3cml0ZXIsIHN0cmluZyk7CisgIGpzb25fd3JpdGVyX291dHB1dF9jaGFyKHdyaXRlciwgJzonKTsKKyAgd3JpdGVyLT5nb3Rfa2V5ID0gMTsKK30KKwordm9pZCBncnBjX2pzb25fd3JpdGVyX3ZhbHVlX3JhdyhncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsIGNvbnN0IGNoYXIgKnN0cmluZykgeworICBpZiAoIXdyaXRlci0+Z290X2tleSkganNvbl93cml0ZXJfdmFsdWVfZW5kKHdyaXRlcik7CisgIGpzb25fd3JpdGVyX291dHB1dF9pbmRlbnQod3JpdGVyKTsKKyAganNvbl93cml0ZXJfb3V0cHV0X3N0cmluZyh3cml0ZXIsIHN0cmluZyk7CisgIHdyaXRlci0+Z290X2tleSA9IDA7Cit9CisKK3ZvaWQgZ3JwY19qc29uX3dyaXRlcl92YWx1ZV9yYXdfd2l0aF9sZW4oZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW4pIHsKKyAgaWYgKCF3cml0ZXItPmdvdF9rZXkpIGpzb25fd3JpdGVyX3ZhbHVlX2VuZCh3cml0ZXIpOworICBqc29uX3dyaXRlcl9vdXRwdXRfaW5kZW50KHdyaXRlcik7CisgIGpzb25fd3JpdGVyX291dHB1dF9zdHJpbmdfd2l0aF9sZW4od3JpdGVyLCBzdHJpbmcsIGxlbik7CisgIHdyaXRlci0+Z290X2tleSA9IDA7Cit9CisKK3ZvaWQgZ3JwY19qc29uX3dyaXRlcl92YWx1ZV9zdHJpbmcoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHJpbmcpIHsKKyAgaWYgKCF3cml0ZXItPmdvdF9rZXkpIGpzb25fd3JpdGVyX3ZhbHVlX2VuZCh3cml0ZXIpOworICBqc29uX3dyaXRlcl9vdXRwdXRfaW5kZW50KHdyaXRlcik7CisgIGpzb25fd3JpdGVyX2VzY2FwZV9zdHJpbmcod3JpdGVyLCBzdHJpbmcpOworICB3cml0ZXItPmdvdF9rZXkgPSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwZTc5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyogVGhlIGlkZWEgb2YgdGhlIHdyaXRlciBpcyBiYXNpY2FsbHkgc3ltbWV0cmljYWwgb2YgdGhlIHJlYWRlci4gV2hpbGUgdGhlCisgKiByZWFkZXIgZW1pdHMgdmFyaW91cyBjYWxscyB0byB5b3VyIGNvZGUsIHRoZSB3cml0ZXIgdGFrZXMgYmFzaWNhbGx5IHRoZQorICogc2FtZSBjYWxscyBhbmQgZW1pdCBqc29uIG91dCBvZiBpdC4gSXQgZG9lc24ndCB0cnkgdG8gbWFrZSBhbnkgY2hlY2sgb24KKyAqIHRoZSBvcmRlciBvZiB0aGUgY2FsbHMgeW91IGRvIG9uIGl0LiBNZWFuaW5nIHlvdSBjYW4gdGhlb3JpY2FsbHkgZm9yY2UKKyAqIGl0IHRvIGdlbmVyYXRlIGludmFsaWQganNvbi4KKyAqCisgKiBBbHNvLCB1bmxpa2UgdGhlIHJlYWRlciwgdGhlIHdyaXRlciBleHBlY3RzIFVURi04IGVuY29kZWQgaW5wdXQgc3RyaW5ncy4KKyAqIFRoZXNlIHN0cmluZ3Mgd2lsbCBiZSBVVEYtOCB2YWxpZGF0ZWQsIGFuZCBhbnkgaW52YWxpZCBjaGFyYWN0ZXIgd2lsbAorICogY3V0IHRoZSBjb252ZXJzaW9uIHNob3J0LCBiZWZvcmUgYW55IGludmFsaWQgVVRGLTggc2VxdWVuY2UsIHRodXMgZm9ybWluZworICogYSB2YWxpZCBVVEYtOCBzdHJpbmcgb3ZlcmFsbC4KKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfSlNPTl9KU09OX1dSSVRFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfSlNPTl9KU09OX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfanNvbl93cml0ZXJfdnRhYmxlIHsKKyAgLyogQWRkcyBhIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IHN0cmVhbS4gKi8KKyAgdm9pZCAoKm91dHB1dF9jaGFyKSh2b2lkICp1c2VyZGF0YSwgY2hhcik7CisgIC8qIEFkZHMgYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAqLworICB2b2lkICgqb3V0cHV0X3N0cmluZykodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKnN0cik7CisgIC8qIEFkZHMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAqLworICB2b2lkICgqb3V0cHV0X3N0cmluZ193aXRoX2xlbikodm9pZCAqdXNlcmRhdGEsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7CisKK30gZ3JwY19qc29uX3dyaXRlcl92dGFibGU7CisKK3R5cGVkZWYgc3RydWN0IGdycGNfanNvbl93cml0ZXIgeworICB2b2lkICp1c2VyZGF0YTsKKyAgZ3JwY19qc29uX3dyaXRlcl92dGFibGUgKnZ0YWJsZTsKKyAgaW50IGluZGVudDsKKyAgaW50IGRlcHRoOworICBpbnQgY29udGFpbmVyX2VtcHR5OworICBpbnQgZ290X2tleTsKK30gZ3JwY19qc29uX3dyaXRlcjsKKworLyogQ2FsbCB0aGlzIHRvIGluaXRpYWxpemUgeW91ciB3cml0ZXIgc3RydWN0dXJlLiBUaGUgaW5kZW50IHBhcmFtZXRlciBpcworICogc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byB1c2UgZm9yIGluZGVudGluZyB0aGUgb3V0cHV0LiBJZiB5b3UKKyAqIHVzZSBpbmRlbnQ9MCwgdGhlbiB0aGUgb3V0cHV0IHdpbGwgbm90IGhhdmUgYW55IG5ld2xpbmVzIGVpdGhlciwgdGh1cworICogZW1pdHRpbmcgYSBjb25kZW5zZWQganNvbiBvdXRwdXQuCisgKi8KK3ZvaWQgZ3JwY19qc29uX3dyaXRlcl9pbml0KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl93cml0ZXJfdnRhYmxlICp2dGFibGUsIHZvaWQgKnVzZXJkYXRhKTsKKworLyogU2lnbmFscyB0aGUgYmVnaW5uaW5nIG9mIGEgY29udGFpbmVyLiAqLwordm9pZCBncnBjX2pzb25fd3JpdGVyX2NvbnRhaW5lcl9iZWdpbnMoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qc29uX3R5cGUgdHlwZSk7CisvKiBTaWduYWxzIHRoZSBlbmQgb2YgYSBjb250YWluZXIuICovCit2b2lkIGdycGNfanNvbl93cml0ZXJfY29udGFpbmVyX2VuZHMoZ3JwY19qc29uX3dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl90eXBlIHR5cGUpOworLyogV3JpdGVzIGRvd24gYW4gb2JqZWN0IGtleSBmb3IgdGhlIG5leHQgdmFsdWUuICovCit2b2lkIGdycGNfanNvbl93cml0ZXJfb2JqZWN0X2tleShncnBjX2pzb25fd3JpdGVyICp3cml0ZXIsIGNvbnN0IGNoYXIgKnN0cmluZyk7CisvKiBTZXRzIGEgcmF3IHZhbHVlLiBVc2VmdWwgZm9yIG51bWJlcnMuICovCit2b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3KGdycGNfanNvbl93cml0ZXIgKndyaXRlciwgY29uc3QgY2hhciAqc3RyaW5nKTsKKy8qIFNldHMgYSByYXcgdmFsdWUgd2l0aCBpdHMgbGVuZ3RoLiBVc2VmdWwgZm9yIHZhbHVlcyBsaWtlIHRydWUgb3IgZmFsc2UuICovCit2b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfcmF3X3dpdGhfbGVuKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nLCBzaXplX3QgbGVuKTsKKy8qIFNldHMgYSBzdHJpbmcgdmFsdWUuIEl0J2xsIGJlIGVzY2FwZWQsIGFuZCB1dGYtOCB2YWxpZGF0ZWQuICovCit2b2lkIGdycGNfanNvbl93cml0ZXJfdmFsdWVfc3RyaW5nKGdycGNfanNvbl93cml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfSlNPTl9KU09OX1dSSVRFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIGIvc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYwpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUlBDX0JBU0lDX1BST0ZJTEVSCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtIHsgQkVHSU4gPSAneycsIEVORCA9ICd9JywgTUFSSyA9ICcuJyB9IG1hcmtlcl90eXBlOworCit0eXBlZGVmIHN0cnVjdCBncHJfdGltZXJfZW50cnkgeworICBncHJfdGltZXNwZWMgdG07CisgIGNvbnN0IGNoYXIgKnRhZ3N0cjsKKyAgY29uc3QgY2hhciAqZmlsZTsKKyAgc2hvcnQgbGluZTsKKyAgY2hhciB0eXBlOworICB1aW50OF90IGltcG9ydGFudDsKKyAgaW50IHRoZDsKK30gZ3ByX3RpbWVyX2VudHJ5OworCisjZGVmaW5lIE1BWF9DT1VOVCAxMDAwMDAwCisKK3R5cGVkZWYgc3RydWN0IGdwcl90aW1lcl9sb2cgeworICBzaXplX3QgbnVtX2VudHJpZXM7CisgIHN0cnVjdCBncHJfdGltZXJfbG9nICpuZXh0OworICBzdHJ1Y3QgZ3ByX3RpbWVyX2xvZyAqcHJldjsKKyAgZ3ByX3RpbWVyX2VudHJ5IGxvZ1tNQVhfQ09VTlRdOworfSBncHJfdGltZXJfbG9nOworCit0eXBlZGVmIHN0cnVjdCBncHJfdGltZXJfbG9nX2xpc3QgeworICBncHJfdGltZXJfbG9nICpoZWFkOworICAvKiB2YWxpZCBpZmYgaGVhZCE9TlVMTCAqLworICBncHJfdGltZXJfbG9nICp0YWlsOworfSBncHJfdGltZXJfbG9nX2xpc3Q7CisKK3N0YXRpYyBfX3RocmVhZCBncHJfdGltZXJfbG9nICpnX3RocmVhZF9sb2c7CitzdGF0aWMgZ3ByX29uY2UgZ19vbmNlX2luaXQgPSBHUFJfT05DRV9JTklUOworc3RhdGljIEZJTEUgKm91dHB1dF9maWxlOworc3RhdGljIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZSA9ICJsYXRlbmN5X3RyYWNlLnR4dCI7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdfbXU7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgZ19jdjsKK3N0YXRpYyBncHJfdGltZXJfbG9nX2xpc3QgZ19pbl9wcm9ncmVzc19sb2dzOworc3RhdGljIGdwcl90aW1lcl9sb2dfbGlzdCBnX2RvbmVfbG9nczsKK3N0YXRpYyBpbnQgZ19zaHV0ZG93bjsKK3N0YXRpYyBncHJfdGhkX2lkIGdfd3JpdGluZ190aHJlYWQ7CitzdGF0aWMgX190aHJlYWQgaW50IGdfdGhyZWFkX2lkOworc3RhdGljIGludCBnX25leHRfdGhyZWFkX2lkOworCitzdGF0aWMgaW50IHRpbWVyX2xvZ19wdXNoX2JhY2soZ3ByX3RpbWVyX2xvZ19saXN0ICpsaXN0LCBncHJfdGltZXJfbG9nICpsb2cpIHsKKyAgaWYgKGxpc3QtPmhlYWQgPT0gTlVMTCkgeworICAgIGxpc3QtPmhlYWQgPSBsaXN0LT50YWlsID0gbG9nOworICAgIGxvZy0+bmV4dCA9IGxvZy0+cHJldiA9IE5VTEw7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgbG9nLT5wcmV2ID0gbGlzdC0+dGFpbDsKKyAgICBsb2ctPm5leHQgPSBOVUxMOworICAgIGxpc3QtPnRhaWwtPm5leHQgPSBsb2c7CisgICAgbGlzdC0+dGFpbCA9IGxvZzsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgZ3ByX3RpbWVyX2xvZyAqdGltZXJfbG9nX3BvcF9mcm9udChncHJfdGltZXJfbG9nX2xpc3QgKmxpc3QpIHsKKyAgZ3ByX3RpbWVyX2xvZyAqb3V0ID0gbGlzdC0+aGVhZDsKKyAgaWYgKG91dCAhPSBOVUxMKSB7CisgICAgbGlzdC0+aGVhZCA9IG91dC0+bmV4dDsKKyAgICBpZiAobGlzdC0+aGVhZCAhPSBOVUxMKSB7CisgICAgICBsaXN0LT5oZWFkLT5wcmV2ID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgbGlzdC0+dGFpbCA9IE5VTEw7CisgICAgfQorICB9CisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2xvZ19yZW1vdmUoZ3ByX3RpbWVyX2xvZ19saXN0ICpsaXN0LCBncHJfdGltZXJfbG9nICpsb2cpIHsKKyAgaWYgKGxvZy0+cHJldiA9PSBOVUxMKSB7CisgICAgbGlzdC0+aGVhZCA9IGxvZy0+bmV4dDsKKyAgICBpZiAobGlzdC0+aGVhZCAhPSBOVUxMKSB7CisgICAgICBsaXN0LT5oZWFkLT5wcmV2ID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbG9nLT5wcmV2LT5uZXh0ID0gbG9nLT5uZXh0OworICB9CisgIGlmIChsb2ctPm5leHQgPT0gTlVMTCkgeworICAgIGxpc3QtPnRhaWwgPSBsb2ctPnByZXY7CisgICAgaWYgKGxpc3QtPnRhaWwgIT0gTlVMTCkgeworICAgICAgbGlzdC0+dGFpbC0+bmV4dCA9IE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIGxvZy0+bmV4dC0+cHJldiA9IGxvZy0+cHJldjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9sb2coZ3ByX3RpbWVyX2xvZyAqbG9nKSB7CisgIHNpemVfdCBpOworICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkgeworICAgIG91dHB1dF9maWxlID0gZm9wZW4ob3V0cHV0X2ZpbGVuYW1lLCAidyIpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBsb2ctPm51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBncHJfdGltZXJfZW50cnkgKmVudHJ5ID0gJihsb2ctPmxvZ1tpXSk7CisgICAgaWYgKGdwcl90aW1lX2NtcChlbnRyeS0+dG0sIGdwcl90aW1lXzAoZW50cnktPnRtLmNsb2NrX3R5cGUpKSA8IDApIHsKKyAgICAgIGVudHJ5LT50bSA9IGdwcl90aW1lXzAoZW50cnktPnRtLmNsb2NrX3R5cGUpOworICAgIH0KKyAgICBmcHJpbnRmKG91dHB1dF9maWxlLAorICAgICAgICAgICAgIntcInRcIjogJWxsZC4lMDlkLCBcInRoZFwiOiBcIiVkXCIsIFwidHlwZVwiOiBcIiVjXCIsIFwidGFnXCI6ICIKKyAgICAgICAgICAgICJcIiVzXCIsIFwiZmlsZVwiOiBcIiVzXCIsIFwibGluZVwiOiAlZCwgXCJpbXBcIjogJWR9XG4iLAorICAgICAgICAgICAgKGxvbmcgbG9uZyllbnRyeS0+dG0udHZfc2VjLCAoaW50KWVudHJ5LT50bS50dl9uc2VjLCBlbnRyeS0+dGhkLAorICAgICAgICAgICAgZW50cnktPnR5cGUsIGVudHJ5LT50YWdzdHIsIGVudHJ5LT5maWxlLCBlbnRyeS0+bGluZSwKKyAgICAgICAgICAgIGVudHJ5LT5pbXBvcnRhbnQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRpbmdfdGhyZWFkKHZvaWQgKnVudXNlZCkgeworICBncHJfdGltZXJfbG9nICpsb2c7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdSk7CisgIGZvciAoOzspIHsKKyAgICB3aGlsZSAoKGxvZyA9IHRpbWVyX2xvZ19wb3BfZnJvbnQoJmdfZG9uZV9sb2dzKSkgPT0gTlVMTCAmJiAhZ19zaHV0ZG93bikgeworICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmdfY3YsICZnX211KTsKKyAgICB9CisgICAgaWYgKGxvZyAhPSBOVUxMKSB7CisgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdSk7CisgICAgICB3cml0ZV9sb2cobG9nKTsKKyAgICAgIGZyZWUobG9nKTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdSk7CisgICAgfQorICAgIGlmIChnX3NodXRkb3duKSB7CisgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2xvZ3MoZ3ByX3RpbWVyX2xvZ19saXN0ICpsaXN0KSB7CisgIGdwcl90aW1lcl9sb2cgKmxvZzsKKyAgd2hpbGUgKChsb2cgPSB0aW1lcl9sb2dfcG9wX2Zyb250KGxpc3QpKSAhPSBOVUxMKSB7CisgICAgd3JpdGVfbG9nKGxvZyk7CisgICAgZnJlZShsb2cpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF93cml0aW5nKCkgeworICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXUpOworICBnX3NodXRkb3duID0gMTsKKyAgcHRocmVhZF9jb25kX3NpZ25hbCgmZ19jdik7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX211KTsKKyAgZ3ByX3RoZF9qb2luKGdfd3JpdGluZ190aHJlYWQpOworCisgIGdwcl9sb2coR1BSX0lORk8sICJmbHVzaGluZyBsb2dzIik7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211KTsKKyAgZmx1c2hfbG9ncygmZ19kb25lX2xvZ3MpOworICBmbHVzaF9sb2dzKCZnX2luX3Byb2dyZXNzX2xvZ3MpOworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdSk7CisKKyAgaWYgKG91dHB1dF9maWxlKSB7CisgICAgZmNsb3NlKG91dHB1dF9maWxlKTsKKyAgfQorfQorCit2b2lkIGdwcl90aW1lcnNfc2V0X2xvZ19maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSkgeworICBvdXRwdXRfZmlsZW5hbWUgPSBmaWxlbmFtZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vdXRwdXQoKSB7CisgIGdwcl90aGRfb3B0aW9ucyBvcHRpb25zID0gZ3ByX3RoZF9vcHRpb25zX2RlZmF1bHQoKTsKKyAgZ3ByX3RoZF9vcHRpb25zX3NldF9qb2luYWJsZSgmb3B0aW9ucyk7CisgIGdwcl90aGRfbmV3KCZnX3dyaXRpbmdfdGhyZWFkLCB3cml0aW5nX3RocmVhZCwgTlVMTCwgJm9wdGlvbnMpOworICBhdGV4aXQoZmluaXNoX3dyaXRpbmcpOworfQorCitzdGF0aWMgdm9pZCByb3RhdGVfbG9nKCkgeworICBncHJfdGltZXJfbG9nICpuZXcgPSBtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKyAgZ3ByX29uY2VfaW5pdCgmZ19vbmNlX2luaXQsIGluaXRfb3V0cHV0KTsKKyAgbmV3LT5udW1fZW50cmllcyA9IDA7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdSk7CisgIGlmIChnX3RocmVhZF9sb2cgIT0gTlVMTCkgeworICAgIHRpbWVyX2xvZ19yZW1vdmUoJmdfaW5fcHJvZ3Jlc3NfbG9ncywgZ190aHJlYWRfbG9nKTsKKyAgICBpZiAodGltZXJfbG9nX3B1c2hfYmFjaygmZ19kb25lX2xvZ3MsIGdfdGhyZWFkX2xvZykpIHsKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmdfY3YpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnX3RocmVhZF9pZCA9IGdfbmV4dF90aHJlYWRfaWQrKzsKKyAgfQorICB0aW1lcl9sb2dfcHVzaF9iYWNrKCZnX2luX3Byb2dyZXNzX2xvZ3MsIG5ldyk7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX211KTsKKyAgZ190aHJlYWRfbG9nID0gbmV3OworfQorCitzdGF0aWMgdm9pZCBncHJfdGltZXJzX2xvZ19hZGQoY29uc3QgY2hhciAqdGFnc3RyLCBtYXJrZXJfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgIGdwcl90aW1lcl9lbnRyeSAqZW50cnk7CisKKyAgaWYgKGdfdGhyZWFkX2xvZyA9PSBOVUxMIHx8IGdfdGhyZWFkX2xvZy0+bnVtX2VudHJpZXMgPT0gTUFYX0NPVU5UKSB7CisgICAgcm90YXRlX2xvZygpOworICB9CisKKyAgZW50cnkgPSAmZ190aHJlYWRfbG9nLT5sb2dbZ190aHJlYWRfbG9nLT5udW1fZW50cmllcysrXTsKKworICBlbnRyeS0+dG0gPSBncHJfbm93KEdQUl9DTE9DS19QUkVDSVNFKTsKKyAgZW50cnktPnRhZ3N0ciA9IHRhZ3N0cjsKKyAgZW50cnktPnR5cGUgPSB0eXBlOworICBlbnRyeS0+ZmlsZSA9IGZpbGU7CisgIGVudHJ5LT5saW5lID0gKHNob3J0KWxpbmU7CisgIGVudHJ5LT5pbXBvcnRhbnQgPSBpbXBvcnRhbnQgIT0gMDsKKyAgZW50cnktPnRoZCA9IGdfdGhyZWFkX2lkOworfQorCisvKiBMYXRlbmN5IHByb2ZpbGVyIEFQSSBpbXBsZW1lbnRhdGlvbi4gKi8KK3ZvaWQgZ3ByX3RpbWVyX2FkZF9tYXJrKGNvbnN0IGNoYXIgKnRhZ3N0ciwgaW50IGltcG9ydGFudCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIGdwcl90aW1lcnNfbG9nX2FkZCh0YWdzdHIsIE1BUkssIGltcG9ydGFudCwgZmlsZSwgbGluZSk7Cit9CisKK3ZvaWQgZ3ByX3RpbWVyX2JlZ2luKGNvbnN0IGNoYXIgKnRhZ3N0ciwgaW50IGltcG9ydGFudCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIGdwcl90aW1lcnNfbG9nX2FkZCh0YWdzdHIsIEJFR0lOLCBpbXBvcnRhbnQsIGZpbGUsIGxpbmUpOworfQorCit2b2lkIGdwcl90aW1lcl9lbmQoY29uc3QgY2hhciAqdGFnc3RyLCBpbnQgaW1wb3J0YW50LCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIGdwcl90aW1lcnNfbG9nX2FkZCh0YWdzdHIsIEVORCwgaW1wb3J0YW50LCBmaWxlLCBsaW5lKTsKK30KKworLyogQmFzaWMgcHJvZmlsZXIgc3BlY2lmaWMgQVBJIGZ1bmN0aW9ucy4gKi8KK3ZvaWQgZ3ByX3RpbWVyc19nbG9iYWxfaW5pdCh2b2lkKSB7fQorCit2b2lkIGdwcl90aW1lcnNfZ2xvYmFsX2Rlc3Ryb3kodm9pZCkge30KKworI2Vsc2UgIC8qICFHUlBDX0JBU0lDX1BST0ZJTEVSICovCit2b2lkIGdwcl90aW1lcnNfZ2xvYmFsX2luaXQodm9pZCkge30KKwordm9pZCBncHJfdGltZXJzX2dsb2JhbF9kZXN0cm95KHZvaWQpIHt9CisKK3ZvaWQgZ3ByX3RpbWVyc19zZXRfbG9nX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7fQorI2VuZGlmIC8qIEdSUENfQkFTSUNfUFJPRklMRVIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5kIGIvc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS9wcm9maWxpbmcvc3RhcF9wcm9iZXMuZApyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5kCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMgYi9zcmMvY29yZS9saWIvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1YzFhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9wcm9maWxpbmcvc3RhcF90aW1lcnMuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdSUENfU1RBUF9QUk9GSUxFUgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKworI2luY2x1ZGUgPHN5cy9zZHQuaD4KKy8qIEdlbmVyYXRlZCBmcm9tIHNyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5kICovCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5oIgorCisvKiBMYXRlbmN5IHByb2ZpbGVyIEFQSSBpbXBsZW1lbnRhdGlvbi4gKi8KK3ZvaWQgZ3ByX3RpbWVyX2FkZF9tYXJrKGludCB0YWcsIGNvbnN0IGNoYXIgKnRhZ3N0ciwgdm9pZCAqaWQsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBfU1RBUF9BRERfTUFSSyh0YWcpOworfQorCit2b2lkIGdwcl90aW1lcl9hZGRfaW1wb3J0YW50X21hcmsoaW50IHRhZywgY29uc3QgY2hhciAqdGFnc3RyLCB2b2lkICppZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICBfU1RBUF9BRERfSU1QT1JUQU5UX01BUksodGFnKTsKK30KKwordm9pZCBncHJfdGltZXJfYmVnaW4oaW50IHRhZywgY29uc3QgY2hhciAqdGFnc3RyLCB2b2lkICppZCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgIF9TVEFQX1RJTUlOR19OU19CRUdJTih0YWcpOworfQorCit2b2lkIGdwcl90aW1lcl9lbmQoaW50IHRhZywgY29uc3QgY2hhciAqdGFnc3RyLCB2b2lkICppZCwgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICBfU1RBUF9USU1JTkdfTlNfRU5EKHRhZyk7Cit9CisKKyNlbmRpZiAvKiBHUlBDX1NUQVBfUFJPRklMRVIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmggYi9zcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDM1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfUFJPRklMSU5HX1RJTUVSU19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfUFJPRklMSU5HX1RJTUVSU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBncHJfdGltZXJzX2dsb2JhbF9pbml0KHZvaWQpOwordm9pZCBncHJfdGltZXJzX2dsb2JhbF9kZXN0cm95KHZvaWQpOworCit2b2lkIGdwcl90aW1lcl9hZGRfbWFyayhjb25zdCBjaGFyICp0YWdzdHIsIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7Cit2b2lkIGdwcl90aW1lcl9iZWdpbihjb25zdCBjaGFyICp0YWdzdHIsIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7Cit2b2lkIGdwcl90aW1lcl9lbmQoY29uc3QgY2hhciAqdGFnc3RyLCBpbnQgaW1wb3J0YW50LCBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKKwordm9pZCBncHJfdGltZXJzX3NldF9sb2dfZmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisjaWYgIShkZWZpbmVkKEdSUENfU1RBUF9QUk9GSUxFUikgKyBkZWZpbmVkKEdSUENfQkFTSUNfUFJPRklMRVIpKQorLyogTm8gcHJvZmlsaW5nLiBOby1vcCBhbGwgdGhlIHRoaW5ncy4gKi8KKyNkZWZpbmUgR1BSX1RJTUVSX01BUksodGFnLCBpbXBvcnRhbnQpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHUFJfVElNRVJfQkVHSU4odGFnLCBpbXBvcnRhbnQpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR1BSX1RJTUVSX0VORCh0YWcsIGltcG9ydGFudCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNlbHNlIC8qIGF0IGxlYXN0IG9uZSBwcm9maWxlciByZXF1ZXN0ZWQuLi4gKi8KKy8qIC4uLiBob3BlZnVsbHkgb25seSBvbmUuICovCisjaWYgZGVmaW5lZChHUlBDX1NUQVBfUFJPRklMRVIpICYmIGRlZmluZWQoR1JQQ19CQVNJQ19QUk9GSUxFUikKKyNlcnJvciAiR1JQQ19TVEFQX1BST0ZJTEVSIGFuZCBHUlBDX0JBU0lDX1BST0ZJTEVSIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIgorI2VuZGlmCisKKy8qIEdlbmVyaWMgcHJvZmlsaW5nIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgR1BSX1RJTUVSX01BUksodGFnLCBpbXBvcnRhbnQpIFwKKyAgZ3ByX3RpbWVyX2FkZF9tYXJrKHRhZywgaW1wb3J0YW50LCBfX0ZJTEVfXywgX19MSU5FX18pOworCisjZGVmaW5lIEdQUl9USU1FUl9CRUdJTih0YWcsIGltcG9ydGFudCkgXAorICBncHJfdGltZXJfYmVnaW4odGFnLCBpbXBvcnRhbnQsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKyNkZWZpbmUgR1BSX1RJTUVSX0VORCh0YWcsIGltcG9ydGFudCkgXAorICBncHJfdGltZXJfZW5kKHRhZywgaW1wb3J0YW50LCBfX0ZJTEVfXywgX19MSU5FX18pOworCisjaWZkZWYgR1JQQ19TVEFQX1BST0ZJTEVSCisvKiBFbXB0eSBwbGFjZWhvbGRlciBmb3Igbm93LiAqLworI2VuZGlmIC8qIEdSUENfU1RBUF9QUk9GSUxFUiAqLworCisjaWZkZWYgR1JQQ19CQVNJQ19QUk9GSUxFUgorLyogRW1wdHkgcGxhY2Vob2xkZXIgZm9yIG5vdy4gKi8KKyNlbmRpZiAvKiBHUlBDX0JBU0lDX1BST0ZJTEVSICovCisKKyNlbmRpZiAvKiBhdCBsZWFzdCBvbmUgcHJvZmlsZXIgcmVxdWVzdGVkLiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKworI2lmIChkZWZpbmVkKEdSUENfU1RBUF9QUk9GSUxFUikgKyBkZWZpbmVkKEdSUENfQkFTSUNfUFJPRklMRVIpKQorbmFtZXNwYWNlIGdycGMgeworY2xhc3MgUHJvZmlsZVNjb3BlIHsKKyBwdWJsaWM6CisgIFByb2ZpbGVTY29wZShjb25zdCBjaGFyICpkZXNjLCBib29sIGltcG9ydGFudCkgOiBkZXNjXyhkZXNjKSB7CisgICAgR1BSX1RJTUVSX0JFR0lOKGRlc2NfLCBpbXBvcnRhbnQgPyAxIDogMCk7CisgIH0KKyAgflByb2ZpbGVTY29wZSgpIHsgR1BSX1RJTUVSX0VORChkZXNjXywgMCk7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IGNoYXIgKmNvbnN0IGRlc2NfOworfTsKK30KKworI2RlZmluZSBHUFJfVElNRVJfU0NPUEUodGFnLCBpbXBvcnRhbnQpIFwKKyAgOjpncnBjOjpQcm9maWxlU2NvcGUgX3Byb2ZpbGVfc2NvcGVfIyNfX0xJTkVfXygodGFnKSwgKGltcG9ydGFudCkpCisjZWxzZQorI2RlZmluZSBHUFJfVElNRVJfU0NPUEUodGFnLCBpbXBvcnRhbnQpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfUFJPRklMSU5HX1RJTUVSU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMgYi9zcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4MjE0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW5vcGIgY29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KKy8qIEdlbmVyYXRlZCBieSBuYW5vcGItMC4zLjUtZGV2ICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiCisKKyNpZiBQQl9QUk9UT19IRUFERVJfVkVSU0lPTiAhPSAzMAorI2Vycm9yIFJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBuYW5vcGIgZ2VuZXJhdG9yLgorI2VuZGlmCisKKworCitjb25zdCBwYl9maWVsZF90IGdycGNfbGJfdjBfRHVyYXRpb25fZmllbGRzWzNdID0geworICAgIFBCX0ZJRUxEKCAgMSwgSU5UNjQgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgRklSU1QsIGdycGNfbGJfdjBfRHVyYXRpb24sIHNlY29uZHMsIHNlY29uZHMsIDApLAorICAgIFBCX0ZJRUxEKCAgMiwgSU5UMzIgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfRHVyYXRpb24sIG5hbm9zLCBzZWNvbmRzLCAwKSwKKyAgICBQQl9MQVNUX0ZJRUxECit9OworCitjb25zdCBwYl9maWVsZF90IGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0X2ZpZWxkc1szXSA9IHsKKyAgICBQQl9GSUVMRCggIDEsIE1FU1NBR0UgLCBPUFRJT05BTCwgU1RBVElDICAsIEZJUlNULCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdCwgaW5pdGlhbF9yZXF1ZXN0LCBpbml0aWFsX3JlcXVlc3QsICZncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlcXVlc3RfZmllbGRzKSwKKyAgICBQQl9GSUVMRCggIDIsIE1FU1NBR0UgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdCwgY2xpZW50X3N0YXRzLCBpbml0aWFsX3JlcXVlc3QsICZncnBjX2xiX3YwX0NsaWVudFN0YXRzX2ZpZWxkcyksCisgICAgUEJfTEFTVF9GSUVMRAorfTsKKworY29uc3QgcGJfZmllbGRfdCBncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlcXVlc3RfZmllbGRzWzJdID0geworICAgIFBCX0ZJRUxEKCAgMSwgU1RSSU5HICAsIE9QVElPTkFMLCBTVEFUSUMgICwgRklSU1QsIGdycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVxdWVzdCwgbmFtZSwgbmFtZSwgMCksCisgICAgUEJfTEFTVF9GSUVMRAorfTsKKworY29uc3QgcGJfZmllbGRfdCBncnBjX2xiX3YwX0NsaWVudFN0YXRzX2ZpZWxkc1s0XSA9IHsKKyAgICBQQl9GSUVMRCggIDEsIElOVDY0ICAgLCBPUFRJT05BTCwgU1RBVElDICAsIEZJUlNULCBncnBjX2xiX3YwX0NsaWVudFN0YXRzLCB0b3RhbF9yZXF1ZXN0cywgdG90YWxfcmVxdWVzdHMsIDApLAorICAgIFBCX0ZJRUxEKCAgMiwgSU5UNjQgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfQ2xpZW50U3RhdHMsIGNsaWVudF9ycGNfZXJyb3JzLCB0b3RhbF9yZXF1ZXN0cywgMCksCisgICAgUEJfRklFTEQoICAzLCBJTlQ2NCAgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9DbGllbnRTdGF0cywgZHJvcHBlZF9yZXF1ZXN0cywgY2xpZW50X3JwY19lcnJvcnMsIDApLAorICAgIFBCX0xBU1RfRklFTEQKK307CisKK2NvbnN0IHBiX2ZpZWxkX3QgZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlc3BvbnNlX2ZpZWxkc1szXSA9IHsKKyAgICBQQl9GSUVMRCggIDEsIE1FU1NBR0UgLCBPUFRJT05BTCwgU1RBVElDICAsIEZJUlNULCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2UsIGluaXRpYWxfcmVzcG9uc2UsIGluaXRpYWxfcmVzcG9uc2UsICZncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlX2ZpZWxkcyksCisgICAgUEJfRklFTEQoICAyLCBNRVNTQUdFICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlc3BvbnNlLCBzZXJ2ZXJfbGlzdCwgaW5pdGlhbF9yZXNwb25zZSwgJmdycGNfbGJfdjBfU2VydmVyTGlzdF9maWVsZHMpLAorICAgIFBCX0xBU1RfRklFTEQKK307CisKK2NvbnN0IHBiX2ZpZWxkX3QgZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZV9maWVsZHNbNF0gPSB7CisgICAgUEJfRklFTEQoICAxLCBTVFJJTkcgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBGSVJTVCwgZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZSwgY2xpZW50X2NvbmZpZywgY2xpZW50X2NvbmZpZywgMCksCisgICAgUEJfRklFTEQoICAyLCBTVFJJTkcgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZSwgbG9hZF9iYWxhbmNlcl9kZWxlZ2F0ZSwgY2xpZW50X2NvbmZpZywgMCksCisgICAgUEJfRklFTEQoICAzLCBNRVNTQUdFICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZSwgY2xpZW50X3N0YXRzX3JlcG9ydF9pbnRlcnZhbCwgbG9hZF9iYWxhbmNlcl9kZWxlZ2F0ZSwgJmdycGNfbGJfdjBfRHVyYXRpb25fZmllbGRzKSwKKyAgICBQQl9MQVNUX0ZJRUxECit9OworCitjb25zdCBwYl9maWVsZF90IGdycGNfbGJfdjBfU2VydmVyTGlzdF9maWVsZHNbM10gPSB7CisgICAgUEJfRklFTEQoICAxLCBNRVNTQUdFICwgUkVQRUFURUQsIENBTExCQUNLLCBGSVJTVCwgZ3JwY19sYl92MF9TZXJ2ZXJMaXN0LCBzZXJ2ZXJzLCBzZXJ2ZXJzLCAmZ3JwY19sYl92MF9TZXJ2ZXJfZmllbGRzKSwKKyAgICBQQl9GSUVMRCggIDMsIE1FU1NBR0UgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX1NlcnZlckxpc3QsIGV4cGlyYXRpb25faW50ZXJ2YWwsIHNlcnZlcnMsICZncnBjX2xiX3YwX0R1cmF0aW9uX2ZpZWxkcyksCisgICAgUEJfTEFTVF9GSUVMRAorfTsKKworY29uc3QgcGJfZmllbGRfdCBncnBjX2xiX3YwX1NlcnZlcl9maWVsZHNbNV0gPSB7CisgICAgUEJfRklFTEQoICAxLCBTVFJJTkcgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBGSVJTVCwgZ3JwY19sYl92MF9TZXJ2ZXIsIGlwX2FkZHJlc3MsIGlwX2FkZHJlc3MsIDApLAorICAgIFBCX0ZJRUxEKCAgMiwgSU5UMzIgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfU2VydmVyLCBwb3J0LCBpcF9hZGRyZXNzLCAwKSwKKyAgICBQQl9GSUVMRCggIDMsIEJZVEVTICAgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX1NlcnZlciwgbG9hZF9iYWxhbmNlX3Rva2VuLCBwb3J0LCAwKSwKKyAgICBQQl9GSUVMRCggIDQsIEJPT0wgICAgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX1NlcnZlciwgZHJvcF9yZXF1ZXN0LCBsb2FkX2JhbGFuY2VfdG9rZW4sIDApLAorICAgIFBCX0xBU1RfRklFTEQKK307CisKKworLyogQ2hlY2sgdGhhdCBmaWVsZCBpbmZvcm1hdGlvbiBmaXRzIGluIHBiX2ZpZWxkX3QgKi8KKyNpZiAhZGVmaW5lZChQQl9GSUVMRF8zMkJJVCkKKy8qIElmIHlvdSBnZXQgYW4gZXJyb3IgaGVyZSwgaXQgbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBkZWZpbmUgUEJfRklFTERfMzJCSVQKKyAqIGNvbXBpbGUtdGltZSBvcHRpb24uIFlvdSBjYW4gZG8gdGhhdCBpbiBwYi5oIG9yIG9uIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4KKyAqIAorICogVGhlIHJlYXNvbiB5b3UgbmVlZCB0byBkbyB0aGlzIGlzIHRoYXQgc29tZSBvZiB5b3VyIG1lc3NhZ2VzIGNvbnRhaW4gdGFnCisgKiBudW1iZXJzIG9yIGZpZWxkIHNpemVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHdoYXQgY2FuIGZpdCBpbiA4IG9yIDE2IGJpdAorICogZmllbGQgZGVzY3JpcHRvcnMuCisgKi8KK1BCX1NUQVRJQ19BU1NFUlQoKHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlcXVlc3QsIGluaXRpYWxfcmVxdWVzdCkgPCA2NTUzNiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0LCBjbGllbnRfc3RhdHMpIDwgNjU1MzYgJiYgcGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2UsIGluaXRpYWxfcmVzcG9uc2UpIDwgNjU1MzYgJiYgcGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2UsIHNlcnZlcl9saXN0KSA8IDY1NTM2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZSwgY2xpZW50X3N0YXRzX3JlcG9ydF9pbnRlcnZhbCkgPCA2NTUzNiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfU2VydmVyTGlzdCwgc2VydmVycykgPCA2NTUzNiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfU2VydmVyTGlzdCwgZXhwaXJhdGlvbl9pbnRlcnZhbCkgPCA2NTUzNiksIFlPVV9NVVNUX0RFRklORV9QQl9GSUVMRF8zMkJJVF9GT1JfTUVTU0FHRVNfZ3JwY19sYl92MF9EdXJhdGlvbl9ncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdF9ncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlcXVlc3RfZ3JwY19sYl92MF9DbGllbnRTdGF0c19ncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2VfZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZV9ncnBjX2xiX3YwX1NlcnZlckxpc3RfZ3JwY19sYl92MF9TZXJ2ZXIpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBCX0ZJRUxEXzE2QklUKSAmJiAhZGVmaW5lZChQQl9GSUVMRF8zMkJJVCkKKy8qIElmIHlvdSBnZXQgYW4gZXJyb3IgaGVyZSwgaXQgbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBkZWZpbmUgUEJfRklFTERfMTZCSVQKKyAqIGNvbXBpbGUtdGltZSBvcHRpb24uIFlvdSBjYW4gZG8gdGhhdCBpbiBwYi5oIG9yIG9uIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4KKyAqIAorICogVGhlIHJlYXNvbiB5b3UgbmVlZCB0byBkbyB0aGlzIGlzIHRoYXQgc29tZSBvZiB5b3VyIG1lc3NhZ2VzIGNvbnRhaW4gdGFnCisgKiBudW1iZXJzIG9yIGZpZWxkIHNpemVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHdoYXQgY2FuIGZpdCBpbiB0aGUgZGVmYXVsdAorICogOCBiaXQgZGVzY3JpcHRvcnMuCisgKi8KK1BCX1NUQVRJQ19BU1NFUlQoKHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlcXVlc3QsIGluaXRpYWxfcmVxdWVzdCkgPCAyNTYgJiYgcGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdCwgY2xpZW50X3N0YXRzKSA8IDI1NiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSwgaW5pdGlhbF9yZXNwb25zZSkgPCAyNTYgJiYgcGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2UsIHNlcnZlcl9saXN0KSA8IDI1NiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVzcG9uc2UsIGNsaWVudF9zdGF0c19yZXBvcnRfaW50ZXJ2YWwpIDwgMjU2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9TZXJ2ZXJMaXN0LCBzZXJ2ZXJzKSA8IDI1NiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfU2VydmVyTGlzdCwgZXhwaXJhdGlvbl9pbnRlcnZhbCkgPCAyNTYpLCBZT1VfTVVTVF9ERUZJTkVfUEJfRklFTERfMTZCSVRfRk9SX01FU1NBR0VTX2dycGNfbGJfdjBfRHVyYXRpb25fZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlcXVlc3RfZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXF1ZXN0X2dycGNfbGJfdjBfQ2xpZW50U3RhdHNfZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlc3BvbnNlX2dycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVzcG9uc2VfZ3JwY19sYl92MF9TZXJ2ZXJMaXN0X2dycGNfbGJfdjBfU2VydmVyKQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmggYi9zcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oCnJlbmFtZSB0byBzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjJiNjBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9BVVRIX0ZJTFRFUlNfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX0FVVEhfRklMVEVSU19ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisKK2V4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfY2xpZW50X2F1dGhfZmlsdGVyOworZXh0ZXJuIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19zZXJ2ZXJfYXV0aF9maWx0ZXI7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX0FVVEhfRklMVEVSU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmMgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzODc5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworLyogLS0tIENvbnN0YW50cy4gLS0tICovCisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgYmFzZTY0X2J5dGVzW10gPSB7CisgICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCisgICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCisgICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCisgICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgMHgzRSwgLTEsICAgLTEsICAgLTEsICAgMHgzRiwKKyAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDNCLCAweDNDLCAweDNELCAtMSwgICAtMSwKKyAgICAtMSwgICAweDdGLCAtMSwgICAtMSwgICAtMSwgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAorICAgIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsCisgICAgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsCisgICAgLTEsICAgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwKKyAgICAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLCAweDMwLAorICAgIDB4MzEsIDB4MzIsIDB4MzMsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYmFzZTY0X3VybF91bnNhZmVfY2hhcnNbXSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworc3RhdGljIGNvbnN0IGNoYXIgYmFzZTY0X3VybF9zYWZlX2NoYXJzW10gPQorICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKKworI2RlZmluZSBHUlBDX0JBU0U2NF9QQURfQ0hBUiAnPScKKyNkZWZpbmUgR1JQQ19CQVNFNjRfUEFEX0JZVEUgMHg3RgorI2RlZmluZSBHUlBDX0JBU0U2NF9NVUxUSUxJTkVfTElORV9MRU4gNzYKKyNkZWZpbmUgR1JQQ19CQVNFNjRfTVVMVElMSU5FX05VTV9CTE9DS1MgKEdSUENfQkFTRTY0X01VTFRJTElORV9MSU5FX0xFTiAvIDQpCisKKy8qIC0tLSBiYXNlNjQgZnVuY3Rpb25zLiAtLS0gKi8KKworY2hhciAqZ3JwY19iYXNlNjRfZW5jb2RlKGNvbnN0IHZvaWQgKnZkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBpbnQgdXJsX3NhZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG11bHRpbGluZSkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gdmRhdGE7CisgIGNvbnN0IGNoYXIgKmJhc2U2NF9jaGFycyA9CisgICAgICB1cmxfc2FmZSA/IGJhc2U2NF91cmxfc2FmZV9jaGFycyA6IGJhc2U2NF91cmxfdW5zYWZlX2NoYXJzOworICBzaXplX3QgcmVzdWx0X3Byb2plY3RlZF9zaXplID0KKyAgICAgIDQgKiAoKGRhdGFfc2l6ZSArIDMpIC8gMykgKworICAgICAgMiAqIChtdWx0aWxpbmUgPyAoZGF0YV9zaXplIC8gKDMgKiBHUlBDX0JBU0U2NF9NVUxUSUxJTkVfTlVNX0JMT0NLUykpCisgICAgICAgICAgICAgICAgICAgICA6IDApICsKKyAgICAgIDE7CisgIGNoYXIgKnJlc3VsdCA9IGdwcl9tYWxsb2MocmVzdWx0X3Byb2plY3RlZF9zaXplKTsKKyAgY2hhciAqY3VycmVudCA9IHJlc3VsdDsKKyAgc2l6ZV90IG51bV9ibG9ja3MgPSAwOworICBzaXplX3QgaSA9IDA7CisKKyAgLyogRW5jb2RlIGVhY2ggYmxvY2suICovCisgIHdoaWxlIChkYXRhX3NpemUgPj0gMykgeworICAgICpjdXJyZW50KysgPSBiYXNlNjRfY2hhcnNbKGRhdGFbaV0gPj4gMikgJiAweDNGXTsKKyAgICAqY3VycmVudCsrID0KKyAgICAgICAgYmFzZTY0X2NoYXJzWygoZGF0YVtpXSAmIDB4MDMpIDw8IDQpIHwgKChkYXRhW2kgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAqY3VycmVudCsrID0KKyAgICAgICAgYmFzZTY0X2NoYXJzWygoZGF0YVtpICsgMV0gJiAweDBGKSA8PCAyKSB8ICgoZGF0YVtpICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgKmN1cnJlbnQrKyA9IGJhc2U2NF9jaGFyc1tkYXRhW2kgKyAyXSAmIDB4M0ZdOworCisgICAgZGF0YV9zaXplIC09IDM7CisgICAgaSArPSAzOworICAgIGlmIChtdWx0aWxpbmUgJiYgKCsrbnVtX2Jsb2NrcyA9PSBHUlBDX0JBU0U2NF9NVUxUSUxJTkVfTlVNX0JMT0NLUykpIHsKKyAgICAgICpjdXJyZW50KysgPSAnXHInOworICAgICAgKmN1cnJlbnQrKyA9ICdcbic7CisgICAgICBudW1fYmxvY2tzID0gMDsKKyAgICB9CisgIH0KKworICAvKiBUYWtlIGNhcmUgb2YgdGhlIHRhaWwuICovCisgIGlmIChkYXRhX3NpemUgPT0gMikgeworICAgICpjdXJyZW50KysgPSBiYXNlNjRfY2hhcnNbKGRhdGFbaV0gPj4gMikgJiAweDNGXTsKKyAgICAqY3VycmVudCsrID0KKyAgICAgICAgYmFzZTY0X2NoYXJzWygoZGF0YVtpXSAmIDB4MDMpIDw8IDQpIHwgKChkYXRhW2kgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAqY3VycmVudCsrID0gYmFzZTY0X2NoYXJzWyhkYXRhW2kgKyAxXSAmIDB4MEYpIDw8IDJdOworICAgICpjdXJyZW50KysgPSBHUlBDX0JBU0U2NF9QQURfQ0hBUjsKKyAgfSBlbHNlIGlmIChkYXRhX3NpemUgPT0gMSkgeworICAgICpjdXJyZW50KysgPSBiYXNlNjRfY2hhcnNbKGRhdGFbaV0gPj4gMikgJiAweDNGXTsKKyAgICAqY3VycmVudCsrID0gYmFzZTY0X2NoYXJzWyhkYXRhW2ldICYgMHgwMykgPDwgNF07CisgICAgKmN1cnJlbnQrKyA9IEdSUENfQkFTRTY0X1BBRF9DSEFSOworICAgICpjdXJyZW50KysgPSBHUlBDX0JBU0U2NF9QQURfQ0hBUjsKKyAgfQorCisgIEdQUl9BU1NFUlQoY3VycmVudCA+PSByZXN1bHQpOworICBHUFJfQVNTRVJUKCh1aW50cHRyX3QpKGN1cnJlbnQgLSByZXN1bHQpIDwgcmVzdWx0X3Byb2plY3RlZF9zaXplKTsKKyAgcmVzdWx0W2N1cnJlbnQgLSByZXN1bHRdID0gJ1wwJzsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZ3ByX3NsaWNlIGdycGNfYmFzZTY0X2RlY29kZShjb25zdCBjaGFyICpiNjQsIGludCB1cmxfc2FmZSkgeworICByZXR1cm4gZ3JwY19iYXNlNjRfZGVjb2RlX3dpdGhfbGVuKGI2NCwgc3RybGVuKGI2NCksIHVybF9zYWZlKTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX29uZV9jaGFyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGVzLCB1bnNpZ25lZCBjaGFyICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpyZXN1bHRfb2Zmc2V0KSB7CisgIHVpbnQzMl90IHBhY2tlZCA9ICgodWludDMyX3QpY29kZXNbMF0gPDwgMikgfCAoKHVpbnQzMl90KWNvZGVzWzFdID4+IDQpOworICByZXN1bHRbKCpyZXN1bHRfb2Zmc2V0KSsrXSA9ICh1bnNpZ25lZCBjaGFyKXBhY2tlZDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3R3b19jaGFycyhjb25zdCB1bnNpZ25lZCBjaGFyICpjb2RlcywgdW5zaWduZWQgY2hhciAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnJlc3VsdF9vZmZzZXQpIHsKKyAgdWludDMyX3QgcGFja2VkID0gKCh1aW50MzJfdCljb2Rlc1swXSA8PCAxMCkgfCAoKHVpbnQzMl90KWNvZGVzWzFdIDw8IDQpIHwKKyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCljb2Rlc1syXSA+PiAyKTsKKyAgcmVzdWx0WygqcmVzdWx0X29mZnNldCkrK10gPSAodW5zaWduZWQgY2hhcikocGFja2VkID4+IDgpOworICByZXN1bHRbKCpyZXN1bHRfb2Zmc2V0KSsrXSA9ICh1bnNpZ25lZCBjaGFyKShwYWNrZWQpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9ncm91cChjb25zdCB1bnNpZ25lZCBjaGFyICpjb2Rlcywgc2l6ZV90IG51bV9jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgc2l6ZV90ICpyZXN1bHRfb2Zmc2V0KSB7CisgIEdQUl9BU1NFUlQobnVtX2NvZGVzIDw9IDQpOworCisgIC8qIFNob3J0IGVuZCBncm91cHMgdGhhdCBtYXkgbm90IGhhdmUgcGFkZGluZy4gKi8KKyAgaWYgKG51bV9jb2RlcyA9PSAxKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGdyb3VwLiBNdXN0IGJlIGF0IGxlYXN0IDIgYnl0ZXMuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG51bV9jb2RlcyA9PSAyKSB7CisgICAgZGVjb2RlX29uZV9jaGFyKGNvZGVzLCByZXN1bHQsIHJlc3VsdF9vZmZzZXQpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChudW1fY29kZXMgPT0gMykgeworICAgIGRlY29kZV90d29fY2hhcnMoY29kZXMsIHJlc3VsdCwgcmVzdWx0X29mZnNldCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBSZWd1bGFyIDQgYnl0ZSBncm91cHMgd2l0aCBwYWRkaW5nIG9yIG5vdC4gKi8KKyAgR1BSX0FTU0VSVChudW1fY29kZXMgPT0gNCk7CisgIGlmIChjb2Rlc1swXSA9PSBHUlBDX0JBU0U2NF9QQURfQllURSB8fCBjb2Rlc1sxXSA9PSBHUlBDX0JBU0U2NF9QQURfQllURSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBwYWRkaW5nIGRldGVjdGVkLiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2Rlc1syXSA9PSBHUlBDX0JBU0U2NF9QQURfQllURSkgeworICAgIGlmIChjb2Rlc1szXSA9PSBHUlBDX0JBU0U2NF9QQURfQllURSkgeworICAgICAgZGVjb2RlX29uZV9jaGFyKGNvZGVzLCByZXN1bHQsIHJlc3VsdF9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgcGFkZGluZyBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIGlmIChjb2Rlc1szXSA9PSBHUlBDX0JBU0U2NF9QQURfQllURSkgeworICAgIGRlY29kZV90d29fY2hhcnMoY29kZXMsIHJlc3VsdCwgcmVzdWx0X29mZnNldCk7CisgIH0gZWxzZSB7CisgICAgLyogTm8gcGFkZGluZy4gKi8KKyAgICB1aW50MzJfdCBwYWNrZWQgPSAoKHVpbnQzMl90KWNvZGVzWzBdIDw8IDE4KSB8ICgodWludDMyX3QpY29kZXNbMV0gPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWNvZGVzWzJdIDw8IDYpIHwgY29kZXNbM107CisgICAgcmVzdWx0WygqcmVzdWx0X29mZnNldCkrK10gPSAodW5zaWduZWQgY2hhcikocGFja2VkID4+IDE2KTsKKyAgICByZXN1bHRbKCpyZXN1bHRfb2Zmc2V0KSsrXSA9ICh1bnNpZ25lZCBjaGFyKShwYWNrZWQgPj4gOCk7CisgICAgcmVzdWx0WygqcmVzdWx0X29mZnNldCkrK10gPSAodW5zaWduZWQgY2hhcikocGFja2VkKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworZ3ByX3NsaWNlIGdycGNfYmFzZTY0X2RlY29kZV93aXRoX2xlbihjb25zdCBjaGFyICpiNjQsIHNpemVfdCBiNjRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXJsX3NhZmUpIHsKKyAgZ3ByX3NsaWNlIHJlc3VsdCA9IGdwcl9zbGljZV9tYWxsb2MoYjY0X2xlbik7CisgIHVuc2lnbmVkIGNoYXIgKmN1cnJlbnQgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHJlc3VsdCk7CisgIHNpemVfdCByZXN1bHRfc2l6ZSA9IDA7CisgIHVuc2lnbmVkIGNoYXIgY29kZXNbNF07CisgIHNpemVfdCBudW1fY29kZXMgPSAwOworCisgIHdoaWxlIChiNjRfbGVuLS0pIHsKKyAgICB1bnNpZ25lZCBjaGFyIGMgPSAodW5zaWduZWQgY2hhcikoKmI2NCsrKTsKKyAgICBzaWduZWQgY2hhciBjb2RlOworICAgIGlmIChjID49IEdQUl9BUlJBWV9TSVpFKGJhc2U2NF9ieXRlcykpIGNvbnRpbnVlOworICAgIGlmICh1cmxfc2FmZSkgeworICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy8nKSB7CisgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBjaGFyYWN0ZXIgZm9yIHVybCBzYWZlIGJhc2U2NCAlYyIsIGMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgICB9CisgICAgICBpZiAoYyA9PSAnLScpIHsKKyAgICAgICAgYyA9ICcrJzsKKyAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXycpIHsKKyAgICAgICAgYyA9ICcvJzsKKyAgICAgIH0KKyAgICB9CisgICAgY29kZSA9IGJhc2U2NF9ieXRlc1tjXTsKKyAgICBpZiAoY29kZSA9PSAtMSkgeworICAgICAgaWYgKGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGNoYXJhY3RlciAlYyIsIGMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGVzW251bV9jb2RlcysrXSA9ICh1bnNpZ25lZCBjaGFyKWNvZGU7CisgICAgICBpZiAobnVtX2NvZGVzID09IDQpIHsKKyAgICAgICAgaWYgKCFkZWNvZGVfZ3JvdXAoY29kZXMsIG51bV9jb2RlcywgY3VycmVudCwgJnJlc3VsdF9zaXplKSkgZ290byBmYWlsOworICAgICAgICBudW1fY29kZXMgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChudW1fY29kZXMgIT0gMCAmJgorICAgICAgIWRlY29kZV9ncm91cChjb2RlcywgbnVtX2NvZGVzLCBjdXJyZW50LCAmcmVzdWx0X3NpemUpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIEdQUl9TTElDRV9TRVRfTEVOR1RIKHJlc3VsdCwgcmVzdWx0X3NpemUpOworICByZXR1cm4gcmVzdWx0OworCitmYWlsOgorICBncHJfc2xpY2VfdW5yZWYocmVzdWx0KTsKKyAgcmV0dXJuIGdwcl9lbXB0eV9zbGljZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjM3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX0I2NF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfQjY0X0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorCisvKiBFbmNvZGVzIGRhdGEgdXNpbmcgYmFzZTY0LiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2FiaWxpdHkgdG8gZnJlZQorICAgdGhlIHJldHVybmVkIGNoYXIgKiB1c2luZyBncHJfZnJlZS4gUmV0dXJucyBOVUxMIG9uIE5VTEwgaW5wdXQuICovCitjaGFyICpncnBjX2Jhc2U2NF9lbmNvZGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgaW50IHVybF9zYWZlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdWx0aWxpbmUpOworCisvKiBEZWNvZGVzIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBiYXNlNjQgc3BlY2lmaWNhdGlvbi4gUmV0dXJucyBhbiBlbXB0eQorICAgc2xpY2UgaW4gY2FzZSBvZiBmYWlsdXJlLiAqLworZ3ByX3NsaWNlIGdycGNfYmFzZTY0X2RlY29kZShjb25zdCBjaGFyICpiNjQsIGludCB1cmxfc2FmZSk7CisKKy8qIFNhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgdGhlIGxlbmd0aCBpcyBwcm92aWRlZCBieSB0aGUgY2FsbGVyLiAqLworZ3ByX3NsaWNlIGdycGNfYmFzZTY0X2RlY29kZV93aXRoX2xlbihjb25zdCBjaGFyICpiNjQsIHNpemVfdCBiNjRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXJsX3NhZmUpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9CNjRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjA3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKKworI2RlZmluZSBNQVhfQ1JFREVOVElBTFNfTUVUQURBVEFfQ09VTlQgNAorCisvKiBXZSBjYW4gaGF2ZSBhIHBlci1jYWxsIGNyZWRlbnRpYWxzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzOworICBncnBjX21kc3RyICpob3N0OworICBncnBjX21kc3RyICptZXRob2Q7CisgIC8qIHBvbGxzZXQgYm91bmQgdG8gdGhpcyBjYWxsOyBpZiB3ZSBuZWVkIHRvIG1ha2UgZXh0ZXJuYWwKKyAgICAgbmV0d29yayByZXF1ZXN0cywgdGhleSBzaG91bGQgYmUgZG9uZSB1bmRlciB0aGlzIHBvbGxzZXQKKyAgICAgc28gdGhhdCB3b3JrIGNhbiBwcm9ncmVzcyB3aGVuIHRoaXMgY2FsbCB3YW50cyB3b3JrIHRvCisgICAgIHByb2dyZXNzICovCisgIGdycGNfcG9sbHNldCAqcG9sbHNldDsKKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIG9wOworICB1aW50OF90IHNlY3VyaXR5X2NvbnRleHRfc2V0OworICBncnBjX2xpbmtlZF9tZGVsZW0gbWRfbGlua3NbTUFYX0NSRURFTlRJQUxTX01FVEFEQVRBX0NPVU5UXTsKKyAgZ3JwY19hdXRoX21ldGFkYXRhX2NvbnRleHQgYXV0aF9tZF9jb250ZXh0OworfSBjYWxsX2RhdGE7CisKKy8qIFdlIGNhbiBoYXZlIGEgcGVyLWNoYW5uZWwgY3JlZGVudGlhbHMuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNlY3VyaXR5X2Nvbm5lY3RvcjsKKyAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dDsKK30gY2hhbm5lbF9kYXRhOworCitzdGF0aWMgdm9pZCByZXNldF9hdXRoX21ldGFkYXRhX2NvbnRleHQoCisgICAgZ3JwY19hdXRoX21ldGFkYXRhX2NvbnRleHQgKmF1dGhfbWRfY29udGV4dCkgeworICBpZiAoYXV0aF9tZF9jb250ZXh0LT5zZXJ2aWNlX3VybCAhPSBOVUxMKSB7CisgICAgZ3ByX2ZyZWUoKGNoYXIgKilhdXRoX21kX2NvbnRleHQtPnNlcnZpY2VfdXJsKTsKKyAgICBhdXRoX21kX2NvbnRleHQtPnNlcnZpY2VfdXJsID0gTlVMTDsKKyAgfQorICBpZiAoYXV0aF9tZF9jb250ZXh0LT5tZXRob2RfbmFtZSAhPSBOVUxMKSB7CisgICAgZ3ByX2ZyZWUoKGNoYXIgKilhdXRoX21kX2NvbnRleHQtPm1ldGhvZF9uYW1lKTsKKyAgICBhdXRoX21kX2NvbnRleHQtPm1ldGhvZF9uYW1lID0gTlVMTDsKKyAgfQorICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRigKKyAgICAgIChncnBjX2F1dGhfY29udGV4dCAqKWF1dGhfbWRfY29udGV4dC0+Y2hhbm5lbF9hdXRoX2NvbnRleHQsCisgICAgICAiZ3JwY19hdXRoX21ldGFkYXRhX2NvbnRleHQiKTsKKyAgYXV0aF9tZF9jb250ZXh0LT5jaGFubmVsX2F1dGhfY29udGV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGJ1YmJsZV91cF9lcnJvcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMsIGNvbnN0IGNoYXIgKmVycm9yX21zZykgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBncHJfbG9nKEdQUl9FUlJPUiwgIkNsaWVudCBzaWRlIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmU6ICVzIiwgZXJyb3JfbXNnKTsKKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2FkZF9jYW5jZWxsYXRpb24oJmNhbGxkLT5vcCwgc3RhdHVzKTsKKyAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sICZjYWxsZC0+b3ApOworfQorCitzdGF0aWMgdm9pZCBvbl9jcmVkZW50aWFsc19tZXRhZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZCAqbWRfZWxlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19zdGF0dXMgc3RhdHVzKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gKGdycGNfY2FsbF9lbGVtZW50ICopdXNlcl9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wID0gJmNhbGxkLT5vcDsKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqbWRiOworICBzaXplX3QgaTsKKyAgcmVzZXRfYXV0aF9tZXRhZGF0YV9jb250ZXh0KCZjYWxsZC0+YXV0aF9tZF9jb250ZXh0KTsKKyAgaWYgKHN0YXR1cyAhPSBHUlBDX0NSRURFTlRJQUxTX09LKSB7CisgICAgYnViYmxlX3VwX2Vycm9yKGV4ZWNfY3R4LCBlbGVtLCBHUlBDX1NUQVRVU19VTkFVVEhFTlRJQ0FURUQsCisgICAgICAgICAgICAgICAgICAgICJDcmVkZW50aWFscyBmYWlsZWQgdG8gZ2V0IG1ldGFkYXRhLiIpOworICAgIHJldHVybjsKKyAgfQorICBHUFJfQVNTRVJUKG51bV9tZCA8PSBNQVhfQ1JFREVOVElBTFNfTUVUQURBVEFfQ09VTlQpOworICBHUFJfQVNTRVJUKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCk7CisgIG1kYiA9IG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fbWQ7IGkrKykgeworICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwoCisgICAgICAgIG1kYiwgJmNhbGxkLT5tZF9saW5rc1tpXSwKKyAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9zbGljZXMoZ3ByX3NsaWNlX3JlZihtZF9lbGVtc1tpXS5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfcmVmKG1kX2VsZW1zW2ldLnZhbHVlKSkpOworICB9CisgIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Cit9CisKK3ZvaWQgYnVpbGRfYXV0aF9tZXRhZGF0YV9jb250ZXh0KGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX2RhdGEgKmNhbGxkKSB7CisgIGNoYXIgKnNlcnZpY2UgPSBncHJfc3RyZHVwKGdycGNfbWRzdHJfYXNfY19zdHJpbmcoY2FsbGQtPm1ldGhvZCkpOworICBjaGFyICpsYXN0X3NsYXNoID0gc3RycmNocihzZXJ2aWNlLCAnLycpOworICBjaGFyICptZXRob2RfbmFtZSA9IE5VTEw7CisgIGNoYXIgKnNlcnZpY2VfdXJsID0gTlVMTDsKKyAgcmVzZXRfYXV0aF9tZXRhZGF0YV9jb250ZXh0KCZjYWxsZC0+YXV0aF9tZF9jb250ZXh0KTsKKyAgaWYgKGxhc3Rfc2xhc2ggPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTm8gJy8nIGZvdW5kIGluIGZ1bGx5IHF1YWxpZmllZCBtZXRob2QgbmFtZSIpOworICAgIHNlcnZpY2VbMF0gPSAnXDAnOworICB9IGVsc2UgaWYgKGxhc3Rfc2xhc2ggPT0gc2VydmljZSkgeworICAgIC8qIE5vIHNlcnZpY2UgcGFydCBpbiBmdWxseSBxdWFsaWZpZWQgbWV0aG9kIG5hbWU6IHdpbGwganVzdCBiZSAiLyIuICovCisgICAgc2VydmljZVsxXSA9ICdcMCc7CisgIH0gZWxzZSB7CisgICAgKmxhc3Rfc2xhc2ggPSAnXDAnOworICAgIG1ldGhvZF9uYW1lID0gZ3ByX3N0cmR1cChsYXN0X3NsYXNoICsgMSk7CisgIH0KKyAgaWYgKG1ldGhvZF9uYW1lID09IE5VTEwpIG1ldGhvZF9uYW1lID0gZ3ByX3N0cmR1cCgiIik7CisgIGdwcl9hc3ByaW50Zigmc2VydmljZV91cmwsICIlczovLyVzJXMiLAorICAgICAgICAgICAgICAgc2MtPnVybF9zY2hlbWUgPT0gTlVMTCA/ICIiIDogc2MtPnVybF9zY2hlbWUsCisgICAgICAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGNhbGxkLT5ob3N0KSwgc2VydmljZSk7CisgIGNhbGxkLT5hdXRoX21kX2NvbnRleHQuc2VydmljZV91cmwgPSBzZXJ2aWNlX3VybDsKKyAgY2FsbGQtPmF1dGhfbWRfY29udGV4dC5tZXRob2RfbmFtZSA9IG1ldGhvZF9uYW1lOworICBjYWxsZC0+YXV0aF9tZF9jb250ZXh0LmNoYW5uZWxfYXV0aF9jb250ZXh0ID0KKyAgICAgIEdSUENfQVVUSF9DT05URVhUX1JFRihhdXRoX2NvbnRleHQsICJncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCIpOworICBncHJfZnJlZShzZXJ2aWNlKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zZWN1cml0eV9tZXRhZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqY3R4ID0KKyAgICAgIChncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0ICopb3AtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZTsKKyAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjaGFubmVsX2NhbGxfY3JlZHMgPQorICAgICAgY2hhbmQtPnNlY3VyaXR5X2Nvbm5lY3Rvci0+cmVxdWVzdF9tZXRhZGF0YV9jcmVkczsKKyAgaW50IGNhbGxfY3JlZHNfaGFzX21kID0gKGN0eCAhPSBOVUxMKSAmJiAoY3R4LT5jcmVkcyAhPSBOVUxMKTsKKworICBpZiAoY2hhbm5lbF9jYWxsX2NyZWRzID09IE5VTEwgJiYgIWNhbGxfY3JlZHNfaGFzX21kKSB7CisgICAgLyogU2tpcCBzZW5kaW5nIG1ldGFkYXRhIGFsdG9nZXRoZXIuICovCisgICAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sIG9wKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY2hhbm5lbF9jYWxsX2NyZWRzICE9IE5VTEwgJiYgY2FsbF9jcmVkc19oYXNfbWQpIHsKKyAgICBjYWxsZC0+Y3JlZHMgPSBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX2NyZWF0ZShjaGFubmVsX2NhbGxfY3JlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jcmVkcywgTlVMTCk7CisgICAgaWYgKGNhbGxkLT5jcmVkcyA9PSBOVUxMKSB7CisgICAgICBidWJibGVfdXBfZXJyb3IoZXhlY19jdHgsIGVsZW0sIEdSUENfU1RBVFVTX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBhdGlibGUgY3JlZGVudGlhbHMgc2V0IG9uIGNoYW5uZWwgYW5kIGNhbGwuIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgeworICAgIGNhbGxkLT5jcmVkcyA9IGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWYoCisgICAgICAgIGNhbGxfY3JlZHNfaGFzX21kID8gY3R4LT5jcmVkcyA6IGNoYW5uZWxfY2FsbF9jcmVkcyk7CisgIH0KKworICBidWlsZF9hdXRoX21ldGFkYXRhX2NvbnRleHQoJmNoYW5kLT5zZWN1cml0eV9jb25uZWN0b3ItPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZC0+YXV0aF9jb250ZXh0LCBjYWxsZCk7CisgIGNhbGxkLT5vcCA9ICpvcDsgLyogQ29weSBvcCAob3JpZ2luYXRlcyBmcm9tIHRoZSBjYWxsZXIncyBzdGFjaykuICovCisgIEdQUl9BU1NFUlQoY2FsbGQtPnBvbGxzZXQpOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCisgICAgICBleGVjX2N0eCwgY2FsbGQtPmNyZWRzLCBjYWxsZC0+cG9sbHNldCwgY2FsbGQtPmF1dGhfbWRfY29udGV4dCwKKyAgICAgIG9uX2NyZWRlbnRpYWxzX21ldGFkYXRhLCBlbGVtKTsKK30KKworc3RhdGljIHZvaWQgb25faG9zdF9jaGVja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gKGdycGNfY2FsbF9lbGVtZW50ICopdXNlcl9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworCisgIGlmIChzdGF0dXMgPT0gR1JQQ19TRUNVUklUWV9PSykgeworICAgIHNlbmRfc2VjdXJpdHlfbWV0YWRhdGEoZXhlY19jdHgsIGVsZW0sICZjYWxsZC0+b3ApOworICB9IGVsc2UgeworICAgIGNoYXIgKmVycm9yX21zZzsKKyAgICBncHJfYXNwcmludGYoJmVycm9yX21zZywgIkludmFsaWQgaG9zdCAlcyBzZXQgaW4gOmF1dGhvcml0eSBtZXRhZGF0YS4iLAorICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGNhbGxkLT5ob3N0KSk7CisgICAgYnViYmxlX3VwX2Vycm9yKGV4ZWNfY3R4LCBlbGVtLCBHUlBDX1NUQVRVU19JTlRFUk5BTCwgZXJyb3JfbXNnKTsKKyAgICBncHJfZnJlZShlcnJvcl9tc2cpOworICB9Cit9CisKKy8qIENhbGxlZCBlaXRoZXI6CisgICAgIC0gaW4gcmVzcG9uc2UgdG8gYW4gQVBJIGNhbGwgKG9yIHNpbWlsYXIpIGZyb20gYWJvdmUsIHRvIHNlbmQgc29tZXRoaW5nCisgICAgIC0gYSBuZXR3b3JrIGV2ZW50IChvciBzaW1pbGFyKSBmcm9tIGJlbG93LCB0byByZWNlaXZlIHNvbWV0aGluZworICAgb3AgY29udGFpbnMgdHlwZSBhbmQgY2FsbCBkaXJlY3Rpb24gaW5mb3JtYXRpb24sIGluIGFkZGl0aW9uIHRvIHRoZSBkYXRhCisgICB0aGF0IGlzIGJlaW5nIHNlbnQgb3IgcmVjZWl2ZWQuICovCitzdGF0aWMgdm9pZCBhdXRoX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNhbGwgZWxlbWVudCAqLworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBncnBjX2xpbmtlZF9tZGVsZW0gKmw7CisgIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKnNlY19jdHggPSBOVUxMOworCisgIGlmIChjYWxsZC0+c2VjdXJpdHlfY29udGV4dF9zZXQgPT0gMCAmJgorICAgICAgb3AtPmNhbmNlbF93aXRoX3N0YXR1cyA9PSBHUlBDX1NUQVRVU19PSykgeworICAgIGNhbGxkLT5zZWN1cml0eV9jb250ZXh0X3NldCA9IDE7CisgICAgR1BSX0FTU0VSVChvcC0+Y29udGV4dCk7CisgICAgaWYgKG9wLT5jb250ZXh0W0dSUENfQ09OVEVYVF9TRUNVUklUWV0udmFsdWUgPT0gTlVMTCkgeworICAgICAgb3AtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZSA9CisgICAgICAgICAgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dF9jcmVhdGUoKTsKKyAgICAgIG9wLT5jb250ZXh0W0dSUENfQ09OVEVYVF9TRUNVUklUWV0uZGVzdHJveSA9CisgICAgICAgICAgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dF9kZXN0cm95OworICAgIH0KKyAgICBzZWNfY3R4ID0gb3AtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZTsKKyAgICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihzZWNfY3R4LT5hdXRoX2NvbnRleHQsICJjbGllbnQgYXV0aCBmaWx0ZXIiKTsKKyAgICBzZWNfY3R4LT5hdXRoX2NvbnRleHQgPQorICAgICAgICBHUlBDX0FVVEhfQ09OVEVYVF9SRUYoY2hhbmQtPmF1dGhfY29udGV4dCwgImNsaWVudF9hdXRoX2ZpbHRlciIpOworICB9CisKKyAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIGZvciAobCA9IG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEtPmxpc3QuaGVhZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgICAgZ3JwY19tZGVsZW0gKm1kID0gbC0+bWQ7CisgICAgICAvKiBQb2ludGVyIGNvbXBhcmlzb24gaXMgT0sgZm9yIG1kX2VsZW1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBjb250ZXh0LgorICAgICAgICovCisgICAgICBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0FVVEhPUklUWSkgeworICAgICAgICBpZiAoY2FsbGQtPmhvc3QgIT0gTlVMTCkgR1JQQ19NRFNUUl9VTlJFRihjYWxsZC0+aG9zdCk7CisgICAgICAgIGNhbGxkLT5ob3N0ID0gR1JQQ19NRFNUUl9SRUYobWQtPnZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX1BBVEgpIHsKKyAgICAgICAgaWYgKGNhbGxkLT5tZXRob2QgIT0gTlVMTCkgR1JQQ19NRFNUUl9VTlJFRihjYWxsZC0+bWV0aG9kKTsKKyAgICAgICAgY2FsbGQtPm1ldGhvZCA9IEdSUENfTURTVFJfUkVGKG1kLT52YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChjYWxsZC0+aG9zdCAhPSBOVUxMKSB7CisgICAgICBjb25zdCBjaGFyICpjYWxsX2hvc3QgPSBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGNhbGxkLT5ob3N0KTsKKyAgICAgIGNhbGxkLT5vcCA9ICpvcDsgLyogQ29weSBvcCAob3JpZ2luYXRlcyBmcm9tIHRoZSBjYWxsZXIncyBzdGFjaykuICovCisgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NoZWNrX2NhbGxfaG9zdCgKKyAgICAgICAgICBleGVjX2N0eCwgY2hhbmQtPnNlY3VyaXR5X2Nvbm5lY3RvciwgY2FsbF9ob3N0LCBjaGFuZC0+YXV0aF9jb250ZXh0LAorICAgICAgICAgIG9uX2hvc3RfY2hlY2tlZCwgZWxlbSk7CisgICAgICByZXR1cm47IC8qIGVhcmx5IGV4aXQgKi8KKyAgICB9CisgIH0KKworICAvKiBwYXNzIGNvbnRyb2wgZG93biB0aGUgc3RhY2sgKi8KKyAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sIG9wKTsKK30KKworLyogQ29uc3RydWN0b3IgZm9yIGNhbGxfZGF0YSAqLworc3RhdGljIHZvaWQgaW5pdF9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncykgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBtZW1zZXQoY2FsbGQsIDAsIHNpemVvZigqY2FsbGQpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGNhbGxkLT5wb2xsc2V0ID0gcG9sbHNldDsKK30KKworLyogRGVzdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihjYWxsZC0+Y3JlZHMpOworICBpZiAoY2FsbGQtPmhvc3QgIT0gTlVMTCkgeworICAgIEdSUENfTURTVFJfVU5SRUYoY2FsbGQtPmhvc3QpOworICB9CisgIGlmIChjYWxsZC0+bWV0aG9kICE9IE5VTEwpIHsKKyAgICBHUlBDX01EU1RSX1VOUkVGKGNhbGxkLT5tZXRob2QpOworICB9CisgIHJlc2V0X2F1dGhfbWV0YWRhdGFfY29udGV4dCgmY2FsbGQtPmF1dGhfbWRfY29udGV4dCk7Cit9CisKKy8qIENvbnN0cnVjdG9yIGZvciBjaGFubmVsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYyA9CisgICAgICBncnBjX2ZpbmRfc2VjdXJpdHlfY29ubmVjdG9yX2luX2FyZ3MoYXJncy0+Y2hhbm5lbF9hcmdzKTsKKyAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCA9CisgICAgICBncnBjX2ZpbmRfYXV0aF9jb250ZXh0X2luX2FyZ3MoYXJncy0+Y2hhbm5lbF9hcmdzKTsKKworICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNoYW5uZWwgZWxlbWVudCAqLworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworCisgIC8qIFRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgZmlsdGVycyB0ZW5kIHRvIGJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IHRvCisgICAgIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHRoZXJlJ3Mgbm8gJ25leHQnIGZpbHRlciB0byBjYWxsIG9uIHRoZSB1cCBvciBkb3duCisgICAgIHBhdGggKi8KKyAgR1BSX0FTU0VSVCghYXJncy0+aXNfbGFzdCk7CisgIEdQUl9BU1NFUlQoc2MgIT0gTlVMTCk7CisgIEdQUl9BU1NFUlQoYXV0aF9jb250ZXh0ICE9IE5VTEwpOworCisgIC8qIGluaXRpYWxpemUgbWVtYmVycyAqLworICBjaGFuZC0+c2VjdXJpdHlfY29ubmVjdG9yID0KKyAgICAgIChncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKAorICAgICAgICAgIHNjLCAiY2xpZW50X2F1dGhfZmlsdGVyIik7CisgIGNoYW5kLT5hdXRoX2NvbnRleHQgPQorICAgICAgR1JQQ19BVVRIX0NPTlRFWFRfUkVGKGF1dGhfY29udGV4dCwgImNsaWVudF9hdXRoX2ZpbHRlciIpOworfQorCisvKiBEZXN0cnVjdG9yIGZvciBjaGFubmVsIGRhdGEgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHsKKyAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjaGFubmVsIGVsZW1lbnQgKi8KKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MgPSBjaGFuZC0+c2VjdXJpdHlfY29ubmVjdG9yOworICBpZiAoc2MgIT0gTlVMTCkgeworICAgIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1VOUkVGKCZzYy0+YmFzZSwgImNsaWVudF9hdXRoX2ZpbHRlciIpOworICB9CisgIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKGNoYW5kLT5hdXRoX2NvbnRleHQsICJjbGllbnRfYXV0aF9maWx0ZXIiKTsKK30KKworY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX2NsaWVudF9hdXRoX2ZpbHRlciA9IHsKKyAgICBhdXRoX3N0YXJ0X3RyYW5zcG9ydF9vcCwgZ3JwY19jaGFubmVsX25leHRfb3AsIHNpemVvZihjYWxsX2RhdGEpLAorICAgIGluaXRfY2FsbF9lbGVtLCAgICAgICAgICBzZXRfcG9sbHNldCwgICAgICAgICAgZGVzdHJveV9jYWxsX2VsZW0sCisgICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksICAgIGluaXRfY2hhbm5lbF9lbGVtLCAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKKyAgICBncnBjX2NhbGxfbmV4dF9nZXRfcGVlciwgImNsaWVudC1hdXRoIn07CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTA3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYwpAQCAtMCwwICsxLDEyODEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworLyogLS0gQ29tbW9uLiAtLSAqLworCitzdHJ1Y3QgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0IHsKKyAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkczsKKyAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYjsKKyAgdm9pZCAqdXNlcl9kYXRhOworfTsKKworc3RhdGljIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqCitncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3RfY3JlYXRlKGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKnIgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0KSk7CisgIHItPmNyZWRzID0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihjcmVkcyk7CisgIHItPmNiID0gY2I7CisgIHItPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdF9kZXN0cm95KAorICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqcikgeworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoci0+Y3JlZHMpOworICBncHJfZnJlZShyKTsKK30KKworZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfcmVmKAorICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybiBOVUxMOworICBncHJfcmVmKCZjcmVkcy0+cmVmY291bnQpOworICByZXR1cm4gY3JlZHM7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3VucmVmKGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybjsKKyAgaWYgKGdwcl91bnJlZigmY3JlZHMtPnJlZmNvdW50KSkgeworICAgIGlmIChjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdCAhPSBOVUxMKSBjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdChjcmVkcyk7CisgICAgZ3ByX2ZyZWUoY3JlZHMpOworICB9Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlbGVhc2UoZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlbGVhc2UoY3JlZHM9JXApIiwgMSwgKGNyZWRzKSk7CisgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc191bnJlZihjcmVkcyk7Cit9CisKK2dycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7CisgIGlmIChjcmVkcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZ3ByX3JlZigmY3JlZHMtPnJlZmNvdW50KTsKKyAgcmV0dXJuIGNyZWRzOworfQorCit2b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7CisgIGlmIChjcmVkcyA9PSBOVUxMKSByZXR1cm47CisgIGlmIChncHJfdW5yZWYoJmNyZWRzLT5yZWZjb3VudCkpIHsKKyAgICBpZiAoY3JlZHMtPnZ0YWJsZS0+ZGVzdHJ1Y3QgIT0gTlVMTCkgY3JlZHMtPnZ0YWJsZS0+ZGVzdHJ1Y3QoY3JlZHMpOworICAgIGdwcl9mcmVlKGNyZWRzKTsKKyAgfQorfQorCit2b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWxlYXNlKGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9jcmVkZW50aWFsc19yZWxlYXNlKGNyZWRzPSVwKSIsIDEsIChjcmVkcykpOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoY3JlZHMpOworfQorCit2b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc19nZXRfcmVxdWVzdF9tZXRhZGF0YSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywKKyAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCisgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChjcmVkcyA9PSBOVUxMIHx8IGNyZWRzLT52dGFibGUtPmdldF9yZXF1ZXN0X21ldGFkYXRhID09IE5VTEwpIHsKKyAgICBpZiAoY2IgIT0gTlVMTCkgeworICAgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgTlVMTCwgMCwgR1JQQ19DUkVERU5USUFMU19PSyk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBjcmVkcy0+dnRhYmxlLT5nZXRfcmVxdWVzdF9tZXRhZGF0YShleGVjX2N0eCwgY3JlZHMsIHBvbGxzZXQsIGNvbnRleHQsIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEpOworfQorCitncnBjX3NlY3VyaXR5X3N0YXR1cyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKKyAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNoYW5uZWxfY3JlZHMsIGNvbnN0IGNoYXIgKnRhcmdldCwKKyAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncywgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjLAorICAgIGdycGNfY2hhbm5lbF9hcmdzICoqbmV3X2FyZ3MpIHsKKyAgKm5ld19hcmdzID0gTlVMTDsKKyAgaWYgKGNoYW5uZWxfY3JlZHMgPT0gTlVMTCkgeworICAgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOworICB9CisgIEdQUl9BU1NFUlQoY2hhbm5lbF9jcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yICE9IE5VTEwpOworICByZXR1cm4gY2hhbm5lbF9jcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAorICAgICAgY2hhbm5lbF9jcmVkcywgTlVMTCwgdGFyZ2V0LCBhcmdzLCBzYywgbmV3X2FyZ3MpOworfQorCitncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVmKAorICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBpZiAoY3JlZHMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGdwcl9yZWYoJmNyZWRzLT5yZWZjb3VudCk7CisgIHJldHVybiBjcmVkczsKK30KKwordm9pZCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc191bnJlZihncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybjsKKyAgaWYgKGdwcl91bnJlZigmY3JlZHMtPnJlZmNvdW50KSkgeworICAgIGlmIChjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdCAhPSBOVUxMKSBjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdChjcmVkcyk7CisgICAgaWYgKGNyZWRzLT5wcm9jZXNzb3IuZGVzdHJveSAhPSBOVUxMICYmIGNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUgIT0gTlVMTCkgeworICAgICAgY3JlZHMtPnByb2Nlc3Nvci5kZXN0cm95KGNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUpOworICAgIH0KKyAgICBncHJfZnJlZShjcmVkcyk7CisgIH0KK30KKwordm9pZCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc19yZWxlYXNlKGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVsZWFzZShjcmVkcz0lcCkiLCAxLCAoY3JlZHMpKTsKKyAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdW5yZWYoY3JlZHMpOworfQorCitncnBjX3NlY3VyaXR5X3N0YXR1cyBncnBjX3NlcnZlcl9jcmVkZW50aWFsc19jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAorICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcywgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKKyAgaWYgKGNyZWRzID09IE5VTEwgfHwgY3JlZHMtPnZ0YWJsZS0+Y3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvciA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJTZXJ2ZXIgY3JlZGVudGlhbHMgY2Fubm90IGNyZWF0ZSBzZWN1cml0eSBjb250ZXh0LiIpOworICAgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOworICB9CisgIHJldHVybiBjcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKGNyZWRzLCBzYyk7Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfc2V0X2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yKAorICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcywgZ3JwY19hdXRoX21ldGFkYXRhX3Byb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfc2V0X2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yKCIKKyAgICAgICJjcmVkcz0lcCwgIgorICAgICAgInByb2Nlc3Nvcj1ncnBjX2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yIHsgcHJvY2VzczogJXAsIHN0YXRlOiAlcCB9KSIsCisgICAgICAzLCAoY3JlZHMsICh2b2lkICopKGludHB0cl90KXByb2Nlc3Nvci5wcm9jZXNzLCBwcm9jZXNzb3Iuc3RhdGUpKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybjsKKyAgaWYgKGNyZWRzLT5wcm9jZXNzb3IuZGVzdHJveSAhPSBOVUxMICYmIGNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUgIT0gTlVMTCkgeworICAgIGNyZWRzLT5wcm9jZXNzb3IuZGVzdHJveShjcmVkcy0+cHJvY2Vzc29yLnN0YXRlKTsKKyAgfQorICBjcmVkcy0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOworfQorCitzdGF0aWMgdm9pZCBzZXJ2ZXJfY3JlZGVudGlhbHNfcG9pbnRlcl9hcmdfZGVzdHJveSh2b2lkICpwKSB7CisgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3VucmVmKHApOworfQorCitzdGF0aWMgdm9pZCAqc2VydmVyX2NyZWRlbnRpYWxzX3BvaW50ZXJfYXJnX2NvcHkodm9pZCAqcCkgeworICByZXR1cm4gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVmKHApOworfQorCitzdGF0aWMgaW50IHNlcnZlcl9jcmVkZW50aWFsc19wb2ludGVyX2NtcCh2b2lkICphLCB2b2lkICpiKSB7CisgIHJldHVybiBHUFJfSUNNUChhLCBiKTsKK30KKworc3RhdGljIGNvbnN0IGdycGNfYXJnX3BvaW50ZXJfdnRhYmxlIGNyZWRfcHRyX3Z0YWJsZSA9IHsKKyAgICBzZXJ2ZXJfY3JlZGVudGlhbHNfcG9pbnRlcl9hcmdfY29weSwgc2VydmVyX2NyZWRlbnRpYWxzX3BvaW50ZXJfYXJnX2Rlc3Ryb3ksCisgICAgc2VydmVyX2NyZWRlbnRpYWxzX3BvaW50ZXJfY21wfTsKKworZ3JwY19hcmcgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdG9fYXJnKGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpwKSB7CisgIGdycGNfYXJnIGFyZzsKKyAgbWVtc2V0KCZhcmcsIDAsIHNpemVvZihncnBjX2FyZykpOworICBhcmcudHlwZSA9IEdSUENfQVJHX1BPSU5URVI7CisgIGFyZy5rZXkgPSBHUlBDX1NFUlZFUl9DUkVERU5USUFMU19BUkc7CisgIGFyZy52YWx1ZS5wb2ludGVyLnAgPSBwOworICBhcmcudmFsdWUucG9pbnRlci52dGFibGUgPSAmY3JlZF9wdHJfdnRhYmxlOworICByZXR1cm4gYXJnOworfQorCitncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZykgeworICBpZiAoc3RyY21wKGFyZy0+a2V5LCBHUlBDX1NFUlZFUl9DUkVERU5USUFMU19BUkcpICE9IDApIHJldHVybiBOVUxMOworICBpZiAoYXJnLT50eXBlICE9IEdSUENfQVJHX1BPSU5URVIpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgdHlwZSAlZCBmb3IgYXJnICVzIiwgYXJnLT50eXBlLAorICAgICAgICAgICAgR1JQQ19TRVJWRVJfQ1JFREVOVElBTFNfQVJHKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gYXJnLT52YWx1ZS5wb2ludGVyLnA7Cit9CisKK2dycGNfc2VydmVyX2NyZWRlbnRpYWxzICpncnBjX2ZpbmRfc2VydmVyX2NyZWRlbnRpYWxzX2luX2FyZ3MoCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpIHsKKyAgc2l6ZV90IGk7CisgIGlmIChhcmdzID09IE5VTEwpIHJldHVybiBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgeworICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpwID0KKyAgICAgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfZnJvbV9hcmcoJmFyZ3MtPmFyZ3NbaV0pOworICAgIGlmIChwICE9IE5VTEwpIHJldHVybiBwOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiAtLSBTc2wgY3JlZGVudGlhbHMuIC0tICovCisKK3N0YXRpYyB2b2lkIHNzbF9kZXN0cnVjdChncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNyZWRzKSB7CisgIGdycGNfc3NsX2NyZWRlbnRpYWxzICpjID0gKGdycGNfc3NsX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIGlmIChjLT5jb25maWcucGVtX3Jvb3RfY2VydHMgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9yb290X2NlcnRzKTsKKyAgaWYgKGMtPmNvbmZpZy5wZW1fcHJpdmF0ZV9rZXkgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleSk7CisgIGlmIChjLT5jb25maWcucGVtX2NlcnRfY2hhaW4gIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9jZXJ0X2NoYWluKTsKK30KKworc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9kZXN0cnVjdChncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzICpjID0gKGdycGNfc3NsX3NlcnZlcl9jcmVkZW50aWFscyAqKWNyZWRzOworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IGMtPmNvbmZpZy5udW1fa2V5X2NlcnRfcGFpcnM7IGkrKykgeworICAgIGlmIChjLT5jb25maWcucGVtX3ByaXZhdGVfa2V5c1tpXSAhPSBOVUxMKSB7CisgICAgICBncHJfZnJlZShjLT5jb25maWcucGVtX3ByaXZhdGVfa2V5c1tpXSk7CisgICAgfQorICAgIGlmIChjLT5jb25maWcucGVtX2NlcnRfY2hhaW5zW2ldICE9IE5VTEwpIHsKKyAgICAgIGdwcl9mcmVlKGMtPmNvbmZpZy5wZW1fY2VydF9jaGFpbnNbaV0pOworICAgIH0KKyAgfQorICBpZiAoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleXMgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleXMpOworICBpZiAoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleXNfc2l6ZXMgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKGMtPmNvbmZpZy5wZW1fcHJpdmF0ZV9rZXlzX3NpemVzKTsKKyAgfQorICBpZiAoYy0+Y29uZmlnLnBlbV9jZXJ0X2NoYWlucyAhPSBOVUxMKSBncHJfZnJlZShjLT5jb25maWcucGVtX2NlcnRfY2hhaW5zKTsKKyAgaWYgKGMtPmNvbmZpZy5wZW1fY2VydF9jaGFpbnNfc2l6ZXMgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKGMtPmNvbmZpZy5wZW1fY2VydF9jaGFpbnNfc2l6ZXMpOworICB9CisgIGlmIChjLT5jb25maWcucGVtX3Jvb3RfY2VydHMgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9yb290X2NlcnRzKTsKK30KKworc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzIHNzbF9jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAorICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKKyAgICBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYywgZ3JwY19jaGFubmVsX2FyZ3MgKipuZXdfYXJncykgeworICBncnBjX3NzbF9jcmVkZW50aWFscyAqYyA9IChncnBjX3NzbF9jcmVkZW50aWFscyAqKWNyZWRzOworICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX09LOworICBzaXplX3QgaSA9IDA7CisgIGNvbnN0IGNoYXIgKm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUgPSBOVUxMOworICBncnBjX2FyZyBuZXdfYXJnOworCisgIGZvciAoaSA9IDA7IGFyZ3MgJiYgaSA8IGFyZ3MtPm51bV9hcmdzOyBpKyspIHsKKyAgICBncnBjX2FyZyAqYXJnID0gJmFyZ3MtPmFyZ3NbaV07CisgICAgaWYgKHN0cmNtcChhcmctPmtleSwgR1JQQ19TU0xfVEFSR0VUX05BTUVfT1ZFUlJJREVfQVJHKSA9PSAwICYmCisgICAgICAgIGFyZy0+dHlwZSA9PSBHUlBDX0FSR19TVFJJTkcpIHsKKyAgICAgIG92ZXJyaWRkZW5fdGFyZ2V0X25hbWUgPSBhcmctPnZhbHVlLnN0cmluZzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzdGF0dXMgPSBncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCisgICAgICBjYWxsX2NyZWRzLCAmYy0+Y29uZmlnLCB0YXJnZXQsIG92ZXJyaWRkZW5fdGFyZ2V0X25hbWUsIHNjKTsKKyAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorICBuZXdfYXJnLnR5cGUgPSBHUlBDX0FSR19TVFJJTkc7CisgIG5ld19hcmcua2V5ID0gR1JQQ19BUkdfSFRUUDJfU0NIRU1FOworICBuZXdfYXJnLnZhbHVlLnN0cmluZyA9ICJodHRwcyI7CisgICpuZXdfYXJncyA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHlfYW5kX2FkZChhcmdzLCAmbmV3X2FyZywgMSk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBncnBjX3NlY3VyaXR5X3N0YXR1cyBzc2xfc2VydmVyX2NyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IoCisgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzLCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKipzYykgeworICBncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIHJldHVybiBncnBjX3NzbF9zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgmYy0+Y29uZmlnLCBzYyk7Cit9CisKK3N0YXRpYyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdnRhYmxlIHNzbF92dGFibGUgPSB7CisgICAgc3NsX2Rlc3RydWN0LCBzc2xfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07CisKK3N0YXRpYyBncnBjX3NlcnZlcl9jcmVkZW50aWFsc192dGFibGUgc3NsX3NlcnZlcl92dGFibGUgPSB7CisgICAgc3NsX3NlcnZlcl9kZXN0cnVjdCwgc3NsX3NlcnZlcl9jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yfTsKKworc3RhdGljIHZvaWQgc3NsX2NvcHlfa2V5X21hdGVyaWFsKGNvbnN0IGNoYXIgKmlucHV0LCB1bnNpZ25lZCBjaGFyICoqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0cHV0X3NpemUpIHsKKyAgKm91dHB1dF9zaXplID0gc3RybGVuKGlucHV0KTsKKyAgKm91dHB1dCA9IGdwcl9tYWxsb2MoKm91dHB1dF9zaXplKTsKKyAgbWVtY3B5KCpvdXRwdXQsIGlucHV0LCAqb3V0cHV0X3NpemUpOworfQorCitzdGF0aWMgdm9pZCBzc2xfYnVpbGRfY29uZmlnKGNvbnN0IGNoYXIgKnBlbV9yb290X2NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NzbF9wZW1fa2V5X2NlcnRfcGFpciAqcGVtX2tleV9jZXJ0X3BhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3NsX2NvbmZpZyAqY29uZmlnKSB7CisgIGlmIChwZW1fcm9vdF9jZXJ0cyAhPSBOVUxMKSB7CisgICAgc3NsX2NvcHlfa2V5X21hdGVyaWFsKHBlbV9yb290X2NlcnRzLCAmY29uZmlnLT5wZW1fcm9vdF9jZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX3Jvb3RfY2VydHNfc2l6ZSk7CisgIH0KKyAgaWYgKHBlbV9rZXlfY2VydF9wYWlyICE9IE5VTEwpIHsKKyAgICBHUFJfQVNTRVJUKHBlbV9rZXlfY2VydF9wYWlyLT5wcml2YXRlX2tleSAhPSBOVUxMKTsKKyAgICBHUFJfQVNTRVJUKHBlbV9rZXlfY2VydF9wYWlyLT5jZXJ0X2NoYWluICE9IE5VTEwpOworICAgIHNzbF9jb3B5X2tleV9tYXRlcmlhbChwZW1fa2V5X2NlcnRfcGFpci0+cHJpdmF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBlbV9wcml2YXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX3ByaXZhdGVfa2V5X3NpemUpOworICAgIHNzbF9jb3B5X2tleV9tYXRlcmlhbChwZW1fa2V5X2NlcnRfcGFpci0+Y2VydF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX2NlcnRfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBlbV9jZXJ0X2NoYWluX3NpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNzbF9idWlsZF9zZXJ2ZXJfY29uZmlnKAorICAgIGNvbnN0IGNoYXIgKnBlbV9yb290X2NlcnRzLCBncnBjX3NzbF9wZW1fa2V5X2NlcnRfcGFpciAqcGVtX2tleV9jZXJ0X3BhaXJzLAorICAgIHNpemVfdCBudW1fa2V5X2NlcnRfcGFpcnMsIGludCBmb3JjZV9jbGllbnRfYXV0aCwKKyAgICBncnBjX3NzbF9zZXJ2ZXJfY29uZmlnICpjb25maWcpIHsKKyAgc2l6ZV90IGk7CisgIGNvbmZpZy0+Zm9yY2VfY2xpZW50X2F1dGggPSBmb3JjZV9jbGllbnRfYXV0aDsKKyAgaWYgKHBlbV9yb290X2NlcnRzICE9IE5VTEwpIHsKKyAgICBzc2xfY29weV9rZXlfbWF0ZXJpYWwocGVtX3Jvb3RfY2VydHMsICZjb25maWctPnBlbV9yb290X2NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5wZW1fcm9vdF9jZXJ0c19zaXplKTsKKyAgfQorICBpZiAobnVtX2tleV9jZXJ0X3BhaXJzID4gMCkgeworICAgIEdQUl9BU1NFUlQocGVtX2tleV9jZXJ0X3BhaXJzICE9IE5VTEwpOworICAgIGNvbmZpZy0+cGVtX3ByaXZhdGVfa2V5cyA9CisgICAgICAgIGdwcl9tYWxsb2MobnVtX2tleV9jZXJ0X3BhaXJzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikpOworICAgIGNvbmZpZy0+cGVtX2NlcnRfY2hhaW5zID0KKyAgICAgICAgZ3ByX21hbGxvYyhudW1fa2V5X2NlcnRfcGFpcnMgKiBzaXplb2YodW5zaWduZWQgY2hhciAqKSk7CisgICAgY29uZmlnLT5wZW1fcHJpdmF0ZV9rZXlzX3NpemVzID0KKyAgICAgICAgZ3ByX21hbGxvYyhudW1fa2V5X2NlcnRfcGFpcnMgKiBzaXplb2Yoc2l6ZV90KSk7CisgICAgY29uZmlnLT5wZW1fY2VydF9jaGFpbnNfc2l6ZXMgPQorICAgICAgICBncHJfbWFsbG9jKG51bV9rZXlfY2VydF9wYWlycyAqIHNpemVvZihzaXplX3QpKTsKKyAgfQorICBjb25maWctPm51bV9rZXlfY2VydF9wYWlycyA9IG51bV9rZXlfY2VydF9wYWlyczsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9rZXlfY2VydF9wYWlyczsgaSsrKSB7CisgICAgR1BSX0FTU0VSVChwZW1fa2V5X2NlcnRfcGFpcnNbaV0ucHJpdmF0ZV9rZXkgIT0gTlVMTCk7CisgICAgR1BSX0FTU0VSVChwZW1fa2V5X2NlcnRfcGFpcnNbaV0uY2VydF9jaGFpbiAhPSBOVUxMKTsKKyAgICBzc2xfY29weV9rZXlfbWF0ZXJpYWwocGVtX2tleV9jZXJ0X3BhaXJzW2ldLnByaXZhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5wZW1fcHJpdmF0ZV9rZXlzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5wZW1fcHJpdmF0ZV9rZXlzX3NpemVzW2ldKTsKKyAgICBzc2xfY29weV9rZXlfbWF0ZXJpYWwocGVtX2tleV9jZXJ0X3BhaXJzW2ldLmNlcnRfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBlbV9jZXJ0X2NoYWluc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX2NlcnRfY2hhaW5zX3NpemVzW2ldKTsKKyAgfQorfQorCitncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmdycGNfc3NsX2NyZWRlbnRpYWxzX2NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICpwZW1fcm9vdF9jZXJ0cywgZ3JwY19zc2xfcGVtX2tleV9jZXJ0X3BhaXIgKnBlbV9rZXlfY2VydF9wYWlyLAorICAgIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfc3NsX2NyZWRlbnRpYWxzICpjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zc2xfY3JlZGVudGlhbHMpKTsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19zc2xfY3JlZGVudGlhbHNfY3JlYXRlKHBlbV9yb290X2NlcnRzPSVzLCAiCisgICAgICAicGVtX2tleV9jZXJ0X3BhaXI9JXAsICIKKyAgICAgICJyZXNlcnZlZD0lcCkiLAorICAgICAgMywgKHBlbV9yb290X2NlcnRzLCBwZW1fa2V5X2NlcnRfcGFpciwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9jcmVkZW50aWFscykpOworICBjLT5iYXNlLnR5cGUgPSBHUlBDX0NIQU5ORUxfQ1JFREVOVElBTFNfVFlQRV9TU0w7CisgIGMtPmJhc2UudnRhYmxlID0gJnNzbF92dGFibGU7CisgIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7CisgIHNzbF9idWlsZF9jb25maWcocGVtX3Jvb3RfY2VydHMsIHBlbV9rZXlfY2VydF9wYWlyLCAmYy0+Y29uZmlnKTsKKyAgcmV0dXJuICZjLT5iYXNlOworfQorCitncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICpwZW1fcm9vdF9jZXJ0cywgZ3JwY19zc2xfcGVtX2tleV9jZXJ0X3BhaXIgKnBlbV9rZXlfY2VydF9wYWlycywKKyAgICBzaXplX3QgbnVtX2tleV9jZXJ0X3BhaXJzLCBpbnQgZm9yY2VfY2xpZW50X2F1dGgsIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfc3NsX3NlcnZlcl9jcmVkZW50aWFscyAqYyA9CisgICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHMpKTsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZSgiCisgICAgICAicGVtX3Jvb3RfY2VydHM9JXMsIHBlbV9rZXlfY2VydF9wYWlycz0lcCwgbnVtX2tleV9jZXJ0X3BhaXJzPSVsdSwgIgorICAgICAgImZvcmNlX2NsaWVudF9hdXRoPSVkLCByZXNlcnZlZD0lcCkiLAorICAgICAgNSwgKHBlbV9yb290X2NlcnRzLCBwZW1fa2V5X2NlcnRfcGFpcnMsICh1bnNpZ25lZCBsb25nKW51bV9rZXlfY2VydF9wYWlycywKKyAgICAgICAgICBmb3JjZV9jbGllbnRfYXV0aCwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHMpKTsKKyAgYy0+YmFzZS50eXBlID0gR1JQQ19DSEFOTkVMX0NSRURFTlRJQUxTX1RZUEVfU1NMOworICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOworICBjLT5iYXNlLnZ0YWJsZSA9ICZzc2xfc2VydmVyX3Z0YWJsZTsKKyAgc3NsX2J1aWxkX3NlcnZlcl9jb25maWcocGVtX3Jvb3RfY2VydHMsIHBlbV9rZXlfY2VydF9wYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2tleV9jZXJ0X3BhaXJzLCBmb3JjZV9jbGllbnRfYXV0aCwgJmMtPmNvbmZpZyk7CisgIHJldHVybiAmYy0+YmFzZTsKK30KKworLyogLS0gSnd0IGNyZWRlbnRpYWxzIC0tICovCisKK3N0YXRpYyB2b2lkIGp3dF9yZXNldF9jYWNoZShncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzICpjKSB7CisgIGlmIChjLT5jYWNoZWQuand0X21kICE9IE5VTEwpIHsKKyAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGMtPmNhY2hlZC5qd3RfbWQpOworICAgIGMtPmNhY2hlZC5qd3RfbWQgPSBOVUxMOworICB9CisgIGlmIChjLT5jYWNoZWQuc2VydmljZV91cmwgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKGMtPmNhY2hlZC5zZXJ2aWNlX3VybCk7CisgICAgYy0+Y2FjaGVkLnNlcnZpY2VfdXJsID0gTlVMTDsKKyAgfQorICBjLT5jYWNoZWQuand0X2V4cGlyYXRpb24gPSBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX1JFQUxUSU1FKTsKK30KKworc3RhdGljIHZvaWQgand0X2Rlc3RydWN0KGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqYyA9CisgICAgICAoZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqKWNyZWRzOworICBncnBjX2F1dGhfanNvbl9rZXlfZGVzdHJ1Y3QoJmMtPmtleSk7CisgIGp3dF9yZXNldF9jYWNoZShjKTsKKyAgZ3ByX211X2Rlc3Ryb3koJmMtPmNhY2hlX211KTsKK30KKworc3RhdGljIHZvaWQgand0X2dldF9yZXF1ZXN0X21ldGFkYXRhKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqYyA9CisgICAgICAoZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqKWNyZWRzOworICBncHJfdGltZXNwZWMgcmVmcmVzaF90aHJlc2hvbGQgPSBncHJfdGltZV9mcm9tX3NlY29uZHMoCisgICAgICBHUlBDX1NFQ1VSRV9UT0tFTl9SRUZSRVNIX1RIUkVTSE9MRF9TRUNTLCBHUFJfVElNRVNQQU4pOworCisgIC8qIFNlZSBpZiB3ZSBjYW4gcmV0dXJuIGEgY2FjaGVkIGp3dC4gKi8KKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqand0X21kID0gTlVMTDsKKyAgeworICAgIGdwcl9tdV9sb2NrKCZjLT5jYWNoZV9tdSk7CisgICAgaWYgKGMtPmNhY2hlZC5zZXJ2aWNlX3VybCAhPSBOVUxMICYmCisgICAgICAgIHN0cmNtcChjLT5jYWNoZWQuc2VydmljZV91cmwsIGNvbnRleHQuc2VydmljZV91cmwpID09IDAgJiYKKyAgICAgICAgYy0+Y2FjaGVkLmp3dF9tZCAhPSBOVUxMICYmCisgICAgICAgIChncHJfdGltZV9jbXAoZ3ByX3RpbWVfc3ViKGMtPmNhY2hlZC5qd3RfZXhwaXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3RocmVzaG9sZCkgPiAwKSkgeworICAgICAgand0X21kID0gZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoYy0+Y2FjaGVkLmp3dF9tZCk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJmMtPmNhY2hlX211KTsKKyAgfQorCisgIGlmIChqd3RfbWQgPT0gTlVMTCkgeworICAgIGNoYXIgKmp3dCA9IE5VTEw7CisgICAgLyogR2VuZXJhdGUgYSBuZXcgand0LiAqLworICAgIGdwcl9tdV9sb2NrKCZjLT5jYWNoZV9tdSk7CisgICAgand0X3Jlc2V0X2NhY2hlKGMpOworICAgIGp3dCA9IGdycGNfand0X2VuY29kZV9hbmRfc2lnbigmYy0+a2V5LCBjb250ZXh0LnNlcnZpY2VfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5qd3RfbGlmZXRpbWUsIE5VTEwpOworICAgIGlmIChqd3QgIT0gTlVMTCkgeworICAgICAgY2hhciAqbWRfdmFsdWU7CisgICAgICBncHJfYXNwcmludGYoJm1kX3ZhbHVlLCAiQmVhcmVyICVzIiwgand0KTsKKyAgICAgIGdwcl9mcmVlKGp3dCk7CisgICAgICBjLT5jYWNoZWQuand0X2V4cGlyYXRpb24gPQorICAgICAgICAgIGdwcl90aW1lX2FkZChncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGMtPmp3dF9saWZldGltZSk7CisgICAgICBjLT5jYWNoZWQuc2VydmljZV91cmwgPSBncHJfc3RyZHVwKGNvbnRleHQuc2VydmljZV91cmwpOworICAgICAgYy0+Y2FjaGVkLmp3dF9tZCA9IGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfY3JlYXRlKDEpOworICAgICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoCisgICAgICAgICAgYy0+Y2FjaGVkLmp3dF9tZCwgR1JQQ19BVVRIT1JJWkFUSU9OX01FVEFEQVRBX0tFWSwgbWRfdmFsdWUpOworICAgICAgZ3ByX2ZyZWUobWRfdmFsdWUpOworICAgICAgand0X21kID0gZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoYy0+Y2FjaGVkLmp3dF9tZCk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJmMtPmNhY2hlX211KTsKKyAgfQorCisgIGlmIChqd3RfbWQgIT0gTlVMTCkgeworICAgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIGp3dF9tZC0+ZW50cmllcywgand0X21kLT5udW1fZW50cmllcywKKyAgICAgICBHUlBDX0NSRURFTlRJQUxTX09LKTsKKyAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGp3dF9tZCk7CisgIH0gZWxzZSB7CisgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgTlVMTCwgMCwgR1JQQ19DUkVERU5USUFMU19FUlJPUik7CisgIH0KK30KKworc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgand0X3Z0YWJsZSA9IHtqd3RfZGVzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp3dF9nZXRfcmVxdWVzdF9tZXRhZGF0YX07CisKK2dycGNfY2FsbF9jcmVkZW50aWFscyAqCitncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzX2NyZWF0ZV9mcm9tX2F1dGhfanNvbl9rZXkoCisgICAgZ3JwY19hdXRoX2pzb25fa2V5IGtleSwgZ3ByX3RpbWVzcGVjIHRva2VuX2xpZmV0aW1lKSB7CisgIGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHMgKmM7CisgIGlmICghZ3JwY19hdXRoX2pzb25fa2V5X2lzX3ZhbGlkKCZrZXkpKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGlucHV0IGZvciBqd3QgY3JlZGVudGlhbHMgY3JlYXRpb24iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscykpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHMpKTsKKyAgYy0+YmFzZS50eXBlID0gR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfSldUOworICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOworICBjLT5iYXNlLnZ0YWJsZSA9ICZqd3RfdnRhYmxlOworICBjLT5rZXkgPSBrZXk7CisgIGMtPmp3dF9saWZldGltZSA9IHRva2VuX2xpZmV0aW1lOworICBncHJfbXVfaW5pdCgmYy0+Y2FjaGVfbXUpOworICBqd3RfcmVzZXRfY2FjaGUoYyk7CisgIHJldHVybiAmYy0+YmFzZTsKK30KKworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzX2NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICpqc29uX2tleSwgZ3ByX3RpbWVzcGVjIHRva2VuX2xpZmV0aW1lLCB2b2lkICpyZXNlcnZlZCkgeworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzX2NyZWF0ZSgiCisgICAgICAianNvbl9rZXk9JXMsICIKKyAgICAgICJ0b2tlbl9saWZldGltZT0iCisgICAgICAiZ3ByX3RpbWVzcGVjIHsgdHZfc2VjOiAlbGxkLCB0dl9uc2VjOiAlZCwgY2xvY2tfdHlwZTogJWQgfSwgIgorICAgICAgInJlc2VydmVkPSVwKSIsCisgICAgICA1LAorICAgICAgKGpzb25fa2V5LCAobG9uZyBsb25nKXRva2VuX2xpZmV0aW1lLnR2X3NlYywgKGludCl0b2tlbl9saWZldGltZS50dl9uc2VjLAorICAgICAgIChpbnQpdG9rZW5fbGlmZXRpbWUuY2xvY2tfdHlwZSwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKKyAgcmV0dXJuIGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fYXV0aF9qc29uX2tleSgKKyAgICAgIGdycGNfYXV0aF9qc29uX2tleV9jcmVhdGVfZnJvbV9zdHJpbmcoanNvbl9rZXkpLCB0b2tlbl9saWZldGltZSk7Cit9CisKKy8qIC0tIE9hdXRoMlRva2VuRmV0Y2hlciBjcmVkZW50aWFscyAtLSAqLworCitzdGF0aWMgdm9pZCBvYXV0aDJfdG9rZW5fZmV0Y2hlcl9kZXN0cnVjdChncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7CisgIGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKmMgPQorICAgICAgKGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKiljcmVkczsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV91bnJlZihjLT5hY2Nlc3NfdG9rZW5fbWQpOworICBncHJfbXVfZGVzdHJveSgmYy0+bXUpOworICBncnBjX2h0dHBjbGlfY29udGV4dF9kZXN0cm95KCZjLT5odHRwY2xpX2NvbnRleHQpOworfQorCitncnBjX2NyZWRlbnRpYWxzX3N0YXR1cworZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFsc19wYXJzZV9zZXJ2ZXJfcmVzcG9uc2UoCisgICAgY29uc3QgZ3JwY19odHRwX3Jlc3BvbnNlICpyZXNwb25zZSwgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqKnRva2VuX21kLAorICAgIGdwcl90aW1lc3BlYyAqdG9rZW5fbGlmZXRpbWUpIHsKKyAgY2hhciAqbnVsbF90ZXJtaW5hdGVkX2JvZHkgPSBOVUxMOworICBjaGFyICpuZXdfYWNjZXNzX3Rva2VuID0gTlVMTDsKKyAgZ3JwY19jcmVkZW50aWFsc19zdGF0dXMgc3RhdHVzID0gR1JQQ19DUkVERU5USUFMU19PSzsKKyAgZ3JwY19qc29uICpqc29uID0gTlVMTDsKKworICBpZiAocmVzcG9uc2UgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiUmVjZWl2ZWQgTlVMTCByZXNwb25zZS4iKTsKKyAgICBzdGF0dXMgPSBHUlBDX0NSRURFTlRJQUxTX0VSUk9SOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKHJlc3BvbnNlLT5ib2R5X2xlbmd0aCA+IDApIHsKKyAgICBudWxsX3Rlcm1pbmF0ZWRfYm9keSA9IGdwcl9tYWxsb2MocmVzcG9uc2UtPmJvZHlfbGVuZ3RoICsgMSk7CisgICAgbnVsbF90ZXJtaW5hdGVkX2JvZHlbcmVzcG9uc2UtPmJvZHlfbGVuZ3RoXSA9ICdcMCc7CisgICAgbWVtY3B5KG51bGxfdGVybWluYXRlZF9ib2R5LCByZXNwb25zZS0+Ym9keSwgcmVzcG9uc2UtPmJvZHlfbGVuZ3RoKTsKKyAgfQorCisgIGlmIChyZXNwb25zZS0+c3RhdHVzICE9IDIwMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2FsbCB0byBodHRwIHNlcnZlciBlbmRlZCB3aXRoIGVycm9yICVkIFslc10uIiwKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zdGF0dXMsCisgICAgICAgICAgICBudWxsX3Rlcm1pbmF0ZWRfYm9keSAhPSBOVUxMID8gbnVsbF90ZXJtaW5hdGVkX2JvZHkgOiAiIik7CisgICAgc3RhdHVzID0gR1JQQ19DUkVERU5USUFMU19FUlJPUjsKKyAgICBnb3RvIGVuZDsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2pzb24gKmFjY2Vzc190b2tlbiA9IE5VTEw7CisgICAgZ3JwY19qc29uICp0b2tlbl90eXBlID0gTlVMTDsKKyAgICBncnBjX2pzb24gKmV4cGlyZXNfaW4gPSBOVUxMOworICAgIGdycGNfanNvbiAqcHRyOworICAgIGpzb24gPSBncnBjX2pzb25fcGFyc2Vfc3RyaW5nKG51bGxfdGVybWluYXRlZF9ib2R5KTsKKyAgICBpZiAoanNvbiA9PSBOVUxMKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBwYXJzZSBKU09OIGZyb20gJXMiLCBudWxsX3Rlcm1pbmF0ZWRfYm9keSk7CisgICAgICBzdGF0dXMgPSBHUlBDX0NSRURFTlRJQUxTX0VSUk9SOworICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmIChqc29uLT50eXBlICE9IEdSUENfSlNPTl9PQkpFQ1QpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiUmVzcG9uc2Ugc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QiKTsKKyAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZm9yIChwdHIgPSBqc29uLT5jaGlsZDsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKKyAgICAgIGlmIChzdHJjbXAocHRyLT5rZXksICJhY2Nlc3NfdG9rZW4iKSA9PSAwKSB7CisgICAgICAgIGFjY2Vzc190b2tlbiA9IHB0cjsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHB0ci0+a2V5LCAidG9rZW5fdHlwZSIpID09IDApIHsKKyAgICAgICAgdG9rZW5fdHlwZSA9IHB0cjsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHB0ci0+a2V5LCAiZXhwaXJlc19pbiIpID09IDApIHsKKyAgICAgICAgZXhwaXJlc19pbiA9IHB0cjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFjY2Vzc190b2tlbiA9PSBOVUxMIHx8IGFjY2Vzc190b2tlbi0+dHlwZSAhPSBHUlBDX0pTT05fU1RSSU5HKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3Npbmcgb3IgaW52YWxpZCBhY2Nlc3NfdG9rZW4gaW4gSlNPTi4iKTsKKyAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKHRva2VuX3R5cGUgPT0gTlVMTCB8fCB0b2tlbl90eXBlLT50eXBlICE9IEdSUENfSlNPTl9TVFJJTkcpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTWlzc2luZyBvciBpbnZhbGlkIHRva2VuX3R5cGUgaW4gSlNPTi4iKTsKKyAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKGV4cGlyZXNfaW4gPT0gTlVMTCB8fCBleHBpcmVzX2luLT50eXBlICE9IEdSUENfSlNPTl9OVU1CRVIpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTWlzc2luZyBvciBpbnZhbGlkIGV4cGlyZXNfaW4gaW4gSlNPTi4iKTsKKyAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgZ3ByX2FzcHJpbnRmKCZuZXdfYWNjZXNzX3Rva2VuLCAiJXMgJXMiLCB0b2tlbl90eXBlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuLT52YWx1ZSk7CisgICAgdG9rZW5fbGlmZXRpbWUtPnR2X3NlYyA9IHN0cnRvbChleHBpcmVzX2luLT52YWx1ZSwgTlVMTCwgMTApOworICAgIHRva2VuX2xpZmV0aW1lLT50dl9uc2VjID0gMDsKKyAgICB0b2tlbl9saWZldGltZS0+Y2xvY2tfdHlwZSA9IEdQUl9USU1FU1BBTjsKKyAgICBpZiAoKnRva2VuX21kICE9IE5VTEwpIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfdW5yZWYoKnRva2VuX21kKTsKKyAgICAqdG9rZW5fbWQgPSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZSgxKTsKKyAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZF9jc3RyaW5ncygKKyAgICAgICAgKnRva2VuX21kLCBHUlBDX0FVVEhPUklaQVRJT05fTUVUQURBVEFfS0VZLCBuZXdfYWNjZXNzX3Rva2VuKTsKKyAgICBzdGF0dXMgPSBHUlBDX0NSRURFTlRJQUxTX09LOworICB9CisKK2VuZDoKKyAgaWYgKHN0YXR1cyAhPSBHUlBDX0NSRURFTlRJQUxTX09LICYmICgqdG9rZW5fbWQgIT0gTlVMTCkpIHsKKyAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKCp0b2tlbl9tZCk7CisgICAgKnRva2VuX21kID0gTlVMTDsKKyAgfQorICBpZiAobnVsbF90ZXJtaW5hdGVkX2JvZHkgIT0gTlVMTCkgZ3ByX2ZyZWUobnVsbF90ZXJtaW5hdGVkX2JvZHkpOworICBpZiAobmV3X2FjY2Vzc190b2tlbiAhPSBOVUxMKSBncHJfZnJlZShuZXdfYWNjZXNzX3Rva2VuKTsKKyAgaWYgKGpzb24gIT0gTlVMTCkgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIG9uX29hdXRoMl90b2tlbl9mZXRjaGVyX2h0dHBfcmVzcG9uc2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICBjb25zdCBncnBjX2h0dHBfcmVzcG9uc2UgKnJlc3BvbnNlKSB7CisgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqciA9CisgICAgICAoZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0ICopdXNlcl9kYXRhOworICBncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICpjID0KKyAgICAgIChncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICopci0+Y3JlZHM7CisgIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZTsKKyAgZ3JwY19jcmVkZW50aWFsc19zdGF0dXMgc3RhdHVzOworCisgIGdwcl9tdV9sb2NrKCZjLT5tdSk7CisgIHN0YXR1cyA9IGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHNfcGFyc2Vfc2VydmVyX3Jlc3BvbnNlKAorICAgICAgcmVzcG9uc2UsICZjLT5hY2Nlc3NfdG9rZW5fbWQsICZ0b2tlbl9saWZldGltZSk7CisgIGlmIChzdGF0dXMgPT0gR1JQQ19DUkVERU5USUFMU19PSykgeworICAgIGMtPnRva2VuX2V4cGlyYXRpb24gPQorICAgICAgICBncHJfdGltZV9hZGQoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCB0b2tlbl9saWZldGltZSk7CisgICAgci0+Y2IoZXhlY19jdHgsIHItPnVzZXJfZGF0YSwgYy0+YWNjZXNzX3Rva2VuX21kLT5lbnRyaWVzLAorICAgICAgICAgIGMtPmFjY2Vzc190b2tlbl9tZC0+bnVtX2VudHJpZXMsIHN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgYy0+dG9rZW5fZXhwaXJhdGlvbiA9IGdwcl9pbmZfcGFzdChHUFJfQ0xPQ0tfUkVBTFRJTUUpOworICAgIHItPmNiKGV4ZWNfY3R4LCByLT51c2VyX2RhdGEsIE5VTEwsIDAsIHN0YXR1cyk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3RfZGVzdHJveShyKTsKK30KKworc3RhdGljIHZvaWQgb2F1dGgyX3Rva2VuX2ZldGNoZXJfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCisgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAorICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICpjID0KKyAgICAgIChncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIGdwcl90aW1lc3BlYyByZWZyZXNoX3RocmVzaG9sZCA9IGdwcl90aW1lX2Zyb21fc2Vjb25kcygKKyAgICAgIEdSUENfU0VDVVJFX1RPS0VOX1JFRlJFU0hfVEhSRVNIT0xEX1NFQ1MsIEdQUl9USU1FU1BBTik7CisgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKmNhY2hlZF9hY2Nlc3NfdG9rZW5fbWQgPSBOVUxMOworICB7CisgICAgZ3ByX211X2xvY2soJmMtPm11KTsKKyAgICBpZiAoYy0+YWNjZXNzX3Rva2VuX21kICE9IE5VTEwgJiYKKyAgICAgICAgKGdwcl90aW1lX2NtcCgKKyAgICAgICAgICAgICBncHJfdGltZV9zdWIoYy0+dG9rZW5fZXhwaXJhdGlvbiwgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpKSwKKyAgICAgICAgICAgICByZWZyZXNoX3RocmVzaG9sZCkgPiAwKSkgeworICAgICAgY2FjaGVkX2FjY2Vzc190b2tlbl9tZCA9CisgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoYy0+YWNjZXNzX3Rva2VuX21kKTsKKyAgICB9CisgICAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICB9CisgIGlmIChjYWNoZWRfYWNjZXNzX3Rva2VuX21kICE9IE5VTEwpIHsKKyAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBjYWNoZWRfYWNjZXNzX3Rva2VuX21kLT5lbnRyaWVzLAorICAgICAgIGNhY2hlZF9hY2Nlc3NfdG9rZW5fbWQtPm51bV9lbnRyaWVzLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKKyAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGNhY2hlZF9hY2Nlc3NfdG9rZW5fbWQpOworICB9IGVsc2UgeworICAgIGMtPmZldGNoX2Z1bmMoCisgICAgICAgIGV4ZWNfY3R4LAorICAgICAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3RfY3JlYXRlKGNyZWRzLCBjYiwgdXNlcl9kYXRhKSwKKyAgICAgICAgJmMtPmh0dHBjbGlfY29udGV4dCwgcG9sbHNldCwgb25fb2F1dGgyX3Rva2VuX2ZldGNoZXJfaHR0cF9yZXNwb25zZSwKKyAgICAgICAgZ3ByX3RpbWVfYWRkKGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgcmVmcmVzaF90aHJlc2hvbGQpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBpbml0X29hdXRoMl90b2tlbl9mZXRjaGVyKGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZmV0Y2hfb2F1dGgyX2Z1bmMgZmV0Y2hfZnVuYykgeworICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMpKTsKKyAgYy0+YmFzZS50eXBlID0gR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfT0FVVEgyOworICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOworICBncHJfbXVfaW5pdCgmYy0+bXUpOworICBjLT50b2tlbl9leHBpcmF0aW9uID0gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7CisgIGMtPmZldGNoX2Z1bmMgPSBmZXRjaF9mdW5jOworICBncnBjX2h0dHBjbGlfY29udGV4dF9pbml0KCZjLT5odHRwY2xpX2NvbnRleHQpOworfQorCisvKiAtLSBHb29nbGVDb21wdXRlRW5naW5lIGNyZWRlbnRpYWxzLiAtLSAqLworCitzdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZSBjb21wdXRlX2VuZ2luZV92dGFibGUgPSB7CisgICAgb2F1dGgyX3Rva2VuX2ZldGNoZXJfZGVzdHJ1Y3QsIG9hdXRoMl90b2tlbl9mZXRjaGVyX2dldF9yZXF1ZXN0X21ldGFkYXRhfTsKKworc3RhdGljIHZvaWQgY29tcHV0ZV9lbmdpbmVfZmV0Y2hfb2F1dGgyKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKm1ldGFkYXRhX3JlcSwKKyAgICBncnBjX2h0dHBjbGlfY29udGV4dCAqaHR0cGNsaV9jb250ZXh0LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIHJlc3BvbnNlX2NiLCBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKKyAgZ3JwY19odHRwX2hlYWRlciBoZWFkZXIgPSB7Ik1ldGFkYXRhLUZsYXZvciIsICJHb29nbGUifTsKKyAgZ3JwY19odHRwY2xpX3JlcXVlc3QgcmVxdWVzdDsKKyAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YoZ3JwY19odHRwY2xpX3JlcXVlc3QpKTsKKyAgcmVxdWVzdC5ob3N0ID0gR1JQQ19DT01QVVRFX0VOR0lORV9NRVRBREFUQV9IT1NUOworICByZXF1ZXN0Lmh0dHAucGF0aCA9IEdSUENfQ09NUFVURV9FTkdJTkVfTUVUQURBVEFfVE9LRU5fUEFUSDsKKyAgcmVxdWVzdC5odHRwLmhkcl9jb3VudCA9IDE7CisgIHJlcXVlc3QuaHR0cC5oZHJzID0gJmhlYWRlcjsKKyAgZ3JwY19odHRwY2xpX2dldChleGVjX2N0eCwgaHR0cGNsaV9jb250ZXh0LCBwb2xsc2V0LCAmcmVxdWVzdCwgZGVhZGxpbmUsCisgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfY2IsIG1ldGFkYXRhX3JlcSk7Cit9CisKK2dycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19nb29nbGVfY29tcHV0ZV9lbmdpbmVfY3JlZGVudGlhbHNfY3JlYXRlKAorICAgIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKmMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFscykpOworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jb21wdXRlX2VuZ2luZV9jcmVkZW50aWFsc19jcmVhdGUocmVzZXJ2ZWQ9JXApIiwgMSwKKyAgICAgICAgICAgICAgICAgKHJlc2VydmVkKSk7CisgIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7CisgIGluaXRfb2F1dGgyX3Rva2VuX2ZldGNoZXIoYywgY29tcHV0ZV9lbmdpbmVfZmV0Y2hfb2F1dGgyKTsKKyAgYy0+YmFzZS52dGFibGUgPSAmY29tcHV0ZV9lbmdpbmVfdnRhYmxlOworICByZXR1cm4gJmMtPmJhc2U7Cit9CisKKy8qIC0tIEdvb2dsZVJlZnJlc2hUb2tlbiBjcmVkZW50aWFscy4gLS0gKi8KKworc3RhdGljIHZvaWQgcmVmcmVzaF90b2tlbl9kZXN0cnVjdChncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7CisgIGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKmMgPQorICAgICAgKGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKiljcmVkczsKKyAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fZGVzdHJ1Y3QoJmMtPnJlZnJlc2hfdG9rZW4pOworICBvYXV0aDJfdG9rZW5fZmV0Y2hlcl9kZXN0cnVjdCgmYy0+YmFzZS5iYXNlKTsKK30KKworc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgcmVmcmVzaF90b2tlbl92dGFibGUgPSB7CisgICAgcmVmcmVzaF90b2tlbl9kZXN0cnVjdCwgb2F1dGgyX3Rva2VuX2ZldGNoZXJfZ2V0X3JlcXVlc3RfbWV0YWRhdGF9OworCitzdGF0aWMgdm9pZCByZWZyZXNoX3Rva2VuX2ZldGNoX29hdXRoMigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0ICptZXRhZGF0YV9yZXEsCisgICAgZ3JwY19odHRwY2xpX2NvbnRleHQgKmh0dHBjbGlfY29udGV4dCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiByZXNwb25zZV9jYiwgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7CisgIGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKmMgPQorICAgICAgKGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKiltZXRhZGF0YV9yZXEtPmNyZWRzOworICBncnBjX2h0dHBfaGVhZGVyIGhlYWRlciA9IHsiQ29udGVudC1UeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9OworICBncnBjX2h0dHBjbGlfcmVxdWVzdCByZXF1ZXN0OworICBjaGFyICpib2R5ID0gTlVMTDsKKyAgZ3ByX2FzcHJpbnRmKCZib2R5LCBHUlBDX1JFRlJFU0hfVE9LRU5fUE9TVF9CT0RZX0ZPUk1BVF9TVFJJTkcsCisgICAgICAgICAgICAgICBjLT5yZWZyZXNoX3Rva2VuLmNsaWVudF9pZCwgYy0+cmVmcmVzaF90b2tlbi5jbGllbnRfc2VjcmV0LAorICAgICAgICAgICAgICAgYy0+cmVmcmVzaF90b2tlbi5yZWZyZXNoX3Rva2VuKTsKKyAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YoZ3JwY19odHRwY2xpX3JlcXVlc3QpKTsKKyAgcmVxdWVzdC5ob3N0ID0gR1JQQ19HT09HTEVfT0FVVEgyX1NFUlZJQ0VfSE9TVDsKKyAgcmVxdWVzdC5odHRwLnBhdGggPSBHUlBDX0dPT0dMRV9PQVVUSDJfU0VSVklDRV9UT0tFTl9QQVRIOworICByZXF1ZXN0Lmh0dHAuaGRyX2NvdW50ID0gMTsKKyAgcmVxdWVzdC5odHRwLmhkcnMgPSAmaGVhZGVyOworICByZXF1ZXN0LmhhbmRzaGFrZXIgPSAmZ3JwY19odHRwY2xpX3NzbDsKKyAgZ3JwY19odHRwY2xpX3Bvc3QoZXhlY19jdHgsIGh0dHBjbGlfY29udGV4dCwgcG9sbHNldCwgJnJlcXVlc3QsIGJvZHksCisgICAgICAgICAgICAgICAgICAgIHN0cmxlbihib2R5KSwgZGVhZGxpbmUsIHJlc3BvbnNlX2NiLCBtZXRhZGF0YV9yZXEpOworICBncHJfZnJlZShib2R5KTsKK30KKworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICoKK2dycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX3JlZnJlc2hfdG9rZW4oCisgICAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gcmVmcmVzaF90b2tlbikgeworICBncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzICpjOworICBpZiAoIWdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2lzX3ZhbGlkKCZyZWZyZXNoX3Rva2VuKSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBpbnB1dCBmb3IgcmVmcmVzaCB0b2tlbiBjcmVkZW50aWFscyBjcmVhdGlvbiIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzKSk7CisgIG1lbXNldChjLCAwLCBzaXplb2YoZ3JwY19nb29nbGVfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFscykpOworICBpbml0X29hdXRoMl90b2tlbl9mZXRjaGVyKCZjLT5iYXNlLCByZWZyZXNoX3Rva2VuX2ZldGNoX29hdXRoMik7CisgIGMtPmJhc2UuYmFzZS52dGFibGUgPSAmcmVmcmVzaF90b2tlbl92dGFibGU7CisgIGMtPnJlZnJlc2hfdG9rZW4gPSByZWZyZXNoX3Rva2VuOworICByZXR1cm4gJmMtPmJhc2UuYmFzZTsKK30KKworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzX2NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICpqc29uX3JlZnJlc2hfdG9rZW4sIHZvaWQgKnJlc2VydmVkKSB7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGUoanNvbl9yZWZyZXNoX3Rva2VuPSVzLCAiCisgICAgICAicmVzZXJ2ZWQ9JXApIiwKKyAgICAgIDIsIChqc29uX3JlZnJlc2hfdG9rZW4sIHJlc2VydmVkKSk7CisgIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7CisgIHJldHVybiBncnBjX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fYXV0aF9yZWZyZXNoX3Rva2VuKAorICAgICAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fY3JlYXRlX2Zyb21fc3RyaW5nKGpzb25fcmVmcmVzaF90b2tlbikpOworfQorCisvKiAtLSBNZXRhZGF0YS1vbmx5IGNyZWRlbnRpYWxzLiAtLSAqLworCitzdGF0aWMgdm9pZCBtZF9vbmx5X3Rlc3RfZGVzdHJ1Y3QoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqYyA9IChncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqKWNyZWRzOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGMtPm1kX3N0b3JlKTsKK30KKworc3RhdGljIHZvaWQgb25fc2ltdWxhdGVkX3Rva2VuX2ZldGNoX2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2VzcykgeworICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKnIgPQorICAgICAgKGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqKXVzZXJfZGF0YTsKKyAgZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHMgKilyLT5jcmVkczsKKyAgci0+Y2IoZXhlY19jdHgsIHItPnVzZXJfZGF0YSwgYy0+bWRfc3RvcmUtPmVudHJpZXMsIGMtPm1kX3N0b3JlLT5udW1fZW50cmllcywKKyAgICAgICAgR1JQQ19DUkVERU5USUFMU19PSyk7CisgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdF9kZXN0cm95KHIpOworfQorCitzdGF0aWMgdm9pZCBtZF9vbmx5X3Rlc3RfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCisgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAorICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqYyA9IChncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqKWNyZWRzOworCisgIGlmIChjLT5pc19hc3luYykgeworICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqY2JfYXJnID0KKyAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0X2NyZWF0ZShjcmVkcywgY2IsIHVzZXJfZGF0YSk7CisgICAgZ3JwY19leGVjdXRvcl9lbnF1ZXVlKAorICAgICAgICBncnBjX2Nsb3N1cmVfY3JlYXRlKG9uX3NpbXVsYXRlZF90b2tlbl9mZXRjaF9kb25lLCBjYl9hcmcpLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBjLT5tZF9zdG9yZS0+ZW50cmllcywgMSwgR1JQQ19DUkVERU5USUFMU19PSyk7CisgIH0KK30KKworc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgbWRfb25seV90ZXN0X3Z0YWJsZSA9IHsKKyAgICBtZF9vbmx5X3Rlc3RfZGVzdHJ1Y3QsIG1kX29ubHlfdGVzdF9nZXRfcmVxdWVzdF9tZXRhZGF0YX07CisKK2dycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHNfY3JlYXRlKAorICAgIGNvbnN0IGNoYXIgKm1kX2tleSwgY29uc3QgY2hhciAqbWRfdmFsdWUsIGludCBpc19hc3luYykgeworICBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqYyA9CisgICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscykpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfbWRfb25seV90ZXN0X2NyZWRlbnRpYWxzKSk7CisgIGMtPmJhc2UudHlwZSA9IEdSUENfQ0FMTF9DUkVERU5USUFMU19UWVBFX09BVVRIMjsKKyAgYy0+YmFzZS52dGFibGUgPSAmbWRfb25seV90ZXN0X3Z0YWJsZTsKKyAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLnJlZmNvdW50LCAxKTsKKyAgYy0+bWRfc3RvcmUgPSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZSgxKTsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoYy0+bWRfc3RvcmUsIG1kX2tleSwgbWRfdmFsdWUpOworICBjLT5pc19hc3luYyA9IGlzX2FzeW5jOworICByZXR1cm4gJmMtPmJhc2U7Cit9CisKKy8qIC0tIE9hdXRoMiBBY2Nlc3MgVG9rZW4gY3JlZGVudGlhbHMuIC0tICovCisKK3N0YXRpYyB2b2lkIGFjY2Vzc190b2tlbl9kZXN0cnVjdChncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7CisgIGdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzICpjID0gKGdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfdW5yZWYoYy0+YWNjZXNzX3Rva2VuX21kKTsKK30KKworc3RhdGljIHZvaWQgYWNjZXNzX3Rva2VuX2dldF9yZXF1ZXN0X21ldGFkYXRhKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzLAorICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3JwY19hdXRoX21ldGFkYXRhX2NvbnRleHQgY29udGV4dCwKKyAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMgKiljcmVkczsKKyAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgYy0+YWNjZXNzX3Rva2VuX21kLT5lbnRyaWVzLCAxLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKK30KKworc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgYWNjZXNzX3Rva2VuX3Z0YWJsZSA9IHsKKyAgICBhY2Nlc3NfdG9rZW5fZGVzdHJ1Y3QsIGFjY2Vzc190b2tlbl9nZXRfcmVxdWVzdF9tZXRhZGF0YX07CisKK2dycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHNfY3JlYXRlKAorICAgIGNvbnN0IGNoYXIgKmFjY2Vzc190b2tlbiwgdm9pZCAqcmVzZXJ2ZWQpIHsKKyAgZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMgKmMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMpKTsKKyAgY2hhciAqdG9rZW5fbWRfdmFsdWU7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzX2NyZWF0ZShhY2Nlc3NfdG9rZW49JXMsICIKKyAgICAgICJyZXNlcnZlZD0lcCkiLAorICAgICAgMiwgKGFjY2Vzc190b2tlbiwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX2FjY2Vzc190b2tlbl9jcmVkZW50aWFscykpOworICBjLT5iYXNlLnR5cGUgPSBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9PQVVUSDI7CisgIGMtPmJhc2UudnRhYmxlID0gJmFjY2Vzc190b2tlbl92dGFibGU7CisgIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7CisgIGMtPmFjY2Vzc190b2tlbl9tZCA9IGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfY3JlYXRlKDEpOworICBncHJfYXNwcmludGYoJnRva2VuX21kX3ZhbHVlLCAiQmVhcmVyICVzIiwgYWNjZXNzX3Rva2VuKTsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoCisgICAgICBjLT5hY2Nlc3NfdG9rZW5fbWQsIEdSUENfQVVUSE9SSVpBVElPTl9NRVRBREFUQV9LRVksIHRva2VuX21kX3ZhbHVlKTsKKyAgZ3ByX2ZyZWUodG9rZW5fbWRfdmFsdWUpOworICByZXR1cm4gJmMtPmJhc2U7Cit9CisKKy8qIC0tIEZha2UgdHJhbnNwb3J0IHNlY3VyaXR5IGNyZWRlbnRpYWxzLiAtLSAqLworCitzdGF0aWMgZ3JwY19zZWN1cml0eV9zdGF0dXMgZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKKyAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKKyAgICBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYywgZ3JwY19jaGFubmVsX2FyZ3MgKipuZXdfYXJncykgeworICAqc2MgPSBncnBjX2Zha2VfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKGNhbGxfY3JlZHMpOworICByZXR1cm4gR1JQQ19TRUNVUklUWV9PSzsKK30KKworc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzCitmYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKKyAgICBncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqYywgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKKyAgKnNjID0gZ3JwY19mYWtlX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKCk7CisgIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOworfQorCitzdGF0aWMgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3Z0YWJsZQorICAgIGZha2VfdHJhbnNwb3J0X3NlY3VyaXR5X2NyZWRlbnRpYWxzX3Z0YWJsZSA9IHsKKyAgICAgICAgTlVMTCwgZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07CisKK3N0YXRpYyBncnBjX3NlcnZlcl9jcmVkZW50aWFsc192dGFibGUKKyAgICBmYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlZGVudGlhbHNfdnRhYmxlID0geworICAgICAgICBOVUxMLCBmYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07CisKK2dycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqZ3JwY19mYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9jcmVkZW50aWFsc19jcmVhdGUoCisgICAgdm9pZCkgeworICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMpKTsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMpKTsKKyAgYy0+dHlwZSA9IEdSUENfQ0hBTk5FTF9DUkVERU5USUFMU19UWVBFX0ZBS0VfVFJBTlNQT1JUX1NFQ1VSSVRZOworICBjLT52dGFibGUgPSAmZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlZGVudGlhbHNfdnRhYmxlOworICBncHJfcmVmX2luaXQoJmMtPnJlZmNvdW50LCAxKTsKKyAgcmV0dXJuIGM7Cit9CisKK2dycGNfc2VydmVyX2NyZWRlbnRpYWxzICpncnBjX2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5X3NlcnZlcl9jcmVkZW50aWFsc19jcmVhdGUoCisgICAgdm9pZCkgeworICBncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc2VydmVyX2NyZWRlbnRpYWxzKSk7CisgIG1lbXNldChjLCAwLCBzaXplb2YoZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMpKTsKKyAgYy0+dHlwZSA9IEdSUENfQ0hBTk5FTF9DUkVERU5USUFMU19UWVBFX0ZBS0VfVFJBTlNQT1JUX1NFQ1VSSVRZOworICBncHJfcmVmX2luaXQoJmMtPnJlZmNvdW50LCAxKTsKKyAgYy0+dnRhYmxlID0gJmZha2VfdHJhbnNwb3J0X3NlY3VyaXR5X3NlcnZlcl9jcmVkZW50aWFsc192dGFibGU7CisgIHJldHVybiBjOworfQorCisvKiAtLSBDb21wb3NpdGUgY2FsbCBjcmVkZW50aWFscy4gLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICpjb21wb3NpdGVfY3JlZHM7CisgIHNpemVfdCBjcmVkc19pbmRleDsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqbWRfZWxlbXM7CisgIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGF1dGhfbWRfY29udGV4dDsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7CisgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2I7Cit9IGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfbWV0YWRhdGFfY29udGV4dDsKKworc3RhdGljIHZvaWQgY29tcG9zaXRlX2NhbGxfZGVzdHJ1Y3QoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICpjID0gKGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHMgKiljcmVkczsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBjLT5pbm5lci5udW1fY3JlZHM7IGkrKykgeworICAgIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihjLT5pbm5lci5jcmVkc19hcnJheVtpXSk7CisgIH0KKyAgZ3ByX2ZyZWUoYy0+aW5uZXIuY3JlZHNfYXJyYXkpOworfQorCitzdGF0aWMgdm9pZCBjb21wb3NpdGVfY2FsbF9tZF9jb250ZXh0X2Rlc3Ryb3koCisgICAgZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19tZXRhZGF0YV9jb250ZXh0ICpjdHgpIHsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV91bnJlZihjdHgtPm1kX2VsZW1zKTsKKyAgZ3ByX2ZyZWUoY3R4KTsKK30KKworc3RhdGljIHZvaWQgY29tcG9zaXRlX2NhbGxfbWV0YWRhdGFfY2IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWQgKm1kX2VsZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9tZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfc3RhdHVzIHN0YXR1cykgeworICBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX21ldGFkYXRhX2NvbnRleHQgKmN0eCA9CisgICAgICAoZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19tZXRhZGF0YV9jb250ZXh0ICopdXNlcl9kYXRhOworICBpZiAoc3RhdHVzICE9IEdSUENfQ1JFREVOVElBTFNfT0spIHsKKyAgICBjdHgtPmNiKGV4ZWNfY3R4LCBjdHgtPnVzZXJfZGF0YSwgTlVMTCwgMCwgc3RhdHVzKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDb3B5IHRoZSBtZXRhZGF0YSBpbiB0aGUgY29udGV4dC4gKi8KKyAgaWYgKG51bV9tZCA+IDApIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21kOyBpKyspIHsKKyAgICAgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfYWRkKGN0eC0+bWRfZWxlbXMsIG1kX2VsZW1zW2ldLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kX2VsZW1zW2ldLnZhbHVlKTsKKyAgICB9CisgIH0KKworICAvKiBTZWUgaWYgd2UgbmVlZCB0byBnZXQgc29tZSBtb3JlIG1ldGFkYXRhLiAqLworICBpZiAoY3R4LT5jcmVkc19pbmRleCA8IGN0eC0+Y29tcG9zaXRlX2NyZWRzLT5pbm5lci5udW1fY3JlZHMpIHsKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmlubmVyX2NyZWRzID0KKyAgICAgICAgY3R4LT5jb21wb3NpdGVfY3JlZHMtPmlubmVyLmNyZWRzX2FycmF5W2N0eC0+Y3JlZHNfaW5kZXgrK107CisgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2dldF9yZXF1ZXN0X21ldGFkYXRhKAorICAgICAgICBleGVjX2N0eCwgaW5uZXJfY3JlZHMsIGN0eC0+cG9sbHNldCwgY3R4LT5hdXRoX21kX2NvbnRleHQsCisgICAgICAgIGNvbXBvc2l0ZV9jYWxsX21ldGFkYXRhX2NiLCBjdHgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFdlJ3JlIGRvbmUhLiAqLworICBjdHgtPmNiKGV4ZWNfY3R4LCBjdHgtPnVzZXJfZGF0YSwgY3R4LT5tZF9lbGVtcy0+ZW50cmllcywKKyAgICAgICAgICBjdHgtPm1kX2VsZW1zLT5udW1fZW50cmllcywgR1JQQ19DUkVERU5USUFMU19PSyk7CisgIGNvbXBvc2l0ZV9jYWxsX21kX2NvbnRleHRfZGVzdHJveShjdHgpOworfQorCitzdGF0aWMgdm9pZCBjb21wb3NpdGVfY2FsbF9nZXRfcmVxdWVzdF9tZXRhZGF0YSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywKKyAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGF1dGhfbWRfY29udGV4dCwKKyAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFscyAqYyA9IChncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfbWV0YWRhdGFfY29udGV4dCAqY3R4OworCisgIGN0eCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfbWV0YWRhdGFfY29udGV4dCkpOworICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19tZXRhZGF0YV9jb250ZXh0KSk7CisgIGN0eC0+YXV0aF9tZF9jb250ZXh0ID0gYXV0aF9tZF9jb250ZXh0OworICBjdHgtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgY3R4LT5jYiA9IGNiOworICBjdHgtPmNvbXBvc2l0ZV9jcmVkcyA9IGM7CisgIGN0eC0+cG9sbHNldCA9IHBvbGxzZXQ7CisgIGN0eC0+bWRfZWxlbXMgPSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZShjLT5pbm5lci5udW1fY3JlZHMpOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCisgICAgICBleGVjX2N0eCwgYy0+aW5uZXIuY3JlZHNfYXJyYXlbY3R4LT5jcmVkc19pbmRleCsrXSwgcG9sbHNldCwKKyAgICAgIGF1dGhfbWRfY29udGV4dCwgY29tcG9zaXRlX2NhbGxfbWV0YWRhdGFfY2IsIGN0eCk7Cit9CisKK3N0YXRpYyBncnBjX2NhbGxfY3JlZGVudGlhbHNfdnRhYmxlIGNvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZSA9IHsKKyAgICBjb21wb3NpdGVfY2FsbF9kZXN0cnVjdCwgY29tcG9zaXRlX2NhbGxfZ2V0X3JlcXVlc3RfbWV0YWRhdGF9OworCitzdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2FycmF5IGdldF9jcmVkc19hcnJheSgKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKipjcmVkc19hZGRyKSB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFsc19hcnJheSByZXN1bHQ7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMgPSAqY3JlZHNfYWRkcjsKKyAgcmVzdWx0LmNyZWRzX2FycmF5ID0gY3JlZHNfYWRkcjsKKyAgcmVzdWx0Lm51bV9jcmVkcyA9IDE7CisgIGlmIChzdHJjbXAoY3JlZHMtPnR5cGUsIEdSUENfQ0FMTF9DUkVERU5USUFMU19UWVBFX0NPTVBPU0lURSkgPT0gMCkgeworICAgIHJlc3VsdCA9ICpncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX2dldF9jcmVkZW50aWFscyhjcmVkcyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX2NyZWF0ZSgKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzMSwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkczIsCisgICAgdm9pZCAqcmVzZXJ2ZWQpIHsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCBjcmVkc19hcnJheV9ieXRlX3NpemU7CisgIGdycGNfY2FsbF9jcmVkZW50aWFsc19hcnJheSBjcmVkczFfYXJyYXk7CisgIGdycGNfY2FsbF9jcmVkZW50aWFsc19hcnJheSBjcmVkczJfYXJyYXk7CisgIGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHMgKmM7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfY3JlYXRlKGNyZWRzMT0lcCwgY3JlZHMyPSVwLCAiCisgICAgICAicmVzZXJ2ZWQ9JXApIiwKKyAgICAgIDMsIChjcmVkczEsIGNyZWRzMiwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKKyAgR1BSX0FTU0VSVChjcmVkczEgIT0gTlVMTCk7CisgIEdQUl9BU1NFUlQoY3JlZHMyICE9IE5VTEwpOworICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFscykpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHMpKTsKKyAgYy0+YmFzZS50eXBlID0gR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfQ09NUE9TSVRFOworICBjLT5iYXNlLnZ0YWJsZSA9ICZjb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc192dGFibGU7CisgIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7CisgIGNyZWRzMV9hcnJheSA9IGdldF9jcmVkc19hcnJheSgmY3JlZHMxKTsKKyAgY3JlZHMyX2FycmF5ID0gZ2V0X2NyZWRzX2FycmF5KCZjcmVkczIpOworICBjLT5pbm5lci5udW1fY3JlZHMgPSBjcmVkczFfYXJyYXkubnVtX2NyZWRzICsgY3JlZHMyX2FycmF5Lm51bV9jcmVkczsKKyAgY3JlZHNfYXJyYXlfYnl0ZV9zaXplID0gYy0+aW5uZXIubnVtX2NyZWRzICogc2l6ZW9mKGdycGNfY2FsbF9jcmVkZW50aWFscyAqKTsKKyAgYy0+aW5uZXIuY3JlZHNfYXJyYXkgPSBncHJfbWFsbG9jKGNyZWRzX2FycmF5X2J5dGVfc2l6ZSk7CisgIG1lbXNldChjLT5pbm5lci5jcmVkc19hcnJheSwgMCwgY3JlZHNfYXJyYXlfYnl0ZV9zaXplKTsKKyAgZm9yIChpID0gMDsgaSA8IGNyZWRzMV9hcnJheS5udW1fY3JlZHM7IGkrKykgeworICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3VyX2NyZWRzID0gY3JlZHMxX2FycmF5LmNyZWRzX2FycmF5W2ldOworICAgIGMtPmlubmVyLmNyZWRzX2FycmF5W2ldID0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihjdXJfY3JlZHMpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBjcmVkczJfYXJyYXkubnVtX2NyZWRzOyBpKyspIHsKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmN1cl9jcmVkcyA9IGNyZWRzMl9hcnJheS5jcmVkc19hcnJheVtpXTsKKyAgICBjLT5pbm5lci5jcmVkc19hcnJheVtpICsgY3JlZHMxX2FycmF5Lm51bV9jcmVkc10gPQorICAgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKGN1cl9jcmVkcyk7CisgIH0KKyAgcmV0dXJuICZjLT5iYXNlOworfQorCitjb25zdCBncnBjX2NhbGxfY3JlZGVudGlhbHNfYXJyYXkgKgorZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19nZXRfY3JlZGVudGlhbHMoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBjb25zdCBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICpjID0KKyAgICAgIChjb25zdCBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIEdQUl9BU1NFUlQoc3RyY21wKGNyZWRzLT50eXBlLCBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9DT01QT1NJVEUpID09IDApOworICByZXR1cm4gJmMtPmlubmVyOworfQorCitncnBjX2NhbGxfY3JlZGVudGlhbHMgKmdycGNfY3JlZGVudGlhbHNfY29udGFpbnNfdHlwZSgKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzLCBjb25zdCBjaGFyICp0eXBlLAorICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqKmNvbXBvc2l0ZV9jcmVkcykgeworICBzaXplX3QgaTsKKyAgaWYgKHN0cmNtcChjcmVkcy0+dHlwZSwgdHlwZSkgPT0gMCkgeworICAgIGlmIChjb21wb3NpdGVfY3JlZHMgIT0gTlVMTCkgKmNvbXBvc2l0ZV9jcmVkcyA9IE5VTEw7CisgICAgcmV0dXJuIGNyZWRzOworICB9IGVsc2UgaWYgKHN0cmNtcChjcmVkcy0+dHlwZSwgR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfQ09NUE9TSVRFKSA9PSAwKSB7CisgICAgY29uc3QgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2FycmF5ICppbm5lcl9jcmVkc19hcnJheSA9CisgICAgICAgIGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfZ2V0X2NyZWRlbnRpYWxzKGNyZWRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5uZXJfY3JlZHNfYXJyYXktPm51bV9jcmVkczsgaSsrKSB7CisgICAgICBpZiAoc3RyY21wKHR5cGUsIGlubmVyX2NyZWRzX2FycmF5LT5jcmVkc19hcnJheVtpXS0+dHlwZSkgPT0gMCkgeworICAgICAgICBpZiAoY29tcG9zaXRlX2NyZWRzICE9IE5VTEwpICpjb21wb3NpdGVfY3JlZHMgPSBjcmVkczsKKyAgICAgICAgcmV0dXJuIGlubmVyX2NyZWRzX2FycmF5LT5jcmVkc19hcnJheVtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIC0tIElBTSBjcmVkZW50aWFscy4gLS0gKi8KKworc3RhdGljIHZvaWQgaWFtX2Rlc3RydWN0KGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgZ3JwY19nb29nbGVfaWFtX2NyZWRlbnRpYWxzICpjID0gKGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscyAqKWNyZWRzOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGMtPmlhbV9tZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlhbV9nZXRfcmVxdWVzdF9tZXRhZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscyAqYyA9IChncnBjX2dvb2dsZV9pYW1fY3JlZGVudGlhbHMgKiljcmVkczsKKyAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgYy0+aWFtX21kLT5lbnRyaWVzLCBjLT5pYW1fbWQtPm51bV9lbnRyaWVzLAorICAgICBHUlBDX0NSRURFTlRJQUxTX09LKTsKK30KKworc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgaWFtX3Z0YWJsZSA9IHtpYW1fZGVzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhbV9nZXRfcmVxdWVzdF9tZXRhZGF0YX07CisKK2dycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19nb29nbGVfaWFtX2NyZWRlbnRpYWxzX2NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqYXV0aG9yaXR5X3NlbGVjdG9yLCB2b2lkICpyZXNlcnZlZCkgeworICBncnBjX2dvb2dsZV9pYW1fY3JlZGVudGlhbHMgKmM7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfaWFtX2NyZWRlbnRpYWxzX2NyZWF0ZSh0b2tlbj0lcywgYXV0aG9yaXR5X3NlbGVjdG9yPSVzLCAiCisgICAgICAicmVzZXJ2ZWQ9JXApIiwKKyAgICAgIDMsICh0b2tlbiwgYXV0aG9yaXR5X3NlbGVjdG9yLCByZXNlcnZlZCkpOworICBHUFJfQVNTRVJUKHJlc2VydmVkID09IE5VTEwpOworICBHUFJfQVNTRVJUKHRva2VuICE9IE5VTEwpOworICBHUFJfQVNTRVJUKGF1dGhvcml0eV9zZWxlY3RvciAhPSBOVUxMKTsKKyAgYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscykpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscykpOworICBjLT5iYXNlLnR5cGUgPSBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9JQU07CisgIGMtPmJhc2UudnRhYmxlID0gJmlhbV92dGFibGU7CisgIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7CisgIGMtPmlhbV9tZCA9IGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfY3JlYXRlKDIpOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZF9jc3RyaW5ncygKKyAgICAgIGMtPmlhbV9tZCwgR1JQQ19JQU1fQVVUSE9SSVpBVElPTl9UT0tFTl9NRVRBREFUQV9LRVksIHRva2VuKTsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoCisgICAgICBjLT5pYW1fbWQsIEdSUENfSUFNX0FVVEhPUklUWV9TRUxFQ1RPUl9NRVRBREFUQV9LRVksIGF1dGhvcml0eV9zZWxlY3Rvcik7CisgIHJldHVybiAmYy0+YmFzZTsKK30KKworLyogLS0gUGx1Z2luIGNyZWRlbnRpYWxzLiAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQgKnVzZXJfZGF0YTsKKyAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYjsKK30gZ3JwY19tZXRhZGF0YV9wbHVnaW5fcmVxdWVzdDsKKworc3RhdGljIHZvaWQgcGx1Z2luX2Rlc3RydWN0KGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKiljcmVkczsKKyAgaWYgKGMtPnBsdWdpbi5zdGF0ZSAhPSBOVUxMICYmIGMtPnBsdWdpbi5kZXN0cm95ICE9IE5VTEwpIHsKKyAgICBjLT5wbHVnaW4uZGVzdHJveShjLT5wbHVnaW4uc3RhdGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbl9tZF9yZXF1ZXN0X21ldGFkYXRhX3JlYWR5KHZvaWQgKnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX21ldGFkYXRhICptZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX2RldGFpbHMpIHsKKyAgLyogY2FsbGVkIGZyb20gYXBwbGljYXRpb24gY29kZSAqLworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICBncnBjX21ldGFkYXRhX3BsdWdpbl9yZXF1ZXN0ICpyID0gKGdycGNfbWV0YWRhdGFfcGx1Z2luX3JlcXVlc3QgKilyZXF1ZXN0OworICBpZiAoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7CisgICAgaWYgKGVycm9yX2RldGFpbHMgIT0gTlVMTCkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJHZXR0aW5nIG1ldGFkYXRhIGZyb20gcGx1Z2luIGZhaWxlZCB3aXRoIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgIGVycm9yX2RldGFpbHMpOworICAgIH0KKyAgICByLT5jYigmZXhlY19jdHgsIHItPnVzZXJfZGF0YSwgTlVMTCwgMCwgR1JQQ19DUkVERU5USUFMU19FUlJPUik7CisgIH0gZWxzZSB7CisgICAgc2l6ZV90IGk7CisgICAgZ3JwY19jcmVkZW50aWFsc19tZCAqbWRfYXJyYXkgPSBOVUxMOworICAgIGlmIChudW1fbWQgPiAwKSB7CisgICAgICBtZF9hcnJheSA9IGdwcl9tYWxsb2MobnVtX21kICogc2l6ZW9mKGdycGNfY3JlZGVudGlhbHNfbWQpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWQ7IGkrKykgeworICAgICAgICBtZF9hcnJheVtpXS5rZXkgPSBncHJfc2xpY2VfZnJvbV9jb3BpZWRfc3RyaW5nKG1kW2ldLmtleSk7CisgICAgICAgIG1kX2FycmF5W2ldLnZhbHVlID0KKyAgICAgICAgICAgIGdwcl9zbGljZV9mcm9tX2NvcGllZF9idWZmZXIobWRbaV0udmFsdWUsIG1kW2ldLnZhbHVlX2xlbmd0aCk7CisgICAgICB9CisgICAgfQorICAgIHItPmNiKCZleGVjX2N0eCwgci0+dXNlcl9kYXRhLCBtZF9hcnJheSwgbnVtX21kLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKKyAgICBpZiAobWRfYXJyYXkgIT0gTlVMTCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9tZDsgaSsrKSB7CisgICAgICAgIGdwcl9zbGljZV91bnJlZihtZF9hcnJheVtpXS5rZXkpOworICAgICAgICBncHJfc2xpY2VfdW5yZWYobWRfYXJyYXlbaV0udmFsdWUpOworICAgICAgfQorICAgICAgZ3ByX2ZyZWUobWRfYXJyYXkpOworICAgIH0KKyAgfQorICBncHJfZnJlZShyKTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKK30KKworc3RhdGljIHZvaWQgcGx1Z2luX2dldF9yZXF1ZXN0X21ldGFkYXRhKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKiljcmVkczsKKyAgaWYgKGMtPnBsdWdpbi5nZXRfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIGdycGNfbWV0YWRhdGFfcGx1Z2luX3JlcXVlc3QgKnJlcXVlc3QgPSBncHJfbWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOworICAgIG1lbXNldChyZXF1ZXN0LCAwLCBzaXplb2YoKnJlcXVlc3QpKTsKKyAgICByZXF1ZXN0LT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgcmVxdWVzdC0+Y2IgPSBjYjsKKyAgICBjLT5wbHVnaW4uZ2V0X21ldGFkYXRhKGMtPnBsdWdpbi5zdGF0ZSwgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbl9tZF9yZXF1ZXN0X21ldGFkYXRhX3JlYWR5LCByZXF1ZXN0KTsKKyAgfSBlbHNlIHsKKyAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBOVUxMLCAwLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKKyAgfQorfQorCitzdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZSBwbHVnaW5fdnRhYmxlID0geworICAgIHBsdWdpbl9kZXN0cnVjdCwgcGx1Z2luX2dldF9yZXF1ZXN0X21ldGFkYXRhfTsKKworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX21ldGFkYXRhX2NyZWRlbnRpYWxzX2NyZWF0ZV9mcm9tX3BsdWdpbigKKyAgICBncnBjX21ldGFkYXRhX2NyZWRlbnRpYWxzX3BsdWdpbiBwbHVnaW4sIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfcGx1Z2luX2NyZWRlbnRpYWxzICpjID0gZ3ByX21hbGxvYyhzaXplb2YoKmMpKTsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfbWV0YWRhdGFfY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fcGx1Z2luKHJlc2VydmVkPSVwKSIsIDEsCisgICAgICAgICAgICAgICAgIChyZXNlcnZlZCkpOworICBHUFJfQVNTRVJUKHJlc2VydmVkID09IE5VTEwpOworICBtZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CisgIGMtPmJhc2UudHlwZSA9IHBsdWdpbi50eXBlOworICBjLT5iYXNlLnZ0YWJsZSA9ICZwbHVnaW5fdnRhYmxlOworICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOworICBjLT5wbHVnaW4gPSBwbHVnaW47CisgIHJldHVybiAmYy0+YmFzZTsKK30KKworLyogLS0gQ29tcG9zaXRlIGNoYW5uZWwgY3JlZGVudGlhbHMuIC0tICovCisKK3N0YXRpYyB2b2lkIGNvbXBvc2l0ZV9jaGFubmVsX2Rlc3RydWN0KGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKKyAgZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFscyAqYyA9CisgICAgICAoZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFscyAqKWNyZWRzOworICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdW5yZWYoYy0+aW5uZXJfY3JlZHMpOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoYy0+Y2FsbF9jcmVkcyk7Cit9CisKK3N0YXRpYyBncnBjX3NlY3VyaXR5X3N0YXR1cyBjb21wb3NpdGVfY2hhbm5lbF9jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAorICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKKyAgICBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYywgZ3JwY19jaGFubmVsX2FyZ3MgKipuZXdfYXJncykgeworICBncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzICpjID0KKyAgICAgIChncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzICopY3JlZHM7CisgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfRVJST1I7CisKKyAgR1BSX0FTU0VSVChjLT5pbm5lcl9jcmVkcyAhPSBOVUxMICYmIGMtPmNhbGxfY3JlZHMgIT0gTlVMTCAmJgorICAgICAgICAgICAgIGMtPmlubmVyX2NyZWRzLT52dGFibGUgIT0gTlVMTCAmJgorICAgICAgICAgICAgIGMtPmlubmVyX2NyZWRzLT52dGFibGUtPmNyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IgIT0gTlVMTCk7CisgIC8qIElmIHdlIGFyZSBwYXNzZWQgYSBjYWxsX2NyZWRzLCBjcmVhdGUgYSBjYWxsIGNvbXBvc2l0ZSB0byBwYXNzIGl0CisgICAgIGRvd25zdHJlYW0uICovCisgIGlmIChjYWxsX2NyZWRzICE9IE5VTEwpIHsKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNvbXBvc2l0ZV9jYWxsX2NyZWRzID0KKyAgICAgICAgZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19jcmVhdGUoYy0+Y2FsbF9jcmVkcywgY2FsbF9jcmVkcywgTlVMTCk7CisgICAgc3RhdHVzID0gYy0+aW5uZXJfY3JlZHMtPnZ0YWJsZS0+Y3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKKyAgICAgICAgYy0+aW5uZXJfY3JlZHMsIGNvbXBvc2l0ZV9jYWxsX2NyZWRzLCB0YXJnZXQsIGFyZ3MsIHNjLCBuZXdfYXJncyk7CisgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3VucmVmKGNvbXBvc2l0ZV9jYWxsX2NyZWRzKTsKKyAgfSBlbHNlIHsKKyAgICBzdGF0dXMgPSBjLT5pbm5lcl9jcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAorICAgICAgICBjLT5pbm5lcl9jcmVkcywgYy0+Y2FsbF9jcmVkcywgdGFyZ2V0LCBhcmdzLCBzYywgbmV3X2FyZ3MpOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdnRhYmxlIGNvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzX3Z0YWJsZSA9IHsKKyAgICBjb21wb3NpdGVfY2hhbm5lbF9kZXN0cnVjdCwgY29tcG9zaXRlX2NoYW5uZWxfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07CisKK2dycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFsc19jcmVhdGUoCisgICAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjaGFubmVsX2NyZWRzLCBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNhbGxfY3JlZHMsCisgICAgdm9pZCAqcmVzZXJ2ZWQpIHsKKyAgZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFscyAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7CisgIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKyAgR1BSX0FTU0VSVChjaGFubmVsX2NyZWRzICE9IE5VTEwgJiYgY2FsbF9jcmVkcyAhPSBOVUxMICYmIHJlc2VydmVkID09IE5VTEwpOworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzX2NyZWF0ZShjaGFubmVsX2NyZWRzPSVwLCAiCisgICAgICAiY2FsbF9jcmVkcz0lcCwgcmVzZXJ2ZWQ9JXApIiwKKyAgICAgIDMsIChjaGFubmVsX2NyZWRzLCBjYWxsX2NyZWRzLCByZXNlcnZlZCkpOworICBjLT5iYXNlLnR5cGUgPSBjaGFubmVsX2NyZWRzLT50eXBlOworICBjLT5iYXNlLnZ0YWJsZSA9ICZjb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFsc192dGFibGU7CisgIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7CisgIGMtPmlubmVyX2NyZWRzID0gZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlZihjaGFubmVsX2NyZWRzKTsKKyAgYy0+Y2FsbF9jcmVkcyA9IGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWYoY2FsbF9jcmVkcyk7CisgIHJldHVybiAmYy0+YmFzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2OGI5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfQ1JFREVOVElBTFNfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX0NSRURFTlRJQUxTX0gKKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgPGdycGMvZ3JwY19zZWN1cml0eS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgorCitzdHJ1Y3QgZ3JwY19odHRwX3Jlc3BvbnNlOworCisvKiAtLS0gQ29uc3RhbnRzLiAtLS0gKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgR1JQQ19DUkVERU5USUFMU19PSyA9IDAsCisgIEdSUENfQ1JFREVOVElBTFNfRVJST1IKK30gZ3JwY19jcmVkZW50aWFsc19zdGF0dXM7CisKKyNkZWZpbmUgR1JQQ19GQUtFX1RSQU5TUE9SVF9TRUNVUklUWV9UWVBFICJmYWtlIgorCisjZGVmaW5lIEdSUENfQ0hBTk5FTF9DUkVERU5USUFMU19UWVBFX1NTTCAiU3NsIgorI2RlZmluZSBHUlBDX0NIQU5ORUxfQ1JFREVOVElBTFNfVFlQRV9GQUtFX1RSQU5TUE9SVF9TRUNVUklUWSBcCisgICJGYWtlVHJhbnNwb3J0U2VjdXJpdHkiCisKKyNkZWZpbmUgR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfT0FVVEgyICJPYXV0aDIiCisjZGVmaW5lIEdSUENfQ0FMTF9DUkVERU5USUFMU19UWVBFX0pXVCAiSnd0IgorI2RlZmluZSBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9JQU0gIklhbSIKKyNkZWZpbmUgR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfQ09NUE9TSVRFICJDb21wb3NpdGUiCisKKyNkZWZpbmUgR1JQQ19BVVRIT1JJWkFUSU9OX01FVEFEQVRBX0tFWSAiYXV0aG9yaXphdGlvbiIKKyNkZWZpbmUgR1JQQ19JQU1fQVVUSE9SSVpBVElPTl9UT0tFTl9NRVRBREFUQV9LRVkgXAorICAieC1nb29nLWlhbS1hdXRob3JpemF0aW9uLXRva2VuIgorI2RlZmluZSBHUlBDX0lBTV9BVVRIT1JJVFlfU0VMRUNUT1JfTUVUQURBVEFfS0VZICJ4LWdvb2ctaWFtLWF1dGhvcml0eS1zZWxlY3RvciIKKworI2RlZmluZSBHUlBDX0dPT0dMRV9DTE9VRF9TREtfQ09ORklHX0RJUkVDVE9SWSAiZ2Nsb3VkIgorI2RlZmluZSBHUlBDX0dPT0dMRV9XRUxMX0tOT1dOX0NSRURFTlRJQUxTX0ZJTEUgXAorICAiYXBwbGljYXRpb25fZGVmYXVsdF9jcmVkZW50aWFscy5qc29uIgorCisjZGVmaW5lIEdSUENfU0VDVVJFX1RPS0VOX1JFRlJFU0hfVEhSRVNIT0xEX1NFQ1MgNjAKKworI2RlZmluZSBHUlBDX0NPTVBVVEVfRU5HSU5FX01FVEFEQVRBX0hPU1QgIm1ldGFkYXRhIgorI2RlZmluZSBHUlBDX0NPTVBVVEVfRU5HSU5FX01FVEFEQVRBX1RPS0VOX1BBVEggXAorICAiL2NvbXB1dGVNZXRhZGF0YS92MS9pbnN0YW5jZS9zZXJ2aWNlLWFjY291bnRzL2RlZmF1bHQvdG9rZW4iCisKKyNkZWZpbmUgR1JQQ19HT09HTEVfT0FVVEgyX1NFUlZJQ0VfSE9TVCAid3d3Lmdvb2dsZWFwaXMuY29tIgorI2RlZmluZSBHUlBDX0dPT0dMRV9PQVVUSDJfU0VSVklDRV9UT0tFTl9QQVRIICIvb2F1dGgyL3YzL3Rva2VuIgorCisjZGVmaW5lIEdSUENfU0VSVklDRV9BQ0NPVU5UX1BPU1RfQk9EWV9QUkVGSVggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZ3JhbnRfdHlwZT11cm4lM0FpZXRmJTNBcGFyYW1zJTNBb2F1dGglM0FncmFudC10eXBlJTNBand0LWJlYXJlciYiIFwKKyAgImFzc2VydGlvbj0iCisKKyNkZWZpbmUgR1JQQ19SRUZSRVNIX1RPS0VOX1BPU1RfQk9EWV9GT1JNQVRfU1RSSU5HIFwKKyAgImNsaWVudF9pZD0lcyZjbGllbnRfc2VjcmV0PSVzJnJlZnJlc2hfdG9rZW49JXMmZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIgorCisvKiAtLS0gR29vZ2xlIHV0aWxzIC0tLSAqLworCisvKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZ3ByX2ZyZWUgdGhlIHJlc3VsdCBpZiBub3QgTlVMTC4gKi8KK2NoYXIgKmdycGNfZ2V0X3dlbGxfa25vd25fZ29vZ2xlX2NyZWRlbnRpYWxzX2ZpbGVfcGF0aCh2b2lkKTsKKworLyogSW1wbGVtZW50YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBkaWZmZXJlbnQgcGxhdGZvcm1zLiAqLworY2hhciAqZ3JwY19nZXRfd2VsbF9rbm93bl9nb29nbGVfY3JlZGVudGlhbHNfZmlsZV9wYXRoX2ltcGwodm9pZCk7CisKKy8qIE92ZXJyaWRlIGZvciB0ZXN0aW5nIG9ubHkuIE5vdCB0aHJlYWQtc2FmZSAqLwordHlwZWRlZiBjaGFyICooKmdycGNfd2VsbF9rbm93bl9jcmVkZW50aWFsc19wYXRoX2dldHRlcikodm9pZCk7Cit2b2lkIGdycGNfb3ZlcnJpZGVfd2VsbF9rbm93bl9jcmVkZW50aWFsc19wYXRoX2dldHRlcigKKyAgICBncnBjX3dlbGxfa25vd25fY3JlZGVudGlhbHNfcGF0aF9nZXR0ZXIgZ2V0dGVyKTsKKworLyogLS0tIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscy4gLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAoKmRlc3RydWN0KShncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMpOworCisgIGdycGNfc2VjdXJpdHlfc3RhdHVzICgqY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcikoCisgICAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKKyAgICAgIGNvbnN0IGNoYXIgKnRhcmdldCwgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MsCisgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MsIGdycGNfY2hhbm5lbF9hcmdzICoqbmV3X2FyZ3MpOworfSBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdnRhYmxlOworCitzdHJ1Y3QgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzIHsKKyAgY29uc3QgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3Z0YWJsZSAqdnRhYmxlOworICBjb25zdCBjaGFyICp0eXBlOworICBncHJfcmVmY291bnQgcmVmY291bnQ7Cit9OworCitncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmdycGNfY2hhbm5lbF9jcmVkZW50aWFsc19yZWYoCisgICAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjcmVkcyk7Cit2b2lkIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc191bnJlZihncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNyZWRzKTsKKworLyogQ3JlYXRlcyBhIHNlY3VyaXR5IGNvbm5lY3RvciBmb3IgdGhlIGNoYW5uZWwuIE1heSBhbHNvIGNyZWF0ZSBuZXcgY2hhbm5lbAorICAgYXJncyBmb3IgdGhlIGNoYW5uZWwgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcGFzc2VkIGluIGNvbnN0IGFyZ3MgaWYKKyAgIHJldHVybmVkIG5vbiBOVUxMLiBJbiB0aGF0IGNhc2UgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZworICAgbmV3X2FyZ3MgYWZ0ZXIgY2hhbm5lbCBjcmVhdGlvbi4gKi8KK2dycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc19jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAorICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMsIGNvbnN0IGNoYXIgKnRhcmdldCwKKyAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncywgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjLAorICAgIGdycGNfY2hhbm5lbF9hcmdzICoqbmV3X2FyZ3MpOworCisvKiAtLS0gZ3JwY19jcmVkZW50aWFsc19tZC4gLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3ByX3NsaWNlIGtleTsKKyAgZ3ByX3NsaWNlIHZhbHVlOworfSBncnBjX2NyZWRlbnRpYWxzX21kOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY3JlZGVudGlhbHNfbWQgKmVudHJpZXM7CisgIHNpemVfdCBudW1fZW50cmllczsKKyAgc2l6ZV90IGFsbG9jYXRlZDsKKyAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OworfSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlOworCitncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZSgKKyAgICBzaXplX3QgaW5pdGlhbF9jYXBhY2l0eSk7CisKKy8qIFdpbGwgcmVmIGtleSBhbmQgdmFsdWUuICovCit2b2lkIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfYWRkKGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKnN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Uga2V5LCBncHJfc2xpY2UgdmFsdWUpOwordm9pZCBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZF9jc3RyaW5ncyhncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CitncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3JlZigKKyAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSk7Cit2b2lkIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfdW5yZWYoZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqc3RvcmUpOworCisvKiAtLS0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzLiAtLS0gKi8KKwordHlwZWRlZiB2b2lkICgqZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NyZWRlbnRpYWxzX21kICptZF9lbGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NyZWRlbnRpYWxzX3N0YXR1cyBzdGF0dXMpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQgKCpkZXN0cnVjdCkoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjKTsKKyAgdm9pZCAoKmdldF9yZXF1ZXN0X21ldGFkYXRhKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmMsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKK30gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZTsKKworc3RydWN0IGdycGNfY2FsbF9jcmVkZW50aWFscyB7CisgIGNvbnN0IGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgKnZ0YWJsZTsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OworfTsKKworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpOwordm9pZCBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcyk7Cit2b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc19nZXRfcmVxdWVzdF9tZXRhZGF0YSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywKKyAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCisgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKipjcmVkc19hcnJheTsKKyAgc2l6ZV90IG51bV9jcmVkczsKK30gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2FycmF5OworCitjb25zdCBncnBjX2NhbGxfY3JlZGVudGlhbHNfYXJyYXkgKgorZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19nZXRfY3JlZGVudGlhbHMoCisgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjb21wb3NpdGVfY3JlZHMpOworCisvKiBSZXR1cm5zIGNyZWRzIGlmIGNyZWRzIGlzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBvciB0aGUgaW5uZXIgY3JlZHMgb2YgdGhlCisgICBzcGVjaWZpZWQgdHlwZSAoaWYgZm91bmQpLCBpZiB0aGUgY3JlZHMgaXMgb2YgdHlwZSBDT01QT1NJVEUuCisgICBJZiBjb21wb3NpdGVfY3JlZHMgaXMgbm90IE5VTEwsICpjb21wb3NpdGVfY3JlZHMgd2lsbCBwb2ludCB0byBjcmVkcyBpZiBvZgorICAgdHlwZSBDT01QT1NJVEUgaW4gY2FzZSBvZiBzdWNjZXNzLiAqLworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2NyZWRlbnRpYWxzX2NvbnRhaW5zX3R5cGUoCisgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywgY29uc3QgY2hhciAqdHlwZSwKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKipjb21wb3NpdGVfY3JlZHMpOworCisvKiBFeHBvc2VkIGZvciB0ZXN0aW5nIG9ubHkuICovCitncnBjX2NyZWRlbnRpYWxzX3N0YXR1cworZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFsc19wYXJzZV9zZXJ2ZXJfcmVzcG9uc2UoCisgICAgY29uc3Qgc3RydWN0IGdycGNfaHR0cF9yZXNwb25zZSAqcmVzcG9uc2UsCisgICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqKnRva2VuX21kLCBncHJfdGltZXNwZWMgKnRva2VuX2xpZmV0aW1lKTsKKwordm9pZCBncnBjX2ZsdXNoX2NhY2hlZF9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscyh2b2lkKTsKKworLyogTWV0YWRhdGEtb25seSBjcmVkZW50aWFscyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCB2YWx1ZSB3aGVyZQorICAgYXN5bmNocm9uaWNpdHkgY2FuIGJlIHNpbXVsYXRlZCBmb3IgdGVzdGluZy4gKi8KK2dycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHNfY3JlYXRlKAorICAgIGNvbnN0IGNoYXIgKm1kX2tleSwgY29uc3QgY2hhciAqbWRfdmFsdWUsIGludCBpc19hc3luYyk7CisKKy8qIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIGp3dCBjcmVkZW50aWFscyBmcm9tIGFuIGFscmVhZHkgcGFyc2VkIGpzb24ga2V5LgorICAgVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBrZXkuICovCitncnBjX2NhbGxfY3JlZGVudGlhbHMgKgorZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX2pzb25fa2V5KAorICAgIGdycGNfYXV0aF9qc29uX2tleSBrZXksIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSk7CisKKy8qIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIHJlZnJlc2ggdG9rZW4gY3JlZGVudGlhbHMgZnJvbSBhbiBhbHJlYWR5IHBhcnNlZAorICAgcmVmcmVzaCB0b2tlbi4gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZWZyZXNoIHRva2VuLiAqLworZ3JwY19jYWxsX2NyZWRlbnRpYWxzICoKK2dycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX3JlZnJlc2hfdG9rZW4oCisgICAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gdG9rZW4pOworCisvKiAtLS0gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMuIC0tLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQgKCpkZXN0cnVjdCkoZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmMpOworICBncnBjX3NlY3VyaXR5X3N0YXR1cyAoKmNyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IpKAorICAgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmMsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjKTsKK30gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdnRhYmxlOworCitzdHJ1Y3QgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgeworICBjb25zdCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc192dGFibGUgKnZ0YWJsZTsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OworICBncnBjX2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yIHByb2Nlc3NvcjsKK307CisKK2dycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IoCisgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzLCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKipzYyk7CisKK2dycGNfc2VydmVyX2NyZWRlbnRpYWxzICpncnBjX3NlcnZlcl9jcmVkZW50aWFsc19yZWYoCisgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzKTsKKwordm9pZCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc191bnJlZihncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpOworCisjZGVmaW5lIEdSUENfU0VSVkVSX0NSRURFTlRJQUxTX0FSRyAiZ3JwYy5zZXJ2ZXJfY3JlZGVudGlhbHMiCisKK2dycGNfYXJnIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3RvX2FyZyhncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqYyk7CitncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZyk7CitncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19maW5kX3NlcnZlcl9jcmVkZW50aWFsc19pbl9hcmdzKAorICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKTsKKworLyogLS0gRmFrZSB0cmFuc3BvcnQgc2VjdXJpdHkgY3JlZGVudGlhbHMuIC0tICovCisKKy8qIENyZWF0ZXMgYSBmYWtlIHRyYW5zcG9ydCBzZWN1cml0eSBjcmVkZW50aWFscyBvYmplY3QgZm9yIHRlc3RpbmcuICovCitncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmdycGNfZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlZGVudGlhbHNfY3JlYXRlKHZvaWQpOworLyogQ3JlYXRlcyBhIGZha2Ugc2VydmVyIHRyYW5zcG9ydCBzZWN1cml0eSBjcmVkZW50aWFscyBvYmplY3QgZm9yIHRlc3RpbmcuICovCitncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19mYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlZGVudGlhbHNfY3JlYXRlKAorICAgIHZvaWQpOworCisvKiAtLSBTc2wgY3JlZGVudGlhbHMuIC0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzIGJhc2U7CisgIGdycGNfc3NsX2NvbmZpZyBjb25maWc7Cit9IGdycGNfc3NsX2NyZWRlbnRpYWxzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzIGJhc2U7CisgIGdycGNfc3NsX3NlcnZlcl9jb25maWcgY29uZmlnOworfSBncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHM7CisKKy8qIC0tIENoYW5uZWwgY29tcG9zaXRlIGNyZWRlbnRpYWxzLiAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyBiYXNlOworICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmlubmVyX2NyZWRzOworICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNhbGxfY3JlZHM7Cit9IGdycGNfY29tcG9zaXRlX2NoYW5uZWxfY3JlZGVudGlhbHM7CisKKy8qIC0tIEp3dCBjcmVkZW50aWFscyAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOworCisgIC8qIEhhdmUgYSBzaW1wbGUgY2FjaGUgZm9yIG5vdyB3aXRoIGp1c3QgMSBlbnRyeS4gV2UgY291bGQgaGF2ZSBhIG1hcCBiYXNlZCBvbgorICAgICB0aGUgc2VydmljZV91cmwgZm9yIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG9uZS4gKi8KKyAgZ3ByX211IGNhY2hlX211OworICBzdHJ1Y3QgeworICAgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKmp3dF9tZDsKKyAgICBjaGFyICpzZXJ2aWNlX3VybDsKKyAgICBncHJfdGltZXNwZWMgand0X2V4cGlyYXRpb247CisgIH0gY2FjaGVkOworCisgIGdycGNfYXV0aF9qc29uX2tleSBrZXk7CisgIGdwcl90aW1lc3BlYyBqd3RfbGlmZXRpbWU7Cit9IGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHM7CisKKy8qIC0tIE9hdXRoMlRva2VuRmV0Y2hlciBjcmVkZW50aWFscyAtLQorCisgICBUaGlzIG9iamVjdCBpcyBhIGJhc2UgZm9yIGNyZWRlbnRpYWxzIHRoYXQgbmVlZCB0byBhY3F1aXJlIGFuIG9hdXRoMiB0b2tlbgorICAgZnJvbSBhbiBodHRwIHNlcnZpY2UuICovCisKK3R5cGVkZWYgc3RydWN0IGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdAorICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdDsKKwordHlwZWRlZiB2b2lkICgqZ3JwY19mZXRjaF9vYXV0aDJfZnVuYykoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9jb250ZXh0ICpodHRwX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2IgcmVzcG9uc2VfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOworICBncHJfbXUgbXU7CisgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKmFjY2Vzc190b2tlbl9tZDsKKyAgZ3ByX3RpbWVzcGVjIHRva2VuX2V4cGlyYXRpb247CisgIGdycGNfaHR0cGNsaV9jb250ZXh0IGh0dHBjbGlfY29udGV4dDsKKyAgZ3JwY19mZXRjaF9vYXV0aDJfZnVuYyBmZXRjaF9mdW5jOworfSBncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzOworCisvKiAtLSBHb29nbGVSZWZyZXNoVG9rZW4gY3JlZGVudGlhbHMuIC0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFscyBiYXNlOworICBncnBjX2F1dGhfcmVmcmVzaF90b2tlbiByZWZyZXNoX3Rva2VuOworfSBncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzOworCisvKiAtLSBPYXV0aDIgQWNjZXNzIFRva2VuIGNyZWRlbnRpYWxzLiAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICphY2Nlc3NfdG9rZW5fbWQ7Cit9IGdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzOworCisvKiAtLSAgTWV0YWRhdGEtb25seSBUZXN0IGNyZWRlbnRpYWxzLiAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICptZF9zdG9yZTsKKyAgaW50IGlzX2FzeW5jOworfSBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFsczsKKworLyogLS0gR29vZ2xlSUFNIGNyZWRlbnRpYWxzLiAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICppYW1fbWQ7Cit9IGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFsczsKKworLyogLS0gQ29tcG9zaXRlIGNyZWRlbnRpYWxzLiAtLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfYXJyYXkgaW5uZXI7Cit9IGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHM7CisKKy8qIC0tIFBsdWdpbiBjcmVkZW50aWFscy4gLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NhbGxfY3JlZGVudGlhbHMgYmFzZTsKKyAgZ3JwY19tZXRhZGF0YV9jcmVkZW50aWFsc19wbHVnaW4gcGx1Z2luOworICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpwbHVnaW5fbWQ7Cit9IGdycGNfcGx1Z2luX2NyZWRlbnRpYWxzOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9DUkVERU5USUFMU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYmZjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHZvaWQgc3RvcmVfZW5zdXJlX2NhcGFjaXR5KGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKnN0b3JlKSB7CisgIGlmIChzdG9yZS0+bnVtX2VudHJpZXMgPT0gc3RvcmUtPmFsbG9jYXRlZCkgeworICAgIHN0b3JlLT5hbGxvY2F0ZWQgPSAoc3RvcmUtPmFsbG9jYXRlZCA9PSAwKSA/IDEgOiBzdG9yZS0+YWxsb2NhdGVkICogMjsKKyAgICBzdG9yZS0+ZW50cmllcyA9IGdwcl9yZWFsbG9jKAorICAgICAgICBzdG9yZS0+ZW50cmllcywgc3RvcmUtPmFsbG9jYXRlZCAqIHNpemVvZihncnBjX2NyZWRlbnRpYWxzX21kKSk7CisgIH0KK30KKworZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9jcmVhdGUoCisgICAgc2l6ZV90IGluaXRpYWxfY2FwYWNpdHkpIHsKKyAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqc3RvcmUgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSkpOworICBtZW1zZXQoc3RvcmUsIDAsIHNpemVvZihncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlKSk7CisgIGlmIChpbml0aWFsX2NhcGFjaXR5ID4gMCkgeworICAgIHN0b3JlLT5lbnRyaWVzID0gZ3ByX21hbGxvYyhpbml0aWFsX2NhcGFjaXR5ICogc2l6ZW9mKGdycGNfY3JlZGVudGlhbHNfbWQpKTsKKyAgICBzdG9yZS0+YWxsb2NhdGVkID0gaW5pdGlhbF9jYXBhY2l0eTsKKyAgfQorICBncHJfcmVmX2luaXQoJnN0b3JlLT5yZWZjb3VudCwgMSk7CisgIHJldHVybiBzdG9yZTsKK30KKwordm9pZCBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZChncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIGtleSwgZ3ByX3NsaWNlIHZhbHVlKSB7CisgIGlmIChzdG9yZSA9PSBOVUxMKSByZXR1cm47CisgIHN0b3JlX2Vuc3VyZV9jYXBhY2l0eShzdG9yZSk7CisgIHN0b3JlLT5lbnRyaWVzW3N0b3JlLT5udW1fZW50cmllc10ua2V5ID0gZ3ByX3NsaWNlX3JlZihrZXkpOworICBzdG9yZS0+ZW50cmllc1tzdG9yZS0+bnVtX2VudHJpZXNdLnZhbHVlID0gZ3ByX3NsaWNlX3JlZih2YWx1ZSk7CisgIHN0b3JlLT5udW1fZW50cmllcysrOworfQorCit2b2lkIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfYWRkX2NzdHJpbmdzKGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKnN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgIGlmIChzdG9yZSA9PSBOVUxMKSByZXR1cm47CisgIHN0b3JlX2Vuc3VyZV9jYXBhY2l0eShzdG9yZSk7CisgIHN0b3JlLT5lbnRyaWVzW3N0b3JlLT5udW1fZW50cmllc10ua2V5ID0gZ3ByX3NsaWNlX2Zyb21fY29waWVkX3N0cmluZyhrZXkpOworICBzdG9yZS0+ZW50cmllc1tzdG9yZS0+bnVtX2VudHJpZXNdLnZhbHVlID0KKyAgICAgIGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcodmFsdWUpOworICBzdG9yZS0+bnVtX2VudHJpZXMrKzsKK30KKworZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoCisgICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqc3RvcmUpIHsKKyAgaWYgKHN0b3JlID09IE5VTEwpIHJldHVybiBOVUxMOworICBncHJfcmVmKCZzdG9yZS0+cmVmY291bnQpOworICByZXR1cm4gc3RvcmU7Cit9CisKK3ZvaWQgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV91bnJlZihncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSkgeworICBpZiAoc3RvcmUgPT0gTlVMTCkgcmV0dXJuOworICBpZiAoZ3ByX3VucmVmKCZzdG9yZS0+cmVmY291bnQpKSB7CisgICAgaWYgKHN0b3JlLT5lbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHN0b3JlLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIGdwcl9zbGljZV91bnJlZihzdG9yZS0+ZW50cmllc1tpXS5rZXkpOworICAgICAgICBncHJfc2xpY2VfdW5yZWYoc3RvcmUtPmVudHJpZXNbaV0udmFsdWUpOworICAgICAgfQorICAgICAgZ3ByX2ZyZWUoc3RvcmUtPmVudHJpZXMpOworICAgIH0KKyAgICBncHJfZnJlZShzdG9yZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1OGNkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX0ZJTEUKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK2NoYXIgKmdycGNfZ2V0X3dlbGxfa25vd25fZ29vZ2xlX2NyZWRlbnRpYWxzX2ZpbGVfcGF0aF9pbXBsKHZvaWQpIHsKKyAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgY2hhciAqaG9tZSA9IGdwcl9nZXRlbnYoIkhPTUUiKTsKKyAgaWYgKGhvbWUgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlLiIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAiJXMvLmNvbmZpZy8lcy8lcyIsIGhvbWUsCisgICAgICAgICAgICAgICBHUlBDX0dPT0dMRV9DTE9VRF9TREtfQ09ORklHX0RJUkVDVE9SWSwKKyAgICAgICAgICAgICAgIEdSUENfR09PR0xFX1dFTExfS05PV05fQ1JFREVOVElBTFNfRklMRSk7CisgIGdwcl9mcmVlKGhvbWUpOworICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgLyogR1BSX1BPU0lYX0ZJTEUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyNWFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1dJTjMyCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCitjaGFyICpncnBjX2dldF93ZWxsX2tub3duX2dvb2dsZV9jcmVkZW50aWFsc19maWxlX3BhdGhfaW1wbCh2b2lkKSB7CisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIGNoYXIgKmFwcGRhdGFfcGF0aCA9IGdwcl9nZXRlbnYoIkFQUERBVEEiKTsKKyAgaWYgKGFwcGRhdGFfcGF0aCA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgZ2V0IEFQUERBVEEgZW52aXJvbm1lbnQgdmFyaWFibGUuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZ3ByX2FzcHJpbnRmKCZyZXN1bHQsICIlcy8lcy8lcyIsIGFwcGRhdGFfcGF0aCwKKyAgICAgICAgICAgICAgIEdSUENfR09PR0xFX0NMT1VEX1NES19DT05GSUdfRElSRUNUT1JZLAorICAgICAgICAgICAgICAgR1JQQ19HT09HTEVfV0VMTF9LTk9XTl9DUkVERU5USUFMU19GSUxFKTsKKyAgZ3ByX2ZyZWUoYXBwZGF0YV9wYXRoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM0MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgiCisKKy8qIC0tIENvbnN0YW50cy4gLS0gKi8KKworI2RlZmluZSBHUlBDX0NPTVBVVEVfRU5HSU5FX0RFVEVDVElPTl9IT1NUICJtZXRhZGF0YS5nb29nbGUuaW50ZXJuYWwiCisKKy8qIC0tIERlZmF1bHQgY3JlZGVudGlhbHMuIC0tICovCisKK3N0YXRpYyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmRlZmF1bHRfY3JlZGVudGlhbHMgPSBOVUxMOworc3RhdGljIGludCBjb21wdXRlX2VuZ2luZV9kZXRlY3Rpb25fZG9uZSA9IDA7CitzdGF0aWMgZ3ByX211IGdfc3RhdGVfbXU7CitzdGF0aWMgZ3ByX211ICpnX3BvbGxpbmdfbXU7CitzdGF0aWMgZ3ByX29uY2UgZ19vbmNlID0gR1BSX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQgaW5pdF9kZWZhdWx0X2NyZWRlbnRpYWxzKHZvaWQpIHsgZ3ByX211X2luaXQoJmdfc3RhdGVfbXUpOyB9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworICBpbnQgaXNfZG9uZTsKKyAgaW50IHN1Y2Nlc3M7Cit9IGNvbXB1dGVfZW5naW5lX2RldGVjdG9yOworCitzdGF0aWMgdm9pZCBvbl9jb21wdXRlX2VuZ2luZV9kZXRlY3Rpb25faHR0cF9yZXNwb25zZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLAorICAgIGNvbnN0IGdycGNfaHR0cF9yZXNwb25zZSAqcmVzcG9uc2UpIHsKKyAgY29tcHV0ZV9lbmdpbmVfZGV0ZWN0b3IgKmRldGVjdG9yID0gKGNvbXB1dGVfZW5naW5lX2RldGVjdG9yICopdXNlcl9kYXRhOworICBpZiAocmVzcG9uc2UgIT0gTlVMTCAmJiByZXNwb25zZS0+c3RhdHVzID09IDIwMCAmJiByZXNwb25zZS0+aGRyX2NvdW50ID4gMCkgeworICAgIC8qIEludGVybmV0IHByb3ZpZGVycyBjYW4gcmV0dXJuIGEgZ2VuZXJpYyByZXNwb25zZSB0byBhbGwgcmVxdWVzdHMsIHNvCisgICAgICAgaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIHRoYXQgbWV0YWRhdGEgaGVhZGVyIGlzIHByZXNlbnQgYWxzby4gKi8KKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVzcG9uc2UtPmhkcl9jb3VudDsgaSsrKSB7CisgICAgICBncnBjX2h0dHBfaGVhZGVyICpoZWFkZXIgPSAmcmVzcG9uc2UtPmhkcnNbaV07CisgICAgICBpZiAoc3RyY21wKGhlYWRlci0+a2V5LCAiTWV0YWRhdGEtRmxhdm9yIikgPT0gMCAmJgorICAgICAgICAgIHN0cmNtcChoZWFkZXItPnZhbHVlLCAiR29vZ2xlIikgPT0gMCkgeworICAgICAgICBkZXRlY3Rvci0+c3VjY2VzcyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBncHJfbXVfbG9jayhnX3BvbGxpbmdfbXUpOworICBkZXRlY3Rvci0+aXNfZG9uZSA9IDE7CisgIGdycGNfcG9sbHNldF9raWNrKGRldGVjdG9yLT5wb2xsc2V0LCBOVUxMKTsKKyAgZ3ByX211X3VubG9jayhnX3BvbGxpbmdfbXUpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnAsIGJvb2wgcykgeworICBncnBjX3BvbGxzZXRfZGVzdHJveShwKTsKK30KKworc3RhdGljIGludCBpc19zdGFja19ydW5uaW5nX29uX2NvbXB1dGVfZW5naW5lKHZvaWQpIHsKKyAgY29tcHV0ZV9lbmdpbmVfZGV0ZWN0b3IgZGV0ZWN0b3I7CisgIGdycGNfaHR0cGNsaV9yZXF1ZXN0IHJlcXVlc3Q7CisgIGdycGNfaHR0cGNsaV9jb250ZXh0IGNvbnRleHQ7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIGdycGNfY2xvc3VyZSBkZXN0cm95X2Nsb3N1cmU7CisKKyAgLyogVGhlIGh0dHAgY2FsbCBpcyBsb2NhbC4gSWYgaXQgdGFrZXMgbW9yZSB0aGFuIG9uZSBzZWMsIGl0IGlzIGZvciBzdXJlIG5vdAorICAgICBvbiBjb21wdXRlIGVuZ2luZS4gKi8KKyAgZ3ByX3RpbWVzcGVjIG1heF9kZXRlY3Rpb25fZGVsYXkgPSBncHJfdGltZV9mcm9tX3NlY29uZHMoMSwgR1BSX1RJTUVTUEFOKTsKKworICBkZXRlY3Rvci5wb2xsc2V0ID0gZ3ByX21hbGxvYyhncnBjX3BvbGxzZXRfc2l6ZSgpKTsKKyAgZ3JwY19wb2xsc2V0X2luaXQoZGV0ZWN0b3IucG9sbHNldCwgJmdfcG9sbGluZ19tdSk7CisgIGRldGVjdG9yLmlzX2RvbmUgPSAwOworICBkZXRlY3Rvci5zdWNjZXNzID0gMDsKKworICBtZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihncnBjX2h0dHBjbGlfcmVxdWVzdCkpOworICByZXF1ZXN0Lmhvc3QgPSBHUlBDX0NPTVBVVEVfRU5HSU5FX0RFVEVDVElPTl9IT1NUOworICByZXF1ZXN0Lmh0dHAucGF0aCA9ICIvIjsKKworICBncnBjX2h0dHBjbGlfY29udGV4dF9pbml0KCZjb250ZXh0KTsKKworICBncnBjX2h0dHBjbGlfZ2V0KAorICAgICAgJmV4ZWNfY3R4LCAmY29udGV4dCwgZGV0ZWN0b3IucG9sbHNldCwgJnJlcXVlc3QsCisgICAgICBncHJfdGltZV9hZGQoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCBtYXhfZGV0ZWN0aW9uX2RlbGF5KSwKKyAgICAgIG9uX2NvbXB1dGVfZW5naW5lX2RldGVjdGlvbl9odHRwX3Jlc3BvbnNlLCAmZGV0ZWN0b3IpOworCisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisKKyAgLyogQmxvY2sgdW50aWwgd2UgZ2V0IHRoZSByZXNwb25zZS4gVGhpcyBpcyBub3QgaWRlYWwgYnV0IHRoaXMgc2hvdWxkIG9ubHkgYmUKKyAgICAgY2FsbGVkIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvY2VzcyBieSB0aGUgZGVmYXVsdCBjcmVkZW50aWFscy4gKi8KKyAgZ3ByX211X2xvY2soZ19wb2xsaW5nX211KTsKKyAgd2hpbGUgKCFkZXRlY3Rvci5pc19kb25lKSB7CisgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqd29ya2VyID0gTlVMTDsKKyAgICBncnBjX3BvbGxzZXRfd29yaygmZXhlY19jdHgsIGRldGVjdG9yLnBvbGxzZXQsICZ3b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgZ3ByX25vdyhHUFJfQ0xPQ0tfTU9OT1RPTklDKSwKKyAgICAgICAgICAgICAgICAgICAgICBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfTU9OT1RPTklDKSk7CisgIH0KKyAgZ3ByX211X3VubG9jayhnX3BvbGxpbmdfbXUpOworCisgIGdycGNfaHR0cGNsaV9jb250ZXh0X2Rlc3Ryb3koJmNvbnRleHQpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmZGVzdHJveV9jbG9zdXJlLCBkZXN0cm95X3BvbGxzZXQsIGRldGVjdG9yLnBvbGxzZXQpOworICBncnBjX3BvbGxzZXRfc2h1dGRvd24oJmV4ZWNfY3R4LCBkZXRlY3Rvci5wb2xsc2V0LCAmZGVzdHJveV9jbG9zdXJlKTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgZ19wb2xsaW5nX211ID0gTlVMTDsKKworICBncHJfZnJlZShkZXRlY3Rvci5wb2xsc2V0KTsKKworICByZXR1cm4gZGV0ZWN0b3Iuc3VjY2VzczsKK30KKworLyogVGFrZXMgb3duZXJzaGlwIG9mIGNyZWRzX3BhdGggaWYgbm90IE5VTEwuICovCitzdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVhdGVfZGVmYXVsdF9jcmVkc19mcm9tX3BhdGgoY2hhciAqY3JlZHNfcGF0aCkgeworICBncnBjX2pzb24gKmpzb24gPSBOVUxMOworICBncnBjX2F1dGhfanNvbl9rZXkga2V5OworICBncnBjX2F1dGhfcmVmcmVzaF90b2tlbiB0b2tlbjsKKyAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpyZXN1bHQgPSBOVUxMOworICBncHJfc2xpY2UgY3JlZHNfZGF0YSA9IGdwcl9lbXB0eV9zbGljZSgpOworICBpbnQgZmlsZV9vayA9IDA7CisgIGlmIChjcmVkc19wYXRoID09IE5VTEwpIGdvdG8gZW5kOworICBjcmVkc19kYXRhID0gZ3ByX2xvYWRfZmlsZShjcmVkc19wYXRoLCAwLCAmZmlsZV9vayk7CisgIGlmICghZmlsZV9vaykgZ290byBlbmQ7CisgIGpzb24gPSBncnBjX2pzb25fcGFyc2Vfc3RyaW5nX3dpdGhfbGVuKAorICAgICAgKGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKGNyZWRzX2RhdGEpLCBHUFJfU0xJQ0VfTEVOR1RIKGNyZWRzX2RhdGEpKTsKKyAgaWYgKGpzb24gPT0gTlVMTCkgZ290byBlbmQ7CisKKyAgLyogRmlyc3QsIHRyeSBhbiBhdXRoIGpzb24ga2V5LiAqLworICBrZXkgPSBncnBjX2F1dGhfanNvbl9rZXlfY3JlYXRlX2Zyb21fanNvbihqc29uKTsKKyAgaWYgKGdycGNfYXV0aF9qc29uX2tleV9pc192YWxpZCgma2V5KSkgeworICAgIHJlc3VsdCA9CisgICAgICAgIGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fYXV0aF9qc29uX2tleSgKKyAgICAgICAgICAgIGtleSwgZ3JwY19tYXhfYXV0aF90b2tlbl9saWZldGltZSgpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8qIFRoZW4gdHJ5IGEgcmVmcmVzaCB0b2tlbiBpZiB0aGUgYXV0aCBqc29uIGtleSB3YXMgaW52YWxpZC4gKi8KKyAgdG9rZW4gPSBncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9jcmVhdGVfZnJvbV9qc29uKGpzb24pOworICBpZiAoZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5faXNfdmFsaWQoJnRva2VuKSkgeworICAgIHJlc3VsdCA9CisgICAgICAgIGdycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX3JlZnJlc2hfdG9rZW4odG9rZW4pOworICAgIGdvdG8gZW5kOworICB9CisKK2VuZDoKKyAgaWYgKGNyZWRzX3BhdGggIT0gTlVMTCkgZ3ByX2ZyZWUoY3JlZHNfcGF0aCk7CisgIGdwcl9zbGljZV91bnJlZihjcmVkc19kYXRhKTsKKyAgaWYgKGpzb24gIT0gTlVMTCkgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqZ3JwY19nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFsc19jcmVhdGUodm9pZCkgeworICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKnJlc3VsdCA9IE5VTEw7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcyA9IE5VTEw7CisKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHNfY3JlYXRlKHZvaWQpIiwgMCwgKCkpOworCisgIGdwcl9vbmNlX2luaXQoJmdfb25jZSwgaW5pdF9kZWZhdWx0X2NyZWRlbnRpYWxzKTsKKworICBncHJfbXVfbG9jaygmZ19zdGF0ZV9tdSk7CisKKyAgaWYgKGRlZmF1bHRfY3JlZGVudGlhbHMgIT0gTlVMTCkgeworICAgIHJlc3VsdCA9IGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc19yZWYoZGVmYXVsdF9jcmVkZW50aWFscyk7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBGaXJzdCwgdHJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KKyAgY2FsbF9jcmVkcyA9IGNyZWF0ZV9kZWZhdWx0X2NyZWRzX2Zyb21fcGF0aCgKKyAgICAgIGdwcl9nZXRlbnYoR1JQQ19HT09HTEVfQ1JFREVOVElBTFNfRU5WX1ZBUikpOworICBpZiAoY2FsbF9jcmVkcyAhPSBOVUxMKSBnb3RvIGVuZDsKKworICAvKiBUaGVuIHRoZSB3ZWxsLWtub3duIGZpbGUuICovCisgIGNhbGxfY3JlZHMgPSBjcmVhdGVfZGVmYXVsdF9jcmVkc19mcm9tX3BhdGgoCisgICAgICBncnBjX2dldF93ZWxsX2tub3duX2dvb2dsZV9jcmVkZW50aWFsc19maWxlX3BhdGgoKSk7CisgIGlmIChjYWxsX2NyZWRzICE9IE5VTEwpIGdvdG8gZW5kOworCisgIC8qIEF0IGxhc3QgdHJ5IHRvIHNlZSBpZiB3ZSdyZSBvbiBjb21wdXRlIGVuZ2luZSAoZG8gdGhlIGRldGVjdGlvbiBvbmx5IG9uY2UKKyAgICAgc2luY2UgaXQgcmVxdWlyZXMgYSBuZXR3b3JrIHRlc3QpLiAqLworICBpZiAoIWNvbXB1dGVfZW5naW5lX2RldGVjdGlvbl9kb25lKSB7CisgICAgaW50IG5lZWRfY29tcHV0ZV9lbmdpbmVfY3JlZHMgPSBpc19zdGFja19ydW5uaW5nX29uX2NvbXB1dGVfZW5naW5lKCk7CisgICAgY29tcHV0ZV9lbmdpbmVfZGV0ZWN0aW9uX2RvbmUgPSAxOworICAgIGlmIChuZWVkX2NvbXB1dGVfZW5naW5lX2NyZWRzKSB7CisgICAgICBjYWxsX2NyZWRzID0gZ3JwY19nb29nbGVfY29tcHV0ZV9lbmdpbmVfY3JlZGVudGlhbHNfY3JlYXRlKE5VTEwpOworICAgIH0KKyAgfQorCitlbmQ6CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIGlmIChjYWxsX2NyZWRzICE9IE5VTEwpIHsKKyAgICAgIC8qIEJsZW5kIHdpdGggZGVmYXVsdCBzc2wgY3JlZGVudGlhbHMgYW5kIGFkZCBhIGdsb2JhbCByZWZlcmVuY2Ugc28gdGhhdAorICAgICAgICAgaXQKKyAgICAgICAgIGNhbiBiZSBjYWNoZWQgYW5kIHJlLXNlcnZlZC4gKi8KKyAgICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqc3NsX2NyZWRzID0KKyAgICAgICAgICBncnBjX3NzbF9jcmVkZW50aWFsc19jcmVhdGUoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICBkZWZhdWx0X2NyZWRlbnRpYWxzID0gZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlZigKKyAgICAgICAgICBncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzX2NyZWF0ZShzc2xfY3JlZHMsIGNhbGxfY3JlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICAgICAgR1BSX0FTU0VSVChkZWZhdWx0X2NyZWRlbnRpYWxzICE9IE5VTEwpOworICAgICAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3VucmVmKHNzbF9jcmVkcyk7CisgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoY2FsbF9jcmVkcyk7CisgICAgICByZXN1bHQgPSBkZWZhdWx0X2NyZWRlbnRpYWxzOworICAgIH0gZWxzZSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgZ29vZ2xlIGRlZmF1bHQgY3JlZGVudGlhbHMuIik7CisgICAgfQorICB9CisgIGdwcl9tdV91bmxvY2soJmdfc3RhdGVfbXUpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGdycGNfZmx1c2hfY2FjaGVkX2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzKHZvaWQpIHsKKyAgZ3ByX29uY2VfaW5pdCgmZ19vbmNlLCBpbml0X2RlZmF1bHRfY3JlZGVudGlhbHMpOworICBncHJfbXVfbG9jaygmZ19zdGF0ZV9tdSk7CisgIGlmIChkZWZhdWx0X2NyZWRlbnRpYWxzICE9IE5VTEwpIHsKKyAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdW5yZWYoZGVmYXVsdF9jcmVkZW50aWFscyk7CisgICAgZGVmYXVsdF9jcmVkZW50aWFscyA9IE5VTEw7CisgIH0KKyAgY29tcHV0ZV9lbmdpbmVfZGV0ZWN0aW9uX2RvbmUgPSAwOworICBncHJfbXVfdW5sb2NrKCZnX3N0YXRlX211KTsKK30KKworLyogLS0gV2VsbCBrbm93biBjcmVkZW50aWFscyBwYXRoLiAtLSAqLworCitzdGF0aWMgZ3JwY193ZWxsX2tub3duX2NyZWRlbnRpYWxzX3BhdGhfZ2V0dGVyIGNyZWRzX3BhdGhfZ2V0dGVyID0gTlVMTDsKKworY2hhciAqZ3JwY19nZXRfd2VsbF9rbm93bl9nb29nbGVfY3JlZGVudGlhbHNfZmlsZV9wYXRoKHZvaWQpIHsKKyAgaWYgKGNyZWRzX3BhdGhfZ2V0dGVyICE9IE5VTEwpIHJldHVybiBjcmVkc19wYXRoX2dldHRlcigpOworICByZXR1cm4gZ3JwY19nZXRfd2VsbF9rbm93bl9nb29nbGVfY3JlZGVudGlhbHNfZmlsZV9wYXRoX2ltcGwoKTsKK30KKwordm9pZCBncnBjX292ZXJyaWRlX3dlbGxfa25vd25fY3JlZGVudGlhbHNfcGF0aF9nZXR0ZXIoCisgICAgZ3JwY193ZWxsX2tub3duX2NyZWRlbnRpYWxzX3BhdGhfZ2V0dGVyIGdldHRlcikgeworICBjcmVkc19wYXRoX2dldHRlciA9IGdldHRlcjsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuYyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI2ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKKworI2RlZmluZSBHUlBDX0lOSVRJQUxfSEFORFNIQUtFX0JVRkZFUl9TSVpFIDI1NgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpjb25uZWN0b3I7CisgIHRzaV9oYW5kc2hha2VyICpoYW5kc2hha2VyOworICBib29sIGlzX2NsaWVudF9zaWRlOworICB1bnNpZ25lZCBjaGFyICpoYW5kc2hha2VfYnVmZmVyOworICBzaXplX3QgaGFuZHNoYWtlX2J1ZmZlcl9zaXplOworICBncnBjX2VuZHBvaW50ICp3cmFwcGVkX2VuZHBvaW50OworICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZW5kcG9pbnQ7CisgIGdwcl9zbGljZV9idWZmZXIgbGVmdF9vdmVyczsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBpbmNvbWluZzsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBvdXRnb2luZzsKKyAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYjsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBncnBjX2Nsb3N1cmUgb25faGFuZHNoYWtlX2RhdGFfc2VudF90b19wZWVyOworICBncnBjX2Nsb3N1cmUgb25faGFuZHNoYWtlX2RhdGFfcmVjZWl2ZWRfZnJvbV9wZWVyOworICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0OworfSBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZTsKKworc3RhdGljIHZvaWQgb25faGFuZHNoYWtlX2RhdGFfcmVjZWl2ZWRfZnJvbV9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNldHVwLCBib29sIHN1Y2Nlc3MpOworCitzdGF0aWMgdm9pZCBvbl9oYW5kc2hha2VfZGF0YV9zZW50X3RvX3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnNldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7CisKK3N0YXRpYyB2b2lkIHNlY3VyaXR5X2Nvbm5lY3Rvcl9yZW1vdmVfaGFuZHNoYWtlKGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoKSB7CisgIEdQUl9BU1NFUlQoIWgtPmlzX2NsaWVudF9zaWRlKTsKKyAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfaGFuZHNoYWtlX2xpc3QgKm5vZGU7CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0ICp0bXA7CisgIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MgPQorICAgICAgKGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKWgtPmNvbm5lY3RvcjsKKyAgZ3ByX211X2xvY2soJnNjLT5tdSk7CisgIG5vZGUgPSBzYy0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlczsKKyAgaWYgKG5vZGUgJiYgbm9kZS0+aGFuZHNoYWtlID09IGgpIHsKKyAgICBzYy0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlcyA9IG5vZGUtPm5leHQ7CisgICAgZ3ByX2ZyZWUobm9kZSk7CisgICAgZ3ByX211X3VubG9jaygmc2MtPm11KTsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBpZiAobm9kZS0+bmV4dC0+aGFuZHNoYWtlID09IGgpIHsKKyAgICAgIHRtcCA9IG5vZGUtPm5leHQ7CisgICAgICBub2RlLT5uZXh0ID0gbm9kZS0+bmV4dC0+bmV4dDsKKyAgICAgIGdwcl9mcmVlKHRtcCk7CisgICAgICBncHJfbXVfdW5sb2NrKCZzYy0+bXUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZzYy0+bXUpOworfQorCitzdGF0aWMgdm9pZCBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3N1Y2Nlc3MpIHsKKyAgaWYgKCFoLT5pc19jbGllbnRfc2lkZSkgeworICAgIHNlY3VyaXR5X2Nvbm5lY3Rvcl9yZW1vdmVfaGFuZHNoYWtlKGgpOworICB9CisgIGlmIChpc19zdWNjZXNzKSB7CisgICAgaC0+Y2IoZXhlY19jdHgsIGgtPnVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9PSywgaC0+c2VjdXJlX2VuZHBvaW50LAorICAgICAgICAgIGgtPmF1dGhfY29udGV4dCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGgtPnNlY3VyZV9lbmRwb2ludCAhPSBOVUxMKSB7CisgICAgICBncnBjX2VuZHBvaW50X3NodXRkb3duKGV4ZWNfY3R4LCBoLT5zZWN1cmVfZW5kcG9pbnQpOworICAgICAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCBoLT5zZWN1cmVfZW5kcG9pbnQpOworICAgIH0gZWxzZSB7CisgICAgICBncnBjX2VuZHBvaW50X2Rlc3Ryb3koZXhlY19jdHgsIGgtPndyYXBwZWRfZW5kcG9pbnQpOworICAgIH0KKyAgICBoLT5jYihleGVjX2N0eCwgaC0+dXNlcl9kYXRhLCBHUlBDX1NFQ1VSSVRZX0VSUk9SLCBOVUxMLCBOVUxMKTsKKyAgfQorICBpZiAoaC0+aGFuZHNoYWtlciAhPSBOVUxMKSB0c2lfaGFuZHNoYWtlcl9kZXN0cm95KGgtPmhhbmRzaGFrZXIpOworICBpZiAoaC0+aGFuZHNoYWtlX2J1ZmZlciAhPSBOVUxMKSBncHJfZnJlZShoLT5oYW5kc2hha2VfYnVmZmVyKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZoLT5sZWZ0X292ZXJzKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZoLT5vdXRnb2luZyk7CisgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmaC0+aW5jb21pbmcpOworICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihoLT5hdXRoX2NvbnRleHQsICJoYW5kc2hha2UiKTsKKyAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoaC0+Y29ubmVjdG9yLCAiaGFuZHNoYWtlIik7CisgIGdwcl9mcmVlKGgpOworfQorCitzdGF0aWMgdm9pZCBvbl9wZWVyX2NoZWNrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgeworICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCA9IHVzZXJfZGF0YTsKKyAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqcHJvdGVjdG9yOworICB0c2lfcmVzdWx0IHJlc3VsdDsKKyAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBjaGVja2luZyBwZWVyLiIpOworICAgIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAwKTsKKyAgICByZXR1cm47CisgIH0KKyAgaC0+YXV0aF9jb250ZXh0ID0gR1JQQ19BVVRIX0NPTlRFWFRfUkVGKGF1dGhfY29udGV4dCwgImhhbmRzaGFrZSIpOworICByZXN1bHQgPQorICAgICAgdHNpX2hhbmRzaGFrZXJfY3JlYXRlX2ZyYW1lX3Byb3RlY3RvcihoLT5oYW5kc2hha2VyLCBOVUxMLCAmcHJvdGVjdG9yKTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkZyYW1lIHByb3RlY3RvciBjcmVhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAorICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7CisgICAgc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmUoZXhlY19jdHgsIGgsIDApOworICAgIHJldHVybjsKKyAgfQorICBoLT5zZWN1cmVfZW5kcG9pbnQgPQorICAgICAgZ3JwY19zZWN1cmVfZW5kcG9pbnRfY3JlYXRlKHByb3RlY3RvciwgaC0+d3JhcHBlZF9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5sZWZ0X292ZXJzLnNsaWNlcywgaC0+bGVmdF9vdmVycy5jb3VudCk7CisgIGgtPmxlZnRfb3ZlcnMuY291bnQgPSAwOworICBoLT5sZWZ0X292ZXJzLmxlbmd0aCA9IDA7CisgIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAxKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjaGVja19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCkgeworICB0c2lfcGVlciBwZWVyOworICB0c2lfcmVzdWx0IHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcihoLT5oYW5kc2hha2VyLCAmcGVlcik7CisKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlBlZXIgZXh0cmFjdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlcyIsCisgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKKyAgICBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShleGVjX2N0eCwgaCwgMCk7CisgICAgcmV0dXJuOworICB9CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2NoZWNrX3BlZXIoZXhlY19jdHgsIGgtPmNvbm5lY3RvciwgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9wZWVyX2NoZWNrZWQsIGgpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2hhbmRzaGFrZV9ieXRlc190b19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCkgeworICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIGdwcl9zbGljZSB0b19zZW5kOworCisgIGRvIHsKKyAgICBzaXplX3QgdG9fc2VuZF9zaXplID0gaC0+aGFuZHNoYWtlX2J1ZmZlcl9zaXplIC0gb2Zmc2V0OworICAgIHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX2dldF9ieXRlc190b19zZW5kX3RvX3BlZXIoCisgICAgICAgIGgtPmhhbmRzaGFrZXIsIGgtPmhhbmRzaGFrZV9idWZmZXIgKyBvZmZzZXQsICZ0b19zZW5kX3NpemUpOworICAgIG9mZnNldCArPSB0b19zZW5kX3NpemU7CisgICAgaWYgKHJlc3VsdCA9PSBUU0lfSU5DT01QTEVURV9EQVRBKSB7CisgICAgICBoLT5oYW5kc2hha2VfYnVmZmVyX3NpemUgKj0gMjsKKyAgICAgIGgtPmhhbmRzaGFrZV9idWZmZXIgPQorICAgICAgICAgIGdwcl9yZWFsbG9jKGgtPmhhbmRzaGFrZV9idWZmZXIsIGgtPmhhbmRzaGFrZV9idWZmZXJfc2l6ZSk7CisgICAgfQorICB9IHdoaWxlIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSk7CisKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZSBmYWlsZWQgd2l0aCBlcnJvciAlcyIsCisgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKKyAgICBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShleGVjX2N0eCwgaCwgMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdG9fc2VuZCA9CisgICAgICBncHJfc2xpY2VfZnJvbV9jb3BpZWRfYnVmZmVyKChjb25zdCBjaGFyICopaC0+aGFuZHNoYWtlX2J1ZmZlciwgb2Zmc2V0KTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoJmgtPm91dGdvaW5nKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmgtPm91dGdvaW5nLCB0b19zZW5kKTsKKyAgLyogVE9ETyhrbGVtcG5lcixqYm9ldWYpOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIGNsaWVudCBzZXR1cAorICAgICBkZWFkbGluZSAqLworICBncnBjX2VuZHBvaW50X3dyaXRlKGV4ZWNfY3R4LCBoLT53cmFwcGVkX2VuZHBvaW50LCAmaC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgJmgtPm9uX2hhbmRzaGFrZV9kYXRhX3NlbnRfdG9fcGVlcik7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2hhbmRzaGFrZV9kYXRhX3JlY2VpdmVkX2Zyb21fcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpoYW5kc2hha2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoID0gaGFuZHNoYWtlOworICBzaXplX3QgY29uc3VtZWRfc2xpY2Vfc2l6ZSA9IDA7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICBzaXplX3QgaTsKKyAgc2l6ZV90IG51bV9sZWZ0X292ZXJzOworICBpbnQgaGFzX2xlZnRfb3ZlcnNfaW5fY3VycmVudF9zbGljZSA9IDA7CisKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJSZWFkIGZhaWxlZC4iKTsKKyAgICBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShleGVjX2N0eCwgaCwgMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGgtPmluY29taW5nLmNvdW50OyBpKyspIHsKKyAgICBjb25zdW1lZF9zbGljZV9zaXplID0gR1BSX1NMSUNFX0xFTkdUSChoLT5pbmNvbWluZy5zbGljZXNbaV0pOworICAgIHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX3Byb2Nlc3NfYnl0ZXNfZnJvbV9wZWVyKAorICAgICAgICBoLT5oYW5kc2hha2VyLCBHUFJfU0xJQ0VfU1RBUlRfUFRSKGgtPmluY29taW5nLnNsaWNlc1tpXSksCisgICAgICAgICZjb25zdW1lZF9zbGljZV9zaXplKTsKKyAgICBpZiAoIXRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKGgtPmhhbmRzaGFrZXIpKSBicmVhazsKKyAgfQorCisgIGlmICh0c2lfaGFuZHNoYWtlcl9pc19pbl9wcm9ncmVzcyhoLT5oYW5kc2hha2VyKSkgeworICAgIC8qIFdlIG1heSBuZWVkIG1vcmUgZGF0YS4gKi8KKyAgICBpZiAocmVzdWx0ID09IFRTSV9JTkNPTVBMRVRFX0RBVEEpIHsKKyAgICAgIGdycGNfZW5kcG9pbnRfcmVhZChleGVjX2N0eCwgaC0+d3JhcHBlZF9lbmRwb2ludCwgJmgtPmluY29taW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5vbl9oYW5kc2hha2VfZGF0YV9yZWNlaXZlZF9mcm9tX3BlZXIpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBzZW5kX2hhbmRzaGFrZV9ieXRlc190b19wZWVyKGV4ZWNfY3R4LCBoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSGFuZHNoYWtlIGZhaWxlZCB3aXRoIGVycm9yICVzIiwKKyAgICAgICAgICAgIHRzaV9yZXN1bHRfdG9fc3RyaW5nKHJlc3VsdCkpOworICAgIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBIYW5kc2hha2UgaXMgZG9uZSBhbmQgc3VjY2Vzc2Z1bCB0aGlzIHBvaW50LiAqLworICBoYXNfbGVmdF9vdmVyc19pbl9jdXJyZW50X3NsaWNlID0KKyAgICAgIChjb25zdW1lZF9zbGljZV9zaXplIDwgR1BSX1NMSUNFX0xFTkdUSChoLT5pbmNvbWluZy5zbGljZXNbaV0pKTsKKyAgbnVtX2xlZnRfb3ZlcnMgPQorICAgICAgKGhhc19sZWZ0X292ZXJzX2luX2N1cnJlbnRfc2xpY2UgPyAxIDogMCkgKyBoLT5pbmNvbWluZy5jb3VudCAtIGkgLSAxOworICBpZiAobnVtX2xlZnRfb3ZlcnMgPT0gMCkgeworICAgIGNoZWNrX3BlZXIoZXhlY19jdHgsIGgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFB1dCB0aGUgbGVmdG92ZXJzIGluIG91ciBidWZmZXIgKG93bmVyc2hpcCB0cmFuc2ZlcmVkKS4gKi8KKyAgaWYgKGhhc19sZWZ0X292ZXJzX2luX2N1cnJlbnRfc2xpY2UpIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgKKyAgICAgICAgJmgtPmxlZnRfb3ZlcnMsCisgICAgICAgIGdwcl9zbGljZV9zcGxpdF90YWlsKCZoLT5pbmNvbWluZy5zbGljZXNbaV0sIGNvbnN1bWVkX3NsaWNlX3NpemUpKTsKKyAgICBncHJfc2xpY2VfdW5yZWYoCisgICAgICAgIGgtPmluY29taW5nLnNsaWNlc1tpXSk7IC8qIHNwbGl0X3RhaWwgYWJvdmUgaW5jcmVtZW50cyByZWZjb3VudC4gKi8KKyAgfQorICBncHJfc2xpY2VfYnVmZmVyX2FkZG4oCisgICAgICAmaC0+bGVmdF9vdmVycywgJmgtPmluY29taW5nLnNsaWNlc1tpICsgMV0sCisgICAgICBudW1fbGVmdF9vdmVycyAtIChzaXplX3QpaGFzX2xlZnRfb3ZlcnNfaW5fY3VycmVudF9zbGljZSk7CisgIGNoZWNrX3BlZXIoZXhlY19jdHgsIGgpOworfQorCisvKiBJZiBoYW5kc2hha2UgaXMgTlVMTCwgdGhlIGhhbmRzaGFrZSBpcyBkb25lLiAqLworc3RhdGljIHZvaWQgb25faGFuZHNoYWtlX2RhdGFfc2VudF90b19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRzaGFrZSwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoID0gaGFuZHNoYWtlOworCisgIC8qIE1ha2Ugc3VyZSB0aGF0IHdyaXRlIGlzIE9LLiAqLworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIldyaXRlIGZhaWxlZC4iKTsKKyAgICBpZiAoaGFuZHNoYWtlICE9IE5VTEwpIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBXZSBtYXkgYmUgZG9uZS4gKi8KKyAgaWYgKHRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKGgtPmhhbmRzaGFrZXIpKSB7CisgICAgLyogVE9ETyhrbGVtcG5lcixqYm9ldWYpOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIGNsaWVudCBzZXR1cAorICAgICAgIGRlYWRsaW5lICovCisgICAgZ3JwY19lbmRwb2ludF9yZWFkKGV4ZWNfY3R4LCBoLT53cmFwcGVkX2VuZHBvaW50LCAmaC0+aW5jb21pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICZoLT5vbl9oYW5kc2hha2VfZGF0YV9yZWNlaXZlZF9mcm9tX3BlZXIpOworICB9IGVsc2UgeworICAgIGNoZWNrX3BlZXIoZXhlY19jdHgsIGgpOworICB9Cit9CisKK3ZvaWQgZ3JwY19kb19zZWN1cml0eV9oYW5kc2hha2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9oYW5kc2hha2VyICpoYW5kc2hha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqY29ubmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NsaWVudF9zaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdCAqaGFuZHNoYWtlX25vZGU7CisgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZWN1cml0eV9oYW5kc2hha2UpKTsKKyAgbWVtc2V0KGgsIDAsIHNpemVvZihncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSkpOworICBoLT5oYW5kc2hha2VyID0gaGFuZHNoYWtlcjsKKyAgaC0+Y29ubmVjdG9yID0gR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKGNvbm5lY3RvciwgImhhbmRzaGFrZSIpOworICBoLT5pc19jbGllbnRfc2lkZSA9IGlzX2NsaWVudF9zaWRlOworICBoLT5oYW5kc2hha2VfYnVmZmVyX3NpemUgPSBHUlBDX0lOSVRJQUxfSEFORFNIQUtFX0JVRkZFUl9TSVpFOworICBoLT5oYW5kc2hha2VfYnVmZmVyID0gZ3ByX21hbGxvYyhoLT5oYW5kc2hha2VfYnVmZmVyX3NpemUpOworICBoLT53cmFwcGVkX2VuZHBvaW50ID0gbm9uc2VjdXJlX2VuZHBvaW50OworICBoLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGgtPmNiID0gY2I7CisgIGdycGNfY2xvc3VyZV9pbml0KCZoLT5vbl9oYW5kc2hha2VfZGF0YV9zZW50X3RvX3BlZXIsCisgICAgICAgICAgICAgICAgICAgIG9uX2hhbmRzaGFrZV9kYXRhX3NlbnRfdG9fcGVlciwgaCk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZoLT5vbl9oYW5kc2hha2VfZGF0YV9yZWNlaXZlZF9mcm9tX3BlZXIsCisgICAgICAgICAgICAgICAgICAgIG9uX2hhbmRzaGFrZV9kYXRhX3JlY2VpdmVkX2Zyb21fcGVlciwgaCk7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmaC0+bGVmdF9vdmVycyk7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmaC0+b3V0Z29pbmcpOworICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmgtPmluY29taW5nKTsKKyAgaWYgKCFpc19jbGllbnRfc2lkZSkgeworICAgIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2VydmVyX2Nvbm5lY3RvciA9CisgICAgICAgIChncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKiljb25uZWN0b3I7CisgICAgaGFuZHNoYWtlX25vZGUgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdCkpOworICAgIGhhbmRzaGFrZV9ub2RlLT5oYW5kc2hha2UgPSBoOworICAgIGdwcl9tdV9sb2NrKCZzZXJ2ZXJfY29ubmVjdG9yLT5tdSk7CisgICAgaGFuZHNoYWtlX25vZGUtPm5leHQgPSBzZXJ2ZXJfY29ubmVjdG9yLT5oYW5kc2hha2luZ19oYW5kc2hha2VzOworICAgIHNlcnZlcl9jb25uZWN0b3ItPmhhbmRzaGFraW5nX2hhbmRzaGFrZXMgPSBoYW5kc2hha2Vfbm9kZTsKKyAgICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXJfY29ubmVjdG9yLT5tdSk7CisgIH0KKyAgc2VuZF9oYW5kc2hha2VfYnl0ZXNfdG9fcGVlcihleGVjX2N0eCwgaCk7Cit9CisKK3ZvaWQgZ3JwY19zZWN1cml0eV9oYW5kc2hha2Vfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRzaGFrZSkgeworICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCA9IGhhbmRzaGFrZTsKKyAgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihleGVjX2N0eCwgaC0+d3JhcHBlZF9lbmRwb2ludCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmggYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkN2JiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuaApAQCAtMCwwICsxLDUxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfSEFORFNIQUtFX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9IQU5EU0hBS0VfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgorCisvKiBDYWxscyB0aGUgY2FsbGJhY2sgdXBvbiBjb21wbGV0aW9uLiBUYWtlcyBvd2Vyc2hpcCBvZiBoYW5kc2hha2VyLiAqLwordm9pZCBncnBjX2RvX3NlY3VyaXR5X2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX2hhbmRzaGFrZXIgKmhhbmRzaGFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpjb25uZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2xpZW50X3NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKwordm9pZCBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqaGFuZHNoYWtlKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfSEFORFNIQUtFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmMgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDU0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKy8qIC0tLSBDb25zdGFudHMuIC0tLSAqLworCisvKiAxIGhvdXIgbWF4LiAqLworZ3ByX3RpbWVzcGVjIGdycGNfbWF4X2F1dGhfdG9rZW5fbGlmZXRpbWUoKSB7CisgIGdwcl90aW1lc3BlYyBvdXQ7CisgIG91dC50dl9zZWMgPSAzNjAwOworICBvdXQudHZfbnNlYyA9IDA7CisgIG91dC5jbG9ja190eXBlID0gR1BSX1RJTUVTUEFOOworICByZXR1cm4gb3V0OworfQorCisjZGVmaW5lIEdSUENfSldUX1JTQV9TSEEyNTZfQUxHT1JJVEhNICJSUzI1NiIKKyNkZWZpbmUgR1JQQ19KV1RfVFlQRSAiSldUIgorCisvKiAtLS0gT3ZlcnJpZGUgZm9yIHRlc3RpbmcuIC0tLSAqLworCitzdGF0aWMgZ3JwY19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlIGdfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZSA9IE5VTEw7CisKKy8qIC0tLSBncnBjX2F1dGhfanNvbl9rZXkuIC0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqanNvbl9nZXRfc3RyaW5nX3Byb3BlcnR5KGNvbnN0IGdycGNfanNvbiAqanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcF9uYW1lKSB7CisgIGdycGNfanNvbiAqY2hpbGQ7CisgIGZvciAoY2hpbGQgPSBqc29uLT5jaGlsZDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgIGlmIChzdHJjbXAoY2hpbGQtPmtleSwgcHJvcF9uYW1lKSA9PSAwKSBicmVhazsKKyAgfQorICBpZiAoY2hpbGQgPT0gTlVMTCB8fCBjaGlsZC0+dHlwZSAhPSBHUlBDX0pTT05fU1RSSU5HKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIG9yIG1pc3NpbmcgJXMgcHJvcGVydHkuIiwgcHJvcF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gY2hpbGQtPnZhbHVlOworfQorCitzdGF0aWMgaW50IHNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoY29uc3QgZ3JwY19qc29uICpqc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqanNvbl9rZXlfZmllbGQpIHsKKyAgY29uc3QgY2hhciAqcHJvcF92YWx1ZSA9IGpzb25fZ2V0X3N0cmluZ19wcm9wZXJ0eShqc29uLCBwcm9wX25hbWUpOworICBpZiAocHJvcF92YWx1ZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgKmpzb25fa2V5X2ZpZWxkID0gZ3ByX3N0cmR1cChwcm9wX3ZhbHVlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBncnBjX2F1dGhfanNvbl9rZXlfaXNfdmFsaWQoY29uc3QgZ3JwY19hdXRoX2pzb25fa2V5ICpqc29uX2tleSkgeworICByZXR1cm4gKGpzb25fa2V5ICE9IE5VTEwpICYmCisgICAgICAgICBzdHJjbXAoanNvbl9rZXktPnR5cGUsIEdSUENfQVVUSF9KU09OX1RZUEVfSU5WQUxJRCk7Cit9CisKK2dycGNfYXV0aF9qc29uX2tleSBncnBjX2F1dGhfanNvbl9rZXlfY3JlYXRlX2Zyb21fanNvbihjb25zdCBncnBjX2pzb24gKmpzb24pIHsKKyAgZ3JwY19hdXRoX2pzb25fa2V5IHJlc3VsdDsKKyAgQklPICpiaW8gPSBOVUxMOworICBjb25zdCBjaGFyICpwcm9wX3ZhbHVlOworICBpbnQgc3VjY2VzcyA9IDA7CisKKyAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihncnBjX2F1dGhfanNvbl9rZXkpKTsKKyAgcmVzdWx0LnR5cGUgPSBHUlBDX0FVVEhfSlNPTl9UWVBFX0lOVkFMSUQ7CisgIGlmIChqc29uID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQganNvbi4iKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIHByb3BfdmFsdWUgPSBqc29uX2dldF9zdHJpbmdfcHJvcGVydHkoanNvbiwgInR5cGUiKTsKKyAgaWYgKHByb3BfdmFsdWUgPT0gTlVMTCB8fAorICAgICAgc3RyY21wKHByb3BfdmFsdWUsIEdSUENfQVVUSF9KU09OX1RZUEVfU0VSVklDRV9BQ0NPVU5UKSkgeworICAgIGdvdG8gZW5kOworICB9CisgIHJlc3VsdC50eXBlID0gR1JQQ19BVVRIX0pTT05fVFlQRV9TRVJWSUNFX0FDQ09VTlQ7CisKKyAgaWYgKCFzZXRfanNvbl9rZXlfc3RyaW5nX3Byb3BlcnR5KGpzb24sICJwcml2YXRlX2tleV9pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LnByaXZhdGVfa2V5X2lkKSB8fAorICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9pZCIsICZyZXN1bHQuY2xpZW50X2lkKSB8fAorICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9lbWFpbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LmNsaWVudF9lbWFpbCkpIHsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIHByb3BfdmFsdWUgPSBqc29uX2dldF9zdHJpbmdfcHJvcGVydHkoanNvbiwgInByaXZhdGVfa2V5Iik7CisgIGlmIChwcm9wX3ZhbHVlID09IE5VTEwpIHsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKKyAgc3VjY2VzcyA9IEJJT19wdXRzKGJpbywgcHJvcF92YWx1ZSk7CisgIGlmICgoc3VjY2VzcyA8IDApIHx8ICgoc2l6ZV90KXN1Y2Nlc3MgIT0gc3RybGVuKHByb3BfdmFsdWUpKSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IHdyaXRlIGludG8gb3BlbnNzbCBCSU8uIik7CisgICAgZ290byBlbmQ7CisgIH0KKyAgcmVzdWx0LnByaXZhdGVfa2V5ID0gUEVNX3JlYWRfYmlvX1JTQVByaXZhdGVLZXkoYmlvLCBOVUxMLCBOVUxMLCAiIik7CisgIGlmIChyZXN1bHQucHJpdmF0ZV9rZXkgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGRlc2VyaWFsaXplIHByaXZhdGUga2V5LiIpOworICAgIGdvdG8gZW5kOworICB9CisgIHN1Y2Nlc3MgPSAxOworCitlbmQ6CisgIGlmIChiaW8gIT0gTlVMTCkgQklPX2ZyZWUoYmlvKTsKKyAgaWYgKCFzdWNjZXNzKSBncnBjX2F1dGhfanNvbl9rZXlfZGVzdHJ1Y3QoJnJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dycGNfYXV0aF9qc29uX2tleSBncnBjX2F1dGhfanNvbl9rZXlfY3JlYXRlX2Zyb21fc3RyaW5nKAorICAgIGNvbnN0IGNoYXIgKmpzb25fc3RyaW5nKSB7CisgIGNoYXIgKnNjcmF0Y2hwYWQgPSBncHJfc3RyZHVwKGpzb25fc3RyaW5nKTsKKyAgZ3JwY19qc29uICpqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZyhzY3JhdGNocGFkKTsKKyAgZ3JwY19hdXRoX2pzb25fa2V5IHJlc3VsdCA9IGdycGNfYXV0aF9qc29uX2tleV9jcmVhdGVfZnJvbV9qc29uKGpzb24pOworICBpZiAoanNvbiAhPSBOVUxMKSBncnBjX2pzb25fZGVzdHJveShqc29uKTsKKyAgZ3ByX2ZyZWUoc2NyYXRjaHBhZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgZ3JwY19hdXRoX2pzb25fa2V5X2Rlc3RydWN0KGdycGNfYXV0aF9qc29uX2tleSAqanNvbl9rZXkpIHsKKyAgaWYgKGpzb25fa2V5ID09IE5VTEwpIHJldHVybjsKKyAganNvbl9rZXktPnR5cGUgPSBHUlBDX0FVVEhfSlNPTl9UWVBFX0lOVkFMSUQ7CisgIGlmIChqc29uX2tleS0+Y2xpZW50X2lkICE9IE5VTEwpIHsKKyAgICBncHJfZnJlZShqc29uX2tleS0+Y2xpZW50X2lkKTsKKyAgICBqc29uX2tleS0+Y2xpZW50X2lkID0gTlVMTDsKKyAgfQorICBpZiAoanNvbl9rZXktPnByaXZhdGVfa2V5X2lkICE9IE5VTEwpIHsKKyAgICBncHJfZnJlZShqc29uX2tleS0+cHJpdmF0ZV9rZXlfaWQpOworICAgIGpzb25fa2V5LT5wcml2YXRlX2tleV9pZCA9IE5VTEw7CisgIH0KKyAgaWYgKGpzb25fa2V5LT5jbGllbnRfZW1haWwgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKGpzb25fa2V5LT5jbGllbnRfZW1haWwpOworICAgIGpzb25fa2V5LT5jbGllbnRfZW1haWwgPSBOVUxMOworICB9CisgIGlmIChqc29uX2tleS0+cHJpdmF0ZV9rZXkgIT0gTlVMTCkgeworICAgIFJTQV9mcmVlKGpzb25fa2V5LT5wcml2YXRlX2tleSk7CisgICAganNvbl9rZXktPnByaXZhdGVfa2V5ID0gTlVMTDsKKyAgfQorfQorCisvKiAtLS0gand0IGVuY29kaW5nIGFuZCBzaWduYXR1cmUuIC0tLSAqLworCitzdGF0aWMgZ3JwY19qc29uICpjcmVhdGVfY2hpbGQoZ3JwY19qc29uICpicm90aGVyLCBncnBjX2pzb24gKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl90eXBlIHR5cGUpIHsKKyAgZ3JwY19qc29uICpjaGlsZCA9IGdycGNfanNvbl9jcmVhdGUodHlwZSk7CisgIGlmIChicm90aGVyKSBicm90aGVyLT5uZXh0ID0gY2hpbGQ7CisgIGlmICghcGFyZW50LT5jaGlsZCkgcGFyZW50LT5jaGlsZCA9IGNoaWxkOworICBjaGlsZC0+cGFyZW50ID0gcGFyZW50OworICBjaGlsZC0+dmFsdWUgPSB2YWx1ZTsKKyAgY2hpbGQtPmtleSA9IGtleTsKKyAgcmV0dXJuIGNoaWxkOworfQorCitzdGF0aWMgY2hhciAqZW5jb2RlZF9qd3RfaGVhZGVyKGNvbnN0IGNoYXIgKmtleV9pZCwgY29uc3QgY2hhciAqYWxnb3JpdGhtKSB7CisgIGdycGNfanNvbiAqanNvbiA9IGdycGNfanNvbl9jcmVhdGUoR1JQQ19KU09OX09CSkVDVCk7CisgIGdycGNfanNvbiAqY2hpbGQgPSBOVUxMOworICBjaGFyICpqc29uX3N0ciA9IE5VTEw7CisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisKKyAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoTlVMTCwganNvbiwgImFsZyIsIGFsZ29yaXRobSwgR1JQQ19KU09OX1NUUklORyk7CisgIGNoaWxkID0gY3JlYXRlX2NoaWxkKGNoaWxkLCBqc29uLCAidHlwIiwgR1JQQ19KV1RfVFlQRSwgR1JQQ19KU09OX1NUUklORyk7CisgIGNyZWF0ZV9jaGlsZChjaGlsZCwganNvbiwgImtpZCIsIGtleV9pZCwgR1JQQ19KU09OX1NUUklORyk7CisKKyAganNvbl9zdHIgPSBncnBjX2pzb25fZHVtcF90b19zdHJpbmcoanNvbiwgMCk7CisgIHJlc3VsdCA9IGdycGNfYmFzZTY0X2VuY29kZShqc29uX3N0ciwgc3RybGVuKGpzb25fc3RyKSwgMSwgMCk7CisgIGdwcl9mcmVlKGpzb25fc3RyKTsKKyAgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjaGFyICplbmNvZGVkX2p3dF9jbGFpbShjb25zdCBncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGllbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSwgY29uc3QgY2hhciAqc2NvcGUpIHsKKyAgZ3JwY19qc29uICpqc29uID0gZ3JwY19qc29uX2NyZWF0ZShHUlBDX0pTT05fT0JKRUNUKTsKKyAgZ3JwY19qc29uICpjaGlsZCA9IE5VTEw7CisgIGNoYXIgKmpzb25fc3RyID0gTlVMTDsKKyAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgZ3ByX3RpbWVzcGVjIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgZ3ByX3RpbWVzcGVjIGV4cGlyYXRpb24gPSBncHJfdGltZV9hZGQobm93LCB0b2tlbl9saWZldGltZSk7CisgIGNoYXIgbm93X3N0cltHUFJfTFRPQV9NSU5fQlVGU0laRV07CisgIGNoYXIgZXhwaXJhdGlvbl9zdHJbR1BSX0xUT0FfTUlOX0JVRlNJWkVdOworICBpZiAoZ3ByX3RpbWVfY21wKHRva2VuX2xpZmV0aW1lLCBncnBjX21heF9hdXRoX3Rva2VuX2xpZmV0aW1lKCkpID4gMCkgeworICAgIGdwcl9sb2coR1BSX0lORk8sICJDcm9wcGluZyB0b2tlbiBsaWZldGltZSB0byBtYXhpbXVtIGFsbG93ZWQgdmFsdWUuIik7CisgICAgZXhwaXJhdGlvbiA9IGdwcl90aW1lX2FkZChub3csIGdycGNfbWF4X2F1dGhfdG9rZW5fbGlmZXRpbWUoKSk7CisgIH0KKyAgaW50NjRfdHRvYShub3cudHZfc2VjLCBub3dfc3RyKTsKKyAgaW50NjRfdHRvYShleHBpcmF0aW9uLnR2X3NlYywgZXhwaXJhdGlvbl9zdHIpOworCisgIGNoaWxkID0KKyAgICAgIGNyZWF0ZV9jaGlsZChOVUxMLCBqc29uLCAiaXNzIiwganNvbl9rZXktPmNsaWVudF9lbWFpbCwgR1JQQ19KU09OX1NUUklORyk7CisgIGlmIChzY29wZSAhPSBOVUxMKSB7CisgICAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoY2hpbGQsIGpzb24sICJzY29wZSIsIHNjb3BlLCBHUlBDX0pTT05fU1RSSU5HKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBVbnNjb3BlZCBKV1RzIG5lZWQgYSBzdWIgZmllbGQuICovCisgICAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoY2hpbGQsIGpzb24sICJzdWIiLCBqc29uX2tleS0+Y2xpZW50X2VtYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfSlNPTl9TVFJJTkcpOworICB9CisKKyAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoY2hpbGQsIGpzb24sICJhdWQiLCBhdWRpZW5jZSwgR1JQQ19KU09OX1NUUklORyk7CisgIGNoaWxkID0gY3JlYXRlX2NoaWxkKGNoaWxkLCBqc29uLCAiaWF0Iiwgbm93X3N0ciwgR1JQQ19KU09OX05VTUJFUik7CisgIGNyZWF0ZV9jaGlsZChjaGlsZCwganNvbiwgImV4cCIsIGV4cGlyYXRpb25fc3RyLCBHUlBDX0pTT05fTlVNQkVSKTsKKworICBqc29uX3N0ciA9IGdycGNfanNvbl9kdW1wX3RvX3N0cmluZyhqc29uLCAwKTsKKyAgcmVzdWx0ID0gZ3JwY19iYXNlNjRfZW5jb2RlKGpzb25fc3RyLCBzdHJsZW4oanNvbl9zdHIpLCAxLCAwKTsKKyAgZ3ByX2ZyZWUoanNvbl9zdHIpOworICBncnBjX2pzb25fZGVzdHJveShqc29uKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGNoYXIgKmRvdF9jb25jYXRfYW5kX2ZyZWVfc3RyaW5ncyhjaGFyICpzdHIxLCBjaGFyICpzdHIyKSB7CisgIHNpemVfdCBzdHIxX2xlbiA9IHN0cmxlbihzdHIxKTsKKyAgc2l6ZV90IHN0cjJfbGVuID0gc3RybGVuKHN0cjIpOworICBzaXplX3QgcmVzdWx0X2xlbiA9IHN0cjFfbGVuICsgMSAvKiBkb3QgKi8gKyBzdHIyX2xlbjsKKyAgY2hhciAqcmVzdWx0ID0gZ3ByX21hbGxvYyhyZXN1bHRfbGVuICsgMSAvKiBOVUxMIHRlcm1pbmF0ZWQgKi8pOworICBjaGFyICpjdXJyZW50ID0gcmVzdWx0OworICBtZW1jcHkoY3VycmVudCwgc3RyMSwgc3RyMV9sZW4pOworICBjdXJyZW50ICs9IHN0cjFfbGVuOworICAqKGN1cnJlbnQrKykgPSAnLic7CisgIG1lbWNweShjdXJyZW50LCBzdHIyLCBzdHIyX2xlbik7CisgIGN1cnJlbnQgKz0gc3RyMl9sZW47CisgIEdQUl9BU1NFUlQoY3VycmVudCA+PSByZXN1bHQpOworICBHUFJfQVNTRVJUKCh1aW50cHRyX3QpKGN1cnJlbnQgLSByZXN1bHQpID09IHJlc3VsdF9sZW4pOworICAqY3VycmVudCA9ICdcMCc7CisgIGdwcl9mcmVlKHN0cjEpOworICBncHJfZnJlZShzdHIyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgRVZQX01EICpvcGVuc3NsX2RpZ2VzdF9mcm9tX2FsZ29yaXRobShjb25zdCBjaGFyICphbGdvcml0aG0pIHsKKyAgaWYgKHN0cmNtcChhbGdvcml0aG0sIEdSUENfSldUX1JTQV9TSEEyNTZfQUxHT1JJVEhNKSA9PSAwKSB7CisgICAgcmV0dXJuIEVWUF9zaGEyNTYoKTsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gYWxnb3JpdGhtICVzLiIsIGFsZ29yaXRobSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY2hhciAqY29tcHV0ZV9hbmRfZW5jb2RlX3NpZ25hdHVyZShjb25zdCBncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWduYXR1cmVfYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zaWduKSB7CisgIGNvbnN0IEVWUF9NRCAqbWQgPSBvcGVuc3NsX2RpZ2VzdF9mcm9tX2FsZ29yaXRobShzaWduYXR1cmVfYWxnb3JpdGhtKTsKKyAgRVZQX01EX0NUWCAqbWRfY3R4ID0gTlVMTDsKKyAgRVZQX1BLRVkgKmtleSA9IEVWUF9QS0VZX25ldygpOworICBzaXplX3Qgc2lnX2xlbiA9IDA7CisgIHVuc2lnbmVkIGNoYXIgKnNpZyA9IE5VTEw7CisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIGlmIChtZCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgbWRfY3R4ID0gRVZQX01EX0NUWF9jcmVhdGUoKTsKKyAgaWYgKG1kX2N0eCA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIE1EX0NUWCIpOworICAgIGdvdG8gZW5kOworICB9CisgIEVWUF9QS0VZX3NldDFfUlNBKGtleSwganNvbl9rZXktPnByaXZhdGVfa2V5KTsKKyAgaWYgKEVWUF9EaWdlc3RTaWduSW5pdChtZF9jdHgsIE5VTEwsIG1kLCBOVUxMLCBrZXkpICE9IDEpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkRpZ2VzdEluaXQgZmFpbGVkLiIpOworICAgIGdvdG8gZW5kOworICB9CisgIGlmIChFVlBfRGlnZXN0U2lnblVwZGF0ZShtZF9jdHgsIHRvX3NpZ24sIHN0cmxlbih0b19zaWduKSkgIT0gMSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRGlnZXN0VXBkYXRlIGZhaWxlZC4iKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAoRVZQX0RpZ2VzdFNpZ25GaW5hbChtZF9jdHgsIE5VTEwsICZzaWdfbGVuKSAhPSAxKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJEaWdlc3RGaW5hbCAoZ2V0IHNpZ25hdHVyZSBsZW5ndGgpIGZhaWxlZC4iKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBzaWcgPSBncHJfbWFsbG9jKHNpZ19sZW4pOworICBpZiAoRVZQX0RpZ2VzdFNpZ25GaW5hbChtZF9jdHgsIHNpZywgJnNpZ19sZW4pICE9IDEpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkRpZ2VzdEZpbmFsIChzaWduYXR1cmUgY29tcHV0ZSkgZmFpbGVkLiIpOworICAgIGdvdG8gZW5kOworICB9CisgIHJlc3VsdCA9IGdycGNfYmFzZTY0X2VuY29kZShzaWcsIHNpZ19sZW4sIDEsIDApOworCitlbmQ6CisgIGlmIChrZXkgIT0gTlVMTCkgRVZQX1BLRVlfZnJlZShrZXkpOworICBpZiAobWRfY3R4ICE9IE5VTEwpIEVWUF9NRF9DVFhfZGVzdHJveShtZF9jdHgpOworICBpZiAoc2lnICE9IE5VTEwpIGdwcl9mcmVlKHNpZyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2NoYXIgKmdycGNfand0X2VuY29kZV9hbmRfc2lnbihjb25zdCBncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGllbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSwgY29uc3QgY2hhciAqc2NvcGUpIHsKKyAgaWYgKGdfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIGdfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZShqc29uX2tleSwgYXVkaWVuY2UsIHRva2VuX2xpZmV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUpOworICB9IGVsc2UgeworICAgIGNvbnN0IGNoYXIgKnNpZ19hbGdvID0gR1JQQ19KV1RfUlNBX1NIQTI1Nl9BTEdPUklUSE07CisgICAgY2hhciAqdG9fc2lnbiA9IGRvdF9jb25jYXRfYW5kX2ZyZWVfc3RyaW5ncygKKyAgICAgICAgZW5jb2RlZF9qd3RfaGVhZGVyKGpzb25fa2V5LT5wcml2YXRlX2tleV9pZCwgc2lnX2FsZ28pLAorICAgICAgICBlbmNvZGVkX2p3dF9jbGFpbShqc29uX2tleSwgYXVkaWVuY2UsIHRva2VuX2xpZmV0aW1lLCBzY29wZSkpOworICAgIGNoYXIgKnNpZyA9IGNvbXB1dGVfYW5kX2VuY29kZV9zaWduYXR1cmUoanNvbl9rZXksIHNpZ19hbGdvLCB0b19zaWduKTsKKyAgICBpZiAoc2lnID09IE5VTEwpIHsKKyAgICAgIGdwcl9mcmVlKHRvX3NpZ24pOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkb3RfY29uY2F0X2FuZF9mcmVlX3N0cmluZ3ModG9fc2lnbiwgc2lnKTsKKyAgfQorfQorCit2b2lkIGdycGNfand0X2VuY29kZV9hbmRfc2lnbl9zZXRfb3ZlcnJpZGUoCisgICAgZ3JwY19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlIGZ1bmMpIHsKKyAgZ19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlID0gZnVuYzsKK30KKworLyogLS0tIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIC0tLSAqLworCitpbnQgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5faXNfdmFsaWQoCisgICAgY29uc3QgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gKnJlZnJlc2hfdG9rZW4pIHsKKyAgcmV0dXJuIChyZWZyZXNoX3Rva2VuICE9IE5VTEwpICYmCisgICAgICAgICBzdHJjbXAocmVmcmVzaF90b2tlbi0+dHlwZSwgR1JQQ19BVVRIX0pTT05fVFlQRV9JTlZBTElEKTsKK30KKworZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fY3JlYXRlX2Zyb21fanNvbigKKyAgICBjb25zdCBncnBjX2pzb24gKmpzb24pIHsKKyAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gcmVzdWx0OworICBjb25zdCBjaGFyICpwcm9wX3ZhbHVlOworICBpbnQgc3VjY2VzcyA9IDA7CisKKyAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihncnBjX2F1dGhfcmVmcmVzaF90b2tlbikpOworICByZXN1bHQudHlwZSA9IEdSUENfQVVUSF9KU09OX1RZUEVfSU5WQUxJRDsKKyAgaWYgKGpzb24gPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBqc29uLiIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgcHJvcF92YWx1ZSA9IGpzb25fZ2V0X3N0cmluZ19wcm9wZXJ0eShqc29uLCAidHlwZSIpOworICBpZiAocHJvcF92YWx1ZSA9PSBOVUxMIHx8CisgICAgICBzdHJjbXAocHJvcF92YWx1ZSwgR1JQQ19BVVRIX0pTT05fVFlQRV9BVVRIT1JJWkVEX1VTRVIpKSB7CisgICAgZ290byBlbmQ7CisgIH0KKyAgcmVzdWx0LnR5cGUgPSBHUlBDX0FVVEhfSlNPTl9UWVBFX0FVVEhPUklaRURfVVNFUjsKKworICBpZiAoIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9zZWNyZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdC5jbGllbnRfc2VjcmV0KSB8fAorICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9pZCIsICZyZXN1bHQuY2xpZW50X2lkKSB8fAorICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgInJlZnJlc2hfdG9rZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdC5yZWZyZXNoX3Rva2VuKSkgeworICAgIGdvdG8gZW5kOworICB9CisgIHN1Y2Nlc3MgPSAxOworCitlbmQ6CisgIGlmICghc3VjY2VzcykgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fZGVzdHJ1Y3QoJnJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dycGNfYXV0aF9yZWZyZXNoX3Rva2VuIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2NyZWF0ZV9mcm9tX3N0cmluZygKKyAgICBjb25zdCBjaGFyICpqc29uX3N0cmluZykgeworICBjaGFyICpzY3JhdGNocGFkID0gZ3ByX3N0cmR1cChqc29uX3N0cmluZyk7CisgIGdycGNfanNvbiAqanNvbiA9IGdycGNfanNvbl9wYXJzZV9zdHJpbmcoc2NyYXRjaHBhZCk7CisgIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIHJlc3VsdCA9CisgICAgICBncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9jcmVhdGVfZnJvbV9qc29uKGpzb24pOworICBpZiAoanNvbiAhPSBOVUxMKSBncnBjX2pzb25fZGVzdHJveShqc29uKTsKKyAgZ3ByX2ZyZWUoc2NyYXRjaHBhZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fZGVzdHJ1Y3QoZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gKnJlZnJlc2hfdG9rZW4pIHsKKyAgaWYgKHJlZnJlc2hfdG9rZW4gPT0gTlVMTCkgcmV0dXJuOworICByZWZyZXNoX3Rva2VuLT50eXBlID0gR1JQQ19BVVRIX0pTT05fVFlQRV9JTlZBTElEOworICBpZiAocmVmcmVzaF90b2tlbi0+Y2xpZW50X2lkICE9IE5VTEwpIHsKKyAgICBncHJfZnJlZShyZWZyZXNoX3Rva2VuLT5jbGllbnRfaWQpOworICAgIHJlZnJlc2hfdG9rZW4tPmNsaWVudF9pZCA9IE5VTEw7CisgIH0KKyAgaWYgKHJlZnJlc2hfdG9rZW4tPmNsaWVudF9zZWNyZXQgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKHJlZnJlc2hfdG9rZW4tPmNsaWVudF9zZWNyZXQpOworICAgIHJlZnJlc2hfdG9rZW4tPmNsaWVudF9zZWNyZXQgPSBOVUxMOworICB9CisgIGlmIChyZWZyZXNoX3Rva2VuLT5yZWZyZXNoX3Rva2VuICE9IE5VTEwpIHsKKyAgICBncHJfZnJlZShyZWZyZXNoX3Rva2VuLT5yZWZyZXNoX3Rva2VuKTsKKyAgICByZWZyZXNoX3Rva2VuLT5yZWZyZXNoX3Rva2VuID0gTlVMTDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZmIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9KU09OX1RPS0VOX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9KU09OX1RPS0VOX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiCisKKy8qIC0tLSBDb25zdGFudHMuIC0tLSAqLworCisjZGVmaW5lIEdSUENfSldUX09BVVRIMl9BVURJRU5DRSAiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vb2F1dGgyL3YzL3Rva2VuIgorCisjZGVmaW5lIEdSUENfQVVUSF9KU09OX1RZUEVfSU5WQUxJRCAiaW52YWxpZCIKKyNkZWZpbmUgR1JQQ19BVVRIX0pTT05fVFlQRV9TRVJWSUNFX0FDQ09VTlQgInNlcnZpY2VfYWNjb3VudCIKKyNkZWZpbmUgR1JQQ19BVVRIX0pTT05fVFlQRV9BVVRIT1JJWkVEX1VTRVIgImF1dGhvcml6ZWRfdXNlciIKKworLyogLS0tIGF1dGhfanNvbl9rZXkgcGFyc2luZy4gLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgY2hhciAqcHJpdmF0ZV9rZXlfaWQ7CisgIGNoYXIgKmNsaWVudF9pZDsKKyAgY2hhciAqY2xpZW50X2VtYWlsOworICBSU0EgKnByaXZhdGVfa2V5OworfSBncnBjX2F1dGhfanNvbl9rZXk7CisKKy8qIFJldHVybnMgMSBpZiB0aGUgb2JqZWN0IGlzIHZhbGlkLCAwIG90aGVyd2lzZS4gKi8KK2ludCBncnBjX2F1dGhfanNvbl9rZXlfaXNfdmFsaWQoY29uc3QgZ3JwY19hdXRoX2pzb25fa2V5ICpqc29uX2tleSk7CisKKy8qIENyZWF0ZXMgYSBqc29uX2tleSBvYmplY3QgZnJvbSBzdHJpbmcuIFJldHVybnMgYW4gaW52YWxpZCBvYmplY3QgaWYgYSBwYXJzaW5nCisgICBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gKi8KK2dycGNfYXV0aF9qc29uX2tleSBncnBjX2F1dGhfanNvbl9rZXlfY3JlYXRlX2Zyb21fc3RyaW5nKAorICAgIGNvbnN0IGNoYXIgKmpzb25fc3RyaW5nKTsKKworLyogQ3JlYXRlcyBhIGpzb25fa2V5IG9iamVjdCBmcm9tIHBhcnNlZCBqc29uLiBSZXR1cm5zIGFuIGludmFsaWQgb2JqZWN0IGlmIGEKKyAgIHBhcnNpbmcgZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQuICovCitncnBjX2F1dGhfanNvbl9rZXkgZ3JwY19hdXRoX2pzb25fa2V5X2NyZWF0ZV9mcm9tX2pzb24oY29uc3QgZ3JwY19qc29uICpqc29uKTsKKworLyogRGVzdHJ1Y3RzIHRoZSBvYmplY3QuICovCit2b2lkIGdycGNfYXV0aF9qc29uX2tleV9kZXN0cnVjdChncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5KTsKKworLyogLS0tIGpzb24gdG9rZW4gZW5jb2RpbmcgYW5kIHNpZ25pbmcuIC0tLSAqLworCisvKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZ3ByX2ZyZWUgb24gdGhlIHJldHVybmVkIHZhbHVlLiBNYXkgcmV0dXJuCisgICBOVUxMIG9uIGludmFsaWQgaW5wdXQuIFRoZSBzY29wZSBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwuICovCitjaGFyICpncnBjX2p3dF9lbmNvZGVfYW5kX3NpZ24oY29uc3QgZ3JwY19hdXRoX2pzb25fa2V5ICpqc29uX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdWRpZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgdG9rZW5fbGlmZXRpbWUsIGNvbnN0IGNoYXIgKnNjb3BlKTsKKworLyogT3ZlcnJpZGUgZW5jb2RlX2FuZF9zaWduIGZ1bmN0aW9uIGZvciB0ZXN0aW5nLiAqLwordHlwZWRlZiBjaGFyICooKmdycGNfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZSkoCisgICAgY29uc3QgZ3JwY19hdXRoX2pzb25fa2V5ICpqc29uX2tleSwgY29uc3QgY2hhciAqYXVkaWVuY2UsCisgICAgZ3ByX3RpbWVzcGVjIHRva2VuX2xpZmV0aW1lLCBjb25zdCBjaGFyICpzY29wZSk7CisKKy8qIFNldCBhIGN1c3RvbSBlbmNvZGVfYW5kX3NpZ24gb3ZlcnJpZGUgZm9yIHRlc3RpbmcuICovCit2b2lkIGdycGNfand0X2VuY29kZV9hbmRfc2lnbl9zZXRfb3ZlcnJpZGUoCisgICAgZ3JwY19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlIGZ1bmMpOworCisvKiAtLS0gYXV0aF9yZWZyZXNoX3Rva2VuIHBhcnNpbmcuIC0tLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKnR5cGU7CisgIGNoYXIgKmNsaWVudF9pZDsKKyAgY2hhciAqY2xpZW50X3NlY3JldDsKKyAgY2hhciAqcmVmcmVzaF90b2tlbjsKK30gZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW47CisKKy8qIFJldHVybnMgMSBpZiB0aGUgb2JqZWN0IGlzIHZhbGlkLCAwIG90aGVyd2lzZS4gKi8KK2ludCBncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9pc192YWxpZCgKKyAgICBjb25zdCBncnBjX2F1dGhfcmVmcmVzaF90b2tlbiAqcmVmcmVzaF90b2tlbik7CisKKy8qIENyZWF0ZXMgYSByZWZyZXNoIHRva2VuIG9iamVjdCBmcm9tIHN0cmluZy4gUmV0dXJucyBhbiBpbnZhbGlkIG9iamVjdCBpZiBhCisgICBwYXJzaW5nIGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLiAqLworZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fY3JlYXRlX2Zyb21fc3RyaW5nKAorICAgIGNvbnN0IGNoYXIgKmpzb25fc3RyaW5nKTsKKworLyogQ3JlYXRlcyBhIHJlZnJlc2ggdG9rZW4gb2JqZWN0IGZyb20gcGFyc2VkIGpzb24uIFJldHVybnMgYW4gaW52YWxpZCBvYmplY3QgaWYKKyAgIGEgcGFyc2luZyBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gKi8KK2dycGNfYXV0aF9yZWZyZXNoX3Rva2VuIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2NyZWF0ZV9mcm9tX2pzb24oCisgICAgY29uc3QgZ3JwY19qc29uICpqc29uKTsKKworLyogRGVzdHJ1Y3RzIHRoZSBvYmplY3QuICovCit2b2lkIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2Rlc3RydWN0KGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuICpyZWZyZXNoX3Rva2VuKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfSlNPTl9UT0tFTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwYjkyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYwpAQCAtMCwwICsxLDg0MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9iNjQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHNpL3NzbF90eXBlcy5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworLyogLS0tIFV0aWxzLiAtLS0gKi8KKworY29uc3QgY2hhciAqZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzX3RvX3N0cmluZygKKyAgICBncnBjX2p3dF92ZXJpZmllcl9zdGF0dXMgc3RhdHVzKSB7CisgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBHUlBDX0pXVF9WRVJJRklFUl9PSzoKKyAgICAgIHJldHVybiAiT0siOworICAgIGNhc2UgR1JQQ19KV1RfVkVSSUZJRVJfQkFEX1NJR05BVFVSRToKKyAgICAgIHJldHVybiAiQkFEX1NJR05BVFVSRSI7CisgICAgY2FzZSBHUlBDX0pXVF9WRVJJRklFUl9CQURfRk9STUFUOgorICAgICAgcmV0dXJuICJCQURfRk9STUFUIjsKKyAgICBjYXNlIEdSUENfSldUX1ZFUklGSUVSX0JBRF9BVURJRU5DRToKKyAgICAgIHJldHVybiAiQkFEX0FVRElFTkNFIjsKKyAgICBjYXNlIEdSUENfSldUX1ZFUklGSUVSX0tFWV9SRVRSSUVWQUxfRVJST1I6CisgICAgICByZXR1cm4gIktFWV9SRVRSSUVWQUxfRVJST1IiOworICAgIGNhc2UgR1JQQ19KV1RfVkVSSUZJRVJfVElNRV9DT05TVFJBSU5UX0ZBSUxVUkU6CisgICAgICByZXR1cm4gIlRJTUVfQ09OU1RSQUlOVF9GQUlMVVJFIjsKKyAgICBjYXNlIEdSUENfSldUX1ZFUklGSUVSX0dFTkVSSUNfRVJST1I6CisgICAgICByZXR1cm4gIkdFTkVSSUNfRVJST1IiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIlVOS05PV04iOworICB9Cit9CisKK3N0YXRpYyBjb25zdCBFVlBfTUQgKmV2cF9tZF9mcm9tX2FsZyhjb25zdCBjaGFyICphbGcpIHsKKyAgaWYgKHN0cmNtcChhbGcsICJSUzI1NiIpID09IDApIHsKKyAgICByZXR1cm4gRVZQX3NoYTI1NigpOworICB9IGVsc2UgaWYgKHN0cmNtcChhbGcsICJSUzM4NCIpID09IDApIHsKKyAgICByZXR1cm4gRVZQX3NoYTM4NCgpOworICB9IGVsc2UgaWYgKHN0cmNtcChhbGcsICJSUzUxMiIpID09IDApIHsKKyAgICByZXR1cm4gRVZQX3NoYTUxMigpOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBncnBjX2pzb24gKnBhcnNlX2pzb25fcGFydF9mcm9tX2p3dChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpidWZmZXIpIHsKKyAgZ3JwY19qc29uICpqc29uOworCisgICpidWZmZXIgPSBncnBjX2Jhc2U2NF9kZWNvZGVfd2l0aF9sZW4oc3RyLCBsZW4sIDEpOworICBpZiAoR1BSX1NMSUNFX0lTX0VNUFRZKCpidWZmZXIpKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGJhc2U2NC4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbigoY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoKmJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoKmJ1ZmZlcikpOworICBpZiAoanNvbiA9PSBOVUxMKSB7CisgICAgZ3ByX3NsaWNlX3VucmVmKCpidWZmZXIpOworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSlNPTiBwYXJzaW5nIGVycm9yLiIpOworICB9CisgIHJldHVybiBqc29uOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdmFsaWRhdGVfc3RyaW5nX2ZpZWxkKGNvbnN0IGdycGNfanNvbiAqanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5KSB7CisgIGlmIChqc29uLT50eXBlICE9IEdSUENfSlNPTl9TVFJJTkcpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgJXMgZmllbGQgWyVzXSIsIGtleSwganNvbi0+dmFsdWUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBqc29uLT52YWx1ZTsKK30KKworc3RhdGljIGdwcl90aW1lc3BlYyB2YWxpZGF0ZV90aW1lX2ZpZWxkKGNvbnN0IGdycGNfanNvbiAqanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXkpIHsKKyAgZ3ByX3RpbWVzcGVjIHJlc3VsdCA9IGdwcl90aW1lXzAoR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgaWYgKGpzb24tPnR5cGUgIT0gR1JQQ19KU09OX05VTUJFUikgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCAlcyBmaWVsZCBbJXNdIiwga2V5LCBqc29uLT52YWx1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXN1bHQudHZfc2VjID0gc3RydG9sKGpzb24tPnZhbHVlLCBOVUxMLCAxMCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIC0tLSBKT1NFIGhlYWRlci4gc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUjc2VjdGlvbi00IC0tLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKmFsZzsKKyAgY29uc3QgY2hhciAqa2lkOworICBjb25zdCBjaGFyICp0eXA7CisgIC8qIFRPRE8oamJvZXVmKTogQWRkIG90aGVycyBhcyBuZWVkZWQgKGprdSwgandrLCB4NXUsIHg1YyBhbmQgc28gb24uLi4pLiAqLworICBncHJfc2xpY2UgYnVmZmVyOworfSBqb3NlX2hlYWRlcjsKKworc3RhdGljIHZvaWQgam9zZV9oZWFkZXJfZGVzdHJveShqb3NlX2hlYWRlciAqaCkgeworICBncHJfc2xpY2VfdW5yZWYoaC0+YnVmZmVyKTsKKyAgZ3ByX2ZyZWUoaCk7Cit9CisKKy8qIFRha2VzIG93bmVyc2hpcCBvZiBqc29uIGFuZCBidWZmZXIuICovCitzdGF0aWMgam9zZV9oZWFkZXIgKmpvc2VfaGVhZGVyX2Zyb21fanNvbihncnBjX2pzb24gKmpzb24sIGdwcl9zbGljZSBidWZmZXIpIHsKKyAgZ3JwY19qc29uICpjdXI7CisgIGpvc2VfaGVhZGVyICpoID0gZ3ByX21hbGxvYyhzaXplb2Yoam9zZV9oZWFkZXIpKTsKKyAgbWVtc2V0KGgsIDAsIHNpemVvZihqb3NlX2hlYWRlcikpOworICBoLT5idWZmZXIgPSBidWZmZXI7CisgIGZvciAoY3VyID0ganNvbi0+Y2hpbGQ7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICBpZiAoc3RyY21wKGN1ci0+a2V5LCAiYWxnIikgPT0gMCkgeworICAgICAgLyogV2Ugb25seSBzdXBwb3J0IFJTQS0xLjUgc2lnbmF0dXJlcyBmb3Igbm93LgorICAgICAgICAgQmV3YXJlIG9mIHRoaXMgaWYgd2UgYWRkIEhNQUMgc3VwcG9ydDoKKyAgICAgICAgIGh0dHBzOi8vYXV0aDAuY29tL2Jsb2cvMjAxNS8wMy8zMS9jcml0aWNhbC12dWxuZXJhYmlsaXRpZXMtaW4tanNvbi13ZWItdG9rZW4tbGlicmFyaWVzLworICAgICAgICovCisgICAgICBpZiAoY3VyLT50eXBlICE9IEdSUENfSlNPTl9TVFJJTkcgfHwgc3RybmNtcChjdXItPnZhbHVlLCAiUlMiLCAyKSB8fAorICAgICAgICAgIGV2cF9tZF9mcm9tX2FsZyhjdXItPnZhbHVlKSA9PSBOVUxMKSB7CisgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBhbGcgZmllbGQgWyVzXSIsIGN1ci0+dmFsdWUpOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgICAgaC0+YWxnID0gY3VyLT52YWx1ZTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChjdXItPmtleSwgInR5cCIpID09IDApIHsKKyAgICAgIGgtPnR5cCA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJ0eXAiKTsKKyAgICAgIGlmIChoLT50eXAgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChjdXItPmtleSwgImtpZCIpID09IDApIHsKKyAgICAgIGgtPmtpZCA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJraWQiKTsKKyAgICAgIGlmIChoLT5raWQgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICB9CisgIH0KKyAgaWYgKGgtPmFsZyA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIGFsZyBmaWVsZC4iKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIGdycGNfanNvbl9kZXN0cm95KGpzb24pOworICBoLT5idWZmZXIgPSBidWZmZXI7CisgIHJldHVybiBoOworCitlcnJvcjoKKyAgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7CisgIGpvc2VfaGVhZGVyX2Rlc3Ryb3koaCk7CisgIHJldHVybiBOVUxMOworfQorCisvKiAtLS0gSldUIGNsYWltcy4gc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEgKi8KKworc3RydWN0IGdycGNfand0X2NsYWltcyB7CisgIC8qIFdlbGwga25vd24gcHJvcGVydGllcyBhbHJlYWR5IHBhcnNlZC4gKi8KKyAgY29uc3QgY2hhciAqc3ViOworICBjb25zdCBjaGFyICppc3M7CisgIGNvbnN0IGNoYXIgKmF1ZDsKKyAgY29uc3QgY2hhciAqanRpOworICBncHJfdGltZXNwZWMgaWF0OworICBncHJfdGltZXNwZWMgZXhwOworICBncHJfdGltZXNwZWMgbmJmOworCisgIGdycGNfanNvbiAqanNvbjsKKyAgZ3ByX3NsaWNlIGJ1ZmZlcjsKK307CisKK3ZvaWQgZ3JwY19qd3RfY2xhaW1zX2Rlc3Ryb3koZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKKyAgZ3JwY19qc29uX2Rlc3Ryb3koY2xhaW1zLT5qc29uKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGNsYWltcy0+YnVmZmVyKTsKKyAgZ3ByX2ZyZWUoY2xhaW1zKTsKK30KKworY29uc3QgZ3JwY19qc29uICpncnBjX2p3dF9jbGFpbXNfanNvbihjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcykgeworICBpZiAoY2xhaW1zID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gY2xhaW1zLT5qc29uOworfQorCitjb25zdCBjaGFyICpncnBjX2p3dF9jbGFpbXNfc3ViamVjdChjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcykgeworICBpZiAoY2xhaW1zID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gY2xhaW1zLT5zdWI7Cit9CisKK2NvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19pc3N1ZXIoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKKyAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGNsYWltcy0+aXNzOworfQorCitjb25zdCBjaGFyICpncnBjX2p3dF9jbGFpbXNfaWQoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKKyAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGNsYWltcy0+anRpOworfQorCitjb25zdCBjaGFyICpncnBjX2p3dF9jbGFpbXNfYXVkaWVuY2UoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKKyAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGNsYWltcy0+YXVkOworfQorCitncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2lzc3VlZF9hdChjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcykgeworICBpZiAoY2xhaW1zID09IE5VTEwpIHJldHVybiBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgcmV0dXJuIGNsYWltcy0+aWF0OworfQorCitncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2V4cGlyZXNfYXQoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKKyAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgcmV0dXJuIGNsYWltcy0+ZXhwOworfQorCitncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX25vdF9iZWZvcmUoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKKyAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7CisgIHJldHVybiBjbGFpbXMtPm5iZjsKK30KKworLyogVGFrZXMgb3duZXJzaGlwIG9mIGpzb24gYW5kIGJ1ZmZlciBldmVuIGluIGNhc2Ugb2YgZmFpbHVyZS4gKi8KK2dycGNfand0X2NsYWltcyAqZ3JwY19qd3RfY2xhaW1zX2Zyb21fanNvbihncnBjX2pzb24gKmpzb24sIGdwcl9zbGljZSBidWZmZXIpIHsKKyAgZ3JwY19qc29uICpjdXI7CisgIGdycGNfand0X2NsYWltcyAqY2xhaW1zID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19qd3RfY2xhaW1zKSk7CisgIG1lbXNldChjbGFpbXMsIDAsIHNpemVvZihncnBjX2p3dF9jbGFpbXMpKTsKKyAgY2xhaW1zLT5qc29uID0ganNvbjsKKyAgY2xhaW1zLT5idWZmZXIgPSBidWZmZXI7CisgIGNsYWltcy0+aWF0ID0gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7CisgIGNsYWltcy0+bmJmID0gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7CisgIGNsYWltcy0+ZXhwID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKKworICAvKiBQZXIgdGhlIHNwZWMsIGFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiAqLworICBmb3IgKGN1ciA9IGpzb24tPmNoaWxkOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgaWYgKHN0cmNtcChjdXItPmtleSwgInN1YiIpID09IDApIHsKKyAgICAgIGNsYWltcy0+c3ViID0gdmFsaWRhdGVfc3RyaW5nX2ZpZWxkKGN1ciwgInN1YiIpOworICAgICAgaWYgKGNsYWltcy0+c3ViID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJpc3MiKSA9PSAwKSB7CisgICAgICBjbGFpbXMtPmlzcyA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJpc3MiKTsKKyAgICAgIGlmIChjbGFpbXMtPmlzcyA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGN1ci0+a2V5LCAiYXVkIikgPT0gMCkgeworICAgICAgY2xhaW1zLT5hdWQgPSB2YWxpZGF0ZV9zdHJpbmdfZmllbGQoY3VyLCAiYXVkIik7CisgICAgICBpZiAoY2xhaW1zLT5hdWQgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChjdXItPmtleSwgImp0aSIpID09IDApIHsKKyAgICAgIGNsYWltcy0+anRpID0gdmFsaWRhdGVfc3RyaW5nX2ZpZWxkKGN1ciwgImp0aSIpOworICAgICAgaWYgKGNsYWltcy0+anRpID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJpYXQiKSA9PSAwKSB7CisgICAgICBjbGFpbXMtPmlhdCA9IHZhbGlkYXRlX3RpbWVfZmllbGQoY3VyLCAiaWF0Iik7CisgICAgICBpZiAoZ3ByX3RpbWVfY21wKGNsYWltcy0+aWF0LCBncHJfdGltZV8wKEdQUl9DTE9DS19SRUFMVElNRSkpID09IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJleHAiKSA9PSAwKSB7CisgICAgICBjbGFpbXMtPmV4cCA9IHZhbGlkYXRlX3RpbWVfZmllbGQoY3VyLCAiZXhwIik7CisgICAgICBpZiAoZ3ByX3RpbWVfY21wKGNsYWltcy0+ZXhwLCBncHJfdGltZV8wKEdQUl9DTE9DS19SRUFMVElNRSkpID09IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJuYmYiKSA9PSAwKSB7CisgICAgICBjbGFpbXMtPm5iZiA9IHZhbGlkYXRlX3RpbWVfZmllbGQoY3VyLCAibmJmIik7CisgICAgICBpZiAoZ3ByX3RpbWVfY21wKGNsYWltcy0+bmJmLCBncHJfdGltZV8wKEdQUl9DTE9DS19SRUFMVElNRSkpID09IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBjbGFpbXM7CisKK2Vycm9yOgorICBncnBjX2p3dF9jbGFpbXNfZGVzdHJveShjbGFpbXMpOworICByZXR1cm4gTlVMTDsKK30KKworZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzIGdycGNfand0X2NsYWltc19jaGVjayhjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXVkaWVuY2UpIHsKKyAgZ3ByX3RpbWVzcGVjIHNrZXdlZF9ub3c7CisgIGludCBhdWRpZW5jZV9vazsKKworICBHUFJfQVNTRVJUKGNsYWltcyAhPSBOVUxMKTsKKworICBza2V3ZWRfbm93ID0KKyAgICAgIGdwcl90aW1lX2FkZChncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGdycGNfand0X3ZlcmlmaWVyX2Nsb2NrX3NrZXcpOworICBpZiAoZ3ByX3RpbWVfY21wKHNrZXdlZF9ub3csIGNsYWltcy0+bmJmKSA8IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkpXVCBpcyBub3QgdmFsaWQgeWV0LiIpOworICAgIHJldHVybiBHUlBDX0pXVF9WRVJJRklFUl9USU1FX0NPTlNUUkFJTlRfRkFJTFVSRTsKKyAgfQorICBza2V3ZWRfbm93ID0KKyAgICAgIGdwcl90aW1lX3N1YihncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGdycGNfand0X3ZlcmlmaWVyX2Nsb2NrX3NrZXcpOworICBpZiAoZ3ByX3RpbWVfY21wKHNrZXdlZF9ub3csIGNsYWltcy0+ZXhwKSA+IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkpXVCBpcyBleHBpcmVkLiIpOworICAgIHJldHVybiBHUlBDX0pXVF9WRVJJRklFUl9USU1FX0NPTlNUUkFJTlRfRkFJTFVSRTsKKyAgfQorCisgIGlmIChhdWRpZW5jZSA9PSBOVUxMKSB7CisgICAgYXVkaWVuY2Vfb2sgPSBjbGFpbXMtPmF1ZCA9PSBOVUxMOworICB9IGVsc2UgeworICAgIGF1ZGllbmNlX29rID0gY2xhaW1zLT5hdWQgIT0gTlVMTCAmJiBzdHJjbXAoYXVkaWVuY2UsIGNsYWltcy0+YXVkKSA9PSAwOworICB9CisgIGlmICghYXVkaWVuY2Vfb2spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkF1ZGllbmNlIG1pc21hdGNoOiBleHBlY3RlZCAlcyBhbmQgZm91bmQgJXMuIiwKKyAgICAgICAgICAgIGF1ZGllbmNlID09IE5VTEwgPyAiTlVMTCIgOiBhdWRpZW5jZSwKKyAgICAgICAgICAgIGNsYWltcy0+YXVkID09IE5VTEwgPyAiTlVMTCIgOiBjbGFpbXMtPmF1ZCk7CisgICAgcmV0dXJuIEdSUENfSldUX1ZFUklGSUVSX0JBRF9BVURJRU5DRTsKKyAgfQorICByZXR1cm4gR1JQQ19KV1RfVkVSSUZJRVJfT0s7Cit9CisKKy8qIC0tLSB2ZXJpZmllcl9jYl9jdHggb2JqZWN0LiAtLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2p3dF92ZXJpZmllciAqdmVyaWZpZXI7CisgIGdycGNfcG9sbHNldCAqcG9sbHNldDsKKyAgam9zZV9oZWFkZXIgKmhlYWRlcjsKKyAgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXM7CisgIGNoYXIgKmF1ZGllbmNlOworICBncHJfc2xpY2Ugc2lnbmF0dXJlOworICBncHJfc2xpY2Ugc2lnbmVkX2RhdGE7CisgIHZvaWQgKnVzZXJfZGF0YTsKKyAgZ3JwY19qd3RfdmVyaWZpY2F0aW9uX2RvbmVfY2IgdXNlcl9jYjsKK30gdmVyaWZpZXJfY2JfY3R4OworCisvKiBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIGhlYWRlciwgY2xhaW1zIGFuZCBzaWduYXR1cmUuICovCitzdGF0aWMgdmVyaWZpZXJfY2JfY3R4ICp2ZXJpZmllcl9jYl9jdHhfY3JlYXRlKAorICAgIGdycGNfand0X3ZlcmlmaWVyICp2ZXJpZmllciwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBqb3NlX2hlYWRlciAqaGVhZGVyLAorICAgIGdycGNfand0X2NsYWltcyAqY2xhaW1zLCBjb25zdCBjaGFyICphdWRpZW5jZSwgZ3ByX3NsaWNlIHNpZ25hdHVyZSwKKyAgICBjb25zdCBjaGFyICpzaWduZWRfand0LCBzaXplX3Qgc2lnbmVkX2p3dF9sZW4sIHZvaWQgKnVzZXJfZGF0YSwKKyAgICBncnBjX2p3dF92ZXJpZmljYXRpb25fZG9uZV9jYiBjYikgeworICB2ZXJpZmllcl9jYl9jdHggKmN0eCA9IGdwcl9tYWxsb2Moc2l6ZW9mKHZlcmlmaWVyX2NiX2N0eCkpOworICBtZW1zZXQoY3R4LCAwLCBzaXplb2YodmVyaWZpZXJfY2JfY3R4KSk7CisgIGN0eC0+dmVyaWZpZXIgPSB2ZXJpZmllcjsKKyAgY3R4LT5wb2xsc2V0ID0gcG9sbHNldDsKKyAgY3R4LT5oZWFkZXIgPSBoZWFkZXI7CisgIGN0eC0+YXVkaWVuY2UgPSBncHJfc3RyZHVwKGF1ZGllbmNlKTsKKyAgY3R4LT5jbGFpbXMgPSBjbGFpbXM7CisgIGN0eC0+c2lnbmF0dXJlID0gc2lnbmF0dXJlOworICBjdHgtPnNpZ25lZF9kYXRhID0gZ3ByX3NsaWNlX2Zyb21fY29waWVkX2J1ZmZlcihzaWduZWRfand0LCBzaWduZWRfand0X2xlbik7CisgIGN0eC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjdHgtPnVzZXJfY2IgPSBjYjsKKyAgcmV0dXJuIGN0eDsKK30KKwordm9pZCB2ZXJpZmllcl9jYl9jdHhfZGVzdHJveSh2ZXJpZmllcl9jYl9jdHggKmN0eCkgeworICBpZiAoY3R4LT5hdWRpZW5jZSAhPSBOVUxMKSBncHJfZnJlZShjdHgtPmF1ZGllbmNlKTsKKyAgaWYgKGN0eC0+Y2xhaW1zICE9IE5VTEwpIGdycGNfand0X2NsYWltc19kZXN0cm95KGN0eC0+Y2xhaW1zKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGN0eC0+c2lnbmF0dXJlKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGN0eC0+c2lnbmVkX2RhdGEpOworICBqb3NlX2hlYWRlcl9kZXN0cm95KGN0eC0+aGVhZGVyKTsKKyAgLyogVE9ETzogc2VlIHdoYXQgdG8gZG8gd2l0aCBjbGFpbXMuLi4gKi8KKyAgZ3ByX2ZyZWUoY3R4KTsKK30KKworLyogLS0tIGdycGNfand0X3ZlcmlmaWVyIG9iamVjdC4gLS0tICovCisKKy8qIENsb2NrIHNrZXcgZGVmYXVsdHMgdG8gb25lIG1pbnV0ZS4gKi8KK2dwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9jbG9ja19za2V3ID0gezYwLCAwLCBHUFJfVElNRVNQQU59OworCisvKiBNYXggZGVsYXkgZGVmYXVsdHMgdG8gb25lIG1pbnV0ZS4gKi8KK2dwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9tYXhfZGVsYXkgPSB7NjAsIDAsIEdQUl9USU1FU1BBTn07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqZW1haWxfZG9tYWluOworICBjaGFyICprZXlfdXJsX3ByZWZpeDsKK30gZW1haWxfa2V5X21hcHBpbmc7CisKK3N0cnVjdCBncnBjX2p3dF92ZXJpZmllciB7CisgIGVtYWlsX2tleV9tYXBwaW5nICptYXBwaW5nczsKKyAgc2l6ZV90IG51bV9tYXBwaW5nczsgLyogU2hvdWxkIGJlIHZlcnkgZmV3LCBsaW5lYXIgc2VhcmNoIG9rLiAqLworICBzaXplX3QgYWxsb2NhdGVkX21hcHBpbmdzOworICBncnBjX2h0dHBjbGlfY29udGV4dCBodHRwX2N0eDsKK307CisKK3N0YXRpYyBncnBjX2pzb24gKmpzb25fZnJvbV9odHRwKGNvbnN0IGdycGNfaHR0cGNsaV9yZXNwb25zZSAqcmVzcG9uc2UpIHsKKyAgZ3JwY19qc29uICpqc29uID0gTlVMTDsKKworICBpZiAocmVzcG9uc2UgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSFRUUCByZXNwb25zZSBpcyBOVUxMLiIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChyZXNwb25zZS0+c3RhdHVzICE9IDIwMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2FsbCB0byBodHRwIHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciAlZC4iLAorICAgICAgICAgICAgcmVzcG9uc2UtPnN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihyZXNwb25zZS0+Ym9keSwgcmVzcG9uc2UtPmJvZHlfbGVuZ3RoKTsKKyAgaWYgKGpzb24gPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBKU09OIGZvdW5kIGluIHJlc3BvbnNlLiIpOworICB9CisgIHJldHVybiBqc29uOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19qc29uICpmaW5kX3Byb3BlcnR5X2J5X25hbWUoY29uc3QgZ3JwY19qc29uICpqc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgY29uc3QgZ3JwY19qc29uICpjdXI7CisgIGZvciAoY3VyID0ganNvbi0+Y2hpbGQ7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICBpZiAoc3RyY21wKGN1ci0+a2V5LCBuYW1lKSA9PSAwKSByZXR1cm4gY3VyOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgRVZQX1BLRVkgKmV4dHJhY3RfcGtleV9mcm9tX3g1MDkoY29uc3QgY2hhciAqeDUwOV9zdHIpIHsKKyAgWDUwOSAqeDUwOSA9IE5VTEw7CisgIEVWUF9QS0VZICpyZXN1bHQgPSBOVUxMOworICBCSU8gKmJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICBzaXplX3QgbGVuID0gc3RybGVuKHg1MDlfc3RyKTsKKyAgR1BSX0FTU0VSVChsZW4gPCBJTlRfTUFYKTsKKyAgQklPX3dyaXRlKGJpbywgeDUwOV9zdHIsIChpbnQpbGVuKTsKKyAgeDUwOSA9IFBFTV9yZWFkX2Jpb19YNTA5KGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICh4NTA5ID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSB4NTA5IGNlcnQuIik7CisgICAgZ290byBlbmQ7CisgIH0KKyAgcmVzdWx0ID0gWDUwOV9nZXRfcHVia2V5KHg1MDkpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNhbm5vdCBmaW5kIHB1YmxpYyBrZXkgaW4gWDUwOSBjZXJ0LiIpOworICB9CisKK2VuZDoKKyAgQklPX2ZyZWUoYmlvKTsKKyAgaWYgKHg1MDkgIT0gTlVMTCkgWDUwOV9mcmVlKHg1MDkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgQklHTlVNICpiaWdudW1fZnJvbV9iYXNlNjQoY29uc3QgY2hhciAqYjY0KSB7CisgIEJJR05VTSAqcmVzdWx0ID0gTlVMTDsKKyAgZ3ByX3NsaWNlIGJpbjsKKworICBpZiAoYjY0ID09IE5VTEwpIHJldHVybiBOVUxMOworICBiaW4gPSBncnBjX2Jhc2U2NF9kZWNvZGUoYjY0LCAxKTsKKyAgaWYgKEdQUl9TTElDRV9JU19FTVBUWShiaW4pKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGJhc2U2NCBmb3IgYmlnIG51bS4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXN1bHQgPSBCTl9iaW4yYm4oR1BSX1NMSUNFX1NUQVJUX1BUUihiaW4pLAorICAgICAgICAgICAgICAgICAgICAgVFNJX1NJWkVfQVNfU0laRShHUFJfU0xJQ0VfTEVOR1RIKGJpbikpLCBOVUxMKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGJpbik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBFVlBfUEtFWSAqcGtleV9mcm9tX2p3ayhjb25zdCBncnBjX2pzb24gKmpzb24sIGNvbnN0IGNoYXIgKmt0eSkgeworICBjb25zdCBncnBjX2pzb24gKmtleV9wcm9wOworICBSU0EgKnJzYSA9IE5VTEw7CisgIEVWUF9QS0VZICpyZXN1bHQgPSBOVUxMOworCisgIEdQUl9BU1NFUlQoa3R5ICE9IE5VTEwgJiYganNvbiAhPSBOVUxMKTsKKyAgaWYgKHN0cmNtcChrdHksICJSU0EiKSAhPSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbnN1cHBvcnRlZCBrZXkgdHlwZSAlcy4iLCBrdHkpOworICAgIGdvdG8gZW5kOworICB9CisgIHJzYSA9IFJTQV9uZXcoKTsKKyAgaWYgKHJzYSA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIHJzYSBrZXkuIik7CisgICAgZ290byBlbmQ7CisgIH0KKyAgZm9yIChrZXlfcHJvcCA9IGpzb24tPmNoaWxkOyBrZXlfcHJvcCAhPSBOVUxMOyBrZXlfcHJvcCA9IGtleV9wcm9wLT5uZXh0KSB7CisgICAgaWYgKHN0cmNtcChrZXlfcHJvcC0+a2V5LCAibiIpID09IDApIHsKKyAgICAgIHJzYS0+biA9IGJpZ251bV9mcm9tX2Jhc2U2NCh2YWxpZGF0ZV9zdHJpbmdfZmllbGQoa2V5X3Byb3AsICJuIikpOworICAgICAgaWYgKHJzYS0+biA9PSBOVUxMKSBnb3RvIGVuZDsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChrZXlfcHJvcC0+a2V5LCAiZSIpID09IDApIHsKKyAgICAgIHJzYS0+ZSA9IGJpZ251bV9mcm9tX2Jhc2U2NCh2YWxpZGF0ZV9zdHJpbmdfZmllbGQoa2V5X3Byb3AsICJlIikpOworICAgICAgaWYgKHJzYS0+ZSA9PSBOVUxMKSBnb3RvIGVuZDsKKyAgICB9CisgIH0KKyAgaWYgKHJzYS0+ZSA9PSBOVUxMIHx8IHJzYS0+biA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIFJTQSBwdWJsaWMga2V5IGZpZWxkLiIpOworICAgIGdvdG8gZW5kOworICB9CisgIHJlc3VsdCA9IEVWUF9QS0VZX25ldygpOworICBFVlBfUEtFWV9zZXQxX1JTQShyZXN1bHQsIHJzYSk7IC8qIHVwcmVmcyByc2EuICovCisKK2VuZDoKKyAgaWYgKHJzYSAhPSBOVUxMKSBSU0FfZnJlZShyc2EpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgRVZQX1BLRVkgKmZpbmRfdmVyaWZpY2F0aW9uX2tleShjb25zdCBncnBjX2pzb24gKmpzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWFkZXJfYWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVhZGVyX2tpZCkgeworICBjb25zdCBncnBjX2pzb24gKmprZXk7CisgIGNvbnN0IGdycGNfanNvbiAqandrX2tleXM7CisgIC8qIFRyeSB0byBwYXJzZSB0aGUganNvbiBhcyBhIEpXSyBzZXQ6CisgICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE3I3NlY3Rpb24tNS4gKi8KKyAgandrX2tleXMgPSBmaW5kX3Byb3BlcnR5X2J5X25hbWUoanNvbiwgImtleXMiKTsKKyAgaWYgKGp3a19rZXlzID09IE5VTEwpIHsKKyAgICAvKiBVc2UgdGhlIGdvb2dsZSBwcm9wcmlldGFyeSBmb3JtYXQgd2hpY2ggaXM6CisgICAgICAgeyA8a2lkMT46IDx4NTA5MT4sIDxraWQyPjogPHg1MDkyPiwgLi4uIH0gKi8KKyAgICBjb25zdCBncnBjX2pzb24gKmN1ciA9IGZpbmRfcHJvcGVydHlfYnlfbmFtZShqc29uLCBoZWFkZXJfa2lkKTsKKyAgICBpZiAoY3VyID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIHJldHVybiBleHRyYWN0X3BrZXlfZnJvbV94NTA5KGN1ci0+dmFsdWUpOworICB9CisKKyAgaWYgKGp3a19rZXlzLT50eXBlICE9IEdSUENfSlNPTl9BUlJBWSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZSBvZiBrZXlzIHByb3BlcnR5IGluIGp3a3Mga2V5IHNldC4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBLZXkgZm9ybWF0IGlzIHNwZWNpZmllZCBpbjoKKyAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTgjc2VjdGlvbi02LiAqLworICBmb3IgKGprZXkgPSBqd2tfa2V5cy0+Y2hpbGQ7IGprZXkgIT0gTlVMTDsgamtleSA9IGprZXktPm5leHQpIHsKKyAgICBncnBjX2pzb24gKmtleV9wcm9wOworICAgIGNvbnN0IGNoYXIgKmFsZyA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqa2lkID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICprdHkgPSBOVUxMOworCisgICAgaWYgKGprZXktPnR5cGUgIT0gR1JQQ19KU09OX09CSkVDVCkgY29udGludWU7CisgICAgZm9yIChrZXlfcHJvcCA9IGprZXktPmNoaWxkOyBrZXlfcHJvcCAhPSBOVUxMOyBrZXlfcHJvcCA9IGtleV9wcm9wLT5uZXh0KSB7CisgICAgICBpZiAoc3RyY21wKGtleV9wcm9wLT5rZXksICJhbGciKSA9PSAwICYmCisgICAgICAgICAga2V5X3Byb3AtPnR5cGUgPT0gR1JQQ19KU09OX1NUUklORykgeworICAgICAgICBhbGcgPSBrZXlfcHJvcC0+dmFsdWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChrZXlfcHJvcC0+a2V5LCAia2lkIikgPT0gMCAmJgorICAgICAgICAgICAgICAgICBrZXlfcHJvcC0+dHlwZSA9PSBHUlBDX0pTT05fU1RSSU5HKSB7CisgICAgICAgIGtpZCA9IGtleV9wcm9wLT52YWx1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGtleV9wcm9wLT5rZXksICJrdHkiKSA9PSAwICYmCisgICAgICAgICAgICAgICAgIGtleV9wcm9wLT50eXBlID09IEdSUENfSlNPTl9TVFJJTkcpIHsKKyAgICAgICAga3R5ID0ga2V5X3Byb3AtPnZhbHVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYWxnICE9IE5VTEwgJiYga2lkICE9IE5VTEwgJiYga3R5ICE9IE5VTEwgJiYKKyAgICAgICAgc3RyY21wKGtpZCwgaGVhZGVyX2tpZCkgPT0gMCAmJiBzdHJjbXAoYWxnLCBoZWFkZXJfYWxnKSA9PSAwKSB7CisgICAgICByZXR1cm4gcGtleV9mcm9tX2p3ayhqa2V5LCBrdHkpOworICAgIH0KKyAgfQorICBncHJfbG9nKEdQUl9FUlJPUiwKKyAgICAgICAgICAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcga2V5IGluIGtleSBzZXQgZm9yIGtpZD0lcyBhbmQgYWxnPSVzIiwKKyAgICAgICAgICBoZWFkZXJfa2lkLCBoZWFkZXJfYWxnKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2p3dF9zaWduYXR1cmUoRVZQX1BLRVkgKmtleSwgY29uc3QgY2hhciAqYWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Ugc2lnbmF0dXJlLCBncHJfc2xpY2Ugc2lnbmVkX2RhdGEpIHsKKyAgRVZQX01EX0NUWCAqbWRfY3R4ID0gRVZQX01EX0NUWF9jcmVhdGUoKTsKKyAgY29uc3QgRVZQX01EICptZCA9IGV2cF9tZF9mcm9tX2FsZyhhbGcpOworICBpbnQgcmVzdWx0ID0gMDsKKworICBHUFJfQVNTRVJUKG1kICE9IE5VTEwpOyAvKiBDaGVja2VkIGJlZm9yZS4gKi8KKyAgaWYgKG1kX2N0eCA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIEVWUF9NRF9DVFguIik7CisgICAgZ290byBlbmQ7CisgIH0KKyAgaWYgKEVWUF9EaWdlc3RWZXJpZnlJbml0KG1kX2N0eCwgTlVMTCwgbWQsIE5VTEwsIGtleSkgIT0gMSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRVZQX0RpZ2VzdFZlcmlmeUluaXQgZmFpbGVkLiIpOworICAgIGdvdG8gZW5kOworICB9CisgIGlmIChFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlKG1kX2N0eCwgR1BSX1NMSUNFX1NUQVJUX1BUUihzaWduZWRfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoc2lnbmVkX2RhdGEpKSAhPSAxKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlIGZhaWxlZC4iKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAoRVZQX0RpZ2VzdFZlcmlmeUZpbmFsKG1kX2N0eCwgR1BSX1NMSUNFX1NUQVJUX1BUUihzaWduYXR1cmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoc2lnbmF0dXJlKSkgIT0gMSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSldUIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLiIpOworICAgIGdvdG8gZW5kOworICB9CisgIHJlc3VsdCA9IDE7CisKK2VuZDoKKyAgaWYgKG1kX2N0eCAhPSBOVUxMKSBFVlBfTURfQ1RYX2Rlc3Ryb3kobWRfY3R4KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgb25fa2V5c19yZXRyaWV2ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXNwb25zZSAqcmVzcG9uc2UpIHsKKyAgZ3JwY19qc29uICpqc29uID0ganNvbl9mcm9tX2h0dHAocmVzcG9uc2UpOworICB2ZXJpZmllcl9jYl9jdHggKmN0eCA9ICh2ZXJpZmllcl9jYl9jdHggKil1c2VyX2RhdGE7CisgIEVWUF9QS0VZICp2ZXJpZmljYXRpb25fa2V5ID0gTlVMTDsKKyAgZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzIHN0YXR1cyA9IEdSUENfSldUX1ZFUklGSUVSX0dFTkVSSUNfRVJST1I7CisgIGdycGNfand0X2NsYWltcyAqY2xhaW1zID0gTlVMTDsKKworICBpZiAoanNvbiA9PSBOVUxMKSB7CisgICAgc3RhdHVzID0gR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUjsKKyAgICBnb3RvIGVuZDsKKyAgfQorICB2ZXJpZmljYXRpb25fa2V5ID0KKyAgICAgIGZpbmRfdmVyaWZpY2F0aW9uX2tleShqc29uLCBjdHgtPmhlYWRlci0+YWxnLCBjdHgtPmhlYWRlci0+a2lkKTsKKyAgaWYgKHZlcmlmaWNhdGlvbl9rZXkgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgdmVyaWZpY2F0aW9uIGtleSB3aXRoIGtpZCAlcy4iLAorICAgICAgICAgICAgY3R4LT5oZWFkZXItPmtpZCk7CisgICAgc3RhdHVzID0gR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUjsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGlmICghdmVyaWZ5X2p3dF9zaWduYXR1cmUodmVyaWZpY2F0aW9uX2tleSwgY3R4LT5oZWFkZXItPmFsZywgY3R4LT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zaWduZWRfZGF0YSkpIHsKKyAgICBzdGF0dXMgPSBHUlBDX0pXVF9WRVJJRklFUl9CQURfU0lHTkFUVVJFOworICAgIGdvdG8gZW5kOworICB9CisKKyAgc3RhdHVzID0gZ3JwY19qd3RfY2xhaW1zX2NoZWNrKGN0eC0+Y2xhaW1zLCBjdHgtPmF1ZGllbmNlKTsKKyAgaWYgKHN0YXR1cyA9PSBHUlBDX0pXVF9WRVJJRklFUl9PSykgeworICAgIC8qIFBhc3Mgb3duZXJzaGlwLiAqLworICAgIGNsYWltcyA9IGN0eC0+Y2xhaW1zOworICAgIGN0eC0+Y2xhaW1zID0gTlVMTDsKKyAgfQorCitlbmQ6CisgIGlmIChqc29uICE9IE5VTEwpIGdycGNfanNvbl9kZXN0cm95KGpzb24pOworICBpZiAodmVyaWZpY2F0aW9uX2tleSAhPSBOVUxMKSBFVlBfUEtFWV9mcmVlKHZlcmlmaWNhdGlvbl9rZXkpOworICBjdHgtPnVzZXJfY2IoY3R4LT51c2VyX2RhdGEsIHN0YXR1cywgY2xhaW1zKTsKKyAgdmVyaWZpZXJfY2JfY3R4X2Rlc3Ryb3koY3R4KTsKK30KKworc3RhdGljIHZvaWQgb25fb3BlbmlkX2NvbmZpZ19yZXRyaWV2ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXNwb25zZSAqcmVzcG9uc2UpIHsKKyAgY29uc3QgZ3JwY19qc29uICpjdXI7CisgIGdycGNfanNvbiAqanNvbiA9IGpzb25fZnJvbV9odHRwKHJlc3BvbnNlKTsKKyAgdmVyaWZpZXJfY2JfY3R4ICpjdHggPSAodmVyaWZpZXJfY2JfY3R4ICopdXNlcl9kYXRhOworICBncnBjX2h0dHBjbGlfcmVxdWVzdCByZXE7CisgIGNvbnN0IGNoYXIgKmp3a3NfdXJpOworCisgIC8qIFRPRE8oamJvZXVmKTogQ2FjaGUgdGhlIGp3a3NfdXJpIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgaG9wIG5leHQgdGltZS4gKi8KKyAgaWYgKGpzb24gPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgY3VyID0gZmluZF9wcm9wZXJ0eV9ieV9uYW1lKGpzb24sICJqd2tzX3VyaSIpOworICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIGp3a3NfdXJpIGluIG9wZW5pZCBjb25maWcuIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorICBqd2tzX3VyaSA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJqd2tzX3VyaSIpOworICBpZiAoandrc191cmkgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgaWYgKHN0cnN0cihqd2tzX3VyaSwgImh0dHBzOi8vIikgIT0gandrc191cmkpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgbm9uIGh0dHBzIGp3a3NfdXJpOiAlcy4iLCBqd2tzX3VyaSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICBqd2tzX3VyaSArPSA4OworICByZXEuaGFuZHNoYWtlciA9ICZncnBjX2h0dHBjbGlfc3NsOworICByZXEuaG9zdCA9IGdwcl9zdHJkdXAoandrc191cmkpOworICByZXEuaHR0cC5wYXRoID0gc3RyY2hyKGp3a3NfdXJpLCAnLycpOworICBpZiAocmVxLmh0dHAucGF0aCA9PSBOVUxMKSB7CisgICAgcmVxLmh0dHAucGF0aCA9ICIiOworICB9IGVsc2UgeworICAgICoocmVxLmhvc3QgKyAocmVxLmh0dHAucGF0aCAtIGp3a3NfdXJpKSkgPSAnXDAnOworICB9CisgIGdycGNfaHR0cGNsaV9nZXQoCisgICAgICBleGVjX2N0eCwgJmN0eC0+dmVyaWZpZXItPmh0dHBfY3R4LCBjdHgtPnBvbGxzZXQsICZyZXEsCisgICAgICBncHJfdGltZV9hZGQoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCBncnBjX2p3dF92ZXJpZmllcl9tYXhfZGVsYXkpLAorICAgICAgb25fa2V5c19yZXRyaWV2ZWQsIGN0eCk7CisgIGdycGNfanNvbl9kZXN0cm95KGpzb24pOworICBncHJfZnJlZShyZXEuaG9zdCk7CisgIHJldHVybjsKKworZXJyb3I6CisgIGlmIChqc29uICE9IE5VTEwpIGdycGNfanNvbl9kZXN0cm95KGpzb24pOworICBjdHgtPnVzZXJfY2IoY3R4LT51c2VyX2RhdGEsIEdSUENfSldUX1ZFUklGSUVSX0tFWV9SRVRSSUVWQUxfRVJST1IsIE5VTEwpOworICB2ZXJpZmllcl9jYl9jdHhfZGVzdHJveShjdHgpOworfQorCitzdGF0aWMgZW1haWxfa2V5X21hcHBpbmcgKnZlcmlmaWVyX2dldF9tYXBwaW5nKGdycGNfand0X3ZlcmlmaWVyICp2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbWFpbF9kb21haW4pIHsKKyAgc2l6ZV90IGk7CisgIGlmICh2LT5tYXBwaW5ncyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IHYtPm51bV9tYXBwaW5nczsgaSsrKSB7CisgICAgaWYgKHN0cmNtcChlbWFpbF9kb21haW4sIHYtPm1hcHBpbmdzW2ldLmVtYWlsX2RvbWFpbikgPT0gMCkgeworICAgICAgcmV0dXJuICZ2LT5tYXBwaW5nc1tpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZlcmlmaWVyX3B1dF9tYXBwaW5nKGdycGNfand0X3ZlcmlmaWVyICp2LCBjb25zdCBjaGFyICplbWFpbF9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlfdXJsX3ByZWZpeCkgeworICBlbWFpbF9rZXlfbWFwcGluZyAqbWFwcGluZyA9IHZlcmlmaWVyX2dldF9tYXBwaW5nKHYsIGVtYWlsX2RvbWFpbik7CisgIEdQUl9BU1NFUlQodi0+bnVtX21hcHBpbmdzIDwgdi0+YWxsb2NhdGVkX21hcHBpbmdzKTsKKyAgaWYgKG1hcHBpbmcgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKG1hcHBpbmctPmtleV91cmxfcHJlZml4KTsKKyAgICBtYXBwaW5nLT5rZXlfdXJsX3ByZWZpeCA9IGdwcl9zdHJkdXAoa2V5X3VybF9wcmVmaXgpOworICAgIHJldHVybjsKKyAgfQorICB2LT5tYXBwaW5nc1t2LT5udW1fbWFwcGluZ3NdLmVtYWlsX2RvbWFpbiA9IGdwcl9zdHJkdXAoZW1haWxfZG9tYWluKTsKKyAgdi0+bWFwcGluZ3Nbdi0+bnVtX21hcHBpbmdzXS5rZXlfdXJsX3ByZWZpeCA9IGdwcl9zdHJkdXAoa2V5X3VybF9wcmVmaXgpOworICB2LT5udW1fbWFwcGluZ3MrKzsKKyAgR1BSX0FTU0VSVCh2LT5udW1fbWFwcGluZ3MgPD0gdi0+YWxsb2NhdGVkX21hcHBpbmdzKTsKK30KKworLyogVGFrZXMgb3duZXJzaGlwIG9mIGN0eC4gKi8KK3N0YXRpYyB2b2lkIHJldHJpZXZlX2tleV9hbmRfdmVyaWZ5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZXJfY2JfY3R4ICpjdHgpIHsKKyAgY29uc3QgY2hhciAqYXRfc2lnbjsKKyAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIGh0dHBfY2I7CisgIGNoYXIgKnBhdGhfcHJlZml4ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqaXNzOworICBncnBjX2h0dHBjbGlfcmVxdWVzdCByZXE7CisgIG1lbXNldCgmcmVxLCAwLCBzaXplb2YoZ3JwY19odHRwY2xpX3JlcXVlc3QpKTsKKyAgcmVxLmhhbmRzaGFrZXIgPSAmZ3JwY19odHRwY2xpX3NzbDsKKworICBHUFJfQVNTRVJUKGN0eCAhPSBOVUxMICYmIGN0eC0+aGVhZGVyICE9IE5VTEwgJiYgY3R4LT5jbGFpbXMgIT0gTlVMTCk7CisgIGlzcyA9IGN0eC0+Y2xhaW1zLT5pc3M7CisgIGlmIChjdHgtPmhlYWRlci0+a2lkID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3Npbmcga2lkIGluIGpvc2UgaGVhZGVyLiIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgaWYgKGlzcyA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIGlzcyBpbiBjbGFpbXMuIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFRoaXMgY29kZSByZWxpZXMgb246CisgICAgIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1kaXNjb3ZlcnktMV8wLmh0bWwKKyAgICAgTm9ib2R5IHNlZW1zIHRvIGltcGxlbWVudCB0aGUgYWNjb3VudC9lbWFpbC93ZWJmaW5nZXIgcGFydCAyLiBvZiB0aGUgc3BlYworICAgICBzbyB3ZSB3aWxsIHJlbHkgaW5zdGVhZCBvbiBlbWFpbC91cmwgbWFwcGluZ3MgaWYgd2UgZGV0ZWN0IHN1Y2ggYW4gaXNzdWVyLgorICAgICBQYXJ0IDQsIG9uIHRoZSBvdGhlciBoYW5kIGlzIGltcGxlbWVudGVkIGJ5IGJvdGggZ29vZ2xlIGFuZCBzYWxlc2ZvcmNlLiAqLworCisgIC8qIFZlcnkgbm9uLXNvcGhpc3RpY2F0ZWQgd2F5IHRvIGRldGVjdCBhbiBlbWFpbCBhZGRyZXNzLiBTaG91bGQgYmUgZ29vZAorICAgICBlbm91Z2ggZm9yIG5vdy4uLiAqLworICBhdF9zaWduID0gc3RyY2hyKGlzcywgJ0AnKTsKKyAgaWYgKGF0X3NpZ24gIT0gTlVMTCkgeworICAgIGVtYWlsX2tleV9tYXBwaW5nICptYXBwaW5nOworICAgIGNvbnN0IGNoYXIgKmVtYWlsX2RvbWFpbiA9IGF0X3NpZ24gKyAxOworICAgIEdQUl9BU1NFUlQoY3R4LT52ZXJpZmllciAhPSBOVUxMKTsKKyAgICBtYXBwaW5nID0gdmVyaWZpZXJfZ2V0X21hcHBpbmcoY3R4LT52ZXJpZmllciwgZW1haWxfZG9tYWluKTsKKyAgICBpZiAobWFwcGluZyA9PSBOVUxMKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgbWFwcGluZyBmb3IgaXNzdWVyIGVtYWlsLiIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVxLmhvc3QgPSBncHJfc3RyZHVwKG1hcHBpbmctPmtleV91cmxfcHJlZml4KTsKKyAgICBwYXRoX3ByZWZpeCA9IHN0cmNocihyZXEuaG9zdCwgJy8nKTsKKyAgICBpZiAocGF0aF9wcmVmaXggPT0gTlVMTCkgeworICAgICAgZ3ByX2FzcHJpbnRmKCZyZXEuaHR0cC5wYXRoLCAiLyVzIiwgaXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgKihwYXRoX3ByZWZpeCsrKSA9ICdcMCc7CisgICAgICBncHJfYXNwcmludGYoJnJlcS5odHRwLnBhdGgsICIvJXMvJXMiLCBwYXRoX3ByZWZpeCwgaXNzKTsKKyAgICB9CisgICAgaHR0cF9jYiA9IG9uX2tleXNfcmV0cmlldmVkOworICB9IGVsc2UgeworICAgIHJlcS5ob3N0ID0gZ3ByX3N0cmR1cChzdHJzdHIoaXNzLCAiaHR0cHM6Ly8iKSA9PSBpc3MgPyBpc3MgKyA4IDogaXNzKTsKKyAgICBwYXRoX3ByZWZpeCA9IHN0cmNocihyZXEuaG9zdCwgJy8nKTsKKyAgICBpZiAocGF0aF9wcmVmaXggPT0gTlVMTCkgeworICAgICAgcmVxLmh0dHAucGF0aCA9IGdwcl9zdHJkdXAoR1JQQ19PUEVOSURfQ09ORklHX1VSTF9TVUZGSVgpOworICAgIH0gZWxzZSB7CisgICAgICAqKHBhdGhfcHJlZml4KyspID0gMDsKKyAgICAgIGdwcl9hc3ByaW50ZigmcmVxLmh0dHAucGF0aCwgIi8lcyVzIiwgcGF0aF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgR1JQQ19PUEVOSURfQ09ORklHX1VSTF9TVUZGSVgpOworICAgIH0KKyAgICBodHRwX2NiID0gb25fb3BlbmlkX2NvbmZpZ19yZXRyaWV2ZWQ7CisgIH0KKworICBncnBjX2h0dHBjbGlfZ2V0KAorICAgICAgZXhlY19jdHgsICZjdHgtPnZlcmlmaWVyLT5odHRwX2N0eCwgY3R4LT5wb2xsc2V0LCAmcmVxLAorICAgICAgZ3ByX3RpbWVfYWRkKGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgZ3JwY19qd3RfdmVyaWZpZXJfbWF4X2RlbGF5KSwKKyAgICAgIGh0dHBfY2IsIGN0eCk7CisgIGdwcl9mcmVlKHJlcS5ob3N0KTsKKyAgZ3ByX2ZyZWUocmVxLmh0dHAucGF0aCk7CisgIHJldHVybjsKKworZXJyb3I6CisgIGN0eC0+dXNlcl9jYihjdHgtPnVzZXJfZGF0YSwgR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUiwgTlVMTCk7CisgIHZlcmlmaWVyX2NiX2N0eF9kZXN0cm95KGN0eCk7Cit9CisKK3ZvaWQgZ3JwY19qd3RfdmVyaWZpZXJfdmVyaWZ5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qd3RfdmVyaWZpZXIgKnZlcmlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBjb25zdCBjaGFyICpqd3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdWRpZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfand0X3ZlcmlmaWNhdGlvbl9kb25lX2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGNvbnN0IGNoYXIgKmRvdCA9IE5VTEw7CisgIGdycGNfanNvbiAqanNvbjsKKyAgam9zZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CisgIGdycGNfand0X2NsYWltcyAqY2xhaW1zID0gTlVMTDsKKyAgZ3ByX3NsaWNlIGhlYWRlcl9idWZmZXI7CisgIGdwcl9zbGljZSBjbGFpbXNfYnVmZmVyOworICBncHJfc2xpY2Ugc2lnbmF0dXJlOworICBzaXplX3Qgc2lnbmVkX2p3dF9sZW47CisgIGNvbnN0IGNoYXIgKmN1ciA9IGp3dDsKKworICBHUFJfQVNTRVJUKHZlcmlmaWVyICE9IE5VTEwgJiYgand0ICE9IE5VTEwgJiYgYXVkaWVuY2UgIT0gTlVMTCAmJiBjYiAhPSBOVUxMKTsKKyAgZG90ID0gc3RyY2hyKGN1ciwgJy4nKTsKKyAgaWYgKGRvdCA9PSBOVUxMKSBnb3RvIGVycm9yOworICBqc29uID0gcGFyc2VfanNvbl9wYXJ0X2Zyb21fand0KGN1ciwgKHNpemVfdCkoZG90IC0gY3VyKSwgJmhlYWRlcl9idWZmZXIpOworICBpZiAoanNvbiA9PSBOVUxMKSBnb3RvIGVycm9yOworICBoZWFkZXIgPSBqb3NlX2hlYWRlcl9mcm9tX2pzb24oanNvbiwgaGVhZGVyX2J1ZmZlcik7CisgIGlmIChoZWFkZXIgPT0gTlVMTCkgZ290byBlcnJvcjsKKworICBjdXIgPSBkb3QgKyAxOworICBkb3QgPSBzdHJjaHIoY3VyLCAnLicpOworICBpZiAoZG90ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgIGpzb24gPSBwYXJzZV9qc29uX3BhcnRfZnJvbV9qd3QoY3VyLCAoc2l6ZV90KShkb3QgLSBjdXIpLCAmY2xhaW1zX2J1ZmZlcik7CisgIGlmIChqc29uID09IE5VTEwpIGdvdG8gZXJyb3I7CisgIGNsYWltcyA9IGdycGNfand0X2NsYWltc19mcm9tX2pzb24oanNvbiwgY2xhaW1zX2J1ZmZlcik7CisgIGlmIChjbGFpbXMgPT0gTlVMTCkgZ290byBlcnJvcjsKKworICBzaWduZWRfand0X2xlbiA9IChzaXplX3QpKGRvdCAtIGp3dCk7CisgIGN1ciA9IGRvdCArIDE7CisgIHNpZ25hdHVyZSA9IGdycGNfYmFzZTY0X2RlY29kZShjdXIsIDEpOworICBpZiAoR1BSX1NMSUNFX0lTX0VNUFRZKHNpZ25hdHVyZSkpIGdvdG8gZXJyb3I7CisgIHJldHJpZXZlX2tleV9hbmRfdmVyaWZ5KAorICAgICAgZXhlY19jdHgsCisgICAgICB2ZXJpZmllcl9jYl9jdHhfY3JlYXRlKHZlcmlmaWVyLCBwb2xsc2V0LCBoZWFkZXIsIGNsYWltcywgYXVkaWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwgand0LCBzaWduZWRfand0X2xlbiwgdXNlcl9kYXRhLCBjYikpOworICByZXR1cm47CisKK2Vycm9yOgorICBpZiAoaGVhZGVyICE9IE5VTEwpIGpvc2VfaGVhZGVyX2Rlc3Ryb3koaGVhZGVyKTsKKyAgaWYgKGNsYWltcyAhPSBOVUxMKSBncnBjX2p3dF9jbGFpbXNfZGVzdHJveShjbGFpbXMpOworICBjYih1c2VyX2RhdGEsIEdSUENfSldUX1ZFUklGSUVSX0JBRF9GT1JNQVQsIE5VTEwpOworfQorCitncnBjX2p3dF92ZXJpZmllciAqZ3JwY19qd3RfdmVyaWZpZXJfY3JlYXRlKAorICAgIGNvbnN0IGdycGNfand0X3ZlcmlmaWVyX2VtYWlsX2RvbWFpbl9rZXlfdXJsX21hcHBpbmcgKm1hcHBpbmdzLAorICAgIHNpemVfdCBudW1fbWFwcGluZ3MpIHsKKyAgZ3JwY19qd3RfdmVyaWZpZXIgKnYgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2p3dF92ZXJpZmllcikpOworICBtZW1zZXQodiwgMCwgc2l6ZW9mKGdycGNfand0X3ZlcmlmaWVyKSk7CisgIGdycGNfaHR0cGNsaV9jb250ZXh0X2luaXQoJnYtPmh0dHBfY3R4KTsKKworICAvKiBXZSBrbm93IGF0IGxlYXN0IG9mIG9uZSBtYXBwaW5nLiAqLworICB2LT5hbGxvY2F0ZWRfbWFwcGluZ3MgPSAxICsgbnVtX21hcHBpbmdzOworICB2LT5tYXBwaW5ncyA9IGdwcl9tYWxsb2Modi0+YWxsb2NhdGVkX21hcHBpbmdzICogc2l6ZW9mKGVtYWlsX2tleV9tYXBwaW5nKSk7CisgIHZlcmlmaWVyX3B1dF9tYXBwaW5nKHYsIEdSUENfR09PR0xFX1NFUlZJQ0VfQUNDT1VOVFNfRU1BSUxfRE9NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0dPT0dMRV9TRVJWSUNFX0FDQ09VTlRTX0tFWV9VUkxfUFJFRklYKTsKKyAgLyogVXNlci1Qcm92aWRlZCBtYXBwaW5ncy4gKi8KKyAgaWYgKG1hcHBpbmdzICE9IE5VTEwpIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hcHBpbmdzOyBpKyspIHsKKyAgICAgIHZlcmlmaWVyX3B1dF9tYXBwaW5nKHYsIG1hcHBpbmdzW2ldLmVtYWlsX2RvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzW2ldLmtleV91cmxfcHJlZml4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKK3ZvaWQgZ3JwY19qd3RfdmVyaWZpZXJfZGVzdHJveShncnBjX2p3dF92ZXJpZmllciAqdikgeworICBzaXplX3QgaTsKKyAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuOworICBncnBjX2h0dHBjbGlfY29udGV4dF9kZXN0cm95KCZ2LT5odHRwX2N0eCk7CisgIGlmICh2LT5tYXBwaW5ncyAhPSBOVUxMKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHYtPm51bV9tYXBwaW5nczsgaSsrKSB7CisgICAgICBncHJfZnJlZSh2LT5tYXBwaW5nc1tpXS5lbWFpbF9kb21haW4pOworICAgICAgZ3ByX2ZyZWUodi0+bWFwcGluZ3NbaV0ua2V5X3VybF9wcmVmaXgpOworICAgIH0KKyAgICBncHJfZnJlZSh2LT5tYXBwaW5ncyk7CisgIH0KKyAgZ3ByX2ZyZWUodik7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmggYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhOWVmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX0pXVF9WRVJJRklFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfSldUX1ZFUklGSUVSX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbi5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworLyogLS0tIENvbnN0YW50cy4gLS0tICovCisKKyNkZWZpbmUgR1JQQ19PUEVOSURfQ09ORklHX1VSTF9TVUZGSVggIi8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiIKKyNkZWZpbmUgR1JQQ19HT09HTEVfU0VSVklDRV9BQ0NPVU5UU19FTUFJTF9ET01BSU4gXAorICAiZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iCisjZGVmaW5lIEdSUENfR09PR0xFX1NFUlZJQ0VfQUNDT1VOVFNfS0VZX1VSTF9QUkVGSVggXAorICAid3d3Lmdvb2dsZWFwaXMuY29tL3JvYm90L3YxL21ldGFkYXRhL3g1MDkiCisKKy8qIC0tLSBncnBjX2p3dF92ZXJpZmllcl9zdGF0dXMuIC0tLSAqLworCit0eXBlZGVmIGVudW0geworICBHUlBDX0pXVF9WRVJJRklFUl9PSyA9IDAsCisgIEdSUENfSldUX1ZFUklGSUVSX0JBRF9TSUdOQVRVUkUsCisgIEdSUENfSldUX1ZFUklGSUVSX0JBRF9GT1JNQVQsCisgIEdSUENfSldUX1ZFUklGSUVSX0JBRF9BVURJRU5DRSwKKyAgR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUiwKKyAgR1JQQ19KV1RfVkVSSUZJRVJfVElNRV9DT05TVFJBSU5UX0ZBSUxVUkUsCisgIEdSUENfSldUX1ZFUklGSUVSX0dFTkVSSUNfRVJST1IKK30gZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzOworCitjb25zdCBjaGFyICpncnBjX2p3dF92ZXJpZmllcl9zdGF0dXNfdG9fc3RyaW5nKGdycGNfand0X3ZlcmlmaWVyX3N0YXR1cyBzdGF0dXMpOworCisvKiAtLS0gZ3JwY19qd3RfY2xhaW1zLiAtLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19qd3RfY2xhaW1zIGdycGNfand0X2NsYWltczsKKwordm9pZCBncnBjX2p3dF9jbGFpbXNfZGVzdHJveShncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7CisKKy8qIFJldHVybnMgdGhlIHdob2xlIEpTT04gdHJlZSBvZiB0aGUgY2xhaW1zLiAqLworY29uc3QgZ3JwY19qc29uICpncnBjX2p3dF9jbGFpbXNfanNvbihjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7CisKKy8qIEFjY2VzcyB0byByZWdpc3RlcmVkIGNsYWltcyBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxOSNwYWdlLTkgKi8KK2NvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19zdWJqZWN0KGNvbnN0IGdycGNfand0X2NsYWltcyAqY2xhaW1zKTsKK2NvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19pc3N1ZXIoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpOworY29uc3QgY2hhciAqZ3JwY19qd3RfY2xhaW1zX2lkKGNvbnN0IGdycGNfand0X2NsYWltcyAqY2xhaW1zKTsKK2NvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19hdWRpZW5jZShjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7CitncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2lzc3VlZF9hdChjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7CitncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2V4cGlyZXNfYXQoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpOworZ3ByX3RpbWVzcGVjIGdycGNfand0X2NsYWltc19ub3RfYmVmb3JlKGNvbnN0IGdycGNfand0X2NsYWltcyAqY2xhaW1zKTsKKworLyogLS0tIGdycGNfand0X3ZlcmlmaWVyLiAtLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19qd3RfdmVyaWZpZXIgZ3JwY19qd3RfdmVyaWZpZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhlIGVtYWlsIGRvbWFpbiBpcyB0aGUgcGFydCBhZnRlciB0aGUgQCBzaWduLiAqLworICBjb25zdCBjaGFyICplbWFpbF9kb21haW47CisKKyAgLyogVGhlIGtleSB1cmwgcHJlZml4IHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgaXNzdWVyOgorICAgICBodHRwczovLzxrZXlfdXJsX3ByZWZpeD4vPGlzc3Vlcl9lbWFpbD4KKyAgICAgVGhlcmVmb3JlIHRoZSBrZXlfdXJsX3ByZWZpeCBtdXN0IE5PVCBjb250YWluIGh0dHBzOi8vLiAqLworICBjb25zdCBjaGFyICprZXlfdXJsX3ByZWZpeDsKK30gZ3JwY19qd3RfdmVyaWZpZXJfZW1haWxfZG9tYWluX2tleV91cmxfbWFwcGluZzsKKworLyogR2xvYmFscyB0byBjb250cm9sIHRoZSB2ZXJpZmllci4gTm90IHRocmVhZC1zYWZlLiAqLworZXh0ZXJuIGdwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9jbG9ja19za2V3OworZXh0ZXJuIGdwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9tYXhfZGVsYXk7CisKKy8qIFRoZSB2ZXJpZmllciBjYW4gYmUgY3JlYXRlZCB3aXRoIHNvbWUgY3VzdG9tIG1hcHBpbmdzIHRvIGhlbHAgd2l0aCBrZXkKKyAgIGRpc2NvdmVyeSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaXNzdWVyIGlzIGFuIGVtYWlsIGFkZHJlc3MuCisgICBtYXBwaW5ncyBjYW4gYmUgTlVMTCBpbiB3aGljaCBjYXNlIG51bV9tYXBwaW5ncyBNVVNUIGJlIDAuCisgICBBIHZlcmlmaWVyIG9iamVjdCBoYXMgb25lIGJ1aWx0LWluIG1hcHBpbmcgKHVubGVzcyBvdmVycmlkZGVuKToKKyAgIEdSUENfR09PR0xFX1NFUlZJQ0VfQUNDT1VOVFNfRU1BSUxfRE9NQUlOIC0+CisgICBHUlBDX0dPT0dMRV9TRVJWSUNFX0FDQ09VTlRTX0tFWV9VUkxfUFJFRklYLiovCitncnBjX2p3dF92ZXJpZmllciAqZ3JwY19qd3RfdmVyaWZpZXJfY3JlYXRlKAorICAgIGNvbnN0IGdycGNfand0X3ZlcmlmaWVyX2VtYWlsX2RvbWFpbl9rZXlfdXJsX21hcHBpbmcgKm1hcHBpbmdzLAorICAgIHNpemVfdCBudW1fbWFwcGluZ3MpOworCisvKlRoZSB2ZXJpZmllciBtdXN0IG5vdCBiZSBkZXN0cm95ZWQgaWYgdGhlcmUgYXJlIHN0aWxsIG91dHN0YW5kaW5nIGNhbGxiYWNrcy4qLwordm9pZCBncnBjX2p3dF92ZXJpZmllcl9kZXN0cm95KGdycGNfand0X3ZlcmlmaWVyICp2ZXJpZmllcik7CisKKy8qIFVzZXIgcHJvdmlkZWQgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIEpXVAorICAgaXMgZG9uZSAobWF5YmUgaW4gYW5vdGhlciB0aHJlYWQpLgorICAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZWUgdG8gY2FsbCBncnBjX2p3dF9jbGFpbXNfZGVzdHJveSBvbgorICAgdGhlIGNsYWltcy4gKi8KK3R5cGVkZWYgdm9pZCAoKmdycGNfand0X3ZlcmlmaWNhdGlvbl9kb25lX2NiKSh2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7CisKKy8qIFZlcmlmaWVzIGZvciB0aGUgSldUIGZvciB0aGUgZ2l2ZW4gZXhwZWN0ZWQgYXVkaWVuY2UuICovCit2b2lkIGdycGNfand0X3ZlcmlmaWVyX3ZlcmlmeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfand0X3ZlcmlmaWVyICp2ZXJpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwgY29uc3QgY2hhciAqand0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXVkaWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2p3dF92ZXJpZmljYXRpb25fZG9uZV9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIC0tLSBURVNUSU5HIE9OTFkgZXhwb3NlZCBmdW5jdGlvbnMuIC0tLSAqLworCitncnBjX2p3dF9jbGFpbXMgKmdycGNfand0X2NsYWltc19mcm9tX2pzb24oZ3JwY19qc29uICpqc29uLCBncHJfc2xpY2UgYnVmZmVyKTsKK2dycGNfand0X3ZlcmlmaWVyX3N0YXR1cyBncnBjX2p3dF9jbGFpbXNfY2hlY2soY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGllbmNlKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfSldUX1ZFUklGSUVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMzYjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oIgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKKworI2RlZmluZSBTVEFHSU5HX0JVRkZFUl9TSVpFIDgxOTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2VuZHBvaW50IGJhc2U7CisgIGdycGNfZW5kcG9pbnQgKndyYXBwZWRfZXA7CisgIHN0cnVjdCB0c2lfZnJhbWVfcHJvdGVjdG9yICpwcm90ZWN0b3I7CisgIGdwcl9tdSBwcm90ZWN0b3JfbXU7CisgIC8qIHNhdmVkIHVwcGVyIGxldmVsIGNhbGxiYWNrcyBhbmQgdXNlcl9kYXRhLiAqLworICBncnBjX2Nsb3N1cmUgKnJlYWRfY2I7CisgIGdycGNfY2xvc3VyZSAqd3JpdGVfY2I7CisgIGdycGNfY2xvc3VyZSBvbl9yZWFkOworICBncHJfc2xpY2VfYnVmZmVyICpyZWFkX2J1ZmZlcjsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBzb3VyY2VfYnVmZmVyOworICAvKiBzYXZlZCBoYW5kc2hha2VyIGxlZnRvdmVyIGRhdGEgdG8gdW5wcm90ZWN0LiAqLworICBncHJfc2xpY2VfYnVmZmVyIGxlZnRvdmVyX2J5dGVzOworICAvKiBidWZmZXJzIGZvciByZWFkIGFuZCB3cml0ZSAqLworICBncHJfc2xpY2UgcmVhZF9zdGFnaW5nX2J1ZmZlcjsKKworICBncHJfc2xpY2Ugd3JpdGVfc3RhZ2luZ19idWZmZXI7CisgIGdwcl9zbGljZV9idWZmZXIgb3V0cHV0X2J1ZmZlcjsKKworICBncHJfcmVmY291bnQgcmVmOworfSBzZWN1cmVfZW5kcG9pbnQ7CisKK2ludCBncnBjX3RyYWNlX3NlY3VyZV9lbmRwb2ludCA9IDA7CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHNlY3VyZV9lbmRwb2ludCAqc2VjdXJlX2VwKSB7CisgIHNlY3VyZV9lbmRwb2ludCAqZXAgPSBzZWN1cmVfZXA7CisgIGdycGNfZW5kcG9pbnRfZGVzdHJveShleGVjX2N0eCwgZXAtPndyYXBwZWRfZXApOworICB0c2lfZnJhbWVfcHJvdGVjdG9yX2Rlc3Ryb3koZXAtPnByb3RlY3Rvcik7CisgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmZXAtPmxlZnRvdmVyX2J5dGVzKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyKTsKKyAgZ3ByX3NsaWNlX3VucmVmKGVwLT53cml0ZV9zdGFnaW5nX2J1ZmZlcik7CisgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmZXAtPm91dHB1dF9idWZmZXIpOworICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJmVwLT5zb3VyY2VfYnVmZmVyKTsKKyAgZ3ByX211X2Rlc3Ryb3koJmVwLT5wcm90ZWN0b3JfbXUpOworICBncHJfZnJlZShlcCk7Cit9CisKKy8qI2RlZmluZSBHUlBDX1NFQ1VSRV9FTkRQT0lOVF9SRUZDT1VOVF9ERUJVRyovCisjaWZkZWYgR1JQQ19TRUNVUkVfRU5EUE9JTlRfUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgU0VDVVJFX0VORFBPSU5UX1VOUkVGKGV4ZWNfY3R4LCBlcCwgcmVhc29uKSBcCisgIHNlY3VyZV9lbmRwb2ludF91bnJlZigoZXhlY19jdHgpLCAoZXApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBTRUNVUkVfRU5EUE9JTlRfUkVGKGVwLCByZWFzb24pIFwKKyAgc2VjdXJlX2VuZHBvaW50X3JlZigoZXApLCAocmVhc29uKSwgX19GSUxFX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgc2VjdXJlX2VuZHBvaW50X3VucmVmKHNlY3VyZV9lbmRwb2ludCAqZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlX2xpc3QgKmNsb3N1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiU0VDRU5EUCB1bnJlZiAlcCA6ICVzICVkIC0+ICVkIiwKKyAgICAgICAgICBlcCwgcmVhc29uLCBlcC0+cmVmLmNvdW50LCBlcC0+cmVmLmNvdW50IC0gMSk7CisgIGlmIChncHJfdW5yZWYoJmVwLT5yZWYpKSB7CisgICAgZGVzdHJveShleGVjX2N0eCwgZXApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlY3VyZV9lbmRwb2ludF9yZWYoc2VjdXJlX2VuZHBvaW50ICplcCwgY29uc3QgY2hhciAqcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJTRUNFTkRQICAgcmVmICVwIDogJXMgJWQgLT4gJWQiLAorICAgICAgICAgIGVwLCByZWFzb24sIGVwLT5yZWYuY291bnQsIGVwLT5yZWYuY291bnQgKyAxKTsKKyAgZ3ByX3JlZigmZXAtPnJlZik7Cit9CisjZWxzZQorI2RlZmluZSBTRUNVUkVfRU5EUE9JTlRfVU5SRUYoZXhlY19jdHgsIGVwLCByZWFzb24pIFwKKyAgc2VjdXJlX2VuZHBvaW50X3VucmVmKChleGVjX2N0eCksIChlcCkpCisjZGVmaW5lIFNFQ1VSRV9FTkRQT0lOVF9SRUYoZXAsIHJlYXNvbikgc2VjdXJlX2VuZHBvaW50X3JlZigoZXApKQorc3RhdGljIHZvaWQgc2VjdXJlX2VuZHBvaW50X3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9lbmRwb2ludCAqZXApIHsKKyAgaWYgKGdwcl91bnJlZigmZXAtPnJlZikpIHsKKyAgICBkZXN0cm95KGV4ZWNfY3R4LCBlcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2VjdXJlX2VuZHBvaW50X3JlZihzZWN1cmVfZW5kcG9pbnQgKmVwKSB7IGdwcl9yZWYoJmVwLT5yZWYpOyB9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZmx1c2hfcmVhZF9zdGFnaW5nX2J1ZmZlcihzZWN1cmVfZW5kcG9pbnQgKmVwLCB1aW50OF90ICoqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZW5kKSB7CisgIGdwcl9zbGljZV9idWZmZXJfYWRkKGVwLT5yZWFkX2J1ZmZlciwgZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIpOworICBlcC0+cmVhZF9zdGFnaW5nX2J1ZmZlciA9IGdwcl9zbGljZV9tYWxsb2MoU1RBR0lOR19CVUZGRVJfU0laRSk7CisgICpjdXIgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyKTsKKyAgKmVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQgY2FsbF9yZWFkX2NiKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBzZWN1cmVfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgeworICBpZiAoZ3JwY190cmFjZV9zZWN1cmVfZW5kcG9pbnQpIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZXAtPnJlYWRfYnVmZmVyLT5jb3VudDsgaSsrKSB7CisgICAgICBjaGFyICpkYXRhID0gZ3ByX2R1bXBfc2xpY2UoZXAtPnJlYWRfYnVmZmVyLT5zbGljZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpOworICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJSRUFEICVwOiAlcyIsIGVwLCBkYXRhKTsKKyAgICAgIGdwcl9mcmVlKGRhdGEpOworICAgIH0KKyAgfQorICBlcC0+cmVhZF9idWZmZXIgPSBOVUxMOworICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGVwLT5yZWFkX2NiLCBzdWNjZXNzLCBOVUxMKTsKKyAgU0VDVVJFX0VORFBPSU5UX1VOUkVGKGV4ZWNfY3R4LCBlcCwgInJlYWQiKTsKK30KKworc3RhdGljIHZvaWQgb25fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLCBib29sIHN1Y2Nlc3MpIHsKKyAgdW5zaWduZWQgaTsKKyAgdWludDhfdCBrZWVwX2xvb3BpbmcgPSAwOworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKil1c2VyX2RhdGE7CisgIHVpbnQ4X3QgKmN1ciA9IEdQUl9TTElDRV9TVEFSVF9QVFIoZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIpOworICB1aW50OF90ICplbmQgPSBHUFJfU0xJQ0VfRU5EX1BUUihlcC0+cmVhZF9zdGFnaW5nX2J1ZmZlcik7CisKKyAgaWYgKCFzdWNjZXNzKSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoZXAtPnJlYWRfYnVmZmVyKTsKKyAgICBjYWxsX3JlYWRfY2IoZXhlY19jdHgsIGVwLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBUT0RPKHlhbmdnKSBjaGVjayBlcnJvciwgbWF5YmUgYmFpbCBvdXQgZWFybHkgKi8KKyAgZm9yIChpID0gMDsgaSA8IGVwLT5zb3VyY2VfYnVmZmVyLmNvdW50OyBpKyspIHsKKyAgICBncHJfc2xpY2UgZW5jcnlwdGVkID0gZXAtPnNvdXJjZV9idWZmZXIuc2xpY2VzW2ldOworICAgIHVpbnQ4X3QgKm1lc3NhZ2VfYnl0ZXMgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGVuY3J5cHRlZCk7CisgICAgc2l6ZV90IG1lc3NhZ2Vfc2l6ZSA9IEdQUl9TTElDRV9MRU5HVEgoZW5jcnlwdGVkKTsKKworICAgIHdoaWxlIChtZXNzYWdlX3NpemUgPiAwIHx8IGtlZXBfbG9vcGluZykgeworICAgICAgc2l6ZV90IHVucHJvdGVjdGVkX2J1ZmZlcl9zaXplX3dyaXR0ZW4gPSAoc2l6ZV90KShlbmQgLSBjdXIpOworICAgICAgc2l6ZV90IHByb2Nlc3NlZF9tZXNzYWdlX3NpemUgPSBtZXNzYWdlX3NpemU7CisgICAgICBncHJfbXVfbG9jaygmZXAtPnByb3RlY3Rvcl9tdSk7CisgICAgICByZXN1bHQgPSB0c2lfZnJhbWVfcHJvdGVjdG9yX3VucHJvdGVjdChlcC0+cHJvdGVjdG9yLCBtZXNzYWdlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2Nlc3NlZF9tZXNzYWdlX3NpemUsIGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bnByb3RlY3RlZF9idWZmZXJfc2l6ZV93cml0dGVuKTsKKyAgICAgIGdwcl9tdV91bmxvY2soJmVwLT5wcm90ZWN0b3JfbXUpOworICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJEZWNyeXB0aW9uIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbWVzc2FnZV9ieXRlcyArPSBwcm9jZXNzZWRfbWVzc2FnZV9zaXplOworICAgICAgbWVzc2FnZV9zaXplIC09IHByb2Nlc3NlZF9tZXNzYWdlX3NpemU7CisgICAgICBjdXIgKz0gdW5wcm90ZWN0ZWRfYnVmZmVyX3NpemVfd3JpdHRlbjsKKworICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgZmx1c2hfcmVhZF9zdGFnaW5nX2J1ZmZlcihlcCwgJmN1ciwgJmVuZCk7CisgICAgICAgIC8qIEZvcmNlIHRvIGVudGVyIHRoZSBsb29wIGFnYWluIHRvIGV4dHJhY3QgYnVmZmVyZWQgYnl0ZXMgaW4gcHJvdGVjdG9yLgorICAgICAgICAgICBUaGUgYnl0ZXMgY291bGQgYmUgYnVmZmVyZWQgYmVjYXVzZSBvZiBydW5uaW5nIG91dCBvZiBzdGFnaW5nX2J1ZmZlci4KKyAgICAgICAgICAgSWYgdGhpcyBoYXBwZW5zIGF0IHRoZSBlbmQgb2YgYWxsIHNsaWNlcywgZG9pbmcgYW5vdGhlciB1bnByb3RlY3QKKyAgICAgICAgICAgYXZvaWRzIGxlYXZpbmcgZGF0YSBpbiB0aGUgcHJvdGVjdG9yLiAqLworICAgICAgICBrZWVwX2xvb3BpbmcgPSAxOworICAgICAgfSBlbHNlIGlmICh1bnByb3RlY3RlZF9idWZmZXJfc2l6ZV93cml0dGVuID4gMCkgeworICAgICAgICBrZWVwX2xvb3BpbmcgPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAga2VlcF9sb29waW5nID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOworICB9CisKKyAgaWYgKGN1ciAhPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyKSkgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAorICAgICAgICBlcC0+cmVhZF9idWZmZXIsCisgICAgICAgIGdwcl9zbGljZV9zcGxpdF9oZWFkKAorICAgICAgICAgICAgJmVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyLAorICAgICAgICAgICAgKHNpemVfdCkoY3VyIC0gR1BSX1NMSUNFX1NUQVJUX1BUUihlcC0+cmVhZF9zdGFnaW5nX2J1ZmZlcikpKSk7CisgIH0KKworICAvKiBUT0RPKHlhbmdnKSBleHBlcmltZW50IHdpdGggbW92aW5nIHRoaXMgYmxvY2sgYWZ0ZXIgcmVhZF9jYiB0byBzZWUgaWYgaXQKKyAgICAgaGVscHMgbGF0ZW5jeSAqLworICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZigmZXAtPnNvdXJjZV9idWZmZXIpOworCisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoZXAtPnJlYWRfYnVmZmVyKTsKKyAgICBjYWxsX3JlYWRfY2IoZXhlY19jdHgsIGVwLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBjYWxsX3JlYWRfY2IoZXhlY19jdHgsIGVwLCAxKTsKK30KKworc3RhdGljIHZvaWQgZW5kcG9pbnRfcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZXMsIGdycGNfY2xvc3VyZSAqY2IpIHsKKyAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKilzZWN1cmVfZXA7CisgIGVwLT5yZWFkX2NiID0gY2I7CisgIGVwLT5yZWFkX2J1ZmZlciA9IHNsaWNlczsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoZXAtPnJlYWRfYnVmZmVyKTsKKworICBTRUNVUkVfRU5EUE9JTlRfUkVGKGVwLCAicmVhZCIpOworICBpZiAoZXAtPmxlZnRvdmVyX2J5dGVzLmNvdW50KSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9zd2FwKCZlcC0+bGVmdG92ZXJfYnl0ZXMsICZlcC0+c291cmNlX2J1ZmZlcik7CisgICAgR1BSX0FTU0VSVChlcC0+bGVmdG92ZXJfYnl0ZXMuY291bnQgPT0gMCk7CisgICAgb25fcmVhZChleGVjX2N0eCwgZXAsIDEpOworICAgIHJldHVybjsKKyAgfQorCisgIGdycGNfZW5kcG9pbnRfcmVhZChleGVjX2N0eCwgZXAtPndyYXBwZWRfZXAsICZlcC0+c291cmNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICZlcC0+b25fcmVhZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX3dyaXRlX3N0YWdpbmdfYnVmZmVyKHNlY3VyZV9lbmRwb2ludCAqZXAsIHVpbnQ4X3QgKipjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZW5kKSB7CisgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZlcC0+b3V0cHV0X2J1ZmZlciwgZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKTsKKyAgZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyID0gZ3ByX3NsaWNlX21hbGxvYyhTVEFHSU5HX0JVRkZFUl9TSVpFKTsKKyAgKmN1ciA9IEdQUl9TTElDRV9TVEFSVF9QVFIoZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKTsKKyAgKmVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKGVwLT53cml0ZV9zdGFnaW5nX2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGVuZHBvaW50X3dyaXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICpzZWN1cmVfZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZXMsIGdycGNfY2xvc3VyZSAqY2IpIHsKKyAgdW5zaWduZWQgaTsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIHNlY3VyZV9lbmRwb2ludCAqZXAgPSAoc2VjdXJlX2VuZHBvaW50ICopc2VjdXJlX2VwOworICB1aW50OF90ICpjdXIgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGVwLT53cml0ZV9zdGFnaW5nX2J1ZmZlcik7CisgIHVpbnQ4X3QgKmVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKGVwLT53cml0ZV9zdGFnaW5nX2J1ZmZlcik7CisKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoJmVwLT5vdXRwdXRfYnVmZmVyKTsKKworICBpZiAoZ3JwY190cmFjZV9zZWN1cmVfZW5kcG9pbnQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VzLT5jb3VudDsgaSsrKSB7CisgICAgICBjaGFyICpkYXRhID0KKyAgICAgICAgICBncHJfZHVtcF9zbGljZShzbGljZXMtPnNsaWNlc1tpXSwgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpOworICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJXUklURSAlcDogJXMiLCBlcCwgZGF0YSk7CisgICAgICBncHJfZnJlZShkYXRhKTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VzLT5jb3VudDsgaSsrKSB7CisgICAgZ3ByX3NsaWNlIHBsYWluID0gc2xpY2VzLT5zbGljZXNbaV07CisgICAgdWludDhfdCAqbWVzc2FnZV9ieXRlcyA9IEdQUl9TTElDRV9TVEFSVF9QVFIocGxhaW4pOworICAgIHNpemVfdCBtZXNzYWdlX3NpemUgPSBHUFJfU0xJQ0VfTEVOR1RIKHBsYWluKTsKKyAgICB3aGlsZSAobWVzc2FnZV9zaXplID4gMCkgeworICAgICAgc2l6ZV90IHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kID0gKHNpemVfdCkoZW5kIC0gY3VyKTsKKyAgICAgIHNpemVfdCBwcm9jZXNzZWRfbWVzc2FnZV9zaXplID0gbWVzc2FnZV9zaXplOworICAgICAgZ3ByX211X2xvY2soJmVwLT5wcm90ZWN0b3JfbXUpOworICAgICAgcmVzdWx0ID0gdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0KGVwLT5wcm90ZWN0b3IsIG1lc3NhZ2VfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2Nlc3NlZF9tZXNzYWdlX3NpemUsIGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQpOworICAgICAgZ3ByX211X3VubG9jaygmZXAtPnByb3RlY3Rvcl9tdSk7CisgICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkVuY3J5cHRpb24gZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBtZXNzYWdlX2J5dGVzICs9IHByb2Nlc3NlZF9tZXNzYWdlX3NpemU7CisgICAgICBtZXNzYWdlX3NpemUgLT0gcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZTsKKyAgICAgIGN1ciArPSBwcm90ZWN0ZWRfYnVmZmVyX3NpemVfdG9fc2VuZDsKKworICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgZmx1c2hfd3JpdGVfc3RhZ2luZ19idWZmZXIoZXAsICZjdXIsICZlbmQpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7CisgIH0KKyAgaWYgKHJlc3VsdCA9PSBUU0lfT0spIHsKKyAgICBzaXplX3Qgc3RpbGxfcGVuZGluZ19zaXplOworICAgIGRvIHsKKyAgICAgIHNpemVfdCBwcm90ZWN0ZWRfYnVmZmVyX3NpemVfdG9fc2VuZCA9IChzaXplX3QpKGVuZCAtIGN1cik7CisgICAgICBncHJfbXVfbG9jaygmZXAtPnByb3RlY3Rvcl9tdSk7CisgICAgICByZXN1bHQgPSB0c2lfZnJhbWVfcHJvdGVjdG9yX3Byb3RlY3RfZmx1c2goZXAtPnByb3RlY3RvciwgY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0ZWRfYnVmZmVyX3NpemVfdG9fc2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RpbGxfcGVuZGluZ19zaXplKTsKKyAgICAgIGdwcl9tdV91bmxvY2soJmVwLT5wcm90ZWN0b3JfbXUpOworICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOworICAgICAgY3VyICs9IHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kOworICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKKyAgICAgICAgZmx1c2hfd3JpdGVfc3RhZ2luZ19idWZmZXIoZXAsICZjdXIsICZlbmQpOworICAgICAgfQorICAgIH0gd2hpbGUgKHN0aWxsX3BlbmRpbmdfc2l6ZSA+IDApOworICAgIGlmIChjdXIgIT0gR1BSX1NMSUNFX1NUQVJUX1BUUihlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIpKSB7CisgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgKKyAgICAgICAgICAmZXAtPm91dHB1dF9idWZmZXIsCisgICAgICAgICAgZ3ByX3NsaWNlX3NwbGl0X2hlYWQoCisgICAgICAgICAgICAgICZlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIsCisgICAgICAgICAgICAgIChzaXplX3QpKGN1ciAtIEdQUl9TTElDRV9TVEFSVF9QVFIoZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKSkpKTsKKyAgICB9CisgIH0KKworICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgIC8qIFRPRE8oeWFuZ2cpIGRvIGRpZmZlcmVudCB0aGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBlcnJvciB0eXBlPyAqLworICAgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKCZlcC0+b3V0cHV0X2J1ZmZlcik7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjYiwgZmFsc2UsIE5VTEwpOworICAgIHJldHVybjsKKyAgfQorCisgIGdycGNfZW5kcG9pbnRfd3JpdGUoZXhlY19jdHgsIGVwLT53cmFwcGVkX2VwLCAmZXAtPm91dHB1dF9idWZmZXIsIGNiKTsKK30KKworc3RhdGljIHZvaWQgZW5kcG9pbnRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZXApIHsKKyAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKilzZWN1cmVfZXA7CisgIGdycGNfZW5kcG9pbnRfc2h1dGRvd24oZXhlY19jdHgsIGVwLT53cmFwcGVkX2VwKTsKK30KKworc3RhdGljIHZvaWQgZW5kcG9pbnRfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VwKSB7CisgIHNlY3VyZV9lbmRwb2ludCAqZXAgPSAoc2VjdXJlX2VuZHBvaW50ICopc2VjdXJlX2VwOworICBTRUNVUkVfRU5EUE9JTlRfVU5SRUYoZXhlY19jdHgsIGVwLCAiZGVzdHJveSIpOworfQorCitzdGF0aWMgdm9pZCBlbmRwb2ludF9hZGRfdG9fcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgeworICBzZWN1cmVfZW5kcG9pbnQgKmVwID0gKHNlY3VyZV9lbmRwb2ludCAqKXNlY3VyZV9lcDsKKyAgZ3JwY19lbmRwb2ludF9hZGRfdG9fcG9sbHNldChleGVjX2N0eCwgZXAtPndyYXBwZWRfZXAsIHBvbGxzZXQpOworfQorCitzdGF0aWMgdm9pZCBlbmRwb2ludF9hZGRfdG9fcG9sbHNldF9zZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF9zZXQgKnBvbGxzZXRfc2V0KSB7CisgIHNlY3VyZV9lbmRwb2ludCAqZXAgPSAoc2VjdXJlX2VuZHBvaW50ICopc2VjdXJlX2VwOworICBncnBjX2VuZHBvaW50X2FkZF90b19wb2xsc2V0X3NldChleGVjX2N0eCwgZXAtPndyYXBwZWRfZXAsIHBvbGxzZXRfc2V0KTsKK30KKworc3RhdGljIGNoYXIgKmVuZHBvaW50X2dldF9wZWVyKGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lcCkgeworICBzZWN1cmVfZW5kcG9pbnQgKmVwID0gKHNlY3VyZV9lbmRwb2ludCAqKXNlY3VyZV9lcDsKKyAgcmV0dXJuIGdycGNfZW5kcG9pbnRfZ2V0X3BlZXIoZXAtPndyYXBwZWRfZXApOworfQorCitzdGF0aWMgY29uc3QgZ3JwY19lbmRwb2ludF92dGFibGUgdnRhYmxlID0geworICAgIGVuZHBvaW50X3JlYWQsICAgICAgICAgICBlbmRwb2ludF93cml0ZSwKKyAgICBlbmRwb2ludF9hZGRfdG9fcG9sbHNldCwgZW5kcG9pbnRfYWRkX3RvX3BvbGxzZXRfc2V0LAorICAgIGVuZHBvaW50X3NodXRkb3duLCAgICAgICBlbmRwb2ludF9kZXN0cm95LAorICAgIGVuZHBvaW50X2dldF9wZWVyfTsKKworZ3JwY19lbmRwb2ludCAqZ3JwY19zZWN1cmVfZW5kcG9pbnRfY3JlYXRlKAorICAgIHN0cnVjdCB0c2lfZnJhbWVfcHJvdGVjdG9yICpwcm90ZWN0b3IsIGdycGNfZW5kcG9pbnQgKnRyYW5zcG9ydCwKKyAgICBncHJfc2xpY2UgKmxlZnRvdmVyX3NsaWNlcywgc2l6ZV90IGxlZnRvdmVyX25zbGljZXMpIHsKKyAgc2l6ZV90IGk7CisgIHNlY3VyZV9lbmRwb2ludCAqZXAgPSAoc2VjdXJlX2VuZHBvaW50ICopZ3ByX21hbGxvYyhzaXplb2Yoc2VjdXJlX2VuZHBvaW50KSk7CisgIGVwLT5iYXNlLnZ0YWJsZSA9ICZ2dGFibGU7CisgIGVwLT53cmFwcGVkX2VwID0gdHJhbnNwb3J0OworICBlcC0+cHJvdGVjdG9yID0gcHJvdGVjdG9yOworICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmVwLT5sZWZ0b3Zlcl9ieXRlcyk7CisgIGZvciAoaSA9IDA7IGkgPCBsZWZ0b3Zlcl9uc2xpY2VzOyBpKyspIHsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmZXAtPmxlZnRvdmVyX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9yZWYobGVmdG92ZXJfc2xpY2VzW2ldKSk7CisgIH0KKyAgZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyID0gZ3ByX3NsaWNlX21hbGxvYyhTVEFHSU5HX0JVRkZFUl9TSVpFKTsKKyAgZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIgPSBncHJfc2xpY2VfbWFsbG9jKFNUQUdJTkdfQlVGRkVSX1NJWkUpOworICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmVwLT5vdXRwdXRfYnVmZmVyKTsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZlcC0+c291cmNlX2J1ZmZlcik7CisgIGVwLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgIGdycGNfY2xvc3VyZV9pbml0KCZlcC0+b25fcmVhZCwgb25fcmVhZCwgZXApOworICBncHJfbXVfaW5pdCgmZXAtPnByb3RlY3Rvcl9tdSk7CisgIGdwcl9yZWZfaW5pdCgmZXAtPnJlZiwgMSk7CisgIHJldHVybiAmZXAtPmJhc2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmggYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiZDE2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfU0VDVVJFX0VORFBPSU5UX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9TRUNVUkVfRU5EUE9JTlRfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmgiCisKK3N0cnVjdCB0c2lfZnJhbWVfcHJvdGVjdG9yOworCitleHRlcm4gaW50IGdycGNfdHJhY2Vfc2VjdXJlX2VuZHBvaW50OworCisvKiBUYWtlcyBvd25lcnNoaXAgb2YgcHJvdGVjdG9yIGFuZCB0b193cmFwLCBhbmQgcmVmcyBsZWZ0b3Zlcl9zbGljZXMuICovCitncnBjX2VuZHBvaW50ICpncnBjX3NlY3VyZV9lbmRwb2ludF9jcmVhdGUoCisgICAgc3RydWN0IHRzaV9mcmFtZV9wcm90ZWN0b3IgKnByb3RlY3RvciwgZ3JwY19lbmRwb2ludCAqdG9fd3JhcCwKKyAgICBncHJfc2xpY2UgKmxlZnRvdmVyX3NsaWNlcywgc2l6ZV90IGxlZnRvdmVyX25zbGljZXMpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9TRUNVUkVfRU5EUE9JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjIzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMKQEAgLTAsMCArMSw4MTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIKKworLyogLS0gQ29uc3RhbnRzLiAtLSAqLworCisjaWZuZGVmIElOU1RBTExfUFJFRklYCitzdGF0aWMgY29uc3QgY2hhciAqaW5zdGFsbGVkX3Jvb3RzX3BhdGggPSAiL3Vzci9zaGFyZS9ncnBjL3Jvb3RzLnBlbSI7CisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgKmluc3RhbGxlZF9yb290c19wYXRoID0KKyAgICBJTlNUQUxMX1BSRUZJWCAiL3NoYXJlL2dycGMvcm9vdHMucGVtIjsKKyNlbmRpZgorCisvKiAtLSBPdmVycmlkZGVuIGRlZmF1bHQgcm9vdHMuIC0tICovCisKK3N0YXRpYyBncnBjX3NzbF9yb290c19vdmVycmlkZV9jYWxsYmFjayBzc2xfcm9vdHNfb3ZlcnJpZGVfY2IgPSBOVUxMOworCit2b2lkIGdycGNfc2V0X3NzbF9yb290c19vdmVycmlkZV9jYWxsYmFjayhncnBjX3NzbF9yb290c19vdmVycmlkZV9jYWxsYmFjayBjYikgeworICBzc2xfcm9vdHNfb3ZlcnJpZGVfY2IgPSBjYjsKK30KKworLyogLS0gQ2lwaGVyIHN1aXRlcy4gLS0gKi8KKworLyogRGVmaW5lcyB0aGUgY2lwaGVyIHN1aXRlcyB0aGF0IHdlIGFjY2VwdCBieSBkZWZhdWx0LiBBbGwgdGhlc2UgY2lwaGVyIHN1aXRlcworICAgYXJlIGNvbXBsaWFudCB3aXRoIEhUVFAyLiAqLworI2RlZmluZSBHUlBDX1NTTF9DSVBIRVJfU1VJVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTY6RUNESEUtUlNBLUFFUzEyOC1TSEEyNTY6RUNESEUtUlNBLUFFUzI1Ni0iIFwKKyAgIlNIQTM4NDpFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQiCisKK3N0YXRpYyBncHJfb25jZSBjaXBoZXJfc3VpdGVzX29uY2UgPSBHUFJfT05DRV9JTklUOworc3RhdGljIGNvbnN0IGNoYXIgKmNpcGhlcl9zdWl0ZXMgPSBOVUxMOworCitzdGF0aWMgdm9pZCBpbml0X2NpcGhlcl9zdWl0ZXModm9pZCkgeworICBjaGFyICpvdmVycmlkZGVuID0gZ3ByX2dldGVudigiR1JQQ19TU0xfQ0lQSEVSX1NVSVRFUyIpOworICBjaXBoZXJfc3VpdGVzID0gb3ZlcnJpZGRlbiAhPSBOVUxMID8gb3ZlcnJpZGRlbiA6IEdSUENfU1NMX0NJUEhFUl9TVUlURVM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfY2lwaGVyX3N1aXRlcyh2b2lkKSB7CisgIGdwcl9vbmNlX2luaXQoJmNpcGhlcl9zdWl0ZXNfb25jZSwgaW5pdF9jaXBoZXJfc3VpdGVzKTsKKyAgcmV0dXJuIGNpcGhlcl9zdWl0ZXM7Cit9CisKKy8qIC0tIENvbW1vbiBtZXRob2RzLiAtLSAqLworCisvKiBSZXR1cm5zIHRoZSBmaXJzdCBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZS4gKi8KK2NvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICp0c2lfcGVlcl9nZXRfcHJvcGVydHlfYnlfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgIHNpemVfdCBpOworICBpZiAocGVlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IHBlZXItPnByb3BlcnR5X2NvdW50OyBpKyspIHsKKyAgICBjb25zdCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkgPSAmcGVlci0+cHJvcGVydGllc1tpXTsKKyAgICBpZiAobmFtZSA9PSBOVUxMICYmIHByb3BlcnR5LT5uYW1lID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisgICAgaWYgKG5hbWUgIT0gTlVMTCAmJiBwcm9wZXJ0eS0+bmFtZSAhPSBOVUxMICYmCisgICAgICAgIHN0cmNtcChwcm9wZXJ0eS0+bmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3Jfc2h1dGRvd24oCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqY29ubmVjdG9yKSB7CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0ICp0bXA7CisgIGdwcl9tdV9sb2NrKCZjb25uZWN0b3ItPm11KTsKKyAgd2hpbGUgKGNvbm5lY3Rvci0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlcykgeworICAgIHRtcCA9IGNvbm5lY3Rvci0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlczsKKyAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9zaHV0ZG93bigKKyAgICAgICAgZXhlY19jdHgsIGNvbm5lY3Rvci0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlcy0+aGFuZHNoYWtlKTsKKyAgICBjb25uZWN0b3ItPmhhbmRzaGFraW5nX2hhbmRzaGFrZXMgPSB0bXAtPm5leHQ7CisgICAgZ3ByX2ZyZWUodG1wKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZjb25uZWN0b3ItPm11KTsKK30KKwordm9pZCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCisgICAgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LCBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiIGNiLAorICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBpZiAoc2MgPT0gTlVMTCB8fCBub25zZWN1cmVfZW5kcG9pbnQgPT0gTlVMTCkgeworICAgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIEdSUENfU0VDVVJJVFlfRVJST1IsIE5VTEwsIE5VTEwpOworICB9IGVsc2UgeworICAgIHNjLT5kb19oYW5kc2hha2UoZXhlY19jdHgsIHNjLCBub25zZWN1cmVfZW5kcG9pbnQsIGNiLCB1c2VyX2RhdGEpOworICB9Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKKyAgICBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgKmFjY2VwdG9yLCBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCisgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChzYyA9PSBOVUxMIHx8IG5vbnNlY3VyZV9lbmRwb2ludCA9PSBOVUxMKSB7CisgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUiwgTlVMTCwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgc2MtPmRvX2hhbmRzaGFrZShleGVjX2N0eCwgc2MsIGFjY2VwdG9yLCBub25zZWN1cmVfZW5kcG9pbnQsIGNiLCB1c2VyX2RhdGEpOworICB9Cit9CisKK3ZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChzYyA9PSBOVUxMKSB7CisgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUiwgTlVMTCk7CisgICAgdHNpX3BlZXJfZGVzdHJ1Y3QoJnBlZXIpOworICB9IGVsc2UgeworICAgIHNjLT52dGFibGUtPmNoZWNrX3BlZXIoZXhlY19jdHgsIHNjLCBwZWVyLCBjYiwgdXNlcl9kYXRhKTsKKyAgfQorfQorCit2b2lkIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY2hlY2tfY2FsbF9ob3N0KAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKKyAgICBjb25zdCBjaGFyICpob3N0LCBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0LAorICAgIGdycGNfc2VjdXJpdHlfY2FsbF9ob3N0X2NoZWNrX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgaWYgKHNjID09IE5VTEwgfHwgc2MtPmNoZWNrX2NhbGxfaG9zdCA9PSBOVUxMKSB7CisgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUik7CisgIH0gZWxzZSB7CisgICAgc2MtPmNoZWNrX2NhbGxfaG9zdChleGVjX2N0eCwgc2MsIGhvc3QsIGF1dGhfY29udGV4dCwgY2IsIHVzZXJfZGF0YSk7CisgIH0KK30KKworI2lmZGVmIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1JFRkNPVU5UX0RFQlVHCitncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfcmVmKAorICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisgICAgY29uc3QgY2hhciAqcmVhc29uKSB7CisgIGlmIChzYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAorICAgICAgICAgICJTRUNVUklUWV9DT05ORUNUT1I6JXAgICByZWYgJWQgLT4gJWQgJXMiLCBzYywKKyAgICAgICAgICAoaW50KXNjLT5yZWZjb3VudC5jb3VudCwgKGludClzYy0+cmVmY291bnQuY291bnQgKyAxLCByZWFzb24pOworI2Vsc2UKK2dycGNfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9yZWYoCisgICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7CisgIGlmIChzYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBncHJfcmVmKCZzYy0+cmVmY291bnQpOworICByZXR1cm4gc2M7Cit9CisKKyNpZmRlZiBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9SRUZDT1VOVF9ERUJVRwordm9pZCBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl91bnJlZihncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pIHsKKyAgaWYgKHNjID09IE5VTEwpIHJldHVybjsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAorICAgICAgICAgICJTRUNVUklUWV9DT05ORUNUT1I6JXAgdW5yZWYgJWQgLT4gJWQgJXMiLCBzYywKKyAgICAgICAgICAoaW50KXNjLT5yZWZjb3VudC5jb3VudCwgKGludClzYy0+cmVmY291bnQuY291bnQgLSAxLCByZWFzb24pOworI2Vsc2UKK3ZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdW5yZWYoZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7CisgIGlmIChzYyA9PSBOVUxMKSByZXR1cm47CisjZW5kaWYKKyAgaWYgKGdwcl91bnJlZigmc2MtPnJlZmNvdW50KSkgc2MtPnZ0YWJsZS0+ZGVzdHJveShzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbm5lY3Rvcl9wb2ludGVyX2FyZ19kZXN0cm95KHZvaWQgKnApIHsKKyAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYocCwgImNvbm5lY3Rvcl9wb2ludGVyX2FyZyIpOworfQorCitzdGF0aWMgdm9pZCAqY29ubmVjdG9yX3BvaW50ZXJfYXJnX2NvcHkodm9pZCAqcCkgeworICByZXR1cm4gR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKHAsICJjb25uZWN0b3JfcG9pbnRlcl9hcmciKTsKK30KKworc3RhdGljIGludCBjb25uZWN0b3JfcG9pbnRlcl9jbXAodm9pZCAqYSwgdm9pZCAqYikgeyByZXR1cm4gR1BSX0lDTVAoYSwgYik7IH0KKworc3RhdGljIGNvbnN0IGdycGNfYXJnX3BvaW50ZXJfdnRhYmxlIGNvbm5lY3Rvcl9wb2ludGVyX3Z0YWJsZSA9IHsKKyAgICBjb25uZWN0b3JfcG9pbnRlcl9hcmdfY29weSwgY29ubmVjdG9yX3BvaW50ZXJfYXJnX2Rlc3Ryb3ksCisgICAgY29ubmVjdG9yX3BvaW50ZXJfY21wfTsKKworZ3JwY19hcmcgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdG9fYXJnKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYykgeworICBncnBjX2FyZyByZXN1bHQ7CisgIHJlc3VsdC50eXBlID0gR1JQQ19BUkdfUE9JTlRFUjsKKyAgcmVzdWx0LmtleSA9IEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX0FSRzsKKyAgcmVzdWx0LnZhbHVlLnBvaW50ZXIudnRhYmxlID0gJmNvbm5lY3Rvcl9wb2ludGVyX3Z0YWJsZTsKKyAgcmVzdWx0LnZhbHVlLnBvaW50ZXIucCA9IHNjOworICByZXR1cm4gcmVzdWx0OworfQorCitncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZykgeworICBpZiAoc3RyY21wKGFyZy0+a2V5LCBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9BUkcpKSByZXR1cm4gTlVMTDsKKyAgaWYgKGFyZy0+dHlwZSAhPSBHUlBDX0FSR19QT0lOVEVSKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHR5cGUgJWQgZm9yIGFyZyAlcyIsIGFyZy0+dHlwZSwKKyAgICAgICAgICAgIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX0FSRyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGFyZy0+dmFsdWUucG9pbnRlci5wOworfQorCitncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19maW5kX3NlY3VyaXR5X2Nvbm5lY3Rvcl9pbl9hcmdzKAorICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKSB7CisgIHNpemVfdCBpOworICBpZiAoYXJncyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IGFyZ3MtPm51bV9hcmdzOyBpKyspIHsKKyAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MgPQorICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9mcm9tX2FyZygmYXJncy0+YXJnc1tpXSk7CisgICAgaWYgKHNjICE9IE5VTEwpIHJldHVybiBzYzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogLS0gRmFrZSBpbXBsZW1lbnRhdGlvbi4gLS0gKi8KKworc3RhdGljIHZvaWQgZmFrZV9jaGFubmVsX2Rlc3Ryb3koZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7CisgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmMgPSAoZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoYy0+cmVxdWVzdF9tZXRhZGF0YV9jcmVkcyk7CisgIGdwcl9mcmVlKHNjKTsKK30KKworc3RhdGljIHZvaWQgZmFrZV9zZXJ2ZXJfZGVzdHJveShncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MpIHsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpjID0gKGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworICBncHJfbXVfZGVzdHJveSgmYy0+bXUpOworICBncHJfZnJlZShzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZha2VfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsIHRzaV9wZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9wZWVyX2NoZWNrX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKKyAgY29uc3QgY2hhciAqcHJvcF9uYW1lOworICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX09LOworICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0ID0gTlVMTDsKKyAgaWYgKHBlZXIucHJvcGVydHlfY291bnQgIT0gMSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRmFrZSBwZWVycyBzaG91bGQgb25seSBoYXZlIDEgcHJvcGVydHkuIik7CisgICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9FUlJPUjsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBwcm9wX25hbWUgPSBwZWVyLnByb3BlcnRpZXNbMF0ubmFtZTsKKyAgaWYgKHByb3BfbmFtZSA9PSBOVUxMIHx8CisgICAgICBzdHJjbXAocHJvcF9uYW1lLCBUU0lfQ0VSVElGSUNBVEVfVFlQRV9QRUVSX1BST1BFUlRZKSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5leHBlY3RlZCBwcm9wZXJ0eSBpbiBmYWtlIHBlZXI6ICVzLiIsCisgICAgICAgICAgICBwcm9wX25hbWUgPT0gTlVMTCA/ICI8RU1QVFk+IiA6IHByb3BfbmFtZSk7CisgICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9FUlJPUjsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAoc3RybmNtcChwZWVyLnByb3BlcnRpZXNbMF0udmFsdWUuZGF0YSwgVFNJX0ZBS0VfQ0VSVElGSUNBVEVfVFlQRSwKKyAgICAgICAgICAgICAgcGVlci5wcm9wZXJ0aWVzWzBdLnZhbHVlLmxlbmd0aCkpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgdmFsdWUgZm9yIGNlcnQgdHlwZSBwcm9wZXJ0eS4iKTsKKyAgICBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX0VSUk9SOworICAgIGdvdG8gZW5kOworICB9CisgIGF1dGhfY29udGV4dCA9IGdycGNfYXV0aF9jb250ZXh0X2NyZWF0ZShOVUxMKTsKKyAgZ3JwY19hdXRoX2NvbnRleHRfYWRkX2NzdHJpbmdfcHJvcGVydHkoCisgICAgICBhdXRoX2NvbnRleHQsIEdSUENfVFJBTlNQT1JUX1NFQ1VSSVRZX1RZUEVfUFJPUEVSVFlfTkFNRSwKKyAgICAgIEdSUENfRkFLRV9UUkFOU1BPUlRfU0VDVVJJVFlfVFlQRSk7CisKK2VuZDoKKyAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgc3RhdHVzLCBhdXRoX2NvbnRleHQpOworICBncnBjX2F1dGhfY29udGV4dF91bnJlZihhdXRoX2NvbnRleHQpOworICB0c2lfcGVlcl9kZXN0cnVjdCgmcGVlcik7Cit9CisKK3N0YXRpYyB2b2lkIGZha2VfY2hhbm5lbF9jaGVja19jYWxsX2hvc3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIEdSUENfU0VDVVJJVFlfT0spOworfQorCitzdGF0aWMgdm9pZCBmYWtlX2NoYW5uZWxfZG9faGFuZHNoYWtlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19kb19zZWN1cml0eV9oYW5kc2hha2UoZXhlY19jdHgsIHRzaV9jcmVhdGVfZmFrZV9oYW5kc2hha2VyKDEpLCAmc2MtPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIG5vbnNlY3VyZV9lbmRwb2ludCwgY2IsIHVzZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGZha2Vfc2VydmVyX2RvX2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9hY2NlcHRvciAqYWNjZXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGdycGNfZG9fc2VjdXJpdHlfaGFuZHNoYWtlKGV4ZWNfY3R4LCB0c2lfY3JlYXRlX2Zha2VfaGFuZHNoYWtlcigwKSwgJnNjLT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbm9uc2VjdXJlX2VuZHBvaW50LCBjYiwgdXNlcl9kYXRhKTsKK30KKworc3RhdGljIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3Z0YWJsZSBmYWtlX2NoYW5uZWxfdnRhYmxlID0geworICAgIGZha2VfY2hhbm5lbF9kZXN0cm95LCBmYWtlX2NoZWNrX3BlZXJ9OworCitzdGF0aWMgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdnRhYmxlIGZha2Vfc2VydmVyX3Z0YWJsZSA9IHtmYWtlX3NlcnZlcl9kZXN0cm95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV9jaGVja19wZWVyfTsKKworZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19mYWtlX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMpIHsKKyAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7CisgIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKyAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLnJlZmNvdW50LCAxKTsKKyAgYy0+YmFzZS51cmxfc2NoZW1lID0gR1JQQ19GQUtFX1NFQ1VSSVRZX1VSTF9TQ0hFTUU7CisgIGMtPmJhc2UudnRhYmxlID0gJmZha2VfY2hhbm5lbF92dGFibGU7CisgIGMtPnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMgPSBncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKHJlcXVlc3RfbWV0YWRhdGFfY3JlZHMpOworICBjLT5jaGVja19jYWxsX2hvc3QgPSBmYWtlX2NoYW5uZWxfY2hlY2tfY2FsbF9ob3N0OworICBjLT5kb19oYW5kc2hha2UgPSBmYWtlX2NoYW5uZWxfZG9faGFuZHNoYWtlOworICByZXR1cm4gYzsKK30KKworZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX2Zha2Vfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCisgICAgdm9pZCkgeworICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKmMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yKSk7CisgIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKyAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLnJlZmNvdW50LCAxKTsKKyAgYy0+YmFzZS52dGFibGUgPSAmZmFrZV9zZXJ2ZXJfdnRhYmxlOworICBjLT5iYXNlLnVybF9zY2hlbWUgPSBHUlBDX0ZBS0VfU0VDVVJJVFlfVVJMX1NDSEVNRTsKKyAgYy0+ZG9faGFuZHNoYWtlID0gZmFrZV9zZXJ2ZXJfZG9faGFuZHNoYWtlOworICBncHJfbXVfaW5pdCgmYy0+bXUpOworICByZXR1cm4gYzsKK30KKworLyogLS0tIFNzbCBpbXBsZW1lbnRhdGlvbi4gLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciBiYXNlOworICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqaGFuZHNoYWtlcl9mYWN0b3J5OworICBjaGFyICp0YXJnZXRfbmFtZTsKKyAgY2hhciAqb3ZlcnJpZGRlbl90YXJnZXRfbmFtZTsKK30gZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3I7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yIGJhc2U7CisgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpoYW5kc2hha2VyX2ZhY3Rvcnk7Cit9IGdycGNfc3NsX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3I7CisKK3N0YXRpYyB2b2lkIHNzbF9jaGFubmVsX2Rlc3Ryb3koZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7CisgIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KKyAgICAgIChncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoYy0+YmFzZS5yZXF1ZXN0X21ldGFkYXRhX2NyZWRzKTsKKyAgaWYgKGMtPmhhbmRzaGFrZXJfZmFjdG9yeSAhPSBOVUxMKSB7CisgICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveShjLT5oYW5kc2hha2VyX2ZhY3RvcnkpOworICB9CisgIGlmIChjLT50YXJnZXRfbmFtZSAhPSBOVUxMKSBncHJfZnJlZShjLT50YXJnZXRfbmFtZSk7CisgIGlmIChjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lICE9IE5VTEwpIGdwcl9mcmVlKGMtPm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUpOworICBncHJfZnJlZShzYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNzbF9zZXJ2ZXJfZGVzdHJveShncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MpIHsKKyAgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9CisgICAgICAoZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworCisgIGlmIChjLT5oYW5kc2hha2VyX2ZhY3RvcnkgIT0gTlVMTCkgeworICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koYy0+aGFuZHNoYWtlcl9mYWN0b3J5KTsKKyAgfQorICBncHJfbXVfZGVzdHJveSgmYy0+YmFzZS5tdSk7CisgIGdwcl9mcmVlKHNjKTsKK30KKworc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzIHNzbF9jcmVhdGVfaGFuZHNoYWtlcigKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqaGFuZHNoYWtlcl9mYWN0b3J5LCBib29sIGlzX2NsaWVudCwKKyAgICBjb25zdCBjaGFyICpwZWVyX25hbWUsIHRzaV9oYW5kc2hha2VyICoqaGFuZHNoYWtlcikgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgaWYgKGhhbmRzaGFrZXJfZmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gR1JQQ19TRUNVUklUWV9FUlJPUjsKKyAgcmVzdWx0ID0gdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXIoCisgICAgICBoYW5kc2hha2VyX2ZhY3RvcnksIGlzX2NsaWVudCA/IHBlZXJfbmFtZSA6IE5VTEwsIGhhbmRzaGFrZXIpOworICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSGFuZHNoYWtlciBjcmVhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAorICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7CisgICAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7CisgIH0KKyAgcmV0dXJuIEdSUENfU0VDVVJJVFlfT0s7Cit9CisKK3N0YXRpYyB2b2lkIHNzbF9jaGFubmVsX2RvX2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmMgPQorICAgICAgKGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7CisgIHRzaV9oYW5kc2hha2VyICpoYW5kc2hha2VyOworICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBzc2xfY3JlYXRlX2hhbmRzaGFrZXIoCisgICAgICBjLT5oYW5kc2hha2VyX2ZhY3RvcnksIHRydWUsCisgICAgICBjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lICE9IE5VTEwgPyBjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjLT50YXJnZXRfbmFtZSwKKyAgICAgICZoYW5kc2hha2VyKTsKKyAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7CisgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgc3RhdHVzLCBOVUxMLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2RvX3NlY3VyaXR5X2hhbmRzaGFrZShleGVjX2N0eCwgaGFuZHNoYWtlciwgJnNjLT5iYXNlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlY3VyZV9lbmRwb2ludCwgY2IsIHVzZXJfZGF0YSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9kb19oYW5kc2hha2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yICphY2NlcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9CisgICAgICAoZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworICB0c2lfaGFuZHNoYWtlciAqaGFuZHNoYWtlcjsKKyAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzID0KKyAgICAgIHNzbF9jcmVhdGVfaGFuZHNoYWtlcihjLT5oYW5kc2hha2VyX2ZhY3RvcnksIGZhbHNlLCBOVUxMLCAmaGFuZHNoYWtlcik7CisgIGlmIChzdGF0dXMgIT0gR1JQQ19TRUNVUklUWV9PSykgeworICAgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIHN0YXR1cywgTlVMTCwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgZ3JwY19kb19zZWN1cml0eV9oYW5kc2hha2UoZXhlY19jdHgsIGhhbmRzaGFrZXIsICZzYy0+YmFzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc2VjdXJlX2VuZHBvaW50LCBjYiwgdXNlcl9kYXRhKTsKKyAgfQorfQorCitzdGF0aWMgaW50IHNzbF9ob3N0X21hdGNoZXNfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwgY29uc3QgY2hhciAqcGVlcl9uYW1lKSB7CisgIGNoYXIgKmFsbG9jYXRlZF9uYW1lID0gTlVMTDsKKyAgaW50IHI7CisKKyAgaWYgKHN0cmNocihwZWVyX25hbWUsICc6JykgIT0gTlVMTCkgeworICAgIGNoYXIgKmlnbm9yZWRfcG9ydDsKKyAgICBncHJfc3BsaXRfaG9zdF9wb3J0KHBlZXJfbmFtZSwgJmFsbG9jYXRlZF9uYW1lLCAmaWdub3JlZF9wb3J0KTsKKyAgICBncHJfZnJlZShpZ25vcmVkX3BvcnQpOworICAgIHBlZXJfbmFtZSA9IGFsbG9jYXRlZF9uYW1lOworICAgIGlmICghcGVlcl9uYW1lKSByZXR1cm4gMDsKKyAgfQorICByID0gdHNpX3NzbF9wZWVyX21hdGNoZXNfbmFtZShwZWVyLCBwZWVyX25hbWUpOworICBncHJfZnJlZShhbGxvY2F0ZWRfbmFtZSk7CisgIHJldHVybiByOworfQorCitncnBjX2F1dGhfY29udGV4dCAqdHNpX3NzbF9wZWVyX3RvX2F1dGhfY29udGV4dChjb25zdCB0c2lfcGVlciAqcGVlcikgeworICBzaXplX3QgaTsKKyAgZ3JwY19hdXRoX2NvbnRleHQgKmN0eCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSA9IE5VTEw7CisKKyAgLyogVGhlIGNhbGxlciBoYXMgY2hlY2tlZCB0aGUgY2VydGlmaWNhdGUgdHlwZSBwcm9wZXJ0eS4gKi8KKyAgR1BSX0FTU0VSVChwZWVyLT5wcm9wZXJ0eV9jb3VudCA+PSAxKTsKKyAgY3R4ID0gZ3JwY19hdXRoX2NvbnRleHRfY3JlYXRlKE5VTEwpOworICBncnBjX2F1dGhfY29udGV4dF9hZGRfY3N0cmluZ19wcm9wZXJ0eSgKKyAgICAgIGN0eCwgR1JQQ19UUkFOU1BPUlRfU0VDVVJJVFlfVFlQRV9QUk9QRVJUWV9OQU1FLAorICAgICAgR1JQQ19TU0xfVFJBTlNQT1JUX1NFQ1VSSVRZX1RZUEUpOworICBmb3IgKGkgPSAwOyBpIDwgcGVlci0+cHJvcGVydHlfY291bnQ7IGkrKykgeworICAgIGNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wID0gJnBlZXItPnByb3BlcnRpZXNbaV07CisgICAgaWYgKHByb3AtPm5hbWUgPT0gTlVMTCkgY29udGludWU7CisgICAgaWYgKHN0cmNtcChwcm9wLT5uYW1lLCBUU0lfWDUwOV9TVUJKRUNUX0NPTU1PTl9OQU1FX1BFRVJfUFJPUEVSVFkpID09IDApIHsKKyAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHN1YmplY3QgYWx0IG5hbWUsIGhhdmUgdGhlIENOIGFzIHRoZSBpZGVudGl0eS4gKi8KKyAgICAgIGlmIChwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgPT0gTlVMTCkgeworICAgICAgICBwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgPSBHUlBDX1g1MDlfQ05fUFJPUEVSVFlfTkFNRTsKKyAgICAgIH0KKyAgICAgIGdycGNfYXV0aF9jb250ZXh0X2FkZF9wcm9wZXJ0eShjdHgsIEdSUENfWDUwOV9DTl9QUk9QRVJUWV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmRhdGEsIHByb3AtPnZhbHVlLmxlbmd0aCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAocHJvcC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBUU0lfWDUwOV9TVUJKRUNUX0FMVEVSTkFUSVZFX05BTUVfUEVFUl9QUk9QRVJUWSkgPT0gMCkgeworICAgICAgcGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lID0gR1JQQ19YNTA5X1NBTl9QUk9QRVJUWV9OQU1FOworICAgICAgZ3JwY19hdXRoX2NvbnRleHRfYWRkX3Byb3BlcnR5KGN0eCwgR1JQQ19YNTA5X1NBTl9QUk9QRVJUWV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmRhdGEsIHByb3AtPnZhbHVlLmxlbmd0aCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAocHJvcC0+bmFtZSwgVFNJX1g1MDlfUEVNX0NFUlRfUFJPUEVSVFkpID09IDApIHsKKyAgICAgIGdycGNfYXV0aF9jb250ZXh0X2FkZF9wcm9wZXJ0eShjdHgsIEdSUENfWDUwOV9QRU1fQ0VSVF9QUk9QRVJUWV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmRhdGEsIHByb3AtPnZhbHVlLmxlbmd0aCk7CisgICAgfQorICB9CisgIGlmIChwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgIT0gTlVMTCkgeworICAgIEdQUl9BU1NFUlQoZ3JwY19hdXRoX2NvbnRleHRfc2V0X3BlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSgKKyAgICAgICAgICAgICAgICAgICBjdHgsIHBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSkgPT0gMSk7CisgIH0KKyAgcmV0dXJuIGN0eDsKK30KKworc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzIHNzbF9jaGVja19wZWVyKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwZWVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNpX3BlZXIgKnBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKiphdXRoX2NvbnRleHQpIHsKKyAgLyogQ2hlY2sgdGhlIEFMUE4uICovCisgIGNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICpwID0KKyAgICAgIHRzaV9wZWVyX2dldF9wcm9wZXJ0eV9ieV9uYW1lKHBlZXIsIFRTSV9TU0xfQUxQTl9TRUxFQ1RFRF9QUk9UT0NPTCk7CisgIGlmIChwID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3Npbmcgc2VsZWN0ZWQgQUxQTiBwcm9wZXJ0eS4iKTsKKyAgICByZXR1cm4gR1JQQ19TRUNVUklUWV9FUlJPUjsKKyAgfQorICBpZiAoIWdycGNfY2h0dHAyX2lzX2FscG5fdmVyc2lvbl9zdXBwb3J0ZWQocC0+dmFsdWUuZGF0YSwgcC0+dmFsdWUubGVuZ3RoKSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBBTFBOIHZhbHVlLiIpOworICAgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBlZXIgbmFtZSBpZiBzcGVjaWZpZWQuICovCisgIGlmIChwZWVyX25hbWUgIT0gTlVMTCAmJiAhc3NsX2hvc3RfbWF0Y2hlc19uYW1lKHBlZXIsIHBlZXJfbmFtZSkpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlBlZXIgbmFtZSAlcyBpcyBub3QgaW4gcGVlciBjZXJ0aWZpY2F0ZSIsIHBlZXJfbmFtZSk7CisgICAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7CisgIH0KKyAgKmF1dGhfY29udGV4dCA9IHRzaV9zc2xfcGVlcl90b19hdXRoX2NvbnRleHQocGVlcik7CisgIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOworfQorCitzdGF0aWMgdm9pZCBzc2xfY2hhbm5lbF9jaGVja19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsIHRzaV9wZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfcGVlcl9jaGVja19jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KKyAgICAgIChncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOworICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXM7CisgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQgPSBOVUxMOworICBzdGF0dXMgPSBzc2xfY2hlY2tfcGVlcihzYywgYy0+b3ZlcnJpZGRlbl90YXJnZXRfbmFtZSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjLT50YXJnZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlZXIsICZhdXRoX2NvbnRleHQpOworICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBzdGF0dXMsIGF1dGhfY29udGV4dCk7CisgIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKGF1dGhfY29udGV4dCk7CisgIHRzaV9wZWVyX2Rlc3RydWN0KCZwZWVyKTsKK30KKworc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9jaGVja19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywgdHNpX3BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQgPSBOVUxMOworICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBzc2xfY2hlY2tfcGVlcihzYywgTlVMTCwgJnBlZXIsICZhdXRoX2NvbnRleHQpOworICB0c2lfcGVlcl9kZXN0cnVjdCgmcGVlcik7CisgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIHN0YXR1cywgYXV0aF9jb250ZXh0KTsKKyAgZ3JwY19hdXRoX2NvbnRleHRfdW5yZWYoYXV0aF9jb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgYWRkX3NoYWxsb3dfYXV0aF9wcm9wZXJ0eV90b19wZWVyKHRzaV9wZWVyICpwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0c2lfcHJvcF9uYW1lKSB7CisgIHRzaV9wZWVyX3Byb3BlcnR5ICp0c2lfcHJvcCA9ICZwZWVyLT5wcm9wZXJ0aWVzW3BlZXItPnByb3BlcnR5X2NvdW50KytdOworICB0c2lfcHJvcC0+bmFtZSA9IChjaGFyICopdHNpX3Byb3BfbmFtZTsKKyAgdHNpX3Byb3AtPnZhbHVlLmRhdGEgPSBwcm9wLT52YWx1ZTsKKyAgdHNpX3Byb3AtPnZhbHVlLmxlbmd0aCA9IHByb3AtPnZhbHVlX2xlbmd0aDsKK30KKwordHNpX3BlZXIgdHNpX3NoYWxsb3dfcGVlcl9mcm9tX3NzbF9hdXRoX2NvbnRleHQoCisgICAgY29uc3QgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgeworICBzaXplX3QgbWF4X251bV9wcm9wcyA9IDA7CisgIGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvciBpdDsKKyAgY29uc3QgZ3JwY19hdXRoX3Byb3BlcnR5ICpwcm9wOworICB0c2lfcGVlciBwZWVyOworICBtZW1zZXQoJnBlZXIsIDAsIHNpemVvZihwZWVyKSk7CisKKyAgaXQgPSBncnBjX2F1dGhfY29udGV4dF9wcm9wZXJ0eV9pdGVyYXRvcihhdXRoX2NvbnRleHQpOworICB3aGlsZSAoZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX25leHQoJml0KSAhPSBOVUxMKSBtYXhfbnVtX3Byb3BzKys7CisKKyAgaWYgKG1heF9udW1fcHJvcHMgPiAwKSB7CisgICAgcGVlci5wcm9wZXJ0aWVzID0gZ3ByX21hbGxvYyhtYXhfbnVtX3Byb3BzICogc2l6ZW9mKHRzaV9wZWVyX3Byb3BlcnR5KSk7CisgICAgaXQgPSBncnBjX2F1dGhfY29udGV4dF9wcm9wZXJ0eV9pdGVyYXRvcihhdXRoX2NvbnRleHQpOworICAgIHdoaWxlICgocHJvcCA9IGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvcl9uZXh0KCZpdCkpICE9IE5VTEwpIHsKKyAgICAgIGlmIChzdHJjbXAocHJvcC0+bmFtZSwgR1JQQ19YNTA5X1NBTl9QUk9QRVJUWV9OQU1FKSA9PSAwKSB7CisgICAgICAgIGFkZF9zaGFsbG93X2F1dGhfcHJvcGVydHlfdG9fcGVlcigKKyAgICAgICAgICAgICZwZWVyLCBwcm9wLCBUU0lfWDUwOV9TVUJKRUNUX0FMVEVSTkFUSVZFX05BTUVfUEVFUl9QUk9QRVJUWSk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChwcm9wLT5uYW1lLCBHUlBDX1g1MDlfQ05fUFJPUEVSVFlfTkFNRSkgPT0gMCkgeworICAgICAgICBhZGRfc2hhbGxvd19hdXRoX3Byb3BlcnR5X3RvX3BlZXIoCisgICAgICAgICAgICAmcGVlciwgcHJvcCwgVFNJX1g1MDlfU1VCSkVDVF9DT01NT05fTkFNRV9QRUVSX1BST1BFUlRZKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHByb3AtPm5hbWUsIEdSUENfWDUwOV9QRU1fQ0VSVF9QUk9QRVJUWV9OQU1FKSA9PSAwKSB7CisgICAgICAgIGFkZF9zaGFsbG93X2F1dGhfcHJvcGVydHlfdG9fcGVlcigmcGVlciwgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTSV9YNTA5X1BFTV9DRVJUX1BST1BFUlRZKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHBlZXI7Cit9CisKK3ZvaWQgdHNpX3NoYWxsb3dfcGVlcl9kZXN0cnVjdCh0c2lfcGVlciAqcGVlcikgeworICBpZiAocGVlci0+cHJvcGVydGllcyAhPSBOVUxMKSBncHJfZnJlZShwZWVyLT5wcm9wZXJ0aWVzKTsKK30KKworc3RhdGljIHZvaWQgc3NsX2NoYW5uZWxfY2hlY2tfY2FsbF9ob3N0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmMgPQorICAgICAgKGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7CisgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfRVJST1I7CisgIHRzaV9wZWVyIHBlZXIgPSB0c2lfc2hhbGxvd19wZWVyX2Zyb21fc3NsX2F1dGhfY29udGV4dChhdXRoX2NvbnRleHQpOworICBpZiAoc3NsX2hvc3RfbWF0Y2hlc19uYW1lKCZwZWVyLCBob3N0KSkgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9PSzsKKworICAvKiBJZiB0aGUgdGFyZ2V0IG5hbWUgd2FzIG92ZXJyaWRkZW4sIHRoZW4gdGhlIG9yaWdpbmFsIHRhcmdldF9uYW1lIHdhcworICAgICAnY2hlY2tlZCcgdHJhbnNpdGl2ZWx5IGR1cmluZyB0aGUgcHJldmlvdXMgcGVlciBjaGVjayBhdCB0aGUgZW5kIG9mIHRoZQorICAgICBoYW5kc2hha2UuICovCisgIGlmIChjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lICE9IE5VTEwgJiYgc3RyY21wKGhvc3QsIGMtPnRhcmdldF9uYW1lKSA9PSAwKSB7CisgICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9PSzsKKyAgfQorICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBzdGF0dXMpOworICB0c2lfc2hhbGxvd19wZWVyX2Rlc3RydWN0KCZwZWVyKTsKK30KKworc3RhdGljIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3Z0YWJsZSBzc2xfY2hhbm5lbF92dGFibGUgPSB7CisgICAgc3NsX2NoYW5uZWxfZGVzdHJveSwgc3NsX2NoYW5uZWxfY2hlY2tfcGVlcn07CisKK3N0YXRpYyBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl92dGFibGUgc3NsX3NlcnZlcl92dGFibGUgPSB7CisgICAgc3NsX3NlcnZlcl9kZXN0cm95LCBzc2xfc2VydmVyX2NoZWNrX3BlZXJ9OworCitzdGF0aWMgZ3ByX3NsaWNlIGNvbXB1dGVfZGVmYXVsdF9wZW1fcm9vdF9jZXJ0c19vbmNlKHZvaWQpIHsKKyAgZ3ByX3NsaWNlIHJlc3VsdCA9IGdwcl9lbXB0eV9zbGljZSgpOworCisgIC8qIEZpcnN0IHRyeSB0byBsb2FkIHRoZSByb290cyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gKi8KKyAgY2hhciAqZGVmYXVsdF9yb290X2NlcnRzX3BhdGggPQorICAgICAgZ3ByX2dldGVudihHUlBDX0RFRkFVTFRfU1NMX1JPT1RTX0ZJTEVfUEFUSF9FTlZfVkFSKTsKKyAgaWYgKGRlZmF1bHRfcm9vdF9jZXJ0c19wYXRoICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPSBncHJfbG9hZF9maWxlKGRlZmF1bHRfcm9vdF9jZXJ0c19wYXRoLCAwLCBOVUxMKTsKKyAgICBncHJfZnJlZShkZWZhdWx0X3Jvb3RfY2VydHNfcGF0aCk7CisgIH0KKworICAvKiBUcnkgb3ZlcnJpZGRlbiByb290cyBpZiBuZWVkZWQuICovCisgIGdycGNfc3NsX3Jvb3RzX292ZXJyaWRlX3Jlc3VsdCBvdnJkX3JlcyA9IEdSUENfU1NMX1JPT1RTX09WRVJSSURFX0ZBSUw7CisgIGlmIChHUFJfU0xJQ0VfSVNfRU1QVFkocmVzdWx0KSAmJiBzc2xfcm9vdHNfb3ZlcnJpZGVfY2IgIT0gTlVMTCkgeworICAgIGNoYXIgKnBlbV9yb290X2NlcnRzID0gTlVMTDsKKyAgICBvdnJkX3JlcyA9IHNzbF9yb290c19vdmVycmlkZV9jYigmcGVtX3Jvb3RfY2VydHMpOworICAgIGlmIChvdnJkX3JlcyA9PSBHUlBDX1NTTF9ST09UU19PVkVSUklERV9PSykgeworICAgICAgR1BSX0FTU0VSVChwZW1fcm9vdF9jZXJ0cyAhPSBOVUxMKTsKKyAgICAgIHJlc3VsdCA9IGdwcl9zbGljZV9uZXcocGVtX3Jvb3RfY2VydHMsIHN0cmxlbihwZW1fcm9vdF9jZXJ0cyksIGdwcl9mcmVlKTsKKyAgICB9CisgIH0KKworICAvKiBGYWxsIGJhY2sgdG8gaW5zdGFsbGVkIGNlcnRzIGlmIG5lZWRlZC4gKi8KKyAgaWYgKEdQUl9TTElDRV9JU19FTVBUWShyZXN1bHQpICYmCisgICAgICBvdnJkX3JlcyAhPSBHUlBDX1NTTF9ST09UU19PVkVSUklERV9GQUlMX1BFUk1BTkVOVExZKSB7CisgICAgcmVzdWx0ID0gZ3ByX2xvYWRfZmlsZShpbnN0YWxsZWRfcm9vdHNfcGF0aCwgMCwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdwcl9zbGljZSBkZWZhdWx0X3BlbV9yb290X2NlcnRzOworCitzdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfcGVtX3Jvb3RfY2VydHModm9pZCkgeworICBkZWZhdWx0X3BlbV9yb290X2NlcnRzID0gY29tcHV0ZV9kZWZhdWx0X3BlbV9yb290X2NlcnRzX29uY2UoKTsKK30KKworZ3ByX3NsaWNlIGdycGNfZ2V0X2RlZmF1bHRfc3NsX3Jvb3RzX2Zvcl90ZXN0aW5nKHZvaWQpIHsKKyAgcmV0dXJuIGNvbXB1dGVfZGVmYXVsdF9wZW1fcm9vdF9jZXJ0c19vbmNlKCk7Cit9CisKK3NpemVfdCBncnBjX2dldF9kZWZhdWx0X3NzbF9yb290cyhjb25zdCB1bnNpZ25lZCBjaGFyICoqcGVtX3Jvb3RfY2VydHMpIHsKKyAgLyogVE9ETyhqYm9ldWZAZ29vZ2xlLmNvbSk6IE1heWJlIHJldmlzaXQgdGhlIGFwcHJvYWNoIHdoaWNoIGNvbnNpc3RzIGluCisgICAgIGxvYWRpbmcgYWxsIHRoZSByb290cyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3MuICovCisgIHN0YXRpYyBncHJfb25jZSBvbmNlID0gR1BSX09OQ0VfSU5JVDsKKyAgZ3ByX29uY2VfaW5pdCgmb25jZSwgaW5pdF9kZWZhdWx0X3BlbV9yb290X2NlcnRzKTsKKyAgKnBlbV9yb290X2NlcnRzID0gR1BSX1NMSUNFX1NUQVJUX1BUUihkZWZhdWx0X3BlbV9yb290X2NlcnRzKTsKKyAgcmV0dXJuIEdQUl9TTElDRV9MRU5HVEgoZGVmYXVsdF9wZW1fcm9vdF9jZXJ0cyk7Cit9CisKK2dycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKKyAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMsCisgICAgY29uc3QgZ3JwY19zc2xfY29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLAorICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUsIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYykgeworICBzaXplX3QgbnVtX2FscG5fcHJvdG9jb2xzID0gZ3JwY19jaHR0cDJfbnVtX2FscG5fdmVyc2lvbnMoKTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqKmFscG5fcHJvdG9jb2xfc3RyaW5ncyA9CisgICAgICBncHJfbWFsbG9jKHNpemVvZihjb25zdCBjaGFyICopICogbnVtX2FscG5fcHJvdG9jb2xzKTsKKyAgdW5zaWduZWQgY2hhciAqYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3RocyA9CisgICAgICBncHJfbWFsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIG51bV9hbHBuX3Byb3RvY29scyk7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICBncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqYzsKKyAgc2l6ZV90IGk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9yb290X2NlcnRzOworICBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZTsKKyAgY2hhciAqcG9ydDsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FscG5fcHJvdG9jb2xzOyBpKyspIHsKKyAgICBhbHBuX3Byb3RvY29sX3N0cmluZ3NbaV0gPQorICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKWdycGNfY2h0dHAyX2dldF9hbHBuX3ZlcnNpb25faW5kZXgoaSk7CisgICAgYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3Roc1tpXSA9CisgICAgICAgICh1bnNpZ25lZCBjaGFyKXN0cmxlbihncnBjX2NodHRwMl9nZXRfYWxwbl92ZXJzaW9uX2luZGV4KGkpKTsKKyAgfQorCisgIGlmIChjb25maWcgPT0gTlVMTCB8fCB0YXJnZXRfbmFtZSA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJBbiBzc2wgY2hhbm5lbCBuZWVkcyBhIGNvbmZpZyBhbmQgYSB0YXJnZXQgbmFtZS4iKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIGlmIChjb25maWctPnBlbV9yb290X2NlcnRzID09IE5VTEwpIHsKKyAgICBwZW1fcm9vdF9jZXJ0c19zaXplID0gZ3JwY19nZXRfZGVmYXVsdF9zc2xfcm9vdHMoJnBlbV9yb290X2NlcnRzKTsKKyAgICBpZiAocGVtX3Jvb3RfY2VydHMgPT0gTlVMTCB8fCBwZW1fcm9vdF9jZXJ0c19zaXplID09IDApIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBkZWZhdWx0IHBlbSByb290IGNlcnRzLiIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcGVtX3Jvb3RfY2VydHMgPSBjb25maWctPnBlbV9yb290X2NlcnRzOworICAgIHBlbV9yb290X2NlcnRzX3NpemUgPSBjb25maWctPnBlbV9yb290X2NlcnRzX3NpemU7CisgIH0KKworICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IpKTsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcikpOworCisgIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5iYXNlLnJlZmNvdW50LCAxKTsKKyAgYy0+YmFzZS5iYXNlLnZ0YWJsZSA9ICZzc2xfY2hhbm5lbF92dGFibGU7CisgIGMtPmJhc2UuYmFzZS51cmxfc2NoZW1lID0gR1JQQ19TU0xfVVJMX1NDSEVNRTsKKyAgYy0+YmFzZS5yZXF1ZXN0X21ldGFkYXRhX2NyZWRzID0KKyAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWYocmVxdWVzdF9tZXRhZGF0YV9jcmVkcyk7CisgIGMtPmJhc2UuY2hlY2tfY2FsbF9ob3N0ID0gc3NsX2NoYW5uZWxfY2hlY2tfY2FsbF9ob3N0OworICBjLT5iYXNlLmRvX2hhbmRzaGFrZSA9IHNzbF9jaGFubmVsX2RvX2hhbmRzaGFrZTsKKyAgZ3ByX3NwbGl0X2hvc3RfcG9ydCh0YXJnZXRfbmFtZSwgJmMtPnRhcmdldF9uYW1lLCAmcG9ydCk7CisgIGdwcl9mcmVlKHBvcnQpOworICBpZiAob3ZlcnJpZGRlbl90YXJnZXRfbmFtZSAhPSBOVUxMKSB7CisgICAgYy0+b3ZlcnJpZGRlbl90YXJnZXRfbmFtZSA9IGdwcl9zdHJkdXAob3ZlcnJpZGRlbl90YXJnZXRfbmFtZSk7CisgIH0KKyAgcmVzdWx0ID0gdHNpX2NyZWF0ZV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSgKKyAgICAgIGNvbmZpZy0+cGVtX3ByaXZhdGVfa2V5LCBjb25maWctPnBlbV9wcml2YXRlX2tleV9zaXplLAorICAgICAgY29uZmlnLT5wZW1fY2VydF9jaGFpbiwgY29uZmlnLT5wZW1fY2VydF9jaGFpbl9zaXplLCBwZW1fcm9vdF9jZXJ0cywKKyAgICAgIHBlbV9yb290X2NlcnRzX3NpemUsIHNzbF9jaXBoZXJfc3VpdGVzKCksIGFscG5fcHJvdG9jb2xfc3RyaW5ncywKKyAgICAgIGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMsICh1aW50MTZfdCludW1fYWxwbl9wcm90b2NvbHMsCisgICAgICAmYy0+aGFuZHNoYWtlcl9mYWN0b3J5KTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZXIgZmFjdG9yeSBjcmVhdGlvbiBmYWlsZWQgd2l0aCAlcy4iLAorICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7CisgICAgc3NsX2NoYW5uZWxfZGVzdHJveSgmYy0+YmFzZS5iYXNlKTsKKyAgICAqc2MgPSBOVUxMOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgKnNjID0gJmMtPmJhc2U7CisgIGdwcl9mcmVlKCh2b2lkICopYWxwbl9wcm90b2NvbF9zdHJpbmdzKTsKKyAgZ3ByX2ZyZWUoYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3Rocyk7CisgIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOworCitlcnJvcjoKKyAgZ3ByX2ZyZWUoKHZvaWQgKilhbHBuX3Byb3RvY29sX3N0cmluZ3MpOworICBncHJfZnJlZShhbHBuX3Byb3RvY29sX3N0cmluZ19sZW5ndGhzKTsKKyAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7Cit9CisKK2dycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc3NsX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAorICAgIGNvbnN0IGdycGNfc3NsX3NlcnZlcl9jb25maWcgKmNvbmZpZywgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKKyAgc2l6ZV90IG51bV9hbHBuX3Byb3RvY29scyA9IGdycGNfY2h0dHAyX251bV9hbHBuX3ZlcnNpb25zKCk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphbHBuX3Byb3RvY29sX3N0cmluZ3MgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YoY29uc3QgY2hhciAqKSAqIG51bV9hbHBuX3Byb3RvY29scyk7CisgIHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YodW5zaWduZWQgY2hhcikgKiBudW1fYWxwbl9wcm90b2NvbHMpOworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqYzsKKyAgc2l6ZV90IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9hbHBuX3Byb3RvY29sczsgaSsrKSB7CisgICAgYWxwbl9wcm90b2NvbF9zdHJpbmdzW2ldID0KKyAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilncnBjX2NodHRwMl9nZXRfYWxwbl92ZXJzaW9uX2luZGV4KGkpOworICAgIGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHNbaV0gPQorICAgICAgICAodW5zaWduZWQgY2hhcilzdHJsZW4oZ3JwY19jaHR0cDJfZ2V0X2FscG5fdmVyc2lvbl9pbmRleChpKSk7CisgIH0KKworICBpZiAoY29uZmlnID09IE5VTEwgfHwgY29uZmlnLT5udW1fa2V5X2NlcnRfcGFpcnMgPT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQW4gU1NMIHNlcnZlciBuZWVkcyBhIGtleSBhbmQgYSBjZXJ0LiIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc3NsX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IpKTsKKyAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yKSk7CisKKyAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLmJhc2UucmVmY291bnQsIDEpOworICBjLT5iYXNlLmJhc2UudXJsX3NjaGVtZSA9IEdSUENfU1NMX1VSTF9TQ0hFTUU7CisgIGMtPmJhc2UuYmFzZS52dGFibGUgPSAmc3NsX3NlcnZlcl92dGFibGU7CisgIHJlc3VsdCA9IHRzaV9jcmVhdGVfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkoCisgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKiljb25maWctPnBlbV9wcml2YXRlX2tleXMsCisgICAgICBjb25maWctPnBlbV9wcml2YXRlX2tleXNfc2l6ZXMsCisgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKiljb25maWctPnBlbV9jZXJ0X2NoYWlucywKKyAgICAgIGNvbmZpZy0+cGVtX2NlcnRfY2hhaW5zX3NpemVzLCBjb25maWctPm51bV9rZXlfY2VydF9wYWlycywKKyAgICAgIGNvbmZpZy0+cGVtX3Jvb3RfY2VydHMsIGNvbmZpZy0+cGVtX3Jvb3RfY2VydHNfc2l6ZSwKKyAgICAgIGNvbmZpZy0+Zm9yY2VfY2xpZW50X2F1dGgsIHNzbF9jaXBoZXJfc3VpdGVzKCksIGFscG5fcHJvdG9jb2xfc3RyaW5ncywKKyAgICAgIGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMsICh1aW50MTZfdCludW1fYWxwbl9wcm90b2NvbHMsCisgICAgICAmYy0+aGFuZHNoYWtlcl9mYWN0b3J5KTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZXIgZmFjdG9yeSBjcmVhdGlvbiBmYWlsZWQgd2l0aCAlcy4iLAorICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7CisgICAgc3NsX3NlcnZlcl9kZXN0cm95KCZjLT5iYXNlLmJhc2UpOworICAgICpzYyA9IE5VTEw7CisgICAgZ290byBlcnJvcjsKKyAgfQorICBncHJfbXVfaW5pdCgmYy0+YmFzZS5tdSk7CisgIGMtPmJhc2UuZG9faGFuZHNoYWtlID0gc3NsX3NlcnZlcl9kb19oYW5kc2hha2U7CisgICpzYyA9ICZjLT5iYXNlOworICBncHJfZnJlZSgodm9pZCAqKWFscG5fcHJvdG9jb2xfc3RyaW5ncyk7CisgIGdwcl9mcmVlKGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMpOworICByZXR1cm4gR1JQQ19TRUNVUklUWV9PSzsKKworZXJyb3I6CisgIGdwcl9mcmVlKCh2b2lkICopYWxwbl9wcm90b2NvbF9zdHJpbmdzKTsKKyAgZ3ByX2ZyZWUoYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3Rocyk7CisgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDA5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TRUNVUklUWV9TRUNVUklUWV9DT05ORUNUT1JfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTk5FQ1RPUl9ICisKKyNpbmNsdWRlIDxncnBjL2dycGNfc2VjdXJpdHkuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgorCisvKiAtLS0gc3RhdHVzIGVudW0uIC0tLSAqLworCit0eXBlZGVmIGVudW0geyBHUlBDX1NFQ1VSSVRZX09LID0gMCwgR1JQQ19TRUNVUklUWV9FUlJPUiB9IGdycGNfc2VjdXJpdHlfc3RhdHVzOworCisvKiAtLS0gVVJMIHNjaGVtZXMuIC0tLSAqLworCisjZGVmaW5lIEdSUENfU1NMX1VSTF9TQ0hFTUUgImh0dHBzIgorI2RlZmluZSBHUlBDX0ZBS0VfU0VDVVJJVFlfVVJMX1NDSEVNRSAiaHR0cCtmYWtlX3NlY3VyaXR5IgorCisvKiAtLS0gc2VjdXJpdHlfY29ubmVjdG9yIG9iamVjdC4gLS0tCisKKyAgICBBIHNlY3VyaXR5IGNvbm5lY3RvciBvYmplY3QgcmVwcmVzZW50cyBhd2F5IHRvIGNvbmZpZ3VyZSB0aGUgdW5kZXJseWluZworICAgIHRyYW5zcG9ydCBzZWN1cml0eSBtZWNoYW5pc20gYW5kIGNoZWNrIHRoZSByZXN1bHRpbmcgdHJ1c3RlZCBwZWVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgZ3JwY19zZWN1cml0eV9jb25uZWN0b3I7CisKKyNkZWZpbmUgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfQVJHICJncnBjLnNlY3VyaXR5X2Nvbm5lY3RvciIKKwordHlwZWRlZiB2b2lkICgqZ3JwY19zZWN1cml0eV9wZWVyX2NoZWNrX2NiKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQpOworCisvKiBPd25lcnNoaXAgb2YgdGhlIHNlY3VyZV9lbmRwb2ludCBpcyB0cmFuc2ZlcmVkLiAqLwordHlwZWRlZiB2b2lkICgqZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYikoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzLAorICAgIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lbmRwb2ludCwgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYyk7CisgIHZvaWQgKCpjaGVja19wZWVyKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgcGVlciwgZ3JwY19zZWN1cml0eV9wZWVyX2NoZWNrX2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKK30gZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdnRhYmxlOworCit0eXBlZGVmIHN0cnVjdCBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdCB7CisgIHZvaWQgKmhhbmRzaGFrZTsKKyAgc3RydWN0IGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0ICpuZXh0OworfSBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdDsKKworc3RydWN0IGdycGNfc2VjdXJpdHlfY29ubmVjdG9yIHsKKyAgY29uc3QgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdnRhYmxlICp2dGFibGU7CisgIGdwcl9yZWZjb3VudCByZWZjb3VudDsKKyAgY29uc3QgY2hhciAqdXJsX3NjaGVtZTsKK307CisKKy8qIFJlZmNvdW50aW5nLiAqLworI2lmZGVmIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1JFRihwLCByKSBcCisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3JlZigocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQorI2RlZmluZSBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9VTlJFRihwLCByKSBcCisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3VucmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCitncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfcmVmKAorICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpwb2xpY3ksIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3VucmVmKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOworI2Vsc2UKKyNkZWZpbmUgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKHAsIHIpIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3JlZigocCkpCisjZGVmaW5lIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1VOUkVGKHAsIHIpIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3VucmVmKChwKSkKK2dycGNfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9yZWYoCisgICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnBvbGljeSk7Cit2b2lkIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3VucmVmKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpwb2xpY3kpOworI2VuZGlmCisKKy8qIENoZWNrIHRoZSBwZWVyLiBDYWxsZWUgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwZWVyIG9iamVjdC4KKyAgIFRoZSBjYWxsYmFjayB3aWxsIGluY2x1ZGUgdGhlIHJlc3VsdGluZyBhdXRoX2NvbnRleHQuICovCit2b2lkIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2NoZWNrX3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9wZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9wZWVyX2NoZWNrX2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIFV0aWwgdG8gZW5jYXBzdWxhdGUgdGhlIGNvbm5lY3RvciBpbiBhIGNoYW5uZWwgYXJnLiAqLworZ3JwY19hcmcgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdG9fYXJnKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYyk7CisKKy8qIFV0aWwgdG8gZ2V0IHRoZSBjb25uZWN0b3IgZnJvbSBhIGNoYW5uZWwgYXJnLiAqLworZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKmdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2Zyb21fYXJnKGNvbnN0IGdycGNfYXJnICphcmcpOworCisvKiBVdGlsIHRvIGZpbmQgdGhlIGNvbm5lY3RvciBmcm9tIGNoYW5uZWwgYXJncy4gKi8KK2dycGNfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX2ZpbmRfc2VjdXJpdHlfY29ubmVjdG9yX2luX2FyZ3MoCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpOworCisvKiAtLS0gY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3Igb2JqZWN0LiAtLS0KKworICAgIEEgY2hhbm5lbCBzZWN1cml0eSBjb25uZWN0b3Igb2JqZWN0IHJlcHJlc2VudHMgYXdheSB0byBjb25maWd1cmUgdGhlCisgICAgdW5kZXJseWluZyB0cmFuc3BvcnQgc2VjdXJpdHkgbWVjaGFuaXNtIG9uIHRoZSBjbGllbnQgc2lkZS4gICovCisKK3R5cGVkZWYgc3RydWN0IGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcjsKKwordHlwZWRlZiB2b2lkICgqZ3JwY19zZWN1cml0eV9jYWxsX2hvc3RfY2hlY2tfY2IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMpOworCitzdHJ1Y3QgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciB7CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yIGJhc2U7CisgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqcmVxdWVzdF9tZXRhZGF0YV9jcmVkczsKKyAgdm9pZCAoKmNoZWNrX2NhbGxfaG9zdCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLCBjb25zdCBjaGFyICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgdm9pZCAoKmRvX2hhbmRzaGFrZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSk7Cit9OworCisvKiBDaGVja3MgdGhhdCB0aGUgaG9zdCB0aGF0IHdpbGwgYmUgc2V0IGZvciBhIGNhbGwgaXMgYWNjZXB0YWJsZS4gKi8KK3ZvaWQgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jaGVja19jYWxsX2hvc3QoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgIGNvbnN0IGNoYXIgKmhvc3QsIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQsCisgICAgZ3JwY19zZWN1cml0eV9jYWxsX2hvc3RfY2hlY2tfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIEhhbmRzaGFrZS4gKi8KK3ZvaWQgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9kb19oYW5kc2hha2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKyAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCisgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyogLS0tIHNlcnZlcl9zZWN1cml0eV9jb25uZWN0b3Igb2JqZWN0LiAtLS0KKworICAgIEEgc2VydmVyIHNlY3VyaXR5IGNvbm5lY3RvciBvYmplY3QgcmVwcmVzZW50cyBhd2F5IHRvIGNvbmZpZ3VyZSB0aGUKKyAgICB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzZWN1cml0eSBtZWNoYW5pc20gb24gdGhlIHNlcnZlciBzaWRlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvcjsKKworc3RydWN0IGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciB7CisgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yIGJhc2U7CisgIGdwcl9tdSBtdTsKKyAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfaGFuZHNoYWtlX2xpc3QgKmhhbmRzaGFraW5nX2hhbmRzaGFrZXM7CisgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3M7CisgIHZvaWQgKCpkb19oYW5kc2hha2UpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgKmFjY2VwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSk7Cit9OworCit2b2lkIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3Rvcl9kb19oYW5kc2hha2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCisgICAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yICphY2NlcHRvciwgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LAorICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSk7CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX3NodXRkb3duKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CisKKy8qIC0tLSBDcmVhdGlvbiBzZWN1cml0eSBjb25uZWN0b3JzLiAtLS0gKi8KKworLyogRm9yIFRFU1RJTkcgT05MWSEKKyAgIENyZWF0ZXMgYSBmYWtlIGNvbm5lY3RvciB0aGF0IGVtdWxhdGVzIHJlYWwgY2hhbm5lbCBzZWN1cml0eS4gICovCitncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX2Zha2VfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAorICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqcmVxdWVzdF9tZXRhZGF0YV9jcmVkcyk7CisKKy8qIEZvciBURVNUSU5HIE9OTFkhCisgICBDcmVhdGVzIGEgZmFrZSBjb25uZWN0b3IgdGhhdCBlbXVsYXRlcyByZWFsIHNlcnZlciBzZWN1cml0eS4gICovCitncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKmdycGNfZmFrZV9zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKKyAgICB2b2lkKTsKKworLyogQ29uZmlnIGZvciBzc2wgY2xpZW50cy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciAqcGVtX3ByaXZhdGVfa2V5OworICBzaXplX3QgcGVtX3ByaXZhdGVfa2V5X3NpemU7CisgIHVuc2lnbmVkIGNoYXIgKnBlbV9jZXJ0X2NoYWluOworICBzaXplX3QgcGVtX2NlcnRfY2hhaW5fc2l6ZTsKKyAgdW5zaWduZWQgY2hhciAqcGVtX3Jvb3RfY2VydHM7CisgIHNpemVfdCBwZW1fcm9vdF9jZXJ0c19zaXplOworfSBncnBjX3NzbF9jb25maWc7CisKKy8qIENyZWF0ZXMgYW4gU1NMIGNoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yLgorICAgLSByZXF1ZXN0X21ldGFkYXRhX2NyZWRzIGlzIHRoZSBjcmVkZW50aWFscyBvYmplY3Qgd2hpY2ggbWV0YWRhdGEKKyAgICAgd2lsbCBiZSBzZW50IHdpdGggZWFjaCByZXF1ZXN0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4KKyAgIC0gY29uZmlnIGlzIHRoZSBTU0wgY29uZmlnIHRvIGJlIHVzZWQgZm9yIHRoZSBTU0wgY2hhbm5lbCBlc3RhYmxpc2htZW50LgorICAgLSBpc19jbGllbnQgc2hvdWxkIGJlIDAgZm9yIGEgc2VydmVyIG9yIGEgbm9uLTAgdmFsdWUgZm9yIGEgY2xpZW50LgorICAgLSBzZWN1cmVfcGVlcl9uYW1lIGlzIHRoZSBzZWN1cmUgcGVlciBuYW1lIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4KKyAgICAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jaGVja19wZWVyLiBUaGlzIHBhcmFtZXRlciBtYXkgYmUgTlVMTCBpbgorICAgICB3aGljaCBjYXNlIHRoZSBwZWVyIG5hbWUgd2lsbCBub3QgYmUgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoaXMgcGFyYW1ldGVyCisgICAgIGlzIG5vdCBOVUxMLCB0aGVuLCBwZW1fcm9vdF9jZXJ0cyBzaG91bGQgbm90IGJlIE5VTEwgZWl0aGVyLgorICAgLSBzYyBpcyBhIHBvaW50ZXIgb24gdGhlIGNvbm5lY3RvciB0byBiZSBjcmVhdGVkLgorICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgR1JQQ19TRUNVUklUWV9PSyBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgYQorICBzcGVjaWZpYyBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyovCitncnBjX3NlY3VyaXR5X3N0YXR1cyBncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCisgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpyZXF1ZXN0X21ldGFkYXRhX2NyZWRzLAorICAgIGNvbnN0IGdycGNfc3NsX2NvbmZpZyAqY29uZmlnLCBjb25zdCBjaGFyICp0YXJnZXRfbmFtZSwKKyAgICBjb25zdCBjaGFyICpvdmVycmlkZGVuX3RhcmdldF9uYW1lLCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpOworCisvKiBHZXRzIHRoZSBkZWZhdWx0IHNzbCByb290cy4gKi8KK3NpemVfdCBncnBjX2dldF9kZWZhdWx0X3NzbF9yb290cyhjb25zdCB1bnNpZ25lZCBjaGFyICoqcGVtX3Jvb3RfY2VydHMpOworCisvKiBFeHBvc2VkIGZvciBURVNUSU5HIE9OTFkhLiAqLworZ3ByX3NsaWNlIGdycGNfZ2V0X2RlZmF1bHRfc3NsX3Jvb3RzX2Zvcl90ZXN0aW5nKHZvaWQpOworCisvKiBDb25maWcgZm9yIHNzbCBzZXJ2ZXJzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyICoqcGVtX3ByaXZhdGVfa2V5czsKKyAgc2l6ZV90ICpwZW1fcHJpdmF0ZV9rZXlzX3NpemVzOworICB1bnNpZ25lZCBjaGFyICoqcGVtX2NlcnRfY2hhaW5zOworICBzaXplX3QgKnBlbV9jZXJ0X2NoYWluc19zaXplczsKKyAgc2l6ZV90IG51bV9rZXlfY2VydF9wYWlyczsKKyAgdW5zaWduZWQgY2hhciAqcGVtX3Jvb3RfY2VydHM7CisgIHNpemVfdCBwZW1fcm9vdF9jZXJ0c19zaXplOworICBpbnQgZm9yY2VfY2xpZW50X2F1dGg7Cit9IGdycGNfc3NsX3NlcnZlcl9jb25maWc7CisKKy8qIENyZWF0ZXMgYW4gU1NMIHNlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IuCisgICAtIGNvbmZpZyBpcyB0aGUgU1NMIGNvbmZpZyB0byBiZSB1c2VkIGZvciB0aGUgU1NMIGNoYW5uZWwgZXN0YWJsaXNobWVudC4KKyAgIC0gc2MgaXMgYSBwb2ludGVyIG9uIHRoZSBjb25uZWN0b3IgdG8gYmUgY3JlYXRlZC4KKyAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIEdSUENfU0VDVVJJVFlfT0sgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGEKKyAgc3BlY2lmaWMgZXJyb3IgY29kZSBvdGhlcndpc2UuCisqLworZ3JwY19zZWN1cml0eV9zdGF0dXMgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCisgICAgY29uc3QgZ3JwY19zc2xfc2VydmVyX2NvbmZpZyAqY29uZmlnLCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKipzYyk7CisKKy8qIFV0aWwuICovCitjb25zdCB0c2lfcGVlcl9wcm9wZXJ0eSAqdHNpX3BlZXJfZ2V0X3Byb3BlcnR5X2J5X25hbWUoY29uc3QgdHNpX3BlZXIgKnBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIEV4cG9zZWQgZm9yIHRlc3Rpbmcgb25seS4gKi8KK2dycGNfYXV0aF9jb250ZXh0ICp0c2lfc3NsX3BlZXJfdG9fYXV0aF9jb250ZXh0KGNvbnN0IHRzaV9wZWVyICpwZWVyKTsKK3RzaV9wZWVyIHRzaV9zaGFsbG93X3BlZXJfZnJvbV9zc2xfYXV0aF9jb250ZXh0KAorICAgIGNvbnN0IGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQpOwordm9pZCB0c2lfc2hhbGxvd19wZWVyX2Rlc3RydWN0KHRzaV9wZWVyICpwZWVyKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU0VDVVJJVFlfU0VDVVJJVFlfQ09OTkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIKKworI2luY2x1ZGUgPGdycGMvZ3JwY19zZWN1cml0eS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKworLyogLS0tIGdycGNfY2FsbCAtLS0gKi8KKworZ3JwY19jYWxsX2Vycm9yIGdycGNfY2FsbF9zZXRfY3JlZGVudGlhbHMoZ3JwY19jYWxsICpjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgeworICBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0ICpjdHggPSBOVUxMOworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jYWxsX3NldF9jcmVkZW50aWFscyhjYWxsPSVwLCBjcmVkcz0lcCkiLCAyLAorICAgICAgICAgICAgICAgICAoY2FsbCwgY3JlZHMpKTsKKyAgaWYgKCFncnBjX2NhbGxfaXNfY2xpZW50KGNhbGwpKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNZXRob2QgaXMgY2xpZW50LXNpZGUgb25seS4iKTsKKyAgICByZXR1cm4gR1JQQ19DQUxMX0VSUk9SX05PVF9PTl9TRVJWRVI7CisgIH0KKyAgY3R4ID0gKGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKilncnBjX2NhbGxfY29udGV4dF9nZXQoCisgICAgICBjYWxsLCBHUlBDX0NPTlRFWFRfU0VDVVJJVFkpOworICBpZiAoY3R4ID09IE5VTEwpIHsKKyAgICBjdHggPSBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSgpOworICAgIGN0eC0+Y3JlZHMgPSBncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKGNyZWRzKTsKKyAgICBncnBjX2NhbGxfY29udGV4dF9zZXQoY2FsbCwgR1JQQ19DT05URVhUX1NFQ1VSSVRZLCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHRfZGVzdHJveSk7CisgIH0gZWxzZSB7CisgICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3VucmVmKGN0eC0+Y3JlZHMpOworICAgIGN0eC0+Y3JlZHMgPSBncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKGNyZWRzKTsKKyAgfQorICByZXR1cm4gR1JQQ19DQUxMX09LOworfQorCitncnBjX2F1dGhfY29udGV4dCAqZ3JwY19jYWxsX2F1dGhfY29udGV4dChncnBjX2NhbGwgKmNhbGwpIHsKKyAgdm9pZCAqc2VjX2N0eCA9IGdycGNfY2FsbF9jb250ZXh0X2dldChjYWxsLCBHUlBDX0NPTlRFWFRfU0VDVVJJVFkpOworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jYWxsX2F1dGhfY29udGV4dChjYWxsPSVwKSIsIDEsIChjYWxsKSk7CisgIGlmIChzZWNfY3R4ID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZ3JwY19jYWxsX2lzX2NsaWVudChjYWxsKQorICAgICAgICAgICAgID8gR1JQQ19BVVRIX0NPTlRFWFRfUkVGKAorICAgICAgICAgICAgICAgICAgICgoZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqKXNlY19jdHgpLT5hdXRoX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgImdycGNfY2FsbF9hdXRoX2NvbnRleHQgY2xpZW50IikKKyAgICAgICAgICAgICA6IEdSUENfQVVUSF9DT05URVhUX1JFRigKKyAgICAgICAgICAgICAgICAgICAoKGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKilzZWNfY3R4KS0+YXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICJncnBjX2NhbGxfYXV0aF9jb250ZXh0IHNlcnZlciIpOworfQorCit2b2lkIGdycGNfYXV0aF9jb250ZXh0X3JlbGVhc2UoZ3JwY19hdXRoX2NvbnRleHQgKmNvbnRleHQpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfYXV0aF9jb250ZXh0X3JlbGVhc2UoY29udGV4dD0lcCkiLCAxLCAoY29udGV4dCkpOworICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihjb250ZXh0LCAiZ3JwY19hdXRoX2NvbnRleHRfdW5yZWYiKTsKK30KKworLyogLS0tIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgLS0tICovCisKK2dycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKmdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHRfY3JlYXRlKHZvaWQpIHsKKyAgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqY3R4ID0KKyAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQpKTsKKyAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQpKTsKKyAgcmV0dXJuIGN0eDsKK30KKwordm9pZCBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2Rlc3Ryb3kodm9pZCAqY3R4KSB7CisgIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKmMgPSAoZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqKWN0eDsKKyAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3VucmVmKGMtPmNyZWRzKTsKKyAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYoYy0+YXV0aF9jb250ZXh0LCAiY2xpZW50X3NlY3VyaXR5X2NvbnRleHQiKTsKKyAgZ3ByX2ZyZWUoY3R4KTsKK30KKworLyogLS0tIGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgLS0tICovCisKK2dycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKmdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHRfY3JlYXRlKHZvaWQpIHsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dCAqY3R4ID0KKyAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQpKTsKKyAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQpKTsKKyAgcmV0dXJuIGN0eDsKK30KKwordm9pZCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0X2Rlc3Ryb3kodm9pZCAqY3R4KSB7CisgIGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKmMgPSAoZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dCAqKWN0eDsKKyAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYoYy0+YXV0aF9jb250ZXh0LCAic2VydmVyX3NlY3VyaXR5X2NvbnRleHQiKTsKKyAgZ3ByX2ZyZWUoY3R4KTsKK30KKworLyogLS0tIGdycGNfYXV0aF9jb250ZXh0IC0tLSAqLworCitzdGF0aWMgZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yIGVtcHR5X2l0ZXJhdG9yID0ge05VTEwsIDAsIE5VTEx9OworCitncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfY3JlYXRlKGdycGNfYXV0aF9jb250ZXh0ICpjaGFpbmVkKSB7CisgIGdycGNfYXV0aF9jb250ZXh0ICpjdHggPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2F1dGhfY29udGV4dCkpOworICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoZ3JwY19hdXRoX2NvbnRleHQpKTsKKyAgZ3ByX3JlZl9pbml0KCZjdHgtPnJlZmNvdW50LCAxKTsKKyAgaWYgKGNoYWluZWQgIT0gTlVMTCkgeworICAgIGN0eC0+Y2hhaW5lZCA9IEdSUENfQVVUSF9DT05URVhUX1JFRihjaGFpbmVkLCAiY2hhaW5lZCIpOworICAgIGN0eC0+cGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lID0KKyAgICAgICAgY3R4LT5jaGFpbmVkLT5wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWU7CisgIH0KKyAgcmV0dXJuIGN0eDsKK30KKworI2lmZGVmIEdSUENfQVVUSF9DT05URVhUX1JFRkNPVU5UX0RFQlVHCitncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfcmVmKGdycGNfYXV0aF9jb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pIHsKKyAgaWYgKGN0eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAorICAgICAgICAgICJBVVRIX0NPTlRFWFQ6JXAgICByZWYgJWQgLT4gJWQgJXMiLCBjdHgsIChpbnQpY3R4LT5yZWZjb3VudC5jb3VudCwKKyAgICAgICAgICAoaW50KWN0eC0+cmVmY291bnQuY291bnQgKyAxLCByZWFzb24pOworI2Vsc2UKK2dycGNfYXV0aF9jb250ZXh0ICpncnBjX2F1dGhfY29udGV4dF9yZWYoZ3JwY19hdXRoX2NvbnRleHQgKmN0eCkgeworICBpZiAoY3R4ID09IE5VTEwpIHJldHVybiBOVUxMOworI2VuZGlmCisgIGdwcl9yZWYoJmN0eC0+cmVmY291bnQpOworICByZXR1cm4gY3R4OworfQorCisjaWZkZWYgR1JQQ19BVVRIX0NPTlRFWFRfUkVGQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19hdXRoX2NvbnRleHRfdW5yZWYoZ3JwY19hdXRoX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBpZiAoY3R4ID09IE5VTEwpIHJldHVybjsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAorICAgICAgICAgICJBVVRIX0NPTlRFWFQ6JXAgdW5yZWYgJWQgLT4gJWQgJXMiLCBjdHgsIChpbnQpY3R4LT5yZWZjb3VudC5jb3VudCwKKyAgICAgICAgICAoaW50KWN0eC0+cmVmY291bnQuY291bnQgLSAxLCByZWFzb24pOworI2Vsc2UKK3ZvaWQgZ3JwY19hdXRoX2NvbnRleHRfdW5yZWYoZ3JwY19hdXRoX2NvbnRleHQgKmN0eCkgeworICBpZiAoY3R4ID09IE5VTEwpIHJldHVybjsKKyNlbmRpZgorICBpZiAoZ3ByX3VucmVmKCZjdHgtPnJlZmNvdW50KSkgeworICAgIHNpemVfdCBpOworICAgIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKGN0eC0+Y2hhaW5lZCwgImNoYWluZWQiKTsKKyAgICBpZiAoY3R4LT5wcm9wZXJ0aWVzLmFycmF5ICE9IE5VTEwpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnByb3BlcnRpZXMuY291bnQ7IGkrKykgeworICAgICAgICBncnBjX2F1dGhfcHJvcGVydHlfcmVzZXQoJmN0eC0+cHJvcGVydGllcy5hcnJheVtpXSk7CisgICAgICB9CisgICAgICBncHJfZnJlZShjdHgtPnByb3BlcnRpZXMuYXJyYXkpOworICAgIH0KKyAgICBncHJfZnJlZShjdHgpOworICB9Cit9CisKK2NvbnN0IGNoYXIgKmdycGNfYXV0aF9jb250ZXh0X3BlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSgKKyAgICBjb25zdCBncnBjX2F1dGhfY29udGV4dCAqY3R4KSB7CisgIEdSUENfQVBJX1RSQUNFKCJncnBjX2F1dGhfY29udGV4dF9wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUoY3R4PSVwKSIsIDEsCisgICAgICAgICAgICAgICAgIChjdHgpKTsKKyAgcmV0dXJuIGN0eC0+cGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lOworfQorCitpbnQgZ3JwY19hdXRoX2NvbnRleHRfc2V0X3BlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZShncnBjX2F1dGhfY29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICBncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgaXQgPQorICAgICAgZ3JwY19hdXRoX2NvbnRleHRfZmluZF9wcm9wZXJ0aWVzX2J5X25hbWUoY3R4LCBuYW1lKTsKKyAgY29uc3QgZ3JwY19hdXRoX3Byb3BlcnR5ICpwcm9wID0gZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX25leHQoJml0KTsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19hdXRoX2NvbnRleHRfc2V0X3BlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZShjdHg9JXAsIG5hbWU9JXMpIiwgMiwKKyAgICAgIChjdHgsIG5hbWUpKTsKKyAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiUHJvcGVydHkgbmFtZSAlcyBub3QgZm91bmQgaW4gYXV0aCBjb250ZXh0LiIsCisgICAgICAgICAgICBuYW1lICE9IE5VTEwgPyBuYW1lIDogIk5VTEwiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjdHgtPnBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSA9IHByb3AtPm5hbWU7CisgIHJldHVybiAxOworfQorCitpbnQgZ3JwY19hdXRoX2NvbnRleHRfcGVlcl9pc19hdXRoZW50aWNhdGVkKGNvbnN0IGdycGNfYXV0aF9jb250ZXh0ICpjdHgpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfYXV0aF9jb250ZXh0X3BlZXJfaXNfYXV0aGVudGljYXRlZChjdHg9JXApIiwgMSwgKGN0eCkpOworICByZXR1cm4gY3R4LT5wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgPT0gTlVMTCA/IDAgOiAxOworfQorCitncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgZ3JwY19hdXRoX2NvbnRleHRfcHJvcGVydHlfaXRlcmF0b3IoCisgICAgY29uc3QgZ3JwY19hdXRoX2NvbnRleHQgKmN0eCkgeworICBncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgaXQgPSBlbXB0eV9pdGVyYXRvcjsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfYXV0aF9jb250ZXh0X3Byb3BlcnR5X2l0ZXJhdG9yKGN0eD0lcCkiLCAxLCAoY3R4KSk7CisgIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuIGl0OworICBpdC5jdHggPSBjdHg7CisgIHJldHVybiBpdDsKK30KKworY29uc3QgZ3JwY19hdXRoX3Byb3BlcnR5ICpncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3JfbmV4dCgKKyAgICBncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgKml0KSB7CisgIEdSUENfQVBJX1RSQUNFKCJncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3JfbmV4dChpdD0lcCkiLCAxLCAoaXQpKTsKKyAgaWYgKGl0ID09IE5VTEwgfHwgaXQtPmN0eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgd2hpbGUgKGl0LT5pbmRleCA9PSBpdC0+Y3R4LT5wcm9wZXJ0aWVzLmNvdW50KSB7CisgICAgaWYgKGl0LT5jdHgtPmNoYWluZWQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPmN0eCA9IGl0LT5jdHgtPmNoYWluZWQ7CisgICAgaXQtPmluZGV4ID0gMDsKKyAgfQorICBpZiAoaXQtPm5hbWUgPT0gTlVMTCkgeworICAgIHJldHVybiAmaXQtPmN0eC0+cHJvcGVydGllcy5hcnJheVtpdC0+aW5kZXgrK107CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKGl0LT5pbmRleCA8IGl0LT5jdHgtPnByb3BlcnRpZXMuY291bnQpIHsKKyAgICAgIGNvbnN0IGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcCA9ICZpdC0+Y3R4LT5wcm9wZXJ0aWVzLmFycmF5W2l0LT5pbmRleCsrXTsKKyAgICAgIEdQUl9BU1NFUlQocHJvcC0+bmFtZSAhPSBOVUxMKTsKKyAgICAgIGlmIChzdHJjbXAoaXQtPm5hbWUsIHByb3AtPm5hbWUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHByb3A7CisgICAgICB9CisgICAgfQorICAgIC8qIFdlIGNvdWxkIG5vdCBmaW5kIHRoZSBuYW1lLCB0cnkgYW5vdGhlciByb3VuZC4gKi8KKyAgICByZXR1cm4gZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX25leHQoaXQpOworICB9Cit9CisKK2dycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvciBncnBjX2F1dGhfY29udGV4dF9maW5kX3Byb3BlcnRpZXNfYnlfbmFtZSgKKyAgICBjb25zdCBncnBjX2F1dGhfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lKSB7CisgIGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvciBpdCA9IGVtcHR5X2l0ZXJhdG9yOworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19hdXRoX2NvbnRleHRfZmluZF9wcm9wZXJ0aWVzX2J5X25hbWUoY3R4PSVwLCBuYW1lPSVzKSIsCisgICAgICAgICAgICAgICAgIDIsIChjdHgsIG5hbWUpKTsKKyAgaWYgKGN0eCA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkgcmV0dXJuIGVtcHR5X2l0ZXJhdG9yOworICBpdC5jdHggPSBjdHg7CisgIGl0Lm5hbWUgPSBuYW1lOworICByZXR1cm4gaXQ7Cit9CisKK2dycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvciBncnBjX2F1dGhfY29udGV4dF9wZWVyX2lkZW50aXR5KAorICAgIGNvbnN0IGdycGNfYXV0aF9jb250ZXh0ICpjdHgpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfYXV0aF9jb250ZXh0X3BlZXJfaWRlbnRpdHkoY3R4PSVwKSIsIDEsIChjdHgpKTsKKyAgaWYgKGN0eCA9PSBOVUxMKSByZXR1cm4gZW1wdHlfaXRlcmF0b3I7CisgIHJldHVybiBncnBjX2F1dGhfY29udGV4dF9maW5kX3Byb3BlcnRpZXNfYnlfbmFtZSgKKyAgICAgIGN0eCwgY3R4LT5wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUpOworfQorCitzdGF0aWMgdm9pZCBlbnN1cmVfYXV0aF9jb250ZXh0X2NhcGFjaXR5KGdycGNfYXV0aF9jb250ZXh0ICpjdHgpIHsKKyAgaWYgKGN0eC0+cHJvcGVydGllcy5jb3VudCA9PSBjdHgtPnByb3BlcnRpZXMuY2FwYWNpdHkpIHsKKyAgICBjdHgtPnByb3BlcnRpZXMuY2FwYWNpdHkgPQorICAgICAgICBHUFJfTUFYKGN0eC0+cHJvcGVydGllcy5jYXBhY2l0eSArIDgsIGN0eC0+cHJvcGVydGllcy5jYXBhY2l0eSAqIDIpOworICAgIGN0eC0+cHJvcGVydGllcy5hcnJheSA9CisgICAgICAgIGdwcl9yZWFsbG9jKGN0eC0+cHJvcGVydGllcy5hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5wcm9wZXJ0aWVzLmNhcGFjaXR5ICogc2l6ZW9mKGdycGNfYXV0aF9wcm9wZXJ0eSkpOworICB9Cit9CisKK3ZvaWQgZ3JwY19hdXRoX2NvbnRleHRfYWRkX3Byb3BlcnR5KGdycGNfYXV0aF9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbmd0aCkgeworICBncnBjX2F1dGhfcHJvcGVydHkgKnByb3A7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfYXV0aF9jb250ZXh0X2FkZF9wcm9wZXJ0eShjdHg9JXAsIG5hbWU9JXMsIHZhbHVlPSUqLipzLCAiCisgICAgICAidmFsdWVfbGVuZ3RoPSVsdSkiLAorICAgICAgNiwgKGN0eCwgbmFtZSwgKGludCl2YWx1ZV9sZW5ndGgsIChpbnQpdmFsdWVfbGVuZ3RoLCB2YWx1ZSwKKyAgICAgICAgICAodW5zaWduZWQgbG9uZyl2YWx1ZV9sZW5ndGgpKTsKKyAgZW5zdXJlX2F1dGhfY29udGV4dF9jYXBhY2l0eShjdHgpOworICBwcm9wID0gJmN0eC0+cHJvcGVydGllcy5hcnJheVtjdHgtPnByb3BlcnRpZXMuY291bnQrK107CisgIHByb3AtPm5hbWUgPSBncHJfc3RyZHVwKG5hbWUpOworICBwcm9wLT52YWx1ZSA9IGdwcl9tYWxsb2ModmFsdWVfbGVuZ3RoICsgMSk7CisgIG1lbWNweShwcm9wLT52YWx1ZSwgdmFsdWUsIHZhbHVlX2xlbmd0aCk7CisgIHByb3AtPnZhbHVlW3ZhbHVlX2xlbmd0aF0gPSAnXDAnOworICBwcm9wLT52YWx1ZV9sZW5ndGggPSB2YWx1ZV9sZW5ndGg7Cit9CisKK3ZvaWQgZ3JwY19hdXRoX2NvbnRleHRfYWRkX2NzdHJpbmdfcHJvcGVydHkoZ3JwY19hdXRoX2NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgZ3JwY19hdXRoX3Byb3BlcnR5ICpwcm9wOworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX2F1dGhfY29udGV4dF9hZGRfY3N0cmluZ19wcm9wZXJ0eShjdHg9JXAsIG5hbWU9JXMsIHZhbHVlPSVzKSIsIDMsCisgICAgICAoY3R4LCBuYW1lLCB2YWx1ZSkpOworICBlbnN1cmVfYXV0aF9jb250ZXh0X2NhcGFjaXR5KGN0eCk7CisgIHByb3AgPSAmY3R4LT5wcm9wZXJ0aWVzLmFycmF5W2N0eC0+cHJvcGVydGllcy5jb3VudCsrXTsKKyAgcHJvcC0+bmFtZSA9IGdwcl9zdHJkdXAobmFtZSk7CisgIHByb3AtPnZhbHVlID0gZ3ByX3N0cmR1cCh2YWx1ZSk7CisgIHByb3AtPnZhbHVlX2xlbmd0aCA9IHN0cmxlbih2YWx1ZSk7Cit9CisKK3ZvaWQgZ3JwY19hdXRoX3Byb3BlcnR5X3Jlc2V0KGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcGVydHkpIHsKKyAgZ3ByX2ZyZWUocHJvcGVydHktPm5hbWUpOworICBncHJfZnJlZShwcm9wZXJ0eS0+dmFsdWUpOworICBtZW1zZXQocHJvcGVydHksIDAsIHNpemVvZihncnBjX2F1dGhfcHJvcGVydHkpKTsKK30KKworc3RhdGljIHZvaWQgYXV0aF9jb250ZXh0X3BvaW50ZXJfYXJnX2Rlc3Ryb3kodm9pZCAqcCkgeworICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihwLCAiYXV0aF9jb250ZXh0X3BvaW50ZXJfYXJnIik7Cit9CisKK3N0YXRpYyB2b2lkICphdXRoX2NvbnRleHRfcG9pbnRlcl9hcmdfY29weSh2b2lkICpwKSB7CisgIHJldHVybiBHUlBDX0FVVEhfQ09OVEVYVF9SRUYocCwgImF1dGhfY29udGV4dF9wb2ludGVyX2FyZyIpOworfQorCitzdGF0aWMgaW50IGF1dGhfY29udGV4dF9wb2ludGVyX2NtcCh2b2lkICphLCB2b2lkICpiKSB7IHJldHVybiBHUFJfSUNNUChhLCBiKTsgfQorCitzdGF0aWMgY29uc3QgZ3JwY19hcmdfcG9pbnRlcl92dGFibGUgYXV0aF9jb250ZXh0X3BvaW50ZXJfdnRhYmxlID0geworICAgIGF1dGhfY29udGV4dF9wb2ludGVyX2FyZ19jb3B5LCBhdXRoX2NvbnRleHRfcG9pbnRlcl9hcmdfZGVzdHJveSwKKyAgICBhdXRoX2NvbnRleHRfcG9pbnRlcl9jbXB9OworCitncnBjX2FyZyBncnBjX2F1dGhfY29udGV4dF90b19hcmcoZ3JwY19hdXRoX2NvbnRleHQgKnApIHsKKyAgZ3JwY19hcmcgYXJnOworICBtZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGdycGNfYXJnKSk7CisgIGFyZy50eXBlID0gR1JQQ19BUkdfUE9JTlRFUjsKKyAgYXJnLmtleSA9IEdSUENfQVVUSF9DT05URVhUX0FSRzsKKyAgYXJnLnZhbHVlLnBvaW50ZXIucCA9IHA7CisgIGFyZy52YWx1ZS5wb2ludGVyLnZ0YWJsZSA9ICZhdXRoX2NvbnRleHRfcG9pbnRlcl92dGFibGU7CisgIHJldHVybiBhcmc7Cit9CisKK2dycGNfYXV0aF9jb250ZXh0ICpncnBjX2F1dGhfY29udGV4dF9mcm9tX2FyZyhjb25zdCBncnBjX2FyZyAqYXJnKSB7CisgIGlmIChzdHJjbXAoYXJnLT5rZXksIEdSUENfQVVUSF9DT05URVhUX0FSRykgIT0gMCkgcmV0dXJuIE5VTEw7CisgIGlmIChhcmctPnR5cGUgIT0gR1JQQ19BUkdfUE9JTlRFUikgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCB0eXBlICVkIGZvciBhcmcgJXMiLCBhcmctPnR5cGUsCisgICAgICAgICAgICBHUlBDX0FVVEhfQ09OVEVYVF9BUkcpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBhcmctPnZhbHVlLnBvaW50ZXIucDsKK30KKworZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfZmluZF9hdXRoX2NvbnRleHRfaW5fYXJncygKKyAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncykgeworICBzaXplX3QgaTsKKyAgaWYgKGFyZ3MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBhcmdzLT5udW1fYXJnczsgaSsrKSB7CisgICAgZ3JwY19hdXRoX2NvbnRleHQgKnAgPSBncnBjX2F1dGhfY29udGV4dF9mcm9tX2FyZygmYXJncy0+YXJnc1tpXSk7CisgICAgaWYgKHAgIT0gTlVMTCkgcmV0dXJuIHA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU0ZTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTlRFWFRfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTlRFWFRfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKworLyogLS0tIGdycGNfYXV0aF9jb250ZXh0IC0tLQorCisgICBIaWdoIGxldmVsIGF1dGhlbnRpY2F0aW9uIGNvbnRleHQgb2JqZWN0LiBDYW4gb3B0aW9uYWxseSBiZSBjaGFpbmVkLiAqLworCisvKiBQcm9wZXJ0eSBuYW1lcyBhcmUgYWx3YXlzIE5VTEwgdGVybWluYXRlZC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2F1dGhfcHJvcGVydHkgKmFycmF5OworICBzaXplX3QgY291bnQ7CisgIHNpemVfdCBjYXBhY2l0eTsKK30gZ3JwY19hdXRoX3Byb3BlcnR5X2FycmF5OworCitzdHJ1Y3QgZ3JwY19hdXRoX2NvbnRleHQgeworICBzdHJ1Y3QgZ3JwY19hdXRoX2NvbnRleHQgKmNoYWluZWQ7CisgIGdycGNfYXV0aF9wcm9wZXJ0eV9hcnJheSBwcm9wZXJ0aWVzOworICBncHJfcmVmY291bnQgcmVmY291bnQ7CisgIGNvbnN0IGNoYXIgKnBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZTsKKyAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0OworfTsKKworLyogQ3JlYXRpb24uICovCitncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfY3JlYXRlKGdycGNfYXV0aF9jb250ZXh0ICpjaGFpbmVkKTsKKworLyogUmVmY291bnRpbmcuICovCisjaWZkZWYgR1JQQ19BVVRIX0NPTlRFWFRfUkVGQ09VTlRfREVCVUcKKyNkZWZpbmUgR1JQQ19BVVRIX0NPTlRFWFRfUkVGKHAsIHIpIFwKKyAgZ3JwY19hdXRoX2NvbnRleHRfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCisjZGVmaW5lIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKHAsIHIpIFwKKyAgZ3JwY19hdXRoX2NvbnRleHRfdW5yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKK2dycGNfYXV0aF9jb250ZXh0ICpncnBjX2F1dGhfY29udGV4dF9yZWYoZ3JwY19hdXRoX2NvbnRleHQgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKGdycGNfYXV0aF9jb250ZXh0ICpwb2xpY3ksIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBjaGFyICpyZWFzb24pOworI2Vsc2UKKyNkZWZpbmUgR1JQQ19BVVRIX0NPTlRFWFRfUkVGKHAsIHIpIGdycGNfYXV0aF9jb250ZXh0X3JlZigocCkpCisjZGVmaW5lIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKHAsIHIpIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKChwKSkKK2dycGNfYXV0aF9jb250ZXh0ICpncnBjX2F1dGhfY29udGV4dF9yZWYoZ3JwY19hdXRoX2NvbnRleHQgKnBvbGljeSk7Cit2b2lkIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKGdycGNfYXV0aF9jb250ZXh0ICpwb2xpY3kpOworI2VuZGlmCisKK3ZvaWQgZ3JwY19hdXRoX3Byb3BlcnR5X3Jlc2V0KGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcGVydHkpOworCisvKiAtLS0gZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAtLS0KKworICAgSW50ZXJuYWwgY2xpZW50LXNpZGUgc2VjdXJpdHkgY29udGV4dC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzOworICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0OworfSBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0OworCitncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0ICpncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSh2b2lkKTsKK3ZvaWQgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dF9kZXN0cm95KHZvaWQgKmN0eCk7CisKKy8qIC0tLSBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0IC0tLQorCisgICBJbnRlcm5hbCBzZXJ2ZXItc2lkZSBzZWN1cml0eSBjb250ZXh0LiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQ7Cit9IGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQ7CisKK2dycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKmdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHRfY3JlYXRlKHZvaWQpOwordm9pZCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0X2Rlc3Ryb3kodm9pZCAqY3R4KTsKKworLyogLS0tIENoYW5uZWwgYXJncyBmb3IgYXV0aCBjb250ZXh0IC0tLSAqLworI2RlZmluZSBHUlBDX0FVVEhfQ09OVEVYVF9BUkcgImdycGMuYXV0aF9jb250ZXh0IgorCitncnBjX2FyZyBncnBjX2F1dGhfY29udGV4dF90b19hcmcoZ3JwY19hdXRoX2NvbnRleHQgKmMpOworZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfYXV0aF9jb250ZXh0X2Zyb21fYXJnKGNvbnN0IGdycGNfYXJnICphcmcpOworZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfZmluZF9hdXRoX2NvbnRleHRfaW5fYXJncygKKyAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jIGIvc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OGNkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorCit0eXBlZGVmIHN0cnVjdCBjYWxsX2RhdGEgeworICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7CisgIC8qIENsb3N1cmUgdG8gY2FsbCB3aGVuIGZpbmlzaGVkIHdpdGggdGhlIGF1dGhfb25fcmVjdiBob29rLiAqLworICBncnBjX2Nsb3N1cmUgKm9uX2RvbmVfcmVjdjsKKyAgLyogUmVjZWl2ZSBjbG9zdXJlcyBhcmUgY2hhaW5lZDogd2UgaW5qZWN0IHRoaXMgY2xvc3VyZSBhcyB0aGUgb25fZG9uZV9yZWN2CisgICAgIHVwLWNhbGwgb24gdHJhbnNwb3J0X29wLCBhbmQgcmVtZW1iZXIgdG8gY2FsbCBvdXIgb25fZG9uZV9yZWN2IG1lbWJlciBhZnRlcgorICAgICBoYW5kbGluZyBpdC4gKi8KKyAgZ3JwY19jbG9zdXJlIGF1dGhfb25fcmVjdjsKKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIHRyYW5zcG9ydF9vcDsKKyAgZ3JwY19tZXRhZGF0YV9hcnJheSBtZDsKKyAgY29uc3QgZ3JwY19tZXRhZGF0YSAqY29uc3VtZWRfbWQ7CisgIHNpemVfdCBudW1fY29uc3VtZWRfbWQ7CisgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQ7Cit9IGNhbGxfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9kYXRhIHsKKyAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dDsKKyAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzOworfSBjaGFubmVsX2RhdGE7CisKK3N0YXRpYyBncnBjX21ldGFkYXRhX2FycmF5IG1ldGFkYXRhX2JhdGNoX3RvX21kX2FycmF5KAorICAgIGNvbnN0IGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKSB7CisgIGdycGNfbGlua2VkX21kZWxlbSAqbDsKKyAgZ3JwY19tZXRhZGF0YV9hcnJheSByZXN1bHQ7CisgIGdycGNfbWV0YWRhdGFfYXJyYXlfaW5pdCgmcmVzdWx0KTsKKyAgZm9yIChsID0gYmF0Y2gtPmxpc3QuaGVhZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIGdycGNfbWV0YWRhdGEgKnVzcl9tZCA9IE5VTEw7CisgICAgZ3JwY19tZGVsZW0gKm1kID0gbC0+bWQ7CisgICAgZ3JwY19tZHN0ciAqa2V5ID0gbWQtPmtleTsKKyAgICBncnBjX21kc3RyICp2YWx1ZSA9IG1kLT52YWx1ZTsKKyAgICBpZiAocmVzdWx0LmNvdW50ID09IHJlc3VsdC5jYXBhY2l0eSkgeworICAgICAgcmVzdWx0LmNhcGFjaXR5ID0gR1BSX01BWChyZXN1bHQuY2FwYWNpdHkgKyA4LCByZXN1bHQuY2FwYWNpdHkgKiAyKTsKKyAgICAgIHJlc3VsdC5tZXRhZGF0YSA9CisgICAgICAgICAgZ3ByX3JlYWxsb2MocmVzdWx0Lm1ldGFkYXRhLCByZXN1bHQuY2FwYWNpdHkgKiBzaXplb2YoZ3JwY19tZXRhZGF0YSkpOworICAgIH0KKyAgICB1c3JfbWQgPSAmcmVzdWx0Lm1ldGFkYXRhW3Jlc3VsdC5jb3VudCsrXTsKKyAgICB1c3JfbWQtPmtleSA9IGdycGNfbWRzdHJfYXNfY19zdHJpbmcoa2V5KTsKKyAgICB1c3JfbWQtPnZhbHVlID0gZ3JwY19tZHN0cl9hc19jX3N0cmluZyh2YWx1ZSk7CisgICAgdXNyX21kLT52YWx1ZV9sZW5ndGggPSBHUFJfU0xJQ0VfTEVOR1RIKHZhbHVlLT5zbGljZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdycGNfbWRlbGVtICpyZW1vdmVfY29uc3VtZWRfbWQodm9pZCAqdXNlcl9kYXRhLCBncnBjX21kZWxlbSAqbWQpIHsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSB1c2VyX2RhdGE7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgY2FsbGQtPm51bV9jb25zdW1lZF9tZDsgaSsrKSB7CisgICAgY29uc3QgZ3JwY19tZXRhZGF0YSAqY29uc3VtZWRfbWQgPSAmY2FsbGQtPmNvbnN1bWVkX21kW2ldOworICAgIC8qIE1heWJlIHdlIGNvdWxkIGRvIGEgcG9pbnRlciBjb21wYXJpc29uIGJ1dCB3ZSBkbyBub3QgaGF2ZSBhbnkgZ3VhcmFudGVlCisgICAgICAgdGhhdCB0aGUgbWV0YWRhdGEgcHJvY2Vzc29yIHVzZWQgdGhlIHNhbWUgcG9pbnRlcnMgZm9yIGNvbnN1bWVkX21kIGluIHRoZQorICAgICAgIGNhbGxiYWNrLiAqLworICAgIGlmIChHUFJfU0xJQ0VfTEVOR1RIKG1kLT5rZXktPnNsaWNlKSAhPSBzdHJsZW4oY29uc3VtZWRfbWQtPmtleSkgfHwKKyAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChtZC0+dmFsdWUtPnNsaWNlKSAhPSBjb25zdW1lZF9tZC0+dmFsdWVfbGVuZ3RoKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKG1lbWNtcChHUFJfU0xJQ0VfU1RBUlRfUFRSKG1kLT5rZXktPnNsaWNlKSwgY29uc3VtZWRfbWQtPmtleSwKKyAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgobWQtPmtleS0+c2xpY2UpKSA9PSAwICYmCisgICAgICAgIG1lbWNtcChHUFJfU0xJQ0VfU1RBUlRfUFRSKG1kLT52YWx1ZS0+c2xpY2UpLCBjb25zdW1lZF9tZC0+dmFsdWUsCisgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKG1kLT52YWx1ZS0+c2xpY2UpKSA9PSAwKSB7CisgICAgICByZXR1cm4gTlVMTDsgLyogRGVsZXRlLiAqLworICAgIH0KKyAgfQorICByZXR1cm4gbWQ7Cit9CisKKy8qIGNhbGxlZCBmcm9tIGFwcGxpY2F0aW9uIGNvZGUgKi8KK3N0YXRpYyB2b2lkIG9uX21kX3Byb2Nlc3NpbmdfZG9uZSgKKyAgICB2b2lkICp1c2VyX2RhdGEsIGNvbnN0IGdycGNfbWV0YWRhdGEgKmNvbnN1bWVkX21kLCBzaXplX3QgbnVtX2NvbnN1bWVkX21kLAorICAgIGNvbnN0IGdycGNfbWV0YWRhdGEgKnJlc3BvbnNlX21kLCBzaXplX3QgbnVtX3Jlc3BvbnNlX21kLAorICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLCBjb25zdCBjaGFyICplcnJvcl9kZXRhaWxzKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gdXNlcl9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworCisgIC8qIFRPRE8oamJvZXVmKTogSW1wbGVtZW50IHN1cHBvcnQgZm9yIHJlc3BvbnNlX21kLiAqLworICBpZiAocmVzcG9uc2VfbWQgIT0gTlVMTCAmJiBudW1fcmVzcG9uc2VfbWQgPiAwKSB7CisgICAgZ3ByX2xvZyhHUFJfSU5GTywKKyAgICAgICAgICAgICJyZXNwb25zZV9tZCBpbiBhdXRoIG1ldGFkYXRhIHByb2Nlc3Npbmcgbm90IHN1cHBvcnRlZCBmb3Igbm93LiAiCisgICAgICAgICAgICAiSWdub3JpbmcuLi4iKTsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gR1JQQ19TVEFUVVNfT0spIHsKKyAgICBjYWxsZC0+Y29uc3VtZWRfbWQgPSBjb25zdW1lZF9tZDsKKyAgICBjYWxsZC0+bnVtX2NvbnN1bWVkX21kID0gbnVtX2NvbnN1bWVkX21kOworICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyKGNhbGxkLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEsIHJlbW92ZV9jb25zdW1lZF9tZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKTsKKyAgICBncnBjX21ldGFkYXRhX2FycmF5X2Rlc3Ryb3koJmNhbGxkLT5tZCk7CisgICAgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2IoJmV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYl9hcmcsIDEpOworICB9IGVsc2UgeworICAgIGdwcl9zbGljZSBtZXNzYWdlOworICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCBjbG9zZV9vcDsKKyAgICBtZW1zZXQoJmNsb3NlX29wLCAwLCBzaXplb2YoY2xvc2Vfb3ApKTsKKyAgICBncnBjX21ldGFkYXRhX2FycmF5X2Rlc3Ryb3koJmNhbGxkLT5tZCk7CisgICAgZXJyb3JfZGV0YWlscyA9IGVycm9yX2RldGFpbHMgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnJvcl9kZXRhaWxzCisgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdXRoZW50aWNhdGlvbiBtZXRhZGF0YSBwcm9jZXNzaW5nIGZhaWxlZC4iOworICAgIG1lc3NhZ2UgPSBncHJfc2xpY2VfZnJvbV9jb3BpZWRfc3RyaW5nKGVycm9yX2RldGFpbHMpOworICAgIGNhbGxkLT50cmFuc3BvcnRfb3Auc2VuZF9pbml0aWFsX21ldGFkYXRhID0gTlVMTDsKKyAgICBpZiAoY2FsbGQtPnRyYW5zcG9ydF9vcC5zZW5kX21lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgZ3JwY19ieXRlX3N0cmVhbV9kZXN0cm95KCZleGVjX2N0eCwgY2FsbGQtPnRyYW5zcG9ydF9vcC5zZW5kX21lc3NhZ2UpOworICAgICAgY2FsbGQtPnRyYW5zcG9ydF9vcC5zZW5kX21lc3NhZ2UgPSBOVUxMOworICAgIH0KKyAgICBjYWxsZC0+dHJhbnNwb3J0X29wLnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgPSBOVUxMOworICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9hZGRfY2xvc2UoJmNsb3NlX29wLCBzdGF0dXMsICZtZXNzYWdlKTsKKyAgICBncnBjX2NhbGxfbmV4dF9vcCgmZXhlY19jdHgsIGVsZW0sICZjbG9zZV9vcCk7CisgICAgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2IoJmV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYl9hcmcsIDApOworICB9CisKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKK30KKworc3RhdGljIHZvaWQgYXV0aF9vbl9yZWN2KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gdXNlcl9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBpZiAoc3VjY2VzcykgeworICAgIGlmIChjaGFuZC0+Y3JlZHMtPnByb2Nlc3Nvci5wcm9jZXNzICE9IE5VTEwpIHsKKyAgICAgIGNhbGxkLT5tZCA9IG1ldGFkYXRhX2JhdGNoX3RvX21kX2FycmF5KGNhbGxkLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEpOworICAgICAgY2hhbmQtPmNyZWRzLT5wcm9jZXNzb3IucHJvY2VzcygKKyAgICAgICAgICBjaGFuZC0+Y3JlZHMtPnByb2Nlc3Nvci5zdGF0ZSwgY2FsbGQtPmF1dGhfY29udGV4dCwKKyAgICAgICAgICBjYWxsZC0+bWQubWV0YWRhdGEsIGNhbGxkLT5tZC5jb3VudCwgb25fbWRfcHJvY2Vzc2luZ19kb25lLCBlbGVtKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2IoZXhlY19jdHgsIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiX2FyZywgc3VjY2Vzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yZWN2X29wc19tZF9jYWxsYmFja3MoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKworICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgLyogc3Vic3RpdHV0ZSBvdXIgY2FsbGJhY2sgZm9yIHRoZSBoaWdoZXIgY2FsbGJhY2sgKi8KKyAgICBjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKKyAgICBjYWxsZC0+b25fZG9uZV9yZWN2ID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKKyAgICBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID0gJmNhbGxkLT5hdXRoX29uX3JlY3Y7CisgICAgY2FsbGQtPnRyYW5zcG9ydF9vcCA9ICpvcDsKKyAgfQorfQorCisvKiBDYWxsZWQgZWl0aGVyOgorICAgICAtIGluIHJlc3BvbnNlIHRvIGFuIEFQSSBjYWxsIChvciBzaW1pbGFyKSBmcm9tIGFib3ZlLCB0byBzZW5kIHNvbWV0aGluZworICAgICAtIGEgbmV0d29yayBldmVudCAob3Igc2ltaWxhcikgZnJvbSBiZWxvdywgdG8gcmVjZWl2ZSBzb21ldGhpbmcKKyAgIG9wIGNvbnRhaW5zIHR5cGUgYW5kIGNhbGwgZGlyZWN0aW9uIGluZm9ybWF0aW9uLCBpbiBhZGRpdGlvbiB0byB0aGUgZGF0YQorICAgdGhhdCBpcyBiZWluZyBzZW50IG9yIHJlY2VpdmVkLiAqLworc3RhdGljIHZvaWQgYXV0aF9zdGFydF90cmFuc3BvcnRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgc2V0X3JlY3Zfb3BzX21kX2NhbGxiYWNrcyhlbGVtLCBvcCk7CisgIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Cit9CisKKy8qIENvbnN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KK3N0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjYWxsIGVsZW1lbnQgKi8KKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dCAqc2VydmVyX2N0eCA9IE5VTEw7CisKKyAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCisgIG1lbXNldChjYWxsZCwgMCwgc2l6ZW9mKCpjYWxsZCkpOworICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbGQtPmF1dGhfb25fcmVjdiwgYXV0aF9vbl9yZWN2LCBlbGVtKTsKKworICBpZiAoYXJncy0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLnZhbHVlICE9IE5VTEwpIHsKKyAgICBhcmdzLT5jb250ZXh0W0dSUENfQ09OVEVYVF9TRUNVUklUWV0uZGVzdHJveSgKKyAgICAgICAgYXJncy0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLnZhbHVlKTsKKyAgfQorCisgIHNlcnZlcl9jdHggPSBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSgpOworICBzZXJ2ZXJfY3R4LT5hdXRoX2NvbnRleHQgPSBncnBjX2F1dGhfY29udGV4dF9jcmVhdGUoY2hhbmQtPmF1dGhfY29udGV4dCk7CisgIGNhbGxkLT5hdXRoX2NvbnRleHQgPSBzZXJ2ZXJfY3R4LT5hdXRoX2NvbnRleHQ7CisKKyAgYXJncy0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLnZhbHVlID0gc2VydmVyX2N0eDsKKyAgYXJncy0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLmRlc3Ryb3kgPQorICAgICAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dF9kZXN0cm95OworfQorCitzdGF0aWMgdm9pZCBzZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHt9CisKKy8qIERlc3RydWN0b3IgZm9yIGNhbGxfZGF0YSAqLworc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkge30KKworLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLworc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCA9CisgICAgICBncnBjX2ZpbmRfYXV0aF9jb250ZXh0X2luX2FyZ3MoYXJncy0+Y2hhbm5lbF9hcmdzKTsKKyAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzID0KKyAgICAgIGdycGNfZmluZF9zZXJ2ZXJfY3JlZGVudGlhbHNfaW5fYXJncyhhcmdzLT5jaGFubmVsX2FyZ3MpOworICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNoYW5uZWwgZWxlbWVudCAqLworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworCisgIEdQUl9BU1NFUlQoIWFyZ3MtPmlzX2xhc3QpOworICBHUFJfQVNTRVJUKGF1dGhfY29udGV4dCAhPSBOVUxMKTsKKyAgR1BSX0FTU0VSVChjcmVkcyAhPSBOVUxMKTsKKworICAvKiBpbml0aWFsaXplIG1lbWJlcnMgKi8KKyAgY2hhbmQtPmF1dGhfY29udGV4dCA9CisgICAgICBHUlBDX0FVVEhfQ09OVEVYVF9SRUYoYXV0aF9jb250ZXh0LCAic2VydmVyX2F1dGhfZmlsdGVyIik7CisgIGNoYW5kLT5jcmVkcyA9IGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3JlZihjcmVkcyk7Cit9CisKKy8qIERlc3RydWN0b3IgZm9yIGNoYW5uZWwgZGF0YSAqLworc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkgeworICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNoYW5uZWwgZWxlbWVudCAqLworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihjaGFuZC0+YXV0aF9jb250ZXh0LCAic2VydmVyX2F1dGhfZmlsdGVyIik7CisgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3VucmVmKGNoYW5kLT5jcmVkcyk7Cit9CisKK2NvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19zZXJ2ZXJfYXV0aF9maWx0ZXIgPSB7CisgICAgYXV0aF9zdGFydF90cmFuc3BvcnRfb3AsIGdycGNfY2hhbm5lbF9uZXh0X29wLCBzaXplb2YoY2FsbF9kYXRhKSwKKyAgICBpbml0X2NhbGxfZWxlbSwgICAgICAgICAgc2V0X3BvbGxzZXQsICAgICAgICAgIGRlc3Ryb3lfY2FsbF9lbGVtLAorICAgIHNpemVvZihjaGFubmVsX2RhdGEpLCAgICBpbml0X2NoYW5uZWxfZWxlbSwgICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCisgICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsICJzZXJ2ZXItYXV0aCJ9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2luaXQuYyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlY2Q2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbml0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKKwordm9pZCBjZW5zdXNfaW5pdCh2b2lkKSB7CisgIGNlbnN1c190cmFjaW5nX2luaXQoKTsKKyAgY2Vuc3VzX3N0YXRzX3N0b3JlX2luaXQoKTsKK30KKwordm9pZCBjZW5zdXNfc2h1dGRvd24odm9pZCkgeworICBjZW5zdXNfc3RhdHNfc3RvcmVfc2h1dGRvd24oKTsKKyAgY2Vuc3VzX3RyYWNpbmdfc2h1dGRvd24oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IzNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19JTlRFUkZBQ0VfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfQ0VOU1VTX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbmRpdmlkdWFsIGNlbnN1cyB0cmFjZSBhbm5vdGF0aW9uLiAqLworI2RlZmluZSBDRU5TVVNfTUFYX0FOTk9UQVRJT05fTEVOR1RIIDIwMAorCisvKiBTdHJ1Y3R1cmUgb2YgYSBjZW5zdXMgb3AgaWQuIERlZmluZSBhcyBzdHJ1Y3R1cmUgYmVjYXVzZSA2NGJpdCBpbnRlZ2VyIGlzIG5vdAorICAgYXZhaWxhYmxlIG9uIGV2ZXJ5IHBsYXRmb3JtIGZvciBDODkuICovCit0eXBlZGVmIHN0cnVjdCBjZW5zdXNfb3BfaWQgeworICB1aW50MzJfdCB1cHBlcjsKKyAgdWludDMyX3QgbG93ZXI7Cit9IGNlbnN1c19vcF9pZDsKKwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3JwY19zdGF0cyBjZW5zdXNfcnBjX3N0YXRzOworCisvKiBJbml0aWFsaXplcyBDZW5zdXMgbGlicmFyeS4gTm8tb3AgaWYgQ2Vuc3VzIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuICovCit2b2lkIGNlbnN1c19pbml0KHZvaWQpOworCisvKiBTaHV0ZG93biBDZW5zdXMgTGlicmFyeS4gKi8KK3ZvaWQgY2Vuc3VzX3NodXRkb3duKHZvaWQpOworCisvKiBBbm5vdGF0ZXMgZ3JwYyBtZXRob2QgbmFtZSBvbiBhIGNlbnN1c19vcF9pZC4gVGhlIG1ldGhvZCBuYW1lIGhhcyB0aGUgZm9ybWF0CisgICBvZiA8ZnVsbCBxdWFudGlmaWVkIHJwYyBzZXJ2aWNlIG5hbWU+LzxycGMgZnVuY3Rpb24gbmFtZT4uIFJldHVybnMgMCBpZmYKKyAgIG9wX2lkIGFuZCBtZXRob2RfbmFtZSBhcmUgYWxsIHZhbGlkLiBvcF9pZCBpcyB2YWxpZCBhZnRlciBpdHMgY3JlYXRpb24gYW5kCisgICBiZWZvcmUgY2FsbGluZyBjZW5zdXNfdHJhY2luZ19lbmRfb3AoKS4KKworICAgVE9ETyhob25neXUpOiBGaWd1cmUgb3V0IHZhbGlkIGNoYXJhY3RlcnMgc2V0IGZvciBzZXJ2aWNlIG5hbWUgYW5kIGNvbW1hbmQKKyAgIG5hbWUgYW5kIGRvY3VtZW50IHJlcXVpcmVtZW50cyBoZXJlLiovCitpbnQgY2Vuc3VzX2FkZF9tZXRob2RfdGFnKGNlbnN1c19vcF9pZCBvcF9pZCwgY29uc3QgY2hhciAqbWV0aG9kX25hbWUpOworCisvKiBBbm5vdGF0ZXMgdHJhY2luZyBpbmZvcm1hdGlvbiB0byBhIHNwZWNpZmljIG9wX2lkLgorICAgVXAgdG8gQ0VOU1VTX01BWF9BTk5PVEFUSU9OX0xFTkdUSCBieXRlcyBhcmUgcmVjb3JkZWQuICovCit2b2lkIGNlbnN1c190cmFjaW5nX3ByaW50KGNlbnN1c19vcF9pZCBvcF9pZCwgY29uc3QgY2hhciAqYW5ub3RhdGlvbik7CisKKy8qIFN0YXJ0cyB0cmFjaW5nIGZvciBhbiBSUEMuIFJldHVybnMgYSBsb2NhbGx5IHVuaXF1ZSBjZW5zdXNfb3BfaWQgKi8KK2NlbnN1c19vcF9pZCBjZW5zdXNfdHJhY2luZ19zdGFydF9vcCh2b2lkKTsKKworLyogRW5kcyB0cmFjaW5nLiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBpbnZhbGlkYXRlIHRoZSBpbnB1dCBvcF9pZC4gKi8KK3ZvaWQgY2Vuc3VzX3RyYWNpbmdfZW5kX29wKGNlbnN1c19vcF9pZCBvcF9pZCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfQ0VOU1VTX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmMgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiOTQyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19sb2cuYwpAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyogQXZhaWxhYmxlIGxvZyBzcGFjZSBpcyBkaXZpZGVkIHVwIGluIGJsb2NrcyBvZgorICAgQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRSBieXRlcy4gQSBibG9jayBjYW4gYmUgaW4gb25lIG9mIHRoZQorICAgZm9sbG93aW5nIHRocmVlIGRhdGEgc3RydWN0dXJlczoKKyAgIC0gRnJlZSBibG9ja3MgKGZyZWVfYmxvY2tfbGlzdCkKKyAgIC0gQmxvY2tzIHdpdGggdW5yZWFkIGRhdGEgKGRpcnR5X2Jsb2NrX2xpc3QpCisgICAtIEJsb2NrcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gY29yZXMgKGNvcmVfbG9jYWxfYmxvY2tzW10pCisKKyAgIGNlbnN1c19sb2dfc3RhcnRfd3JpdGUoKSBtb3ZlcyBhIGJsb2NrIGZyb20gY29yZV9sb2NhbF9ibG9ja3NbXSB0byB0aGUKKyAgIGVuZCBvZiBkaXJ0eV9ibG9ja19saXN0IHdoZW4gYmxvY2s6CisgICAtIGlzIG91dC1vZi1zcGFjZSBPUgorICAgLSBoYXMgYW4gaW5jb21wbGV0ZSByZWNvcmQgKGFuIGluY29tcGxldGUgcmVjb3JkIG9jY3VycyB3aGVuIGEgdGhyZWFkIGNhbGxzCisgICAgIGNlbnN1c19sb2dfc3RhcnRfd3JpdGUoKSBhbmQgaXMgY29udGV4dC1zd2l0Y2hlZCBiZWZvcmUgY2FsbGluZworICAgICBjZW5zdXNfbG9nX2VuZF93cml0ZSgpCisgICBTbywgYmxvY2tzIGluIGRpcnR5X2Jsb2NrX2xpc3QgYXJlIG9yZGVyZWQsIGZyb20gb2xkZXN0IHRvIG5ld2VzdCwgYnkgdGltZQorICAgd2hlbiBibG9jayBpcyBkZXRhY2hlZCBmcm9tIHRoZSBjb3JlLgorCisgICBjZW5zdXNfbG9nX3JlYWRfbmV4dCgpIGZpcnN0IGl0ZXJhdGVzIG92ZXIgZGlydHlfYmxvY2tfbGlzdCBhbmQgdGhlbgorICAgY29yZV9sb2NhbF9ibG9ja3NbXS4gSXQgbW92ZXMgY29tcGxldGVseSByZWFkIGJsb2NrcyBmcm9tIGRpcnR5X2Jsb2NrX2xpc3QKKyAgIHRvIGZyZWVfYmxvY2tfbGlzdC4gQmxvY2tzIGluIGNvcmVfbG9jYWxfYmxvY2tzW10gYXJlIG5vdCBmcmVlZCwgZXZlbiB3aGVuCisgICBjb21wbGV0ZWx5IHJlYWQuCisKKyAgIElmIGxvZyBpcyBjb25maWd1cmVkIHRvIGRpc2NhcmQgb2xkIHJlY29yZHMgYW5kIGZyZWVfYmxvY2tfbGlzdCBpcyBlbXB0eSwKKyAgIGNlbnN1c19sb2dfc3RhcnRfd3JpdGUoKSBpdGVyYXRlcyBvdmVyIGRpcnR5X2Jsb2NrX2xpc3QgdG8gYWxsb2NhdGUgYQorICAgbmV3IGJsb2NrLiBJdCBtb3ZlcyB0aGUgb2xkZXN0IGF2YWlsYWJsZSBibG9jayAobm8gcGVuZGluZyByZWFkL3dyaXRlKSB0bworICAgY29yZV9sb2NhbF9ibG9ja3NbXS4KKworICAgY29yZV9sb2NhbF9ibG9ja19zdHJ1Y3QgaXMgdXNlZCB0byBpbXBsZW1lbnQgYSBtYXAgZnJvbSBjb3JlIGlkIHRvIHRoZSBibG9jaworICAgYXNzb2NpYXRlZCB3aXRoIHRoYXQgY29yZS4gVGhpcyBtYXBwaW5nIGlzIGFkdmlzb3J5LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZQorICAgYmxvY2sgcmV0dXJuZWQgYnkgdGhpcyBtYXBwaW5nIGlzIG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBjb3JlLiBUaGlzCisgICBtYXBwaW5nIGlzIHVwZGF0ZWQsIGxhemlseSwgYnkgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpLgorCisgICBMb2NraW5nIGluIGJsb2NrIHN0cnVjdDoKKworICAgRXhjbHVzaXZlIGdfbG9nLmxvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIGFueSBmdW5jdGlvbnMgb3BlcmF0b25nIG9uCisgICBibG9jayBzdHJ1Y3RzIGV4Y2VwdCBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgYW5kCisgICBjZW5zdXNfbG9nX2VuZF93cml0ZSgpLgorCisgICBXcml0ZXMgdG8gYSBibG9jayBhcmUgc2VyaWFsaXplZCB2aWEgd3JpdGVyX2xvY2suCisgICBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkgYWNxdWlyZXMgdGhpcyBsb2NrIGFuZAorICAgY2Vuc3VzX2xvZ19lbmRfd3JpdGUoKSByZWxlYXNlcyBpdC4gT24gZmFpbHVyZSB0byBhY3F1aXJlIHRoZSBsb2NrLAorICAgd3JpdGVyIGFsbG9jYXRlcyBhIG5ldyBibG9jayBmb3IgdGhlIGN1cnJlbnQgY29yZSBhbmQgdXBkYXRlcworICAgY29yZV9sb2NhbF9ibG9jayBhY2NvcmRpbmdseS4KKworICAgU2ltdWx0YW5lb3VzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyBhbGxvd2VkLiBSZWFkZXIgY2FuIHNhZmVseSByZWFkIHVwIHRvCisgICBjb21taXR0ZWQgYnl0ZXMgKGJ5dGVzX2NvbW1pdHRlZCkuCisKKyAgIHJlYWRlcl9sb2NrIHByb3RlY3RzIHRoZSBibG9jaywgY3VycmVudGx5IGJlaW5nIHJlYWQsIGZyb20gZ2V0dGluZyByZWN5Y2xlZC4KKyAgIHN0YXJ0X3JlYWQoKSBhY3F1aXJlcyByZWFkZXJfbG9jayBhbmQgZW5kX3JlYWQoKSByZWxlYXNlcyB0aGUgbG9jay4KKworICAgUmVhZC93cml0ZSBhY2Nlc3MgdG8gYSBibG9jayBpcyBkaXNhYmxlZCB2aWEgdHJ5X2Rpc2FibGVfYWNjZXNzKCkuIEl0IHJldHVybnMKKyAgIHdpdGggYm90aCB3cml0ZXJfbG9jayBhbmQgcmVhZGVyX2xvY2sgaGVsZC4gVGhlc2UgbG9ja3MgYXJlIHN1YnNlcXVlbnRseQorICAgcmVsZWFzZWQgYnkgZW5hYmxlX2FjY2VzcygpIHRvIGVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJsb2NrLgorCisgICBBIG5vdGUgb24gbmFtaW5nOiBNb3N0IGZ1bmN0aW9uL3N0cnVjdCBuYW1lcyBhcmUgcHJlcGVuZGVkIGJ5IGNsXworICAgKHNob3J0aGFuZCBmb3IgY2Vuc3VzX2xvZykuIEZ1cnRoZXIsIGZ1bmN0aW9ucyB0aGF0IG1hbmlwdWxhdGUgc3RydWN0dXJlcworICAgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlLCB3aGljaCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKKyAgIGFyZ3VtZW50LiBFLmcuIGNsX2Jsb2NrX2luaXRpYWxpemUoKSB3aWxsIGluaXRpYWxpemUgYSBjbF9ibG9jay4KKyovCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2xvZy5oIgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvY3B1Lmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEVuZCBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBjb2RlICovCisKK3R5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdF9zdHJ1Y3QgeworICBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9ja19saXN0X3N0cnVjdCAqbmV4dDsKKyAgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdF9zdHJ1Y3QgKnByZXY7CisgIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrICpibG9jazsKK30gY2xfYmxvY2tfbGlzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfYmxvY2sgeworICAvKiBQb2ludGVyIHRvIHVuZGVybHlpbmcgYnVmZmVyICovCisgIGNoYXIgKmJ1ZmZlcjsKKyAgZ3ByX2F0bSB3cml0ZXJfbG9jazsKKyAgZ3ByX2F0bSByZWFkZXJfbG9jazsKKyAgLyogS2VlcHMgY29tcGxldGVseSB3cml0dGVuIGJ5dGVzLiBEZWNsYXJlZCBhdG9taWMgYmVjYXVzZSBhY2Nlc3NlZAorICAgICBzaW11bHRhbmVvdXNseSBieSByZWFkZXIgYW5kIHdyaXRlci4gKi8KKyAgZ3ByX2F0bSBieXRlc19jb21taXR0ZWQ7CisgIC8qIEJ5dGVzIGFscmVhZHkgcmVhZCAqLworICBpbnQzMl90IGJ5dGVzX3JlYWQ7CisgIC8qIExpbmtzIGZvciBsaXN0ICovCisgIGNsX2Jsb2NrX2xpc3Rfc3RydWN0IGxpbms7CisvKiBXZSB3YW50IHRoaXMgc3RydWN0dXJlIHRvIGJlIGNhY2hlbGluZSBhbGlnbmVkLiBXZSBhc3N1bWUgdGhlIGZvbGxvd2luZworICAgc2l6ZXMgZm9yIHRoZSB2YXJpb3VzIHBhcnRzIG9uIDMyLzY0Yml0IHN5c3RlbXM6CisgICB0eXBlICAgICAgICAgICAgICAgICAzMmIgc2l6ZSAgICA2NGIgc2l6ZQorICAgY2hhciogICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgOAorICAgM3ggZ3ByX2F0bSAgICAgICAgICAgICAxMiAgICAgICAgICAyNAorICAgaW50MzJfdCAgICAgICAgICAgICAgIDQgICAgICAgICAgIDggKGFzc3VtZXMgcGFkZGluZykKKyAgIGNsX2Jsb2NrX2xpc3Rfc3RydWN0ICAgMTIgICAgICAgICAgMjQKKyAgIFRPVEFMICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgNjQKKworICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIG91ciBjYWNoZWxpbmUgYW5kIHRoZSBhcmNoaXRlY3R1cmUsIHdlCisgICBzZWxlY3RpdmVseSBhZGQgY2hhciBidWZmZXJpbmcgdG8gdGhpcyBzdHJ1Y3R1cmUuIFRoZSBzaXplIGlzIGNoZWNrZWQKKyAgIHZpYSBhc3NlcnQgaW4gY2Vuc3VzX2xvZ19pbml0aWFsaXplKCkuICovCisjaWYgZGVmaW5lZChHUFJfQVJDSF82NCkKKyNkZWZpbmUgQ0xfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDY0KQorI2Vsc2UKKyNpZiBkZWZpbmVkKEdQUl9BUkNIXzMyKQorI2RlZmluZSBDTF9CTE9DS19QQURfU0laRSAoR1BSX0NBQ0hFTElORV9TSVpFIC0gMzIpCisjZWxzZQorI2Vycm9yICJVbmtub3duIGFyY2hpdGVjdHVyZSIKKyNlbmRpZgorI2VuZGlmCisjaWYgQ0xfQkxPQ0tfUEFEX1NJWkUgPiAwCisgIGNoYXIgcGFkZGluZ1tDTF9CTE9DS19QQURfU0laRV07CisjZW5kaWYKK30gY2xfYmxvY2s7CisKKy8qIEEgbGlzdCBvZiBjbF9ibG9ja3MsIGRvdWJseS1saW5rZWQgdGhyb3VnaCBjbF9ibG9jazo6bGluay4gKi8KK3R5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdCB7CisgIGludDMyX3QgY291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMgaW4gbGlzdC4gKi8KKyAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3QgaHQ7IC8qIGhlYWQvdGFpbCBvZiBsaW5rZWQgbGlzdC4gKi8KK30gY2xfYmxvY2tfbGlzdDsKKworLyogQ2FjaGVsaW5lIGFsaWduZWQgYmxvY2sgcG9pbnRlcnMgdG8gYXZvaWQgZmFsc2Ugc2hhcmluZy4gQmxvY2sgcG9pbnRlciBtdXN0CisgICBiZSBpbml0aWFsaXplZCB2aWEgc2V0X2Jsb2NrKCksIGJlZm9yZSBjYWxsaW5nIG90aGVyIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2xvZ19jb3JlX2xvY2FsX2Jsb2NrIHsKKyAgZ3ByX2F0bSBibG9jazsKKy8qIEVuc3VyZSBjYWNobGluZSBhbGlnbm1lbnQ6IHdlIGFzc3VtZSBzaXplb2YoZ3ByX2F0bSkgPT0gNCBvciA4ICovCisjaWYgZGVmaW5lZChHUFJfQVJDSF82NCkKKyNkZWZpbmUgQ0xfQ09SRV9MT0NBTF9CTE9DS19QQURfU0laRSAoR1BSX0NBQ0hFTElORV9TSVpFIC0gOCkKKyNlbHNlCisjaWYgZGVmaW5lZChHUFJfQVJDSF8zMikKKyNkZWZpbmUgQ0xfQ09SRV9MT0NBTF9CTE9DS19QQURfU0laRSAoR1BSX0NBQ0hFTElORV9TSVpFIC0gNCkKKyNlbHNlCisjZXJyb3IgIlVua25vd24gYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisjZW5kaWYKKyNpZiBDTF9DT1JFX0xPQ0FMX0JMT0NLX1BBRF9TSVpFID4gMAorICBjaGFyIHBhZGRpbmdbQ0xfQ09SRV9MT0NBTF9CTE9DS19QQURfU0laRV07CisjZW5kaWYKK30gY2xfY29yZV9sb2NhbF9ibG9jazsKKworc3RydWN0IGNlbnN1c19sb2cgeworICBpbnQgZGlzY2FyZF9vbGRfcmVjb3JkczsKKyAgLyogTnVtYmVyIG9mIGNvcmVzIChha2EgaGFyZHdhcmUtY29udGV4dHMpICovCisgIHVuc2lnbmVkIG51bV9jb3JlczsKKyAgLyogbnVtYmVyIG9mIENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUgYmxvY2tzIGluIGxvZyAqLworICBpbnQzMl90IG51bV9ibG9ja3M7CisgIGNsX2Jsb2NrICpibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCbG9jayBtZXRhZGF0YS4gKi8KKyAgY2xfY29yZV9sb2NhbF9ibG9jayAqY29yZV9sb2NhbF9ibG9ja3M7IC8qIEtlZXBzIGNvcmUgdG8gYmxvY2sgbWFwcGluZ3MuICovCisgIGdwcl9tdSBsb2NrOworICBpbnQgaW5pdGlhbGl6ZWQ7IC8qIGhhcyBsb2cgYmVlbiBpbml0aWFsaXplZD8gKi8KKyAgLyogS2VlcHMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgaXRlcmF0b3IuIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdAorICAgICBpdGVyYXRvciBoYXMgcmVhY2hlZCB0aGUgZW5kLiBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKCkgcmVzZXRzIHRoZQorICAgICB2YWx1ZSB0byBudW1fY29yZSB0byByZXN0YXJ0IGl0ZXJhdGlvbi4gKi8KKyAgdWludDMyX3QgcmVhZF9pdGVyYXRvcl9zdGF0ZTsKKyAgLyogUG9pbnRzIHRvIHRoZSBibG9jayBiZWluZyByZWFkLiBJZiBub24tTlVMTCwgdGhlIGJsb2NrIGlzIGxvY2tlZCBmb3IKKyAgICAgcmVhZGluZyAoYmxvY2tfYmVpbmdfcmVhZF8tPnJlYWRlcl9sb2NrIGlzIGhlbGQpLiAqLworICBjbF9ibG9jayAqYmxvY2tfYmVpbmdfcmVhZDsKKyAgLyogQSBub24temVybyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBsb2cgaXMgZnVsbC4gKi8KKyAgZ3ByX2F0bSBpc19mdWxsOworICBjaGFyICpidWZmZXI7CisgIGNsX2Jsb2NrX2xpc3QgZnJlZV9ibG9ja19saXN0OworICBjbF9ibG9ja19saXN0IGRpcnR5X2Jsb2NrX2xpc3Q7CisgIGdwcl9hdG0gb3V0X29mX3NwYWNlX2NvdW50OworfTsKKworLyogU2luZ2xlIGludGVybmFsIGxvZyAqLworc3RhdGljIHN0cnVjdCBjZW5zdXNfbG9nIGdfbG9nOworCisvKiBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGFuIGF0b21pYyBtZW1vcnkgbG9jYXRpb24gdXNlZCBhcyBhIGxvY2sgKi8KKworLyogUmV0dXJucyBub24temVybyBpZiBsb2NrIGlzIGFjcXVpcmVkICovCitzdGF0aWMgaW50IGNsX3RyeV9sb2NrKGdwcl9hdG0gKmxvY2spIHsgcmV0dXJuIGdwcl9hdG1fYWNxX2Nhcyhsb2NrLCAwLCAxKTsgfQorCitzdGF0aWMgdm9pZCBjbF91bmxvY2soZ3ByX2F0bSAqbG9jaykgeyBncHJfYXRtX3JlbF9zdG9yZShsb2NrLCAwKTsgfQorCisvKiBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2NvcmVfbG9jYWxfYmxvY2sncyAqLworCitzdGF0aWMgdm9pZCBjbF9jb3JlX2xvY2FsX2Jsb2NrX3NldF9ibG9jayhjbF9jb3JlX2xvY2FsX2Jsb2NrICpjbGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ibG9jayAqYmxvY2spIHsKKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJmNsYi0+YmxvY2ssIChncHJfYXRtKWJsb2NrKTsKK30KKworc3RhdGljIGNsX2Jsb2NrICpjbF9jb3JlX2xvY2FsX2Jsb2NrX2dldF9ibG9jayhjbF9jb3JlX2xvY2FsX2Jsb2NrICpjbGIpIHsKKyAgcmV0dXJuIChjbF9ibG9jayAqKWdwcl9hdG1fYWNxX2xvYWQoJmNsYi0+YmxvY2spOworfQorCisvKiBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2Jsb2NrX2xpc3Rfc3RydWN0J3MgKi8KKworc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9zdHJ1Y3RfaW5pdGlhbGl6ZShjbF9ibG9ja19saXN0X3N0cnVjdCAqYmxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ibG9jayAqYmxvY2spIHsKKyAgYmxzLT5uZXh0ID0gYmxzLT5wcmV2ID0gYmxzOworICBibHMtPmJsb2NrID0gYmxvY2s7Cit9CisKKy8qIEZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gY2xfYmxvY2tfbGlzdCdzICovCisKK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfaW5pdGlhbGl6ZShjbF9ibG9ja19saXN0ICpsaXN0KSB7CisgIGxpc3QtPmNvdW50ID0gMDsKKyAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3RfaW5pdGlhbGl6ZSgmbGlzdC0+aHQsIE5VTEwpOworfQorCisvKiBSZXR1cm5zIGhlYWQgb2YgKnRoaXMsIG9yIE5VTEwgaWYgZW1wdHkuICovCitzdGF0aWMgY2xfYmxvY2sgKmNsX2Jsb2NrX2xpc3RfaGVhZChjbF9ibG9ja19saXN0ICpsaXN0KSB7CisgIHJldHVybiBsaXN0LT5odC5uZXh0LT5ibG9jazsKK30KKworLyogSW5zZXJ0IGVsZW1lbnQgKmUgYWZ0ZXIgKnBvcy4gKi8KK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0KGNsX2Jsb2NrX2xpc3QgKmxpc3QsIGNsX2Jsb2NrX2xpc3Rfc3RydWN0ICpwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9ibG9ja19saXN0X3N0cnVjdCAqZSkgeworICBsaXN0LT5jb3VudCsrOworICBlLT5uZXh0ID0gcG9zLT5uZXh0OworICBlLT5wcmV2ID0gcG9zOworICBlLT5uZXh0LT5wcmV2ID0gZTsKKyAgZS0+cHJldi0+bmV4dCA9IGU7Cit9CisKKy8qIEluc2VydCBibG9jayBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfaGVhZChjbF9ibG9ja19saXN0ICpsaXN0LCBjbF9ibG9jayAqYmxvY2spIHsKKyAgY2xfYmxvY2tfbGlzdF9pbnNlcnQobGlzdCwgJmxpc3QtPmh0LCAmYmxvY2stPmxpbmspOworfQorCisvKiBJbnNlcnQgYmxvY2sgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X3RhaWwoY2xfYmxvY2tfbGlzdCAqbGlzdCwgY2xfYmxvY2sgKmJsb2NrKSB7CisgIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0KGxpc3QsIGxpc3QtPmh0LnByZXYsICZibG9jay0+bGluayk7Cit9CisKKy8qIFJlbW92ZXMgYmxvY2sgKmIuIFJlcXVpcmVzICpiIGJlIGluIHRoZSBsaXN0LiAqLworc3RhdGljIHZvaWQgY2xfYmxvY2tfbGlzdF9yZW1vdmUoY2xfYmxvY2tfbGlzdCAqbGlzdCwgY2xfYmxvY2sgKmIpIHsKKyAgbGlzdC0+Y291bnQtLTsKKyAgYi0+bGluay5uZXh0LT5wcmV2ID0gYi0+bGluay5wcmV2OworICBiLT5saW5rLnByZXYtPm5leHQgPSBiLT5saW5rLm5leHQ7Cit9CisKKy8qIEZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gY2xfYmxvY2sncyAqLworCitzdGF0aWMgdm9pZCBjbF9ibG9ja19pbml0aWFsaXplKGNsX2Jsb2NrICpibG9jaywgY2hhciAqYnVmZmVyKSB7CisgIGJsb2NrLT5idWZmZXIgPSBidWZmZXI7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZibG9jay0+d3JpdGVyX2xvY2ssIDApOworICBncHJfYXRtX3JlbF9zdG9yZSgmYmxvY2stPnJlYWRlcl9sb2NrLCAwKTsKKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJmJsb2NrLT5ieXRlc19jb21taXR0ZWQsIDApOworICBibG9jay0+Ynl0ZXNfcmVhZCA9IDA7CisgIGNsX2Jsb2NrX2xpc3Rfc3RydWN0X2luaXRpYWxpemUoJmJsb2NrLT5saW5rLCBibG9jayk7Cit9CisKKy8qIEd1YXJkcyBhZ2FpbnN0IGV4cG9zaW5nIHBhcnRpYWxseSB3cml0dGVuIGJ1ZmZlciB0byB0aGUgcmVhZGVyLiAqLworc3RhdGljIHZvaWQgY2xfYmxvY2tfc2V0X2J5dGVzX2NvbW1pdHRlZChjbF9ibG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNfY29tbWl0dGVkKSB7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZibG9jay0+Ynl0ZXNfY29tbWl0dGVkLCBieXRlc19jb21taXR0ZWQpOworfQorCitzdGF0aWMgaW50MzJfdCBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGNsX2Jsb2NrICpibG9jaykgeworICByZXR1cm4gZ3ByX2F0bV9hY3FfbG9hZCgmYmxvY2stPmJ5dGVzX2NvbW1pdHRlZCk7Cit9CisKKy8qIFRyaWVzIHRvIGRpc2FibGUgZnV0dXJlIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoaXMgYmxvY2suIFN1Y2NlZWRzIGlmOgorICAgLSBubyBpbi1wcm9ncmVzcyB3cml0ZSBBTkQKKyAgIC0gbm8gaW4tcHJvZ3Jlc3MgcmVhZCBBTkQKKyAgIC0gJ2Rpc2NhcmRfZGF0YScgc2V0IHRvIHRydWUgT1Igbm8gdW5yZWFkIGRhdGEKKyAgIE9uIHN1Y2Nlc3MsIGNsZWFycyB0aGUgYmxvY2sgc3RhdGUgYW5kIHJldHVybnMgd2l0aCB3cml0ZXJfbG9ja18gYW5kCisgICByZWFkZXJfbG9ja18gaGVsZC4gVGhlc2UgbG9ja3MgYXJlIHJlbGVhc2VkIGJ5IGEgc3Vic2VxdWVudAorICAgY2xfYmxvY2tfYWNjZXNzX2VuYWJsZSgpIGNhbGwuICovCitzdGF0aWMgaW50IGNsX2Jsb2NrX3RyeV9kaXNhYmxlX2FjY2VzcyhjbF9ibG9jayAqYmxvY2ssIGludCBkaXNjYXJkX2RhdGEpIHsKKyAgaWYgKCFjbF90cnlfbG9jaygmYmxvY2stPndyaXRlcl9sb2NrKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghY2xfdHJ5X2xvY2soJmJsb2NrLT5yZWFkZXJfbG9jaykpIHsKKyAgICBjbF91bmxvY2soJmJsb2NrLT53cml0ZXJfbG9jayk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFkaXNjYXJkX2RhdGEgJiYKKyAgICAgIChibG9jay0+Ynl0ZXNfcmVhZCAhPSBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrKSkpIHsKKyAgICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7CisgICAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOworICAgIHJldHVybiAwOworICB9CisgIGNsX2Jsb2NrX3NldF9ieXRlc19jb21taXR0ZWQoYmxvY2ssIDApOworICBibG9jay0+Ynl0ZXNfcmVhZCA9IDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjbF9ibG9ja19lbmFibGVfYWNjZXNzKGNsX2Jsb2NrICpibG9jaykgeworICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7CisgIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKK30KKworLyogUmV0dXJucyB3aXRoIHdyaXRlcl9sb2NrIGhlbGQuICovCitzdGF0aWMgdm9pZCAqY2xfYmxvY2tfc3RhcnRfd3JpdGUoY2xfYmxvY2sgKmJsb2NrLCBzaXplX3Qgc2l6ZSkgeworICBpbnQzMl90IGJ5dGVzX2NvbW1pdHRlZDsKKyAgaWYgKCFjbF90cnlfbG9jaygmYmxvY2stPndyaXRlcl9sb2NrKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGJ5dGVzX2NvbW1pdHRlZCA9IGNsX2Jsb2NrX2dldF9ieXRlc19jb21taXR0ZWQoYmxvY2spOworICBpZiAoYnl0ZXNfY29tbWl0dGVkICsgc2l6ZSA+IENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKSB7CisgICAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBibG9jay0+YnVmZmVyICsgYnl0ZXNfY29tbWl0dGVkOworfQorCisvKiBSZWxlYXNlcyB3cml0ZXJfbG9jayBhbmQgaW5jcmVtZW50cyBjb21taXR0ZWQgYnl0ZXMgYnkgJ2J5dGVzX3dyaXR0ZW4nLgorICAnYnl0ZXNfd3JpdHRlbicgbXVzdCBiZSA8PSAnc2l6ZScgc3BlY2lmaWVkIGluIHRoZSBjb3JyZXNwb25kaW5nCisgIFN0YXJ0V3JpdGUoKSBjYWxsLiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLiAqLworc3RhdGljIHZvaWQgY2xfYmxvY2tfZW5kX3dyaXRlKGNsX2Jsb2NrICpibG9jaywgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4pIHsKKyAgY2xfYmxvY2tfc2V0X2J5dGVzX2NvbW1pdHRlZCgKKyAgICAgIGJsb2NrLCBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrKSArIGJ5dGVzX3dyaXR0ZW4pOworICBjbF91bmxvY2soJmJsb2NrLT53cml0ZXJfbG9jayk7Cit9CisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCB1bnJlYWQgYnl0ZSBpbiBidWZmZXIuIFRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgIGF2YWlsYWJsZSBhcmUgcmV0dXJuZWQgaW4gJ2J5dGVzX2F2YWlsYWJsZScuIEFjcXVpcmVzIHJlYWRlciBsb2NrIHRoYXQgaXMKKyAgIHJlbGVhc2VkIGJ5IGEgc3Vic2VxdWVudCBjbF9ibG9ja19lbmRfcmVhZCgpIGNhbGwuIFJldHVybnMgTlVMTCBpZjoKKyAgIC0gcmVhZCBpbiBwcm9ncmVzcworICAgLSBubyBkYXRhIGF2YWlsYWJsZSAqLworc3RhdGljIHZvaWQgKmNsX2Jsb2NrX3N0YXJ0X3JlYWQoY2xfYmxvY2sgKmJsb2NrLCBzaXplX3QgKmJ5dGVzX2F2YWlsYWJsZSkgeworICB2b2lkICpyZWNvcmQ7CisgIGlmICghY2xfdHJ5X2xvY2soJmJsb2NrLT5yZWFkZXJfbG9jaykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBieXRlc19jb21taXR0ZWQgbWF5IGNoYW5nZSBmcm9tIHVuZGVyIHVzLiBVc2UgYnl0ZXNfYXZhaWxhYmxlIHRvIHVwZGF0ZQorICAgICBieXRlc19yZWFkIGJlbG93LiAqLworICAqYnl0ZXNfYXZhaWxhYmxlID0gY2xfYmxvY2tfZ2V0X2J5dGVzX2NvbW1pdHRlZChibG9jaykgLSBibG9jay0+Ynl0ZXNfcmVhZDsKKyAgaWYgKCpieXRlc19hdmFpbGFibGUgPT0gMCkgeworICAgIGNsX3VubG9jaygmYmxvY2stPnJlYWRlcl9sb2NrKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZWNvcmQgPSBibG9jay0+YnVmZmVyICsgYmxvY2stPmJ5dGVzX3JlYWQ7CisgIGJsb2NrLT5ieXRlc19yZWFkICs9ICpieXRlc19hdmFpbGFibGU7CisgIHJldHVybiByZWNvcmQ7Cit9CisKK3N0YXRpYyB2b2lkIGNsX2Jsb2NrX2VuZF9yZWFkKGNsX2Jsb2NrICpibG9jaykgeworICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyBvcGVyYXRpbmcgb24gZ19sb2cgKi8KKworLyogQWxsb2NhdGVzIGEgbmV3IGZyZWUgYmxvY2sgKG9yIHJlY3ljbGVzIGFuIGF2YWlsYWJsZSBkaXJ0eSBibG9jayBpZiBsb2cgaXMKKyAgIGNvbmZpZ3VyZWQgdG8gZGlzY2FyZCBvbGQgcmVjb3JkcykuIFJldHVybnMgTlVMTCBpZiBvdXQtb2Ytc3BhY2UuICovCitzdGF0aWMgY2xfYmxvY2sgKmNsX2FsbG9jYXRlX2Jsb2NrKHZvaWQpIHsKKyAgY2xfYmxvY2sgKmJsb2NrID0gY2xfYmxvY2tfbGlzdF9oZWFkKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QpOworICBpZiAoYmxvY2sgIT0gTlVMTCkgeworICAgIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QsIGJsb2NrKTsKKyAgICByZXR1cm4gYmxvY2s7CisgIH0KKyAgaWYgKCFnX2xvZy5kaXNjYXJkX29sZF9yZWNvcmRzKSB7CisgICAgLyogTm8gZnJlZSBibG9jayBhbmQgbG9nIGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBvbGQgcmVjb3Jkcy4gKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBSZWN5Y2xlIGRpcnR5IGJsb2NrLiBTdGFydCBmcm9tIHRoZSBvbGRlc3QuICovCisgIGZvciAoYmxvY2sgPSBjbF9ibG9ja19saXN0X2hlYWQoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QpOyBibG9jayAhPSBOVUxMOworICAgICAgIGJsb2NrID0gYmxvY2stPmxpbmsubmV4dC0+YmxvY2spIHsKKyAgICBpZiAoY2xfYmxvY2tfdHJ5X2Rpc2FibGVfYWNjZXNzKGJsb2NrLCAxIC8qIGRpc2NhcmQgZGF0YSAqLykpIHsKKyAgICAgIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0LCBibG9jayk7CisgICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBBbGxvY2F0ZXMgYSBuZXcgYmxvY2sgYW5kIHVwZGF0ZXMgY29yZSBpZCA9PiBibG9jayBtYXBwaW5nLiAnb2xkX2Jsb2NrJworICAgcG9pbnRzIHRvIHRoZSBibG9jayB0aGF0IHRoZSBjYWxsZXIgdGhpbmtzIGlzIGF0dGFjaGVkIHRvCisgICAnY29yZV9pZCcuICdvbGRfYmxvY2snIG1heSBiZSBOVUxMLiBSZXR1cm5zIG5vbi16ZXJvIGlmOgorICAgLSBhbGxvY2F0ZWQgYSBuZXcgYmxvY2sgT1IKKyAgIC0gJ2NvcmVfaWQnID0+ICdvbGRfYmxvY2snIG1hcHBpbmcgY2hhbmdlZCAoYW5vdGhlciB0aHJlYWQgYWxsb2NhdGVkIGEKKyAgICAgYmxvY2sgYmVmb3JlIGxvY2sgd2FzIGFjcXVpcmVkKS4gKi8KK3N0YXRpYyBpbnQgY2xfYWxsb2NhdGVfY29yZV9sb2NhbF9ibG9jayhpbnQzMl90IGNvcmVfaWQsIGNsX2Jsb2NrICpvbGRfYmxvY2spIHsKKyAgLyogTm93IHRoYXQgd2UgaGF2ZSB0aGUgbG9jaywgY2hlY2sgaWYgY29yZS1sb2NhbCBtYXBwaW5nIGhhcyBjaGFuZ2VkLiAqLworICBjbF9jb3JlX2xvY2FsX2Jsb2NrICpjb3JlX2xvY2FsX2Jsb2NrID0gJmdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzW2NvcmVfaWRdOworICBjbF9ibG9jayAqYmxvY2sgPSBjbF9jb3JlX2xvY2FsX2Jsb2NrX2dldF9ibG9jayhjb3JlX2xvY2FsX2Jsb2NrKTsKKyAgaWYgKChibG9jayAhPSBOVUxMKSAmJiAoYmxvY2sgIT0gb2xkX2Jsb2NrKSkgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChibG9jayAhPSBOVUxMKSB7CisgICAgY2xfY29yZV9sb2NhbF9ibG9ja19zZXRfYmxvY2soY29yZV9sb2NhbF9ibG9jaywgTlVMTCk7CisgICAgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfdGFpbCgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCwgYmxvY2spOworICB9CisgIGJsb2NrID0gY2xfYWxsb2NhdGVfYmxvY2soKTsKKyAgaWYgKGJsb2NrID09IE5VTEwpIHsKKyAgICBncHJfYXRtX3JlbF9zdG9yZSgmZ19sb2cuaXNfZnVsbCwgMSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY2xfY29yZV9sb2NhbF9ibG9ja19zZXRfYmxvY2soY29yZV9sb2NhbF9ibG9jaywgYmxvY2spOworICBjbF9ibG9ja19lbmFibGVfYWNjZXNzKGJsb2NrKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjbF9ibG9jayAqY2xfZ2V0X2Jsb2NrKHZvaWQgKnJlY29yZCkgeworICB1aW50cHRyX3QgcCA9ICh1aW50cHRyX3QpKChjaGFyICopcmVjb3JkIC0gZ19sb2cuYnVmZmVyKTsKKyAgdWludHB0cl90IGluZGV4ID0gcCA+PiBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFOworICByZXR1cm4gJmdfbG9nLmJsb2Nrc1tpbmRleF07Cit9CisKKy8qIEdldHMgdGhlIG5leHQgYmxvY2sgdG8gcmVhZCBhbmQgdHJpZXMgdG8gZnJlZSAncHJldicgYmxvY2sgKGlmIG5vdCBOVUxMKS4KKyAgIFJldHVybnMgTlVMTCBpZiByZWFjaGVkIHRoZSBlbmQuICovCitzdGF0aWMgY2xfYmxvY2sgKmNsX25leHRfYmxvY2tfdG9fcmVhZChjbF9ibG9jayAqcHJldikgeworICBjbF9ibG9jayAqYmxvY2sgPSBOVUxMOworICBpZiAoZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZSA9PSBnX2xvZy5udW1fY29yZXMpIHsKKyAgICAvKiBXZSBhcmUgdHJhdmVyc2luZyBkaXJ0eSBsaXN0OyBmaW5kIHRoZSBuZXh0IGRpcnR5IGJsb2NrLiAqLworICAgIGlmIChwcmV2ICE9IE5VTEwpIHsKKyAgICAgIC8qIFRyeSB0byBmcmVlIHRoZSBwcmV2aW91cyBibG9jayBpZiB0aGVyZSBpcyBubyB1bnJlYWQgZGF0YS4gVGhpcyBibG9jaworICAgICAgICAgbWF5IGhhdmUgdW5yZWFkIGRhdGEgaWYgcHJldmlvdXNseSBpbmNvbXBsZXRlIHJlY29yZCBjb21wbGV0ZWQgYmV0d2VlbgorICAgICAgICAgcmVhZF9uZXh0KCkgY2FsbHMuICovCisgICAgICBibG9jayA9IHByZXYtPmxpbmsubmV4dC0+YmxvY2s7CisgICAgICBpZiAoY2xfYmxvY2tfdHJ5X2Rpc2FibGVfYWNjZXNzKHByZXYsIDAgLyogZG8gbm90IGRpc2NhcmQgZGF0YSAqLykpIHsKKyAgICAgICAgY2xfYmxvY2tfbGlzdF9yZW1vdmUoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QsIHByZXYpOworICAgICAgICBjbF9ibG9ja19saXN0X2luc2VydF9hdF9oZWFkKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QsIHByZXYpOworICAgICAgICBncHJfYXRtX3JlbF9zdG9yZSgmZ19sb2cuaXNfZnVsbCwgMCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJsb2NrID0gY2xfYmxvY2tfbGlzdF9oZWFkKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0KTsKKyAgICB9CisgICAgaWYgKGJsb2NrICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAgLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgZGlydHkgbGlzdDsgbW92aW5nIG9uIHRvIGNvcmUtbG9jYWwgYmxvY2tzLiAqLworICB9CisgIHdoaWxlIChnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlID4gMCkgeworICAgIGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUtLTsKKyAgICBibG9jayA9IGNsX2NvcmVfbG9jYWxfYmxvY2tfZ2V0X2Jsb2NrKAorICAgICAgICAmZ19sb2cuY29yZV9sb2NhbF9ibG9ja3NbZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZV0pOworICAgIGlmIChibG9jayAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBFeHRlcm5hbCBmdW5jdGlvbnM6IHByaW1hcnkgc3RhdHNfbG9nIGludGVyZmFjZSAqLwordm9pZCBjZW5zdXNfbG9nX2luaXRpYWxpemUoc2l6ZV90IHNpemVfaW5fbWIsIGludCBkaXNjYXJkX29sZF9yZWNvcmRzKSB7CisgIGludDMyX3QgaXg7CisgIC8qIENoZWNrIGNhY2hlbGluZSBhbGlnbm1lbnQuICovCisgIEdQUl9BU1NFUlQoc2l6ZW9mKGNsX2Jsb2NrKSAlIEdQUl9DQUNIRUxJTkVfU0laRSA9PSAwKTsKKyAgR1BSX0FTU0VSVChzaXplb2YoY2xfY29yZV9sb2NhbF9ibG9jaykgJSBHUFJfQ0FDSEVMSU5FX1NJWkUgPT0gMCk7CisgIEdQUl9BU1NFUlQoIWdfbG9nLmluaXRpYWxpemVkKTsKKyAgZ19sb2cuZGlzY2FyZF9vbGRfcmVjb3JkcyA9IGRpc2NhcmRfb2xkX3JlY29yZHM7CisgIGdfbG9nLm51bV9jb3JlcyA9IGdwcl9jcHVfbnVtX2NvcmVzKCk7CisgIC8qIEVuc3VyZSBhdCBsZWFzdCBhcyBtYW55IGJsb2NrcyBhcyB0aGVyZSBhcmUgY29yZXMuICovCisgIGdfbG9nLm51bV9ibG9ja3MgPSBHUFJfTUFYKAorICAgICAgZ19sb2cubnVtX2NvcmVzLCAoc2l6ZV9pbl9tYiA8PCAyMCkgPj4gQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRSk7CisgIGdwcl9tdV9pbml0KCZnX2xvZy5sb2NrKTsKKyAgZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZSA9IDA7CisgIGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgPSBOVUxMOworICBncHJfYXRtX3JlbF9zdG9yZSgmZ19sb2cuaXNfZnVsbCwgMCk7CisgIGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzID0gKGNsX2NvcmVfbG9jYWxfYmxvY2sgKilncHJfbWFsbG9jX2FsaWduZWQoCisgICAgICBnX2xvZy5udW1fY29yZXMgKiBzaXplb2YoY2xfY29yZV9sb2NhbF9ibG9jayksIEdQUl9DQUNIRUxJTkVfU0laRV9MT0cpOworICBtZW1zZXQoZ19sb2cuY29yZV9sb2NhbF9ibG9ja3MsIDAsCisgICAgICAgICBnX2xvZy5udW1fY29yZXMgKiBzaXplb2YoY2xfY29yZV9sb2NhbF9ibG9jaykpOworICBnX2xvZy5ibG9ja3MgPSAoY2xfYmxvY2sgKilncHJfbWFsbG9jX2FsaWduZWQoCisgICAgICBnX2xvZy5udW1fYmxvY2tzICogc2l6ZW9mKGNsX2Jsb2NrKSwgR1BSX0NBQ0hFTElORV9TSVpFX0xPRyk7CisgIG1lbXNldChnX2xvZy5ibG9ja3MsIDAsIGdfbG9nLm51bV9ibG9ja3MgKiBzaXplb2YoY2xfYmxvY2spKTsKKyAgZ19sb2cuYnVmZmVyID0gZ3ByX21hbGxvYyhnX2xvZy5udW1fYmxvY2tzICogQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUpOworICBtZW1zZXQoZ19sb2cuYnVmZmVyLCAwLCBnX2xvZy5udW1fYmxvY2tzICogQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUpOworICBjbF9ibG9ja19saXN0X2luaXRpYWxpemUoJmdfbG9nLmZyZWVfYmxvY2tfbGlzdCk7CisgIGNsX2Jsb2NrX2xpc3RfaW5pdGlhbGl6ZSgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCk7CisgIGZvciAoaXggPSAwOyBpeCA8IGdfbG9nLm51bV9ibG9ja3M7ICsraXgpIHsKKyAgICBjbF9ibG9jayAqYmxvY2sgPSBnX2xvZy5ibG9ja3MgKyBpeDsKKyAgICBjbF9ibG9ja19pbml0aWFsaXplKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgZ19sb2cuYnVmZmVyICsgKENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFICogaXgpKTsKKyAgICBjbF9ibG9ja190cnlfZGlzYWJsZV9hY2Nlc3MoYmxvY2ssIDEgLyogZGlzY2FyZCBkYXRhICovKTsKKyAgICBjbF9ibG9ja19saXN0X2luc2VydF9hdF90YWlsKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QsIGJsb2NrKTsKKyAgfQorICBncHJfYXRtX3JlbF9zdG9yZSgmZ19sb2cub3V0X29mX3NwYWNlX2NvdW50LCAwKTsKKyAgZ19sb2cuaW5pdGlhbGl6ZWQgPSAxOworfQorCit2b2lkIGNlbnN1c19sb2dfc2h1dGRvd24odm9pZCkgeworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgZ3ByX211X2Rlc3Ryb3koJmdfbG9nLmxvY2spOworICBncHJfZnJlZV9hbGlnbmVkKGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzKTsKKyAgZ19sb2cuY29yZV9sb2NhbF9ibG9ja3MgPSBOVUxMOworICBncHJfZnJlZV9hbGlnbmVkKGdfbG9nLmJsb2Nrcyk7CisgIGdfbG9nLmJsb2NrcyA9IE5VTEw7CisgIGdwcl9mcmVlKGdfbG9nLmJ1ZmZlcik7CisgIGdfbG9nLmJ1ZmZlciA9IE5VTEw7CisgIGdfbG9nLmluaXRpYWxpemVkID0gMDsKK30KKwordm9pZCAqY2Vuc3VzX2xvZ19zdGFydF93cml0ZShzaXplX3Qgc2l6ZSkgeworICAvKiBVc2VkIHRvIGJvdW5kIG51bWJlciBvZiB0aW1lcyBibG9jayBhbGxvY2F0aW9uIGlzIGF0dGVtcHRlZC4gKi8KKyAgaW50MzJfdCBhdHRlbXB0c19yZW1haW5pbmcgPSBnX2xvZy5udW1fYmxvY2tzOworICAvKiBUT0RPKGF2ZWl0Y2gpOiBtb3ZlIHRoaXMgaW5zaWRlIHRoZSBkbyBsb29wIHdoZW4gY3VycmVudF9jcHUgaXMgZml4ZWQgKi8KKyAgaW50MzJfdCBjb3JlX2lkID0gZ3ByX2NwdV9jdXJyZW50X2NwdSgpOworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgaWYgKHNpemUgPiBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGRvIHsKKyAgICBpbnQgYWxsb2NhdGVkOworICAgIHZvaWQgKnJlY29yZCA9IE5VTEw7CisgICAgY2xfYmxvY2sgKmJsb2NrID0KKyAgICAgICAgY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soJmdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzW2NvcmVfaWRdKTsKKyAgICBpZiAoYmxvY2sgJiYgKHJlY29yZCA9IGNsX2Jsb2NrX3N0YXJ0X3dyaXRlKGJsb2NrLCBzaXplKSkpIHsKKyAgICAgIHJldHVybiByZWNvcmQ7CisgICAgfQorICAgIC8qIE5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2suIFdlIGFyZSBoZXJlIGlmOgorICAgICAgIC0gTm8gYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JlIE9SCisgICAgICAgLSBXcml0ZSBpbi1wcm9ncmVzcyBvbiB0aGUgYmxvY2sgT1IKKyAgICAgICAtIGJsb2NrIGlzIG91dCBvZiBzcGFjZSAqLworICAgIGlmIChncHJfYXRtX2FjcV9sb2FkKCZnX2xvZy5pc19mdWxsKSkgeworICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2ZldGNoX2FkZCgmZ19sb2cub3V0X29mX3NwYWNlX2NvdW50LCAxKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBncHJfbXVfbG9jaygmZ19sb2cubG9jayk7CisgICAgYWxsb2NhdGVkID0gY2xfYWxsb2NhdGVfY29yZV9sb2NhbF9ibG9jayhjb3JlX2lkLCBibG9jayk7CisgICAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7CisgICAgaWYgKCFhbGxvY2F0ZWQpIHsKKyAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCwgMSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0gd2hpbGUgKGF0dGVtcHRzX3JlbWFpbmluZy0tKTsKKyAgLyogR2l2ZSB1cC4gKi8KKyAgZ3ByX2F0bV9ub19iYXJyaWVyX2ZldGNoX2FkZCgmZ19sb2cub3V0X29mX3NwYWNlX2NvdW50LCAxKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgY2Vuc3VzX2xvZ19lbmRfd3JpdGUodm9pZCAqcmVjb3JkLCBzaXplX3QgYnl0ZXNfd3JpdHRlbikgeworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgY2xfYmxvY2tfZW5kX3dyaXRlKGNsX2dldF9ibG9jayhyZWNvcmQpLCBieXRlc193cml0dGVuKTsKK30KKwordm9pZCBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKHZvaWQpIHsKKyAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7CisgIGdwcl9tdV9sb2NrKCZnX2xvZy5sb2NrKTsKKyAgLyogSWYgYSBibG9jayBpcyBsb2NrZWQgZm9yIHJlYWRpbmcgdW5sb2NrIGl0LiAqLworICBpZiAoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCAhPSBOVUxMKSB7CisgICAgY2xfYmxvY2tfZW5kX3JlYWQoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCk7CisgICAgZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCA9IE5VTEw7CisgIH0KKyAgZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZSA9IGdfbG9nLm51bV9jb3JlczsKKyAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7Cit9CisKK2NvbnN0IHZvaWQgKmNlbnN1c19sb2dfcmVhZF9uZXh0KHNpemVfdCAqYnl0ZXNfYXZhaWxhYmxlKSB7CisgIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOworICBncHJfbXVfbG9jaygmZ19sb2cubG9jayk7CisgIGlmIChnX2xvZy5ibG9ja19iZWluZ19yZWFkICE9IE5VTEwpIHsKKyAgICBjbF9ibG9ja19lbmRfcmVhZChnX2xvZy5ibG9ja19iZWluZ19yZWFkKTsKKyAgfQorICBkbyB7CisgICAgZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCA9IGNsX25leHRfYmxvY2tfdG9fcmVhZChnX2xvZy5ibG9ja19iZWluZ19yZWFkKTsKKyAgICBpZiAoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCAhPSBOVUxMKSB7CisgICAgICB2b2lkICpyZWNvcmQgPQorICAgICAgICAgIGNsX2Jsb2NrX3N0YXJ0X3JlYWQoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCwgYnl0ZXNfYXZhaWxhYmxlKTsKKyAgICAgIGlmIChyZWNvcmQgIT0gTlVMTCkgeworICAgICAgICBncHJfbXVfdW5sb2NrKCZnX2xvZy5sb2NrKTsKKyAgICAgICAgcmV0dXJuIHJlY29yZDsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgIT0gTlVMTCk7CisgIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOworICByZXR1cm4gTlVMTDsKK30KKworc2l6ZV90IGNlbnN1c19sb2dfcmVtYWluaW5nX3NwYWNlKHZvaWQpIHsKKyAgc2l6ZV90IHNwYWNlOworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgZ3ByX211X2xvY2soJmdfbG9nLmxvY2spOworICBpZiAoZ19sb2cuZGlzY2FyZF9vbGRfcmVjb3JkcykgeworICAgIC8qIFJlbWFpbmluZyBzcGFjZSBpcyBub3QgbWVhbmluZ2Z1bDsganVzdCByZXR1cm4gdGhlIGVudGlyZSBsb2cgc3BhY2UuICovCisgICAgc3BhY2UgPSBnX2xvZy5udW1fYmxvY2tzIDw8IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkU7CisgIH0gZWxzZSB7CisgICAgc3BhY2UgPSBnX2xvZy5mcmVlX2Jsb2NrX2xpc3QuY291bnQgKiBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX2xvZy5sb2NrKTsKKyAgcmV0dXJuIHNwYWNlOworfQorCitpbnQgY2Vuc3VzX2xvZ19vdXRfb2Zfc3BhY2VfY291bnQodm9pZCkgeworICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKKyAgcmV0dXJuIGdwcl9hdG1fYWNxX2xvYWQoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmggYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmYmQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19sb2cuaApAQCAtMCwwICsxLDkxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1RBVElTVElDU19DRU5TVVNfTE9HX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19MT0dfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIE1heGltdW0gcmVjb3JkIHNpemUsIGluIGJ5dGVzLiAqLworI2RlZmluZSBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIDE0IC8qIDJeMTQgPSAxNktCICovCisjZGVmaW5lIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFICgxIDw8IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUpCisKKy8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgbG9nZ2luZyBzdWJzeXN0ZW0gd2l0aCB0aGUgZ2l2ZW4gbG9nIHNpemUuIEEgbG9nCisgICBzaXplIG9mIDAgd2lsbCByZXN1bHQgaW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGxvZyBmb3IgdGhlIHBsYXRmb3JtCisgICAoYXBwcm94aW1hdGVseSBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSAqIGdwcl9jcHVfbnVtX2NvcmVzKCkpLiBJZgorICAgZGlzY2FyZF9vbGRfcmVjb3JkcyBpcyBub24temVybywgdGhlbiBuZXcgcmVjb3JkcyB3aWxsIGRpc3BsYWNlIG9sZGVyIG9uZXMKKyAgIHdoZW4gdGhlIGxvZyBpcyBmdWxsLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIKKyAgIGNlbnN1c19sb2cgZnVuY3Rpb25zLgorKi8KK3ZvaWQgY2Vuc3VzX2xvZ19pbml0aWFsaXplKHNpemVfdCBzaXplX2luX21iLCBpbnQgZGlzY2FyZF9vbGRfcmVjb3Jkcyk7CisKKy8qIFNodXRkb3duIHRoZSBsb2dnaW5nIHN1YnN5c3RlbS4gQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQ6CisgICAtIG5vIGluIHByb2dyZXNzIG9yIGZ1dHVyZSBjYWxsIHRvIGFueSBjZW5zdXNfbG9nIGZ1bmN0aW9ucworICAgLSBubyBpbmNvbXBsZXRlIHJlY29yZHMKKyovCit2b2lkIGNlbnN1c19sb2dfc2h1dGRvd24odm9pZCk7CisKKy8qIEFsbG9jYXRlcyBhbmQgcmV0dXJucyBhICdzaXplJyBieXRlcyByZWNvcmQgYW5kIG1hcmtzIGl0IGluIHVzZS4gQQorICAgc3Vic2VxdWVudCBjZW5zdXNfbG9nX2VuZF93cml0ZSgpIG1hcmtzIHRoZSByZWNvcmQgY29tcGxldGUuIFRoZQorICAgJ2J5dGVzX3dyaXR0ZW4nIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkgYXJndW1lbnQgbXVzdCBiZSA8PQorICAgJ3NpemUnLiBSZXR1cm5zIE5VTEwgaWYgb3V0LW9mLXNwYWNlIEFORDoKKyAgICAgICAtIGxvZyBpcyBjb25maWd1cmVkIHRvIGtlZXAgb2xkIHJlY29yZHMgT1IKKyAgICAgICAtIGFsbCBibG9ja3MgYXJlIHBpbm5lZCBieSBpbmNvbXBsZXRlIHJlY29yZHMuCisqLwordm9pZCAqY2Vuc3VzX2xvZ19zdGFydF93cml0ZShzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgY2Vuc3VzX2xvZ19lbmRfd3JpdGUodm9pZCAqcmVjb3JkLCBzaXplX3QgYnl0ZXNfd3JpdHRlbik7CisKKy8qIGNlbnN1c19sb2dfcmVhZF9uZXh0KCkgaXRlcmF0ZXMgb3ZlciBibG9ja3Mgd2l0aCBkYXRhIGFuZCBmb3IgZWFjaCBibG9jaworICAgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHVucmVhZCBieXRlLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlCisgICByZWFkIGFyZSByZXR1cm5lZCBpbiAnYnl0ZXNfYXZhaWxhYmxlJy4gUmVhZGVyIGlzIGV4cGVjdGVkIHRvIHJlYWQgYWxsCisgICBhdmFpbGFibGUgZGF0YS4gUmVhZGluZyB0aGUgZGF0YSBjb25zdW1lcyBpdCBpLmUuIGl0IGNhbm5vdCBiZSByZWFkIGFnYWluLgorICAgY2Vuc3VzX2xvZ19yZWFkX25leHQoKSByZXR1cm5zIE5VTEwgaWYgdGhlIGVuZCBpcyByZWFjaGVkIGkuZSBsYXN0IGJsb2NrCisgICBpcyByZWFkLiBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKCkgc3RhcnRzIHRoZSBpdGVyYXRpb24gb3IgYWJvcnRzIHRoZQorICAgY3VycmVudCBpdGVyYXRpb24uCisqLwordm9pZCBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKHZvaWQpOworY29uc3Qgdm9pZCAqY2Vuc3VzX2xvZ19yZWFkX25leHQoc2l6ZV90ICpieXRlc19hdmFpbGFibGUpOworCisvKiBSZXR1cm5zIGVzdGltYXRlZCByZW1haW5pbmcgc3BhY2UgYWNyb3NzIGFsbCBibG9ja3MsIGluIGJ5dGVzLiBJZiBsb2cgaXMKKyAgIGNvbmZpZ3VyZWQgdG8gZGlzY2FyZCBvbGQgcmVjb3JkcywgcmV0dXJucyB0b3RhbCBsb2cgc3BhY2UuIE90aGVyd2lzZSwKKyAgIHJldHVybnMgc3BhY2UgYXZhaWxhYmxlIGluIGVtcHR5IGJsb2NrcyAocGFydGlhbGx5IGZpbGxlZCBibG9ja3MgYXJlCisgICB0cmVhdGVkIGFzIGZ1bGwpLgorKi8KK3NpemVfdCBjZW5zdXNfbG9nX3JlbWFpbmluZ19zcGFjZSh2b2lkKTsKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIGdwcmNfc3RhdHNfbG9nX3N0YXJ0X3dyaXRlKCkgZmFpbGVkIGR1ZSB0bworICAgb3V0LW9mLXNwYWNlLiAqLworaW50IGNlbnN1c19sb2dfb3V0X29mX3NwYWNlX2NvdW50KHZvaWQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5jIGIvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODI1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3Mvd2luZG93X3N0YXRzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKworI2RlZmluZSBOVU1fSU5URVJWQUxTIDMKKyNkZWZpbmUgTUlOVVRFX0lOVEVSVkFMIDAKKyNkZWZpbmUgSE9VUl9JTlRFUlZBTCAxCisjZGVmaW5lIFRPVEFMX0lOVEVSVkFMIDIKKworLyogZm9yIGVhc2llciB0eXBpbmcgKi8KK3R5cGVkZWYgY2Vuc3VzX3Blcl9tZXRob2RfcnBjX3N0YXRzIHBlcl9tZXRob2Rfc3RhdHM7CisKKy8qIEVuc3VyZSBtdSBpcyBvbmx5IGluaXRpYWxpemVkIG9uY2UuICovCitzdGF0aWMgZ3ByX29uY2UgZ19zdGF0c19zdG9yZV9tdV9pbml0ID0gR1BSX09OQ0VfSU5JVDsKKy8qIEd1YXJkcyB0d28gc3RhdHMgc3RvcmVzLiAqLworc3RhdGljIGdwcl9tdSBnX211Oworc3RhdGljIGNlbnN1c19odCAqZ19jbGllbnRfc3RhdHNfc3RvcmUgPSBOVUxMOworc3RhdGljIGNlbnN1c19odCAqZ19zZXJ2ZXJfc3RhdHNfc3RvcmUgPSBOVUxMOworCitzdGF0aWMgdm9pZCBpbml0X211dGV4KHZvaWQpIHsgZ3ByX211X2luaXQoJmdfbXUpOyB9CisKK3N0YXRpYyB2b2lkIGluaXRfbXV0ZXhfb25jZSh2b2lkKSB7CisgIGdwcl9vbmNlX2luaXQoJmdfc3RhdHNfc3RvcmVfbXVfaW5pdCwgaW5pdF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgY21wX3N0cl9rZXlzKGNvbnN0IHZvaWQgKmsxLCBjb25zdCB2b2lkICprMikgeworICByZXR1cm4gc3RyY21wKChjb25zdCBjaGFyICopazEsIChjb25zdCBjaGFyICopazIpOworfQorCisvKiBUT0RPKGhvbmd5dSk6IHJlcGxhY2UgaXQgd2l0aCBjaXR5aGFzaDY0ICovCitzdGF0aWMgdWludDY0X3Qgc2ltcGxlX2hhc2goY29uc3Qgdm9pZCAqaykgeworICBzaXplX3QgbGVuID0gc3RybGVuKGspOworICB1aW50NjRfdCBoaWdoZXIgPSBncHJfbXVybXVyX2hhc2gzKChjb25zdCBjaGFyICopaywgbGVuIC8gMiwgMCk7CisgIHJldHVybiBoaWdoZXIgPDwgMzIgfAorICAgICAgICAgZ3ByX211cm11cl9oYXNoMygoY29uc3QgY2hhciAqKWsgKyBsZW4gLyAyLCBsZW4gLSBsZW4gLyAyLCAwKTsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlX3N0YXRzKHZvaWQgKnN0YXRzKSB7CisgIGNlbnN1c193aW5kb3dfc3RhdHNfZGVzdHJveSgoc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgKilzdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9rZXkodm9pZCAqa2V5KSB7IGdwcl9mcmVlKGtleSk7IH0KKworc3RhdGljIGNvbnN0IGNlbnN1c19odF9vcHRpb24gaHRfb3B0ID0geworICAgIENFTlNVU19IVF9QT0lOVEVSIC8qIGtleSB0eXBlICovLCAxOTk5IC8qIG5fb2ZfYnVja2V0cyAqLywKKyAgICBzaW1wbGVfaGFzaCAvKiBoYXNoIGZ1bmN0aW9uICovLCAgY21wX3N0cl9rZXlzIC8qIGtleSBjb21wYXJhdG9yICovLAorICAgIGRlbGV0ZV9zdGF0cyAvKiBkYXRhIGRlbGV0ZXIgKi8sICBkZWxldGVfa2V5IC8qIGtleSBkZWxldGVyICovCit9OworCitzdGF0aWMgdm9pZCBpbml0X3JwY19zdGF0cyh2b2lkICpzdGF0cykgeworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZihjZW5zdXNfcnBjX3N0YXRzKSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXRfYWRkX3Byb3BvcnRpb24oZG91YmxlIHAsIHZvaWQgKmJhc2UsIGNvbnN0IHZvaWQgKmFkZG1lKSB7CisgIGNlbnN1c19ycGNfc3RhdHMgKmIgPSAoY2Vuc3VzX3JwY19zdGF0cyAqKWJhc2U7CisgIGNlbnN1c19ycGNfc3RhdHMgKmEgPSAoY2Vuc3VzX3JwY19zdGF0cyAqKWFkZG1lOworICBiLT5jbnQgKz0gcCAqIGEtPmNudDsKKyAgYi0+cnBjX2Vycm9yX2NudCArPSBwICogYS0+cnBjX2Vycm9yX2NudDsKKyAgYi0+YXBwX2Vycm9yX2NudCArPSBwICogYS0+YXBwX2Vycm9yX2NudDsKKyAgYi0+ZWxhcHNlZF90aW1lX21zICs9IHAgKiBhLT5lbGFwc2VkX3RpbWVfbXM7CisgIGItPmFwaV9yZXF1ZXN0X2J5dGVzICs9IHAgKiBhLT5hcGlfcmVxdWVzdF9ieXRlczsKKyAgYi0+d2lyZV9yZXF1ZXN0X2J5dGVzICs9IHAgKiBhLT53aXJlX3JlcXVlc3RfYnl0ZXM7CisgIGItPmFwaV9yZXNwb25zZV9ieXRlcyArPSBwICogYS0+YXBpX3Jlc3BvbnNlX2J5dGVzOworICBiLT53aXJlX3Jlc3BvbnNlX2J5dGVzICs9IHAgKiBhLT53aXJlX3Jlc3BvbnNlX2J5dGVzOworfQorCitzdGF0aWMgdm9pZCBzdGF0X2FkZCh2b2lkICpiYXNlLCBjb25zdCB2b2lkICphZGRtZSkgeworICBzdGF0X2FkZF9wcm9wb3J0aW9uKDEuMCwgYmFzZSwgYWRkbWUpOworfQorCitzdGF0aWMgZ3ByX3RpbWVzcGVjIG1pbl9ob3VyX3RvdGFsX2ludGVydmFsc1szXSA9IHsKKyAgICB7NjAsIDB9LCB7MzYwMCwgMH0sIHszNjAwMDAwMCwgMH19OworCitzdGF0aWMgY29uc3QgY2Vuc3VzX3dpbmRvd19zdGF0c19zdGF0X2luZm8gd2luZG93X3N0YXRzX3NldHRpbmdzID0geworICAgIHNpemVvZihjZW5zdXNfcnBjX3N0YXRzKSwgaW5pdF9ycGNfc3RhdHMsIHN0YXRfYWRkLCBzdGF0X2FkZF9wcm9wb3J0aW9ufTsKKworY2Vuc3VzX3JwY19zdGF0cyAqY2Vuc3VzX3JwY19zdGF0c19jcmVhdGVfZW1wdHkodm9pZCkgeworICBjZW5zdXNfcnBjX3N0YXRzICpyZXQgPQorICAgICAgKGNlbnN1c19ycGNfc3RhdHMgKilncHJfbWFsbG9jKHNpemVvZihjZW5zdXNfcnBjX3N0YXRzKSk7CisgIG1lbXNldChyZXQsIDAsIHNpemVvZihjZW5zdXNfcnBjX3N0YXRzKSk7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzX3NldF9lbXB0eShjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGEpIHsKKyAgaW50IGkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtX2VudHJpZXM7IGkrKykgeworICAgIGlmIChkYXRhLT5zdGF0c1tpXS5tZXRob2QgIT0gTlVMTCkgeworICAgICAgZ3ByX2ZyZWUoKHZvaWQgKilkYXRhLT5zdGF0c1tpXS5tZXRob2QpOworICAgIH0KKyAgfQorICBpZiAoZGF0YS0+c3RhdHMgIT0gTlVMTCkgeworICAgIGdwcl9mcmVlKGRhdGEtPnN0YXRzKTsKKyAgfQorICBkYXRhLT5udW1fZW50cmllcyA9IDA7CisgIGRhdGEtPnN0YXRzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVjb3JkX3N0YXRzKGNlbnN1c19odCAqc3RvcmUsIGNlbnN1c19vcF9pZCBvcF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW5zdXNfcnBjX3N0YXRzICpzdGF0cykgeworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGlmIChzdG9yZSAhPSBOVUxMKSB7CisgICAgY2Vuc3VzX3RyYWNlX29iaiAqdHJhY2UgPSBOVUxMOworICAgIGNlbnN1c19pbnRlcm5hbF9sb2NrX3RyYWNlX3N0b3JlKCk7CisgICAgdHJhY2UgPSBjZW5zdXNfZ2V0X3RyYWNlX29ial9sb2NrZWQob3BfaWQpOworICAgIGlmICh0cmFjZSAhPSBOVUxMKSB7CisgICAgICBjb25zdCBjaGFyICptZXRob2RfbmFtZSA9IGNlbnN1c19nZXRfdHJhY2VfbWV0aG9kX25hbWUodHJhY2UpOworICAgICAgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgKndpbmRvd19zdGF0cyA9IE5VTEw7CisgICAgICBjZW5zdXNfaHRfa2V5IGtleTsKKyAgICAgIGtleS5wdHIgPSAodm9pZCAqKW1ldGhvZF9uYW1lOworICAgICAgd2luZG93X3N0YXRzID0gY2Vuc3VzX2h0X2ZpbmQoc3RvcmUsIGtleSk7CisgICAgICBjZW5zdXNfaW50ZXJuYWxfdW5sb2NrX3RyYWNlX3N0b3JlKCk7CisgICAgICBpZiAod2luZG93X3N0YXRzID09IE5VTEwpIHsKKyAgICAgICAgd2luZG93X3N0YXRzID0gY2Vuc3VzX3dpbmRvd19zdGF0c19jcmVhdGUoMywgbWluX2hvdXJfdG90YWxfaW50ZXJ2YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgJndpbmRvd19zdGF0c19zZXR0aW5ncyk7CisgICAgICAgIGtleS5wdHIgPSBncHJfc3RyZHVwKGtleS5wdHIpOworICAgICAgICBjZW5zdXNfaHRfaW5zZXJ0KHN0b3JlLCBrZXksICh2b2lkICopd2luZG93X3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGNlbnN1c193aW5kb3dfc3RhdHNfYWRkKHdpbmRvd19zdGF0cywgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCBzdGF0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNlbnN1c19pbnRlcm5hbF91bmxvY2tfdHJhY2Vfc3RvcmUoKTsKKyAgICB9CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19tdSk7Cit9CisKK3ZvaWQgY2Vuc3VzX3JlY29yZF9ycGNfY2xpZW50X3N0YXRzKGNlbnN1c19vcF9pZCBvcF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnN1c19ycGNfc3RhdHMgKnN0YXRzKSB7CisgIHJlY29yZF9zdGF0cyhnX2NsaWVudF9zdGF0c19zdG9yZSwgb3BfaWQsIHN0YXRzKTsKK30KKwordm9pZCBjZW5zdXNfcmVjb3JkX3JwY19zZXJ2ZXJfc3RhdHMoY2Vuc3VzX29wX2lkIG9wX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2Vuc3VzX3JwY19zdGF0cyAqc3RhdHMpIHsKKyAgcmVjb3JkX3N0YXRzKGdfc2VydmVyX3N0YXRzX3N0b3JlLCBvcF9pZCwgc3RhdHMpOworfQorCisvKiBHZXQgc3RhdHMgZnJvbSBpbnB1dCBzdGF0cyBzdG9yZSAqLworc3RhdGljIHZvaWQgZ2V0X3N0YXRzKGNlbnN1c19odCAqc3RvcmUsIGNlbnN1c19hZ2dyZWdhdGVkX3JwY19zdGF0cyAqZGF0YSkgeworICBHUFJfQVNTRVJUKGRhdGEgIT0gTlVMTCk7CisgIGlmIChkYXRhLT5udW1fZW50cmllcyAhPSAwKSB7CisgICAgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzX3NldF9lbXB0eShkYXRhKTsKKyAgfQorICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGlmIChzdG9yZSAhPSBOVUxMKSB7CisgICAgc2l6ZV90IG47CisgICAgdW5zaWduZWQgaSwgajsKKyAgICBncHJfdGltZXNwZWMgbm93ID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOworICAgIGNlbnN1c19odF9rdiAqa3YgPSBjZW5zdXNfaHRfZ2V0X2FsbF9lbGVtZW50cyhzdG9yZSwgJm4pOworICAgIGlmIChrdiAhPSBOVUxMKSB7CisgICAgICBkYXRhLT5udW1fZW50cmllcyA9IG47CisgICAgICBkYXRhLT5zdGF0cyA9CisgICAgICAgICAgKHBlcl9tZXRob2Rfc3RhdHMgKilncHJfbWFsbG9jKHNpemVvZihwZXJfbWV0aG9kX3N0YXRzKSAqIG4pOworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBjZW5zdXNfd2luZG93X3N0YXRzX3N1bXMgc3Vtc1tOVU1fSU5URVJWQUxTXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE5VTV9JTlRFUlZBTFM7IGorKykgeworICAgICAgICAgIHN1bXNbal0uc3RhdGlzdGljID0gKHZvaWQgKiljZW5zdXNfcnBjX3N0YXRzX2NyZWF0ZV9lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGRhdGEtPnN0YXRzW2ldLm1ldGhvZCA9IGdwcl9zdHJkdXAoa3ZbaV0uay5wdHIpOworICAgICAgICBjZW5zdXNfd2luZG93X3N0YXRzX2dldF9zdW1zKGt2W2ldLnYsIG5vdywgc3Vtcyk7CisgICAgICAgIGRhdGEtPnN0YXRzW2ldLm1pbnV0ZV9zdGF0cyA9CisgICAgICAgICAgICAqKGNlbnN1c19ycGNfc3RhdHMgKilzdW1zW01JTlVURV9JTlRFUlZBTF0uc3RhdGlzdGljOworICAgICAgICBkYXRhLT5zdGF0c1tpXS5ob3VyX3N0YXRzID0KKyAgICAgICAgICAgICooY2Vuc3VzX3JwY19zdGF0cyAqKXN1bXNbSE9VUl9JTlRFUlZBTF0uc3RhdGlzdGljOworICAgICAgICBkYXRhLT5zdGF0c1tpXS50b3RhbF9zdGF0cyA9CisgICAgICAgICAgICAqKGNlbnN1c19ycGNfc3RhdHMgKilzdW1zW1RPVEFMX0lOVEVSVkFMXS5zdGF0aXN0aWM7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBOVU1fSU5URVJWQUxTOyBqKyspIHsKKyAgICAgICAgICBncHJfZnJlZShzdW1zW2pdLnN0YXRpc3RpYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdwcl9mcmVlKGt2KTsKKyAgICB9CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19tdSk7Cit9CisKK3ZvaWQgY2Vuc3VzX2dldF9jbGllbnRfc3RhdHMoY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzICpkYXRhKSB7CisgIGdldF9zdGF0cyhnX2NsaWVudF9zdGF0c19zdG9yZSwgZGF0YSk7Cit9CisKK3ZvaWQgY2Vuc3VzX2dldF9zZXJ2ZXJfc3RhdHMoY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzICpkYXRhKSB7CisgIGdldF9zdGF0cyhnX3NlcnZlcl9zdGF0c19zdG9yZSwgZGF0YSk7Cit9CisKK3ZvaWQgY2Vuc3VzX3N0YXRzX3N0b3JlX2luaXQodm9pZCkgeworICBpbml0X211dGV4X29uY2UoKTsKKyAgZ3ByX211X2xvY2soJmdfbXUpOworICBpZiAoZ19jbGllbnRfc3RhdHNfc3RvcmUgPT0gTlVMTCAmJiBnX3NlcnZlcl9zdGF0c19zdG9yZSA9PSBOVUxMKSB7CisgICAgZ19jbGllbnRfc3RhdHNfc3RvcmUgPSBjZW5zdXNfaHRfY3JlYXRlKCZodF9vcHQpOworICAgIGdfc2VydmVyX3N0YXRzX3N0b3JlID0gY2Vuc3VzX2h0X2NyZWF0ZSgmaHRfb3B0KTsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNlbnN1cyBzdGF0cyBzdG9yZSBhbHJlYWR5IGluaXRpYWxpemVkLiIpOworICB9CisgIGdwcl9tdV91bmxvY2soJmdfbXUpOworfQorCit2b2lkIGNlbnN1c19zdGF0c19zdG9yZV9zaHV0ZG93bih2b2lkKSB7CisgIGluaXRfbXV0ZXhfb25jZSgpOworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGlmIChnX2NsaWVudF9zdGF0c19zdG9yZSAhPSBOVUxMKSB7CisgICAgY2Vuc3VzX2h0X2Rlc3Ryb3koZ19jbGllbnRfc3RhdHNfc3RvcmUpOworICAgIGdfY2xpZW50X3N0YXRzX3N0b3JlID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNlbnN1cyBzZXJ2ZXIgc3RhdHMgc3RvcmUgbm90IGluaXRpYWxpemVkLiIpOworICB9CisgIGlmIChnX3NlcnZlcl9zdGF0c19zdG9yZSAhPSBOVUxMKSB7CisgICAgY2Vuc3VzX2h0X2Rlc3Ryb3koZ19zZXJ2ZXJfc3RhdHNfc3RvcmUpOworICAgIGdfc2VydmVyX3N0YXRzX3N0b3JlID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNlbnN1cyBjbGllbnQgc3RhdHMgc3RvcmUgbm90IGluaXRpYWxpemVkLiIpOworICB9CisgIGdwcl9tdV91bmxvY2soJmdfbXUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIGIvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmI0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19SUENfU1RBVFNfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfQ0VOU1VTX1JQQ19TVEFUU19ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgY2Vuc3VzX3JwY19zdGF0cyB7CisgIHVpbnQ2NF90IGNudDsKKyAgdWludDY0X3QgcnBjX2Vycm9yX2NudDsKKyAgdWludDY0X3QgYXBwX2Vycm9yX2NudDsKKyAgZG91YmxlIGVsYXBzZWRfdGltZV9tczsKKyAgZG91YmxlIGFwaV9yZXF1ZXN0X2J5dGVzOworICBkb3VibGUgd2lyZV9yZXF1ZXN0X2J5dGVzOworICBkb3VibGUgYXBpX3Jlc3BvbnNlX2J5dGVzOworICBkb3VibGUgd2lyZV9yZXNwb25zZV9ieXRlczsKK307CisKKy8qIENyZWF0ZXMgYW4gZW1wdHkgcnBjIHN0YXRzIG9iamVjdCBvbiBoZWFwLiAqLworY2Vuc3VzX3JwY19zdGF0cyAqY2Vuc3VzX3JwY19zdGF0c19jcmVhdGVfZW1wdHkodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IGNlbnN1c19wZXJfbWV0aG9kX3JwY19zdGF0cyB7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgY2Vuc3VzX3JwY19zdGF0cyBtaW51dGVfc3RhdHM7IC8qIGN1bXVsYXRpdmUgc3RhdHMgaW4gdGhlIHBhc3QgbWludXRlICovCisgIGNlbnN1c19ycGNfc3RhdHMgaG91cl9zdGF0czsgICAvKiBjdW11bGF0aXZlIHN0YXRzIGluIHRoZSBwYXN0IGhvdXIgKi8KKyAgY2Vuc3VzX3JwY19zdGF0cyB0b3RhbF9zdGF0czsgIC8qIGN1bXVsYXRpdmUgc3RhdHMgZnJvbSBsYXN0IGdjICovCit9IGNlbnN1c19wZXJfbWV0aG9kX3JwY19zdGF0czsKKwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzIHsKKyAgaW50IG51bV9lbnRyaWVzOworICBjZW5zdXNfcGVyX21ldGhvZF9ycGNfc3RhdHMgKnN0YXRzOworfSBjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHM7CisKKy8qIEluaXRpYWxpemVzIGFuIGFnZ3JlZ2F0ZWQgcnBjIHN0YXRzIG9iamVjdCB0byBhbiBlbXB0eSBzdGF0ZS4gKi8KK3ZvaWQgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzX3NldF9lbXB0eShjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGEpOworCisvKiBSZWNvcmRzIGNsaWVudCBzaWRlIHN0YXRzIG9mIGEgcnBjLiAqLwordm9pZCBjZW5zdXNfcmVjb3JkX3JwY19jbGllbnRfc3RhdHMoY2Vuc3VzX29wX2lkIG9wX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2Vuc3VzX3JwY19zdGF0cyAqc3RhdHMpOworCisvKiBSZWNvcmRzIHNlcnZlciBzaWRlIHN0YXRzIG9mIGEgcnBjLiAqLwordm9pZCBjZW5zdXNfcmVjb3JkX3JwY19zZXJ2ZXJfc3RhdHMoY2Vuc3VzX29wX2lkIG9wX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2Vuc3VzX3JwY19zdGF0cyAqc3RhdHMpOworCisvKiBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIGludGVuZGVkIGZvciBpbnByb2Nlc3MgcXVlcnkgb2YKKyAgIHBlci1zZXJ2aWNlIHBlci1tZXRob2Qgc3RhdHMgZnJvbSBncnBjIGltcGxlbWVudGF0aW9ucy4gKi8KKworLyogUG9wdWxhdGVzICpkYXRhX21hcCB3aXRoIHNlcnZlciBzaWRlIGFnZ3JlZ2F0ZWQgcGVyLXNlcnZpY2UgcGVyLW1ldGhvZAorICAgc3RhdHMuCisgICBETyBOT1QgQ0FMTCBmcm9tIG91dHNpZGUgb2YgZ3JwYyBjb2RlLiAqLwordm9pZCBjZW5zdXNfZ2V0X3NlcnZlcl9zdGF0cyhjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGFfbWFwKTsKKworLyogUG9wdWxhdGVzICpkYXRhX21hcCB3aXRoIGNsaWVudCBzaWRlIGFnZ3JlZ2F0ZWQgcGVyLXNlcnZpY2UgcGVyLW1ldGhvZAorICAgc3RhdHMuCisgICBETyBOT1QgQ0FMTCBmcm9tIG91dHNpZGUgb2YgZ3JwYyBjb2RlLiAqLwordm9pZCBjZW5zdXNfZ2V0X2NsaWVudF9zdGF0cyhjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGFfbWFwKTsKKwordm9pZCBjZW5zdXNfc3RhdHNfc3RvcmVfaW5pdCh2b2lkKTsKK3ZvaWQgY2Vuc3VzX3N0YXRzX3N0b3JlX3NodXRkb3duKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19SUENfU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuYyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YWU3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2hhc2hfdGFibGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKwordm9pZCBjZW5zdXNfdHJhY2Vfb2JqX2Rlc3Ryb3koY2Vuc3VzX3RyYWNlX29iaiAqb2JqKSB7CisgIGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpwID0gb2JqLT5hbm5vdGF0aW9uczsKKyAgd2hpbGUgKHAgIT0gTlVMTCkgeworICAgIGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpuZXh0ID0gcC0+bmV4dDsKKyAgICBncHJfZnJlZShwKTsKKyAgICBwID0gbmV4dDsKKyAgfQorICBncHJfZnJlZShvYmotPm1ldGhvZCk7CisgIGdwcl9mcmVlKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV90cmFjZV9vYmoodm9pZCAqb2JqKSB7CisgIGNlbnN1c190cmFjZV9vYmpfZGVzdHJveSgoY2Vuc3VzX3RyYWNlX29iaiAqKW9iaik7Cit9CisKK3N0YXRpYyBjb25zdCBjZW5zdXNfaHRfb3B0aW9uIGh0X29wdCA9IHsKKyAgICBDRU5TVVNfSFRfVUlOVDY0IC8qIGtleSB0eXBlICovLAorICAgIDU3MSAvKiBuX29mX2J1Y2tldHMgKi8sCisgICAgTlVMTCAvKiBoYXNoICovLAorICAgIE5VTEwgLyogY29tcGFyZV9rZXlzICovLAorICAgIGRlbGV0ZV90cmFjZV9vYmogLyogZGVsZXRlIGRhdGEgKi8sCisgICAgTlVMTCAvKiBkZWxldGUga2V5ICovCit9OworCitzdGF0aWMgZ3ByX29uY2UgZ19pbml0X211dGV4X29uY2UgPSBHUFJfT05DRV9JTklUOworc3RhdGljIGdwcl9tdSBnX211OyAvKiBHdWFyZHMgZm9sbG93aW5nIHR3byBzdGF0aWMgdmFyaWFibGVzLiAqLworc3RhdGljIGNlbnN1c19odCAqZ190cmFjZV9zdG9yZSA9IE5VTEw7CitzdGF0aWMgdWludDY0X3QgZ19pZCA9IDA7CisKK3N0YXRpYyBjZW5zdXNfaHRfa2V5IG9wX2lkX2FzX2tleShjZW5zdXNfb3BfaWQgKmlkKSB7CisgIHJldHVybiAqKGNlbnN1c19odF9rZXkgKilpZDsKK30KKworc3RhdGljIHVpbnQ2NF90IG9wX2lkXzJfdWludDY0KGNlbnN1c19vcF9pZCAqaWQpIHsKKyAgdWludDY0X3QgcmV0OworICBtZW1jcHkoJnJldCwgaWQsIHNpemVvZihjZW5zdXNfb3BfaWQpKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9tdXRleCh2b2lkKSB7IGdwcl9tdV9pbml0KCZnX211KTsgfQorCitzdGF0aWMgdm9pZCBpbml0X211dGV4X29uY2Uodm9pZCkgeworICBncHJfb25jZV9pbml0KCZnX2luaXRfbXV0ZXhfb25jZSwgaW5pdF9tdXRleCk7Cit9CisKK2NlbnN1c19vcF9pZCBjZW5zdXNfdHJhY2luZ19zdGFydF9vcCh2b2lkKSB7CisgIGdwcl9tdV9sb2NrKCZnX211KTsKKyAgeworICAgIGNlbnN1c190cmFjZV9vYmogKnJldCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c190cmFjZV9vYmopKTsKKyAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoY2Vuc3VzX3RyYWNlX29iaikpOworICAgIGdfaWQrKzsKKyAgICBtZW1jcHkoJnJldC0+aWQsICZnX2lkLCBzaXplb2YoY2Vuc3VzX29wX2lkKSk7CisgICAgcmV0LT5ycGNfc3RhdHMuY250ID0gMTsKKyAgICByZXQtPnRzID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOworICAgIGNlbnN1c19odF9pbnNlcnQoZ190cmFjZV9zdG9yZSwgb3BfaWRfYXNfa2V5KCZyZXQtPmlkKSwgKHZvaWQgKilyZXQpOworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiU3RhcnQgdHJhY2luZyBmb3IgaWQgJWx1IiwgZ19pZCk7CisgICAgZ3ByX211X3VubG9jaygmZ19tdSk7CisgICAgcmV0dXJuIHJldC0+aWQ7CisgIH0KK30KKworaW50IGNlbnN1c19hZGRfbWV0aG9kX3RhZyhjZW5zdXNfb3BfaWQgb3BfaWQsIGNvbnN0IGNoYXIgKm1ldGhvZCkgeworICBpbnQgcmV0ID0gMDsKKyAgY2Vuc3VzX3RyYWNlX29iaiAqdHJhY2UgPSBOVUxMOworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIHRyYWNlID0gY2Vuc3VzX2h0X2ZpbmQoZ190cmFjZV9zdG9yZSwgb3BfaWRfYXNfa2V5KCZvcF9pZCkpOworICBpZiAodHJhY2UgPT0gTlVMTCkgeworICAgIHJldCA9IDE7CisgIH0gZWxzZSB7CisgICAgdHJhY2UtPm1ldGhvZCA9IGdwcl9zdHJkdXAobWV0aG9kKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX211KTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBjZW5zdXNfdHJhY2luZ19wcmludChjZW5zdXNfb3BfaWQgb3BfaWQsIGNvbnN0IGNoYXIgKmFubm9fdHh0KSB7CisgIGNlbnN1c190cmFjZV9vYmogKnRyYWNlID0gTlVMTDsKKyAgZ3ByX211X2xvY2soJmdfbXUpOworICB0cmFjZSA9IGNlbnN1c19odF9maW5kKGdfdHJhY2Vfc3RvcmUsIG9wX2lkX2FzX2tleSgmb3BfaWQpKTsKKyAgaWYgKHRyYWNlICE9IE5VTEwpIHsKKyAgICBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbiAqYW5ubyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c190cmFjZV9hbm5vdGF0aW9uKSk7CisgICAgYW5uby0+dHMgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7CisgICAgeworICAgICAgY2hhciAqZCA9IGFubm8tPnR4dDsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBhbm5vX3R4dDsKKyAgICAgIGludCBuID0gMDsKKyAgICAgIGZvciAoOyBuIDwgQ0VOU1VTX01BWF9BTk5PVEFUSU9OX0xFTkdUSCAmJiAqcyAhPSAnXDAnOyArK24pIHsKKyAgICAgICAgKmQrKyA9ICpzKys7CisgICAgICB9CisgICAgICAqZCA9ICdcMCc7CisgICAgfQorICAgIGFubm8tPm5leHQgPSB0cmFjZS0+YW5ub3RhdGlvbnM7CisgICAgdHJhY2UtPmFubm90YXRpb25zID0gYW5ubzsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX211KTsKK30KKwordm9pZCBjZW5zdXNfdHJhY2luZ19lbmRfb3AoY2Vuc3VzX29wX2lkIG9wX2lkKSB7CisgIGNlbnN1c190cmFjZV9vYmogKnRyYWNlID0gTlVMTDsKKyAgZ3ByX211X2xvY2soJmdfbXUpOworICB0cmFjZSA9IGNlbnN1c19odF9maW5kKGdfdHJhY2Vfc3RvcmUsIG9wX2lkX2FzX2tleSgmb3BfaWQpKTsKKyAgaWYgKHRyYWNlICE9IE5VTEwpIHsKKyAgICB0cmFjZS0+cnBjX3N0YXRzLmVsYXBzZWRfdGltZV9tcyA9IGdwcl90aW1lc3BlY190b19taWNyb3MoCisgICAgICAgIGdwcl90aW1lX3N1YihncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIHRyYWNlLT50cykpOworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiRW5kIHRyYWNpbmcgZm9yIGlkICVsdSwgbWV0aG9kICVzLCBsYXRlbmN5ICVmIHVzIiwKKyAgICAgICAgICAgIG9wX2lkXzJfdWludDY0KCZvcF9pZCksIHRyYWNlLT5tZXRob2QsCisgICAgICAgICAgICB0cmFjZS0+cnBjX3N0YXRzLmVsYXBzZWRfdGltZV9tcyk7CisgICAgY2Vuc3VzX2h0X2VyYXNlKGdfdHJhY2Vfc3RvcmUsIG9wX2lkX2FzX2tleSgmb3BfaWQpKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX211KTsKK30KKwordm9pZCBjZW5zdXNfdHJhY2luZ19pbml0KHZvaWQpIHsKKyAgaW5pdF9tdXRleF9vbmNlKCk7CisgIGdwcl9tdV9sb2NrKCZnX211KTsKKyAgaWYgKGdfdHJhY2Vfc3RvcmUgPT0gTlVMTCkgeworICAgIGdfaWQgPSAxOworICAgIGdfdHJhY2Vfc3RvcmUgPSBjZW5zdXNfaHRfY3JlYXRlKCZodF9vcHQpOworICB9IGVsc2UgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2Vuc3VzIHRyYWNlIHN0b3JlIGFscmVhZHkgaW5pdGlhbGl6ZWQuIik7CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19tdSk7Cit9CisKK3ZvaWQgY2Vuc3VzX3RyYWNpbmdfc2h1dGRvd24odm9pZCkgeworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGlmIChnX3RyYWNlX3N0b3JlICE9IE5VTEwpIHsKKyAgICBjZW5zdXNfaHRfZGVzdHJveShnX3RyYWNlX3N0b3JlKTsKKyAgICBnX3RyYWNlX3N0b3JlID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNlbnN1cyB0cmFjZSBzdG9yZSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19tdSk7Cit9CisKK3ZvaWQgY2Vuc3VzX2ludGVybmFsX2xvY2tfdHJhY2Vfc3RvcmUodm9pZCkgeyBncHJfbXVfbG9jaygmZ19tdSk7IH0KKwordm9pZCBjZW5zdXNfaW50ZXJuYWxfdW5sb2NrX3RyYWNlX3N0b3JlKHZvaWQpIHsgZ3ByX211X3VubG9jaygmZ19tdSk7IH0KKworY2Vuc3VzX3RyYWNlX29iaiAqY2Vuc3VzX2dldF90cmFjZV9vYmpfbG9ja2VkKGNlbnN1c19vcF9pZCBvcF9pZCkgeworICBpZiAoZ190cmFjZV9zdG9yZSA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDZW5zdXMgdHJhY2Ugc3RvcmUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAoY2Vuc3VzX3RyYWNlX29iaiAqKWNlbnN1c19odF9maW5kKGdfdHJhY2Vfc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2lkX2FzX2tleSgmb3BfaWQpKTsKK30KKworY29uc3QgY2hhciAqY2Vuc3VzX2dldF90cmFjZV9tZXRob2RfbmFtZShjb25zdCBjZW5zdXNfdHJhY2Vfb2JqICp0cmFjZSkgeworICByZXR1cm4gdHJhY2UtPm1ldGhvZDsKK30KKworc3RhdGljIGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpkdXBfYW5ub3RhdGlvbl9jaGFpbigKKyAgICBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbiAqZnJvbSkgeworICBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbiAqcmV0ID0gTlVMTDsKKyAgY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24gKip0byA9ICZyZXQ7CisgIGZvciAoOyBmcm9tICE9IE5VTEw7IGZyb20gPSBmcm9tLT5uZXh0KSB7CisgICAgKnRvID0gZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24pKTsKKyAgICBtZW1jcHkoKnRvLCBmcm9tLCBzaXplb2YoY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24pKTsKKyAgICB0byA9ICYoKnRvKS0+bmV4dDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2Vuc3VzX3RyYWNlX29iaiAqdHJhY2Vfb2JqX2R1cChjZW5zdXNfdHJhY2Vfb2JqICpmcm9tKSB7CisgIGNlbnN1c190cmFjZV9vYmogKnRvID0gTlVMTDsKKyAgR1BSX0FTU0VSVChmcm9tICE9IE5VTEwpOworICB0byA9IGdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c190cmFjZV9vYmopKTsKKyAgdG8tPmlkID0gZnJvbS0+aWQ7CisgIHRvLT50cyA9IGZyb20tPnRzOworICB0by0+cnBjX3N0YXRzID0gZnJvbS0+cnBjX3N0YXRzOworICB0by0+bWV0aG9kID0gZ3ByX3N0cmR1cChmcm9tLT5tZXRob2QpOworICB0by0+YW5ub3RhdGlvbnMgPSBkdXBfYW5ub3RhdGlvbl9jaGFpbihmcm9tLT5hbm5vdGF0aW9ucyk7CisgIHJldHVybiB0bzsKK30KKworY2Vuc3VzX3RyYWNlX29iaiAqKmNlbnN1c19nZXRfYWN0aXZlX29wcyhpbnQgKm51bV9hY3RpdmVfb3BzKSB7CisgIGNlbnN1c190cmFjZV9vYmogKipyZXQgPSBOVUxMOworICBncHJfbXVfbG9jaygmZ19tdSk7CisgIGlmIChnX3RyYWNlX3N0b3JlICE9IE5VTEwpIHsKKyAgICBzaXplX3QgbiA9IDA7CisgICAgY2Vuc3VzX2h0X2t2ICphbGxfa3ZzID0gY2Vuc3VzX2h0X2dldF9hbGxfZWxlbWVudHMoZ190cmFjZV9zdG9yZSwgJm4pOworICAgICpudW1fYWN0aXZlX29wcyA9IChpbnQpbjsKKyAgICBpZiAobiAhPSAwKSB7CisgICAgICBzaXplX3QgaSA9IDA7CisgICAgICByZXQgPSBncHJfbWFsbG9jKHNpemVvZihjZW5zdXNfdHJhY2Vfb2JqICopICogbik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHJldFtpXSA9IHRyYWNlX29ial9kdXAoKGNlbnN1c190cmFjZV9vYmogKilhbGxfa3ZzW2ldLnYpOworICAgICAgfQorICAgIH0KKyAgICBncHJfZnJlZShhbGxfa3ZzKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX211KTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmggYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDFhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19UUkFDSU5HX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX0NFTlNVU19UUkFDSU5HX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIgorCisvKiBXQVJOSU5HOiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBBUElzIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBhcmUgZm9yIEdSUEMKKyAgIGxpYnJhcnkncyBpbnRlcm5hbCB1c2UgT05MWS4gVGhleSBtaWdodCBiZSBjaGFuZ2VkIGluIGJhY2t3YXJkLWluY29tcGF0aWJsZQorICAgd2F5cyBhbmQgYXJlIG5vdCBzdWJqZWN0IHRvIGFueSBkZXByZWNhdGlvbiBwb2xpY3kuCisgICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIGV4dGVybmFsIHVzZS4KKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBTdHJ1Y3QgZm9yIGEgdHJhY2UgYW5ub3RhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IGNlbnN1c190cmFjZV9hbm5vdGF0aW9uIHsKKyAgZ3ByX3RpbWVzcGVjIHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lc3RhbXAgb2YgdGhlIGFubm90YXRpb24gKi8KKyAgY2hhciB0eHRbQ0VOU1VTX01BWF9BTk5PVEFUSU9OX0xFTkdUSCArIDFdOyAvKiBhY3R1YWwgdHh0IGFubm90YXRpb24gKi8KKyAgc3RydWN0IGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpuZXh0OworfSBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3RyYWNlX29iaiB7CisgIGNlbnN1c19vcF9pZCBpZDsKKyAgZ3ByX3RpbWVzcGVjIHRzOworICBjZW5zdXNfcnBjX3N0YXRzIHJwY19zdGF0czsKKyAgY2hhciAqbWV0aG9kOworICBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbiAqYW5ub3RhdGlvbnM7Cit9IGNlbnN1c190cmFjZV9vYmo7CisKKy8qIERlbGV0ZXMgdHJhY2Ugb2JqZWN0LiAqLwordm9pZCBjZW5zdXNfdHJhY2Vfb2JqX2Rlc3Ryb3koY2Vuc3VzX3RyYWNlX29iaiAqb2JqKTsKKworLyogSW5pdGlhbGl6ZXMgdHJhY2Ugc3RvcmUuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkIHNhZmUuICovCit2b2lkIGNlbnN1c190cmFjaW5nX2luaXQodm9pZCk7CisKKy8qIFNodXRzZG93biB0cmFjZSBzdG9yZS4gVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQgc2FmZS4gKi8KK3ZvaWQgY2Vuc3VzX3RyYWNpbmdfc2h1dGRvd24odm9pZCk7CisKKy8qIEdldHMgdHJhY2Ugb2JqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IG9wX2lkLiBSZXR1cm5zIE5VTEwgaWYgdHJhY2Ugc3RvcmUKKyAgIGlzIG5vdCBpbml0aWFsaXplZCBvciB0cmFjZSBvYmogaXMgbm90IGZvdW5kLiBSZXF1aXJlcyB0cmFjZSBzdG9yZSBiZWluZworICAgbG9ja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICovCitjZW5zdXNfdHJhY2Vfb2JqICpjZW5zdXNfZ2V0X3RyYWNlX29ial9sb2NrZWQoY2Vuc3VzX29wX2lkIG9wX2lkKTsKKworLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFjcXVpcmUgYW5kIHJlbGVhc2UgdGhlIHRyYWNlIHN0b3JlIGdsb2JhbCBsb2NrLgorICAgVGhleSBhcmUgZm9yIGNlbnN1cyBpbnRlcm5hbCB1c2Ugb25seS4gKi8KK3ZvaWQgY2Vuc3VzX2ludGVybmFsX2xvY2tfdHJhY2Vfc3RvcmUodm9pZCk7Cit2b2lkIGNlbnN1c19pbnRlcm5hbF91bmxvY2tfdHJhY2Vfc3RvcmUodm9pZCk7CisKKy8qIEdldHMgbWV0aG9kIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCB0cmFjZSBvYmplY3QuICovCitjb25zdCBjaGFyICpjZW5zdXNfZ2V0X3RyYWNlX21ldGhvZF9uYW1lKGNvbnN0IGNlbnN1c190cmFjZV9vYmogKnRyYWNlKTsKKworLyogUmV0dXJucyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0cmFjZSBvYmplY3RzIG9mIGN1cnJlbnRseSBhY3RpdmUgb3BlcmF0aW9ucworICAgYW5kIGZpbGxzIGluIG51bWJlciBvZiBhY3RpdmUgb3BlcmF0aW9ucy4gUmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUKKyAgIG9wZXJhdGlvbnMuCisgICBDYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgb2JqZWN0cy4gKi8KK2NlbnN1c190cmFjZV9vYmogKipjZW5zdXNfZ2V0X2FjdGl2ZV9vcHMoaW50ICpudW1fYWN0aXZlX29wcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfQ0VOU1VTX1RSQUNJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvaGFzaF90YWJsZS5jIGIvc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvaGFzaF90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Yjc0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNkZWZpbmUgQ0VOU1VTX0hUX05VTV9CVUNLRVRTIDE5OTkKKworLyogQSBzaW5nbGUgaGFzaCB0YWJsZSBkYXRhIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBodF9lbnRyeSB7CisgIGNlbnN1c19odF9rZXkga2V5OworICB2b2lkICpkYXRhOworICBzdHJ1Y3QgaHRfZW50cnkgKm5leHQ7Cit9IGh0X2VudHJ5OworCisvKiBoYXNoIHRhYmxlIGJ1Y2tldCAqLwordHlwZWRlZiBzdHJ1Y3QgYnVja2V0IHsKKyAgLyogTlVMTCBpZiBidWNrZXQgaXMgZW1wdHkgKi8KKyAgaHRfZW50cnkgKm5leHQ7CisgIC8qIC0xIGlmIGFsbCBidWNrZXRzIGFyZSBlbXB0eS4gKi8KKyAgaW50MzJfdCBwcmV2X25vbl9lbXB0eV9idWNrZXQ7CisgIC8qIC0xIGlmIGFsbCBidWNrZXRzIGFyZSBlbXB0eS4gKi8KKyAgaW50MzJfdCBuZXh0X25vbl9lbXB0eV9idWNrZXQ7Cit9IGJ1Y2tldDsKKworc3RydWN0IHVucmVzaXphYmxlX2hhc2hfdGFibGUgeworICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUgKi8KKyAgc2l6ZV90IHNpemU7CisgIC8qIE51bWJlciBvZiBidWNrZXRzICovCisgIHVpbnQzMl90IG51bV9idWNrZXRzOworICAvKiBBcnJheSBvZiBidWNrZXRzIGluaXRpYWxpemVkIGF0IGNyZWF0aW9uIHRpbWUuIE1lbW9yeSBjb25zdW1wdGlvbiBpcworICAgICAxNiBieXRlcyBwZXIgYnVja2V0IG9uIGEgNjQtYml0IHBsYXRmb3JtLiAqLworICBidWNrZXQgKmJ1Y2tldHM7CisgIC8qIEluZGV4IG9mIHRoZSBmaXJzdCBub24tZW1wdHkgYnVja2V0LiAtMSBpZmYgc2l6ZSA9PSAwLiAqLworICBpbnQzMl90IGZpcnN0X25vbl9lbXB0eV9idWNrZXQ7CisgIC8qIEluZGV4IG9mIHRoZSBsYXN0IG5vbl9lbXB0eSBidWNrZXQuIC0xIGlmZiBzaXplID09IDAuICovCisgIGludDMyX3QgbGFzdF9ub25fZW1wdHlfYnVja2V0OworICAvKiBJbW11dGFibGUgb3B0aW9ucyBvZiB0aGlzIGhhc2ggdGFibGUsIGluaXRpYWxpemVkIGF0IGNyZWF0aW9uIHRpbWUuICovCisgIGNlbnN1c19odF9vcHRpb24gb3B0aW9uczsKK307CisKK3R5cGVkZWYgc3RydWN0IGVudHJ5X2xvY2F0b3IgeworICBpbnQzMl90IGJ1Y2tldF9pZHg7CisgIGludCBpc19maXJzdF9pbl9jaGFpbjsKKyAgaW50IGZvdW5kOworICBodF9lbnRyeSAqcHJldl9lbnRyeTsKK30gZW50cnlfbG9jYXRvcjsKKworLyogQXNzZXJ0cyBpZiBvcHRpb24gaXMgbm90IHZhbGlkLiAqLwordm9pZCBjaGVja19vcHRpb25zKGNvbnN0IGNlbnN1c19odF9vcHRpb24gKm9wdGlvbikgeworICBHUFJfQVNTRVJUKG9wdGlvbiAhPSBOVUxMKTsKKyAgR1BSX0FTU0VSVChvcHRpb24tPm51bV9idWNrZXRzID4gMCk7CisgIEdQUl9BU1NFUlQob3B0aW9uLT5rZXlfdHlwZSA9PSBDRU5TVVNfSFRfVUlOVDY0IHx8CisgICAgICAgICAgICAgb3B0aW9uLT5rZXlfdHlwZSA9PSBDRU5TVVNfSFRfUE9JTlRFUik7CisgIGlmIChvcHRpb24tPmtleV90eXBlID09IENFTlNVU19IVF9VSU5UNjQpIHsKKyAgICBHUFJfQVNTRVJUKG9wdGlvbi0+aGFzaCA9PSBOVUxMKTsKKyAgfSBlbHNlIGlmIChvcHRpb24tPmtleV90eXBlID09IENFTlNVU19IVF9QT0lOVEVSKSB7CisgICAgR1BSX0FTU0VSVChvcHRpb24tPmhhc2ggIT0gTlVMTCk7CisgICAgR1BSX0FTU0VSVChvcHRpb24tPmNvbXBhcmVfa2V5cyAhPSBOVUxMKTsKKyAgfQorfQorCisjZGVmaW5lIFJFTU9WRV9ORVhUKG9wdGlvbnMsIHB0cikgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBodF9lbnRyeSAqdG1wID0gKHB0ciktPm5leHQ7ICBcCisgICAgKHB0ciktPm5leHQgPSB0bXAtPm5leHQ7ICAgICAgXAorICAgIGRlbGV0ZV9lbnRyeShvcHRpb25zLCB0bXApOyAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZGVsZXRlX2VudHJ5KGNvbnN0IGNlbnN1c19odF9vcHRpb24gKm9wdCwgaHRfZW50cnkgKnApIHsKKyAgaWYgKG9wdC0+ZGVsZXRlX2RhdGEgIT0gTlVMTCkgeworICAgIG9wdC0+ZGVsZXRlX2RhdGEocC0+ZGF0YSk7CisgIH0KKyAgaWYgKG9wdC0+ZGVsZXRlX2tleSAhPSBOVUxMKSB7CisgICAgb3B0LT5kZWxldGVfa2V5KHAtPmtleS5wdHIpOworICB9CisgIGdwcl9mcmVlKHApOworfQorCitzdGF0aWMgdWludDY0X3QgaGFzaChjb25zdCBjZW5zdXNfaHRfb3B0aW9uICpvcHQsIGNlbnN1c19odF9rZXkga2V5KSB7CisgIHJldHVybiBvcHQtPmtleV90eXBlID09IENFTlNVU19IVF9VSU5UNjQgPyBrZXkudmFsIDogb3B0LT5oYXNoKGtleS5wdHIpOworfQorCitjZW5zdXNfaHQgKmNlbnN1c19odF9jcmVhdGUoY29uc3QgY2Vuc3VzX2h0X29wdGlvbiAqb3B0aW9uKSB7CisgIGludCBpOworICBjZW5zdXNfaHQgKnJldCA9IE5VTEw7CisgIGNoZWNrX29wdGlvbnMob3B0aW9uKTsKKyAgcmV0ID0gKGNlbnN1c19odCAqKWdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c19odCkpOworICByZXQtPnNpemUgPSAwOworICByZXQtPm51bV9idWNrZXRzID0gb3B0aW9uLT5udW1fYnVja2V0czsKKyAgcmV0LT5idWNrZXRzID0gKGJ1Y2tldCAqKWdwcl9tYWxsb2Moc2l6ZW9mKGJ1Y2tldCkgKiByZXQtPm51bV9idWNrZXRzKTsKKyAgcmV0LT5vcHRpb25zID0gKm9wdGlvbjsKKyAgLyogaW5pdGlhbGl6ZSBlYWNoIGJ1Y2tldCAqLworICBmb3IgKGkgPSAwOyBpIDwgcmV0LT5vcHRpb25zLm51bV9idWNrZXRzOyBpKyspIHsKKyAgICByZXQtPmJ1Y2tldHNbaV0ucHJldl9ub25fZW1wdHlfYnVja2V0ID0gLTE7CisgICAgcmV0LT5idWNrZXRzW2ldLm5leHRfbm9uX2VtcHR5X2J1Y2tldCA9IC0xOworICAgIHJldC0+YnVja2V0c1tpXS5uZXh0ID0gTlVMTDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50MzJfdCBmaW5kX2J1Y2tldF9pZHgoY29uc3QgY2Vuc3VzX2h0ICpodCwgY2Vuc3VzX2h0X2tleSBrZXkpIHsKKyAgcmV0dXJuIGhhc2goJmh0LT5vcHRpb25zLCBrZXkpICUgaHQtPm51bV9idWNrZXRzOworfQorCitzdGF0aWMgaW50IGtleXNfbWF0Y2goY29uc3QgY2Vuc3VzX2h0X29wdGlvbiAqb3B0LCBjb25zdCBodF9lbnRyeSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW5zdXNfaHRfa2V5IGtleSkgeworICBHUFJfQVNTRVJUKG9wdC0+a2V5X3R5cGUgPT0gQ0VOU1VTX0hUX1VJTlQ2NCB8fAorICAgICAgICAgICAgIG9wdC0+a2V5X3R5cGUgPT0gQ0VOU1VTX0hUX1BPSU5URVIpOworICBpZiAob3B0LT5rZXlfdHlwZSA9PSBDRU5TVVNfSFRfVUlOVDY0KSByZXR1cm4gcC0+a2V5LnZhbCA9PSBrZXkudmFsOworICByZXR1cm4gIW9wdC0+Y29tcGFyZV9rZXlzKChwLT5rZXkpLnB0ciwga2V5LnB0cik7Cit9CisKK3N0YXRpYyBlbnRyeV9sb2NhdG9yIGh0X2ZpbmQoY29uc3QgY2Vuc3VzX2h0ICpodCwgY2Vuc3VzX2h0X2tleSBrZXkpIHsKKyAgZW50cnlfbG9jYXRvciBsb2MgPSB7MCwgMCwgMCwgTlVMTH07CisgIGludDMyX3QgaWR4ID0gMDsKKyAgaHRfZW50cnkgKnB0ciA9IE5VTEw7CisgIEdQUl9BU1NFUlQoaHQgIT0gTlVMTCk7CisgIGlkeCA9IGZpbmRfYnVja2V0X2lkeChodCwga2V5KTsKKyAgcHRyID0gaHQtPmJ1Y2tldHNbaWR4XS5uZXh0OworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICAvKiBidWNrZXQgaXMgZW1wdHkgKi8KKyAgICByZXR1cm4gbG9jOworICB9CisgIGlmIChrZXlzX21hdGNoKCZodC0+b3B0aW9ucywgcHRyLCBrZXkpKSB7CisgICAgbG9jLmJ1Y2tldF9pZHggPSBpZHg7CisgICAgbG9jLmlzX2ZpcnN0X2luX2NoYWluID0gMTsKKyAgICBsb2MuZm91bmQgPSAxOworICAgIHJldHVybiBsb2M7CisgIH0gZWxzZSB7CisgICAgZm9yICg7IHB0ci0+bmV4dCAhPSBOVUxMOyBwdHIgPSBwdHItPm5leHQpIHsKKyAgICAgIGlmIChrZXlzX21hdGNoKCZodC0+b3B0aW9ucywgcHRyLT5uZXh0LCBrZXkpKSB7CisgICAgICAgIGxvYy5idWNrZXRfaWR4ID0gaWR4OworICAgICAgICBsb2MuaXNfZmlyc3RfaW5fY2hhaW4gPSAwOworICAgICAgICBsb2MuZm91bmQgPSAxOworICAgICAgICBsb2MucHJldl9lbnRyeSA9IHB0cjsKKyAgICAgICAgcmV0dXJuIGxvYzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQ291bGQgbm90IGZpbmQgdGhlIGtleSAqLworICByZXR1cm4gbG9jOworfQorCit2b2lkICpjZW5zdXNfaHRfZmluZChjb25zdCBjZW5zdXNfaHQgKmh0LCBjZW5zdXNfaHRfa2V5IGtleSkgeworICBlbnRyeV9sb2NhdG9yIGxvYyA9IGh0X2ZpbmQoaHQsIGtleSk7CisgIGlmIChsb2MuZm91bmQgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBsb2MuaXNfZmlyc3RfaW5fY2hhaW4gPyBodC0+YnVja2V0c1tsb2MuYnVja2V0X2lkeF0ubmV4dC0+ZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9jLnByZXZfZW50cnktPm5leHQtPmRhdGE7Cit9CisKK3ZvaWQgY2Vuc3VzX2h0X2luc2VydChjZW5zdXNfaHQgKmh0LCBjZW5zdXNfaHRfa2V5IGtleSwgdm9pZCAqZGF0YSkgeworICBpbnQzMl90IGlkeCA9IGZpbmRfYnVja2V0X2lkeChodCwga2V5KTsKKyAgaHRfZW50cnkgKnB0ciA9IE5VTEw7CisgIGVudHJ5X2xvY2F0b3IgbG9jID0gaHRfZmluZChodCwga2V5KTsKKyAgaWYgKGxvYy5mb3VuZCkgeworICAgIC8qIFJlcGxhY2Ugb2xkIHZhbHVlIHdpdGggbmV3IHZhbHVlLiAqLworICAgIHB0ciA9IGxvYy5pc19maXJzdF9pbl9jaGFpbiA/IGh0LT5idWNrZXRzW2xvYy5idWNrZXRfaWR4XS5uZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9jLnByZXZfZW50cnktPm5leHQ7CisgICAgaWYgKGh0LT5vcHRpb25zLmRlbGV0ZV9kYXRhICE9IE5VTEwpIHsKKyAgICAgIGh0LT5vcHRpb25zLmRlbGV0ZV9kYXRhKHB0ci0+ZGF0YSk7CisgICAgfQorICAgIHB0ci0+ZGF0YSA9IGRhdGE7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlLiAqLworICBpZiAoaHQtPnNpemUgPT0gMCkgeworICAgIGh0LT5idWNrZXRzW2lkeF0ubmV4dF9ub25fZW1wdHlfYnVja2V0ID0gLTE7CisgICAgaHQtPmJ1Y2tldHNbaWR4XS5wcmV2X25vbl9lbXB0eV9idWNrZXQgPSAtMTsKKyAgICBodC0+Zmlyc3Rfbm9uX2VtcHR5X2J1Y2tldCA9IGlkeDsKKyAgICBodC0+bGFzdF9ub25fZW1wdHlfYnVja2V0ID0gaWR4OworICB9IGVsc2UgaWYgKGh0LT5idWNrZXRzW2lkeF0ubmV4dCA9PSBOVUxMKSB7CisgICAgLyogZmlyc3QgZW50cnkgaW4gdGhlIGJ1Y2tldC4gKi8KKyAgICBodC0+YnVja2V0c1todC0+bGFzdF9ub25fZW1wdHlfYnVja2V0XS5uZXh0X25vbl9lbXB0eV9idWNrZXQgPSBpZHg7CisgICAgaHQtPmJ1Y2tldHNbaWR4XS5wcmV2X25vbl9lbXB0eV9idWNrZXQgPSBodC0+bGFzdF9ub25fZW1wdHlfYnVja2V0OworICAgIGh0LT5idWNrZXRzW2lkeF0ubmV4dF9ub25fZW1wdHlfYnVja2V0ID0gLTE7CisgICAgaHQtPmxhc3Rfbm9uX2VtcHR5X2J1Y2tldCA9IGlkeDsKKyAgfQorICBwdHIgPSAoaHRfZW50cnkgKilncHJfbWFsbG9jKHNpemVvZihodF9lbnRyeSkpOworICBwdHItPmtleSA9IGtleTsKKyAgcHRyLT5kYXRhID0gZGF0YTsKKyAgcHRyLT5uZXh0ID0gaHQtPmJ1Y2tldHNbaWR4XS5uZXh0OworICBodC0+YnVja2V0c1tpZHhdLm5leHQgPSBwdHI7CisgIGh0LT5zaXplKys7Cit9CisKK3ZvaWQgY2Vuc3VzX2h0X2VyYXNlKGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9rZXkga2V5KSB7CisgIGVudHJ5X2xvY2F0b3IgbG9jID0gaHRfZmluZChodCwga2V5KTsKKyAgaWYgKGxvYy5mb3VuZCA9PSAwKSB7CisgICAgLyogbm9vcCBpZiBub3QgZm91bmQgKi8KKyAgICByZXR1cm47CisgIH0KKyAgaHQtPnNpemUtLTsKKyAgaWYgKGxvYy5pc19maXJzdF9pbl9jaGFpbikgeworICAgIGJ1Y2tldCAqYiA9ICZodC0+YnVja2V0c1tsb2MuYnVja2V0X2lkeF07CisgICAgR1BSX0FTU0VSVChiLT5uZXh0ICE9IE5VTEwpOworICAgIC8qIFRoZSBvbmx5IGVudHJ5IGluIHRoZSBidWNrZXQgKi8KKyAgICBpZiAoYi0+bmV4dC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICBpbnQgcHJldiA9IGItPnByZXZfbm9uX2VtcHR5X2J1Y2tldDsKKyAgICAgIGludCBuZXh0ID0gYi0+bmV4dF9ub25fZW1wdHlfYnVja2V0OworICAgICAgaWYgKHByZXYgIT0gLTEpIHsKKyAgICAgICAgaHQtPmJ1Y2tldHNbcHJldl0ubmV4dF9ub25fZW1wdHlfYnVja2V0ID0gbmV4dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGh0LT5maXJzdF9ub25fZW1wdHlfYnVja2V0ID0gbmV4dDsKKyAgICAgIH0KKyAgICAgIGlmIChuZXh0ICE9IC0xKSB7CisgICAgICAgIGh0LT5idWNrZXRzW25leHRdLnByZXZfbm9uX2VtcHR5X2J1Y2tldCA9IHByZXY7CisgICAgICB9IGVsc2UgeworICAgICAgICBodC0+bGFzdF9ub25fZW1wdHlfYnVja2V0ID0gcHJldjsKKyAgICAgIH0KKyAgICB9CisgICAgUkVNT1ZFX05FWFQoJmh0LT5vcHRpb25zLCBiKTsKKyAgfSBlbHNlIHsKKyAgICBHUFJfQVNTRVJUKGxvYy5wcmV2X2VudHJ5LT5uZXh0ICE9IE5VTEwpOworICAgIFJFTU9WRV9ORVhUKCZodC0+b3B0aW9ucywgbG9jLnByZXZfZW50cnkpOworICB9Cit9CisKKy8qIFJldHVybnMgTlVMTCBpZiBpbnB1dCB0YWJsZSBpcyBlbXB0eS4gKi8KK2NlbnN1c19odF9rdiAqY2Vuc3VzX2h0X2dldF9hbGxfZWxlbWVudHMoY29uc3QgY2Vuc3VzX2h0ICpodCwgc2l6ZV90ICpudW0pIHsKKyAgY2Vuc3VzX2h0X2t2ICpyZXQgPSBOVUxMOworICBpbnQgaSA9IDA7CisgIGludDMyX3QgaWR4ID0gLTE7CisgIEdQUl9BU1NFUlQoaHQgIT0gTlVMTCAmJiBudW0gIT0gTlVMTCk7CisgICpudW0gPSBodC0+c2l6ZTsKKyAgaWYgKCpudW0gPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0ID0gKGNlbnN1c19odF9rdiAqKWdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c19odF9rdikgKiBodC0+c2l6ZSk7CisgIGlkeCA9IGh0LT5maXJzdF9ub25fZW1wdHlfYnVja2V0OworICB3aGlsZSAoaWR4ID49IDApIHsKKyAgICBodF9lbnRyeSAqcHRyID0gaHQtPmJ1Y2tldHNbaWR4XS5uZXh0OworICAgIGZvciAoOyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5uZXh0KSB7CisgICAgICByZXRbaV0uayA9IHB0ci0+a2V5OworICAgICAgcmV0W2ldLnYgPSBwdHItPmRhdGE7CisgICAgICBpKys7CisgICAgfQorICAgIGlkeCA9IGh0LT5idWNrZXRzW2lkeF0ubmV4dF9ub25fZW1wdHlfYnVja2V0OworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGh0X2RlbGV0ZV9lbnRyeV9jaGFpbihjb25zdCBjZW5zdXNfaHRfb3B0aW9uICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0X2VudHJ5ICpmaXJzdCkgeworICBpZiAoZmlyc3QgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZmlyc3QtPm5leHQgIT0gTlVMTCkgeworICAgIGh0X2RlbGV0ZV9lbnRyeV9jaGFpbihvcHRpb25zLCBmaXJzdC0+bmV4dCk7CisgIH0KKyAgZGVsZXRlX2VudHJ5KG9wdGlvbnMsIGZpcnN0KTsKK30KKwordm9pZCBjZW5zdXNfaHRfZGVzdHJveShjZW5zdXNfaHQgKmh0KSB7CisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IDA7IGkgPCBodC0+bnVtX2J1Y2tldHM7ICsraSkgeworICAgIGh0X2RlbGV0ZV9lbnRyeV9jaGFpbigmaHQtPm9wdGlvbnMsIGh0LT5idWNrZXRzW2ldLm5leHQpOworICB9CisgIGdwcl9mcmVlKGh0LT5idWNrZXRzKTsKKyAgZ3ByX2ZyZWUoaHQpOworfQorCitzaXplX3QgY2Vuc3VzX2h0X2dldF9zaXplKGNvbnN0IGNlbnN1c19odCAqaHQpIHsgcmV0dXJuIGh0LT5zaXplOyB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmggYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3NGVjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2hhc2hfdGFibGUuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfSEFTSF9UQUJMRV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1RBVElTVElDU19IQVNIX1RBQkxFX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworLyogQSBjaGFpbiBiYXNlZCBoYXNoIHRhYmxlIHdpdGggZml4ZWQgbnVtYmVyIG9mIGJ1Y2tldHMuCisgICBZb3VyIHByb2JhYmx5IHNob3VsZG4ndCB1c2UgdGhpcyBjb2RlIGRpcmVjdGx5LiBJdCBpcyBpbXBsZW1lbnRlZCBmb3IgdGhlCisgICB1c2UgY2FzZSBpbiBjZW5zdXMgdHJhY2Ugc3RvcmUgYW5kIHN0YXRzIHN0b3JlLCB3aGVyZSBudW1iZXIgb2YgZW50cmllcyBpbgorICAgdGhlIHRhYmxlIGlzIGluIHRoZSBzY2FsZSBvZiB1cHRvIHNldmVyYWwgdGhvdXNhbmRzLCBlbnRyaWVzIGFyZSBhZGRlZCBhbmQKKyAgIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUgdmVyeSBmcmVxdWVudGx5ICh+MTAway9zKSwgdGhlIGZyZXF1ZW5jeSBvZiBmaW5kKCkKKyAgIG9wZXJhdGlvbnMgaXMgcm91Z2hseSBzZXZlcmFsIHRpbWVzIG9mIHRoZSBmcmVxdWVuY3kgb2YgaW5zZXJ0KCkgYW5kIGVyYXNlKCkKKyAgIENvbXBhcmluZyB0byBmaW5kKCksIHRoZSBpbnNlcnQoKSwgZXJhc2UoKSBhbmQgZ2V0X2FsbF9lbnRyaWVzKCkgb3BlcmF0aW9ucworICAgYXJlIG11Y2ggbGVzcyBmcmVxZW50ICg8MS9zKS4KKworICAgUGVyIGJ1Y2tldCBtZW1vcnkgb3ZlcmhlYWQgaXMgYWJvdXQgKDggKyBzaXplb2YoaW50cHRyX3QpIGJ5dGVzLgorICAgUGVyIGVudHJ5IG1lbW9yeSBvdmVyaGVhZCBpcyBhYm91dCAoOCArIDIgKiBzaXplb2YoaW50cHRyX3QpIGJ5dGVzLgorCisgICBBbGwgZnVuY3Rpb25zIGFyZSBub3QgdGhyZWFkLXNhZmUuIFN5bmNocm9uaXphdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGluIHRoZQorICAgdXBwZXIgbGF5ZXIgKGluIHRyYWNlIHN0b3JlIGFuZCBzdGF0cyBzdG9yZSkuCisqLworCisvKiBPcGFxdWUgaGFzaCB0YWJsZSBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0IHVucmVzaXphYmxlX2hhc2hfdGFibGUgY2Vuc3VzX2h0OworCisvKiBDdXJyZW50bHksIHRoZSBoYXNoX3RhYmxlIGNhbiB0YWtlIHR3byB0eXBlcyBvZiBrZXlzLiAodWludDY0IGZvciB0cmFjZQorICAgc3RvcmUgYW5kIGNvbnN0IGNoYXIqIGZvciBzdGF0cyBzdG9yZSkuICovCit0eXBlZGVmIHVuaW9uIHsKKyAgdWludDY0X3QgdmFsOworICB2b2lkICpwdHI7Cit9IGNlbnN1c19odF9rZXk7CisKK3R5cGVkZWYgZW51bSBjZW5zdXNfaHRfa2V5X3R5cGUgeworICBDRU5TVVNfSFRfVUlOVDY0ID0gMCwKKyAgQ0VOU1VTX0hUX1BPSU5URVIgPSAxCit9IGNlbnN1c19odF9rZXlfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2h0X29wdGlvbiB7CisgIC8qIFR5cGUgb2YgaGFzaCBrZXkgKi8KKyAgY2Vuc3VzX2h0X2tleV90eXBlIGtleV90eXBlOworICAvKiBEZXNpcmVkIG51bWJlciBvZiBidWNrZXRzLCBwcmVmZXJhYmx5IGEgcHJpbWUgbnVtYmVyICovCisgIGludDMyX3QgbnVtX2J1Y2tldHM7CisgIC8qIEZ1Y250aW9uIHRvIGNhbGN1bGF0ZSB1aW50NjQgaGFzaCB2YWx1ZSBvZiB0aGUga2V5LiBPbmx5IHRha2VzIGVmZmVjdCBpZgorICAgICBrZXlfdHlwZSBpcyBQT0lOVEVSLiAqLworICB1aW50NjRfdCAoKmhhc2gpKGNvbnN0IHZvaWQgKik7CisgIC8qIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIGtleXMsIHJldHVybnMgMCBpZmYgZXF1YWwuIE9ubHkgdGFrZXMgZWZmZWN0IGlmCisgICAgIGtleV90eXBlIGlzIFBPSU5URVIgKi8KKyAgaW50ICgqY29tcGFyZV9rZXlzKShjb25zdCB2b2lkICprMSwgY29uc3Qgdm9pZCAqazIpOworICAvKiBWYWx1ZSBkZWxldGVyLiBOVUxMIGlmIG5vIHNwZWNpYWxpemVkIGRlbGV0ZSBmdW5jdGlvbiBpcyBuZWVkZWQuICovCisgIHZvaWQgKCpkZWxldGVfZGF0YSkodm9pZCAqKTsKKyAgLyogS2V5IGRlbGV0ZXIuIE5VTEwgaWYgdGFibGUgZG9lcyBub3Qgb3duIHRoZSBrZXkuIChlLmcuIGtleSBpcyBwYXJ0IG9mIHRoZQorICAgICB2YWx1ZSBvciBrZXkgaXMgbm90IG93bmVkIGJ5IHRoZSB0YWJsZS4pICovCisgIHZvaWQgKCpkZWxldGVfa2V5KSh2b2lkICopOworfSBjZW5zdXNfaHRfb3B0aW9uOworCisvKiBDcmVhdGVzIGEgaGFzaHRhYmxlIHdpdGggZml4ZWQgbnVtYmVyIG9mIGJ1Y2tldHMgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncworICAgc3BlY2lmaWVkIGluICdvcHRpb25zJyBhcmcuIEZ1bmN0aW9uIHBvaW50ZXJzICJoYXNoIiBhbmQgImNvbXBhcmVfa2V5cyIgbXVzdAorICAgYmUgcHJvdmlkZWQgaWYga2V5X3R5cGUgaXMgUE9JTlRFUi4gQXNzZXJ0cyBpZiBmYWlsIHRvIGNyZWF0ZS4gKi8KK2NlbnN1c19odCAqY2Vuc3VzX2h0X2NyZWF0ZShjb25zdCBjZW5zdXNfaHRfb3B0aW9uICpvcHRpb25zKTsKKworLyogRGVsZXRlcyBoYXNoIHRhYmxlIGluc3RhbmNlLiBGcmVlcyBhbGwgZHluYW1pYyBtZW1vcnkgb3duZWQgYnkgaHQuKi8KK3ZvaWQgY2Vuc3VzX2h0X2Rlc3Ryb3koY2Vuc3VzX2h0ICpodCk7CisKKy8qIEluc2VydHMgdGhlIGlucHV0IGtleS12YWwgcGFpciBpbnRvIGhhc2hfdGFibGUuIElmIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUga2V5CisgICBleGlzdHMgaW4gdGhlIHRhYmxlLCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBpbnB1dAorICAgdmFsLiAqLwordm9pZCBjZW5zdXNfaHRfaW5zZXJ0KGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9rZXkga2V5LCB2b2lkICp2YWwpOworCisvKiBSZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSwgcmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4gKi8KK3ZvaWQgKmNlbnN1c19odF9maW5kKGNvbnN0IGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9rZXkga2V5KTsKKworLyogRXJhc2UgaGFzaCB0YWJsZSBlbnRyeSB3aXRoIGlucHV0IGtleS4gTm9vcCBpZiBrZXkgaXMgbm90IGZvdW5kLiAqLwordm9pZCBjZW5zdXNfaHRfZXJhc2UoY2Vuc3VzX2h0ICpodCwgY2Vuc3VzX2h0X2tleSBrZXkpOworCit0eXBlZGVmIHN0cnVjdCBjZW5zdXNfaHRfa3YgeworICBjZW5zdXNfaHRfa2V5IGs7CisgIHZvaWQgKnY7Cit9IGNlbnN1c19odF9rdjsKKworLyogUmV0dXJucyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBhbGwgdmFsdWVzIGluIHRoZSBoYXNoIHRhYmxlLiBPcmRlciBvZiB0aGUKKyAgIGVsZW1lbnRzIGNhbiBiZSBhcmJpdHJhcnkuIFNldHMgJ251bScgdG8gdGhlIHNpemUgb2YgcmV0dXJuZWQgYXJyYXkuIENhbGxlcgorICAgb3ducyByZXR1cm5lZCBhcnJheS4gKi8KK2NlbnN1c19odF9rdiAqY2Vuc3VzX2h0X2dldF9hbGxfZWxlbWVudHMoY29uc3QgY2Vuc3VzX2h0ICpodCwgc2l6ZV90ICpudW0pOworCisvKiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBrZXB0LiAqLworc2l6ZV90IGNlbnN1c19odF9nZXRfc2l6ZShjb25zdCBjZW5zdXNfaHQgKmh0KTsKKworLyogRnVuY3RvciBhcHBsaWVkIG9uIGVhY2gga2V5LXZhbHVlIHBhaXIgd2hpbGUgaXRlcmF0aW5nIHRocm91Z2ggZW50cmllcyBpbiB0aGUKKyAgIHRhYmxlLiBUaGUgZnVuY3RvciBzaG91bGQgbm90IG11dGF0ZSBkYXRhLiAqLwordHlwZWRlZiB2b2lkICgqY2Vuc3VzX2h0X2l0cl9jYikoY2Vuc3VzX2h0X2tleSBrZXksIGNvbnN0IHZvaWQgKnZhbF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzdGF0ZSk7CisKKy8qIEl0ZXJhdGVzIHRocm91Z2ggYWxsIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgaGFzaF90YWJsZS4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICBzaG91bGQgbm90IGludmFsaWRhdGUgZGF0YSBlbnRyaWVzLiAqLwordWludDY0X3QgY2Vuc3VzX2h0X2Zvcl9hbGwoY29uc3QgY2Vuc3VzX2h0ICpodCwgY2Vuc3VzX2h0X2l0cl9jYik7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfSEFTSF9UQUJMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuYyBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDI3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5oIgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIHR5cGVkZWZzIG1ha2UgdHlwaW5nIGxvbmcgbmFtZXMgZWFzaWVyLiBVc2UgY3dzIChmb3IgY2Vuc3VzX3dpbmRvd19zdGF0cykgKi8KK3R5cGVkZWYgY2Vuc3VzX3dpbmRvd19zdGF0c19zdGF0X2luZm8gY3dzX3N0YXRfaW5mbzsKK3R5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHNfc3VtIGN3c19zdW07CisKKy8qIEVhY2ggaW50ZXJ2YWwgaXMgY29tcG9zZWQgb2YgYSBudW1iZXIgb2YgYnVja2V0cywgd2hpY2ggaG9sZCBhIGNvdW50IG9mCisgICBlbnRyaWVzIGFuZCBhIHNpbmdsZSBzdGF0aXN0aWMgKi8KK3R5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHNfYnVja2V0IHsKKyAgaW50NjRfdCBjb3VudDsKKyAgdm9pZCAqc3RhdGlzdGljOworfSBjd3NfYnVja2V0OworCisvKiBFYWNoIGludGVydmFsIGhhcyBhIHNldCBvZiBidWNrZXRzLCBhbmQgdGhlIHZhcmlhYmxlcyBuZWVkZWQgdG8ga2VlcAorICAgdHJhY2sgb2YgdGhlaXIgY3VycmVudCBzdGF0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0c19pbnRlcnZhbF9zdGF0cyB7CisgIC8qIFRoZSBidWNrZXRzLiBUaGVyZSB3aWxsIGJlICdncmFudWxhcml0eScgKyAxIG9mIHRoZXNlLiAqLworICBjd3NfYnVja2V0ICpidWNrZXRzOworICAvKiBJbmRleCBvZiB0aGUgYnVja2V0IGNvbnRhaW5pbmcgdGhlIHNtYWxsZXN0IHRpbWUgaW50ZXJ2YWwuICovCisgIGludCBib3R0b21fYnVja2V0OworICAvKiBUaGUgc21hbGxlc3QgdGltZSBzdG9yYWJsZSBpbiB0aGUgY3VycmVudCB3aW5kb3cuICovCisgIGludDY0X3QgYm90dG9tOworICAvKiBUaGUgbGFyZ2VzdCB0aW1lIHN0b3JhYmxlIGluIHRoZSBjdXJyZW50IHdpbmRvdyArIDFucyAqLworICBpbnQ2NF90IHRvcDsKKyAgLyogVGhlIHdpZHRoIG9mIGVhY2ggYnVja2V0IGluIG5zLiAqLworICBpbnQ2NF90IHdpZHRoOworfSBjd3NfaW50ZXJ2YWxfc3RhdHM7CisKK3R5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgeworICAvKiBOdW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworICBpbnQgbmludGVydmFsczsKKyAgLyogTnVtYmVyIG9mIGJ1Y2tldHMgaW4gZWFjaCBpbnRlcnZhbC4gJ2dyYW51bGFyaXR5JyArIDEuICovCisgIGludCBuYnVja2V0czsKKyAgLyogUmVjb3JkIG9mIHN0YXRfaW5mby4gKi8KKyAgY3dzX3N0YXRfaW5mbyBzdGF0X2luZm87CisgIC8qIFN0YXRzIGZvciBlYWNoIGludGVydmFsLiAqLworICBjd3NfaW50ZXJ2YWxfc3RhdHMgKmludGVydmFsX3N0YXRzOworICAvKiBUaGUgdGltZSB0aGUgbmV3c2V0IHN0YXQgd2FzIHJlY29yZGVkLiAqLworICBpbnQ2NF90IG5ld2VzdF90aW1lOworfSB3aW5kb3dfc3RhdHM7CisKKy8qIENhbGN1bGF0ZSBhbiBhY3R1YWwgYnVja2V0IGluZGV4IGZyb20gYSBsb2dpY2FsIGluZGV4ICdJRFgnLiBPdGhlcgorICAgcGFyYW1ldGVycyBzdXBwbHkgaW5mb3JtYXRpb24gb24gdGhlIGludGVydmFsIHN0cnVjdCBhbmQgb3ZlcmFsbCBzdGF0cy4gKi8KKyNkZWZpbmUgQlVDS0VUX0lEWChJUywgSURYLCBXU1RBVFMpIFwKKyAgKChJUy0+Ym90dG9tX2J1Y2tldCArIChJRFgpKSAlIFdTVEFUUy0+bmJ1Y2tldHMpCisKKy8qIFRoZSBtYXhpbXVtIHNlY29uZHMgdmFsdWUgd2UgY2FuIGhhdmUgaW4gYSB2YWxpZCB0aW1lc3BlYy4gTW9yZSB0aGFuIHRoaXMKKyAgIHdpbGwgcmVzdWx0IGluIG92ZXJmbG93IGluIHRpbWVzcGVjX3RvX25zKCkuIFRoaXMgd29ya3Mgb3V0IHRvIH4yOTIgeWVhcnMuCisgICBUT0RPOiBjb25zaWRlciB1c2luZyBkb3VibGVzIGluc3RlYWQgb2YgaW50NjQuICovCitzdGF0aWMgaW50NjRfdCBtYXhfc2Vjb25kcyA9IChHUFJfSU5UNjRfTUFYIC0gR1BSX05TX1BFUl9TRUMpIC8gR1BSX05TX1BFUl9TRUM7CisKK3N0YXRpYyBpbnQ2NF90IHRpbWVzcGVjX3RvX25zKGNvbnN0IGdwcl90aW1lc3BlYyB0cykgeworICBpZiAodHMudHZfc2VjID4gbWF4X3NlY29uZHMpIHsKKyAgICByZXR1cm4gR1BSX0lOVDY0X01BWCAtIDE7CisgIH0KKyAgcmV0dXJuIHRzLnR2X3NlYyAqIEdQUl9OU19QRVJfU0VDICsgdHMudHZfbnNlYzsKK30KKworc3RhdGljIHZvaWQgY3dzX2luaXRpYWxpemVfc3RhdGlzdGljKHZvaWQgKnN0YXRpc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjd3Nfc3RhdF9pbmZvICpzdGF0X2luZm8pIHsKKyAgaWYgKHN0YXRfaW5mby0+c3RhdF9pbml0aWFsaXplID09IE5VTEwpIHsKKyAgICBtZW1zZXQoc3RhdGlzdGljLCAwLCBzdGF0X2luZm8tPnN0YXRfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgc3RhdF9pbmZvLT5zdGF0X2luaXRpYWxpemUoc3RhdGlzdGljKTsKKyAgfQorfQorCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBzdGF0aXN0aWMgKi8KK3N0YXRpYyB2b2lkICpjd3NfY3JlYXRlX3N0YXRpc3RpYyhjb25zdCBjd3Nfc3RhdF9pbmZvICpzdGF0X2luZm8pIHsKKyAgdm9pZCAqc3RhdCA9IGdwcl9tYWxsb2Moc3RhdF9pbmZvLT5zdGF0X3NpemUpOworICBjd3NfaW5pdGlhbGl6ZV9zdGF0aXN0aWMoc3RhdCwgc3RhdF9pbmZvKTsKKyAgcmV0dXJuIHN0YXQ7Cit9CisKK3dpbmRvd19zdGF0cyAqY2Vuc3VzX3dpbmRvd19zdGF0c19jcmVhdGUoaW50IG5pbnRlcnZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwcl90aW1lc3BlYyBpbnRlcnZhbHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyYW51bGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjd3Nfc3RhdF9pbmZvICpzdGF0X2luZm8pIHsKKyAgd2luZG93X3N0YXRzICpyZXQ7CisgIGludCBpOworICAvKiB2YWxpZGF0ZSBpbnB1dHMgKi8KKyAgR1BSX0FTU0VSVChuaW50ZXJ2YWxzID4gMCAmJiBncmFudWxhcml0eSA+IDIgJiYgaW50ZXJ2YWxzICE9IE5VTEwgJiYKKyAgICAgICAgICAgICBzdGF0X2luZm8gIT0gTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCBuaW50ZXJ2YWxzOyBpKyspIHsKKyAgICBpbnQ2NF90IG5zID0gdGltZXNwZWNfdG9fbnMoaW50ZXJ2YWxzW2ldKTsKKyAgICBHUFJfQVNTRVJUKGludGVydmFsc1tpXS50dl9zZWMgPj0gMCAmJiBpbnRlcnZhbHNbaV0udHZfbnNlYyA+PSAwICYmCisgICAgICAgICAgICAgICBpbnRlcnZhbHNbaV0udHZfbnNlYyA8IEdQUl9OU19QRVJfU0VDICYmIG5zID49IDEwMCAmJgorICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHkgKiAxMCA8PSBucyk7CisgIH0KKyAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzICovCisgIHJldCA9ICh3aW5kb3dfc3RhdHMgKilncHJfbWFsbG9jKHNpemVvZih3aW5kb3dfc3RhdHMpKTsKKyAgcmV0LT5uaW50ZXJ2YWxzID0gbmludGVydmFsczsKKyAgcmV0LT5uYnVja2V0cyA9IGdyYW51bGFyaXR5ICsgMTsKKyAgcmV0LT5zdGF0X2luZm8gPSAqc3RhdF9pbmZvOworICByZXQtPmludGVydmFsX3N0YXRzID0KKyAgICAgIChjd3NfaW50ZXJ2YWxfc3RhdHMgKilncHJfbWFsbG9jKG5pbnRlcnZhbHMgKiBzaXplb2YoY3dzX2ludGVydmFsX3N0YXRzKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuaW50ZXJ2YWxzOyBpKyspIHsKKyAgICBpbnQ2NF90IHNpemVfbnMgPSB0aW1lc3BlY190b19ucyhpbnRlcnZhbHNbaV0pOworICAgIGN3c19pbnRlcnZhbF9zdGF0cyAqaXMgPSByZXQtPmludGVydmFsX3N0YXRzICsgaTsKKyAgICBjd3NfYnVja2V0ICpidWNrZXRzID0gaXMtPmJ1Y2tldHMgPQorICAgICAgICAoY3dzX2J1Y2tldCAqKWdwcl9tYWxsb2MocmV0LT5uYnVja2V0cyAqIHNpemVvZihjd3NfYnVja2V0KSk7CisgICAgaW50IGI7CisgICAgZm9yIChiID0gMDsgYiA8IHJldC0+bmJ1Y2tldHM7IGIrKykgeworICAgICAgYnVja2V0c1tiXS5zdGF0aXN0aWMgPSBjd3NfY3JlYXRlX3N0YXRpc3RpYyhzdGF0X2luZm8pOworICAgICAgYnVja2V0c1tiXS5jb3VudCA9IDA7CisgICAgfQorICAgIGlzLT5ib3R0b21fYnVja2V0ID0gMDsKKyAgICBpcy0+Ym90dG9tID0gMDsKKyAgICBpcy0+d2lkdGggPSBzaXplX25zIC8gZ3JhbnVsYXJpdHk7CisgICAgLyogQ2hlY2sgZm9yIHBvc3NpYmxlIG92ZXJmbG93IGlzc3VlcywgYW5kIG1heGltaXplIGludGVydmFsIHNpemUgaWYgdGhlCisgICAgICAgdXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nIGxhcmdlIGVub3VnaC4gKi8KKyAgICBpZiAoKEdQUl9JTlQ2NF9NQVggLSBpcy0+d2lkdGgpID4gc2l6ZV9ucykgeworICAgICAgaXMtPnRvcCA9IHNpemVfbnMgKyBpcy0+d2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAgIGlzLT50b3AgPSBHUFJfSU5UNjRfTUFYOworICAgICAgaXMtPndpZHRoID0gR1BSX0lOVDY0X01BWCAvIChncmFudWxhcml0eSArIDEpOworICAgIH0KKyAgICAvKiBJZiBzaXplIGRvZXNuJ3QgZGl2aWRlIGV2ZW5seSwgd2UgY2FuIGhhdmUgYSB3aWR0aCBzbGlnaHRseSB0b28gc21hbGw7CisgICAgICAgYmV0dGVyIHRvIGhhdmUgaXQgc2xpZ2h0bHkgbGFyZ2UuICovCisgICAgaWYgKChzaXplX25zIC0gKGdyYW51bGFyaXR5ICsgMSkgKiBpcy0+d2lkdGgpID4gMCkgeworICAgICAgaXMtPndpZHRoICs9IDE7CisgICAgfQorICB9CisgIHJldC0+bmV3ZXN0X3RpbWUgPSAwOworICByZXR1cm4gcmV0OworfQorCisvKiBXaGVuIHdlIHRyeSBhZGRpbmcgYSBtZWFzdXJlbWVudCBhYm92ZSB0aGUgY3VycmVudCBpbnRlcnZhbCByYW5nZSwgd2UKKyAgIG5lZWQgdG8gInNoaWZ0IiB0aGUgYnVja2V0cyBzdWZmaWNpZW50bHkgdG8gY292ZXIgdGhlIG5ldyByYW5nZS4gKi8KK3N0YXRpYyB2b2lkIGN3c19zaGlmdF9idWNrZXRzKGNvbnN0IHdpbmRvd19zdGF0cyAqd3N0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dzX2ludGVydmFsX3N0YXRzICppcywgaW50NjRfdCB3aGVuX25zKSB7CisgIGludCBpOworICAvKiBudW1iZXIgb2YgYnVja2V0IHRpbWUgd2lkdGhzIHRvICJzaGlmdCIgKi8KKyAgaW50IHNoaWZ0OworICAvKiBudW1iZXIgb2YgYnVja2V0cyB0byBjbGVhciAqLworICBpbnQgbmNsZWFyOworICBHUFJfQVNTRVJUKHdoZW5fbnMgPj0gaXMtPnRvcCk7CisgIC8qIG51bWJlciBvZiBidWNrZXQgdGltZSB3aWR0aHMgdG8gInNoaWZ0IiAqLworICBzaGlmdCA9ICgod2hlbl9ucyAtIGlzLT50b3ApIC8gaXMtPndpZHRoKSArIDE7CisgIC8qIG51bWJlciBvZiBidWNrZXRzIHRvIGNsZWFyIC0gbGltaXRlZCBieSBhY3R1YWwgbnVtYmVyIG9mIGJ1Y2tldHMgKi8KKyAgbmNsZWFyID0gR1BSX01JTihzaGlmdCwgd3N0YXRzLT5uYnVja2V0cyk7CisgIGZvciAoaSA9IDA7IGkgPCBuY2xlYXI7IGkrKykgeworICAgIGludCBiID0gQlVDS0VUX0lEWChpcywgaSwgd3N0YXRzKTsKKyAgICBpcy0+YnVja2V0c1tiXS5jb3VudCA9IDA7CisgICAgY3dzX2luaXRpYWxpemVfc3RhdGlzdGljKGlzLT5idWNrZXRzW2JdLnN0YXRpc3RpYywgJndzdGF0cy0+c3RhdF9pbmZvKTsKKyAgfQorICAvKiBhZGp1c3QgdG9wL2JvdHRvbSB0aW1lcyBhbmQgY3VycmVudCBib3R0b20gYnVja2V0ICovCisgIGlzLT5ib3R0b21fYnVja2V0ID0gQlVDS0VUX0lEWChpcywgc2hpZnQsIHdzdGF0cyk7CisgIGlzLT50b3AgKz0gc2hpZnQgKiBpcy0+d2lkdGg7CisgIGlzLT5ib3R0b20gKz0gc2hpZnQgKiBpcy0+d2lkdGg7Cit9CisKK3ZvaWQgY2Vuc3VzX3dpbmRvd19zdGF0c19hZGQod2luZG93X3N0YXRzICp3c3RhdHMsIGNvbnN0IGdwcl90aW1lc3BlYyB3aGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzdGF0X3ZhbHVlKSB7CisgIGludCBpOworICBpbnQ2NF90IHdoZW5fbnMgPSB0aW1lc3BlY190b19ucyh3aGVuKTsKKyAgR1BSX0FTU0VSVCh3c3RhdHMtPmludGVydmFsX3N0YXRzICE9IE5VTEwpOworICBmb3IgKGkgPSAwOyBpIDwgd3N0YXRzLT5uaW50ZXJ2YWxzOyBpKyspIHsKKyAgICBjd3NfaW50ZXJ2YWxfc3RhdHMgKmlzID0gd3N0YXRzLT5pbnRlcnZhbF9zdGF0cyArIGk7CisgICAgY3dzX2J1Y2tldCAqYnVja2V0OworICAgIGlmICh3aGVuX25zIDwgaXMtPmJvdHRvbSkgeyAvKiBCZWxvdyBzbWFsbGVzdCB0aW1lIGluIGludGVydmFsOiBkcm9wICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHdoZW5fbnMgPj0gaXMtPnRvcCkgeyAvKiBhYm92ZSBsaW1pdDogc2hpZnQgYnVja2V0cyAqLworICAgICAgY3dzX3NoaWZ0X2J1Y2tldHMod3N0YXRzLCBpcywgd2hlbl9ucyk7CisgICAgfQorICAgIC8qIEFkZCB0aGUgc3RhdC4gKi8KKyAgICBHUFJfQVNTRVJUKGlzLT5ib3R0b20gPD0gd2hlbl9ucyAmJiB3aGVuX25zIDwgaXMtPnRvcCk7CisgICAgYnVja2V0ID0gaXMtPmJ1Y2tldHMgKworICAgICAgICAgICAgIEJVQ0tFVF9JRFgoaXMsICh3aGVuX25zIC0gaXMtPmJvdHRvbSkgLyBpcy0+d2lkdGgsIHdzdGF0cyk7CisgICAgYnVja2V0LT5jb3VudCsrOworICAgIHdzdGF0cy0+c3RhdF9pbmZvLnN0YXRfYWRkKGJ1Y2tldC0+c3RhdGlzdGljLCBzdGF0X3ZhbHVlKTsKKyAgfQorICBpZiAod2hlbl9ucyA+IHdzdGF0cy0+bmV3ZXN0X3RpbWUpIHsKKyAgICB3c3RhdHMtPm5ld2VzdF90aW1lID0gd2hlbl9uczsKKyAgfQorfQorCisvKiBBZGQgYSBzcGVjaWZpYyBidWNrZXQgY29udGVudHMgdG8gYW4gYWNjdW11bGF0aW5nIHRvdGFsLiAqLworc3RhdGljIHZvaWQgY3dzX2FkZF9idWNrZXRfdG9fc3VtKGN3c19zdW0gKnN1bSwgY29uc3QgY3dzX2J1Y2tldCAqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN3c19zdGF0X2luZm8gKnN0YXRfaW5mbykgeworICBzdW0tPmNvdW50ICs9IGJ1Y2tldC0+Y291bnQ7CisgIHN0YXRfaW5mby0+c3RhdF9hZGQoc3VtLT5zdGF0aXN0aWMsIGJ1Y2tldC0+c3RhdGlzdGljKTsKK30KKworLyogQWRkIGEgcHJvcG9ydGlvbiB0byBhbiBhY2N1bXVsYXRpbmcgc3VtLiAqLworc3RhdGljIHZvaWQgY3dzX2FkZF9wcm9wb3J0aW9uX3RvX3N1bShkb3VibGUgcCwgY3dzX3N1bSAqc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjd3NfYnVja2V0ICpidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN3c19zdGF0X2luZm8gKnN0YXRfaW5mbykgeworICBzdW0tPmNvdW50ICs9IHAgKiBidWNrZXQtPmNvdW50OworICBzdGF0X2luZm8tPnN0YXRfYWRkX3Byb3BvcnRpb24ocCwgc3VtLT5zdGF0aXN0aWMsIGJ1Y2tldC0+c3RhdGlzdGljKTsKK30KKwordm9pZCBjZW5zdXNfd2luZG93X3N0YXRzX2dldF9zdW1zKGNvbnN0IHdpbmRvd19zdGF0cyAqd3N0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwcl90aW1lc3BlYyB3aGVuLCBjd3Nfc3VtIHN1bXNbXSkgeworICBpbnQgaTsKKyAgaW50NjRfdCB3aGVuX25zID0gdGltZXNwZWNfdG9fbnMod2hlbik7CisgIEdQUl9BU1NFUlQod3N0YXRzLT5pbnRlcnZhbF9zdGF0cyAhPSBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IHdzdGF0cy0+bmludGVydmFsczsgaSsrKSB7CisgICAgaW50IHdoZW5fYnVja2V0OworICAgIGludCBuZXdfYnVja2V0OworICAgIGRvdWJsZSBsYXN0X3Byb3BvcnRpb24gPSAxLjA7CisgICAgZG91YmxlIGJvdHRvbV9wcm9wb3J0aW9uOworICAgIGN3c19pbnRlcnZhbF9zdGF0cyAqaXMgPSB3c3RhdHMtPmludGVydmFsX3N0YXRzICsgaTsKKyAgICBjd3Nfc3VtICpzdW0gPSBzdW1zICsgaTsKKyAgICBzdW0tPmNvdW50ID0gMDsKKyAgICBjd3NfaW5pdGlhbGl6ZV9zdGF0aXN0aWMoc3VtLT5zdGF0aXN0aWMsICZ3c3RhdHMtPnN0YXRfaW5mbyk7CisgICAgaWYgKHdoZW5fbnMgPCBpcy0+Ym90dG9tKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHdoZW5fbnMgPj0gaXMtPnRvcCkgeworICAgICAgY3dzX3NoaWZ0X2J1Y2tldHMod3N0YXRzLCBpcywgd2hlbl9ucyk7CisgICAgfQorICAgIC8qIENhbGN1bGF0aW5nIHRoZSBhcHByb3ByaWF0ZSBhbW91bnQgb2Ygd2hpY2ggYnVja2V0cyB0byB1c2UgY2FuIGdldAorICAgICAgIGNvbXBsaWNhdGVkLiBFc3NlbnRpYWxseSB0aGVyZSBhcmUgdHdvIGNhc2VzOgorICAgICAgIDEpIGlmIHRoZSAidG9wIiBidWNrZXQgKG5ld19idWNrZXQsIHdoZXJlIHRoZSBuZXdlc3QgYWRkaXRpb25zIHRvIHRoZQorICAgICAgIHN0YXRzIHJlY29yZGVkIGFyZSBlbnRlcmVkKSBjb3JyZXNwb25kcyB0byAnd2hlbicsIHRoZW4gd2UgbmVlZAorICAgICAgIHRvIHRha2UgYSBwcm9wb3J0aW9uIG9mIGl0IC0gKGlmIHdoZW4gPCBuZXdlc3RfdGltZSkgb3IgdGhlIGZ1bGwKKyAgICAgICB0aGluZy4gV2UgYWxzbyAocG9zc2libHkpIG5lZWQgdG8gdGFrZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICBwcm9wb3J0aW9uIG9mIHRoZSBib3R0b20gYnVja2V0LgorICAgICAgIDIpIE90aGVyIGNhc2VzLCB3ZSBqdXN0IHRha2UgYSBzdHJhaWdodCBwcm9wb3J0aW9uLgorICAgICAqLworICAgIHdoZW5fYnVja2V0ID0gKHdoZW5fbnMgLSBpcy0+Ym90dG9tKSAvIGlzLT53aWR0aDsKKyAgICBuZXdfYnVja2V0ID0gKHdzdGF0cy0+bmV3ZXN0X3RpbWUgLSBpcy0+Ym90dG9tKSAvIGlzLT53aWR0aDsKKyAgICBpZiAobmV3X2J1Y2tldCA9PSB3aGVuX2J1Y2tldCkgeworICAgICAgaW50NjRfdCBib3R0b21fYnVja2V0X3RpbWUgPSBpcy0+Ym90dG9tICsgd2hlbl9idWNrZXQgKiBpcy0+d2lkdGg7CisgICAgICBpZiAod2hlbl9ucyA8IHdzdGF0cy0+bmV3ZXN0X3RpbWUpIHsKKyAgICAgICAgbGFzdF9wcm9wb3J0aW9uID0gKGRvdWJsZSkod2hlbl9ucyAtIGJvdHRvbV9idWNrZXRfdGltZSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSh3c3RhdHMtPm5ld2VzdF90aW1lIC0gYm90dG9tX2J1Y2tldF90aW1lKTsKKyAgICAgICAgYm90dG9tX3Byb3BvcnRpb24gPQorICAgICAgICAgICAgKGRvdWJsZSkoaXMtPndpZHRoIC0gKHdoZW5fbnMgLSBib3R0b21fYnVja2V0X3RpbWUpKSAvIGlzLT53aWR0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJvdHRvbV9wcm9wb3J0aW9uID0KKyAgICAgICAgICAgIChkb3VibGUpKGlzLT53aWR0aCAtICh3c3RhdHMtPm5ld2VzdF90aW1lIC0gYm90dG9tX2J1Y2tldF90aW1lKSkgLworICAgICAgICAgICAgaXMtPndpZHRoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBsYXN0X3Byb3BvcnRpb24gPQorICAgICAgICAgIChkb3VibGUpKHdoZW5fbnMgKyAxIC0gaXMtPmJvdHRvbSAtIHdoZW5fYnVja2V0ICogaXMtPndpZHRoKSAvCisgICAgICAgICAgaXMtPndpZHRoOworICAgICAgYm90dG9tX3Byb3BvcnRpb24gPSAxLjAgLSBsYXN0X3Byb3BvcnRpb247CisgICAgfQorICAgIGN3c19hZGRfcHJvcG9ydGlvbl90b19zdW0obGFzdF9wcm9wb3J0aW9uLCBzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy0+YnVja2V0cyArIEJVQ0tFVF9JRFgoaXMsIHdoZW5fYnVja2V0LCB3c3RhdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndzdGF0cy0+c3RhdF9pbmZvKTsKKyAgICBpZiAod2hlbl9idWNrZXQgIT0gMCkgeyAvKiBsYXN0IGJ1Y2tldCBpc24ndCBhbHNvIGJvdHRvbSBidWNrZXQgKi8KKyAgICAgIGludCBiOworICAgICAgLyogQWRkIGFsbCBvZiAiYm90dG9tIiBidWNrZXQgaWYgd2UgYXJlIGxvb2tpbmcgYXQgYSBzdWJzZXQgb2YgdGhlCisgICAgICAgICBmdWxsIGludGVydmFsLCBvciBhIHByb3BvcnRpb24gaWYgd2UgYXJlIGFkZGluZyBmdWxsIGludGVydmFsLiAqLworICAgICAgY3dzX2FkZF9wcm9wb3J0aW9uX3RvX3N1bSgKKyAgICAgICAgICAod2hlbl9idWNrZXQgPT0gd3N0YXRzLT5uYnVja2V0cyAtIDEgPyBib3R0b21fcHJvcG9ydGlvbiA6IDEuMCksIHN1bSwKKyAgICAgICAgICBpcy0+YnVja2V0cyArIGlzLT5ib3R0b21fYnVja2V0LCAmd3N0YXRzLT5zdGF0X2luZm8pOworICAgICAgLyogQWRkIGFsbCB0aGUgcmVtYWluaW5nIGJ1Y2tldHMgKGV2ZXJ5dGhpbmcgYnV0IHRvcCBhbmQgYm90dG9tKS4gKi8KKyAgICAgIGZvciAoYiA9IDE7IGIgPCB3aGVuX2J1Y2tldDsgYisrKSB7CisgICAgICAgIGN3c19hZGRfYnVja2V0X3RvX3N1bShzdW0sIGlzLT5idWNrZXRzICsgQlVDS0VUX0lEWChpcywgYiwgd3N0YXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3c3RhdHMtPnN0YXRfaW5mbyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgY2Vuc3VzX3dpbmRvd19zdGF0c19kZXN0cm95KHdpbmRvd19zdGF0cyAqd3N0YXRzKSB7CisgIGludCBpOworICBHUFJfQVNTRVJUKHdzdGF0cy0+aW50ZXJ2YWxfc3RhdHMgIT0gTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCB3c3RhdHMtPm5pbnRlcnZhbHM7IGkrKykgeworICAgIGludCBiOworICAgIGZvciAoYiA9IDA7IGIgPCB3c3RhdHMtPm5idWNrZXRzOyBiKyspIHsKKyAgICAgIGdwcl9mcmVlKHdzdGF0cy0+aW50ZXJ2YWxfc3RhdHNbaV0uYnVja2V0c1tiXS5zdGF0aXN0aWMpOworICAgIH0KKyAgICBncHJfZnJlZSh3c3RhdHMtPmludGVydmFsX3N0YXRzW2ldLmJ1Y2tldHMpOworICB9CisgIGdwcl9mcmVlKHdzdGF0cy0+aW50ZXJ2YWxfc3RhdHMpOworICAvKiBFbnN1cmUgYW55IHVzZS1hZnRlciBmcmVlIHRyaWdnZXJzIGFzc2VydC4gKi8KKyAgd3N0YXRzLT5pbnRlcnZhbF9zdGF0cyA9IE5VTEw7CisgIGdwcl9mcmVlKHdzdGF0cyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuaCBiL3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfV0lORE9XX1NUQVRTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVEFUSVNUSUNTX1dJTkRPV19TVEFUU19ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorCisvKiBLZWVwIHJvbGxpbmcgc3VtcyBvZiBhIHVzZXItZGVmaW5lZCBzdGF0aXN0aWMgKGNvbnRhaW5pbmcgYSBudW1iZXIgb2YKKyAgIG1lYXN1cmVtZW50cykgb3ZlciBhIGEgbnVtYmVyIG9mIHRpbWUgaW50ZXJ2YWxzICgid2luZG93cyIpLiBGb3IgZXhhbXBsZSwKKyAgIHlvdSBjYW4gdXNlIGEgd2luZG93X3N0YXRzIG9iamVjdCB0byBhbnN3ZXIgcXVlc3Rpb25zIHN1Y2ggYXMKKyAgICJBcHByb3hpbWF0ZWx5IGhvdyBtYW55IFJQQ3MvcyBkaWQgSSByZWNlaXZlIG92ZXIgdGhlIHBhc3QgbWludXRlLCBhbmQKKyAgIGFwcHJveGltYXRlbHkgaG93IG1hbnkgYnl0ZXMgZGlkIEkgc2VuZCBvdXQgb3ZlciB0aGF0IHBlcmlvZD8iLgorCisgICBUaGUgdHlwZSBvZiBkYXRhIHRvIHJlY29yZCwgYW5kIHRoZSB0aW1lIGludGVydmFscyB0byBrZWVwIGFyZSBzcGVjaWZpZWQKKyAgIHdoZW4gY3JlYXRpbmcgdGhlIG9iamVjdCB2aWEgYSBjYWxsIHRvIGNlbnN1c193aW5kb3dfc3RhdHNfY3JlYXRlKCkuCisKKyAgIEEgd2luZG93J3MgaW50ZXJ2YWwgaXMgZGl2aWRlZCBpbnRvIG9uZSBvciBtb3JlICJidWNrZXRzIjsgdGhlIGludGVydmFsCisgICBtdXN0IGJlIGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuIEludGVybmFsbHksIHRoZXNlIGJ1Y2tldHMKKyAgIGNvbnRyb2wgdGhlIGdyYW51bGFyaXR5IG9mIHdpbmRvd19zdGF0cycgbWVhc3VyZW1lbnRzLiBJbmNyZWFzaW5nIHRoZQorICAgbnVtYmVyIG9mIGJ1Y2tldHMgbGV0cyB0aGUgb2JqZWN0IHJlc3BvbmQgbW9yZSBxdWlja2x5IHRvIGNoYW5nZXMgaW4gdGhlCisgICBvdmVyYWxsIHJhdGUgb2YgZGF0YSBhZGRlZCBpbnRvIHRoZSBvYmplY3QsIGF0IHRoZSBjb3N0IG9mIGFkZGl0aW9uYWwKKyAgIG1lbW9yeSB1c2FnZS4KKworICAgSGVyZSdzIHNvbWUgY29kZSB3aGljaCBrZWVwcyBvbmUgbWludXRlL2hvdXIgbWVhc3VyZW1lbnRzIGZvciB0d28gdmFsdWVzCisgICAobGF0ZW5jeSBpbiBzZWNvbmRzIGFuZCBieXRlcyB0cmFuc2ZlcnJlZCksIHdpdGggZWFjaCBpbnRlcnZhbCBkaXZpZGVkIGludG8KKyAgIDQgYnVja2V0cy4KKworICAgIHR5cGVkZWYgc3RydWN0IG15X3N0YXQgeworICAgICAgZG91YmxlIGxhdGVuY3k7CisgICAgICBpbnQgYnl0ZXM7CisgICAgfSBteV9zdGF0OworCisgICAgdm9pZCBhZGRfbXlfc3RhdCh2b2lkKiBiYXNlLCBjb25zdCB2b2lkKiBhZGRtZSkgeworICAgICAgbXlfc3RhdCogYiA9IChteV9zdGF0KiliYXNlOworICAgICAgY29uc3QgbXlfc3RhdCogYSA9IChjb25zdCBteV9zdGF0KilhZGRtZTsKKyAgICAgIGItPmxhdGVuY3kgKz0gYS0+bGF0ZW5jeTsKKyAgICAgIGItPmJ5dGVzICs9IGEtPmJ5dGVzOworICAgIH0KKworICAgIHZvaWQgYWRkX3Byb3BvcnRpb25fbXlfc3RhdChkb3VibGUgcCwgdm9pZCogYmFzZSwgY29uc3Qgdm9pZCogYWRkbWUpIHsKKyAgICAgIChteV9zdGF0KilyZXN1bHQtPmxhdGVuY3kgKz0gcCAqIChjb25zdCBteV9zdGF0KiliYXNlLT5sYXRlbmN5OworICAgICAgKG15X3N0YXQqKXJlc3VsdC0+Ynl0ZXMgKz0gcCAqIChjb25zdCBteV9zdGF0KiliYXNlLT5ieXRlczsKKyAgICB9CisKKyAgICAjZGVmaW5lIGtOdW1JbnRlcnZhbHMgMgorICAgICNkZWZpbmUga01pbkludGVydmFsIDAKKyAgICAjZGVmaW5lIGtIb3VySW50ZXJ2YWwgMQorICAgICNkZWZpbmUga051bUJ1Y2tldHMgNAorCisgICAgY29uc3Qgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHNfc3RhdF9pbmZvIGtNeVN0YXRJbmZvCisgICAgICAgID0geyBzaXplb2YobXlfc3RhdCksIE5VTEwsIGFkZF9teV9zdGF0LCBhZGRfcHJvcG9ydGlvbl9teV9zdGF0IH07CisgICAgZ3ByX3RpbWVzcGVjIGludGVydmFsc1trTnVtSW50ZXJ2YWxzXSA9IHt7NjAsIDB9LCB7MzYwMCwgMH19OworICAgIG15X3N0YXQgc3RhdDsKKyAgICBteV9zdGF0IHN1bXNba051bUludGVydmFsc107CisgICAgY2Vuc3VzX3dpbmRvd19zdGF0c19zdW1zIHJlc3VsdFtrTnVtSW50ZXJ2YWxzXTsKKyAgICBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyogc3RhdHMKKyAgICAgICAgPSBjZW5zdXNfd2luZG93X3N0YXRzX2NyZWF0ZShrTnVtSW50ZXJ2YWxzLCBpbnRlcnZhbHMsIGtOdW1CdWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrTXlTdGF0SW5mbyk7CisgICAgLy8gUmVjb3JkIGEgbmV3IGV2ZW50LCB0YWtpbmcgMTUuM21zLCB0cmFuc2ZlcnJpbmcgMTc4NCBieXRlcy4KKyAgICBzdGF0LmxhdGVuY3kgPSAwLjE1MzsKKyAgICBzdGF0LmJ5dGVzID0gMTc4NDsKKyAgICBjZW5zdXNfd2luZG93X3N0YXRzX2FkZChzdGF0cywgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCAmc3RhdCk7CisgICAgLy8gR2V0IHN1bXMgYW5kIHByaW50IHRoZW0gb3V0CisgICAgcmVzdWx0W2tNaW5JbnRlcnZhbF0uc3RhdGlzdGljID0gJnN1bXNba01pbkludGVydmFsXTsKKyAgICByZXN1bHRba0hvdXJJbnRlcnZhbF0uc3RhdGlzdGljID0gJnN1bXNba0hvdXJJbnRlcnZhbF07CisgICAgY2Vuc3VzX3dpbmRvd19zdGF0c19nZXRfc3VtcyhzdGF0cywgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCByZXN1bHQpOworICAgIHByaW50ZigiJWQgZXZlbnRzL21pbiwgYXZlcmFnZSB0aW1lICVncywgYXZlcmFnZSBieXRlcyAlZ1xuIiwKKyAgICAgICAgICAgcmVzdWx0W2tNaW5JbnRlcnZhbF0uY291bnQsCisgICAgICAgICAgIChteV9zdGF0KilyZXN1bHRba01pbkludGVydmFsXS5zdGF0aXN0aWMtPmxhdGVuY3kgLworICAgICAgICAgICAgIHJlc3VsdFtrTWluSW50ZXJ2YWxdLmNvdW50LAorICAgICAgICAgICAobXlfc3RhdCopcmVzdWx0W2tNaW5JbnRlcnZhbF0uc3RhdGlzdGljLT5ieXRlcyAvCisgICAgICAgICAgICAgcmVzdWx0W2tNaW5JbnRlcnZhbF0uY291bnQKKyAgICAgICAgICApOworICAgIHByaW50ZigiJWQgZXZlbnRzL2hyLCBhdmVyYWdlIHRpbWUgJWdzLCBhdmVyYWdlIGJ5dGVzICVnXG4iLAorICAgICAgICAgICByZXN1bHRba0hvdXJJbnRlcnZhbF0uY291bnQsCisgICAgICAgICAgIChteV9zdGF0KilyZXN1bHRba0hvdXJJbnRlcnZhbF0uc3RhdGlzdGljLT5sYXRlbmN5IC8KKyAgICAgICAgICAgICByZXN1bHRba0hvdXJJbnRlcnZhbF0uY291bnQsCisgICAgICAgICAgIChteV9zdGF0KilyZXN1bHRba0hvdXJJbnRlcnZhbF0uc3RhdGlzdGljLT5ieXRlcyAvCisgICAgICAgICAgICAgcmVzdWx0W2tIb3VySW50ZXJ2YWxdLmNvdW50CisgICAgICAgICAgKTsKKyovCisKKy8qIE9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyB3aW5kb3dfc3RhdHMgb2JqZWN0ICovCitzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0czsKKworLyogSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgQVBJIHVzZXIgb24gdGhlIGluZm9ybWF0aW9uIHRoZXkgd2FudCB0byByZWNvcmQgKi8KK3R5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHNfc3RhdF9pbmZvIHsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIHVzZXItZGVmaW5lZCBvYmplY3QuICovCisgIHNpemVfdCBzdGF0X3NpemU7CisgIC8qIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSB1c2VyLWRlZmluZWQgc3RhdGlzdGljcyBvYmplY3QuIElmIHRoaXMgaXMgc2V0CisgICAqIHRvIE5VTEwsIHRoZW4gdGhlIG9iamVjdCB3aWxsIGJlIHplcm8taW5pdGlhbGl6ZWQuICovCisgIHZvaWQgKCpzdGF0X2luaXRpYWxpemUpKHZvaWQgKnN0YXQpOworICAvKiBGdW5jdGlvbiB0byBhZGQgb25lIHVzZXItZGVmaW5lZCBzdGF0aXN0aWNzIG9iamVjdCAoJ2FkZG1lJykgdG8gJ2Jhc2UnICovCisgIHZvaWQgKCpzdGF0X2FkZCkodm9pZCAqYmFzZSwgY29uc3Qgdm9pZCAqYWRkbWUpOworICAvKiBBcyBmb3IgcHJldmlvdXMgZnVuY3Rpb24sIGJ1dCBvbmx5IGFkZCBhIHByb3BvcnRpb24gJ3AnLiBUaGlzIEFQSSB3aWxsCisgICAgIGN1cnJlbnRseSBvbmx5IHVzZSAncCcgdmFsdWVzIGluIHRoZSByYW5nZSBbMCwxXSwgYnV0IG90aGVyIHZhbHVlcyBhcmUKKyAgICAgcG9zc2libGUgaW4gdGhlIGZ1dHVyZSwgYW5kIHNob3VsZCBiZSBzdXBwb3J0ZWQuICovCisgIHZvaWQgKCpzdGF0X2FkZF9wcm9wb3J0aW9uKShkb3VibGUgcCwgdm9pZCAqYmFzZSwgY29uc3Qgdm9pZCAqYWRkbWUpOworfSBjZW5zdXNfd2luZG93X3N0YXRzX3N0YXRfaW5mbzsKKworLyogQ3JlYXRlIGEgbmV3IHdpbmRvd19zdGF0cyBvYmplY3QuICduaW50ZXJ2YWxzJyBpcyB0aGUgbnVtYmVyIG9mCisgICAnaW50ZXJ2YWxzJywgYW5kIG11c3QgYmUgPj0xLiAnZ3JhbnVsYXJpdHknIGlzIHRoZSBudW1iZXIgb2YgYnVja2V0cywgd2l0aAorICAgYSBsYXJnZXIgbnVtYmVyIHVzaW5nIG1vcmUgbWVtb3J5LCBidXQgcHJvdmlkaW5nIGdyZWF0ZXIgYWNjdXJhY3kgb2YKKyAgIHJlc3VsdHMuICdncmFudWxhcml0eSBzaG91bGQgYmUgPiAyLiBXZSBhbHNvIHJlcXVpcmUgdGhhdCBlYWNoIGludGVydmFsIGJlCisgICBhdCBsZWFzdCAxMCAqICdncmFudWxhcml0eScgbmFub3NlY29uZHMgaW4gc2l6ZS4gJ3N0YXRfaW5mbycgY29udGFpbnMKKyAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0aXN0aWMgdG8gYmUgZ2F0aGVyZWQuIEludGVydmFscyBncmVhdGVyIHRoYW4gfjE5MgorICAgeWVhcnMgd2lsbCBiZSB0cmVhdGVkIGFzIGVzc2VudGlhbGx5IGluZmluaXRlIGluIHNpemUuIFRoaXMgZnVuY3Rpb24gd2lsbAorICAgR1BSX0FTU0VSVCgpIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGhhdmUKKyAgIGludmFsaWQgdmFsdWVzLiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLiAqLworc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgKmNlbnN1c193aW5kb3dfc3RhdHNfY3JlYXRlKAorICAgIGludCBuaW50ZXJ2YWxzLCBjb25zdCBncHJfdGltZXNwZWMgaW50ZXJ2YWxzW10sIGludCBncmFudWxhcml0eSwKKyAgICBjb25zdCBjZW5zdXNfd2luZG93X3N0YXRzX3N0YXRfaW5mbyAqc3RhdF9pbmZvKTsKKworLyogQWRkIGEgbmV3IG1lYXN1cmVtZW50IChpbiAnc3RhdF92YWx1ZScpLCBhcyBvZiBhIGdpdmVuIHRpbWUgKCd3aGVuJykuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1jb21wYXRpYmxlLiAqLwordm9pZCBjZW5zdXNfd2luZG93X3N0YXRzX2FkZChzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyAqd3N0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncHJfdGltZXNwZWMgd2hlbiwgY29uc3Qgdm9pZCAqc3RhdF92YWx1ZSk7CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHJlY29yZCBhIHNpbmdsZSBpbnRlcnZhbHMgc3VtIGZvciBhIGdpdmVuIHN0YXRpc3RpYyAqLwordHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0c19zdW0geworICAvKiBUb3RhbCBjb3VudCBvZiBzYW1wbGVzLiBOb3RlIHRoYXQgYmVjYXVzZSBzb21lIGludGVybmFsIGludGVycG9sYXRpb24KKyAgICAgaXMgcGVyZm9ybWVkLCB0aGUgY291bnQgb2Ygc2FtcGxlcyByZXR1cm5lZCBmb3IgZWFjaCBpbnRlcnZhbCBtYXkgbm90IGJlIGFuCisgICAgIGludGVncmFsIHZhbHVlLiAqLworICBkb3VibGUgY291bnQ7CisgIC8qIFN1bSBmb3Igc3RhdGlzdGljICovCisgIHZvaWQgKnN0YXRpc3RpYzsKK30gY2Vuc3VzX3dpbmRvd19zdGF0c19zdW1zOworCisvKiBSZXRyaWV2ZSBhIHNldCBvZiBhbGwgdmFsdWVzIHN0b3JlZCBpbiBhIHdpbmRvd19zdGF0cyBvYmplY3QgJ3dzdGF0cycuIFRoZQorICAgbnVtYmVyIG9mICdzdW1zJyBNVVNUIGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgJ25pbnRlcnZhbHMnIHVzZWQgaW4KKyAgIGNlbnN1c193aW5kb3dfc3RhdHNfY3JlYXRlKCkuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLWNvbXBhdGlibGUuICovCit2b2lkIGNlbnN1c193aW5kb3dfc3RhdHNfZ2V0X3N1bXMoY29uc3Qgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgKndzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncHJfdGltZXNwZWMgd2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0c19zdW0gc3Vtc1tdKTsKKworLyogRGVzdHJveSBhIHdpbmRvd19zdGF0cyBvYmplY3QuIE9uY2UgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQsIHRoZQorICAgb2JqZWN0IHdpbGwgbm8gbG9uZ2VyIGJlIHVzYWJsZSBmcm9tIGFueSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIChhbmQKKyAgIGNhbGxpbmcgdGhlbSB3aWxsIG1vc3QgbGlrZWx5IHJlc3VsdCBpbiBhIE5VTEwtcG9pbnRlciBkZXJlZmVyZW5jZSBvcgorICAgYXNzZXJ0aW9uIGZhaWx1cmUpLiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1jb21wYXRpYmxlLiAqLwordm9pZCBjZW5zdXNfd2luZG93X3N0YXRzX2Rlc3Ryb3koc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgKndzdGF0cyk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NUQVRJU1RJQ1NfV0lORE9XX1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2FsbG9jLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmE2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9hbGxvYy5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisKK3N0YXRpYyBncHJfYWxsb2NhdGlvbl9mdW5jdGlvbnMgZ19hbGxvY19mdW5jdGlvbnMgPSB7bWFsbG9jLCByZWFsbG9jLCBmcmVlfTsKKworZ3ByX2FsbG9jYXRpb25fZnVuY3Rpb25zIGdwcl9nZXRfYWxsb2NhdGlvbl9mdW5jdGlvbnMoKSB7CisgIHJldHVybiBnX2FsbG9jX2Z1bmN0aW9uczsKK30KKwordm9pZCBncHJfc2V0X2FsbG9jYXRpb25fZnVuY3Rpb25zKGdwcl9hbGxvY2F0aW9uX2Z1bmN0aW9ucyBmdW5jdGlvbnMpIHsKKyAgR1BSX0FTU0VSVChmdW5jdGlvbnMubWFsbG9jX2ZuICE9IE5VTEwpOworICBHUFJfQVNTRVJUKGZ1bmN0aW9ucy5yZWFsbG9jX2ZuICE9IE5VTEwpOworICBHUFJfQVNTRVJUKGZ1bmN0aW9ucy5mcmVlX2ZuICE9IE5VTEwpOworICBnX2FsbG9jX2Z1bmN0aW9ucyA9IGZ1bmN0aW9uczsKK30KKwordm9pZCAqZ3ByX21hbGxvYyhzaXplX3Qgc2l6ZSkgeworICB2b2lkICpwOworICBHUFJfVElNRVJfQkVHSU4oImdwcl9tYWxsb2MiLCAwKTsKKyAgcCA9IGdfYWxsb2NfZnVuY3Rpb25zLm1hbGxvY19mbihzaXplKTsKKyAgaWYgKCFwKSB7CisgICAgYWJvcnQoKTsKKyAgfQorICBHUFJfVElNRVJfRU5EKCJncHJfbWFsbG9jIiwgMCk7CisgIHJldHVybiBwOworfQorCit2b2lkIGdwcl9mcmVlKHZvaWQgKnApIHsKKyAgR1BSX1RJTUVSX0JFR0lOKCJncHJfZnJlZSIsIDApOworICBnX2FsbG9jX2Z1bmN0aW9ucy5mcmVlX2ZuKHApOworICBHUFJfVElNRVJfRU5EKCJncHJfZnJlZSIsIDApOworfQorCit2b2lkICpncHJfcmVhbGxvYyh2b2lkICpwLCBzaXplX3Qgc2l6ZSkgeworICBHUFJfVElNRVJfQkVHSU4oImdwcl9yZWFsbG9jIiwgMCk7CisgIHAgPSBnX2FsbG9jX2Z1bmN0aW9ucy5yZWFsbG9jX2ZuKHAsIHNpemUpOworICBpZiAoIXApIHsKKyAgICBhYm9ydCgpOworICB9CisgIEdQUl9USU1FUl9FTkQoImdwcl9yZWFsbG9jIiwgMCk7CisgIHJldHVybiBwOworfQorCit2b2lkICpncHJfbWFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnRfbG9nKSB7CisgIHNpemVfdCBhbGlnbm1lbnQgPSAoKHNpemVfdCkxKSA8PCBhbGlnbm1lbnRfbG9nOworICBzaXplX3QgZXh0cmEgPSBhbGlnbm1lbnQgLSAxICsgc2l6ZW9mKHZvaWQgKik7CisgIHZvaWQgKnAgPSBncHJfbWFsbG9jKHNpemUgKyBleHRyYSk7CisgIHZvaWQgKipyZXQgPSAodm9pZCAqKikoKCh1aW50cHRyX3QpcCArIGV4dHJhKSAmIH4oYWxpZ25tZW50IC0gMSkpOworICByZXRbLTFdID0gcDsKKyAgcmV0dXJuICh2b2lkICopcmV0OworfQorCit2b2lkIGdwcl9mcmVlX2FsaWduZWQodm9pZCAqcHRyKSB7IGdwcl9mcmVlKCgodm9pZCAqKilwdHIpWy0xXSk7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvYXZsLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC9hdmwuYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvYXZsLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODllZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvYmFja29mZi5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCit2b2lkIGdwcl9iYWNrb2ZmX2luaXQoZ3ByX2JhY2tvZmYgKmJhY2tvZmYsIGRvdWJsZSBtdWx0aXBsaWVyLCBkb3VibGUgaml0dGVyLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RpbWVvdXRfbWlsbGlzLCBpbnQ2NF90IG1heF90aW1lb3V0X21pbGxpcykgeworICBiYWNrb2ZmLT5tdWx0aXBsaWVyID0gbXVsdGlwbGllcjsKKyAgYmFja29mZi0+aml0dGVyID0gaml0dGVyOworICBiYWNrb2ZmLT5taW5fdGltZW91dF9taWxsaXMgPSBtaW5fdGltZW91dF9taWxsaXM7CisgIGJhY2tvZmYtPm1heF90aW1lb3V0X21pbGxpcyA9IG1heF90aW1lb3V0X21pbGxpczsKKyAgYmFja29mZi0+cm5nX3N0YXRlID0gKHVpbnQzMl90KWdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKS50dl9uc2VjOworfQorCitncHJfdGltZXNwZWMgZ3ByX2JhY2tvZmZfYmVnaW4oZ3ByX2JhY2tvZmYgKmJhY2tvZmYsIGdwcl90aW1lc3BlYyBub3cpIHsKKyAgYmFja29mZi0+Y3VycmVudF90aW1lb3V0X21pbGxpcyA9IGJhY2tvZmYtPm1pbl90aW1lb3V0X21pbGxpczsKKyAgcmV0dXJuIGdwcl90aW1lX2FkZCgKKyAgICAgIG5vdywgZ3ByX3RpbWVfZnJvbV9taWxsaXMoYmFja29mZi0+Y3VycmVudF90aW1lb3V0X21pbGxpcywgR1BSX1RJTUVTUEFOKSk7Cit9CisKKy8qIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuICovCitzdGF0aWMgZG91YmxlIGdlbmVyYXRlX3VuaWZvcm1fcmFuZG9tX251bWJlcih1aW50MzJfdCAqcm5nX3N0YXRlKSB7CisgICpybmdfc3RhdGUgPSAoMTEwMzUxNTI0NSAqICpybmdfc3RhdGUgKyAxMjM0NSkgJSAoKHVpbnQzMl90KTEgPDwgMzEpOworICByZXR1cm4gKnJuZ19zdGF0ZSAvIChkb3VibGUpKCh1aW50MzJfdCkxIDw8IDMxKTsKK30KKworZ3ByX3RpbWVzcGVjIGdwcl9iYWNrb2ZmX3N0ZXAoZ3ByX2JhY2tvZmYgKmJhY2tvZmYsIGdwcl90aW1lc3BlYyBub3cpIHsKKyAgZG91YmxlIG5ld190aW1lb3V0X21pbGxpcyA9CisgICAgICBiYWNrb2ZmLT5tdWx0aXBsaWVyICogKGRvdWJsZSliYWNrb2ZmLT5jdXJyZW50X3RpbWVvdXRfbWlsbGlzOworICBkb3VibGUgaml0dGVyX3JhbmdlID0gYmFja29mZi0+aml0dGVyICogbmV3X3RpbWVvdXRfbWlsbGlzOworICBkb3VibGUgaml0dGVyID0KKyAgICAgICgyICogZ2VuZXJhdGVfdW5pZm9ybV9yYW5kb21fbnVtYmVyKCZiYWNrb2ZmLT5ybmdfc3RhdGUpIC0gMSkgKgorICAgICAgaml0dGVyX3JhbmdlOworICBiYWNrb2ZmLT5jdXJyZW50X3RpbWVvdXRfbWlsbGlzID0KKyAgICAgIEdQUl9DTEFNUCgoaW50NjRfdCkobmV3X3RpbWVvdXRfbWlsbGlzICsgaml0dGVyKSwKKyAgICAgICAgICAgICAgICBiYWNrb2ZmLT5taW5fdGltZW91dF9taWxsaXMsIGJhY2tvZmYtPm1heF90aW1lb3V0X21pbGxpcyk7CisgIHJldHVybiBncHJfdGltZV9hZGQoCisgICAgICBub3csIGdwcl90aW1lX2Zyb21fbWlsbGlzKGJhY2tvZmYtPmN1cnJlbnRfdGltZW91dF9taWxsaXMsIEdQUl9USU1FU1BBTikpOworfQorCit2b2lkIGdwcl9iYWNrb2ZmX3Jlc2V0KGdwcl9iYWNrb2ZmICpiYWNrb2ZmKSB7CisgIC8vIGZvcmNlcyBzdGVwKCkgdG8gcmV0dXJuIGEgdGltZW91dCBvZiBtaW5fdGltZW91dF9taWxsaXMKKyAgYmFja29mZi0+Y3VycmVudF90aW1lb3V0X21pbGxpcyA9IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmggYi9zcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0MGMxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaApAQCAtMCwwICsxLDY4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfQkFDS09GRl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9CQUNLT0ZGX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8vIGNvbnN0OiBtdWx0aXBsaWVyIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMKKyAgZG91YmxlIG11bHRpcGxpZXI7CisgIC8vLyBjb25zdDogYW1vdW50IHRvIHJhbmRvbWl6ZSBiYWNrb2ZmcworICBkb3VibGUgaml0dGVyOworICAvLy8gY29uc3Q6IG1pbmltdW0gdGltZSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzCisgIGludDY0X3QgbWluX3RpbWVvdXRfbWlsbGlzOworICAvLy8gY29uc3Q6IG1heGltdW0gdGltZSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzCisgIGludDY0X3QgbWF4X3RpbWVvdXRfbWlsbGlzOworCisgIC8vLyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICB1aW50MzJfdCBybmdfc3RhdGU7CisKKyAgLy8vIGN1cnJlbnQgcmV0cnkgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKKyAgaW50NjRfdCBjdXJyZW50X3RpbWVvdXRfbWlsbGlzOworfSBncHJfYmFja29mZjsKKworLy8vIEluaXRpYWxpemUgYmFja29mZiBtYWNoaW5lcnkgLSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlc3Ryb3llZAordm9pZCBncHJfYmFja29mZl9pbml0KGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBkb3VibGUgbXVsdGlwbGllciwgZG91YmxlIGppdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90aW1lb3V0X21pbGxpcywgaW50NjRfdCBtYXhfdGltZW91dF9taWxsaXMpOworCisvLy8gQmVnaW4gcmV0cnkgbG9vcDogcmV0dXJucyBhIHRpbWVzcGVjIGZvciB0aGUgTkVYVCByZXRyeQorZ3ByX3RpbWVzcGVjIGdwcl9iYWNrb2ZmX2JlZ2luKGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBncHJfdGltZXNwZWMgbm93KTsKKy8vLyBTdGVwIGEgcmV0cnkgbG9vcDogcmV0dXJucyBhIHRpbWVzcGVjIGZvciB0aGUgTkVYVCByZXRyeQorZ3ByX3RpbWVzcGVjIGdwcl9iYWNrb2ZmX3N0ZXAoZ3ByX2JhY2tvZmYgKmJhY2tvZmYsIGdwcl90aW1lc3BlYyBub3cpOworLy8vIFJlc2V0IHRoZSBiYWNrb2ZmLCBzbyB0aGUgbmV4dCBncHJfYmFja29mZl9zdGVwIHdpbGwgYmUgYSBncHJfYmFja29mZl9iZWdpbgorLy8vIGluc3RlYWQKK3ZvaWQgZ3ByX2JhY2tvZmZfcmVzZXQoZ3ByX2JhY2tvZmYgKmJhY2tvZmYpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVBQT1JUX0JBQ0tPRkZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMDcxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfQkxPQ0tfQU5OT1RBVEVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUFBPUlRfQkxPQ0tfQU5OT1RBVEVfSAorCisvKiBUaGVzZSBhbm5vdGF0aW9ucyBpZGVudGlmeSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgcmVnaW9ucyB3aGVyZQorICAgdGhlIGNvZGUgbWF5IGJsb2NrIGZvciByZWFzb25zIG90aGVyIHRoYW4gc3luY2hyb25pemF0aW9uIGZ1bmN0aW9ucy4KKyAgIFRoZXNlIGluY2x1ZGUgcG9sbCwgZXBvbGwsIGFuZCBnZXRhZGRyaW5mby4gKi8KKworI2RlZmluZSBHUlBDX1NDSEVEVUxJTkdfU1RBUlRfQkxPQ0tJTkdfUkVHSU9OIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVBQT1JUX0JMT0NLX0FOTk9UQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NtZGxpbmUuYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NtZGxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWM0OTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2NtZGxpbmUuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK3R5cGVkZWYgZW51bSB7IEFSR1RZUEVfSU5ULCBBUkdUWVBFX0JPT0wsIEFSR1RZUEVfU1RSSU5HIH0gYXJndHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgYXJnIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqaGVscDsKKyAgYXJndHlwZSB0eXBlOworICB2b2lkICp2YWx1ZTsKKyAgc3RydWN0IGFyZyAqbmV4dDsKK30gYXJnOworCitzdHJ1Y3QgZ3ByX2NtZGxpbmUgeworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKyAgYXJnICphcmdzOworICBjb25zdCBjaGFyICphcmd2MDsKKworICBjb25zdCBjaGFyICpleHRyYV9hcmdfbmFtZTsKKyAgY29uc3QgY2hhciAqZXh0cmFfYXJnX2hlbHA7CisgIHZvaWQgKCpleHRyYV9hcmcpKHZvaWQgKnVzZXJfZGF0YSwgY29uc3QgY2hhciAqYXJnKTsKKyAgdm9pZCAqZXh0cmFfYXJnX3VzZXJfZGF0YTsKKworICBpbnQgKCpzdGF0ZSkoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICphcmcpOworICBhcmcgKmN1cl9hcmc7CisKKyAgaW50IHN1cnZpdmVfZmFpbHVyZTsKK307CisKK3N0YXRpYyBpbnQgbm9ybWFsX3N0YXRlKGdwcl9jbWRsaW5lICpjbCwgY2hhciAqYXJnKTsKKworZ3ByX2NtZGxpbmUgKmdwcl9jbWRsaW5lX2NyZWF0ZShjb25zdCBjaGFyICpkZXNjcmlwdGlvbikgeworICBncHJfY21kbGluZSAqY2wgPSBncHJfbWFsbG9jKHNpemVvZihncHJfY21kbGluZSkpOworICBtZW1zZXQoY2wsIDAsIHNpemVvZihncHJfY21kbGluZSkpOworCisgIGNsLT5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICBjbC0+c3RhdGUgPSBub3JtYWxfc3RhdGU7CisKKyAgcmV0dXJuIGNsOworfQorCit2b2lkIGdwcl9jbWRsaW5lX3NldF9zdXJ2aXZlX2ZhaWx1cmUoZ3ByX2NtZGxpbmUgKmNsKSB7CisgIGNsLT5zdXJ2aXZlX2ZhaWx1cmUgPSAxOworfQorCit2b2lkIGdwcl9jbWRsaW5lX2Rlc3Ryb3koZ3ByX2NtZGxpbmUgKmNsKSB7CisgIHdoaWxlIChjbC0+YXJncykgeworICAgIGFyZyAqYSA9IGNsLT5hcmdzOworICAgIGNsLT5hcmdzID0gYS0+bmV4dDsKKyAgICBncHJfZnJlZShhKTsKKyAgfQorICBncHJfZnJlZShjbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9hcmcoZ3ByX2NtZGxpbmUgKmNsLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpoZWxwLAorICAgICAgICAgICAgICAgICAgICBhcmd0eXBlIHR5cGUsIHZvaWQgKnZhbHVlKSB7CisgIGFyZyAqYTsKKworICBmb3IgKGEgPSBjbC0+YXJnczsgYTsgYSA9IGEtPm5leHQpIHsKKyAgICBHUFJfQVNTRVJUKDAgIT0gc3RyY21wKGEtPm5hbWUsIG5hbWUpKTsKKyAgfQorCisgIGEgPSBncHJfbWFsbG9jKHNpemVvZihhcmcpKTsKKyAgbWVtc2V0KGEsIDAsIHNpemVvZihhcmcpKTsKKyAgYS0+bmFtZSA9IG5hbWU7CisgIGEtPmhlbHAgPSBoZWxwOworICBhLT50eXBlID0gdHlwZTsKKyAgYS0+dmFsdWUgPSB2YWx1ZTsKKyAgYS0+bmV4dCA9IGNsLT5hcmdzOworICBjbC0+YXJncyA9IGE7Cit9CisKK3ZvaWQgZ3ByX2NtZGxpbmVfYWRkX2ludChncHJfY21kbGluZSAqY2wsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmhlbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2YWx1ZSkgeworICBhZGRfYXJnKGNsLCBuYW1lLCBoZWxwLCBBUkdUWVBFX0lOVCwgdmFsdWUpOworfQorCit2b2lkIGdwcl9jbWRsaW5lX2FkZF9mbGFnKGdwcl9jbWRsaW5lICpjbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaGVscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2YWx1ZSkgeworICBhZGRfYXJnKGNsLCBuYW1lLCBoZWxwLCBBUkdUWVBFX0JPT0wsIHZhbHVlKTsKK30KKwordm9pZCBncHJfY21kbGluZV9hZGRfc3RyaW5nKGdwcl9jbWRsaW5lICpjbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaGVscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWUpIHsKKyAgYWRkX2FyZyhjbCwgbmFtZSwgaGVscCwgQVJHVFlQRV9TVFJJTkcsIHZhbHVlKTsKK30KKwordm9pZCBncHJfY21kbGluZV9vbl9leHRyYV9hcmcoCisgICAgZ3ByX2NtZGxpbmUgKmNsLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpoZWxwLAorICAgIHZvaWQgKCpvbl9leHRyYV9hcmcpKHZvaWQgKnVzZXJfZGF0YSwgY29uc3QgY2hhciAqYXJnKSwgdm9pZCAqdXNlcl9kYXRhKSB7CisgIEdQUl9BU1NFUlQoIWNsLT5leHRyYV9hcmcpOworICBHUFJfQVNTRVJUKG9uX2V4dHJhX2FyZyk7CisKKyAgY2wtPmV4dHJhX2FyZyA9IG9uX2V4dHJhX2FyZzsKKyAgY2wtPmV4dHJhX2FyZ191c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIGNsLT5leHRyYV9hcmdfbmFtZSA9IG5hbWU7CisgIGNsLT5leHRyYV9hcmdfaGVscCA9IGhlbHA7Cit9CisKKy8qIHJlY3Vyc2l2ZWx5IGRlc2NlbmQgYXJndW1lbnQgbGlzdCwgYWRkaW5nIHRoZSBsYXN0IGVsZW1lbnQKKyAgIHRvIHMgZmlyc3QgLSBzbyB0aGF0IGFyZ3VtZW50cyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZQorICAgYWRkZWQgdG8gdGhlIGxpc3QgYnkgYXBpIGNhbGxzICovCitzdGF0aWMgdm9pZCBhZGRfYXJnc190b191c2FnZShncHJfc3RydmVjICpzLCBhcmcgKmEpIHsKKyAgY2hhciAqdG1wOworCisgIGlmICghYSkgcmV0dXJuOworICBhZGRfYXJnc190b191c2FnZShzLCBhLT5uZXh0KTsKKworICBzd2l0Y2ggKGEtPnR5cGUpIHsKKyAgICBjYXNlIEFSR1RZUEVfQk9PTDoKKyAgICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiIFstLSVzfC0tbm8tJXNdIiwgYS0+bmFtZSwgYS0+bmFtZSk7CisgICAgICBncHJfc3RydmVjX2FkZChzLCB0bXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdUWVBFX1NUUklORzoKKyAgICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiIFstLSVzPXN0cmluZ10iLCBhLT5uYW1lKTsKKyAgICAgIGdwcl9zdHJ2ZWNfYWRkKHMsIHRtcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR1RZUEVfSU5UOgorICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICIgWy0tJXM9aW50XSIsIGEtPm5hbWUpOworICAgICAgZ3ByX3N0cnZlY19hZGQocywgdG1wKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2NoYXIgKmdwcl9jbWRsaW5lX3VzYWdlX3N0cmluZyhncHJfY21kbGluZSAqY2wsIGNvbnN0IGNoYXIgKmFyZ3YwKSB7CisgIC8qIFRPRE8oY3RpbGxlcik6IG1ha2UgdGhpcyBwcmV0dGllciAqLworICBncHJfc3RydmVjIHM7CisgIGNoYXIgKnRtcDsKKyAgY29uc3QgY2hhciAqbmFtZSA9IHN0cnJjaHIoYXJndjAsICcvJyk7CisKKyAgaWYgKG5hbWUpIHsKKyAgICBuYW1lKys7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGFyZ3YwOworICB9CisKKyAgZ3ByX3N0cnZlY19pbml0KCZzKTsKKworICBncHJfYXNwcmludGYoJnRtcCwgIlVzYWdlOiAlcyIsIG5hbWUpOworICBncHJfc3RydmVjX2FkZCgmcywgdG1wKTsKKyAgYWRkX2FyZ3NfdG9fdXNhZ2UoJnMsIGNsLT5hcmdzKTsKKyAgaWYgKGNsLT5leHRyYV9hcmcpIHsKKyAgICBncHJfYXNwcmludGYoJnRtcCwgIiBbJXMuLi5dIiwgY2wtPmV4dHJhX2FyZ19uYW1lKTsKKyAgICBncHJfc3RydmVjX2FkZCgmcywgdG1wKTsKKyAgfQorICBncHJfc3RydmVjX2FkZCgmcywgZ3ByX3N0cmR1cCgiXG4iKSk7CisKKyAgdG1wID0gZ3ByX3N0cnZlY19mbGF0dGVuKCZzLCBOVUxMKTsKKyAgZ3ByX3N0cnZlY19kZXN0cm95KCZzKTsKKyAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGludCBwcmludF91c2FnZV9hbmRfZGllKGdwcl9jbWRsaW5lICpjbCkgeworICBjaGFyICp1c2FnZSA9IGdwcl9jbWRsaW5lX3VzYWdlX3N0cmluZyhjbCwgY2wtPmFyZ3YwKTsKKyAgZnByaW50ZihzdGRlcnIsICIlcyIsIHVzYWdlKTsKKyAgZ3ByX2ZyZWUodXNhZ2UpOworICBpZiAoIWNsLT5zdXJ2aXZlX2ZhaWx1cmUpIHsKKyAgICBleGl0KDEpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dHJhX3N0YXRlKGdwcl9jbWRsaW5lICpjbCwgY2hhciAqc3RyKSB7CisgIGlmICghY2wtPmV4dHJhX2FyZykgeworICAgIHJldHVybiBwcmludF91c2FnZV9hbmRfZGllKGNsKTsKKyAgfQorICBjbC0+ZXh0cmFfYXJnKGNsLT5leHRyYV9hcmdfdXNlcl9kYXRhLCBzdHIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGFyZyAqZmluZF9hcmcoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICpuYW1lKSB7CisgIGFyZyAqYTsKKworICBmb3IgKGEgPSBjbC0+YXJnczsgYTsgYSA9IGEtPm5leHQpIHsKKyAgICBpZiAoMCA9PSBzdHJjbXAoYS0+bmFtZSwgbmFtZSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghYSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBhcmd1bWVudDogJXNcbiIsIG5hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBpbnQgdmFsdWVfc3RhdGUoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICpzdHIpIHsKKyAgbG9uZyBpbnR2YWw7CisgIGNoYXIgKmVuZDsKKworICBHUFJfQVNTRVJUKGNsLT5jdXJfYXJnKTsKKworICBzd2l0Y2ggKGNsLT5jdXJfYXJnLT50eXBlKSB7CisgICAgY2FzZSBBUkdUWVBFX0lOVDoKKyAgICAgIGludHZhbCA9IHN0cnRvbChzdHIsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgfHwgaW50dmFsIDwgSU5UX01JTiB8fCBpbnR2YWwgPiBJTlRfTUFYKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXhwZWN0ZWQgaW50ZWdlciwgZ290ICclcycgZm9yICVzXG4iLCBzdHIsCisgICAgICAgICAgICAgICAgY2wtPmN1cl9hcmctPm5hbWUpOworICAgICAgICByZXR1cm4gcHJpbnRfdXNhZ2VfYW5kX2RpZShjbCk7CisgICAgICB9CisgICAgICAqKGludCAqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IChpbnQpaW50dmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdUWVBFX0JPT0w6CisgICAgICBpZiAoMCA9PSBzdHJjbXAoc3RyLCAiMSIpIHx8IDAgPT0gc3RyY21wKHN0ciwgInRydWUiKSkgeworICAgICAgICAqKGludCAqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHN0ciwgIjAiKSB8fCAwID09IHN0cmNtcChzdHIsICJmYWxzZSIpKSB7CisgICAgICAgICooaW50ICopY2wtPmN1cl9hcmctPnZhbHVlID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXhwZWN0ZWQgYm9vbGVhbiwgZ290ICclcycgZm9yICVzXG4iLCBzdHIsCisgICAgICAgICAgICAgICAgY2wtPmN1cl9hcmctPm5hbWUpOworICAgICAgICByZXR1cm4gcHJpbnRfdXNhZ2VfYW5kX2RpZShjbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR1RZUEVfU1RSSU5HOgorICAgICAgKihjaGFyICoqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IHN0cjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgY2wtPnN0YXRlID0gbm9ybWFsX3N0YXRlOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBub3JtYWxfc3RhdGUoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICpzdHIpIHsKKyAgY2hhciAqZXEgPSBOVUxMOworICBjaGFyICp0bXAgPSBOVUxMOworICBjaGFyICphcmdfbmFtZSA9IE5VTEw7CisgIGludCByID0gMTsKKworICBpZiAoMCA9PSBzdHJjbXAoc3RyLCAiLWhlbHAiKSB8fCAwID09IHN0cmNtcChzdHIsICItLWhlbHAiKSB8fAorICAgICAgMCA9PSBzdHJjbXAoc3RyLCAiLWgiKSkgeworICAgIHJldHVybiBwcmludF91c2FnZV9hbmRfZGllKGNsKTsKKyAgfQorCisgIGNsLT5jdXJfYXJnID0gTlVMTDsKKworICBpZiAoc3RyWzBdID09ICctJykgeworICAgIGlmIChzdHJbMV0gPT0gJy0nKSB7CisgICAgICBpZiAoc3RyWzJdID09IDApIHsKKyAgICAgICAgLyogaGFuZGxlICctLScgdG8gbW92ZSB0byBqdXN0IGV4dHJhIGFyZ3MgKi8KKyAgICAgICAgY2wtPnN0YXRlID0gZXh0cmFfc3RhdGU7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgc3RyICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAxOworICAgIH0KKyAgICAvKiBmaXJzdCBieXRlIG9mIHN0ciBpcyBub3cgcGFzdCB0aGUgbGVhZGluZyAnLScgb3IgJy0tJyAqLworICAgIGlmIChzdHJbMF0gPT0gJ24nICYmIHN0clsxXSA9PSAnbycgJiYgc3RyWzJdID09ICctJykgeworICAgICAgLyogc3RyIGlzIG9mIHRoZSBmb3JtICctLW5vLWZvbycgLSBpdCdzIGEgZmxhZyBkaXNhYmxlICovCisgICAgICBzdHIgKz0gMzsKKyAgICAgIGNsLT5jdXJfYXJnID0gZmluZF9hcmcoY2wsIHN0cik7CisgICAgICBpZiAoY2wtPmN1cl9hcmcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gcHJpbnRfdXNhZ2VfYW5kX2RpZShjbCk7CisgICAgICB9CisgICAgICBpZiAoY2wtPmN1cl9hcmctPnR5cGUgIT0gQVJHVFlQRV9CT09MKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgaXMgbm90IGEgZmxhZyBhcmd1bWVudFxuIiwgc3RyKTsKKyAgICAgICAgcmV0dXJuIHByaW50X3VzYWdlX2FuZF9kaWUoY2wpOworICAgICAgfQorICAgICAgKihpbnQgKiljbC0+Y3VyX2FyZy0+dmFsdWUgPSAwOworICAgICAgcmV0dXJuIDE7IC8qIGVhcmx5IG91dCAqLworICAgIH0KKyAgICBlcSA9IHN0cmNocihzdHIsICc9Jyk7CisgICAgaWYgKGVxICE9IE5VTEwpIHsKKyAgICAgIC8qIGNvcHkgdGhlIHN0cmluZyBpbnRvIGEgdGVtcCBidWZmZXIgYW5kIGV4dHJhY3QgdGhlIG5hbWUgKi8KKyAgICAgIHRtcCA9IGFyZ19uYW1lID0gZ3ByX21hbGxvYygoc2l6ZV90KShlcSAtIHN0ciArIDEpKTsKKyAgICAgIG1lbWNweShhcmdfbmFtZSwgc3RyLCAoc2l6ZV90KShlcSAtIHN0cikpOworICAgICAgYXJnX25hbWVbZXEgLSBzdHJdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgYXJnX25hbWUgPSBzdHI7CisgICAgfQorICAgIGNsLT5jdXJfYXJnID0gZmluZF9hcmcoY2wsIGFyZ19uYW1lKTsKKyAgICBpZiAoY2wtPmN1cl9hcmcgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIHByaW50X3VzYWdlX2FuZF9kaWUoY2wpOworICAgIH0KKyAgICBpZiAoZXEgIT0gTlVMTCkgeworICAgICAgLyogc3RyIHdhcyBvZiB0aGUgdHlwZSAtLWZvbz12YWx1ZSwgcGFyc2UgdGhlIHZhbHVlICovCisgICAgICByID0gdmFsdWVfc3RhdGUoY2wsIGVxICsgMSk7CisgICAgfSBlbHNlIGlmIChjbC0+Y3VyX2FyZy0+dHlwZSAhPSBBUkdUWVBFX0JPT0wpIHsKKyAgICAgIC8qIGZsYWcgdHlwZXMgZG9uJ3QgaGF2ZSBhICctLWZvbyB2YWx1ZScgdmFyaWFudCwgb3RoZXIgdHlwZXMgZG8gKi8KKyAgICAgIGNsLT5zdGF0ZSA9IHZhbHVlX3N0YXRlOworICAgIH0gZWxzZSB7CisgICAgICAvKiBmbGFnIHBhcmFtZXRlcjoganVzdCBzZXQgdGhlIHZhbHVlICovCisgICAgICAqKGludCAqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgIHIgPSBleHRyYV9zdGF0ZShjbCwgc3RyKTsKKyAgfQorCisgIGdwcl9mcmVlKHRtcCk7CisgIHJldHVybiByOworfQorCitpbnQgZ3ByX2NtZGxpbmVfcGFyc2UoZ3ByX2NtZGxpbmUgKmNsLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgaW50IGk7CisKKyAgR1BSX0FTU0VSVChhcmdjID49IDEpOworICBjbC0+YXJndjAgPSBhcmd2WzBdOworCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoIWNsLT5zdGF0ZShjbCwgYXJndltpXSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODMxOTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2lwaG9uZS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX0NQVV9JUEhPTkUKKworLyogUHJvYmFibHkgMiBpbnN0ZWFkIG9mIDEsIGJ1dCBzZWUgY29tbWVudCBvbiBncHJfY3B1X2N1cnJlbnRfY3B1LiAqLwordW5zaWduZWQgZ3ByX2NwdV9udW1fY29yZXModm9pZCkgeyByZXR1cm4gMTsgfQorCisvKiBNb3N0IGNvZGUgdGhhdCdzIHVzaW5nIHRoaXMgaXMgdXNpbmcgaXQgdG8gc2hhcmQgYWNyb3NzIHdvcmsgcXVldWVzLiBTbworICAgdW5sZXNzIHByb2ZpbGluZyBzaG93cyBpdCdzIGEgcHJvYmxlbSBvciB0aGVyZSBhcHBlYXJzIGEgd2F5IHRvIGRldGVjdCB0aGUKKyAgIGN1cnJlbnRseSBydW5uaW5nIENQVSBjb3JlLCBsZXQncyBoYXZlIGl0IHNoYXJkIHRoZSBkZWZhdWx0IHdheS4KKyAgIE5vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIGluIGNwdS5oIGxldHMgZ3ByX2NwdV9udW1fY29yZXMgcmV0dXJuIDAsIGJ1dCBkb2luZworICAgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgZ3ByX2NwdV9jdXJyZW50X2NwdSB0byBzYXRpc2Z5IGl0cyBzdGF0ZWQgcmFuZ2UsCisgICBhbmQgc29tZSBjb2RlIG1pZ2h0IGJlIHJlbHlpbmcgb24gaXQuICovCit1bnNpZ25lZCBncHJfY3B1X2N1cnJlbnRfY3B1KHZvaWQpIHsgcmV0dXJuIDA7IH0KKworI2VuZGlmIC8qIEdQUl9DUFVfSVBIT05FICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2NwdV9saW51eC5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X2xpbnV4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3N1cHBvcnQvY3B1X2xpbnV4LmMKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9saW51eC5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3Bvc2l4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3N1cHBvcnQvY3B1X3Bvc2l4LmMKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9wb3NpeC5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg0YTllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3dpbmRvd3MuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU4zMgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKwordW5zaWduZWQgZ3ByX2NwdV9udW1fY29yZXModm9pZCkgeworICBTWVNURU1fSU5GTyBzaTsKKyAgR2V0U3lzdGVtSW5mbygmc2kpOworICByZXR1cm4gc2kuZHdOdW1iZXJPZlByb2Nlc3NvcnM7Cit9CisKK3Vuc2lnbmVkIGdwcl9jcHVfY3VycmVudF9jcHUodm9pZCkgeyByZXR1cm4gR2V0Q3VycmVudFByb2Nlc3Nvck51bWJlcigpOyB9CisKKyNlbmRpZiAvKiBHUFJfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjNGVlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVBQT1JUX0VOVl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9FTlZfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEVudiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCisvKiBHZXRzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgIFJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nLiBJdCBpcyB0aGUgcmVzcG9uc2FiaWxpdHkgb2YgdGhlIGNhbGxlciB0bworICAgZ3ByX2ZyZWUgdGhlIHJldHVybiB2YWx1ZSBpZiBub3QgTlVMTCAod2hpY2ggbWVhbnMgdGhhdCB0aGUgZW52aXJvbm1lbnQKKyAgIHZhcmlhYmxlIGV4aXN0cykuICovCitjaGFyICpncHJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBTZXRzIHRoZSB0aGUgZW52aXJvbm1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gKi8KK3ZvaWQgZ3ByX3NldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfRU5WX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9saW51eC5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2MTMzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9saW51eC5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qIGZvciBzZWN1cmVfZ2V0ZW52LiAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX0xJTlVYX0VOVgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK2NoYXIgKmdwcl9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkgeworI2lmIGRlZmluZWQoR1BSX0JBQ0tXQVJEU19DT01QQVRJQklMSVRZX01PREUpCisgIHR5cGVkZWYgY2hhciAqKCpnZXRlbnZfdHlwZSkoY29uc3QgY2hhciAqKTsKKyAgc3RhdGljIGdldGVudl90eXBlIGdldGVudl9mdW5jID0gTlVMTDsKKyAgLyogQ2hlY2sgdG8gc2VlIHdoaWNoIGdldGVudiB2YXJpYW50IGlzIHN1cHBvcnRlZCAoZ28gZnJvbSBtb3N0CisgICAqIHRvIGxlYXN0IHNlY3VyZSkgKi8KKyAgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsic2VjdXJlX2dldGVudiIsICJfX3NlY3VyZV9nZXRlbnYiLCAiZ2V0ZW52In07CisgIGZvciAoc2l6ZV90IGkgPSAwOyBnZXRlbnZfZnVuYyA9PSBOVUxMICYmIGkgPCBHUFJfQVJSQVlfU0laRShuYW1lcyk7IGkrKykgeworICAgIGdldGVudl9mdW5jID0gKGdldGVudl90eXBlKWRsc3ltKFJUTERfREVGQVVMVCwgbmFtZXNbaV0pOworICAgIGlmIChnZXRlbnZfZnVuYyAhPSBOVUxMICYmIHN0cnN0cihuYW1lc1tpXSwgInNlY3VyZSIpID09IE5VTEwpIHsKKyAgICAgIGdwcl9sb2coR1BSX0RFQlVHLAorICAgICAgICAgICAgICAiV2FybmluZzogaW5zZWN1cmUgZW52aXJvbm1lbnQgcmVhZCBmdW5jdGlvbiAnJXMnIHVzZWQiLAorICAgICAgICAgICAgICBuYW1lc1tpXSk7CisgICAgfQorICB9CisgIGNoYXIgKnJlc3VsdCA9IGdldGVudl9mdW5jKG5hbWUpOworICByZXR1cm4gcmVzdWx0ID09IE5VTEwgPyByZXN1bHQgOiBncHJfc3RyZHVwKHJlc3VsdCk7CisjZWxpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMTcpCisgIGNoYXIgKnJlc3VsdCA9IHNlY3VyZV9nZXRlbnYobmFtZSk7CisgIHJldHVybiByZXN1bHQgPT0gTlVMTCA/IHJlc3VsdCA6IGdwcl9zdHJkdXAocmVzdWx0KTsKKyNlbHNlCisgIGdwcl9sb2coR1BSX0RFQlVHLCAiV2FybmluZzogaW5zZWN1cmUgZW52aXJvbm1lbnQgcmVhZCBmdW5jdGlvbiAnJXMnIHVzZWQiLAorICAgICAgICAgICJnZXRlbnYiKTsKKyAgY2hhciAqcmVzdWx0ID0gZ2V0ZW52KG5hbWUpOworICByZXR1cm4gcmVzdWx0ID09IE5VTEwgPyByZXN1bHQgOiBncHJfc3RyZHVwKHJlc3VsdCk7CisjZW5kaWYKK30KKwordm9pZCBncHJfc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgIGludCByZXMgPSBzZXRlbnYobmFtZSwgdmFsdWUsIDEpOworICBHUFJfQVNTRVJUKHJlcyA9PSAwKTsKK30KKworI2VuZGlmIC8qIEdQUl9MSU5VWF9FTlYgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1N2IwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1BPU0lYX0VOVgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCitjaGFyICpncHJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgY2hhciAqcmVzdWx0ID0gZ2V0ZW52KG5hbWUpOworICByZXR1cm4gcmVzdWx0ID09IE5VTEwgPyByZXN1bHQgOiBncHJfc3RyZHVwKHJlc3VsdCk7Cit9CisKK3ZvaWQgZ3ByX3NldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkgeworICBpbnQgcmVzID0gc2V0ZW52KG5hbWUsIHZhbHVlLCAxKTsKKyAgR1BSX0FTU0VSVChyZXMgPT0gMCk7Cit9CisKKyNlbmRpZiAvKiBHUFJfUE9TSVhfRU5WICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfd2luMzIuYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmZlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfd2luMzIuYwpAQCAtMCwwICsxLDczIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU4zMgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKKyNpZmRlZiBfX01JTkdXMzJfXworZXJybm9fdCBnZXRlbnZfcyhzaXplX3QgKnNpemVfbmVlZGVkLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJuYW1lKTsKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKworY2hhciAqZ3ByX2dldGVudihjb25zdCBjaGFyICpuYW1lKSB7CisgIHNpemVfdCBzaXplOworICBjaGFyICpyZXN1bHQgPSBOVUxMOworICBlcnJub190IGVycjsKKworICBlcnIgPSBnZXRlbnZfcygmc2l6ZSwgTlVMTCwgMCwgbmFtZSk7CisgIGlmIChlcnIgfHwgKHNpemUgPT0gMCkpIHJldHVybiBOVUxMOworICByZXN1bHQgPSBncHJfbWFsbG9jKHNpemUpOworICBlcnIgPSBnZXRlbnZfcygmc2l6ZSwgcmVzdWx0LCBzaXplLCBuYW1lKTsKKyAgaWYgKGVycikgeworICAgIGdwcl9mcmVlKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBncHJfc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgIGVycm5vX3QgcmVzID0gX3B1dGVudl9zKG5hbWUsIHZhbHVlKTsKKyAgR1BSX0FTU0VSVChyZXMgPT0gMCk7Cit9CisKKyNlbmRpZiAvKiBHUFJfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvaGlzdG9ncmFtLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9oaXN0b2dyYW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC9oaXN0b2dyYW0uYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvaGlzdG9ncmFtLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvaG9zdF9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzZjYyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK2ludCBncHJfam9pbl9ob3N0X3BvcnQoY2hhciAqKm91dCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpIHsKKyAgaWYgKGhvc3RbMF0gIT0gJ1snICYmIHN0cmNocihob3N0LCAnOicpICE9IE5VTEwpIHsKKyAgICAvKiBJUHY2IGxpdGVyYWxzIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2tldHMuICovCisgICAgcmV0dXJuIGdwcl9hc3ByaW50ZihvdXQsICJbJXNdOiVkIiwgaG9zdCwgcG9ydCk7CisgIH0gZWxzZSB7CisgICAgLyogT3JkaW5hcnkgbm9uLWJyYWNrZXRlZCBob3N0OnBvcnQuICovCisgICAgcmV0dXJuIGdwcl9hc3ByaW50ZihvdXQsICIlczolZCIsIGhvc3QsIHBvcnQpOworICB9Cit9CisKK2ludCBncHJfc3BsaXRfaG9zdF9wb3J0KGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKipob3N0LCBjaGFyICoqcG9ydCkgeworICBjb25zdCBjaGFyICpob3N0X3N0YXJ0OworICBzaXplX3QgaG9zdF9sZW47CisgIGNvbnN0IGNoYXIgKnBvcnRfc3RhcnQ7CisKKyAgKmhvc3QgPSBOVUxMOworICAqcG9ydCA9IE5VTEw7CisKKyAgaWYgKG5hbWVbMF0gPT0gJ1snKSB7CisgICAgLyogUGFyc2UgYSBicmFja2V0ZWQgaG9zdCwgdHlwaWNhbGx5IGFuIElQdjYgbGl0ZXJhbC4gKi8KKyAgICBjb25zdCBjaGFyICpyYnJhY2tldCA9IHN0cmNocihuYW1lLCAnXScpOworICAgIGlmIChyYnJhY2tldCA9PSBOVUxMKSB7CisgICAgICAvKiBVbm1hdGNoZWQgWyAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChyYnJhY2tldFsxXSA9PSAnXDAnKSB7CisgICAgICAvKiBdPGVuZD4gKi8KKyAgICAgIHBvcnRfc3RhcnQgPSBOVUxMOworICAgIH0gZWxzZSBpZiAocmJyYWNrZXRbMV0gPT0gJzonKSB7CisgICAgICAvKiBdOjxwb3J0Pz4gKi8KKyAgICAgIHBvcnRfc3RhcnQgPSByYnJhY2tldCArIDI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIF08aW52YWxpZD4gKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBob3N0X3N0YXJ0ID0gbmFtZSArIDE7CisgICAgaG9zdF9sZW4gPSAoc2l6ZV90KShyYnJhY2tldCAtIGhvc3Rfc3RhcnQpOworICAgIGlmIChtZW1jaHIoaG9zdF9zdGFydCwgJzonLCBob3N0X2xlbikgPT0gTlVMTCkgeworICAgICAgLyogUmVxdWlyZSBhbGwgYnJhY2tldGVkIGhvc3RzIHRvIGNvbnRhaW4gYSBjb2xvbiwgYmVjYXVzZSBhIGhvc3RuYW1lIG9yCisgICAgICAgICBJUHY0IGFkZHJlc3Mgc2hvdWxkIG5ldmVyIHVzZSBicmFja2V0cy4gKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBjaGFyICpjb2xvbiA9IHN0cmNocihuYW1lLCAnOicpOworICAgIGlmIChjb2xvbiAhPSBOVUxMICYmIHN0cmNocihjb2xvbiArIDEsICc6JykgPT0gTlVMTCkgeworICAgICAgLyogRXhhY3RseSAxIGNvbG9uLiAgU3BsaXQgaW50byBob3N0OnBvcnQuICovCisgICAgICBob3N0X3N0YXJ0ID0gbmFtZTsKKyAgICAgIGhvc3RfbGVuID0gKHNpemVfdCkoY29sb24gLSBuYW1lKTsKKyAgICAgIHBvcnRfc3RhcnQgPSBjb2xvbiArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIDAgb3IgMisgY29sb25zLiAgQmFyZSBob3N0bmFtZSBvciBJUHY2IGxpdGVhcmFsLiAqLworICAgICAgaG9zdF9zdGFydCA9IG5hbWU7CisgICAgICBob3N0X2xlbiA9IHN0cmxlbihuYW1lKTsKKyAgICAgIHBvcnRfc3RhcnQgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIEFsbG9jYXRlIHJldHVybiB2YWx1ZXMuICovCisgICpob3N0ID0gZ3ByX21hbGxvYyhob3N0X2xlbiArIDEpOworICBtZW1jcHkoKmhvc3QsIGhvc3Rfc3RhcnQsIGhvc3RfbGVuKTsKKyAgKCpob3N0KVtob3N0X2xlbl0gPSAnXDAnOworCisgIGlmIChwb3J0X3N0YXJ0ICE9IE5VTEwpIHsKKyAgICAqcG9ydCA9IGdwcl9zdHJkdXAocG9ydF9zdGFydCk7CisgIH0KKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlY2Q1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorCitncHJfc2xpY2UgZ3ByX2xvYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGFkZF9udWxsX3Rlcm1pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN1Y2Nlc3MpIHsKKyAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBOVUxMOworICBzaXplX3QgY29udGVudHNfc2l6ZSA9IDA7CisgIGNoYXIgKmVycm9yX21zZyA9IE5VTEw7CisgIGdwcl9zbGljZSByZXN1bHQgPSBncHJfZW1wdHlfc2xpY2UoKTsKKyAgRklMRSAqZmlsZTsKKyAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCisgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047CisgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICBncHJfYXNwcmludGYoJmVycm9yX21zZywgIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMgKGVycm9yID0gJXMpLiIsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIEdQUl9BU1NFUlQoZXJyb3JfbXNnICE9IE5VTEwpOworICAgIGdvdG8gZW5kOworICB9CisgIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKyAgLyogQ29udmVydGluZyB0byBzaXplX3Qgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBpdCB3aWxsIG5vdCBmYWlsICovCisgIGNvbnRlbnRzX3NpemUgPSAoc2l6ZV90KWZ0ZWxsKGZpbGUpOworICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CisgIGNvbnRlbnRzID0gZ3ByX21hbGxvYyhjb250ZW50c19zaXplICsgKGFkZF9udWxsX3Rlcm1pbmF0b3IgPyAxIDogMCkpOworICBieXRlc19yZWFkID0gZnJlYWQoY29udGVudHMsIDEsIGNvbnRlbnRzX3NpemUsIGZpbGUpOworICBpZiAoYnl0ZXNfcmVhZCA8IGNvbnRlbnRzX3NpemUpIHsKKyAgICBHUFJfQVNTRVJUKGZlcnJvcihmaWxlKSk7CisgICAgZ3ByX2FzcHJpbnRmKCZlcnJvcl9tc2csICJFcnJvciAlcyBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgZmlsZSAlcy4iLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubyksIGZpbGVuYW1lKTsKKyAgICBHUFJfQVNTRVJUKGVycm9yX21zZyAhPSBOVUxMKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAoc3VjY2VzcyAhPSBOVUxMKSAqc3VjY2VzcyA9IDE7CisgIGlmIChhZGRfbnVsbF90ZXJtaW5hdG9yKSB7CisgICAgY29udGVudHNbY29udGVudHNfc2l6ZSsrXSA9IDA7CisgIH0KKyAgcmVzdWx0ID0gZ3ByX3NsaWNlX25ldyhjb250ZW50cywgY29udGVudHNfc2l6ZSwgZ3ByX2ZyZWUpOworCitlbmQ6CisgIGlmIChlcnJvcl9tc2cgIT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMiLCBlcnJvcl9tc2cpOworICAgIGdwcl9mcmVlKGVycm9yX21zZyk7CisgICAgaWYgKHN1Y2Nlc3MgIT0gTlVMTCkgKnN1Y2Nlc3MgPSAwOworICB9CisgIGlmIChmaWxlICE9IE5VTEwpIGZjbG9zZShmaWxlKTsKKyAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaCBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDMwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaApAQCAtMCwwICsxLDU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9MT0FEX0ZJTEVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUFBPUlRfTE9BRF9GSUxFX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBMb2FkcyB0aGUgY29udGVudCBvZiBhIGZpbGUgaW50byBhIHNsaWNlLiBhZGRfbnVsbF90ZXJtaW5hdG9yIHdpbGwgYWRkCisgICBhIE5VTEwgdGVybWluYXRvciBpZiBub24temVyby4gVGhlIHN1Y2Nlc3MgcGFyYW1ldGVyLCBpZiBub3QgTlVMTCwKKyAgIHdpbGwgYmUgc2V0IHRvIDEgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAwIGluIGNhc2Ugb2YgZmFpbHVyZS4gKi8KK2dwcl9zbGljZSBncHJfbG9hZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgYWRkX251bGxfdGVybWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3VjY2Vzcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfTE9BRF9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZy5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YTA3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiB2b2lkIGdwcl9kZWZhdWx0X2xvZyhncHJfbG9nX2Z1bmNfYXJncyAqYXJncyk7CitzdGF0aWMgZ3ByX2xvZ19mdW5jIGdfbG9nX2Z1bmMgPSBncHJfZGVmYXVsdF9sb2c7CisKK2NvbnN0IGNoYXIgKmdwcl9sb2dfc2V2ZXJpdHlfc3RyaW5nKGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHkpIHsKKyAgc3dpdGNoIChzZXZlcml0eSkgeworICAgIGNhc2UgR1BSX0xPR19TRVZFUklUWV9ERUJVRzoKKyAgICAgIHJldHVybiAiRCI7CisgICAgY2FzZSBHUFJfTE9HX1NFVkVSSVRZX0lORk86CisgICAgICByZXR1cm4gIkkiOworICAgIGNhc2UgR1BSX0xPR19TRVZFUklUWV9FUlJPUjoKKyAgICAgIHJldHVybiAiRSI7CisgIH0KKyAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICJVTktOT1dOIik7Cit9CisKK3ZvaWQgZ3ByX2xvZ19tZXNzYWdlKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBncHJfbG9nX3NldmVyaXR5IHNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkgeworICBncHJfbG9nX2Z1bmNfYXJncyBsZmFyZ3M7CisgIG1lbXNldCgmbGZhcmdzLCAwLCBzaXplb2YobGZhcmdzKSk7CisgIGxmYXJncy5maWxlID0gZmlsZTsKKyAgbGZhcmdzLmxpbmUgPSBsaW5lOworICBsZmFyZ3Muc2V2ZXJpdHkgPSBzZXZlcml0eTsKKyAgbGZhcmdzLm1lc3NhZ2UgPSBtZXNzYWdlOworICBnX2xvZ19mdW5jKCZsZmFyZ3MpOworfQorCit2b2lkIGdwcl9zZXRfbG9nX2Z1bmN0aW9uKGdwcl9sb2dfZnVuYyBmKSB7IGdfbG9nX2Z1bmMgPSBmOyB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2xvZ19hbmRyb2lkLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfYW5kcm9pZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS9zdXBwb3J0L2xvZ19hbmRyb2lkLmMKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfbGludXguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC9sb2dfbGludXguYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfcG9zaXguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC9sb2dfcG9zaXguYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3Bvc2l4LmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ193aW4zMi5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjOTk0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ193aW4zMi5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU4zMgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nX3dpbjMyLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5oIgorCit2b2lkIGdwcl9sb2coY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKKyAgY2hhciAqbWVzc2FnZSA9IE5VTEw7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldDsKKworICAvKiBEZXRlcm1pbmUgdGhlIGxlbmd0aC4gKi8KKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgcmV0ID0gX3ZzY3ByaW50Zihmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgbWVzc2FnZSA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyLCB3aXRoIHNwYWNlIGZvciB0aGUgTlVMIHRlcm1pbmF0b3IuICovCisgICAgc2l6ZV90IHN0cnBfYnVmbGVuID0gKHNpemVfdClyZXQgKyAxOworICAgIG1lc3NhZ2UgPSBncHJfbWFsbG9jKHN0cnBfYnVmbGVuKTsKKworICAgIC8qIFByaW50IHRvIHRoZSBidWZmZXIuICovCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICByZXQgPSB2c25wcmludGZfcyhtZXNzYWdlLCBzdHJwX2J1ZmxlbiwgX1RSVU5DQVRFLCBmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICBpZiAoKHNpemVfdClyZXQgIT0gc3RycF9idWZsZW4gLSAxKSB7CisgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisgICAgICBncHJfZnJlZShtZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGdwcl9sb2dfbWVzc2FnZShmaWxlLCBsaW5lLCBzZXZlcml0eSwgbWVzc2FnZSk7CisgIGdwcl9mcmVlKG1lc3NhZ2UpOworfQorCisvKiBTaW1wbGUgc3RhcnRlciBpbXBsZW1lbnRhdGlvbiAqLwordm9pZCBncHJfZGVmYXVsdF9sb2coZ3ByX2xvZ19mdW5jX2FyZ3MgKmFyZ3MpIHsKKyAgY2hhciAqZmluYWxfc2xhc2g7CisgIGNvbnN0IGNoYXIgKmRpc3BsYXlfZmlsZTsKKyAgY2hhciB0aW1lX2J1ZmZlcls2NF07CisgIHRpbWVfdCB0aW1lcjsKKyAgZ3ByX3RpbWVzcGVjIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgc3RydWN0IHRtIHRtOworCisgIHRpbWVyID0gKHRpbWVfdClub3cudHZfc2VjOworICBmaW5hbF9zbGFzaCA9IHN0cnJjaHIoYXJncy0+ZmlsZSwgJ1xcJyk7CisgIGlmIChmaW5hbF9zbGFzaCA9PSBOVUxMKQorICAgIGRpc3BsYXlfZmlsZSA9IGFyZ3MtPmZpbGU7CisgIGVsc2UKKyAgICBkaXNwbGF5X2ZpbGUgPSBmaW5hbF9zbGFzaCArIDE7CisKKyAgaWYgKGxvY2FsdGltZV9zKCZ0bSwgJnRpbWVyKSkgeworICAgIHN0cmNweSh0aW1lX2J1ZmZlciwgImVycm9yOmxvY2FsdGltZSIpOworICB9IGVsc2UgaWYgKDAgPT0KKyAgICAgICAgICAgICBzdHJmdGltZSh0aW1lX2J1ZmZlciwgc2l6ZW9mKHRpbWVfYnVmZmVyKSwgIiVtJWQgJUg6JU06JVMiLCAmdG0pKSB7CisgICAgc3RyY3B5KHRpbWVfYnVmZmVyLCAiZXJyb3I6c3RyZnRpbWUiKTsKKyAgfQorCisgIGZwcmludGYoc3RkZXJyLCAiJXMlcy4lMDl1ICU1bHUgJXM6JWRdICVzXG4iLAorICAgICAgICAgIGdwcl9sb2dfc2V2ZXJpdHlfc3RyaW5nKGFyZ3MtPnNldmVyaXR5KSwgdGltZV9idWZmZXIsCisgICAgICAgICAgKGludCkobm93LnR2X25zZWMpLCBHZXRDdXJyZW50VGhyZWFkSWQoKSwgZGlzcGxheV9maWxlLCBhcmdzLT5saW5lLAorICAgICAgICAgIGFyZ3MtPm1lc3NhZ2UpOworICBmZmx1c2goc3RkZXJyKTsKK30KKworY2hhciAqZ3ByX2Zvcm1hdF9tZXNzYWdlKGludCBtZXNzYWdlaWQpIHsKKyAgTFBUU1RSIHRtZXNzYWdlOworICBjaGFyICptZXNzYWdlOworICBEV09SRCBzdGF0dXMgPSBGb3JtYXRNZXNzYWdlKAorICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgTlVMTCwgKERXT1JEKW1lc3NhZ2VpZCwgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAoTFBUU1RSKSgmdG1lc3NhZ2UpLCAwLCBOVUxMKTsKKyAgaWYgKHN0YXR1cyA9PSAwKSByZXR1cm4gZ3ByX3N0cmR1cCgiVW5hYmxlIHRvIHJldHJpZXZlIGVycm9yIHN0cmluZyIpOworICBtZXNzYWdlID0gZ3ByX3RjaGFyX3RvX2NoYXIodG1lc3NhZ2UpOworICBMb2NhbEZyZWUodG1lc3NhZ2UpOworICByZXR1cm4gbWVzc2FnZTsKK30KKworI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4MzJmMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiCisKKyNkZWZpbmUgUk9UTDMyKHgsIHIpICgoeCkgPDwgKHIpKSB8ICgoeCkgPj4gKDMyIC0gKHIpKSkKKworI2RlZmluZSBGTUlYMzIoaCkgICAgXAorICAoaCkgXj0gKGgpID4+IDE2OyAgXAorICAoaCkgKj0gMHg4NWViY2E2YjsgXAorICAoaCkgXj0gKGgpID4+IDEzOyAgXAorICAoaCkgKj0gMHhjMmIyYWUzNTsgXAorICAoaCkgXj0gKGgpID4+IDE2OworCisvKiBCbG9jayByZWFkIC0gaWYgeW91ciBwbGF0Zm9ybSBuZWVkcyB0byBkbyBlbmRpYW4tc3dhcHBpbmcgb3IgY2FuIG9ubHkKKyAgIGhhbmRsZSBhbGlnbmVkIHJlYWRzLCBkbyB0aGUgY29udmVyc2lvbiBoZXJlICovCisjZGVmaW5lIEdFVEJMT0NLMzIocCwgaSkgKHApWyhpKV0KKwordWludDMyX3QgZ3ByX211cm11cl9oYXNoMyhjb25zdCB2b2lkICprZXksIHNpemVfdCBsZW4sIHVpbnQzMl90IHNlZWQpIHsKKyAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopa2V5OworICBjb25zdCBzaXplX3QgbmJsb2NrcyA9IGxlbiAvIDQ7CisgIGludCBpOworCisgIHVpbnQzMl90IGgxID0gc2VlZDsKKyAgdWludDMyX3QgazE7CisKKyAgY29uc3QgdWludDMyX3QgYzEgPSAweGNjOWUyZDUxOworICBjb25zdCB1aW50MzJfdCBjMiA9IDB4MWI4NzM1OTM7CisKKyAgY29uc3QgdWludDMyX3QgKmJsb2NrcyA9ICgoY29uc3QgdWludDMyX3QgKilrZXkpICsgbmJsb2NrczsKKyAgY29uc3QgdWludDhfdCAqdGFpbCA9IChjb25zdCB1aW50OF90ICopKGRhdGEgKyBuYmxvY2tzICogNCk7CisKKyAgLyogYm9keSAqLworICBmb3IgKGkgPSAtKGludCluYmxvY2tzOyBpOyBpKyspIHsKKyAgICBrMSA9IEdFVEJMT0NLMzIoYmxvY2tzLCBpKTsKKworICAgIGsxICo9IGMxOworICAgIGsxID0gUk9UTDMyKGsxLCAxNSk7CisgICAgazEgKj0gYzI7CisKKyAgICBoMSBePSBrMTsKKyAgICBoMSA9IFJPVEwzMihoMSwgMTMpOworICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDsKKyAgfQorCisgIGsxID0gMDsKKworICAvKiB0YWlsICovCisgIHN3aXRjaCAobGVuICYgMykgeworICAgIGNhc2UgMzoKKyAgICAgIGsxIF49ICgodWludDMyX3QpdGFpbFsyXSkgPDwgMTY7CisgICAgY2FzZSAyOgorICAgICAgazEgXj0gKCh1aW50MzJfdCl0YWlsWzFdKSA8PCA4OworICAgIGNhc2UgMToKKyAgICAgIGsxIF49IHRhaWxbMF07CisgICAgICBrMSAqPSBjMTsKKyAgICAgIGsxID0gUk9UTDMyKGsxLCAxNSk7CisgICAgICBrMSAqPSBjMjsKKyAgICAgIGgxIF49IGsxOworICB9OworCisgIC8qIGZpbmFsaXphdGlvbiAqLworICBoMSBePSAodWludDMyX3QpbGVuOworICBGTUlYMzIoaDEpOworICByZXR1cm4gaDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRjZGYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaApAQCAtMCwwICsxLDQ0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9NVVJNVVJfSEFTSF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9NVVJNVVJfSEFTSF9ICisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIGNvbXB1dGUgdGhlIGhhc2ggb2Yga2V5IChsZW5ndGggbGVuKSAqLwordWludDMyX3QgZ3ByX211cm11cl9oYXNoMyhjb25zdCB2b2lkICprZXksIHNpemVfdCBsZW4sIHVpbnQzMl90IHNlZWQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVBQT1JUX01VUk1VUl9IQVNIX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzk1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZS5jCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2dwcl9zbGljZSBncHJfZW1wdHlfc2xpY2Uodm9pZCkgeworICBncHJfc2xpY2Ugb3V0OworICBvdXQucmVmY291bnQgPSAwOworICBvdXQuZGF0YS5pbmxpbmVkLmxlbmd0aCA9IDA7CisgIHJldHVybiBvdXQ7Cit9CisKK2dwcl9zbGljZSBncHJfc2xpY2VfcmVmKGdwcl9zbGljZSBzbGljZSkgeworICBpZiAoc2xpY2UucmVmY291bnQpIHsKKyAgICBzbGljZS5yZWZjb3VudC0+cmVmKHNsaWNlLnJlZmNvdW50KTsKKyAgfQorICByZXR1cm4gc2xpY2U7Cit9CisKK3ZvaWQgZ3ByX3NsaWNlX3VucmVmKGdwcl9zbGljZSBzbGljZSkgeworICBpZiAoc2xpY2UucmVmY291bnQpIHsKKyAgICBzbGljZS5yZWZjb3VudC0+dW5yZWYoc2xpY2UucmVmY291bnQpOworICB9Cit9CisKKy8qIGdwcl9zbGljZV9mcm9tX3N0YXRpY19zdHJpbmcgc3VwcG9ydCBzdHJ1Y3R1cmUgLSBhIHJlZmNvdW50IHRoYXQgZG9lcworICAgbm90aGluZyAqLworc3RhdGljIHZvaWQgbm9vcF9yZWZfb3JfdW5yZWYodm9pZCAqdW51c2VkKSB7fQorCitzdGF0aWMgZ3ByX3NsaWNlX3JlZmNvdW50IG5vb3BfcmVmY291bnQgPSB7bm9vcF9yZWZfb3JfdW5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9vcF9yZWZfb3JfdW5yZWZ9OworCitncHJfc2xpY2UgZ3ByX3NsaWNlX2Zyb21fc3RhdGljX3N0cmluZyhjb25zdCBjaGFyICpzKSB7CisgIGdwcl9zbGljZSBzbGljZTsKKyAgc2xpY2UucmVmY291bnQgPSAmbm9vcF9yZWZjb3VudDsKKyAgc2xpY2UuZGF0YS5yZWZjb3VudGVkLmJ5dGVzID0gKHVpbnQ4X3QgKilzOworICBzbGljZS5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gc3RybGVuKHMpOworICByZXR1cm4gc2xpY2U7Cit9CisKKy8qIGdwcl9zbGljZV9uZXcgc3VwcG9ydCBzdHJ1Y3R1cmVzIC0gd2UgY3JlYXRlIGEgcmVmY291bnQgb2JqZWN0IGV4dGVuZGVkCisgICB3aXRoIHRoZSB1c2VyIHByb3ZpZGVkIGRhdGEgcG9pbnRlciAmIGRlc3Ryb3kgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IG5ld19zbGljZV9yZWZjb3VudCB7CisgIGdwcl9zbGljZV9yZWZjb3VudCByYzsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7CisgIHZvaWQgKCp1c2VyX2Rlc3Ryb3kpKHZvaWQgKik7CisgIHZvaWQgKnVzZXJfZGF0YTsKK30gbmV3X3NsaWNlX3JlZmNvdW50OworCitzdGF0aWMgdm9pZCBuZXdfc2xpY2VfcmVmKHZvaWQgKnApIHsKKyAgbmV3X3NsaWNlX3JlZmNvdW50ICpyID0gcDsKKyAgZ3ByX3JlZigmci0+cmVmcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5ld19zbGljZV91bnJlZih2b2lkICpwKSB7CisgIG5ld19zbGljZV9yZWZjb3VudCAqciA9IHA7CisgIGlmIChncHJfdW5yZWYoJnItPnJlZnMpKSB7CisgICAgci0+dXNlcl9kZXN0cm95KHItPnVzZXJfZGF0YSk7CisgICAgZ3ByX2ZyZWUocik7CisgIH0KK30KKworZ3ByX3NsaWNlIGdwcl9zbGljZV9uZXcodm9pZCAqcCwgc2l6ZV90IGxlbiwgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKikpIHsKKyAgZ3ByX3NsaWNlIHNsaWNlOworICBuZXdfc2xpY2VfcmVmY291bnQgKnJjID0gZ3ByX21hbGxvYyhzaXplb2YobmV3X3NsaWNlX3JlZmNvdW50KSk7CisgIGdwcl9yZWZfaW5pdCgmcmMtPnJlZnMsIDEpOworICByYy0+cmMucmVmID0gbmV3X3NsaWNlX3JlZjsKKyAgcmMtPnJjLnVucmVmID0gbmV3X3NsaWNlX3VucmVmOworICByYy0+dXNlcl9kZXN0cm95ID0gZGVzdHJveTsKKyAgcmMtPnVzZXJfZGF0YSA9IHA7CisKKyAgc2xpY2UucmVmY291bnQgPSAmcmMtPnJjOworICBzbGljZS5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSBwOworICBzbGljZS5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gbGVuOworICByZXR1cm4gc2xpY2U7Cit9CisKKy8qIGdwcl9zbGljZV9uZXdfd2l0aF9sZW4gc3VwcG9ydCBzdHJ1Y3R1cmVzIC0gd2UgY3JlYXRlIGEgcmVmY291bnQgb2JqZWN0CisgICBleHRlbmRlZCB3aXRoIHRoZSB1c2VyIHByb3ZpZGVkIGRhdGEgcG9pbnRlciAmIGRlc3Ryb3kgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IG5ld193aXRoX2xlbl9zbGljZV9yZWZjb3VudCB7CisgIGdwcl9zbGljZV9yZWZjb3VudCByYzsKKyAgZ3ByX3JlZmNvdW50IHJlZnM7CisgIHZvaWQgKnVzZXJfZGF0YTsKKyAgc2l6ZV90IHVzZXJfbGVuZ3RoOworICB2b2lkICgqdXNlcl9kZXN0cm95KSh2b2lkICosIHNpemVfdCk7Cit9IG5ld193aXRoX2xlbl9zbGljZV9yZWZjb3VudDsKKworc3RhdGljIHZvaWQgbmV3X3dpdGhfbGVuX3JlZih2b2lkICpwKSB7CisgIG5ld193aXRoX2xlbl9zbGljZV9yZWZjb3VudCAqciA9IHA7CisgIGdwcl9yZWYoJnItPnJlZnMpOworfQorCitzdGF0aWMgdm9pZCBuZXdfd2l0aF9sZW5fdW5yZWYodm9pZCAqcCkgeworICBuZXdfd2l0aF9sZW5fc2xpY2VfcmVmY291bnQgKnIgPSBwOworICBpZiAoZ3ByX3VucmVmKCZyLT5yZWZzKSkgeworICAgIHItPnVzZXJfZGVzdHJveShyLT51c2VyX2RhdGEsIHItPnVzZXJfbGVuZ3RoKTsKKyAgICBncHJfZnJlZShyKTsKKyAgfQorfQorCitncHJfc2xpY2UgZ3ByX3NsaWNlX25ld193aXRoX2xlbih2b2lkICpwLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKiwgc2l6ZV90KSkgeworICBncHJfc2xpY2Ugc2xpY2U7CisgIG5ld193aXRoX2xlbl9zbGljZV9yZWZjb3VudCAqcmMgPQorICAgICAgZ3ByX21hbGxvYyhzaXplb2YobmV3X3dpdGhfbGVuX3NsaWNlX3JlZmNvdW50KSk7CisgIGdwcl9yZWZfaW5pdCgmcmMtPnJlZnMsIDEpOworICByYy0+cmMucmVmID0gbmV3X3dpdGhfbGVuX3JlZjsKKyAgcmMtPnJjLnVucmVmID0gbmV3X3dpdGhfbGVuX3VucmVmOworICByYy0+dXNlcl9kZXN0cm95ID0gZGVzdHJveTsKKyAgcmMtPnVzZXJfZGF0YSA9IHA7CisgIHJjLT51c2VyX2xlbmd0aCA9IGxlbjsKKworICBzbGljZS5yZWZjb3VudCA9ICZyYy0+cmM7CisgIHNsaWNlLmRhdGEucmVmY291bnRlZC5ieXRlcyA9IHA7CisgIHNsaWNlLmRhdGEucmVmY291bnRlZC5sZW5ndGggPSBsZW47CisgIHJldHVybiBzbGljZTsKK30KKworZ3ByX3NsaWNlIGdwcl9zbGljZV9mcm9tX2NvcGllZF9idWZmZXIoY29uc3QgY2hhciAqc291cmNlLCBzaXplX3QgbGVuZ3RoKSB7CisgIGdwcl9zbGljZSBzbGljZSA9IGdwcl9zbGljZV9tYWxsb2MobGVuZ3RoKTsKKyAgbWVtY3B5KEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpLCBzb3VyY2UsIGxlbmd0aCk7CisgIHJldHVybiBzbGljZTsKK30KKworZ3ByX3NsaWNlIGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcoY29uc3QgY2hhciAqc291cmNlKSB7CisgIHJldHVybiBncHJfc2xpY2VfZnJvbV9jb3BpZWRfYnVmZmVyKHNvdXJjZSwgc3RybGVuKHNvdXJjZSkpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGdwcl9zbGljZV9yZWZjb3VudCBiYXNlOworICBncHJfcmVmY291bnQgcmVmczsKK30gbWFsbG9jX3JlZmNvdW50OworCitzdGF0aWMgdm9pZCBtYWxsb2NfcmVmKHZvaWQgKnApIHsKKyAgbWFsbG9jX3JlZmNvdW50ICpyID0gcDsKKyAgZ3ByX3JlZigmci0+cmVmcyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hbGxvY191bnJlZih2b2lkICpwKSB7CisgIG1hbGxvY19yZWZjb3VudCAqciA9IHA7CisgIGlmIChncHJfdW5yZWYoJnItPnJlZnMpKSB7CisgICAgZ3ByX2ZyZWUocik7CisgIH0KK30KKworZ3ByX3NsaWNlIGdwcl9zbGljZV9tYWxsb2Moc2l6ZV90IGxlbmd0aCkgeworICBncHJfc2xpY2Ugc2xpY2U7CisKKyAgaWYgKGxlbmd0aCA+IHNpemVvZihzbGljZS5kYXRhLmlubGluZWQuYnl0ZXMpKSB7CisgICAgLyogTWVtb3J5IGxheW91dCB1c2VkIGJ5IHRoZSBzbGljZSBjcmVhdGVkIGhlcmU6CisKKyAgICAgICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICB8IHJlZmNvdW50ICB8IGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAgICAgIHJlZmNvdW50IGlzIGEgbWFsbG9jX3JlZmNvdW50CisgICAgICAgYnl0ZXMgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgb2YgdGhlIHJlcXVlc3RlZCBsZW5ndGgKKyAgICAgICBCb3RoIHBhcnRzIGFyZSBwbGFjZWQgaW4gdGhlIHNhbWUgYWxsb2NhdGlvbiByZXR1cm5lZCBmcm9tIGdwcl9tYWxsb2MgKi8KKyAgICBtYWxsb2NfcmVmY291bnQgKnJjID0gZ3ByX21hbGxvYyhzaXplb2YobWFsbG9jX3JlZmNvdW50KSArIGxlbmd0aCk7CisKKyAgICAvKiBJbml0aWFsIHJlZmNvdW50IG9uIHJjIGlzIDEgLSBhbmQgaXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIHJlbGVhc2UKKyAgICAgICB0aGlzIHJlZmVyZW5jZS4gKi8KKyAgICBncHJfcmVmX2luaXQoJnJjLT5yZWZzLCAxKTsKKworICAgIHJjLT5iYXNlLnJlZiA9IG1hbGxvY19yZWY7CisgICAgcmMtPmJhc2UudW5yZWYgPSBtYWxsb2NfdW5yZWY7CisKKyAgICAvKiBCdWlsZCB1cCB0aGUgc2xpY2UgdG8gYmUgcmV0dXJuZWQuICovCisgICAgLyogVGhlIHNsaWNlcyByZWZjb3VudCBwb2ludHMgYmFjayB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLiAqLworICAgIHNsaWNlLnJlZmNvdW50ID0gJnJjLT5iYXNlOworICAgIC8qIFRoZSBkYXRhIGJ5dGVzIGFyZSBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHJlZmNvdW50IHN0cnVjdCAqLworICAgIHNsaWNlLmRhdGEucmVmY291bnRlZC5ieXRlcyA9ICh1aW50OF90ICopKHJjICsgMSk7CisgICAgLyogQW5kIHRoZSBsZW5ndGggb2YgdGhlIGJsb2NrIGlzIHNldCB0byB0aGUgcmVxdWVzdGVkIGxlbmd0aCAqLworICAgIHNsaWNlLmRhdGEucmVmY291bnRlZC5sZW5ndGggPSBsZW5ndGg7CisgIH0gZWxzZSB7CisgICAgLyogc21hbGwgc2xpY2U6IGp1c3QgaW5saW5lIHRoZSBkYXRhICovCisgICAgc2xpY2UucmVmY291bnQgPSBOVUxMOworICAgIHNsaWNlLmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdClsZW5ndGg7CisgIH0KKyAgcmV0dXJuIHNsaWNlOworfQorCitncHJfc2xpY2UgZ3ByX3NsaWNlX3N1Yl9ub19yZWYoZ3ByX3NsaWNlIHNvdXJjZSwgc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kKSB7CisgIGdwcl9zbGljZSBzdWJzZXQ7CisKKyAgR1BSX0FTU0VSVChlbmQgPj0gYmVnaW4pOworCisgIGlmIChzb3VyY2UucmVmY291bnQpIHsKKyAgICAvKiBFbmZvcmNlIHByZWNvbmRpdGlvbnMgKi8KKyAgICBHUFJfQVNTRVJUKHNvdXJjZS5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID49IGVuZCk7CisKKyAgICAvKiBCdWlsZCB0aGUgcmVzdWx0ICovCisgICAgc3Vic2V0LnJlZmNvdW50ID0gc291cmNlLnJlZmNvdW50OworICAgIC8qIFBvaW50IGludG8gdGhlIHNvdXJjZSBhcnJheSAqLworICAgIHN1YnNldC5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSBzb3VyY2UuZGF0YS5yZWZjb3VudGVkLmJ5dGVzICsgYmVnaW47CisgICAgc3Vic2V0LmRhdGEucmVmY291bnRlZC5sZW5ndGggPSBlbmQgLSBiZWdpbjsKKyAgfSBlbHNlIHsKKyAgICAvKiBFbmZvcmNlIHByZWNvbmRpdGlvbnMgKi8KKyAgICBHUFJfQVNTRVJUKHNvdXJjZS5kYXRhLmlubGluZWQubGVuZ3RoID49IGVuZCk7CisgICAgc3Vic2V0LnJlZmNvdW50ID0gTlVMTDsKKyAgICBzdWJzZXQuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KShlbmQgLSBiZWdpbik7CisgICAgbWVtY3B5KHN1YnNldC5kYXRhLmlubGluZWQuYnl0ZXMsIHNvdXJjZS5kYXRhLmlubGluZWQuYnl0ZXMgKyBiZWdpbiwKKyAgICAgICAgICAgZW5kIC0gYmVnaW4pOworICB9CisgIHJldHVybiBzdWJzZXQ7Cit9CisKK2dwcl9zbGljZSBncHJfc2xpY2Vfc3ViKGdwcl9zbGljZSBzb3VyY2UsIHNpemVfdCBiZWdpbiwgc2l6ZV90IGVuZCkgeworICBncHJfc2xpY2Ugc3Vic2V0OworCisgIGlmIChlbmQgLSBiZWdpbiA8PSBzaXplb2Yoc3Vic2V0LmRhdGEuaW5saW5lZC5ieXRlcykpIHsKKyAgICBzdWJzZXQucmVmY291bnQgPSBOVUxMOworICAgIHN1YnNldC5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpKGVuZCAtIGJlZ2luKTsKKyAgICBtZW1jcHkoc3Vic2V0LmRhdGEuaW5saW5lZC5ieXRlcywgR1BSX1NMSUNFX1NUQVJUX1BUUihzb3VyY2UpICsgYmVnaW4sCisgICAgICAgICAgIGVuZCAtIGJlZ2luKTsKKyAgfSBlbHNlIHsKKyAgICBzdWJzZXQgPSBncHJfc2xpY2Vfc3ViX25vX3JlZihzb3VyY2UsIGJlZ2luLCBlbmQpOworICAgIC8qIEJ1bXAgdGhlIHJlZmNvdW50ICovCisgICAgc3Vic2V0LnJlZmNvdW50LT5yZWYoc3Vic2V0LnJlZmNvdW50KTsKKyAgfQorICByZXR1cm4gc3Vic2V0OworfQorCitncHJfc2xpY2UgZ3ByX3NsaWNlX3NwbGl0X3RhaWwoZ3ByX3NsaWNlICpzb3VyY2UsIHNpemVfdCBzcGxpdCkgeworICBncHJfc2xpY2UgdGFpbDsKKworICBpZiAoc291cmNlLT5yZWZjb3VudCA9PSBOVUxMKSB7CisgICAgLyogaW5saW5lZCBkYXRhLCBjb3B5IGl0IG91dCAqLworICAgIEdQUl9BU1NFUlQoc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoID49IHNwbGl0KTsKKyAgICB0YWlsLnJlZmNvdW50ID0gTlVMTDsKKyAgICB0YWlsLmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdCkoc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoIC0gc3BsaXQpOworICAgIG1lbWNweSh0YWlsLmRhdGEuaW5saW5lZC5ieXRlcywgc291cmNlLT5kYXRhLmlubGluZWQuYnl0ZXMgKyBzcGxpdCwKKyAgICAgICAgICAgdGFpbC5kYXRhLmlubGluZWQubGVuZ3RoKTsKKyAgICBzb3VyY2UtPmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdClzcGxpdDsKKyAgfSBlbHNlIHsKKyAgICBzaXplX3QgdGFpbF9sZW5ndGggPSBzb3VyY2UtPmRhdGEucmVmY291bnRlZC5sZW5ndGggLSBzcGxpdDsKKyAgICBHUFJfQVNTRVJUKHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA+PSBzcGxpdCk7CisgICAgaWYgKHRhaWxfbGVuZ3RoIDwgc2l6ZW9mKHRhaWwuZGF0YS5pbmxpbmVkLmJ5dGVzKSkgeworICAgICAgLyogQ29weSBvdXQgdGhlIGJ5dGVzIC0gaXQnbGwgYmUgY2hlYXBlciB0aGFuIHJlZmNvdW50aW5nICovCisgICAgICB0YWlsLnJlZmNvdW50ID0gTlVMTDsKKyAgICAgIHRhaWwuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KXRhaWxfbGVuZ3RoOworICAgICAgbWVtY3B5KHRhaWwuZGF0YS5pbmxpbmVkLmJ5dGVzLCBzb3VyY2UtPmRhdGEucmVmY291bnRlZC5ieXRlcyArIHNwbGl0LAorICAgICAgICAgICAgIHRhaWxfbGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogQnVpbGQgdGhlIHJlc3VsdCAqLworICAgICAgdGFpbC5yZWZjb3VudCA9IHNvdXJjZS0+cmVmY291bnQ7CisgICAgICAvKiBCdW1wIHRoZSByZWZjb3VudCAqLworICAgICAgdGFpbC5yZWZjb3VudC0+cmVmKHRhaWwucmVmY291bnQpOworICAgICAgLyogUG9pbnQgaW50byB0aGUgc291cmNlIGFycmF5ICovCisgICAgICB0YWlsLmRhdGEucmVmY291bnRlZC5ieXRlcyA9IHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmJ5dGVzICsgc3BsaXQ7CisgICAgICB0YWlsLmRhdGEucmVmY291bnRlZC5sZW5ndGggPSB0YWlsX2xlbmd0aDsKKyAgICB9CisgICAgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gc3BsaXQ7CisgIH0KKworICByZXR1cm4gdGFpbDsKK30KKworZ3ByX3NsaWNlIGdwcl9zbGljZV9zcGxpdF9oZWFkKGdwcl9zbGljZSAqc291cmNlLCBzaXplX3Qgc3BsaXQpIHsKKyAgZ3ByX3NsaWNlIGhlYWQ7CisKKyAgaWYgKHNvdXJjZS0+cmVmY291bnQgPT0gTlVMTCkgeworICAgIEdQUl9BU1NFUlQoc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoID49IHNwbGl0KTsKKworICAgIGhlYWQucmVmY291bnQgPSBOVUxMOworICAgIGhlYWQuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KXNwbGl0OworICAgIG1lbWNweShoZWFkLmRhdGEuaW5saW5lZC5ieXRlcywgc291cmNlLT5kYXRhLmlubGluZWQuYnl0ZXMsIHNwbGl0KTsKKyAgICBzb3VyY2UtPmRhdGEuaW5saW5lZC5sZW5ndGggPQorICAgICAgICAodWludDhfdCkoc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoIC0gc3BsaXQpOworICAgIG1lbW1vdmUoc291cmNlLT5kYXRhLmlubGluZWQuYnl0ZXMsIHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmJ5dGVzICsgc3BsaXQsCisgICAgICAgICAgICBzb3VyY2UtPmRhdGEuaW5saW5lZC5sZW5ndGgpOworICB9IGVsc2UgaWYgKHNwbGl0IDwgc2l6ZW9mKGhlYWQuZGF0YS5pbmxpbmVkLmJ5dGVzKSkgeworICAgIEdQUl9BU1NFUlQoc291cmNlLT5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID49IHNwbGl0KTsKKworICAgIGhlYWQucmVmY291bnQgPSBOVUxMOworICAgIGhlYWQuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KXNwbGl0OworICAgIG1lbWNweShoZWFkLmRhdGEuaW5saW5lZC5ieXRlcywgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMsIHNwbGl0KTsKKyAgICBzb3VyY2UtPmRhdGEucmVmY291bnRlZC5ieXRlcyArPSBzcGxpdDsKKyAgICBzb3VyY2UtPmRhdGEucmVmY291bnRlZC5sZW5ndGggLT0gc3BsaXQ7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVChzb3VyY2UtPmRhdGEucmVmY291bnRlZC5sZW5ndGggPj0gc3BsaXQpOworCisgICAgLyogQnVpbGQgdGhlIHJlc3VsdCAqLworICAgIGhlYWQucmVmY291bnQgPSBzb3VyY2UtPnJlZmNvdW50OworICAgIC8qIEJ1bXAgdGhlIHJlZmNvdW50ICovCisgICAgaGVhZC5yZWZjb3VudC0+cmVmKGhlYWQucmVmY291bnQpOworICAgIC8qIFBvaW50IGludG8gdGhlIHNvdXJjZSBhcnJheSAqLworICAgIGhlYWQuZGF0YS5yZWZjb3VudGVkLmJ5dGVzID0gc291cmNlLT5kYXRhLnJlZmNvdW50ZWQuYnl0ZXM7CisgICAgaGVhZC5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gc3BsaXQ7CisgICAgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgKz0gc3BsaXQ7CisgICAgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoIC09IHNwbGl0OworICB9CisKKyAgcmV0dXJuIGhlYWQ7Cit9CisKK2ludCBncHJfc2xpY2VfY21wKGdwcl9zbGljZSBhLCBncHJfc2xpY2UgYikgeworICBpbnQgZCA9IChpbnQpKEdQUl9TTElDRV9MRU5HVEgoYSkgLSBHUFJfU0xJQ0VfTEVOR1RIKGIpKTsKKyAgaWYgKGQgIT0gMCkgcmV0dXJuIGQ7CisgIHJldHVybiBtZW1jbXAoR1BSX1NMSUNFX1NUQVJUX1BUUihhKSwgR1BSX1NMSUNFX1NUQVJUX1BUUihiKSwKKyAgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKGEpKTsKK30KKworaW50IGdwcl9zbGljZV9zdHJfY21wKGdwcl9zbGljZSBhLCBjb25zdCBjaGFyICpiKSB7CisgIHNpemVfdCBiX2xlbmd0aCA9IHN0cmxlbihiKTsKKyAgaW50IGQgPSAoaW50KShHUFJfU0xJQ0VfTEVOR1RIKGEpIC0gYl9sZW5ndGgpOworICBpZiAoZCAhPSAwKSByZXR1cm4gZDsKKyAgcmV0dXJuIG1lbWNtcChHUFJfU0xJQ0VfU1RBUlRfUFRSKGEpLCBiLCBiX2xlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2U2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCisvKiBncm93IGEgYnVmZmVyOyByZXF1aXJlcyBHUlBDX1NMSUNFX0JVRkZFUl9JTkxJTkVfRUxFTUVOVFMgPiAxICovCisjZGVmaW5lIEdST1coeCkgKDMgKiAoeCkgLyAyKQorCitzdGF0aWMgdm9pZCBtYXliZV9lbWJpZ2dlbihncHJfc2xpY2VfYnVmZmVyICpzYikgeworICBpZiAoc2ItPmNvdW50ID09IHNiLT5jYXBhY2l0eSkgeworICAgIHNiLT5jYXBhY2l0eSA9IEdST1coc2ItPmNhcGFjaXR5KTsKKyAgICBHUFJfQVNTRVJUKHNiLT5jYXBhY2l0eSA+IHNiLT5jb3VudCk7CisgICAgaWYgKHNiLT5zbGljZXMgPT0gc2ItPmlubGluZWQpIHsKKyAgICAgIHNiLT5zbGljZXMgPSBncHJfbWFsbG9jKHNiLT5jYXBhY2l0eSAqIHNpemVvZihncHJfc2xpY2UpKTsKKyAgICAgIG1lbWNweShzYi0+c2xpY2VzLCBzYi0+aW5saW5lZCwgc2ItPmNvdW50ICogc2l6ZW9mKGdwcl9zbGljZSkpOworICAgIH0gZWxzZSB7CisgICAgICBzYi0+c2xpY2VzID0gZ3ByX3JlYWxsb2Moc2ItPnNsaWNlcywgc2ItPmNhcGFjaXR5ICogc2l6ZW9mKGdwcl9zbGljZSkpOworICAgIH0KKyAgfQorfQorCit2b2lkIGdwcl9zbGljZV9idWZmZXJfaW5pdChncHJfc2xpY2VfYnVmZmVyICpzYikgeworICBzYi0+Y291bnQgPSAwOworICBzYi0+bGVuZ3RoID0gMDsKKyAgc2ItPmNhcGFjaXR5ID0gR1JQQ19TTElDRV9CVUZGRVJfSU5MSU5FX0VMRU1FTlRTOworICBzYi0+c2xpY2VzID0gc2ItPmlubGluZWQ7Cit9CisKK3ZvaWQgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KGdwcl9zbGljZV9idWZmZXIgKnNiKSB7CisgIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKHNiKTsKKyAgaWYgKHNiLT5zbGljZXMgIT0gc2ItPmlubGluZWQpIHsKKyAgICBncHJfZnJlZShzYi0+c2xpY2VzKTsKKyAgfQorfQorCit1aW50OF90ICpncHJfc2xpY2VfYnVmZmVyX3RpbnlfYWRkKGdwcl9zbGljZV9idWZmZXIgKnNiLCBzaXplX3QgbikgeworICBncHJfc2xpY2UgKmJhY2s7CisgIHVpbnQ4X3QgKm91dDsKKworICBzYi0+bGVuZ3RoICs9IG47CisKKyAgaWYgKHNiLT5jb3VudCA9PSAwKSBnb3RvIGFkZF9uZXc7CisgIGJhY2sgPSAmc2ItPnNsaWNlc1tzYi0+Y291bnQgLSAxXTsKKyAgaWYgKGJhY2stPnJlZmNvdW50KSBnb3RvIGFkZF9uZXc7CisgIGlmICgoYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCArIG4pID4gc2l6ZW9mKGJhY2stPmRhdGEuaW5saW5lZC5ieXRlcykpCisgICAgZ290byBhZGRfbmV3OworICBvdXQgPSBiYWNrLT5kYXRhLmlubGluZWQuYnl0ZXMgKyBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoOworICBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpKGJhY2stPmRhdGEuaW5saW5lZC5sZW5ndGggKyBuKTsKKyAgcmV0dXJuIG91dDsKKworYWRkX25ldzoKKyAgbWF5YmVfZW1iaWdnZW4oc2IpOworICBiYWNrID0gJnNiLT5zbGljZXNbc2ItPmNvdW50XTsKKyAgc2ItPmNvdW50Kys7CisgIGJhY2stPnJlZmNvdW50ID0gTlVMTDsKKyAgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KW47CisgIHJldHVybiBiYWNrLT5kYXRhLmlubGluZWQuYnl0ZXM7Cit9CisKK3NpemVfdCBncHJfc2xpY2VfYnVmZmVyX2FkZF9pbmRleGVkKGdwcl9zbGljZV9idWZmZXIgKnNiLCBncHJfc2xpY2UgcykgeworICBzaXplX3Qgb3V0ID0gc2ItPmNvdW50OworICBtYXliZV9lbWJpZ2dlbihzYik7CisgIHNiLT5zbGljZXNbb3V0XSA9IHM7CisgIHNiLT5sZW5ndGggKz0gR1BSX1NMSUNFX0xFTkdUSChzKTsKKyAgc2ItPmNvdW50ID0gb3V0ICsgMTsKKyAgcmV0dXJuIG91dDsKK30KKwordm9pZCBncHJfc2xpY2VfYnVmZmVyX2FkZChncHJfc2xpY2VfYnVmZmVyICpzYiwgZ3ByX3NsaWNlIHMpIHsKKyAgc2l6ZV90IG4gPSBzYi0+Y291bnQ7CisgIC8qIGlmIGJvdGggdGhlIGxhc3Qgc2xpY2UgaW4gdGhlIHNsaWNlIGJ1ZmZlciBhbmQgdGhlIHNsaWNlIGJlaW5nIGFkZGVkCisgICAgIGFyZSBpbmxpbmVkICh0aGF0IGlzLCB0aGF0IHRoZXkgY2FycnkgdGhlaXIgZGF0YSBpbnNpZGUgdGhlIHNsaWNlIGRhdGEKKyAgICAgc3RydWN0dXJlKSwgYW5kIHRoZSBiYWNrIHNsaWNlIGlzIG5vdCBmdWxsLCB0aGVuIGNvbmNhdGVuYXRlIGRpcmVjdGx5CisgICAgIGludG8gdGhlIGJhY2sgc2xpY2UsIHByZXZlbnRpbmcgbWFueSBzbWFsbCBzbGljZXMgYmVpbmcgcGFzc2VkIGludG8KKyAgICAgd3JpdGVzICovCisgIGlmICghcy5yZWZjb3VudCAmJiBuKSB7CisgICAgZ3ByX3NsaWNlICpiYWNrID0gJnNiLT5zbGljZXNbbiAtIDFdOworICAgIGlmICghYmFjay0+cmVmY291bnQgJiYgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA8IEdQUl9TTElDRV9JTkxJTkVEX1NJWkUpIHsKKyAgICAgIGlmIChzLmRhdGEuaW5saW5lZC5sZW5ndGggKyBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoIDw9CisgICAgICAgICAgR1BSX1NMSUNFX0lOTElORURfU0laRSkgeworICAgICAgICBtZW1jcHkoYmFjay0+ZGF0YS5pbmxpbmVkLmJ5dGVzICsgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCwKKyAgICAgICAgICAgICAgIHMuZGF0YS5pbmxpbmVkLmJ5dGVzLCBzLmRhdGEuaW5saW5lZC5sZW5ndGgpOworICAgICAgICBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoID0KKyAgICAgICAgICAgICh1aW50OF90KShiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoICsgcy5kYXRhLmlubGluZWQubGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBjcDEgPSBHUFJfU0xJQ0VfSU5MSU5FRF9TSVpFIC0gYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aDsKKyAgICAgICAgbWVtY3B5KGJhY2stPmRhdGEuaW5saW5lZC5ieXRlcyArIGJhY2stPmRhdGEuaW5saW5lZC5sZW5ndGgsCisgICAgICAgICAgICAgICBzLmRhdGEuaW5saW5lZC5ieXRlcywgY3AxKTsKKyAgICAgICAgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA9IEdQUl9TTElDRV9JTkxJTkVEX1NJWkU7CisgICAgICAgIG1heWJlX2VtYmlnZ2VuKHNiKTsKKyAgICAgICAgYmFjayA9ICZzYi0+c2xpY2VzW25dOworICAgICAgICBzYi0+Y291bnQgPSBuICsgMTsKKyAgICAgICAgYmFjay0+cmVmY291bnQgPSBOVUxMOworICAgICAgICBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpKHMuZGF0YS5pbmxpbmVkLmxlbmd0aCAtIGNwMSk7CisgICAgICAgIG1lbWNweShiYWNrLT5kYXRhLmlubGluZWQuYnl0ZXMsIHMuZGF0YS5pbmxpbmVkLmJ5dGVzICsgY3AxLAorICAgICAgICAgICAgICAgcy5kYXRhLmlubGluZWQubGVuZ3RoIC0gY3AxKTsKKyAgICAgIH0KKyAgICAgIHNiLT5sZW5ndGggKz0gcy5kYXRhLmlubGluZWQubGVuZ3RoOworICAgICAgcmV0dXJuOyAvKiBlYXJseSBvdXQgKi8KKyAgICB9CisgIH0KKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChzYiwgcyk7Cit9CisKK3ZvaWQgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRuKGdwcl9zbGljZV9idWZmZXIgKnNiLCBncHJfc2xpY2UgKnMsIHNpemVfdCBuKSB7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoc2IsIHNbaV0pOworICB9Cit9CisKK3ZvaWQgZ3ByX3NsaWNlX2J1ZmZlcl9wb3AoZ3ByX3NsaWNlX2J1ZmZlciAqc2IpIHsKKyAgaWYgKHNiLT5jb3VudCAhPSAwKSB7CisgICAgc2l6ZV90IGNvdW50ID0gLS1zYi0+Y291bnQ7CisgICAgc2ItPmxlbmd0aCAtPSBHUFJfU0xJQ0VfTEVOR1RIKHNiLT5zbGljZXNbY291bnRdKTsKKyAgfQorfQorCit2b2lkIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKGdwcl9zbGljZV9idWZmZXIgKnNiKSB7CisgIHNpemVfdCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzYi0+Y291bnQ7IGkrKykgeworICAgIGdwcl9zbGljZV91bnJlZihzYi0+c2xpY2VzW2ldKTsKKyAgfQorCisgIHNiLT5jb3VudCA9IDA7CisgIHNiLT5sZW5ndGggPSAwOworfQorCit2b2lkIGdwcl9zbGljZV9idWZmZXJfc3dhcChncHJfc2xpY2VfYnVmZmVyICphLCBncHJfc2xpY2VfYnVmZmVyICpiKSB7CisgIEdQUl9TV0FQKHNpemVfdCwgYS0+Y291bnQsIGItPmNvdW50KTsKKyAgR1BSX1NXQVAoc2l6ZV90LCBhLT5jYXBhY2l0eSwgYi0+Y2FwYWNpdHkpOworICBHUFJfU1dBUChzaXplX3QsIGEtPmxlbmd0aCwgYi0+bGVuZ3RoKTsKKworICBpZiAoYS0+c2xpY2VzID09IGEtPmlubGluZWQpIHsKKyAgICBpZiAoYi0+c2xpY2VzID09IGItPmlubGluZWQpIHsKKyAgICAgIC8qIHN3YXAgY29udGVudHMgb2YgaW5saW5lZCBidWZmZXIgKi8KKyAgICAgIGdwcl9zbGljZSB0ZW1wW0dSUENfU0xJQ0VfQlVGRkVSX0lOTElORV9FTEVNRU5UU107CisgICAgICBtZW1jcHkodGVtcCwgYS0+c2xpY2VzLCBiLT5jb3VudCAqIHNpemVvZihncHJfc2xpY2UpKTsKKyAgICAgIG1lbWNweShhLT5zbGljZXMsIGItPnNsaWNlcywgYS0+Y291bnQgKiBzaXplb2YoZ3ByX3NsaWNlKSk7CisgICAgICBtZW1jcHkoYi0+c2xpY2VzLCB0ZW1wLCBiLT5jb3VudCAqIHNpemVvZihncHJfc2xpY2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogYSBpcyBpbmxpbmVkLCBiIGlzIG5vdCAtIGNvcHkgYSBpbmxpbmVkIGludG8gYiwgZml4IHBvaW50ZXJzICovCisgICAgICBhLT5zbGljZXMgPSBiLT5zbGljZXM7CisgICAgICBiLT5zbGljZXMgPSBiLT5pbmxpbmVkOworICAgICAgbWVtY3B5KGItPnNsaWNlcywgYS0+aW5saW5lZCwgYi0+Y291bnQgKiBzaXplb2YoZ3ByX3NsaWNlKSk7CisgICAgfQorICB9IGVsc2UgaWYgKGItPnNsaWNlcyA9PSBiLT5pbmxpbmVkKSB7CisgICAgLyogYiBpcyBpbmxpbmVkLCBhIGlzIG5vdCAtIGNvcHkgYiBpbmxpbmVkIGludCBhLCBmaXggcG9pbnRlcnMgKi8KKyAgICBiLT5zbGljZXMgPSBhLT5zbGljZXM7CisgICAgYS0+c2xpY2VzID0gYS0+aW5saW5lZDsKKyAgICBtZW1jcHkoYS0+c2xpY2VzLCBiLT5pbmxpbmVkLCBhLT5jb3VudCAqIHNpemVvZihncHJfc2xpY2UpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBpbmxpbmluZzogZWFzeSBzd2FwICovCisgICAgR1BSX1NXQVAoZ3ByX3NsaWNlICosIGEtPnNsaWNlcywgYi0+c2xpY2VzKTsKKyAgfQorfQorCit2b2lkIGdwcl9zbGljZV9idWZmZXJfbW92ZV9pbnRvKGdwcl9zbGljZV9idWZmZXIgKnNyYywgZ3ByX3NsaWNlX2J1ZmZlciAqZHN0KSB7CisgIC8qIGFueXRoaW5nIHRvIG1vdmU/ICovCisgIGlmIChzcmMtPmNvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgLyogYW55dGhpbmcgaW4gZHN0PyAqLworICBpZiAoZHN0LT5jb3VudCA9PSAwKSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9zd2FwKHNyYywgZHN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgLyogYm90aCBidWZmZXJzIGhhdmUgZGF0YSAtIGNvcHksIGFuZCByZXNldCBzcmMgKi8KKyAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRuKGRzdCwgc3JjLT5zbGljZXMsIHNyYy0+Y291bnQpOworICBzcmMtPmNvdW50ID0gMDsKKyAgc3JjLT5sZW5ndGggPSAwOworfQorCit2b2lkIGdwcl9zbGljZV9idWZmZXJfbW92ZV9maXJzdChncHJfc2xpY2VfYnVmZmVyICpzcmMsIHNpemVfdCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqZHN0KSB7CisgIHNpemVfdCBzcmNfaWR4OworICBzaXplX3Qgb3V0cHV0X2xlbiA9IGRzdC0+bGVuZ3RoICsgbjsKKyAgc2l6ZV90IG5ld19pbnB1dF9sZW4gPSBzcmMtPmxlbmd0aCAtIG47CisgIEdQUl9BU1NFUlQoc3JjLT5sZW5ndGggPj0gbik7CisgIGlmIChzcmMtPmxlbmd0aCA9PSBuKSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9tb3ZlX2ludG8oc3JjLCBkc3QpOworICAgIHJldHVybjsKKyAgfQorICBzcmNfaWR4ID0gMDsKKyAgd2hpbGUgKHNyY19pZHggPCBzcmMtPmNhcGFjaXR5KSB7CisgICAgZ3ByX3NsaWNlIHNsaWNlID0gc3JjLT5zbGljZXNbc3JjX2lkeF07CisgICAgc2l6ZV90IHNsaWNlX2xlbiA9IEdQUl9TTElDRV9MRU5HVEgoc2xpY2UpOworICAgIGlmIChuID4gc2xpY2VfbGVuKSB7CisgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZChkc3QsIHNsaWNlKTsKKyAgICAgIG4gLT0gc2xpY2VfbGVuOworICAgICAgc3JjX2lkeCsrOworICAgIH0gZWxzZSBpZiAobiA9PSBzbGljZV9sZW4pIHsKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKGRzdCwgc2xpY2UpOworICAgICAgc3JjX2lkeCsrOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsgLyogbiA8IHNsaWNlX2xlbiAqLworICAgICAgc3JjLT5zbGljZXNbc3JjX2lkeF0gPSBncHJfc2xpY2Vfc3BsaXRfdGFpbCgmc2xpY2UsIG4pOworICAgICAgR1BSX0FTU0VSVChHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKSA9PSBuKTsKKyAgICAgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChzcmMtPnNsaWNlc1tzcmNfaWR4XSkgPT0gc2xpY2VfbGVuIC0gbik7CisgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZChkc3QsIHNsaWNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHUFJfQVNTRVJUKGRzdC0+bGVuZ3RoID09IG91dHB1dF9sZW4pOworICBtZW1tb3ZlKHNyYy0+c2xpY2VzLCBzcmMtPnNsaWNlcyArIHNyY19pZHgsCisgICAgICAgICAgc2l6ZW9mKGdwcl9zbGljZSkgKiAoc3JjLT5jb3VudCAtIHNyY19pZHgpKTsKKyAgc3JjLT5jb3VudCAtPSBzcmNfaWR4OworICBzcmMtPmxlbmd0aCA9IG5ld19pbnB1dF9sZW47CisgIEdQUl9BU1NFUlQoc3JjLT5jb3VudCA+IDApOworfQorCit2b2lkIGdwcl9zbGljZV9idWZmZXJfdHJpbV9lbmQoZ3ByX3NsaWNlX2J1ZmZlciAqc2IsIHNpemVfdCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKmdhcmJhZ2UpIHsKKyAgR1BSX0FTU0VSVChuIDw9IHNiLT5sZW5ndGgpOworICBzYi0+bGVuZ3RoIC09IG47CisgIGZvciAoOzspIHsKKyAgICBzaXplX3QgaWR4ID0gc2ItPmNvdW50IC0gMTsKKyAgICBncHJfc2xpY2Ugc2xpY2UgPSBzYi0+c2xpY2VzW2lkeF07CisgICAgc2l6ZV90IHNsaWNlX2xlbiA9IEdQUl9TTElDRV9MRU5HVEgoc2xpY2UpOworICAgIGlmIChzbGljZV9sZW4gPiBuKSB7CisgICAgICBzYi0+c2xpY2VzW2lkeF0gPSBncHJfc2xpY2Vfc3BsaXRfaGVhZCgmc2xpY2UsIHNsaWNlX2xlbiAtIG4pOworICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChnYXJiYWdlLCBzbGljZSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChzbGljZV9sZW4gPT0gbikgeworICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChnYXJiYWdlLCBzbGljZSk7CisgICAgICBzYi0+Y291bnQgPSBpZHg7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkX2luZGV4ZWQoZ2FyYmFnZSwgc2xpY2UpOworICAgICAgbiAtPSBzbGljZV9sZW47CisgICAgICBzYi0+Y291bnQgPSBpZHg7CisgICAgfQorICB9Cit9CisKK2dwcl9zbGljZSBncHJfc2xpY2VfYnVmZmVyX3Rha2VfZmlyc3QoZ3ByX3NsaWNlX2J1ZmZlciAqc2IpIHsKKyAgZ3ByX3NsaWNlIHNsaWNlOworICBHUFJfQVNTRVJUKHNiLT5jb3VudCA+IDApOworICBzbGljZSA9IHNiLT5zbGljZXNbMF07CisgIG1lbW1vdmUoJnNiLT5zbGljZXNbMF0sICZzYi0+c2xpY2VzWzFdLCAoc2ItPmNvdW50IC0gMSkgKiBzaXplb2YoZ3ByX3NsaWNlKSk7CisgIHNiLT5jb3VudC0tOworICBzYi0+bGVuZ3RoIC09IEdQUl9TTElDRV9MRU5HVEgoc2xpY2UpOworICByZXR1cm4gc2xpY2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTgwNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworLyogVGhlIGxvY2tmcmVlIG5vZGUgc3RydWN0dXJlIGlzIGEgc2luZ2xlIGFyY2hpdGVjdHVyZS1sZXZlbAorICAgd29yZCB0aGF0IGFsbG93cyBmb3IgYW4gYXRvbWljIENBUyB0byBzZXQgaXQgdXAuICovCitzdHJ1Y3QgbG9ja2ZyZWVfbm9kZV9jb250ZW50cyB7CisgIC8qIG5leHQgdGhpbmcgdG8gbG9vayBhdC4gQWN0dWFsIGluZGV4IGZvciBoZWFkLCBuZXh0IGluZGV4IG90aGVyd2lzZSAqLworICB1aW50MTZfdCBpbmRleDsKKyNpZmRlZiBHUFJfQVJDSF82NAorICB1aW50MTZfdCBwYWQ7CisgIHVpbnQzMl90IGFiYV9jdHI7CisjZWxzZQorI2lmZGVmIEdQUl9BUkNIXzMyCisgIHVpbnQxNl90IGFiYV9jdHI7CisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIGJpdCB3aWR0aCBhcmNoaXRlY3R1cmUKKyNlbmRpZgorI2VuZGlmCit9OworCisvKiBVc2UgYSB1bmlvbiB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgaW4gdGhlIHNhbWUgYml0cyBhcyBhbiBhdG0gd29yZCAqLwordHlwZWRlZiB1bmlvbiBsb2NrZnJlZV9ub2RlIHsKKyAgZ3ByX2F0bSBhdG07CisgIHN0cnVjdCBsb2NrZnJlZV9ub2RlX2NvbnRlbnRzIGNvbnRlbnRzOworfSBsb2NrZnJlZV9ub2RlOworCisvKiBtYWtlIHN1cmUgdGhhdCBlbnRyaWVzIGFsaWduZWQgdG8gOC1ieXRlcyAqLworI2RlZmluZSBFTlRSWV9BTElHTk1FTlRfQklUUyAzCisvKiByZXNlcnZlIHRoaXMgZW50cnkgYXMgaW52YWxpZCAqLworI2RlZmluZSBJTlZBTElEX0VOVFJZX0lOREVYICgoMSA8PCAxNikgLSAxKQorCitzdHJ1Y3QgZ3ByX3N0YWNrX2xvY2tmcmVlIHsKKyAgbG9ja2ZyZWVfbm9kZSAqZW50cmllczsKKyAgbG9ja2ZyZWVfbm9kZSBoZWFkOyAvKiBBbiBhdG9taWMgZW50cnkgZGVzY3JpYmluZyBjdXJyIGhlYWQgKi8KKworI2lmbmRlZiBOREVCVUcKKyAgLyogQml0bWFwIG9mIHB1c2hlZCBlbnRyaWVzIHRvIGNoZWNrIGZvciBkb3VibGUtcHVzaCBvciBwb3AgKi8KKyAgZ3ByX2F0bSBwdXNoZWRbKElOVkFMSURfRU5UUllfSU5ERVggKyAxKSAvICg4ICogc2l6ZW9mKGdwcl9hdG0pKV07CisjZW5kaWYKK307CisKK2dwcl9zdGFja19sb2NrZnJlZSAqZ3ByX3N0YWNrX2xvY2tmcmVlX2NyZWF0ZShzaXplX3QgZW50cmllcykgeworICBncHJfc3RhY2tfbG9ja2ZyZWUgKnN0YWNrOworICBzdGFjayA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpzdGFjaykpOworICAvKiBTaW5jZSB3ZSBvbmx5IGFsbG9jYXRlIDE2IGJpdHMgdG8gcmVwcmVzZW50IGFuIGVudHJ5IG51bWJlciwKKyAgICogbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHdpdGhpbiB0aGUgZGVzaXJlZCByYW5nZSAqLworICAvKiBSZXNlcnZlIHRoZSBoaWdoZXN0IGVudHJ5IG51bWJlciBhcyBhIGR1bW15ICovCisgIEdQUl9BU1NFUlQoZW50cmllcyA8IElOVkFMSURfRU5UUllfSU5ERVgpOworICBzdGFjay0+ZW50cmllcyA9IGdwcl9tYWxsb2NfYWxpZ25lZChlbnRyaWVzICogc2l6ZW9mKHN0YWNrLT5lbnRyaWVzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5UUllfQUxJR05NRU5UX0JJVFMpOworICAvKiBDbGVhciBvdXQgYWxsIGVudHJpZXMgKi8KKyAgbWVtc2V0KHN0YWNrLT5lbnRyaWVzLCAwLCBlbnRyaWVzICogc2l6ZW9mKHN0YWNrLT5lbnRyaWVzWzBdKSk7CisgIG1lbXNldCgmc3RhY2stPmhlYWQsIDAsIHNpemVvZihzdGFjay0+aGVhZCkpOworI2lmbmRlZiBOREVCVUcKKyAgbWVtc2V0KCZzdGFjay0+cHVzaGVkLCAwLCBzaXplb2Yoc3RhY2stPnB1c2hlZCkpOworI2VuZGlmCisKKyAgR1BSX0FTU0VSVChzaXplb2Yoc3RhY2stPmVudHJpZXMtPmF0bSkgPT0gc2l6ZW9mKHN0YWNrLT5lbnRyaWVzLT5jb250ZW50cykpOworCisgIC8qIFBvaW50IHRoZSBoZWFkIGF0IHJlc2VydmVkIGR1bW15IGVudHJ5ICovCisgIHN0YWNrLT5oZWFkLmNvbnRlbnRzLmluZGV4ID0gSU5WQUxJRF9FTlRSWV9JTkRFWDsKKy8qIEZpbGwgaW4gdGhlIHBhZCBhbmQgYWJhX2N0ciB0byBhdm9pZCBjb25mdXNpbmcgbWVtY2hlY2sgdG9vbHMgKi8KKyNpZmRlZiBHUFJfQVJDSF82NAorICBzdGFjay0+aGVhZC5jb250ZW50cy5wYWQgPSAwOworI2VuZGlmCisgIHN0YWNrLT5oZWFkLmNvbnRlbnRzLmFiYV9jdHIgPSAwOworICByZXR1cm4gc3RhY2s7Cit9CisKK3ZvaWQgZ3ByX3N0YWNrX2xvY2tmcmVlX2Rlc3Ryb3koZ3ByX3N0YWNrX2xvY2tmcmVlICpzdGFjaykgeworICBncHJfZnJlZV9hbGlnbmVkKHN0YWNrLT5lbnRyaWVzKTsKKyAgZ3ByX2ZyZWUoc3RhY2spOworfQorCitpbnQgZ3ByX3N0YWNrX2xvY2tmcmVlX3B1c2goZ3ByX3N0YWNrX2xvY2tmcmVlICpzdGFjaywgaW50IGVudHJ5KSB7CisgIGxvY2tmcmVlX25vZGUgaGVhZDsKKyAgbG9ja2ZyZWVfbm9kZSBuZXdoZWFkOworICBsb2NrZnJlZV9ub2RlIGN1cmVudDsKKyAgbG9ja2ZyZWVfbm9kZSBuZXdlbnQ7CisKKyAgLyogRmlyc3QgZmlsbCBpbiB0aGUgZW50cnkncyBpbmRleCBhbmQgYWJhIGN0ciBmb3IgbmV3IGhlYWQgKi8KKyAgbmV3aGVhZC5jb250ZW50cy5pbmRleCA9ICh1aW50MTZfdCllbnRyeTsKKyNpZmRlZiBHUFJfQVJDSF82NAorICAvKiBGaWxsIGluIHRoZSBwYWQgdG8gYXZvaWQgY29uZnVzaW5nIG1lbWNoZWNrIHRvb2xzICovCisgIG5ld2hlYWQuY29udGVudHMucGFkID0gMDsKKyNlbmRpZgorCisgIC8qIEFsc28gcG9zdC1pbmNyZW1lbnQgdGhlIGFiYV9jdHIgKi8KKyAgY3VyZW50LmF0bSA9IGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZzdGFjay0+ZW50cmllc1tlbnRyeV0uYXRtKTsKKyAgbmV3aGVhZC5jb250ZW50cy5hYmFfY3RyID0gKytjdXJlbnQuY29udGVudHMuYWJhX2N0cjsKKyAgZ3ByX2F0bV9ub19iYXJyaWVyX3N0b3JlKCZzdGFjay0+ZW50cmllc1tlbnRyeV0uYXRtLCBjdXJlbnQuYXRtKTsKKworI2lmbmRlZiBOREVCVUcKKyAgLyogQ2hlY2sgZm9yIGRvdWJsZSBwdXNoICovCisgIHsKKyAgICBpbnQgcHVzaGVkX2luZGV4ID0gZW50cnkgLyAoaW50KSg4ICogc2l6ZW9mKGdwcl9hdG0pKTsKKyAgICBpbnQgcHVzaGVkX2JpdCA9IGVudHJ5ICUgKGludCkoOCAqIHNpemVvZihncHJfYXRtKSk7CisgICAgZ3ByX2F0bSBvbGRfdmFsOworCisgICAgb2xkX3ZhbCA9IGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJnN0YWNrLT5wdXNoZWRbcHVzaGVkX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdwcl9hdG0pMSA8PCBwdXNoZWRfYml0KSk7CisgICAgR1BSX0FTU0VSVCgob2xkX3ZhbCAmICgoKGdwcl9hdG0pMSkgPDwgcHVzaGVkX2JpdCkpID09IDApOworICB9CisjZW5kaWYKKworICBkbyB7CisgICAgLyogQXRvbWljYWxseSBnZXQgdGhlIGV4aXN0aW5nIGhlYWQgdmFsdWUgZm9yIHVzZSAqLworICAgIGhlYWQuYXRtID0gZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJihzdGFjay0+aGVhZC5hdG0pKTsKKyAgICAvKiBQb2ludCB0byBpdCAqLworICAgIG5ld2VudC5hdG0gPSBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmc3RhY2stPmVudHJpZXNbZW50cnldLmF0bSk7CisgICAgbmV3ZW50LmNvbnRlbnRzLmluZGV4ID0gaGVhZC5jb250ZW50cy5pbmRleDsKKyAgICBncHJfYXRtX25vX2JhcnJpZXJfc3RvcmUoJnN0YWNrLT5lbnRyaWVzW2VudHJ5XS5hdG0sIG5ld2VudC5hdG0pOworICB9IHdoaWxlICghZ3ByX2F0bV9yZWxfY2FzKCYoc3RhY2stPmhlYWQuYXRtKSwgaGVhZC5hdG0sIG5ld2hlYWQuYXRtKSk7CisgIC8qIFVzZSByZWxfY2FzIGFib3ZlIHRvIG1ha2Ugc3VyZSB0aGF0IGVudHJ5IGluZGV4IGlzIHNldCBwcm9wZXJseSAqLworICByZXR1cm4gaGVhZC5jb250ZW50cy5pbmRleCA9PSBJTlZBTElEX0VOVFJZX0lOREVYOworfQorCitpbnQgZ3ByX3N0YWNrX2xvY2tmcmVlX3BvcChncHJfc3RhY2tfbG9ja2ZyZWUgKnN0YWNrKSB7CisgIGxvY2tmcmVlX25vZGUgaGVhZDsKKyAgbG9ja2ZyZWVfbm9kZSBuZXdoZWFkOworCisgIGRvIHsKKyAgICBoZWFkLmF0bSA9IGdwcl9hdG1fYWNxX2xvYWQoJihzdGFjay0+aGVhZC5hdG0pKTsKKyAgICBpZiAoaGVhZC5jb250ZW50cy5pbmRleCA9PSBJTlZBTElEX0VOVFJZX0lOREVYKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG5ld2hlYWQuYXRtID0KKyAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJihzdGFjay0+ZW50cmllc1toZWFkLmNvbnRlbnRzLmluZGV4XS5hdG0pKTsKKworICB9IHdoaWxlICghZ3ByX2F0bV9ub19iYXJyaWVyX2NhcygmKHN0YWNrLT5oZWFkLmF0bSksIGhlYWQuYXRtLCBuZXdoZWFkLmF0bSkpOworI2lmbmRlZiBOREVCVUcKKyAgLyogQ2hlY2sgZm9yIHZhbGlkIHBvcCAqLworICB7CisgICAgaW50IHB1c2hlZF9pbmRleCA9IGhlYWQuY29udGVudHMuaW5kZXggLyAoOCAqIHNpemVvZihncHJfYXRtKSk7CisgICAgaW50IHB1c2hlZF9iaXQgPSBoZWFkLmNvbnRlbnRzLmluZGV4ICUgKDggKiBzaXplb2YoZ3ByX2F0bSkpOworICAgIGdwcl9hdG0gb2xkX3ZhbDsKKworICAgIG9sZF92YWwgPSBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZzdGFjay0+cHVzaGVkW3B1c2hlZF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSgoZ3ByX2F0bSkxIDw8IHB1c2hlZF9iaXQpKTsKKyAgICBHUFJfQVNTRVJUKChvbGRfdmFsICYgKCgoZ3ByX2F0bSkxKSA8PCBwdXNoZWRfYml0KSkgIT0gMCk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBoZWFkLmNvbnRlbnRzLmluZGV4OworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzMGEwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfU1RBQ0tfTE9DS0ZSRUVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUFBPUlRfU1RBQ0tfTE9DS0ZSRUVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3R5cGVkZWYgc3RydWN0IGdwcl9zdGFja19sb2NrZnJlZSBncHJfc3RhY2tfbG9ja2ZyZWU7CisKKy8qIFRoaXMgc3RhY2sgbXVzdCBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIHRyYWNrLgorICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBhbGxvd3MgdXAgdG8gNjU1MzQgZW50cmllcyAqLworZ3ByX3N0YWNrX2xvY2tmcmVlICpncHJfc3RhY2tfbG9ja2ZyZWVfY3JlYXRlKHNpemVfdCBlbnRyaWVzKTsKK3ZvaWQgZ3ByX3N0YWNrX2xvY2tmcmVlX2Rlc3Ryb3koZ3ByX3N0YWNrX2xvY2tmcmVlICpzdGFjayk7CisKKy8qIFBhc3MgaW4gYSB2YWxpZCBlbnRyeSBudW1iZXIgZm9yIHRoZSBuZXh0IHN0YWNrIGVudHJ5ICovCisvKiBSZXR1cm5zIDEgaWYgdGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBvbiB0aGUgc3RhY2ssIDAgb3RoZXJ3aXNlICovCitpbnQgZ3ByX3N0YWNrX2xvY2tmcmVlX3B1c2goZ3ByX3N0YWNrX2xvY2tmcmVlICosIGludCBlbnRyeSk7CisKKy8qIFJldHVybnMgLTEgb24gZW1wdHkgb3IgdGhlIGFjdHVhbCBlbnRyeSBudW1iZXIgKi8KK2ludCBncHJfc3RhY2tfbG9ja2ZyZWVfcG9wKGdwcl9zdGFja19sb2NrZnJlZSAqc3RhY2spOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVBQT1JUX1NUQUNLX0xPQ0tGUkVFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1ZDg2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorCitjaGFyICpncHJfc3RyZHVwKGNvbnN0IGNoYXIgKnNyYykgeworICBjaGFyICpkc3Q7CisgIHNpemVfdCBsZW47CisKKyAgaWYgKCFzcmMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGxlbiA9IHN0cmxlbihzcmMpICsgMTsKKyAgZHN0ID0gZ3ByX21hbGxvYyhsZW4pOworCisgIG1lbWNweShkc3QsIHNyYywgbGVuKTsKKworICByZXR1cm4gZHN0OworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBjYXBhY2l0eTsKKyAgc2l6ZV90IGxlbmd0aDsKKyAgY2hhciAqZGF0YTsKK30gZHVtcF9vdXQ7CisKK3N0YXRpYyBkdW1wX291dCBkdW1wX291dF9jcmVhdGUodm9pZCkgeworICBkdW1wX291dCByID0gezAsIDAsIE5VTEx9OworICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZHVtcF9vdXRfYXBwZW5kKGR1bXBfb3V0ICpvdXQsIGNoYXIgYykgeworICBpZiAob3V0LT5sZW5ndGggPT0gb3V0LT5jYXBhY2l0eSkgeworICAgIG91dC0+Y2FwYWNpdHkgPSBHUFJfTUFYKDgsIDIgKiBvdXQtPmNhcGFjaXR5KTsKKyAgICBvdXQtPmRhdGEgPSBncHJfcmVhbGxvYyhvdXQtPmRhdGEsIG91dC0+Y2FwYWNpdHkpOworICB9CisgIG91dC0+ZGF0YVtvdXQtPmxlbmd0aCsrXSA9IGM7Cit9CisKK3N0YXRpYyB2b2lkIGhleGR1bXAoZHVtcF9vdXQgKm91dCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGhleFsxNl0gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisKKyAgY29uc3QgdWludDhfdCAqY29uc3QgYmVnID0gKGNvbnN0IHVpbnQ4X3QgKilidWY7CisgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGVuZCA9IGJlZyArIGxlbjsKKyAgY29uc3QgdWludDhfdCAqY3VyOworCisgIGZvciAoY3VyID0gYmVnOyBjdXIgIT0gZW5kOyArK2N1cikgeworICAgIGlmIChjdXIgIT0gYmVnKSBkdW1wX291dF9hcHBlbmQob3V0LCAnICcpOworICAgIGR1bXBfb3V0X2FwcGVuZChvdXQsIGhleFsqY3VyID4+IDRdKTsKKyAgICBkdW1wX291dF9hcHBlbmQob3V0LCBoZXhbKmN1ciAmIDB4Zl0pOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGFzY2lpZHVtcChkdW1wX291dCAqb3V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKKyAgY29uc3QgdWludDhfdCAqY29uc3QgYmVnID0gKGNvbnN0IHVpbnQ4X3QgKilidWY7CisgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGVuZCA9IGJlZyArIGxlbjsKKyAgY29uc3QgdWludDhfdCAqY3VyOworICBpbnQgb3V0X3dhc19lbXB0eSA9IChvdXQtPmxlbmd0aCA9PSAwKTsKKyAgaWYgKCFvdXRfd2FzX2VtcHR5KSB7CisgICAgZHVtcF9vdXRfYXBwZW5kKG91dCwgJyAnKTsKKyAgICBkdW1wX291dF9hcHBlbmQob3V0LCAnXCcnKTsKKyAgfQorICBmb3IgKGN1ciA9IGJlZzsgY3VyICE9IGVuZDsgKytjdXIpIHsKKyAgICBkdW1wX291dF9hcHBlbmQob3V0LCAoY2hhcikoaXNwcmludCgqY3VyKSA/ICooY2hhciAqKWN1ciA6ICcuJykpOworICB9CisgIGlmICghb3V0X3dhc19lbXB0eSkgeworICAgIGR1bXBfb3V0X2FwcGVuZChvdXQsICdcJycpOworICB9Cit9CisKK2NoYXIgKmdwcl9kdW1wKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdWludDMyX3QgZmxhZ3MpIHsKKyAgZHVtcF9vdXQgb3V0ID0gZHVtcF9vdXRfY3JlYXRlKCk7CisgIGlmIChmbGFncyAmIEdQUl9EVU1QX0hFWCkgeworICAgIGhleGR1bXAoJm91dCwgYnVmLCBsZW4pOworICB9CisgIGlmIChmbGFncyAmIEdQUl9EVU1QX0FTQ0lJKSB7CisgICAgYXNjaWlkdW1wKCZvdXQsIGJ1ZiwgbGVuKTsKKyAgfQorICBkdW1wX291dF9hcHBlbmQoJm91dCwgMCk7CisgIHJldHVybiBvdXQuZGF0YTsKK30KKworY2hhciAqZ3ByX2R1bXBfc2xpY2UoZ3ByX3NsaWNlIHMsIHVpbnQzMl90IGZsYWdzKSB7CisgIHJldHVybiBncHJfZHVtcCgoY29uc3QgY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIocyksIEdQUl9TTElDRV9MRU5HVEgocyksCisgICAgICAgICAgICAgICAgICBmbGFncyk7Cit9CisKK2ludCBncHJfcGFyc2VfYnl0ZXNfdG9fdWludDMyKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdWludDMyX3QgKnJlc3VsdCkgeworICB1aW50MzJfdCBvdXQgPSAwOworICB1aW50MzJfdCBuZXc7CisgIHNpemVfdCBpOworCisgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7IC8qIG11c3QgaGF2ZSBzb21lIGJ5dGVzICovCisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgaWYgKGJ1ZltpXSA8ICcwJyB8fCBidWZbaV0gPiAnOScpIHJldHVybiAwOyAvKiBiYWQgY2hhciAqLworICAgIG5ldyA9IDEwICogb3V0ICsgKHVpbnQzMl90KShidWZbaV0gLSAnMCcpOworICAgIGlmIChuZXcgPCBvdXQpIHJldHVybiAwOyAvKiBvdmVyZmxvdyAqLworICAgIG91dCA9IG5ldzsKKyAgfQorCisgICpyZXN1bHQgPSBvdXQ7CisgIHJldHVybiAxOworfQorCit2b2lkIGdwcl9yZXZlcnNlX2J5dGVzKGNoYXIgKnN0ciwgaW50IGxlbikgeworICBjaGFyICpwMSwgKnAyOworICBmb3IgKHAxID0gc3RyLCBwMiA9IHN0ciArIGxlbiAtIDE7IHAyID4gcDE7ICsrcDEsIC0tcDIpIHsKKyAgICBjaGFyIHRlbXAgPSAqcDE7CisgICAgKnAxID0gKnAyOworICAgICpwMiA9IHRlbXA7CisgIH0KK30KKworaW50IGdwcl9sdG9hKGxvbmcgdmFsdWUsIGNoYXIgKnN0cmluZykgeworICBsb25nIHNpZ247CisgIGludCBpID0gMDsKKworICBpZiAodmFsdWUgPT0gMCkgeworICAgIHN0cmluZ1swXSA9ICcwJzsKKyAgICBzdHJpbmdbMV0gPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgc2lnbiA9IHZhbHVlIDwgMCA/IC0xIDogMTsKKyAgd2hpbGUgKHZhbHVlKSB7CisgICAgc3RyaW5nW2krK10gPSAoY2hhcikoJzAnICsgc2lnbiAqICh2YWx1ZSAlIDEwKSk7CisgICAgdmFsdWUgLz0gMTA7CisgIH0KKyAgaWYgKHNpZ24gPCAwKSBzdHJpbmdbaSsrXSA9ICctJzsKKyAgZ3ByX3JldmVyc2VfYnl0ZXMoc3RyaW5nLCBpKTsKKyAgc3RyaW5nW2ldID0gMDsKKyAgcmV0dXJuIGk7Cit9CisKK2ludCBpbnQ2NF90dG9hKGludDY0X3QgdmFsdWUsIGNoYXIgKnN0cmluZykgeworICBpbnQ2NF90IHNpZ247CisgIGludCBpID0gMDsKKworICBpZiAodmFsdWUgPT0gMCkgeworICAgIHN0cmluZ1swXSA9ICcwJzsKKyAgICBzdHJpbmdbMV0gPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgc2lnbiA9IHZhbHVlIDwgMCA/IC0xIDogMTsKKyAgd2hpbGUgKHZhbHVlKSB7CisgICAgc3RyaW5nW2krK10gPSAoY2hhcikoJzAnICsgc2lnbiAqICh2YWx1ZSAlIDEwKSk7CisgICAgdmFsdWUgLz0gMTA7CisgIH0KKyAgaWYgKHNpZ24gPCAwKSBzdHJpbmdbaSsrXSA9ICctJzsKKyAgZ3ByX3JldmVyc2VfYnl0ZXMoc3RyaW5nLCBpKTsKKyAgc3RyaW5nW2ldID0gMDsKKyAgcmV0dXJuIGk7Cit9CisKK2NoYXIgKmdwcl9zdHJqb2luKGNvbnN0IGNoYXIgKipzdHJzLCBzaXplX3QgbnN0cnMsIHNpemVfdCAqZmluYWxfbGVuZ3RoKSB7CisgIHJldHVybiBncHJfc3Ryam9pbl9zZXAoc3RycywgbnN0cnMsICIiLCBmaW5hbF9sZW5ndGgpOworfQorCitjaGFyICpncHJfc3Ryam9pbl9zZXAoY29uc3QgY2hhciAqKnN0cnMsIHNpemVfdCBuc3RycywgY29uc3QgY2hhciAqc2VwLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZmluYWxfbGVuZ3RoKSB7CisgIGNvbnN0IHNpemVfdCBzZXBfbGVuID0gc3RybGVuKHNlcCk7CisgIHNpemVfdCBvdXRfbGVuZ3RoID0gMDsKKyAgc2l6ZV90IGk7CisgIGNoYXIgKm91dDsKKyAgZm9yIChpID0gMDsgaSA8IG5zdHJzOyBpKyspIHsKKyAgICBvdXRfbGVuZ3RoICs9IHN0cmxlbihzdHJzW2ldKTsKKyAgfQorICBvdXRfbGVuZ3RoICs9IDE7IC8qIG51bGwgdGVybWluYXRvciAqLworICBpZiAobnN0cnMgPiAwKSB7CisgICAgb3V0X2xlbmd0aCArPSBzZXBfbGVuICogKG5zdHJzIC0gMSk7IC8qIHNlcGFyYXRvcnMgKi8KKyAgfQorICBvdXQgPSBncHJfbWFsbG9jKG91dF9sZW5ndGgpOworICBvdXRfbGVuZ3RoID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5zdHJzOyBpKyspIHsKKyAgICBjb25zdCBzaXplX3Qgc2xlbiA9IHN0cmxlbihzdHJzW2ldKTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICBtZW1jcHkob3V0ICsgb3V0X2xlbmd0aCwgc2VwLCBzZXBfbGVuKTsKKyAgICAgIG91dF9sZW5ndGggKz0gc2VwX2xlbjsKKyAgICB9CisgICAgbWVtY3B5KG91dCArIG91dF9sZW5ndGgsIHN0cnNbaV0sIHNsZW4pOworICAgIG91dF9sZW5ndGggKz0gc2xlbjsKKyAgfQorICBvdXRbb3V0X2xlbmd0aF0gPSAwOworICBpZiAoZmluYWxfbGVuZ3RoICE9IE5VTEwpIHsKKyAgICAqZmluYWxfbGVuZ3RoID0gb3V0X2xlbmd0aDsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvKiogRmluZHMgdGhlIGluaXRpYWwgKFxhIGJlZ2luKSBhbmQgZmluYWwgKFxhIGVuZCkgb2Zmc2V0cyBvZiB0aGUgbmV4dAorICogc3Vic3RyaW5nIGZyb20gXGEgc3RyICsgXGEgcmVhZF9vZmZzZXQgdW50aWwgdGhlIG5leHQgXGEgc2VwIG9yIHRoZSBlbmQgb2YgXGEKKyAqIHN0ci4KKyAqCisgKiBSZXR1cm5zIDEgYW5kIHVwZGF0ZXMgXGEgYmVnaW4gYW5kIFxhIGVuZC4gUmV0dXJucyAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbnQgc2xpY2VfZmluZF9zZXBhcmF0b3Jfb2Zmc2V0KGNvbnN0IGdwcl9zbGljZSBzdHIsIGNvbnN0IGNoYXIgKnNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCByZWFkX29mZnNldCwgc2l6ZV90ICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZW5kKSB7CisgIHNpemVfdCBpOworICBjb25zdCB1aW50OF90ICpzdHJfcHRyID0gR1BSX1NMSUNFX1NUQVJUX1BUUihzdHIpICsgcmVhZF9vZmZzZXQ7CisgIGNvbnN0IHNpemVfdCBzdHJfbGVuID0gR1BSX1NMSUNFX0xFTkdUSChzdHIpIC0gcmVhZF9vZmZzZXQ7CisgIGNvbnN0IHNpemVfdCBzZXBfbGVuID0gc3RybGVuKHNlcCk7CisgIGlmIChzdHJfbGVuIDwgc2VwX2xlbikgeworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8PSBzdHJfbGVuIC0gc2VwX2xlbjsgaSsrKSB7CisgICAgaWYgKG1lbWNtcChzdHJfcHRyICsgaSwgc2VwLCBzZXBfbGVuKSA9PSAwKSB7CisgICAgICAqYmVnaW4gPSByZWFkX29mZnNldDsKKyAgICAgICplbmQgPSByZWFkX29mZnNldCArIGk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ3ByX3NsaWNlX3NwbGl0KGdwcl9zbGljZSBzdHIsIGNvbnN0IGNoYXIgKnNlcCwgZ3ByX3NsaWNlX2J1ZmZlciAqZHN0KSB7CisgIGNvbnN0IHNpemVfdCBzZXBfbGVuID0gc3RybGVuKHNlcCk7CisgIHNpemVfdCBiZWdpbiwgZW5kOworCisgIEdQUl9BU1NFUlQoc2VwX2xlbiA+IDApOworCisgIGlmIChzbGljZV9maW5kX3NlcGFyYXRvcl9vZmZzZXQoc3RyLCBzZXAsIDAsICZiZWdpbiwgJmVuZCkgIT0gMCkgeworICAgIGRvIHsKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkX2luZGV4ZWQoZHN0LCBncHJfc2xpY2Vfc3ViKHN0ciwgYmVnaW4sIGVuZCkpOworICAgIH0gd2hpbGUgKHNsaWNlX2ZpbmRfc2VwYXJhdG9yX29mZnNldChzdHIsIHNlcCwgZW5kICsgc2VwX2xlbiwgJmJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kKSAhPSAwKTsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZF9pbmRleGVkKAorICAgICAgICBkc3QsIGdwcl9zbGljZV9zdWIoc3RyLCBlbmQgKyBzZXBfbGVuLCBHUFJfU0xJQ0VfTEVOR1RIKHN0cikpKTsKKyAgfSBlbHNlIHsgLyogbm8gc2VwIGZvdW5kLCBhZGQgd2hvbGUgaW5wdXQgKi8KKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZF9pbmRleGVkKGRzdCwgZ3ByX3NsaWNlX3JlZihzdHIpKTsKKyAgfQorfQorCit2b2lkIGdwcl9zdHJ2ZWNfaW5pdChncHJfc3RydmVjICpzdikgeyBtZW1zZXQoc3YsIDAsIHNpemVvZigqc3YpKTsgfQorCit2b2lkIGdwcl9zdHJ2ZWNfZGVzdHJveShncHJfc3RydmVjICpzdikgeworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IHN2LT5jb3VudDsgaSsrKSB7CisgICAgZ3ByX2ZyZWUoc3YtPnN0cnNbaV0pOworICB9CisgIGdwcl9mcmVlKHN2LT5zdHJzKTsKK30KKwordm9pZCBncHJfc3RydmVjX2FkZChncHJfc3RydmVjICpzdiwgY2hhciAqc3RyKSB7CisgIGlmIChzdi0+Y291bnQgPT0gc3YtPmNhcGFjaXR5KSB7CisgICAgc3YtPmNhcGFjaXR5ID0gR1BSX01BWChzdi0+Y2FwYWNpdHkgKyA4LCBzdi0+Y2FwYWNpdHkgKiAyKTsKKyAgICBzdi0+c3RycyA9IGdwcl9yZWFsbG9jKHN2LT5zdHJzLCBzaXplb2YoY2hhciAqKSAqIHN2LT5jYXBhY2l0eSk7CisgIH0KKyAgc3YtPnN0cnNbc3YtPmNvdW50KytdID0gc3RyOworfQorCitjaGFyICpncHJfc3RydmVjX2ZsYXR0ZW4oZ3ByX3N0cnZlYyAqc3YsIHNpemVfdCAqZmluYWxfbGVuZ3RoKSB7CisgIHJldHVybiBncHJfc3Ryam9pbigoY29uc3QgY2hhciAqKilzdi0+c3Rycywgc3YtPmNvdW50LCBmaW5hbF9sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmggYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGMwMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVBQT1JUX1NUUklOR19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9TVFJJTkdfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBTdHJpbmcgdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogRmxhZ3MgZm9yIGdwcl9kdW1wIGZ1bmN0aW9uLiAqLworI2RlZmluZSBHUFJfRFVNUF9IRVggMHgwMDAwMDAwMQorI2RlZmluZSBHUFJfRFVNUF9BU0NJSSAweDAwMDAwMDAyCisKKy8qIENvbnZlcnRzIGFycmF5IGJ1Ziwgb2YgbGVuZ3RoIGxlbiwgaW50byBhIEMgc3RyaW5nICBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzLgorICAgUmVzdWx0IHNob3VsZCBiZSBmcmVlZCB3aXRoIGdwcl9mcmVlKCkgKi8KK2NoYXIgKmdwcl9kdW1wKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdWludDMyX3QgZmxhZ3MpOworCisvKiBDYWxscyBncHJfZHVtcCBvbiBhIHNsaWNlLiAqLworY2hhciAqZ3ByX2R1bXBfc2xpY2UoZ3ByX3NsaWNlIHNsaWNlLCB1aW50MzJfdCBmbGFncyk7CisKKy8qIFBhcnNlcyBhbiBhcnJheSBvZiBieXRlcyBpbnRvIGFuIGludGVnZXIgKGJhc2UgMTApLiBSZXR1cm5zIDEgb24gc3VjY2VzcywKKyAgIDAgb24gZmFpbHVyZS4gKi8KK2ludCBncHJfcGFyc2VfYnl0ZXNfdG9fdWludDMyKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVzdWx0KTsKKworLyogTWluaW11bSBidWZmZXIgc2l6ZSBmb3IgY2FsbGluZyBsdG9hICovCisjZGVmaW5lIEdQUl9MVE9BX01JTl9CVUZTSVpFICgzICogc2l6ZW9mKGxvbmcpKQorCisvKiBDb252ZXJ0IGEgbG9uZyB0byBhIHN0cmluZyBpbiBiYXNlIDEwOyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlCisgICBvdXRwdXQgc3RyaW5nIChvciAwIG9uIGZhaWx1cmUpLgorICAgb3V0cHV0IG11c3QgYmUgYXQgbGVhc3QgR1BSX0xUT0FfTUlOX0JVRlNJWkUgYnl0ZXMgbG9uZy4gKi8KK2ludCBncHJfbHRvYShsb25nIHZhbHVlLCBjaGFyICpvdXRwdXQpOworCisvKiBNaW5pbXVtIGJ1ZmZlciBzaXplIGZvciBjYWxsaW5nIGludDY0dG9hICovCisjZGVmaW5lIEdQUl9JTlQ2NFRPQV9NSU5fQlVGU0laRSAoMyAqIHNpemVvZihpbnQ2NF90KSkKKworLyogQ29udmVydCBhbiBpbnQ2NCB0byBhIHN0cmluZyBpbiBiYXNlIDEwOyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlCitvdXRwdXQgc3RyaW5nIChvciAwIG9uIGZhaWx1cmUpLgorb3V0cHV0IG11c3QgYmUgYXQgbGVhc3QgR1BSX0lOVDY0VE9BX01JTl9CVUZTSVpFIGJ5dGVzIGxvbmcuCitOT1RFOiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgc3VmZmljaWVudCBiaXQgd2lkdGggZXZlbiBvbiBXaW4geDY0LAord2hlcmUgbG9uZyBpcyAzMmJpdCBpcyBzaXplLiovCitpbnQgaW50NjRfdHRvYShpbnQ2NF90IHZhbHVlLCBjaGFyICpvdXRwdXQpOworCisvKiBSZXZlcnNlIGEgcnVuIG9mIGJ5dGVzICovCit2b2lkIGdwcl9yZXZlcnNlX2J5dGVzKGNoYXIgKnN0ciwgaW50IGxlbik7CisKKy8qIEpvaW4gYSBzZXQgb2Ygc3RyaW5ncywgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgc3RyaW5nLgorICAgVG90YWwgY29tYmluZWQgbGVuZ3RoIChleGNsdWRpbmcgbnVsbCB0ZXJtaW5hdG9yKSBpcyByZXR1cm5lZCBpbiB0b3RhbF9sZW5ndGgKKyAgIGlmIGl0IGlzIG5vbi1udWxsLiAqLworY2hhciAqZ3ByX3N0cmpvaW4oY29uc3QgY2hhciAqKnN0cnMsIHNpemVfdCBuc3Rycywgc2l6ZV90ICp0b3RhbF9sZW5ndGgpOworCisvKiBKb2luIGEgc2V0IG9mIHN0cmluZ3MgdXNpbmcgYSBzZXBhcmF0b3IsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIHN0cmluZy4KKyAgIFRvdGFsIGNvbWJpbmVkIGxlbmd0aCAoZXhjbHVkaW5nIG51bGwgdGVybWluYXRvcikgaXMgcmV0dXJuZWQgaW4gdG90YWxfbGVuZ3RoCisgICBpZiBpdCBpcyBub24tbnVsbC4gKi8KK2NoYXIgKmdwcl9zdHJqb2luX3NlcChjb25zdCBjaGFyICoqc3Rycywgc2l6ZV90IG5zdHJzLCBjb25zdCBjaGFyICpzZXAsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RhbF9sZW5ndGgpOworCisvKiogU3BsaXQgXGEgc3RyIGJ5IHRoZSBzZXBhcmF0b3IgXGEgc2VwLiBSZXN1bHRzIGFyZSBzdG9yZWQgaW4gXGEgZHN0LCB3aGljaAorICogc2hvdWxkIGJlIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuICovCit2b2lkIGdwcl9zbGljZV9zcGxpdChncHJfc2xpY2Ugc3RyLCBjb25zdCBjaGFyICpzZXAsIGdwcl9zbGljZV9idWZmZXIgKmRzdCk7CisKKy8qIEEgdmVjdG9yIG9mIHN0cmluZ3MuLi4gZm9yIGJ1aWxkaW5nIHVwIGEgZmluYWwgc3RyaW5nIG9uZSBwaWVjZSBhdCBhIHRpbWUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqKnN0cnM7CisgIHNpemVfdCBjb3VudDsKKyAgc2l6ZV90IGNhcGFjaXR5OworfSBncHJfc3RydmVjOworCisvKiBJbml0aWFsaXplL2Rlc3Ryb3kgKi8KK3ZvaWQgZ3ByX3N0cnZlY19pbml0KGdwcl9zdHJ2ZWMgKnN0cnMpOwordm9pZCBncHJfc3RydmVjX2Rlc3Ryb3koZ3ByX3N0cnZlYyAqc3Rycyk7CisvKiBBZGQgYSBzdHJpbmcgdG8gYSBzdHJ2ZWMsIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgc3RyaW5nICovCit2b2lkIGdwcl9zdHJ2ZWNfYWRkKGdwcl9zdHJ2ZWMgKnN0cnMsIGNoYXIgKmFkZCk7CisvKiBSZXR1cm4gYSBqb2luZWQgc3RyaW5nIHdpdGggYWxsIGFkZGVkIHN1YnN0cmluZ3MsIG9wdGlvbmFsbHkgc2V0dGluZworICAgdG90YWxfbGVuZ3RoIGFzIHBlciBncHJfc3Ryam9pbiAqLworY2hhciAqZ3ByX3N0cnZlY19mbGF0dGVuKGdwcl9zdHJ2ZWMgKnN0cnMsIHNpemVfdCAqdG90YWxfbGVuZ3RoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ19wb3NpeC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS9zdXBwb3J0L3N0cmluZ19wb3NpeC5jCnJlbmFtZSB0byBzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfcG9zaXguYwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI3ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qIFBvc2l4IGNvZGUgZm9yIGdwciBzbnByaW50ZiBzdXBwb3J0LiAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU4zMgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK2ludCBncHJfYXNwcmludGYoY2hhciAqKnN0cnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldDsKKyAgc2l6ZV90IHN0cnBfYnVmbGVuOworCisgIC8qIERldGVybWluZSB0aGUgbGVuZ3RoLiAqLworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICByZXQgPSBfdnNjcHJpbnRmKGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICAqc3RycCA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyLCB3aXRoIHNwYWNlIGZvciB0aGUgTlVMIHRlcm1pbmF0b3IuICovCisgIHN0cnBfYnVmbGVuID0gKHNpemVfdClyZXQgKyAxOworICBpZiAoKCpzdHJwID0gZ3ByX21hbGxvYyhzdHJwX2J1ZmxlbikpID09IE5VTEwpIHsKKyAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJlY2F1c2UgZ3ByX21hbGxvYygpIGNhbGxzIGFib3J0KCkuICovCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogUHJpbnQgdG8gdGhlIGJ1ZmZlci4gKi8KKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgcmV0ID0gdnNucHJpbnRmX3MoKnN0cnAsIHN0cnBfYnVmbGVuLCBfVFJVTkNBVEUsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgaWYgKChzaXplX3QpcmV0ID09IHN0cnBfYnVmbGVuIC0gMSkgeworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisgIGdwcl9mcmVlKCpzdHJwKTsKKyAgKnN0cnAgPSBOVUxMOworICByZXR1cm4gLTE7Cit9CisKKyNpZiBkZWZpbmVkIFVOSUNPREUgfHwgZGVmaW5lZCBfVU5JQ09ERQorTFBUU1RSCitncHJfY2hhcl90b190Y2hhcihMUENTVFIgaW5wdXQpIHsKKyAgTFBUU1RSIHJldDsKKyAgaW50IG5lZWRlZCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgaW5wdXQsIC0xLCBOVUxMLCAwKTsKKyAgaWYgKG5lZWRlZCA8PSAwKSByZXR1cm4gTlVMTDsKKyAgcmV0ID0gZ3ByX21hbGxvYygodW5zaWduZWQpbmVlZGVkICogc2l6ZW9mKFRDSEFSKSk7CisgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgaW5wdXQsIC0xLCByZXQsIG5lZWRlZCk7CisgIHJldHVybiByZXQ7Cit9CisKK0xQU1RSCitncHJfdGNoYXJfdG9fY2hhcihMUENUU1RSIGlucHV0KSB7CisgIExQU1RSIHJldDsKKyAgaW50IG5lZWRlZCA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgaW5wdXQsIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgaWYgKG5lZWRlZCA8PSAwKSByZXR1cm4gTlVMTDsKKyAgcmV0ID0gZ3ByX21hbGxvYygodW5zaWduZWQpbmVlZGVkKTsKKyAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCBpbnB1dCwgLTEsIHJldCwgbmVlZGVkLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIHJldDsKK30KKyNlbHNlCitjaGFyICpncHJfdGNoYXJfdG9fY2hhcihMUFRTVFIgaW5wdXQpIHsgcmV0dXJuIGdwcl9zdHJkdXAoaW5wdXQpOyB9CisKK2NoYXIgKmdwcl9jaGFyX3RvX3RjaGFyKExQVFNUUiBpbnB1dCkgeyByZXR1cm4gZ3ByX3N0cmR1cChpbnB1dCk7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogR1BSX1dJTjMyICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ193aW4zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0N2Q1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9TVFJJTkdfV0lOMzJfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUFBPUlRfU1RSSU5HX1dJTjMyX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfV0lOMzIKKworLyogVGhlc2UgYWxsb2NhdGUgbmV3IHN0cmluZ3MgdXNpbmcgZ3ByX21hbGxvYyB0byBjb252ZXJ0IGZyb20gYW5kIHRvIHV0Zi04LiAqLworTFBUU1RSIGdwcl9jaGFyX3RvX3RjaGFyKExQQ1NUUiBpbnB1dCk7CitMUFNUUiBncHJfdGNoYXJfdG9fY2hhcihMUENUU1RSIGlucHV0KTsKKworI2VuZGlmIC8qIEdQUl9XSU4zMiAqLworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVBQT1JUX1NUUklOR19XSU4zMl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3Bvc2l4LmMKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQzMDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU5ET1dTX1NVQlBST0NFU1MKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdWJwcm9jZXNzLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgiCisKK3N0cnVjdCBncHJfc3VicHJvY2VzcyB7CisgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisgIGludCBqb2luZWQ7CisgIGludCBpbnRlcnJ1cHRlZDsKK307CisKK2NvbnN0IGNoYXIgKmdwcl9zdWJwcm9jZXNzX2JpbmFyeV9leHRlbnNpb24oKSB7IHJldHVybiAiLmV4ZSI7IH0KKworZ3ByX3N1YnByb2Nlc3MgKmdwcl9zdWJwcm9jZXNzX2NyZWF0ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKKyAgZ3ByX3N1YnByb2Nlc3MgKnI7CisKKyAgU1RBUlRVUElORk8gc2k7CisgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisKKyAgY2hhciAqYXJncyA9IGdwcl9zdHJqb2luX3NlcChhcmd2LCAoc2l6ZV90KWFyZ2MsICIgIiwgTlVMTCk7CisgIFRDSEFSICphcmdzX3RjaGFyOworCisgIGFyZ3NfdGNoYXIgPSBncHJfY2hhcl90b190Y2hhcihhcmdzKTsKKyAgZ3ByX2ZyZWUoYXJncyk7CisKKyAgbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7CisgIHNpLmNiID0gc2l6ZW9mKHNpKTsKKyAgbWVtc2V0KCZwaSwgMCwgc2l6ZW9mKHBpKSk7CisKKyAgaWYgKCFDcmVhdGVQcm9jZXNzKE5VTEwsIGFyZ3NfdGNoYXIsIE5VTEwsIE5VTEwsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQLCBOVUxMLCBOVUxMLCAmc2ksICZwaSkpIHsKKyAgICBncHJfZnJlZShhcmdzX3RjaGFyKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBncHJfZnJlZShhcmdzX3RjaGFyKTsKKworICByID0gZ3ByX21hbGxvYyhzaXplb2YoZ3ByX3N1YnByb2Nlc3MpKTsKKyAgbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworICByLT5waSA9IHBpOworICByZXR1cm4gcjsKK30KKwordm9pZCBncHJfc3VicHJvY2Vzc19kZXN0cm95KGdwcl9zdWJwcm9jZXNzICpwKSB7CisgIGlmIChwKSB7CisgICAgaWYgKCFwLT5qb2luZWQpIHsKKyAgICAgIGdwcl9zdWJwcm9jZXNzX2ludGVycnVwdChwKTsKKyAgICAgIGdwcl9zdWJwcm9jZXNzX2pvaW4ocCk7CisgICAgfQorICAgIGlmIChwLT5waS5oUHJvY2VzcykgeworICAgICAgQ2xvc2VIYW5kbGUocC0+cGkuaFByb2Nlc3MpOworICAgIH0KKyAgICBpZiAocC0+cGkuaFRocmVhZCkgeworICAgICAgQ2xvc2VIYW5kbGUocC0+cGkuaFRocmVhZCk7CisgICAgfQorICAgIGdwcl9mcmVlKHApOworICB9Cit9CisKK2ludCBncHJfc3VicHJvY2Vzc19qb2luKGdwcl9zdWJwcm9jZXNzICpwKSB7CisgIERXT1JEIGR3RXhpdENvZGU7CisgIGlmIChHZXRFeGl0Q29kZVByb2Nlc3MocC0+cGkuaFByb2Nlc3MsICZkd0V4aXRDb2RlKSkgeworICAgIGlmIChkd0V4aXRDb2RlID09IFNUSUxMX0FDVElWRSkgeworICAgICAgaWYgKFdhaXRGb3JTaW5nbGVPYmplY3QocC0+cGkuaFByb2Nlc3MsIElORklOSVRFKSA9PSBXQUlUX09CSkVDVF8wKSB7CisgICAgICAgIHAtPmpvaW5lZCA9IDE7CisgICAgICAgIGdvdG8gZ2V0RXhpdENvZGU7CisgICAgICB9CisgICAgICByZXR1cm4gLTE7ICAvLyBmYWlsZWQgdG8gam9pbgorICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGdldEV4aXRDb2RlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7ICAvLyBmYWlsZWQgdG8gZ2V0IGV4aXQgY29kZQorICB9CisKK2dldEV4aXRDb2RlOgorICBpZiAocC0+aW50ZXJydXB0ZWQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoR2V0RXhpdENvZGVQcm9jZXNzKHAtPnBpLmhQcm9jZXNzLCAmZHdFeGl0Q29kZSkpIHsKKyAgICByZXR1cm4gKGludClkd0V4aXRDb2RlOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZCB0byBnZXQgZXhpdCBjb2RlCisgIH0KK30KKwordm9pZCBncHJfc3VicHJvY2Vzc19pbnRlcnJ1cHQoZ3ByX3N1YnByb2Nlc3MgKnApIHsKKyAgRFdPUkQgZHdFeGl0Q29kZTsKKyAgaWYgKEdldEV4aXRDb2RlUHJvY2VzcyhwLT5waS5oUHJvY2VzcywgJmR3RXhpdENvZGUpKSB7CisgICAgaWYgKGR3RXhpdENvZGUgPT0gU1RJTExfQUNUSVZFKSB7CisgICAgICBncHJfbG9nKEdQUl9JTkZPLCAic2VuZGluZyBjdHJsLWJyZWFrIik7CisgICAgICBHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQoQ1RSTF9CUkVBS19FVkVOVCwgcC0+cGkuZHdQcm9jZXNzSWQpOworICAgICAgcC0+am9pbmVkID0gMTsKKyAgICAgIHAtPmludGVycnVwdGVkID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorCisjZW5kaWYgLyogR1BSX1dJTkRPV1NfU1VCUFJPQ0VTUyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zeW5jLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3N1cHBvcnQvc3luYy5jCnJlbmFtZSB0byBzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfcG9zaXguYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmNfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU1OWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY19wb3NpeC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9QT1NJWF9TWU5DCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisKK3ZvaWQgZ3ByX211X2luaXQoZ3ByX211KiBtdSkgeyBHUFJfQVNTRVJUKHB0aHJlYWRfbXV0ZXhfaW5pdChtdSwgTlVMTCkgPT0gMCk7IH0KKwordm9pZCBncHJfbXVfZGVzdHJveShncHJfbXUqIG11KSB7IEdQUl9BU1NFUlQocHRocmVhZF9tdXRleF9kZXN0cm95KG11KSA9PSAwKTsgfQorCit2b2lkIGdwcl9tdV9sb2NrKGdwcl9tdSogbXUpIHsKKyAgR1BSX1RJTUVSX0JFR0lOKCJncHJfbXVfbG9jayIsIDApOworICBHUFJfQVNTRVJUKHB0aHJlYWRfbXV0ZXhfbG9jayhtdSkgPT0gMCk7CisgIEdQUl9USU1FUl9FTkQoImdwcl9tdV9sb2NrIiwgMCk7Cit9CisKK3ZvaWQgZ3ByX211X3VubG9jayhncHJfbXUqIG11KSB7CisgIEdQUl9USU1FUl9CRUdJTigiZ3ByX211X3VubG9jayIsIDApOworICBHUFJfQVNTRVJUKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11KSA9PSAwKTsKKyAgR1BSX1RJTUVSX0VORCgiZ3ByX211X3VubG9jayIsIDApOworfQorCitpbnQgZ3ByX211X3RyeWxvY2soZ3ByX211KiBtdSkgeworICBpbnQgZXJyOworICBHUFJfVElNRVJfQkVHSU4oImdwcl9tdV90cnlsb2NrIiwgMCk7CisgIGVyciA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayhtdSk7CisgIEdQUl9BU1NFUlQoZXJyID09IDAgfHwgZXJyID09IEVCVVNZKTsKKyAgR1BSX1RJTUVSX0VORCgiZ3ByX211X3RyeWxvY2siLCAwKTsKKyAgcmV0dXJuIGVyciA9PSAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGdwcl9jdl9pbml0KGdwcl9jdiogY3YpIHsgR1BSX0FTU0VSVChwdGhyZWFkX2NvbmRfaW5pdChjdiwgTlVMTCkgPT0gMCk7IH0KKwordm9pZCBncHJfY3ZfZGVzdHJveShncHJfY3YqIGN2KSB7IEdQUl9BU1NFUlQocHRocmVhZF9jb25kX2Rlc3Ryb3koY3YpID09IDApOyB9CisKK2ludCBncHJfY3Zfd2FpdChncHJfY3YqIGN2LCBncHJfbXUqIG11LCBncHJfdGltZXNwZWMgYWJzX2RlYWRsaW5lKSB7CisgIGludCBlcnIgPSAwOworICBpZiAoZ3ByX3RpbWVfY21wKGFic19kZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUoYWJzX2RlYWRsaW5lLmNsb2NrX3R5cGUpKSA9PQorICAgICAgMCkgeworICAgIGVyciA9IHB0aHJlYWRfY29uZF93YWl0KGN2LCBtdSk7CisgIH0gZWxzZSB7CisgICAgc3RydWN0IHRpbWVzcGVjIGFic19kZWFkbGluZV90czsKKyAgICBhYnNfZGVhZGxpbmUgPSBncHJfY29udmVydF9jbG9ja190eXBlKGFic19kZWFkbGluZSwgR1BSX0NMT0NLX1JFQUxUSU1FKTsKKyAgICBhYnNfZGVhZGxpbmVfdHMudHZfc2VjID0gKHRpbWVfdClhYnNfZGVhZGxpbmUudHZfc2VjOworICAgIGFic19kZWFkbGluZV90cy50dl9uc2VjID0gYWJzX2RlYWRsaW5lLnR2X25zZWM7CisgICAgZXJyID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdChjdiwgbXUsICZhYnNfZGVhZGxpbmVfdHMpOworICB9CisgIEdQUl9BU1NFUlQoZXJyID09IDAgfHwgZXJyID09IEVUSU1FRE9VVCB8fCBlcnIgPT0gRUFHQUlOKTsKKyAgcmV0dXJuIGVyciA9PSBFVElNRURPVVQ7Cit9CisKK3ZvaWQgZ3ByX2N2X3NpZ25hbChncHJfY3YqIGN2KSB7IEdQUl9BU1NFUlQocHRocmVhZF9jb25kX3NpZ25hbChjdikgPT0gMCk7IH0KKwordm9pZCBncHJfY3ZfYnJvYWRjYXN0KGdwcl9jdiogY3YpIHsKKyAgR1BSX0FTU0VSVChwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGN2KSA9PSAwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBncHJfb25jZV9pbml0KGdwcl9vbmNlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jdGlvbikodm9pZCkpIHsKKyAgR1BSX0FTU0VSVChwdGhyZWFkX29uY2Uob25jZSwgaW5pdF9mdW5jdGlvbikgPT0gMCk7Cit9CisKKyNlbmRpZiAvKiBHUlBfUE9TSVhfU1lOQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3dpbjMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3N1cHBvcnQvc3luY193aW4zMi5jCnJlbmFtZSB0byBzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3dpbjMyLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5YWFjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qIFBvc2l4IGltcGxlbWVudGF0aW9uIGZvciBncHIgdGhyZWFkcy4gKi8KKworI2luY2x1ZGUgPG1lbW9yeS5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgorCitlbnVtIHsgR1BSX1RIRF9KT0lOQUJMRSA9IDEgfTsKKworZ3ByX3RoZF9vcHRpb25zIGdwcl90aGRfb3B0aW9uc19kZWZhdWx0KHZvaWQpIHsKKyAgZ3ByX3RoZF9vcHRpb25zIG9wdGlvbnM7CisgIG1lbXNldCgmb3B0aW9ucywgMCwgc2l6ZW9mKG9wdGlvbnMpKTsKKyAgcmV0dXJuIG9wdGlvbnM7Cit9CisKK3ZvaWQgZ3ByX3RoZF9vcHRpb25zX3NldF9kZXRhY2hlZChncHJfdGhkX29wdGlvbnMqIG9wdGlvbnMpIHsKKyAgb3B0aW9ucy0+ZmxhZ3MgJj0gfkdQUl9USERfSk9JTkFCTEU7Cit9CisKK3ZvaWQgZ3ByX3RoZF9vcHRpb25zX3NldF9qb2luYWJsZShncHJfdGhkX29wdGlvbnMqIG9wdGlvbnMpIHsKKyAgb3B0aW9ucy0+ZmxhZ3MgfD0gR1BSX1RIRF9KT0lOQUJMRTsKK30KKworaW50IGdwcl90aGRfb3B0aW9uc19pc19kZXRhY2hlZChjb25zdCBncHJfdGhkX29wdGlvbnMqIG9wdGlvbnMpIHsKKyAgaWYgKCFvcHRpb25zKSByZXR1cm4gMTsKKyAgcmV0dXJuIChvcHRpb25zLT5mbGFncyAmIEdQUl9USERfSk9JTkFCTEUpID09IDA7Cit9CisKK2ludCBncHJfdGhkX29wdGlvbnNfaXNfam9pbmFibGUoY29uc3QgZ3ByX3RoZF9vcHRpb25zKiBvcHRpb25zKSB7CisgIGlmICghb3B0aW9ucykgcmV0dXJuIDA7CisgIHJldHVybiAob3B0aW9ucy0+ZmxhZ3MgJiBHUFJfVEhEX0pPSU5BQkxFKSA9PSBHUFJfVEhEX0pPSU5BQkxFOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX2ludGVybmFsLmggYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aGRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjY5YTMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX2ludGVybmFsLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfVEhEX0lOVEVSTkFMX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVVBQT1JUX1RIRF9JTlRFUk5BTF9ICisKKy8qIEludGVybmFsIGludGVyZmFjZXMgYmV0d2VlbiBtb2R1bGVzIHdpdGhpbiB0aGUgZ3ByIHN1cHBvcnQgbGlicmFyeS4gICovCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfVEhEX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGhkX3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aGRfcG9zaXguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC90aGRfcG9zaXguYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3Bvc2l4LmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aGRfd2luMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC90aGRfd2luMzIuYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3dpbjMyLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGltZS5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS9zdXBwb3J0L3RpbWUuYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZS5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmYWIyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcG9zaXguYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiCisKKyNpZmRlZiBHUFJfUE9TSVhfVElNRQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgorCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX2Zyb21fZ3ByKGdwcl90aW1lc3BlYyBndHMpIHsKKyAgc3RydWN0IHRpbWVzcGVjIHJ2OworICBpZiAoc2l6ZW9mKHRpbWVfdCkgPCBzaXplb2YoaW50NjRfdCkpIHsKKyAgICAvKiBmaW5lIHRvIGFzc2VydCwgYXMgdGhpcyBpcyBvbmx5IHVzZWQgaW4gZ3ByX3NsZWVwX3VudGlsICovCisgICAgR1BSX0FTU0VSVChndHMudHZfc2VjIDw9IElOVDMyX01BWCAmJiBndHMudHZfc2VjID49IElOVDMyX01JTik7CisgIH0KKyAgcnYudHZfc2VjID0gKHRpbWVfdClndHMudHZfc2VjOworICBydi50dl9uc2VjID0gZ3RzLnR2X25zZWM7CisgIHJldHVybiBydjsKK30KKworI2lmIF9QT1NJWF9USU1FUlMgPiAwCitzdGF0aWMgZ3ByX3RpbWVzcGVjIGdwcl9mcm9tX3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX2Nsb2NrX3R5cGUgY2xvY2tfdHlwZSkgeworICAvKgorICAgKiB0aW1lc3BlYy50dl9zZWMgY2FuIGhhdmUgc21hbGxlciBzaXplIHRoYW4gZ3ByX3RpbWVzcGVjLnR2X3NlYywKKyAgICogYnV0IHdlIGFyZSBvbmx5IHVzaW5nIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGdwcl9ub3cKKyAgICogc28gdGhlcmUncyBubyBuZWVkIHRvIGhhbmRsZSAiaW5maW5pdHkiIHZhbHVlcy4KKyAgICovCisgIGdwcl90aW1lc3BlYyBydjsKKyAgcnYudHZfc2VjID0gdHMudHZfc2VjOworICBydi50dl9uc2VjID0gKGludDMyX3QpdHMudHZfbnNlYzsKKyAgcnYuY2xvY2tfdHlwZSA9IGNsb2NrX3R5cGU7CisgIHJldHVybiBydjsKK30KKworLyoqIG1hcHMgZ3ByX2Nsb2NrX3R5cGUgLS0+IGNsb2NraWRfdCBmb3IgY2xvY2tfZ2V0dGltZSAqLworc3RhdGljIGNvbnN0IGNsb2NraWRfdCBjbG9ja2lkX2Zvcl9ncHJfY2xvY2tbXSA9IHtDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLX1JFQUxUSU1FfTsKKwordm9pZCBncHJfdGltZV9pbml0KHZvaWQpIHsgZ3ByX3ByZWNpc2VfY2xvY2tfaW5pdCgpOyB9CisKK2dwcl90aW1lc3BlYyBncHJfbm93KGdwcl9jbG9ja190eXBlIGNsb2NrX3R5cGUpIHsKKyAgc3RydWN0IHRpbWVzcGVjIG5vdzsKKyAgR1BSX0FTU0VSVChjbG9ja190eXBlICE9IEdQUl9USU1FU1BBTik7CisgIGlmIChjbG9ja190eXBlID09IEdQUl9DTE9DS19QUkVDSVNFKSB7CisgICAgZ3ByX3RpbWVzcGVjIHJldDsKKyAgICBncHJfcHJlY2lzZV9jbG9ja19ub3coJnJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEdQUl9CQUNLV0FSRFNfQ09NUEFUSUJJTElUWV9NT0RFKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKyAgICAvKiBhdm9pZCBBQkkgcHJvYmxlbXMgYnkgaW52b2tpbmcgc3lzY2FsbHMgZGlyZWN0bHkgKi8KKyAgICBzeXNjYWxsKFNZU19jbG9ja19nZXR0aW1lLCBjbG9ja2lkX2Zvcl9ncHJfY2xvY2tbY2xvY2tfdHlwZV0sICZub3cpOworI2Vsc2UKKyAgICBjbG9ja19nZXR0aW1lKGNsb2NraWRfZm9yX2dwcl9jbG9ja1tjbG9ja190eXBlXSwgJm5vdyk7CisjZW5kaWYKKyAgICByZXR1cm4gZ3ByX2Zyb21fdGltZXNwZWMobm93LCBjbG9ja190eXBlKTsKKyAgfQorfQorI2Vsc2UKKy8qIEZvciBzb21lIHJlYXNvbiBBcHBsZSdzIE9TZXMgaGF2ZW4ndCBpbXBsZW1lbnRlZCBjbG9ja19nZXR0aW1lLiAqLworCisjaW5jbHVkZSA8bWFjaC9tYWNoLmg+CisjaW5jbHVkZSA8bWFjaC9tYWNoX3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitzdGF0aWMgZG91YmxlIGdfdGltZV9zY2FsZTsKK3N0YXRpYyB1aW50NjRfdCBnX3RpbWVfc3RhcnQ7CisKK3ZvaWQgZ3ByX3RpbWVfaW5pdCh2b2lkKSB7CisgIG1hY2hfdGltZWJhc2VfaW5mb19kYXRhX3QgdGIgPSB7MCwgMX07CisgIGdwcl9wcmVjaXNlX2Nsb2NrX2luaXQoKTsKKyAgbWFjaF90aW1lYmFzZV9pbmZvKCZ0Yik7CisgIGdfdGltZV9zY2FsZSA9IHRiLm51bWVyOworICBnX3RpbWVfc2NhbGUgLz0gdGIuZGVub207CisgIGdfdGltZV9zdGFydCA9IG1hY2hfYWJzb2x1dGVfdGltZSgpOworfQorCitncHJfdGltZXNwZWMgZ3ByX25vdyhncHJfY2xvY2tfdHlwZSBjbG9jaykgeworICBncHJfdGltZXNwZWMgbm93OworICBzdHJ1Y3QgdGltZXZhbCBub3dfdHY7CisgIGRvdWJsZSBub3dfZGJsOworCisgIG5vdy5jbG9ja190eXBlID0gY2xvY2s7CisgIHN3aXRjaCAoY2xvY2spIHsKKyAgICBjYXNlIEdQUl9DTE9DS19SRUFMVElNRToKKyAgICAgIGdldHRpbWVvZmRheSgmbm93X3R2LCBOVUxMKTsKKyAgICAgIG5vdy50dl9zZWMgPSBub3dfdHYudHZfc2VjOworICAgICAgbm93LnR2X25zZWMgPSBub3dfdHYudHZfdXNlYyAqIDEwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdQUl9DTE9DS19NT05PVE9OSUM6CisgICAgICBub3dfZGJsID0gKG1hY2hfYWJzb2x1dGVfdGltZSgpIC0gZ190aW1lX3N0YXJ0KSAqIGdfdGltZV9zY2FsZTsKKyAgICAgIG5vdy50dl9zZWMgPSAoaW50NjRfdCkobm93X2RibCAqIDFlLTkpOworICAgICAgbm93LnR2X25zZWMgPSAoaW50MzJfdCkobm93X2RibCAtICgoZG91YmxlKW5vdy50dl9zZWMpICogMWU5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1BSX0NMT0NLX1BSRUNJU0U6CisgICAgICBncHJfcHJlY2lzZV9jbG9ja19ub3coJm5vdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdQUl9USU1FU1BBTjoKKyAgICAgIGFib3J0KCk7CisgIH0KKworICByZXR1cm4gbm93OworfQorI2VuZGlmCisKK3ZvaWQgZ3ByX3NsZWVwX3VudGlsKGdwcl90aW1lc3BlYyB1bnRpbCkgeworICBncHJfdGltZXNwZWMgbm93OworICBncHJfdGltZXNwZWMgZGVsdGE7CisgIHN0cnVjdCB0aW1lc3BlYyBkZWx0YV90czsKKyAgaW50IG5zX3Jlc3VsdDsKKworICBmb3IgKDs7KSB7CisgICAgLyogV2UgY291bGQgc2ltcGxpZnkgYnkgdXNpbmcgY2xvY2tfbmFub3NsZWVwIGluc3RlYWQsIGJ1dCBpdCBtaWdodCBiZQorICAgICAqIHNsaWdodGx5IGxlc3MgcG9ydGFibGUuICovCisgICAgbm93ID0gZ3ByX25vdyh1bnRpbC5jbG9ja190eXBlKTsKKyAgICBpZiAoZ3ByX3RpbWVfY21wKHVudGlsLCBub3cpIDw9IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWx0YSA9IGdwcl90aW1lX3N1Yih1bnRpbCwgbm93KTsKKyAgICBkZWx0YV90cyA9IHRpbWVzcGVjX2Zyb21fZ3ByKGRlbHRhKTsKKyAgICBHUlBDX1NDSEVEVUxJTkdfU1RBUlRfQkxPQ0tJTkdfUkVHSU9OOworICAgIG5zX3Jlc3VsdCA9IG5hbm9zbGVlcCgmZGVsdGFfdHMsIE5VTEwpOworICAgIEdSUENfU0NIRURVTElOR19FTkRfQkxPQ0tJTkdfUkVHSU9OOworICAgIGlmIChuc19yZXN1bHQgPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiBHUFJfUE9TSVhfVElNRSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFjNDdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBHUlBDX1RJTUVSU19SRFRTQworI2lmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgdm9pZCBncHJfZ2V0X2N5Y2xlX2NvdW50ZXIobG9uZyBsb25nIGludCAqY2xrKSB7CisgIGxvbmcgbG9uZyBpbnQgcmV0OworICBfX2FzbV9fIHZvbGF0aWxlKCJyZHRzYyIgOiAiPUEiKHJldCkpOworICAqY2xrID0gcmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKQorc3RhdGljIHZvaWQgZ3ByX2dldF9jeWNsZV9jb3VudGVyKGxvbmcgbG9uZyBpbnQgKmNsaykgeworICB1bnNpZ25lZCBsb25nIGxvbmcgbG93LCBoaWdoOworICBfX2FzbV9fIHZvbGF0aWxlKCJyZHRzYyIgOiAiPWEiKGxvdyksICI9ZCIoaGlnaCkpOworICAqY2xrID0gKGxvbmcgbG9uZykoaGlnaCA8PCAzMikgfCAobG9uZyBsb25nKWxvdzsKK30KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlIGN5Y2xlc19wZXJfc2Vjb25kID0gMDsKK3N0YXRpYyBsb25nIGxvbmcgaW50IHN0YXJ0X2N5Y2xlOwordm9pZCBncHJfcHJlY2lzZV9jbG9ja19pbml0KHZvaWQpIHsKKyAgdGltZV90IHN0YXJ0OworICBsb25nIGxvbmcgZW5kX2N5Y2xlOworICBncHJfbG9nKEdQUl9ERUJVRywgIkNhbGlicmF0aW5nIHRpbWVycyIpOworICBzdGFydCA9IHRpbWUoTlVMTCk7CisgIHdoaWxlICh0aW1lKE5VTEwpID09IHN0YXJ0KQorICAgIDsKKyAgZ3ByX2dldF9jeWNsZV9jb3VudGVyKCZzdGFydF9jeWNsZSk7CisgIHdoaWxlICh0aW1lKE5VTEwpIDw9IHN0YXJ0ICsgMTApCisgICAgOworICBncHJfZ2V0X2N5Y2xlX2NvdW50ZXIoJmVuZF9jeWNsZSk7CisgIGN5Y2xlc19wZXJfc2Vjb25kID0gKGRvdWJsZSkoZW5kX2N5Y2xlIC0gc3RhcnRfY3ljbGUpIC8gMTAuMDsKKyAgZ3ByX2xvZyhHUFJfREVCVUcsICIuLi4gY3ljbGVzX3Blcl9zZWNvbmQgPSAlZlxuIiwgY3ljbGVzX3Blcl9zZWNvbmQpOworfQorCit2b2lkIGdwcl9wcmVjaXNlX2Nsb2NrX25vdyhncHJfdGltZXNwZWMgKmNsaykgeworICBsb25nIGxvbmcgaW50IGNvdW50ZXI7CisgIGRvdWJsZSBzZWNzOworICBncHJfZ2V0X2N5Y2xlX2NvdW50ZXIoJmNvdW50ZXIpOworICBzZWNzID0gKGRvdWJsZSkoY291bnRlciAtIHN0YXJ0X2N5Y2xlKSAvIGN5Y2xlc19wZXJfc2Vjb25kOworICBjbGstPmNsb2NrX3R5cGUgPSBHUFJfQ0xPQ0tfUFJFQ0lTRTsKKyAgY2xrLT50dl9zZWMgPSAoaW50NjRfdClzZWNzOworICBjbGstPnR2X25zZWMgPSAoaW50MzJfdCkoMWU5ICogKHNlY3MgLSAoZG91YmxlKWNsay0+dHZfc2VjKSk7Cit9CisKKyNlbHNlICAvKiBHUlBDX1RJTUVSU19SRFRTQyAqLwordm9pZCBncHJfcHJlY2lzZV9jbG9ja19pbml0KHZvaWQpIHt9CisKK3ZvaWQgZ3ByX3ByZWNpc2VfY2xvY2tfbm93KGdwcl90aW1lc3BlYyAqY2xrKSB7CisgICpjbGsgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7CisgIGNsay0+Y2xvY2tfdHlwZSA9IEdQUl9DTE9DS19QUkVDSVNFOworfQorI2VuZGlmIC8qIEdSUENfVElNRVJTX1JEVFNDICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZmFlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaApAQCAtMCwwICsxLDQyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9USU1FX1BSRUNJU0VfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUFBPUlRfVElNRV9QUkVDSVNFX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisKK3ZvaWQgZ3ByX3ByZWNpc2VfY2xvY2tfaW5pdCh2b2lkKTsKK3ZvaWQgZ3ByX3ByZWNpc2VfY2xvY2tfbm93KGdwcl90aW1lc3BlYyAqY2xrKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VQUE9SVF9USU1FX1BSRUNJU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YWMwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3dpbjMyLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qIFdpbjMyIGNvZGUgZm9yIGdwciB0aW1lIHN1cHBvcnQuICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaWZkZWYgR1BSX1dJTjMyCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oIgorCitzdGF0aWMgTEFSR0VfSU5URUdFUiBnX3N0YXJ0X3RpbWU7CitzdGF0aWMgZG91YmxlIGdfdGltZV9zY2FsZTsKKwordm9pZCBncHJfdGltZV9pbml0KHZvaWQpIHsKKyAgTEFSR0VfSU5URUdFUiBmcmVxdWVuY3k7CisgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXF1ZW5jeSk7CisgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZnX3N0YXJ0X3RpbWUpOworICBnX3RpbWVfc2NhbGUgPSAxLjAgLyAoZG91YmxlKWZyZXF1ZW5jeS5RdWFkUGFydDsKK30KKworZ3ByX3RpbWVzcGVjIGdwcl9ub3coZ3ByX2Nsb2NrX3R5cGUgY2xvY2spIHsKKyAgZ3ByX3RpbWVzcGVjIG5vd190djsKKyAgTE9OR0xPTkcgZGlmZjsKKyAgc3RydWN0IF90aW1lYiBub3dfdGI7CisgIExBUkdFX0lOVEVHRVIgdGltZXN0YW1wOworICBkb3VibGUgbm93X2RibDsKKyAgbm93X3R2LmNsb2NrX3R5cGUgPSBjbG9jazsKKyAgc3dpdGNoIChjbG9jaykgeworICAgIGNhc2UgR1BSX0NMT0NLX1JFQUxUSU1FOgorICAgICAgX2Z0aW1lX3MoJm5vd190Yik7CisgICAgICBub3dfdHYudHZfc2VjID0gKGludDY0X3Qpbm93X3RiLnRpbWU7CisgICAgICBub3dfdHYudHZfbnNlYyA9IG5vd190Yi5taWxsaXRtICogMTAwMDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1BSX0NMT0NLX01PTk9UT05JQzoKKyAgICBjYXNlIEdQUl9DTE9DS19QUkVDSVNFOgorICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnRpbWVzdGFtcCk7CisgICAgICBkaWZmID0gdGltZXN0YW1wLlF1YWRQYXJ0IC0gZ19zdGFydF90aW1lLlF1YWRQYXJ0OworICAgICAgbm93X2RibCA9IChkb3VibGUpZGlmZiAqIGdfdGltZV9zY2FsZTsKKyAgICAgIG5vd190di50dl9zZWMgPSAoaW50NjRfdClub3dfZGJsOworICAgICAgbm93X3R2LnR2X25zZWMgPSAoaW50MzJfdCkoKG5vd19kYmwgLSAoZG91YmxlKW5vd190di50dl9zZWMpICogMWU5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1BSX1RJTUVTUEFOOgorICAgICAgYWJvcnQoKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBub3dfdHY7Cit9CisKK3ZvaWQgZ3ByX3NsZWVwX3VudGlsKGdwcl90aW1lc3BlYyB1bnRpbCkgeworICBncHJfdGltZXNwZWMgbm93OworICBncHJfdGltZXNwZWMgZGVsdGE7CisgIGludDY0X3Qgc2xlZXBfbWlsbGlzOworCisgIGZvciAoOzspIHsKKyAgICAvKiBXZSBjb3VsZCBzaW1wbGlmeSBieSB1c2luZyBjbG9ja19uYW5vc2xlZXAgaW5zdGVhZCwgYnV0IGl0IG1pZ2h0IGJlCisgICAgICogc2xpZ2h0bHkgbGVzcyBwb3J0YWJsZS4gKi8KKyAgICBub3cgPSBncHJfbm93KHVudGlsLmNsb2NrX3R5cGUpOworICAgIGlmIChncHJfdGltZV9jbXAodW50aWwsIG5vdykgPD0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlbHRhID0gZ3ByX3RpbWVfc3ViKHVudGlsLCBub3cpOworICAgIHNsZWVwX21pbGxpcyA9CisgICAgICAgIGRlbHRhLnR2X3NlYyAqIEdQUl9NU19QRVJfU0VDICsgZGVsdGEudHZfbnNlYyAvIEdQUl9OU19QRVJfTVM7CisgICAgR1BSX0FTU0VSVCgoc2xlZXBfbWlsbGlzID49IDApICYmIChzbGVlcF9taWxsaXMgPD0gSU5UX01BWCkpOworICAgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047CisgICAgU2xlZXAoKERXT1JEKXNsZWVwX21pbGxpcyk7CisgICAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047CisgIH0KK30KKworI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3Rsc19wdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjN2VkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3Rsc19wdGhyZWFkLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKKyNpZmRlZiBHUFJfUFRIUkVBRF9UTFMKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90bHMuaD4KKworaW50cHRyX3QgZ3ByX3Rsc19zZXQoc3RydWN0IGdwcl9wdGhyZWFkX3RocmVhZF9sb2NhbCAqdGxzLCBpbnRwdHJfdCB2YWx1ZSkgeworICBHUFJfQVNTRVJUKDAgPT0gcHRocmVhZF9zZXRzcGVjaWZpYyh0bHMtPmtleSwgKHZvaWQgKil2YWx1ZSkpOworICByZXR1cm4gdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBHUFJfUFRIUkVBRF9UTFMgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGUuaCBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmVjMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVBQT1JUX1RNUEZJTEVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUFBPUlRfVE1QRklMRV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGZyb20gYSBwcmVmaXguCisgICBJZiB0bXBfZmlsZW5hbWUgaXMgbm90IE5VTEwsICp0bXBfZmlsZW5hbWUgaXMgYXNzaWduZWQgdGhlIG5hbWUgb2YgdGhlCisgICBjcmVhdGVkIGZpbGUgYW5kIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGdwcl9mcmVlIGl0CisgICB1bmxlc3MgYW4gZXJyb3Igb2NjdXJzIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBzZXQgdG8gTlVMTC4gKi8KK0ZJTEUgKmdwcl90bXBmaWxlKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKnRtcF9maWxlbmFtZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUFBPUlRfVE1QRklMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzZjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYwpAQCAtMCwwICsxLDg1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9QT1NJWF9GSUxFCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK0ZJTEUgKmdwcl90bXBmaWxlKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKnRtcF9maWxlbmFtZSkgeworICBGSUxFICpyZXN1bHQgPSBOVUxMOworICBjaGFyICp0ZW1wbGF0ZTsKKyAgaW50IGZkOworCisgIGlmICh0bXBfZmlsZW5hbWUgIT0gTlVMTCkgKnRtcF9maWxlbmFtZSA9IE5VTEw7CisKKyAgZ3ByX2FzcHJpbnRmKCZ0ZW1wbGF0ZSwgIi90bXAvJXNfWFhYWFhYIiwgcHJlZml4KTsKKyAgR1BSX0FTU0VSVCh0ZW1wbGF0ZSAhPSBOVUxMKTsKKworICBmZCA9IG1rc3RlbXAodGVtcGxhdGUpOworICBpZiAoZmQgPT0gLTEpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm1rc3RlbXAgZmFpbGVkIGZvciB0ZW1wbGF0ZSAlcyB3aXRoIGVycm9yICVzLiIsCisgICAgICAgICAgICB0ZW1wbGF0ZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICByZXN1bHQgPSBmZG9wZW4oZmQsICJ3KyIpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMgZnJvbSBmZCAlZCAoZXJyb3IgPSAlcykuIiwKKyAgICAgICAgICAgIHRlbXBsYXRlLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB1bmxpbmsodGVtcGxhdGUpOworICAgIGNsb3NlKGZkKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCitlbmQ6CisgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiB0bXBfZmlsZW5hbWUgIT0gTlVMTCkgeworICAgICp0bXBfZmlsZW5hbWUgPSB0ZW1wbGF0ZTsKKyAgfSBlbHNlIHsKKyAgICBncHJfZnJlZSh0ZW1wbGF0ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIEdQUl9QT1NJWF9GSUxFICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMgYi9zcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOTJiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KKworI2lmZGVmIEdQUl9XSU4zMgorCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCisKK0ZJTEUgKmdwcl90bXBmaWxlKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKnRtcF9maWxlbmFtZV9vdXQpIHsKKyAgRklMRSAqcmVzdWx0ID0gTlVMTDsKKyAgTFBUU1RSIHRlbXBsYXRlX3N0cmluZyA9IE5VTEw7CisgIFRDSEFSIHRtcF9wYXRoW01BWF9QQVRIXTsKKyAgVENIQVIgdG1wX2ZpbGVuYW1lW01BWF9QQVRIXTsKKyAgRFdPUkQgc3RhdHVzOworICBVSU5UIHN1Y2Nlc3M7CisKKyAgaWYgKHRtcF9maWxlbmFtZV9vdXQgIT0gTlVMTCkgKnRtcF9maWxlbmFtZV9vdXQgPSBOVUxMOworCisgIC8qIENvbnZlcnQgb3VyIHByZWZpeCB0byBUQ0hBUi4gKi8KKyAgdGVtcGxhdGVfc3RyaW5nID0gZ3ByX2NoYXJfdG9fdGNoYXIocHJlZml4KTsKKyAgR1BSX0FTU0VSVCh0ZW1wbGF0ZV9zdHJpbmcpOworCisgIC8qIEdldCB0aGUgcGF0aCB0byB0aGUgYmVzdCB0ZW1wb3JhcnkgZm9sZGVyIGF2YWlsYWJsZS4gKi8KKyAgc3RhdHVzID0gR2V0VGVtcFBhdGgoTUFYX1BBVEgsIHRtcF9wYXRoKTsKKyAgaWYgKHN0YXR1cyA9PSAwIHx8IHN0YXR1cyA+IE1BWF9QQVRIKSBnb3RvIGVuZDsKKworICAvKiBHZW5lcmF0ZSBhIHVuaXF1ZSBmaWxlbmFtZSB3aXRoIG91ciB0ZW1wbGF0ZSArIHRlbXBvcmFyeSBwYXRoLiAqLworICBzdWNjZXNzID0gR2V0VGVtcEZpbGVOYW1lKHRtcF9wYXRoLCB0ZW1wbGF0ZV9zdHJpbmcsIDAsIHRtcF9maWxlbmFtZSk7CisgIGlmICghc3VjY2VzcykgZ290byBlbmQ7CisKKyAgLyogT3BlbiBhIGZpbGUgdGhlcmUuICovCisgIGlmIChfdGZvcGVuX3MoJnJlc3VsdCwgdG1wX2ZpbGVuYW1lLCBURVhUKCJ3YisiKSkgIT0gMCkgZ290byBlbmQ7CisKK2VuZDoKKyAgaWYgKHJlc3VsdCAmJiB0bXBfZmlsZW5hbWVfb3V0KSB7CisgICAgKnRtcF9maWxlbmFtZV9vdXQgPSBncHJfdGNoYXJfdG9fY2hhcih0bXBfZmlsZW5hbWUpOworICB9CisKKyAgZ3ByX2ZyZWUodGVtcGxhdGVfc3RyaW5nKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jIGIvc3JjL2NvcmUvbGliL3N1cHBvcnQvd3JhcF9tZW1jcHkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jCnJlbmFtZSB0byBzcmMvY29yZS9saWIvc3VwcG9ydC93cmFwX21lbWNweS5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvYWxhcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjg2ODMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvYWxhcm0uYwpAQCAtMCwwICsxLDg0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIgorCitzdHJ1Y3QgZ3JwY19hbGFybSB7CisgIGdycGNfdGltZXIgYWxhcm07CisgIGdycGNfY3FfY29tcGxldGlvbiBjb21wbGV0aW9uOworICAvKiogY29tcGxldGlvbiBxdWV1ZSB3aGVyZSBldmVudHMgYWJvdXQgdGhpcyBhbGFybSB3aWxsIGJlIHBvc3RlZCAqLworICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxOworICAvKiogdXNlciBzdXBwbGllZCB0YWcgKi8KKyAgdm9pZCAqdGFnOworfTsKKworc3RhdGljIHZvaWQgZG9fbm90aGluZ19lbmRfY29tcGxldGlvbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX2NvbXBsZXRpb24gKmMpIHt9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2NiKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgeworICBncnBjX2FsYXJtICphbGFybSA9IGFyZzsKKyAgZ3JwY19jcV9lbmRfb3AoZXhlY19jdHgsIGFsYXJtLT5jcSwgYWxhcm0tPnRhZywgc3VjY2VzcywKKyAgICAgICAgICAgICAgICAgZG9fbm90aGluZ19lbmRfY29tcGxldGlvbiwgTlVMTCwgJmFsYXJtLT5jb21wbGV0aW9uKTsKK30KKworZ3JwY19hbGFybSAqZ3JwY19hbGFybV9jcmVhdGUoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSwgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGFnKSB7CisgIGdycGNfYWxhcm0gKmFsYXJtID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19hbGFybSkpOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworCisgIEdSUENfQ1FfSU5URVJOQUxfUkVGKGNxLCAiYWxhcm0iKTsKKyAgYWxhcm0tPmNxID0gY3E7CisgIGFsYXJtLT50YWcgPSB0YWc7CisKKyAgZ3JwY19jcV9iZWdpbl9vcChjcSwgdGFnKTsKKyAgZ3JwY190aW1lcl9pbml0KCZleGVjX2N0eCwgJmFsYXJtLT5hbGFybSwKKyAgICAgICAgICAgICAgICAgIGdwcl9jb252ZXJ0X2Nsb2NrX3R5cGUoZGVhZGxpbmUsIEdQUl9DTE9DS19NT05PVE9OSUMpLAorICAgICAgICAgICAgICAgICAgYWxhcm1fY2IsIGFsYXJtLCBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgcmV0dXJuIGFsYXJtOworfQorCit2b2lkIGdycGNfYWxhcm1fY2FuY2VsKGdycGNfYWxhcm0gKmFsYXJtKSB7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIGdycGNfdGltZXJfY2FuY2VsKCZleGVjX2N0eCwgJmFsYXJtLT5hbGFybSk7CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Cit9CisKK3ZvaWQgZ3JwY19hbGFybV9kZXN0cm95KGdycGNfYWxhcm0gKmFsYXJtKSB7CisgIGdycGNfYWxhcm1fY2FuY2VsKGFsYXJtKTsKKyAgR1JQQ19DUV9JTlRFUk5BTF9VTlJFRihhbGFybS0+Y3EsICJhbGFybSIpOworICBncHJfZnJlZShhbGFybSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDJjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgiCisKK2ludCBncnBjX2FwaV90cmFjZSA9IDA7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDAxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaApAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9BUElfVFJBQ0VfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfQVBJX1RSQUNFX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaCIKKworZXh0ZXJuIGludCBncnBjX2FwaV90cmFjZTsKKworLyogUHJvdmlkZSB1bndyYXBwaW5nIG1hY3JvcyBiZWNhdXNlIHdlJ3JlIGluIEM4OSBhbmQgdmFyaWFkaWMgbWFjcm9zIHdlcmVuJ3QKKyAgIGludHJvZHVjZWQgdW50aWwgQzk5Li4uICovCisjZGVmaW5lIEdSUENfQVBJX1RSQUNFX1VOV1JBUDAoKQorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVAxKGEpICwgYQorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVAyKGEsIGIpICwgYSwgYgorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVAzKGEsIGIsIGMpICwgYSwgYiwgYworI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA0KGEsIGIsIGMsIGQpICwgYSwgYiwgYywgZAorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA1KGEsIGIsIGMsIGQsIGUpICwgYSwgYiwgYywgZCwgZQorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA2KGEsIGIsIGMsIGQsIGUsIGYpICwgYSwgYiwgYywgZCwgZSwgZgorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA3KGEsIGIsIGMsIGQsIGUsIGYsIGcpICwgYSwgYiwgYywgZCwgZSwgZiwgZworI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA4KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICwgYSwgYiwgYywgZCwgZSwgZiwgZywgaAorI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpIFwKKyAgLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpCisjZGVmaW5lIEdSUENfQVBJX1RSQUNFX1VOV1JBUDEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopIFwKKyAgLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqCisKKy8qIER1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2YgQzg5J3MgcHJlcHJvY2Vzc29yLCB0aGUgYXJpdHkgb2YgdGhlIHZhci1hcmcgbGlzdAorICAgJ25hcmdzJyBtdXN0IGJlIHNwZWNpZmllZC4gKi8KKyNkZWZpbmUgR1JQQ19BUElfVFJBQ0UoZm10LCBuYXJncywgYXJncykgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZ3JwY19hcGlfdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ3ByX2xvZyhHUFJfSU5GTywgZm10IEdSUENfQVBJX1RSQUNFX1VOV1JBUCMjbmFyZ3MgYXJncyk7IFwKKyAgfQorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0FQSV9UUkFDRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA3MWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9ieXRlX2J1ZmZlci5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworZ3JwY19ieXRlX2J1ZmZlciAqZ3JwY19yYXdfYnl0ZV9idWZmZXJfY3JlYXRlKGdwcl9zbGljZSAqc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuc2xpY2VzKSB7CisgIHJldHVybiBncnBjX3Jhd19jb21wcmVzc2VkX2J5dGVfYnVmZmVyX2NyZWF0ZShzbGljZXMsIG5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NPTVBSRVNTX05PTkUpOworfQorCitncnBjX2J5dGVfYnVmZmVyICpncnBjX3Jhd19jb21wcmVzc2VkX2J5dGVfYnVmZmVyX2NyZWF0ZSgKKyAgICBncHJfc2xpY2UgKnNsaWNlcywgc2l6ZV90IG5zbGljZXMsIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGNvbXByZXNzaW9uKSB7CisgIHNpemVfdCBpOworICBncnBjX2J5dGVfYnVmZmVyICpiYiA9IG1hbGxvYyhzaXplb2YoZ3JwY19ieXRlX2J1ZmZlcikpOworICBiYi0+dHlwZSA9IEdSUENfQkJfUkFXOworICBiYi0+ZGF0YS5yYXcuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZiYi0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyKTsKKyAgZm9yIChpID0gMDsgaSA8IG5zbGljZXM7IGkrKykgeworICAgIGdwcl9zbGljZV9yZWYoc2xpY2VzW2ldKTsKKyAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmYmItPmRhdGEucmF3LnNsaWNlX2J1ZmZlciwgc2xpY2VzW2ldKTsKKyAgfQorICByZXR1cm4gYmI7Cit9CisKK2dycGNfYnl0ZV9idWZmZXIgKmdycGNfcmF3X2J5dGVfYnVmZmVyX2Zyb21fcmVhZGVyKAorICAgIGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyICpyZWFkZXIpIHsKKyAgZ3JwY19ieXRlX2J1ZmZlciAqYmIgPSBtYWxsb2Moc2l6ZW9mKGdycGNfYnl0ZV9idWZmZXIpKTsKKyAgZ3ByX3NsaWNlIHNsaWNlOworICBiYi0+dHlwZSA9IEdSUENfQkJfUkFXOworICBiYi0+ZGF0YS5yYXcuY29tcHJlc3Npb24gPSBHUlBDX0NPTVBSRVNTX05PTkU7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmYmItPmRhdGEucmF3LnNsaWNlX2J1ZmZlcik7CisKKyAgd2hpbGUgKGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX25leHQocmVhZGVyLCAmc2xpY2UpKSB7CisgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIsIHNsaWNlKTsKKyAgfQorICByZXR1cm4gYmI7Cit9CisKK2dycGNfYnl0ZV9idWZmZXIgKmdycGNfYnl0ZV9idWZmZXJfY29weShncnBjX2J5dGVfYnVmZmVyICpiYikgeworICBzd2l0Y2ggKGJiLT50eXBlKSB7CisgICAgY2FzZSBHUlBDX0JCX1JBVzoKKyAgICAgIHJldHVybiBncnBjX3Jhd19ieXRlX2J1ZmZlcl9jcmVhdGUoYmItPmRhdGEucmF3LnNsaWNlX2J1ZmZlci5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIuY291bnQpOworICB9CisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiBOVUxMKTsKK30KKwordm9pZCBncnBjX2J5dGVfYnVmZmVyX2Rlc3Ryb3koZ3JwY19ieXRlX2J1ZmZlciAqYmIpIHsKKyAgaWYgKCFiYikgcmV0dXJuOworICBzd2l0Y2ggKGJiLT50eXBlKSB7CisgICAgY2FzZSBHUlBDX0JCX1JBVzoKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmYmItPmRhdGEucmF3LnNsaWNlX2J1ZmZlcik7CisgICAgICBicmVhazsKKyAgfQorICBmcmVlKGJiKTsKK30KKworc2l6ZV90IGdycGNfYnl0ZV9idWZmZXJfbGVuZ3RoKGdycGNfYnl0ZV9idWZmZXIgKmJiKSB7CisgIHN3aXRjaCAoYmItPnR5cGUpIHsKKyAgICBjYXNlIEdSUENfQkJfUkFXOgorICAgICAgcmV0dXJuIGJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIubGVuZ3RoOworICB9CisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0OGY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvYnl0ZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxncnBjL2NvbXByZXNzaW9uLmg+CisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiCisKK3N0YXRpYyBpbnQgaXNfY29tcHJlc3NlZChncnBjX2J5dGVfYnVmZmVyICpidWZmZXIpIHsKKyAgc3dpdGNoIChidWZmZXItPnR5cGUpIHsKKyAgICBjYXNlIEdSUENfQkJfUkFXOgorICAgICAgaWYgKGJ1ZmZlci0+ZGF0YS5yYXcuY29tcHJlc3Npb24gPT0gR1JQQ19DT01QUkVTU19OT05FKSB7CisgICAgICAgIHJldHVybiAwIC8qIEdQUl9GQUxTRSAqLzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxIC8qIEdQUl9UUlVFICovOworfQorCit2b2lkIGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX2luaXQoZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfYnVmZmVyICpidWZmZXIpIHsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBkZWNvbXByZXNzZWRfc2xpY2VzX2J1ZmZlcjsKKyAgcmVhZGVyLT5idWZmZXJfaW4gPSBidWZmZXI7CisgIHN3aXRjaCAocmVhZGVyLT5idWZmZXJfaW4tPnR5cGUpIHsKKyAgICBjYXNlIEdSUENfQkJfUkFXOgorICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZkZWNvbXByZXNzZWRfc2xpY2VzX2J1ZmZlcik7CisgICAgICBpZiAoaXNfY29tcHJlc3NlZChyZWFkZXItPmJ1ZmZlcl9pbikpIHsKKyAgICAgICAgZ3JwY19tc2dfZGVjb21wcmVzcyhyZWFkZXItPmJ1ZmZlcl9pbi0+ZGF0YS5yYXcuY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+YnVmZmVyX2luLT5kYXRhLnJhdy5zbGljZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3NlZF9zbGljZXNfYnVmZmVyKTsKKyAgICAgICAgcmVhZGVyLT5idWZmZXJfb3V0ID0KKyAgICAgICAgICAgIGdycGNfcmF3X2J5dGVfYnVmZmVyX2NyZWF0ZShkZWNvbXByZXNzZWRfc2xpY2VzX2J1ZmZlci5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wcmVzc2VkX3NsaWNlc19idWZmZXIuY291bnQpOworICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJmRlY29tcHJlc3NlZF9zbGljZXNfYnVmZmVyKTsKKyAgICAgIH0gZWxzZSB7IC8qIG5vdCBjb21wcmVzc2VkLCB1c2UgdGhlIGlucHV0IGJ1ZmZlciBhcyBvdXRwdXQgKi8KKyAgICAgICAgcmVhZGVyLT5idWZmZXJfb3V0ID0gcmVhZGVyLT5idWZmZXJfaW47CisgICAgICB9CisgICAgICByZWFkZXItPmN1cnJlbnQuaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBncnBjX2J5dGVfYnVmZmVyX3JlYWRlcl9kZXN0cm95KGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyICpyZWFkZXIpIHsKKyAgc3dpdGNoIChyZWFkZXItPmJ1ZmZlcl9pbi0+dHlwZSkgeworICAgIGNhc2UgR1JQQ19CQl9SQVc6CisgICAgICAvKiBrZWVwaW5nIHRoZSBzYW1lIGlmLWVsc2Ugc3RydWN0dXJlIGFzIGluIHRoZSBpbml0IGZ1bmN0aW9uICovCisgICAgICBpZiAoaXNfY29tcHJlc3NlZChyZWFkZXItPmJ1ZmZlcl9pbikpIHsKKyAgICAgICAgZ3JwY19ieXRlX2J1ZmZlcl9kZXN0cm95KHJlYWRlci0+YnVmZmVyX291dCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCitpbnQgZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXJfbmV4dChncnBjX2J5dGVfYnVmZmVyX3JlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpzbGljZSkgeworICBzd2l0Y2ggKHJlYWRlci0+YnVmZmVyX2luLT50eXBlKSB7CisgICAgY2FzZSBHUlBDX0JCX1JBVzogeworICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VfYnVmZmVyOworICAgICAgc2xpY2VfYnVmZmVyID0gJnJlYWRlci0+YnVmZmVyX291dC0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyOworICAgICAgaWYgKHJlYWRlci0+Y3VycmVudC5pbmRleCA8IHNsaWNlX2J1ZmZlci0+Y291bnQpIHsKKyAgICAgICAgKnNsaWNlID0gZ3ByX3NsaWNlX3JlZihzbGljZV9idWZmZXItPnNsaWNlc1tyZWFkZXItPmN1cnJlbnQuaW5kZXhdKTsKKyAgICAgICAgcmVhZGVyLT5jdXJyZW50LmluZGV4ICs9IDE7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitncHJfc2xpY2UgZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXJfcmVhZGFsbChncnBjX2J5dGVfYnVmZmVyX3JlYWRlciAqcmVhZGVyKSB7CisgIGdwcl9zbGljZSBpbl9zbGljZTsKKyAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworICBjb25zdCBzaXplX3QgaW5wdXRfc2l6ZSA9IGdycGNfYnl0ZV9idWZmZXJfbGVuZ3RoKHJlYWRlci0+YnVmZmVyX291dCk7CisgIGdwcl9zbGljZSBvdXRfc2xpY2UgPSBncHJfc2xpY2VfbWFsbG9jKGlucHV0X3NpemUpOworICB1aW50OF90ICpjb25zdCBvdXRidWYgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKG91dF9zbGljZSk7IC8qIGp1c3QgYW4gYWxpYXMgKi8KKworICB3aGlsZSAoZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXJfbmV4dChyZWFkZXIsICZpbl9zbGljZSkgIT0gMCkgeworICAgIGNvbnN0IHNpemVfdCBzbGljZV9sZW5ndGggPSBHUFJfU0xJQ0VfTEVOR1RIKGluX3NsaWNlKTsKKyAgICBtZW1jcHkoJihvdXRidWZbYnl0ZXNfcmVhZF0pLCBHUFJfU0xJQ0VfU1RBUlRfUFRSKGluX3NsaWNlKSwgc2xpY2VfbGVuZ3RoKTsKKyAgICBieXRlc19yZWFkICs9IHNsaWNlX2xlbmd0aDsKKyAgICBncHJfc2xpY2VfdW5yZWYoaW5fc2xpY2UpOworICAgIEdQUl9BU1NFUlQoYnl0ZXNfcmVhZCA8PSBpbnB1dF9zaXplKTsKKyAgfQorICByZXR1cm4gb3V0X3NsaWNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2M2E0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmMKQEAgLTAsMCArMSwxNDkxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL2NvbXByZXNzaW9uLmg+CisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgorCisvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgYmF0Y2hlcyBwb3NzaWJsZS4KKyAgICBCYXNlZCB1cG9uIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsbHkgcXVldWVhYmxlIG9wcyBpbiB0aGUgYmF0Y2gKKyAgIGFwaToKKyAgICAgIC0gaW5pdGlhbCBtZXRhZGF0YSBzZW5kCisgICAgICAtIG1lc3NhZ2Ugc2VuZAorICAgICAgLSBzdGF0dXMvY2xvc2Ugc2VuZCAoZGVwZW5kaW5nIG9uIGNsaWVudC9zZXJ2ZXIpCisgICAgICAtIGluaXRpYWwgbWV0YWRhdGEgcmVjdgorICAgICAgLSBtZXNzYWdlIHJlY3YKKyAgICAgIC0gc3RhdHVzL2Nsb3NlIHJlY3YgKGRlcGVuZGluZyBvbiBjbGllbnQvc2VydmVyKSAqLworI2RlZmluZSBNQVhfQ09OQ1VSUkVOVF9CQVRDSEVTIDYKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2lvcmVxX2NvbXBsZXRpb25fZnVuYyBvbl9jb21wbGV0ZTsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBpbnQgc3VjY2VzczsKK30gY29tcGxldGVkX3JlcXVlc3Q7CisKKyNkZWZpbmUgTUFYX1NFTkRfRVhUUkFfTUVUQURBVEFfQ09VTlQgMworCisvKiBTdGF0dXMgZGF0YSBmb3IgYSByZXF1ZXN0IGNhbiBjb21lIGZyb20gc2V2ZXJhbCBzb3VyY2VzOyB0aGlzCisgICBlbnVtZXJhdGVzIHRoZW0gYWxsLCBhbmQgYWN0cyBhcyBhIHByaW9yaXR5IHNvcnRpbmcgZm9yIHdoaWNoCisgICBzdGF0dXMgdG8gcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbiAtIGVhcmxpZXIgZW50cmllcyBvdmVycmlkZQorICAgbGF0ZXIgb25lcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgLyogU3RhdHVzIGNhbWUgZnJvbSB0aGUgYXBwbGljYXRpb24gbGF5ZXIgb3ZlcnJpZGluZyB3aGF0ZXZlcgorICAgICB0aGUgd2lyZSBzYXlzICovCisgIFNUQVRVU19GUk9NX0FQSV9PVkVSUklERSA9IDAsCisgIC8qIFN0YXR1cyB3YXMgY3JlYXRlZCBieSBzb21lIGludGVybmFsIGNoYW5uZWwgc3RhY2sgb3BlcmF0aW9uICovCisgIFNUQVRVU19GUk9NX0NPUkUsCisgIC8qIFN0YXR1cyBjYW1lIGZyb20gJ3RoZSB3aXJlJyAtIG9yIHNvbWV3aGVyZSBiZWxvdyB0aGUgc3VyZmFjZQorICAgICBsYXllciAqLworICBTVEFUVVNfRlJPTV9XSVJFLAorICAvKiBTdGF0dXMgY2FtZSBmcm9tIHRoZSBzZXJ2ZXIgc2VuZGluZyBzdGF0dXMgKi8KKyAgU1RBVFVTX0ZST01fU0VSVkVSX1NUQVRVUywKKyAgU1RBVFVTX1NPVVJDRV9DT1VOVAorfSBzdGF0dXNfc291cmNlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgaXNfc2V0OworICBncnBjX3N0YXR1c19jb2RlIGNvZGU7CisgIGdycGNfbWRzdHIgKmRldGFpbHM7Cit9IHJlY2VpdmVkX3N0YXR1czsKKworLyogSG93IGZhciB0aHJvdWdoIHRoZSBHUlBDIHN0cmVhbSBoYXZlIHdlIHJlYWQ/ICovCit0eXBlZGVmIGVudW0geworICAvKiBXZSBhcmUgc3RpbGwgd2FpdGluZyBmb3IgaW5pdGlhbCBtZXRhZGF0YSB0byBjb21wbGV0ZSAqLworICBSRUFEX1NUQVRFX0lOSVRJQUwgPSAwLAorICAvKiBXZSBoYXZlIGdvdHRlbiBpbml0aWFsIG1ldGFkYXRhLCBhbmQgYXJlIHJlYWRpbmcgZWl0aGVyCisgICAgIG1lc3NhZ2VzIG9yIHRyYWlsaW5nIG1ldGFkYXRhICovCisgIFJFQURfU1RBVEVfR09UX0lOSVRJQUxfTUVUQURBVEEsCisgIC8qIFRoZSBzdHJlYW0gaXMgY2xvc2VkIGZvciByZWFkaW5nICovCisgIFJFQURfU1RBVEVfUkVBRF9DTE9TRUQsCisgIC8qIFRoZSBzdHJlYW0gaXMgY2xvc2VkIGZvciByZWFkaW5nICYgd3JpdGluZyAqLworICBSRUFEX1NUQVRFX1NUUkVBTV9DTE9TRUQKK30gcmVhZF9zdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgV1JJVEVfU1RBVEVfSU5JVElBTCA9IDAsCisgIFdSSVRFX1NUQVRFX1NUQVJURUQsCisgIFdSSVRFX1NUQVRFX1dSSVRFX0NMT1NFRAorfSB3cml0ZV9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgYmF0Y2hfY29udHJvbCB7CisgIGdycGNfY2FsbCAqY2FsbDsKKyAgZ3JwY19jcV9jb21wbGV0aW9uIGNxX2NvbXBsZXRpb247CisgIGdycGNfY2xvc3VyZSBmaW5pc2hfYmF0Y2g7CisgIHZvaWQgKm5vdGlmeV90YWc7CisgIGdwcl9yZWZjb3VudCBzdGVwc190b19jb21wbGV0ZTsKKworICB1aW50OF90IHNlbmRfaW5pdGlhbF9tZXRhZGF0YTsKKyAgdWludDhfdCBzZW5kX21lc3NhZ2U7CisgIHVpbnQ4X3Qgc2VuZF9maW5hbF9vcDsKKyAgdWludDhfdCByZWN2X2luaXRpYWxfbWV0YWRhdGE7CisgIHVpbnQ4X3QgcmVjdl9tZXNzYWdlOworICB1aW50OF90IHJlY3ZfZmluYWxfb3A7CisgIHVpbnQ4X3QgaXNfbm90aWZ5X3RhZ19jbG9zdXJlOworICB1aW50OF90IHN1Y2Nlc3M7Cit9IGJhdGNoX2NvbnRyb2w7CisKK3N0cnVjdCBncnBjX2NhbGwgeworICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxOworICBncnBjX2NoYW5uZWwgKmNoYW5uZWw7CisgIGdycGNfY2FsbCAqcGFyZW50OworICBncnBjX2NhbGwgKmZpcnN0X2NoaWxkOworICAvKiBUT0RPKGN0aWxsZXIpOiBzaGFyZSB3aXRoIGNxIGlmIHBvc3NpYmxlPyAqLworICBncHJfbXUgbXU7CisKKyAgLyogY2xpZW50IG9yIHNlcnZlciBjYWxsICovCisgIHVpbnQ4X3QgaXNfY2xpZW50OworICAvKiBpcyB0aGUgYWxhcm0gc2V0ICovCisgIHVpbnQ4X3QgaGF2ZV9hbGFybTsKKyAgLyoqIGhhcyBncnBjX2NhbGxfZGVzdHJveSBiZWVuIGNhbGxlZCAqLworICB1aW50OF90IGRlc3Ryb3lfY2FsbGVkOworICAvKiogZmxhZyBpbmRpY2F0aW5nIHRoYXQgY2FuY2VsbGF0aW9uIGlzIGluaGVyaXRlZCAqLworICB1aW50OF90IGNhbmNlbGxhdGlvbl9pc19pbmhlcml0ZWQ7CisgIC8qKiBiaXRtYXNrIG9mIGxpdmUgYmF0Y2hlcyAqLworICB1aW50OF90IHVzZWRfYmF0Y2hlczsKKyAgLyoqIHdoaWNoIG9wcyBhcmUgaW4tZmxpZ2h0ICovCisgIHVpbnQ4X3Qgc2VudF9pbml0aWFsX21ldGFkYXRhOworICB1aW50OF90IHNlbmRpbmdfbWVzc2FnZTsKKyAgdWludDhfdCBzZW50X2ZpbmFsX29wOworICB1aW50OF90IHJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGE7CisgIHVpbnQ4X3QgcmVjZWl2aW5nX21lc3NhZ2U7CisgIHVpbnQ4X3QgcmVjZWl2ZWRfZmluYWxfb3A7CisKKyAgLyogaGF2ZSB3ZSByZWNlaXZlZCBpbml0aWFsIG1ldGFkYXRhICovCisgIGJvb2wgaGFzX2luaXRpYWxfbWRfYmVlbl9yZWNlaXZlZDsKKworICBiYXRjaF9jb250cm9sIGFjdGl2ZV9iYXRjaGVzW01BWF9DT05DVVJSRU5UX0JBVENIRVNdOworCisgIC8qIGZpcnN0IGlkeDogaXNfcmVjZWl2aW5nLCBzZWNvbmQgaWR4OiBpc190cmFpbGluZyAqLworICBncnBjX21ldGFkYXRhX2JhdGNoIG1ldGFkYXRhX2JhdGNoWzJdWzJdOworCisgIC8qIEJ1ZmZlcmVkIHJlYWQgbWV0YWRhdGEgd2FpdGluZyB0byBiZSByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24uCisgICAgIEVsZW1lbnQgMCBpcyBpbml0aWFsIG1ldGFkYXRhLCBlbGVtZW50IDEgaXMgdHJhaWxpbmcgbWV0YWRhdGEuICovCisgIGdycGNfbWV0YWRhdGFfYXJyYXkgKmJ1ZmZlcmVkX21ldGFkYXRhWzJdOworCisgIC8qIFJlY2VpdmVkIGNhbGwgc3RhdHVzZXMgZnJvbSB2YXJpb3VzIHNvdXJjZXMgKi8KKyAgcmVjZWl2ZWRfc3RhdHVzIHN0YXR1c1tTVEFUVVNfU09VUkNFX0NPVU5UXTsKKworICAvKiBDb21wcmVzc2lvbiBhbGdvcml0aG0gZm9yIHRoZSBjYWxsICovCisgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGNvbXByZXNzaW9uX2FsZ29yaXRobTsKKyAgLyogU3VwcG9ydGVkIGVuY29kaW5ncyAoY29tcHJlc3Npb24gYWxnb3JpdGhtcyksIGEgYml0c2V0ICovCisgIHVpbnQzMl90IGVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyOworCisgIC8qIENvbnRleHRzIGZvciB2YXJpb3VzIHN1YnN5c3RlbXMgKHNlY3VyaXR5LCB0cmFjaW5nLCAuLi4pLiAqLworICBncnBjX2NhbGxfY29udGV4dF9lbGVtZW50IGNvbnRleHRbR1JQQ19DT05URVhUX0NPVU5UXTsKKworICAvKiBEZWFkbGluZSBhbGFybSAtIGlmIGhhdmVfYWxhcm0gaXMgbm9uLXplcm8gKi8KKyAgZ3JwY190aW1lciBhbGFybTsKKworICAvKiBmb3IgdGhlIGNsaWVudCwgZXh0cmEgbWV0YWRhdGEgaXMgaW5pdGlhbCBtZXRhZGF0YTsgZm9yIHRoZQorICAgICBzZXJ2ZXIsIGl0J3MgdHJhaWxpbmcgbWV0YWRhdGEgKi8KKyAgZ3JwY19saW5rZWRfbWRlbGVtIHNlbmRfZXh0cmFfbWV0YWRhdGFbTUFYX1NFTkRfRVhUUkFfTUVUQURBVEFfQ09VTlRdOworICBpbnQgc2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudDsKKyAgZ3ByX3RpbWVzcGVjIHNlbmRfZGVhZGxpbmU7CisKKyAgLyoqIHNpYmxpbmdzOiBjaGlsZHJlbiBvZiB0aGUgc2FtZSBwYXJlbnQgZm9ybSBhIGxpc3QsIGFuZCB0aGlzIGxpc3QgaXMKKyAgICAgcHJvdGVjdGVkIHVuZGVyCisgICAgICBwYXJlbnQtPm11ICovCisgIGdycGNfY2FsbCAqc2libGluZ19uZXh0OworICBncnBjX2NhbGwgKnNpYmxpbmdfcHJldjsKKworICBncnBjX3NsaWNlX2J1ZmZlcl9zdHJlYW0gc2VuZGluZ19zdHJlYW07CisgIGdycGNfYnl0ZV9zdHJlYW0gKnJlY2VpdmluZ19zdHJlYW07CisgIGdycGNfYnl0ZV9idWZmZXIgKipyZWNlaXZpbmdfYnVmZmVyOworICBncHJfc2xpY2UgcmVjZWl2aW5nX3NsaWNlOworICBncnBjX2Nsb3N1cmUgcmVjZWl2aW5nX3NsaWNlX3JlYWR5OworICBncnBjX2Nsb3N1cmUgcmVjZWl2aW5nX3N0cmVhbV9yZWFkeTsKKyAgZ3JwY19jbG9zdXJlIHJlY2VpdmluZ19pbml0aWFsX21ldGFkYXRhX3JlYWR5OworICB1aW50MzJfdCB0ZXN0X29ubHlfbGFzdF9tZXNzYWdlX2ZsYWdzOworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgZ3JwY19zdGF0dXNfY29kZSAqc3RhdHVzOworICAgICAgY2hhciAqKnN0YXR1c19kZXRhaWxzOworICAgICAgc2l6ZV90ICpzdGF0dXNfZGV0YWlsc19jYXBhY2l0eTsKKyAgICB9IGNsaWVudDsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50ICpjYW5jZWxsZWQ7CisgICAgfSBzZXJ2ZXI7CisgIH0gZmluYWxfb3A7CisKKyAgc3RydWN0IHsKKyAgICB2b2lkICpiY3RscDsKKyAgICBib29sIHN1Y2Nlc3M7CisgIH0gc2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHg7Cit9OworCisjZGVmaW5lIENBTExfU1RBQ0tfRlJPTV9DQUxMKGNhbGwpICgoZ3JwY19jYWxsX3N0YWNrICopKChjYWxsKSArIDEpKQorI2RlZmluZSBDQUxMX0ZST01fQ0FMTF9TVEFDSyhjYWxsX3N0YWNrKSAoKChncnBjX2NhbGwgKikoY2FsbF9zdGFjaykpIC0gMSkKKyNkZWZpbmUgQ0FMTF9FTEVNX0ZST01fQ0FMTChjYWxsLCBpZHgpIFwKKyAgZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoQ0FMTF9TVEFDS19GUk9NX0NBTEwoY2FsbCksIGlkeCkKKyNkZWZpbmUgQ0FMTF9GUk9NX1RPUF9FTEVNKHRvcF9lbGVtKSBcCisgIENBTExfRlJPTV9DQUxMX1NUQUNLKGdycGNfY2FsbF9zdGFja19mcm9tX3RvcF9lbGVtZW50KHRvcF9lbGVtKSkKKworc3RhdGljIHZvaWQgc2V0X2RlYWRsaW5lX2FsYXJtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGwgKmNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKTsKK3N0YXRpYyB2b2lkIGV4ZWN1dGVfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7CitzdGF0aWMgZ3JwY19jYWxsX2Vycm9yIGNhbmNlbF93aXRoX3N0YXR1cyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbik7CitzdGF0aWMgdm9pZCBkZXN0cm95X2NhbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNhbGxfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKK3N0YXRpYyB2b2lkIHJlY2VpdmluZ19zbGljZV9yZWFkeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYmN0bHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKKworZ3JwY19jYWxsICpncnBjX2NhbGxfY3JlYXRlKGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgZ3JwY19jYWxsICpwYXJlbnRfY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wYWdhdGlvbl9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc2VydmVyX3RyYW5zcG9ydF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRlbGVtICoqYWRkX2luaXRpYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZF9pbml0aWFsX21ldGFkYXRhX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBzZW5kX2RlYWRsaW5lKSB7CisgIHNpemVfdCBpLCBqOworICBncnBjX2NoYW5uZWxfc3RhY2sgKmNoYW5uZWxfc3RhY2sgPSBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCk7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIGdycGNfY2FsbCAqY2FsbDsKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NhbGxfY3JlYXRlIiwgMCk7CisgIGNhbGwgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2NhbGwpICsgY2hhbm5lbF9zdGFjay0+Y2FsbF9zdGFja19zaXplKTsKKyAgbWVtc2V0KGNhbGwsIDAsIHNpemVvZihncnBjX2NhbGwpKTsKKyAgZ3ByX211X2luaXQoJmNhbGwtPm11KTsKKyAgY2FsbC0+Y2hhbm5lbCA9IGNoYW5uZWw7CisgIGNhbGwtPmNxID0gY3E7CisgIGNhbGwtPnBhcmVudCA9IHBhcmVudF9jYWxsOworICBjYWxsLT5pc19jbGllbnQgPSBzZXJ2ZXJfdHJhbnNwb3J0X2RhdGEgPT0gTlVMTDsKKyAgaWYgKGNhbGwtPmlzX2NsaWVudCkgeworICAgIEdQUl9BU1NFUlQoYWRkX2luaXRpYWxfbWV0YWRhdGFfY291bnQgPCBNQVhfU0VORF9FWFRSQV9NRVRBREFUQV9DT1VOVCk7CisgICAgZm9yIChpID0gMDsgaSA8IGFkZF9pbml0aWFsX21ldGFkYXRhX2NvdW50OyBpKyspIHsKKyAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbaV0ubWQgPSBhZGRfaW5pdGlhbF9tZXRhZGF0YVtpXTsKKyAgICB9CisgICAgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCA9IChpbnQpYWRkX2luaXRpYWxfbWV0YWRhdGFfY291bnQ7CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVChhZGRfaW5pdGlhbF9tZXRhZGF0YV9jb3VudCA9PSAwKTsKKyAgICBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50ID0gMDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgY2FsbC0+bWV0YWRhdGFfYmF0Y2hbaV1bal0uZGVhZGxpbmUgPSBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICB9CisgIH0KKyAgY2FsbC0+c2VuZF9kZWFkbGluZSA9IHNlbmRfZGVhZGxpbmU7CisgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoY2hhbm5lbCwgImNhbGwiKTsKKyAgLyogaW5pdGlhbCByZWZjb3VudCBkcm9wcGVkIGJ5IGdycGNfY2FsbF9kZXN0cm95ICovCisgIGdycGNfY2FsbF9zdGFja19pbml0KCZleGVjX2N0eCwgY2hhbm5lbF9zdGFjaywgMSwgZGVzdHJveV9jYWxsLCBjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5jb250ZXh0LCBzZXJ2ZXJfdHJhbnNwb3J0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIENBTExfU1RBQ0tfRlJPTV9DQUxMKGNhbGwpKTsKKyAgaWYgKGNxICE9IE5VTEwpIHsKKyAgICBHUlBDX0NRX0lOVEVSTkFMX1JFRihjcSwgImJpbmQiKTsKKyAgICBncnBjX2NhbGxfc3RhY2tfc2V0X3BvbGxzZXQoJmV4ZWNfY3R4LCBDQUxMX1NUQUNLX0ZST01fQ0FMTChjYWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9wb2xsc2V0KGNxKSk7CisgIH0KKyAgaWYgKHBhcmVudF9jYWxsICE9IE5VTEwpIHsKKyAgICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKHBhcmVudF9jYWxsLCAiY2hpbGQiKTsKKyAgICBHUFJfQVNTRVJUKGNhbGwtPmlzX2NsaWVudCk7CisgICAgR1BSX0FTU0VSVCghcGFyZW50X2NhbGwtPmlzX2NsaWVudCk7CisKKyAgICBncHJfbXVfbG9jaygmcGFyZW50X2NhbGwtPm11KTsKKworICAgIGlmIChwcm9wYWdhdGlvbl9tYXNrICYgR1JQQ19QUk9QQUdBVEVfREVBRExJTkUpIHsKKyAgICAgIHNlbmRfZGVhZGxpbmUgPSBncHJfdGltZV9taW4oCisgICAgICAgICAgZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShzZW5kX2RlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2NhbGwtPnNlbmRfZGVhZGxpbmUuY2xvY2tfdHlwZSksCisgICAgICAgICAgcGFyZW50X2NhbGwtPnNlbmRfZGVhZGxpbmUpOworICAgIH0KKyAgICAvKiBmb3Igbm93IEdSUENfUFJPUEFHQVRFX1RSQUNJTkdfQ09OVEVYVCAqTVVTVCogYmUgcGFzc2VkIHdpdGgKKyAgICAgKiBHUlBDX1BST1BBR0FURV9TVEFUU19DT05URVhUICovCisgICAgLyogVE9ETyhjdGlsbGVyKTogVGhpcyBzaG91bGQgY2hhbmdlIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgY2Vuc3VzIHN0YXJ0X29wCisgICAgICogY2FsbC4gKi8KKyAgICBpZiAocHJvcGFnYXRpb25fbWFzayAmIEdSUENfUFJPUEFHQVRFX0NFTlNVU19UUkFDSU5HX0NPTlRFWFQpIHsKKyAgICAgIEdQUl9BU1NFUlQocHJvcGFnYXRpb25fbWFzayAmIEdSUENfUFJPUEFHQVRFX0NFTlNVU19TVEFUU19DT05URVhUKTsKKyAgICAgIGdycGNfY2FsbF9jb250ZXh0X3NldChjYWxsLCBHUlBDX0NPTlRFWFRfVFJBQ0lORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfY2FsbC0+Y29udGV4dFtHUlBDX0NPTlRFWFRfVFJBQ0lOR10udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdQUl9BU1NFUlQocHJvcGFnYXRpb25fbWFzayAmIEdSUENfUFJPUEFHQVRFX0NFTlNVU19TVEFUU19DT05URVhUKTsKKyAgICB9CisgICAgaWYgKHByb3BhZ2F0aW9uX21hc2sgJiBHUlBDX1BST1BBR0FURV9DQU5DRUxMQVRJT04pIHsKKyAgICAgIGNhbGwtPmNhbmNlbGxhdGlvbl9pc19pbmhlcml0ZWQgPSAxOworICAgIH0KKworICAgIGlmIChwYXJlbnRfY2FsbC0+Zmlyc3RfY2hpbGQgPT0gTlVMTCkgeworICAgICAgcGFyZW50X2NhbGwtPmZpcnN0X2NoaWxkID0gY2FsbDsKKyAgICAgIGNhbGwtPnNpYmxpbmdfbmV4dCA9IGNhbGwtPnNpYmxpbmdfcHJldiA9IGNhbGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhbGwtPnNpYmxpbmdfbmV4dCA9IHBhcmVudF9jYWxsLT5maXJzdF9jaGlsZDsKKyAgICAgIGNhbGwtPnNpYmxpbmdfcHJldiA9IHBhcmVudF9jYWxsLT5maXJzdF9jaGlsZC0+c2libGluZ19wcmV2OworICAgICAgY2FsbC0+c2libGluZ19uZXh0LT5zaWJsaW5nX3ByZXYgPSBjYWxsLT5zaWJsaW5nX3ByZXYtPnNpYmxpbmdfbmV4dCA9CisgICAgICAgICAgY2FsbDsKKyAgICB9CisKKyAgICBncHJfbXVfdW5sb2NrKCZwYXJlbnRfY2FsbC0+bXUpOworICB9CisgIGlmIChncHJfdGltZV9jbXAoc2VuZF9kZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUoc2VuZF9kZWFkbGluZS5jbG9ja190eXBlKSkgIT0KKyAgICAgIDApIHsKKyAgICBzZXRfZGVhZGxpbmVfYWxhcm0oJmV4ZWNfY3R4LCBjYWxsLCBzZW5kX2RlYWRsaW5lKTsKKyAgfQorICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICBHUFJfVElNRVJfRU5EKCJncnBjX2NhbGxfY3JlYXRlIiwgMCk7CisgIHJldHVybiBjYWxsOworfQorCit2b2lkIGdycGNfY2FsbF9zZXRfY29tcGxldGlvbl9xdWV1ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSkgeworICBHUFJfQVNTRVJUKGNxKTsKKyAgY2FsbC0+Y3EgPSBjcTsKKyAgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY3EsICJiaW5kIik7CisgIGdycGNfY2FsbF9zdGFja19zZXRfcG9sbHNldChleGVjX2N0eCwgQ0FMTF9TVEFDS19GUk9NX0NBTEwoY2FsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX3BvbGxzZXQoY3EpKTsKK30KKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIFJFRl9SRUFTT04gcmVhc29uCisjZGVmaW5lIFJFRl9BUkcgLCBjb25zdCBjaGFyICpyZWFzb24KKyNlbHNlCisjZGVmaW5lIFJFRl9SRUFTT04gIiIKKyNkZWZpbmUgUkVGX0FSRworI2VuZGlmCit2b2lkIGdycGNfY2FsbF9pbnRlcm5hbF9yZWYoZ3JwY19jYWxsICpjIFJFRl9BUkcpIHsKKyAgR1JQQ19DQUxMX1NUQUNLX1JFRihDQUxMX1NUQUNLX0ZST01fQ0FMTChjKSwgUkVGX1JFQVNPTik7Cit9Cit2b2lkIGdycGNfY2FsbF9pbnRlcm5hbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjIFJFRl9BUkcpIHsKKyAgR1JQQ19DQUxMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBDQUxMX1NUQUNLX0ZST01fQ0FMTChjKSwgUkVGX1JFQVNPTik7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqY2FsbCwgYm9vbCBzdWNjZXNzKSB7CisgIHNpemVfdCBpOworICBpbnQgaWk7CisgIGdycGNfY2FsbCAqYyA9IGNhbGw7CisgIEdQUl9USU1FUl9CRUdJTigiZGVzdHJveV9jYWxsIiwgMCk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBncnBjX21ldGFkYXRhX2JhdGNoX2Rlc3Ryb3koCisgICAgICAgICZjLT5tZXRhZGF0YV9iYXRjaFsxIC8qIGlzX3JlY2VpdmluZyAqL11baSAvKiBpc19pbml0aWFsICovXSk7CisgIH0KKyAgaWYgKGMtPnJlY2VpdmluZ19zdHJlYW0gIT0gTlVMTCkgeworICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShleGVjX2N0eCwgYy0+cmVjZWl2aW5nX3N0cmVhbSk7CisgIH0KKyAgZ3JwY19jYWxsX3N0YWNrX2Rlc3Ryb3koZXhlY19jdHgsIENBTExfU1RBQ0tfRlJPTV9DQUxMKGMpKTsKKyAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjLT5jaGFubmVsLCAiY2FsbCIpOworICBncHJfbXVfZGVzdHJveSgmYy0+bXUpOworICBmb3IgKGkgPSAwOyBpIDwgU1RBVFVTX1NPVVJDRV9DT1VOVDsgaSsrKSB7CisgICAgaWYgKGMtPnN0YXR1c1tpXS5kZXRhaWxzKSB7CisgICAgICBHUlBDX01EU1RSX1VOUkVGKGMtPnN0YXR1c1tpXS5kZXRhaWxzKTsKKyAgICB9CisgIH0KKyAgZm9yIChpaSA9IDA7IGlpIDwgYy0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudDsgaWkrKykgeworICAgIEdSUENfTURFTEVNX1VOUkVGKGMtPnNlbmRfZXh0cmFfbWV0YWRhdGFbaWldLm1kKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19DT05URVhUX0NPVU5UOyBpKyspIHsKKyAgICBpZiAoYy0+Y29udGV4dFtpXS5kZXN0cm95KSB7CisgICAgICBjLT5jb250ZXh0W2ldLmRlc3Ryb3koYy0+Y29udGV4dFtpXS52YWx1ZSk7CisgICAgfQorICB9CisgIGlmIChjLT5jcSkgeworICAgIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoYy0+Y3EsICJiaW5kIik7CisgIH0KKyAgZ3ByX2ZyZWUoYyk7CisgIEdQUl9USU1FUl9FTkQoImRlc3Ryb3lfY2FsbCIsIDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3RhdHVzX2NvZGUoZ3JwY19jYWxsICpjYWxsLCBzdGF0dXNfc291cmNlIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGF0dXMpIHsKKyAgaWYgKGNhbGwtPnN0YXR1c1tzb3VyY2VdLmlzX3NldCkgcmV0dXJuOworCisgIGNhbGwtPnN0YXR1c1tzb3VyY2VdLmlzX3NldCA9IDE7CisgIGNhbGwtPnN0YXR1c1tzb3VyY2VdLmNvZGUgPSAoZ3JwY19zdGF0dXNfY29kZSlzdGF0dXM7CisKKyAgLyogVE9ETyhjdGlsbGVyKTogd2hhdCB0byBkbyBhYm91dCB0aGUgZmx1c2ggdGhhdCB3YXMgcHJldmlvdXNseSBoZXJlICovCit9CisKK3N0YXRpYyB2b2lkIHNldF9jb21wcmVzc2lvbl9hbGdvcml0aG0oZ3JwY19jYWxsICpjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvKSB7CisgIGNhbGwtPmNvbXByZXNzaW9uX2FsZ29yaXRobSA9IGFsZ287Cit9CisKK2dycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY2FsbF90ZXN0X29ubHlfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKKyAgICBncnBjX2NhbGwgKmNhbGwpIHsKKyAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnb3JpdGhtOworICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOworICBhbGdvcml0aG0gPSBjYWxsLT5jb21wcmVzc2lvbl9hbGdvcml0aG07CisgIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKKyAgcmV0dXJuIGFsZ29yaXRobTsKK30KKwordWludDMyX3QgZ3JwY19jYWxsX3Rlc3Rfb25seV9nZXRfbWVzc2FnZV9mbGFncyhncnBjX2NhbGwgKmNhbGwpIHsKKyAgdWludDMyX3QgZmxhZ3M7CisgIGdwcl9tdV9sb2NrKCZjYWxsLT5tdSk7CisgIGZsYWdzID0gY2FsbC0+dGVzdF9vbmx5X2xhc3RfbWVzc2FnZV9mbGFnczsKKyAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOworICByZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIodm9pZCAqcCkgeyByZXR1cm47IH0KKworc3RhdGljIHZvaWQgc2V0X2VuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyKGdycGNfY2FsbCAqY2FsbCwgZ3JwY19tZGVsZW0gKm1kZWwpIHsKKyAgc2l6ZV90IGk7CisgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobTsKKyAgZ3ByX3NsaWNlX2J1ZmZlciBhY2NlcHRfZW5jb2RpbmdfcGFydHM7CisgIGdwcl9zbGljZSBhY2NlcHRfZW5jb2Rpbmdfc2xpY2U7CisgIHZvaWQgKmFjY2VwdGVkX3VzZXJfZGF0YTsKKworICBhY2NlcHRlZF91c2VyX2RhdGEgPQorICAgICAgZ3JwY19tZGVsZW1fZ2V0X3VzZXJfZGF0YShtZGVsLCBkZXN0cm95X2VuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyKTsKKyAgaWYgKGFjY2VwdGVkX3VzZXJfZGF0YSAhPSBOVUxMKSB7CisgICAgY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIgPQorICAgICAgICAodWludDMyX3QpKCgodWludHB0cl90KWFjY2VwdGVkX3VzZXJfZGF0YSkgLSAxKTsKKyAgICByZXR1cm47CisgIH0KKworICBhY2NlcHRfZW5jb2Rpbmdfc2xpY2UgPSBtZGVsLT52YWx1ZS0+c2xpY2U7CisgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmYWNjZXB0X2VuY29kaW5nX3BhcnRzKTsKKyAgZ3ByX3NsaWNlX3NwbGl0KGFjY2VwdF9lbmNvZGluZ19zbGljZSwgIiwiLCAmYWNjZXB0X2VuY29kaW5nX3BhcnRzKTsKKworICAvKiBObyBuZWVkIHRvIHplcm8gY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXI6IGdycGNfY2FsbF9jcmVhdGUgYWxyZWFkeQorICAgKiB6ZXJvZXMgdGhlIHdob2xlIGdycGNfY2FsbCAqLworICAvKiBBbHdheXMgc3VwcG9ydCBubyBjb21wcmVzc2lvbiAqLworICBHUFJfQklUU0VUKCZjYWxsLT5lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlciwgR1JQQ19DT01QUkVTU19OT05FKTsKKyAgZm9yIChpID0gMDsgaSA8IGFjY2VwdF9lbmNvZGluZ19wYXJ0cy5jb3VudDsgaSsrKSB7CisgICAgY29uc3QgZ3ByX3NsaWNlICphY2NlcHRfZW5jb2RpbmdfZW50cnlfc2xpY2UgPQorICAgICAgICAmYWNjZXB0X2VuY29kaW5nX3BhcnRzLnNsaWNlc1tpXTsKKyAgICBpZiAoZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fcGFyc2UoCisgICAgICAgICAgICAoY29uc3QgY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoKmFjY2VwdF9lbmNvZGluZ19lbnRyeV9zbGljZSksCisgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKCphY2NlcHRfZW5jb2RpbmdfZW50cnlfc2xpY2UpLCAmYWxnb3JpdGhtKSkgeworICAgICAgR1BSX0JJVFNFVCgmY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIsIGFsZ29yaXRobSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXIgKmFjY2VwdF9lbmNvZGluZ19lbnRyeV9zdHIgPQorICAgICAgICAgIGdwcl9kdW1wX3NsaWNlKCphY2NlcHRfZW5jb2RpbmdfZW50cnlfc2xpY2UsIEdQUl9EVU1QX0FTQ0lJKTsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgICAiSW52YWxpZCBlbnRyeSBpbiBhY2NlcHQgZW5jb2RpbmcgbWV0YWRhdGE6ICclcycuIElnbm9yaW5nLiIsCisgICAgICAgICAgICAgIGFjY2VwdF9lbmNvZGluZ19lbnRyeV9zdHIpOworICAgICAgZ3ByX2ZyZWUoYWNjZXB0X2VuY29kaW5nX2VudHJ5X3N0cik7CisgICAgfQorICB9CisKKyAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZhY2NlcHRfZW5jb2RpbmdfcGFydHMpOworCisgIGdycGNfbWRlbGVtX3NldF91c2VyX2RhdGEoCisgICAgICBtZGVsLCBkZXN0cm95X2VuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyLAorICAgICAgKHZvaWQgKikoKCh1aW50cHRyX3QpY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIpICsgMSkpOworfQorCit1aW50MzJfdCBncnBjX2NhbGxfdGVzdF9vbmx5X2dldF9lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcihncnBjX2NhbGwgKmNhbGwpIHsKKyAgdWludDMyX3QgZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXI7CisgIGdwcl9tdV9sb2NrKCZjYWxsLT5tdSk7CisgIGVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyID0gY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXI7CisgIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKKyAgcmV0dXJuIGVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3RhdHVzX2RldGFpbHMoZ3JwY19jYWxsICpjYWxsLCBzdGF0dXNfc291cmNlIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyICpzdGF0dXMpIHsKKyAgaWYgKGNhbGwtPnN0YXR1c1tzb3VyY2VdLmRldGFpbHMgIT0gTlVMTCkgeworICAgIEdSUENfTURTVFJfVU5SRUYoY2FsbC0+c3RhdHVzW3NvdXJjZV0uZGV0YWlscyk7CisgIH0KKyAgY2FsbC0+c3RhdHVzW3NvdXJjZV0uZGV0YWlscyA9IHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgZ2V0X2ZpbmFsX3N0YXR1cyhncnBjX2NhbGwgKmNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpzZXRfdmFsdWUpKGdycGNfc3RhdHVzX2NvZGUgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2V0X3ZhbHVlX3VzZXJfZGF0YSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNUQVRVU19TT1VSQ0VfQ09VTlQ7IGkrKykgeworICAgIGlmIChjYWxsLT5zdGF0dXNbaV0uaXNfc2V0KSB7CisgICAgICBzZXRfdmFsdWUoY2FsbC0+c3RhdHVzW2ldLmNvZGUsIHNldF92YWx1ZV91c2VyX2RhdGEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAoY2FsbC0+aXNfY2xpZW50KSB7CisgICAgc2V0X3ZhbHVlKEdSUENfU1RBVFVTX1VOS05PV04sIHNldF92YWx1ZV91c2VyX2RhdGEpOworICB9IGVsc2UgeworICAgIHNldF92YWx1ZShHUlBDX1NUQVRVU19PSywgc2V0X3ZhbHVlX3VzZXJfZGF0YSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0X2ZpbmFsX2RldGFpbHMoZ3JwY19jYWxsICpjYWxsLCBjaGFyICoqb3V0X2RldGFpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9kZXRhaWxzX2NhcGFjaXR5KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU1RBVFVTX1NPVVJDRV9DT1VOVDsgaSsrKSB7CisgICAgaWYgKGNhbGwtPnN0YXR1c1tpXS5pc19zZXQpIHsKKyAgICAgIGlmIChjYWxsLT5zdGF0dXNbaV0uZGV0YWlscykgeworICAgICAgICBncHJfc2xpY2UgZGV0YWlscyA9IGNhbGwtPnN0YXR1c1tpXS5kZXRhaWxzLT5zbGljZTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IEdQUl9TTElDRV9MRU5HVEgoZGV0YWlscyk7CisgICAgICAgIGlmIChsZW4gKyAxID4gKm91dF9kZXRhaWxzX2NhcGFjaXR5KSB7CisgICAgICAgICAgKm91dF9kZXRhaWxzX2NhcGFjaXR5ID0KKyAgICAgICAgICAgICAgR1BSX01BWChsZW4gKyAxLCAqb3V0X2RldGFpbHNfY2FwYWNpdHkgKiAzIC8gMik7CisgICAgICAgICAgKm91dF9kZXRhaWxzID0gZ3ByX3JlYWxsb2MoKm91dF9kZXRhaWxzLCAqb3V0X2RldGFpbHNfY2FwYWNpdHkpOworICAgICAgICB9CisgICAgICAgIG1lbWNweSgqb3V0X2RldGFpbHMsIEdQUl9TTElDRV9TVEFSVF9QVFIoZGV0YWlscyksIGxlbik7CisgICAgICAgICgqb3V0X2RldGFpbHMpW2xlbl0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBub19kZXRhaWxzOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCitub19kZXRhaWxzOgorICBpZiAoMCA9PSAqb3V0X2RldGFpbHNfY2FwYWNpdHkpIHsKKyAgICAqb3V0X2RldGFpbHNfY2FwYWNpdHkgPSA4OworICAgICpvdXRfZGV0YWlscyA9IGdwcl9tYWxsb2MoKm91dF9kZXRhaWxzX2NhcGFjaXR5KTsKKyAgfQorICAqKm91dF9kZXRhaWxzID0gMDsKK30KKworc3RhdGljIGdycGNfbGlua2VkX21kZWxlbSAqbGlua2VkX2Zyb21fbWQoZ3JwY19tZXRhZGF0YSAqbWQpIHsKKyAgcmV0dXJuIChncnBjX2xpbmtlZF9tZGVsZW0gKikmbWQtPmludGVybmFsX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9hcHBsaWNhdGlvbl9tZXRhZGF0YShncnBjX2NhbGwgKmNhbGwsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhICptZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfdHJhaWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXBlbmRfZXh0cmFfbWV0YWRhdGEpIHsKKyAgaW50IGk7CisgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoID0KKyAgICAgICZjYWxsLT5tZXRhZGF0YV9iYXRjaFswIC8qIGlzX3JlY2VpdmluZyAqL11baXNfdHJhaWxpbmddOworICBpZiAocHJlcGVuZF9leHRyYV9tZXRhZGF0YSkgeworICAgIGlmIChjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50ID09IDApIHsKKyAgICAgIHByZXBlbmRfZXh0cmFfbWV0YWRhdGEgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudDsgaSsrKSB7CisgICAgICAgIEdSUENfTURFTEVNX1JFRihjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhW2ldLm1kKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDE7IGkgPCBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50OyBpKyspIHsKKyAgICAgICAgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVtpXS5wcmV2ID0gJmNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbaSAtIDFdOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQgLSAxOyBpKyspIHsKKyAgICAgICAgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVtpXS5uZXh0ID0gJmNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbaSArIDFdOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGdycGNfbWV0YWRhdGEgKm1kID0gJm1ldGFkYXRhW2ldOworICAgIGdycGNfbGlua2VkX21kZWxlbSAqbCA9IChncnBjX2xpbmtlZF9tZGVsZW0gKikmbWQtPmludGVybmFsX2RhdGE7CisgICAgR1BSX0FTU0VSVChzaXplb2YoZ3JwY19saW5rZWRfbWRlbGVtKSA9PSBzaXplb2YobWQtPmludGVybmFsX2RhdGEpKTsKKyAgICBsLT5tZCA9IGdycGNfbWRlbGVtX2Zyb21fc3RyaW5nX2FuZF9idWZmZXIoCisgICAgICAgIG1kLT5rZXksIChjb25zdCB1aW50OF90ICopbWQtPnZhbHVlLCBtZC0+dmFsdWVfbGVuZ3RoKTsKKyAgICBpZiAoIWdycGNfaGVhZGVyX2tleV9pc19sZWdhbChncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGwtPm1kLT5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURTVFJfTEVOR1RIKGwtPm1kLT5rZXkpKSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJhdHRlbXB0IHRvIHNlbmQgaW52YWxpZCBtZXRhZGF0YSBrZXk6ICVzIiwKKyAgICAgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhsLT5tZC0+a2V5KSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFncnBjX2lzX2JpbmFyeV9oZWFkZXIoZ3JwY19tZHN0cl9hc19jX3N0cmluZyhsLT5tZC0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19NRFNUUl9MRU5HVEgobC0+bWQtPmtleSkpICYmCisgICAgICAgICAgICAgICAhZ3JwY19oZWFkZXJfbm9uYmluX3ZhbHVlX2lzX2xlZ2FsKAorICAgICAgICAgICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobC0+bWQtPnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICBHUlBDX01EU1RSX0xFTkdUSChsLT5tZC0+dmFsdWUpKSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJhdHRlbXB0IHRvIHNlbmQgaW52YWxpZCBtZXRhZGF0YSB2YWx1ZSIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgbGlua2VkX2Zyb21fbWQoJm1ldGFkYXRhW2ldKS0+cHJldiA9IGxpbmtlZF9mcm9tX21kKCZtZXRhZGF0YVtpIC0gMV0pOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykgeworICAgIGxpbmtlZF9mcm9tX21kKCZtZXRhZGF0YVtpXSktPm5leHQgPSBsaW5rZWRfZnJvbV9tZCgmbWV0YWRhdGFbaSArIDFdKTsKKyAgfQorICBzd2l0Y2ggKHByZXBlbmRfZXh0cmFfbWV0YWRhdGEgKiAyICsgKGNvdW50ICE9IDApKSB7CisgICAgY2FzZSAwOgorICAgICAgLyogbm8gcHJlcGVuZCwgbm8gbWV0YWRhdGEgPT4gbm90aGluZyB0byBkbyAqLworICAgICAgYmF0Y2gtPmxpc3QuaGVhZCA9IGJhdGNoLT5saXN0LnRhaWwgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgLyogbWV0YWRhdGEsIGJ1dCBubyBwcmVwZW5kICovCisgICAgICBiYXRjaC0+bGlzdC5oZWFkID0gbGlua2VkX2Zyb21fbWQoJm1ldGFkYXRhWzBdKTsKKyAgICAgIGJhdGNoLT5saXN0LnRhaWwgPSBsaW5rZWRfZnJvbV9tZCgmbWV0YWRhdGFbY291bnQgLSAxXSk7CisgICAgICBiYXRjaC0+bGlzdC5oZWFkLT5wcmV2ID0gTlVMTDsKKyAgICAgIGJhdGNoLT5saXN0LnRhaWwtPm5leHQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgLyogcHJlcGVuZCwgYnV0IG5vIG1kICovCisgICAgICBiYXRjaC0+bGlzdC5oZWFkID0gJmNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbMF07CisgICAgICBiYXRjaC0+bGlzdC50YWlsID0KKyAgICAgICAgICAmY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVtjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50IC0gMV07CisgICAgICBiYXRjaC0+bGlzdC5oZWFkLT5wcmV2ID0gTlVMTDsKKyAgICAgIGJhdGNoLT5saXN0LnRhaWwtPm5leHQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgLyogcHJlcGVuZCBBTkQgbWQgKi8KKyAgICAgIGJhdGNoLT5saXN0LmhlYWQgPSAmY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVswXTsKKyAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCAtIDFdLm5leHQgPQorICAgICAgICAgIGxpbmtlZF9mcm9tX21kKCZtZXRhZGF0YVswXSk7CisgICAgICBsaW5rZWRfZnJvbV9tZCgmbWV0YWRhdGFbMF0pLT5wcmV2ID0KKyAgICAgICAgICAmY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVtjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50IC0gMV07CisgICAgICBiYXRjaC0+bGlzdC50YWlsID0gbGlua2VkX2Zyb21fbWQoJm1ldGFkYXRhW2NvdW50IC0gMV0pOworICAgICAgYmF0Y2gtPmxpc3QuaGVhZC0+cHJldiA9IE5VTEw7CisgICAgICBiYXRjaC0+bGlzdC50YWlsLT5uZXh0ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7CisgIH0KKworICByZXR1cm4gMTsKK30KKwordm9pZCBncnBjX2NhbGxfZGVzdHJveShncnBjX2NhbGwgKmMpIHsKKyAgaW50IGNhbmNlbDsKKyAgZ3JwY19jYWxsICpwYXJlbnQgPSBjLT5wYXJlbnQ7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NhbGxfZGVzdHJveSIsIDApOworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jYWxsX2Rlc3Ryb3koYz0lcCkiLCAxLCAoYykpOworCisgIGlmIChwYXJlbnQpIHsKKyAgICBncHJfbXVfbG9jaygmcGFyZW50LT5tdSk7CisgICAgaWYgKGMgPT0gcGFyZW50LT5maXJzdF9jaGlsZCkgeworICAgICAgcGFyZW50LT5maXJzdF9jaGlsZCA9IGMtPnNpYmxpbmdfbmV4dDsKKyAgICAgIGlmIChjID09IHBhcmVudC0+Zmlyc3RfY2hpbGQpIHsKKyAgICAgICAgcGFyZW50LT5maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgICB9CisgICAgICBjLT5zaWJsaW5nX3ByZXYtPnNpYmxpbmdfbmV4dCA9IGMtPnNpYmxpbmdfbmV4dDsKKyAgICAgIGMtPnNpYmxpbmdfbmV4dC0+c2libGluZ19wcmV2ID0gYy0+c2libGluZ19wcmV2OworICAgIH0KKyAgICBncHJfbXVfdW5sb2NrKCZwYXJlbnQtPm11KTsKKyAgICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoJmV4ZWNfY3R4LCBwYXJlbnQsICJjaGlsZCIpOworICB9CisKKyAgZ3ByX211X2xvY2soJmMtPm11KTsKKyAgR1BSX0FTU0VSVCghYy0+ZGVzdHJveV9jYWxsZWQpOworICBjLT5kZXN0cm95X2NhbGxlZCA9IDE7CisgIGlmIChjLT5oYXZlX2FsYXJtKSB7CisgICAgZ3JwY190aW1lcl9jYW5jZWwoJmV4ZWNfY3R4LCAmYy0+YWxhcm0pOworICB9CisgIGNhbmNlbCA9ICFjLT5yZWNlaXZlZF9maW5hbF9vcDsKKyAgZ3ByX211X3VubG9jaygmYy0+bXUpOworICBpZiAoY2FuY2VsKSBncnBjX2NhbGxfY2FuY2VsKGMsIE5VTEwpOworICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoJmV4ZWNfY3R4LCBjLCAiZGVzdHJveSIpOworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICBHUFJfVElNRVJfRU5EKCJncnBjX2NhbGxfZGVzdHJveSIsIDApOworfQorCitncnBjX2NhbGxfZXJyb3IgZ3JwY19jYWxsX2NhbmNlbChncnBjX2NhbGwgKmNhbGwsIHZvaWQgKnJlc2VydmVkKSB7CisgIEdSUENfQVBJX1RSQUNFKCJncnBjX2NhbGxfY2FuY2VsKGNhbGw9JXAsIHJlc2VydmVkPSVwKSIsIDIsIChjYWxsLCByZXNlcnZlZCkpOworICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7CisgIHJldHVybiBncnBjX2NhbGxfY2FuY2VsX3dpdGhfc3RhdHVzKGNhbGwsIEdSUENfU1RBVFVTX0NBTkNFTExFRCwgIkNhbmNlbGxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCitncnBjX2NhbGxfZXJyb3IgZ3JwY19jYWxsX2NhbmNlbF93aXRoX3N0YXR1cyhncnBjX2NhbGwgKmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzZXJ2ZWQpIHsKKyAgZ3JwY19jYWxsX2Vycm9yIHI7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfY2FsbF9jYW5jZWxfd2l0aF9zdGF0dXMoIgorICAgICAgImM9JXAsIHN0YXR1cz0lZCwgZGVzY3JpcHRpb249JXMsIHJlc2VydmVkPSVwKSIsCisgICAgICA0LCAoYywgKGludClzdGF0dXMsIGRlc2NyaXB0aW9uLCByZXNlcnZlZCkpOworICBHUFJfQVNTRVJUKHJlc2VydmVkID09IE5VTEwpOworICBncHJfbXVfbG9jaygmYy0+bXUpOworICByID0gY2FuY2VsX3dpdGhfc3RhdHVzKCZleGVjX2N0eCwgYywgc3RhdHVzLCBkZXNjcmlwdGlvbik7CisgIGdwcl9tdV91bmxvY2soJmMtPm11KTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgcmV0dXJuIHI7Cit9CisKK3R5cGVkZWYgc3RydWN0IGNhbmNlbF9jbG9zdXJlIHsKKyAgZ3JwY19jbG9zdXJlIGNsb3N1cmU7CisgIGdycGNfY2FsbCAqY2FsbDsKKyAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXM7Cit9IGNhbmNlbF9jbG9zdXJlOworCitzdGF0aWMgdm9pZCBkb25lX2NhbmNlbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqY2NwLCBib29sIHN1Y2Nlc3MpIHsKKyAgY2FuY2VsX2Nsb3N1cmUgKmNjID0gY2NwOworICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGNjLT5jYWxsLCAiY2FuY2VsIik7CisgIGdwcl9mcmVlKGNjKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9jYW5jZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNjcCwgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCBvcDsKKyAgY2FuY2VsX2Nsb3N1cmUgKmNjID0gY2NwOworICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKKyAgb3AuY2FuY2VsX3dpdGhfc3RhdHVzID0gY2MtPnN0YXR1czsKKyAgLyogcmV1c2UgY2xvc3VyZSB0byBjYXRjaCBjb21wbGV0aW9uICovCisgIGdycGNfY2xvc3VyZV9pbml0KCZjYy0+Y2xvc3VyZSwgZG9uZV9jYW5jZWwsIGNjKTsKKyAgb3Aub25fY29tcGxldGUgPSAmY2MtPmNsb3N1cmU7CisgIGV4ZWN1dGVfb3AoZXhlY19jdHgsIGNjLT5jYWxsLCAmb3ApOworfQorCitzdGF0aWMgZ3JwY19jYWxsX2Vycm9yIGNhbmNlbF93aXRoX3N0YXR1cyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikgeworICBncnBjX21kc3RyICpkZXRhaWxzID0KKyAgICAgIGRlc2NyaXB0aW9uID8gZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhkZXNjcmlwdGlvbikgOiBOVUxMOworICBjYW5jZWxfY2xvc3VyZSAqY2MgPSBncHJfbWFsbG9jKHNpemVvZigqY2MpKTsKKworICBHUFJfQVNTRVJUKHN0YXR1cyAhPSBHUlBDX1NUQVRVU19PSyk7CisKKyAgc2V0X3N0YXR1c19jb2RlKGMsIFNUQVRVU19GUk9NX0FQSV9PVkVSUklERSwgKHVpbnQzMl90KXN0YXR1cyk7CisgIHNldF9zdGF0dXNfZGV0YWlscyhjLCBTVEFUVVNfRlJPTV9BUElfT1ZFUlJJREUsIGRldGFpbHMpOworCisgIGdycGNfY2xvc3VyZV9pbml0KCZjYy0+Y2xvc3VyZSwgc2VuZF9jYW5jZWwsIGNjKTsKKyAgY2MtPmNhbGwgPSBjOworICBjYy0+c3RhdHVzID0gc3RhdHVzOworICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGMsICJjYW5jZWwiKTsKKyAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmY2MtPmNsb3N1cmUsIHRydWUsIE5VTEwpOworCisgIHJldHVybiBHUlBDX0NBTExfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWN1dGVfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbTsKKworICBHUFJfVElNRVJfQkVHSU4oImV4ZWN1dGVfb3AiLCAwKTsKKyAgZWxlbSA9IENBTExfRUxFTV9GUk9NX0NBTEwoY2FsbCwgMCk7CisgIG9wLT5jb250ZXh0ID0gY2FsbC0+Y29udGV4dDsKKyAgZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7CisgIEdQUl9USU1FUl9FTkQoImV4ZWN1dGVfb3AiLCAwKTsKK30KKworY2hhciAqZ3JwY19jYWxsX2dldF9wZWVyKGdycGNfY2FsbCAqY2FsbCkgeworICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IENBTExfRUxFTV9GUk9NX0NBTEwoY2FsbCwgMCk7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIGNoYXIgKnJlc3VsdDsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9nZXRfcGVlciglcCkiLCAxLCAoY2FsbCkpOworICByZXN1bHQgPSBlbGVtLT5maWx0ZXItPmdldF9wZWVyKCZleGVjX2N0eCwgZWxlbSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIHJlc3VsdCA9IGdycGNfY2hhbm5lbF9nZXRfdGFyZ2V0KGNhbGwtPmNoYW5uZWwpOworICB9CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIHJlc3VsdCA9IGdwcl9zdHJkdXAoInVua25vd24iKTsKKyAgfQorICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICByZXR1cm4gcmVzdWx0OworfQorCitncnBjX2NhbGwgKmdycGNfY2FsbF9mcm9tX3RvcF9lbGVtZW50KGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7CisgIHJldHVybiBDQUxMX0ZST01fVE9QX0VMRU0oZWxlbSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxfYWxhcm0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfY2FsbCAqY2FsbCA9IGFyZzsKKyAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKKyAgY2FsbC0+aGF2ZV9hbGFybSA9IDA7CisgIGlmIChzdWNjZXNzKSB7CisgICAgY2FuY2VsX3dpdGhfc3RhdHVzKGV4ZWNfY3R4LCBjYWxsLCBHUlBDX1NUQVRVU19ERUFETElORV9FWENFRURFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkRlYWRsaW5lIEV4Y2VlZGVkIik7CisgIH0KKyAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOworICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGNhbGwsICJhbGFybSIpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGVhZGxpbmVfYWxhcm0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKKyAgaWYgKGNhbGwtPmhhdmVfYWxhcm0pIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkF0dGVtcHQgdG8gc2V0IGRlYWRsaW5lIGFsYXJtIHR3aWNlIik7CisgICAgYXNzZXJ0KDApOworICAgIHJldHVybjsKKyAgfQorICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGNhbGwsICJhbGFybSIpOworICBjYWxsLT5oYXZlX2FsYXJtID0gMTsKKyAgY2FsbC0+c2VuZF9kZWFkbGluZSA9IGdwcl9jb252ZXJ0X2Nsb2NrX3R5cGUoZGVhZGxpbmUsIEdQUl9DTE9DS19NT05PVE9OSUMpOworICBncnBjX3RpbWVyX2luaXQoZXhlY19jdHgsICZjYWxsLT5hbGFybSwgY2FsbC0+c2VuZF9kZWFkbGluZSwgY2FsbF9hbGFybSwgY2FsbCwKKyAgICAgICAgICAgICAgICAgIGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQykpOworfQorCisvKiB3ZSBvZmZzZXQgc3RhdHVzIGJ5IGEgc21hbGwgYW1vdW50IHdoZW4gc3RvcmluZyBpdCBpbnRvIHRyYW5zcG9ydCBtZXRhZGF0YQorICAgYXMgbWV0YWRhdGEgY2Fubm90IHN0b3JlIGEgMCB2YWx1ZSAod2hpY2ggaXMgdXNlZCBhcyBPSyBmb3IgZ3JwY19zdGF0dXNfY29kZXMKKyAgICovCisjZGVmaW5lIFNUQVRVU19PRkZTRVQgMQorc3RhdGljIHZvaWQgZGVzdHJveV9zdGF0dXModm9pZCAqaWdub3JlZCkge30KKworc3RhdGljIHVpbnQzMl90IGRlY29kZV9zdGF0dXMoZ3JwY19tZGVsZW0gKm1kKSB7CisgIHVpbnQzMl90IHN0YXR1czsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBpZiAobWQgPT0gR1JQQ19NREVMRU1fR1JQQ19TVEFUVVNfMCkgcmV0dXJuIDA7CisgIGlmIChtZCA9PSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18xKSByZXR1cm4gMTsKKyAgaWYgKG1kID09IEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzIpIHJldHVybiAyOworICB1c2VyX2RhdGEgPSBncnBjX21kZWxlbV9nZXRfdXNlcl9kYXRhKG1kLCBkZXN0cm95X3N0YXR1cyk7CisgIGlmICh1c2VyX2RhdGEgIT0gTlVMTCkgeworICAgIHN0YXR1cyA9ICgodWludDMyX3QpKGludHB0cl90KXVzZXJfZGF0YSkgLSBTVEFUVVNfT0ZGU0VUOworICB9IGVsc2UgeworICAgIGlmICghZ3ByX3BhcnNlX2J5dGVzX3RvX3VpbnQzMihncnBjX21kc3RyX2FzX2Nfc3RyaW5nKG1kLT52YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgobWQtPnZhbHVlLT5zbGljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpKSB7CisgICAgICBzdGF0dXMgPSBHUlBDX1NUQVRVU19VTktOT1dOOyAvKiBjb3VsZCBub3QgcGFyc2Ugc3RhdHVzIGNvZGUgKi8KKyAgICB9CisgICAgZ3JwY19tZGVsZW1fc2V0X3VzZXJfZGF0YShtZCwgZGVzdHJveV9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShpbnRwdHJfdCkoc3RhdHVzICsgU1RBVFVTX09GRlNFVCkpOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBkZWNvZGVfY29tcHJlc3Npb24oZ3JwY19tZGVsZW0gKm1kKSB7CisgIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobSA9CisgICAgICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobV9mcm9tX21kc3RyKG1kLT52YWx1ZSk7CisgIGlmIChhbGdvcml0aG0gPT0gR1JQQ19DT01QUkVTU19BTEdPUklUSE1TX0NPVU5UKSB7CisgICAgY29uc3QgY2hhciAqbWRfY19zdHIgPSBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKG1kLT52YWx1ZSk7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGNvbXByZXNzaW9uIGFsZ29yaXRobTogJyVzJyIsIG1kX2Nfc3RyKTsKKyAgfQorICByZXR1cm4gYWxnb3JpdGhtOworfQorCitzdGF0aWMgZ3JwY19tZGVsZW0gKnJlY3ZfY29tbW9uX2ZpbHRlcihncnBjX2NhbGwgKmNhbGwsIGdycGNfbWRlbGVtICplbGVtKSB7CisgIGlmIChlbGVtLT5rZXkgPT0gR1JQQ19NRFNUUl9HUlBDX1NUQVRVUykgeworICAgIEdQUl9USU1FUl9CRUdJTigic3RhdHVzIiwgMCk7CisgICAgc2V0X3N0YXR1c19jb2RlKGNhbGwsIFNUQVRVU19GUk9NX1dJUkUsIGRlY29kZV9zdGF0dXMoZWxlbSkpOworICAgIEdQUl9USU1FUl9FTkQoInN0YXR1cyIsIDApOworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgaWYgKGVsZW0tPmtleSA9PSBHUlBDX01EU1RSX0dSUENfTUVTU0FHRSkgeworICAgIEdQUl9USU1FUl9CRUdJTigic3RhdHVzLWRldGFpbHMiLCAwKTsKKyAgICBzZXRfc3RhdHVzX2RldGFpbHMoY2FsbCwgU1RBVFVTX0ZST01fV0lSRSwgR1JQQ19NRFNUUl9SRUYoZWxlbS0+dmFsdWUpKTsKKyAgICBHUFJfVElNRVJfRU5EKCJzdGF0dXMtZGV0YWlscyIsIDApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBlbGVtOworfQorCitzdGF0aWMgZ3JwY19tZGVsZW0gKnB1Ymxpc2hfYXBwX21ldGFkYXRhKGdycGNfY2FsbCAqY2FsbCwgZ3JwY19tZGVsZW0gKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc190cmFpbGluZykgeworICBncnBjX21ldGFkYXRhX2FycmF5ICpkZXN0OworICBncnBjX21ldGFkYXRhICptZHVzcjsKKyAgR1BSX1RJTUVSX0JFR0lOKCJwdWJsaXNoX2FwcF9tZXRhZGF0YSIsIDApOworICBkZXN0ID0gY2FsbC0+YnVmZmVyZWRfbWV0YWRhdGFbaXNfdHJhaWxpbmddOworICBpZiAoZGVzdC0+Y291bnQgPT0gZGVzdC0+Y2FwYWNpdHkpIHsKKyAgICBkZXN0LT5jYXBhY2l0eSA9IEdQUl9NQVgoZGVzdC0+Y2FwYWNpdHkgKyA4LCBkZXN0LT5jYXBhY2l0eSAqIDIpOworICAgIGRlc3QtPm1ldGFkYXRhID0KKyAgICAgICAgZ3ByX3JlYWxsb2MoZGVzdC0+bWV0YWRhdGEsIHNpemVvZihncnBjX21ldGFkYXRhKSAqIGRlc3QtPmNhcGFjaXR5KTsKKyAgfQorICBtZHVzciA9ICZkZXN0LT5tZXRhZGF0YVtkZXN0LT5jb3VudCsrXTsKKyAgbWR1c3ItPmtleSA9IGdycGNfbWRzdHJfYXNfY19zdHJpbmcoZWxlbS0+a2V5KTsKKyAgbWR1c3ItPnZhbHVlID0gZ3JwY19tZHN0cl9hc19jX3N0cmluZyhlbGVtLT52YWx1ZSk7CisgIG1kdXNyLT52YWx1ZV9sZW5ndGggPSBHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPnZhbHVlLT5zbGljZSk7CisgIEdQUl9USU1FUl9FTkQoInB1Ymxpc2hfYXBwX21ldGFkYXRhIiwgMCk7CisgIHJldHVybiBlbGVtOworfQorCitzdGF0aWMgZ3JwY19tZGVsZW0gKnJlY3ZfaW5pdGlhbF9maWx0ZXIodm9pZCAqY2FsbHAsIGdycGNfbWRlbGVtICplbGVtKSB7CisgIGdycGNfY2FsbCAqY2FsbCA9IGNhbGxwOworICBlbGVtID0gcmVjdl9jb21tb25fZmlsdGVyKGNhbGwsIGVsZW0pOworICBpZiAoZWxlbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSBpZiAoZWxlbS0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19FTkNPRElORykgeworICAgIEdQUl9USU1FUl9CRUdJTigiY29tcHJlc3Npb25fYWxnb3JpdGhtIiwgMCk7CisgICAgc2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobShjYWxsLCBkZWNvZGVfY29tcHJlc3Npb24oZWxlbSkpOworICAgIEdQUl9USU1FUl9FTkQoImNvbXByZXNzaW9uX2FsZ29yaXRobSIsIDApOworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgaWYgKGVsZW0tPmtleSA9PSBHUlBDX01EU1RSX0dSUENfQUNDRVBUX0VOQ09ESU5HKSB7CisgICAgR1BSX1RJTUVSX0JFR0lOKCJlbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlciIsIDApOworICAgIHNldF9lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcihjYWxsLCBlbGVtKTsKKyAgICBHUFJfVElNRVJfRU5EKCJlbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlciIsIDApOworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIHJldHVybiBwdWJsaXNoX2FwcF9tZXRhZGF0YShjYWxsLCBlbGVtLCAwKTsKKyAgfQorfQorCitzdGF0aWMgZ3JwY19tZGVsZW0gKnJlY3ZfdHJhaWxpbmdfZmlsdGVyKHZvaWQgKmNhbGxwLCBncnBjX21kZWxlbSAqZWxlbSkgeworICBncnBjX2NhbGwgKmNhbGwgPSBjYWxscDsKKyAgZWxlbSA9IHJlY3ZfY29tbW9uX2ZpbHRlcihjYWxsLCBlbGVtKTsKKyAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIHJldHVybiBwdWJsaXNoX2FwcF9tZXRhZGF0YShjYWxsLCBlbGVtLCAxKTsKKyAgfQorfQorCitncnBjX2NhbGxfc3RhY2sgKmdycGNfY2FsbF9nZXRfY2FsbF9zdGFjayhncnBjX2NhbGwgKmNhbGwpIHsKKyAgcmV0dXJuIENBTExfU1RBQ0tfRlJPTV9DQUxMKGNhbGwpOworfQorCisvKgorICogQkFUQ0ggQVBJIElNUExFTUVOVEFUSU9OCisgKi8KKworc3RhdGljIHZvaWQgc2V0X3N0YXR1c192YWx1ZV9kaXJlY3RseShncnBjX3N0YXR1c19jb2RlIHN0YXR1cywgdm9pZCAqZGVzdCkgeworICAqKGdycGNfc3RhdHVzX2NvZGUgKilkZXN0ID0gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzZXRfY2FuY2VsbGVkX3ZhbHVlKGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLCB2b2lkICpkZXN0KSB7CisgICooaW50ICopZGVzdCA9IChzdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0spOworfQorCitzdGF0aWMgaW50IGFyZV93cml0ZV9mbGFnc192YWxpZCh1aW50MzJfdCBmbGFncykgeworICAvKiBjaGVjayB0aGF0IG9ubHkgYml0cyBpbiBHUlBDX1dSSVRFXyhJTlRFUk5BTD8pX1VTRURfTUFTSyBhcmUgc2V0ICovCisgIGNvbnN0IHVpbnQzMl90IGFsbG93ZWRfd3JpdGVfcG9zaXRpb25zID0KKyAgICAgIChHUlBDX1dSSVRFX1VTRURfTUFTSyB8IEdSUENfV1JJVEVfSU5URVJOQUxfVVNFRF9NQVNLKTsKKyAgY29uc3QgdWludDMyX3QgaW52YWxpZF9wb3NpdGlvbnMgPSB+YWxsb3dlZF93cml0ZV9wb3NpdGlvbnM7CisgIHJldHVybiAhKGZsYWdzICYgaW52YWxpZF9wb3NpdGlvbnMpOworfQorCitzdGF0aWMgYmF0Y2hfY29udHJvbCAqYWxsb2NhdGVfYmF0Y2hfY29udHJvbChncnBjX2NhbGwgKmNhbGwpIHsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ09OQ1VSUkVOVF9CQVRDSEVTOyBpKyspIHsKKyAgICBpZiAoKGNhbGwtPnVzZWRfYmF0Y2hlcyAmICgxIDw8IGkpKSA9PSAwKSB7CisgICAgICBjYWxsLT51c2VkX2JhdGNoZXMgPSAodWludDhfdCkoY2FsbC0+dXNlZF9iYXRjaGVzIHwgKHVpbnQ4X3QpKDEgPDwgaSkpOworICAgICAgcmV0dXJuICZjYWxsLT5hY3RpdmVfYmF0Y2hlc1tpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9iYXRjaF9jb21wbGV0aW9uKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX2NvbXBsZXRpb24gKnN0b3JhZ2UpIHsKKyAgYmF0Y2hfY29udHJvbCAqYmN0bCA9IHVzZXJfZGF0YTsKKyAgZ3JwY19jYWxsICpjYWxsID0gYmN0bC0+Y2FsbDsKKyAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKKyAgY2FsbC0+dXNlZF9iYXRjaGVzID0gKHVpbnQ4X3QpKAorICAgICAgY2FsbC0+dXNlZF9iYXRjaGVzICYgfih1aW50OF90KSgxIDw8IChiY3RsIC0gY2FsbC0+YWN0aXZlX2JhdGNoZXMpKSk7CisgIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKKyAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYWxsLCAiY29tcGxldGlvbiIpOworfQorCitzdGF0aWMgdm9pZCBwb3N0X2JhdGNoX2NvbXBsZXRpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hfY29udHJvbCAqYmN0bCkgeworICBncnBjX2NhbGwgKmNhbGwgPSBiY3RsLT5jYWxsOworICBpZiAoYmN0bC0+aXNfbm90aWZ5X3RhZ19jbG9zdXJlKSB7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBiY3RsLT5ub3RpZnlfdGFnLCBiY3RsLT5zdWNjZXNzLCBOVUxMKTsKKyAgICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOworICAgIGJjdGwtPmNhbGwtPnVzZWRfYmF0Y2hlcyA9CisgICAgICAgICh1aW50OF90KShiY3RsLT5jYWxsLT51c2VkX2JhdGNoZXMgJgorICAgICAgICAgICAgICAgICAgfih1aW50OF90KSgxIDw8IChiY3RsIC0gYmN0bC0+Y2FsbC0+YWN0aXZlX2JhdGNoZXMpKSk7CisgICAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOworICAgIEdSUENfQ0FMTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2FsbCwgImNvbXBsZXRpb24iKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2NxX2VuZF9vcChleGVjX2N0eCwgYmN0bC0+Y2FsbC0+Y3EsIGJjdGwtPm5vdGlmeV90YWcsIGJjdGwtPnN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgZmluaXNoX2JhdGNoX2NvbXBsZXRpb24sIGJjdGwsICZiY3RsLT5jcV9jb21wbGV0aW9uKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjb250aW51ZV9yZWNlaXZpbmdfc2xpY2VzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9jb250cm9sICpiY3RsKSB7CisgIGdycGNfY2FsbCAqY2FsbCA9IGJjdGwtPmNhbGw7CisgIGZvciAoOzspIHsKKyAgICBzaXplX3QgcmVtYWluaW5nID0gY2FsbC0+cmVjZWl2aW5nX3N0cmVhbS0+bGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAgICAgICAgKCpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyKS0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLmxlbmd0aDsKKyAgICBpZiAocmVtYWluaW5nID09IDApIHsKKyAgICAgIGNhbGwtPnJlY2VpdmluZ19tZXNzYWdlID0gMDsKKyAgICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShleGVjX2N0eCwgY2FsbC0+cmVjZWl2aW5nX3N0cmVhbSk7CisgICAgICBjYWxsLT5yZWNlaXZpbmdfc3RyZWFtID0gTlVMTDsKKyAgICAgIGlmIChncHJfdW5yZWYoJmJjdGwtPnN0ZXBzX3RvX2NvbXBsZXRlKSkgeworICAgICAgICBwb3N0X2JhdGNoX2NvbXBsZXRpb24oZXhlY19jdHgsIGJjdGwpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZ3JwY19ieXRlX3N0cmVhbV9uZXh0KGV4ZWNfY3R4LCBjYWxsLT5yZWNlaXZpbmdfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGwtPnJlY2VpdmluZ19zbGljZSwgcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGwtPnJlY2VpdmluZ19zbGljZV9yZWFkeSkpIHsKKyAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCYoKmNhbGwtPnJlY2VpdmluZ19idWZmZXIpLT5kYXRhLnJhdy5zbGljZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5yZWNlaXZpbmdfc2xpY2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VpdmluZ19zbGljZV9yZWFkeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYmN0bHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGJhdGNoX2NvbnRyb2wgKmJjdGwgPSBiY3RscDsKKyAgZ3JwY19jYWxsICpjYWxsID0gYmN0bC0+Y2FsbDsKKworICBpZiAoc3VjY2VzcykgeworICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCYoKmNhbGwtPnJlY2VpdmluZ19idWZmZXIpLT5kYXRhLnJhdy5zbGljZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+cmVjZWl2aW5nX3NsaWNlKTsKKyAgICBjb250aW51ZV9yZWNlaXZpbmdfc2xpY2VzKGV4ZWNfY3R4LCBiY3RsKTsKKyAgfSBlbHNlIHsKKyAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGNhbGwtPnJlY2VpdmluZ19zdHJlYW0pOworICAgIGNhbGwtPnJlY2VpdmluZ19zdHJlYW0gPSBOVUxMOworICAgIGdycGNfYnl0ZV9idWZmZXJfZGVzdHJveSgqY2FsbC0+cmVjZWl2aW5nX2J1ZmZlcik7CisgICAgKmNhbGwtPnJlY2VpdmluZ19idWZmZXIgPSBOVUxMOworICAgIGlmIChncHJfdW5yZWYoJmJjdGwtPnN0ZXBzX3RvX2NvbXBsZXRlKSkgeworICAgICAgcG9zdF9iYXRjaF9jb21wbGV0aW9uKGV4ZWNfY3R4LCBiY3RsKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19kYXRhX2FmdGVyX21kKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBiYXRjaF9jb250cm9sICpiY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgeworICBncnBjX2NhbGwgKmNhbGwgPSBiY3RsLT5jYWxsOworICBpZiAoY2FsbC0+cmVjZWl2aW5nX3N0cmVhbSA9PSBOVUxMKSB7CisgICAgKmNhbGwtPnJlY2VpdmluZ19idWZmZXIgPSBOVUxMOworICAgIGNhbGwtPnJlY2VpdmluZ19tZXNzYWdlID0gMDsKKyAgICBpZiAoZ3ByX3VucmVmKCZiY3RsLT5zdGVwc190b19jb21wbGV0ZSkpIHsKKyAgICAgIHBvc3RfYmF0Y2hfY29tcGxldGlvbihleGVjX2N0eCwgYmN0bCk7CisgICAgfQorICB9IGVsc2UgaWYgKGNhbGwtPnJlY2VpdmluZ19zdHJlYW0tPmxlbmd0aCA+CisgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2dldF9tYXhfbWVzc2FnZV9sZW5ndGgoY2FsbC0+Y2hhbm5lbCkpIHsKKyAgICBjYW5jZWxfd2l0aF9zdGF0dXMoZXhlY19jdHgsIGNhbGwsIEdSUENfU1RBVFVTX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAiTWF4IG1lc3NhZ2Ugc2l6ZSBleGNlZWRlZCIpOworICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShleGVjX2N0eCwgY2FsbC0+cmVjZWl2aW5nX3N0cmVhbSk7CisgICAgY2FsbC0+cmVjZWl2aW5nX3N0cmVhbSA9IE5VTEw7CisgICAgKmNhbGwtPnJlY2VpdmluZ19idWZmZXIgPSBOVUxMOworICAgIGNhbGwtPnJlY2VpdmluZ19tZXNzYWdlID0gMDsKKyAgICBpZiAoZ3ByX3VucmVmKCZiY3RsLT5zdGVwc190b19jb21wbGV0ZSkpIHsKKyAgICAgIHBvc3RfYmF0Y2hfY29tcGxldGlvbihleGVjX2N0eCwgYmN0bCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNhbGwtPnRlc3Rfb25seV9sYXN0X21lc3NhZ2VfZmxhZ3MgPSBjYWxsLT5yZWNlaXZpbmdfc3RyZWFtLT5mbGFnczsKKyAgICBpZiAoKGNhbGwtPnJlY2VpdmluZ19zdHJlYW0tPmZsYWdzICYgR1JQQ19XUklURV9JTlRFUk5BTF9DT01QUkVTUykgJiYKKyAgICAgICAgKGNhbGwtPmNvbXByZXNzaW9uX2FsZ29yaXRobSA+IEdSUENfQ09NUFJFU1NfTk9ORSkpIHsKKyAgICAgICpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyID0gZ3JwY19yYXdfY29tcHJlc3NlZF9ieXRlX2J1ZmZlcl9jcmVhdGUoCisgICAgICAgICAgTlVMTCwgMCwgY2FsbC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtKTsKKyAgICB9IGVsc2UgeworICAgICAgKmNhbGwtPnJlY2VpdmluZ19idWZmZXIgPSBncnBjX3Jhd19ieXRlX2J1ZmZlcl9jcmVhdGUoTlVMTCwgMCk7CisgICAgfQorICAgIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsLT5yZWNlaXZpbmdfc2xpY2VfcmVhZHksIHJlY2VpdmluZ19zbGljZV9yZWFkeSwKKyAgICAgICAgICAgICAgICAgICAgICBiY3RsKTsKKyAgICBjb250aW51ZV9yZWNlaXZpbmdfc2xpY2VzKGV4ZWNfY3R4LCBiY3RsKTsKKyAgICAvKiBlYXJseSBvdXQgKi8KKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQgcmVjZWl2aW5nX3N0cmVhbV9yZWFkeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYmN0bHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgeworICBiYXRjaF9jb250cm9sICpiY3RsID0gYmN0bHA7CisgIGdycGNfY2FsbCAqY2FsbCA9IGJjdGwtPmNhbGw7CisKKyAgZ3ByX211X2xvY2soJmJjdGwtPmNhbGwtPm11KTsKKyAgaWYgKGJjdGwtPmNhbGwtPmhhc19pbml0aWFsX21kX2JlZW5fcmVjZWl2ZWQpIHsKKyAgICBncHJfbXVfdW5sb2NrKCZiY3RsLT5jYWxsLT5tdSk7CisgICAgcHJvY2Vzc19kYXRhX2FmdGVyX21kKGV4ZWNfY3R4LCBiY3RscCwgc3VjY2Vzcyk7CisgIH0gZWxzZSB7CisgICAgY2FsbC0+c2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHguYmN0bHAgPSBiY3RscDsKKyAgICBjYWxsLT5zYXZlZF9yZWNlaXZpbmdfc3RyZWFtX3JlYWR5X2N0eC5zdWNjZXNzID0gc3VjY2VzczsKKyAgICBncHJfbXVfdW5sb2NrKCZiY3RsLT5jYWxsLT5tdSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgcmVjZWl2aW5nX2luaXRpYWxfbWV0YWRhdGFfcmVhZHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpiY3RscCwgYm9vbCBzdWNjZXNzKSB7CisgIGJhdGNoX2NvbnRyb2wgKmJjdGwgPSBiY3RscDsKKyAgZ3JwY19jYWxsICpjYWxsID0gYmN0bC0+Y2FsbDsKKworICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOworCisgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1kID0KKyAgICAgICZjYWxsLT5tZXRhZGF0YV9iYXRjaFsxIC8qIGlzX3JlY2VpdmluZyAqL11bMCAvKiBpc190cmFpbGluZyAqL107CisgIGdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyKG1kLCByZWN2X2luaXRpYWxfZmlsdGVyLCBjYWxsKTsKKyAgY2FsbC0+aGFzX2luaXRpYWxfbWRfYmVlbl9yZWNlaXZlZCA9IHRydWU7CisKKyAgaWYgKGdwcl90aW1lX2NtcChtZC0+ZGVhZGxpbmUsIGdwcl9pbmZfZnV0dXJlKG1kLT5kZWFkbGluZS5jbG9ja190eXBlKSkgIT0KKyAgICAgICAgICAwICYmCisgICAgICAhY2FsbC0+aXNfY2xpZW50KSB7CisgICAgR1BSX1RJTUVSX0JFR0lOKCJzZXRfZGVhZGxpbmVfYWxhcm0iLCAwKTsKKyAgICBzZXRfZGVhZGxpbmVfYWxhcm0oZXhlY19jdHgsIGNhbGwsIG1kLT5kZWFkbGluZSk7CisgICAgR1BSX1RJTUVSX0VORCgic2V0X2RlYWRsaW5lX2FsYXJtIiwgMCk7CisgIH0KKworICBpZiAoY2FsbC0+c2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHguYmN0bHAgIT0gTlVMTCkgeworICAgIGdycGNfY2xvc3VyZSAqc2F2ZWRfcnNyX2Nsb3N1cmUgPSBncnBjX2Nsb3N1cmVfY3JlYXRlKAorICAgICAgICByZWNlaXZpbmdfc3RyZWFtX3JlYWR5LCBjYWxsLT5zYXZlZF9yZWNlaXZpbmdfc3RyZWFtX3JlYWR5X2N0eC5iY3RscCk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBzYXZlZF9yc3JfY2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+c2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHguc3VjY2VzcywgTlVMTCk7CisgICAgY2FsbC0+c2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHguYmN0bHAgPSBOVUxMOworICB9CisKKyAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOworCisgIGlmIChncHJfdW5yZWYoJmJjdGwtPnN0ZXBzX3RvX2NvbXBsZXRlKSkgeworICAgIHBvc3RfYmF0Y2hfY29tcGxldGlvbihleGVjX2N0eCwgYmN0bCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZmluaXNoX2JhdGNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpiY3RscCwgYm9vbCBzdWNjZXNzKSB7CisgIGJhdGNoX2NvbnRyb2wgKmJjdGwgPSBiY3RscDsKKyAgZ3JwY19jYWxsICpjYWxsID0gYmN0bC0+Y2FsbDsKKyAgZ3JwY19jYWxsICpjaGlsZF9jYWxsOworICBncnBjX2NhbGwgKm5leHRfY2hpbGRfY2FsbDsKKworICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOworICBpZiAoYmN0bC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKSB7CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9kZXN0cm95KAorICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMCAvKiBpc19yZWNlaXZpbmcgKi9dWzAgLyogaXNfdHJhaWxpbmcgKi9dKTsKKyAgfQorICBpZiAoYmN0bC0+c2VuZF9tZXNzYWdlKSB7CisgICAgY2FsbC0+c2VuZGluZ19tZXNzYWdlID0gMDsKKyAgfQorICBpZiAoYmN0bC0+c2VuZF9maW5hbF9vcCkgeworICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfZGVzdHJveSgKKyAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzAgLyogaXNfcmVjZWl2aW5nICovXVsxIC8qIGlzX3RyYWlsaW5nICovXSk7CisgIH0KKyAgaWYgKGJjdGwtPnJlY3ZfZmluYWxfb3ApIHsKKyAgICBncnBjX21ldGFkYXRhX2JhdGNoICptZCA9CisgICAgICAgICZjYWxsLT5tZXRhZGF0YV9iYXRjaFsxIC8qIGlzX3JlY2VpdmluZyAqL11bMSAvKiBpc190cmFpbGluZyAqL107CisgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIobWQsIHJlY3ZfdHJhaWxpbmdfZmlsdGVyLCBjYWxsKTsKKworICAgIGlmIChjYWxsLT5oYXZlX2FsYXJtKSB7CisgICAgICBncnBjX3RpbWVyX2NhbmNlbChleGVjX2N0eCwgJmNhbGwtPmFsYXJtKTsKKyAgICB9CisgICAgLyogcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiB0byBhbnkgaW50ZXJlc3RlZCBjaGlsZHJlbiAqLworICAgIGNoaWxkX2NhbGwgPSBjYWxsLT5maXJzdF9jaGlsZDsKKyAgICBpZiAoY2hpbGRfY2FsbCAhPSBOVUxMKSB7CisgICAgICBkbyB7CisgICAgICAgIG5leHRfY2hpbGRfY2FsbCA9IGNoaWxkX2NhbGwtPnNpYmxpbmdfbmV4dDsKKyAgICAgICAgaWYgKGNoaWxkX2NhbGwtPmNhbmNlbGxhdGlvbl9pc19pbmhlcml0ZWQpIHsKKyAgICAgICAgICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGNoaWxkX2NhbGwsICJwcm9wYWdhdGVfY2FuY2VsIik7CisgICAgICAgICAgZ3JwY19jYWxsX2NhbmNlbChjaGlsZF9jYWxsLCBOVUxMKTsKKyAgICAgICAgICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGNoaWxkX2NhbGwsICJwcm9wYWdhdGVfY2FuY2VsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hpbGRfY2FsbCA9IG5leHRfY2hpbGRfY2FsbDsKKyAgICAgIH0gd2hpbGUgKGNoaWxkX2NhbGwgIT0gY2FsbC0+Zmlyc3RfY2hpbGQpOworICAgIH0KKworICAgIGlmIChjYWxsLT5pc19jbGllbnQpIHsKKyAgICAgIGdldF9maW5hbF9zdGF0dXMoY2FsbCwgc2V0X3N0YXR1c192YWx1ZV9kaXJlY3RseSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+ZmluYWxfb3AuY2xpZW50LnN0YXR1cyk7CisgICAgICBnZXRfZmluYWxfZGV0YWlscyhjYWxsLCBjYWxsLT5maW5hbF9vcC5jbGllbnQuc3RhdHVzX2RldGFpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5maW5hbF9vcC5jbGllbnQuc3RhdHVzX2RldGFpbHNfY2FwYWNpdHkpOworICAgIH0gZWxzZSB7CisgICAgICBnZXRfZmluYWxfc3RhdHVzKGNhbGwsIHNldF9jYW5jZWxsZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPmZpbmFsX29wLnNlcnZlci5jYW5jZWxsZWQpOworICAgIH0KKworICAgIHN1Y2Nlc3MgPSAxOworICB9CisgIGJjdGwtPnN1Y2Nlc3MgPSBzdWNjZXNzICE9IDA7CisgIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKKyAgaWYgKGdwcl91bnJlZigmYmN0bC0+c3RlcHNfdG9fY29tcGxldGUpKSB7CisgICAgcG9zdF9iYXRjaF9jb21wbGV0aW9uKGV4ZWNfY3R4LCBiY3RsKTsKKyAgfQorfQorCitzdGF0aWMgZ3JwY19jYWxsX2Vycm9yIGNhbGxfc3RhcnRfYmF0Y2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsICpjYWxsLCBjb25zdCBncnBjX29wICpvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5vcHMsIHZvaWQgKm5vdGlmeV90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX25vdGlmeV90YWdfY2xvc3VyZSkgeworICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Agc3RyZWFtX29wOworICBzaXplX3QgaTsKKyAgY29uc3QgZ3JwY19vcCAqb3A7CisgIGJhdGNoX2NvbnRyb2wgKmJjdGw7CisgIGludCBudW1fY29tcGxldGlvbl9jYWxsYmFja3NfbmVlZGVkID0gMTsKKyAgZ3JwY19jYWxsX2Vycm9yIGVycm9yID0gR1JQQ19DQUxMX09LOworCisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jYWxsX3N0YXJ0X2JhdGNoIiwgMCk7CisKKyAgR1JQQ19DQUxMX0xPR19CQVRDSChHUFJfSU5GTywgY2FsbCwgb3BzLCBub3BzLCBub3RpZnlfdGFnKTsKKworICBtZW1zZXQoJnN0cmVhbV9vcCwgMCwgc2l6ZW9mKHN0cmVhbV9vcCkpOworCisgIC8qIFRPRE8oY3RpbGxlcik6IHRoaXMgZmVlbHMgbGlrZSBpdCBjb3VsZCBiZSBtYWRlIGxvY2stZnJlZSAqLworICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOworICBiY3RsID0gYWxsb2NhdGVfYmF0Y2hfY29udHJvbChjYWxsKTsKKyAgbWVtc2V0KGJjdGwsIDAsIHNpemVvZigqYmN0bCkpOworICBiY3RsLT5jYWxsID0gY2FsbDsKKyAgYmN0bC0+bm90aWZ5X3RhZyA9IG5vdGlmeV90YWc7CisgIGJjdGwtPmlzX25vdGlmeV90YWdfY2xvc3VyZSA9ICh1aW50OF90KShpc19ub3RpZnlfdGFnX2Nsb3N1cmUgIT0gMCk7CisKKyAgaWYgKG5vcHMgPT0gMCkgeworICAgIEdSUENfQ0FMTF9JTlRFUk5BTF9SRUYoY2FsbCwgImNvbXBsZXRpb24iKTsKKyAgICBiY3RsLT5zdWNjZXNzID0gMTsKKyAgICBpZiAoIWlzX25vdGlmeV90YWdfY2xvc3VyZSkgeworICAgICAgZ3JwY19jcV9iZWdpbl9vcChjYWxsLT5jcSwgbm90aWZ5X3RhZyk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKKyAgICBwb3N0X2JhdGNoX2NvbXBsZXRpb24oZXhlY19jdHgsIGJjdGwpOworICAgIGVycm9yID0gR1JQQ19DQUxMX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIHJld3JpdGUgYmF0Y2ggb3BzIGludG8gYSB0cmFuc3BvcnQgb3AgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5vcHM7IGkrKykgeworICAgIG9wID0gJm9wc1tpXTsKKyAgICBpZiAob3AtPnJlc2VydmVkICE9IE5VTEwpIHsKKyAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SOworICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7CisgICAgfQorICAgIHN3aXRjaCAob3AtPm9wKSB7CisgICAgICBjYXNlIEdSUENfT1BfU0VORF9JTklUSUFMX01FVEFEQVRBOgorICAgICAgICAvKiBGbGFnIHZhbGlkYXRpb246IGN1cnJlbnRseSBhbGxvdyBubyBmbGFncyAqLworICAgICAgICBpZiAob3AtPmZsYWdzICE9IDApIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX0ZMQUdTOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsLT5zZW50X2luaXRpYWxfbWV0YWRhdGEpIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9UT09fTUFOWV9PUEVSQVRJT05TOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChvcC0+ZGF0YS5zZW5kX2luaXRpYWxfbWV0YWRhdGEuY291bnQgPiBJTlRfTUFYKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBiY3RsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgPSAxOworICAgICAgICBjYWxsLT5zZW50X2luaXRpYWxfbWV0YWRhdGEgPSAxOworICAgICAgICBpZiAoIXByZXBhcmVfYXBwbGljYXRpb25fbWV0YWRhdGEoCisgICAgICAgICAgICAgICAgY2FsbCwgKGludClvcC0+ZGF0YS5zZW5kX2luaXRpYWxfbWV0YWRhdGEuY291bnQsCisgICAgICAgICAgICAgICAgb3AtPmRhdGEuc2VuZF9pbml0aWFsX21ldGFkYXRhLm1ldGFkYXRhLCAwLCBjYWxsLT5pc19jbGllbnQpKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPKGN0aWxsZXIpOiBqdXN0IG1ha2UgdGhlc2UgdGhlIHNhbWUgdmFyaWFibGU/ICovCisgICAgICAgIGNhbGwtPm1ldGFkYXRhX2JhdGNoWzBdWzBdLmRlYWRsaW5lID0gY2FsbC0+c2VuZF9kZWFkbGluZTsKKyAgICAgICAgc3RyZWFtX29wLnNlbmRfaW5pdGlhbF9tZXRhZGF0YSA9CisgICAgICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMCAvKiBpc19yZWNlaXZpbmcgKi9dWzAgLyogaXNfdHJhaWxpbmcgKi9dOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19PUF9TRU5EX01FU1NBR0U6CisgICAgICAgIGlmICghYXJlX3dyaXRlX2ZsYWdzX3ZhbGlkKG9wLT5mbGFncykpIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX0ZMQUdTOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChvcC0+ZGF0YS5zZW5kX21lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfTUVTU0FHRTsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbC0+c2VuZGluZ19tZXNzYWdlKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfVE9PX01BTllfT1BFUkFUSU9OUzsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBiY3RsLT5zZW5kX21lc3NhZ2UgPSAxOworICAgICAgICBjYWxsLT5zZW5kaW5nX21lc3NhZ2UgPSAxOworICAgICAgICBncnBjX3NsaWNlX2J1ZmZlcl9zdHJlYW1faW5pdCgKKyAgICAgICAgICAgICZjYWxsLT5zZW5kaW5nX3N0cmVhbSwKKyAgICAgICAgICAgICZvcC0+ZGF0YS5zZW5kX21lc3NhZ2UtPmRhdGEucmF3LnNsaWNlX2J1ZmZlciwgb3AtPmZsYWdzKTsKKyAgICAgICAgc3RyZWFtX29wLnNlbmRfbWVzc2FnZSA9ICZjYWxsLT5zZW5kaW5nX3N0cmVhbS5iYXNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19PUF9TRU5EX0NMT1NFX0ZST01fQ0xJRU5UOgorICAgICAgICAvKiBGbGFnIHZhbGlkYXRpb246IGN1cnJlbnRseSBhbGxvdyBubyBmbGFncyAqLworICAgICAgICBpZiAob3AtPmZsYWdzICE9IDApIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX0ZMQUdTOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmICghY2FsbC0+aXNfY2xpZW50KSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfTk9UX09OX1NFUlZFUjsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbC0+c2VudF9maW5hbF9vcCkgeworICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX1RPT19NQU5ZX09QRVJBVElPTlM7CisgICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYmN0bC0+c2VuZF9maW5hbF9vcCA9IDE7CisgICAgICAgIGNhbGwtPnNlbnRfZmluYWxfb3AgPSAxOworICAgICAgICBzdHJlYW1fb3Auc2VuZF90cmFpbGluZ19tZXRhZGF0YSA9CisgICAgICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMCAvKiBpc19yZWNlaXZpbmcgKi9dWzEgLyogaXNfdHJhaWxpbmcgKi9dOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19PUF9TRU5EX1NUQVRVU19GUk9NX1NFUlZFUjoKKyAgICAgICAgLyogRmxhZyB2YWxpZGF0aW9uOiBjdXJyZW50bHkgYWxsb3cgbm8gZmxhZ3MgKi8KKyAgICAgICAgaWYgKG9wLT5mbGFncyAhPSAwKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbC0+aXNfY2xpZW50KSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfTk9UX09OX0NMSUVOVDsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbC0+c2VudF9maW5hbF9vcCkgeworICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX1RPT19NQU5ZX09QRVJBVElPTlM7CisgICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnRyYWlsaW5nX21ldGFkYXRhX2NvdW50ID4KKyAgICAgICAgICAgIElOVF9NQVgpIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX01FVEFEQVRBOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGJjdGwtPnNlbmRfZmluYWxfb3AgPSAxOworICAgICAgICBjYWxsLT5zZW50X2ZpbmFsX29wID0gMTsKKyAgICAgICAgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCA9IDE7CisgICAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbMF0ubWQgPSBncnBjX2NoYW5uZWxfZ2V0X3JlZmZlZF9zdGF0dXNfZWxlbSgKKyAgICAgICAgICAgIGNhbGwtPmNoYW5uZWwsIG9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnN0YXR1cyk7CisgICAgICAgIGlmIChvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci5zdGF0dXNfZGV0YWlscyAhPSBOVUxMKSB7CisgICAgICAgICAgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVsxXS5tZCA9IGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncygKKyAgICAgICAgICAgICAgR1JQQ19NRFNUUl9HUlBDX01FU1NBR0UsCisgICAgICAgICAgICAgIGdycGNfbWRzdHJfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci5zdGF0dXNfZGV0YWlscykpOworICAgICAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQrKzsKKyAgICAgICAgICBzZXRfc3RhdHVzX2RldGFpbHMoCisgICAgICAgICAgICAgIGNhbGwsIFNUQVRVU19GUk9NX0FQSV9PVkVSUklERSwKKyAgICAgICAgICAgICAgR1JQQ19NRFNUUl9SRUYoY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVsxXS5tZC0+dmFsdWUpKTsKKyAgICAgICAgfQorICAgICAgICBzZXRfc3RhdHVzX2NvZGUoY2FsbCwgU1RBVFVTX0ZST01fQVBJX09WRVJSSURFLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KW9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnN0YXR1cyk7CisgICAgICAgIGlmICghcHJlcGFyZV9hcHBsaWNhdGlvbl9tZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBjYWxsLAorICAgICAgICAgICAgICAgIChpbnQpb3AtPmRhdGEuc2VuZF9zdGF0dXNfZnJvbV9zZXJ2ZXIudHJhaWxpbmdfbWV0YWRhdGFfY291bnQsCisgICAgICAgICAgICAgICAgb3AtPmRhdGEuc2VuZF9zdGF0dXNfZnJvbV9zZXJ2ZXIudHJhaWxpbmdfbWV0YWRhdGEsIDEsIDEpKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1fb3Auc2VuZF90cmFpbGluZ19tZXRhZGF0YSA9CisgICAgICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMCAvKiBpc19yZWNlaXZpbmcgKi9dWzEgLyogaXNfdHJhaWxpbmcgKi9dOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19PUF9SRUNWX0lOSVRJQUxfTUVUQURBVEE6CisgICAgICAgIC8qIEZsYWcgdmFsaWRhdGlvbjogY3VycmVudGx5IGFsbG93IG5vIGZsYWdzICovCisgICAgICAgIGlmIChvcC0+ZmxhZ3MgIT0gMCkgeworICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfRkxBR1M7CisgICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGwtPnJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGEpIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9UT09fTUFOWV9PUEVSQVRJT05TOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGNhbGwtPnJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGEgPSAxOworICAgICAgICBjYWxsLT5idWZmZXJlZF9tZXRhZGF0YVswXSA9IG9wLT5kYXRhLnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKKyAgICAgICAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGwtPnJlY2VpdmluZ19pbml0aWFsX21ldGFkYXRhX3JlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSwgYmN0bCk7CisgICAgICAgIGJjdGwtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSA9IDE7CisgICAgICAgIHN0cmVhbV9vcC5yZWN2X2luaXRpYWxfbWV0YWRhdGEgPQorICAgICAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzEgLyogaXNfcmVjZWl2aW5nICovXVswIC8qIGlzX3RyYWlsaW5nICovXTsKKyAgICAgICAgc3RyZWFtX29wLnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9CisgICAgICAgICAgICAmY2FsbC0+cmVjZWl2aW5nX2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7CisgICAgICAgIG51bV9jb21wbGV0aW9uX2NhbGxiYWNrc19uZWVkZWQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdSUENfT1BfUkVDVl9NRVNTQUdFOgorICAgICAgICAvKiBGbGFnIHZhbGlkYXRpb246IGN1cnJlbnRseSBhbGxvdyBubyBmbGFncyAqLworICAgICAgICBpZiAob3AtPmZsYWdzICE9IDApIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX0ZMQUdTOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsLT5yZWNlaXZpbmdfbWVzc2FnZSkgeworICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX1RPT19NQU5ZX09QRVJBVElPTlM7CisgICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgY2FsbC0+cmVjZWl2aW5nX21lc3NhZ2UgPSAxOworICAgICAgICBiY3RsLT5yZWN2X21lc3NhZ2UgPSAxOworICAgICAgICBjYWxsLT5yZWNlaXZpbmdfYnVmZmVyID0gb3AtPmRhdGEucmVjdl9tZXNzYWdlOworICAgICAgICBzdHJlYW1fb3AucmVjdl9tZXNzYWdlID0gJmNhbGwtPnJlY2VpdmluZ19zdHJlYW07CisgICAgICAgIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsLT5yZWNlaXZpbmdfc3RyZWFtX3JlYWR5LCByZWNlaXZpbmdfc3RyZWFtX3JlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiY3RsKTsKKyAgICAgICAgc3RyZWFtX29wLnJlY3ZfbWVzc2FnZV9yZWFkeSA9ICZjYWxsLT5yZWNlaXZpbmdfc3RyZWFtX3JlYWR5OworICAgICAgICBudW1fY29tcGxldGlvbl9jYWxsYmFja3NfbmVlZGVkKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHUlBDX09QX1JFQ1ZfU1RBVFVTX09OX0NMSUVOVDoKKyAgICAgICAgLyogRmxhZyB2YWxpZGF0aW9uOiBjdXJyZW50bHkgYWxsb3cgbm8gZmxhZ3MgKi8KKyAgICAgICAgaWYgKG9wLT5mbGFncyAhPSAwKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNhbGwtPmlzX2NsaWVudCkgeworICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX05PVF9PTl9TRVJWRVI7CisgICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGwtPnJlY2VpdmVkX2ZpbmFsX29wKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfVE9PX01BTllfT1BFUkFUSU9OUzsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjYWxsLT5yZWNlaXZlZF9maW5hbF9vcCA9IDE7CisgICAgICAgIGNhbGwtPmJ1ZmZlcmVkX21ldGFkYXRhWzFdID0KKyAgICAgICAgICAgIG9wLT5kYXRhLnJlY3Zfc3RhdHVzX29uX2NsaWVudC50cmFpbGluZ19tZXRhZGF0YTsKKyAgICAgICAgY2FsbC0+ZmluYWxfb3AuY2xpZW50LnN0YXR1cyA9IG9wLT5kYXRhLnJlY3Zfc3RhdHVzX29uX2NsaWVudC5zdGF0dXM7CisgICAgICAgIGNhbGwtPmZpbmFsX29wLmNsaWVudC5zdGF0dXNfZGV0YWlscyA9CisgICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X3N0YXR1c19vbl9jbGllbnQuc3RhdHVzX2RldGFpbHM7CisgICAgICAgIGNhbGwtPmZpbmFsX29wLmNsaWVudC5zdGF0dXNfZGV0YWlsc19jYXBhY2l0eSA9CisgICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X3N0YXR1c19vbl9jbGllbnQuc3RhdHVzX2RldGFpbHNfY2FwYWNpdHk7CisgICAgICAgIGJjdGwtPnJlY3ZfZmluYWxfb3AgPSAxOworICAgICAgICBzdHJlYW1fb3AucmVjdl90cmFpbGluZ19tZXRhZGF0YSA9CisgICAgICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMSAvKiBpc19yZWNlaXZpbmcgKi9dWzEgLyogaXNfdHJhaWxpbmcgKi9dOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1JQQ19PUF9SRUNWX0NMT1NFX09OX1NFUlZFUjoKKyAgICAgICAgLyogRmxhZyB2YWxpZGF0aW9uOiBjdXJyZW50bHkgYWxsb3cgbm8gZmxhZ3MgKi8KKyAgICAgICAgaWYgKG9wLT5mbGFncyAhPSAwKSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbC0+aXNfY2xpZW50KSB7CisgICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfTk9UX09OX0NMSUVOVDsKKyAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbC0+cmVjZWl2ZWRfZmluYWxfb3ApIHsKKyAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9UT09fTUFOWV9PUEVSQVRJT05TOworICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGNhbGwtPnJlY2VpdmVkX2ZpbmFsX29wID0gMTsKKyAgICAgICAgY2FsbC0+ZmluYWxfb3Auc2VydmVyLmNhbmNlbGxlZCA9CisgICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X2Nsb3NlX29uX3NlcnZlci5jYW5jZWxsZWQ7CisgICAgICAgIGJjdGwtPnJlY3ZfZmluYWxfb3AgPSAxOworICAgICAgICBzdHJlYW1fb3AucmVjdl90cmFpbGluZ19tZXRhZGF0YSA9CisgICAgICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMSAvKiBpc19yZWNlaXZpbmcgKi9dWzEgLyogaXNfdHJhaWxpbmcgKi9dOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGNhbGwsICJjb21wbGV0aW9uIik7CisgIGlmICghaXNfbm90aWZ5X3RhZ19jbG9zdXJlKSB7CisgICAgZ3JwY19jcV9iZWdpbl9vcChjYWxsLT5jcSwgbm90aWZ5X3RhZyk7CisgIH0KKyAgZ3ByX3JlZl9pbml0KCZiY3RsLT5zdGVwc190b19jb21wbGV0ZSwgbnVtX2NvbXBsZXRpb25fY2FsbGJhY2tzX25lZWRlZCk7CisKKyAgc3RyZWFtX29wLmNvbnRleHQgPSBjYWxsLT5jb250ZXh0OworICBncnBjX2Nsb3N1cmVfaW5pdCgmYmN0bC0+ZmluaXNoX2JhdGNoLCBmaW5pc2hfYmF0Y2gsIGJjdGwpOworICBzdHJlYW1fb3Aub25fY29tcGxldGUgPSAmYmN0bC0+ZmluaXNoX2JhdGNoOworICBncHJfbXVfdW5sb2NrKCZjYWxsLT5tdSk7CisKKyAgZXhlY3V0ZV9vcChleGVjX2N0eCwgY2FsbCwgJnN0cmVhbV9vcCk7CisKK2RvbmU6CisgIEdQUl9USU1FUl9FTkQoImdycGNfY2FsbF9zdGFydF9iYXRjaCIsIDApOworICByZXR1cm4gZXJyb3I7CisKK2RvbmVfd2l0aF9lcnJvcjoKKyAgLyogcmV2ZXJzZSBhbnkgbXV0YXRpb25zIHRoYXQgb2NjdXJlZCAqLworICBpZiAoYmN0bC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKSB7CisgICAgY2FsbC0+c2VudF9pbml0aWFsX21ldGFkYXRhID0gMDsKKyAgICBncnBjX21ldGFkYXRhX2JhdGNoX2NsZWFyKCZjYWxsLT5tZXRhZGF0YV9iYXRjaFswXVswXSk7CisgIH0KKyAgaWYgKGJjdGwtPnNlbmRfbWVzc2FnZSkgeworICAgIGNhbGwtPnNlbmRpbmdfbWVzc2FnZSA9IDA7CisgICAgZ3JwY19ieXRlX3N0cmVhbV9kZXN0cm95KGV4ZWNfY3R4LCAmY2FsbC0+c2VuZGluZ19zdHJlYW0uYmFzZSk7CisgIH0KKyAgaWYgKGJjdGwtPnNlbmRfZmluYWxfb3ApIHsKKyAgICBjYWxsLT5zZW50X2ZpbmFsX29wID0gMDsKKyAgICBncnBjX21ldGFkYXRhX2JhdGNoX2NsZWFyKCZjYWxsLT5tZXRhZGF0YV9iYXRjaFswXVsxXSk7CisgIH0KKyAgaWYgKGJjdGwtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSkgeworICAgIGNhbGwtPnJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGEgPSAwOworICB9CisgIGlmIChiY3RsLT5yZWN2X21lc3NhZ2UpIHsKKyAgICBjYWxsLT5yZWNlaXZpbmdfbWVzc2FnZSA9IDA7CisgIH0KKyAgaWYgKGJjdGwtPnJlY3ZfZmluYWxfb3ApIHsKKyAgICBjYWxsLT5yZWNlaXZlZF9maW5hbF9vcCA9IDA7CisgIH0KKyAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOworICBnb3RvIGRvbmU7Cit9CisKK2dycGNfY2FsbF9lcnJvciBncnBjX2NhbGxfc3RhcnRfYmF0Y2goZ3JwY19jYWxsICpjYWxsLCBjb25zdCBncnBjX29wICpvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub3BzLCB2b2lkICp0YWcsIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIGdycGNfY2FsbF9lcnJvciBlcnI7CisKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19jYWxsX3N0YXJ0X2JhdGNoKGNhbGw9JXAsIG9wcz0lcCwgbm9wcz0lbHUsIHRhZz0lcCwgcmVzZXJ2ZWQ9JXApIiwKKyAgICAgIDUsIChjYWxsLCBvcHMsICh1bnNpZ25lZCBsb25nKW5vcHMsIHRhZywgcmVzZXJ2ZWQpKTsKKworICBpZiAocmVzZXJ2ZWQgIT0gTlVMTCkgeworICAgIGVyciA9IEdSUENfQ0FMTF9FUlJPUjsKKyAgfSBlbHNlIHsKKyAgICBlcnIgPSBjYWxsX3N0YXJ0X2JhdGNoKCZleGVjX2N0eCwgY2FsbCwgb3BzLCBub3BzLCB0YWcsIDApOworICB9CisKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgcmV0dXJuIGVycjsKK30KKworZ3JwY19jYWxsX2Vycm9yIGdycGNfY2FsbF9zdGFydF9iYXRjaF9hbmRfZXhlY3V0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsICpjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX29wICpvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpIHsKKyAgcmV0dXJuIGNhbGxfc3RhcnRfYmF0Y2goZXhlY19jdHgsIGNhbGwsIG9wcywgbm9wcywgY2xvc3VyZSwgMSk7Cit9CisKK3ZvaWQgZ3JwY19jYWxsX2NvbnRleHRfc2V0KGdycGNfY2FsbCAqY2FsbCwgZ3JwY19jb250ZXh0X2luZGV4IGVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp2YWx1ZSwgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnZhbHVlKSkgeworICBpZiAoY2FsbC0+Y29udGV4dFtlbGVtXS5kZXN0cm95KSB7CisgICAgY2FsbC0+Y29udGV4dFtlbGVtXS5kZXN0cm95KGNhbGwtPmNvbnRleHRbZWxlbV0udmFsdWUpOworICB9CisgIGNhbGwtPmNvbnRleHRbZWxlbV0udmFsdWUgPSB2YWx1ZTsKKyAgY2FsbC0+Y29udGV4dFtlbGVtXS5kZXN0cm95ID0gZGVzdHJveTsKK30KKwordm9pZCAqZ3JwY19jYWxsX2NvbnRleHRfZ2V0KGdycGNfY2FsbCAqY2FsbCwgZ3JwY19jb250ZXh0X2luZGV4IGVsZW0pIHsKKyAgcmV0dXJuIGNhbGwtPmNvbnRleHRbZWxlbV0udmFsdWU7Cit9CisKK3VpbnQ4X3QgZ3JwY19jYWxsX2lzX2NsaWVudChncnBjX2NhbGwgKmNhbGwpIHsgcmV0dXJuIGNhbGwtPmlzX2NsaWVudDsgfQorCitncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBncnBjX2NhbGxfY29tcHJlc3Npb25fZm9yX2xldmVsKAorICAgIGdycGNfY2FsbCAqY2FsbCwgZ3JwY19jb21wcmVzc2lvbl9sZXZlbCBsZXZlbCkgeworICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOworICBjb25zdCB1aW50MzJfdCBhY2NlcHRlZF9lbmNvZGluZ3MgPSBjYWxsLT5lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcjsKKyAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOworICByZXR1cm4gZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fZm9yX2xldmVsKGxldmVsLCBhY2NlcHRlZF9lbmNvZGluZ3MpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5oIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTc1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NBTExfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfQ0FMTF9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29udGV4dC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIKKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgPGdycGMvaW1wbC9jb2RlZ2VuL2NvbXByZXNzaW9uX3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICgqZ3JwY19pb3JlcV9jb21wbGV0aW9uX2Z1bmMpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbCAqY2FsbCwgaW50IHN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworZ3JwY19jYWxsICpncnBjX2NhbGxfY3JlYXRlKGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgZ3JwY19jYWxsICpwYXJlbnRfY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9wYWdhdGlvbl9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc2VydmVyX3RyYW5zcG9ydF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRlbGVtICoqYWRkX2luaXRpYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFkZF9pbml0aWFsX21ldGFkYXRhX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBzZW5kX2RlYWRsaW5lKTsKKwordm9pZCBncnBjX2NhbGxfc2V0X2NvbXBsZXRpb25fcXVldWUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EpOworCisjaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19jYWxsX2ludGVybmFsX3JlZihncnBjX2NhbGwgKmNhbGwsIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfY2FsbF9pbnRlcm5hbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKKyNkZWZpbmUgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjYWxsLCByZWFzb24pIFwKKyAgZ3JwY19jYWxsX2ludGVybmFsX3JlZihjYWxsLCByZWFzb24pCisjZGVmaW5lIEdSUENfQ0FMTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2FsbCwgcmVhc29uKSBcCisgIGdycGNfY2FsbF9pbnRlcm5hbF91bnJlZihleGVjX2N0eCwgY2FsbCwgcmVhc29uKQorI2Vsc2UKK3ZvaWQgZ3JwY19jYWxsX2ludGVybmFsX3JlZihncnBjX2NhbGwgKmNhbGwpOwordm9pZCBncnBjX2NhbGxfaW50ZXJuYWxfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqY2FsbCk7CisjZGVmaW5lIEdSUENfQ0FMTF9JTlRFUk5BTF9SRUYoY2FsbCwgcmVhc29uKSBncnBjX2NhbGxfaW50ZXJuYWxfcmVmKGNhbGwpCisjZGVmaW5lIEdSUENfQ0FMTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2FsbCwgcmVhc29uKSBcCisgIGdycGNfY2FsbF9pbnRlcm5hbF91bnJlZihleGVjX2N0eCwgY2FsbCkKKyNlbmRpZgorCitncnBjX2NhbGxfc3RhY2sgKmdycGNfY2FsbF9nZXRfY2FsbF9zdGFjayhncnBjX2NhbGwgKmNhbGwpOworCitncnBjX2NhbGxfZXJyb3IgZ3JwY19jYWxsX3N0YXJ0X2JhdGNoX2FuZF9leGVjdXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGwgKmNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfb3AgKm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7CisKKy8qIEdpdmVuIHRoZSB0b3AgY2FsbF9lbGVtZW50LCBnZXQgdGhlIGNhbGwgb2JqZWN0LiAqLworZ3JwY19jYWxsICpncnBjX2NhbGxfZnJvbV90b3BfZWxlbWVudChncnBjX2NhbGxfZWxlbWVudCAqc3VyZmFjZV9lbGVtZW50KTsKKwordm9pZCBncnBjX2NhbGxfbG9nX2JhdGNoKGNoYXIgKmZpbGUsIGludCBsaW5lLCBncHJfbG9nX3NldmVyaXR5IHNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbCAqY2FsbCwgY29uc3QgZ3JwY19vcCAqb3BzLCBzaXplX3Qgbm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0YWcpOworCisvKiBTZXQgYSBjb250ZXh0IHBvaW50ZXIuCisgICBObyB0aHJlYWQgc2FmZXR5IGd1YXJhbnRlZXMgYXJlIG1hZGUgd3J0IHRoaXMgdmFsdWUuICovCit2b2lkIGdycGNfY2FsbF9jb250ZXh0X3NldChncnBjX2NhbGwgKmNhbGwsIGdycGNfY29udGV4dF9pbmRleCBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUsIHZvaWQgKCpkZXN0cm95KSh2b2lkICp2YWx1ZSkpOworLyogR2V0IGEgY29udGV4dCBwb2ludGVyLiAqLwordm9pZCAqZ3JwY19jYWxsX2NvbnRleHRfZ2V0KGdycGNfY2FsbCAqY2FsbCwgZ3JwY19jb250ZXh0X2luZGV4IGVsZW0pOworCisjZGVmaW5lIEdSUENfQ0FMTF9MT0dfQkFUQ0goc2V2LCBjYWxsLCBvcHMsIG5vcHMsIHRhZykgXAorICBpZiAoZ3JwY19hcGlfdHJhY2UpIGdycGNfY2FsbF9sb2dfYmF0Y2goc2V2LCBjYWxsLCBvcHMsIG5vcHMsIHRhZykKKwordWludDhfdCBncnBjX2NhbGxfaXNfY2xpZW50KGdycGNfY2FsbCAqY2FsbCk7CisKKy8qIFJldHVybiBhbiBhcHByb3ByaWF0ZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gZm9yIHRoZSByZXF1ZXN0ZWQgY29tcHJlc3Npb24gXGEKKyAqIGxldmVsIGluIHRoZSBjb250ZXh0IG9mIFxhIGNhbGwuICovCitncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBncnBjX2NhbGxfY29tcHJlc3Npb25fZm9yX2xldmVsKAorICAgIGdycGNfY2FsbCAqY2FsbCwgZ3JwY19jb21wcmVzc2lvbl9sZXZlbCBsZXZlbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfZGV0YWlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjYwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2RldGFpbHMuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorCit2b2lkIGdycGNfY2FsbF9kZXRhaWxzX2luaXQoZ3JwY19jYWxsX2RldGFpbHMqIGNkKSB7CisgIEdSUENfQVBJX1RSQUNFKCJncnBjX2NhbGxfZGV0YWlsc19pbml0KGNkPSVwKSIsIDEsIChjZCkpOworICBtZW1zZXQoY2QsIDAsIHNpemVvZigqY2QpKTsKK30KKwordm9pZCBncnBjX2NhbGxfZGV0YWlsc19kZXN0cm95KGdycGNfY2FsbF9kZXRhaWxzKiBjZCkgeworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jYWxsX2RldGFpbHNfZGVzdHJveShjZD0lcCkiLCAxLCAoY2QpKTsKKyAgZ3ByX2ZyZWUoY2QtPm1ldGhvZCk7CisgIGdwcl9mcmVlKGNkLT5ob3N0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNWEyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5oIgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK3N0YXRpYyB2b2lkIGFkZF9tZXRhZGF0YShncHJfc3RydmVjICpiLCBjb25zdCBncnBjX21ldGFkYXRhICptZCwgc2l6ZV90IGNvdW50KSB7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGdwcl9zdHJ2ZWNfYWRkKGIsIGdwcl9zdHJkdXAoIlxua2V5PSIpKTsKKyAgICBncHJfc3RydmVjX2FkZChiLCBncHJfc3RyZHVwKG1kW2ldLmtleSkpOworCisgICAgZ3ByX3N0cnZlY19hZGQoYiwgZ3ByX3N0cmR1cCgiIHZhbHVlPSIpKTsKKyAgICBncHJfc3RydmVjX2FkZChiLCBncHJfZHVtcChtZFtpXS52YWx1ZSwgbWRbaV0udmFsdWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9EVU1QX0hFWCB8IEdQUl9EVU1QX0FTQ0lJKSk7CisgIH0KK30KKworY2hhciAqZ3JwY19vcF9zdHJpbmcoY29uc3QgZ3JwY19vcCAqb3ApIHsKKyAgY2hhciAqdG1wOworICBjaGFyICpvdXQ7CisKKyAgZ3ByX3N0cnZlYyBiOworICBncHJfc3RydmVjX2luaXQoJmIpOworCisgIHN3aXRjaCAob3AtPm9wKSB7CisgICAgY2FzZSBHUlBDX09QX1NFTkRfSU5JVElBTF9NRVRBREFUQToKKyAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCJTRU5EX0lOSVRJQUxfTUVUQURBVEEiKSk7CisgICAgICBhZGRfbWV0YWRhdGEoJmIsIG9wLT5kYXRhLnNlbmRfaW5pdGlhbF9tZXRhZGF0YS5tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5zZW5kX2luaXRpYWxfbWV0YWRhdGEuY291bnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHUlBDX09QX1NFTkRfTUVTU0FHRToKKyAgICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiU0VORF9NRVNTQUdFIHB0cj0lcCIsIG9wLT5kYXRhLnNlbmRfbWVzc2FnZSk7CisgICAgICBncHJfc3RydmVjX2FkZCgmYiwgdG1wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1JQQ19PUF9TRU5EX0NMT1NFX0ZST01fQ0xJRU5UOgorICAgICAgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIlNFTkRfQ0xPU0VfRlJPTV9DTElFTlQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdSUENfT1BfU0VORF9TVEFUVVNfRlJPTV9TRVJWRVI6CisgICAgICBncHJfYXNwcmludGYoJnRtcCwgIlNFTkRfU1RBVFVTX0ZST01fU0VSVkVSIHN0YXR1cz0lZCBkZXRhaWxzPSVzIiwKKyAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci5zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEuc2VuZF9zdGF0dXNfZnJvbV9zZXJ2ZXIuc3RhdHVzX2RldGFpbHMpOworICAgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7CisgICAgICBhZGRfbWV0YWRhdGEoJmIsIG9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnRyYWlsaW5nX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnRyYWlsaW5nX21ldGFkYXRhX2NvdW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1JQQ19PUF9SRUNWX0lOSVRJQUxfTUVUQURBVEE6CisgICAgICBncHJfYXNwcmludGYoJnRtcCwgIlJFQ1ZfSU5JVElBTF9NRVRBREFUQSBwdHI9JXAiLAorICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSk7CisgICAgICBncHJfc3RydmVjX2FkZCgmYiwgdG1wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1JQQ19PUF9SRUNWX01FU1NBR0U6CisgICAgICBncHJfYXNwcmludGYoJnRtcCwgIlJFQ1ZfTUVTU0FHRSBwdHI9JXAiLCBvcC0+ZGF0YS5yZWN2X21lc3NhZ2UpOworICAgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdSUENfT1BfUkVDVl9TVEFUVVNfT05fQ0xJRU5UOgorICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsCisgICAgICAgICAgICAgICAgICAgIlJFQ1ZfU1RBVFVTX09OX0NMSUVOVCBtZXRhZGF0YT0lcCBzdGF0dXM9JXAgZGV0YWlscz0lcCIsCisgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEucmVjdl9zdGF0dXNfb25fY2xpZW50LnRyYWlsaW5nX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnJlY3Zfc3RhdHVzX29uX2NsaWVudC5zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEucmVjdl9zdGF0dXNfb25fY2xpZW50LnN0YXR1c19kZXRhaWxzKTsKKyAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCB0bXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHUlBDX09QX1JFQ1ZfQ0xPU0VfT05fU0VSVkVSOgorICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJSRUNWX0NMT1NFX09OX1NFUlZFUiBjYW5jZWxsZWQ9JXAiLAorICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnJlY3ZfY2xvc2Vfb25fc2VydmVyLmNhbmNlbGxlZCk7CisgICAgICBncHJfc3RydmVjX2FkZCgmYiwgdG1wKTsKKyAgfQorICBvdXQgPSBncHJfc3RydmVjX2ZsYXR0ZW4oJmIsIE5VTEwpOworICBncHJfc3RydmVjX2Rlc3Ryb3koJmIpOworCisgIHJldHVybiBvdXQ7Cit9CisKK3ZvaWQgZ3JwY19jYWxsX2xvZ19iYXRjaChjaGFyICpmaWxlLCBpbnQgbGluZSwgZ3ByX2xvZ19zZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGwgKmNhbGwsIGNvbnN0IGdycGNfb3AgKm9wcywgc2l6ZV90IG5vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGFnKSB7CisgIGNoYXIgKnRtcDsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBub3BzOyBpKyspIHsKKyAgICB0bXAgPSBncnBjX29wX3N0cmluZygmb3BzW2ldKTsKKyAgICBncHJfbG9nKGZpbGUsIGxpbmUsIHNldmVyaXR5LCAib3BzWyVkXTogJXMiLCBpLCB0bXApOworICAgIGdwcl9mcmVlKHRtcCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmggYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDIxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NBTExfVEVTVF9PTkxZX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NBTExfVEVTVF9PTkxZX0gKKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBSZXR1cm4gdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBmcm9tIFxhIGNhbGwuCisgKgorICogXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBzaG91bGQgXGIgb25seSBiZSB1c2VkIGluIHRlc3QgY29kZS4gKi8KK2dycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY2FsbF90ZXN0X29ubHlfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKKyAgICBncnBjX2NhbGwgKmNhbGwpOworCisvKiogUmV0dXJuIHRoZSBtZXNzYWdlIGZsYWdzIGZyb20gXGEgY2FsbC4KKyAqCisgKiBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBcYiBvbmx5IGJlIHVzZWQgaW4gdGVzdCBjb2RlLiAqLwordWludDMyX3QgZ3JwY19jYWxsX3Rlc3Rfb25seV9nZXRfbWVzc2FnZV9mbGFncyhncnBjX2NhbGwgKmNhbGwpOworCisvKiogUmV0dXJucyBhIGJpdHNldCBmb3IgdGhlIGVuY29kaW5ncyAoY29tcHJlc3Npb24gYWxnb3JpdGhtcykgc3VwcG9ydGVkIGJ5IFxhCisgKiBjYWxsJ3MgcGVlci4KKyAqCisgKiBUbyBiZSBpbmRleGVkIGJ5IGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGVudW0gdmFsdWVzLiAqLwordWludDMyX3QgZ3JwY19jYWxsX3Rlc3Rfb25seV9nZXRfZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIoZ3JwY19jYWxsICpjYWxsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9DQUxMX1RFU1RfT05MWV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxNWRhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCisKKy8qKiBDYWNoZSBncnBjLXN0YXR1czogWCBtZGVsZW1zIGZvciBYID0gMC4uTlVNX0NBQ0hFRF9TVEFUVVNfRUxFTVMuCisgKiAgQXZvaWRzIG5lZWRpbmcgdG8gdGFrZSBhIG1ldGFkYXRhIGNvbnRleHQgbG9jayBmb3Igc2VuZGluZyBzdGF0dXMKKyAqICBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgPD0gTlVNX0NBQ0hFRF9TVEFUVVNfRUxFTVMuCisgKiAgU2l6ZWQgdG8gYWxsb3cgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBjb2RlcyB0byBmaXQgaW4KKyAqICAoT0ssIENhbmNlbGxlZCwgVW5rbm93bikuICovCisjZGVmaW5lIE5VTV9DQUNIRURfU1RBVFVTX0VMRU1TIDMKKwordHlwZWRlZiBzdHJ1Y3QgcmVnaXN0ZXJlZF9jYWxsIHsKKyAgZ3JwY19tZGVsZW0gKnBhdGg7CisgIGdycGNfbWRlbGVtICphdXRob3JpdHk7CisgIHN0cnVjdCByZWdpc3RlcmVkX2NhbGwgKm5leHQ7Cit9IHJlZ2lzdGVyZWRfY2FsbDsKKworc3RydWN0IGdycGNfY2hhbm5lbCB7CisgIGludCBpc19jbGllbnQ7CisgIHVpbnQzMl90IG1heF9tZXNzYWdlX2xlbmd0aDsKKyAgZ3JwY19tZGVsZW0gKmRlZmF1bHRfYXV0aG9yaXR5OworCisgIGdwcl9tdSByZWdpc3RlcmVkX2NhbGxfbXU7CisgIHJlZ2lzdGVyZWRfY2FsbCAqcmVnaXN0ZXJlZF9jYWxsczsKKyAgY2hhciAqdGFyZ2V0OworfTsKKworI2RlZmluZSBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSAoKGdycGNfY2hhbm5lbF9zdGFjayAqKSgoYykgKyAxKSkKKyNkZWZpbmUgQ0hBTk5FTF9GUk9NX0NIQU5ORUxfU1RBQ0soY2hhbm5lbF9zdGFjaykgXAorICAoKChncnBjX2NoYW5uZWwgKikoY2hhbm5lbF9zdGFjaykpIC0gMSkKKyNkZWZpbmUgQ0hBTk5FTF9GUk9NX1RPUF9FTEVNKHRvcF9lbGVtKSBcCisgIENIQU5ORUxfRlJPTV9DSEFOTkVMX1NUQUNLKGdycGNfY2hhbm5lbF9zdGFja19mcm9tX3RvcF9lbGVtZW50KHRvcF9lbGVtKSkKKworLyogdGhlIHByb3RvYnVmIGxpYnJhcnkgd2lsbCAoYnkgZGVmYXVsdCkgc3RhcnQgd2FybmluZyBhdCAxMDBtZWdzICovCisjZGVmaW5lIERFRkFVTFRfTUFYX01FU1NBR0VfTEVOR1RIICgxMDAgKiAxMDI0ICogMTAyNCkKKworc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2Vzcyk7CisKK2dycGNfY2hhbm5lbCAqZ3JwY19jaGFubmVsX2NyZWF0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY29uc3QgY2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja190eXBlIGNoYW5uZWxfc3RhY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqb3B0aW9uYWxfdHJhbnNwb3J0KSB7CisgIGJvb2wgaXNfY2xpZW50ID0gZ3JwY19jaGFubmVsX3N0YWNrX3R5cGVfaXNfY2xpZW50KGNoYW5uZWxfc3RhY2tfdHlwZSk7CisKKyAgZ3JwY19jaGFubmVsICpjaGFubmVsID0gZ3JwY19jaGFubmVsX2luaXRfY3JlYXRlX3N0YWNrKAorICAgICAgZXhlY19jdHgsIGNoYW5uZWxfc3RhY2tfdHlwZSwgc2l6ZW9mKGdycGNfY2hhbm5lbCksIGFyZ3MsIDEsCisgICAgICBkZXN0cm95X2NoYW5uZWwsIE5VTEwsIG9wdGlvbmFsX3RyYW5zcG9ydCk7CisKKyAgbWVtc2V0KGNoYW5uZWwsIDAsIHNpemVvZigqY2hhbm5lbCkpOworICBjaGFubmVsLT50YXJnZXQgPSBncHJfc3RyZHVwKHRhcmdldCk7CisgIGNoYW5uZWwtPmlzX2NsaWVudCA9IGlzX2NsaWVudDsKKyAgZ3ByX211X2luaXQoJmNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbF9tdSk7CisgIGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHMgPSBOVUxMOworCisgIGNoYW5uZWwtPm1heF9tZXNzYWdlX2xlbmd0aCA9IERFRkFVTFRfTUFYX01FU1NBR0VfTEVOR1RIOworICBpZiAoYXJncykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgeworICAgICAgaWYgKDAgPT0gc3RyY21wKGFyZ3MtPmFyZ3NbaV0ua2V5LCBHUlBDX0FSR19NQVhfTUVTU0FHRV9MRU5HVEgpKSB7CisgICAgICAgIGlmIChhcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfSU5URUdFUikgeworICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMgaWdub3JlZDogaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgICAgIEdSUENfQVJHX01BWF9NRVNTQUdFX0xFTkdUSCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyIDwgMCkgeworICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMgaWdub3JlZDogaXQgbXVzdCBiZSA+PSAwIiwKKyAgICAgICAgICAgICAgICAgIEdSUENfQVJHX01BWF9NRVNTQUdFX0xFTkdUSCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2hhbm5lbC0+bWF4X21lc3NhZ2VfbGVuZ3RoID0gKHVpbnQzMl90KWFyZ3MtPmFyZ3NbaV0udmFsdWUuaW50ZWdlcjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChhcmdzLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfREVGQVVMVF9BVVRIT1JJVFkpKSB7CisgICAgICAgIGlmIChhcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfU1RSSU5HKSB7CisgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlcyBpZ25vcmVkOiBpdCBtdXN0IGJlIGEgc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0RFRkFVTFRfQVVUSE9SSVRZKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkpIHsKKyAgICAgICAgICAgIC8qIHNldHRpbmcgdGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYW55dGhpbmcgZWxzZSAqLworICAgICAgICAgICAgR1JQQ19NREVMRU1fVU5SRUYoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaGFubmVsLT5kZWZhdWx0X2F1dGhvcml0eSA9IGdycGNfbWRlbGVtX2Zyb21fc3RyaW5ncygKKyAgICAgICAgICAgICAgIjphdXRob3JpdHkiLCBhcmdzLT5hcmdzW2ldLnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoMCA9PQorICAgICAgICAgICAgICAgICBzdHJjbXAoYXJncy0+YXJnc1tpXS5rZXksIEdSUENfU1NMX1RBUkdFVF9OQU1FX09WRVJSSURFX0FSRykpIHsKKyAgICAgICAgaWYgKGFyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19TVFJJTkcpIHsKKyAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzIGlnbm9yZWQ6IGl0IG11c3QgYmUgYSBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgR1JQQ19TU0xfVEFSR0VUX05BTUVfT1ZFUlJJREVfQVJHKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkpIHsKKyAgICAgICAgICAgIC8qIG90aGVyIHdheXMgb2Ygc2V0dGluZyB0aGlzIChub3RhYmx5IHNzbCkgdGFrZSBwcmVjZWRlbmNlICovCisgICAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIiVzIGlnbm9yZWQ6IGRlZmF1bHQgaG9zdCBhbHJlYWR5IHNldCBzb21lIG90aGVyIHdheSIsCisgICAgICAgICAgICAgICAgICAgIEdSUENfU1NMX1RBUkdFVF9OQU1FX09WRVJSSURFX0FSRyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWwtPmRlZmF1bHRfYXV0aG9yaXR5ID0gZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKAorICAgICAgICAgICAgICAgICI6YXV0aG9yaXR5IiwgYXJncy0+YXJnc1tpXS52YWx1ZS5zdHJpbmcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChjaGFubmVsLT5pc19jbGllbnQgJiYgY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkgPT0gTlVMTCAmJgorICAgICAgdGFyZ2V0ICE9IE5VTEwpIHsKKyAgICBjaGFyICpkZWZhdWx0X2F1dGhvcml0eSA9IGdycGNfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KHRhcmdldCk7CisgICAgaWYgKGRlZmF1bHRfYXV0aG9yaXR5KSB7CisgICAgICBjaGFubmVsLT5kZWZhdWx0X2F1dGhvcml0eSA9CisgICAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKCI6YXV0aG9yaXR5IiwgZGVmYXVsdF9hdXRob3JpdHkpOworICAgIH0KKyAgICBncHJfZnJlZShkZWZhdWx0X2F1dGhvcml0eSk7CisgIH0KKworICByZXR1cm4gY2hhbm5lbDsKK30KKworY2hhciAqZ3JwY19jaGFubmVsX2dldF90YXJnZXQoZ3JwY19jaGFubmVsICpjaGFubmVsKSB7CisgIEdSUENfQVBJX1RSQUNFKCJncnBjX2NoYW5uZWxfZ2V0X3RhcmdldChjaGFubmVsPSVwKSIsIDEsIChjaGFubmVsKSk7CisgIHJldHVybiBncHJfc3RyZHVwKGNoYW5uZWwtPnRhcmdldCk7Cit9CisKK3N0YXRpYyBncnBjX2NhbGwgKmdycGNfY2hhbm5lbF9jcmVhdGVfY2FsbF9pbnRlcm5hbCgKKyAgICBncnBjX2NoYW5uZWwgKmNoYW5uZWwsIGdycGNfY2FsbCAqcGFyZW50X2NhbGwsIHVpbnQzMl90IHByb3BhZ2F0aW9uX21hc2ssCisgICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSwgZ3JwY19tZGVsZW0gKnBhdGhfbWRlbGVtLAorICAgIGdycGNfbWRlbGVtICphdXRob3JpdHlfbWRlbGVtLCBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKKyAgZ3JwY19tZGVsZW0gKnNlbmRfbWV0YWRhdGFbMl07CisgIHNpemVfdCBudW1fbWV0YWRhdGEgPSAwOworCisgIEdQUl9BU1NFUlQoY2hhbm5lbC0+aXNfY2xpZW50KTsKKworICBzZW5kX21ldGFkYXRhW251bV9tZXRhZGF0YSsrXSA9IHBhdGhfbWRlbGVtOworICBpZiAoYXV0aG9yaXR5X21kZWxlbSAhPSBOVUxMKSB7CisgICAgc2VuZF9tZXRhZGF0YVtudW1fbWV0YWRhdGErK10gPSBhdXRob3JpdHlfbWRlbGVtOworICB9IGVsc2UgaWYgKGNoYW5uZWwtPmRlZmF1bHRfYXV0aG9yaXR5ICE9IE5VTEwpIHsKKyAgICBzZW5kX21ldGFkYXRhW251bV9tZXRhZGF0YSsrXSA9IEdSUENfTURFTEVNX1JFRihjaGFubmVsLT5kZWZhdWx0X2F1dGhvcml0eSk7CisgIH0KKworICByZXR1cm4gZ3JwY19jYWxsX2NyZWF0ZShjaGFubmVsLCBwYXJlbnRfY2FsbCwgcHJvcGFnYXRpb25fbWFzaywgY3EsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbWV0YWRhdGEsIG51bV9tZXRhZGF0YSwgZGVhZGxpbmUpOworfQorCitncnBjX2NhbGwgKmdycGNfY2hhbm5lbF9jcmVhdGVfY2FsbChncnBjX2NoYW5uZWwgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGwgKnBhcmVudF9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvcGFnYXRpb25fbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QsIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIHZvaWQgKnJlc2VydmVkKSB7CisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfY2hhbm5lbF9jcmVhdGVfY2FsbCgiCisgICAgICAiY2hhbm5lbD0lcCwgcGFyZW50X2NhbGw9JXAsIHByb3BhZ2F0aW9uX21hc2s9JXgsIGNxPSVwLCBtZXRob2Q9JXMsICIKKyAgICAgICJob3N0PSVzLCAiCisgICAgICAiZGVhZGxpbmU9Z3ByX3RpbWVzcGVjIHsgdHZfc2VjOiAlbGxkLCB0dl9uc2VjOiAlZCwgY2xvY2tfdHlwZTogJWQgfSwgIgorICAgICAgInJlc2VydmVkPSVwKSIsCisgICAgICAxMCwgKGNoYW5uZWwsIHBhcmVudF9jYWxsLCAodW5zaWduZWQpcHJvcGFnYXRpb25fbWFzaywgY3EsIG1ldGhvZCwgaG9zdCwKKyAgICAgICAgICAgKGxvbmcgbG9uZylkZWFkbGluZS50dl9zZWMsIChpbnQpZGVhZGxpbmUudHZfbnNlYywKKyAgICAgICAgICAgKGludClkZWFkbGluZS5jbG9ja190eXBlLCByZXNlcnZlZCkpOworICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7CisgIHJldHVybiBncnBjX2NoYW5uZWxfY3JlYXRlX2NhbGxfaW50ZXJuYWwoCisgICAgICBjaGFubmVsLCBwYXJlbnRfY2FsbCwgcHJvcGFnYXRpb25fbWFzaywgY3EsCisgICAgICBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoR1JQQ19NRFNUUl9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRzdHJfZnJvbV9zdHJpbmcobWV0aG9kKSksCisgICAgICBob3N0ID8gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfQVVUSE9SSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKGhvc3QpKQorICAgICAgICAgICA6IE5VTEwsCisgICAgICBkZWFkbGluZSk7Cit9CisKK3ZvaWQgKmdycGNfY2hhbm5lbF9yZWdpc3Rlcl9jYWxsKGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgY29uc3QgY2hhciAqbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdm9pZCAqcmVzZXJ2ZWQpIHsKKyAgcmVnaXN0ZXJlZF9jYWxsICpyYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKHJlZ2lzdGVyZWRfY2FsbCkpOworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX2NoYW5uZWxfcmVnaXN0ZXJfY2FsbChjaGFubmVsPSVwLCBtZXRob2Q9JXMsIGhvc3Q9JXMsIHJlc2VydmVkPSVwKSIsCisgICAgICA0LCAoY2hhbm5lbCwgbWV0aG9kLCBob3N0LCByZXNlcnZlZCkpOworICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7CisgIHJjLT5wYXRoID0gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhtZXRob2QpKTsKKyAgcmMtPmF1dGhvcml0eSA9IGhvc3QgPyBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURTVFJfQVVUSE9SSVRZLCBncnBjX21kc3RyX2Zyb21fc3RyaW5nKGhvc3QpKQorICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgIGdwcl9tdV9sb2NrKCZjaGFubmVsLT5yZWdpc3RlcmVkX2NhbGxfbXUpOworICByYy0+bmV4dCA9IGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHM7CisgIGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHMgPSByYzsKKyAgZ3ByX211X3VubG9jaygmY2hhbm5lbC0+cmVnaXN0ZXJlZF9jYWxsX211KTsKKyAgcmV0dXJuIHJjOworfQorCitncnBjX2NhbGwgKmdycGNfY2hhbm5lbF9jcmVhdGVfcmVnaXN0ZXJlZF9jYWxsKAorICAgIGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgZ3JwY19jYWxsICpwYXJlbnRfY2FsbCwgdWludDMyX3QgcHJvcGFnYXRpb25fbWFzaywKKyAgICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNvbXBsZXRpb25fcXVldWUsIHZvaWQgKnJlZ2lzdGVyZWRfY2FsbF9oYW5kbGUsCisgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCB2b2lkICpyZXNlcnZlZCkgeworICByZWdpc3RlcmVkX2NhbGwgKnJjID0gcmVnaXN0ZXJlZF9jYWxsX2hhbmRsZTsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19jaGFubmVsX2NyZWF0ZV9yZWdpc3RlcmVkX2NhbGwoIgorICAgICAgImNoYW5uZWw9JXAsIHBhcmVudF9jYWxsPSVwLCBwcm9wYWdhdGlvbl9tYXNrPSV4LCBjb21wbGV0aW9uX3F1ZXVlPSVwLCAiCisgICAgICAicmVnaXN0ZXJlZF9jYWxsX2hhbmRsZT0lcCwgIgorICAgICAgImRlYWRsaW5lPWdwcl90aW1lc3BlYyB7IHR2X3NlYzogJWxsZCwgdHZfbnNlYzogJWQsIGNsb2NrX3R5cGU6ICVkIH0sICIKKyAgICAgICJyZXNlcnZlZD0lcCkiLAorICAgICAgOSwgKGNoYW5uZWwsIHBhcmVudF9jYWxsLCAodW5zaWduZWQpcHJvcGFnYXRpb25fbWFzaywgY29tcGxldGlvbl9xdWV1ZSwKKyAgICAgICAgICByZWdpc3RlcmVkX2NhbGxfaGFuZGxlLCAobG9uZyBsb25nKWRlYWRsaW5lLnR2X3NlYywKKyAgICAgICAgICAoaW50KWRlYWRsaW5lLnR2X25zZWMsIChpbnQpZGVhZGxpbmUuY2xvY2tfdHlwZSwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOworICByZXR1cm4gZ3JwY19jaGFubmVsX2NyZWF0ZV9jYWxsX2ludGVybmFsKAorICAgICAgY2hhbm5lbCwgcGFyZW50X2NhbGwsIHByb3BhZ2F0aW9uX21hc2ssIGNvbXBsZXRpb25fcXVldWUsCisgICAgICBHUlBDX01ERUxFTV9SRUYocmMtPnBhdGgpLAorICAgICAgcmMtPmF1dGhvcml0eSA/IEdSUENfTURFTEVNX1JFRihyYy0+YXV0aG9yaXR5KSA6IE5VTEwsIGRlYWRsaW5lKTsKK30KKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCisjZGVmaW5lIFJFRl9SRUFTT04gcmVhc29uCisjZGVmaW5lIFJFRl9BUkcgLCBjb25zdCBjaGFyICpyZWFzb24KKyNlbHNlCisjZGVmaW5lIFJFRl9SRUFTT04gIiIKKyNkZWZpbmUgUkVGX0FSRworI2VuZGlmCit2b2lkIGdycGNfY2hhbm5lbF9pbnRlcm5hbF9yZWYoZ3JwY19jaGFubmVsICpjIFJFRl9BUkcpIHsKKyAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSwgUkVGX1JFQVNPTik7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX2ludGVybmFsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsICpjIFJFRl9BUkcpIHsKKyAgR1JQQ19DSEFOTkVMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSwgUkVGX1JFQVNPTik7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgeworICBncnBjX2NoYW5uZWwgKmNoYW5uZWwgPSBhcmc7CisgIGdycGNfY2hhbm5lbF9zdGFja19kZXN0cm95KGV4ZWNfY3R4LCBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjaGFubmVsKSk7CisgIHdoaWxlIChjaGFubmVsLT5yZWdpc3RlcmVkX2NhbGxzKSB7CisgICAgcmVnaXN0ZXJlZF9jYWxsICpyYyA9IGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHM7CisgICAgY2hhbm5lbC0+cmVnaXN0ZXJlZF9jYWxscyA9IHJjLT5uZXh0OworICAgIEdSUENfTURFTEVNX1VOUkVGKHJjLT5wYXRoKTsKKyAgICBpZiAocmMtPmF1dGhvcml0eSkgeworICAgICAgR1JQQ19NREVMRU1fVU5SRUYocmMtPmF1dGhvcml0eSk7CisgICAgfQorICAgIGdwcl9mcmVlKHJjKTsKKyAgfQorICBpZiAoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkgIT0gTlVMTCkgeworICAgIEdSUENfTURFTEVNX1VOUkVGKGNoYW5uZWwtPmRlZmF1bHRfYXV0aG9yaXR5KTsKKyAgfQorICBncHJfbXVfZGVzdHJveSgmY2hhbm5lbC0+cmVnaXN0ZXJlZF9jYWxsX211KTsKKyAgZ3ByX2ZyZWUoY2hhbm5lbC0+dGFyZ2V0KTsKKyAgZ3ByX2ZyZWUoY2hhbm5lbCk7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX2Rlc3Ryb3koZ3JwY19jaGFubmVsICpjaGFubmVsKSB7CisgIGdycGNfdHJhbnNwb3J0X29wIG9wOworICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbTsKKyAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2hhbm5lbF9kZXN0cm95KGNoYW5uZWw9JXApIiwgMSwgKGNoYW5uZWwpKTsKKyAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CisgIG9wLmRpc2Nvbm5lY3QgPSAxOworICBlbGVtID0gZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoQ0hBTk5FTF9TVEFDS19GUk9NX0NIQU5ORUwoY2hhbm5lbCksIDApOworICBlbGVtLT5maWx0ZXItPnN0YXJ0X3RyYW5zcG9ydF9vcCgmZXhlY19jdHgsIGVsZW0sICZvcCk7CisKKyAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKCZleGVjX2N0eCwgY2hhbm5lbCwgImNoYW5uZWwiKTsKKworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworfQorCitncnBjX2NoYW5uZWxfc3RhY2sgKmdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhncnBjX2NoYW5uZWwgKmNoYW5uZWwpIHsKKyAgcmV0dXJuIENIQU5ORUxfU1RBQ0tfRlJPTV9DSEFOTkVMKGNoYW5uZWwpOworfQorCitncnBjX21kZWxlbSAqZ3JwY19jaGFubmVsX2dldF9yZWZmZWRfc3RhdHVzX2VsZW0oZ3JwY19jaGFubmVsICpjaGFubmVsLCBpbnQgaSkgeworICBjaGFyIHRtcFtHUFJfTFRPQV9NSU5fQlVGU0laRV07CisgIHN3aXRjaCAoaSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18wOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18xOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18yOworICB9CisgIGdwcl9sdG9hKGksIHRtcCk7CisgIHJldHVybiBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoR1JQQ19NRFNUUl9HUlBDX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHRtcCkpOworfQorCit1aW50MzJfdCBncnBjX2NoYW5uZWxfZ2V0X21heF9tZXNzYWdlX2xlbmd0aChncnBjX2NoYW5uZWwgKmNoYW5uZWwpIHsKKyAgcmV0dXJuIGNoYW5uZWwtPm1heF9tZXNzYWdlX2xlbmd0aDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRlMGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NIQU5ORUxfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfQ0hBTk5FTF9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiCisKK2dycGNfY2hhbm5lbCAqZ3JwY19jaGFubmVsX2NyZWF0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY29uc3QgY2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja190eXBlIGNoYW5uZWxfc3RhY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqb3B0aW9uYWxfdHJhbnNwb3J0KTsKKworLyoqIEdldCBhIChib3Jyb3dlZCkgcG9pbnRlciB0byB0aGlzIGNoYW5uZWxzIHVuZGVybHlpbmcgY2hhbm5lbCBzdGFjayAqLworZ3JwY19jaGFubmVsX3N0YWNrICpncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soZ3JwY19jaGFubmVsICpjaGFubmVsKTsKKworLyoqIEdldCBhIGdycGNfbWRlbGVtIG9mIGdycGMtc3RhdHVzOiBYIHdoZXJlIFggaXMgdGhlIG51bWVyaWMgdmFsdWUgb2YKKyAgICBzdGF0dXNfY29kZS4KKworICAgIFRoZSByZXR1cm5lZCBlbGVtIGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIuICovCitncnBjX21kZWxlbSAqZ3JwY19jaGFubmVsX2dldF9yZWZmZWRfc3RhdHVzX2VsZW0oZ3JwY19jaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXNfY29kZSk7Cit1aW50MzJfdCBncnBjX2NoYW5uZWxfZ2V0X21heF9tZXNzYWdlX2xlbmd0aChncnBjX2NoYW5uZWwgKmNoYW5uZWwpOworCisjaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19jaGFubmVsX2ludGVybmFsX3JlZihncnBjX2NoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IGNoYXIgKnJlYXNvbik7Cit2b2lkIGdycGNfY2hhbm5lbF9pbnRlcm5hbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKKyNkZWZpbmUgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1JFRihjaGFubmVsLCByZWFzb24pIFwKKyAgZ3JwY19jaGFubmVsX2ludGVybmFsX3JlZihjaGFubmVsLCByZWFzb24pCisjZGVmaW5lIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2hhbm5lbCwgcmVhc29uKSBcCisgIGdycGNfY2hhbm5lbF9pbnRlcm5hbF91bnJlZihleGVjX2N0eCwgY2hhbm5lbCwgcmVhc29uKQorI2Vsc2UKK3ZvaWQgZ3JwY19jaGFubmVsX2ludGVybmFsX3JlZihncnBjX2NoYW5uZWwgKmNoYW5uZWwpOwordm9pZCBncnBjX2NoYW5uZWxfaW50ZXJuYWxfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWwgKmNoYW5uZWwpOworI2RlZmluZSBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGNoYW5uZWwsIHJlYXNvbikgXAorICBncnBjX2NoYW5uZWxfaW50ZXJuYWxfcmVmKGNoYW5uZWwpCisjZGVmaW5lIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2hhbm5lbCwgcmVhc29uKSBcCisgIGdycGNfY2hhbm5lbF9pbnRlcm5hbF91bnJlZihleGVjX2N0eCwgY2hhbm5lbCkKKyNlbmRpZgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NIQU5ORUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1ZDc2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKKworZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKKyAgICBncnBjX2NoYW5uZWwgKmNoYW5uZWwsIGludCB0cnlfdG9fY29ubmVjdCkgeworICAvKiBmb3J3YXJkIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgY2xpZW50IGNoYW5uZWwgKi8KKyAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmNsaWVudF9jaGFubmVsX2VsZW0gPQorICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2xhc3RfZWxlbWVudChncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCkpOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdGF0ZTsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZShjaGFubmVsPSVwLCB0cnlfdG9fY29ubmVjdD0lZCkiLCAyLAorICAgICAgKGNoYW5uZWwsIHRyeV90b19jb25uZWN0KSk7CisgIGlmIChjbGllbnRfY2hhbm5lbF9lbGVtLT5maWx0ZXIgPT0gJmdycGNfY2xpZW50X2NoYW5uZWxfZmlsdGVyKSB7CisgICAgc3RhdGUgPSBncnBjX2NsaWVudF9jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKKyAgICAgICAgJmV4ZWNfY3R4LCBjbGllbnRfY2hhbm5lbF9lbGVtLCB0cnlfdG9fY29ubmVjdCk7CisgICAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgICByZXR1cm4gc3RhdGU7CisgIH0KKyAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgImdycGNfY2hhbm5lbF9jaGVja19jb25uZWN0aXZpdHlfc3RhdGUgY2FsbGVkIG9uIHNvbWV0aGluZyB0aGF0IGlzICIKKyAgICAgICAgICAibm90IGEgKHUpY2xpZW50IGNoYW5uZWwsIGJ1dCAnJXMnIiwKKyAgICAgICAgICBjbGllbnRfY2hhbm5lbF9lbGVtLT5maWx0ZXItPm5hbWUpOworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICByZXR1cm4gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU7Cit9CisKK3R5cGVkZWYgZW51bSB7CisgIFdBSVRJTkcsCisgIENBTExJTkdfQkFDSywKKyAgQ0FMTElOR19CQUNLX0FORF9GSU5JU0hFRCwKKyAgQ0FMTEVEX0JBQ0sKK30gY2FsbGJhY2tfcGhhc2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3ByX211IG11OworICBjYWxsYmFja19waGFzZSBwaGFzZTsKKyAgaW50IHN1Y2Nlc3M7CisgIGdycGNfY2xvc3VyZSBvbl9jb21wbGV0ZTsKKyAgZ3JwY190aW1lciBhbGFybTsKKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGU7CisgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3E7CisgIGdycGNfY3FfY29tcGxldGlvbiBjb21wbGV0aW9uX3N0b3JhZ2U7CisgIGdycGNfY2hhbm5lbCAqY2hhbm5lbDsKKyAgdm9pZCAqdGFnOworfSBzdGF0ZV93YXRjaGVyOworCitzdGF0aWMgdm9pZCBkZWxldGVfc3RhdGVfd2F0Y2hlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgc3RhdGVfd2F0Y2hlciAqdykgeworICBncnBjX2NoYW5uZWxfZWxlbWVudCAqY2xpZW50X2NoYW5uZWxfZWxlbSA9IGdycGNfY2hhbm5lbF9zdGFja19sYXN0X2VsZW1lbnQoCisgICAgICBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2sody0+Y2hhbm5lbCkpOworICBpZiAoY2xpZW50X2NoYW5uZWxfZWxlbS0+ZmlsdGVyID09ICZncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlcikgeworICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgdy0+Y2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhdGNoX2NoYW5uZWxfY29ubmVjdGl2aXR5Iik7CisgIH0gZWxzZSB7CisgICAgYWJvcnQoKTsKKyAgfQorICBncHJfbXVfZGVzdHJveSgmdy0+bXUpOworICBncHJfZnJlZSh3KTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoZWRfY29tcGxldGlvbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqaWdub3JlZCkgeworICBpbnQgZGVsZXRlID0gMDsKKyAgc3RhdGVfd2F0Y2hlciAqdyA9IHB3OworICBncHJfbXVfbG9jaygmdy0+bXUpOworICBzd2l0Y2ggKHctPnBoYXNlKSB7CisgICAgY2FzZSBXQUlUSU5HOgorICAgIGNhc2UgQ0FMTEVEX0JBQ0s6CisgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKKyAgICBjYXNlIENBTExJTkdfQkFDSzoKKyAgICAgIHctPnBoYXNlID0gQ0FMTEVEX0JBQ0s7CisgICAgICBicmVhazsKKyAgICBjYXNlIENBTExJTkdfQkFDS19BTkRfRklOSVNIRUQ6CisgICAgICBkZWxldGUgPSAxOworICAgICAgYnJlYWs7CisgIH0KKyAgZ3ByX211X3VubG9jaygmdy0+bXUpOworCisgIGlmIChkZWxldGUpIHsKKyAgICBkZWxldGVfc3RhdGVfd2F0Y2hlcihleGVjX2N0eCwgdyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgcGFydGx5X2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHN0YXRlX3dhdGNoZXIgKncsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVlX3RvX2NvbXBsZXRpb24pIHsKKyAgaW50IGRlbGV0ZSA9IDA7CisKKyAgaWYgKGR1ZV90b19jb21wbGV0aW9uKSB7CisgICAgZ3JwY190aW1lcl9jYW5jZWwoZXhlY19jdHgsICZ3LT5hbGFybSk7CisgIH0KKworICBncHJfbXVfbG9jaygmdy0+bXUpOworICBpZiAoZHVlX3RvX2NvbXBsZXRpb24pIHsKKyAgICB3LT5zdWNjZXNzID0gMTsKKyAgfQorICBzd2l0Y2ggKHctPnBoYXNlKSB7CisgICAgY2FzZSBXQUlUSU5HOgorICAgICAgdy0+cGhhc2UgPSBDQUxMSU5HX0JBQ0s7CisgICAgICBncnBjX2NxX2VuZF9vcChleGVjX2N0eCwgdy0+Y3EsIHctPnRhZywgdy0+c3VjY2VzcywgZmluaXNoZWRfY29tcGxldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHcsICZ3LT5jb21wbGV0aW9uX3N0b3JhZ2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQUxMSU5HX0JBQ0s6CisgICAgICB3LT5waGFzZSA9IENBTExJTkdfQkFDS19BTkRfRklOSVNIRUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIENBTExJTkdfQkFDS19BTkRfRklOSVNIRUQ6CisgICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKKyAgICBjYXNlIENBTExFRF9CQUNLOgorICAgICAgZGVsZXRlID0gMTsKKyAgICAgIGJyZWFrOworICB9CisgIGdwcl9tdV91bmxvY2soJnctPm11KTsKKworICBpZiAoZGVsZXRlKSB7CisgICAgZGVsZXRlX3N0YXRlX3dhdGNoZXIoZXhlY19jdHgsIHcpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHdhdGNoX2NvbXBsZXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwdywgYm9vbCBzdWNjZXNzKSB7CisgIHBhcnRseV9kb25lKGV4ZWNfY3R4LCBwdywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfY29tcGxldGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnB3LCBib29sIHN1Y2Nlc3MpIHsKKyAgcGFydGx5X2RvbmUoZXhlY19jdHgsIHB3LCAwKTsKK30KKwordm9pZCBncnBjX2NoYW5uZWxfd2F0Y2hfY29ubmVjdGl2aXR5X3N0YXRlKAorICAgIGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgbGFzdF9vYnNlcnZlZF9zdGF0ZSwKKyAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsIHZvaWQgKnRhZykgeworICBncnBjX2NoYW5uZWxfZWxlbWVudCAqY2xpZW50X2NoYW5uZWxfZWxlbSA9CisgICAgICBncnBjX2NoYW5uZWxfc3RhY2tfbGFzdF9lbGVtZW50KGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFubmVsKSk7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIHN0YXRlX3dhdGNoZXIgKncgPSBncHJfbWFsbG9jKHNpemVvZigqdykpOworCisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfY2hhbm5lbF93YXRjaF9jb25uZWN0aXZpdHlfc3RhdGUoIgorICAgICAgImNoYW5uZWw9JXAsIGxhc3Rfb2JzZXJ2ZWRfc3RhdGU9JWQsICIKKyAgICAgICJkZWFkbGluZT1ncHJfdGltZXNwZWMgeyB0dl9zZWM6ICVsbGQsIHR2X25zZWM6ICVkLCBjbG9ja190eXBlOiAlZCB9LCAiCisgICAgICAiY3E9JXAsIHRhZz0lcCkiLAorICAgICAgNywgKGNoYW5uZWwsIChpbnQpbGFzdF9vYnNlcnZlZF9zdGF0ZSwgKGxvbmcgbG9uZylkZWFkbGluZS50dl9zZWMsCisgICAgICAgICAgKGludClkZWFkbGluZS50dl9uc2VjLCAoaW50KWRlYWRsaW5lLmNsb2NrX3R5cGUsIGNxLCB0YWcpKTsKKworICBncnBjX2NxX2JlZ2luX29wKGNxLCB0YWcpOworCisgIGdwcl9tdV9pbml0KCZ3LT5tdSk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZ3LT5vbl9jb21wbGV0ZSwgd2F0Y2hfY29tcGxldGUsIHcpOworICB3LT5waGFzZSA9IFdBSVRJTkc7CisgIHctPnN0YXRlID0gbGFzdF9vYnNlcnZlZF9zdGF0ZTsKKyAgdy0+c3VjY2VzcyA9IDA7CisgIHctPmNxID0gY3E7CisgIHctPnRhZyA9IHRhZzsKKyAgdy0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgZ3JwY190aW1lcl9pbml0KCZleGVjX2N0eCwgJnctPmFsYXJtLAorICAgICAgICAgICAgICAgICAgZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShkZWFkbGluZSwgR1BSX0NMT0NLX01PTk9UT05JQyksCisgICAgICAgICAgICAgICAgICB0aW1lb3V0X2NvbXBsZXRlLCB3LCBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKKworICBpZiAoY2xpZW50X2NoYW5uZWxfZWxlbS0+ZmlsdGVyID09ICZncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlcikgeworICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoY2hhbm5lbCwgIndhdGNoX2NoYW5uZWxfY29ubmVjdGl2aXR5Iik7CisgICAgZ3JwY19jbGllbnRfY2hhbm5lbF93YXRjaF9jb25uZWN0aXZpdHlfc3RhdGUoJmV4ZWNfY3R4LCBjbGllbnRfY2hhbm5lbF9lbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfcG9sbHNldChjcSksICZ3LT5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdy0+b25fY29tcGxldGUpOworICB9IGVsc2UgeworICAgIGFib3J0KCk7CisgIH0KKworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzY5ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKK3R5cGVkZWYgc3RydWN0IHN0YWdlX3Nsb3QgeworICBncnBjX2NoYW5uZWxfaW5pdF9zdGFnZSBmbjsKKyAgdm9pZCAqYXJnOworICBpbnQgcHJpb3JpdHk7CisgIHNpemVfdCBpbnNlcnRpb25fb3JkZXI7Cit9IHN0YWdlX3Nsb3Q7CisKK3R5cGVkZWYgc3RydWN0IHN0YWdlX3Nsb3RzIHsKKyAgc3RhZ2Vfc2xvdCAqc2xvdHM7CisgIHNpemVfdCBudW1fc2xvdHM7CisgIHNpemVfdCBjYXBfc2xvdHM7Cit9IHN0YWdlX3Nsb3RzOworCitzdGF0aWMgc3RhZ2Vfc2xvdHMgZ19zbG90c1tHUlBDX05VTV9DSEFOTkVMX1NUQUNLX1RZUEVTXTsKK3N0YXRpYyBib29sIGdfZmluYWxpemVkOworCit2b2lkIGdycGNfY2hhbm5lbF9pbml0X2luaXQodm9pZCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IEdSUENfTlVNX0NIQU5ORUxfU1RBQ0tfVFlQRVM7IGkrKykgeworICAgIGdfc2xvdHNbaV0uc2xvdHMgPSBOVUxMOworICAgIGdfc2xvdHNbaV0ubnVtX3Nsb3RzID0gMDsKKyAgICBnX3Nsb3RzW2ldLmNhcF9zbG90cyA9IDA7CisgIH0KKyAgZ19maW5hbGl6ZWQgPSBmYWxzZTsKK30KKwordm9pZCBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShncnBjX2NoYW5uZWxfc3RhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9pbml0X3N0YWdlIHN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzdGFnZV9hcmcpIHsKKyAgR1BSX0FTU0VSVCghZ19maW5hbGl6ZWQpOworICBpZiAoZ19zbG90c1t0eXBlXS5jYXBfc2xvdHMgPT0gZ19zbG90c1t0eXBlXS5udW1fc2xvdHMpIHsKKyAgICBnX3Nsb3RzW3R5cGVdLmNhcF9zbG90cyA9IEdQUl9NQVgoOCwgMyAqIGdfc2xvdHNbdHlwZV0uY2FwX3Nsb3RzIC8gMik7CisgICAgZ19zbG90c1t0eXBlXS5zbG90cyA9CisgICAgICAgIGdwcl9yZWFsbG9jKGdfc2xvdHNbdHlwZV0uc2xvdHMsCisgICAgICAgICAgICAgICAgICAgIGdfc2xvdHNbdHlwZV0uY2FwX3Nsb3RzICogc2l6ZW9mKCpnX3Nsb3RzW3R5cGVdLnNsb3RzKSk7CisgIH0KKyAgc3RhZ2Vfc2xvdCAqcyA9ICZnX3Nsb3RzW3R5cGVdLnNsb3RzW2dfc2xvdHNbdHlwZV0ubnVtX3Nsb3RzKytdOworICBzLT5pbnNlcnRpb25fb3JkZXIgPSBnX3Nsb3RzW3R5cGVdLm51bV9zbG90czsKKyAgcy0+cHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgcy0+Zm4gPSBzdGFnZTsKKyAgcy0+YXJnID0gc3RhZ2VfYXJnOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfc2xvdHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICBjb25zdCBzdGFnZV9zbG90ICpzYSA9IGE7CisgIGNvbnN0IHN0YWdlX3Nsb3QgKnNiID0gYjsKKworICBpbnQgYyA9IEdQUl9JQ01QKHNhLT5wcmlvcml0eSwgc2ItPnByaW9yaXR5KTsKKyAgaWYgKGMgIT0gMCkgcmV0dXJuIGM7CisgIHJldHVybiBHUFJfSUNNUChzYS0+aW5zZXJ0aW9uX29yZGVyLCBzYi0+aW5zZXJ0aW9uX29yZGVyKTsKK30KKwordm9pZCBncnBjX2NoYW5uZWxfaW5pdF9maW5hbGl6ZSh2b2lkKSB7CisgIEdQUl9BU1NFUlQoIWdfZmluYWxpemVkKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHUlBDX05VTV9DSEFOTkVMX1NUQUNLX1RZUEVTOyBpKyspIHsKKyAgICBxc29ydChnX3Nsb3RzW2ldLnNsb3RzLCBnX3Nsb3RzW2ldLm51bV9zbG90cywgc2l6ZW9mKCpnX3Nsb3RzW2ldLnNsb3RzKSwKKyAgICAgICAgICBjb21wYXJlX3Nsb3RzKTsKKyAgfQorICBnX2ZpbmFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX2luaXRfc2h1dGRvd24odm9pZCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IEdSUENfTlVNX0NIQU5ORUxfU1RBQ0tfVFlQRVM7IGkrKykgeworICAgIGdwcl9mcmVlKGdfc2xvdHNbaV0uc2xvdHMpOworICAgIGdfc2xvdHNbaV0uc2xvdHMgPSAodm9pZCAqKSh1aW50cHRyX3QpMHhkZWFkYmVlZjsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqbmFtZV9mb3JfdHlwZShncnBjX2NoYW5uZWxfc3RhY2tfdHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR1JQQ19DTElFTlRfQ0hBTk5FTDoKKyAgICAgIHJldHVybiAiQ0xJRU5UX0NIQU5ORUwiOworICAgIGNhc2UgR1JQQ19DTElFTlRfU1VCQ0hBTk5FTDoKKyAgICAgIHJldHVybiAiQ0xJRU5UX1NVQkNIQU5ORUwiOworICAgIGNhc2UgR1JQQ19TRVJWRVJfQ0hBTk5FTDoKKyAgICAgIHJldHVybiAiU0VSVkVSX0NIQU5ORUwiOworICAgIGNhc2UgR1JQQ19DTElFTlRfTEFNRV9DSEFOTkVMOgorICAgICAgcmV0dXJuICJDTElFTlRfTEFNRV9DSEFOTkVMIjsKKyAgICBjYXNlIEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMOgorICAgICAgcmV0dXJuICJDTElFTlRfRElSRUNUX0NIQU5ORUwiOworICAgIGNhc2UgR1JQQ19OVU1fQ0hBTk5FTF9TVEFDS19UWVBFUzoKKyAgICAgIGJyZWFrOworICB9CisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAiVU5LTk9XTiIpOworfQorCit2b2lkICpncnBjX2NoYW5uZWxfaW5pdF9jcmVhdGVfc3RhY2soCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbF9zdGFja190eXBlIHR5cGUsIHNpemVfdCBwcmVmaXhfYnl0ZXMsCisgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MsIGludCBpbml0aWFsX3JlZnMsIGdycGNfaW9tZ3JfY2JfZnVuYyBkZXN0cm95LAorICAgIHZvaWQgKmRlc3Ryb3lfYXJnLCBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KSB7CisgIEdQUl9BU1NFUlQoZ19maW5hbGl6ZWQpOworCisgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyID0gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfY3JlYXRlKCk7CisgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3NldF9uYW1lKGJ1aWxkZXIsIG5hbWVfZm9yX3R5cGUodHlwZSkpOworICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9zZXRfY2hhbm5lbF9hcmd1bWVudHMoYnVpbGRlciwgYXJncyk7CisgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3NldF90cmFuc3BvcnQoYnVpbGRlciwgdHJhbnNwb3J0KTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdfc2xvdHNbdHlwZV0ubnVtX3Nsb3RzOyBpKyspIHsKKyAgICBjb25zdCBzdGFnZV9zbG90ICpzbG90ID0gJmdfc2xvdHNbdHlwZV0uc2xvdHNbaV07CisgICAgaWYgKCFzbG90LT5mbihidWlsZGVyLCBzbG90LT5hcmcpKSB7CisgICAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9kZXN0cm95KGJ1aWxkZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2ZpbmlzaChleGVjX2N0eCwgYnVpbGRlciwgcHJlZml4X2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfcmVmcywgZGVzdHJveSwgZGVzdHJveV9hcmcpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmggYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ4MjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NIQU5ORUxfSU5JVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9DSEFOTkVMX0lOSVRfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKKworLy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgd2F5IGZvciBwbHVnaW5zIChhbmQgdGhlIGdycGMgY29yZSBsaWJyYXJ5IGl0c2VsZikKKy8vLyB0byByZWdpc3RlciBtdXRhdG9ycyBmb3IgY2hhbm5lbCBzdGFja3MuCisvLy8gSXQgYWxzbyBwcm92aWRlcyBhIHVuaXZlcnNhbCBlbnRyeSBwYXRoIHRvIHJ1biB0aG9zZSBtdXRhdG9ycyB0byBidWlsZAorLy8vIGEgY2hhbm5lbCBzdGFjayBmb3IgdmFyaW91cyBzdWJzeXN0ZW1zLgorCisvLy8gT25lIHN0YWdlIG9mIG11dGF0aW9uOiBjYWxsIGZ1bmN0aW9ucyBhZ2FpbnN0IFxhIGJ1aWxkZXIgdG8gaW5mbHVlbmNlIHRoZQorLy8vIGZpbmFsbHkgY29uc3RydWN0ZWQgY2hhbm5lbCBzdGFjawordHlwZWRlZiBib29sICgqZ3JwY19jaGFubmVsX2luaXRfc3RhZ2UpKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisKKy8vLyBHbG9iYWwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN5c3RlbQordm9pZCBncnBjX2NoYW5uZWxfaW5pdF9pbml0KHZvaWQpOworCisvLy8gUmVnaXN0ZXIgb25lIHN0YWdlIG9mIG11dGF0b3JzLgorLy8vIFN0YWdlcyBhcmUgcnVuIGluIHByaW9yaXR5IG9yZGVyIChsb3dlc3QgdG8gaGlnaGVzdCksIGFuZCB0aGVuIGluCisvLy8gcmVnaXN0cmF0aW9uIG9yZGVyIChpbiB0aGUgY2FzZSBvZiBhIHRpZSkuCisvLy8gU3RhZ2VzIGFyZSByZWdpc3RlcmVkIGFnYWluc3Qgb25lIG9mIHRoZSBwcmUtZGV0ZXJtaW5lZCBjaGFubmVsIHN0YWNrCisvLy8gdHlwZXMuCit2b2lkIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKGdycGNfY2hhbm5lbF9zdGFja190eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2luaXRfc3RhZ2Ugc3RhZ2VfZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN0YWdlX2FyZyk7CisKKy8vLyBGaW5hbGl6ZSByZWdpc3RyYXRpb24uIE5vIG1vcmUgY2FsbHMgdG8gZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UgYXJlCisvLy8gYWxsb3dlZC4KK3ZvaWQgZ3JwY19jaGFubmVsX2luaXRfZmluYWxpemUodm9pZCk7CisvLy8gU2h1dGRvd24gdGhlIGNoYW5uZWwgaW5pdCBzeXN0ZW0KK3ZvaWQgZ3JwY19jaGFubmVsX2luaXRfc2h1dGRvd24odm9pZCk7CisKKy8vLyBDb25zdHJ1Y3QgYSBjaGFubmVsIHN0YWNrIG9mIHNvbWUgc29ydDogc2VlIGNoYW5uZWxfc3RhY2suaCBmb3IgZGV0YWlscworLy8vIFxhIHR5cGUgaXMgdGhlIHR5cGUgb2YgY2hhbm5lbCBzdGFjayB0byBjcmVhdGUKKy8vLyBcYSBwcmVmaXhfYnl0ZXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBiZWZvcmUgdGhlIGNoYW5uZWwgc3RhY2sgdG8gYWxsb2NhdGUKKy8vLyBcYSBhcmdzIGFyZSBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyBmb3IgdGhlIGNoYW5uZWwgc3RhY2sKKy8vLyBcYSBpbml0aWFsX3JlZnMgaXMgdGhlIGluaXRpYWwgcmVmY291bnQgdG8gZ2l2ZSB0aGUgY2hhbm5lbCBzdGFjaworLy8vIFxhIGRlc3Ryb3kgYW5kIFxhIGRlc3Ryb3lfYXJnIHNwZWNpZnkgaG93IHRvIGRlc3Ryb3kgdGhlIGNoYW5uZWwgc3RhY2sKKy8vLyAgICBpZiBkZXN0cm95X2FyZyBpcyBOVUxMLCB0aGUgcmV0dXJuZWQgdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKKy8vLyAgICBzdWJzdGl0dXRlZAorLy8vIFxhIG9wdGlvbmFsX3RyYW5zcG9ydCBpcyBlaXRoZXIgTlVMTCBvciBhIGNvbnN0cnVjdGVkIHRyYW5zcG9ydCBvYmplY3QKKy8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmFzZSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCAodGhlIGFjdHVhbCBjaGFubmVsCisvLy8gc3RhY2sgb2JqZWN0IHdpbGwgYmUgcHJlZml4X2J5dGVzIHBhc3QgdGhhdCBwb2ludGVyKQordm9pZCAqZ3JwY19jaGFubmVsX2luaXRfY3JlYXRlX3N0YWNrKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfc3RhY2tfdHlwZSB0eXBlLCBzaXplX3QgcHJlZml4X2J5dGVzLAorICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLCBpbnQgaW5pdGlhbF9yZWZzLCBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwKKyAgICB2b2lkICpkZXN0cm95X2FyZywgZ3JwY190cmFuc3BvcnQgKm9wdGlvbmFsX3RyYW5zcG9ydCk7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfQ0hBTk5FTF9JTklUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4NjJjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKKyAgdm9pZCAqdGFnOworICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxOworICBncnBjX2NxX2NvbXBsZXRpb24gY29tcGxldGlvbl9zdG9yYWdlOworfSBwaW5nX3Jlc3VsdDsKKworc3RhdGljIHZvaWQgcGluZ19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpzdG9yYWdlKSB7CisgIGdwcl9mcmVlKGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkIHBpbmdfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKKyAgcGluZ19yZXN1bHQgKnByID0gYXJnOworICBncnBjX2NxX2VuZF9vcChleGVjX2N0eCwgcHItPmNxLCBwci0+dGFnLCBzdWNjZXNzLCBwaW5nX2Rlc3Ryb3ksIHByLAorICAgICAgICAgICAgICAgICAmcHItPmNvbXBsZXRpb25fc3RvcmFnZSk7Cit9CisKK3ZvaWQgZ3JwY19jaGFubmVsX3BpbmcoZ3JwY19jaGFubmVsICpjaGFubmVsLCBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0YWcsIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfdHJhbnNwb3J0X29wIG9wOworICBwaW5nX3Jlc3VsdCAqcHIgPSBncHJfbWFsbG9jKHNpemVvZigqcHIpKTsKKyAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKnRvcF9lbGVtID0KKyAgICAgIGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFubmVsKSwgMCk7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7CisgIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOworICBwci0+dGFnID0gdGFnOworICBwci0+Y3EgPSBjcTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnByLT5jbG9zdXJlLCBwaW5nX2RvbmUsIHByKTsKKyAgb3Auc2VuZF9waW5nID0gJnByLT5jbG9zdXJlOworICBvcC5iaW5kX3BvbGxzZXQgPSBncnBjX2NxX3BvbGxzZXQoY3EpOworICBncnBjX2NxX2JlZ2luX29wKGNxLCB0YWcpOworICB0b3BfZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfb3AoJmV4ZWNfY3R4LCB0b3BfZWxlbSwgJm9wKTsKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1ZDYwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisKK2Jvb2wgZ3JwY19jaGFubmVsX3N0YWNrX3R5cGVfaXNfY2xpZW50KGdycGNfY2hhbm5lbF9zdGFja190eXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHUlBDX0NMSUVOVF9DSEFOTkVMOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBHUlBDX0NMSUVOVF9TVUJDSEFOTkVMOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBHUlBDX0NMSUVOVF9MQU1FX0NIQU5ORUw6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBHUlBDX1NFUlZFUl9DSEFOTkVMOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgR1JQQ19OVU1fQ0hBTk5FTF9TVEFDS19UWVBFUzoKKyAgICAgIGJyZWFrOworICB9CisgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiB0cnVlOyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjA4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaApAQCAtMCwwICsxLDU4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9DSEFOTkVMX1NUQUNLX1RZUEVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfQ0hBTk5FTF9TVEFDS19UWVBFX0gKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKwordHlwZWRlZiBlbnVtIHsKKyAgLy8gbm9ybWFsIHRvcC1oYWxmIGNsaWVudCBjaGFubmVsIHdpdGggbG9hZC1iYWxhbmNpbmcsIGNvbm5lY3Rpb24gbWFuYWdlbWVudAorICBHUlBDX0NMSUVOVF9DSEFOTkVMLAorICAvLyBib3R0b20taGFsZiBvZiBhIGNsaWVudCBjaGFubmVsOiBldmVyeXRoaW5nIHRoYXQgaGFwcGVucyBwb3N0LWxvYWQKKyAgLy8gYmFsYW5jaW5nIChib3VuZCB0byBhIHNwZWNpZmljIHRyYW5zcG9ydCkKKyAgR1JQQ19DTElFTlRfU1VCQ0hBTk5FTCwKKyAgLy8gYSBwZXJtYW5lbnRseSBicm9rZW4gY2xpZW50IGNoYW5uZWwKKyAgR1JQQ19DTElFTlRfTEFNRV9DSEFOTkVMLAorICAvLyBhIGRpcmVjdGx5IGNvbm5lY3RlZCBjbGllbnQgY2hhbm5lbCAod2l0aG91dCBsb2FkLWJhbGFuY2luZywgZGlyZWN0bHkgdGFsa3MKKyAgLy8gdG8gYSB0cmFuc3BvcnQpCisgIEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMLAorICAvLyBzZXJ2ZXIgc2lkZSBjaGFubmVsCisgIEdSUENfU0VSVkVSX0NIQU5ORUwsCisgIC8vIG11c3QgYmUgbGFzdAorICBHUlBDX05VTV9DSEFOTkVMX1NUQUNLX1RZUEVTCit9IGdycGNfY2hhbm5lbF9zdGFja190eXBlOworCitib29sIGdycGNfY2hhbm5lbF9zdGFja190eXBlX2lzX2NsaWVudChncnBjX2NoYW5uZWxfc3RhY2tfdHlwZSB0eXBlKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9DSEFOTkVMX1NUQUNLX1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDcwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2F0bS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19wb2xsc2V0X3dvcmtlciAqKndvcmtlcjsKKyAgdm9pZCAqdGFnOworfSBwbHVja2VyOworCisvKiBDb21wbGV0aW9uIHF1ZXVlIHN0cnVjdHVyZSAqLworc3RydWN0IGdycGNfY29tcGxldGlvbl9xdWV1ZSB7CisgIC8qKiBvd25lZCBieSBwb2xsc2V0ICovCisgIGdwcl9tdSAqbXU7CisgIC8qKiBjb21wbGV0ZWQgZXZlbnRzICovCisgIGdycGNfY3FfY29tcGxldGlvbiBjb21wbGV0ZWRfaGVhZDsKKyAgZ3JwY19jcV9jb21wbGV0aW9uICpjb21wbGV0ZWRfdGFpbDsKKyAgLyoqIE51bWJlciBvZiBwZW5kaW5nIGV2ZW50cyAoKzEgaWYgd2UncmUgbm90IHNodXRkb3duKSAqLworICBncHJfcmVmY291bnQgcGVuZGluZ19ldmVudHM7CisgIC8qKiBPbmNlIG93bmluZ19yZWZzIGRyb3BzIHRvIHplcm8sIHdlIHdpbGwgZGVzdHJveSB0aGUgY3EgKi8KKyAgZ3ByX3JlZmNvdW50IG93bmluZ19yZWZzOworICAvKiogMCBpbml0aWFsbHksIDEgb25jZSB3ZSd2ZSBiZWd1biBzaHV0dGluZyBkb3duICovCisgIGludCBzaHV0ZG93bjsKKyAgaW50IHNodXRkb3duX2NhbGxlZDsKKyAgaW50IGlzX3NlcnZlcl9jcTsKKyAgaW50IG51bV9wbHVja2VyczsKKyAgcGx1Y2tlciBwbHVja2Vyc1tHUlBDX01BWF9DT01QTEVUSU9OX1FVRVVFX1BMVUNLRVJTXTsKKyAgZ3JwY19jbG9zdXJlIHBvbGxzZXRfc2h1dGRvd25fZG9uZTsKKworI2lmbmRlZiBOREVCVUcKKyAgdm9pZCAqKm91dHN0YW5kaW5nX3RhZ3M7CisgIHNpemVfdCBvdXRzdGFuZGluZ190YWdfY291bnQ7CisgIHNpemVfdCBvdXRzdGFuZGluZ190YWdfY2FwYWNpdHk7CisjZW5kaWYKKworICBncnBjX2NvbXBsZXRpb25fcXVldWUgKm5leHRfZnJlZTsKK307CisKKyNkZWZpbmUgUE9MTFNFVF9GUk9NX0NRKGNxKSAoKGdycGNfcG9sbHNldCAqKShjcSArIDEpKQorCitzdGF0aWMgZ3ByX211IGdfZnJlZWxpc3RfbXU7CitzdGF0aWMgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpnX2ZyZWVsaXN0OworCitzdGF0aWMgdm9pZCBvbl9wb2xsc2V0X3NodXRkb3duX2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7CisKK3ZvaWQgZ3JwY19jcV9nbG9iYWxfaW5pdCh2b2lkKSB7IGdwcl9tdV9pbml0KCZnX2ZyZWVsaXN0X211KTsgfQorCit2b2lkIGdycGNfY3FfZ2xvYmFsX3NodXRkb3duKHZvaWQpIHsKKyAgZ3ByX211X2Rlc3Ryb3koJmdfZnJlZWxpc3RfbXUpOworICB3aGlsZSAoZ19mcmVlbGlzdCkgeworICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqbmV4dCA9IGdfZnJlZWxpc3QtPm5leHRfZnJlZTsKKyAgICBncnBjX3BvbGxzZXRfZGVzdHJveShQT0xMU0VUX0ZST01fQ1EoZ19mcmVlbGlzdCkpOworI2lmbmRlZiBOREVCVUcKKyAgICBncHJfZnJlZShnX2ZyZWVsaXN0LT5vdXRzdGFuZGluZ190YWdzKTsKKyNlbmRpZgorICAgIGdwcl9mcmVlKGdfZnJlZWxpc3QpOworICAgIGdfZnJlZWxpc3QgPSBuZXh0OworICB9Cit9CisKK3N0cnVjdCBncnBjX2NxX2FsYXJtIHsKKyAgZ3JwY190aW1lciBhbGFybTsKKyAgZ3JwY19jcV9jb21wbGV0aW9uIGNvbXBsZXRpb247CisgIC8qKiBjb21wbGV0aW9uIHF1ZXVlIHdoZXJlIGV2ZW50cyBhYm91dCB0aGlzIGFsYXJtIHdpbGwgYmUgcG9zdGVkICovCisgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3E7CisgIC8qKiB1c2VyIHN1cHBsaWVkIHRhZyAqLworICB2b2lkICp0YWc7Cit9OworCitncnBjX2NvbXBsZXRpb25fcXVldWUgKmdycGNfY29tcGxldGlvbl9xdWV1ZV9jcmVhdGUodm9pZCAqcmVzZXJ2ZWQpIHsKKyAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYzsKKyAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOworCisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX2NyZWF0ZSIsIDApOworCisgIEdSUENfQVBJX1RSQUNFKCJncnBjX2NvbXBsZXRpb25fcXVldWVfY3JlYXRlKHJlc2VydmVkPSVwKSIsIDEsIChyZXNlcnZlZCkpOworCisgIGdwcl9tdV9sb2NrKCZnX2ZyZWVsaXN0X211KTsKKyAgaWYgKGdfZnJlZWxpc3QgPT0gTlVMTCkgeworICAgIGdwcl9tdV91bmxvY2soJmdfZnJlZWxpc3RfbXUpOworCisgICAgY2MgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2NvbXBsZXRpb25fcXVldWUpICsgZ3JwY19wb2xsc2V0X3NpemUoKSk7CisgICAgZ3JwY19wb2xsc2V0X2luaXQoUE9MTFNFVF9GUk9NX0NRKGNjKSwgJmNjLT5tdSk7CisjaWZuZGVmIE5ERUJVRworICAgIGNjLT5vdXRzdGFuZGluZ190YWdzID0gTlVMTDsKKyAgICBjYy0+b3V0c3RhbmRpbmdfdGFnX2NhcGFjaXR5ID0gMDsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGNjID0gZ19mcmVlbGlzdDsKKyAgICBnX2ZyZWVsaXN0ID0gZ19mcmVlbGlzdC0+bmV4dF9mcmVlOworICAgIGdwcl9tdV91bmxvY2soJmdfZnJlZWxpc3RfbXUpOworICAgIC8qIHBvbGxzZXQgYWxyZWFkeSBpbml0aWFsaXplZCAqLworICB9CisKKyAgLyogSW5pdGlhbCByZWYgaXMgZHJvcHBlZCBieSBncnBjX2NvbXBsZXRpb25fcXVldWVfc2h1dGRvd24gKi8KKyAgZ3ByX3JlZl9pbml0KCZjYy0+cGVuZGluZ19ldmVudHMsIDEpOworICAvKiBPbmUgZm9yIGRlc3Ryb3koKSwgb25lIGZvciBwb2xsc2V0X3NodXRkb3duICovCisgIGdwcl9yZWZfaW5pdCgmY2MtPm93bmluZ19yZWZzLCAyKTsKKyAgY2MtPmNvbXBsZXRlZF90YWlsID0gJmNjLT5jb21wbGV0ZWRfaGVhZDsKKyAgY2MtPmNvbXBsZXRlZF9oZWFkLm5leHQgPSAodWludHB0cl90KWNjLT5jb21wbGV0ZWRfdGFpbDsKKyAgY2MtPnNodXRkb3duID0gMDsKKyAgY2MtPnNodXRkb3duX2NhbGxlZCA9IDA7CisgIGNjLT5pc19zZXJ2ZXJfY3EgPSAwOworICBjYy0+bnVtX3BsdWNrZXJzID0gMDsKKyNpZm5kZWYgTkRFQlVHCisgIGNjLT5vdXRzdGFuZGluZ190YWdfY291bnQgPSAwOworI2VuZGlmCisgIGdycGNfY2xvc3VyZV9pbml0KCZjYy0+cG9sbHNldF9zaHV0ZG93bl9kb25lLCBvbl9wb2xsc2V0X3NodXRkb3duX2RvbmUsIGNjKTsKKworICBHUFJfVElNRVJfRU5EKCJncnBjX2NvbXBsZXRpb25fcXVldWVfY3JlYXRlIiwgMCk7CisKKyAgcmV0dXJuIGNjOworfQorCisjaWZkZWYgR1JQQ19DUV9SRUZfQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19jcV9pbnRlcm5hbF9yZWYoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgY29uc3QgY2hhciAqcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJDUTolcCAgIHJlZiAlZCAtPiAlZCAlcyIsIGNjLAorICAgICAgICAgIChpbnQpY2MtPm93bmluZ19yZWZzLmNvdW50LCAoaW50KWNjLT5vd25pbmdfcmVmcy5jb3VudCArIDEsIHJlYXNvbik7CisjZWxzZQordm9pZCBncnBjX2NxX2ludGVybmFsX3JlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKSB7CisjZW5kaWYKKyAgZ3ByX3JlZigmY2MtPm93bmluZ19yZWZzKTsKK30KKworc3RhdGljIHZvaWQgb25fcG9sbHNldF9zaHV0ZG93bl9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MgPSBhcmc7CisgIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoY2MsICJwb2xsc2V0X2Rlc3Ryb3kiKTsKK30KKworI2lmZGVmIEdSUENfQ1FfUkVGX0NPVU5UX0RFQlVHCit2b2lkIGdycGNfY3FfaW50ZXJuYWxfdW5yZWYoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgY29uc3QgY2hhciAqcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7CisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIkNROiVwIHVucmVmICVkIC0+ICVkICVzIiwgY2MsCisgICAgICAgICAgKGludCljYy0+b3duaW5nX3JlZnMuY291bnQsIChpbnQpY2MtPm93bmluZ19yZWZzLmNvdW50IC0gMSwgcmVhc29uKTsKKyNlbHNlCit2b2lkIGdycGNfY3FfaW50ZXJuYWxfdW5yZWYoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYykgeworI2VuZGlmCisgIGlmIChncHJfdW5yZWYoJmNjLT5vd25pbmdfcmVmcykpIHsKKyAgICBHUFJfQVNTRVJUKGNjLT5jb21wbGV0ZWRfaGVhZC5uZXh0ID09ICh1aW50cHRyX3QpJmNjLT5jb21wbGV0ZWRfaGVhZCk7CisgICAgZ3JwY19wb2xsc2V0X3Jlc2V0KFBPTExTRVRfRlJPTV9DUShjYykpOworICAgIGdwcl9tdV9sb2NrKCZnX2ZyZWVsaXN0X211KTsKKyAgICBjYy0+bmV4dF9mcmVlID0gZ19mcmVlbGlzdDsKKyAgICBnX2ZyZWVsaXN0ID0gY2M7CisgICAgZ3ByX211X3VubG9jaygmZ19mcmVlbGlzdF9tdSk7CisgIH0KK30KKwordm9pZCBncnBjX2NxX2JlZ2luX29wKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIHZvaWQgKnRhZykgeworI2lmbmRlZiBOREVCVUcKKyAgZ3ByX211X2xvY2soY2MtPm11KTsKKyAgR1BSX0FTU0VSVCghY2MtPnNodXRkb3duX2NhbGxlZCk7CisgIGlmIChjYy0+b3V0c3RhbmRpbmdfdGFnX2NvdW50ID09IGNjLT5vdXRzdGFuZGluZ190YWdfY2FwYWNpdHkpIHsKKyAgICBjYy0+b3V0c3RhbmRpbmdfdGFnX2NhcGFjaXR5ID0gR1BSX01BWCg0LCAyICogY2MtPm91dHN0YW5kaW5nX3RhZ19jYXBhY2l0eSk7CisgICAgY2MtPm91dHN0YW5kaW5nX3RhZ3MgPQorICAgICAgICBncHJfcmVhbGxvYyhjYy0+b3V0c3RhbmRpbmdfdGFncywgc2l6ZW9mKCpjYy0+b3V0c3RhbmRpbmdfdGFncykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLT5vdXRzdGFuZGluZ190YWdfY2FwYWNpdHkpOworICB9CisgIGNjLT5vdXRzdGFuZGluZ190YWdzW2NjLT5vdXRzdGFuZGluZ190YWdfY291bnQrK10gPSB0YWc7CisgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKKyNlbmRpZgorICBncHJfcmVmKCZjYy0+cGVuZGluZ19ldmVudHMpOworfQorCisvKiBTaWduYWwgdGhlIGVuZCBvZiBhbiBvcGVyYXRpb24gLSBpZiB0aGlzIGlzIHRoZSBsYXN0IHdhaXRpbmctdG8tYmUtcXVldWVkCisgICBldmVudCwgdGhlbiBlbnRlciBzaHV0ZG93biBtb2RlICovCisvKiBRdWV1ZSBhIEdSUENfT1BfQ09NUExFVEVEIG9wZXJhdGlvbiAqLwordm9pZCBncnBjX2NxX2VuZF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGFnLCBpbnQgc3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvbmUpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpkb25lX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqc3RvcmFnZSksCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRvbmVfYXJnLCBncnBjX2NxX2NvbXBsZXRpb24gKnN0b3JhZ2UpIHsKKyAgaW50IHNodXRkb3duOworICBpbnQgaTsKKyAgZ3JwY19wb2xsc2V0X3dvcmtlciAqcGx1Y2tfd29ya2VyOworI2lmbmRlZiBOREVCVUcKKyAgaW50IGZvdW5kID0gMDsKKyNlbmRpZgorCisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jcV9lbmRfb3AiLCAwKTsKKworICBzdG9yYWdlLT50YWcgPSB0YWc7CisgIHN0b3JhZ2UtPmRvbmUgPSBkb25lOworICBzdG9yYWdlLT5kb25lX2FyZyA9IGRvbmVfYXJnOworICBzdG9yYWdlLT5uZXh0ID0KKyAgICAgICgodWludHB0cl90KSZjYy0+Y29tcGxldGVkX2hlYWQpIHwgKCh1aW50cHRyX3QpKHN1Y2Nlc3MgIT0gMCkpOworCisgIGdwcl9tdV9sb2NrKGNjLT5tdSk7CisjaWZuZGVmIE5ERUJVRworICBmb3IgKGkgPSAwOyBpIDwgKGludCljYy0+b3V0c3RhbmRpbmdfdGFnX2NvdW50OyBpKyspIHsKKyAgICBpZiAoY2MtPm91dHN0YW5kaW5nX3RhZ3NbaV0gPT0gdGFnKSB7CisgICAgICBjYy0+b3V0c3RhbmRpbmdfdGFnX2NvdW50LS07CisgICAgICBHUFJfU1dBUCh2b2lkICosIGNjLT5vdXRzdGFuZGluZ190YWdzW2ldLAorICAgICAgICAgICAgICAgY2MtPm91dHN0YW5kaW5nX3RhZ3NbY2MtPm91dHN0YW5kaW5nX3RhZ19jb3VudF0pOworICAgICAgZm91bmQgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEdQUl9BU1NFUlQoZm91bmQpOworI2VuZGlmCisgIHNodXRkb3duID0gZ3ByX3VucmVmKCZjYy0+cGVuZGluZ19ldmVudHMpOworICBpZiAoIXNodXRkb3duKSB7CisgICAgY2MtPmNvbXBsZXRlZF90YWlsLT5uZXh0ID0KKyAgICAgICAgKCh1aW50cHRyX3Qpc3RvcmFnZSkgfCAoMXUgJiAodWludHB0cl90KWNjLT5jb21wbGV0ZWRfdGFpbC0+bmV4dCk7CisgICAgY2MtPmNvbXBsZXRlZF90YWlsID0gc3RvcmFnZTsKKyAgICBwbHVja193b3JrZXIgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBjYy0+bnVtX3BsdWNrZXJzOyBpKyspIHsKKyAgICAgIGlmIChjYy0+cGx1Y2tlcnNbaV0udGFnID09IHRhZykgeworICAgICAgICBwbHVja193b3JrZXIgPSAqY2MtPnBsdWNrZXJzW2ldLndvcmtlcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGdycGNfcG9sbHNldF9raWNrKFBPTExTRVRfRlJPTV9DUShjYyksIHBsdWNrX3dvcmtlcik7CisgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOworICB9IGVsc2UgeworICAgIGNjLT5jb21wbGV0ZWRfdGFpbC0+bmV4dCA9CisgICAgICAgICgodWludHB0cl90KXN0b3JhZ2UpIHwgKDF1ICYgKHVpbnRwdHJfdCljYy0+Y29tcGxldGVkX3RhaWwtPm5leHQpOworICAgIGNjLT5jb21wbGV0ZWRfdGFpbCA9IHN0b3JhZ2U7CisgICAgR1BSX0FTU0VSVCghY2MtPnNodXRkb3duKTsKKyAgICBHUFJfQVNTRVJUKGNjLT5zaHV0ZG93bl9jYWxsZWQpOworICAgIGNjLT5zaHV0ZG93biA9IDE7CisgICAgZ3JwY19wb2xsc2V0X3NodXRkb3duKGV4ZWNfY3R4LCBQT0xMU0VUX0ZST01fQ1EoY2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2MtPnBvbGxzZXRfc2h1dGRvd25fZG9uZSk7CisgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOworICB9CisKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19jcV9lbmRfb3AiLCAwKTsKK30KKworZ3JwY19ldmVudCBncnBjX2NvbXBsZXRpb25fcXVldWVfbmV4dChncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIHZvaWQgKnJlc2VydmVkKSB7CisgIGdycGNfZXZlbnQgcmV0OworICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIgPSBOVUxMOworICBpbnQgZmlyc3RfbG9vcCA9IDE7CisgIGdwcl90aW1lc3BlYyBub3c7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NvbXBsZXRpb25fcXVldWVfbmV4dCIsIDApOworCisgIEdSUENfQVBJX1RSQUNFKAorICAgICAgImdycGNfY29tcGxldGlvbl9xdWV1ZV9uZXh0KCIKKyAgICAgICJjYz0lcCwgIgorICAgICAgImRlYWRsaW5lPWdwcl90aW1lc3BlYyB7IHR2X3NlYzogJWxsZCwgdHZfbnNlYzogJWQsIGNsb2NrX3R5cGU6ICVkIH0sICIKKyAgICAgICJyZXNlcnZlZD0lcCkiLAorICAgICAgNSwgKGNjLCAobG9uZyBsb25nKWRlYWRsaW5lLnR2X3NlYywgKGludClkZWFkbGluZS50dl9uc2VjLAorICAgICAgICAgIChpbnQpZGVhZGxpbmUuY2xvY2tfdHlwZSwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOworCisgIGRlYWRsaW5lID0gZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShkZWFkbGluZSwgR1BSX0NMT0NLX01PTk9UT05JQyk7CisKKyAgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY2MsICJuZXh0Iik7CisgIGdwcl9tdV9sb2NrKGNjLT5tdSk7CisgIGZvciAoOzspIHsKKyAgICBpZiAoY2MtPmNvbXBsZXRlZF90YWlsICE9ICZjYy0+Y29tcGxldGVkX2hlYWQpIHsKKyAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqYyA9IChncnBjX2NxX2NvbXBsZXRpb24gKiljYy0+Y29tcGxldGVkX2hlYWQubmV4dDsKKyAgICAgIGNjLT5jb21wbGV0ZWRfaGVhZC5uZXh0ID0gYy0+bmV4dCAmIH4odWludHB0cl90KTE7CisgICAgICBpZiAoYyA9PSBjYy0+Y29tcGxldGVkX3RhaWwpIHsKKyAgICAgICAgY2MtPmNvbXBsZXRlZF90YWlsID0gJmNjLT5jb21wbGV0ZWRfaGVhZDsKKyAgICAgIH0KKyAgICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKKyAgICAgIHJldC50eXBlID0gR1JQQ19PUF9DT01QTEVURTsKKyAgICAgIHJldC5zdWNjZXNzID0gYy0+bmV4dCAmIDF1OworICAgICAgcmV0LnRhZyA9IGMtPnRhZzsKKyAgICAgIGMtPmRvbmUoJmV4ZWNfY3R4LCBjLT5kb25lX2FyZywgYyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGNjLT5zaHV0ZG93bikgeworICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOworICAgICAgbWVtc2V0KCZyZXQsIDAsIHNpemVvZihyZXQpKTsKKyAgICAgIHJldC50eXBlID0gR1JQQ19RVUVVRV9TSFVURE9XTjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBub3cgPSBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpOworICAgIGlmICghZmlyc3RfbG9vcCAmJiBncHJfdGltZV9jbXAobm93LCBkZWFkbGluZSkgPj0gMCkgeworICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOworICAgICAgbWVtc2V0KCZyZXQsIDAsIHNpemVvZihyZXQpKTsKKyAgICAgIHJldC50eXBlID0gR1JQQ19RVUVVRV9USU1FT1VUOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGZpcnN0X2xvb3AgPSAwOworICAgIC8qIENoZWNrIGFsYXJtcyAtIHRoZXNlIGFyZSBhIGdsb2JhbCByZXNvdXJjZSBzbyB3ZSBqdXN0IHBpbmcKKyAgICAgICBlYWNoIHRpbWUgdGhyb3VnaCBvbiBldmVyeSBwb2xsc2V0LgorICAgICAgIE1heSB1cGRhdGUgZGVhZGxpbmUgdG8gZW5zdXJlIHRpbWVseSB3YWtldXBzLgorICAgICAgIFRPRE8oY3RpbGxlcik6IGNhbiB0aGlzIHdvcmsgYmUgbG9jYWxpemVkPyAqLworICAgIGdwcl90aW1lc3BlYyBpdGVyYXRpb25fZGVhZGxpbmUgPSBkZWFkbGluZTsKKyAgICBpZiAoZ3JwY190aW1lcl9jaGVjaygmZXhlY19jdHgsIG5vdywgJml0ZXJhdGlvbl9kZWFkbGluZSkpIHsKKyAgICAgIEdQUl9USU1FUl9NQVJLKCJhbGFybV90cmlnZ2VyZWQiLCAwKTsKKyAgICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKKyAgICAgIGdycGNfZXhlY19jdHhfZmx1c2goJmV4ZWNfY3R4KTsKKyAgICAgIGdwcl9tdV9sb2NrKGNjLT5tdSk7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgeworICAgICAgZ3JwY19wb2xsc2V0X3dvcmsoJmV4ZWNfY3R4LCBQT0xMU0VUX0ZST01fQ1EoY2MpLCAmd29ya2VyLCBub3csCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25fZGVhZGxpbmUpOworICAgIH0KKyAgfQorICBHUlBDX1NVUkZBQ0VfVFJBQ0VfUkVUVVJORURfRVZFTlQoY2MsICZyZXQpOworICBHUlBDX0NRX0lOVEVSTkFMX1VOUkVGKGNjLCAibmV4dCIpOworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworCisgIEdQUl9USU1FUl9FTkQoImdycGNfY29tcGxldGlvbl9xdWV1ZV9uZXh0IiwgMCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGRfcGx1Y2tlcihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjLCB2b2lkICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKip3b3JrZXIpIHsKKyAgaWYgKGNjLT5udW1fcGx1Y2tlcnMgPT0gR1JQQ19NQVhfQ09NUExFVElPTl9RVUVVRV9QTFVDS0VSUykgeworICAgIHJldHVybiAwOworICB9CisgIGNjLT5wbHVja2Vyc1tjYy0+bnVtX3BsdWNrZXJzXS50YWcgPSB0YWc7CisgIGNjLT5wbHVja2Vyc1tjYy0+bnVtX3BsdWNrZXJzXS53b3JrZXIgPSB3b3JrZXI7CisgIGNjLT5udW1fcGx1Y2tlcnMrKzsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9wbHVja2VyKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIHZvaWQgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldF93b3JrZXIgKip3b3JrZXIpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBjYy0+bnVtX3BsdWNrZXJzOyBpKyspIHsKKyAgICBpZiAoY2MtPnBsdWNrZXJzW2ldLnRhZyA9PSB0YWcgJiYgY2MtPnBsdWNrZXJzW2ldLndvcmtlciA9PSB3b3JrZXIpIHsKKyAgICAgIGNjLT5udW1fcGx1Y2tlcnMtLTsKKyAgICAgIEdQUl9TV0FQKHBsdWNrZXIsIGNjLT5wbHVja2Vyc1tpXSwgY2MtPnBsdWNrZXJzW2NjLT5udW1fcGx1Y2tlcnNdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICk7Cit9CisKK2dycGNfZXZlbnQgZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3BsdWNrKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIHZvaWQgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwgdm9pZCAqcmVzZXJ2ZWQpIHsKKyAgZ3JwY19ldmVudCByZXQ7CisgIGdycGNfY3FfY29tcGxldGlvbiAqYzsKKyAgZ3JwY19jcV9jb21wbGV0aW9uICpwcmV2OworICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIgPSBOVUxMOworICBncHJfdGltZXNwZWMgbm93OworICBpbnQgZmlyc3RfbG9vcCA9IDE7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NvbXBsZXRpb25fcXVldWVfcGx1Y2siLCAwKTsKKworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX2NvbXBsZXRpb25fcXVldWVfcGx1Y2soIgorICAgICAgImNjPSVwLCB0YWc9JXAsICIKKyAgICAgICJkZWFkbGluZT1ncHJfdGltZXNwZWMgeyB0dl9zZWM6ICVsbGQsIHR2X25zZWM6ICVkLCBjbG9ja190eXBlOiAlZCB9LCAiCisgICAgICAicmVzZXJ2ZWQ9JXApIiwKKyAgICAgIDYsIChjYywgdGFnLCAobG9uZyBsb25nKWRlYWRsaW5lLnR2X3NlYywgKGludClkZWFkbGluZS50dl9uc2VjLAorICAgICAgICAgIChpbnQpZGVhZGxpbmUuY2xvY2tfdHlwZSwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOworCisgIGRlYWRsaW5lID0gZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShkZWFkbGluZSwgR1BSX0NMT0NLX01PTk9UT05JQyk7CisKKyAgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY2MsICJwbHVjayIpOworICBncHJfbXVfbG9jayhjYy0+bXUpOworICBmb3IgKDs7KSB7CisgICAgcHJldiA9ICZjYy0+Y29tcGxldGVkX2hlYWQ7CisgICAgd2hpbGUgKChjID0gKGdycGNfY3FfY29tcGxldGlvbiAqKShwcmV2LT5uZXh0ICYgfih1aW50cHRyX3QpMSkpICE9CisgICAgICAgICAgICZjYy0+Y29tcGxldGVkX2hlYWQpIHsKKyAgICAgIGlmIChjLT50YWcgPT0gdGFnKSB7CisgICAgICAgIHByZXYtPm5leHQgPSAocHJldi0+bmV4dCAmICh1aW50cHRyX3QpMSkgfCAoYy0+bmV4dCAmIH4odWludHB0cl90KTEpOworICAgICAgICBpZiAoYyA9PSBjYy0+Y29tcGxldGVkX3RhaWwpIHsKKyAgICAgICAgICBjYy0+Y29tcGxldGVkX3RhaWwgPSBwcmV2OworICAgICAgICB9CisgICAgICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKKyAgICAgICAgcmV0LnR5cGUgPSBHUlBDX09QX0NPTVBMRVRFOworICAgICAgICByZXQuc3VjY2VzcyA9IGMtPm5leHQgJiAxdTsKKyAgICAgICAgcmV0LnRhZyA9IGMtPnRhZzsKKyAgICAgICAgYy0+ZG9uZSgmZXhlY19jdHgsIGMtPmRvbmVfYXJnLCBjKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgcHJldiA9IGM7CisgICAgfQorICAgIGlmIChjYy0+c2h1dGRvd24pIHsKKyAgICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKKyAgICAgIG1lbXNldCgmcmV0LCAwLCBzaXplb2YocmV0KSk7CisgICAgICByZXQudHlwZSA9IEdSUENfUVVFVUVfU0hVVERPV047CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFhZGRfcGx1Y2tlcihjYywgdGFnLCAmd29ya2VyKSkgeworICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsCisgICAgICAgICAgICAgICJUb28gbWFueSBvdXRzdGFuZGluZyBncnBjX2NvbXBsZXRpb25fcXVldWVfcGx1Y2sgY2FsbHM6IG1heGltdW0gIgorICAgICAgICAgICAgICAiaXMgJWQiLAorICAgICAgICAgICAgICBHUlBDX01BWF9DT01QTEVUSU9OX1FVRVVFX1BMVUNLRVJTKTsKKyAgICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKKyAgICAgIG1lbXNldCgmcmV0LCAwLCBzaXplb2YocmV0KSk7CisgICAgICAvKiBUT0RPKGN0aWxsZXIpOiBzaG91bGQgd2UgdXNlIGEgZGlmZmVyZW50IHJlc3VsdCBoZXJlICovCisgICAgICByZXQudHlwZSA9IEdSUENfUVVFVUVfVElNRU9VVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBub3cgPSBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpOworICAgIGlmICghZmlyc3RfbG9vcCAmJiBncHJfdGltZV9jbXAobm93LCBkZWFkbGluZSkgPj0gMCkgeworICAgICAgZGVsX3BsdWNrZXIoY2MsIHRhZywgJndvcmtlcik7CisgICAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7CisgICAgICBtZW1zZXQoJnJldCwgMCwgc2l6ZW9mKHJldCkpOworICAgICAgcmV0LnR5cGUgPSBHUlBDX1FVRVVFX1RJTUVPVVQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZmlyc3RfbG9vcCA9IDA7CisgICAgLyogQ2hlY2sgYWxhcm1zIC0gdGhlc2UgYXJlIGEgZ2xvYmFsIHJlc291cmNlIHNvIHdlIGp1c3QgcGluZworICAgICAgIGVhY2ggdGltZSB0aHJvdWdoIG9uIGV2ZXJ5IHBvbGxzZXQuCisgICAgICAgTWF5IHVwZGF0ZSBkZWFkbGluZSB0byBlbnN1cmUgdGltZWx5IHdha2V1cHMuCisgICAgICAgVE9ETyhjdGlsbGVyKTogY2FuIHRoaXMgd29yayBiZSBsb2NhbGl6ZWQ/ICovCisgICAgZ3ByX3RpbWVzcGVjIGl0ZXJhdGlvbl9kZWFkbGluZSA9IGRlYWRsaW5lOworICAgIGlmIChncnBjX3RpbWVyX2NoZWNrKCZleGVjX2N0eCwgbm93LCAmaXRlcmF0aW9uX2RlYWRsaW5lKSkgeworICAgICAgR1BSX1RJTUVSX01BUksoImFsYXJtX3RyaWdnZXJlZCIsIDApOworICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOworICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaCgmZXhlY19jdHgpOworICAgICAgZ3ByX211X2xvY2soY2MtPm11KTsKKyAgICB9IGVsc2UgeworICAgICAgZ3JwY19wb2xsc2V0X3dvcmsoJmV4ZWNfY3R4LCBQT0xMU0VUX0ZST01fQ1EoY2MpLCAmd29ya2VyLCBub3csCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25fZGVhZGxpbmUpOworICAgIH0KKyAgICBkZWxfcGx1Y2tlcihjYywgdGFnLCAmd29ya2VyKTsKKyAgfQorZG9uZToKKyAgR1JQQ19TVVJGQUNFX1RSQUNFX1JFVFVSTkVEX0VWRU5UKGNjLCAmcmV0KTsKKyAgR1JQQ19DUV9JTlRFUk5BTF9VTlJFRihjYywgInBsdWNrIik7CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3BsdWNrIiwgMCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogU2h1dGRvd24gc2ltcGx5IGRyb3BzIGEgcmVmIHRoYXQgd2UgcmVzZXJ2ZWQgYXQgY3JlYXRpb24gdGltZTsgaWYgd2UgZHJvcAorICAgdG8gemVybyBoZXJlLCB0aGVuIGVudGVyIHNodXRkb3duIG1vZGUgYW5kIHdha2UgdXAgYW55IHdhaXRlcnMgKi8KK3ZvaWQgZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3NodXRkb3duKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MpIHsKKyAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKKyAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NvbXBsZXRpb25fcXVldWVfc2h1dGRvd24iLCAwKTsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY29tcGxldGlvbl9xdWV1ZV9zaHV0ZG93bihjYz0lcCkiLCAxLCAoY2MpKTsKKyAgZ3ByX211X2xvY2soY2MtPm11KTsKKyAgaWYgKGNjLT5zaHV0ZG93bl9jYWxsZWQpIHsKKyAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7CisgICAgR1BSX1RJTUVSX0VORCgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3NodXRkb3duIiwgMCk7CisgICAgcmV0dXJuOworICB9CisgIGNjLT5zaHV0ZG93bl9jYWxsZWQgPSAxOworICBpZiAoZ3ByX3VucmVmKCZjYy0+cGVuZGluZ19ldmVudHMpKSB7CisgICAgR1BSX0FTU0VSVCghY2MtPnNodXRkb3duKTsKKyAgICBjYy0+c2h1dGRvd24gPSAxOworICAgIGdycGNfcG9sbHNldF9zaHV0ZG93bigmZXhlY19jdHgsIFBPTExTRVRfRlJPTV9DUShjYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYy0+cG9sbHNldF9zaHV0ZG93bl9kb25lKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CisgIEdQUl9USU1FUl9FTkQoImdycGNfY29tcGxldGlvbl9xdWV1ZV9zaHV0ZG93biIsIDApOworfQorCit2b2lkIGdycGNfY29tcGxldGlvbl9xdWV1ZV9kZXN0cm95KGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfY29tcGxldGlvbl9xdWV1ZV9kZXN0cm95KGNjPSVwKSIsIDEsIChjYykpOworICBHUFJfVElNRVJfQkVHSU4oImdycGNfY29tcGxldGlvbl9xdWV1ZV9kZXN0cm95IiwgMCk7CisgIGdycGNfY29tcGxldGlvbl9xdWV1ZV9zaHV0ZG93bihjYyk7CisgIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoY2MsICJkZXN0cm95Iik7CisgIEdQUl9USU1FUl9FTkQoImdycGNfY29tcGxldGlvbl9xdWV1ZV9kZXN0cm95IiwgMCk7Cit9CisKK2dycGNfcG9sbHNldCAqZ3JwY19jcV9wb2xsc2V0KGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MpIHsKKyAgcmV0dXJuIFBPTExTRVRfRlJPTV9DUShjYyk7Cit9CisKK3ZvaWQgZ3JwY19jcV9tYXJrX3NlcnZlcl9jcShncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKSB7IGNjLT5pc19zZXJ2ZXJfY3EgPSAxOyB9CisKK2ludCBncnBjX2NxX2lzX3NlcnZlcl9jcShncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKSB7IHJldHVybiBjYy0+aXNfc2VydmVyX2NxOyB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmggYi9zcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1OTFjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaApAQCAtMCwwICsxLDkxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9DT01QTEVUSU9OX1FVRVVFX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0NPTVBMRVRJT05fUVVFVUVfSAorCisvKiBJbnRlcm5hbCBBUEkgZm9yIGNvbXBsZXRpb24gcXVldWVzICovCisKKyNpbmNsdWRlIDxncnBjL2dycGMuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX2NxX2NvbXBsZXRpb24geworICAvKiogdXNlciBzdXBwbGllZCB0YWcgKi8KKyAgdm9pZCAqdGFnOworICAvKiogZG9uZSBjYWxsYmFjayAtIGNhbGxlZCB3aGVuIHRoaXMgcXVldWUgZWxlbWVudCBpcyBubyBsb25nZXIKKyAgICAgIG5lZWRlZCBieSB0aGUgY29tcGxldGlvbiBxdWV1ZSAqLworICB2b2lkICgqZG9uZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmRvbmVfYXJnLAorICAgICAgICAgICAgICAgc3RydWN0IGdycGNfY3FfY29tcGxldGlvbiAqYyk7CisgIHZvaWQgKmRvbmVfYXJnOworICAvKiogbmV4dCBwb2ludGVyOyBsb3cgYml0IGlzIHVzZWQgdG8gaW5kaWNhdGUgc3VjY2VzcyBvciBub3QgKi8KKyAgdWludHB0cl90IG5leHQ7Cit9IGdycGNfY3FfY29tcGxldGlvbjsKKworI2lmZGVmIEdSUENfQ1FfUkVGX0NPVU5UX0RFQlVHCit2b2lkIGdycGNfY3FfaW50ZXJuYWxfcmVmKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIGNvbnN0IGNoYXIgKnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwordm9pZCBncnBjX2NxX2ludGVybmFsX3VucmVmKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIGNvbnN0IGNoYXIgKnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisjZGVmaW5lIEdSUENfQ1FfSU5URVJOQUxfUkVGKGNjLCByZWFzb24pIFwKKyAgZ3JwY19jcV9pbnRlcm5hbF9yZWYoY2MsIHJlYXNvbiwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBHUlBDX0NRX0lOVEVSTkFMX1VOUkVGKGNjLCByZWFzb24pIFwKKyAgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihjYywgcmVhc29uLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZWxzZQordm9pZCBncnBjX2NxX2ludGVybmFsX3JlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKK3ZvaWQgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKKyNkZWZpbmUgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY2MsIHJlYXNvbikgZ3JwY19jcV9pbnRlcm5hbF9yZWYoY2MpCisjZGVmaW5lIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoY2MsIHJlYXNvbikgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihjYykKKyNlbmRpZgorCisvKiBGbGFnIHRoYXQgYW4gb3BlcmF0aW9uIGlzIGJlZ2lubmluZzogdGhlIGNvbXBsZXRpb24gY2hhbm5lbCB3aWxsIG5vdCBmaW5pc2gKKyAgIHNodXRkb3duIHVudGlsIGEgY29ycmVuc3BvbmRpbmcgZ3JwY19jcV9lbmRfKiBjYWxsIGlzIG1hZGUuCisgICBcYSB0YWcgaXMgY3VycmVudGx5IHVzZWQgb25seSBpbiBkZWJ1ZyBidWlsZHMuICovCit2b2lkIGdycGNfY3FfYmVnaW5fb3AoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgdm9pZCAqdGFnKTsKKworLyogUXVldWUgYSBHUlBDX09QX0NPTVBMRVRFRCBvcGVyYXRpb247IHRhZyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHRhZyBwYXNzZWQgdG8KKyAgIGdycGNfY3FfYmVnaW5fb3AgKi8KK3ZvaWQgZ3JwY19jcV9lbmRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRhZywgaW50IHN1Y2Nlc3MsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZG9uZV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX2NvbXBsZXRpb24gKnN0b3JhZ2UpLAorICAgICAgICAgICAgICAgICAgICB2b2lkICpkb25lX2FyZywgZ3JwY19jcV9jb21wbGV0aW9uICpzdG9yYWdlKTsKKworZ3JwY19wb2xsc2V0ICpncnBjX2NxX3BvbGxzZXQoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYyk7CisKK3ZvaWQgZ3JwY19jcV9tYXJrX3NlcnZlcl9jcShncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKK2ludCBncnBjX2NxX2lzX3NlcnZlcl9jcShncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKKwordm9pZCBncnBjX2NxX2dsb2JhbF9pbml0KHZvaWQpOwordm9pZCBncnBjX2NxX2dsb2JhbF9zaHV0ZG93bih2b2lkKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9DT01QTEVUSU9OX1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwYzcxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxncnBjL2J5dGVfYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKK3N0YXRpYyB2b2lkIGFkZGhkcihncHJfc3RydmVjICpidWYsIGdycGNfZXZlbnQgKmV2KSB7CisgIGNoYXIgKnRtcDsKKyAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJ0YWc6JXAiLCBldi0+dGFnKTsKKyAgZ3ByX3N0cnZlY19hZGQoYnVmLCB0bXApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXJyc3RyKGludCBzdWNjZXNzKSB7IHJldHVybiBzdWNjZXNzID8gIk9LIiA6ICJFUlJPUiI7IH0KKworc3RhdGljIHZvaWQgYWRkZXJyKGdwcl9zdHJ2ZWMgKmJ1ZiwgaW50IHN1Y2Nlc3MpIHsKKyAgY2hhciAqdG1wOworICBncHJfYXNwcmludGYoJnRtcCwgIiAlcyIsIGVycnN0cihzdWNjZXNzKSk7CisgIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgdG1wKTsKK30KKworY2hhciAqZ3JwY19ldmVudF9zdHJpbmcoZ3JwY19ldmVudCAqZXYpIHsKKyAgY2hhciAqb3V0OworICBncHJfc3RydmVjIGJ1ZjsKKworICBpZiAoZXYgPT0gTlVMTCkgcmV0dXJuIGdwcl9zdHJkdXAoIm51bGwiKTsKKworICBncHJfc3RydmVjX2luaXQoJmJ1Zik7CisKKyAgc3dpdGNoIChldi0+dHlwZSkgeworICAgIGNhc2UgR1JQQ19RVUVVRV9USU1FT1VUOgorICAgICAgZ3ByX3N0cnZlY19hZGQoJmJ1ZiwgZ3ByX3N0cmR1cCgiUVVFVUVfVElNRU9VVCIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1JQQ19RVUVVRV9TSFVURE9XTjoKKyAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZidWYsIGdwcl9zdHJkdXAoIlFVRVVFX1NIVVRET1dOIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHUlBDX09QX0NPTVBMRVRFOgorICAgICAgZ3ByX3N0cnZlY19hZGQoJmJ1ZiwgZ3ByX3N0cmR1cCgiT1BfQ09NUExFVEU6ICIpKTsKKyAgICAgIGFkZGhkcigmYnVmLCBldik7CisgICAgICBhZGRlcnIoJmJ1ZiwgZXYtPnN1Y2Nlc3MpOworICAgICAgYnJlYWs7CisgIH0KKworICBvdXQgPSBncHJfc3RydmVjX2ZsYXR0ZW4oJmJ1ZiwgTlVMTCk7CisgIGdwcl9zdHJ2ZWNfZGVzdHJveSgmYnVmKTsKKyAgcmV0dXJuIG91dDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZTljNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX0VWRU5UX1NUUklOR19ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9FVkVOVF9TVFJJTkdfSAorCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisKKy8qIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbiBldmVudC4gTXVzdCBiZSBsYXRlciBmcmVlZCB3aXRoIGdwcl9mcmVlKCkgKi8KK2NoYXIgKmdycGNfZXZlbnRfc3RyaW5nKGdycGNfZXZlbnQgKmV2KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9FVkVOVF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmM4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKKyNpbmNsdWRlIDxncnBjL2dycGMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgorLyogVE9ETyhjdGlsbGVyKTogZmluZCBhbm90aGVyIHdheT8gLSBiZXR0ZXIgbm90IHRvIGluY2x1ZGUgY2Vuc3VzIGhlcmUgKi8KKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2RlYnVnL3RyYWNlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIKKworI2lmbmRlZiBHUlBDX0RFRkFVTFRfTkFNRV9QUkVGSVgKKyNkZWZpbmUgR1JQQ19ERUZBVUxUX05BTUVfUFJFRklYICJkbnM6Ly8vIgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1BMVUdJTlMgMTI4CisKK3N0YXRpYyBncHJfb25jZSBnX2Jhc2ljX2luaXQgPSBHUFJfT05DRV9JTklUOworc3RhdGljIGdwcl9tdSBnX2luaXRfbXU7CitzdGF0aWMgaW50IGdfaW5pdGlhbGl6YXRpb25zOworCitzdGF0aWMgdm9pZCBkb19iYXNpY19pbml0KHZvaWQpIHsKKyAgZ3ByX211X2luaXQoJmdfaW5pdF9tdSk7CisgIC8qIFRPRE8oY3RpbGxlcik6IGlkZWFsbHkgcmVtb3ZlIHRoaXMgc3RyaWN0IGxpbmthZ2UgKi8KKyAgZ3JwY19yZWdpc3Rlcl9wbHVnaW4oY2Vuc3VzX2dycGNfcGx1Z2luX2luaXQsIGNlbnN1c19ncnBjX3BsdWdpbl9kZXN0cm95KTsKKyAgZ19pbml0aWFsaXphdGlvbnMgPSAwOworfQorCitzdGF0aWMgYm9vbCBhcHBlbmRfZmlsdGVyKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCB2b2lkICphcmcpIHsKKyAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2FwcGVuZF9maWx0ZXIoCisgICAgICBidWlsZGVyLCAoY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciAqKWFyZywgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBib29sIHByZXBlbmRfZmlsdGVyKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCB2b2lkICphcmcpIHsKKyAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3ByZXBlbmRfZmlsdGVyKAorICAgICAgYnVpbGRlciwgKGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKilhcmcsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgYm9vbCBtYXliZV9hZGRfaHR0cF9maWx0ZXIoZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSB7CisgIGdycGNfdHJhbnNwb3J0ICp0ID0gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZ2V0X3RyYW5zcG9ydChidWlsZGVyKTsKKyAgaWYgKHQgJiYgc3Ryc3RyKHQtPnZ0YWJsZS0+bmFtZSwgImh0dHAiKSkgeworICAgIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKKyAgICAgICAgYnVpbGRlciwgKGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKilhcmcsIE5VTEwsIE5VTEwpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9idWlsdGluX2NoYW5uZWxfaW5pdCgpIHsKKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfQ0hBTk5FTCwgSU5UX01BWCwgcHJlcGVuZF9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmdycGNfY29tcHJlc3NfZmlsdGVyKTsKKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfRElSRUNUX0NIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZncnBjX2NvbXByZXNzX2ZpbHRlcik7CisgIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfU0VSVkVSX0NIQU5ORUwsIElOVF9NQVgsIHByZXBlbmRfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZncnBjX2NvbXByZXNzX2ZpbHRlcik7CisgIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX1NVQkNIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX2FkZF9odHRwX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19odHRwX2NsaWVudF9maWx0ZXIpOworICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX0NMSUVOVF9TVUJDSEFOTkVMLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2FkZF9jb25uZWN0ZWRfZmlsdGVyLCBOVUxMKTsKKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfRElSRUNUX0NIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX2FkZF9odHRwX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19odHRwX2NsaWVudF9maWx0ZXIpOworICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX0NMSUVOVF9ESVJFQ1RfQ0hBTk5FTCwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hZGRfY29ubmVjdGVkX2ZpbHRlciwgTlVMTCk7CisgIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfU0VSVkVSX0NIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX2FkZF9odHRwX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19odHRwX3NlcnZlcl9maWx0ZXIpOworICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX1NFUlZFUl9DSEFOTkVMLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2FkZF9jb25uZWN0ZWRfZmlsdGVyLCBOVUxMKTsKKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfQ0hBTk5FTCwgSU5UX01BWCwgYXBwZW5kX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19jbGllbnRfY2hhbm5lbF9maWx0ZXIpOworICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX0NMSUVOVF9MQU1FX0NIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9maWx0ZXIsICh2b2lkICopJmdycGNfbGFtZV9maWx0ZXIpOworICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX1NFUlZFUl9DSEFOTkVMLCBJTlRfTUFYLCBwcmVwZW5kX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19zZXJ2ZXJfdG9wX2ZpbHRlcik7Cit9CisKK3R5cGVkZWYgc3RydWN0IGdycGNfcGx1Z2luIHsKKyAgdm9pZCAoKmluaXQpKCk7CisgIHZvaWQgKCpkZXN0cm95KSgpOworfSBncnBjX3BsdWdpbjsKKworc3RhdGljIGdycGNfcGx1Z2luIGdfYWxsX29mX3RoZV9wbHVnaW5zW01BWF9QTFVHSU5TXTsKK3N0YXRpYyBpbnQgZ19udW1iZXJfb2ZfcGx1Z2lucyA9IDA7CisKK3ZvaWQgZ3JwY19yZWdpc3Rlcl9wbHVnaW4odm9pZCAoKmluaXQpKHZvaWQpLCB2b2lkICgqZGVzdHJveSkodm9pZCkpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfcmVnaXN0ZXJfcGx1Z2luKGluaXQ9JXAsIGRlc3Ryb3k9JXApIiwgMiwKKyAgICAgICAgICAgICAgICAgKCh2b2lkICopKGludHB0cl90KWluaXQsICh2b2lkICopKGludHB0cl90KWRlc3Ryb3kpKTsKKyAgR1BSX0FTU0VSVChnX251bWJlcl9vZl9wbHVnaW5zICE9IE1BWF9QTFVHSU5TKTsKKyAgZ19hbGxfb2ZfdGhlX3BsdWdpbnNbZ19udW1iZXJfb2ZfcGx1Z2luc10uaW5pdCA9IGluaXQ7CisgIGdfYWxsX29mX3RoZV9wbHVnaW5zW2dfbnVtYmVyX29mX3BsdWdpbnNdLmRlc3Ryb3kgPSBkZXN0cm95OworICBnX251bWJlcl9vZl9wbHVnaW5zKys7Cit9CisKK3ZvaWQgZ3JwY19pbml0KHZvaWQpIHsKKyAgaW50IGk7CisgIGdwcl9vbmNlX2luaXQoJmdfYmFzaWNfaW5pdCwgZG9fYmFzaWNfaW5pdCk7CisKKyAgZ3ByX211X2xvY2soJmdfaW5pdF9tdSk7CisgIGlmICgrK2dfaW5pdGlhbGl6YXRpb25zID09IDEpIHsKKyAgICBncHJfdGltZV9pbml0KCk7CisgICAgZ3JwY19tZGN0eF9nbG9iYWxfaW5pdCgpOworICAgIGdycGNfY2hhbm5lbF9pbml0X2luaXQoKTsKKyAgICBncnBjX2xiX3BvbGljeV9yZWdpc3RyeV9pbml0KGdycGNfcGlja19maXJzdF9sYl9mYWN0b3J5X2NyZWF0ZSgpKTsKKyAgICBncnBjX3JlZ2lzdGVyX2xiX3BvbGljeShncnBjX3BpY2tfZmlyc3RfbGJfZmFjdG9yeV9jcmVhdGUoKSk7CisgICAgZ3JwY19yZWdpc3Rlcl9sYl9wb2xpY3koZ3JwY19yb3VuZF9yb2Jpbl9sYl9mYWN0b3J5X2NyZWF0ZSgpKTsKKyAgICBncnBjX3Jlc29sdmVyX3JlZ2lzdHJ5X2luaXQoR1JQQ19ERUZBVUxUX05BTUVfUFJFRklYKTsKKyAgICBncnBjX3JlZ2lzdGVyX3Jlc29sdmVyX3R5cGUoZ3JwY19kbnNfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUoKSk7CisgICAgZ3JwY19yZWdpc3Rlcl9yZXNvbHZlcl90eXBlKGdycGNfaXB2NF9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSgpKTsKKyAgICBncnBjX3JlZ2lzdGVyX3Jlc29sdmVyX3R5cGUoZ3JwY19pcHY2X3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlKCkpOworI2lmZGVmIEdQUl9QT1NJWF9TT0NLRVQKKyAgICBncnBjX3JlZ2lzdGVyX3Jlc29sdmVyX3R5cGUoZ3JwY191bml4X3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlKCkpOworI2VuZGlmCisgICAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoImFwaSIsICZncnBjX2FwaV90cmFjZSk7CisgICAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoImNoYW5uZWwiLCAmZ3JwY190cmFjZV9jaGFubmVsKTsKKyAgICBncnBjX3JlZ2lzdGVyX3RyYWNlcigiaHR0cCIsICZncnBjX2h0dHBfdHJhY2UpOworICAgIGdycGNfcmVnaXN0ZXJfdHJhY2VyKCJmbG93Y3RsIiwgJmdycGNfZmxvd2N0bF90cmFjZSk7CisgICAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoImNvbm5lY3Rpdml0eV9zdGF0ZSIsICZncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFjZSk7CisgICAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoImNoYW5uZWxfc3RhY2tfYnVpbGRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmdycGNfdHJhY2VfY2hhbm5lbF9zdGFja19idWlsZGVyKTsKKyAgICBncnBjX3NlY3VyaXR5X3ByZV9pbml0KCk7CisgICAgZ3JwY19pb21ncl9pbml0KCk7CisgICAgZ3JwY19leGVjdXRvcl9pbml0KCk7CisgICAgZ3JwY190cmFjZXJfaW5pdCgiR1JQQ19UUkFDRSIpOworICAgIGdwcl90aW1lcnNfZ2xvYmFsX2luaXQoKTsKKyAgICBncnBjX2NxX2dsb2JhbF9pbml0KCk7CisgICAgZ3JwY19zdWJjaGFubmVsX2luZGV4X2luaXQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ19udW1iZXJfb2ZfcGx1Z2luczsgaSsrKSB7CisgICAgICBpZiAoZ19hbGxfb2ZfdGhlX3BsdWdpbnNbaV0uaW5pdCAhPSBOVUxMKSB7CisgICAgICAgIGdfYWxsX29mX3RoZV9wbHVnaW5zW2ldLmluaXQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogcmVnaXN0ZXIgY2hhbm5lbCBmaW5hbGl6YXRpb24gQUZURVIgYWxsIHBsdWdpbnMsIHRvIGVuc3VyZSB0aGF0IGl0J3MgcnVuCisgICAgICogYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgKi8KKyAgICBncnBjX3JlZ2lzdGVyX3NlY3VyaXR5X2ZpbHRlcnMoKTsKKyAgICByZWdpc3Rlcl9idWlsdGluX2NoYW5uZWxfaW5pdCgpOworICAgIC8qIG5vIG1vcmUgY2hhbmdlcyB0byBjaGFubmVsIGluaXQgcGlwZWxpbmVzICovCisgICAgZ3JwY19jaGFubmVsX2luaXRfZmluYWxpemUoKTsKKyAgfQorICBncHJfbXVfdW5sb2NrKCZnX2luaXRfbXUpOworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19pbml0KHZvaWQpIiwgMCwgKCkpOworfQorCit2b2lkIGdycGNfc2h1dGRvd24odm9pZCkgeworICBpbnQgaTsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2h1dGRvd24odm9pZCkiLCAwLCAoKSk7CisgIGdwcl9tdV9sb2NrKCZnX2luaXRfbXUpOworICBpZiAoLS1nX2luaXRpYWxpemF0aW9ucyA9PSAwKSB7CisgICAgZ3JwY19leGVjdXRvcl9zaHV0ZG93bigpOworICAgIGdycGNfY3FfZ2xvYmFsX3NodXRkb3duKCk7CisgICAgZ3JwY19pb21ncl9zaHV0ZG93bigpOworICAgIGdycGNfc3ViY2hhbm5lbF9pbmRleF9zaHV0ZG93bigpOworICAgIGdwcl90aW1lcnNfZ2xvYmFsX2Rlc3Ryb3koKTsKKyAgICBncnBjX3RyYWNlcl9zaHV0ZG93bigpOworICAgIGdycGNfcmVzb2x2ZXJfcmVnaXN0cnlfc2h1dGRvd24oKTsKKyAgICBncnBjX2xiX3BvbGljeV9yZWdpc3RyeV9zaHV0ZG93bigpOworICAgIGZvciAoaSA9IDA7IGkgPCBnX251bWJlcl9vZl9wbHVnaW5zOyBpKyspIHsKKyAgICAgIGlmIChnX2FsbF9vZl90aGVfcGx1Z2luc1tpXS5kZXN0cm95ICE9IE5VTEwpIHsKKyAgICAgICAgZ19hbGxfb2ZfdGhlX3BsdWdpbnNbaV0uZGVzdHJveSgpOworICAgICAgfQorICAgIH0KKyAgICBncnBjX2NoYW5uZWxfaW5pdF9zaHV0ZG93bigpOworICAgIGdycGNfbWRjdHhfZ2xvYmFsX3NodXRkb3duKCk7CisgIH0KKyAgZ3ByX211X3VubG9jaygmZ19pbml0X211KTsKK30KKworaW50IGdycGNfaXNfaW5pdGlhbGl6ZWQodm9pZCkgeworICBpbnQgcjsKKyAgZ3ByX29uY2VfaW5pdCgmZ19iYXNpY19pbml0LCBkb19iYXNpY19pbml0KTsKKyAgZ3ByX211X2xvY2soJmdfaW5pdF9tdSk7CisgIHIgPSBnX2luaXRpYWxpemF0aW9ucyA+IDA7CisgIGdwcl9tdV91bmxvY2soJmdfaW5pdF9tdSk7CisgIHJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTJhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfSU5JVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9JTklUX0gKKwordm9pZCBncnBjX3JlZ2lzdGVyX3NlY3VyaXR5X2ZpbHRlcnModm9pZCk7Cit2b2lkIGdycGNfc2VjdXJpdHlfcHJlX2luaXQodm9pZCk7CitpbnQgZ3JwY19pc19pbml0aWFsaXplZCh2b2lkKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9JTklUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfc2VjdXJlLmMgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzJmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgorCit2b2lkIGdycGNfc2VjdXJpdHlfcHJlX2luaXQodm9pZCkgeworICBncnBjX3JlZ2lzdGVyX3RyYWNlcigic2VjdXJlX2VuZHBvaW50IiwgJmdycGNfdHJhY2Vfc2VjdXJlX2VuZHBvaW50KTsKKyAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoInRyYW5zcG9ydF9zZWN1cml0eSIsICZ0c2lfdHJhY2luZ19lbmFibGVkKTsKK30KKworc3RhdGljIGJvb2wgbWF5YmVfcHJlcGVuZF9jbGllbnRfYXV0aF9maWx0ZXIoCisgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXIgKmJ1aWxkZXIsIHZvaWQgKmFyZykgeworICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncyA9CisgICAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9nZXRfY2hhbm5lbF9hcmd1bWVudHMoYnVpbGRlcik7CisgIGlmIChhcmdzKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLT5udW1fYXJnczsgaSsrKSB7CisgICAgICBpZiAoMCA9PSBzdHJjbXAoR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfQVJHLCBhcmdzLT5hcmdzW2ldLmtleSkpIHsKKyAgICAgICAgcmV0dXJuIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX3ByZXBlbmRfZmlsdGVyKAorICAgICAgICAgICAgYnVpbGRlciwgJmdycGNfY2xpZW50X2F1dGhfZmlsdGVyLCBOVUxMLCBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIG1heWJlX3ByZXBlbmRfc2VydmVyX2F1dGhfZmlsdGVyKAorICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCB2b2lkICphcmcpIHsKKyAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MgPQorICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZ2V0X2NoYW5uZWxfYXJndW1lbnRzKGJ1aWxkZXIpOworICBpZiAoYXJncykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgeworICAgICAgaWYgKDAgPT0gc3RyY21wKEdSUENfU0VSVkVSX0NSRURFTlRJQUxTX0FSRywgYXJncy0+YXJnc1tpXS5rZXkpKSB7CisgICAgICAgIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKKyAgICAgICAgICAgIGJ1aWxkZXIsICZncnBjX3NlcnZlcl9hdXRoX2ZpbHRlciwgTlVMTCwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIGdycGNfcmVnaXN0ZXJfc2VjdXJpdHlfZmlsdGVycyh2b2lkKSB7CisgIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX1NVQkNIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX3ByZXBlbmRfY2xpZW50X2F1dGhfZmlsdGVyLCBOVUxMKTsKKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfRElSRUNUX0NIQU5ORUwsIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX3ByZXBlbmRfY2xpZW50X2F1dGhfZmlsdGVyLCBOVUxMKTsKKyAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19TRVJWRVJfQ0hBTk5FTCwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVfcHJlcGVuZF9zZXJ2ZXJfYXV0aF9maWx0ZXIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdF91bnNlY3VyZS5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdF91bnNlY3VyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0M2MwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3Vuc2VjdXJlLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuaCIKKwordm9pZCBncnBjX3NlY3VyaXR5X3ByZV9pbml0KHZvaWQpIHt9CisKK3ZvaWQgZ3JwY19yZWdpc3Rlcl9zZWN1cml0eV9maWx0ZXJzKHZvaWQpIHt9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWVjNGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmgiCisKKyNpbmNsdWRlIDxncnBjL2dycGMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGdycGNfbGlua2VkX21kZWxlbSBzdGF0dXM7CisgIGdycGNfbGlua2VkX21kZWxlbSBkZXRhaWxzOworfSBjYWxsX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19zdGF0dXNfY29kZSBlcnJvcl9jb2RlOworICBjb25zdCBjaGFyICplcnJvcl9tZXNzYWdlOworfSBjaGFubmVsX2RhdGE7CisKK3N0YXRpYyB2b2lkIGZpbGxfbWV0YWRhdGEoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sIGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1kYikgeworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBjaGFyIHRtcFtHUFJfTFRPQV9NSU5fQlVGU0laRV07CisgIGdwcl9sdG9hKGNoYW5kLT5lcnJvcl9jb2RlLCB0bXApOworICBjYWxsZC0+c3RhdHVzLm1kID0gZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKCJncnBjLXN0YXR1cyIsIHRtcCk7CisgIGNhbGxkLT5kZXRhaWxzLm1kID0KKyAgICAgIGdycGNfbWRlbGVtX2Zyb21fc3RyaW5ncygiZ3JwYy1tZXNzYWdlIiwgY2hhbmQtPmVycm9yX21lc3NhZ2UpOworICBjYWxsZC0+c3RhdHVzLnByZXYgPSBjYWxsZC0+ZGV0YWlscy5uZXh0ID0gTlVMTDsKKyAgY2FsbGQtPnN0YXR1cy5uZXh0ID0gJmNhbGxkLT5kZXRhaWxzOworICBjYWxsZC0+ZGV0YWlscy5wcmV2ID0gJmNhbGxkLT5zdGF0dXM7CisgIG1kYi0+bGlzdC5oZWFkID0gJmNhbGxkLT5zdGF0dXM7CisgIG1kYi0+bGlzdC50YWlsID0gJmNhbGxkLT5kZXRhaWxzOworICBtZGItPmRlYWRsaW5lID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKK30KKworc3RhdGljIHZvaWQgbGFtZV9zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgR1JQQ19DQUxMX0xPR19PUChHUFJfSU5GTywgZWxlbSwgb3ApOworICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgZmlsbF9tZXRhZGF0YShlbGVtLCBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmIChvcC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgZmlsbF9tZXRhZGF0YShlbGVtLCBvcC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YSk7CisgIH0KKyAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2ZpbmlzaF93aXRoX2ZhaWx1cmUoZXhlY19jdHgsIG9wKTsKK30KKworc3RhdGljIGNoYXIgKmxhbWVfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBsYW1lX3N0YXJ0X3RyYW5zcG9ydF9vcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKSB7CisgIGlmIChvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSkgeworICAgIEdQUl9BU1NFUlQoKm9wLT5jb25uZWN0aXZpdHlfc3RhdGUgIT0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUpOworICAgICpvcC0+Y29ubmVjdGl2aXR5X3N0YXRlID0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU7CisgICAgb3AtPm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UtPmNiKAorICAgICAgICBleGVjX2N0eCwgb3AtPm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UtPmNiX2FyZywgMSk7CisgIH0KKyAgaWYgKG9wLT5vbl9jb25zdW1lZCAhPSBOVUxMKSB7CisgICAgb3AtPm9uX2NvbnN1bWVkLT5jYihleGVjX2N0eCwgb3AtPm9uX2NvbnN1bWVkLT5jYl9hcmcsIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHt9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHt9CisKK3N0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIEdQUl9BU1NFUlQoYXJncy0+aXNfZmlyc3QpOworICBHUFJfQVNTRVJUKGFyZ3MtPmlzX2xhc3QpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7fQorCitjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfbGFtZV9maWx0ZXIgPSB7CisgICAgbGFtZV9zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wLAorICAgIGxhbWVfc3RhcnRfdHJhbnNwb3J0X29wLAorICAgIHNpemVvZihjYWxsX2RhdGEpLAorICAgIGluaXRfY2FsbF9lbGVtLAorICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCisgICAgZGVzdHJveV9jYWxsX2VsZW0sCisgICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCisgICAgaW5pdF9jaGFubmVsX2VsZW0sCisgICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCisgICAgbGFtZV9nZXRfcGVlciwKKyAgICAibGFtZS1jbGllbnQiLAorfTsKKworI2RlZmluZSBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSAoKGdycGNfY2hhbm5lbF9zdGFjayAqKSgoYykgKyAxKSkKKworZ3JwY19jaGFubmVsICpncnBjX2xhbWVfY2xpZW50X2NoYW5uZWxfY3JlYXRlKGNvbnN0IGNoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSkgeworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZDsKKyAgZ3JwY19jaGFubmVsICpjaGFubmVsID0gZ3JwY19jaGFubmVsX2NyZWF0ZSgmZXhlY19jdHgsIHRhcmdldCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NMSUVOVF9MQU1FX0NIQU5ORUwsIE5VTEwpOworICBlbGVtID0gZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoZ3JwY19jaGFubmVsX2dldF9jaGFubmVsX3N0YWNrKGNoYW5uZWwpLCAwKTsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19sYW1lX2NsaWVudF9jaGFubmVsX2NyZWF0ZSh0YXJnZXQ9JXMsIGVycm9yX2NvZGU9JWQsICIKKyAgICAgICJlcnJvcl9tZXNzYWdlPSVzKSIsCisgICAgICAzLCAodGFyZ2V0LCAoaW50KWVycm9yX2NvZGUsIGVycm9yX21lc3NhZ2UpKTsKKyAgR1BSX0FTU0VSVChlbGVtLT5maWx0ZXIgPT0gJmdycGNfbGFtZV9maWx0ZXIpOworICBjaGFuZCA9IChjaGFubmVsX2RhdGEgKillbGVtLT5jaGFubmVsX2RhdGE7CisgIGNoYW5kLT5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKyAgY2hhbmQtPmVycm9yX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlOworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICByZXR1cm4gY2hhbm5lbDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmggYi9zcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmVhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9MQU1FX0NMSUVOVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9MQU1FX0NMSUVOVF9ICisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisKK2V4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfbGFtZV9maWx0ZXI7CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfTEFNRV9DTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzNmYyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKwordm9pZCBncnBjX21ldGFkYXRhX2FycmF5X2luaXQoZ3JwY19tZXRhZGF0YV9hcnJheSogYXJyYXkpIHsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfbWV0YWRhdGFfYXJyYXlfaW5pdChhcnJheT0lcCkiLCAxLCAoYXJyYXkpKTsKKyAgbWVtc2V0KGFycmF5LCAwLCBzaXplb2YoKmFycmF5KSk7Cit9CisKK3ZvaWQgZ3JwY19tZXRhZGF0YV9hcnJheV9kZXN0cm95KGdycGNfbWV0YWRhdGFfYXJyYXkqIGFycmF5KSB7CisgIEdSUENfQVBJX1RSQUNFKCJncnBjX21ldGFkYXRhX2FycmF5X2Rlc3Ryb3koYXJyYXk9JXApIiwgMSwgKGFycmF5KSk7CisgIGdwcl9mcmVlKGFycmF5LT5tZXRhZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDczNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYwpAQCAtMCwwICsxLDEzMTkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCisKK3R5cGVkZWYgc3RydWN0IGxpc3RlbmVyIHsKKyAgdm9pZCAqYXJnOworICB2b2lkICgqc3RhcnQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50KTsKKyAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUpOworICBzdHJ1Y3QgbGlzdGVuZXIgKm5leHQ7CisgIGdycGNfY2xvc3VyZSBkZXN0cm95X2RvbmU7Cit9IGxpc3RlbmVyOworCit0eXBlZGVmIHN0cnVjdCBjYWxsX2RhdGEgY2FsbF9kYXRhOwordHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9kYXRhIGNoYW5uZWxfZGF0YTsKK3R5cGVkZWYgc3RydWN0IHJlZ2lzdGVyZWRfbWV0aG9kIHJlZ2lzdGVyZWRfbWV0aG9kOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNhbGxfZGF0YSAqbmV4dDsKKyAgY2FsbF9kYXRhICpwcmV2OworfSBjYWxsX2xpbms7CisKK3R5cGVkZWYgZW51bSB7IEJBVENIX0NBTEwsIFJFR0lTVEVSRURfQ0FMTCB9IHJlcXVlc3RlZF9jYWxsX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHJlcXVlc3RlZF9jYWxsIHsKKyAgcmVxdWVzdGVkX2NhbGxfdHlwZSB0eXBlOworICB2b2lkICp0YWc7CisgIGdycGNfc2VydmVyICpzZXJ2ZXI7CisgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3FfYm91bmRfdG9fY2FsbDsKKyAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcV9mb3Jfbm90aWZpY2F0aW9uOworICBncnBjX2NhbGwgKipjYWxsOworICBncnBjX2NxX2NvbXBsZXRpb24gY29tcGxldGlvbjsKKyAgZ3JwY19tZXRhZGF0YV9hcnJheSAqaW5pdGlhbF9tZXRhZGF0YTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBncnBjX2NhbGxfZGV0YWlscyAqZGV0YWlsczsKKyAgICB9IGJhdGNoOworICAgIHN0cnVjdCB7CisgICAgICByZWdpc3RlcmVkX21ldGhvZCAqcmVnaXN0ZXJlZF9tZXRob2Q7CisgICAgICBncHJfdGltZXNwZWMgKmRlYWRsaW5lOworICAgICAgZ3JwY19ieXRlX2J1ZmZlciAqKm9wdGlvbmFsX3BheWxvYWQ7CisgICAgfSByZWdpc3RlcmVkOworICB9IGRhdGE7CisgIGdycGNfY2xvc3VyZSBwdWJsaXNoOworfSByZXF1ZXN0ZWRfY2FsbDsKKwordHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9yZWdpc3RlcmVkX21ldGhvZCB7CisgIHJlZ2lzdGVyZWRfbWV0aG9kICpzZXJ2ZXJfcmVnaXN0ZXJlZF9tZXRob2Q7CisgIGdycGNfbWRzdHIgKm1ldGhvZDsKKyAgZ3JwY19tZHN0ciAqaG9zdDsKK30gY2hhbm5lbF9yZWdpc3RlcmVkX21ldGhvZDsKKworc3RydWN0IGNoYW5uZWxfZGF0YSB7CisgIGdycGNfc2VydmVyICpzZXJ2ZXI7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGNvbm5lY3Rpdml0eV9zdGF0ZTsKKyAgZ3JwY19jaGFubmVsICpjaGFubmVsOworICAvKiBsaW5rZWQgbGlzdCBvZiBhbGwgY2hhbm5lbHMgb24gYSBzZXJ2ZXIgKi8KKyAgY2hhbm5lbF9kYXRhICpuZXh0OworICBjaGFubmVsX2RhdGEgKnByZXY7CisgIGNoYW5uZWxfcmVnaXN0ZXJlZF9tZXRob2QgKnJlZ2lzdGVyZWRfbWV0aG9kczsKKyAgdWludDMyX3QgcmVnaXN0ZXJlZF9tZXRob2Rfc2xvdHM7CisgIHVpbnQzMl90IHJlZ2lzdGVyZWRfbWV0aG9kX21heF9wcm9iZXM7CisgIGdycGNfY2xvc3VyZSBmaW5pc2hfZGVzdHJveV9jaGFubmVsX2Nsb3N1cmU7CisgIGdycGNfY2xvc3VyZSBjaGFubmVsX2Nvbm5lY3Rpdml0eV9jaGFuZ2VkOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2h1dGRvd25fdGFnIHsKKyAgdm9pZCAqdGFnOworICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxOworICBncnBjX2NxX2NvbXBsZXRpb24gY29tcGxldGlvbjsKK30gc2h1dGRvd25fdGFnOworCit0eXBlZGVmIGVudW0geworICAvKiB3YWl0aW5nIGZvciBtZXRhZGF0YSAqLworICBOT1RfU1RBUlRFRCwKKyAgLyogaW5pdGFsIG1ldGFkYXRhIHJlYWQsIG5vdCBmbG93IGNvbnRyb2xsZWQgaW4geWV0ICovCisgIFBFTkRJTkcsCisgIC8qIGZsb3cgY29udHJvbGxlZCBpbiwgb24gY29tcGxldGlvbiBxdWV1ZSAqLworICBBQ1RJVkFURUQsCisgIC8qIGNhbmNlbGxlZCBiZWZvcmUgYmVpbmcgcXVldWVkICovCisgIFpPTUJJRUQKK30gY2FsbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVxdWVzdF9tYXRjaGVyIHJlcXVlc3RfbWF0Y2hlcjsKKworc3RydWN0IGNhbGxfZGF0YSB7CisgIGdycGNfY2FsbCAqY2FsbDsKKworICAvKiogcHJvdGVjdHMgc3RhdGUgKi8KKyAgZ3ByX211IG11X3N0YXRlOworICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBjYWxsIC0gc2VlIGNhbGxfc3RhdGUgKi8KKyAgY2FsbF9zdGF0ZSBzdGF0ZTsKKworICBncnBjX21kc3RyICpwYXRoOworICBncnBjX21kc3RyICpob3N0OworICBncHJfdGltZXNwZWMgZGVhZGxpbmU7CisKKyAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcV9uZXc7CisKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl9pbml0aWFsX21ldGFkYXRhOworICBncnBjX21ldGFkYXRhX2FycmF5IGluaXRpYWxfbWV0YWRhdGE7CisKKyAgZ3JwY19jbG9zdXJlIGdvdF9pbml0aWFsX21ldGFkYXRhOworICBncnBjX2Nsb3N1cmUgc2VydmVyX29uX3JlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKKyAgZ3JwY19jbG9zdXJlIGtpbGxfem9tYmllX2Nsb3N1cmU7CisgIGdycGNfY2xvc3VyZSAqb25fZG9uZV9yZWN2X2luaXRpYWxfbWV0YWRhdGE7CisKKyAgY2FsbF9kYXRhICpwZW5kaW5nX25leHQ7Cit9OworCitzdHJ1Y3QgcmVxdWVzdF9tYXRjaGVyIHsKKyAgY2FsbF9kYXRhICpwZW5kaW5nX2hlYWQ7CisgIGNhbGxfZGF0YSAqcGVuZGluZ190YWlsOworICBncHJfc3RhY2tfbG9ja2ZyZWUgKnJlcXVlc3RzOworfTsKKworc3RydWN0IHJlZ2lzdGVyZWRfbWV0aG9kIHsKKyAgY2hhciAqbWV0aG9kOworICBjaGFyICpob3N0OworICByZXF1ZXN0X21hdGNoZXIgcmVxdWVzdF9tYXRjaGVyOworICByZWdpc3RlcmVkX21ldGhvZCAqbmV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3JwY19jaGFubmVsICoqY2hhbm5lbHM7CisgIHNpemVfdCBudW1fY2hhbm5lbHM7Cit9IGNoYW5uZWxfYnJvYWRjYXN0ZXI7CisKK3N0cnVjdCBncnBjX3NlcnZlciB7CisgIGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3M7CisKKyAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICoqY3FzOworICBncnBjX3BvbGxzZXQgKipwb2xsc2V0czsKKyAgc2l6ZV90IGNxX2NvdW50OworCisgIC8qIFRoZSB0d28gZm9sbG93aW5nIG11dGV4ZXMgY29udHJvbCBhY2Nlc3MgdG8gc2VydmVyLXN0YXRlCisgICAgIG11X2dsb2JhbCBjb250cm9scyBhY2Nlc3MgdG8gbm9uLWNhbGwtcmVsYXRlZCBzdGF0ZSAoZS5nLiwgY2hhbm5lbCBzdGF0ZSkKKyAgICAgbXVfY2FsbCBjb250cm9scyBhY2Nlc3MgdG8gY2FsbC1yZWxhdGVkIHN0YXRlIChlLmcuLCB0aGUgY2FsbCBsaXN0cykKKworICAgICBJZiB0aGV5IGFyZSBldmVyIHJlcXVpcmVkIHRvIGJlIG5lc3RlZCwgeW91IG11c3QgbG9jayBtdV9nbG9iYWwKKyAgICAgYmVmb3JlIG11X2NhbGwuIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgaW4gc2h1dGRvd24gcHJvY2Vzc2luZworICAgICAoZ3JwY19zZXJ2ZXJfc2h1dGRvd25fYW5kX25vdGlmeSBhbmQgbWF5YmVfZmluaXNoX3NodXRkb3duKSAqLworICBncHJfbXUgbXVfZ2xvYmFsOyAvKiBtdXRleCBmb3Igc2VydmVyIGFuZCBjaGFubmVsIHN0YXRlICovCisgIGdwcl9tdSBtdV9jYWxsOyAgIC8qIG11dGV4IGZvciBjYWxsLXNwZWNpZmljIHN0YXRlICovCisKKyAgcmVnaXN0ZXJlZF9tZXRob2QgKnJlZ2lzdGVyZWRfbWV0aG9kczsKKyAgcmVxdWVzdF9tYXRjaGVyIHVucmVnaXN0ZXJlZF9yZXF1ZXN0X21hdGNoZXI7CisgIC8qKiBmcmVlIGxpc3Qgb2YgYXZhaWxhYmxlIHJlcXVlc3RlZF9jYWxscyBpbmRpY2VzICovCisgIGdwcl9zdGFja19sb2NrZnJlZSAqcmVxdWVzdF9mcmVlbGlzdDsKKyAgLyoqIHJlcXVlc3RlZCBjYWxsIGJhY2tpbmcgZGF0YSAqLworICByZXF1ZXN0ZWRfY2FsbCAqcmVxdWVzdGVkX2NhbGxzOworICBzaXplX3QgbWF4X3JlcXVlc3RlZF9jYWxsczsKKworICBncHJfYXRtIHNodXRkb3duX2ZsYWc7CisgIHVpbnQ4X3Qgc2h1dGRvd25fcHVibGlzaGVkOworICBzaXplX3QgbnVtX3NodXRkb3duX3RhZ3M7CisgIHNodXRkb3duX3RhZyAqc2h1dGRvd25fdGFnczsKKworICBjaGFubmVsX2RhdGEgcm9vdF9jaGFubmVsX2RhdGE7CisKKyAgbGlzdGVuZXIgKmxpc3RlbmVyczsKKyAgaW50IGxpc3RlbmVyc19kZXN0cm95ZWQ7CisgIGdwcl9yZWZjb3VudCBpbnRlcm5hbF9yZWZjb3VudDsKKworICAvKiogd2hlbiBkaWQgd2UgcHJpbnQgdGhlIGxhc3Qgc2h1dGRvd24gcHJvZ3Jlc3MgbWVzc2FnZSAqLworICBncHJfdGltZXNwZWMgbGFzdF9zaHV0ZG93bl9tZXNzYWdlX3RpbWU7Cit9OworCisjZGVmaW5lIFNFUlZFUl9GUk9NX0NBTExfRUxFTShlbGVtKSBcCisgICgoKGNoYW5uZWxfZGF0YSAqKShlbGVtKS0+Y2hhbm5lbF9kYXRhKS0+c2VydmVyKQorCitzdGF0aWMgdm9pZCBiZWdpbl9jYWxsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjYWxsX2RhdGEgKmNhbGxkLCByZXF1ZXN0ZWRfY2FsbCAqcmMpOworc3RhdGljIHZvaWQgZmFpbF9jYWxsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9jYWxsICpyYyk7CisvKiBCZWZvcmUgY2FsbGluZyBtYXliZV9maW5pc2hfc2h1dGRvd24sIHdlIG11c3QgaG9sZCBtdV9nbG9iYWwgYW5kIG5vdAorICAgaG9sZCBtdV9jYWxsICovCitzdGF0aWMgdm9pZCBtYXliZV9maW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIpOworCisvKgorICogY2hhbm5lbCBicm9hZGNhc3RlcgorICovCisKKy8qIGFzc3VtZXMgc2VydmVyIGxvY2tlZCAqLworc3RhdGljIHZvaWQgY2hhbm5lbF9icm9hZGNhc3Rlcl9pbml0KGdycGNfc2VydmVyICpzLCBjaGFubmVsX2Jyb2FkY2FzdGVyICpjYikgeworICBjaGFubmVsX2RhdGEgKmM7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIGZvciAoYyA9IHMtPnJvb3RfY2hhbm5lbF9kYXRhLm5leHQ7IGMgIT0gJnMtPnJvb3RfY2hhbm5lbF9kYXRhOyBjID0gYy0+bmV4dCkgeworICAgIGNvdW50Kys7CisgIH0KKyAgY2ItPm51bV9jaGFubmVscyA9IGNvdW50OworICBjYi0+Y2hhbm5lbHMgPSBncHJfbWFsbG9jKHNpemVvZigqY2ItPmNoYW5uZWxzKSAqIGNiLT5udW1fY2hhbm5lbHMpOworICBjb3VudCA9IDA7CisgIGZvciAoYyA9IHMtPnJvb3RfY2hhbm5lbF9kYXRhLm5leHQ7IGMgIT0gJnMtPnJvb3RfY2hhbm5lbF9kYXRhOyBjID0gYy0+bmV4dCkgeworICAgIGNiLT5jaGFubmVsc1tjb3VudCsrXSA9IGMtPmNoYW5uZWw7CisgICAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1JFRihjLT5jaGFubmVsLCAiYnJvYWRjYXN0Iik7CisgIH0KK30KKworc3RydWN0IHNodXRkb3duX2NsZWFudXBfYXJncyB7CisgIGdycGNfY2xvc3VyZSBjbG9zdXJlOworICBncHJfc2xpY2Ugc2xpY2U7Cit9OworCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9jbGVhbnVwKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3RhdHVzX2lnbm9yZWQpIHsKKyAgc3RydWN0IHNodXRkb3duX2NsZWFudXBfYXJncyAqYSA9IGFyZzsKKyAgZ3ByX3NsaWNlX3VucmVmKGEtPnNsaWNlKTsKKyAgZ3ByX2ZyZWUoYSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRfZ29hd2F5LCBpbnQgc2VuZF9kaXNjb25uZWN0KSB7CisgIGdycGNfdHJhbnNwb3J0X29wIG9wOworICBzdHJ1Y3Qgc2h1dGRvd25fY2xlYW51cF9hcmdzICpzYzsKKyAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW07CisKKyAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CisgIG9wLnNlbmRfZ29hd2F5ID0gc2VuZF9nb2F3YXk7CisgIHNjID0gZ3ByX21hbGxvYyhzaXplb2YoKnNjKSk7CisgIHNjLT5zbGljZSA9IGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcoIlNlcnZlciBzaHV0ZG93biIpOworICBvcC5nb2F3YXlfbWVzc2FnZSA9ICZzYy0+c2xpY2U7CisgIG9wLmdvYXdheV9zdGF0dXMgPSBHUlBDX1NUQVRVU19PSzsKKyAgb3AuZGlzY29ubmVjdCA9IHNlbmRfZGlzY29ubmVjdDsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJnNjLT5jbG9zdXJlLCBzaHV0ZG93bl9jbGVhbnVwLCBzYyk7CisgIG9wLm9uX2NvbnN1bWVkID0gJnNjLT5jbG9zdXJlOworCisgIGVsZW0gPSBncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudChncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCksIDApOworICBlbGVtLT5maWx0ZXItPnN0YXJ0X3RyYW5zcG9ydF9vcChleGVjX2N0eCwgZWxlbSwgJm9wKTsKK30KKworc3RhdGljIHZvaWQgY2hhbm5lbF9icm9hZGNhc3Rlcl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9icm9hZGNhc3RlciAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kX2dvYXdheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcmNlX2Rpc2Nvbm5lY3QpIHsKKyAgc2l6ZV90IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNiLT5udW1fY2hhbm5lbHM7IGkrKykgeworICAgIHNlbmRfc2h1dGRvd24oZXhlY19jdHgsIGNiLT5jaGFubmVsc1tpXSwgc2VuZF9nb2F3YXksIGZvcmNlX2Rpc2Nvbm5lY3QpOworICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2ItPmNoYW5uZWxzW2ldLCAiYnJvYWRjYXN0Iik7CisgIH0KKyAgZ3ByX2ZyZWUoY2ItPmNoYW5uZWxzKTsKK30KKworLyoKKyAqIHJlcXVlc3RfbWF0Y2hlcgorICovCisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfbWF0Y2hlcl9pbml0KHJlcXVlc3RfbWF0Y2hlciAqcm0sIHNpemVfdCBlbnRyaWVzKSB7CisgIG1lbXNldChybSwgMCwgc2l6ZW9mKCpybSkpOworICBybS0+cmVxdWVzdHMgPSBncHJfc3RhY2tfbG9ja2ZyZWVfY3JlYXRlKGVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X21hdGNoZXJfZGVzdHJveShyZXF1ZXN0X21hdGNoZXIgKnJtKSB7CisgIEdQUl9BU1NFUlQoZ3ByX3N0YWNrX2xvY2tmcmVlX3BvcChybS0+cmVxdWVzdHMpID09IC0xKTsKKyAgZ3ByX3N0YWNrX2xvY2tmcmVlX2Rlc3Ryb3kocm0tPnJlcXVlc3RzKTsKK30KKworc3RhdGljIHZvaWQga2lsbF96b21iaWUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmVsZW0sIGJvb2wgc3VjY2VzcykgeworICBncnBjX2NhbGxfZGVzdHJveShncnBjX2NhbGxfZnJvbV90b3BfZWxlbWVudChlbGVtKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfbWF0Y2hlcl96b21iaWZ5X2FsbF9wZW5kaW5nX2NhbGxzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9tYXRjaGVyICpybSkgeworICB3aGlsZSAocm0tPnBlbmRpbmdfaGVhZCkgeworICAgIGNhbGxfZGF0YSAqY2FsbGQgPSBybS0+cGVuZGluZ19oZWFkOworICAgIHJtLT5wZW5kaW5nX2hlYWQgPSBjYWxsZC0+cGVuZGluZ19uZXh0OworICAgIGdwcl9tdV9sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOworICAgIGNhbGxkLT5zdGF0ZSA9IFpPTUJJRUQ7CisgICAgZ3ByX211X3VubG9jaygmY2FsbGQtPm11X3N0YXRlKTsKKyAgICBncnBjX2Nsb3N1cmVfaW5pdCgKKyAgICAgICAgJmNhbGxkLT5raWxsX3pvbWJpZV9jbG9zdXJlLCBraWxsX3pvbWJpZSwKKyAgICAgICAgZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoZ3JwY19jYWxsX2dldF9jYWxsX3N0YWNrKGNhbGxkLT5jYWxsKSwgMCkpOworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJmNhbGxkLT5raWxsX3pvbWJpZV9jbG9zdXJlLCB0cnVlLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X21hdGNoZXJfa2lsbF9yZXF1ZXN0cyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X21hdGNoZXIgKnJtKSB7CisgIGludCByZXF1ZXN0X2lkOworICB3aGlsZSAoKHJlcXVlc3RfaWQgPSBncHJfc3RhY2tfbG9ja2ZyZWVfcG9wKHJtLT5yZXF1ZXN0cykpICE9IC0xKSB7CisgICAgZmFpbF9jYWxsKGV4ZWNfY3R4LCBzZXJ2ZXIsICZzZXJ2ZXItPnJlcXVlc3RlZF9jYWxsc1tyZXF1ZXN0X2lkXSk7CisgIH0KK30KKworLyoKKyAqIHNlcnZlciBwcm9wZXIKKyAqLworCitzdGF0aWMgdm9pZCBzZXJ2ZXJfcmVmKGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKKyAgZ3ByX3JlZigmc2VydmVyLT5pbnRlcm5hbF9yZWZjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcnZlcl9kZWxldGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKKyAgcmVnaXN0ZXJlZF9tZXRob2QgKnJtOworICBzaXplX3QgaTsKKyAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShzZXJ2ZXItPmNoYW5uZWxfYXJncyk7CisgIGdwcl9tdV9kZXN0cm95KCZzZXJ2ZXItPm11X2dsb2JhbCk7CisgIGdwcl9tdV9kZXN0cm95KCZzZXJ2ZXItPm11X2NhbGwpOworICB3aGlsZSAoKHJtID0gc2VydmVyLT5yZWdpc3RlcmVkX21ldGhvZHMpICE9IE5VTEwpIHsKKyAgICBzZXJ2ZXItPnJlZ2lzdGVyZWRfbWV0aG9kcyA9IHJtLT5uZXh0OworICAgIHJlcXVlc3RfbWF0Y2hlcl9kZXN0cm95KCZybS0+cmVxdWVzdF9tYXRjaGVyKTsKKyAgICBncHJfZnJlZShybS0+bWV0aG9kKTsKKyAgICBncHJfZnJlZShybS0+aG9zdCk7CisgICAgZ3ByX2ZyZWUocm0pOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBzZXJ2ZXItPmNxX2NvdW50OyBpKyspIHsKKyAgICBHUlBDX0NRX0lOVEVSTkFMX1VOUkVGKHNlcnZlci0+Y3FzW2ldLCAic2VydmVyIik7CisgIH0KKyAgcmVxdWVzdF9tYXRjaGVyX2Rlc3Ryb3koJnNlcnZlci0+dW5yZWdpc3RlcmVkX3JlcXVlc3RfbWF0Y2hlcik7CisgIGdwcl9zdGFja19sb2NrZnJlZV9kZXN0cm95KHNlcnZlci0+cmVxdWVzdF9mcmVlbGlzdCk7CisgIGdwcl9mcmVlKHNlcnZlci0+Y3FzKTsKKyAgZ3ByX2ZyZWUoc2VydmVyLT5wb2xsc2V0cyk7CisgIGdwcl9mcmVlKHNlcnZlci0+c2h1dGRvd25fdGFncyk7CisgIGdwcl9mcmVlKHNlcnZlci0+cmVxdWVzdGVkX2NhbGxzKTsKKyAgZ3ByX2ZyZWUoc2VydmVyKTsKK30KKworc3RhdGljIHZvaWQgc2VydmVyX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyKSB7CisgIGlmIChncHJfdW5yZWYoJnNlcnZlci0+aW50ZXJuYWxfcmVmY291bnQpKSB7CisgICAgc2VydmVyX2RlbGV0ZShleGVjX2N0eCwgc2VydmVyKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGlzX2NoYW5uZWxfb3JwaGFuZWQoY2hhbm5lbF9kYXRhICpjaGFuZCkgeworICByZXR1cm4gY2hhbmQtPm5leHQgPT0gY2hhbmQ7Cit9CisKK3N0YXRpYyB2b2lkIG9ycGhhbl9jaGFubmVsKGNoYW5uZWxfZGF0YSAqY2hhbmQpIHsKKyAgY2hhbmQtPm5leHQtPnByZXYgPSBjaGFuZC0+cHJldjsKKyAgY2hhbmQtPnByZXYtPm5leHQgPSBjaGFuZC0+bmV4dDsKKyAgY2hhbmQtPm5leHQgPSBjaGFuZC0+cHJldiA9IGNoYW5kOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfZGVzdHJveV9jaGFubmVsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBjZDsKKyAgZ3JwY19zZXJ2ZXIgKnNlcnZlciA9IGNoYW5kLT5zZXJ2ZXI7CisgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2hhbmQtPmNoYW5uZWwsICJzZXJ2ZXIiKTsKKyAgc2VydmVyX3VucmVmKGV4ZWNfY3R4LCBzZXJ2ZXIpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGNoYW5uZWxfZGF0YSAqY2hhbmQpIHsKKyAgaWYgKGlzX2NoYW5uZWxfb3JwaGFuZWQoY2hhbmQpKSByZXR1cm47CisgIEdQUl9BU1NFUlQoY2hhbmQtPnNlcnZlciAhPSBOVUxMKTsKKyAgb3JwaGFuX2NoYW5uZWwoY2hhbmQpOworICBzZXJ2ZXJfcmVmKGNoYW5kLT5zZXJ2ZXIpOworICBtYXliZV9maW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIGNoYW5kLT5zZXJ2ZXIpOworICBjaGFuZC0+ZmluaXNoX2Rlc3Ryb3lfY2hhbm5lbF9jbG9zdXJlLmNiID0gZmluaXNoX2Rlc3Ryb3lfY2hhbm5lbDsKKyAgY2hhbmQtPmZpbmlzaF9kZXN0cm95X2NoYW5uZWxfY2xvc3VyZS5jYl9hcmcgPSBjaGFuZDsKKworICBncnBjX3RyYW5zcG9ydF9vcCBvcDsKKyAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CisgIG9wLnNldF9hY2NlcHRfc3RyZWFtID0gdHJ1ZTsKKyAgb3Aub25fY29uc3VtZWQgPSAmY2hhbmQtPmZpbmlzaF9kZXN0cm95X2NoYW5uZWxfY2xvc3VyZTsKKyAgZ3JwY19jaGFubmVsX25leHRfb3AoZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2dldF9jaGFubmVsX3N0YWNrKGNoYW5kLT5jaGFubmVsKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICZvcCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9zdGFydF9uZXdfcnBjKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sIHJlcXVlc3RfbWF0Y2hlciAqcm0pIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgaW50IHJlcXVlc3RfaWQ7CisKKyAgaWYgKGdwcl9hdG1fYWNxX2xvYWQoJnNlcnZlci0+c2h1dGRvd25fZmxhZykpIHsKKyAgICBncHJfbXVfbG9jaygmY2FsbGQtPm11X3N0YXRlKTsKKyAgICBjYWxsZC0+c3RhdGUgPSBaT01CSUVEOworICAgIGdwcl9tdV91bmxvY2soJmNhbGxkLT5tdV9zdGF0ZSk7CisgICAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5raWxsX3pvbWJpZV9jbG9zdXJlLCBraWxsX3pvbWJpZSwgZWxlbSk7CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIHRydWUsIE5VTEwpOworICAgIHJldHVybjsKKyAgfQorCisgIHJlcXVlc3RfaWQgPSBncHJfc3RhY2tfbG9ja2ZyZWVfcG9wKHJtLT5yZXF1ZXN0cyk7CisgIGlmIChyZXF1ZXN0X2lkID09IC0xKSB7CisgICAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfY2FsbCk7CisgICAgZ3ByX211X2xvY2soJmNhbGxkLT5tdV9zdGF0ZSk7CisgICAgY2FsbGQtPnN0YXRlID0gUEVORElORzsKKyAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOworICAgIGlmIChybS0+cGVuZGluZ19oZWFkID09IE5VTEwpIHsKKyAgICAgIHJtLT5wZW5kaW5nX3RhaWwgPSBybS0+cGVuZGluZ19oZWFkID0gY2FsbGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJtLT5wZW5kaW5nX3RhaWwtPnBlbmRpbmdfbmV4dCA9IGNhbGxkOworICAgICAgcm0tPnBlbmRpbmdfdGFpbCA9IGNhbGxkOworICAgIH0KKyAgICBjYWxsZC0+cGVuZGluZ19uZXh0ID0gTlVMTDsKKyAgICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2NhbGwpOworICB9IGVsc2UgeworICAgIGdwcl9tdV9sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOworICAgIGNhbGxkLT5zdGF0ZSA9IEFDVElWQVRFRDsKKyAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOworICAgIGJlZ2luX2NhbGwoZXhlY19jdHgsIHNlcnZlciwgY2FsbGQsICZzZXJ2ZXItPnJlcXVlc3RlZF9jYWxsc1tyZXF1ZXN0X2lkXSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfbmV3X3JwYyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgZ3JwY19zZXJ2ZXIgKnNlcnZlciA9IGNoYW5kLT5zZXJ2ZXI7CisgIHVpbnQzMl90IGk7CisgIHVpbnQzMl90IGhhc2g7CisgIGNoYW5uZWxfcmVnaXN0ZXJlZF9tZXRob2QgKnJtOworCisgIGlmIChjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzICYmIGNhbGxkLT5wYXRoICYmIGNhbGxkLT5ob3N0KSB7CisgICAgLyogVE9ETyhjdGlsbGVyKTogdW5pZnkgdGhlc2UgdHdvIHNlYXJjaGVzICovCisgICAgLyogY2hlY2sgZm9yIGFuIGV4YWN0IG1hdGNoIHdpdGggaG9zdCAqLworICAgIGhhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0goY2FsbGQtPmhvc3QtPmhhc2gsIGNhbGxkLT5wYXRoLT5oYXNoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZF9tYXhfcHJvYmVzOyBpKyspIHsKKyAgICAgIHJtID0gJmNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbKGhhc2ggKyBpKSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZF9zbG90c107CisgICAgICBpZiAoIXJtKSBicmVhazsKKyAgICAgIGlmIChybS0+aG9zdCAhPSBjYWxsZC0+aG9zdCkgY29udGludWU7CisgICAgICBpZiAocm0tPm1ldGhvZCAhPSBjYWxsZC0+cGF0aCkgY29udGludWU7CisgICAgICBmaW5pc2hfc3RhcnRfbmV3X3JwYyhleGVjX2N0eCwgc2VydmVyLCBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJtLT5zZXJ2ZXJfcmVnaXN0ZXJlZF9tZXRob2QtPnJlcXVlc3RfbWF0Y2hlcik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGNoZWNrIGZvciBhIHdpbGRjYXJkIG1ldGhvZCBkZWZpbml0aW9uIChubyBob3N0IHNldCkgKi8KKyAgICBoYXNoID0gR1JQQ19NRFNUUl9LVl9IQVNIKDAsIGNhbGxkLT5wYXRoLT5oYXNoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZF9tYXhfcHJvYmVzOyBpKyspIHsKKyAgICAgIHJtID0gJmNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbKGhhc2ggKyBpKSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZF9zbG90c107CisgICAgICBpZiAoIXJtKSBicmVhazsKKyAgICAgIGlmIChybS0+aG9zdCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgIGlmIChybS0+bWV0aG9kICE9IGNhbGxkLT5wYXRoKSBjb250aW51ZTsKKyAgICAgIGZpbmlzaF9zdGFydF9uZXdfcnBjKGV4ZWNfY3R4LCBzZXJ2ZXIsIGVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm0tPnNlcnZlcl9yZWdpc3RlcmVkX21ldGhvZC0+cmVxdWVzdF9tYXRjaGVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZmluaXNoX3N0YXJ0X25ld19ycGMoZXhlY19jdHgsIHNlcnZlciwgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlci0+dW5yZWdpc3RlcmVkX3JlcXVlc3RfbWF0Y2hlcik7Cit9CisKK3N0YXRpYyBpbnQgbnVtX2xpc3RlbmVycyhncnBjX3NlcnZlciAqc2VydmVyKSB7CisgIGxpc3RlbmVyICpsOworICBpbnQgbiA9IDA7CisgIGZvciAobCA9IHNlcnZlci0+bGlzdGVuZXJzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIG4rKzsKKyAgfQorICByZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgZG9uZV9zaHV0ZG93bl9ldmVudChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX2NvbXBsZXRpb24gKmNvbXBsZXRpb24pIHsKKyAgc2VydmVyX3VucmVmKGV4ZWNfY3R4LCBzZXJ2ZXIpOworfQorCitzdGF0aWMgaW50IG51bV9jaGFubmVscyhncnBjX3NlcnZlciAqc2VydmVyKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQ7CisgIGludCBuID0gMDsKKyAgZm9yIChjaGFuZCA9IHNlcnZlci0+cm9vdF9jaGFubmVsX2RhdGEubmV4dDsKKyAgICAgICBjaGFuZCAhPSAmc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YTsgY2hhbmQgPSBjaGFuZC0+bmV4dCkgeworICAgIG4rKzsKKyAgfQorICByZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQga2lsbF9wZW5kaW5nX3dvcmtfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKKyAgcmVnaXN0ZXJlZF9tZXRob2QgKnJtOworICByZXF1ZXN0X21hdGNoZXJfa2lsbF9yZXF1ZXN0cyhleGVjX2N0eCwgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT51bnJlZ2lzdGVyZWRfcmVxdWVzdF9tYXRjaGVyKTsKKyAgcmVxdWVzdF9tYXRjaGVyX3pvbWJpZnlfYWxsX3BlbmRpbmdfY2FsbHMoCisgICAgICBleGVjX2N0eCwgJnNlcnZlci0+dW5yZWdpc3RlcmVkX3JlcXVlc3RfbWF0Y2hlcik7CisgIGZvciAocm0gPSBzZXJ2ZXItPnJlZ2lzdGVyZWRfbWV0aG9kczsgcm07IHJtID0gcm0tPm5leHQpIHsKKyAgICByZXF1ZXN0X21hdGNoZXJfa2lsbF9yZXF1ZXN0cyhleGVjX2N0eCwgc2VydmVyLCAmcm0tPnJlcXVlc3RfbWF0Y2hlcik7CisgICAgcmVxdWVzdF9tYXRjaGVyX3pvbWJpZnlfYWxsX3BlbmRpbmdfY2FsbHMoZXhlY19jdHgsICZybS0+cmVxdWVzdF9tYXRjaGVyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBtYXliZV9maW5pc2hfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZXJ2ZXIgKnNlcnZlcikgeworICBzaXplX3QgaTsKKyAgaWYgKCFncHJfYXRtX2FjcV9sb2FkKCZzZXJ2ZXItPnNodXRkb3duX2ZsYWcpIHx8IHNlcnZlci0+c2h1dGRvd25fcHVibGlzaGVkKSB7CisgICAgcmV0dXJuOworICB9CisKKyAga2lsbF9wZW5kaW5nX3dvcmtfbG9ja2VkKGV4ZWNfY3R4LCBzZXJ2ZXIpOworCisgIGlmIChzZXJ2ZXItPnJvb3RfY2hhbm5lbF9kYXRhLm5leHQgIT0gJnNlcnZlci0+cm9vdF9jaGFubmVsX2RhdGEgfHwKKyAgICAgIHNlcnZlci0+bGlzdGVuZXJzX2Rlc3Ryb3llZCA8IG51bV9saXN0ZW5lcnMoc2VydmVyKSkgeworICAgIGlmIChncHJfdGltZV9jbXAoZ3ByX3RpbWVfc3ViKGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPmxhc3Rfc2h1dGRvd25fbWVzc2FnZV90aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lX2Zyb21fc2Vjb25kcygxLCBHUFJfVElNRVNQQU4pKSA+PSAwKSB7CisgICAgICBzZXJ2ZXItPmxhc3Rfc2h1dGRvd25fbWVzc2FnZV90aW1lID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOworICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsCisgICAgICAgICAgICAgICJXYWl0aW5nIGZvciAlZCBjaGFubmVscyBhbmQgJWQvJWQgbGlzdGVuZXJzIHRvIGJlIGRlc3Ryb3llZCIKKyAgICAgICAgICAgICAgIiBiZWZvcmUgc2h1dHRpbmcgZG93biBzZXJ2ZXIiLAorICAgICAgICAgICAgICBudW1fY2hhbm5lbHMoc2VydmVyKSwKKyAgICAgICAgICAgICAgbnVtX2xpc3RlbmVycyhzZXJ2ZXIpIC0gc2VydmVyLT5saXN0ZW5lcnNfZGVzdHJveWVkLAorICAgICAgICAgICAgICBudW1fbGlzdGVuZXJzKHNlcnZlcikpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgc2VydmVyLT5zaHV0ZG93bl9wdWJsaXNoZWQgPSAxOworICBmb3IgKGkgPSAwOyBpIDwgc2VydmVyLT5udW1fc2h1dGRvd25fdGFnczsgaSsrKSB7CisgICAgc2VydmVyX3JlZihzZXJ2ZXIpOworICAgIGdycGNfY3FfZW5kX29wKGV4ZWNfY3R4LCBzZXJ2ZXItPnNodXRkb3duX3RhZ3NbaV0uY3EsCisgICAgICAgICAgICAgICAgICAgc2VydmVyLT5zaHV0ZG93bl90YWdzW2ldLnRhZywgMSwgZG9uZV9zaHV0ZG93bl9ldmVudCwgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICZzZXJ2ZXItPnNodXRkb3duX3RhZ3NbaV0uY29tcGxldGlvbik7CisgIH0KK30KKworc3RhdGljIGdycGNfbWRlbGVtICpzZXJ2ZXJfZmlsdGVyKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gdXNlcl9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX1BBVEgpIHsKKyAgICBjYWxsZC0+cGF0aCA9IEdSUENfTURTVFJfUkVGKG1kLT52YWx1ZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSBpZiAobWQtPmtleSA9PSBHUlBDX01EU1RSX0FVVEhPUklUWSkgeworICAgIGNhbGxkLT5ob3N0ID0gR1JQQ19NRFNUUl9SRUYobWQtPnZhbHVlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlcnZlcl9vbl9yZWN2X2luaXRpYWxfbWV0YWRhdGEoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gcHRyOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBncHJfdGltZXNwZWMgb3BfZGVhZGxpbmU7CisKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIoY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSwgc2VydmVyX2ZpbHRlciwgZWxlbSk7CisgIG9wX2RlYWRsaW5lID0gY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YS0+ZGVhZGxpbmU7CisgIGlmICgwICE9IGdwcl90aW1lX2NtcChvcF9kZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUob3BfZGVhZGxpbmUuY2xvY2tfdHlwZSkpKSB7CisgICAgY2FsbGQtPmRlYWRsaW5lID0gb3BfZGVhZGxpbmU7CisgIH0KKyAgaWYgKGNhbGxkLT5ob3N0ICYmIGNhbGxkLT5wYXRoKSB7CisgICAgLyogZG8gbm90aGluZyAqLworICB9IGVsc2UgeworICAgIHN1Y2Nlc3MgPSAwOworICB9CisKKyAgY2FsbGQtPm9uX2RvbmVfcmVjdl9pbml0aWFsX21ldGFkYXRhLT5jYigKKyAgICAgIGV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2X2luaXRpYWxfbWV0YWRhdGEtPmNiX2FyZywgc3VjY2Vzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcnZlcl9tdXRhdGVfb3AoZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKworICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSA9IG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGE7CisgICAgY2FsbGQtPm9uX2RvbmVfcmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKKyAgICBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID0gJmNhbGxkLT5zZXJ2ZXJfb25fcmVjdl9pbml0aWFsX21ldGFkYXRhOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlcnZlcl9zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIEdSUENfQ0FMTF9MT0dfT1AoR1BSX0lORk8sIGVsZW0sIG9wKTsKKyAgc2VydmVyX211dGF0ZV9vcChlbGVtLCBvcCk7CisgIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Cit9CisKK3N0YXRpYyB2b2lkIGdvdF9pbml0aWFsX21ldGFkYXRhKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKKyAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSBwdHI7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGlmIChzdWNjZXNzKSB7CisgICAgc3RhcnRfbmV3X3JwYyhleGVjX2N0eCwgZWxlbSk7CisgIH0gZWxzZSB7CisgICAgZ3ByX211X2xvY2soJmNhbGxkLT5tdV9zdGF0ZSk7CisgICAgaWYgKGNhbGxkLT5zdGF0ZSA9PSBOT1RfU1RBUlRFRCkgeworICAgICAgY2FsbGQtPnN0YXRlID0gWk9NQklFRDsKKyAgICAgIGdwcl9tdV91bmxvY2soJmNhbGxkLT5tdV9zdGF0ZSk7CisgICAgICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIGtpbGxfem9tYmllLCBlbGVtKTsKKyAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJmNhbGxkLT5raWxsX3pvbWJpZV9jbG9zdXJlLCB0cnVlLCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKGNhbGxkLT5zdGF0ZSA9PSBQRU5ESU5HKSB7CisgICAgICBjYWxsZC0+c3RhdGUgPSBaT01CSUVEOworICAgICAgZ3ByX211X3VubG9jaygmY2FsbGQtPm11X3N0YXRlKTsKKyAgICAgIC8qIHpvbWJpZWQgY2FsbCB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIGl0J3MgcmVtb3ZlZCBmcm9tIHRoZSBwZW5kaW5nCisgICAgICAgICBxdWV1ZS4uLiBsYXRlciAqLworICAgIH0gZWxzZSB7CisgICAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBhY2NlcHRfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdHJhbnNwb3J0X3NlcnZlcl9kYXRhKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBjZDsKKyAgLyogY3JlYXRlIGEgY2FsbCAqLworICBncnBjX2NhbGwgKmNhbGwgPQorICAgICAgZ3JwY19jYWxsX2NyZWF0ZShjaGFuZC0+Y2hhbm5lbCwgTlVMTCwgMCwgTlVMTCwgdHJhbnNwb3J0X3NlcnZlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfTU9OT1RPTklDKSk7CisgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0KKyAgICAgIGdycGNfY2FsbF9zdGFja19lbGVtZW50KGdycGNfY2FsbF9nZXRfY2FsbF9zdGFjayhjYWxsKSwgMCk7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7CisgIGdycGNfb3Agb3A7CisgIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOworICBvcC5vcCA9IEdSUENfT1BfUkVDVl9JTklUSUFMX01FVEFEQVRBOworICBvcC5kYXRhLnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSA9ICZjYWxsZC0+aW5pdGlhbF9tZXRhZGF0YTsKKyAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5nb3RfaW5pdGlhbF9tZXRhZGF0YSwgZ290X2luaXRpYWxfbWV0YWRhdGEsIGVsZW0pOworICBncnBjX2NhbGxfc3RhcnRfYmF0Y2hfYW5kX2V4ZWN1dGUoZXhlY19jdHgsIGNhbGwsICZvcCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsZC0+Z290X2luaXRpYWxfbWV0YWRhdGEpOworfQorCitzdGF0aWMgdm9pZCBjaGFubmVsX2Nvbm5lY3Rpdml0eV9jaGFuZ2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdGF0dXNfaWdub3JlZCkgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gY2Q7CisgIGdycGNfc2VydmVyICpzZXJ2ZXIgPSBjaGFuZC0+c2VydmVyOworICBpZiAoY2hhbmQtPmNvbm5lY3Rpdml0eV9zdGF0ZSAhPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSkgeworICAgIGdycGNfdHJhbnNwb3J0X29wIG9wOworICAgIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOworICAgIG9wLm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UgPSAmY2hhbmQtPmNoYW5uZWxfY29ubmVjdGl2aXR5X2NoYW5nZWQsCisgICAgb3AuY29ubmVjdGl2aXR5X3N0YXRlID0gJmNoYW5kLT5jb25uZWN0aXZpdHlfc3RhdGU7CisgICAgZ3JwY19jaGFubmVsX25leHRfb3AoZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFuZC0+Y2hhbm5lbCksIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvcCk7CisgIH0gZWxzZSB7CisgICAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKKyAgICBkZXN0cm95X2NoYW5uZWwoZXhlY19jdHgsIGNoYW5kKTsKKyAgICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7CisgICAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjaGFuZC0+Y2hhbm5lbCwgImNvbm5lY3Rpdml0eSIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKKyAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgbWVtc2V0KGNhbGxkLCAwLCBzaXplb2YoY2FsbF9kYXRhKSk7CisgIGNhbGxkLT5kZWFkbGluZSA9IGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19SRUFMVElNRSk7CisgIGNhbGxkLT5jYWxsID0gZ3JwY19jYWxsX2Zyb21fdG9wX2VsZW1lbnQoZWxlbSk7CisgIGdwcl9tdV9pbml0KCZjYWxsZC0+bXVfc3RhdGUpOworCisgIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsZC0+c2VydmVyX29uX3JlY3ZfaW5pdGlhbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyX29uX3JlY3ZfaW5pdGlhbF9tZXRhZGF0YSwgZWxlbSk7CisKKyAgc2VydmVyX3JlZihjaGFuZC0+c2VydmVyKTsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgeworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworCisgIEdQUl9BU1NFUlQoY2FsbGQtPnN0YXRlICE9IFBFTkRJTkcpOworCisgIGlmIChjYWxsZC0+aG9zdCkgeworICAgIEdSUENfTURTVFJfVU5SRUYoY2FsbGQtPmhvc3QpOworICB9CisgIGlmIChjYWxsZC0+cGF0aCkgeworICAgIEdSUENfTURTVFJfVU5SRUYoY2FsbGQtPnBhdGgpOworICB9CisgIGdycGNfbWV0YWRhdGFfYXJyYXlfZGVzdHJveSgmY2FsbGQtPmluaXRpYWxfbWV0YWRhdGEpOworCisgIGdwcl9tdV9kZXN0cm95KCZjYWxsZC0+bXVfc3RhdGUpOworCisgIHNlcnZlcl91bnJlZihleGVjX2N0eCwgY2hhbmQtPnNlcnZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzICphcmdzKSB7CisgIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7CisgIEdQUl9BU1NFUlQoYXJncy0+aXNfZmlyc3QpOworICBHUFJfQVNTRVJUKCFhcmdzLT5pc19sYXN0KTsKKyAgY2hhbmQtPnNlcnZlciA9IE5VTEw7CisgIGNoYW5kLT5jaGFubmVsID0gTlVMTDsKKyAgY2hhbmQtPm5leHQgPSBjaGFuZC0+cHJldiA9IGNoYW5kOworICBjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzID0gTlVMTDsKKyAgY2hhbmQtPmNvbm5lY3Rpdml0eV9zdGF0ZSA9IEdSUENfQ0hBTk5FTF9JRExFOworICBncnBjX2Nsb3N1cmVfaW5pdCgmY2hhbmQtPmNoYW5uZWxfY29ubmVjdGl2aXR5X2NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY29ubmVjdGl2aXR5X2NoYW5nZWQsIGNoYW5kKTsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkgeworICBzaXplX3QgaTsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKKyAgaWYgKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHMpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kX3Nsb3RzOyBpKyspIHsKKyAgICAgIGlmIChjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzW2ldLm1ldGhvZCkgeworICAgICAgICBHUlBDX01EU1RSX1VOUkVGKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbaV0ubWV0aG9kKTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzW2ldLmhvc3QpIHsKKyAgICAgICAgR1JQQ19NRFNUUl9VTlJFRihjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzW2ldLmhvc3QpOworICAgICAgfQorICAgIH0KKyAgICBncHJfZnJlZShjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzKTsKKyAgfQorICBpZiAoY2hhbmQtPnNlcnZlcikgeworICAgIGdwcl9tdV9sb2NrKCZjaGFuZC0+c2VydmVyLT5tdV9nbG9iYWwpOworICAgIGNoYW5kLT5uZXh0LT5wcmV2ID0gY2hhbmQtPnByZXY7CisgICAgY2hhbmQtPnByZXYtPm5leHQgPSBjaGFuZC0+bmV4dDsKKyAgICBjaGFuZC0+bmV4dCA9IGNoYW5kLT5wcmV2ID0gY2hhbmQ7CisgICAgbWF5YmVfZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBjaGFuZC0+c2VydmVyKTsKKyAgICBncHJfbXVfdW5sb2NrKCZjaGFuZC0+c2VydmVyLT5tdV9nbG9iYWwpOworICAgIHNlcnZlcl91bnJlZihleGVjX2N0eCwgY2hhbmQtPnNlcnZlcik7CisgIH0KK30KKworY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX3NlcnZlcl90b3BfZmlsdGVyID0geworICAgIHNlcnZlcl9zdGFydF90cmFuc3BvcnRfc3RyZWFtX29wLAorICAgIGdycGNfY2hhbm5lbF9uZXh0X29wLAorICAgIHNpemVvZihjYWxsX2RhdGEpLAorICAgIGluaXRfY2FsbF9lbGVtLAorICAgIGdycGNfY2FsbF9zdGFja19pZ25vcmVfc2V0X3BvbGxzZXQsCisgICAgZGVzdHJveV9jYWxsX2VsZW0sCisgICAgc2l6ZW9mKGNoYW5uZWxfZGF0YSksCisgICAgaW5pdF9jaGFubmVsX2VsZW0sCisgICAgZGVzdHJveV9jaGFubmVsX2VsZW0sCisgICAgZ3JwY19jYWxsX25leHRfZ2V0X3BlZXIsCisgICAgInNlcnZlciIsCit9OworCit2b2lkIGdycGNfc2VydmVyX3JlZ2lzdGVyX2NvbXBsZXRpb25fcXVldWUoZ3JwY19zZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc2VydmVkKSB7CisgIHNpemVfdCBpLCBuOworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX3NlcnZlcl9yZWdpc3Rlcl9jb21wbGV0aW9uX3F1ZXVlKHNlcnZlcj0lcCwgY3E9JXAsIHJlc2VydmVkPSVwKSIsIDMsCisgICAgICAoc2VydmVyLCBjcSwgcmVzZXJ2ZWQpKTsKKyAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOworICBmb3IgKGkgPSAwOyBpIDwgc2VydmVyLT5jcV9jb3VudDsgaSsrKSB7CisgICAgaWYgKHNlcnZlci0+Y3FzW2ldID09IGNxKSByZXR1cm47CisgIH0KKyAgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY3EsICJzZXJ2ZXIiKTsKKyAgZ3JwY19jcV9tYXJrX3NlcnZlcl9jcShjcSk7CisgIG4gPSBzZXJ2ZXItPmNxX2NvdW50Kys7CisgIHNlcnZlci0+Y3FzID0gZ3ByX3JlYWxsb2Moc2VydmVyLT5jcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5jcV9jb3VudCAqIHNpemVvZihncnBjX2NvbXBsZXRpb25fcXVldWUgKikpOworICBzZXJ2ZXItPmNxc1tuXSA9IGNxOworfQorCitncnBjX3NlcnZlciAqZ3JwY19zZXJ2ZXJfY3JlYXRlKGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLCB2b2lkICpyZXNlcnZlZCkgeworICBzaXplX3QgaTsKKworICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfY3JlYXRlKCVwLCAlcCkiLCAyLCAoYXJncywgcmVzZXJ2ZWQpKTsKKworICBncnBjX3NlcnZlciAqc2VydmVyID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZXJ2ZXIpKTsKKworICBHUFJfQVNTRVJUKGdycGNfaXNfaW5pdGlhbGl6ZWQoKSAmJiAiY2FsbCBncnBjX2luaXQoKSIpOworCisgIG1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihncnBjX3NlcnZlcikpOworCisgIGdwcl9tdV9pbml0KCZzZXJ2ZXItPm11X2dsb2JhbCk7CisgIGdwcl9tdV9pbml0KCZzZXJ2ZXItPm11X2NhbGwpOworCisgIC8qIGRlY3JlbWVudGVkIGJ5IGdycGNfc2VydmVyX2Rlc3Ryb3kgKi8KKyAgZ3ByX3JlZl9pbml0KCZzZXJ2ZXItPmludGVybmFsX3JlZmNvdW50LCAxKTsKKyAgc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YS5uZXh0ID0gc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YS5wcmV2ID0KKyAgICAgICZzZXJ2ZXItPnJvb3RfY2hhbm5lbF9kYXRhOworCisgIC8qIFRPRE8oY3RpbGxlcik6IGV4cG9zZSBhIGNoYW5uZWxfYXJnIGZvciB0aGlzICovCisgIHNlcnZlci0+bWF4X3JlcXVlc3RlZF9jYWxscyA9IDMyNzY4OworICBzZXJ2ZXItPnJlcXVlc3RfZnJlZWxpc3QgPQorICAgICAgZ3ByX3N0YWNrX2xvY2tmcmVlX2NyZWF0ZShzZXJ2ZXItPm1heF9yZXF1ZXN0ZWRfY2FsbHMpOworICBmb3IgKGkgPSAwOyBpIDwgKHNpemVfdClzZXJ2ZXItPm1heF9yZXF1ZXN0ZWRfY2FsbHM7IGkrKykgeworICAgIGdwcl9zdGFja19sb2NrZnJlZV9wdXNoKHNlcnZlci0+cmVxdWVzdF9mcmVlbGlzdCwgKGludClpKTsKKyAgfQorICByZXF1ZXN0X21hdGNoZXJfaW5pdCgmc2VydmVyLT51bnJlZ2lzdGVyZWRfcmVxdWVzdF9tYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPm1heF9yZXF1ZXN0ZWRfY2FsbHMpOworICBzZXJ2ZXItPnJlcXVlc3RlZF9jYWxscyA9IGdwcl9tYWxsb2Moc2VydmVyLT5tYXhfcmVxdWVzdGVkX2NhbGxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqc2VydmVyLT5yZXF1ZXN0ZWRfY2FsbHMpKTsKKworICBzZXJ2ZXItPmNoYW5uZWxfYXJncyA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHkoYXJncyk7CisKKyAgcmV0dXJuIHNlcnZlcjsKK30KKworc3RhdGljIGludCBzdHJlcShjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKSB7CisgIGlmIChhID09IE5VTEwgJiYgYiA9PSBOVUxMKSByZXR1cm4gMTsKKyAgaWYgKGEgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChiID09IE5VTEwpIHJldHVybiAwOworICByZXR1cm4gMCA9PSBzdHJjbXAoYSwgYik7Cit9CisKK3ZvaWQgKmdycGNfc2VydmVyX3JlZ2lzdGVyX21ldGhvZChncnBjX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICptZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCkgeworICByZWdpc3RlcmVkX21ldGhvZCAqbTsKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX3JlZ2lzdGVyX21ldGhvZChzZXJ2ZXI9JXAsIG1ldGhvZD0lcywgaG9zdD0lcykiLAorICAgICAgICAgICAgICAgICAzLCAoc2VydmVyLCBtZXRob2QsIGhvc3QpKTsKKyAgaWYgKCFtZXRob2QpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwKKyAgICAgICAgICAgICJncnBjX3NlcnZlcl9yZWdpc3Rlcl9tZXRob2QgbWV0aG9kIHN0cmluZyBjYW5ub3QgYmUgTlVMTCIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAobSA9IHNlcnZlci0+cmVnaXN0ZXJlZF9tZXRob2RzOyBtOyBtID0gbS0+bmV4dCkgeworICAgIGlmIChzdHJlcShtLT5tZXRob2QsIG1ldGhvZCkgJiYgc3RyZXEobS0+aG9zdCwgaG9zdCkpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiBmb3IgJXNAJXMiLCBtZXRob2QsCisgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBtID0gZ3ByX21hbGxvYyhzaXplb2YocmVnaXN0ZXJlZF9tZXRob2QpKTsKKyAgbWVtc2V0KG0sIDAsIHNpemVvZigqbSkpOworICByZXF1ZXN0X21hdGNoZXJfaW5pdCgmbS0+cmVxdWVzdF9tYXRjaGVyLCBzZXJ2ZXItPm1heF9yZXF1ZXN0ZWRfY2FsbHMpOworICBtLT5tZXRob2QgPSBncHJfc3RyZHVwKG1ldGhvZCk7CisgIG0tPmhvc3QgPSBncHJfc3RyZHVwKGhvc3QpOworICBtLT5uZXh0ID0gc2VydmVyLT5yZWdpc3RlcmVkX21ldGhvZHM7CisgIHNlcnZlci0+cmVnaXN0ZXJlZF9tZXRob2RzID0gbTsKKyAgcmV0dXJuIG07Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfc3RhcnQoZ3JwY19zZXJ2ZXIgKnNlcnZlcikgeworICBsaXN0ZW5lciAqbDsKKyAgc2l6ZV90IGk7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX3N0YXJ0KHNlcnZlcj0lcCkiLCAxLCAoc2VydmVyKSk7CisKKyAgc2VydmVyLT5wb2xsc2V0cyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfcG9sbHNldCAqKSAqIHNlcnZlci0+Y3FfY291bnQpOworICBmb3IgKGkgPSAwOyBpIDwgc2VydmVyLT5jcV9jb3VudDsgaSsrKSB7CisgICAgc2VydmVyLT5wb2xsc2V0c1tpXSA9IGdycGNfY3FfcG9sbHNldChzZXJ2ZXItPmNxc1tpXSk7CisgIH0KKworICBmb3IgKGwgPSBzZXJ2ZXItPmxpc3RlbmVyczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBsLT5zdGFydCgmZXhlY19jdHgsIHNlcnZlciwgbC0+YXJnLCBzZXJ2ZXItPnBvbGxzZXRzLCBzZXJ2ZXItPmNxX2NvdW50KTsKKyAgfQorCisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfc2V0dXBfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncykgeworICBzaXplX3QgaTsKKyAgc2l6ZV90IG51bV9yZWdpc3RlcmVkX21ldGhvZHM7CisgIHNpemVfdCBhbGxvYzsKKyAgcmVnaXN0ZXJlZF9tZXRob2QgKnJtOworICBjaGFubmVsX3JlZ2lzdGVyZWRfbWV0aG9kICpjcm07CisgIGdycGNfY2hhbm5lbCAqY2hhbm5lbDsKKyAgY2hhbm5lbF9kYXRhICpjaGFuZDsKKyAgZ3JwY19tZHN0ciAqaG9zdDsKKyAgZ3JwY19tZHN0ciAqbWV0aG9kOworICB1aW50MzJfdCBoYXNoOworICBzaXplX3Qgc2xvdHM7CisgIHVpbnQzMl90IHByb2JlczsKKyAgdWludDMyX3QgbWF4X3Byb2JlcyA9IDA7CisgIGdycGNfdHJhbnNwb3J0X29wIG9wOworCisgIGZvciAoaSA9IDA7IGkgPCBzLT5jcV9jb3VudDsgaSsrKSB7CisgICAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CisgICAgb3AuYmluZF9wb2xsc2V0ID0gZ3JwY19jcV9wb2xsc2V0KHMtPmNxc1tpXSk7CisgICAgZ3JwY190cmFuc3BvcnRfcGVyZm9ybV9vcChleGVjX2N0eCwgdHJhbnNwb3J0LCAmb3ApOworICB9CisKKyAgY2hhbm5lbCA9CisgICAgICBncnBjX2NoYW5uZWxfY3JlYXRlKGV4ZWNfY3R4LCBOVUxMLCBhcmdzLCBHUlBDX1NFUlZFUl9DSEFOTkVMLCB0cmFuc3BvcnQpOworICBjaGFuZCA9IChjaGFubmVsX2RhdGEgKilncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudCgKKyAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2dldF9jaGFubmVsX3N0YWNrKGNoYW5uZWwpLCAwKQorICAgICAgICAgICAgICAtPmNoYW5uZWxfZGF0YTsKKyAgY2hhbmQtPnNlcnZlciA9IHM7CisgIHNlcnZlcl9yZWYocyk7CisgIGNoYW5kLT5jaGFubmVsID0gY2hhbm5lbDsKKworICBudW1fcmVnaXN0ZXJlZF9tZXRob2RzID0gMDsKKyAgZm9yIChybSA9IHMtPnJlZ2lzdGVyZWRfbWV0aG9kczsgcm07IHJtID0gcm0tPm5leHQpIHsKKyAgICBudW1fcmVnaXN0ZXJlZF9tZXRob2RzKys7CisgIH0KKyAgLyogYnVpbGQgYSBsb29rdXAgdGFibGUgcGhyYXNlZCBpbiB0ZXJtcyBvZiBtZHN0cidzIGluIHRoaXMgY2hhbm5lbHMgY29udGV4dAorICAgICB0byBxdWlja2x5IGZpbmQgcmVnaXN0ZXJlZCBtZXRob2RzICovCisgIGlmIChudW1fcmVnaXN0ZXJlZF9tZXRob2RzID4gMCkgeworICAgIHNsb3RzID0gMiAqIG51bV9yZWdpc3RlcmVkX21ldGhvZHM7CisgICAgYWxsb2MgPSBzaXplb2YoY2hhbm5lbF9yZWdpc3RlcmVkX21ldGhvZCkgKiBzbG90czsKKyAgICBjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzID0gZ3ByX21hbGxvYyhhbGxvYyk7CisgICAgbWVtc2V0KGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHMsIDAsIGFsbG9jKTsKKyAgICBmb3IgKHJtID0gcy0+cmVnaXN0ZXJlZF9tZXRob2RzOyBybTsgcm0gPSBybS0+bmV4dCkgeworICAgICAgaG9zdCA9IHJtLT5ob3N0ID8gZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhybS0+aG9zdCkgOiBOVUxMOworICAgICAgbWV0aG9kID0gZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhybS0+bWV0aG9kKTsKKyAgICAgIGhhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0goaG9zdCA/IGhvc3QtPmhhc2ggOiAwLCBtZXRob2QtPmhhc2gpOworICAgICAgZm9yIChwcm9iZXMgPSAwOyBjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzWyhoYXNoICsgcHJvYmVzKSAlIHNsb3RzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlcnZlcl9yZWdpc3RlcmVkX21ldGhvZCAhPSBOVUxMOworICAgICAgICAgICBwcm9iZXMrKykKKyAgICAgICAgOworICAgICAgaWYgKHByb2JlcyA+IG1heF9wcm9iZXMpIG1heF9wcm9iZXMgPSBwcm9iZXM7CisgICAgICBjcm0gPSAmY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kc1soaGFzaCArIHByb2JlcykgJSBzbG90c107CisgICAgICBjcm0tPnNlcnZlcl9yZWdpc3RlcmVkX21ldGhvZCA9IHJtOworICAgICAgY3JtLT5ob3N0ID0gaG9zdDsKKyAgICAgIGNybS0+bWV0aG9kID0gbWV0aG9kOworICAgIH0KKyAgICBHUFJfQVNTRVJUKHNsb3RzIDw9IFVJTlQzMl9NQVgpOworICAgIGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZF9zbG90cyA9ICh1aW50MzJfdClzbG90czsKKyAgICBjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RfbWF4X3Byb2JlcyA9IG1heF9wcm9iZXM7CisgIH0KKworICBncHJfbXVfbG9jaygmcy0+bXVfZ2xvYmFsKTsKKyAgY2hhbmQtPm5leHQgPSAmcy0+cm9vdF9jaGFubmVsX2RhdGE7CisgIGNoYW5kLT5wcmV2ID0gY2hhbmQtPm5leHQtPnByZXY7CisgIGNoYW5kLT5uZXh0LT5wcmV2ID0gY2hhbmQtPnByZXYtPm5leHQgPSBjaGFuZDsKKyAgZ3ByX211X3VubG9jaygmcy0+bXVfZ2xvYmFsKTsKKworICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGNoYW5uZWwsICJjb25uZWN0aXZpdHkiKTsKKyAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7CisgIG9wLnNldF9hY2NlcHRfc3RyZWFtID0gdHJ1ZTsKKyAgb3Auc2V0X2FjY2VwdF9zdHJlYW1fZm4gPSBhY2NlcHRfc3RyZWFtOworICBvcC5zZXRfYWNjZXB0X3N0cmVhbV91c2VyX2RhdGEgPSBjaGFuZDsKKyAgb3Aub25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSA9ICZjaGFuZC0+Y2hhbm5lbF9jb25uZWN0aXZpdHlfY2hhbmdlZDsKKyAgb3AuY29ubmVjdGl2aXR5X3N0YXRlID0gJmNoYW5kLT5jb25uZWN0aXZpdHlfc3RhdGU7CisgIG9wLmRpc2Nvbm5lY3QgPSBncHJfYXRtX2FjcV9sb2FkKCZzLT5zaHV0ZG93bl9mbGFnKSAhPSAwOworICBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGV4ZWNfY3R4LCB0cmFuc3BvcnQsICZvcCk7Cit9CisKK3ZvaWQgZG9uZV9wdWJsaXNoZWRfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmRvbmVfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX2NvbXBsZXRpb24gKnN0b3JhZ2UpIHsKKyAgKHZvaWQpZG9uZV9hcmc7CisgIGdwcl9mcmVlKHN0b3JhZ2UpOworfQorCitzdGF0aWMgdm9pZCBsaXN0ZW5lcl9kZXN0cm95X2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIGdycGNfc2VydmVyICpzZXJ2ZXIgPSBzOworICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOworICBzZXJ2ZXItPmxpc3RlbmVyc19kZXN0cm95ZWQrKzsKKyAgbWF5YmVfZmluaXNoX3NodXRkb3duKGV4ZWNfY3R4LCBzZXJ2ZXIpOworICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfc2h1dGRvd25fYW5kX25vdGlmeShncnBjX3NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsIHZvaWQgKnRhZykgeworICBsaXN0ZW5lciAqbDsKKyAgc2h1dGRvd25fdGFnICpzZHQ7CisgIGNoYW5uZWxfYnJvYWRjYXN0ZXIgYnJvYWRjYXN0ZXI7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX3NodXRkb3duX2FuZF9ub3RpZnkoc2VydmVyPSVwLCBjcT0lcCwgdGFnPSVwKSIsIDMsCisgICAgICAgICAgICAgICAgIChzZXJ2ZXIsIGNxLCB0YWcpKTsKKworICAvKiBsb2NrLCBhbmQgZ2F0aGVyIHVwIHNvbWUgc3R1ZmYgdG8gZG8gKi8KKyAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKKyAgZ3JwY19jcV9iZWdpbl9vcChjcSwgdGFnKTsKKyAgaWYgKHNlcnZlci0+c2h1dGRvd25fcHVibGlzaGVkKSB7CisgICAgZ3JwY19jcV9lbmRfb3AoJmV4ZWNfY3R4LCBjcSwgdGFnLCAxLCBkb25lX3B1Ymxpc2hlZF9zaHV0ZG93biwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX2NxX2NvbXBsZXRpb24pKSk7CisgICAgZ3ByX211X3VubG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOworICAgIGdvdG8gZG9uZTsKKyAgfQorICBzZXJ2ZXItPnNodXRkb3duX3RhZ3MgPQorICAgICAgZ3ByX3JlYWxsb2Moc2VydmVyLT5zaHV0ZG93bl90YWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNodXRkb3duX3RhZykgKiAoc2VydmVyLT5udW1fc2h1dGRvd25fdGFncyArIDEpKTsKKyAgc2R0ID0gJnNlcnZlci0+c2h1dGRvd25fdGFnc1tzZXJ2ZXItPm51bV9zaHV0ZG93bl90YWdzKytdOworICBzZHQtPnRhZyA9IHRhZzsKKyAgc2R0LT5jcSA9IGNxOworICBpZiAoZ3ByX2F0bV9hY3FfbG9hZCgmc2VydmVyLT5zaHV0ZG93bl9mbGFnKSkgeworICAgIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzZXJ2ZXItPmxhc3Rfc2h1dGRvd25fbWVzc2FnZV90aW1lID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpOworCisgIGNoYW5uZWxfYnJvYWRjYXN0ZXJfaW5pdChzZXJ2ZXIsICZicm9hZGNhc3Rlcik7CisKKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJnNlcnZlci0+c2h1dGRvd25fZmxhZywgMSk7CisKKyAgLyogY29sbGVjdCBhbGwgdW5yZWdpc3RlcmVkIHRoZW4gcmVnaXN0ZXJlZCBjYWxscyAqLworICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9jYWxsKTsKKyAga2lsbF9wZW5kaW5nX3dvcmtfbG9ja2VkKCZleGVjX2N0eCwgc2VydmVyKTsKKyAgZ3ByX211X3VubG9jaygmc2VydmVyLT5tdV9jYWxsKTsKKworICBtYXliZV9maW5pc2hfc2h1dGRvd24oJmV4ZWNfY3R4LCBzZXJ2ZXIpOworICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7CisKKyAgLyogU2h1dGRvd24gbGlzdGVuZXJzICovCisgIGZvciAobCA9IHNlcnZlci0+bGlzdGVuZXJzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIGdycGNfY2xvc3VyZV9pbml0KCZsLT5kZXN0cm95X2RvbmUsIGxpc3RlbmVyX2Rlc3Ryb3lfZG9uZSwgc2VydmVyKTsKKyAgICBsLT5kZXN0cm95KCZleGVjX2N0eCwgc2VydmVyLCBsLT5hcmcsICZsLT5kZXN0cm95X2RvbmUpOworICB9CisKKyAgY2hhbm5lbF9icm9hZGNhc3Rlcl9zaHV0ZG93bigmZXhlY19jdHgsICZicm9hZGNhc3RlciwgMSwgMCk7CisKK2RvbmU6CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfY2FuY2VsX2FsbF9jYWxscyhncnBjX3NlcnZlciAqc2VydmVyKSB7CisgIGNoYW5uZWxfYnJvYWRjYXN0ZXIgYnJvYWRjYXN0ZXI7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisKKyAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX2NhbmNlbF9hbGxfY2FsbHMoc2VydmVyPSVwKSIsIDEsIChzZXJ2ZXIpKTsKKworICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOworICBjaGFubmVsX2Jyb2FkY2FzdGVyX2luaXQoc2VydmVyLCAmYnJvYWRjYXN0ZXIpOworICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7CisKKyAgY2hhbm5lbF9icm9hZGNhc3Rlcl9zaHV0ZG93bigmZXhlY19jdHgsICZicm9hZGNhc3RlciwgMCwgMSk7CisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Cit9CisKK3ZvaWQgZ3JwY19zZXJ2ZXJfZGVzdHJveShncnBjX3NlcnZlciAqc2VydmVyKSB7CisgIGxpc3RlbmVyICpsOworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOworCisgIEdSUENfQVBJX1RSQUNFKCJncnBjX3NlcnZlcl9kZXN0cm95KHNlcnZlcj0lcCkiLCAxLCAoc2VydmVyKSk7CisKKyAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKKyAgR1BSX0FTU0VSVChncHJfYXRtX2FjcV9sb2FkKCZzZXJ2ZXItPnNodXRkb3duX2ZsYWcpIHx8ICFzZXJ2ZXItPmxpc3RlbmVycyk7CisgIEdQUl9BU1NFUlQoc2VydmVyLT5saXN0ZW5lcnNfZGVzdHJveWVkID09IG51bV9saXN0ZW5lcnMoc2VydmVyKSk7CisKKyAgd2hpbGUgKHNlcnZlci0+bGlzdGVuZXJzKSB7CisgICAgbCA9IHNlcnZlci0+bGlzdGVuZXJzOworICAgIHNlcnZlci0+bGlzdGVuZXJzID0gbC0+bmV4dDsKKyAgICBncHJfZnJlZShsKTsKKyAgfQorCisgIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKKworICBzZXJ2ZXJfdW5yZWYoJmV4ZWNfY3R4LCBzZXJ2ZXIpOworICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworfQorCit2b2lkIGdycGNfc2VydmVyX2FkZF9saXN0ZW5lcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwgdm9pZCAqYXJnLAorICAgIHZvaWQgKCpzdGFydCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzLCBzaXplX3QgcG9sbHNldF9jb3VudCksCisgICAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fZG9uZSkpIHsKKyAgbGlzdGVuZXIgKmwgPSBncHJfbWFsbG9jKHNpemVvZihsaXN0ZW5lcikpOworICBsLT5hcmcgPSBhcmc7CisgIGwtPnN0YXJ0ID0gc3RhcnQ7CisgIGwtPmRlc3Ryb3kgPSBkZXN0cm95OworICBsLT5uZXh0ID0gc2VydmVyLT5saXN0ZW5lcnM7CisgIHNlcnZlci0+bGlzdGVuZXJzID0gbDsKK30KKworc3RhdGljIGdycGNfY2FsbF9lcnJvciBxdWV1ZV9jYWxsX3JlcXVlc3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2NhbGwgKnJjKSB7CisgIGNhbGxfZGF0YSAqY2FsbGQgPSBOVUxMOworICByZXF1ZXN0X21hdGNoZXIgKnJtID0gTlVMTDsKKyAgaW50IHJlcXVlc3RfaWQ7CisgIGlmIChncHJfYXRtX2FjcV9sb2FkKCZzZXJ2ZXItPnNodXRkb3duX2ZsYWcpKSB7CisgICAgZmFpbF9jYWxsKGV4ZWNfY3R4LCBzZXJ2ZXIsIHJjKTsKKyAgICByZXR1cm4gR1JQQ19DQUxMX09LOworICB9CisgIHJlcXVlc3RfaWQgPSBncHJfc3RhY2tfbG9ja2ZyZWVfcG9wKHNlcnZlci0+cmVxdWVzdF9mcmVlbGlzdCk7CisgIGlmIChyZXF1ZXN0X2lkID09IC0xKSB7CisgICAgLyogb3V0IG9mIHJlcXVlc3QgaWRzOiBqdXN0IGZhaWwgdGhpcyBvbmUgKi8KKyAgICBmYWlsX2NhbGwoZXhlY19jdHgsIHNlcnZlciwgcmMpOworICAgIHJldHVybiBHUlBDX0NBTExfT0s7CisgIH0KKyAgc3dpdGNoIChyYy0+dHlwZSkgeworICAgIGNhc2UgQkFUQ0hfQ0FMTDoKKyAgICAgIHJtID0gJnNlcnZlci0+dW5yZWdpc3RlcmVkX3JlcXVlc3RfbWF0Y2hlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVHSVNURVJFRF9DQUxMOgorICAgICAgcm0gPSAmcmMtPmRhdGEucmVnaXN0ZXJlZC5yZWdpc3RlcmVkX21ldGhvZC0+cmVxdWVzdF9tYXRjaGVyOworICAgICAgYnJlYWs7CisgIH0KKyAgc2VydmVyLT5yZXF1ZXN0ZWRfY2FsbHNbcmVxdWVzdF9pZF0gPSAqcmM7CisgIGdwcl9mcmVlKHJjKTsKKyAgaWYgKGdwcl9zdGFja19sb2NrZnJlZV9wdXNoKHJtLT5yZXF1ZXN0cywgcmVxdWVzdF9pZCkpIHsKKyAgICAvKiB0aGlzIHdhcyB0aGUgZmlyc3QgcXVldWVkIHJlcXVlc3Q6IHdlIG5lZWQgdG8gbG9jayBhbmQgc3RhcnQKKyAgICAgICBtYXRjaGluZyBjYWxscyAqLworICAgIGdwcl9tdV9sb2NrKCZzZXJ2ZXItPm11X2NhbGwpOworICAgIHdoaWxlICgoY2FsbGQgPSBybS0+cGVuZGluZ19oZWFkKSAhPSBOVUxMKSB7CisgICAgICByZXF1ZXN0X2lkID0gZ3ByX3N0YWNrX2xvY2tmcmVlX3BvcChybS0+cmVxdWVzdHMpOworICAgICAgaWYgKHJlcXVlc3RfaWQgPT0gLTEpIGJyZWFrOworICAgICAgcm0tPnBlbmRpbmdfaGVhZCA9IGNhbGxkLT5wZW5kaW5nX25leHQ7CisgICAgICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2NhbGwpOworICAgICAgZ3ByX211X2xvY2soJmNhbGxkLT5tdV9zdGF0ZSk7CisgICAgICBpZiAoY2FsbGQtPnN0YXRlID09IFpPTUJJRUQpIHsKKyAgICAgICAgZ3ByX211X3VubG9jaygmY2FsbGQtPm11X3N0YXRlKTsKKyAgICAgICAgZ3JwY19jbG9zdXJlX2luaXQoCisgICAgICAgICAgICAmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIGtpbGxfem9tYmllLAorICAgICAgICAgICAgZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoZ3JwY19jYWxsX2dldF9jYWxsX3N0YWNrKGNhbGxkLT5jYWxsKSwgMCkpOworICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZjYWxsZC0+a2lsbF96b21iaWVfY2xvc3VyZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1BSX0FTU0VSVChjYWxsZC0+c3RhdGUgPT0gUEVORElORyk7CisgICAgICAgIGNhbGxkLT5zdGF0ZSA9IEFDVElWQVRFRDsKKyAgICAgICAgZ3ByX211X3VubG9jaygmY2FsbGQtPm11X3N0YXRlKTsKKyAgICAgICAgYmVnaW5fY2FsbChleGVjX2N0eCwgc2VydmVyLCBjYWxsZCwKKyAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5yZXF1ZXN0ZWRfY2FsbHNbcmVxdWVzdF9pZF0pOworICAgICAgfQorICAgICAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfY2FsbCk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfY2FsbCk7CisgIH0KKyAgcmV0dXJuIEdSUENfQ0FMTF9PSzsKK30KKworZ3JwY19jYWxsX2Vycm9yIGdycGNfc2VydmVyX3JlcXVlc3RfY2FsbCgKKyAgICBncnBjX3NlcnZlciAqc2VydmVyLCBncnBjX2NhbGwgKipjYWxsLCBncnBjX2NhbGxfZGV0YWlscyAqZGV0YWlscywKKyAgICBncnBjX21ldGFkYXRhX2FycmF5ICppbml0aWFsX21ldGFkYXRhLAorICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3FfYm91bmRfdG9fY2FsbCwKKyAgICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxX2Zvcl9ub3RpZmljYXRpb24sIHZvaWQgKnRhZykgeworICBncnBjX2NhbGxfZXJyb3IgZXJyb3I7CisgIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7CisgIHJlcXVlc3RlZF9jYWxsICpyYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpyYykpOworICBHUlBDX0FQSV9UUkFDRSgKKyAgICAgICJncnBjX3NlcnZlcl9yZXF1ZXN0X2NhbGwoIgorICAgICAgInNlcnZlcj0lcCwgY2FsbD0lcCwgZGV0YWlscz0lcCwgaW5pdGlhbF9tZXRhZGF0YT0lcCwgIgorICAgICAgImNxX2JvdW5kX3RvX2NhbGw9JXAsIGNxX2Zvcl9ub3RpZmljYXRpb249JXAsIHRhZz0lcCkiLAorICAgICAgNywgKHNlcnZlciwgY2FsbCwgZGV0YWlscywgaW5pdGlhbF9tZXRhZGF0YSwgY3FfYm91bmRfdG9fY2FsbCwKKyAgICAgICAgICBjcV9mb3Jfbm90aWZpY2F0aW9uLCB0YWcpKTsKKyAgaWYgKCFncnBjX2NxX2lzX3NlcnZlcl9jcShjcV9mb3Jfbm90aWZpY2F0aW9uKSkgeworICAgIGdwcl9mcmVlKHJjKTsKKyAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9OT1RfU0VSVkVSX0NPTVBMRVRJT05fUVVFVUU7CisgICAgZ290byBkb25lOworICB9CisgIGdycGNfY3FfYmVnaW5fb3AoY3FfZm9yX25vdGlmaWNhdGlvbiwgdGFnKTsKKyAgZGV0YWlscy0+cmVzZXJ2ZWQgPSBOVUxMOworICByYy0+dHlwZSA9IEJBVENIX0NBTEw7CisgIHJjLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisgIHJjLT50YWcgPSB0YWc7CisgIHJjLT5jcV9ib3VuZF90b19jYWxsID0gY3FfYm91bmRfdG9fY2FsbDsKKyAgcmMtPmNxX2Zvcl9ub3RpZmljYXRpb24gPSBjcV9mb3Jfbm90aWZpY2F0aW9uOworICByYy0+Y2FsbCA9IGNhbGw7CisgIHJjLT5kYXRhLmJhdGNoLmRldGFpbHMgPSBkZXRhaWxzOworICByYy0+aW5pdGlhbF9tZXRhZGF0YSA9IGluaXRpYWxfbWV0YWRhdGE7CisgIGVycm9yID0gcXVldWVfY2FsbF9yZXF1ZXN0KCZleGVjX2N0eCwgc2VydmVyLCByYyk7Citkb25lOgorICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOworICByZXR1cm4gZXJyb3I7Cit9CisKK2dycGNfY2FsbF9lcnJvciBncnBjX3NlcnZlcl9yZXF1ZXN0X3JlZ2lzdGVyZWRfY2FsbCgKKyAgICBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICpybXAsIGdycGNfY2FsbCAqKmNhbGwsIGdwcl90aW1lc3BlYyAqZGVhZGxpbmUsCisgICAgZ3JwY19tZXRhZGF0YV9hcnJheSAqaW5pdGlhbF9tZXRhZGF0YSwgZ3JwY19ieXRlX2J1ZmZlciAqKm9wdGlvbmFsX3BheWxvYWQsCisgICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcV9ib3VuZF90b19jYWxsLAorICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3FfZm9yX25vdGlmaWNhdGlvbiwgdm9pZCAqdGFnKSB7CisgIGdycGNfY2FsbF9lcnJvciBlcnJvcjsKKyAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKKyAgcmVxdWVzdGVkX2NhbGwgKnJjID0gZ3ByX21hbGxvYyhzaXplb2YoKnJjKSk7CisgIHJlZ2lzdGVyZWRfbWV0aG9kICpybSA9IHJtcDsKKyAgR1JQQ19BUElfVFJBQ0UoCisgICAgICAiZ3JwY19zZXJ2ZXJfcmVxdWVzdF9yZWdpc3RlcmVkX2NhbGwoIgorICAgICAgInNlcnZlcj0lcCwgcm1wPSVwLCBjYWxsPSVwLCBkZWFkbGluZT0lcCwgaW5pdGlhbF9tZXRhZGF0YT0lcCwgIgorICAgICAgIm9wdGlvbmFsX3BheWxvYWQ9JXAsIGNxX2JvdW5kX3RvX2NhbGw9JXAsIGNxX2Zvcl9ub3RpZmljYXRpb249JXAsICIKKyAgICAgICJ0YWc9JXApIiwKKyAgICAgIDksIChzZXJ2ZXIsIHJtcCwgY2FsbCwgZGVhZGxpbmUsIGluaXRpYWxfbWV0YWRhdGEsIG9wdGlvbmFsX3BheWxvYWQsCisgICAgICAgICAgY3FfYm91bmRfdG9fY2FsbCwgY3FfZm9yX25vdGlmaWNhdGlvbiwgdGFnKSk7CisgIGlmICghZ3JwY19jcV9pc19zZXJ2ZXJfY3EoY3FfZm9yX25vdGlmaWNhdGlvbikpIHsKKyAgICBncHJfZnJlZShyYyk7CisgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfTk9UX1NFUlZFUl9DT01QTEVUSU9OX1FVRVVFOworICAgIGdvdG8gZG9uZTsKKyAgfQorICBncnBjX2NxX2JlZ2luX29wKGNxX2Zvcl9ub3RpZmljYXRpb24sIHRhZyk7CisgIHJjLT50eXBlID0gUkVHSVNURVJFRF9DQUxMOworICByYy0+c2VydmVyID0gc2VydmVyOworICByYy0+dGFnID0gdGFnOworICByYy0+Y3FfYm91bmRfdG9fY2FsbCA9IGNxX2JvdW5kX3RvX2NhbGw7CisgIHJjLT5jcV9mb3Jfbm90aWZpY2F0aW9uID0gY3FfZm9yX25vdGlmaWNhdGlvbjsKKyAgcmMtPmNhbGwgPSBjYWxsOworICByYy0+ZGF0YS5yZWdpc3RlcmVkLnJlZ2lzdGVyZWRfbWV0aG9kID0gcm07CisgIHJjLT5kYXRhLnJlZ2lzdGVyZWQuZGVhZGxpbmUgPSBkZWFkbGluZTsKKyAgcmMtPmluaXRpYWxfbWV0YWRhdGEgPSBpbml0aWFsX21ldGFkYXRhOworICByYy0+ZGF0YS5yZWdpc3RlcmVkLm9wdGlvbmFsX3BheWxvYWQgPSBvcHRpb25hbF9wYXlsb2FkOworICBlcnJvciA9IHF1ZXVlX2NhbGxfcmVxdWVzdCgmZXhlY19jdHgsIHNlcnZlciwgcmMpOworZG9uZToKKyAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBwdWJsaXNoX3JlZ2lzdGVyZWRfb3JfYmF0Y2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLCBib29sIHN1Y2Nlc3MpOworCitzdGF0aWMgdm9pZCBjcHN0cihjaGFyICoqZGVzdCwgc2l6ZV90ICpjYXBhY2l0eSwgZ3JwY19tZHN0ciAqdmFsdWUpIHsKKyAgZ3ByX3NsaWNlIHNsaWNlID0gdmFsdWUtPnNsaWNlOworICBzaXplX3QgbGVuID0gR1BSX1NMSUNFX0xFTkdUSChzbGljZSk7CisKKyAgaWYgKGxlbiArIDEgPiAqY2FwYWNpdHkpIHsKKyAgICAqY2FwYWNpdHkgPSBHUFJfTUFYKGxlbiArIDEsICpjYXBhY2l0eSAqIDIpOworICAgICpkZXN0ID0gZ3ByX3JlYWxsb2MoKmRlc3QsICpjYXBhY2l0eSk7CisgIH0KKyAgbWVtY3B5KCpkZXN0LCBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKHZhbHVlKSwgbGVuICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJlZ2luX2NhbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfZGF0YSAqY2FsbGQsIHJlcXVlc3RlZF9jYWxsICpyYykgeworICBncnBjX29wIG9wc1sxXTsKKyAgZ3JwY19vcCAqb3AgPSBvcHM7CisKKyAgbWVtc2V0KG9wcywgMCwgc2l6ZW9mKG9wcykpOworCisgIC8qIGNhbGxlZCBvbmNlIGluaXRpYWwgbWV0YWRhdGEgaGFzIGJlZW4gcmVhZCBieSB0aGUgY2FsbCwgYnV0IEJFRk9SRQorICAgICB0aGUgaW9yZXEgdG8gZmV0Y2ggaXQgb3V0IG9mIHRoZSBjYWxsIGhhcyBiZWVuIGV4ZWN1dGVkLgorICAgICBUaGlzIG1lYW5zIG1ldGFkYXRhIHJlbGF0ZWQgZmllbGRzIGNhbiBiZSByZWxpZWQgb24gaW4gY2FsbGQsIGJ1dCB0bworICAgICBmaWxsIGluIHRoZSBtZXRhZGF0YSBhcnJheSBwYXNzZWQgYnkgdGhlIGNsaWVudCwgd2UgbmVlZCB0byBwZXJmb3JtCisgICAgIGFuIGlvcmVxIG9wLCB0aGF0IHNob3VsZCBjb21wbGV0ZSBpbW1lZGlhdGVseS4gKi8KKworICBncnBjX2NhbGxfc2V0X2NvbXBsZXRpb25fcXVldWUoZXhlY19jdHgsIGNhbGxkLT5jYWxsLCByYy0+Y3FfYm91bmRfdG9fY2FsbCk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZyYy0+cHVibGlzaCwgcHVibGlzaF9yZWdpc3RlcmVkX29yX2JhdGNoLCByYyk7CisgICpyYy0+Y2FsbCA9IGNhbGxkLT5jYWxsOworICBjYWxsZC0+Y3FfbmV3ID0gcmMtPmNxX2Zvcl9ub3RpZmljYXRpb247CisgIEdQUl9TV0FQKGdycGNfbWV0YWRhdGFfYXJyYXksICpyYy0+aW5pdGlhbF9tZXRhZGF0YSwgY2FsbGQtPmluaXRpYWxfbWV0YWRhdGEpOworICBzd2l0Y2ggKHJjLT50eXBlKSB7CisgICAgY2FzZSBCQVRDSF9DQUxMOgorICAgICAgR1BSX0FTU0VSVChjYWxsZC0+aG9zdCAhPSBOVUxMKTsKKyAgICAgIEdQUl9BU1NFUlQoY2FsbGQtPnBhdGggIT0gTlVMTCk7CisgICAgICBjcHN0cigmcmMtPmRhdGEuYmF0Y2guZGV0YWlscy0+aG9zdCwKKyAgICAgICAgICAgICZyYy0+ZGF0YS5iYXRjaC5kZXRhaWxzLT5ob3N0X2NhcGFjaXR5LCBjYWxsZC0+aG9zdCk7CisgICAgICBjcHN0cigmcmMtPmRhdGEuYmF0Y2guZGV0YWlscy0+bWV0aG9kLAorICAgICAgICAgICAgJnJjLT5kYXRhLmJhdGNoLmRldGFpbHMtPm1ldGhvZF9jYXBhY2l0eSwgY2FsbGQtPnBhdGgpOworICAgICAgcmMtPmRhdGEuYmF0Y2guZGV0YWlscy0+ZGVhZGxpbmUgPSBjYWxsZC0+ZGVhZGxpbmU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFR0lTVEVSRURfQ0FMTDoKKyAgICAgICpyYy0+ZGF0YS5yZWdpc3RlcmVkLmRlYWRsaW5lID0gY2FsbGQtPmRlYWRsaW5lOworICAgICAgaWYgKHJjLT5kYXRhLnJlZ2lzdGVyZWQub3B0aW9uYWxfcGF5bG9hZCkgeworICAgICAgICBvcC0+b3AgPSBHUlBDX09QX1JFQ1ZfTUVTU0FHRTsKKyAgICAgICAgb3AtPmRhdGEucmVjdl9tZXNzYWdlID0gcmMtPmRhdGEucmVnaXN0ZXJlZC5vcHRpb25hbF9wYXlsb2FkOworICAgICAgICBvcCsrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiApOworICB9CisKKyAgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjYWxsZC0+Y2FsbCwgInNlcnZlciIpOworICBncnBjX2NhbGxfc3RhcnRfYmF0Y2hfYW5kX2V4ZWN1dGUoZXhlY19jdHgsIGNhbGxkLT5jYWxsLCBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KShvcCAtIG9wcyksICZyYy0+cHVibGlzaCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvbmVfcmVxdWVzdF9ldmVudChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqYykgeworICByZXF1ZXN0ZWRfY2FsbCAqcmMgPSByZXE7CisgIGdycGNfc2VydmVyICpzZXJ2ZXIgPSByYy0+c2VydmVyOworCisgIGlmIChyYyA+PSBzZXJ2ZXItPnJlcXVlc3RlZF9jYWxscyAmJgorICAgICAgcmMgPCBzZXJ2ZXItPnJlcXVlc3RlZF9jYWxscyArIHNlcnZlci0+bWF4X3JlcXVlc3RlZF9jYWxscykgeworICAgIEdQUl9BU1NFUlQocmMgLSBzZXJ2ZXItPnJlcXVlc3RlZF9jYWxscyA8PSBJTlRfTUFYKTsKKyAgICBncHJfc3RhY2tfbG9ja2ZyZWVfcHVzaChzZXJ2ZXItPnJlcXVlc3RfZnJlZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocmMgLSBzZXJ2ZXItPnJlcXVlc3RlZF9jYWxscykpOworICB9IGVsc2UgeworICAgIGdwcl9mcmVlKHJlcSk7CisgIH0KKworICBzZXJ2ZXJfdW5yZWYoZXhlY19jdHgsIHNlcnZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGZhaWxfY2FsbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfY2FsbCAqcmMpIHsKKyAgKnJjLT5jYWxsID0gTlVMTDsKKyAgcmMtPmluaXRpYWxfbWV0YWRhdGEtPmNvdW50ID0gMDsKKworICBzZXJ2ZXJfcmVmKHNlcnZlcik7CisgIGdycGNfY3FfZW5kX29wKGV4ZWNfY3R4LCByYy0+Y3FfZm9yX25vdGlmaWNhdGlvbiwgcmMtPnRhZywgMCwKKyAgICAgICAgICAgICAgICAgZG9uZV9yZXF1ZXN0X2V2ZW50LCByYywgJnJjLT5jb21wbGV0aW9uKTsKK30KKworc3RhdGljIHZvaWQgcHVibGlzaF9yZWdpc3RlcmVkX29yX2JhdGNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7CisgIHJlcXVlc3RlZF9jYWxsICpyYyA9IHByYzsKKyAgZ3JwY19jYWxsICpjYWxsID0gKnJjLT5jYWxsOworICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9CisgICAgICBncnBjX2NhbGxfc3RhY2tfZWxlbWVudChncnBjX2NhbGxfZ2V0X2NhbGxfc3RhY2soY2FsbCksIDApOworICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOworICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOworICBzZXJ2ZXJfcmVmKGNoYW5kLT5zZXJ2ZXIpOworICBncnBjX2NxX2VuZF9vcChleGVjX2N0eCwgY2FsbGQtPmNxX25ldywgcmMtPnRhZywgc3VjY2VzcywgZG9uZV9yZXF1ZXN0X2V2ZW50LAorICAgICAgICAgICAgICAgICByYywgJnJjLT5jb21wbGV0aW9uKTsKKyAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYWxsLCAic2VydmVyIik7Cit9CisKK2NvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpncnBjX3NlcnZlcl9nZXRfY2hhbm5lbF9hcmdzKGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKKyAgcmV0dXJuIHNlcnZlci0+Y2hhbm5lbF9hcmdzOworfQorCitpbnQgZ3JwY19zZXJ2ZXJfaGFzX29wZW5fY29ubmVjdGlvbnMoZ3JwY19zZXJ2ZXIgKnNlcnZlcikgeworICBpbnQgcjsKKyAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKKyAgciA9IHNlcnZlci0+cm9vdF9jaGFubmVsX2RhdGEubmV4dCAhPSAmc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YTsKKyAgZ3ByX211X3VubG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOworICByZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIGIvc3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0NWViMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX1NFUlZFUl9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9TRVJWRVJfSAorCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCisKK2V4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfc2VydmVyX3RvcF9maWx0ZXI7CisKKy8qIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXI6IHdoZW4gdGhlIHNlcnZlciBzdGFydHMsIGl0IHdpbGwgY2FsbCBzdGFydCwKKyAgIGFuZCB3aGVuIGl0IHNodXRzIGRvd24sIGl0IHdpbGwgY2FsbCBkZXN0cm95ICovCit2b2lkIGdycGNfc2VydmVyX2FkZF9saXN0ZW5lcigKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwgdm9pZCAqbGlzdGVuZXIsCisgICAgdm9pZCAoKnN0YXJ0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBucG9sbHNldHMpLAorICAgIHZvaWQgKCpkZXN0cm95KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2RvbmUpKTsKKworLyogU2V0dXAgYSB0cmFuc3BvcnQgLSBjcmVhdGVzIGEgY2hhbm5lbCBzdGFjaywgYmluZHMgdGhlIHRyYW5zcG9ydCB0byB0aGUKKyAgIHNlcnZlciAqLwordm9pZCBncnBjX3NlcnZlcl9zZXR1cF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpOworCitjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqZ3JwY19zZXJ2ZXJfZ2V0X2NoYW5uZWxfYXJncyhncnBjX3NlcnZlciAqc2VydmVyKTsKKworaW50IGdycGNfc2VydmVyX2hhc19vcGVuX2Nvbm5lY3Rpb25zKGdycGNfc2VydmVyICpzZXJ2ZXIpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9TVVJGQUNFX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmggYi9zcmMvY29yZS9saWIvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZjY3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfU1VSRkFDRV9TVVJGQUNFX1RSQUNFX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9TVVJGQUNFX1NVUkZBQ0VfVFJBQ0VfSAorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIgorCisjZGVmaW5lIEdSUENfU1VSRkFDRV9UUkFDRV9SRVRVUk5FRF9FVkVOVChjcSwgZXZlbnQpICAgIFwKKyAgaWYgKGdycGNfYXBpX3RyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgKl9ldiA9IGdycGNfZXZlbnRfc3RyaW5nKGV2ZW50KTsgICAgICAgICAgICAgICBcCisgICAgZ3ByX2xvZyhHUFJfSU5GTywgIlJFVFVSTl9FVkVOVFslcF06ICVzIiwgY3EsIF9ldik7IFwKKyAgICBncHJfZnJlZShfZXYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1NVUkZBQ0VfU1VSRkFDRV9UUkFDRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMgYi9zcmMvY29yZS9saWIvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvdmVyc2lvbi5jIGIvc3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS9zdXJmYWNlL3ZlcnNpb24uYwpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ODFhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYwpAQCAtMCwwICsxLDc4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisKK2ludCBncnBjX2J5dGVfc3RyZWFtX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYnl0ZV9zdHJlYW0gKmJ5dGVfc3RyZWFtLCBncHJfc2xpY2UgKnNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X3NpemVfaGludCwgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSkgeworICByZXR1cm4gYnl0ZV9zdHJlYW0tPm5leHQoZXhlY19jdHgsIGJ5dGVfc3RyZWFtLCBzbGljZSwgbWF4X3NpemVfaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2NvbXBsZXRlKTsKK30KKwordm9pZCBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSkgeworICBieXRlX3N0cmVhbS0+ZGVzdHJveShleGVjX2N0eCwgYnl0ZV9zdHJlYW0pOworfQorCisvKiBzbGljZV9idWZmZXJfc3RyZWFtICovCisKK3N0YXRpYyBpbnQgc2xpY2VfYnVmZmVyX3N0cmVhbV9uZXh0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKnNsaWNlLCBzaXplX3QgbWF4X3NpemVfaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGUpIHsKKyAgZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtICpzdHJlYW0gPSAoZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtICopYnl0ZV9zdHJlYW07CisgIEdQUl9BU1NFUlQoc3RyZWFtLT5jdXJzb3IgPCBzdHJlYW0tPmJhY2tpbmdfYnVmZmVyLT5jb3VudCk7CisgICpzbGljZSA9IGdwcl9zbGljZV9yZWYoc3RyZWFtLT5iYWNraW5nX2J1ZmZlci0+c2xpY2VzW3N0cmVhbS0+Y3Vyc29yXSk7CisgIHN0cmVhbS0+Y3Vyc29yKys7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzbGljZV9idWZmZXJfc3RyZWFtX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0pIHt9CisKK3ZvaWQgZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtX2luaXQoZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnNsaWNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgR1BSX0FTU0VSVChzbGljZV9idWZmZXItPmxlbmd0aCA8PSBVSU5UMzJfTUFYKTsKKyAgc3RyZWFtLT5iYXNlLmxlbmd0aCA9ICh1aW50MzJfdClzbGljZV9idWZmZXItPmxlbmd0aDsKKyAgc3RyZWFtLT5iYXNlLmZsYWdzID0gZmxhZ3M7CisgIHN0cmVhbS0+YmFzZS5uZXh0ID0gc2xpY2VfYnVmZmVyX3N0cmVhbV9uZXh0OworICBzdHJlYW0tPmJhc2UuZGVzdHJveSA9IHNsaWNlX2J1ZmZlcl9zdHJlYW1fZGVzdHJveTsKKyAgc3RyZWFtLT5iYWNraW5nX2J1ZmZlciA9IHNsaWNlX2J1ZmZlcjsKKyAgc3RyZWFtLT5jdXJzb3IgPSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIGIvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9CWVRFX1NUUkVBTV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX0JZVEVfU1RSRUFNX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIKKworLyoqIEludGVybmFsIGJpdCBmbGFnIGZvciBncnBjX2JlZ2luX21lc3NhZ2UncyBcYSBmbGFncyBzaWduYWxpbmcgdGhlIHVzZSBvZgorICogY29tcHJlc3Npb24gZm9yIHRoZSBtZXNzYWdlICovCisjZGVmaW5lIEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1MgKDB4ODAwMDAwMDB1KQorLyoqIE1hc2sgb2YgYWxsIHZhbGlkIGludGVybmFsIGZsYWdzLiAqLworI2RlZmluZSBHUlBDX1dSSVRFX0lOVEVSTkFMX1VTRURfTUFTSyAoR1JQQ19XUklURV9JTlRFUk5BTF9DT01QUkVTUykKKworc3RydWN0IGdycGNfYnl0ZV9zdHJlYW07Cit0eXBlZGVmIHN0cnVjdCBncnBjX2J5dGVfc3RyZWFtIGdycGNfYnl0ZV9zdHJlYW07CisKK3N0cnVjdCBncnBjX2J5dGVfc3RyZWFtIHsKKyAgdWludDMyX3QgbGVuZ3RoOworICB1aW50MzJfdCBmbGFnczsKKyAgaW50ICgqbmV4dCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfYnl0ZV9zdHJlYW0gKmJ5dGVfc3RyZWFtLAorICAgICAgICAgICAgICBncHJfc2xpY2UgKnNsaWNlLCBzaXplX3QgbWF4X3NpemVfaGludCwKKyAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSk7CisgIHZvaWQgKCpkZXN0cm95KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0pOworfTsKKworLyogcmV0dXJucyAxIGlmIHRoZSBieXRlcyBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IChpbiB3aGljaCBjYXNlCisgKiBvbl9jb21wbGV0ZSB3aWxsIG5vdCBiZSBjYWxsZWQpLCAwIGlmIHRoZSBieXRlcyB3aWxsIGJlIGF2YWlsYWJsZQorICogYXN5bmNocm9ub3VzbHkuCisgKgorICogb24gZW50cnksICpyZW1haW5pbmcgY2FuIGJlIHNldCBhcyBhIGhpbnQgYXMgdG8gdGhlIG1heGltdW0gbnVtYmVyCisgKiBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIGFjY2VwdGFibGUgdG8gcmVhZC4KKyAqCisgKiBmaWxscyAqYnVmZmVyLCAqbGVuZ3RoLCAqcmVtYWluaW5nIHdpdGggdGhlIGJ5dGVzLCBsZW5ndGggb2YgYnl0ZXMKKyAqIGFuZCBsZW5ndGggb2YgZGF0YSByZW1haW5pbmcgdG8gYmUgcmVhZCBiZWZvcmUgZWl0aGVyIHJldHVybmluZyAxCisgKiBvciBjYWxsaW5nIG9uX2NvbXBsZXRlLgorICoKKyAqIG9uY2UgYSBzbGljZSBpcyByZXR1cm5lZCBpbnRvICpzbGljZSwgaXQgaXMgb3duZWQgYnkgdGhlIGNhbGxlci4KKyAqLworaW50IGdycGNfYnl0ZV9zdHJlYW1fbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0sIGdwcl9zbGljZSAqc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZV9oaW50LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKKwordm9pZCBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSk7CisKKy8qIGdycGNfYnl0ZV9zdHJlYW0gdGhhdCB3cmFwcyBhIHNsaWNlIGJ1ZmZlciAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtIHsKKyAgZ3JwY19ieXRlX3N0cmVhbSBiYXNlOworICBncHJfc2xpY2VfYnVmZmVyICpiYWNraW5nX2J1ZmZlcjsKKyAgc2l6ZV90IGN1cnNvcjsKK30gZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtOworCit2b2lkIGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbV9pbml0KGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX0JZVEVfU1RSRUFNX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2VhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgorCitpbnQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2UgPSAwOworCitjb25zdCBjaGFyICpncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9uYW1lKGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0YXRlKSB7CisgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIEdSUENfQ0hBTk5FTF9JRExFOgorICAgICAgcmV0dXJuICJJRExFIjsKKyAgICBjYXNlIEdSUENfQ0hBTk5FTF9DT05ORUNUSU5HOgorICAgICAgcmV0dXJuICJDT05ORUNUSU5HIjsKKyAgICBjYXNlIEdSUENfQ0hBTk5FTF9SRUFEWToKKyAgICAgIHJldHVybiAiUkVBRFkiOworICAgIGNhc2UgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFOgorICAgICAgcmV0dXJuICJUUkFOU0lFTlRfRkFJTFVSRSI7CisgICAgY2FzZSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRToKKyAgICAgIHJldHVybiAiRkFUQUxfRkFJTFVSRSI7CisgIH0KKyAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICJVTktOT1dOIik7Cit9CisKK3ZvaWQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfaW5pdChncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGluaXRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICB0cmFja2VyLT5jdXJyZW50X3N0YXRlID0gaW5pdF9zdGF0ZTsKKyAgdHJhY2tlci0+d2F0Y2hlcnMgPSBOVUxMOworICB0cmFja2VyLT5uYW1lID0gZ3ByX3N0cmR1cChuYW1lKTsKK30KKwordm9pZCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgKnRyYWNrZXIpIHsKKyAgaW50IHN1Y2Nlc3M7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgKnc7CisgIHdoaWxlICgodyA9IHRyYWNrZXItPndhdGNoZXJzKSkgeworICAgIHRyYWNrZXItPndhdGNoZXJzID0gdy0+bmV4dDsKKworICAgIGlmIChHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSAhPSAqdy0+Y3VycmVudCkgeworICAgICAgKnctPmN1cnJlbnQgPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRTsKKyAgICAgIHN1Y2Nlc3MgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBzdWNjZXNzID0gMDsKKyAgICB9CisgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCB3LT5ub3RpZnksIHN1Y2Nlc3MsIE5VTEwpOworICAgIGdwcl9mcmVlKHcpOworICB9CisgIGdwcl9mcmVlKHRyYWNrZXItPm5hbWUpOworfQorCitncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGVjaygKKyAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyKSB7CisgIGlmIChncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFjZSkgeworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiQ09OV0FUQ0g6ICVwICVzOiBnZXQgJXMiLCB0cmFja2VyLCB0cmFja2VyLT5uYW1lLAorICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbmFtZSh0cmFja2VyLT5jdXJyZW50X3N0YXRlKSk7CisgIH0KKyAgcmV0dXJuIHRyYWNrZXItPmN1cnJlbnRfc3RhdGU7Cit9CisKK2ludCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9ub3RpZnlfb25fc3RhdGVfY2hhbmdlKAorICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyLAorICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpjdXJyZW50LCBncnBjX2Nsb3N1cmUgKm5vdGlmeSkgeworICBpZiAoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2UpIHsKKyAgICBpZiAoY3VycmVudCA9PSBOVUxMKSB7CisgICAgICBncHJfbG9nKEdQUl9ERUJVRywgIkNPTldBVENIOiAlcCAlczogdW5zdWJzY3JpYmUgbm90aWZ5PSVwIiwgdHJhY2tlciwKKyAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZSwgbm90aWZ5KTsKKyAgICB9IGVsc2UgeworICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJDT05XQVRDSDogJXAgJXM6IGZyb20gJXMgW2N1cj0lc10gbm90aWZ5PSVwIiwgdHJhY2tlciwKKyAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZSwgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbmFtZSgqY3VycmVudCksCisgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25hbWUodHJhY2tlci0+Y3VycmVudF9zdGF0ZSksIG5vdGlmeSk7CisgICAgfQorICB9CisgIGlmIChjdXJyZW50ID09IE5VTEwpIHsKKyAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV93YXRjaGVyICp3ID0gdHJhY2tlci0+d2F0Y2hlcnM7CisgICAgaWYgKHcgIT0gTlVMTCAmJiB3LT5ub3RpZnkgPT0gbm90aWZ5KSB7CisgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIG5vdGlmeSwgZmFsc2UsIE5VTEwpOworICAgICAgdHJhY2tlci0+d2F0Y2hlcnMgPSB3LT5uZXh0OworICAgICAgZ3ByX2ZyZWUodyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2hpbGUgKHcgIT0gTlVMTCkgeworICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfd2F0Y2hlciAqcm1fY2FuZGlkYXRlID0gdy0+bmV4dDsKKyAgICAgIGlmIChybV9jYW5kaWRhdGUgIT0gTlVMTCAmJiBybV9jYW5kaWRhdGUtPm5vdGlmeSA9PSBub3RpZnkpIHsKKyAgICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBub3RpZnksIGZhbHNlLCBOVUxMKTsKKyAgICAgICAgdy0+bmV4dCA9IHctPm5leHQtPm5leHQ7CisgICAgICAgIGdwcl9mcmVlKHJtX2NhbmRpZGF0ZSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgdyA9IHctPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGlmICh0cmFja2VyLT5jdXJyZW50X3N0YXRlICE9ICpjdXJyZW50KSB7CisgICAgICAqY3VycmVudCA9IHRyYWNrZXItPmN1cnJlbnRfc3RhdGU7CisgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIG5vdGlmeSwgdHJ1ZSwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgKncgPSBncHJfbWFsbG9jKHNpemVvZigqdykpOworICAgICAgdy0+Y3VycmVudCA9IGN1cnJlbnQ7CisgICAgICB3LT5ub3RpZnkgPSBub3RpZnk7CisgICAgICB3LT5uZXh0ID0gdHJhY2tlci0+d2F0Y2hlcnM7CisgICAgICB0cmFja2VyLT53YXRjaGVycyA9IHc7CisgICAgfQorICAgIHJldHVybiB0cmFja2VyLT5jdXJyZW50X3N0YXRlID09IEdSUENfQ0hBTk5FTF9JRExFOworICB9Cit9CisKK3ZvaWQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKSB7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgKnc7CisgIGlmIChncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFjZSkgeworICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiU0VUOiAlcCAlczogJXMgLS0+ICVzIFslc10iLCB0cmFja2VyLCB0cmFja2VyLT5uYW1lLAorICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbmFtZSh0cmFja2VyLT5jdXJyZW50X3N0YXRlKSwKKyAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25hbWUoc3RhdGUpLCByZWFzb24pOworICB9CisgIGlmICh0cmFja2VyLT5jdXJyZW50X3N0YXRlID09IHN0YXRlKSB7CisgICAgcmV0dXJuOworICB9CisgIEdQUl9BU1NFUlQodHJhY2tlci0+Y3VycmVudF9zdGF0ZSAhPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSk7CisgIHRyYWNrZXItPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKKyAgd2hpbGUgKCh3ID0gdHJhY2tlci0+d2F0Y2hlcnMpICE9IE5VTEwpIHsKKyAgICAqdy0+Y3VycmVudCA9IHRyYWNrZXItPmN1cnJlbnRfc3RhdGU7CisgICAgdHJhY2tlci0+d2F0Y2hlcnMgPSB3LT5uZXh0OworICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgdy0+bm90aWZ5LCB0cnVlLCBOVUxMKTsKKyAgICBncHJfZnJlZSh3KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5MjEzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9DT05ORUNUSVZJVFlfU1RBVEVfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9DT05ORUNUSVZJVFlfU1RBVEVfSAorCisjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmgiCisKK3R5cGVkZWYgc3RydWN0IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgeworICAvKiogd2Uga2VlcCB3YXRjaGVycyBpbiBhIGxpbmtlZCBsaXN0ICovCisgIHN0cnVjdCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV93YXRjaGVyICpuZXh0OworICAvKiogY2xvc3VyZSB0byBub3RpZnkgb24gY2hhbmdlICovCisgIGdycGNfY2xvc3VyZSAqbm90aWZ5OworICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgYXMgYmVsaWV2ZWQgYnkgdGhlIHdhdGNoZXIgKi8KKyAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKmN1cnJlbnQ7Cit9IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyoqIGN1cnJlbnQgY29ubmVjdGl2aXR5IHN0YXRlICovCisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGN1cnJlbnRfc3RhdGU7CisgIC8qKiBhbGwgb3VyIHdhdGNoZXJzICovCisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgKndhdGNoZXJzOworICAvKiogYSBuYW1lIHRvIGhlbHAgZGVidWdnaW5nICovCisgIGNoYXIgKm5hbWU7Cit9IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXI7CisKK2V4dGVybiBpbnQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2U7CisKK2NvbnN0IGNoYXIgKmdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25hbWUoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGUpOworCit2b2lkIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2luaXQoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBpbml0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgKnRyYWNrZXIpOworCisvKiogU2V0IGNvbm5lY3Rpdml0eSBzdGF0ZTsgbm90IHRocmVhZCBzYWZlOyBhY2Nlc3MgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggYW4KKyAqIGV4dGVybmFsIGxvY2sgKi8KK3ZvaWQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKKworZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfY2hlY2soCisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlcik7CisKKy8qKiBSZXR1cm4gMSBpZiB0aGUgY2hhbm5lbCBzaG91bGQgc3RhcnQgY29ubmVjdGluZywgMCBvdGhlcndpc2UuCisgICAgSWYgY3VycmVudD09TlVMTCBjYW5jZWwgbm90aWZ5IGlmIGl0IGlzIGFscmVhZHkgcXVldWVkIChzdWNjZXNzPT0wIGluIHRoYXQKKyAgICBjYXNlKSAqLworaW50IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCisgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgKnRyYWNrZXIsCisgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgKmN1cnJlbnQsIGdycGNfY2xvc3VyZSAqbm90aWZ5KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX0NPTk5FQ1RJVklUWV9TVEFURV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxYzhkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuYwpAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9jb21wcmVzc2lvbi5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgorCisvKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIG1kZWxlbSBhbmQgbWRzdHIgaW5zdGFuY2VzLgorICogU3RhdGljIGluc3RhbmNlcyBhcmUgZGVjbGFyZWQgaW4gc3RhdGljX21ldGFkYXRhLntoLGN9IGFuZAorICogYXJlIGluaXRpYWxpemVkIGJ5IGdycGNfbWRjdHhfZ2xvYmFsX2luaXQoKS4KKyAqIER5bmFtaWMgaW5zdGFuY2VzIGFyZSBzdG9yZWQgaW4gaGFzaCB0YWJsZXMgb24gZ3JwY19tZGN0eCwgYW5kIGFyZSBiYWNrZWQKKyAqIGJ5IGludGVybmFsX3N0cmluZyBhbmQgaW50ZXJuYWxfZWxlbWVudCBzdHJ1Y3R1cmVzLgorICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBoZXJlLWluIChpc19tZHN0cl9zdGF0aWMsIGlzX21kZWxlbV9zdGF0aWMpIGFyZQorICogdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gga2luZCBvZiBlbGVtZW50IGEgcG9pbnRlciByZWZlcnMgdG8uCisgKi8KKworI2RlZmluZSBJTklUSUFMX1NUUlRBQl9DQVBBQ0lUWSA0CisjZGVmaW5lIElOSVRJQUxfTURUQUJfQ0FQQUNJVFkgNAorCisjaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRworI2RlZmluZSBERUJVR19BUkdTICwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUKKyNkZWZpbmUgRldEX0RFQlVHX0FSR1MgLCBmaWxlLCBsaW5lCisjZGVmaW5lIFJFRl9NRF9MT0NLRUQoc2hhcmQsIHMpIHJlZl9tZF9sb2NrZWQoKHNoYXJkKSwgKHMpLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZWxzZQorI2RlZmluZSBERUJVR19BUkdTCisjZGVmaW5lIEZXRF9ERUJVR19BUkdTCisjZGVmaW5lIFJFRl9NRF9MT0NLRUQoc2hhcmQsIHMpIHJlZl9tZF9sb2NrZWQoKHNoYXJkKSwgKHMpKQorI2VuZGlmCisKKyNkZWZpbmUgVEFCTEVfSURYKGhhc2gsIGxvZzJfc2hhcmRzLCBjYXBhY2l0eSkgXAorICAoKChoYXNoKSA+PiAobG9nMl9zaGFyZHMpKSAlIChjYXBhY2l0eSkpCisjZGVmaW5lIFNIQVJEX0lEWChoYXNoLCBsb2cyX3NoYXJkcykgKChoYXNoKSAmICgoMSA8PCAobG9nMl9zaGFyZHMpKSAtIDEpKQorCit0eXBlZGVmIHZvaWQgKCpkZXN0cm95X3VzZXJfZGF0YV9mdW5jKSh2b2lkICp1c2VyX2RhdGEpOworCisvKiBTaGFkb3cgc3RydWN0dXJlIGZvciBncnBjX21kc3RyIGZvciBub24tc3RhdGljIHZhbHVlcyAqLwordHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RyaW5nIHsKKyAgLyogbXVzdCBiZSBieXRlIGNvbXBhdGlibGUgd2l0aCBncnBjX21kc3RyICovCisgIGdwcl9zbGljZSBzbGljZTsKKyAgdWludDMyX3QgaGFzaDsKKworICAvKiBwcml2YXRlIG9ubHkgZGF0YSAqLworICBncHJfYXRtIHJlZmNudDsKKworICB1aW50OF90IGhhc19iYXNlNjRfYW5kX2h1ZmZtYW5fZW5jb2RlZDsKKyAgZ3ByX3NsaWNlX3JlZmNvdW50IHJlZmNvdW50OworCisgIGdwcl9zbGljZSBiYXNlNjRfYW5kX2h1ZmZtYW47CisKKyAgc3RydWN0IGludGVybmFsX3N0cmluZyAqYnVja2V0X25leHQ7Cit9IGludGVybmFsX3N0cmluZzsKKworLyogU2hhZG93IHN0cnVjdHVyZSBmb3IgZ3JwY19tZGVsZW0gZm9yIG5vbi1zdGF0aWMgZWxlbWVudHMgKi8KK3R5cGVkZWYgc3RydWN0IGludGVybmFsX21ldGFkYXRhIHsKKyAgLyogbXVzdCBiZSBieXRlIGNvbXBhdGlibGUgd2l0aCBncnBjX21kZWxlbSAqLworICBpbnRlcm5hbF9zdHJpbmcgKmtleTsKKyAgaW50ZXJuYWxfc3RyaW5nICp2YWx1ZTsKKworICAvKiBwcml2YXRlIG9ubHkgZGF0YSAqLworICBncHJfYXRtIHJlZmNudDsKKworICBncHJfbXUgbXVfdXNlcl9kYXRhOworICBncHJfYXRtIGRlc3Ryb3lfdXNlcl9kYXRhOworICBncHJfYXRtIHVzZXJfZGF0YTsKKworICBzdHJ1Y3QgaW50ZXJuYWxfbWV0YWRhdGEgKmJ1Y2tldF9uZXh0OworfSBpbnRlcm5hbF9tZXRhZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RydGFiX3NoYXJkIHsKKyAgZ3ByX211IG11OworICBpbnRlcm5hbF9zdHJpbmcgKipzdHJzOworICBzaXplX3QgY291bnQ7CisgIHNpemVfdCBjYXBhY2l0eTsKK30gc3RydGFiX3NoYXJkOworCit0eXBlZGVmIHN0cnVjdCBtZHRhYl9zaGFyZCB7CisgIGdwcl9tdSBtdTsKKyAgaW50ZXJuYWxfbWV0YWRhdGEgKiplbGVtczsKKyAgc2l6ZV90IGNvdW50OworICBzaXplX3QgY2FwYWNpdHk7CisgIHNpemVfdCBmcmVlOworfSBtZHRhYl9zaGFyZDsKKworI2RlZmluZSBMT0cyX1NUUlRBQl9TSEFSRF9DT1VOVCA1CisjZGVmaW5lIExPRzJfTURUQUJfU0hBUkRfQ09VTlQgNAorI2RlZmluZSBTVFJUQUJfU0hBUkRfQ09VTlQgKChzaXplX3QpKDEgPDwgTE9HMl9TVFJUQUJfU0hBUkRfQ09VTlQpKQorI2RlZmluZSBNRFRBQl9TSEFSRF9DT1VOVCAoKHNpemVfdCkoMSA8PCBMT0cyX01EVEFCX1NIQVJEX0NPVU5UKSkKKworLyogaGFzaCBzZWVkOiBkZWNpZGVkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgKi8KK3N0YXRpYyB1aW50MzJfdCBnX2hhc2hfc2VlZDsKK3N0YXRpYyBpbnQgZ19mb3JjZWRfaGFzaF9zZWVkID0gMDsKKworLyogbGluZWFybHkgcHJvYmVkIGhhc2ggdGFibGVzIGZvciBzdGF0aWMgZWxlbWVudCBsb29rdXAgKi8KK3N0YXRpYyBncnBjX21kc3RyICpnX3N0YXRpY19zdHJ0YWJbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlQgKiAyXTsKK3N0YXRpYyBncnBjX21kZWxlbSAqZ19zdGF0aWNfbWR0YWJbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UICogMl07CitzdGF0aWMgc2l6ZV90IGdfc3RhdGljX3N0cnRhYl9tYXhwcm9iZTsKK3N0YXRpYyBzaXplX3QgZ19zdGF0aWNfbWR0YWJfbWF4cHJvYmU7CisKK3N0YXRpYyBzdHJ0YWJfc2hhcmQgZ19zdHJ0YWJfc2hhcmRbU1RSVEFCX1NIQVJEX0NPVU5UXTsKK3N0YXRpYyBtZHRhYl9zaGFyZCBnX21kdGFiX3NoYXJkW01EVEFCX1NIQVJEX0NPVU5UXTsKKworc3RhdGljIHZvaWQgZ2NfbWR0YWIobWR0YWJfc2hhcmQgKnNoYXJkKTsKKwordm9pZCBncnBjX3Rlc3Rfb25seV9zZXRfbWV0YWRhdGFfaGFzaF9zZWVkKHVpbnQzMl90IHNlZWQpIHsKKyAgZ19oYXNoX3NlZWQgPSBzZWVkOworICBnX2ZvcmNlZF9oYXNoX3NlZWQgPSAxOworfQorCit2b2lkIGdycGNfbWRjdHhfZ2xvYmFsX2luaXQodm9pZCkgeworICBzaXplX3QgaSwgajsKKyAgaWYgKCFnX2ZvcmNlZF9oYXNoX3NlZWQpIHsKKyAgICBnX2hhc2hfc2VlZCA9ICh1aW50MzJfdClncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSkudHZfbnNlYzsKKyAgfQorICBnX3N0YXRpY19zdHJ0YWJfbWF4cHJvYmUgPSAwOworICBnX3N0YXRpY19tZHRhYl9tYXhwcm9iZSA9IDA7CisgIC8qIGJ1aWxkIHN0YXRpYyB0YWJsZXMgKi8KKyAgbWVtc2V0KGdfc3RhdGljX21kdGFiLCAwLCBzaXplb2YoZ19zdGF0aWNfbWR0YWIpKTsKKyAgbWVtc2V0KGdfc3RhdGljX3N0cnRhYiwgMCwgc2l6ZW9mKGdfc3RhdGljX3N0cnRhYikpOworICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19TVEFUSUNfTURTVFJfQ09VTlQ7IGkrKykgeworICAgIGdycGNfbWRzdHIgKmVsZW0gPSAmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbaV07CisgICAgY29uc3QgY2hhciAqc3RyID0gZ3JwY19zdGF0aWNfbWV0YWRhdGFfc3RyaW5nc1tpXTsKKyAgICB1aW50MzJfdCBoYXNoID0gZ3ByX211cm11cl9oYXNoMyhzdHIsIHN0cmxlbihzdHIpLCBnX2hhc2hfc2VlZCk7CisgICAgKihncHJfc2xpY2UgKikmZWxlbS0+c2xpY2UgPSBncHJfc2xpY2VfZnJvbV9zdGF0aWNfc3RyaW5nKHN0cik7CisgICAgKih1aW50MzJfdCAqKSZlbGVtLT5oYXNoID0gaGFzaDsKKyAgICBmb3IgKGogPSAwOzsgaisrKSB7CisgICAgICBzaXplX3QgaWR4ID0gKGhhc2ggKyBqKSAlIEdQUl9BUlJBWV9TSVpFKGdfc3RhdGljX3N0cnRhYik7CisgICAgICBpZiAoZ19zdGF0aWNfc3RydGFiW2lkeF0gPT0gTlVMTCkgeworICAgICAgICBnX3N0YXRpY19zdHJ0YWJbaWR4XSA9ICZncnBjX3N0YXRpY19tZHN0cl90YWJsZVtpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChqID4gZ19zdGF0aWNfc3RydGFiX21heHByb2JlKSB7CisgICAgICBnX3N0YXRpY19zdHJ0YWJfbWF4cHJvYmUgPSBqOworICAgIH0KKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UOyBpKyspIHsKKyAgICBncnBjX21kZWxlbSAqZWxlbSA9ICZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbaV07CisgICAgZ3JwY19tZHN0ciAqa2V5ID0KKyAgICAgICAgJmdycGNfc3RhdGljX21kc3RyX3RhYmxlW2dycGNfc3RhdGljX21ldGFkYXRhX2VsZW1faW5kaWNlc1syICogaSArIDBdXTsKKyAgICBncnBjX21kc3RyICp2YWx1ZSA9CisgICAgICAgICZncnBjX3N0YXRpY19tZHN0cl90YWJsZVtncnBjX3N0YXRpY19tZXRhZGF0YV9lbGVtX2luZGljZXNbMiAqIGkgKyAxXV07CisgICAgdWludDMyX3QgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChrZXktPmhhc2gsIHZhbHVlLT5oYXNoKTsKKyAgICAqKGdycGNfbWRzdHIgKiopJmVsZW0tPmtleSA9IGtleTsKKyAgICAqKGdycGNfbWRzdHIgKiopJmVsZW0tPnZhbHVlID0gdmFsdWU7CisgICAgZm9yIChqID0gMDs7IGorKykgeworICAgICAgc2l6ZV90IGlkeCA9IChoYXNoICsgaikgJSBHUFJfQVJSQVlfU0laRShnX3N0YXRpY19tZHRhYik7CisgICAgICBpZiAoZ19zdGF0aWNfbWR0YWJbaWR4XSA9PSBOVUxMKSB7CisgICAgICAgIGdfc3RhdGljX21kdGFiW2lkeF0gPSBlbGVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGogPiBnX3N0YXRpY19tZHRhYl9tYXhwcm9iZSkgeworICAgICAgZ19zdGF0aWNfbWR0YWJfbWF4cHJvYmUgPSBqOworICAgIH0KKyAgfQorICAvKiBpbml0aWFsaXplIHNoYXJkcyAqLworICBmb3IgKGkgPSAwOyBpIDwgU1RSVEFCX1NIQVJEX0NPVU5UOyBpKyspIHsKKyAgICBzdHJ0YWJfc2hhcmQgKnNoYXJkID0gJmdfc3RydGFiX3NoYXJkW2ldOworICAgIGdwcl9tdV9pbml0KCZzaGFyZC0+bXUpOworICAgIHNoYXJkLT5jb3VudCA9IDA7CisgICAgc2hhcmQtPmNhcGFjaXR5ID0gSU5JVElBTF9TVFJUQUJfQ0FQQUNJVFk7CisgICAgc2hhcmQtPnN0cnMgPSBncHJfbWFsbG9jKHNpemVvZigqc2hhcmQtPnN0cnMpICogc2hhcmQtPmNhcGFjaXR5KTsKKyAgICBtZW1zZXQoc2hhcmQtPnN0cnMsIDAsIHNpemVvZigqc2hhcmQtPnN0cnMpICogc2hhcmQtPmNhcGFjaXR5KTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgTURUQUJfU0hBUkRfQ09VTlQ7IGkrKykgeworICAgIG1kdGFiX3NoYXJkICpzaGFyZCA9ICZnX21kdGFiX3NoYXJkW2ldOworICAgIGdwcl9tdV9pbml0KCZzaGFyZC0+bXUpOworICAgIHNoYXJkLT5jb3VudCA9IDA7CisgICAgc2hhcmQtPmZyZWUgPSAwOworICAgIHNoYXJkLT5jYXBhY2l0eSA9IElOSVRJQUxfTURUQUJfQ0FQQUNJVFk7CisgICAgc2hhcmQtPmVsZW1zID0gZ3ByX21hbGxvYyhzaXplb2YoKnNoYXJkLT5lbGVtcykgKiBzaGFyZC0+Y2FwYWNpdHkpOworICAgIG1lbXNldChzaGFyZC0+ZWxlbXMsIDAsIHNpemVvZigqc2hhcmQtPmVsZW1zKSAqIHNoYXJkLT5jYXBhY2l0eSk7CisgIH0KK30KKwordm9pZCBncnBjX21kY3R4X2dsb2JhbF9zaHV0ZG93bih2b2lkKSB7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgTURUQUJfU0hBUkRfQ09VTlQ7IGkrKykgeworICAgIG1kdGFiX3NoYXJkICpzaGFyZCA9ICZnX21kdGFiX3NoYXJkW2ldOworICAgIGdwcl9tdV9kZXN0cm95KCZzaGFyZC0+bXUpOworICAgIGdjX21kdGFiKHNoYXJkKTsKKyAgICAvKiBUT0RPKGN0aWxsZXIpOiBHUFJfQVNTRVJUKHNoYXJkLT5jb3VudCA9PSAwKTsgKi8KKyAgICBpZiAoc2hhcmQtPmNvdW50ICE9IDApIHsKKyAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiV0FSTklORzogJWQgbWV0YWRhdGEgZWxlbWVudHMgd2VyZSBsZWFrZWQiLAorICAgICAgICAgICAgICBzaGFyZC0+Y291bnQpOworICAgICAgaWYgKGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3MoKSkgeworICAgICAgICBhYm9ydCgpOworICAgICAgfQorICAgIH0KKyAgICBncHJfZnJlZShzaGFyZC0+ZWxlbXMpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBTVFJUQUJfU0hBUkRfQ09VTlQ7IGkrKykgeworICAgIHN0cnRhYl9zaGFyZCAqc2hhcmQgPSAmZ19zdHJ0YWJfc2hhcmRbaV07CisgICAgZ3ByX211X2Rlc3Ryb3koJnNoYXJkLT5tdSk7CisgICAgLyogVE9ETyhjdGlsbGVyKTogR1BSX0FTU0VSVChzaGFyZC0+Y291bnQgPT0gMCk7ICovCisgICAgaWYgKHNoYXJkLT5jb3VudCAhPSAwKSB7CisgICAgICBncHJfbG9nKEdQUl9ERUJVRywgIldBUk5JTkc6ICVkIG1ldGFkYXRhIHN0cmluZ3Mgd2VyZSBsZWFrZWQiLAorICAgICAgICAgICAgICBzaGFyZC0+Y291bnQpOworICAgICAgaWYgKGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3MoKSkgeworICAgICAgICBhYm9ydCgpOworICAgICAgfQorICAgIH0KKyAgICBncHJfZnJlZShzaGFyZC0+c3Rycyk7CisgIH0KK30KKworc3RhdGljIGludCBpc19tZHN0cl9zdGF0aWMoZ3JwY19tZHN0ciAqcykgeworICByZXR1cm4gcyA+PSAmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMF0gJiYKKyAgICAgICAgIHMgPCAmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlRdOworfQorCitzdGF0aWMgaW50IGlzX21kZWxlbV9zdGF0aWMoZ3JwY19tZGVsZW0gKmUpIHsKKyAgcmV0dXJuIGUgPj0gJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVswXSAmJgorICAgICAgICAgZSA8ICZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UXTsKK30KKworc3RhdGljIHZvaWQgcmVmX21kX2xvY2tlZChtZHRhYl9zaGFyZCAqc2hhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX21ldGFkYXRhICptZCBERUJVR19BUkdTKSB7CisjaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCisgICAgICAgICAgIkVMTSAgIFJFRjolcDolZC0+JWQ6ICclcycgPSAnJXMnIiwgbWQsCisgICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpLAorICAgICAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+cmVmY250KSArIDEsCisgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZygoZ3JwY19tZHN0ciAqKW1kLT5rZXkpLAorICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcoKGdycGNfbWRzdHIgKiltZC0+dmFsdWUpKTsKKyNlbmRpZgorICBpZiAoMCA9PSBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZtZC0+cmVmY250LCAyKSkgeworICAgIHNoYXJkLT5mcmVlLS07CisgIH0gZWxzZSB7CisgICAgR1BSX0FTU0VSVCgxICE9IGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJm1kLT5yZWZjbnQsIC0xKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZ3Jvd19zdHJ0YWIoc3RydGFiX3NoYXJkICpzaGFyZCkgeworICBzaXplX3QgY2FwYWNpdHkgPSBzaGFyZC0+Y2FwYWNpdHkgKiAyOworICBzaXplX3QgaTsKKyAgaW50ZXJuYWxfc3RyaW5nICoqc3RydGFiOworICBpbnRlcm5hbF9zdHJpbmcgKnMsICpuZXh0OworCisgIEdQUl9USU1FUl9CRUdJTigiZ3Jvd19zdHJ0YWIiLCAwKTsKKworICBzdHJ0YWIgPSBncHJfbWFsbG9jKHNpemVvZihpbnRlcm5hbF9zdHJpbmcgKikgKiBjYXBhY2l0eSk7CisgIG1lbXNldChzdHJ0YWIsIDAsIHNpemVvZihpbnRlcm5hbF9zdHJpbmcgKikgKiBjYXBhY2l0eSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNoYXJkLT5jYXBhY2l0eTsgaSsrKSB7CisgICAgZm9yIChzID0gc2hhcmQtPnN0cnNbaV07IHM7IHMgPSBuZXh0KSB7CisgICAgICBzaXplX3QgaWR4ID0gVEFCTEVfSURYKHMtPmhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5ULCBjYXBhY2l0eSk7CisgICAgICBuZXh0ID0gcy0+YnVja2V0X25leHQ7CisgICAgICBzLT5idWNrZXRfbmV4dCA9IHN0cnRhYltpZHhdOworICAgICAgc3RydGFiW2lkeF0gPSBzOworICAgIH0KKyAgfQorCisgIGdwcl9mcmVlKHNoYXJkLT5zdHJzKTsKKyAgc2hhcmQtPnN0cnMgPSBzdHJ0YWI7CisgIHNoYXJkLT5jYXBhY2l0eSA9IGNhcGFjaXR5OworCisgIEdQUl9USU1FUl9FTkQoImdyb3dfc3RydGFiIiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX2Rlc3Ryb3lfc3RyaW5nKHN0cnRhYl9zaGFyZCAqc2hhcmQsIGludGVybmFsX3N0cmluZyAqaXMpIHsKKyAgaW50ZXJuYWxfc3RyaW5nICoqcHJldl9uZXh0OworICBpbnRlcm5hbF9zdHJpbmcgKmN1cjsKKyAgR1BSX1RJTUVSX0JFR0lOKCJpbnRlcm5hbF9kZXN0cm95X3N0cmluZyIsIDApOworICBpZiAoaXMtPmhhc19iYXNlNjRfYW5kX2h1ZmZtYW5fZW5jb2RlZCkgeworICAgIGdwcl9zbGljZV91bnJlZihpcy0+YmFzZTY0X2FuZF9odWZmbWFuKTsKKyAgfQorICBmb3IgKHByZXZfbmV4dCA9ICZzaGFyZC0+c3Ryc1tUQUJMRV9JRFgoaXMtPmhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmQtPmNhcGFjaXR5KV0sCisgICAgICBjdXIgPSAqcHJldl9uZXh0OworICAgICAgIGN1ciAhPSBpczsgcHJldl9uZXh0ID0gJmN1ci0+YnVja2V0X25leHQsIGN1ciA9IGN1ci0+YnVja2V0X25leHQpCisgICAgOworICAqcHJldl9uZXh0ID0gY3VyLT5idWNrZXRfbmV4dDsKKyAgc2hhcmQtPmNvdW50LS07CisgIGdwcl9mcmVlKGlzKTsKKyAgR1BSX1RJTUVSX0VORCgiaW50ZXJuYWxfZGVzdHJveV9zdHJpbmciLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2xpY2VfcmVmKHZvaWQgKnApIHsKKyAgaW50ZXJuYWxfc3RyaW5nICppcyA9CisgICAgICAoaW50ZXJuYWxfc3RyaW5nICopKChjaGFyICopcCAtIG9mZnNldG9mKGludGVybmFsX3N0cmluZywgcmVmY291bnQpKTsKKyAgR1JQQ19NRFNUUl9SRUYoKGdycGNfbWRzdHIgKikoaXMpKTsKK30KKworc3RhdGljIHZvaWQgc2xpY2VfdW5yZWYodm9pZCAqcCkgeworICBpbnRlcm5hbF9zdHJpbmcgKmlzID0KKyAgICAgIChpbnRlcm5hbF9zdHJpbmcgKikoKGNoYXIgKilwIC0gb2Zmc2V0b2YoaW50ZXJuYWxfc3RyaW5nLCByZWZjb3VudCkpOworICBHUlBDX01EU1RSX1VOUkVGKChncnBjX21kc3RyICopKGlzKSk7Cit9CisKK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKSB7CisgIHJldHVybiBncnBjX21kc3RyX2Zyb21fYnVmZmVyKChjb25zdCB1aW50OF90ICopc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9zbGljZShncHJfc2xpY2Ugc2xpY2UpIHsKKyAgZ3JwY19tZHN0ciAqcmVzdWx0ID0gZ3JwY19tZHN0cl9mcm9tX2J1ZmZlcihHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKSk7CisgIGdwcl9zbGljZV91bnJlZihzbGljZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9idWZmZXIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuZ3RoKSB7CisgIHVpbnQzMl90IGhhc2ggPSBncHJfbXVybXVyX2hhc2gzKGJ1ZiwgbGVuZ3RoLCBnX2hhc2hfc2VlZCk7CisgIGludGVybmFsX3N0cmluZyAqczsKKyAgc3RydGFiX3NoYXJkICpzaGFyZCA9CisgICAgICAmZ19zdHJ0YWJfc2hhcmRbU0hBUkRfSURYKGhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5UKV07CisgIHNpemVfdCBpOworICBzaXplX3QgaWR4OworCisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19tZHN0cl9mcm9tX2J1ZmZlciIsIDApOworCisgIC8qIHNlYXJjaCBmb3IgYSBzdGF0aWMgc3RyaW5nICovCisgIGZvciAoaSA9IDA7IGkgPD0gZ19zdGF0aWNfc3RydGFiX21heHByb2JlOyBpKyspIHsKKyAgICBncnBjX21kc3RyICpzczsKKyAgICBpZHggPSAoaGFzaCArIGkpICUgR1BSX0FSUkFZX1NJWkUoZ19zdGF0aWNfc3RydGFiKTsKKyAgICBzcyA9IGdfc3RhdGljX3N0cnRhYltpZHhdOworICAgIGlmIChzcyA9PSBOVUxMKSBicmVhazsKKyAgICBpZiAoc3MtPmhhc2ggPT0gaGFzaCAmJiBHUFJfU0xJQ0VfTEVOR1RIKHNzLT5zbGljZSkgPT0gbGVuZ3RoICYmCisgICAgICAgIDAgPT0gbWVtY21wKGJ1ZiwgR1BSX1NMSUNFX1NUQVJUX1BUUihzcy0+c2xpY2UpLCBsZW5ndGgpKSB7CisgICAgICBHUFJfVElNRVJfRU5EKCJncnBjX21kc3RyX2Zyb21fYnVmZmVyIiwgMCk7CisgICAgICByZXR1cm4gc3M7CisgICAgfQorICB9CisKKyAgZ3ByX211X2xvY2soJnNoYXJkLT5tdSk7CisKKyAgLyogc2VhcmNoIGZvciBhbiBleGlzdGluZyBzdHJpbmcgKi8KKyAgaWR4ID0gVEFCTEVfSURYKGhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5ULCBzaGFyZC0+Y2FwYWNpdHkpOworICBmb3IgKHMgPSBzaGFyZC0+c3Ryc1tpZHhdOyBzOyBzID0gcy0+YnVja2V0X25leHQpIHsKKyAgICBpZiAocy0+aGFzaCA9PSBoYXNoICYmIEdQUl9TTElDRV9MRU5HVEgocy0+c2xpY2UpID09IGxlbmd0aCAmJgorICAgICAgICAwID09IG1lbWNtcChidWYsIEdQUl9TTElDRV9TVEFSVF9QVFIocy0+c2xpY2UpLCBsZW5ndGgpKSB7CisgICAgICBHUlBDX01EU1RSX1JFRigoZ3JwY19tZHN0ciAqKXMpOworICAgICAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKKyAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfbWRzdHJfZnJvbV9idWZmZXIiLCAwKTsKKyAgICAgIHJldHVybiAoZ3JwY19tZHN0ciAqKXM7CisgICAgfQorICB9CisKKyAgLyogbm90IGZvdW5kOiBjcmVhdGUgYSBuZXcgc3RyaW5nICovCisgIGlmIChsZW5ndGggKyAxIDwgR1BSX1NMSUNFX0lOTElORURfU0laRSkgeworICAgIC8qIHN0cmluZyBkYXRhIGdvZXMgZGlyZWN0bHkgaW50byB0aGUgc2xpY2UgKi8KKyAgICBzID0gZ3ByX21hbGxvYyhzaXplb2YoaW50ZXJuYWxfc3RyaW5nKSk7CisgICAgZ3ByX2F0bV9yZWxfc3RvcmUoJnMtPnJlZmNudCwgMik7CisgICAgcy0+c2xpY2UucmVmY291bnQgPSBOVUxMOworICAgIG1lbWNweShzLT5zbGljZS5kYXRhLmlubGluZWQuYnl0ZXMsIGJ1ZiwgbGVuZ3RoKTsKKyAgICBzLT5zbGljZS5kYXRhLmlubGluZWQuYnl0ZXNbbGVuZ3RoXSA9IDA7CisgICAgcy0+c2xpY2UuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KWxlbmd0aDsKKyAgfSBlbHNlIHsKKyAgICAvKiBzdHJpbmcgZGF0YSBnb2VzIGFmdGVyIHRoZSBpbnRlcm5hbF9zdHJpbmcgaGVhZGVyLCBhbmQgd2UgKzEgZm9yIG51bGwKKyAgICAgICB0ZXJtaW5hdG9yICovCisgICAgcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGludGVybmFsX3N0cmluZykgKyBsZW5ndGggKyAxKTsKKyAgICBncHJfYXRtX3JlbF9zdG9yZSgmcy0+cmVmY250LCAyKTsKKyAgICBzLT5yZWZjb3VudC5yZWYgPSBzbGljZV9yZWY7CisgICAgcy0+cmVmY291bnQudW5yZWYgPSBzbGljZV91bnJlZjsKKyAgICBzLT5zbGljZS5yZWZjb3VudCA9ICZzLT5yZWZjb3VudDsKKyAgICBzLT5zbGljZS5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSAodWludDhfdCAqKShzICsgMSk7CisgICAgcy0+c2xpY2UuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA9IGxlbmd0aDsKKyAgICBtZW1jcHkocy0+c2xpY2UuZGF0YS5yZWZjb3VudGVkLmJ5dGVzLCBidWYsIGxlbmd0aCk7CisgICAgLyogYWRkIGEgbnVsbCB0ZXJtaW5hdG9yIGZvciBjaGVhcCBjIHN0cmluZyBjb252ZXJzaW9uIHdoZW4gZGVzaXJlZCAqLworICAgIHMtPnNsaWNlLmRhdGEucmVmY291bnRlZC5ieXRlc1tsZW5ndGhdID0gMDsKKyAgfQorICBzLT5oYXNfYmFzZTY0X2FuZF9odWZmbWFuX2VuY29kZWQgPSAwOworICBzLT5oYXNoID0gaGFzaDsKKyAgcy0+YnVja2V0X25leHQgPSBzaGFyZC0+c3Ryc1tpZHhdOworICBzaGFyZC0+c3Ryc1tpZHhdID0gczsKKworICBzaGFyZC0+Y291bnQrKzsKKworICBpZiAoc2hhcmQtPmNvdW50ID4gc2hhcmQtPmNhcGFjaXR5ICogMikgeworICAgIGdyb3dfc3RydGFiKHNoYXJkKTsKKyAgfQorCisgIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7CisgIEdQUl9USU1FUl9FTkQoImdycGNfbWRzdHJfZnJvbV9idWZmZXIiLCAwKTsKKworICByZXR1cm4gKGdycGNfbWRzdHIgKilzOworfQorCitzdGF0aWMgdm9pZCBnY19tZHRhYihtZHRhYl9zaGFyZCAqc2hhcmQpIHsKKyAgc2l6ZV90IGk7CisgIGludGVybmFsX21ldGFkYXRhICoqcHJldl9uZXh0OworICBpbnRlcm5hbF9tZXRhZGF0YSAqbWQsICpuZXh0OworCisgIEdQUl9USU1FUl9CRUdJTigiZ2NfbWR0YWIiLCAwKTsKKyAgZm9yIChpID0gMDsgaSA8IHNoYXJkLT5jYXBhY2l0eTsgaSsrKSB7CisgICAgcHJldl9uZXh0ID0gJnNoYXJkLT5lbGVtc1tpXTsKKyAgICBmb3IgKG1kID0gc2hhcmQtPmVsZW1zW2ldOyBtZDsgbWQgPSBuZXh0KSB7CisgICAgICB2b2lkICp1c2VyX2RhdGEgPSAodm9pZCAqKWdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+dXNlcl9kYXRhKTsKKyAgICAgIG5leHQgPSBtZC0+YnVja2V0X25leHQ7CisgICAgICBpZiAoZ3ByX2F0bV9hY3FfbG9hZCgmbWQtPnJlZmNudCkgPT0gMCkgeworICAgICAgICBHUlBDX01EU1RSX1VOUkVGKChncnBjX21kc3RyICopbWQtPmtleSk7CisgICAgICAgIEdSUENfTURTVFJfVU5SRUYoKGdycGNfbWRzdHIgKiltZC0+dmFsdWUpOworICAgICAgICBpZiAobWQtPnVzZXJfZGF0YSkgeworICAgICAgICAgICgoZGVzdHJveV91c2VyX2RhdGFfZnVuYylncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgKKyAgICAgICAgICAgICAgJm1kLT5kZXN0cm95X3VzZXJfZGF0YSkpKHVzZXJfZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZ3ByX2ZyZWUobWQpOworICAgICAgICAqcHJldl9uZXh0ID0gbmV4dDsKKyAgICAgICAgc2hhcmQtPmZyZWUtLTsKKyAgICAgICAgc2hhcmQtPmNvdW50LS07CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmV2X25leHQgPSAmbWQtPmJ1Y2tldF9uZXh0OworICAgICAgfQorICAgIH0KKyAgfQorICBHUFJfVElNRVJfRU5EKCJnY19tZHRhYiIsIDApOworfQorCitzdGF0aWMgdm9pZCBncm93X21kdGFiKG1kdGFiX3NoYXJkICpzaGFyZCkgeworICBzaXplX3QgY2FwYWNpdHkgPSBzaGFyZC0+Y2FwYWNpdHkgKiAyOworICBzaXplX3QgaTsKKyAgaW50ZXJuYWxfbWV0YWRhdGEgKiptZHRhYjsKKyAgaW50ZXJuYWxfbWV0YWRhdGEgKm1kLCAqbmV4dDsKKyAgdWludDMyX3QgaGFzaDsKKworICBHUFJfVElNRVJfQkVHSU4oImdyb3dfbWR0YWIiLCAwKTsKKworICBtZHRhYiA9IGdwcl9tYWxsb2Moc2l6ZW9mKGludGVybmFsX21ldGFkYXRhICopICogY2FwYWNpdHkpOworICBtZW1zZXQobWR0YWIsIDAsIHNpemVvZihpbnRlcm5hbF9tZXRhZGF0YSAqKSAqIGNhcGFjaXR5KTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2hhcmQtPmNhcGFjaXR5OyBpKyspIHsKKyAgICBmb3IgKG1kID0gc2hhcmQtPmVsZW1zW2ldOyBtZDsgbWQgPSBuZXh0KSB7CisgICAgICBzaXplX3QgaWR4OworICAgICAgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChtZC0+a2V5LT5oYXNoLCBtZC0+dmFsdWUtPmhhc2gpOworICAgICAgbmV4dCA9IG1kLT5idWNrZXRfbmV4dDsKKyAgICAgIGlkeCA9IFRBQkxFX0lEWChoYXNoLCBMT0cyX01EVEFCX1NIQVJEX0NPVU5ULCBjYXBhY2l0eSk7CisgICAgICBtZC0+YnVja2V0X25leHQgPSBtZHRhYltpZHhdOworICAgICAgbWR0YWJbaWR4XSA9IG1kOworICAgIH0KKyAgfQorCisgIGdwcl9mcmVlKHNoYXJkLT5lbGVtcyk7CisgIHNoYXJkLT5lbGVtcyA9IG1kdGFiOworICBzaGFyZC0+Y2FwYWNpdHkgPSBjYXBhY2l0eTsKKworICBHUFJfVElNRVJfRU5EKCJncm93X21kdGFiIiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlaGFzaF9tZHRhYihtZHRhYl9zaGFyZCAqc2hhcmQpIHsKKyAgaWYgKHNoYXJkLT5mcmVlID4gc2hhcmQtPmNhcGFjaXR5IC8gNCkgeworICAgIGdjX21kdGFiKHNoYXJkKTsKKyAgfSBlbHNlIHsKKyAgICBncm93X21kdGFiKHNoYXJkKTsKKyAgfQorfQorCitncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKGdycGNfbWRzdHIgKm1rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRzdHIgKm12YWx1ZSkgeworICBpbnRlcm5hbF9zdHJpbmcgKmtleSA9IChpbnRlcm5hbF9zdHJpbmcgKilta2V5OworICBpbnRlcm5hbF9zdHJpbmcgKnZhbHVlID0gKGludGVybmFsX3N0cmluZyAqKW12YWx1ZTsKKyAgdWludDMyX3QgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChta2V5LT5oYXNoLCBtdmFsdWUtPmhhc2gpOworICBpbnRlcm5hbF9tZXRhZGF0YSAqbWQ7CisgIG1kdGFiX3NoYXJkICpzaGFyZCA9ICZnX21kdGFiX3NoYXJkW1NIQVJEX0lEWChoYXNoLCBMT0cyX01EVEFCX1NIQVJEX0NPVU5UKV07CisgIHNpemVfdCBpOworICBzaXplX3QgaWR4OworCisgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzIiwgMCk7CisKKyAgaWYgKGlzX21kc3RyX3N0YXRpYyhta2V5KSAmJiBpc19tZHN0cl9zdGF0aWMobXZhbHVlKSkgeworICAgIGZvciAoaSA9IDA7IGkgPD0gZ19zdGF0aWNfbWR0YWJfbWF4cHJvYmU7IGkrKykgeworICAgICAgZ3JwY19tZGVsZW0gKnNtZDsKKyAgICAgIGlkeCA9IChoYXNoICsgaSkgJSBHUFJfQVJSQVlfU0laRShnX3N0YXRpY19tZHRhYik7CisgICAgICBzbWQgPSBnX3N0YXRpY19tZHRhYltpZHhdOworICAgICAgaWYgKHNtZCA9PSBOVUxMKSBicmVhazsKKyAgICAgIGlmIChzbWQtPmtleSA9PSBta2V5ICYmIHNtZC0+dmFsdWUgPT0gbXZhbHVlKSB7CisgICAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyIsIDApOworICAgICAgICByZXR1cm4gc21kOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdwcl9tdV9sb2NrKCZzaGFyZC0+bXUpOworCisgIGlkeCA9IFRBQkxFX0lEWChoYXNoLCBMT0cyX01EVEFCX1NIQVJEX0NPVU5ULCBzaGFyZC0+Y2FwYWNpdHkpOworICAvKiBzZWFyY2ggZm9yIGFuIGV4aXN0aW5nIHBhaXIgKi8KKyAgZm9yIChtZCA9IHNoYXJkLT5lbGVtc1tpZHhdOyBtZDsgbWQgPSBtZC0+YnVja2V0X25leHQpIHsKKyAgICBpZiAobWQtPmtleSA9PSBrZXkgJiYgbWQtPnZhbHVlID09IHZhbHVlKSB7CisgICAgICBSRUZfTURfTE9DS0VEKHNoYXJkLCBtZCk7CisgICAgICBHUlBDX01EU1RSX1VOUkVGKChncnBjX21kc3RyICopa2V5KTsKKyAgICAgIEdSUENfTURTVFJfVU5SRUYoKGdycGNfbWRzdHIgKil2YWx1ZSk7CisgICAgICBncHJfbXVfdW5sb2NrKCZzaGFyZC0+bXUpOworICAgICAgR1BSX1RJTUVSX0VORCgiZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzIiwgMCk7CisgICAgICByZXR1cm4gKGdycGNfbWRlbGVtICopbWQ7CisgICAgfQorICB9CisKKyAgLyogbm90IGZvdW5kOiBjcmVhdGUgYSBuZXcgcGFpciAqLworICBtZCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGludGVybmFsX21ldGFkYXRhKSk7CisgIGdwcl9hdG1fcmVsX3N0b3JlKCZtZC0+cmVmY250LCAyKTsKKyAgbWQtPmtleSA9IGtleTsKKyAgbWQtPnZhbHVlID0gdmFsdWU7CisgIG1kLT51c2VyX2RhdGEgPSAwOworICBtZC0+ZGVzdHJveV91c2VyX2RhdGEgPSAwOworICBtZC0+YnVja2V0X25leHQgPSBzaGFyZC0+ZWxlbXNbaWR4XTsKKyAgc2hhcmQtPmVsZW1zW2lkeF0gPSBtZDsKKyAgZ3ByX211X2luaXQoJm1kLT5tdV91c2VyX2RhdGEpOworI2lmZGVmIEdSUENfTUVUQURBVEFfUkVGQ09VTlRfREVCVUcKKyAgZ3ByX2xvZyhHUFJfREVCVUcsICJFTE0gICBORVc6JXA6JWQ6ICclcycgPSAnJXMnIiwgbWQsCisgICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpLAorICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcoKGdycGNfbWRzdHIgKiltZC0+a2V5KSwKKyAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKChncnBjX21kc3RyICopbWQtPnZhbHVlKSk7CisjZW5kaWYKKyAgc2hhcmQtPmNvdW50Kys7CisKKyAgaWYgKHNoYXJkLT5jb3VudCA+IHNoYXJkLT5jYXBhY2l0eSAqIDIpIHsKKyAgICByZWhhc2hfbWR0YWIoc2hhcmQpOworICB9CisKKyAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKKworICBHUFJfVElNRVJfRU5EKCJncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MiLCAwKTsKKworICByZXR1cm4gKGdycGNfbWRlbGVtICopbWQ7Cit9CisKK2dycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3N0cmluZ3MoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgeworICByZXR1cm4gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKGdycGNfbWRzdHJfZnJvbV9zdHJpbmcoa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHZhbHVlKSk7Cit9CisKK2dycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3NsaWNlcyhncHJfc2xpY2Uga2V5LCBncHJfc2xpY2UgdmFsdWUpIHsKKyAgcmV0dXJuIGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyhncnBjX21kc3RyX2Zyb21fc2xpY2Uoa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc2xpY2UodmFsdWUpKTsKK30KKworZ3JwY19tZGVsZW0gKmdycGNfbWRlbGVtX2Zyb21fc3RyaW5nX2FuZF9idWZmZXIoY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFsdWVfbGVuZ3RoKSB7CisgIHJldHVybiBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCisgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKGtleSksIGdycGNfbWRzdHJfZnJvbV9idWZmZXIodmFsdWUsIHZhbHVlX2xlbmd0aCkpOworfQorCitncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fcmVmKGdycGNfbWRlbGVtICpnbWQgREVCVUdfQVJHUykgeworICBpbnRlcm5hbF9tZXRhZGF0YSAqbWQgPSAoaW50ZXJuYWxfbWV0YWRhdGEgKilnbWQ7CisgIGlmIChpc19tZGVsZW1fc3RhdGljKGdtZCkpIHJldHVybiBnbWQ7CisjaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRworICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCisgICAgICAgICAgIkVMTSAgIFJFRjolcDolZC0+JWQ6ICclcycgPSAnJXMnIiwgbWQsCisgICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpLAorICAgICAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+cmVmY250KSArIDEsCisgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZygoZ3JwY19tZHN0ciAqKW1kLT5rZXkpLAorICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcoKGdycGNfbWRzdHIgKiltZC0+dmFsdWUpKTsKKyNlbmRpZgorICAvKiB3ZSBjYW4gYXNzdW1lIHRoZSByZWYgY291bnQgaXMgPj0gMSBhcyB0aGUgYXBwbGljYXRpb24gaXMgY2FsbGluZworICAgICB0aGlzIGZ1bmN0aW9uIC0gbWVhbmluZyB0aGF0IG5vIGFkanVzdG1lbnQgdG8gbWR0YWJfZnJlZSBpcyBuZWNlc3NhcnksCisgICAgIHNpbXBsaWZ5aW5nIHRoZSBsb2dpYyBoZXJlIHRvIGJlIGp1c3QgYW4gYXRvbWljIGluY3JlbWVudCAqLworICAvKiB1c2UgQyBhc3NlcnQgdG8gaGF2ZSB0aGlzIHJlbW92ZWQgaW4gb3B0IGJ1aWxkcyAqLworICBhc3NlcnQoZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpID49IDIpOworICBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZtZC0+cmVmY250LCAxKTsKKyAgcmV0dXJuIGdtZDsKK30KKwordm9pZCBncnBjX21kZWxlbV91bnJlZihncnBjX21kZWxlbSAqZ21kIERFQlVHX0FSR1MpIHsKKyAgaW50ZXJuYWxfbWV0YWRhdGEgKm1kID0gKGludGVybmFsX21ldGFkYXRhICopZ21kOworICBpZiAoIW1kKSByZXR1cm47CisgIGlmIChpc19tZGVsZW1fc3RhdGljKGdtZCkpIHJldHVybjsKKyNpZmRlZiBHUlBDX01FVEFEQVRBX1JFRkNPVU5UX0RFQlVHCisgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKKyAgICAgICAgICAiRUxNIFVOUkVGOiVwOiVkLT4lZDogJyVzJyA9ICclcyciLCBtZCwKKyAgICAgICAgICBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmbWQtPnJlZmNudCksCisgICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpIC0gMSwKKyAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKChncnBjX21kc3RyICopbWQtPmtleSksCisgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZygoZ3JwY19tZHN0ciAqKW1kLT52YWx1ZSkpOworI2VuZGlmCisgIGlmICgyID09IGdwcl9hdG1fZnVsbF9mZXRjaF9hZGQoJm1kLT5yZWZjbnQsIC0xKSkgeworICAgIHVpbnQzMl90IGhhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0gobWQtPmtleS0+aGFzaCwgbWQtPnZhbHVlLT5oYXNoKTsKKyAgICBtZHRhYl9zaGFyZCAqc2hhcmQgPQorICAgICAgICAmZ19tZHRhYl9zaGFyZFtTSEFSRF9JRFgoaGFzaCwgTE9HMl9NRFRBQl9TSEFSRF9DT1VOVCldOworICAgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19tZGVsZW1fdW5yZWYudG9femVybyIsIDApOworICAgIGdwcl9tdV9sb2NrKCZzaGFyZC0+bXUpOworICAgIGlmICgxID09IGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+cmVmY250KSkgeworICAgICAgc2hhcmQtPmZyZWUrKzsKKyAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9zdG9yZSgmbWQtPnJlZmNudCwgMCk7CisgICAgfQorICAgIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7CisgICAgR1BSX1RJTUVSX0VORCgiZ3JwY19tZGVsZW1fdW5yZWYudG9femVybyIsIDApOworICB9Cit9CisKK2NvbnN0IGNoYXIgKmdycGNfbWRzdHJfYXNfY19zdHJpbmcoZ3JwY19tZHN0ciAqcykgeworICByZXR1cm4gKGNvbnN0IGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKHMtPnNsaWNlKTsKK30KKworZ3JwY19tZHN0ciAqZ3JwY19tZHN0cl9yZWYoZ3JwY19tZHN0ciAqZ3MgREVCVUdfQVJHUykgeworICBpbnRlcm5hbF9zdHJpbmcgKnMgPSAoaW50ZXJuYWxfc3RyaW5nICopZ3M7CisgIGlmIChpc19tZHN0cl9zdGF0aWMoZ3MpKSByZXR1cm4gZ3M7CisgIEdQUl9BU1NFUlQoZ3ByX2F0bV9mdWxsX2ZldGNoX2FkZCgmcy0+cmVmY250LCAxKSAhPSAwKTsKKyAgcmV0dXJuIGdzOworfQorCit2b2lkIGdycGNfbWRzdHJfdW5yZWYoZ3JwY19tZHN0ciAqZ3MgREVCVUdfQVJHUykgeworICBpbnRlcm5hbF9zdHJpbmcgKnMgPSAoaW50ZXJuYWxfc3RyaW5nICopZ3M7CisgIGlmIChpc19tZHN0cl9zdGF0aWMoZ3MpKSByZXR1cm47CisgIGlmICgyID09IGdwcl9hdG1fZnVsbF9mZXRjaF9hZGQoJnMtPnJlZmNudCwgLTEpKSB7CisgICAgc3RydGFiX3NoYXJkICpzaGFyZCA9CisgICAgICAgICZnX3N0cnRhYl9zaGFyZFtTSEFSRF9JRFgocy0+aGFzaCwgTE9HMl9TVFJUQUJfU0hBUkRfQ09VTlQpXTsKKyAgICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKKyAgICBpZiAoMSA9PSBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmcy0+cmVmY250KSkgeworICAgICAgaW50ZXJuYWxfZGVzdHJveV9zdHJpbmcoc2hhcmQsIHMpOworICAgIH0KKyAgICBncHJfbXVfdW5sb2NrKCZzaGFyZC0+bXUpOworICB9Cit9CisKK3ZvaWQgKmdycGNfbWRlbGVtX2dldF91c2VyX2RhdGEoZ3JwY19tZGVsZW0gKm1kLCB2b2lkICgqZGVzdHJveV9mdW5jKSh2b2lkICopKSB7CisgIGludGVybmFsX21ldGFkYXRhICppbSA9IChpbnRlcm5hbF9tZXRhZGF0YSAqKW1kOworICB2b2lkICpyZXN1bHQ7CisgIGlmIChpc19tZGVsZW1fc3RhdGljKG1kKSkgeworICAgIHJldHVybiAodm9pZCAqKWdycGNfc3RhdGljX21kZWxlbV91c2VyX2RhdGFbbWQgLSBncnBjX3N0YXRpY19tZGVsZW1fdGFibGVdOworICB9CisgIGlmIChncHJfYXRtX2FjcV9sb2FkKCZpbS0+ZGVzdHJveV91c2VyX2RhdGEpID09IChncHJfYXRtKWRlc3Ryb3lfZnVuYykgeworICAgIHJldHVybiAodm9pZCAqKWdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZpbS0+dXNlcl9kYXRhKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGdycGNfbWRlbGVtX3NldF91c2VyX2RhdGEoZ3JwY19tZGVsZW0gKm1kLCB2b2lkICgqZGVzdHJveV9mdW5jKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBpbnRlcm5hbF9tZXRhZGF0YSAqaW0gPSAoaW50ZXJuYWxfbWV0YWRhdGEgKiltZDsKKyAgR1BSX0FTU0VSVCghaXNfbWRlbGVtX3N0YXRpYyhtZCkpOworICBHUFJfQVNTRVJUKCh1c2VyX2RhdGEgPT0gTlVMTCkgPT0gKGRlc3Ryb3lfZnVuYyA9PSBOVUxMKSk7CisgIGdwcl9tdV9sb2NrKCZpbS0+bXVfdXNlcl9kYXRhKTsKKyAgaWYgKGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZpbS0+ZGVzdHJveV91c2VyX2RhdGEpKSB7CisgICAgLyogdXNlciBkYXRhIGNhbiBvbmx5IGJlIHNldCBvbmNlICovCisgICAgZ3ByX211X3VubG9jaygmaW0tPm11X3VzZXJfZGF0YSk7CisgICAgaWYgKGRlc3Ryb3lfZnVuYyAhPSBOVUxMKSB7CisgICAgICBkZXN0cm95X2Z1bmModXNlcl9kYXRhKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGdwcl9hdG1fbm9fYmFycmllcl9zdG9yZSgmaW0tPnVzZXJfZGF0YSwgKGdwcl9hdG0pdXNlcl9kYXRhKTsKKyAgZ3ByX2F0bV9yZWxfc3RvcmUoJmltLT5kZXN0cm95X3VzZXJfZGF0YSwgKGdwcl9hdG0pZGVzdHJveV9mdW5jKTsKKyAgZ3ByX211X3VubG9jaygmaW0tPm11X3VzZXJfZGF0YSk7Cit9CisKK2dwcl9zbGljZSBncnBjX21kc3RyX2FzX2Jhc2U2NF9lbmNvZGVkX2FuZF9odWZmbWFuX2NvbXByZXNzZWQoZ3JwY19tZHN0ciAqZ3MpIHsKKyAgaW50ZXJuYWxfc3RyaW5nICpzID0gKGludGVybmFsX3N0cmluZyAqKWdzOworICBncHJfc2xpY2Ugc2xpY2U7CisgIHN0cnRhYl9zaGFyZCAqc2hhcmQgPQorICAgICAgJmdfc3RydGFiX3NoYXJkW1NIQVJEX0lEWChzLT5oYXNoLCBMT0cyX1NUUlRBQl9TSEFSRF9DT1VOVCldOworICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKKyAgaWYgKCFzLT5oYXNfYmFzZTY0X2FuZF9odWZmbWFuX2VuY29kZWQpIHsKKyAgICBzLT5iYXNlNjRfYW5kX2h1ZmZtYW4gPQorICAgICAgICBncnBjX2NodHRwMl9iYXNlNjRfZW5jb2RlX2FuZF9odWZmbWFuX2NvbXByZXNzKHMtPnNsaWNlKTsKKyAgICBzLT5oYXNfYmFzZTY0X2FuZF9odWZmbWFuX2VuY29kZWQgPSAxOworICB9CisgIHNsaWNlID0gcy0+YmFzZTY0X2FuZF9odWZmbWFuOworICBncHJfbXVfdW5sb2NrKCZzaGFyZC0+bXUpOworICByZXR1cm4gc2xpY2U7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmggYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyZWM5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9NRVRBREFUQV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX01FVEFEQVRBX0gKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KKworLyogVGhpcyBmaWxlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB0cmFja2luZyBtZXRhZGF0YSB0aHJvdWdoIHRoZSBncnBjIHN0YWNrLgorICAgSXQncyBub3QgaW50ZW5kZWQgZm9yIGNvbnN1bXB0aW9uIG91dHNpZGUgb2YgdGhlIGxpYnJhcnkuCisKKyAgIE1ldGFkYXRhIGlzIHRyYWNrZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBncnBjX21kY3R4LiBGb3IgdGhlIHRpbWUgYmVpbmcgdGhlcmUKKyAgIGlzIG9uZSBvZiB0aGVzZSBwZXItY2hhbm5lbCwgYXZvaWRpbmcgY3Jvc3MgY2hhbm5lbCBpbnRlcmZlcmVuY2Ugd2l0aCBtZW1vcnkKKyAgIHVzZSBhbmQgbG9jayBjb250ZW50aW9uLgorCisgICBUaGUgY29udGV4dCB0cmFja3MgdW5pcXVlIHN0cmluZ3MgKGdycGNfbWRzdHIpIGFuZCBwYWlycyBvZiBzdHJpbmdzCisgICAoZ3JwY19tZGVsZW0pLiBBbnkgb2YgdGhlc2Ugb2JqZWN0cyBjYW4gYmUgY2hlY2tlZCBmb3IgZXF1YWxpdHkgYnkgY29tcGFyaW5nCisgICB0aGVpciBwb2ludGVycy4gVGhlc2Ugb2JqZWN0cyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQuCisKKyAgIGdycGNfbWRlbGVtIGNhbiBhZGRpdGlvbmFsbHkgc3RvcmUgYSAobm9uLU5VTEwpIHVzZXIgZGF0YSBwb2ludGVyLiBUaGlzCisgICBwb2ludGVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FjaGUgc2VtYW50aWMgbWVhbmluZyBvZiBhIG1ldGFkYXRhCisgICBlbGVtZW50LiBGb3IgZXhhbXBsZSwgYW4gT0F1dGggdG9rZW4gbWF5IGNhY2hlIHRoZSBjcmVkZW50aWFscyBpdCByZXByZXNlbnRzCisgICBhbmQgdGhlIHRpbWUgYXQgd2hpY2ggaXQgZXhwaXJlcyBpbiB0aGUgbWRlbGVtIHVzZXIgZGF0YS4KKworICAgQ29tYmluaW5nIHRoaXMgbWV0YWRhdGEgY2FjaGUgYW5kIHRoZSBocGFjayBjb21wcmVzc2lvbiB0YWJsZSBhbGxvd3MgdXMgdG8KKyAgIHNpbXBseSBsb29rdXAgY29tcGxldGUgcHJlcGFyc2VkIG9iamVjdHMgcXVpY2tseSwgaW5jdXJyaW5nIGEgZmV3IGF0b21pYworICAgb3BzIHBlciBtZXRhZGF0YSBlbGVtZW50IG9uIHRoZSBmYXN0IHBhdGguCisKKyAgIGdycGNfbWRlbGVtIGluc3RhbmNlcyBNQVkgbGl2ZSBsb25nZXIgdGhhbiB0aGVpciByZWZjb3VudCBpbXBsaWVzLCBhbmQgYXJlCisgICBnYXJiYWdlIGNvbGxlY3RlZCBwZXJpb2RpY2FsbHksIG1lYW5pbmcgY2FjaGVkIGRhdGEgY2FuIGVhc2lseSBvdXRsaXZlIGEKKyAgIHNpbmdsZSByZXF1ZXN0LgorCisgICBTVEFUSUMgTUVUQURBVEE6IGluIHN0YXRpY19tZXRhZGF0YS5oIHdlIGRlY2xhcmUgYSBzZXQgb2Ygc3RhdGljIG1ldGFkYXRhLgorICAgVGhlc2UgbWRlbGVtcyBhbmQgbWRzdHJzIGFyZSBhdmFpbGFibGUgdmlhIHByZS1kZWNsYXJlZCBjb2RlIGdlbmVyYXRlZCBtYWNyb3MKKyAgIGFuZCBhcmUgYXZhaWxhYmxlIHRvIGNvZGUgYW55d2hlcmUgYmV0d2VlbiBncnBjX2luaXQoKSBhbmQgZ3JwY19zaHV0ZG93bigpLgorICAgVGhleSBhcmUgbm90IHJlZmNvdW50ZWQsIGJ1dCBjYW4gYmUgcGFzc2VkIHRvIF9yZWYgYW5kIF91bnJlZiBmdW5jdGlvbnMKKyAgIGRlY2xhcmVkIGhlcmUgLSBpbiB3aGljaCBjYXNlIHRob3NlIGZ1bmN0aW9ucyBhcmUgZWZmZWN0aXZlbHkgbm8tb3BzLiAqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19tZHN0ciBncnBjX21kc3RyOwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19tZGVsZW0gZ3JwY19tZGVsZW07CisKKy8qIGlmIGNoYW5naW5nIHRoaXMsIG1ha2UgaWRlbnRpY2FsIGNoYW5nZXMgaW4gaW50ZXJuYWxfc3RyaW5nIGluIG1ldGFkYXRhLmMgKi8KK3N0cnVjdCBncnBjX21kc3RyIHsKKyAgY29uc3QgZ3ByX3NsaWNlIHNsaWNlOworICBjb25zdCB1aW50MzJfdCBoYXNoOworICAvKiB0aGVyZSBpcyBhIHByaXZhdGUgcGFydCB0byB0aGlzIGluIG1ldGFkYXRhLmMgKi8KK307CisKKy8qIGlmIGNoYW5naW5nIHRoaXMsIG1ha2UgaWRlbnRpY2FsIGNoYW5nZXMgaW4gaW50ZXJuYWxfbWV0YWRhdGEgaW4KKyAgIG1ldGFkYXRhLmMgKi8KK3N0cnVjdCBncnBjX21kZWxlbSB7CisgIGdycGNfbWRzdHIgKmNvbnN0IGtleTsKKyAgZ3JwY19tZHN0ciAqY29uc3QgdmFsdWU7CisgIC8qIHRoZXJlIGlzIGEgcHJpdmF0ZSBwYXJ0IHRvIHRoaXMgaW4gbWV0YWRhdGEuYyAqLworfTsKKwordm9pZCBncnBjX3Rlc3Rfb25seV9zZXRfbWV0YWRhdGFfaGFzaF9zZWVkKHVpbnQzMl90IHNlZWQpOworCisvKiBDb25zdHJ1Y3RvcnMgZm9yIGdycGNfbWRzdHIgaW5zdGFuY2VzOyB0YWtlIGEgdmFyaWV0eSBvZiBkYXRhIHR5cGVzIHRoYXQKKyAgIGNsaWVudHMgbWF5IGhhdmUgaGFuZHkgKi8KK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKTsKKy8qIFVucmVmcyB0aGUgc2xpY2UuICovCitncnBjX21kc3RyICpncnBjX21kc3RyX2Zyb21fc2xpY2UoZ3ByX3NsaWNlIHNsaWNlKTsKK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9idWZmZXIoY29uc3QgdWludDhfdCAqc3RyLCBzaXplX3QgbGVuZ3RoKTsKKworLyogUmV0dXJucyBhIGJvcnJvd2VkIHNsaWNlIGZyb20gdGhlIG1kc3RyIHdpdGggaXRzIGNvbnRlbnRzIGJhc2U2NCBlbmNvZGVkCisgICBhbmQgaHVmZm1hbiBjb21wcmVzc2VkICovCitncHJfc2xpY2UgZ3JwY19tZHN0cl9hc19iYXNlNjRfZW5jb2RlZF9hbmRfaHVmZm1hbl9jb21wcmVzc2VkKGdycGNfbWRzdHIgKnN0cik7CisKKy8qIENvbnN0cnVjdG9ycyBmb3IgZ3JwY19tZGVsZW0gaW5zdGFuY2VzOyB0YWtlIGEgdmFyaWV0eSBvZiBkYXRhIHR5cGVzIHRoYXQKKyAgIGNsaWVudHMgbWF5IGhhdmUgaGFuZHkgKi8KK2dycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoZ3JwY19tZHN0ciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyICp2YWx1ZSk7CitncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpOworLyogVW5yZWZzIHRoZSBzbGljZXMuICovCitncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fZnJvbV9zbGljZXMoZ3ByX3NsaWNlIGtleSwgZ3ByX3NsaWNlIHZhbHVlKTsKK2dycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3N0cmluZ19hbmRfYnVmZmVyKGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhbHVlX2xlbmd0aCk7CisKKy8qIE11dGF0b3IgYW5kIGFjY2Vzc29yIGZvciBncnBjX21kZWxlbSB1c2VyIGRhdGEuIFRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uCisgICBpcyB1c2VkIGFzIGEgdHlwZSB0YWcgYW5kIGlzIGNoZWNrZWQgZHVyaW5nIHVzZXJfZGF0YSBmZXRjaC4gKi8KK3ZvaWQgKmdycGNfbWRlbGVtX2dldF91c2VyX2RhdGEoZ3JwY19tZGVsZW0gKm1kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqaWZfZGVzdHJveV9mdW5jKSh2b2lkICopKTsKK3ZvaWQgZ3JwY19tZGVsZW1fc2V0X3VzZXJfZGF0YShncnBjX21kZWxlbSAqbWQsIHZvaWQgKCpkZXN0cm95X2Z1bmMpKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyogUmVmZXJlbmNlIGNvdW50aW5nICovCisjaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRworI2RlZmluZSBHUlBDX01EU1RSX1JFRihzKSBncnBjX21kc3RyX3JlZigocyksIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgR1JQQ19NRFNUUl9VTlJFRihzKSBncnBjX21kc3RyX3VucmVmKChzKSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBHUlBDX01ERUxFTV9SRUYocykgZ3JwY19tZGVsZW1fcmVmKChzKSwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBHUlBDX01ERUxFTV9VTlJFRihzKSBncnBjX21kZWxlbV91bnJlZigocyksIF9fRklMRV9fLCBfX0xJTkVfXykKK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfcmVmKGdycGNfbWRzdHIgKnMsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK3ZvaWQgZ3JwY19tZHN0cl91bnJlZihncnBjX21kc3RyICpzLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CitncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fcmVmKGdycGNfbWRlbGVtICptZCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwordm9pZCBncnBjX21kZWxlbV91bnJlZihncnBjX21kZWxlbSAqbWQsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKyNlbHNlCisjZGVmaW5lIEdSUENfTURTVFJfUkVGKHMpIGdycGNfbWRzdHJfcmVmKChzKSkKKyNkZWZpbmUgR1JQQ19NRFNUUl9VTlJFRihzKSBncnBjX21kc3RyX3VucmVmKChzKSkKKyNkZWZpbmUgR1JQQ19NREVMRU1fUkVGKHMpIGdycGNfbWRlbGVtX3JlZigocykpCisjZGVmaW5lIEdSUENfTURFTEVNX1VOUkVGKHMpIGdycGNfbWRlbGVtX3VucmVmKChzKSkKK2dycGNfbWRzdHIgKmdycGNfbWRzdHJfcmVmKGdycGNfbWRzdHIgKnMpOwordm9pZCBncnBjX21kc3RyX3VucmVmKGdycGNfbWRzdHIgKnMpOworZ3JwY19tZGVsZW0gKmdycGNfbWRlbGVtX3JlZihncnBjX21kZWxlbSAqbWQpOwordm9pZCBncnBjX21kZWxlbV91bnJlZihncnBjX21kZWxlbSAqbWQpOworI2VuZGlmCisKKy8qIFJlY292ZXIgYSBjaGFyKiBmcm9tIGEgZ3JwY19tZHN0ci4gVGhlIHJldHVybmVkIHN0cmluZyBpcyBudWxsIHRlcm1pbmF0ZWQuCisgICBEb2VzIG5vdCBwcm9taXNlIHRoYXQgdGhlIHJldHVybmVkIHN0cmluZyBoYXMgbm8gZW1iZWRkZWQgbnVsbHMgaG93ZXZlci4gKi8KK2NvbnN0IGNoYXIgKmdycGNfbWRzdHJfYXNfY19zdHJpbmcoZ3JwY19tZHN0ciAqcyk7CisKKyNkZWZpbmUgR1JQQ19NRFNUUl9MRU5HVEgocykgKEdQUl9TTElDRV9MRU5HVEgocy0+c2xpY2UpKQorCitpbnQgZ3JwY19tZHN0cl9pc19sZWdhbF9oZWFkZXIoZ3JwY19tZHN0ciAqcyk7CitpbnQgZ3JwY19tZHN0cl9pc19sZWdhbF9ub25iaW5faGVhZGVyKGdycGNfbWRzdHIgKnMpOworaW50IGdycGNfbWRzdHJfaXNfYmluX3N1ZmZpeGVkKGdycGNfbWRzdHIgKnMpOworCisjZGVmaW5lIEdSUENfTURTVFJfS1ZfSEFTSChrX2hhc2gsIHZfaGFzaCkgKEdQUl9ST1RMKChrX2hhc2gpLCAyKSBeICh2X2hhc2gpKQorCit2b2lkIGdycGNfbWRjdHhfZ2xvYmFsX2luaXQodm9pZCk7Cit2b2lkIGdycGNfbWRjdHhfZ2xvYmFsX3NodXRkb3duKHZvaWQpOworCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9UUkFOU1BPUlRfTUVUQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIGIvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzliOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCisKK3N0YXRpYyB2b2lkIGFzc2VydF92YWxpZF9saXN0KGdycGNfbWRlbGVtX2xpc3QgKmxpc3QpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGdycGNfbGlua2VkX21kZWxlbSAqbDsKKworICBHUFJfQVNTRVJUKChsaXN0LT5oZWFkID09IE5VTEwpID09IChsaXN0LT50YWlsID09IE5VTEwpKTsKKyAgaWYgKCFsaXN0LT5oZWFkKSByZXR1cm47CisgIEdQUl9BU1NFUlQobGlzdC0+aGVhZC0+cHJldiA9PSBOVUxMKTsKKyAgR1BSX0FTU0VSVChsaXN0LT50YWlsLT5uZXh0ID09IE5VTEwpOworICBHUFJfQVNTRVJUKChsaXN0LT5oZWFkID09IGxpc3QtPnRhaWwpID09IChsaXN0LT5oZWFkLT5uZXh0ID09IE5VTEwpKTsKKworICBmb3IgKGwgPSBsaXN0LT5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdQUl9BU1NFUlQobC0+bWQpOworICAgIEdQUl9BU1NFUlQoKGwtPnByZXYgPT0gTlVMTCkgPT0gKGwgPT0gbGlzdC0+aGVhZCkpOworICAgIEdQUl9BU1NFUlQoKGwtPm5leHQgPT0gTlVMTCkgPT0gKGwgPT0gbGlzdC0+dGFpbCkpOworICAgIGlmIChsLT5uZXh0KSBHUFJfQVNTRVJUKGwtPm5leHQtPnByZXYgPT0gbCk7CisgICAgaWYgKGwtPnByZXYpIEdQUl9BU1NFUlQobC0+cHJldi0+bmV4dCA9PSBsKTsKKyAgfQorI2VuZGlmIC8qIE5ERUJVRyAqLworfQorCisjaWZuZGVmIE5ERUJVRwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2Fzc2VydF9vayhncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCkgeworICBhc3NlcnRfdmFsaWRfbGlzdCgmYmF0Y2gtPmxpc3QpOworfQorI2VuZGlmIC8qIE5ERUJVRyAqLworCit2b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfaW5pdChncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCkgeworICBiYXRjaC0+bGlzdC5oZWFkID0gYmF0Y2gtPmxpc3QudGFpbCA9IE5VTEw7CisgIGJhdGNoLT5kZWFkbGluZSA9IGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19SRUFMVElNRSk7Cit9CisKK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9kZXN0cm95KGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKSB7CisgIGdycGNfbGlua2VkX21kZWxlbSAqbDsKKyAgZm9yIChsID0gYmF0Y2gtPmxpc3QuaGVhZDsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHUlBDX01ERUxFTV9VTlJFRihsLT5tZCk7CisgIH0KK30KKwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF9oZWFkKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqZWxlbV90b19hZGQpIHsKKyAgR1BSX0FTU0VSVChlbGVtX3RvX2FkZCk7CisgIHN0b3JhZ2UtPm1kID0gZWxlbV90b19hZGQ7CisgIGdycGNfbWV0YWRhdGFfYmF0Y2hfbGlua19oZWFkKGJhdGNoLCBzdG9yYWdlKTsKK30KKworc3RhdGljIHZvaWQgbGlua19oZWFkKGdycGNfbWRlbGVtX2xpc3QgKmxpc3QsIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSkgeworICBhc3NlcnRfdmFsaWRfbGlzdChsaXN0KTsKKyAgR1BSX0FTU0VSVChzdG9yYWdlLT5tZCk7CisgIHN0b3JhZ2UtPnByZXYgPSBOVUxMOworICBzdG9yYWdlLT5uZXh0ID0gbGlzdC0+aGVhZDsKKyAgaWYgKGxpc3QtPmhlYWQgIT0gTlVMTCkgeworICAgIGxpc3QtPmhlYWQtPnByZXYgPSBzdG9yYWdlOworICB9IGVsc2UgeworICAgIGxpc3QtPnRhaWwgPSBzdG9yYWdlOworICB9CisgIGxpc3QtPmhlYWQgPSBzdG9yYWdlOworICBhc3NlcnRfdmFsaWRfbGlzdChsaXN0KTsKK30KKwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2xpbmtfaGVhZChncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19saW5rZWRfbWRlbGVtICpzdG9yYWdlKSB7CisgIGxpbmtfaGVhZCgmYmF0Y2gtPmxpc3QsIHN0b3JhZ2UpOworfQorCit2b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19saW5rZWRfbWRlbGVtICpzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRlbGVtICplbGVtX3RvX2FkZCkgeworICBHUFJfQVNTRVJUKGVsZW1fdG9fYWRkKTsKKyAgc3RvcmFnZS0+bWQgPSBlbGVtX3RvX2FkZDsKKyAgZ3JwY19tZXRhZGF0YV9iYXRjaF9saW5rX3RhaWwoYmF0Y2gsIHN0b3JhZ2UpOworfQorCitzdGF0aWMgdm9pZCBsaW5rX3RhaWwoZ3JwY19tZGVsZW1fbGlzdCAqbGlzdCwgZ3JwY19saW5rZWRfbWRlbGVtICpzdG9yYWdlKSB7CisgIGFzc2VydF92YWxpZF9saXN0KGxpc3QpOworICBHUFJfQVNTRVJUKHN0b3JhZ2UtPm1kKTsKKyAgc3RvcmFnZS0+cHJldiA9IGxpc3QtPnRhaWw7CisgIHN0b3JhZ2UtPm5leHQgPSBOVUxMOworICBzdG9yYWdlLT5yZXNlcnZlZCA9IE5VTEw7CisgIGlmIChsaXN0LT50YWlsICE9IE5VTEwpIHsKKyAgICBsaXN0LT50YWlsLT5uZXh0ID0gc3RvcmFnZTsKKyAgfSBlbHNlIHsKKyAgICBsaXN0LT5oZWFkID0gc3RvcmFnZTsKKyAgfQorICBsaXN0LT50YWlsID0gc3RvcmFnZTsKKyAgYXNzZXJ0X3ZhbGlkX2xpc3QobGlzdCk7Cit9CisKK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9saW5rX3RhaWwoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSkgeworICBsaW5rX3RhaWwoJmJhdGNoLT5saXN0LCBzdG9yYWdlKTsKK30KKwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX21vdmUoZ3JwY19tZXRhZGF0YV9iYXRjaCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqc3JjKSB7CisgICpkc3QgPSAqc3JjOworICBtZW1zZXQoc3JjLCAwLCBzaXplb2YoZ3JwY19tZXRhZGF0YV9iYXRjaCkpOworfQorCit2b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqKCpmaWx0ZXIpKHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqZWxlbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgeworICBncnBjX2xpbmtlZF9tZGVsZW0gKmw7CisgIGdycGNfbGlua2VkX21kZWxlbSAqbmV4dDsKKworICBHUFJfVElNRVJfQkVHSU4oImdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyIiwgMCk7CisKKyAgYXNzZXJ0X3ZhbGlkX2xpc3QoJmJhdGNoLT5saXN0KTsKKyAgZm9yIChsID0gYmF0Y2gtPmxpc3QuaGVhZDsgbDsgbCA9IG5leHQpIHsKKyAgICBncnBjX21kZWxlbSAqb3JpZyA9IGwtPm1kOworICAgIGdycGNfbWRlbGVtICpmaWx0ID0gZmlsdGVyKHVzZXJfZGF0YSwgb3JpZyk7CisgICAgbmV4dCA9IGwtPm5leHQ7CisgICAgaWYgKGZpbHQgPT0gTlVMTCkgeworICAgICAgaWYgKGwtPnByZXYpIHsKKyAgICAgICAgbC0+cHJldi0+bmV4dCA9IGwtPm5leHQ7CisgICAgICB9CisgICAgICBpZiAobC0+bmV4dCkgeworICAgICAgICBsLT5uZXh0LT5wcmV2ID0gbC0+cHJldjsKKyAgICAgIH0KKyAgICAgIGlmIChiYXRjaC0+bGlzdC5oZWFkID09IGwpIHsKKyAgICAgICAgYmF0Y2gtPmxpc3QuaGVhZCA9IGwtPm5leHQ7CisgICAgICB9CisgICAgICBpZiAoYmF0Y2gtPmxpc3QudGFpbCA9PSBsKSB7CisgICAgICAgIGJhdGNoLT5saXN0LnRhaWwgPSBsLT5wcmV2OworICAgICAgfQorICAgICAgYXNzZXJ0X3ZhbGlkX2xpc3QoJmJhdGNoLT5saXN0KTsKKyAgICAgIEdSUENfTURFTEVNX1VOUkVGKGwtPm1kKTsKKyAgICB9IGVsc2UgaWYgKGZpbHQgIT0gb3JpZykgeworICAgICAgR1JQQ19NREVMRU1fVU5SRUYob3JpZyk7CisgICAgICBsLT5tZCA9IGZpbHQ7CisgICAgfQorICB9CisgIGFzc2VydF92YWxpZF9saXN0KCZiYXRjaC0+bGlzdCk7CisKKyAgR1BSX1RJTUVSX0VORCgiZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIiLCAwKTsKK30KKworc3RhdGljIGdycGNfbWRlbGVtICpub19tZXRhZGF0YV9mb3JfeW91KHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKmVsZW0pIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9jbGVhcihncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCkgeworICBiYXRjaC0+ZGVhZGxpbmUgPSBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfUkVBTFRJTUUpOworICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihiYXRjaCwgbm9fbWV0YWRhdGFfZm9yX3lvdSwgTlVMTCk7Cit9CisKK2ludCBncnBjX21ldGFkYXRhX2JhdGNoX2lzX2VtcHR5KGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKSB7CisgIHJldHVybiBiYXRjaC0+bGlzdC5oZWFkID09IE5VTEwgJiYKKyAgICAgICAgIGdwcl90aW1lX2NtcChncHJfaW5mX2Z1dHVyZShiYXRjaC0+ZGVhZGxpbmUuY2xvY2tfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgYmF0Y2gtPmRlYWRsaW5lKSA9PSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIGIvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDQ3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9UUkFOU1BPUlRfTUVUQURBVEFfQkFUQ0hfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9NRVRBREFUQV9CQVRDSF9ICisKKyNpbmNsdWRlIDxncnBjL2dycGMuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgorCit0eXBlZGVmIHN0cnVjdCBncnBjX2xpbmtlZF9tZGVsZW0geworICBncnBjX21kZWxlbSAqbWQ7CisgIHN0cnVjdCBncnBjX2xpbmtlZF9tZGVsZW0gKm5leHQ7CisgIHN0cnVjdCBncnBjX2xpbmtlZF9tZGVsZW0gKnByZXY7CisgIHZvaWQgKnJlc2VydmVkOworfSBncnBjX2xpbmtlZF9tZGVsZW07CisKK3R5cGVkZWYgc3RydWN0IGdycGNfbWRlbGVtX2xpc3QgeworICBncnBjX2xpbmtlZF9tZGVsZW0gKmhlYWQ7CisgIGdycGNfbGlua2VkX21kZWxlbSAqdGFpbDsKK30gZ3JwY19tZGVsZW1fbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY19tZXRhZGF0YV9iYXRjaCB7CisgIC8qKiBNZXRhZGF0YSBlbGVtZW50cyBpbiB0aGlzIGJhdGNoICovCisgIGdycGNfbWRlbGVtX2xpc3QgbGlzdDsKKyAgLyoqIFVzZWQgdG8gY2FsY3VsYXRlIGdycGMtdGltZW91dCBhdCB0aGUgcG9pbnQgb2Ygc2VuZGluZywKKyAgICAgIG9yIGdwcl9pbmZfZnV0dXJlIGlmIHRoaXMgYmF0Y2ggZG9lcyBub3QgbmVlZCB0byBzZW5kIGEKKyAgICAgIGdycGMtdGltZW91dCAqLworICBncHJfdGltZXNwZWMgZGVhZGxpbmU7Cit9IGdycGNfbWV0YWRhdGFfYmF0Y2g7CisKK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9pbml0KGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKTsKK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9kZXN0cm95KGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKTsKK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9jbGVhcihncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCk7CitpbnQgZ3JwY19tZXRhZGF0YV9iYXRjaF9pc19lbXB0eShncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCk7CisKKy8qKiBNb3ZlcyB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24gZnJvbSBcYSBzcmMgdG8gXGEgZHN0LiBVcG9uIHJldHVybiwgXGEgc3JjIGlzCisgKiB6ZXJvZWQuICovCit2b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfbW92ZShncnBjX21ldGFkYXRhX2JhdGNoICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21ldGFkYXRhX2JhdGNoICpzcmMpOworCisvKiogQWRkIFxhIHN0b3JhZ2UgdG8gdGhlIGJlZ2lubmluZyBvZiBcYSBiYXRjaC4gc3RvcmFnZS0+bWQgaXMKKyAgICBhc3N1bWVkIHRvIGJlIHZhbGlkLgorICAgIFxhIHN0b3JhZ2UgaXMgb3duZWQgYnkgdGhlIGNhbGxlciBhbmQgbXVzdCBzdXJ2aXZlIGZvciB0aGUKKyAgICBsaWZldGltZSBvZiBiYXRjaC4gVGhpcyB1c3VhbGx5IG1lYW5zIGl0IHNob3VsZCBiZSBhcm91bmQKKyAgICBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjYWxsLiAqLwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2xpbmtfaGVhZChncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19saW5rZWRfbWRlbGVtICpzdG9yYWdlKTsKKy8qKiBBZGQgXGEgc3RvcmFnZSB0byB0aGUgZW5kIG9mIFxhIGJhdGNoLiBzdG9yYWdlLT5tZCBpcworICAgIGFzc3VtZWQgdG8gYmUgdmFsaWQuCisgICAgXGEgc3RvcmFnZSBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IHN1cnZpdmUgZm9yIHRoZQorICAgIGxpZmV0aW1lIG9mIGJhdGNoLiBUaGlzIHVzdWFsbHkgbWVhbnMgaXQgc2hvdWxkIGJlIGFyb3VuZAorICAgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNhbGwuICovCit2b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfbGlua190YWlsKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UpOworCisvKiogQWRkIFxhIGVsZW1fdG9fYWRkIGFzIHRoZSBmaXJzdCBlbGVtZW50IGluIFxhIGJhdGNoLCB1c2luZworICAgIFxhIHN0b3JhZ2UgYXMgYmFja2luZyBzdG9yYWdlIGZvciB0aGUgbGlua2VkIGxpc3QgZWxlbWVudC4KKyAgICBcYSBzdG9yYWdlIGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIG11c3Qgc3Vydml2ZSBmb3IgdGhlCisgICAgbGlmZXRpbWUgb2YgYmF0Y2guIFRoaXMgdXN1YWxseSBtZWFucyBpdCBzaG91bGQgYmUgYXJvdW5kCisgICAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY2FsbC4KKyAgICBUYWtlcyBvd25lcnNoaXAgb2YgXGEgZWxlbV90b19hZGQgKi8KK3ZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfaGVhZChncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW1fdG9fYWRkKTsKKy8qKiBBZGQgXGEgZWxlbV90b19hZGQgYXMgdGhlIGxhc3QgZWxlbWVudCBpbiBcYSBiYXRjaCwgdXNpbmcKKyAgICBcYSBzdG9yYWdlIGFzIGJhY2tpbmcgc3RvcmFnZSBmb3IgdGhlIGxpbmtlZCBsaXN0IGVsZW1lbnQuCisgICAgXGEgc3RvcmFnZSBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IHN1cnZpdmUgZm9yIHRoZQorICAgIGxpZmV0aW1lIG9mIGJhdGNoLiBUaGlzIHVzdWFsbHkgbWVhbnMgaXQgc2hvdWxkIGJlIGFyb3VuZAorICAgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNhbGwuCisgICAgVGFrZXMgb3duZXJzaGlwIG9mIFxhIGVsZW1fdG9fYWRkICovCit2b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfYWRkX3RhaWwoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19saW5rZWRfbWRlbGVtICpzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRlbGVtICplbGVtX3RvX2FkZCk7CisKKy8qKiBGb3IgZWFjaCBlbGVtZW50IGluIFxhIGJhdGNoLCBleGVjdXRlIFxhIGZpbHRlci4KKyAgICBUaGUgcmV0dXJuIHZhbHVlIGZyb20gXGEgZmlsdGVyIHdpbGwgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoZQorICAgIGdycGNfbWRlbGVtIHBhc3NlZCB0byBcYSBmaWx0ZXIuIElmIFxhIGZpbHRlciByZXR1cm5zIE5VTEwsCisgICAgdGhlIGVsZW1lbnQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgZ2FyYmFnZSBsaXN0LiAqLwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKigqZmlsdGVyKSh2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisjaWZuZGVmIE5ERUJVRwordm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2Fzc2VydF9vayhncnBjX21ldGFkYXRhX2JhdGNoICpjb21kKTsKKyNlbHNlCisjZGVmaW5lIGdycGNfbWV0YWRhdGFfYmF0Y2hfYXNzZXJ0X29rKGNvbWQpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9NRVRBREFUQV9CQVRDSF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIGIvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGEyNzdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyoKKyAqIFdBUk5JTkc6IEF1dG8tZ2VuZXJhdGVkIGNvZGUuCisgKgorICogVG8gbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSwgY2hhbmdlCisgKiB0b29scy9jb2RlZ2VuL2NvcmUvZ2VuX3N0YXRpY19tZXRhZGF0YS5weSwKKyAqIGFuZCB0aGVuIHJlLXJ1biBpdC4KKyAqCisgKiBTZWUgbWV0YWRhdGEuaCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGludGVyZmFjZSBoZXJlLCBhbmQgbWV0YWRhdGEuYyBmb3IKKyAqIGFuCisgKiBleHBsYW5hdGlvbiBvZiB3aGF0J3MgZ29pbmcgb24uCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCisKK2dycGNfbWRzdHIgZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlRdOworCitncnBjX21kZWxlbSBncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UXTsKK3VpbnRwdHJfdCBncnBjX3N0YXRpY19tZGVsZW1fdXNlcl9kYXRhW0dSUENfU1RBVElDX01ERUxFTV9DT1VOVF0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCA0LCA4LCA2LCAyLCA0LCA4LCA2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisKK2NvbnN0IHVpbnQ4X3QgZ3JwY19zdGF0aWNfbWV0YWRhdGFfZWxlbV9pbmRpY2VzW0dSUENfU1RBVElDX01ERUxFTV9DT1VOVCAqIDJdID0KKyAgICB7MTEsIDM1LCAxMCwgMzUsIDEyLCAzNSwgMTIsIDQ5LCAxMywgMzUsIDE0LCAzNSwgMTUsIDM1LCAxNiwgMzUsIDE3LCAzNSwKKyAgICAgMTksIDM1LCAyMCwgMzUsIDIxLCAzNSwgMjQsIDM1LCAyNSwgMzUsIDI2LCAzNSwgMjcsIDM1LCAyOCwgMzUsIDI5LCAzNSwKKyAgICAgMzAsIDE4LCAzMCwgMzUsIDMxLCAzNSwgMzIsIDM1LCAzNiwgMzUsIDM3LCAzNSwgMzgsIDM1LCAzOSwgMzUsIDQyLCAzMywKKyAgICAgNDIsIDM0LCA0MiwgNDgsIDQyLCA1MywgNDIsIDU0LCA0MiwgNTUsIDQyLCA1NiwgNDMsIDMzLCA0MywgNDgsIDQzLCA1MywKKyAgICAgNDYsIDAsICA0NiwgMSwgIDQ2LCAyLCAgNTAsIDM1LCA1NywgMzUsIDU4LCAzNSwgNTksIDM1LCA2MCwgMzUsIDYxLCAzNSwKKyAgICAgNjIsIDM1LCA2MywgMzUsIDY0LCAzNSwgNjUsIDM1LCA2NiwgNDAsIDY2LCA2OCwgNjcsIDc4LCA2NywgNzksIDY5LCAzNSwKKyAgICAgNzAsIDM1LCA3MSwgMzUsIDcyLCAzNSwgNzMsIDM1LCA3NCwgMzUsIDc1LCA0MSwgNzUsIDUxLCA3NSwgNTIsIDc2LCAzNSwKKyAgICAgNzcsIDM1LCA4MCwgMywgIDgwLCA0LCAgODAsIDUsICA4MCwgNiwgIDgwLCA3LCAgODAsIDgsICA4MCwgOSwgIDgxLCAzNSwKKyAgICAgODIsIDgzLCA4NCwgMzUsIDg1LCAzNSwgODYsIDM1LCA4NywgMzUsIDg4LCAzNX07CisKK2NvbnN0IGNoYXIgKmNvbnN0IGdycGNfc3RhdGljX21ldGFkYXRhX3N0cmluZ3NbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlRdID0geworICAgICIwIiwKKyAgICAiMSIsCisgICAgIjIiLAorICAgICIyMDAiLAorICAgICIyMDQiLAorICAgICIyMDYiLAorICAgICIzMDQiLAorICAgICI0MDAiLAorICAgICI0MDQiLAorICAgICI1MDAiLAorICAgICJhY2NlcHQiLAorICAgICJhY2NlcHQtY2hhcnNldCIsCisgICAgImFjY2VwdC1lbmNvZGluZyIsCisgICAgImFjY2VwdC1sYW5ndWFnZSIsCisgICAgImFjY2VwdC1yYW5nZXMiLAorICAgICJhY2Nlc3MtY29udHJvbC1hbGxvdy1vcmlnaW4iLAorICAgICJhZ2UiLAorICAgICJhbGxvdyIsCisgICAgImFwcGxpY2F0aW9uL2dycGMiLAorICAgICI6YXV0aG9yaXR5IiwKKyAgICAiYXV0aG9yaXphdGlvbiIsCisgICAgImNhY2hlLWNvbnRyb2wiLAorICAgICJjZW5zdXMtYmluIiwKKyAgICAiY2Vuc3VzLWJpbmFyeS1iaW4iLAorICAgICJjb250ZW50LWRpc3Bvc2l0aW9uIiwKKyAgICAiY29udGVudC1lbmNvZGluZyIsCisgICAgImNvbnRlbnQtbGFuZ3VhZ2UiLAorICAgICJjb250ZW50LWxlbmd0aCIsCisgICAgImNvbnRlbnQtbG9jYXRpb24iLAorICAgICJjb250ZW50LXJhbmdlIiwKKyAgICAiY29udGVudC10eXBlIiwKKyAgICAiY29va2llIiwKKyAgICAiZGF0ZSIsCisgICAgImRlZmxhdGUiLAorICAgICJkZWZsYXRlLGd6aXAiLAorICAgICIiLAorICAgICJldGFnIiwKKyAgICAiZXhwZWN0IiwKKyAgICAiZXhwaXJlcyIsCisgICAgImZyb20iLAorICAgICJHRVQiLAorICAgICJncnBjIiwKKyAgICAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciLAorICAgICJncnBjLWVuY29kaW5nIiwKKyAgICAiZ3JwYy1pbnRlcm5hbC1lbmNvZGluZy1yZXF1ZXN0IiwKKyAgICAiZ3JwYy1tZXNzYWdlIiwKKyAgICAiZ3JwYy1zdGF0dXMiLAorICAgICJncnBjLXRpbWVvdXQiLAorICAgICJnemlwIiwKKyAgICAiZ3ppcCwgZGVmbGF0ZSIsCisgICAgImhvc3QiLAorICAgICJodHRwIiwKKyAgICAiaHR0cHMiLAorICAgICJpZGVudGl0eSIsCisgICAgImlkZW50aXR5LGRlZmxhdGUiLAorICAgICJpZGVudGl0eSxkZWZsYXRlLGd6aXAiLAorICAgICJpZGVudGl0eSxnemlwIiwKKyAgICAiaWYtbWF0Y2giLAorICAgICJpZi1tb2RpZmllZC1zaW5jZSIsCisgICAgImlmLW5vbmUtbWF0Y2giLAorICAgICJpZi1yYW5nZSIsCisgICAgImlmLXVubW9kaWZpZWQtc2luY2UiLAorICAgICJsYXN0LW1vZGlmaWVkIiwKKyAgICAibGluayIsCisgICAgImxvY2F0aW9uIiwKKyAgICAibWF4LWZvcndhcmRzIiwKKyAgICAiOm1ldGhvZCIsCisgICAgIjpwYXRoIiwKKyAgICAiUE9TVCIsCisgICAgInByb3h5LWF1dGhlbnRpY2F0ZSIsCisgICAgInByb3h5LWF1dGhvcml6YXRpb24iLAorICAgICJyYW5nZSIsCisgICAgInJlZmVyZXIiLAorICAgICJyZWZyZXNoIiwKKyAgICAicmV0cnktYWZ0ZXIiLAorICAgICI6c2NoZW1lIiwKKyAgICAic2VydmVyIiwKKyAgICAic2V0LWNvb2tpZSIsCisgICAgIi8iLAorICAgICIvaW5kZXguaHRtbCIsCisgICAgIjpzdGF0dXMiLAorICAgICJzdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5IiwKKyAgICAidGUiLAorICAgICJ0cmFpbGVycyIsCisgICAgInRyYW5zZmVyLWVuY29kaW5nIiwKKyAgICAidXNlci1hZ2VudCIsCisgICAgInZhcnkiLAorICAgICJ2aWEiLAorICAgICJ3d3ctYXV0aGVudGljYXRlIn07CisKK2NvbnN0IHVpbnQ4X3QgZ3JwY19zdGF0aWNfYWNjZXB0X2VuY29kaW5nX21ldGFkYXRhWzhdID0gezAsICAyOSwgMjYsIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsIDMyLCAyNywgMzF9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmMTM2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qCisgKiBXQVJOSU5HOiBBdXRvLWdlbmVyYXRlZCBjb2RlLgorICoKKyAqIFRvIG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUsIGNoYW5nZQorICogdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9zdGF0aWNfbWV0YWRhdGEucHksCisgKiBhbmQgdGhlbiByZS1ydW4gaXQuCisgKgorICogU2VlIG1ldGFkYXRhLmggZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgaGVyZSwgYW5kIG1ldGFkYXRhLmMgZm9yCisgKiBhbgorICogZXhwbGFuYXRpb24gb2Ygd2hhdCdzIGdvaW5nIG9uLgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9UUkFOU1BPUlRfU1RBVElDX01FVEFEQVRBX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9UUkFOU1BPUlRfU1RBVElDX01FVEFEQVRBX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIKKworI2RlZmluZSBHUlBDX1NUQVRJQ19NRFNUUl9DT1VOVCA4OQorZXh0ZXJuIGdycGNfbWRzdHIgZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlRdOworLyogIjAiICovCisjZGVmaW5lIEdSUENfTURTVFJfMCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzBdKQorLyogIjEiICovCisjZGVmaW5lIEdSUENfTURTVFJfMSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzFdKQorLyogIjIiICovCisjZGVmaW5lIEdSUENfTURTVFJfMiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzJdKQorLyogIjIwMCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl8yMDAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszXSkKKy8qICIyMDQiICovCisjZGVmaW5lIEdSUENfTURTVFJfMjA0ICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNF0pCisvKiAiMjA2IiAqLworI2RlZmluZSBHUlBDX01EU1RSXzIwNiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzVdKQorLyogIjMwNCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl8zMDQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2XSkKKy8qICI0MDAiICovCisjZGVmaW5lIEdSUENfTURTVFJfNDAwICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbN10pCisvKiAiNDA0IiAqLworI2RlZmluZSBHUlBDX01EU1RSXzQwNCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzhdKQorLyogIjUwMCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl81MDAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs5XSkKKy8qICJhY2NlcHQiICovCisjZGVmaW5lIEdSUENfTURTVFJfQUNDRVBUICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTBdKQorLyogImFjY2VwdC1jaGFyc2V0IiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FDQ0VQVF9DSEFSU0VUICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTFdKQorLyogImFjY2VwdC1lbmNvZGluZyIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9BQ0NFUFRfRU5DT0RJTkcgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsxMl0pCisvKiAiYWNjZXB0LWxhbmd1YWdlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FDQ0VQVF9MQU5HVUFHRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzEzXSkKKy8qICJhY2NlcHQtcmFuZ2VzIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FDQ0VQVF9SQU5HRVMgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsxNF0pCisvKiAiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FDQ0VTU19DT05UUk9MX0FMTE9XX09SSUdJTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzE1XSkKKy8qICJhZ2UiICovCisjZGVmaW5lIEdSUENfTURTVFJfQUdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTZdKQorLyogImFsbG93IiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FMTE9XICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTddKQorLyogImFwcGxpY2F0aW9uL2dycGMiICovCisjZGVmaW5lIEdSUENfTURTVFJfQVBQTElDQVRJT05fU0xBU0hfR1JQQyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzE4XSkKKy8qICI6YXV0aG9yaXR5IiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FVVEhPUklUWSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzE5XSkKKy8qICJhdXRob3JpemF0aW9uIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0FVVEhPUklaQVRJT04gKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsyMF0pCisvKiAiY2FjaGUtY29udHJvbCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9DQUNIRV9DT05UUk9MICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjFdKQorLyogImNlbnN1cy1iaW4iICovCisjZGVmaW5lIEdSUENfTURTVFJfQ0VOU1VTX0JJTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzIyXSkKKy8qICJjZW5zdXMtYmluYXJ5LWJpbiIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9DRU5TVVNfQklOQVJZX0JJTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzIzXSkKKy8qICJjb250ZW50LWRpc3Bvc2l0aW9uIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0NPTlRFTlRfRElTUE9TSVRJT04gKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsyNF0pCisvKiAiY29udGVudC1lbmNvZGluZyIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9DT05URU5UX0VOQ09ESU5HICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjVdKQorLyogImNvbnRlbnQtbGFuZ3VhZ2UiICovCisjZGVmaW5lIEdSUENfTURTVFJfQ09OVEVOVF9MQU5HVUFHRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzI2XSkKKy8qICJjb250ZW50LWxlbmd0aCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9DT05URU5UX0xFTkdUSCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzI3XSkKKy8qICJjb250ZW50LWxvY2F0aW9uIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0NPTlRFTlRfTE9DQVRJT04gKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsyOF0pCisvKiAiY29udGVudC1yYW5nZSIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9DT05URU5UX1JBTkdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjldKQorLyogImNvbnRlbnQtdHlwZSIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9DT05URU5UX1RZUEUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszMF0pCisvKiAiY29va2llIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0NPT0tJRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzMxXSkKKy8qICJkYXRlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0RBVEUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszMl0pCisvKiAiZGVmbGF0ZSIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9ERUZMQVRFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMzNdKQorLyogImRlZmxhdGUsZ3ppcCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9ERUZMQVRFX0NPTU1BX0daSVAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszNF0pCisvKiAiIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMzVdKQorLyogImV0YWciICovCisjZGVmaW5lIEdSUENfTURTVFJfRVRBRyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzM2XSkKKy8qICJleHBlY3QiICovCisjZGVmaW5lIEdSUENfTURTVFJfRVhQRUNUICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMzddKQorLyogImV4cGlyZXMiICovCisjZGVmaW5lIEdSUENfTURTVFJfRVhQSVJFUyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzM4XSkKKy8qICJmcm9tIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0ZST00gKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszOV0pCisvKiAiR0VUIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0dFVCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQwXSkKKy8qICJncnBjIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0dSUEMgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs0MV0pCisvKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciICovCisjZGVmaW5lIEdSUENfTURTVFJfR1JQQ19BQ0NFUFRfRU5DT0RJTkcgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs0Ml0pCisvKiAiZ3JwYy1lbmNvZGluZyIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9HUlBDX0VOQ09ESU5HICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDNdKQorLyogImdycGMtaW50ZXJuYWwtZW5jb2RpbmctcmVxdWVzdCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9HUlBDX0lOVEVSTkFMX0VOQ09ESU5HX1JFUVVFU1QgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs0NF0pCisvKiAiZ3JwYy1tZXNzYWdlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0dSUENfTUVTU0FHRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQ1XSkKKy8qICJncnBjLXN0YXR1cyIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9HUlBDX1NUQVRVUyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQ2XSkKKy8qICJncnBjLXRpbWVvdXQiICovCisjZGVmaW5lIEdSUENfTURTVFJfR1JQQ19USU1FT1VUICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDddKQorLyogImd6aXAiICovCisjZGVmaW5lIEdSUENfTURTVFJfR1pJUCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQ4XSkKKy8qICJnemlwLCBkZWZsYXRlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0daSVBfQ09NTUFfREVGTEFURSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQ5XSkKKy8qICJob3N0IiAqLworI2RlZmluZSBHUlBDX01EU1RSX0hPU1QgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1MF0pCisvKiAiaHR0cCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9IVFRQICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTFdKQorLyogImh0dHBzIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0hUVFBTICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTJdKQorLyogImlkZW50aXR5IiAqLworI2RlZmluZSBHUlBDX01EU1RSX0lERU5USVRZICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTNdKQorLyogImlkZW50aXR5LGRlZmxhdGUiICovCisjZGVmaW5lIEdSUENfTURTVFJfSURFTlRJVFlfQ09NTUFfREVGTEFURSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzU0XSkKKy8qICJpZGVudGl0eSxkZWZsYXRlLGd6aXAiICovCisjZGVmaW5lIEdSUENfTURTVFJfSURFTlRJVFlfQ09NTUFfREVGTEFURV9DT01NQV9HWklQIFwKKyAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1NV0pCisvKiAiaWRlbnRpdHksZ3ppcCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9JREVOVElUWV9DT01NQV9HWklQICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTZdKQorLyogImlmLW1hdGNoIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0lGX01BVENIICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTddKQorLyogImlmLW1vZGlmaWVkLXNpbmNlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0lGX01PRElGSUVEX1NJTkNFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNThdKQorLyogImlmLW5vbmUtbWF0Y2giICovCisjZGVmaW5lIEdSUENfTURTVFJfSUZfTk9ORV9NQVRDSCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzU5XSkKKy8qICJpZi1yYW5nZSIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9JRl9SQU5HRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzYwXSkKKy8qICJpZi11bm1vZGlmaWVkLXNpbmNlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX0lGX1VOTU9ESUZJRURfU0lOQ0UgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2MV0pCisvKiAibGFzdC1tb2RpZmllZCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9MQVNUX01PRElGSUVEICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjJdKQorLyogImxpbmsiICovCisjZGVmaW5lIEdSUENfTURTVFJfTElOSyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzYzXSkKKy8qICJsb2NhdGlvbiIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9MT0NBVElPTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzY0XSkKKy8qICJtYXgtZm9yd2FyZHMiICovCisjZGVmaW5lIEdSUENfTURTVFJfTUFYX0ZPUldBUkRTICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjVdKQorLyogIjptZXRob2QiICovCisjZGVmaW5lIEdSUENfTURTVFJfTUVUSE9EICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjZdKQorLyogIjpwYXRoIiAqLworI2RlZmluZSBHUlBDX01EU1RSX1BBVEggKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2N10pCisvKiAiUE9TVCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9QT1NUICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjhdKQorLyogInByb3h5LWF1dGhlbnRpY2F0ZSIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9QUk9YWV9BVVRIRU5USUNBVEUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2OV0pCisvKiAicHJveHktYXV0aG9yaXphdGlvbiIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9QUk9YWV9BVVRIT1JJWkFUSU9OICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNzBdKQorLyogInJhbmdlIiAqLworI2RlZmluZSBHUlBDX01EU1RSX1JBTkdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNzFdKQorLyogInJlZmVyZXIiICovCisjZGVmaW5lIEdSUENfTURTVFJfUkVGRVJFUiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzcyXSkKKy8qICJyZWZyZXNoIiAqLworI2RlZmluZSBHUlBDX01EU1RSX1JFRlJFU0ggKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3M10pCisvKiAicmV0cnktYWZ0ZXIiICovCisjZGVmaW5lIEdSUENfTURTVFJfUkVUUllfQUZURVIgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3NF0pCisvKiAiOnNjaGVtZSIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9TQ0hFTUUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3NV0pCisvKiAic2VydmVyIiAqLworI2RlZmluZSBHUlBDX01EU1RSX1NFUlZFUiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzc2XSkKKy8qICJzZXQtY29va2llIiAqLworI2RlZmluZSBHUlBDX01EU1RSX1NFVF9DT09LSUUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3N10pCisvKiAiLyIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9TTEFTSCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzc4XSkKKy8qICIvaW5kZXguaHRtbCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9TTEFTSF9JTkRFWF9ET1RfSFRNTCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzc5XSkKKy8qICI6c3RhdHVzIiAqLworI2RlZmluZSBHUlBDX01EU1RSX1NUQVRVUyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzgwXSkKKy8qICJzdHJpY3QtdHJhbnNwb3J0LXNlY3VyaXR5IiAqLworI2RlZmluZSBHUlBDX01EU1RSX1NUUklDVF9UUkFOU1BPUlRfU0VDVVJJVFkgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs4MV0pCisvKiAidGUiICovCisjZGVmaW5lIEdSUENfTURTVFJfVEUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs4Ml0pCisvKiAidHJhaWxlcnMiICovCisjZGVmaW5lIEdSUENfTURTVFJfVFJBSUxFUlMgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs4M10pCisvKiAidHJhbnNmZXItZW5jb2RpbmciICovCisjZGVmaW5lIEdSUENfTURTVFJfVFJBTlNGRVJfRU5DT0RJTkcgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs4NF0pCisvKiAidXNlci1hZ2VudCIgKi8KKyNkZWZpbmUgR1JQQ19NRFNUUl9VU0VSX0FHRU5UICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbODVdKQorLyogInZhcnkiICovCisjZGVmaW5lIEdSUENfTURTVFJfVkFSWSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzg2XSkKKy8qICJ2aWEiICovCisjZGVmaW5lIEdSUENfTURTVFJfVklBICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbODddKQorLyogInd3dy1hdXRoZW50aWNhdGUiICovCisjZGVmaW5lIEdSUENfTURTVFJfV1dXX0FVVEhFTlRJQ0FURSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzg4XSkKKworI2RlZmluZSBHUlBDX1NUQVRJQ19NREVMRU1fQ09VTlQgNzgKK2V4dGVybiBncnBjX21kZWxlbSBncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UXTsKK2V4dGVybiB1aW50cHRyX3QgZ3JwY19zdGF0aWNfbWRlbGVtX3VzZXJfZGF0YVtHUlBDX1NUQVRJQ19NREVMRU1fQ09VTlRdOworLyogImFjY2VwdC1jaGFyc2V0IjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX0NIQVJTRVRfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMF0pCisvKiAiYWNjZXB0IjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzFdKQorLyogImFjY2VwdC1lbmNvZGluZyI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0FDQ0VQVF9FTkNPRElOR19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyXSkKKy8qICJhY2NlcHQtZW5jb2RpbmciOiAiZ3ppcCwgZGVmbGF0ZSIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX0VOQ09ESU5HX0daSVBfQ09NTUFfREVGTEFURSBcCisgICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzNdKQorLyogImFjY2VwdC1sYW5ndWFnZSI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0FDQ0VQVF9MQU5HVUFHRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0XSkKKy8qICJhY2NlcHQtcmFuZ2VzIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX1JBTkdFU19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1XSkKKy8qICJhY2Nlc3MtY29udHJvbC1hbGxvdy1vcmlnaW4iOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9BQ0NFU1NfQ09OVFJPTF9BTExPV19PUklHSU5fRU1QVFkgXAorICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2XSkKKy8qICJhZ2UiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9BR0VfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbN10pCisvKiAiYWxsb3ciOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9BTExPV19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs4XSkKKy8qICI6YXV0aG9yaXR5IjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQVVUSE9SSVRZX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzldKQorLyogImF1dGhvcml6YXRpb24iOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9BVVRIT1JJWkFUSU9OX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzEwXSkKKy8qICJjYWNoZS1jb250cm9sIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQ0FDSEVfQ09OVFJPTF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsxMV0pCisvKiAiY29udGVudC1kaXNwb3NpdGlvbiI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0NPTlRFTlRfRElTUE9TSVRJT05fRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMTJdKQorLyogImNvbnRlbnQtZW5jb2RpbmciOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9DT05URU5UX0VOQ09ESU5HX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzEzXSkKKy8qICJjb250ZW50LWxhbmd1YWdlIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQ09OVEVOVF9MQU5HVUFHRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsxNF0pCisvKiAiY29udGVudC1sZW5ndGgiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9DT05URU5UX0xFTkdUSF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsxNV0pCisvKiAiY29udGVudC1sb2NhdGlvbiI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0NPTlRFTlRfTE9DQVRJT05fRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMTZdKQorLyogImNvbnRlbnQtcmFuZ2UiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9DT05URU5UX1JBTkdFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzE3XSkKKy8qICJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24vZ3JwYyIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX1NMQVNIX0dSUEMgXAorICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsxOF0pCisvKiAiY29udGVudC10eXBlIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fQ09OVEVOVF9UWVBFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzE5XSkKKy8qICJjb29raWUiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9DT09LSUVfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjBdKQorLyogImRhdGUiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9EQVRFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzIxXSkKKy8qICJldGFnIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fRVRBR19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyMl0pCisvKiAiZXhwZWN0IjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fRVhQRUNUX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzIzXSkKKy8qICJleHBpcmVzIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fRVhQSVJFU19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyNF0pCisvKiAiZnJvbSI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0ZST01fRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjVdKQorLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImRlZmxhdGUiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0dSUENfQUNDRVBUX0VOQ09ESU5HX0RFRkxBVEUgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjZdKQorLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImRlZmxhdGUsZ3ppcCIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fR1JQQ19BQ0NFUFRfRU5DT0RJTkdfREVGTEFURV9DT01NQV9HWklQIFwKKyAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjddKQorLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImd6aXAiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0dSUENfQUNDRVBUX0VOQ09ESU5HX0daSVAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjhdKQorLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImlkZW50aXR5IiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0FDQ0VQVF9FTkNPRElOR19JREVOVElUWSBcCisgICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzI5XSkKKy8qICJncnBjLWFjY2VwdC1lbmNvZGluZyI6ICJpZGVudGl0eSxkZWZsYXRlIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0FDQ0VQVF9FTkNPRElOR19JREVOVElUWV9DT01NQV9ERUZMQVRFIFwKKyAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzBdKQorLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImlkZW50aXR5LGRlZmxhdGUsZ3ppcCIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fR1JQQ19BQ0NFUFRfRU5DT0RJTkdfSURFTlRJVFlfQ09NTUFfREVGTEFURV9DT01NQV9HWklQIFwKKyAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzFdKQorLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImlkZW50aXR5LGd6aXAiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0dSUENfQUNDRVBUX0VOQ09ESU5HX0lERU5USVRZX0NPTU1BX0daSVAgXAorICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVszMl0pCisvKiAiZ3JwYy1lbmNvZGluZyI6ICJkZWZsYXRlIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0VOQ09ESU5HX0RFRkxBVEUgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzNdKQorLyogImdycGMtZW5jb2RpbmciOiAiZ3ppcCIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fR1JQQ19FTkNPRElOR19HWklQICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzM0XSkKKy8qICJncnBjLWVuY29kaW5nIjogImlkZW50aXR5IiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0VOQ09ESU5HX0lERU5USVRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzM1XSkKKy8qICJncnBjLXN0YXR1cyI6ICIwIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18wICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzM2XSkKKy8qICJncnBjLXN0YXR1cyI6ICIxIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18xICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzM3XSkKKy8qICJncnBjLXN0YXR1cyI6ICIyIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18yICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzM4XSkKKy8qICJob3N0IjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fSE9TVF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVszOV0pCisvKiAiaWYtbWF0Y2giOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9JRl9NQVRDSF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0MF0pCisvKiAiaWYtbW9kaWZpZWQtc2luY2UiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9JRl9NT0RJRklFRF9TSU5DRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0MV0pCisvKiAiaWYtbm9uZS1tYXRjaCI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0lGX05PTkVfTUFUQ0hfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNDJdKQorLyogImlmLXJhbmdlIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fSUZfUkFOR0VfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNDNdKQorLyogImlmLXVubW9kaWZpZWQtc2luY2UiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9JRl9VTk1PRElGSUVEX1NJTkNFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzQ0XSkKKy8qICJsYXN0LW1vZGlmaWVkIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fTEFTVF9NT0RJRklFRF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0NV0pCisvKiAibGluayI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX0xJTktfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNDZdKQorLyogImxvY2F0aW9uIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fTE9DQVRJT05fRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNDddKQorLyogIm1heC1mb3J3YXJkcyI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX01BWF9GT1JXQVJEU19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0OF0pCisvKiAiOm1ldGhvZCI6ICJHRVQiICovCisjZGVmaW5lIEdSUENfTURFTEVNX01FVEhPRF9HRVQgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNDldKQorLyogIjptZXRob2QiOiAiUE9TVCIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fTUVUSE9EX1BPU1QgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTBdKQorLyogIjpwYXRoIjogIi8iICovCisjZGVmaW5lIEdSUENfTURFTEVNX1BBVEhfU0xBU0ggKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTFdKQorLyogIjpwYXRoIjogIi9pbmRleC5odG1sIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9QQVRIX1NMQVNIX0lOREVYX0RPVF9IVE1MICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzUyXSkKKy8qICJwcm94eS1hdXRoZW50aWNhdGUiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9QUk9YWV9BVVRIRU5USUNBVEVfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTNdKQorLyogInByb3h5LWF1dGhvcml6YXRpb24iOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9QUk9YWV9BVVRIT1JJWkFUSU9OX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzU0XSkKKy8qICJyYW5nZSI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1JBTkdFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzU1XSkKKy8qICJyZWZlcmVyIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fUkVGRVJFUl9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1Nl0pCisvKiAicmVmcmVzaCI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1JFRlJFU0hfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTddKQorLyogInJldHJ5LWFmdGVyIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fUkVUUllfQUZURVJfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNThdKQorLyogIjpzY2hlbWUiOiAiZ3JwYyIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fU0NIRU1FX0dSUEMgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTldKQorLyogIjpzY2hlbWUiOiAiaHR0cCIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fU0NIRU1FX0hUVFAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNjBdKQorLyogIjpzY2hlbWUiOiAiaHR0cHMiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1NDSEVNRV9IVFRQUyAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2MV0pCisvKiAic2VydmVyIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fU0VSVkVSX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzYyXSkKKy8qICJzZXQtY29va2llIjogIiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fU0VUX0NPT0tJRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2M10pCisvKiAiOnN0YXR1cyI6ICIyMDAiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1NUQVRVU18yMDAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNjRdKQorLyogIjpzdGF0dXMiOiAiMjA0IiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9TVEFUVVNfMjA0ICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzY1XSkKKy8qICI6c3RhdHVzIjogIjIwNiIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fU1RBVFVTXzIwNiAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2Nl0pCisvKiAiOnN0YXR1cyI6ICIzMDQiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1NUQVRVU18zMDQgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNjddKQorLyogIjpzdGF0dXMiOiAiNDAwIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9TVEFUVVNfNDAwICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzY4XSkKKy8qICI6c3RhdHVzIjogIjQwNCIgKi8KKyNkZWZpbmUgR1JQQ19NREVMRU1fU1RBVFVTXzQwNCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2OV0pCisvKiAiOnN0YXR1cyI6ICI1MDAiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1NUQVRVU181MDAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNzBdKQorLyogInN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHkiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9TVFJJQ1RfVFJBTlNQT1JUX1NFQ1VSSVRZX0VNUFRZIFwKKyAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNzFdKQorLyogInRlIjogInRyYWlsZXJzIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9URV9UUkFJTEVSUyAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3Ml0pCisvKiAidHJhbnNmZXItZW5jb2RpbmciOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9UUkFOU0ZFUl9FTkNPRElOR19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3M10pCisvKiAidXNlci1hZ2VudCI6ICIiICovCisjZGVmaW5lIEdSUENfTURFTEVNX1VTRVJfQUdFTlRfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNzRdKQorLyogInZhcnkiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9WQVJZX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzc1XSkKKy8qICJ2aWEiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9WSUFfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNzZdKQorLyogInd3dy1hdXRoZW50aWNhdGUiOiAiIiAqLworI2RlZmluZSBHUlBDX01ERUxFTV9XV1dfQVVUSEVOVElDQVRFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzc3XSkKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QKKyAgICBncnBjX3N0YXRpY19tZXRhZGF0YV9lbGVtX2luZGljZXNbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UICogMl07CitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgZ3JwY19zdGF0aWNfbWV0YWRhdGFfc3RyaW5nc1tHUlBDX1NUQVRJQ19NRFNUUl9DT1VOVF07CitleHRlcm4gY29uc3QgdWludDhfdCBncnBjX3N0YXRpY19hY2NlcHRfZW5jb2RpbmdfbWV0YWRhdGFbOF07CisjZGVmaW5lIEdSUENfTURFTEVNX0FDQ0VQVF9FTkNPRElOR19GT1JfQUxHT1JJVEhNUyhhbGdzKSBcCisgICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlW2dycGNfc3RhdGljX2FjY2VwdF9lbmNvZGluZ19tZXRhZGF0YVsoYWxncyldXSkKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9TVEFUSUNfTUVUQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuYyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyNTZhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIgorCisjaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKK3ZvaWQgZ3JwY19zdHJlYW1fcmVmKGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgY29uc3QgY2hhciAqcmVhc29uKSB7CisgIGdwcl9hdG0gdmFsID0gZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJnJlZmNvdW50LT5yZWZzLmNvdW50KTsKKyAgZ3ByX2xvZyhHUFJfREVCVUcsICIlcyAlcDolcCAgIFJFRiAlZC0+JWQgJXMiLCByZWZjb3VudC0+b2JqZWN0X3R5cGUsCisgICAgICAgICAgcmVmY291bnQsIHJlZmNvdW50LT5kZXN0cm95LmNiX2FyZywgdmFsLCB2YWwgKyAxLCByZWFzb24pOworI2Vsc2UKK3ZvaWQgZ3JwY19zdHJlYW1fcmVmKGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCkgeworI2VuZGlmCisgIGdwcl9yZWZfbm9uX3plcm8oJnJlZmNvdW50LT5yZWZzKTsKK30KKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCit2b2lkIGdycGNfc3RyZWFtX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N0cmVhbV9yZWZjb3VudCAqcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgeworICBncHJfYXRtIHZhbCA9IGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZyZWZjb3VudC0+cmVmcy5jb3VudCk7CisgIGdwcl9sb2coR1BSX0RFQlVHLCAiJXMgJXA6JXAgVU5SRUYgJWQtPiVkICVzIiwgcmVmY291bnQtPm9iamVjdF90eXBlLAorICAgICAgICAgIHJlZmNvdW50LCByZWZjb3VudC0+ZGVzdHJveS5jYl9hcmcsIHZhbCwgdmFsIC0gMSwgcmVhc29uKTsKKyNlbHNlCit2b2lkIGdycGNfc3RyZWFtX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbV9yZWZjb3VudCAqcmVmY291bnQpIHsKKyNlbmRpZgorICBpZiAoZ3ByX3VucmVmKCZyZWZjb3VudC0+cmVmcykpIHsKKyAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZyZWZjb3VudC0+ZGVzdHJveSwgdHJ1ZSwgTlVMTCk7CisgIH0KK30KKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCit2b2lkIGdycGNfc3RyZWFtX3JlZl9pbml0KGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgaW50IGluaXRpYWxfcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdF90eXBlKSB7CisgIHJlZmNvdW50LT5vYmplY3RfdHlwZSA9IG9iamVjdF90eXBlOworI2Vsc2UKK3ZvaWQgZ3JwY19zdHJlYW1fcmVmX2luaXQoZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50LCBpbnQgaW5pdGlhbF9yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2lvbWdyX2NiX2Z1bmMgY2IsIHZvaWQgKmNiX2FyZykgeworI2VuZGlmCisgIGdwcl9yZWZfaW5pdCgmcmVmY291bnQtPnJlZnMsIGluaXRpYWxfcmVmcyk7CisgIGdycGNfY2xvc3VyZV9pbml0KCZyZWZjb3VudC0+ZGVzdHJveSwgY2IsIGNiX2FyZyk7Cit9CisKK3NpemVfdCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fc2l6ZShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KSB7CisgIHJldHVybiB0cmFuc3BvcnQtPnZ0YWJsZS0+c2l6ZW9mX3N0cmVhbTsKK30KKwordm9pZCBncnBjX3RyYW5zcG9ydF9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpIHsKKyAgdHJhbnNwb3J0LT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIHRyYW5zcG9ydCk7Cit9CisKK2ludCBncnBjX3RyYW5zcG9ydF9pbml0X3N0cmVhbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBncnBjX3N0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZXJ2ZXJfZGF0YSkgeworICByZXR1cm4gdHJhbnNwb3J0LT52dGFibGUtPmluaXRfc3RyZWFtKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIHN0cmVhbSwgcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2RhdGEpOworfQorCit2b2lkIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7CisgIHRyYW5zcG9ydC0+dnRhYmxlLT5wZXJmb3JtX3N0cmVhbV9vcChleGVjX2N0eCwgdHJhbnNwb3J0LCBzdHJlYW0sIG9wKTsKK30KKwordm9pZCBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKSB7CisgIHRyYW5zcG9ydC0+dnRhYmxlLT5wZXJmb3JtX29wKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIG9wKTsKK30KKwordm9pZCBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3JwY19zdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7CisgIHRyYW5zcG9ydC0+dnRhYmxlLT5zZXRfcG9sbHNldChleGVjX2N0eCwgdHJhbnNwb3J0LCBzdHJlYW0sIHBvbGxzZXQpOworfQorCit2b2lkIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3lfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtKSB7CisgIHRyYW5zcG9ydC0+dnRhYmxlLT5kZXN0cm95X3N0cmVhbShleGVjX2N0eCwgdHJhbnNwb3J0LCBzdHJlYW0pOworfQorCitjaGFyICpncnBjX3RyYW5zcG9ydF9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpIHsKKyAgcmV0dXJuIHRyYW5zcG9ydC0+dnRhYmxlLT5nZXRfcGVlcihleGVjX2N0eCwgdHJhbnNwb3J0KTsKK30KKwordm9pZCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZSgKKyAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIG9wLT5yZWN2X21lc3NhZ2VfcmVhZHksIGZhbHNlLCBOVUxMKTsKKyAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5LCBmYWxzZSwgTlVMTCk7CisgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb3AtPm9uX2NvbXBsZXRlLCBmYWxzZSwgTlVMTCk7Cit9CisKK3ZvaWQgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2FkZF9jYW5jZWxsYXRpb24oZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpIHsKKyAgR1BSX0FTU0VSVChzdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0spOworICBpZiAob3AtPmNhbmNlbF93aXRoX3N0YXR1cyA9PSBHUlBDX1NUQVRVU19PSykgeworICAgIG9wLT5jYW5jZWxfd2l0aF9zdGF0dXMgPSBzdGF0dXM7CisgIH0KKyAgaWYgKG9wLT5jbG9zZV93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgeworICAgIG9wLT5jbG9zZV93aXRoX3N0YXR1cyA9IEdSUENfU1RBVFVTX09LOworICAgIGlmIChvcC0+b3B0aW9uYWxfY2xvc2VfbWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICBncHJfc2xpY2VfdW5yZWYoKm9wLT5vcHRpb25hbF9jbG9zZV9tZXNzYWdlKTsKKyAgICAgIG9wLT5vcHRpb25hbF9jbG9zZV9tZXNzYWdlID0gTlVMTDsKKyAgICB9CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBncHJfc2xpY2UgbWVzc2FnZTsKKyAgZ3JwY19jbG9zdXJlICp0aGVuX2NhbGw7CisgIGdycGNfY2xvc3VyZSBjbG9zdXJlOworfSBjbG9zZV9tZXNzYWdlX2RhdGE7CisKK3N0YXRpYyB2b2lkIGZyZWVfbWVzc2FnZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcCwgYm9vbCBpb21ncl9zdWNjZXNzKSB7CisgIGNsb3NlX21lc3NhZ2VfZGF0YSAqY21kID0gcDsKKyAgZ3ByX3NsaWNlX3VucmVmKGNtZC0+bWVzc2FnZSk7CisgIGlmIChjbWQtPnRoZW5fY2FsbCAhPSBOVUxMKSB7CisgICAgY21kLT50aGVuX2NhbGwtPmNiKGV4ZWNfY3R4LCBjbWQtPnRoZW5fY2FsbC0+Y2JfYXJnLCBpb21ncl9zdWNjZXNzKTsKKyAgfQorICBncHJfZnJlZShjbWQpOworfQorCit2b2lkIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9hZGRfY2xvc2UoZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKm9wdGlvbmFsX21lc3NhZ2UpIHsKKyAgY2xvc2VfbWVzc2FnZV9kYXRhICpjbWQ7CisgIEdQUl9BU1NFUlQoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKTsKKyAgaWYgKG9wLT5jYW5jZWxfd2l0aF9zdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0sgfHwKKyAgICAgIG9wLT5jbG9zZV93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgeworICAgIGlmIChvcHRpb25hbF9tZXNzYWdlKSB7CisgICAgICBncHJfc2xpY2VfdW5yZWYoKm9wdGlvbmFsX21lc3NhZ2UpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG9wdGlvbmFsX21lc3NhZ2UpIHsKKyAgICBjbWQgPSBncHJfbWFsbG9jKHNpemVvZigqY21kKSk7CisgICAgY21kLT5tZXNzYWdlID0gKm9wdGlvbmFsX21lc3NhZ2U7CisgICAgY21kLT50aGVuX2NhbGwgPSBvcC0+b25fY29tcGxldGU7CisgICAgZ3JwY19jbG9zdXJlX2luaXQoJmNtZC0+Y2xvc3VyZSwgZnJlZV9tZXNzYWdlLCBjbWQpOworICAgIG9wLT5vbl9jb21wbGV0ZSA9ICZjbWQtPmNsb3N1cmU7CisgICAgb3AtPm9wdGlvbmFsX2Nsb3NlX21lc3NhZ2UgPSAmY21kLT5tZXNzYWdlOworICB9CisgIG9wLT5jbG9zZV93aXRoX3N0YXR1cyA9IHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0LmggYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OGNmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX1RSQU5TUE9SVF9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbnRleHQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBncnBjX3RyYW5zcG9ydCBncnBjX3RyYW5zcG9ydDsKKworLyogZ3JwY19zdHJlYW0gZG9lc24ndCBhY3R1YWxseSBleGlzdC4gSXQncyB1c2VkIGFzIGEgdHlwZXNhZmUKKyAgIG9wYXF1ZSBwb2ludGVyIGZvciB3aGF0ZXZlciBkYXRhIHRoZSB0cmFuc3BvcnQgd2FudHMgdG8gdHJhY2sKKyAgIGZvciBhIHN0cmVhbS4gKi8KK3R5cGVkZWYgc3RydWN0IGdycGNfc3RyZWFtIGdycGNfc3RyZWFtOworCisvKiNkZWZpbmUgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcqLworCit0eXBlZGVmIHN0cnVjdCBncnBjX3N0cmVhbV9yZWZjb3VudCB7CisgIGdwcl9yZWZjb3VudCByZWZzOworICBncnBjX2Nsb3N1cmUgZGVzdHJveTsKKyNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRworICBjb25zdCBjaGFyICpvYmplY3RfdHlwZTsKKyNlbmRpZgorfSBncnBjX3N0cmVhbV9yZWZjb3VudDsKKworI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCit2b2lkIGdycGNfc3RyZWFtX3JlZl9pbml0KGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgaW50IGluaXRpYWxfcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdF90eXBlKTsKK3ZvaWQgZ3JwY19zdHJlYW1fcmVmKGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgY29uc3QgY2hhciAqcmVhc29uKTsKK3ZvaWQgZ3JwY19zdHJlYW1fdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKKyNkZWZpbmUgR1JQQ19TVFJFQU1fUkVGX0lOSVQocmMsIGlyLCBjYiwgY2JfYXJnLCBvYmp0eXBlKSBcCisgIGdycGNfc3RyZWFtX3JlZl9pbml0KHJjLCBpciwgY2IsIGNiX2FyZywgb2JqdHlwZSkKKyNlbHNlCit2b2lkIGdycGNfc3RyZWFtX3JlZl9pbml0KGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgaW50IGluaXRpYWxfcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcpOwordm9pZCBncnBjX3N0cmVhbV9yZWYoZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50KTsKK3ZvaWQgZ3JwY19zdHJlYW1fdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCk7CisjZGVmaW5lIEdSUENfU1RSRUFNX1JFRl9JTklUKHJjLCBpciwgY2IsIGNiX2FyZywgb2JqdHlwZSkgXAorICBncnBjX3N0cmVhbV9yZWZfaW5pdChyYywgaXIsIGNiLCBjYl9hcmcpCisjZW5kaWYKKworLyogVHJhbnNwb3J0IHN0cmVhbSBvcDogYSBzZXQgb2Ygb3BlcmF0aW9ucyB0byBwZXJmb3JtIG9uIGEgdHJhbnNwb3J0CisgICBhZ2FpbnN0IGEgc2luZ2xlIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIHsKKyAgLyoqIFNlbmQgaW5pdGlhbCBtZXRhZGF0YSB0byB0aGUgcGVlciwgZnJvbSB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgYmF0Y2guICovCisgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNlbmRfaW5pdGlhbF9tZXRhZGF0YTsKKworICAvKiogU2VuZCB0cmFpbGluZyBtZXRhZGF0YSB0byB0aGUgcGVlciwgZnJvbSB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgYmF0Y2guICovCisgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNlbmRfdHJhaWxpbmdfbWV0YWRhdGE7CisKKyAgLyoqIFNlbmQgbWVzc2FnZSBkYXRhIHRvIHRoZSBwZWVyLCBmcm9tIHRoZSBwcm92aWRlZCBieXRlIHN0cmVhbS4gKi8KKyAgZ3JwY19ieXRlX3N0cmVhbSAqc2VuZF9tZXNzYWdlOworCisgIC8qKiBSZWNlaXZlIGluaXRpYWwgbWV0YWRhdGEgZnJvbSB0aGUgc3RyZWFtLCBpbnRvIHByb3ZpZGVkIG1ldGFkYXRhIGJhdGNoLiAqLworICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7CisgIC8qKiBTaG91bGQgYmUgZW5xdWV1ZWQgd2hlbiBpbml0aWFsIG1ldGFkYXRhIGlzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KKyAgZ3JwY19jbG9zdXJlICpyZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7CisKKyAgLyoqIFJlY2VpdmUgbWVzc2FnZSBkYXRhIGZyb20gdGhlIHN0cmVhbSwgaW50byBwcm92aWRlZCBieXRlIHN0cmVhbS4gKi8KKyAgZ3JwY19ieXRlX3N0cmVhbSAqKnJlY3ZfbWVzc2FnZTsKKyAgLyoqIFNob3VsZCBiZSBlbnF1ZXVlZCB3aGVuIG9uZSBtZXNzYWdlIGlzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KKyAgZ3JwY19jbG9zdXJlICpyZWN2X21lc3NhZ2VfcmVhZHk7CisKKyAgLyoqIFJlY2VpdmUgdHJhaWxpbmcgbWV0YWRhdGEgZnJvbSB0aGUgc3RyZWFtLCBpbnRvIHByb3ZpZGVkIG1ldGFkYXRhIGJhdGNoLgorICAgKi8KKyAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl90cmFpbGluZ19tZXRhZGF0YTsKKworICAvKiogU2hvdWxkIGJlIGVucXVldWVkIHdoZW4gYWxsIHJlcXVlc3RlZCBvcGVyYXRpb25zIChleGNsdWRpbmcgcmVjdl9tZXNzYWdlCisgICAgICBhbmQgcmVjdl9pbml0aWFsX21ldGFkYXRhIHdoaWNoIGhhdmUgdGhlaXIgb3duIGNsb3N1cmVzKSBpbiBhIGdpdmVuIGJhdGNoCisgICAgICBoYXZlIGJlZW4gY29tcGxldGVkLiAqLworICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlOworCisgIC8qKiBJZiAhPSBHUlBDX1NUQVRVU19PSywgY2FuY2VsIHRoaXMgc3RyZWFtICovCisgIGdycGNfc3RhdHVzX2NvZGUgY2FuY2VsX3dpdGhfc3RhdHVzOworCisgIC8qKiBJZiAhPSBHUlBDX1NUQVRVU19PSywgc2VuZCBncnBjLXN0YXR1cywgZ3JwYy1tZXNzYWdlLCBhbmQgY2xvc2UgdGhpcworICAgICAgc3RyZWFtIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KKyAgZ3JwY19zdGF0dXNfY29kZSBjbG9zZV93aXRoX3N0YXR1czsKKyAgZ3ByX3NsaWNlICpvcHRpb25hbF9jbG9zZV9tZXNzYWdlOworCisgIC8qIEluZGV4ZXMgY29ycmVzcG9uZCB0byBncnBjX2NvbnRleHRfaW5kZXggZW51bSB2YWx1ZXMgKi8KKyAgZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudCAqY29udGV4dDsKK30gZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wOworCisvKiogVHJhbnNwb3J0IG9wOiBhIHNldCBvZiBvcGVyYXRpb25zIHRvIHBlcmZvcm0gb24gYSB0cmFuc3BvcnQgYXMgYSB3aG9sZSAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwY190cmFuc3BvcnRfb3AgeworICAvKiogQ2FsbGVkIHdoZW4gcHJvY2Vzc2luZyBvZiB0aGlzIG9wIGlzIGRvbmUuICovCisgIGdycGNfY2xvc3VyZSAqb25fY29uc3VtZWQ7CisgIC8qKiBjb25uZWN0aXZpdHkgbW9uaXRvcmluZyAtIHNldCBjb25uZWN0aXZpdHlfc3RhdGUgdG8gTlVMTCB0byB1bnN1YnNjcmliZSAqLworICBncnBjX2Nsb3N1cmUgKm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2U7CisgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpjb25uZWN0aXZpdHlfc3RhdGU7CisgIC8qKiBzaG91bGQgdGhlIHRyYW5zcG9ydCBiZSBkaXNjb25uZWN0ZWQgKi8KKyAgaW50IGRpc2Nvbm5lY3Q7CisgIC8qKiBzaG91bGQgd2Ugc2VuZCBhIGdvYXdheT8KKyAgICAgIGFmdGVyIGEgZ29hd2F5IGlzIHNlbnQsIG9uY2UgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIGNhbGxzIG9uCisgICAgICB0aGUgdHJhbnNwb3J0LCB0aGUgdHJhbnNwb3J0IHNob3VsZCBkaXNjb25uZWN0ICovCisgIGludCBzZW5kX2dvYXdheTsKKyAgLyoqIHdoYXQgc2hvdWxkIHRoZSBnb2F3YXkgY29udGFpbj8gKi8KKyAgZ3JwY19zdGF0dXNfY29kZSBnb2F3YXlfc3RhdHVzOworICBncHJfc2xpY2UgKmdvYXdheV9tZXNzYWdlOworICAvKiogc2V0IHRoZSBjYWxsYmFjayBmb3IgYWNjZXB0aW5nIG5ldyBzdHJlYW1zOworICAgICAgdGhpcyBpcyBhIHBlcm1hbmVudCBjYWxsYmFjaywgdW5saWtlIHRoZSBvdGhlciBvbmUtc2hvdCBjbG9zdXJlcy4KKyAgICAgIElmIHRydWUsIHRoZSBjYWxsYmFjayBpcyBzZXQgdG8gc2V0X2FjY2VwdF9zdHJlYW1fZm4sIHdpdGggaXRzCisgICAgICB1c2VyX2RhdGEgYXJndW1lbnQgc2V0IHRvIHNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YSAqLworICBib29sIHNldF9hY2NlcHRfc3RyZWFtOworICB2b2lkICgqc2V0X2FjY2VwdF9zdHJlYW1fZm4pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZXJ2ZXJfZGF0YSk7CisgIHZvaWQgKnNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YTsKKyAgLyoqIGFkZCB0aGlzIHRyYW5zcG9ydCB0byBhIHBvbGxzZXQgKi8KKyAgZ3JwY19wb2xsc2V0ICpiaW5kX3BvbGxzZXQ7CisgIC8qKiBhZGQgdGhpcyB0cmFuc3BvcnQgdG8gYSBwb2xsc2V0X3NldCAqLworICBncnBjX3BvbGxzZXRfc2V0ICpiaW5kX3BvbGxzZXRfc2V0OworICAvKiogc2VuZCBhIHBpbmcsIGNhbGwgdGhpcyBiYWNrIGlmIG5vdCBOVUxMICovCisgIGdycGNfY2xvc3VyZSAqc2VuZF9waW5nOworfSBncnBjX3RyYW5zcG9ydF9vcDsKKworLyogUmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBzdG9yZSBhIGdycGNfc3RyZWFtIGZvciB0aGlzCisgICB0cmFuc3BvcnQgKi8KK3NpemVfdCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fc2l6ZShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworLyogSW5pdGlhbGl6ZSB0cmFuc3BvcnQgZGF0YSBmb3IgYSBzdHJlYW0uCisKKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbnkgb3RoZXIgKHRyYW5zcG9ydC1kZWZpbmVkKSB2YWx1ZSBmb3IgZmFpbHVyZS4KKworICAgQXJndW1lbnRzOgorICAgICB0cmFuc3BvcnQgICAtIHRoZSB0cmFuc3BvcnQgb24gd2hpY2ggdG8gY3JlYXRlIHRoaXMgc3RyZWFtCisgICAgIHN0cmVhbSAgICAgIC0gYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIGluaXRpYWxpemUKKyAgICAgc2VydmVyX2RhdGEgLSBlaXRoZXIgTlVMTCBmb3IgYSBjbGllbnQgaW5pdGlhdGVkIHN0cmVhbSwgb3IgYSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgZnJvbSB0aGUgYWNjZXB0X3N0cmVhbSBjYWxsYmFjayBmdW5jdGlvbiAqLworaW50IGdycGNfdHJhbnNwb3J0X2luaXRfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdycGNfc3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKTsKKwordm9pZCBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3JwY19zdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKKworLyogRGVzdHJveSB0cmFuc3BvcnQgZGF0YSBmb3IgYSBzdHJlYW0uCisKKyAgIFJlcXVpcmVzOiBhIHJlY3ZfYmF0Y2ggd2l0aCBmaW5hbF9zdGF0ZSA9PSBHUlBDX1NUUkVBTV9DTE9TRUQgaGFzIGJlZW4KKyAgIHJlY2VpdmVkIGJ5IHRoZSB1cC1sYXllci4gTXVzdCBub3QgYmUgY2FsbGVkIGluIHRoZSBzYW1lIGNhbGwgc3RhY2sgYXMKKyAgIHJlY3ZfZnJhbWUuCisKKyAgIEFyZ3VtZW50czoKKyAgICAgdHJhbnNwb3J0IC0gdGhlIHRyYW5zcG9ydCBvbiB3aGljaCB0byBjcmVhdGUgdGhpcyBzdHJlYW0KKyAgICAgc3RyZWFtICAgIC0gdGhlIGdycGNfc3RyZWFtIHRvIGRlc3Ryb3kgKG1lbW9yeSBpcyBzdGlsbCBvd25lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgY2FsbGVyLCBidXQgYW55IGNoaWxkIG1lbW9yeSBtdXN0IGJlIGNsZWFuZWQgdXApICovCit2b2lkIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3lfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtKTsKKwordm9pZCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7CisKK3ZvaWQgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2FkZF9jYW5jZWxsYXRpb24oZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpOworCit2b2lkIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9hZGRfY2xvc2UoZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKm9wdGlvbmFsX21lc3NhZ2UpOworCitjaGFyICpncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Bfc3RyaW5nKGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOworCisvKiBTZW5kIGEgYmF0Y2ggb2Ygb3BlcmF0aW9ucyBvbiBhIHRyYW5zcG9ydAorCisgICBUYWtlcyBvd25lcnNoaXAgb2YgYW55IG9iamVjdHMgY29udGFpbmVkIGluIG9wcy4KKworICAgQXJndW1lbnRzOgorICAgICB0cmFuc3BvcnQgLSB0aGUgdHJhbnNwb3J0IG9uIHdoaWNoIHRvIGluaXRpYXRlIHRoZSBzdHJlYW0KKyAgICAgc3RyZWFtICAgIC0gdGhlIHN0cmVhbSBvbiB3aGljaCB0byBzZW5kIHRoZSBvcGVyYXRpb25zLiBUaGlzIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgbm9uLU5VTEwgYW5kIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIHNhbWUgdHJhbnNwb3J0LgorICAgICBvcCAgICAgICAgLSBhIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCBzcGVjaWZ5aW5nIHRoZSBvcCB0byBwZXJmb3JtICovCit2b2lkIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKKwordm9pZCBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKTsKKworLyogU2VuZCBhIHBpbmcgb24gYSB0cmFuc3BvcnQKKworICAgQ2FsbHMgY2Igd2l0aCB1c2VyIGRhdGEgd2hlbiBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiAqLwordm9pZCBncnBjX3RyYW5zcG9ydF9waW5nKGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdycGNfY2xvc3VyZSAqY2IpOworCisvKiBBZHZpc2UgcGVlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb24gdGVybWluYXRpb24uICovCit2b2lkIGdycGNfdHJhbnNwb3J0X2dvYXdheShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBkZWJ1Z19kYXRhKTsKKworLyogQ2xvc2UgYSB0cmFuc3BvcnQuIEFib3J0cyBhbGwgb3BlbiBzdHJlYW1zLiAqLwordm9pZCBncnBjX3RyYW5zcG9ydF9jbG9zZShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworLyogRGVzdHJveSB0aGUgdHJhbnNwb3J0ICovCit2b2lkIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCisvKiBHZXQgdGhlIHRyYW5zcG9ydHMgcGVlciAqLworY2hhciAqZ3JwY190cmFuc3BvcnRfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmggYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmYTVkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaApAQCAtMCwwICsxLDgxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfVFJBTlNQT1JUX1RSQU5TUE9SVF9JTVBMX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9UUkFOU1BPUlRfVFJBTlNQT1JUX0lNUExfSAorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZ3JwY190cmFuc3BvcnRfdnRhYmxlIHsKKyAgLyogTWVtb3J5IHJlcXVpcmVkIGZvciBhIHNpbmdsZSBzdHJlYW0gZWxlbWVudCAtIHRoaXMgaXMgYWxsb2NhdGVkIGJ5IHVwcGVyCisgICAgIGxheWVycyBhbmQgaW5pdGlhbGl6ZWQgYnkgdGhlIHRyYW5zcG9ydCAqLworICBzaXplX3Qgc2l6ZW9mX3N0cmVhbTsgLyogPSBzaXplb2YodHJhbnNwb3J0IHN0cmVhbSkgKi8KKworICAvKiBuYW1lIG9mIHRoaXMgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogaW1wbGVtZW50YXRpb24gb2YgZ3JwY190cmFuc3BvcnRfaW5pdF9zdHJlYW0gKi8KKyAgaW50ICgqaW5pdF9zdHJlYW0pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RyZWFtICpzdHJlYW0sIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKTsKKworICAvKiBpbXBsZW1lbnRhdGlvbiBvZiBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldCAqLworICB2b2lkICgqc2V0X3BvbGxzZXQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQpOworCisgIC8qIGltcGxlbWVudGF0aW9uIG9mIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fc3RyZWFtX29wICovCisgIHZvaWQgKCpwZXJmb3JtX3N0cmVhbV9vcCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RyZWFtICpzdHJlYW0sIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOworCisgIC8qIGltcGxlbWVudGF0aW9uIG9mIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fb3AgKi8KKyAgdm9pZCAoKnBlcmZvcm1fb3ApKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCk7CisKKyAgLyogaW1wbGVtZW50YXRpb24gb2YgZ3JwY190cmFuc3BvcnRfZGVzdHJveV9zdHJlYW0gKi8KKyAgdm9pZCAoKmRlc3Ryb3lfc3RyZWFtKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW0gKnN0cmVhbSk7CisKKyAgLyogaW1wbGVtZW50YXRpb24gb2YgZ3JwY190cmFuc3BvcnRfZGVzdHJveSAqLworICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICpzZWxmKTsKKworICAvKiBpbXBsZW1lbnRhdGlvbiBvZiBncnBjX3RyYW5zcG9ydF9nZXRfcGVlciAqLworICBjaGFyICooKmdldF9wZWVyKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKnNlbGYpOworfSBncnBjX3RyYW5zcG9ydF92dGFibGU7CisKKy8qIGFuIGluc3RhbmNlIG9mIGEgZ3JwYyB0cmFuc3BvcnQgKi8KK3N0cnVjdCBncnBjX3RyYW5zcG9ydCB7CisgIC8qIHBvaW50ZXIgdG8gYSB2dGFibGUgZGVmaW5pbmcgb3BlcmF0aW9ucyBvbiB0aGlzIHRyYW5zcG9ydCAqLworICBjb25zdCBncnBjX3RyYW5zcG9ydF92dGFibGUgKnZ0YWJsZTsKK307CisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1RSQU5TUE9SVF9UUkFOU1BPUlRfSU1QTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyBiL3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYThmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisKKy8qIFRoZXNlIHJvdXRpbmVzIGFyZSBoZXJlIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nIC0gdGhleSBwcm9kdWNlIHN0cmluZworICAgcmVwcmVzZW50YXRpb25zIG9mIHZhcmlvdXMgdHJhbnNwb3J0IGRhdGEgc3RydWN0dXJlcyAqLworCitzdGF0aWMgdm9pZCBwdXRfbWV0YWRhdGEoZ3ByX3N0cnZlYyAqYiwgZ3JwY19tZGVsZW0gKm1kKSB7CisgIGdwcl9zdHJ2ZWNfYWRkKGIsIGdwcl9zdHJkdXAoImtleT0iKSk7CisgIGdwcl9zdHJ2ZWNfYWRkKGIsCisgICAgICAgICAgICAgICAgIGdwcl9kdW1wX3NsaWNlKG1kLT5rZXktPnNsaWNlLCBHUFJfRFVNUF9IRVggfCBHUFJfRFVNUF9BU0NJSSkpOworCisgIGdwcl9zdHJ2ZWNfYWRkKGIsIGdwcl9zdHJkdXAoIiB2YWx1ZT0iKSk7CisgIGdwcl9zdHJ2ZWNfYWRkKAorICAgICAgYiwgZ3ByX2R1bXBfc2xpY2UobWQtPnZhbHVlLT5zbGljZSwgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpKTsKK30KKworc3RhdGljIHZvaWQgcHV0X21ldGFkYXRhX2xpc3QoZ3ByX3N0cnZlYyAqYiwgZ3JwY19tZXRhZGF0YV9iYXRjaCBtZCkgeworICBncnBjX2xpbmtlZF9tZGVsZW0gKm07CisgIGZvciAobSA9IG1kLmxpc3QuaGVhZDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkgeworICAgIGlmIChtICE9IG1kLmxpc3QuaGVhZCkgZ3ByX3N0cnZlY19hZGQoYiwgZ3ByX3N0cmR1cCgiLCAiKSk7CisgICAgcHV0X21ldGFkYXRhKGIsIG0tPm1kKTsKKyAgfQorICBpZiAoZ3ByX3RpbWVfY21wKG1kLmRlYWRsaW5lLCBncHJfaW5mX2Z1dHVyZShtZC5kZWFkbGluZS5jbG9ja190eXBlKSkgIT0gMCkgeworICAgIGNoYXIgKnRtcDsKKyAgICBncHJfYXNwcmludGYoJnRtcCwgIiBkZWFkbGluZT0lbGxkLiUwOWQiLCAobG9uZyBsb25nKW1kLmRlYWRsaW5lLnR2X3NlYywKKyAgICAgICAgICAgICAgICAgKGludCltZC5kZWFkbGluZS50dl9uc2VjKTsKKyAgICBncHJfc3RydmVjX2FkZChiLCB0bXApOworICB9Cit9CisKK2NoYXIgKmdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9zdHJpbmcoZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBjaGFyICp0bXA7CisgIGNoYXIgKm91dDsKKyAgaW50IGZpcnN0ID0gMTsKKworICBncHJfc3RydmVjIGI7CisgIGdwcl9zdHJ2ZWNfaW5pdCgmYik7CisKKyAgaWYgKG9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOworICAgIGZpcnN0ID0gMDsKKyAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiU0VORF9JTklUSUFMX01FVEFEQVRBeyIpKTsKKyAgICBwdXRfbWV0YWRhdGFfbGlzdCgmYiwgKm9wLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEpOworICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCJ9IikpOworICB9CisKKyAgaWYgKG9wLT5zZW5kX21lc3NhZ2UgIT0gTlVMTCkgeworICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOworICAgIGZpcnN0ID0gMDsKKyAgICBncHJfYXNwcmludGYoJnRtcCwgIlNFTkRfTUVTU0FHRTpmbGFncz0weCUwOHg6bGVuPSVkIiwKKyAgICAgICAgICAgICAgICAgb3AtPnNlbmRfbWVzc2FnZS0+ZmxhZ3MsIG9wLT5zZW5kX21lc3NhZ2UtPmxlbmd0aCk7CisgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7CisgIH0KKworICBpZiAob3AtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOworICAgIGZpcnN0ID0gMDsKKyAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiU0VORF9UUkFJTElOR19NRVRBREFUQXsiKSk7CisgICAgcHV0X21ldGFkYXRhX2xpc3QoJmIsICpvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSk7CisgICAgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIn0iKSk7CisgIH0KKworICBpZiAob3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgaWYgKCFmaXJzdCkgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIiAiKSk7CisgICAgZmlyc3QgPSAwOworICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCJSRUNWX0lOSVRJQUxfTUVUQURBVEEiKSk7CisgIH0KKworICBpZiAob3AtPnJlY3ZfbWVzc2FnZSAhPSBOVUxMKSB7CisgICAgaWYgKCFmaXJzdCkgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIiAiKSk7CisgICAgZmlyc3QgPSAwOworICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCJSRUNWX01FU1NBR0UiKSk7CisgIH0KKworICBpZiAob3AtPnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGEgIT0gTlVMTCkgeworICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOworICAgIGZpcnN0ID0gMDsKKyAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiUkVDVl9UUkFJTElOR19NRVRBREFUQSIpKTsKKyAgfQorCisgIGlmIChvcC0+Y2FuY2VsX3dpdGhfc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7CisgICAgaWYgKCFmaXJzdCkgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIiAiKSk7CisgICAgZmlyc3QgPSAwOworICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiQ0FOQ0VMOiVkIiwgb3AtPmNhbmNlbF93aXRoX3N0YXR1cyk7CisgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7CisgIH0KKworICBvdXQgPSBncHJfc3RydmVjX2ZsYXR0ZW4oJmIsIE5VTEwpOworICBncHJfc3RydmVjX2Rlc3Ryb3koJmIpOworCisgIHJldHVybiBvdXQ7Cit9CisKK3ZvaWQgZ3JwY19jYWxsX2xvZ19vcChjaGFyICpmaWxlLCBpbnQgbGluZSwgZ3ByX2xvZ19zZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgeworICBjaGFyICpzdHIgPSBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Bfc3RyaW5nKG9wKTsKKyAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBzZXZlcml0eSwgIk9QWyVzOiVwXTogJXMiLCBlbGVtLT5maWx0ZXItPm5hbWUsIGVsZW0sIHN0cik7CisgIGdwcl9mcmVlKHN0cik7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMgYi9zcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4MTJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiCisKKy8qIC0tLSBDb25zdGFudHMuIC0tLSovCisjZGVmaW5lIFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFIDQKKyNkZWZpbmUgVFNJX0ZBS0VfRlJBTUVfSU5JVElBTF9BTExPQ0FURURfU0laRSA2NAorI2RlZmluZSBUU0lfRkFLRV9ERUZBVUxUX0ZSQU1FX1NJWkUgMTYzODQKKworLyogLS0tIFN0cnVjdHVyZSBkZWZpbml0aW9ucy4gLS0tKi8KKworLyogYSBmcmFtZSBpcyBlbmNvZGVkIGxpa2UgdGhpczoKKyAgIHwgc2l6ZSB8ICAgICBkYXRhICAgIHwKKyAgIHdoZXJlIHRoZSBzaXplIGZpZWxkIHZhbHVlIGlzIHRoZSBzaXplIG9mIHRoZSBzaXplIGZpZWxkIHBsdXMgdGhlIHNpemUgb2YKKyAgIHRoZSBkYXRhIGVuY29kZWQgaW4gbGl0dGxlIGVuZGlhbiBvbiA0IGJ5dGVzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgc2l6ZV90IHNpemU7CisgIHNpemVfdCBhbGxvY2F0ZWRfc2l6ZTsKKyAgc2l6ZV90IG9mZnNldDsKKyAgaW50IG5lZWRzX2RyYWluaW5nOworfSB0c2lfZmFrZV9mcmFtZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgVFNJX0ZBS0VfQ0xJRU5UX0lOSVQgPSAwLAorICBUU0lfRkFLRV9TRVJWRVJfSU5JVCA9IDEsCisgIFRTSV9GQUtFX0NMSUVOVF9GSU5JU0hFRCA9IDIsCisgIFRTSV9GQUtFX1NFUlZFUl9GSU5JU0hFRCA9IDMsCisgIFRTSV9GQUtFX0hBTkRTSEFLRV9NRVNTQUdFX01BWCA9IDQKK30gdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdHNpX2hhbmRzaGFrZXIgYmFzZTsKKyAgaW50IGlzX2NsaWVudDsKKyAgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2UgbmV4dF9tZXNzYWdlX3RvX3NlbmQ7CisgIGludCBuZWVkc19pbmNvbWluZ19tZXNzYWdlOworICB0c2lfZmFrZV9mcmFtZSBpbmNvbWluZzsKKyAgdHNpX2Zha2VfZnJhbWUgb3V0Z29pbmc7CisgIHRzaV9yZXN1bHQgcmVzdWx0OworfSB0c2lfZmFrZV9oYW5kc2hha2VyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHRzaV9mcmFtZV9wcm90ZWN0b3IgYmFzZTsKKyAgdHNpX2Zha2VfZnJhbWUgcHJvdGVjdF9mcmFtZTsKKyAgdHNpX2Zha2VfZnJhbWUgdW5wcm90ZWN0X2ZyYW1lOworICBzaXplX3QgbWF4X2ZyYW1lX3NpemU7Cit9IHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvcjsKKworLyogLS0tIFV0aWxzLiAtLS0qLworCitzdGF0aWMgY29uc3QgY2hhciAqdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2Vfc3RyaW5nc1tdID0geworICAgICJDTElFTlRfSU5JVCIsICJTRVJWRVJfSU5JVCIsICJDTElFTlRfRklOSVNIRUQiLCAiU0VSVkVSX0ZJTklTSEVEIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoaW50IG1zZykgeworICBpZiAobXNnIDwgMCB8fCBtc2cgPj0gVFNJX0ZBS0VfSEFORFNIQUtFX01FU1NBR0VfTUFYKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIG1lc3NhZ2UgJWQiLCBtc2cpOworICAgIHJldHVybiAiVU5LTk9XTiI7CisgIH0KKyAgcmV0dXJuIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlX3N0cmluZ3NbbXNnXTsKK30KKworc3RhdGljIHRzaV9yZXN1bHQgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgY29uc3QgY2hhciAqbXNnX3N0cmluZywgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2UgKm1zZykgeworICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZSBpOworICBmb3IgKGkgPSAwOyBpIDwgVFNJX0ZBS0VfSEFORFNIQUtFX01FU1NBR0VfTUFYOyBpKyspIHsKKyAgICBpZiAoc3RybmNtcChtc2dfc3RyaW5nLCB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV9zdHJpbmdzW2ldLAorICAgICAgICAgICAgICAgIHN0cmxlbih0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV9zdHJpbmdzW2ldKSkgPT0gMCkgeworICAgICAgKm1zZyA9IGk7CisgICAgICByZXR1cm4gVFNJX09LOworICAgIH0KKyAgfQorICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgaGFuZHNoYWtlIG1lc3NhZ2UuIik7CisgIHJldHVybiBUU0lfREFUQV9DT1JSVVBURUQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBsb2FkMzJfbGl0dGxlX2VuZGlhbihjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpIHsKKyAgcmV0dXJuICgodWludDMyX3QpKGJ1ZlswXSkgfCAodWludDMyX3QpKGJ1ZlsxXSA8PCA4KSB8CisgICAgICAgICAgKHVpbnQzMl90KShidWZbMl0gPDwgMTYpIHwgKHVpbnQzMl90KShidWZbM10gPDwgMjQpKTsKK30KKworc3RhdGljIHZvaWQgc3RvcmUzMl9saXR0bGVfZW5kaWFuKHVpbnQzMl90IHZhbHVlLCB1bnNpZ25lZCBjaGFyICpidWYpIHsKKyAgYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICBidWZbMF0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlKSYweEZGKTsKK30KKworc3RhdGljIHZvaWQgdHNpX2Zha2VfZnJhbWVfcmVzZXQodHNpX2Zha2VfZnJhbWUgKmZyYW1lLCBpbnQgbmVlZHNfZHJhaW5pbmcpIHsKKyAgZnJhbWUtPm9mZnNldCA9IDA7CisgIGZyYW1lLT5uZWVkc19kcmFpbmluZyA9IG5lZWRzX2RyYWluaW5nOworICBpZiAoIW5lZWRzX2RyYWluaW5nKSBmcmFtZS0+c2l6ZSA9IDA7Cit9CisKKy8qIFJldHVybnMgMSBpZiBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbnQgdHNpX2Zha2VfZnJhbWVfZW5zdXJlX3NpemUodHNpX2Zha2VfZnJhbWUgKmZyYW1lKSB7CisgIGlmIChmcmFtZS0+ZGF0YSA9PSBOVUxMKSB7CisgICAgZnJhbWUtPmFsbG9jYXRlZF9zaXplID0gZnJhbWUtPnNpemU7CisgICAgZnJhbWUtPmRhdGEgPSBtYWxsb2MoZnJhbWUtPmFsbG9jYXRlZF9zaXplKTsKKyAgICBpZiAoZnJhbWUtPmRhdGEgPT0gTlVMTCkgcmV0dXJuIDA7CisgIH0gZWxzZSBpZiAoZnJhbWUtPnNpemUgPiBmcmFtZS0+YWxsb2NhdGVkX3NpemUpIHsKKyAgICB1bnNpZ25lZCBjaGFyICpuZXdfZGF0YSA9IHJlYWxsb2MoZnJhbWUtPmRhdGEsIGZyYW1lLT5zaXplKTsKKyAgICBpZiAobmV3X2RhdGEgPT0gTlVMTCkgeworICAgICAgZnJlZShmcmFtZS0+ZGF0YSk7CisgICAgICBmcmFtZS0+ZGF0YSA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnJhbWUtPmRhdGEgPSBuZXdfZGF0YTsKKyAgICBmcmFtZS0+YWxsb2NhdGVkX3NpemUgPSBmcmFtZS0+c2l6ZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgZnJhbWUtPm5lZWRzX2ZyYW1pbmcgaXMgbm90IDAuICAqLworc3RhdGljIHRzaV9yZXN1bHQgZmlsbF9mcmFtZV9mcm9tX2J5dGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluY29taW5nX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqaW5jb21pbmdfYnl0ZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUpIHsKKyAgc2l6ZV90IGF2YWlsYWJsZV9zaXplID0gKmluY29taW5nX2J5dGVzX3NpemU7CisgIHNpemVfdCB0b19yZWFkX3NpemUgPSAwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlc19jdXJzb3IgPSBpbmNvbWluZ19ieXRlczsKKworICBpZiAoZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICBpZiAoZnJhbWUtPmRhdGEgPT0gTlVMTCkgeworICAgIGZyYW1lLT5hbGxvY2F0ZWRfc2l6ZSA9IFRTSV9GQUtFX0ZSQU1FX0lOSVRJQUxfQUxMT0NBVEVEX1NJWkU7CisgICAgZnJhbWUtPmRhdGEgPSBtYWxsb2MoZnJhbWUtPmFsbG9jYXRlZF9zaXplKTsKKyAgICBpZiAoZnJhbWUtPmRhdGEgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICB9CisKKyAgaWYgKGZyYW1lLT5vZmZzZXQgPCBUU0lfRkFLRV9GUkFNRV9IRUFERVJfU0laRSkgeworICAgIHRvX3JlYWRfc2l6ZSA9IFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFIC0gZnJhbWUtPm9mZnNldDsKKyAgICBpZiAodG9fcmVhZF9zaXplID4gYXZhaWxhYmxlX3NpemUpIHsKKyAgICAgIC8qIEp1c3QgZmlsbCB3aGF0IHdlIGNhbiBhbmQgZXhpdC4gKi8KKyAgICAgIG1lbWNweShmcmFtZS0+ZGF0YSArIGZyYW1lLT5vZmZzZXQsIGJ5dGVzX2N1cnNvciwgYXZhaWxhYmxlX3NpemUpOworICAgICAgYnl0ZXNfY3Vyc29yICs9IGF2YWlsYWJsZV9zaXplOworICAgICAgZnJhbWUtPm9mZnNldCArPSBhdmFpbGFibGVfc2l6ZTsKKyAgICAgICppbmNvbWluZ19ieXRlc19zaXplID0gKHNpemVfdCkoYnl0ZXNfY3Vyc29yIC0gaW5jb21pbmdfYnl0ZXMpOworICAgICAgcmV0dXJuIFRTSV9JTkNPTVBMRVRFX0RBVEE7CisgICAgfQorICAgIG1lbWNweShmcmFtZS0+ZGF0YSArIGZyYW1lLT5vZmZzZXQsIGJ5dGVzX2N1cnNvciwgdG9fcmVhZF9zaXplKTsKKyAgICBieXRlc19jdXJzb3IgKz0gdG9fcmVhZF9zaXplOworICAgIGZyYW1lLT5vZmZzZXQgKz0gdG9fcmVhZF9zaXplOworICAgIGF2YWlsYWJsZV9zaXplIC09IHRvX3JlYWRfc2l6ZTsKKyAgICBmcmFtZS0+c2l6ZSA9IGxvYWQzMl9saXR0bGVfZW5kaWFuKGZyYW1lLT5kYXRhKTsKKyAgICBpZiAoIXRzaV9mYWtlX2ZyYW1lX2Vuc3VyZV9zaXplKGZyYW1lKSkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICB9CisKKyAgdG9fcmVhZF9zaXplID0gZnJhbWUtPnNpemUgLSBmcmFtZS0+b2Zmc2V0OworICBpZiAodG9fcmVhZF9zaXplID4gYXZhaWxhYmxlX3NpemUpIHsKKyAgICBtZW1jcHkoZnJhbWUtPmRhdGEgKyBmcmFtZS0+b2Zmc2V0LCBieXRlc19jdXJzb3IsIGF2YWlsYWJsZV9zaXplKTsKKyAgICBmcmFtZS0+b2Zmc2V0ICs9IGF2YWlsYWJsZV9zaXplOworICAgIGJ5dGVzX2N1cnNvciArPSBhdmFpbGFibGVfc2l6ZTsKKyAgICAqaW5jb21pbmdfYnl0ZXNfc2l6ZSA9IChzaXplX3QpKGJ5dGVzX2N1cnNvciAtIGluY29taW5nX2J5dGVzKTsKKyAgICByZXR1cm4gVFNJX0lOQ09NUExFVEVfREFUQTsKKyAgfQorICBtZW1jcHkoZnJhbWUtPmRhdGEgKyBmcmFtZS0+b2Zmc2V0LCBieXRlc19jdXJzb3IsIHRvX3JlYWRfc2l6ZSk7CisgIGJ5dGVzX2N1cnNvciArPSB0b19yZWFkX3NpemU7CisgICppbmNvbWluZ19ieXRlc19zaXplID0gKHNpemVfdCkoYnl0ZXNfY3Vyc29yIC0gaW5jb21pbmdfYnl0ZXMpOworICB0c2lfZmFrZV9mcmFtZV9yZXNldChmcmFtZSwgMSAvKiBuZWVkc19kcmFpbmluZyAqLyk7CisgIHJldHVybiBUU0lfT0s7Cit9CisKKy8qIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGZyYW1lLT5uZWVkc19mcmFtaW5nIGlzIDAuICAqLworc3RhdGljIHRzaV9yZXN1bHQgZHJhaW5fZnJhbWVfdG9fYnl0ZXModW5zaWduZWQgY2hhciAqb3V0Z29pbmdfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dGdvaW5nX2J5dGVzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUpIHsKKyAgc2l6ZV90IHRvX3dyaXRlX3NpemUgPSBmcmFtZS0+c2l6ZSAtIGZyYW1lLT5vZmZzZXQ7CisgIGlmICghZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICBpZiAoKm91dGdvaW5nX2J5dGVzX3NpemUgPCB0b193cml0ZV9zaXplKSB7CisgICAgbWVtY3B5KG91dGdvaW5nX2J5dGVzLCBmcmFtZS0+ZGF0YSArIGZyYW1lLT5vZmZzZXQsICpvdXRnb2luZ19ieXRlc19zaXplKTsKKyAgICBmcmFtZS0+b2Zmc2V0ICs9ICpvdXRnb2luZ19ieXRlc19zaXplOworICAgIHJldHVybiBUU0lfSU5DT01QTEVURV9EQVRBOworICB9CisgIG1lbWNweShvdXRnb2luZ19ieXRlcywgZnJhbWUtPmRhdGEgKyBmcmFtZS0+b2Zmc2V0LCB0b193cml0ZV9zaXplKTsKKyAgKm91dGdvaW5nX2J5dGVzX3NpemUgPSB0b193cml0ZV9zaXplOworICB0c2lfZmFrZV9mcmFtZV9yZXNldChmcmFtZSwgMCAvKiBuZWVkc19kcmFpbmluZyAqLyk7CisgIHJldHVybiBUU0lfT0s7Cit9CisKK3N0YXRpYyB0c2lfcmVzdWx0IGJ5dGVzX3RvX2ZyYW1lKHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBzaXplX3QgYnl0ZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9mYWtlX2ZyYW1lICpmcmFtZSkgeworICBmcmFtZS0+b2Zmc2V0ID0gMDsKKyAgZnJhbWUtPnNpemUgPSBieXRlc19zaXplICsgVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkU7CisgIGlmICghdHNpX2Zha2VfZnJhbWVfZW5zdXJlX3NpemUoZnJhbWUpKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7CisgIHN0b3JlMzJfbGl0dGxlX2VuZGlhbigodWludDMyX3QpZnJhbWUtPnNpemUsIGZyYW1lLT5kYXRhKTsKKyAgbWVtY3B5KGZyYW1lLT5kYXRhICsgVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkUsIGJ5dGVzLCBieXRlc19zaXplKTsKKyAgdHNpX2Zha2VfZnJhbWVfcmVzZXQoZnJhbWUsIDEgLyogbmVlZHMgZHJhaW5pbmcgKi8pOworICByZXR1cm4gVFNJX09LOworfQorCitzdGF0aWMgdm9pZCB0c2lfZmFrZV9mcmFtZV9kZXN0cnVjdCh0c2lfZmFrZV9mcmFtZSAqZnJhbWUpIHsKKyAgaWYgKGZyYW1lLT5kYXRhICE9IE5VTEwpIGZyZWUoZnJhbWUtPmRhdGEpOworfQorCisvKiAtLS0gdHNpX2ZyYW1lX3Byb3RlY3RvciBtZXRob2RzIGltcGxlbWVudGF0aW9uLiAtLS0qLworCitzdGF0aWMgdHNpX3Jlc3VsdCBmYWtlX3Byb3RlY3Rvcl9wcm90ZWN0KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOworICB1bnNpZ25lZCBjaGFyIGZyYW1lX2hlYWRlcltUU0lfRkFLRV9GUkFNRV9IRUFERVJfU0laRV07CisgIHRzaV9mYWtlX2ZyYW1lICpmcmFtZSA9ICZpbXBsLT5wcm90ZWN0X2ZyYW1lOworICBzaXplX3Qgc2F2ZWRfb3V0cHV0X3NpemUgPSAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZTsKKyAgc2l6ZV90IGRyYWluZWRfc2l6ZSA9IDA7CisgIHNpemVfdCAqbnVtX2J5dGVzX3dyaXR0ZW4gPSBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplOworICAqbnVtX2J5dGVzX3dyaXR0ZW4gPSAwOworCisgIC8qIFRyeSB0byBkcmFpbiBmaXJzdC4gKi8KKyAgaWYgKGZyYW1lLT5uZWVkc19kcmFpbmluZykgeworICAgIGRyYWluZWRfc2l6ZSA9IHNhdmVkX291dHB1dF9zaXplIC0gKm51bV9ieXRlc193cml0dGVuOworICAgIHJlc3VsdCA9CisgICAgICAgIGRyYWluX2ZyYW1lX3RvX2J5dGVzKHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7CisgICAgKm51bV9ieXRlc193cml0dGVuICs9IGRyYWluZWRfc2l6ZTsKKyAgICBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcyArPSBkcmFpbmVkX3NpemU7CisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICAgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgeworICAgICAgICAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9IDA7CisgICAgICAgIHJlc3VsdCA9IFRTSV9PSzsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisKKyAgLyogTm93IHByb2Nlc3MgdGhlIHVucHJvdGVjdGVkX2J5dGVzLiAqLworICBpZiAoZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICBpZiAoZnJhbWUtPnNpemUgPT0gMCkgeworICAgIC8qIE5ldyBmcmFtZSwgY3JlYXRlIGEgaGVhZGVyLiAqLworICAgIHNpemVfdCB3cml0dGVuX2luX2ZyYW1lX3NpemUgPSAwOworICAgIHN0b3JlMzJfbGl0dGxlX2VuZGlhbigodWludDMyX3QpaW1wbC0+bWF4X2ZyYW1lX3NpemUsIGZyYW1lX2hlYWRlcik7CisgICAgd3JpdHRlbl9pbl9mcmFtZV9zaXplID0gVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkU7CisgICAgcmVzdWx0ID0gZmlsbF9mcmFtZV9mcm9tX2J5dGVzKGZyYW1lX2hlYWRlciwgJndyaXR0ZW5faW5fZnJhbWVfc2l6ZSwgZnJhbWUpOworICAgIGlmIChyZXN1bHQgIT0gVFNJX0lOQ09NUExFVEVfREFUQSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJmaWxsX2ZyYW1lX2Zyb21fYnl0ZXMgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisgIHJlc3VsdCA9CisgICAgICBmaWxsX2ZyYW1lX2Zyb21fYnl0ZXModW5wcm90ZWN0ZWRfYnl0ZXMsIHVucHJvdGVjdGVkX2J5dGVzX3NpemUsIGZyYW1lKTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBpZiAocmVzdWx0ID09IFRTSV9JTkNPTVBMRVRFX0RBVEEpIHJlc3VsdCA9IFRTSV9PSzsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyogVHJ5IHRvIGRyYWluIGFnYWluLiAqLworICBpZiAoIWZyYW1lLT5uZWVkc19kcmFpbmluZykgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgaWYgKGZyYW1lLT5vZmZzZXQgIT0gMCkgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgZHJhaW5lZF9zaXplID0gc2F2ZWRfb3V0cHV0X3NpemUgLSAqbnVtX2J5dGVzX3dyaXR0ZW47CisgIHJlc3VsdCA9IGRyYWluX2ZyYW1lX3RvX2J5dGVzKHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7CisgICpudW1fYnl0ZXNfd3JpdHRlbiArPSBkcmFpbmVkX3NpemU7CisgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgcmVzdWx0ID0gVFNJX09LOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdHNpX3Jlc3VsdCBmYWtlX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoKAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAorICAgIHNpemVfdCAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSwgc2l6ZV90ICpzdGlsbF9wZW5kaW5nX3NpemUpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOworICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUgPSAmaW1wbC0+cHJvdGVjdF9mcmFtZTsKKyAgaWYgKCFmcmFtZS0+bmVlZHNfZHJhaW5pbmcpIHsKKyAgICAvKiBDcmVhdGUgYSBzaG9ydCBmcmFtZS4gKi8KKyAgICBmcmFtZS0+c2l6ZSA9IGZyYW1lLT5vZmZzZXQ7CisgICAgZnJhbWUtPm9mZnNldCA9IDA7CisgICAgZnJhbWUtPm5lZWRzX2RyYWluaW5nID0gMTsKKyAgICBzdG9yZTMyX2xpdHRsZV9lbmRpYW4oKHVpbnQzMl90KWZyYW1lLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YSk7IC8qIE92ZXJ3cml0ZSBoZWFkZXIuICovCisgIH0KKyAgcmVzdWx0ID0gZHJhaW5fZnJhbWVfdG9fYnl0ZXMocHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUsIGZyYW1lKTsKKyAgaWYgKHJlc3VsdCA9PSBUU0lfSU5DT01QTEVURV9EQVRBKSByZXN1bHQgPSBUU0lfT0s7CisgICpzdGlsbF9wZW5kaW5nX3NpemUgPSBmcmFtZS0+c2l6ZSAtIGZyYW1lLT5vZmZzZXQ7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB0c2lfcmVzdWx0IGZha2VfcHJvdGVjdG9yX3VucHJvdGVjdCgKKyAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzLAorICAgIHNpemVfdCAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplLCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKKyAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOworICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUgPSAmaW1wbC0+dW5wcm90ZWN0X2ZyYW1lOworICBzaXplX3Qgc2F2ZWRfb3V0cHV0X3NpemUgPSAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZTsKKyAgc2l6ZV90IGRyYWluZWRfc2l6ZSA9IDA7CisgIHNpemVfdCAqbnVtX2J5dGVzX3dyaXR0ZW4gPSB1bnByb3RlY3RlZF9ieXRlc19zaXplOworICAqbnVtX2J5dGVzX3dyaXR0ZW4gPSAwOworCisgIC8qIFRyeSB0byBkcmFpbiBmaXJzdC4gKi8KKyAgaWYgKGZyYW1lLT5uZWVkc19kcmFpbmluZykgeworICAgIC8qIEdvIHBhc3QgdGhlIGhlYWRlciBpZiBuZWVkZWQuICovCisgICAgaWYgKGZyYW1lLT5vZmZzZXQgPT0gMCkgZnJhbWUtPm9mZnNldCA9IFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFOworICAgIGRyYWluZWRfc2l6ZSA9IHNhdmVkX291dHB1dF9zaXplIC0gKm51bV9ieXRlc193cml0dGVuOworICAgIHJlc3VsdCA9IGRyYWluX2ZyYW1lX3RvX2J5dGVzKHVucHJvdGVjdGVkX2J5dGVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7CisgICAgdW5wcm90ZWN0ZWRfYnl0ZXMgKz0gZHJhaW5lZF9zaXplOworICAgICpudW1fYnl0ZXNfd3JpdHRlbiArPSBkcmFpbmVkX3NpemU7CisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICAgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgeworICAgICAgICAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplID0gMDsKKyAgICAgICAgcmVzdWx0ID0gVFNJX09LOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICAvKiBOb3cgcHJvY2VzcyB0aGUgcHJvdGVjdGVkX2J5dGVzLiAqLworICBpZiAoZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICByZXN1bHQgPSBmaWxsX2ZyYW1lX2Zyb21fYnl0ZXMocHJvdGVjdGVkX2ZyYW1lc19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSwgZnJhbWUpOworICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgcmVzdWx0ID0gVFNJX09LOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKiBUcnkgdG8gZHJhaW4gYWdhaW4uICovCisgIGlmICghZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICBpZiAoZnJhbWUtPm9mZnNldCAhPSAwKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICBmcmFtZS0+b2Zmc2V0ID0gVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkU7IC8qIEdvIHBhc3QgdGhlIGhlYWRlci4gKi8KKyAgZHJhaW5lZF9zaXplID0gc2F2ZWRfb3V0cHV0X3NpemUgLSAqbnVtX2J5dGVzX3dyaXR0ZW47CisgIHJlc3VsdCA9IGRyYWluX2ZyYW1lX3RvX2J5dGVzKHVucHJvdGVjdGVkX2J5dGVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7CisgICpudW1fYnl0ZXNfd3JpdHRlbiArPSBkcmFpbmVkX3NpemU7CisgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgcmVzdWx0ID0gVFNJX09LOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBmYWtlX3Byb3RlY3Rvcl9kZXN0cm95KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYpIHsKKyAgdHNpX2Zha2VfZnJhbWVfcHJvdGVjdG9yICppbXBsID0gKHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqKXNlbGY7CisgIHRzaV9mYWtlX2ZyYW1lX2Rlc3RydWN0KCZpbXBsLT5wcm90ZWN0X2ZyYW1lKTsKKyAgdHNpX2Zha2VfZnJhbWVfZGVzdHJ1Y3QoJmltcGwtPnVucHJvdGVjdF9mcmFtZSk7CisgIGZyZWUoc2VsZik7Cit9CisKK3N0YXRpYyBjb25zdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZSBmcmFtZV9wcm90ZWN0b3JfdnRhYmxlID0geworICAgIGZha2VfcHJvdGVjdG9yX3Byb3RlY3QsIGZha2VfcHJvdGVjdG9yX3Byb3RlY3RfZmx1c2gsCisgICAgZmFrZV9wcm90ZWN0b3JfdW5wcm90ZWN0LCBmYWtlX3Byb3RlY3Rvcl9kZXN0cm95LAorfTsKKworLyogLS0tIHRzaV9oYW5kc2hha2VyIG1ldGhvZHMgaW1wbGVtZW50YXRpb24uIC0tLSovCisKK3N0YXRpYyB0c2lfcmVzdWx0IGZha2VfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKAorICAgIHRzaV9oYW5kc2hha2VyICpzZWxmLCB1bnNpZ25lZCBjaGFyICpieXRlcywgc2l6ZV90ICpieXRlc19zaXplKSB7CisgIHRzaV9mYWtlX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX2Zha2VfaGFuZHNoYWtlciAqKXNlbGY7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICBpZiAoaW1wbC0+bmVlZHNfaW5jb21pbmdfbWVzc2FnZSB8fCBpbXBsLT5yZXN1bHQgPT0gVFNJX09LKSB7CisgICAgKmJ5dGVzX3NpemUgPSAwOworICAgIHJldHVybiBUU0lfT0s7CisgIH0KKyAgaWYgKCFpbXBsLT5vdXRnb2luZy5uZWVkc19kcmFpbmluZykgeworICAgIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlIG5leHRfbWVzc2FnZV90b19zZW5kID0KKyAgICAgICAgaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQgKyAyOworICAgIGNvbnN0IGNoYXIgKm1zZ19zdHJpbmcgPQorICAgICAgICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQpOworICAgIHJlc3VsdCA9IGJ5dGVzX3RvX2ZyYW1lKCh1bnNpZ25lZCBjaGFyICopbXNnX3N0cmluZywgc3RybGVuKG1zZ19zdHJpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbXBsLT5vdXRnb2luZyk7CisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7CisgICAgaWYgKG5leHRfbWVzc2FnZV90b19zZW5kID4gVFNJX0ZBS0VfSEFORFNIQUtFX01FU1NBR0VfTUFYKSB7CisgICAgICBuZXh0X21lc3NhZ2VfdG9fc2VuZCA9IFRTSV9GQUtFX0hBTkRTSEFLRV9NRVNTQUdFX01BWDsKKyAgICB9CisgICAgaWYgKHRzaV90cmFjaW5nX2VuYWJsZWQpIHsKKyAgICAgIGdwcl9sb2coR1BSX0lORk8sICIlcyBwcmVwYXJlZCAlcy4iLAorICAgICAgICAgICAgICBpbXBsLT5pc19jbGllbnQgPyAiQ2xpZW50IiA6ICJTZXJ2ZXIiLAorICAgICAgICAgICAgICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQpKTsKKyAgICB9CisgICAgaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQgPSBuZXh0X21lc3NhZ2VfdG9fc2VuZDsKKyAgfQorICByZXN1bHQgPSBkcmFpbl9mcmFtZV90b19ieXRlcyhieXRlcywgYnl0ZXNfc2l6ZSwgJmltcGwtPm91dGdvaW5nKTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7CisgIGlmICghaW1wbC0+aXNfY2xpZW50ICYmCisgICAgICBpbXBsLT5uZXh0X21lc3NhZ2VfdG9fc2VuZCA9PSBUU0lfRkFLRV9IQU5EU0hBS0VfTUVTU0FHRV9NQVgpIHsKKyAgICAvKiBXZSdyZSBkb25lLiAqLworICAgIGlmICh0c2lfdHJhY2luZ19lbmFibGVkKSB7CisgICAgICBncHJfbG9nKEdQUl9JTkZPLCAiU2VydmVyIGlzIGRvbmUuIik7CisgICAgfQorICAgIGltcGwtPnJlc3VsdCA9IFRTSV9PSzsKKyAgfSBlbHNlIHsKKyAgICBpbXBsLT5uZWVkc19pbmNvbWluZ19tZXNzYWdlID0gMTsKKyAgfQorICByZXR1cm4gVFNJX09LOworfQorCitzdGF0aWMgdHNpX3Jlc3VsdCBmYWtlX2hhbmRzaGFrZXJfcHJvY2Vzc19ieXRlc19mcm9tX3BlZXIoCisgICAgdHNpX2hhbmRzaGFrZXIgKnNlbGYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBzaXplX3QgKmJ5dGVzX3NpemUpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIHRzaV9mYWtlX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX2Zha2VfaGFuZHNoYWtlciAqKXNlbGY7CisgIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlIGV4cGVjdGVkX21zZyA9IGltcGwtPm5leHRfbWVzc2FnZV90b19zZW5kIC0gMTsKKyAgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2UgcmVjZWl2ZWRfbXNnOworCisgIGlmICghaW1wbC0+bmVlZHNfaW5jb21pbmdfbWVzc2FnZSB8fCBpbXBsLT5yZXN1bHQgPT0gVFNJX09LKSB7CisgICAgKmJ5dGVzX3NpemUgPSAwOworICAgIHJldHVybiBUU0lfT0s7CisgIH0KKyAgcmVzdWx0ID0gZmlsbF9mcmFtZV9mcm9tX2J5dGVzKGJ5dGVzLCBieXRlc19zaXplLCAmaW1wbC0+aW5jb21pbmcpOworICBpZiAocmVzdWx0ICE9IFRTSV9PSykgcmV0dXJuIHJlc3VsdDsKKworICAvKiBXZSBub3cgaGF2ZSBhIGNvbXBsZXRlIGZyYW1lLiAqLworICByZXN1bHQgPSB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgIChjb25zdCBjaGFyICopaW1wbC0+aW5jb21pbmcuZGF0YSArIFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFLAorICAgICAgJnJlY2VpdmVkX21zZyk7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgaW1wbC0+cmVzdWx0ID0gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKHJlY2VpdmVkX21zZyAhPSBleHBlY3RlZF9tc2cpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgcmVjZWl2ZWQgbWVzc2FnZSAoJXMgaW5zdGVhZCBvZiAlcykiLAorICAgICAgICAgICAgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2VfdG9fc3RyaW5nKHJlY2VpdmVkX21zZyksCisgICAgICAgICAgICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoZXhwZWN0ZWRfbXNnKSk7CisgIH0KKyAgaWYgKHRzaV90cmFjaW5nX2VuYWJsZWQpIHsKKyAgICBncHJfbG9nKEdQUl9JTkZPLCAiJXMgcmVjZWl2ZWQgJXMuIiwgaW1wbC0+aXNfY2xpZW50ID8gIkNsaWVudCIgOiAiU2VydmVyIiwKKyAgICAgICAgICAgIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlX3RvX3N0cmluZyhyZWNlaXZlZF9tc2cpKTsKKyAgfQorICB0c2lfZmFrZV9mcmFtZV9yZXNldCgmaW1wbC0+aW5jb21pbmcsIDAgLyogbmVlZHNfZHJhaW5pbmcgKi8pOworICBpbXBsLT5uZWVkc19pbmNvbWluZ19tZXNzYWdlID0gMDsKKyAgaWYgKGltcGwtPm5leHRfbWVzc2FnZV90b19zZW5kID09IFRTSV9GQUtFX0hBTkRTSEFLRV9NRVNTQUdFX01BWCkgeworICAgIC8qIFdlJ3JlIGRvbmUuICovCisgICAgaWYgKHRzaV90cmFjaW5nX2VuYWJsZWQpIHsKKyAgICAgIGdwcl9sb2coR1BSX0lORk8sICIlcyBpcyBkb25lLiIsIGltcGwtPmlzX2NsaWVudCA/ICJDbGllbnQiIDogIlNlcnZlciIpOworICAgIH0KKyAgICBpbXBsLT5yZXN1bHQgPSBUU0lfT0s7CisgIH0KKyAgcmV0dXJuIFRTSV9PSzsKK30KKworc3RhdGljIHRzaV9yZXN1bHQgZmFrZV9oYW5kc2hha2VyX2dldF9yZXN1bHQodHNpX2hhbmRzaGFrZXIgKnNlbGYpIHsKKyAgdHNpX2Zha2VfaGFuZHNoYWtlciAqaW1wbCA9ICh0c2lfZmFrZV9oYW5kc2hha2VyICopc2VsZjsKKyAgcmV0dXJuIGltcGwtPnJlc3VsdDsKK30KKworc3RhdGljIHRzaV9yZXN1bHQgZmFrZV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgKnBlZXIpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSB0c2lfY29uc3RydWN0X3BlZXIoMSwgcGVlcik7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OworICByZXN1bHQgPSB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5X2Zyb21fY3N0cmluZygKKyAgICAgIFRTSV9DRVJUSUZJQ0FURV9UWVBFX1BFRVJfUFJPUEVSVFksIFRTSV9GQUtFX0NFUlRJRklDQVRFX1RZUEUsCisgICAgICAmcGVlci0+cHJvcGVydGllc1swXSk7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB0c2lfcGVlcl9kZXN0cnVjdChwZWVyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHRzaV9yZXN1bHQgZmFrZV9oYW5kc2hha2VyX2NyZWF0ZV9mcmFtZV9wcm90ZWN0b3IoCisgICAgdHNpX2hhbmRzaGFrZXIgKnNlbGYsIHNpemVfdCAqbWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplLAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKipwcm90ZWN0b3IpIHsKKyAgKnByb3RlY3RvciA9IHRzaV9jcmVhdGVfZmFrZV9wcm90ZWN0b3IobWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplKTsKKyAgaWYgKCpwcm90ZWN0b3IgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICByZXR1cm4gVFNJX09LOworfQorCitzdGF0aWMgdm9pZCBmYWtlX2hhbmRzaGFrZXJfZGVzdHJveSh0c2lfaGFuZHNoYWtlciAqc2VsZikgeworICB0c2lfZmFrZV9oYW5kc2hha2VyICppbXBsID0gKHRzaV9mYWtlX2hhbmRzaGFrZXIgKilzZWxmOworICB0c2lfZmFrZV9mcmFtZV9kZXN0cnVjdCgmaW1wbC0+aW5jb21pbmcpOworICB0c2lfZmFrZV9mcmFtZV9kZXN0cnVjdCgmaW1wbC0+b3V0Z29pbmcpOworICBmcmVlKHNlbGYpOworfQorCitzdGF0aWMgY29uc3QgdHNpX2hhbmRzaGFrZXJfdnRhYmxlIGhhbmRzaGFrZXJfdnRhYmxlID0geworICAgIGZha2VfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyLAorICAgIGZha2VfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlciwKKyAgICBmYWtlX2hhbmRzaGFrZXJfZ2V0X3Jlc3VsdCwKKyAgICBmYWtlX2hhbmRzaGFrZXJfZXh0cmFjdF9wZWVyLAorICAgIGZha2VfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yLAorICAgIGZha2VfaGFuZHNoYWtlcl9kZXN0cm95LAorfTsKKwordHNpX2hhbmRzaGFrZXIgKnRzaV9jcmVhdGVfZmFrZV9oYW5kc2hha2VyKGludCBpc19jbGllbnQpIHsKKyAgdHNpX2Zha2VfaGFuZHNoYWtlciAqaW1wbCA9IGNhbGxvYygxLCBzaXplb2YodHNpX2Zha2VfaGFuZHNoYWtlcikpOworICBpbXBsLT5iYXNlLnZ0YWJsZSA9ICZoYW5kc2hha2VyX3Z0YWJsZTsKKyAgaW1wbC0+aXNfY2xpZW50ID0gaXNfY2xpZW50OworICBpbXBsLT5yZXN1bHQgPSBUU0lfSEFORFNIQUtFX0lOX1BST0dSRVNTOworICBpZiAoaXNfY2xpZW50KSB7CisgICAgaW1wbC0+bmVlZHNfaW5jb21pbmdfbWVzc2FnZSA9IDA7CisgICAgaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQgPSBUU0lfRkFLRV9DTElFTlRfSU5JVDsKKyAgfSBlbHNlIHsKKyAgICBpbXBsLT5uZWVkc19pbmNvbWluZ19tZXNzYWdlID0gMTsKKyAgICBpbXBsLT5uZXh0X21lc3NhZ2VfdG9fc2VuZCA9IFRTSV9GQUtFX1NFUlZFUl9JTklUOworICB9CisgIHJldHVybiAmaW1wbC0+YmFzZTsKK30KKwordHNpX2ZyYW1lX3Byb3RlY3RvciAqdHNpX2NyZWF0ZV9mYWtlX3Byb3RlY3RvcigKKyAgICBzaXplX3QgKm1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSkgeworICB0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKmltcGwgPSBjYWxsb2MoMSwgc2l6ZW9mKHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvcikpOworICBpZiAoaW1wbCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgaW1wbC0+bWF4X2ZyYW1lX3NpemUgPSAobWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFNJX0ZBS0VfREVGQVVMVF9GUkFNRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKm1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZTsKKyAgaW1wbC0+YmFzZS52dGFibGUgPSAmZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZTsKKyAgcmV0dXJuICZpbXBsLT5iYXNlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIGIvc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODdkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBHUlBDX0NPUkVfTElCX1RTSV9GQUtFX1RSQU5TUE9SVF9TRUNVUklUWV9ICisjZGVmaW5lIEdSUENfQ09SRV9MSUJfVFNJX0ZBS0VfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFZhbHVlIGZvciB0aGUgVFNJX0NFUlRJRklDQVRFX1RZUEVfUEVFUl9QUk9QRVJUWSBwcm9wZXJ0eSBmb3IgRkFLRSBjZXJ0cy4gKi8KKyNkZWZpbmUgVFNJX0ZBS0VfQ0VSVElGSUNBVEVfVFlQRSAiRkFLRSIKKworLyogQ3JlYXRlcyBhIGZha2UgaGFuZHNoYWtlciB0aGF0IHdpbGwgY3JlYXRlIGEgZmFrZSBmcmFtZSBwcm90ZWN0b3IuCisKKyAgIE5vIGNyeXB0b2dyYXBoeSBpcyBwZXJmb3JtZWQgaW4gdGhlc2Ugb2JqZWN0cy4gVGhleSBqdXN0IHNpbXVsYXRlIGhhbmRzaGFrZQorICAgbWVzc2FnZXMgZ29pbmcgYmFjayBhbmQgZm9ydGggZm9yIHRoZSBoYW5kc2hha2VyIGFuZCBkbyBzb21lIGZyYW1pbmcgb24KKyAgIGNsZWFydGV4dCBkYXRhIGZvciB0aGUgcHJvdGVjdG9yLiAgKi8KK3RzaV9oYW5kc2hha2VyICp0c2lfY3JlYXRlX2Zha2VfaGFuZHNoYWtlcihpbnQgaXNfY2xpZW50KTsKKworLyogQ3JlYXRlcyBhIHByb3RlY3RvciBkaXJlY3RseSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIGhhbmRzaGFrZSBwaGFzZS4gKi8KK3RzaV9mcmFtZV9wcm90ZWN0b3IgKnRzaV9jcmVhdGVfZmFrZV9wcm90ZWN0b3IoCisgICAgc2l6ZV90ICptYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9UU0lfRkFLRV9UUkFOU1BPUlRfU0VDVVJJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMgYi9zcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDMyMDFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMKQEAgLTAsMCArMSwxNTM2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCisKKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFRPRE8oamJvZXVmKTogcmVmYWN0b3IgaW5ldF9udG9wIGludG8gYSBwb3J0YWJpbGl0eSBoZWFkZXIuICovCisjaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KKyNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+IC8qIEZvciBPUEVOU1NMX2ZyZWUgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIKKworLyogLS0tIENvbnN0YW50cy4gLS0tKi8KKworI2RlZmluZSBUU0lfU1NMX01BWF9QUk9URUNURURfRlJBTUVfU0laRV9VUFBFUl9CT1VORCAxNjM4NAorI2RlZmluZSBUU0lfU1NMX01BWF9QUk9URUNURURfRlJBTUVfU0laRV9MT1dFUl9CT1VORCAxMDI0CisKKy8qIFB1dHRpbmcgYSBtYWNybyBsaWtlIHRoaXMgYW5kIGxpdHRlcmluZyB0aGUgc291cmNlIGZpbGUgd2l0aCAjaWYgaXMgcmVhbGx5CisgICBiYWQgcHJhY3RpY2UuCisgICBUT0RPKGpib2V1Zik6IHJlZmFjdG9yIGFsbCB0aGUgI2lmIC8gI2VuZGlmIGluIGEgc2VwYXJhdGUgbW9kdWxlLiAqLworI2lmbmRlZiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQKKyNkZWZpbmUgVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUIDEKKyNlbmRpZgorCisvKiBUT0RPKGpib2V1Zik6IEkgaGF2ZSBub3QgZm91bmQgYSB3YXkgdG8gZ2V0IHRoaXMgbnVtYmVyIGR5bmFtaWNhbGx5IGZyb20gdGhlCisgICBTU0wgc3RydWN0dXJlLiBUaGlzIGlzIHdoYXQgd2Ugd291bGQgdWx0aW1hdGVseSB3YW50IHRob3VnaC4uLiAqLworI2RlZmluZSBUU0lfU1NMX01BWF9QUk9URUNUSU9OX09WRVJIRUFEIDEwMAorCisvKiAtLS0gU3RydWN0dXJlIGRlZmluaXRpb25zLiAtLS0qLworCitzdHJ1Y3QgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgeworICB0c2lfcmVzdWx0ICgqY3JlYXRlX2hhbmRzaGFrZXIpKHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lX2luZGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX2hhbmRzaGFrZXIgKipoYW5kc2hha2VyKTsKKyAgdm9pZCAoKmRlc3Ryb3kpKHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpzZWxmKTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgYmFzZTsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQ7CisgIHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xfbGlzdDsKKyAgc2l6ZV90IGFscG5fcHJvdG9jb2xfbGlzdF9sZW5ndGg7Cit9IHRzaV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSBiYXNlOworCisgIC8qIFNldmVyYWwgY29udGV4dHMgdG8gc3VwcG9ydCBTTkkuCisgICAgIFRoZSB0c2lfcGVlciBhcnJheSBjb250YWlucyB0aGUgc3ViamVjdCBuYW1lcyBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlcworICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHRzIGF0IHRoZSBzYW1lIGluZGV4LiAgKi8KKyAgU1NMX0NUWCAqKnNzbF9jb250ZXh0czsKKyAgdHNpX3BlZXIgKnNzbF9jb250ZXh0X3g1MDlfc3ViamVjdF9uYW1lczsKKyAgc2l6ZV90IHNzbF9jb250ZXh0X2NvdW50OworICB1bnNpZ25lZCBjaGFyICphbHBuX3Byb3RvY29sX2xpc3Q7CisgIHNpemVfdCBhbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoOworfSB0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3Rvcnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdHNpX2hhbmRzaGFrZXIgYmFzZTsKKyAgU1NMICpzc2w7CisgIEJJTyAqaW50b19zc2w7CisgIEJJTyAqZnJvbV9zc2w7CisgIHRzaV9yZXN1bHQgcmVzdWx0OworfSB0c2lfc3NsX2hhbmRzaGFrZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdHNpX2ZyYW1lX3Byb3RlY3RvciBiYXNlOworICBTU0wgKnNzbDsKKyAgQklPICppbnRvX3NzbDsKKyAgQklPICpmcm9tX3NzbDsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICBzaXplX3QgYnVmZmVyX3NpemU7CisgIHNpemVfdCBidWZmZXJfb2Zmc2V0OworfSB0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvcjsKKworLyogLS0tIExpYnJhcnkgSW5pdGlhbGl6YXRpb24uIC0tLSovCisKK3N0YXRpYyBncHJfb25jZSBpbml0X29wZW5zc2xfb25jZSA9IEdQUl9PTkNFX0lOSVQ7CitzdGF0aWMgZ3ByX211ICpvcGVuc3NsX211dGV4ZXMgPSBOVUxMOworCitzdGF0aWMgdm9pZCBvcGVuc3NsX2xvY2tpbmdfY2IoaW50IG1vZGUsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgeworICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgZ3ByX211X2xvY2soJm9wZW5zc2xfbXV0ZXhlc1t0eXBlXSk7CisgIH0gZWxzZSB7CisgICAgZ3ByX211X3VubG9jaygmb3BlbnNzbF9tdXRleGVzW3R5cGVdKTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvcGVuc3NsX3RocmVhZF9pZF9jYih2b2lkKSB7CisgIHJldHVybiAodW5zaWduZWQgbG9uZylncHJfdGhkX2N1cnJlbnRpZCgpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29wZW5zc2wodm9pZCkgeworICBpbnQgaTsKKyAgaW50IG51bV9sb2NrczsKKyAgU1NMX2xpYnJhcnlfaW5pdCgpOworICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisgIG51bV9sb2NrcyA9IENSWVBUT19udW1fbG9ja3MoKTsKKyAgR1BSX0FTU0VSVChudW1fbG9ja3MgPiAwKTsKKyAgb3BlbnNzbF9tdXRleGVzID0gbWFsbG9jKChzaXplX3QpbnVtX2xvY2tzICogc2l6ZW9mKGdwcl9tdSkpOworICBHUFJfQVNTRVJUKG9wZW5zc2xfbXV0ZXhlcyAhPSBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IENSWVBUT19udW1fbG9ja3MoKTsgaSsrKSB7CisgICAgZ3ByX211X2luaXQoJm9wZW5zc2xfbXV0ZXhlc1tpXSk7CisgIH0KKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKG9wZW5zc2xfbG9ja2luZ19jYik7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2sob3BlbnNzbF90aHJlYWRfaWRfY2IpOworfQorCisvKiAtLS0gU3NsIHV0aWxzLiAtLS0qLworCitzdGF0aWMgY29uc3QgY2hhciAqc3NsX2Vycm9yX3N0cmluZyhpbnQgZXJyb3IpIHsKKyAgc3dpdGNoIChlcnJvcikgeworICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6CisgICAgICByZXR1cm4gIlNTTF9FUlJPUl9OT05FIjsKKyAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgIHJldHVybiAiU1NMX0VSUk9SX1pFUk9fUkVUVVJOIjsKKyAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICByZXR1cm4gIlNTTF9FUlJPUl9XQU5UX1JFQUQiOworICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICByZXR1cm4gIlNTTF9FUlJPUl9XQU5UX1dSSVRFIjsKKyAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1Q6CisgICAgICByZXR1cm4gIlNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QiOworICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfQUNDRVBUOgorICAgICAgcmV0dXJuICJTU0xfRVJST1JfV0FOVF9BQ0NFUFQiOworICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisgICAgICByZXR1cm4gIlNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQIjsKKyAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgcmV0dXJuICJTU0xfRVJST1JfU1lTQ0FMTCI7CisgICAgY2FzZSBTU0xfRVJST1JfU1NMOgorICAgICAgcmV0dXJuICJTU0xfRVJST1JfU1NMIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJVbmtub3duIGVycm9yIjsKKyAgfQorfQorCisvKiBUT0RPKGpib2V1Zik6IFJlbW92ZSB3aGVuIHdlIGFyZSBwYXN0IHRoZSBkZWJ1Z2dpbmcgcGhhc2Ugd2l0aCB0aGlzIGNvZGUuICovCitzdGF0aWMgdm9pZCBzc2xfbG9nX3doZXJlX2luZm8oY29uc3QgU1NMICpzc2wsIGludCB3aGVyZSwgaW50IGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnKSB7CisgIGlmICgod2hlcmUgJiBmbGFnKSAmJiB0c2lfdHJhY2luZ19lbmFibGVkKSB7CisgICAgZ3ByX2xvZyhHUFJfSU5GTywgIiUyMC4yMHMgLSAlMzAuMzBzICAtICU1LjEwcyIsIG1zZywKKyAgICAgICAgICAgIFNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhzc2wpLCBTU0xfc3RhdGVfc3RyaW5nKHNzbCkpOworICB9Cit9CisKKy8qIFVzZWQgZm9yIGRlYnVnZ2luZy4gVE9ETyhqYm9ldWYpOiBSZW1vdmUgd2hlbiBjb2RlIGlzIG1hdHVyZSBlbm91Z2guICovCitzdGF0aWMgdm9pZCBzc2xfaW5mb19jYWxsYmFjayhjb25zdCBTU0wgKnNzbCwgaW50IHdoZXJlLCBpbnQgcmV0KSB7CisgIGlmIChyZXQgPT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAic3NsX2luZm9fY2FsbGJhY2s6IGVycm9yIG9jY3VyZWQuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzc2xfbG9nX3doZXJlX2luZm8oc3NsLCB3aGVyZSwgU1NMX0NCX0xPT1AsICJMT09QIik7CisgIHNzbF9sb2dfd2hlcmVfaW5mbyhzc2wsIHdoZXJlLCBTU0xfQ0JfSEFORFNIQUtFX1NUQVJULCAiSEFORFNIQUtFIFNUQVJUIik7CisgIHNzbF9sb2dfd2hlcmVfaW5mbyhzc2wsIHdoZXJlLCBTU0xfQ0JfSEFORFNIQUtFX0RPTkUsICJIQU5EU0hBS0UgRE9ORSIpOworfQorCisvKiBSZXR1cm5zIDEgaWYgbmFtZSBsb29rcyBsaWtlIGFuIElQIGFkZHJlc3MsIDAgb3RoZXJ3aXNlLgorICAgVGhpcyBpcyBhIHZlcnkgcm91Z2ggaGV1cmlzdGljLCBhbmQgb25seSBoYW5kbGVzIElQdjYgaW4gaGV4YWRlY2ltYWwgZm9ybS4gKi8KK3N0YXRpYyBpbnQgbG9va3NfbGlrZV9pcF9hZGRyZXNzKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCBkb3RfY291bnQgPSAwOworICBzaXplX3QgbnVtX3NpemUgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuKG5hbWUpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSA9PSAnOicpIHsKKyAgICAgIC8qIElQdjYgQWRkcmVzcyBpbiBoZXhhZGVjaW1hbCBmb3JtLCA6IGlzIG5vdCBhbGxvd2VkIGluIEROUyBuYW1lcy4gKi8KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobmFtZVtpXSA+PSAnMCcgJiYgbmFtZVtpXSA8PSAnOScpIHsKKyAgICAgIGlmIChudW1fc2l6ZSA+IDMpIHJldHVybiAwOworICAgICAgbnVtX3NpemUrKzsKKyAgICB9IGVsc2UgaWYgKG5hbWVbaV0gPT0gJy4nKSB7CisgICAgICBpZiAoZG90X2NvdW50ID4gMyB8fCBudW1fc2l6ZSA9PSAwKSByZXR1cm4gMDsKKyAgICAgIGRvdF9jb3VudCsrOworICAgICAgbnVtX3NpemUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKGRvdF9jb3VudCA8IDMgfHwgbnVtX3NpemUgPT0gMCkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvKiBHZXRzIHRoZSBzdWJqZWN0IENOIGZyb20gYW4gWDUwOSBjZXJ0LiAqLworc3RhdGljIHRzaV9yZXN1bHQgc3NsX2dldF94NTA5X2NvbW1vbl9uYW1lKFg1MDkgKmNlcnQsIHVuc2lnbmVkIGNoYXIgKip1dGY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdXRmOF9zaXplKSB7CisgIGludCBjb21tb25fbmFtZV9pbmRleCA9IC0xOworICBYNTA5X05BTUVfRU5UUlkgKmNvbW1vbl9uYW1lX2VudHJ5ID0gTlVMTDsKKyAgQVNOMV9TVFJJTkcgKmNvbW1vbl9uYW1lX2FzbjEgPSBOVUxMOworICBYNTA5X05BTUUgKnN1YmplY3RfbmFtZSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KTsKKyAgaW50IHV0ZjhfcmV0dXJuZWRfc2l6ZSA9IDA7CisgIGlmIChzdWJqZWN0X25hbWUgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBzdWJqZWN0IG5hbWUgZnJvbSBjZXJ0aWZpY2F0ZS4iKTsKKyAgICByZXR1cm4gVFNJX05PVF9GT1VORDsKKyAgfQorICBjb21tb25fbmFtZV9pbmRleCA9CisgICAgICBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChzdWJqZWN0X25hbWUsIE5JRF9jb21tb25OYW1lLCAtMSk7CisgIGlmIChjb21tb25fbmFtZV9pbmRleCA9PSAtMSkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgY29tbW9uIG5hbWUgb2Ygc3ViamVjdCBmcm9tIGNlcnRpZmljYXRlLiIpOworICAgIHJldHVybiBUU0lfTk9UX0ZPVU5EOworICB9CisgIGNvbW1vbl9uYW1lX2VudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShzdWJqZWN0X25hbWUsIGNvbW1vbl9uYW1lX2luZGV4KTsKKyAgaWYgKGNvbW1vbl9uYW1lX2VudHJ5ID09IE5VTEwpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgY29tbW9uIG5hbWUgZW50cnkgZnJvbSBjZXJ0aWZpY2F0ZS4iKTsKKyAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICB9CisgIGNvbW1vbl9uYW1lX2FzbjEgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoY29tbW9uX25hbWVfZW50cnkpOworICBpZiAoY29tbW9uX25hbWVfYXNuMSA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAiQ291bGQgbm90IGdldCBjb21tb24gbmFtZSBlbnRyeSBhc24xIGZyb20gY2VydGlmaWNhdGUuIik7CisgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgfQorICB1dGY4X3JldHVybmVkX3NpemUgPSBBU04xX1NUUklOR190b19VVEY4KHV0ZjgsIGNvbW1vbl9uYW1lX2FzbjEpOworICBpZiAodXRmOF9yZXR1cm5lZF9zaXplIDwgMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGV4dHJhY3QgdXRmOCBmcm9tIGFzbjEgc3RyaW5nLiIpOworICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgfQorICAqdXRmOF9zaXplID0gKHNpemVfdCl1dGY4X3JldHVybmVkX3NpemU7CisgIHJldHVybiBUU0lfT0s7Cit9CisKKy8qIEdldHMgdGhlIHN1YmplY3QgQ04gb2YgYW4gWDUwOSBjZXJ0IGFzIGEgdHNpX3BlZXJfcHJvcGVydHkuICovCitzdGF0aWMgdHNpX3Jlc3VsdCBwZWVyX3Byb3BlcnR5X2Zyb21feDUwOV9jb21tb25fbmFtZSgKKyAgICBYNTA5ICpjZXJ0LCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpIHsKKyAgdW5zaWduZWQgY2hhciAqY29tbW9uX25hbWU7CisgIHNpemVfdCBjb21tb25fbmFtZV9zaXplOworICB0c2lfcmVzdWx0IHJlc3VsdCA9CisgICAgICBzc2xfZ2V0X3g1MDlfY29tbW9uX25hbWUoY2VydCwgJmNvbW1vbl9uYW1lLCAmY29tbW9uX25hbWVfc2l6ZSk7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgaWYgKHJlc3VsdCA9PSBUU0lfTk9UX0ZPVU5EKSB7CisgICAgICBjb21tb25fbmFtZSA9IE5VTEw7CisgICAgICBjb21tb25fbmFtZV9zaXplID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKyAgcmVzdWx0ID0gdHNpX2NvbnN0cnVjdF9zdHJpbmdfcGVlcl9wcm9wZXJ0eSgKKyAgICAgIFRTSV9YNTA5X1NVQkpFQ1RfQ09NTU9OX05BTUVfUEVFUl9QUk9QRVJUWSwKKyAgICAgIGNvbW1vbl9uYW1lID09IE5VTEwgPyAiIiA6IChjb25zdCBjaGFyICopY29tbW9uX25hbWUsIGNvbW1vbl9uYW1lX3NpemUsCisgICAgICBwcm9wZXJ0eSk7CisgIE9QRU5TU0xfZnJlZShjb21tb25fbmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEdldHMgdGhlIFg1MDkgY2VydCBpbiBQRU0gZm9ybWF0IGFzIGEgdHNpX3BlZXJfcHJvcGVydHkuICovCitzdGF0aWMgdHNpX3Jlc3VsdCBhZGRfcGVtX2NlcnRpZmljYXRlKFg1MDkgKmNlcnQsIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSkgeworICBCSU8gKmJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICBpZiAoIVBFTV93cml0ZV9iaW9fWDUwOShiaW8sIGNlcnQpKSB7CisgICAgQklPX2ZyZWUoYmlvKTsKKyAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICB9CisgIGNoYXIgKmNvbnRlbnRzOworICBsb25nIGxlbiA9IEJJT19nZXRfbWVtX2RhdGEoYmlvLCAmY29udGVudHMpOworICBpZiAobGVuIDw9IDApIHsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7CisgIH0KKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5KAorICAgICAgVFNJX1g1MDlfUEVNX0NFUlRfUFJPUEVSVFksIChjb25zdCBjaGFyICopY29udGVudHMsIChzaXplX3QpbGVuLAorICAgICAgcHJvcGVydHkpOworICBCSU9fZnJlZShiaW8pOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBHZXRzIHRoZSBzdWJqZWN0IFNBTnMgZnJvbSBhbiBYNTA5IGNlcnQgYXMgYSB0c2lfcGVlcl9wcm9wZXJ0eS4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IGFkZF9zdWJqZWN0X2FsdF9uYW1lc19wcm9wZXJ0aWVzX3RvX3BlZXIoCisgICAgdHNpX3BlZXIgKnBlZXIsIEdFTkVSQUxfTkFNRVMgKnN1YmplY3RfYWx0X25hbWVzLAorICAgIHNpemVfdCBzdWJqZWN0X2FsdF9uYW1lX2NvdW50KSB7CisgIHNpemVfdCBpOworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKworICAvKiBSZXNldCBmb3IgRE5TIGVudHJpZXMgZmlsdGVyaW5nLiAqLworICBwZWVyLT5wcm9wZXJ0eV9jb3VudCAtPSBzdWJqZWN0X2FsdF9uYW1lX2NvdW50OworCisgIGZvciAoaSA9IDA7IGkgPCBzdWJqZWN0X2FsdF9uYW1lX2NvdW50OyBpKyspIHsKKyAgICBHRU5FUkFMX05BTUUgKnN1YmplY3RfYWx0X25hbWUgPQorICAgICAgICBza19HRU5FUkFMX05BTUVfdmFsdWUoc3ViamVjdF9hbHRfbmFtZXMsIFRTSV9TSVpFX0FTX1NJWkUoaSkpOworICAgIC8qIEZpbHRlciBvdXQgdGhlIG5vbi1kbnMgZW50cmllcyBuYW1lcy4gKi8KKyAgICBpZiAoc3ViamVjdF9hbHRfbmFtZS0+dHlwZSA9PSBHRU5fRE5TKSB7CisgICAgICB1bnNpZ25lZCBjaGFyICpuYW1lID0gTlVMTDsKKyAgICAgIGludCBuYW1lX3NpemU7CisgICAgICBuYW1lX3NpemUgPSBBU04xX1NUUklOR190b19VVEY4KCZuYW1lLCBzdWJqZWN0X2FsdF9uYW1lLT5kLmROU05hbWUpOworICAgICAgaWYgKG5hbWVfc2l6ZSA8IDApIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgZ2V0IHV0ZjggZnJvbSBhc24xIHN0cmluZy4iKTsKKyAgICAgICAgcmVzdWx0ID0gVFNJX0lOVEVSTkFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCA9IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHkoCisgICAgICAgICAgVFNJX1g1MDlfU1VCSkVDVF9BTFRFUk5BVElWRV9OQU1FX1BFRVJfUFJPUEVSVFksIChjb25zdCBjaGFyICopbmFtZSwKKyAgICAgICAgICAoc2l6ZV90KW5hbWVfc2l6ZSwgJnBlZXItPnByb3BlcnRpZXNbcGVlci0+cHJvcGVydHlfY291bnQrK10pOworICAgICAgT1BFTlNTTF9mcmVlKG5hbWUpOworICAgIH0gZWxzZSBpZiAoc3ViamVjdF9hbHRfbmFtZS0+dHlwZSA9PSBHRU5fSVBBREQpIHsKKyAgICAgIGNoYXIgbnRvcF9idWZbSU5FVDZfQUREUlNUUkxFTl07CisgICAgICBpbnQgYWY7CisKKyAgICAgIGlmIChzdWJqZWN0X2FsdF9uYW1lLT5kLmlQQWRkcmVzcy0+bGVuZ3RoID09IDQpIHsKKyAgICAgICAgYWYgPSBBRl9JTkVUOworICAgICAgfSBlbHNlIGlmIChzdWJqZWN0X2FsdF9uYW1lLT5kLmlQQWRkcmVzcy0+bGVuZ3RoID09IDE2KSB7CisgICAgICAgIGFmID0gQUZfSU5FVDY7CisgICAgICB9IGVsc2UgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNBTiBJUCBBZGRyZXNzIGNvbnRhaW5lZCBpbnZhbGlkIElQIik7CisgICAgICAgIHJlc3VsdCA9IFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gaW5ldF9udG9wKGFmLCBzdWJqZWN0X2FsdF9uYW1lLT5kLmlQQWRkcmVzcy0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvcF9idWYsIElORVQ2X0FERFJTVFJMRU4pOworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgSVAgc3RyaW5nIGZyb20gYXNuMSBvY3RldC4iKTsKKyAgICAgICAgcmVzdWx0ID0gVFNJX0lOVEVSTkFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gdHNpX2NvbnN0cnVjdF9zdHJpbmdfcGVlcl9wcm9wZXJ0eV9mcm9tX2NzdHJpbmcoCisgICAgICAgICAgVFNJX1g1MDlfU1VCSkVDVF9BTFRFUk5BVElWRV9OQU1FX1BFRVJfUFJPUEVSVFksIG5hbWUsCisgICAgICAgICAgJnBlZXItPnByb3BlcnRpZXNbcGVlci0+cHJvcGVydHlfY291bnQrK10pOworICAgIH0KKyAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGVlcidzIFg1MDkgY2VydCBhcyBhIHRzaV9wZWVyIG9iamVjdC4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IHBlZXJfZnJvbV94NTA5KFg1MDkgKmNlcnQsIGludCBpbmNsdWRlX2NlcnRpZmljYXRlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfcGVlciAqcGVlcikgeworICAvKiBUT0RPKGpib2V1Zik6IE1heWJlIGFkZCBtb3JlIHByb3BlcnRpZXMuICovCisgIEdFTkVSQUxfTkFNRVMgKnN1YmplY3RfYWx0X25hbWVzID0KKyAgICAgIFg1MDlfZ2V0X2V4dF9kMmkoY2VydCwgTklEX3N1YmplY3RfYWx0X25hbWUsIDAsIDApOworICBpbnQgc3ViamVjdF9hbHRfbmFtZV9jb3VudCA9IChzdWJqZWN0X2FsdF9uYW1lcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChpbnQpc2tfR0VORVJBTF9OQU1FX251bShzdWJqZWN0X2FsdF9uYW1lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICBzaXplX3QgcHJvcGVydHlfY291bnQ7CisgIHRzaV9yZXN1bHQgcmVzdWx0OworICBHUFJfQVNTRVJUKHN1YmplY3RfYWx0X25hbWVfY291bnQgPj0gMCk7CisgIHByb3BlcnR5X2NvdW50ID0gKGluY2x1ZGVfY2VydGlmaWNhdGVfdHlwZSA/IChzaXplX3QpMSA6IDApICsKKyAgICAgICAgICAgICAgICAgICAyIC8qIGNvbW1vbiBuYW1lLCBjZXJ0aWZpY2F0ZSAqLyArCisgICAgICAgICAgICAgICAgICAgKHNpemVfdClzdWJqZWN0X2FsdF9uYW1lX2NvdW50OworICByZXN1bHQgPSB0c2lfY29uc3RydWN0X3BlZXIocHJvcGVydHlfY291bnQsIHBlZXIpOworICBpZiAocmVzdWx0ICE9IFRTSV9PSykgcmV0dXJuIHJlc3VsdDsKKyAgZG8geworICAgIGlmIChpbmNsdWRlX2NlcnRpZmljYXRlX3R5cGUpIHsKKyAgICAgIHJlc3VsdCA9IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHlfZnJvbV9jc3RyaW5nKAorICAgICAgICAgIFRTSV9DRVJUSUZJQ0FURV9UWVBFX1BFRVJfUFJPUEVSVFksIFRTSV9YNTA5X0NFUlRJRklDQVRFX1RZUEUsCisgICAgICAgICAgJnBlZXItPnByb3BlcnRpZXNbMF0pOworICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOworICAgIH0KKyAgICByZXN1bHQgPSBwZWVyX3Byb3BlcnR5X2Zyb21feDUwOV9jb21tb25fbmFtZSgKKyAgICAgICAgY2VydCwgJnBlZXItPnByb3BlcnRpZXNbaW5jbHVkZV9jZXJ0aWZpY2F0ZV90eXBlID8gMSA6IDBdKTsKKyAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7CisKKyAgICByZXN1bHQgPSBhZGRfcGVtX2NlcnRpZmljYXRlKAorICAgICAgICBjZXJ0LCAmcGVlci0+cHJvcGVydGllc1tpbmNsdWRlX2NlcnRpZmljYXRlX3R5cGUgPyAyIDogMV0pOworICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKKworICAgIGlmIChzdWJqZWN0X2FsdF9uYW1lX2NvdW50ICE9IDApIHsKKyAgICAgIHJlc3VsdCA9IGFkZF9zdWJqZWN0X2FsdF9uYW1lc19wcm9wZXJ0aWVzX3RvX3BlZXIoCisgICAgICAgICAgcGVlciwgc3ViamVjdF9hbHRfbmFtZXMsIChzaXplX3Qpc3ViamVjdF9hbHRfbmFtZV9jb3VudCk7CisgICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7CisgICAgfQorICB9IHdoaWxlICgwKTsKKworICBpZiAoc3ViamVjdF9hbHRfbmFtZXMgIT0gTlVMTCkgeworICAgIHNrX0dFTkVSQUxfTkFNRV9wb3BfZnJlZShzdWJqZWN0X2FsdF9uYW1lcywgR0VORVJBTF9OQU1FX2ZyZWUpOworICB9CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB0c2lfcGVlcl9kZXN0cnVjdChwZWVyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogTG9ncyB0aGUgU1NMIGVycm9yIHN0YWNrLiAqLworc3RhdGljIHZvaWQgbG9nX3NzbF9lcnJvcl9zdGFjayh2b2lkKSB7CisgIHVuc2lnbmVkIGxvbmcgZXJyOworICB3aGlsZSAoKGVyciA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgIGNoYXIgZGV0YWlsc1syNTZdOworICAgIEVSUl9lcnJvcl9zdHJpbmdfbigodWludDMyX3QpZXJyLCBkZXRhaWxzLCBzaXplb2YoZGV0YWlscykpOworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMiLCBkZXRhaWxzKTsKKyAgfQorfQorCisvKiBQZXJmb3JtcyBhbiBTU0xfcmVhZCBhbmQgaGFuZGxlIGVycm9ycy4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IGRvX3NzbF9yZWFkKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSkgeworICBpbnQgcmVhZF9mcm9tX3NzbDsKKyAgR1BSX0FTU0VSVCgqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA8PSBJTlRfTUFYKTsKKyAgcmVhZF9mcm9tX3NzbCA9CisgICAgICBTU0xfcmVhZChzc2wsIHVucHJvdGVjdGVkX2J5dGVzLCAoaW50KSp1bnByb3RlY3RlZF9ieXRlc19zaXplKTsKKyAgaWYgKHJlYWRfZnJvbV9zc2wgPT0gMCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiU1NMX3JlYWQgcmV0dXJuZWQgMCB1bmV4cGVjdGVkbHkuIik7CisgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgfQorICBpZiAocmVhZF9mcm9tX3NzbCA8IDApIHsKKyAgICByZWFkX2Zyb21fc3NsID0gU1NMX2dldF9lcnJvcihzc2wsIHJlYWRfZnJvbV9zc2wpOworICAgIHN3aXRjaCAocmVhZF9mcm9tX3NzbCkgeworICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAvKiBXZSBuZWVkIG1vcmUgZGF0YSB0byBmaW5pc2ggdGhlIGZyYW1lLiAqLworICAgICAgICAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBUU0lfT0s7CisgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICBncHJfbG9nKAorICAgICAgICAgICAgR1BSX0VSUk9SLAorICAgICAgICAgICAgIlBlZXIgdHJpZWQgdG8gcmVuZWdvdGlhdGUgU1NMIGNvbm5lY3Rpb24uIFRoaXMgaXMgdW5zdXBwb3J0ZWQuIik7CisgICAgICAgIHJldHVybiBUU0lfVU5JTVBMRU1FTlRFRDsKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3JydXB0aW9uIGRldGVjdGVkLiIpOworICAgICAgICBsb2dfc3NsX2Vycm9yX3N0YWNrKCk7CisgICAgICAgIHJldHVybiBUU0lfREFUQV9DT1JSVVBURUQ7CisgICAgICBkZWZhdWx0OgorICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNTTF9yZWFkIGZhaWxlZCB3aXRoIGVycm9yICVzLiIsCisgICAgICAgICAgICAgICAgc3NsX2Vycm9yX3N0cmluZyhyZWFkX2Zyb21fc3NsKSk7CisgICAgICAgIHJldHVybiBUU0lfUFJPVE9DT0xfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgPSAoc2l6ZV90KXJlYWRfZnJvbV9zc2w7CisgIHJldHVybiBUU0lfT0s7Cit9CisKKy8qIFBlcmZvcm1zIGFuIFNTTF93cml0ZSBhbmQgaGFuZGxlIGVycm9ycy4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IGRvX3NzbF93cml0ZShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqdW5wcm90ZWN0ZWRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKKyAgaW50IHNzbF93cml0ZV9yZXN1bHQ7CisgIEdQUl9BU1NFUlQodW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA8PSBJTlRfTUFYKTsKKyAgc3NsX3dyaXRlX3Jlc3VsdCA9CisgICAgICBTU0xfd3JpdGUoc3NsLCB1bnByb3RlY3RlZF9ieXRlcywgKGludCl1bnByb3RlY3RlZF9ieXRlc19zaXplKTsKKyAgaWYgKHNzbF93cml0ZV9yZXN1bHQgPCAwKSB7CisgICAgc3NsX3dyaXRlX3Jlc3VsdCA9IFNTTF9nZXRfZXJyb3Ioc3NsLCBzc2xfd3JpdGVfcmVzdWx0KTsKKyAgICBpZiAoc3NsX3dyaXRlX3Jlc3VsdCA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwKKyAgICAgICAgICAgICAgIlBlZXIgdHJpZWQgdG8gcmVuZWdvdGlhdGUgU1NMIGNvbm5lY3Rpb24uIFRoaXMgaXMgdW5zdXBwb3J0ZWQuIik7CisgICAgICByZXR1cm4gVFNJX1VOSU1QTEVNRU5URUQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiU1NMX3dyaXRlIGZhaWxlZCB3aXRoIGVycm9yICVzLiIsCisgICAgICAgICAgICAgIHNzbF9lcnJvcl9zdHJpbmcoc3NsX3dyaXRlX3Jlc3VsdCkpOworICAgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRTSV9PSzsKK30KKworLyogTG9hZHMgYW4gaW4tbWVtb3J5IFBFTSBjZXJ0aWZpY2F0ZSBjaGFpbiBpbnRvIHRoZSBTU0wgY29udGV4dC4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IHNzbF9jdHhfdXNlX2NlcnRpZmljYXRlX2NoYWluKAorICAgIFNTTF9DVFggKmNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9jZXJ0X2NoYWluLAorICAgIHNpemVfdCBwZW1fY2VydF9jaGFpbl9zaXplKSB7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICBYNTA5ICpjZXJ0aWZpY2F0ZSA9IE5VTEw7CisgIEJJTyAqcGVtOworICBHUFJfQVNTRVJUKHBlbV9jZXJ0X2NoYWluX3NpemUgPD0gSU5UX01BWCk7CisgIHBlbSA9IEJJT19uZXdfbWVtX2J1Zigodm9pZCAqKXBlbV9jZXJ0X2NoYWluLCAoaW50KXBlbV9jZXJ0X2NoYWluX3NpemUpOworICBpZiAocGVtID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKworICBkbyB7CisgICAgY2VydGlmaWNhdGUgPSBQRU1fcmVhZF9iaW9fWDUwOV9BVVgocGVtLCBOVUxMLCBOVUxMLCAiIik7CisgICAgaWYgKGNlcnRpZmljYXRlID09IE5VTEwpIHsKKyAgICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGUoY29udGV4dCwgY2VydGlmaWNhdGUpKSB7CisgICAgICByZXN1bHQgPSBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAgICAgWDUwOSAqY2VydGlmaWNhdGVfYXV0aG9yaXR5ID0gUEVNX3JlYWRfYmlvX1g1MDkocGVtLCBOVUxMLCBOVUxMLCAiIik7CisgICAgICBpZiAoY2VydGlmaWNhdGVfYXV0aG9yaXR5ID09IE5VTEwpIHsKKyAgICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICAgIGJyZWFrOyAvKiBEb25lIHJlYWRpbmcuICovCisgICAgICB9CisgICAgICBpZiAoIVNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoY29udGV4dCwgY2VydGlmaWNhdGVfYXV0aG9yaXR5KSkgeworICAgICAgICBYNTA5X2ZyZWUoY2VydGlmaWNhdGVfYXV0aG9yaXR5KTsKKyAgICAgICAgcmVzdWx0ID0gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBmcmVlIGNlcnRpZmljYXRlX2F1dGhvcml0eSBhcyBpdHMgb3duZXJzaGlwIGhhcyBiZWVuCisgICAgICAgICB0cmFuc2ZlcmVkIHRvIHRoZSBjb250ZXh0LiBUaGF0IGlzIG5vdCB0aGUgY2FzZSBmb3IgY2VydGlmaWNhdGUgdGhvdWdoLgorICAgICAgICovCisgICAgfQorICB9IHdoaWxlICgwKTsKKworICBpZiAoY2VydGlmaWNhdGUgIT0gTlVMTCkgWDUwOV9mcmVlKGNlcnRpZmljYXRlKTsKKyAgQklPX2ZyZWUocGVtKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogTG9hZHMgYW4gaW4tbWVtb3J5IFBFTSBwcml2YXRlIGtleSBpbnRvIHRoZSBTU0wgY29udGV4dC4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IHNzbF9jdHhfdXNlX3ByaXZhdGVfa2V5KFNTTF9DVFggKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBlbV9rZXlfc2l6ZSkgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgRVZQX1BLRVkgKnByaXZhdGVfa2V5ID0gTlVMTDsKKyAgQklPICpwZW07CisgIEdQUl9BU1NFUlQocGVtX2tleV9zaXplIDw9IElOVF9NQVgpOworICBwZW0gPSBCSU9fbmV3X21lbV9idWYoKHZvaWQgKilwZW1fa2V5LCAoaW50KXBlbV9rZXlfc2l6ZSk7CisgIGlmIChwZW0gPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICBkbyB7CisgICAgcHJpdmF0ZV9rZXkgPSBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShwZW0sIE5VTEwsIE5VTEwsICIiKTsKKyAgICBpZiAocHJpdmF0ZV9rZXkgPT0gTlVMTCkgeworICAgICAgcmVzdWx0ID0gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KGNvbnRleHQsIHByaXZhdGVfa2V5KSkgeworICAgICAgcmVzdWx0ID0gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKDApOworICBpZiAocHJpdmF0ZV9rZXkgIT0gTlVMTCkgRVZQX1BLRVlfZnJlZShwcml2YXRlX2tleSk7CisgIEJJT19mcmVlKHBlbSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIExvYWRzIGluLW1lbW9yeSBQRU0gdmVyaWZpY2F0aW9uIGNlcnRzIGludG8gdGhlIFNTTCBjb250ZXh0IGFuZCBvcHRpb25hbGx5CisgICByZXR1cm5zIHRoZSB2ZXJpZmljYXRpb24gY2VydCBuYW1lcyAocm9vdF9uYW1lcyBjYW4gYmUgTlVMTCkuICovCitzdGF0aWMgdHNpX3Jlc3VsdCBzc2xfY3R4X2xvYWRfdmVyaWZpY2F0aW9uX2NlcnRzKAorICAgIFNTTF9DVFggKmNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9yb290cywgc2l6ZV90IHBlbV9yb290c19zaXplLAorICAgIFNUQUNLX09GKFg1MDlfTkFNRSkgKiAqcm9vdF9uYW1lcykgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgc2l6ZV90IG51bV9yb290cyA9IDA7CisgIFg1MDkgKnJvb3QgPSBOVUxMOworICBYNTA5X05BTUUgKnJvb3RfbmFtZSA9IE5VTEw7CisgIEJJTyAqcGVtOworICBYNTA5X1NUT1JFICpyb290X3N0b3JlOworICBHUFJfQVNTRVJUKHBlbV9yb290c19zaXplIDw9IElOVF9NQVgpOworICBwZW0gPSBCSU9fbmV3X21lbV9idWYoKHZvaWQgKilwZW1fcm9vdHMsIChpbnQpcGVtX3Jvb3RzX3NpemUpOworICByb290X3N0b3JlID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb250ZXh0KTsKKyAgaWYgKHJvb3Rfc3RvcmUgPT0gTlVMTCkgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICBpZiAocGVtID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgaWYgKHJvb3RfbmFtZXMgIT0gTlVMTCkgeworICAgICpyb290X25hbWVzID0gc2tfWDUwOV9OQU1FX25ld19udWxsKCk7CisgICAgaWYgKCpyb290X25hbWVzID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgcm9vdCA9IFBFTV9yZWFkX2Jpb19YNTA5X0FVWChwZW0sIE5VTEwsIE5VTEwsICIiKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIGJyZWFrOyAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIHN0cmVhbS4gKi8KKyAgICB9CisgICAgaWYgKHJvb3RfbmFtZXMgIT0gTlVMTCkgeworICAgICAgcm9vdF9uYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHJvb3QpOworICAgICAgaWYgKHJvb3RfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBuYW1lIGZyb20gcm9vdCBjZXJ0aWZpY2F0ZS4iKTsKKyAgICAgICAgcmVzdWx0ID0gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcm9vdF9uYW1lID0gWDUwOV9OQU1FX2R1cChyb290X25hbWUpOworICAgICAgaWYgKHJvb3RfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNrX1g1MDlfTkFNRV9wdXNoKCpyb290X25hbWVzLCByb290X25hbWUpOworICAgICAgcm9vdF9uYW1lID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFYNTA5X1NUT1JFX2FkZF9jZXJ0KHJvb3Rfc3RvcmUsIHJvb3QpKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBhZGQgcm9vdCBjZXJ0aWZpY2F0ZSB0byBzc2wgY29udGV4dC4iKTsKKyAgICAgIHJlc3VsdCA9IFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBYNTA5X2ZyZWUocm9vdCk7CisgICAgbnVtX3Jvb3RzKys7CisgIH0KKworICBpZiAobnVtX3Jvb3RzID09IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBsb2FkIGFueSByb290IGNlcnRpZmljYXRlLiIpOworICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBpZiAocm9vdCAhPSBOVUxMKSBYNTA5X2ZyZWUocm9vdCk7CisgICAgaWYgKHJvb3RfbmFtZXMgIT0gTlVMTCkgeworICAgICAgc2tfWDUwOV9OQU1FX3BvcF9mcmVlKCpyb290X25hbWVzLCBYNTA5X05BTUVfZnJlZSk7CisgICAgICAqcm9vdF9uYW1lcyA9IE5VTEw7CisgICAgICBpZiAocm9vdF9uYW1lICE9IE5VTEwpIFg1MDlfTkFNRV9mcmVlKHJvb3RfbmFtZSk7CisgICAgfQorICB9CisgIEJJT19mcmVlKHBlbSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFBvcHVsYXRlcyB0aGUgU1NMIGNvbnRleHQgd2l0aCBhIHByaXZhdGUga2V5IGFuZCBhIGNlcnQgY2hhaW4sIGFuZCBzZXRzIHRoZQorICAgY2lwaGVyIGxpc3QgYW5kIHRoZSBlcGhlbWVyYWwgRUNESCBrZXkuICovCitzdGF0aWMgdHNpX3Jlc3VsdCBwb3B1bGF0ZV9zc2xfY29udGV4dCgKKyAgICBTU0xfQ1RYICpjb250ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fcHJpdmF0ZV9rZXksCisgICAgc2l6ZV90IHBlbV9wcml2YXRlX2tleV9zaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fY2VydGlmaWNhdGVfY2hhaW4sCisgICAgc2l6ZV90IHBlbV9jZXJ0aWZpY2F0ZV9jaGFpbl9zaXplLCBjb25zdCBjaGFyICpjaXBoZXJfbGlzdCkgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgaWYgKHBlbV9jZXJ0aWZpY2F0ZV9jaGFpbiAhPSBOVUxMKSB7CisgICAgcmVzdWx0ID0gc3NsX2N0eF91c2VfY2VydGlmaWNhdGVfY2hhaW4oY29udGV4dCwgcGVtX2NlcnRpZmljYXRlX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbV9jZXJ0aWZpY2F0ZV9jaGFpbl9zaXplKTsKKyAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGNlcnQgY2hhaW4gZmlsZS4iKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisgIGlmIChwZW1fcHJpdmF0ZV9rZXkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA9CisgICAgICAgIHNzbF9jdHhfdXNlX3ByaXZhdGVfa2V5KGNvbnRleHQsIHBlbV9wcml2YXRlX2tleSwgcGVtX3ByaXZhdGVfa2V5X3NpemUpOworICAgIGlmIChyZXN1bHQgIT0gVFNJX09LIHx8ICFTU0xfQ1RYX2NoZWNrX3ByaXZhdGVfa2V5KGNvbnRleHQpKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgcHJpdmF0ZSBrZXkuIik7CisgICAgICByZXR1cm4gcmVzdWx0ICE9IFRTSV9PSyA/IHJlc3VsdCA6IFRTSV9JTlZBTElEX0FSR1VNRU5UOworICAgIH0KKyAgfQorICBpZiAoKGNpcGhlcl9saXN0ICE9IE5VTEwpICYmICFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjb250ZXh0LCBjaXBoZXJfbGlzdCkpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgY2lwaGVyIGxpc3Q6ICVzLiIsIGNpcGhlcl9saXN0KTsKKyAgICByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgeworICAgIEVDX0tFWSAqZWNkaCA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShOSURfWDlfNjJfcHJpbWUyNTZ2MSk7CisgICAgaWYgKCFTU0xfQ1RYX3NldF90bXBfZWNkaChjb250ZXh0LCBlY2RoKSkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3Qgc2V0IGVwaGVtZXJhbCBFQ0RIIGtleS4iKTsKKyAgICAgIEVDX0tFWV9mcmVlKGVjZGgpOworICAgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgICB9CisgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfU0lOR0xFX0VDREhfVVNFKTsKKyAgICBFQ19LRVlfZnJlZShlY2RoKTsKKyAgfQorICByZXR1cm4gVFNJX09LOworfQorCisvKiBFeHRyYWN0cyB0aGUgQ04gYW5kIHRoZSBTQU5zIGZyb20gYW4gWDUwOSBjZXJ0IGFzIGEgcGVlciBvYmplY3QuICovCitzdGF0aWMgdHNpX3Jlc3VsdCBleHRyYWN0X3g1MDlfc3ViamVjdF9uYW1lc19mcm9tX3BlbV9jZXJ0KAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9jZXJ0LCBzaXplX3QgcGVtX2NlcnRfc2l6ZSwgdHNpX3BlZXIgKnBlZXIpIHsKKyAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgIFg1MDkgKmNlcnQgPSBOVUxMOworICBCSU8gKnBlbTsKKyAgR1BSX0FTU0VSVChwZW1fY2VydF9zaXplIDw9IElOVF9NQVgpOworICBwZW0gPSBCSU9fbmV3X21lbV9idWYoKHZvaWQgKilwZW1fY2VydCwgKGludClwZW1fY2VydF9zaXplKTsKKyAgaWYgKHBlbSA9PSBOVUxMKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7CisKKyAgY2VydCA9IFBFTV9yZWFkX2Jpb19YNTA5KHBlbSwgTlVMTCwgTlVMTCwgIiIpOworICBpZiAoY2VydCA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGNlcnRpZmljYXRlIik7CisgICAgcmVzdWx0ID0gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gcGVlcl9mcm9tX3g1MDkoY2VydCwgMCwgcGVlcik7CisgIH0KKyAgaWYgKGNlcnQgIT0gTlVMTCkgWDUwOV9mcmVlKGNlcnQpOworICBCSU9fZnJlZShwZW0pOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBCdWlsZHMgdGhlIGFscG4gcHJvdG9jb2wgbmFtZSBsaXN0IGFjY29yZGluZyB0byByZmMgNzMwMS4gKi8KK3N0YXRpYyB0c2lfcmVzdWx0IGJ1aWxkX2FscG5fcHJvdG9jb2xfbmFtZV9saXN0KAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphbHBuX3Byb3RvY29scywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphbHBuX3Byb3RvY29sc19sZW5ndGhzLCB1aW50MTZfdCBudW1fYWxwbl9wcm90b2NvbHMsCisgICAgdW5zaWduZWQgY2hhciAqKnByb3RvY29sX25hbWVfbGlzdCwgc2l6ZV90ICpwcm90b2NvbF9uYW1lX2xpc3RfbGVuZ3RoKSB7CisgIHVpbnQxNl90IGk7CisgIHVuc2lnbmVkIGNoYXIgKmN1cnJlbnQ7CisgICpwcm90b2NvbF9uYW1lX2xpc3QgPSBOVUxMOworICAqcHJvdG9jb2xfbmFtZV9saXN0X2xlbmd0aCA9IDA7CisgIGlmIChudW1fYWxwbl9wcm90b2NvbHMgPT0gMCkgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FscG5fcHJvdG9jb2xzOyBpKyspIHsKKyAgICBpZiAoYWxwbl9wcm90b2NvbHNfbGVuZ3Roc1tpXSA9PSAwKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgMC1sZW5ndGggcHJvdG9jb2wgbmFtZS4iKTsKKyAgICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICB9CisgICAgKnByb3RvY29sX25hbWVfbGlzdF9sZW5ndGggKz0gKHNpemVfdClhbHBuX3Byb3RvY29sc19sZW5ndGhzW2ldICsgMTsKKyAgfQorICAqcHJvdG9jb2xfbmFtZV9saXN0ID0gbWFsbG9jKCpwcm90b2NvbF9uYW1lX2xpc3RfbGVuZ3RoKTsKKyAgaWYgKCpwcm90b2NvbF9uYW1lX2xpc3QgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICBjdXJyZW50ID0gKnByb3RvY29sX25hbWVfbGlzdDsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9hbHBuX3Byb3RvY29sczsgaSsrKSB7CisgICAgKihjdXJyZW50KyspID0gYWxwbl9wcm90b2NvbHNfbGVuZ3Roc1tpXTsKKyAgICBtZW1jcHkoY3VycmVudCwgYWxwbl9wcm90b2NvbHNbaV0sIGFscG5fcHJvdG9jb2xzX2xlbmd0aHNbaV0pOworICAgIGN1cnJlbnQgKz0gYWxwbl9wcm90b2NvbHNfbGVuZ3Roc1tpXTsKKyAgfQorICAvKiBTYWZldHkgY2hlY2suICovCisgIGlmICgoY3VycmVudCA8ICpwcm90b2NvbF9uYW1lX2xpc3QpIHx8CisgICAgICAoKHVpbnRwdHJfdCkoY3VycmVudCAtICpwcm90b2NvbF9uYW1lX2xpc3QpICE9CisgICAgICAgKnByb3RvY29sX25hbWVfbGlzdF9sZW5ndGgpKSB7CisgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgfQorICByZXR1cm4gVFNJX09LOworfQorCisvKiAtLS0gdHNpX2ZyYW1lX3Byb3RlY3RvciBtZXRob2RzIGltcGxlbWVudGF0aW9uLiAtLS0qLworCitzdGF0aWMgdHNpX3Jlc3VsdCBzc2xfcHJvdGVjdG9yX3Byb3RlY3QodHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKSB7CisgIHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yICppbXBsID0gKHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yICopc2VsZjsKKyAgaW50IHJlYWRfZnJvbV9zc2w7CisgIHNpemVfdCBhdmFpbGFibGU7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworCisgIC8qIEZpcnN0IHNlZSBpZiB3ZSBoYXZlIHNvbWUgcGVuZGluZyBkYXRhIGluIHRoZSBTU0wgQklPLiAqLworICBpbnQgcGVuZGluZ19pbl9zc2wgPSAoaW50KUJJT19wZW5kaW5nKGltcGwtPmZyb21fc3NsKTsKKyAgaWYgKHBlbmRpbmdfaW5fc3NsID4gMCkgeworICAgICp1bnByb3RlY3RlZF9ieXRlc19zaXplID0gMDsKKyAgICBHUFJfQVNTRVJUKCpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplIDw9IElOVF9NQVgpOworICAgIHJlYWRfZnJvbV9zc2wgPSBCSU9fcmVhZChpbXBsLT5mcm9tX3NzbCwgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpOworICAgIGlmIChyZWFkX2Zyb21fc3NsIDwgMCkgeworICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVhZCBmcm9tIEJJTyBldmVuIHRob3VnaCBzb21lIGRhdGEgaXMgcGVuZGluZyIpOworICAgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgICB9CisgICAgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPSAoc2l6ZV90KXJlYWRfZnJvbV9zc2w7CisgICAgcmV0dXJuIFRTSV9PSzsKKyAgfQorCisgIC8qIE5vdyBzZWUgaWYgd2UgY2FuIHNlbmQgYSBjb21wbGV0ZSBmcmFtZS4gKi8KKyAgYXZhaWxhYmxlID0gaW1wbC0+YnVmZmVyX3NpemUgLSBpbXBsLT5idWZmZXJfb2Zmc2V0OworICBpZiAoYXZhaWxhYmxlID4gKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKKyAgICAvKiBJZiB3ZSBjYW5ub3QsIGp1c3QgY29weSB0aGUgZGF0YSBpbiBvdXIgaW50ZXJuYWwgYnVmZmVyLiAqLworICAgIG1lbWNweShpbXBsLT5idWZmZXIgKyBpbXBsLT5idWZmZXJfb2Zmc2V0LCB1bnByb3RlY3RlZF9ieXRlcywKKyAgICAgICAgICAgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpOworICAgIGltcGwtPmJ1ZmZlcl9vZmZzZXQgKz0gKnVucHJvdGVjdGVkX2J5dGVzX3NpemU7CisgICAgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPSAwOworICAgIHJldHVybiBUU0lfT0s7CisgIH0KKworICAvKiBJZiB3ZSBjYW4sIHByZXBhcmUgdGhlIGJ1ZmZlciwgc2VuZCBpdCB0byBTU0xfd3JpdGUgYW5kIHJlYWQuICovCisgIG1lbWNweShpbXBsLT5idWZmZXIgKyBpbXBsLT5idWZmZXJfb2Zmc2V0LCB1bnByb3RlY3RlZF9ieXRlcywgYXZhaWxhYmxlKTsKKyAgcmVzdWx0ID0gZG9fc3NsX3dyaXRlKGltcGwtPnNzbCwgaW1wbC0+YnVmZmVyLCBpbXBsLT5idWZmZXJfc2l6ZSk7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OworCisgIEdQUl9BU1NFUlQoKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPD0gSU5UX01BWCk7CisgIHJlYWRfZnJvbV9zc2wgPSBCSU9fcmVhZChpbXBsLT5mcm9tX3NzbCwgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKTsKKyAgaWYgKHJlYWRfZnJvbV9zc2wgPCAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgcmVhZCBmcm9tIEJJTyBhZnRlciBTU0xfd3JpdGUuIik7CisgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgfQorICAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSA9IChzaXplX3QpcmVhZF9mcm9tX3NzbDsKKyAgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgPSBhdmFpbGFibGU7CisgIGltcGwtPmJ1ZmZlcl9vZmZzZXQgPSAwOworICByZXR1cm4gVFNJX09LOworfQorCitzdGF0aWMgdHNpX3Jlc3VsdCBzc2xfcHJvdGVjdG9yX3Byb3RlY3RfZmx1c2goCisgICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplLCBzaXplX3QgKnN0aWxsX3BlbmRpbmdfc2l6ZSkgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgdHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKmltcGwgPSAodHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOworICBpbnQgcmVhZF9mcm9tX3NzbCA9IDA7CisgIGludCBwZW5kaW5nOworCisgIGlmIChpbXBsLT5idWZmZXJfb2Zmc2V0ICE9IDApIHsKKyAgICByZXN1bHQgPSBkb19zc2xfd3JpdGUoaW1wbC0+c3NsLCBpbXBsLT5idWZmZXIsIGltcGwtPmJ1ZmZlcl9vZmZzZXQpOworICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OworICAgIGltcGwtPmJ1ZmZlcl9vZmZzZXQgPSAwOworICB9CisKKyAgcGVuZGluZyA9IChpbnQpQklPX3BlbmRpbmcoaW1wbC0+ZnJvbV9zc2wpOworICBHUFJfQVNTRVJUKHBlbmRpbmcgPj0gMCk7CisgICpzdGlsbF9wZW5kaW5nX3NpemUgPSAoc2l6ZV90KXBlbmRpbmc7CisgIGlmICgqc3RpbGxfcGVuZGluZ19zaXplID09IDApIHJldHVybiBUU0lfT0s7CisKKyAgR1BSX0FTU0VSVCgqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSA8PSBJTlRfTUFYKTsKKyAgcmVhZF9mcm9tX3NzbCA9IEJJT19yZWFkKGltcGwtPmZyb21fc3NsLCBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpOworICBpZiAocmVhZF9mcm9tX3NzbCA8PSAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgcmVhZCBmcm9tIEJJTyBhZnRlciBTU0xfd3JpdGUuIik7CisgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgfQorICAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSA9IChzaXplX3QpcmVhZF9mcm9tX3NzbDsKKyAgcGVuZGluZyA9IChpbnQpQklPX3BlbmRpbmcoaW1wbC0+ZnJvbV9zc2wpOworICBHUFJfQVNTRVJUKHBlbmRpbmcgPj0gMCk7CisgICpzdGlsbF9wZW5kaW5nX3NpemUgPSAoc2l6ZV90KXBlbmRpbmc7CisgIHJldHVybiBUU0lfT0s7Cit9CisKK3N0YXRpYyB0c2lfcmVzdWx0IHNzbF9wcm90ZWN0b3JfdW5wcm90ZWN0KAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXMsCisgICAgc2l6ZV90ICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUsIHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAorICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSkgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgaW50IHdyaXR0ZW5faW50b19zc2wgPSAwOworICBzaXplX3Qgb3V0cHV0X2J5dGVzX3NpemUgPSAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZTsKKyAgc2l6ZV90IG91dHB1dF9ieXRlc19vZmZzZXQgPSAwOworICB0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvciAqKXNlbGY7CisKKyAgLyogRmlyc3QsIHRyeSB0byByZWFkIHJlbWFpbmluZyBkYXRhIGZyb20gc3NsLiAqLworICByZXN1bHQgPSBkb19zc2xfcmVhZChpbXBsLT5zc2wsIHVucHJvdGVjdGVkX2J5dGVzLCB1bnByb3RlY3RlZF9ieXRlc19zaXplKTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7CisgIGlmICgqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9PSBvdXRwdXRfYnl0ZXNfc2l6ZSkgeworICAgIC8qIFdlIGhhdmUgcmVhZCBldmVyeXRoaW5nIHdlIGNvdWxkIGFuZCBjYW5ub3QgcHJvY2VzcyBhbnkgbW9yZSBpbnB1dC4gKi8KKyAgICAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplID0gMDsKKyAgICByZXR1cm4gVFNJX09LOworICB9CisgIG91dHB1dF9ieXRlc19vZmZzZXQgPSAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZTsKKyAgdW5wcm90ZWN0ZWRfYnl0ZXMgKz0gb3V0cHV0X2J5dGVzX29mZnNldDsKKyAgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgPSBvdXRwdXRfYnl0ZXNfc2l6ZSAtIG91dHB1dF9ieXRlc19vZmZzZXQ7CisKKyAgLyogVGhlbiwgdHJ5IHRvIHdyaXRlIHNvbWUgZGF0YSB0byBzc2wuICovCisgIEdQUl9BU1NFUlQoKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSA8PSBJTlRfTUFYKTsKKyAgd3JpdHRlbl9pbnRvX3NzbCA9IEJJT193cml0ZShpbXBsLT5pbnRvX3NzbCwgcHJvdGVjdGVkX2ZyYW1lc19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUpOworICBpZiAod3JpdHRlbl9pbnRvX3NzbCA8IDApIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNlbmRpbmcgcHJvdGVjdGVkIGZyYW1lIHRvIHNzbCBmYWlsZWQgd2l0aCAlZCIsCisgICAgICAgICAgICB3cml0dGVuX2ludG9fc3NsKTsKKyAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICB9CisgICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUgPSAoc2l6ZV90KXdyaXR0ZW5faW50b19zc2w7CisKKyAgLyogTm93IHRyeSB0byByZWFkIHNvbWUgZGF0YSBhZ2Fpbi4gKi8KKyAgcmVzdWx0ID0gZG9fc3NsX3JlYWQoaW1wbC0+c3NsLCB1bnByb3RlY3RlZF9ieXRlcywgdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7CisgIGlmIChyZXN1bHQgPT0gVFNJX09LKSB7CisgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIG91dHB1dCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICovCisgICAgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgKz0gb3V0cHV0X2J5dGVzX29mZnNldDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzc2xfcHJvdGVjdG9yX2Rlc3Ryb3kodHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZikgeworICB0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvciAqKXNlbGY7CisgIGlmIChpbXBsLT5idWZmZXIgIT0gTlVMTCkgZnJlZShpbXBsLT5idWZmZXIpOworICBpZiAoaW1wbC0+c3NsICE9IE5VTEwpIFNTTF9mcmVlKGltcGwtPnNzbCk7CisgIGZyZWUoc2VsZik7Cit9CisKK3N0YXRpYyBjb25zdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZSBmcmFtZV9wcm90ZWN0b3JfdnRhYmxlID0geworICAgIHNzbF9wcm90ZWN0b3JfcHJvdGVjdCwgc3NsX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoLCBzc2xfcHJvdGVjdG9yX3VucHJvdGVjdCwKKyAgICBzc2xfcHJvdGVjdG9yX2Rlc3Ryb3ksCit9OworCisvKiAtLS0gdHNpX2hhbmRzaGFrZXIgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbi4gLS0tKi8KKworc3RhdGljIHRzaV9yZXN1bHQgc3NsX2hhbmRzaGFrZXJfZ2V0X2J5dGVzX3RvX3NlbmRfdG9fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNfc2l6ZSkgeworICB0c2lfc3NsX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX3NzbF9oYW5kc2hha2VyICopc2VsZjsKKyAgaW50IGJ5dGVzX3JlYWRfZnJvbV9zc2wgPSAwOworICBpZiAoYnl0ZXMgPT0gTlVMTCB8fCBieXRlc19zaXplID09IE5VTEwgfHwgKmJ5dGVzX3NpemUgPT0gMCB8fAorICAgICAgKmJ5dGVzX3NpemUgPiBJTlRfTUFYKSB7CisgICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIEdQUl9BU1NFUlQoKmJ5dGVzX3NpemUgPD0gSU5UX01BWCk7CisgIGJ5dGVzX3JlYWRfZnJvbV9zc2wgPSBCSU9fcmVhZChpbXBsLT5mcm9tX3NzbCwgYnl0ZXMsIChpbnQpKmJ5dGVzX3NpemUpOworICBpZiAoYnl0ZXNfcmVhZF9mcm9tX3NzbCA8IDApIHsKKyAgICAqYnl0ZXNfc2l6ZSA9IDA7CisgICAgaWYgKCFCSU9fc2hvdWxkX3JldHJ5KGltcGwtPmZyb21fc3NsKSkgeworICAgICAgaW1wbC0+cmVzdWx0ID0gVFNJX0lOVEVSTkFMX0VSUk9SOworICAgICAgcmV0dXJuIGltcGwtPnJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFRTSV9PSzsKKyAgICB9CisgIH0KKyAgKmJ5dGVzX3NpemUgPSAoc2l6ZV90KWJ5dGVzX3JlYWRfZnJvbV9zc2w7CisgIHJldHVybiBCSU9fcGVuZGluZyhpbXBsLT5mcm9tX3NzbCkgPT0gMCA/IFRTSV9PSyA6IFRTSV9JTkNPTVBMRVRFX0RBVEE7Cit9CisKK3N0YXRpYyB0c2lfcmVzdWx0IHNzbF9oYW5kc2hha2VyX2dldF9yZXN1bHQodHNpX2hhbmRzaGFrZXIgKnNlbGYpIHsKKyAgdHNpX3NzbF9oYW5kc2hha2VyICppbXBsID0gKHRzaV9zc2xfaGFuZHNoYWtlciAqKXNlbGY7CisgIGlmICgoaW1wbC0+cmVzdWx0ID09IFRTSV9IQU5EU0hBS0VfSU5fUFJPR1JFU1MpICYmCisgICAgICBTU0xfaXNfaW5pdF9maW5pc2hlZChpbXBsLT5zc2wpKSB7CisgICAgaW1wbC0+cmVzdWx0ID0gVFNJX09LOworICB9CisgIHJldHVybiBpbXBsLT5yZXN1bHQ7Cit9CisKK3N0YXRpYyB0c2lfcmVzdWx0IHNzbF9oYW5kc2hha2VyX3Byb2Nlc3NfYnl0ZXNfZnJvbV9wZWVyKAorICAgIHRzaV9oYW5kc2hha2VyICpzZWxmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgc2l6ZV90ICpieXRlc19zaXplKSB7CisgIHRzaV9zc2xfaGFuZHNoYWtlciAqaW1wbCA9ICh0c2lfc3NsX2hhbmRzaGFrZXIgKilzZWxmOworICBpbnQgYnl0ZXNfd3JpdHRlbl9pbnRvX3NzbF9zaXplID0gMDsKKyAgaWYgKGJ5dGVzID09IE5VTEwgfHwgYnl0ZXNfc2l6ZSA9PSAwIHx8ICpieXRlc19zaXplID4gSU5UX01BWCkgeworICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICBHUFJfQVNTRVJUKCpieXRlc19zaXplIDw9IElOVF9NQVgpOworICBieXRlc193cml0dGVuX2ludG9fc3NsX3NpemUgPQorICAgICAgQklPX3dyaXRlKGltcGwtPmludG9fc3NsLCBieXRlcywgKGludCkqYnl0ZXNfc2l6ZSk7CisgIGlmIChieXRlc193cml0dGVuX2ludG9fc3NsX3NpemUgPCAwKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3Qgd3JpdGUgdG8gbWVtb3J5IEJJTy4iKTsKKyAgICBpbXBsLT5yZXN1bHQgPSBUU0lfSU5URVJOQUxfRVJST1I7CisgICAgcmV0dXJuIGltcGwtPnJlc3VsdDsKKyAgfQorICAqYnl0ZXNfc2l6ZSA9IChzaXplX3QpYnl0ZXNfd3JpdHRlbl9pbnRvX3NzbF9zaXplOworCisgIGlmICghdHNpX2hhbmRzaGFrZXJfaXNfaW5fcHJvZ3Jlc3Moc2VsZikpIHsKKyAgICBpbXBsLT5yZXN1bHQgPSBUU0lfT0s7CisgICAgcmV0dXJuIGltcGwtPnJlc3VsdDsKKyAgfSBlbHNlIHsKKyAgICAvKiBHZXQgcmVhZHkgdG8gZ2V0IHNvbWUgYnl0ZXMgZnJvbSBTU0wuICovCisgICAgaW50IHNzbF9yZXN1bHQgPSBTU0xfZG9faGFuZHNoYWtlKGltcGwtPnNzbCk7CisgICAgc3NsX3Jlc3VsdCA9IFNTTF9nZXRfZXJyb3IoaW1wbC0+c3NsLCBzc2xfcmVzdWx0KTsKKyAgICBzd2l0Y2ggKHNzbF9yZXN1bHQpIHsKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgaWYgKEJJT19wZW5kaW5nKGltcGwtPmZyb21fc3NsKSA9PSAwKSB7CisgICAgICAgICAgLyogV2UgbmVlZCBtb3JlIGRhdGEuICovCisgICAgICAgICAgcmV0dXJuIFRTSV9JTkNPTVBMRVRFX0RBVEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIFRTSV9PSzsKKyAgICAgICAgfQorICAgICAgY2FzZSBTU0xfRVJST1JfTk9ORToKKyAgICAgICAgcmV0dXJuIFRTSV9PSzsKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgY2hhciBlcnJfc3RyWzI1Nl07CisgICAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihFUlJfZ2V0X2Vycm9yKCksIGVycl9zdHIsIHNpemVvZihlcnJfc3RyKSk7CisgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSGFuZHNoYWtlIGZhaWxlZCB3aXRoIGZhdGFsIGVycm9yICVzOiAlcy4iLAorICAgICAgICAgICAgICAgIHNzbF9lcnJvcl9zdHJpbmcoc3NsX3Jlc3VsdCksIGVycl9zdHIpOworICAgICAgICBpbXBsLT5yZXN1bHQgPSBUU0lfUFJPVE9DT0xfRkFJTFVSRTsKKyAgICAgICAgcmV0dXJuIGltcGwtPnJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHRzaV9yZXN1bHQgc3NsX2hhbmRzaGFrZXJfZXh0cmFjdF9wZWVyKHRzaV9oYW5kc2hha2VyICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9wZWVyICpwZWVyKSB7CisgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphbHBuX3NlbGVjdGVkID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGFscG5fc2VsZWN0ZWRfbGVuOworICB0c2lfc3NsX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX3NzbF9oYW5kc2hha2VyICopc2VsZjsKKyAgWDUwOSAqcGVlcl9jZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGltcGwtPnNzbCk7CisgIGlmIChwZWVyX2NlcnQgIT0gTlVMTCkgeworICAgIHJlc3VsdCA9IHBlZXJfZnJvbV94NTA5KHBlZXJfY2VydCwgMSwgcGVlcik7CisgICAgWDUwOV9mcmVlKHBlZXJfY2VydCk7CisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7CisgIH0KKyNpZiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQKKyAgU1NMX2dldDBfYWxwbl9zZWxlY3RlZChpbXBsLT5zc2wsICZhbHBuX3NlbGVjdGVkLCAmYWxwbl9zZWxlY3RlZF9sZW4pOworI2VuZGlmIC8qIFRTSV9PUEVOU1NMX0FMUE5fU1VQUE9SVCAqLworICBpZiAoYWxwbl9zZWxlY3RlZCA9PSBOVUxMKSB7CisgICAgLyogVHJ5IG5wbi4gKi8KKyAgICBTU0xfZ2V0MF9uZXh0X3Byb3RvX25lZ290aWF0ZWQoaW1wbC0+c3NsLCAmYWxwbl9zZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscG5fc2VsZWN0ZWRfbGVuKTsKKyAgfQorICBpZiAoYWxwbl9zZWxlY3RlZCAhPSBOVUxMKSB7CisgICAgc2l6ZV90IGk7CisgICAgdHNpX3BlZXJfcHJvcGVydHkgKm5ld19wcm9wZXJ0aWVzID0KKyAgICAgICAgY2FsbG9jKDEsIHNpemVvZih0c2lfcGVlcl9wcm9wZXJ0eSkgKiAocGVlci0+cHJvcGVydHlfY291bnQgKyAxKSk7CisgICAgaWYgKG5ld19wcm9wZXJ0aWVzID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGVlci0+cHJvcGVydHlfY291bnQ7IGkrKykgeworICAgICAgbmV3X3Byb3BlcnRpZXNbaV0gPSBwZWVyLT5wcm9wZXJ0aWVzW2ldOworICAgIH0KKyAgICByZXN1bHQgPSB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5KAorICAgICAgICBUU0lfU1NMX0FMUE5fU0VMRUNURURfUFJPVE9DT0wsIChjb25zdCBjaGFyICopYWxwbl9zZWxlY3RlZCwKKyAgICAgICAgYWxwbl9zZWxlY3RlZF9sZW4sICZuZXdfcHJvcGVydGllc1twZWVyLT5wcm9wZXJ0eV9jb3VudF0pOworICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgICBmcmVlKG5ld19wcm9wZXJ0aWVzKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmIChwZWVyLT5wcm9wZXJ0aWVzICE9IE5VTEwpIGZyZWUocGVlci0+cHJvcGVydGllcyk7CisgICAgcGVlci0+cHJvcGVydHlfY291bnQrKzsKKyAgICBwZWVyLT5wcm9wZXJ0aWVzID0gbmV3X3Byb3BlcnRpZXM7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHRzaV9yZXN1bHQgc3NsX2hhbmRzaGFrZXJfY3JlYXRlX2ZyYW1lX3Byb3RlY3RvcigKKyAgICB0c2lfaGFuZHNoYWtlciAqc2VsZiwgc2l6ZV90ICptYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplLAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKipwcm90ZWN0b3IpIHsKKyAgc2l6ZV90IGFjdHVhbF9tYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplID0KKyAgICAgIFRTSV9TU0xfTUFYX1BST1RFQ1RFRF9GUkFNRV9TSVpFX1VQUEVSX0JPVU5EOworICB0c2lfc3NsX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX3NzbF9oYW5kc2hha2VyICopc2VsZjsKKyAgdHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKnByb3RlY3Rvcl9pbXBsID0KKyAgICAgIGNhbGxvYygxLCBzaXplb2YodHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IpKTsKKyAgaWYgKHByb3RlY3Rvcl9pbXBsID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7CisgIH0KKworICBpZiAobWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSAhPSBOVUxMKSB7CisgICAgaWYgKCptYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplID4KKyAgICAgICAgVFNJX1NTTF9NQVhfUFJPVEVDVEVEX0ZSQU1FX1NJWkVfVVBQRVJfQk9VTkQpIHsKKyAgICAgICptYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplID0KKyAgICAgICAgICBUU0lfU1NMX01BWF9QUk9URUNURURfRlJBTUVfU0laRV9VUFBFUl9CT1VORDsKKyAgICB9IGVsc2UgaWYgKCptYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplIDwKKyAgICAgICAgICAgICAgIFRTSV9TU0xfTUFYX1BST1RFQ1RFRF9GUkFNRV9TSVpFX0xPV0VSX0JPVU5EKSB7CisgICAgICAqbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSA9CisgICAgICAgICAgVFNJX1NTTF9NQVhfUFJPVEVDVEVEX0ZSQU1FX1NJWkVfTE9XRVJfQk9VTkQ7CisgICAgfQorICAgIGFjdHVhbF9tYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplID0gKm1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemU7CisgIH0KKyAgcHJvdGVjdG9yX2ltcGwtPmJ1ZmZlcl9zaXplID0KKyAgICAgIGFjdHVhbF9tYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplIC0gVFNJX1NTTF9NQVhfUFJPVEVDVElPTl9PVkVSSEVBRDsKKyAgcHJvdGVjdG9yX2ltcGwtPmJ1ZmZlciA9IG1hbGxvYyhwcm90ZWN0b3JfaW1wbC0+YnVmZmVyX3NpemUpOworICBpZiAocHJvdGVjdG9yX2ltcGwtPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgZ3ByX2xvZyhHUFJfRVJST1IsCisgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlZCBidWZmZXIgZm9yIHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yLiIpOworICAgIGZyZWUocHJvdGVjdG9yX2ltcGwpOworICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7CisgIH0KKworICAvKiBUcmFuc2ZlciBvd25lcnNoaXAgb2Ygc3NsIHRvIHRoZSBmcmFtZSBwcm90ZWN0b3IuIEl0IGlzIE9LIGFzIHRoZSBjYWxsZXIKKyAgICogY2Fubm90IGNhbGwgYW55dGhpbmcgZWxzZSBidXQgZGVzdHJveSBvbiB0aGUgaGFuZHNoYWtlciBhZnRlciB0aGlzIGNhbGwuICovCisgIHByb3RlY3Rvcl9pbXBsLT5zc2wgPSBpbXBsLT5zc2w7CisgIGltcGwtPnNzbCA9IE5VTEw7CisgIHByb3RlY3Rvcl9pbXBsLT5pbnRvX3NzbCA9IGltcGwtPmludG9fc3NsOworICBwcm90ZWN0b3JfaW1wbC0+ZnJvbV9zc2wgPSBpbXBsLT5mcm9tX3NzbDsKKworICBwcm90ZWN0b3JfaW1wbC0+YmFzZS52dGFibGUgPSAmZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZTsKKyAgKnByb3RlY3RvciA9ICZwcm90ZWN0b3JfaW1wbC0+YmFzZTsKKyAgcmV0dXJuIFRTSV9PSzsKK30KKworc3RhdGljIHZvaWQgc3NsX2hhbmRzaGFrZXJfZGVzdHJveSh0c2lfaGFuZHNoYWtlciAqc2VsZikgeworICB0c2lfc3NsX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX3NzbF9oYW5kc2hha2VyICopc2VsZjsKKyAgU1NMX2ZyZWUoaW1wbC0+c3NsKTsgLyogVGhlIEJJTyBvYmplY3RzIGFyZSBvd25lZCBieSBzc2wgKi8KKyAgZnJlZShpbXBsKTsKK30KKworc3RhdGljIGNvbnN0IHRzaV9oYW5kc2hha2VyX3Z0YWJsZSBoYW5kc2hha2VyX3Z0YWJsZSA9IHsKKyAgICBzc2xfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyLAorICAgIHNzbF9oYW5kc2hha2VyX3Byb2Nlc3NfYnl0ZXNfZnJvbV9wZWVyLAorICAgIHNzbF9oYW5kc2hha2VyX2dldF9yZXN1bHQsCisgICAgc3NsX2hhbmRzaGFrZXJfZXh0cmFjdF9wZWVyLAorICAgIHNzbF9oYW5kc2hha2VyX2NyZWF0ZV9mcmFtZV9wcm90ZWN0b3IsCisgICAgc3NsX2hhbmRzaGFrZXJfZGVzdHJveSwKK307CisKKy8qIC0tLSB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSBjb21tb24gbWV0aG9kcy4gLS0tICovCisKK3RzaV9yZXN1bHQgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXIoCisgICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYsIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lX2luZGljYXRpb24sCisgICAgdHNpX2hhbmRzaGFrZXIgKipoYW5kc2hha2VyKSB7CisgIGlmIChzZWxmID09IE5VTEwgfHwgaGFuZHNoYWtlciA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIHJldHVybiBzZWxmLT5jcmVhdGVfaGFuZHNoYWtlcihzZWxmLCBzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uLCBoYW5kc2hha2VyKTsKK30KKwordm9pZCB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpzZWxmKSB7CisgIGlmIChzZWxmID09IE5VTEwpIHJldHVybjsKKyAgc2VsZi0+ZGVzdHJveShzZWxmKTsKK30KKworc3RhdGljIHRzaV9yZXN1bHQgY3JlYXRlX3RzaV9zc2xfaGFuZHNoYWtlcihTU0xfQ1RYICpjdHgsIGludCBpc19jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lX2luZGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9oYW5kc2hha2VyICoqaGFuZHNoYWtlcikgeworICBTU0wgKnNzbCA9IFNTTF9uZXcoY3R4KTsKKyAgQklPICppbnRvX3NzbCA9IE5VTEw7CisgIEJJTyAqZnJvbV9zc2wgPSBOVUxMOworICB0c2lfc3NsX2hhbmRzaGFrZXIgKmltcGwgPSBOVUxMOworICAqaGFuZHNoYWtlciA9IE5VTEw7CisgIGlmIChjdHggPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiU1NMIENvbnRleHQgaXMgbnVsbC4gU2hvdWxkIG5ldmVyIGhhcHBlbi4iKTsKKyAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICB9CisgIGlmIChzc2wgPT0gTlVMTCkgeworICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgfQorICBTU0xfc2V0X2luZm9fY2FsbGJhY2soc3NsLCBzc2xfaW5mb19jYWxsYmFjayk7CisKKyAgaW50b19zc2wgPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKKyAgZnJvbV9zc2wgPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKKyAgaWYgKGludG9fc3NsID09IE5VTEwgfHwgZnJvbV9zc2wgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQklPX25ldyBmYWlsZWQuIik7CisgICAgU1NMX2ZyZWUoc3NsKTsKKyAgICBpZiAoaW50b19zc2wgIT0gTlVMTCkgQklPX2ZyZWUoaW50b19zc2wpOworICAgIGlmIChmcm9tX3NzbCAhPSBOVUxMKSBCSU9fZnJlZShpbnRvX3NzbCk7CisgICAgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICB9CisgIFNTTF9zZXRfYmlvKHNzbCwgaW50b19zc2wsIGZyb21fc3NsKTsKKyAgaWYgKGlzX2NsaWVudCkgeworICAgIGludCBzc2xfcmVzdWx0OworICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShzc2wpOworICAgIGlmIChzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uICE9IE5VTEwpIHsKKyAgICAgIGlmICghU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKHNzbCwgc2VydmVyX25hbWVfaW5kaWNhdGlvbikpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHNlcnZlciBuYW1lIGluZGljYXRpb24gJXMuIiwKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uKTsKKyAgICAgICAgU1NMX2ZyZWUoc3NsKTsKKyAgICAgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgc3NsX3Jlc3VsdCA9IFNTTF9kb19oYW5kc2hha2Uoc3NsKTsKKyAgICBzc2xfcmVzdWx0ID0gU1NMX2dldF9lcnJvcihzc2wsIHNzbF9yZXN1bHQpOworICAgIGlmIChzc2xfcmVzdWx0ICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQpIHsKKyAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAorICAgICAgICAgICAgICAiVW5leHBlY3RlZCBlcnJvciByZWNlaXZlZCBmcm9tIGZpcnN0IFNTTF9kb19oYW5kc2hha2UgY2FsbDogJXMiLAorICAgICAgICAgICAgICBzc2xfZXJyb3Jfc3RyaW5nKHNzbF9yZXN1bHQpKTsKKyAgICAgIFNTTF9mcmVlKHNzbCk7CisgICAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBTU0xfc2V0X2FjY2VwdF9zdGF0ZShzc2wpOworICB9CisKKyAgaW1wbCA9IGNhbGxvYygxLCBzaXplb2YodHNpX3NzbF9oYW5kc2hha2VyKSk7CisgIGlmIChpbXBsID09IE5VTEwpIHsKKyAgICBTU0xfZnJlZShzc2wpOworICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgfQorICBpbXBsLT5zc2wgPSBzc2w7CisgIGltcGwtPmludG9fc3NsID0gaW50b19zc2w7CisgIGltcGwtPmZyb21fc3NsID0gZnJvbV9zc2w7CisgIGltcGwtPnJlc3VsdCA9IFRTSV9IQU5EU0hBS0VfSU5fUFJPR1JFU1M7CisgIGltcGwtPmJhc2UudnRhYmxlID0gJmhhbmRzaGFrZXJfdnRhYmxlOworICAqaGFuZHNoYWtlciA9ICZpbXBsLT5iYXNlOworICByZXR1cm4gVFNJX09LOworfQorCitzdGF0aWMgaW50IHNlbGVjdF9wcm90b2NvbF9saXN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKipvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY2xpZW50X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjbGllbnRfbGlzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcnZlcl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VydmVyX2xpc3RfbGVuKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNsaWVudF9jdXJyZW50ID0gY2xpZW50X2xpc3Q7CisgIHdoaWxlICgodW5zaWduZWQgaW50KShjbGllbnRfY3VycmVudCAtIGNsaWVudF9saXN0KSA8IGNsaWVudF9saXN0X2xlbikgeworICAgIHVuc2lnbmVkIGNoYXIgY2xpZW50X2N1cnJlbnRfbGVuID0gKihjbGllbnRfY3VycmVudCsrKTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXJ2ZXJfY3VycmVudCA9IHNlcnZlcl9saXN0OworICAgIHdoaWxlICgoc2VydmVyX2N1cnJlbnQgPj0gc2VydmVyX2xpc3QpICYmCisgICAgICAgICAgICh1aW50cHRyX3QpKHNlcnZlcl9jdXJyZW50IC0gc2VydmVyX2xpc3QpIDwgc2VydmVyX2xpc3RfbGVuKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIHNlcnZlcl9jdXJyZW50X2xlbiA9ICooc2VydmVyX2N1cnJlbnQrKyk7CisgICAgICBpZiAoKGNsaWVudF9jdXJyZW50X2xlbiA9PSBzZXJ2ZXJfY3VycmVudF9sZW4pICYmCisgICAgICAgICAgIW1lbWNtcChjbGllbnRfY3VycmVudCwgc2VydmVyX2N1cnJlbnQsIHNlcnZlcl9jdXJyZW50X2xlbikpIHsKKyAgICAgICAgKm91dCA9IHNlcnZlcl9jdXJyZW50OworICAgICAgICAqb3V0bGVuID0gc2VydmVyX2N1cnJlbnRfbGVuOworICAgICAgICByZXR1cm4gU1NMX1RMU0VYVF9FUlJfT0s7CisgICAgICB9CisgICAgICBzZXJ2ZXJfY3VycmVudCArPSBzZXJ2ZXJfY3VycmVudF9sZW47CisgICAgfQorICAgIGNsaWVudF9jdXJyZW50ICs9IGNsaWVudF9jdXJyZW50X2xlbjsKKyAgfQorICByZXR1cm4gU1NMX1RMU0VYVF9FUlJfTk9BQ0s7Cit9CisKKy8qIC0tLSB0c2lfc3NsX19jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5IG1ldGhvZHMgaW1wbGVtZW50YXRpb24uIC0tLSAqLworCitzdGF0aWMgdHNpX3Jlc3VsdCBzc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeV9jcmVhdGVfaGFuZHNoYWtlcigKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZiwgY29uc3QgY2hhciAqc2VydmVyX25hbWVfaW5kaWNhdGlvbiwKKyAgICB0c2lfaGFuZHNoYWtlciAqKmhhbmRzaGFrZXIpIHsKKyAgdHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0KKyAgICAgICh0c2lfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnkgKilzZWxmOworICByZXR1cm4gY3JlYXRlX3RzaV9zc2xfaGFuZHNoYWtlcihpbXBsLT5zc2xfY29udGV4dCwgMSwgc2VydmVyX25hbWVfaW5kaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koCisgICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYpIHsKKyAgdHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0KKyAgICAgICh0c2lfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnkgKilzZWxmOworICBpZiAoaW1wbC0+c3NsX2NvbnRleHQgIT0gTlVMTCkgU1NMX0NUWF9mcmVlKGltcGwtPnNzbF9jb250ZXh0KTsKKyAgaWYgKGltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCAhPSBOVUxMKSBmcmVlKGltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCk7CisgIGZyZWUoaW1wbCk7Cit9CisKK3N0YXRpYyBpbnQgY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeV9ucG5fY2FsbGJhY2soU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSB7CisgIHRzaV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSAqZmFjdG9yeSA9CisgICAgICAodHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5ICopYXJnOworICByZXR1cm4gc2VsZWN0X3Byb3RvY29sX2xpc3QoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopb3V0LCBvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LT5hbHBuX3Byb3RvY29sX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LT5hbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoLCBpbiwgaW5sZW4pOworfQorCisvKiAtLS0gdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5IG1ldGhvZHMgaW1wbGVtZW50YXRpb24uIC0tLSAqLworCitzdGF0aWMgdHNpX3Jlc3VsdCBzc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9jcmVhdGVfaGFuZHNoYWtlcigKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZiwgY29uc3QgY2hhciAqc2VydmVyX25hbWVfaW5kaWNhdGlvbiwKKyAgICB0c2lfaGFuZHNoYWtlciAqKmhhbmRzaGFrZXIpIHsKKyAgdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0KKyAgICAgICh0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKilzZWxmOworICBpZiAoaW1wbC0+c3NsX2NvbnRleHRfY291bnQgPT0gMCB8fCBzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uICE9IE5VTEwpIHsKKyAgICByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgLyogQ3JlYXRlIHRoZSBoYW5kc2hha2VyIHdpdGggdGhlIGZpcnN0IGNvbnRleHQuIFdlIHdpbGwgc3dpdGNoIGlmIG5lZWRlZAorICAgICBiZWNhdXNlIG9mIFNOSSBpbiBzc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9zZXJ2ZXJuYW1lX2NhbGxiYWNrLiAgKi8KKyAgcmV0dXJuIGNyZWF0ZV90c2lfc3NsX2hhbmRzaGFrZXIoaW1wbC0+c3NsX2NvbnRleHRzWzBdLCAwLCBOVUxMLCBoYW5kc2hha2VyKTsKK30KKworc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveSgKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZikgeworICB0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKmltcGwgPQorICAgICAgKHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSAqKXNlbGY7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgaW1wbC0+c3NsX2NvbnRleHRfY291bnQ7IGkrKykgeworICAgIGlmIChpbXBsLT5zc2xfY29udGV4dHNbaV0gIT0gTlVMTCkgeworICAgICAgU1NMX0NUWF9mcmVlKGltcGwtPnNzbF9jb250ZXh0c1tpXSk7CisgICAgICB0c2lfcGVlcl9kZXN0cnVjdCgmaW1wbC0+c3NsX2NvbnRleHRfeDUwOV9zdWJqZWN0X25hbWVzW2ldKTsKKyAgICB9CisgIH0KKyAgaWYgKGltcGwtPnNzbF9jb250ZXh0cyAhPSBOVUxMKSBmcmVlKGltcGwtPnNzbF9jb250ZXh0cyk7CisgIGlmIChpbXBsLT5zc2xfY29udGV4dF94NTA5X3N1YmplY3RfbmFtZXMgIT0gTlVMTCkgeworICAgIGZyZWUoaW1wbC0+c3NsX2NvbnRleHRfeDUwOV9zdWJqZWN0X25hbWVzKTsKKyAgfQorICBpZiAoaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0ICE9IE5VTEwpIGZyZWUoaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0KTsKKyAgZnJlZShpbXBsKTsKK30KKworc3RhdGljIGludCBkb2VzX2VudHJ5X21hdGNoX25hbWUoY29uc3QgY2hhciAqZW50cnksIHNpemVfdCBlbnRyeV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgIGNvbnN0IGNoYXIgKmRvdDsKKyAgY29uc3QgY2hhciAqbmFtZV9zdWJkb21haW4gPSBOVUxMOworICBzaXplX3QgbmFtZV9sZW5ndGggPSBzdHJsZW4obmFtZSk7CisgIHNpemVfdCBuYW1lX3N1YmRvbWFpbl9sZW5ndGg7CisgIGlmIChlbnRyeV9sZW5ndGggPT0gMCkgcmV0dXJuIDA7CisKKyAgLyogVGFrZSBjYXJlIG9mICcuJyB0ZXJtaW5hdGlvbnMuICovCisgIGlmIChuYW1lW25hbWVfbGVuZ3RoIC0gMV0gPT0gJy4nKSB7CisgICAgbmFtZV9sZW5ndGgtLTsKKyAgfQorICBpZiAoZW50cnlbZW50cnlfbGVuZ3RoIC0gMV0gPT0gJy4nKSB7CisgICAgZW50cnlfbGVuZ3RoLS07CisgICAgaWYgKGVudHJ5X2xlbmd0aCA9PSAwKSByZXR1cm4gMDsKKyAgfQorCisgIGlmICgobmFtZV9sZW5ndGggPT0gZW50cnlfbGVuZ3RoKSAmJgorICAgICAgc3RybmNtcChuYW1lLCBlbnRyeSwgZW50cnlfbGVuZ3RoKSA9PSAwKSB7CisgICAgcmV0dXJuIDE7IC8qIFBlcmZlY3QgbWF0Y2guICovCisgIH0KKyAgaWYgKGVudHJ5WzBdICE9ICcqJykgcmV0dXJuIDA7CisKKyAgLyogV2lsZGNoYXIgc3ViZG9tYWluIG1hdGNoaW5nLiAqLworICBpZiAoZW50cnlfbGVuZ3RoIDwgMyB8fCBlbnRyeVsxXSAhPSAnLicpIHsgLyogQXQgbGVhc3QgKi54ICovCisgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHdpbGRjaGFyIGVudHJ5LiIpOworICAgIHJldHVybiAwOworICB9CisgIG5hbWVfc3ViZG9tYWluID0gc3RyY2hyKG5hbWUsICcuJyk7CisgIGlmIChuYW1lX3N1YmRvbWFpbiA9PSBOVUxMKSByZXR1cm4gMDsKKyAgbmFtZV9zdWJkb21haW5fbGVuZ3RoID0gc3RybGVuKG5hbWVfc3ViZG9tYWluKTsKKyAgaWYgKG5hbWVfc3ViZG9tYWluX2xlbmd0aCA8IDIpIHJldHVybiAwOworICBuYW1lX3N1YmRvbWFpbisrOyAvKiBTdGFydHMgYWZ0ZXIgdGhlIGRvdC4gKi8KKyAgbmFtZV9zdWJkb21haW5fbGVuZ3RoLS07CisgIGVudHJ5ICs9IDI7IC8qIFJlbW92ZSAqLiAqLworICBlbnRyeV9sZW5ndGggLT0gMjsKKyAgZG90ID0gc3RyY2hyKG5hbWVfc3ViZG9tYWluLCAnLicpOworICBpZiAoKGRvdCA9PSBOVUxMKSB8fCAoZG90ID09ICZuYW1lX3N1YmRvbWFpbltuYW1lX3N1YmRvbWFpbl9sZW5ndGggLSAxXSkpIHsKKyAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgdG9wbGV2ZWwgc3ViZG9tYWluOiAlcyIsIG5hbWVfc3ViZG9tYWluKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobmFtZV9zdWJkb21haW5bbmFtZV9zdWJkb21haW5fbGVuZ3RoIC0gMV0gPT0gJy4nKSB7CisgICAgbmFtZV9zdWJkb21haW5fbGVuZ3RoLS07CisgIH0KKyAgcmV0dXJuICgoZW50cnlfbGVuZ3RoID4gMCkgJiYgKG5hbWVfc3ViZG9tYWluX2xlbmd0aCA9PSBlbnRyeV9sZW5ndGgpICYmCisgICAgICAgICAgc3RybmNtcChlbnRyeSwgbmFtZV9zdWJkb21haW4sIGVudHJ5X2xlbmd0aCkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3Rvcnlfc2VydmVybmFtZV9jYWxsYmFjayhTU0wgKnNzbCwgaW50ICphcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpIHsKKyAgdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0KKyAgICAgICh0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKilhcmc7CisgIHNpemVfdCBpID0gMDsKKyAgY29uc3QgY2hhciAqc2VydmVybmFtZSA9IFNTTF9nZXRfc2VydmVybmFtZShzc2wsIFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUpOworICBpZiAoc2VydmVybmFtZSA9PSBOVUxMIHx8IHN0cmxlbihzZXJ2ZXJuYW1lKSA9PSAwKSB7CisgICAgcmV0dXJuIFNTTF9UTFNFWFRfRVJSX05PQUNLOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGltcGwtPnNzbF9jb250ZXh0X2NvdW50OyBpKyspIHsKKyAgICBpZiAodHNpX3NzbF9wZWVyX21hdGNoZXNfbmFtZSgmaW1wbC0+c3NsX2NvbnRleHRfeDUwOV9zdWJqZWN0X25hbWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUpKSB7CisgICAgICBTU0xfc2V0X1NTTF9DVFgoc3NsLCBpbXBsLT5zc2xfY29udGV4dHNbaV0pOworICAgICAgcmV0dXJuIFNTTF9UTFNFWFRfRVJSX09LOworICAgIH0KKyAgfQorICBncHJfbG9nKEdQUl9FUlJPUiwgIk5vIG1hdGNoIGZvdW5kIGZvciBzZXJ2ZXIgbmFtZTogJXMuIiwgc2VydmVybmFtZSk7CisgIHJldHVybiBTU0xfVExTRVhUX0VSUl9BTEVSVF9XQVJOSU5HOworfQorCisjaWYgVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUCitzdGF0aWMgaW50IHNlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnlfYWxwbl9jYWxsYmFjaygKKyAgICBTU0wgKnNzbCwgY29uc3QgdW5zaWduZWQgY2hhciAqKm91dCwgdW5zaWduZWQgY2hhciAqb3V0bGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaW5sZW4sIHZvaWQgKmFyZykgeworICB0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKmZhY3RvcnkgPQorICAgICAgKHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSAqKWFyZzsKKyAgcmV0dXJuIHNlbGVjdF9wcm90b2NvbF9saXN0KG91dCwgb3V0bGVuLCBpbiwgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LT5hbHBuX3Byb3RvY29sX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LT5hbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoKTsKK30KKyNlbmRpZiAvKiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQgKi8KKworc3RhdGljIGludCBzZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5X25wbl9hZHZlcnRpc2VkX2NhbGxiYWNrKAorICAgIFNTTCAqc3NsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqb3V0LCB1bnNpZ25lZCBpbnQgKm91dGxlbiwgdm9pZCAqYXJnKSB7CisgIHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSAqZmFjdG9yeSA9CisgICAgICAodHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICopYXJnOworICAqb3V0ID0gZmFjdG9yeS0+YWxwbl9wcm90b2NvbF9saXN0OworICBHUFJfQVNTRVJUKGZhY3RvcnktPmFscG5fcHJvdG9jb2xfbGlzdF9sZW5ndGggPD0gVUlOVF9NQVgpOworICAqb3V0bGVuID0gKHVuc2lnbmVkIGludClmYWN0b3J5LT5hbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoOworICByZXR1cm4gU1NMX1RMU0VYVF9FUlJfT0s7Cit9CisKKy8qIC0tLSB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSBjb25zdHJ1Y3RvcnMuIC0tLSAqLworCit0c2lfcmVzdWx0IHRzaV9jcmVhdGVfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnkoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX3ByaXZhdGVfa2V5LCBzaXplX3QgcGVtX3ByaXZhdGVfa2V5X3NpemUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX2NlcnRfY2hhaW4sIHNpemVfdCBwZW1fY2VydF9jaGFpbl9zaXplLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9yb290X2NlcnRzLCBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZSwKKyAgICBjb25zdCBjaGFyICpjaXBoZXJfbGlzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqKmFscG5fcHJvdG9jb2xzLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xzX2xlbmd0aHMsIHVpbnQxNl90IG51bV9hbHBuX3Byb3RvY29scywKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqKmZhY3RvcnkpIHsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICB0c2lfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnkgKmltcGwgPSBOVUxMOworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKworICBncHJfb25jZV9pbml0KCZpbml0X29wZW5zc2xfb25jZSwgaW5pdF9vcGVuc3NsKTsKKworICBpZiAoZmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgICpmYWN0b3J5ID0gTlVMTDsKKyAgaWYgKHBlbV9yb290X2NlcnRzID09IE5VTEwpIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKKworICBzc2xfY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICBpZiAoc3NsX2NvbnRleHQgPT0gTlVMTCkgeworICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBzc2wgY29udGV4dC4iKTsKKyAgICByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICBpbXBsID0gY2FsbG9jKDEsIHNpemVvZih0c2lfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnkpKTsKKyAgaWYgKGltcGwgPT0gTlVMTCkgeworICAgIFNTTF9DVFhfZnJlZShzc2xfY29udGV4dCk7CisgICAgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICB9CisgIGltcGwtPnNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQ7CisKKyAgZG8geworICAgIHJlc3VsdCA9CisgICAgICAgIHBvcHVsYXRlX3NzbF9jb250ZXh0KHNzbF9jb250ZXh0LCBwZW1fcHJpdmF0ZV9rZXksIHBlbV9wcml2YXRlX2tleV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fY2VydF9jaGFpbiwgcGVtX2NlcnRfY2hhaW5fc2l6ZSwgY2lwaGVyX2xpc3QpOworICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKKyAgICByZXN1bHQgPSBzc2xfY3R4X2xvYWRfdmVyaWZpY2F0aW9uX2NlcnRzKHNzbF9jb250ZXh0LCBwZW1fcm9vdF9jZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbV9yb290X2NlcnRzX3NpemUsIE5VTEwpOworICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNhbm5vdCBsb2FkIHNlcnZlciByb290IGNlcnRpZmljYXRlcy4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChudW1fYWxwbl9wcm90b2NvbHMgIT0gMCkgeworICAgICAgcmVzdWx0ID0gYnVpbGRfYWxwbl9wcm90b2NvbF9uYW1lX2xpc3QoCisgICAgICAgICAgYWxwbl9wcm90b2NvbHMsIGFscG5fcHJvdG9jb2xzX2xlbmd0aHMsIG51bV9hbHBuX3Byb3RvY29scywKKyAgICAgICAgICAmaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0LCAmaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aCk7CisgICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkJ1aWxkaW5nIGFscG4gbGlzdCBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAorICAgICAgICAgICAgICAgIHRzaV9yZXN1bHRfdG9fc3RyaW5nKHJlc3VsdCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyNpZiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQKKyAgICAgIEdQUl9BU1NFUlQoaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aCA8IFVJTlRfTUFYKTsKKyAgICAgIGlmIChTU0xfQ1RYX3NldF9hbHBuX3Byb3RvcygKKyAgICAgICAgICAgICAgc3NsX2NvbnRleHQsIGltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClpbXBsLT5hbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoKSkgeworICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBzZXQgYWxwbiBwcm90b2NvbCBsaXN0IHRvIGNvbnRleHQuIik7CisgICAgICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyNlbmRpZiAvKiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQgKi8KKyAgICAgIFNTTF9DVFhfc2V0X25leHRfcHJvdG9fc2VsZWN0X2NiKAorICAgICAgICAgIHNzbF9jb250ZXh0LCBjbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5X25wbl9jYWxsYmFjaywgaW1wbCk7CisgICAgfQorICB9IHdoaWxlICgwKTsKKyAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICBzc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KCZpbXBsLT5iYXNlKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShzc2xfY29udGV4dCwgU1NMX1ZFUklGWV9QRUVSLCBOVUxMKTsKKyAgLyogVE9ETyhqYm9ldWYpOiBBZGQgcmV2b2NhdGlvbiB2ZXJpZmljYXRpb24uICovCisKKyAgaW1wbC0+YmFzZS5jcmVhdGVfaGFuZHNoYWtlciA9CisgICAgICBzc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeV9jcmVhdGVfaGFuZHNoYWtlcjsKKyAgaW1wbC0+YmFzZS5kZXN0cm95ID0gc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveTsKKyAgKmZhY3RvcnkgPSAmaW1wbC0+YmFzZTsKKyAgcmV0dXJuIFRTSV9PSzsKK30KKwordHNpX3Jlc3VsdCB0c2lfY3JlYXRlX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5KAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZW1fcHJpdmF0ZV9rZXlzLAorICAgIGNvbnN0IHNpemVfdCAqcGVtX3ByaXZhdGVfa2V5c19zaXplcywgY29uc3QgdW5zaWduZWQgY2hhciAqKnBlbV9jZXJ0X2NoYWlucywKKyAgICBjb25zdCBzaXplX3QgKnBlbV9jZXJ0X2NoYWluc19zaXplcywgc2l6ZV90IGtleV9jZXJ0X3BhaXJfY291bnQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX2NsaWVudF9yb290X2NlcnRzLAorICAgIHNpemVfdCBwZW1fY2xpZW50X3Jvb3RfY2VydHNfc2l6ZSwgaW50IGZvcmNlX2NsaWVudF9hdXRoLAorICAgIGNvbnN0IGNoYXIgKmNpcGhlcl9saXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICoqYWxwbl9wcm90b2NvbHMsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxwbl9wcm90b2NvbHNfbGVuZ3RocywgdWludDE2X3QgbnVtX2FscG5fcHJvdG9jb2xzLAorICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICoqZmFjdG9yeSkgeworICB0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKmltcGwgPSBOVUxMOworICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKKyAgc2l6ZV90IGkgPSAwOworCisgIGdwcl9vbmNlX2luaXQoJmluaXRfb3BlbnNzbF9vbmNlLCBpbml0X29wZW5zc2wpOworCisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKKyAgKmZhY3RvcnkgPSBOVUxMOworICBpZiAoa2V5X2NlcnRfcGFpcl9jb3VudCA9PSAwIHx8IHBlbV9wcml2YXRlX2tleXMgPT0gTlVMTCB8fAorICAgICAgcGVtX2NlcnRfY2hhaW5zID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICBpbXBsID0gY2FsbG9jKDEsIHNpemVvZih0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkpKTsKKyAgaWYgKGltcGwgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICBpbXBsLT5iYXNlLmNyZWF0ZV9oYW5kc2hha2VyID0KKyAgICAgIHNzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5X2NyZWF0ZV9oYW5kc2hha2VyOworICBpbXBsLT5iYXNlLmRlc3Ryb3kgPSBzc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95OworICBpbXBsLT5zc2xfY29udGV4dHMgPSBjYWxsb2Moa2V5X2NlcnRfcGFpcl9jb3VudCwgc2l6ZW9mKFNTTF9DVFggKikpOworICBpbXBsLT5zc2xfY29udGV4dF94NTA5X3N1YmplY3RfbmFtZXMgPQorICAgICAgY2FsbG9jKGtleV9jZXJ0X3BhaXJfY291bnQsIHNpemVvZih0c2lfcGVlcikpOworICBpZiAoaW1wbC0+c3NsX2NvbnRleHRzID09IE5VTEwgfHwKKyAgICAgIGltcGwtPnNzbF9jb250ZXh0X3g1MDlfc3ViamVjdF9uYW1lcyA9PSBOVUxMKSB7CisgICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveSgmaW1wbC0+YmFzZSk7CisgICAgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICB9CisgIGltcGwtPnNzbF9jb250ZXh0X2NvdW50ID0ga2V5X2NlcnRfcGFpcl9jb3VudDsKKworICBpZiAobnVtX2FscG5fcHJvdG9jb2xzID4gMCkgeworICAgIHJlc3VsdCA9IGJ1aWxkX2FscG5fcHJvdG9jb2xfbmFtZV9saXN0KAorICAgICAgICBhbHBuX3Byb3RvY29scywgYWxwbl9wcm90b2NvbHNfbGVuZ3RocywgbnVtX2FscG5fcHJvdG9jb2xzLAorICAgICAgICAmaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0LCAmaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aCk7CisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koJmltcGwtPmJhc2UpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwga2V5X2NlcnRfcGFpcl9jb3VudDsgaSsrKSB7CisgICAgZG8geworICAgICAgaW1wbC0+c3NsX2NvbnRleHRzW2ldID0gU1NMX0NUWF9uZXcoVExTdjFfMl9tZXRob2QoKSk7CisgICAgICBpZiAoaW1wbC0+c3NsX2NvbnRleHRzW2ldID09IE5VTEwpIHsKKyAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIHNzbCBjb250ZXh0LiIpOworICAgICAgICByZXN1bHQgPSBUU0lfT1VUX09GX1JFU09VUkNFUzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXN1bHQgPSBwb3B1bGF0ZV9zc2xfY29udGV4dCgKKyAgICAgICAgICBpbXBsLT5zc2xfY29udGV4dHNbaV0sIHBlbV9wcml2YXRlX2tleXNbaV0sIHBlbV9wcml2YXRlX2tleXNfc2l6ZXNbaV0sCisgICAgICAgICAgcGVtX2NlcnRfY2hhaW5zW2ldLCBwZW1fY2VydF9jaGFpbnNfc2l6ZXNbaV0sIGNpcGhlcl9saXN0KTsKKyAgICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKKworICAgICAgaWYgKHBlbV9jbGllbnRfcm9vdF9jZXJ0cyAhPSBOVUxMKSB7CisgICAgICAgIGludCBmbGFncyA9IFNTTF9WRVJJRllfUEVFUjsKKyAgICAgICAgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqcm9vdF9uYW1lcyA9IE5VTEw7CisgICAgICAgIHJlc3VsdCA9IHNzbF9jdHhfbG9hZF92ZXJpZmljYXRpb25fY2VydHMoCisgICAgICAgICAgICBpbXBsLT5zc2xfY29udGV4dHNbaV0sIHBlbV9jbGllbnRfcm9vdF9jZXJ0cywKKyAgICAgICAgICAgIHBlbV9jbGllbnRfcm9vdF9jZXJ0c19zaXplLCAmcm9vdF9uYW1lcyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7CisgICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHZlcmlmaWNhdGlvbiBjZXJ0cy4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChpbXBsLT5zc2xfY29udGV4dHNbaV0sIHJvb3RfbmFtZXMpOworICAgICAgICBpZiAoZm9yY2VfY2xpZW50X2F1dGgpIGZsYWdzIHw9IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQ7CisgICAgICAgIFNTTF9DVFhfc2V0X3ZlcmlmeShpbXBsLT5zc2xfY29udGV4dHNbaV0sIGZsYWdzLCBOVUxMKTsKKyAgICAgICAgLyogVE9ETyhqYm9ldWYpOiBBZGQgcmV2b2NhdGlvbiB2ZXJpZmljYXRpb24uICovCisgICAgICB9CisKKyAgICAgIHJlc3VsdCA9IGV4dHJhY3RfeDUwOV9zdWJqZWN0X25hbWVzX2Zyb21fcGVtX2NlcnQoCisgICAgICAgICAgcGVtX2NlcnRfY2hhaW5zW2ldLCBwZW1fY2VydF9jaGFpbnNfc2l6ZXNbaV0sCisgICAgICAgICAgJmltcGwtPnNzbF9jb250ZXh0X3g1MDlfc3ViamVjdF9uYW1lc1tpXSk7CisgICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7CisKKyAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKAorICAgICAgICAgIGltcGwtPnNzbF9jb250ZXh0c1tpXSwKKyAgICAgICAgICBzc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9zZXJ2ZXJuYW1lX2NhbGxiYWNrKTsKKyAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZyhpbXBsLT5zc2xfY29udGV4dHNbaV0sIGltcGwpOworI2lmIFRTSV9PUEVOU1NMX0FMUE5fU1VQUE9SVAorICAgICAgU1NMX0NUWF9zZXRfYWxwbl9zZWxlY3RfY2IoaW1wbC0+c3NsX2NvbnRleHRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9hbHBuX2NhbGxiYWNrLCBpbXBsKTsKKyNlbmRpZiAvKiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQgKi8KKyAgICAgIFNTTF9DVFhfc2V0X25leHRfcHJvdG9zX2FkdmVydGlzZWRfY2IoCisgICAgICAgICAgaW1wbC0+c3NsX2NvbnRleHRzW2ldLAorICAgICAgICAgIHNlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnlfbnBuX2FkdmVydGlzZWRfY2FsbGJhY2ssIGltcGwpOworICAgIH0gd2hpbGUgKDApOworCisgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKKyAgICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koJmltcGwtPmJhc2UpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKyAgKmZhY3RvcnkgPSAmaW1wbC0+YmFzZTsKKyAgcmV0dXJuIFRTSV9PSzsKK30KKworLyogLS0tIHRzaV9zc2wgdXRpbHMuIC0tLSAqLworCitpbnQgdHNpX3NzbF9wZWVyX21hdGNoZXNfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwgY29uc3QgY2hhciAqbmFtZSkgeworICBzaXplX3QgaSA9IDA7CisgIHNpemVfdCBzYW5fY291bnQgPSAwOworICBjb25zdCB0c2lfcGVlcl9wcm9wZXJ0eSAqY25fcHJvcGVydHkgPSBOVUxMOworICBpbnQgbGlrZV9pcCA9IGxvb2tzX2xpa2VfaXBfYWRkcmVzcyhuYW1lKTsKKworICAvKiBDaGVjayB0aGUgU0FOIGZpcnN0LiAqLworICBmb3IgKGkgPSAwOyBpIDwgcGVlci0+cHJvcGVydHlfY291bnQ7IGkrKykgeworICAgIGNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSA9ICZwZWVyLT5wcm9wZXJ0aWVzW2ldOworICAgIGlmIChwcm9wZXJ0eS0+bmFtZSA9PSBOVUxMKSBjb250aW51ZTsKKyAgICBpZiAoc3RyY21wKHByb3BlcnR5LT5uYW1lLAorICAgICAgICAgICAgICAgVFNJX1g1MDlfU1VCSkVDVF9BTFRFUk5BVElWRV9OQU1FX1BFRVJfUFJPUEVSVFkpID09IDApIHsKKyAgICAgIHNhbl9jb3VudCsrOworCisgICAgICBpZiAoIWxpa2VfaXAgJiYgZG9lc19lbnRyeV9tYXRjaF9uYW1lKHByb3BlcnR5LT52YWx1ZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+dmFsdWUubGVuZ3RoLCBuYW1lKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0gZWxzZSBpZiAobGlrZV9pcCAmJgorICAgICAgICAgICAgICAgICBzdHJuY21wKG5hbWUsIHByb3BlcnR5LT52YWx1ZS5kYXRhLCBwcm9wZXJ0eS0+dmFsdWUubGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgMCAmJgorICAgICAgICAgICAgICAgICBzdHJsZW4obmFtZSkgPT0gcHJvcGVydHktPnZhbHVlLmxlbmd0aCkgeworICAgICAgICAvKiBJUCBBZGRyZXNzZXMgYXJlIGV4YWN0IG1hdGNoZXMgb25seS4gKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJjbXAocHJvcGVydHktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgVFNJX1g1MDlfU1VCSkVDVF9DT01NT05fTkFNRV9QRUVSX1BST1BFUlRZKSA9PSAwKSB7CisgICAgICBjbl9wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZXJlJ3Mgbm8gU0FOLCB0cnkgdGhlIENOLCBidXQgb25seSBpZiBpdHMgbm90IGxpa2UgYW4gSVAgQWRkcmVzcyAqLworICBpZiAoc2FuX2NvdW50ID09IDAgJiYgY25fcHJvcGVydHkgIT0gTlVMTCAmJiAhbGlrZV9pcCkgeworICAgIGlmIChkb2VzX2VudHJ5X21hdGNoX25hbWUoY25fcHJvcGVydHktPnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbl9wcm9wZXJ0eS0+dmFsdWUubGVuZ3RoLCBuYW1lKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7IC8qIE5vdCBmb3VuZC4gKi8KK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIGIvc3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliOWU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfVFNJX1NTTF9UUkFOU1BPUlRfU0VDVVJJVFlfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1RTSV9TU0xfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFZhbHVlIGZvciB0aGUgVFNJX0NFUlRJRklDQVRFX1RZUEVfUEVFUl9QUk9QRVJUWSBwcm9wZXJ0eSBmb3IgWDUwOSBjZXJ0cy4gKi8KKyNkZWZpbmUgVFNJX1g1MDlfQ0VSVElGSUNBVEVfVFlQRSAiWDUwOSIKKworLyogVGhpcyBwcm9wZXJ0eSBpcyBvZiB0eXBlIFRTSV9QRUVSX1BST1BFUlRZX1NUUklORy4gICovCisjZGVmaW5lIFRTSV9YNTA5X1NVQkpFQ1RfQ09NTU9OX05BTUVfUEVFUl9QUk9QRVJUWSAieDUwOV9zdWJqZWN0X2NvbW1vbl9uYW1lIgorI2RlZmluZSBUU0lfWDUwOV9TVUJKRUNUX0FMVEVSTkFUSVZFX05BTUVfUEVFUl9QUk9QRVJUWSBcCisgICJ4NTA5X3N1YmplY3RfYWx0ZXJuYXRpdmVfbmFtZSIKKworI2RlZmluZSBUU0lfWDUwOV9QRU1fQ0VSVF9QUk9QRVJUWSAieDUwOV9wZW1fY2VydCIKKworI2RlZmluZSBUU0lfU1NMX0FMUE5fU0VMRUNURURfUFJPVE9DT0wgInNzbF9hbHBuX3NlbGVjdGVkX3Byb3RvY29sIgorCisvKiAtLS0gdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3Rvcnkgb2JqZWN0IC0tLQorCisgICBUaGlzIG9iamVjdCBjcmVhdGVzIHRzaV9oYW5kc2hha2VyIG9iamVjdHMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlCisgICBUTFMgMS4yIHNwZWNpZmljaWF0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3Rvcnk7CisKKy8qIENyZWF0ZXMgYSBjbGllbnQgaGFuZHNoYWtlciBmYWN0b3J5LgorICAgLSBwZW1fcHJpdmF0ZV9rZXkgaXMgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBQRU0gZW5jb2Rpbmcgb2YgdGhlIGNsaWVudCdzCisgICAgIHByaXZhdGUga2V5LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTCBpZiB0aGUgY2xpZW50IGRvZXMgbm90IGhhdmUgYQorICAgICBwcml2YXRlIGtleS4KKyAgIC0gcGVtX3ByaXZhdGVfa2V5X3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgYnVmZmVyLgorICAgLSBwZW1fY2VydF9jaGFpbiBpcyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFBFTSBlbmNvZGluZyBvZiB0aGUgY2xpZW50J3MKKyAgICAgY2VydGlmaWNhdGUgY2hhaW4uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBOVUxMIGlmIHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZQorICAgICBhIGNlcnRpZmljYXRlIGNoYWluLgorICAgLSBwZW1fY2VydF9jaGFpbl9zaXplIGlzIHRoZSBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlci4KKyAgIC0gcGVtX3Jvb3RzX2NlcnQgaXMgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBQRU0gZW5jb2Rpbmcgb2YgdGhlIHNlcnZlcgorICAgICByb290IGNlcnRpZmljYXRlcy4gVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIE5VTEwuCisgICAtIHBlbV9yb290c19jZXJ0X3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgYnVmZmVyLgorICAgLSBjaXBoZXJfc3VpdGVzIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIGNpcGhlcnMgdGhhdCB0aGUgY2xpZW50CisgICAgIHN1cHBvcnRzLiBUaGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzIGRlc2NyaWJlZCBpbjoKKyAgICAgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9hcHBzL2NpcGhlcnMuaHRtbC4KKyAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCBzZXQgb2YgY2lwaGVycy4KKyAgICAgVE9ETyhqYm9ldWYpOiBSZXZpc2l0IHRoZSBmb3JtYXQgb2YgdGhpcyBwYXJhbWV0ZXIuCisgICAtIGFscG5fcHJvdG9jb2xzIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3RvY29sIG5hbWVzIHRoYXQgdGhlCisgICAgIGhhbmRzaGFrZXJzIGNyZWF0ZWQgd2l0aCB0aGlzIGZhY3Rvcnkgc3VwcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIE5VTEwuCisgICAtIGFscG5fcHJvdG9jb2xzX2xlbmd0aHMgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbGVuZ3RocyBvZiB0aGUgYWxwbgorICAgICBwcm90b2NvbHMgc3BlY2lmaWVkIGluIGFscG5fcHJvdG9jb2xzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4KKyAgIC0gbnVtX2FscG5fcHJvdG9jb2xzIGlzIHRoZSBudW1iZXIgb2YgYWxwbiBwcm90b2NvbHMgYW5kIGFzc29jaWF0ZWQgbGVuZ3RocworICAgICBzcGVjaWZpZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIDAsIHRoZSBvdGhlciBhbHBuIHBhcmFtZXRlcnMgbXVzdCBiZSBOVUxMLgorICAgLSBmYWN0b3J5IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmYWN0b3J5IHBvaW50ZXIgdG8gYmUgY3JlYXRlZC4KKworICAgLSBUaGlzIG1ldGhvZCByZXR1cm5zIFRTSV9PSyBvbiBzdWNjZXNzIG9yIFRTSV9JTlZBTElEX1BBUkFNRVRFUiBpbiB0aGUgY2FzZQorICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLiAgKi8KK3RzaV9yZXN1bHQgdHNpX2NyZWF0ZV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fcHJpdmF0ZV9rZXksIHNpemVfdCBwZW1fcHJpdmF0ZV9rZXlfc2l6ZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fY2VydF9jaGFpbiwgc2l6ZV90IHBlbV9jZXJ0X2NoYWluX3NpemUsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX3Jvb3RfY2VydHMsIHNpemVfdCBwZW1fcm9vdF9jZXJ0c19zaXplLAorICAgIGNvbnN0IGNoYXIgKmNpcGhlcl9zdWl0ZXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphbHBuX3Byb3RvY29scywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphbHBuX3Byb3RvY29sc19sZW5ndGhzLCB1aW50MTZfdCBudW1fYWxwbl9wcm90b2NvbHMsCisgICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKipmYWN0b3J5KTsKKworLyogQ3JlYXRlcyBhIHNlcnZlciBoYW5kc2hha2VyIGZhY3RvcnkuCisgICAtIHZlcnNpb24gaW5kaWNhdGVzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gdG8gdXNlLgorICAgLSBwZW1fcHJpdmF0ZV9rZXlzIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIFBFTSBlbmNvZGluZyBvZiB0aGUgc2VydmVyJ3MKKyAgICAgcHJpdmF0ZSBrZXlzLiAgVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIE5VTEwuIFRoZSBzaXplIG9mIHRoZSBhcnJheSBpcworICAgICBnaXZlbiBieSB0aGUga2V5X2NlcnRfcGFpcl9jb3VudCBwYXJhbWV0ZXIuCisgICAtIHBlbV9wcml2YXRlX2tleXNfc2l6ZXMgaXMgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mIHRoZSBhc3NvY2lhdGVkCisgICAgIGJ1ZmZlcnMuCisgICAtIHBlbV9jZXJ0X2NoYWlucyBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBQRU0gZW5jb2Rpbmcgb2YgdGhlIHNlcnZlcidzCisgICAgIGNlcnQgY2hhaW5zLiAgVGhpcyBwYXJhbWV0ZXIgY2Fubm90IGJlIE5VTEwuIFRoZSBzaXplIG9mIHRoZSBhcnJheSBpcworICAgICBnaXZlbiBieSB0aGUga2V5X2NlcnRfcGFpcl9jb3VudCBwYXJhbWV0ZXIuCisgICAtIHBlbV9jZXJ0X2NoYWluc19zaXplcyBpcyB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgc2l6ZXMgb2YgdGhlIGFzc29jaWF0ZWQKKyAgICAgYnVmZmVycy4KKyAgIC0ga2V5X2NlcnRfcGFpcl9jb3VudCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcHJpdmF0ZV9rZXlfZmlsZXMKKyAgICAgYW5kIGNlcnRfY2hhaW5fZmlsZXMgcGFyYW1ldGVycy4KKyAgIC0gcGVtX2NsaWVudF9yb290cyBpcyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFBFTSBlbmNvZGluZyBvZiB0aGUgY2xpZW50CisgICAgIHJvb3QgY2VydGlmaWNhdGVzLiBUaGlzIHBhcmFtZXRlciBtYXkgYmUgTlVMTCBpbiB3aGljaCBjYXNlIHRoZSBzZXJ2ZXIgd2lsbAorICAgICBub3QgYXV0aGVudGljYXRlIHRoZSBjbGllbnQuIElmIG5vdCBOVUxMLCB0aGUgZm9yY2VfY2xpZW50X2F1dGggcGFyYW1ldGVyCisgICAgIHNwZWNpZmllcyBpZiB0aGUgc2VydmVyIHdpbGwgYWNjZXB0IG9ubHkgYXV0aGVudGljYXRlZCBjbGllbnRzIG9yIGJvdGgKKyAgICAgYXV0aGVudGljYXRlZCBhbmQgbm9uLWF1dGhlbnRpY2F0ZWQgY2xpZW50cy4KKyAgIC0gcGVtX2NsaWVudF9yb290X2NlcnRzX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgYnVmZmVyLgorICAgLSBmb3JjZV9jbGllbnRfYXV0aCwgaWYgc2V0IHRvIG5vbi16ZXJvIHdpbGwgZm9yY2UgdGhlIGNsaWVudCB0byBhdXRoZW50aWNhdGUKKyAgICAgd2l0aCBhbiBTU0wgY2VydC4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgcGVtX2NsaWVudF9yb290X2NlcnRzCisgICAgIGlzIE5VTEwgb3IgcGVtX2NsaWVudF9yb290c19jZXJ0c19zaXplIGlzIDAKKyAgIC0gY2lwaGVyX3N1aXRlcyBjb250YWlucyBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBjaXBoZXJzIHRoYXQgdGhlIHNlcnZlcgorICAgICBzdXBwb3J0cy4gVGhlIGZvcm1hdCBvZiB0aGlzIHN0cmluZyBpcyBkZXNjcmliZWQgaW46CisgICAgIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvYXBwcy9jaXBoZXJzLmh0bWwuCisgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gTlVMTCB0byB1c2UgdGhlIGRlZmF1bHQgc2V0IG9mIGNpcGhlcnMuCisgICAgIFRPRE8oamJvZXVmKTogUmV2aXNpdCB0aGUgZm9ybWF0IG9mIHRoaXMgcGFyYW1ldGVyLgorICAgLSBhbHBuX3Byb3RvY29scyBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcm90b2NvbCBuYW1lcyB0aGF0IHRoZQorICAgICBoYW5kc2hha2VycyBjcmVhdGVkIHdpdGggdGhpcyBmYWN0b3J5IHN1cHBvcnQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBOVUxMLgorICAgLSBhbHBuX3Byb3RvY29sc19sZW5ndGhzIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGxlbmd0aHMgb2YgdGhlIGFscG4KKyAgICAgcHJvdG9jb2xzIHNwZWNpZmllZCBpbiBhbHBuX3Byb3RvY29scy4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIE5VTEwuCisgICAtIG51bV9hbHBuX3Byb3RvY29scyBpcyB0aGUgbnVtYmVyIG9mIGFscG4gcHJvdG9jb2xzIGFuZCBhc3NvY2lhdGVkIGxlbmd0aHMKKyAgICAgc3BlY2lmaWVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAwLCB0aGUgb3RoZXIgYWxwbiBwYXJhbWV0ZXJzIG11c3QgYmUgTlVMTC4KKyAgIC0gZmFjdG9yeSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmFjdG9yeSBwb2ludGVyIHRvIGJlIGNyZWF0ZWQuCisKKyAgIC0gVGhpcyBtZXRob2QgcmV0dXJucyBUU0lfT0sgb24gc3VjY2VzcyBvciBUU0lfSU5WQUxJRF9QQVJBTUVURVIgaW4gdGhlIGNhc2UKKyAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4gICovCit0c2lfcmVzdWx0IHRzaV9jcmVhdGVfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkoCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKnBlbV9wcml2YXRlX2tleXMsCisgICAgY29uc3Qgc2l6ZV90ICpwZW1fcHJpdmF0ZV9rZXlzX3NpemVzLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcGVtX2NlcnRfY2hhaW5zLAorICAgIGNvbnN0IHNpemVfdCAqcGVtX2NlcnRfY2hhaW5zX3NpemVzLCBzaXplX3Qga2V5X2NlcnRfcGFpcl9jb3VudCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fY2xpZW50X3Jvb3RfY2VydHMsCisgICAgc2l6ZV90IHBlbV9jbGllbnRfcm9vdF9jZXJ0c19zaXplLCBpbnQgZm9yY2VfY2xpZW50X2F1dGgsCisgICAgY29uc3QgY2hhciAqY2lwaGVyX3N1aXRlcywgY29uc3QgdW5zaWduZWQgY2hhciAqKmFscG5fcHJvdG9jb2xzLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xzX2xlbmd0aHMsIHVpbnQxNl90IG51bV9hbHBuX3Byb3RvY29scywKKyAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqKmZhY3RvcnkpOworCisvKiBDcmVhdGVzIGEgaGFuZHNoYWtlci4KKyAgLSBzZWxmIGlzIHRoZSBmYWN0b3J5IGZyb20gd2hpY2ggdGhlIGhhbmRzaGFrZXIgd2lsbCBiZSBjcmVhdGVkLgorICAtIHNlcnZlcl9uYW1lX2luZGljYXRpb24gaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIgdGhlIGNsaWVudCBpcworICAgIHRyeWluZyB0byBjb25uZWN0IHRvIHdoaWNoIHdpbGwgYmUgcmVsYXllZCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBTTkkKKyAgICBleHRlbnNpb24uCisgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBOVUxMIGZvciBhIHNlcnZlciBoYW5kc2hha2VyIGZhY3RvcnkuCisgIC0gaGFuZGhzaGFrZXIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhhbmRzaGFrZXIgcG9pbnRlciB0byBiZSBjcmVhdGVkLgorCisgIC0gVGhpcyBtZXRob2QgcmV0dXJucyBUU0lfT0sgb24gc3VjY2VzcyBvciBUU0lfSU5WQUxJRF9QQVJBTUVURVIgaW4gdGhlIGNhc2UKKyAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLiAgKi8KK3RzaV9yZXN1bHQgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXIoCisgICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYsIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lX2luZGljYXRpb24sCisgICAgdHNpX2hhbmRzaGFrZXIgKipoYW5kc2hha2VyKTsKKworLyogRGVzdHJveXMgdGhlIGhhbmRzaGFrZXIgZmFjdG9yeS4gV0FSTklORzogaXQgaXMgdW5zYWZlIHRvIGRlc3Ryb3kgYSBmYWN0b3J5CisgICB3aGlsZSBoYW5kc2hha2VycyBjcmVhdGVkIHdpdGggdGhpcyBmYWN0b3J5IGFyZSBzdGlsbCBpbiB1c2UuICAqLwordm9pZCB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpzZWxmKTsKKworLyogVXRpbCB0aGF0IGNoZWNrcyB0aGF0IGFuIHNzbCBwZWVyIG1hdGNoZXMgYSBzcGVjaWZpYyBuYW1lLgorICAgU3RpbGwgVE9ETyhqYm9ldWYpOgorICAgLSBoYW5kbGUgbWl4ZWQgY2FzZS4KKyAgIC0gaGFuZGxlICVlbmNvZGVkIGNoYXJzLgorICAgLSBoYW5kbGUgcHVibGljIHN1ZmZpeCB3aWxkY2hhciBtb3JlIHN0cmljdGx5IChlLmcuICouY28udWspICovCitpbnQgdHNpX3NzbF9wZWVyX21hdGNoZXNfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHUlBDX0NPUkVfTElCX1RTSV9TU0xfVFJBTlNQT1JUX1NFQ1VSSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmggYi9zcmMvY29yZS9saWIvdHNpL3NzbF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTY4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29yZS9saWIvdHNpL3NzbF90eXBlcy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9UU0lfU1NMX1RZUEVTX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9UU0lfU1NMX1RZUEVTX0gKKworLyogQSBjb2xsZWN0aW9uIG9mIG1hY3JvcyB0byBjYXN0IGJldHdlZW4gdmFyaW91cyBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlCisgKiB1c2VkIGRpZmZlcmVudGx5IGJldHdlZW4gQm9yaW5nU1NMIGFuZCBPcGVuU1NMOgorICogVFNJX0lOVF9BU19TSVpFKHgpOiAgY29udmVydCAnaW50IHgnIHRvIGEgbGVuZ3RoIHBhcmFtZXRlciBmb3IgYW4gT3BlblNTTAorICogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKyAqIFRTSV9TSVpFX0FTX1NJWkUoeCk6IGNvbnZlcnQgJ3NpemVfdCB4JyB0byBhIGxlbmd0aCBwYXJhbWV0ZXIgZm9yIGFuIE9wZW5TU0wKKyAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKKyNpZmRlZiBPUEVOU1NMX0lTX0JPUklOR1NTTAorI2RlZmluZSBUU0lfSU5UX0FTX1NJWkUoeCkgKChzaXplX3QpKHgpKQorI2RlZmluZSBUU0lfU0laRV9BU19TSVpFKHgpICh4KQorI2Vsc2UKKyNkZWZpbmUgVFNJX0lOVF9BU19TSVpFKHgpICh4KQorI2RlZmluZSBUU0lfU0laRV9BU19TSVpFKHgpICgoaW50KSh4KSkKKyNlbmRpZgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9UU0lfU1NMX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL1JFQURNRSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL1JFQURNRQpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL1JFQURNRQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvYmFkY2xpZW50LmtleSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9iYWRjbGllbnQua2V5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9iYWRjbGllbnQua2V5CnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvYmFkY2xpZW50LmtleQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvYmFkY2xpZW50LnBlbSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9iYWRjbGllbnQucGVtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9iYWRjbGllbnQucGVtCnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvYmFkY2xpZW50LnBlbQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvYmFkc2VydmVyLmtleSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIua2V5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIua2V5CnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvYmFkc2VydmVyLmtleQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvYmFkc2VydmVyLnBlbSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIucGVtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIucGVtCnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvYmFkc2VydmVyLnBlbQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvY2Etb3BlbnNzbC5jbmYgYi9zcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvY2Etb3BlbnNzbC5jbmYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NhLW9wZW5zc2wuY25mCnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvY2Etb3BlbnNzbC5jbmYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NhLmtleSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9jYS5rZXkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NhLmtleQpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL2NhLmtleQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvY2EucGVtIGIvc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL2NhLnBlbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvY2EucGVtCnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvY2EucGVtCmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvdGVzdF9jcmVkcy9jbGllbnQua2V5IGIvc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL2NsaWVudC5rZXkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NsaWVudC5rZXkKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9jbGllbnQua2V5CmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvdGVzdF9jcmVkcy9jbGllbnQucGVtIGIvc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL2NsaWVudC5wZW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NsaWVudC5wZW0KcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9jbGllbnQucGVtCmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIwLmtleSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIwLmtleQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMC5rZXkKcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIwLmtleQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMC5wZW0gYi9zcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMC5wZW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjAucGVtCnJlbmFtZSB0byBzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMC5wZW0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjEtb3BlbnNzbC5jbmYgYi9zcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS1vcGVuc3NsLmNuZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS1vcGVuc3NsLmNuZgpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjEtb3BlbnNzbC5jbmYKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjEua2V5IGIvc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjEua2V5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIxLmtleQpyZW5hbWUgdG8gc3JjL2NvcmUvbGliL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjEua2V5CmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIxLnBlbSBiL3NyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIxLnBlbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS5wZW0KcmVuYW1lIHRvIHNyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9zZXJ2ZXIxLnBlbQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyBiL3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjMGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIC0tLSBUcmFjaW5nLiAtLS0gKi8KKworaW50IHRzaV90cmFjaW5nX2VuYWJsZWQgPSAwOworCisvKiAtLS0gVXRpbHMuIC0tLSAqLworCitjaGFyICp0c2lfc3RyZHVwKGNvbnN0IGNoYXIgKnNyYykgeworICBjaGFyICpkc3Q7CisgIHNpemVfdCBsZW47CisgIGlmICghc3JjKSByZXR1cm4gTlVMTDsKKyAgbGVuID0gc3RybGVuKHNyYykgKyAxOworICBkc3QgPSBtYWxsb2MobGVuKTsKKyAgaWYgKCFkc3QpIHJldHVybiBOVUxMOworICBtZW1jcHkoZHN0LCBzcmMsIGxlbik7CisgIHJldHVybiBkc3Q7Cit9CisKKy8qIC0tLSB0c2lfcmVzdWx0IGNvbW1vbiBpbXBsZW1lbnRhdGlvbi4gLS0tICovCisKK2NvbnN0IGNoYXIgKnRzaV9yZXN1bHRfdG9fc3RyaW5nKHRzaV9yZXN1bHQgcmVzdWx0KSB7CisgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgY2FzZSBUU0lfT0s6CisgICAgICByZXR1cm4gIlRTSV9PSyI7CisgICAgY2FzZSBUU0lfVU5LTk9XTl9FUlJPUjoKKyAgICAgIHJldHVybiAiVFNJX1VOS05PV05fRVJST1IiOworICAgIGNhc2UgVFNJX0lOVkFMSURfQVJHVU1FTlQ6CisgICAgICByZXR1cm4gIlRTSV9JTlZBTElEX0FSR1VNRU5UIjsKKyAgICBjYXNlIFRTSV9QRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgIHJldHVybiAiVFNJX1BFUk1JU1NJT05fREVOSUVEIjsKKyAgICBjYXNlIFRTSV9JTkNPTVBMRVRFX0RBVEE6CisgICAgICByZXR1cm4gIlRTSV9JTkNPTVBMRVRFX0RBVEEiOworICAgIGNhc2UgVFNJX0ZBSUxFRF9QUkVDT05ESVRJT046CisgICAgICByZXR1cm4gIlRTSV9GQUlMRURfUFJFQ09ORElUSU9OIjsKKyAgICBjYXNlIFRTSV9VTklNUExFTUVOVEVEOgorICAgICAgcmV0dXJuICJUU0lfVU5JTVBMRU1FTlRFRCI7CisgICAgY2FzZSBUU0lfSU5URVJOQUxfRVJST1I6CisgICAgICByZXR1cm4gIlRTSV9JTlRFUk5BTF9FUlJPUiI7CisgICAgY2FzZSBUU0lfREFUQV9DT1JSVVBURUQ6CisgICAgICByZXR1cm4gIlRTSV9EQVRBX0NPUlJVUFRFRCI7CisgICAgY2FzZSBUU0lfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuICJUU0lfTk9UX0ZPVU5EIjsKKyAgICBjYXNlIFRTSV9QUk9UT0NPTF9GQUlMVVJFOgorICAgICAgcmV0dXJuICJUU0lfUFJPVE9DT0xfRkFJTFVSRSI7CisgICAgY2FzZSBUU0lfSEFORFNIQUtFX0lOX1BST0dSRVNTOgorICAgICAgcmV0dXJuICJUU0lfSEFORFNIQUtFX0lOX1BST0dSRVNTIjsKKyAgICBjYXNlIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOgorICAgICAgcmV0dXJuICJUU0lfT1VUX09GX1JFU09VUkNFUyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgIH0KK30KKworLyogLS0tIHRzaV9mcmFtZV9wcm90ZWN0b3IgY29tbW9uIGltcGxlbWVudGF0aW9uLiAtLS0KKworICAgQ2FsbHMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gYWZ0ZXIgc3RhdGUvaW5wdXQgdmFsaWRhdGlvbi4gKi8KKwordHNpX3Jlc3VsdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Byb3RlY3QodHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp1bnByb3RlY3RlZF9ieXRlc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCB8fCB1bnByb3RlY3RlZF9ieXRlcyA9PSBOVUxMIHx8CisgICAgICB1bnByb3RlY3RlZF9ieXRlc19zaXplID09IE5VTEwgfHwgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMgPT0gTlVMTCB8fAorICAgICAgcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIHJldHVybiBzZWxmLT52dGFibGUtPnByb3RlY3Qoc2VsZiwgdW5wcm90ZWN0ZWRfYnl0ZXMsIHVucHJvdGVjdGVkX2J5dGVzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSk7Cit9CisKK3RzaV9yZXN1bHQgdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoKAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAorICAgIHNpemVfdCAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSwgc2l6ZV90ICpzdGlsbF9wZW5kaW5nX3NpemUpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCB8fCBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcyA9PSBOVUxMIHx8CisgICAgICBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcyA9PSBOVUxMIHx8IHN0aWxsX3BlbmRpbmdfc2l6ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIHJldHVybiBzZWxmLT52dGFibGUtPnByb3RlY3RfZmx1c2goc2VsZiwgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbF9wZW5kaW5nX3NpemUpOworfQorCit0c2lfcmVzdWx0IHRzaV9mcmFtZV9wcm90ZWN0b3JfdW5wcm90ZWN0KAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXMsCisgICAgc2l6ZV90ICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUsIHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAorICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSkgeworICBpZiAoc2VsZiA9PSBOVUxMIHx8IHByb3RlY3RlZF9mcmFtZXNfYnl0ZXMgPT0gTlVMTCB8fAorICAgICAgcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplID09IE5VTEwgfHwgdW5wcm90ZWN0ZWRfYnl0ZXMgPT0gTlVMTCB8fAorICAgICAgdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIHJldHVybiBzZWxmLT52dGFibGUtPnVucHJvdGVjdChzZWxmLCBwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplLCB1bnByb3RlY3RlZF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucHJvdGVjdGVkX2J5dGVzX3NpemUpOworfQorCit2b2lkIHRzaV9mcmFtZV9wcm90ZWN0b3JfZGVzdHJveSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmKSB7CisgIGlmIChzZWxmID09IE5VTEwpIHJldHVybjsKKyAgc2VsZi0+dnRhYmxlLT5kZXN0cm95KHNlbGYpOworfQorCisvKiAtLS0gdHNpX2hhbmRzaGFrZXIgY29tbW9uIGltcGxlbWVudGF0aW9uLiAtLS0KKworICAgQ2FsbHMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gYWZ0ZXIgc3RhdGUvaW5wdXQgdmFsaWRhdGlvbi4gKi8KKwordHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKHRzaV9oYW5kc2hha2VyICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNfc2l6ZSkgeworICBpZiAoc2VsZiA9PSBOVUxMIHx8IGJ5dGVzID09IE5VTEwgfHwgYnl0ZXNfc2l6ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlmIChzZWxmLT5mcmFtZV9wcm90ZWN0b3JfY3JlYXRlZCkgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOworICByZXR1cm4gc2VsZi0+dnRhYmxlLT5nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKHNlbGYsIGJ5dGVzLCBieXRlc19zaXplKTsKK30KKwordHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNfc2l6ZSkgeworICBpZiAoc2VsZiA9PSBOVUxMIHx8IGJ5dGVzID09IE5VTEwgfHwgYnl0ZXNfc2l6ZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlmIChzZWxmLT5mcmFtZV9wcm90ZWN0b3JfY3JlYXRlZCkgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOworICByZXR1cm4gc2VsZi0+dnRhYmxlLT5wcm9jZXNzX2J5dGVzX2Zyb21fcGVlcihzZWxmLCBieXRlcywgYnl0ZXNfc2l6ZSk7Cit9CisKK3RzaV9yZXN1bHQgdHNpX2hhbmRzaGFrZXJfZ2V0X3Jlc3VsdCh0c2lfaGFuZHNoYWtlciAqc2VsZikgeworICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIGlmIChzZWxmLT5mcmFtZV9wcm90ZWN0b3JfY3JlYXRlZCkgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOworICByZXR1cm4gc2VsZi0+dnRhYmxlLT5nZXRfcmVzdWx0KHNlbGYpOworfQorCit0c2lfcmVzdWx0IHRzaV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwgdHNpX3BlZXIgKnBlZXIpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCB8fCBwZWVyID09IE5VTEwpIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKKyAgbWVtc2V0KHBlZXIsIDAsIHNpemVvZih0c2lfcGVlcikpOworICBpZiAoc2VsZi0+ZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQpIHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTjsKKyAgaWYgKHRzaV9oYW5kc2hha2VyX2dldF9yZXN1bHQoc2VsZikgIT0gVFNJX09LKSB7CisgICAgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOworICB9CisgIHJldHVybiBzZWxmLT52dGFibGUtPmV4dHJhY3RfcGVlcihzZWxmLCBwZWVyKTsKK30KKwordHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yKAorICAgIHRzaV9oYW5kc2hha2VyICpzZWxmLCBzaXplX3QgKm1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSwKKyAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICoqcHJvdGVjdG9yKSB7CisgIHRzaV9yZXN1bHQgcmVzdWx0OworICBpZiAoc2VsZiA9PSBOVUxMIHx8IHByb3RlY3RvciA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7CisgIGlmIChzZWxmLT5mcmFtZV9wcm90ZWN0b3JfY3JlYXRlZCkgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOworICBpZiAodHNpX2hhbmRzaGFrZXJfZ2V0X3Jlc3VsdChzZWxmKSAhPSBUU0lfT0spIHsKKyAgICByZXR1cm4gVFNJX0ZBSUxFRF9QUkVDT05ESVRJT047CisgIH0KKyAgcmVzdWx0ID0gc2VsZi0+dnRhYmxlLT5jcmVhdGVfZnJhbWVfcHJvdGVjdG9yKHNlbGYsIG1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3Rvcik7CisgIGlmIChyZXN1bHQgPT0gVFNJX09LKSB7CisgICAgc2VsZi0+ZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQgPSAxOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgdHNpX2hhbmRzaGFrZXJfZGVzdHJveSh0c2lfaGFuZHNoYWtlciAqc2VsZikgeworICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm47CisgIHNlbGYtPnZ0YWJsZS0+ZGVzdHJveShzZWxmKTsKK30KKworLyogLS0tIHRzaV9wZWVyIGltcGxlbWVudGF0aW9uLiAtLS0gKi8KKwordHNpX3BlZXJfcHJvcGVydHkgdHNpX2luaXRfcGVlcl9wcm9wZXJ0eSh2b2lkKSB7CisgIHRzaV9wZWVyX3Byb3BlcnR5IHByb3BlcnR5OworICBtZW1zZXQoJnByb3BlcnR5LCAwLCBzaXplb2YodHNpX3BlZXJfcHJvcGVydHkpKTsKKyAgcmV0dXJuIHByb3BlcnR5OworfQorCitzdGF0aWMgdm9pZCB0c2lfcGVlcl9kZXN0cm95X2xpc3RfcHJvcGVydHkodHNpX3BlZXJfcHJvcGVydHkgKmNoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGlsZF9jb3VudCkgeworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IGNoaWxkX2NvdW50OyBpKyspIHsKKyAgICB0c2lfcGVlcl9wcm9wZXJ0eV9kZXN0cnVjdCgmY2hpbGRyZW5baV0pOworICB9CisgIGZyZWUoY2hpbGRyZW4pOworfQorCit2b2lkIHRzaV9wZWVyX3Byb3BlcnR5X2Rlc3RydWN0KHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSkgeworICBpZiAocHJvcGVydHktPm5hbWUgIT0gTlVMTCkgeworICAgIGZyZWUocHJvcGVydHktPm5hbWUpOworICB9CisgIGlmIChwcm9wZXJ0eS0+dmFsdWUuZGF0YSAhPSBOVUxMKSB7CisgICAgZnJlZShwcm9wZXJ0eS0+dmFsdWUuZGF0YSk7CisgIH0KKyAgKnByb3BlcnR5ID0gdHNpX2luaXRfcGVlcl9wcm9wZXJ0eSgpOyAvKiBSZXNldCBldmVyeXRoaW5nIHRvIDAuICovCit9CisKK3ZvaWQgdHNpX3BlZXJfZGVzdHJ1Y3QodHNpX3BlZXIgKnNlbGYpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuOworICBpZiAoc2VsZi0+cHJvcGVydGllcyAhPSBOVUxMKSB7CisgICAgdHNpX3BlZXJfZGVzdHJveV9saXN0X3Byb3BlcnR5KHNlbGYtPnByb3BlcnRpZXMsIHNlbGYtPnByb3BlcnR5X2NvdW50KTsKKyAgICBzZWxmLT5wcm9wZXJ0aWVzID0gTlVMTDsKKyAgfQorICBzZWxmLT5wcm9wZXJ0eV9jb3VudCA9IDA7Cit9CisKK3RzaV9yZXN1bHQgdHNpX2NvbnN0cnVjdF9hbGxvY2F0ZWRfc3RyaW5nX3BlZXJfcHJvcGVydHkoCisgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHZhbHVlX2xlbmd0aCwgdHNpX3BlZXJfcHJvcGVydHkgKnByb3BlcnR5KSB7CisgICpwcm9wZXJ0eSA9IHRzaV9pbml0X3BlZXJfcHJvcGVydHkoKTsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHByb3BlcnR5LT5uYW1lID0gdHNpX3N0cmR1cChuYW1lKTsKKyAgICBpZiAocHJvcGVydHktPm5hbWUgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICB9CisgIGlmICh2YWx1ZV9sZW5ndGggPiAwKSB7CisgICAgcHJvcGVydHktPnZhbHVlLmRhdGEgPSBjYWxsb2MoMSwgdmFsdWVfbGVuZ3RoKTsKKyAgICBpZiAocHJvcGVydHktPnZhbHVlLmRhdGEgPT0gTlVMTCkgeworICAgICAgdHNpX3BlZXJfcHJvcGVydHlfZGVzdHJ1Y3QocHJvcGVydHkpOworICAgICAgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOworICAgIH0KKyAgICBwcm9wZXJ0eS0+dmFsdWUubGVuZ3RoID0gdmFsdWVfbGVuZ3RoOworICB9CisgIHJldHVybiBUU0lfT0s7Cit9CisKK3RzaV9yZXN1bHQgdHNpX2NvbnN0cnVjdF9zdHJpbmdfcGVlcl9wcm9wZXJ0eV9mcm9tX2NzdHJpbmcoCisgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSkgeworICByZXR1cm4gdHNpX2NvbnN0cnVjdF9zdHJpbmdfcGVlcl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOworfQorCit0c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHkoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFsdWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSkgeworICB0c2lfcmVzdWx0IHJlc3VsdCA9IHRzaV9jb25zdHJ1Y3RfYWxsb2NhdGVkX3N0cmluZ19wZWVyX3Byb3BlcnR5KAorICAgICAgbmFtZSwgdmFsdWVfbGVuZ3RoLCBwcm9wZXJ0eSk7CisgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OworICBpZiAodmFsdWVfbGVuZ3RoID4gMCkgeworICAgIG1lbWNweShwcm9wZXJ0eS0+dmFsdWUuZGF0YSwgdmFsdWUsIHZhbHVlX2xlbmd0aCk7CisgIH0KKyAgcmV0dXJuIFRTSV9PSzsKK30KKwordHNpX3Jlc3VsdCB0c2lfY29uc3RydWN0X3BlZXIoc2l6ZV90IHByb3BlcnR5X2NvdW50LCB0c2lfcGVlciAqcGVlcikgeworICBtZW1zZXQocGVlciwgMCwgc2l6ZW9mKHRzaV9wZWVyKSk7CisgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHsKKyAgICBwZWVyLT5wcm9wZXJ0aWVzID0gY2FsbG9jKHByb3BlcnR5X2NvdW50LCBzaXplb2YodHNpX3BlZXJfcHJvcGVydHkpKTsKKyAgICBpZiAocGVlci0+cHJvcGVydGllcyA9PSBOVUxMKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7CisgICAgcGVlci0+cHJvcGVydHlfY291bnQgPSBwcm9wZXJ0eV9jb3VudDsKKyAgfQorICByZXR1cm4gVFNJX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCBiL3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5ZGQwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgR1JQQ19DT1JFX0xJQl9UU0lfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKKyNkZWZpbmUgR1JQQ19DT1JFX0xJQl9UU0lfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKKworI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBpbnQgdHNpX3RyYWNpbmdfZW5hYmxlZDsKKworLyogQmFzZSBmb3IgdHNpX2ZyYW1lX3Byb3RlY3RvciBpbXBsZW1lbnRhdGlvbnMuCisgICBTZWUgdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIGZvciBkb2N1bWVudGF0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB0c2lfcmVzdWx0ICgqcHJvdGVjdCkodHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp1bnByb3RlY3RlZF9ieXRlc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpOworICB0c2lfcmVzdWx0ICgqcHJvdGVjdF9mbHVzaCkodHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzdGlsbF9wZW5kaW5nX3NpemUpOworICB0c2lfcmVzdWx0ICgqdW5wcm90ZWN0KSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdW5wcm90ZWN0ZWRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7CisgIHZvaWQgKCpkZXN0cm95KSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmKTsKK30gdHNpX2ZyYW1lX3Byb3RlY3Rvcl92dGFibGU7CisKK3N0cnVjdCB0c2lfZnJhbWVfcHJvdGVjdG9yIHsKKyAgY29uc3QgdHNpX2ZyYW1lX3Byb3RlY3Rvcl92dGFibGUgKnZ0YWJsZTsKK307CisKKy8qIEJhc2UgZm9yIHRzaV9oYW5kc2hha2VyIGltcGxlbWVudGF0aW9ucy4KKyAgIFNlZSB0cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmggZm9yIGRvY3VtZW50YXRpb24uICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHRzaV9yZXN1bHQgKCpnZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKSh0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpieXRlc19zaXplKTsKKyAgdHNpX3Jlc3VsdCAoKnByb2Nlc3NfYnl0ZXNfZnJvbV9wZWVyKSh0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpOworICB0c2lfcmVzdWx0ICgqZ2V0X3Jlc3VsdCkodHNpX2hhbmRzaGFrZXIgKnNlbGYpOworICB0c2lfcmVzdWx0ICgqZXh0cmFjdF9wZWVyKSh0c2lfaGFuZHNoYWtlciAqc2VsZiwgdHNpX3BlZXIgKnBlZXIpOworICB0c2lfcmVzdWx0ICgqY3JlYXRlX2ZyYW1lX3Byb3RlY3RvcikodHNpX2hhbmRzaGFrZXIgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKipwcm90ZWN0b3IpOworICB2b2lkICgqZGVzdHJveSkodHNpX2hhbmRzaGFrZXIgKnNlbGYpOworfSB0c2lfaGFuZHNoYWtlcl92dGFibGU7CisKK3N0cnVjdCB0c2lfaGFuZHNoYWtlciB7CisgIGNvbnN0IHRzaV9oYW5kc2hha2VyX3Z0YWJsZSAqdnRhYmxlOworICBpbnQgZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQ7Cit9OworCisvKiBQZWVyIGFuZCBwcm9wZXJ0eSBjb25zdHJ1Y3Rpb24vZGVzdHJ1Y3Rpb24gZnVuY3Rpb25zLiAqLwordHNpX3Jlc3VsdCB0c2lfY29uc3RydWN0X3BlZXIoc2l6ZV90IHByb3BlcnR5X2NvdW50LCB0c2lfcGVlciAqcGVlcik7Cit0c2lfcGVlcl9wcm9wZXJ0eSB0c2lfaW5pdF9wZWVyX3Byb3BlcnR5KHZvaWQpOwordm9pZCB0c2lfcGVlcl9wcm9wZXJ0eV9kZXN0cnVjdCh0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpOwordHNpX3Jlc3VsdCB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5KGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhbHVlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpOwordHNpX3Jlc3VsdCB0c2lfY29uc3RydWN0X2FsbG9jYXRlZF9zdHJpbmdfcGVlcl9wcm9wZXJ0eSgKKyAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdmFsdWVfbGVuZ3RoLCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpOwordHNpX3Jlc3VsdCB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5X2Zyb21fY3N0cmluZygKKyAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgdHNpX3BlZXJfcHJvcGVydHkgKnByb3BlcnR5KTsKKworLyogVXRpbHMuICovCitjaGFyICp0c2lfc3RyZHVwKGNvbnN0IGNoYXIgKnNyYyk7IC8qIFNhZGx5LCBubyBzdHJkdXAgaW4gQzg5LiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogR1JQQ19DT1JFX0xJQl9UU0lfVFJBTlNQT1JUX1NFQ1VSSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIGIvc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZjE1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIEdSUENfQ09SRV9MSUJfVFNJX1RSQU5TUE9SVF9TRUNVUklUWV9JTlRFUkZBQ0VfSAorI2RlZmluZSBHUlBDX0NPUkVfTElCX1RTSV9UUkFOU1BPUlRfU0VDVVJJVFlfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLSB0c2kgcmVzdWx0IC0tLSAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgVFNJX09LID0gMCwKKyAgVFNJX1VOS05PV05fRVJST1IgPSAxLAorICBUU0lfSU5WQUxJRF9BUkdVTUVOVCA9IDIsCisgIFRTSV9QRVJNSVNTSU9OX0RFTklFRCA9IDMsCisgIFRTSV9JTkNPTVBMRVRFX0RBVEEgPSA0LAorICBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTiA9IDUsCisgIFRTSV9VTklNUExFTUVOVEVEID0gNiwKKyAgVFNJX0lOVEVSTkFMX0VSUk9SID0gNywKKyAgVFNJX0RBVEFfQ09SUlVQVEVEID0gOCwKKyAgVFNJX05PVF9GT1VORCA9IDksCisgIFRTSV9QUk9UT0NPTF9GQUlMVVJFID0gMTAsCisgIFRTSV9IQU5EU0hBS0VfSU5fUFJPR1JFU1MgPSAxMSwKKyAgVFNJX09VVF9PRl9SRVNPVVJDRVMgPSAxMgorfSB0c2lfcmVzdWx0OworCitjb25zdCBjaGFyICp0c2lfcmVzdWx0X3RvX3N0cmluZyh0c2lfcmVzdWx0IHJlc3VsdCk7CisKKy8qIC0tLSB0c2kgdHJhY2luZyAtLS0gKi8KKworLyogU2V0IHRoaXMgZWFybHkgdG8gYXZvaWQgcmFjZXMgKi8KK2V4dGVybiBpbnQgdHNpX3RyYWNpbmdfZW5hYmxlZDsKKworLyogLS0tIHRzaV9mcmFtZV9wcm90ZWN0b3Igb2JqZWN0IC0tLQorCisgIFRoaXMgb2JqZWN0IHByb3RlY3RzIGFuZCB1bnByb3RlY3RzIGJ1ZmZlcnMgb25jZSB0aGUgaGFuZHNoYWtlIGlzIGRvbmUuCisgIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG9iamVjdCBtdXN0IGJlIHRocmVhZCBjb21wYXRpYmxlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdHNpX2ZyYW1lX3Byb3RlY3RvciB0c2lfZnJhbWVfcHJvdGVjdG9yOworCisvKiBPdXRwdXRzIHByb3RlY3RlZCBmcmFtZXMuCisgICAtIHVucHJvdGVjdGVkX2J5dGVzIGlzIGFuIGlucHV0IG9ubHkgcGFyYW1ldGVyIGFuZCBwb2ludHMgdG8gdGhlIGRhdGEKKyAgICAgdG8gYmUgcHJvdGVjdGVkLgorICAgLSB1bnByb3RlY3RlZF9ieXRlc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgY2FsbGVyIHRvCisgICAgIHNwZWNpZnkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiB1bnByb3RlY3RlZF9ieXRlcy4gVGhlIG91dHB1dAorICAgICB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGR1cmluZyB0aGUgY2FsbC4KKyAgIC0gcHJvdGVjdGVkX291dHB1dF9mcmFtZXMgcG9pbnRzIHRvIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIHRoYXQKKyAgICAgd2lsbCBiZSB3cml0dGVuLgorICAgLSBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAgICAgY2FsbGVyIHRvIHNwZWNpZnkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcy4KKyAgICAgQXMgYW4gb3V0cHV0LCB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAtIFRoaXMgbWV0aG9kIHJldHVybnMgVFNJX09LIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBhIHNwZWNpZmljIGVycm9yIGNvZGUgaW4KKyAgICAgY2FzZSBvZiBmYWlsdXJlLiBOb3RlIHRoYXQgZXZlbiBpZiBhbGwgdGhlIGlucHV0IHVucHJvdGVjdGVkIGJ5dGVzIGFyZQorICAgICBjb25zdW1lZCwgdGhleSBtYXkgbm90IGhhdmUgYmVlbiBwcm9jZXNzZWQgaW50byB0aGUgcmV0dXJuZWQgcHJvdGVjdGVkCisgICAgIG91dHB1dCBmcmFtZXMuIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgdGhlIHByb3RlY3RfZmx1c2ggbWV0aG9kCisgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHByb3RlY3RlZCBieXRlcyBidWZmZXJlZCBpbiB0aGUKKyAgICAgcHJvdGVjdG9yLgorCisgICBBIHR5cGljYWwgd2F5IHRvIGNhbGwgdGhpcyBtZXRob2Qgd291bGQgYmU6CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgdW5zaWduZWQgY2hhciBwcm90ZWN0ZWRfYnVmZmVyWzQwOTZdOworICAgc2l6ZV90IHByb3RlY3RlZF9idWZmZXJfc2l6ZSA9IHNpemVvZihwcm90ZWN0ZWRfYnVmZmVyKTsKKyAgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOworICAgd2hpbGUgKG1lc3NhZ2Vfc2l6ZSA+IDApIHsKKyAgICAgc2l6ZV90IHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kID0gcHJvdGVjdGVkX2J1ZmZlcl9zaXplOworICAgICBzaXplX3QgcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSA9IG1lc3NhZ2Vfc2l6ZTsKKyAgICAgcmVzdWx0ID0gdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0KHByb3RlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQpOworICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7CisgICAgIHNlbmRfYnl0ZXNfdG9fcGVlcihwcm90ZWN0ZWRfYnVmZmVyLCBwcm90ZWN0ZWRfYnVmZmVyX3NpemVfdG9fc2VuZCk7CisgICAgIG1lc3NhZ2VfYnl0ZXMgKz0gcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZTsKKyAgICAgbWVzc2FnZV9zaXplIC09IHByb2Nlc3NlZF9tZXNzYWdlX3NpemU7CisKKyAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIGZsdXNoLgorICAgICBpZiAobWVzc2FnZV9zaXplID09IDApIHsKKyAgICAgICBzaXplX3Qgc3RpbGxfcGVuZGluZ19zaXplOworICAgICAgIGRvIHsKKyAgICAgICAgIHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kID0gcHJvdGVjdGVkX2J1ZmZlcl9zaXplOworICAgICAgICAgcmVzdWx0ID0gdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoKAorICAgICAgICAgICAgIHByb3RlY3RvciwgcHJvdGVjdGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAmcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQsICZzdGlsbF9wZW5kaW5nX3NpemUpOworICAgICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOworICAgICAgICAgc2VuZF9ieXRlc190b19wZWVyKHByb3RlY3RlZF9idWZmZXIsIHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kKTsKKyAgICAgICB9IHdoaWxlIChzdGlsbF9wZW5kaW5nX3NpemUgPiAwKTsKKyAgICAgfQorICAgfQorCisgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgSGFuZGxlRXJyb3IocmVzdWx0KTsKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KK3RzaV9yZXN1bHQgdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKTsKKworLyogSW5kaWNhdGVzIHRoYXQgd2UgbmVlZCB0byBmbHVzaCB0aGUgYnl0ZXMgYnVmZmVyZWQgaW4gdGhlIHByb3RlY3RvciBhbmQgZ2V0CisgICB0aGUgcmVzdWx0aW5nIGZyYW1lLgorICAgLSBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcyBwb2ludHMgdG8gYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgdGhhdAorICAgICB3aWxsIGJlIHdyaXR0ZW4uCisgICAtIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgaXMgYW4gaW5wdXQvb3V0cHV0IHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICAgICBjYWxsZXIgdG8gc3BlY2lmeSBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLgorICAgLSBzdGlsbF9wZW5kaW5nX2J5dGVzIGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBmbHVzaGVkIGZyb20gdGhlIHByb3RlY3Rvci4qLwordHNpX3Jlc3VsdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Byb3RlY3RfZmx1c2goCisgICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCisgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplLCBzaXplX3QgKnN0aWxsX3BlbmRpbmdfc2l6ZSk7CisKKy8qIE91dHB1dHMgdW5wcm90ZWN0ZWQgYnl0ZXMuCisgICAtIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXMgaXMgYW4gaW5wdXQgb25seSBwYXJhbWV0ZXIgYW5kIHBvaW50cyB0byB0aGUKKyAgICAgcHJvdGVjdGVkIGZyYW1lcyB0byBiZSB1bnByb3RlY3RlZC4KKyAgIC0gcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBvbmx5IHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICAgICBjYWxsZXIgdG8gc3BlY2lmeSBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHByb3RlY3RlZF9ieXRlcy4gVGhlCisgICAgIG91dHB1dCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGR1cmluZyB0aGUgY2FsbC4KKyAgICAgSW1wbGVtZW50YXRpb25zIHdpbGwgYnVmZmVyIHVwIHRvIGEgZnJhbWUgb2YgcHJvdGVjdGVkIGRhdGEuCisgICAtIHVucHJvdGVjdGVkX2J5dGVzIHBvaW50cyB0byBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciB0aGF0IHdpbGwgYmUKKyAgICAgd3JpdHRlbi4KKyAgIC0gdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSBpcyBhbiBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyIHVzZWQgYnkgdGhlIGNhbGxlciB0bworICAgICBzcGVjaWZ5IGhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdW5wcm90ZWN0ZWRfYnl0ZXMuIFRoaXMKKyAgICAgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgbW9zdCBtYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUgbWludXMgb3ZlcmhlYWQKKyAgICAgd2hpY2ggbWVhbnMgdGhhdCBtYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUgaXMgYSBzYWZlIGJldC4gVGhlIG91dHB1dCB2YWx1ZQorICAgICBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgICAgIElmICp1bnByb3RlY3RlZF9ieXRlc19zaXplIGlzIHVuY2hhbmdlZCwgdGhlcmUgbWF5IGJlIG1vcmUgZGF0YSByZW1haW5pbmcKKyAgICAgdG8gdW5wcm90ZWN0LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLgorCisgICAtIFRoaXMgbWV0aG9kIHJldHVybnMgVFNJX09LIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gU3VjY2VzcyBpbmNsdWRlcyBjYXNlcyB3aGVyZQorICAgICB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgdG8gb3V0cHV0IGEgZnJhbWUgaW4gd2hpY2ggY2FzZQorICAgICB1bnByb3RlY3RlZF9ieXRlc19zaXplIHdpbGwgYmUgc2V0IHRvIDAgYW5kIGNhc2VzIHdoZXJlIHRoZSBpbnRlcm5hbCBidWZmZXIKKyAgICAgbmVlZHMgdG8gYmUgcmVhZCBiZWZvcmUgbmV3IHByb3RlY3RlZCBkYXRhIGNhbiBiZSBwcm9jZXNzZWQgaW4gd2hpY2ggY2FzZQorICAgICBwcm90ZWN0ZWRfZnJhbWVzX3NpemUgd2lsbCBiZSBzZXQgdG8gMC4gICovCit0c2lfcmVzdWx0IHRzaV9mcmFtZV9wcm90ZWN0b3JfdW5wcm90ZWN0KAorICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXMsCisgICAgc2l6ZV90ICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUsIHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAorICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7CisKKy8qIERlc3Ryb3lzIHRoZSB0c2lfZnJhbWVfcHJvdGVjdG9yIG9iamVjdC4gICovCit2b2lkIHRzaV9mcmFtZV9wcm90ZWN0b3JfZGVzdHJveSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmKTsKKworLyogLS0tIHRzaV9wZWVyIG9iamVjdHMgLS0tCisKKyAgIHRzaV9wZWVyIG9iamVjdHMgYXJlIGEgc2V0IG9mIHByb3BlcnRpZXMuIFRoZSBwZWVyIG93bnMgdGhlIHByb3BlcnRpZXMuICAqLworCisvKiBUaGlzIHByb3BlcnR5IGlzIG9mIHR5cGUgVFNJX1BFRVJfUFJPUEVSVFlfU1RSSU5HLiAgKi8KKyNkZWZpbmUgVFNJX0NFUlRJRklDQVRFX1RZUEVfUEVFUl9QUk9QRVJUWSAiY2VydGlmaWNhdGVfdHlwZSIKKworLyogUHJvcGVydHkgdmFsdWVzIG1heSBjb250YWluIE5VTEwgY2hhcmFjdGVycyBqdXN0IGxpa2UgQysrIHN0cmluZ3MuCisgICBUaGUgbGVuZ3RoIGZpZWxkIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKi8KK3R5cGVkZWYgc3RydWN0IHRzaV9wZWVyX3Byb3BlcnR5IHsKKyAgY2hhciAqbmFtZTsKKyAgc3RydWN0IHsKKyAgICBjaGFyICpkYXRhOworICAgIHNpemVfdCBsZW5ndGg7CisgIH0gdmFsdWU7Cit9IHRzaV9wZWVyX3Byb3BlcnR5OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0aWVzOworICBzaXplX3QgcHJvcGVydHlfY291bnQ7Cit9IHRzaV9wZWVyOworCisvKiBEZXN0cnVjdHMgdGhlIHRzaV9wZWVyIG9iamVjdC4gKi8KK3ZvaWQgdHNpX3BlZXJfZGVzdHJ1Y3QodHNpX3BlZXIgKnNlbGYpOworCisvKiAtLS0gdHNpX2hhbmRzaGFrZXIgb2JqZWN0cyAtLS0tCisKKyAgIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG9iamVjdCBtdXN0IGJlIHRocmVhZCBjb21wYXRpYmxlLgorCisgICBBIHR5cGljYWwgdXNhZ2Ugb2YgdGhpcyBvYmplY3Qgd291bGQgYmU6CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7CisgICB1bnNpZ25lZCBjaGFyIGJ1Zls0MDk2XTsKKyAgIHNpemVfdCBidWZfb2Zmc2V0OworICAgc2l6ZV90IGJ1Zl9zaXplOworICAgd2hpbGUgKDEpIHsKKyAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc2VuZCBzb21lIGJ5dGVzIHRvIHRoZSBwZWVyLgorICAgICBkbyB7CisgICAgICAgc2l6ZV90IGJ1Zl9zaXplX3RvX3NlbmQgPSBzaXplb2YoYnVmKTsKKyAgICAgICByZXN1bHQgPSB0c2lfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKGhhbmRzaGFrZXIsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfc2l6ZV90b19zZW5kKTsKKyAgICAgICBpZiAoYnVmX3NpemVfdG9fc2VuZCA+IDApIHNlbmRfYnl0ZXNfdG9fcGVlcihidWYsIGJ1Zl9zaXplX3RvX3NlbmQpOworICAgICB9IHdoaWxlIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSk7CisgICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OworICAgICBpZiAoIXRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKGhhbmRzaGFrZXIpKSBicmVhazsKKworICAgICBkbyB7CisgICAgICAgLy8gUmVhZCBieXRlcyBmcm9tIHRoZSBwZWVyLgorICAgICAgIGJ1Zl9zaXplID0gc2l6ZW9mKGJ1Zik7CisgICAgICAgYnVmX29mZnNldCA9IDA7CisgICAgICAgcmVhZF9ieXRlc19mcm9tX3BlZXIoYnVmLCAmYnVmX3NpemUpOworICAgICAgIGlmIChidWZfc2l6ZSA9PSAwKSBicmVhazsKKworICAgICAgIC8vIFByb2Nlc3MgdGhlIGJ5dGVzIGZyb20gdGhlIHBlZXIuIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhcyB0aGVzZSBieXRlcworICAgICAgIC8vIG1heSBjb250YWluIG5vbi1oYW5kc2hha2UgZGF0YSAocHJvdGVjdGVkIGRhdGEpLiBJZiB0aGlzIGlzIHRoZSBjYXNlLAorICAgICAgIC8vIHdlIHdpbGwgZXhpdCBmcm9tIHRoZSBsb29wIHdpdGggYnVmX3NpemUgPiAwLgorICAgICAgIHNpemVfdCBjb25zdW1lZF9ieV9oYW5kc2hha2VyID0gYnVmX3NpemU7CisgICAgICAgcmVzdWx0ID0gdHNpX2hhbmRzaGFrZXJfcHJvY2Vzc19ieXRlc19mcm9tX3BlZXIoCisgICAgICAgICAgIGhhbmRzaGFrZXIsIGJ1ZiwgJmNvbnN1bWVkX2J5X2hhbmRzaGFrZXIpOworICAgICAgIGJ1Zl9zaXplIC09IGNvbnN1bWVkX2J5X2hhbmRzaGFrZXI7CisgICAgICAgYnVmX29mZnNldCArPSBjb25zdW1lZF9ieV9oYW5kc2hha2VyOworICAgICB9IHdoaWxlIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSk7CisKKyAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7CisgICAgIGlmICghdHNpX2hhbmRzaGFrZXJfaXNfaW5fcHJvZ3Jlc3MoaGFuZHNoYWtlcikpIGJyZWFrOworICAgfQorCisgICAvLyBDaGVjayB0aGUgUGVlci4KKyAgIHRzaV9wZWVyIHBlZXI7CisgICBkbyB7CisgICAgIHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcihoYW5kc2hha2VyLCAmcGVlcik7CisgICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKKyAgICAgcmVzdWx0ID0gY2hlY2tfcGVlcigmcGVlcik7CisgICB9IHdoaWxlICgwKTsKKyAgIHRzaV9wZWVyX2Rlc3RydWN0KCZwZWVyKTsKKyAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OworCisgICAvLyBDcmVhdGUgdGhlIHByb3RlY3Rvci4KKyAgIHRzaV9mcmFtZV9wcm90ZWN0b3IqIHByb3RlY3RvciA9IE5VTEw7CisgICByZXN1bHQgPSB0c2lfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yKGhhbmRzaGFrZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0b3IpOworICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7CisKKyAgIC8vIERvIG5vdCBmb3JnZXQgdG8gdW5wcm90ZWN0IG91dHN0YW5kaW5nIGRhdGEgaWYgYW55LgorICAgaWYgKGJ1Zl9zaXplID4gMCkgeworICAgICByZXN1bHQgPSB0c2lfZnJhbWVfcHJvdGVjdG9yX3VucHJvdGVjdChwcm90ZWN0b3IsIGJ1ZiArIGJ1Zl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCAuLi4sIC4uLik7CisgICAgIC4uLi4KKyAgIH0KKyAgIC4uLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KK3R5cGVkZWYgc3RydWN0IHRzaV9oYW5kc2hha2VyIHRzaV9oYW5kc2hha2VyOworCisvKiBHZXRzIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBzZW50IHRvIHRoZSBwZWVyLgorICAgLSBieXRlcyBpcyB0aGUgYnVmZmVyIHRoYXQgd2lsbCBiZSB3cml0dGVuIHdpdGggdGhlIGRhdGEgdG8gYmUgc2VudCB0byB0aGUKKyAgICAgcGVlci4KKyAgIC0gYnl0ZXNfc2l6ZSBpcyBhbiBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNhcGFjaXR5IG9mIHRoZQorICAgICBieXRlcyBwYXJhbWV0ZXIgYXMgaW5wdXQgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBhcyBvdXRwdXQuCisgICBSZXR1cm5zIFRTSV9PSyBpZiBhbGwgdGhlIGRhdGEgdG8gc2VuZCB0byB0aGUgcGVlciBoYXMgYmVlbiB3cml0dGVuIG9yIGlmCisgICBub3RoaW5nIGhhcyB0byBiZSBzZW50IHRvIHRoZSBwZWVyIChpbiB3aGljaCBiYXNlIGJ5dGVzX3NpemUgb3V0cHV0cyB0byAwKSwKKyAgIG90aGVyd2lzZSByZXR1cm5zIFRTSV9JTkNPTVBMRVRFX0RBVEEgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhpcyBtZXRob2QKKyAgIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbiB0byBnZXQgYWxsIHRoZSBieXRlcyB0byBzZW5kIHRvIHRoZSBwZWVyICh0aGVyZQorICAgd2FzIG1vcmUgZGF0YSB0byB3cml0ZSB0aGFuIHRoZSBzcGVjaWZpZWQgYnl0ZXNfc2l6ZSkuIEluIGNhc2Ugb2YgYSBmYXRhbAorICAgZXJyb3IgaW4gdGhlIGhhbmRzaGFrZSwgYW5vdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIHJldHVybmVkLiAgKi8KK3RzaV9yZXN1bHQgdHNpX2hhbmRzaGFrZXJfZ2V0X2J5dGVzX3RvX3NlbmRfdG9fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpOworCisvKiBQcm9jZXNzZXMgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KKyAgIC0gYnl0ZXMgaXMgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhLgorICAgLSBieXRlc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcworICAgICBpbnB1dCBhbmQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcyBvdXRwdXQuCisgICBSZXR1cm4gVFNJX09LIGlmIHRoZSBoYW5kc2hha2UgaGFzIGFsbCB0aGUgZGF0YSBpdCBuZWVkcyB0byBwcm9jZXNzLAorICAgb3RoZXJ3aXNlIHJldHVybiBUU0lfSU5DT01QTEVURV9EQVRBIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgbWV0aG9kCisgICBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdG8gY29tcGxldGUgdGhlIGRhdGEgbmVlZGVkIGZvciBwcm9jZXNzaW5nLiBJbgorICAgY2FzZSBvZiBhIGZhdGFsIGVycm9yIGluIHRoZSBoYW5kc2hha2UsIGFub3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcworICAgcmV0dXJuZWQuICAqLwordHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNfc2l6ZSk7CisKKy8qIEdldHMgdGhlIHJlc3VsdCBvZiB0aGUgaGFuZHNoYWtlci4KKyAgIFJldHVybnMgVFNJX09LIGlmIHRoZSBoYW5zaGFrZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGVyZSBoYXMgYmVlbiBubworICAgZXJyb3JzLiBSZXR1cm5zIFRTSV9IQU5EU0hBS0VfSU5fUFJPR1JFU1MgaWYgdGhlIGhhbmRzaGFrZXIgaXMgbm90IGRvbmUgeWV0CisgICBidXQgbm8gZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQgc28gZmFyLiBPdGhlcndpc2UgdGhlIGhhbmRzaGFrZXIgZmFpbGVkCisgICB3aXRoIHRoZSByZXR1cm5lZCBlcnJvci4gICovCit0c2lfcmVzdWx0IHRzaV9oYW5kc2hha2VyX2dldF9yZXN1bHQodHNpX2hhbmRzaGFrZXIgKnNlbGYpOworCisvKiBSZXR1cm5zIDEgaWYgdGhlIGhhbmRzaGFrZSBpcyBpbiBwcm9ncmVzcywgMCBvdGhlcndpc2UuICAqLworI2RlZmluZSB0c2lfaGFuZHNoYWtlcl9pc19pbl9wcm9ncmVzcyhoKSBcCisgICh0c2lfaGFuZHNoYWtlcl9nZXRfcmVzdWx0KChoKSkgPT0gVFNJX0hBTkRTSEFLRV9JTl9QUk9HUkVTUykKKworLyogVGhpcyBtZXRob2QgbWF5IHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTiBpZgorICAgdHNpX2hhbmRzaGFrZXJfaXNfaW5fcHJvZ3Jlc3MgcmV0dXJucyAxLCBpdCByZXR1cm5zIFRTSV9PSyBvdGhlcndpc2UKKyAgIGFzc3VtaW5nIHRoZSBoYW5kc2hha2VyIGlzIG5vdCBpbiBhIGZhdGFsIGVycm9yIHN0YXRlLgorICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVzdHJ1Y3RpbmcgdGhlIHBlZXIuICAqLwordHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9leHRyYWN0X3BlZXIodHNpX2hhbmRzaGFrZXIgKnNlbGYsIHRzaV9wZWVyICpwZWVyKTsKKworLyogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHRzaV9mcmFtZV9wcm90ZWN0b3Igb2JqZWN0IGFmdGVyIHRoZSBoYW5kc2hha2UgcGhhc2UKKyAgIGlzIGRvbmUuIEFmdGVyIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHksIHRoZSBvbmx5IG1ldGhvZAorICAgdGhhdCBjYW4gYmUgY2FsbGVkIG9uIHRoaXMgb2JqZWN0IGlzIERlc3Ryb3kuCisgICAtIG1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemUgaXMgYW4gaW5wdXQvb3V0cHV0IHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZQorICAgICBkZXNpcmVkIG1heCBvdXRwdXQgcHJvdGVjdGVkIGZyYW1lIHNpemUgYXMgaW5wdXQgYW5kIG91dHB1dGluZyB0aGUgYWN0dWFsCisgICAgIG1heCBvdXRwdXQgZnJhbWUgc2l6ZSBhcyB0aGUgb3V0cHV0LiBQYXNzaW5nIE5VTEwgaXMgT0sgYW5kIHdpbGwgcmVzdWx0IGluCisgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBjaG9vc2luZyB0aGUgZGVmYXVsdCBtYXhpbXVtIHByb3RlY3RlZCBmcmFtZSBzaXplLiBOb3RlCisgICAgIHRoYXQgdGhpcyBzaXplIG9ubHkgYXBwbGllcyB0byBvdXRnb2luZyBmcmFtZXMgKGdlbmVyYXRlZCB3aXRoCisgICAgIHRzaV9mcmFtZV9wcm90ZWN0b3JfcHJvdGVjdCkgYW5kIG5vdCBpbmNvbWluZyBmcmFtZXMgKGlucHV0IG9mCisgICAgIHRzaV9mcmFtZV9wcm90ZWN0b3JfdW5wcm90ZWN0KS4KKyAgIC0gcHJvdGVjdG9yIGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgcG9pbnRpbmcgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKKyAgICAgdHNpX2ZyYW1lX3Byb3RlY3RvciBvYmplY3QuCisgICBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OIGlmCisgICB0c2lfaGFuZHNoYWtlcl9pc19pbl9wcm9ncmVzcyByZXR1cm5zIDEsIGl0IHJldHVybnMgVFNJX09LIG90aGVyd2lzZSBhc3N1bWluZworICAgdGhlIGhhbmRzaGFrZXIgaXMgbm90IGluIGEgZmF0YWwgZXJyb3Igc3RhdGUuCisgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZXN0cm95aW5nIHRoZSBwcm90ZWN0b3IuICAqLwordHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yKAorICAgIHRzaV9oYW5kc2hha2VyICpzZWxmLCBzaXplX3QgKm1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemUsCisgICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqKnByb3RlY3Rvcik7CisKKy8qIFRoaXMgbWV0aG9kIHJlbGVhc2VzIHRoZSB0c2lfaGFuZHNoYWtlciBvYmplY3QuIEFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKKyAgIG5vIG90aGVyIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIHRoZSBvYmplY3QuICAqLwordm9pZCB0c2lfaGFuZHNoYWtlcl9kZXN0cm95KHRzaV9oYW5kc2hha2VyICpzZWxmKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEdSUENfQ09SRV9MSUJfVFNJX1RSQU5TUE9SVF9TRUNVUklUWV9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIGIvc3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDY3ZjUyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdSUENfQkFTSUNfUFJPRklMRVIKLQotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXR5cGVkZWYgZW51bSB7IEJFR0lOID0gJ3snLCBFTkQgPSAnfScsIE1BUksgPSAnLicgfSBtYXJrZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3ByX3RpbWVyX2VudHJ5IHsKLSAgZ3ByX3RpbWVzcGVjIHRtOwotICBjb25zdCBjaGFyICp0YWdzdHI7Ci0gIGNvbnN0IGNoYXIgKmZpbGU7Ci0gIHNob3J0IGxpbmU7Ci0gIGNoYXIgdHlwZTsKLSAgdWludDhfdCBpbXBvcnRhbnQ7Ci0gIGludCB0aGQ7Ci19IGdwcl90aW1lcl9lbnRyeTsKLQotI2RlZmluZSBNQVhfQ09VTlQgMTAwMDAwMAotCi10eXBlZGVmIHN0cnVjdCBncHJfdGltZXJfbG9nIHsKLSAgc2l6ZV90IG51bV9lbnRyaWVzOwotICBzdHJ1Y3QgZ3ByX3RpbWVyX2xvZyAqbmV4dDsKLSAgc3RydWN0IGdwcl90aW1lcl9sb2cgKnByZXY7Ci0gIGdwcl90aW1lcl9lbnRyeSBsb2dbTUFYX0NPVU5UXTsKLX0gZ3ByX3RpbWVyX2xvZzsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3ByX3RpbWVyX2xvZ19saXN0IHsKLSAgZ3ByX3RpbWVyX2xvZyAqaGVhZDsKLSAgLyogdmFsaWQgaWZmIGhlYWQhPU5VTEwgKi8KLSAgZ3ByX3RpbWVyX2xvZyAqdGFpbDsKLX0gZ3ByX3RpbWVyX2xvZ19saXN0OwotCi1zdGF0aWMgX190aHJlYWQgZ3ByX3RpbWVyX2xvZyAqZ190aHJlYWRfbG9nOwotc3RhdGljIGdwcl9vbmNlIGdfb25jZV9pbml0ID0gR1BSX09OQ0VfSU5JVDsKLXN0YXRpYyBGSUxFICpvdXRwdXRfZmlsZTsKLXN0YXRpYyBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWUgPSAibGF0ZW5jeV90cmFjZS50eHQiOwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnX211Owotc3RhdGljIHB0aHJlYWRfY29uZF90IGdfY3Y7Ci1zdGF0aWMgZ3ByX3RpbWVyX2xvZ19saXN0IGdfaW5fcHJvZ3Jlc3NfbG9nczsKLXN0YXRpYyBncHJfdGltZXJfbG9nX2xpc3QgZ19kb25lX2xvZ3M7Ci1zdGF0aWMgaW50IGdfc2h1dGRvd247Ci1zdGF0aWMgZ3ByX3RoZF9pZCBnX3dyaXRpbmdfdGhyZWFkOwotc3RhdGljIF9fdGhyZWFkIGludCBnX3RocmVhZF9pZDsKLXN0YXRpYyBpbnQgZ19uZXh0X3RocmVhZF9pZDsKLQotc3RhdGljIGludCB0aW1lcl9sb2dfcHVzaF9iYWNrKGdwcl90aW1lcl9sb2dfbGlzdCAqbGlzdCwgZ3ByX3RpbWVyX2xvZyAqbG9nKSB7Ci0gIGlmIChsaXN0LT5oZWFkID09IE5VTEwpIHsKLSAgICBsaXN0LT5oZWFkID0gbGlzdC0+dGFpbCA9IGxvZzsKLSAgICBsb2ctPm5leHQgPSBsb2ctPnByZXYgPSBOVUxMOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIGxvZy0+cHJldiA9IGxpc3QtPnRhaWw7Ci0gICAgbG9nLT5uZXh0ID0gTlVMTDsKLSAgICBsaXN0LT50YWlsLT5uZXh0ID0gbG9nOwotICAgIGxpc3QtPnRhaWwgPSBsb2c7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotc3RhdGljIGdwcl90aW1lcl9sb2cgKnRpbWVyX2xvZ19wb3BfZnJvbnQoZ3ByX3RpbWVyX2xvZ19saXN0ICpsaXN0KSB7Ci0gIGdwcl90aW1lcl9sb2cgKm91dCA9IGxpc3QtPmhlYWQ7Ci0gIGlmIChvdXQgIT0gTlVMTCkgewotICAgIGxpc3QtPmhlYWQgPSBvdXQtPm5leHQ7Ci0gICAgaWYgKGxpc3QtPmhlYWQgIT0gTlVMTCkgewotICAgICAgbGlzdC0+aGVhZC0+cHJldiA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxpc3QtPnRhaWwgPSBOVUxMOwotICAgIH0KLSAgfQotICByZXR1cm4gb3V0OwotfQotCi1zdGF0aWMgdm9pZCB0aW1lcl9sb2dfcmVtb3ZlKGdwcl90aW1lcl9sb2dfbGlzdCAqbGlzdCwgZ3ByX3RpbWVyX2xvZyAqbG9nKSB7Ci0gIGlmIChsb2ctPnByZXYgPT0gTlVMTCkgewotICAgIGxpc3QtPmhlYWQgPSBsb2ctPm5leHQ7Ci0gICAgaWYgKGxpc3QtPmhlYWQgIT0gTlVMTCkgewotICAgICAgbGlzdC0+aGVhZC0+cHJldiA9IE5VTEw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGxvZy0+cHJldi0+bmV4dCA9IGxvZy0+bmV4dDsKLSAgfQotICBpZiAobG9nLT5uZXh0ID09IE5VTEwpIHsKLSAgICBsaXN0LT50YWlsID0gbG9nLT5wcmV2OwotICAgIGlmIChsaXN0LT50YWlsICE9IE5VTEwpIHsKLSAgICAgIGxpc3QtPnRhaWwtPm5leHQgPSBOVUxMOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBsb2ctPm5leHQtPnByZXYgPSBsb2ctPnByZXY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfbG9nKGdwcl90aW1lcl9sb2cgKmxvZykgewotICBzaXplX3QgaTsKLSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpIHsKLSAgICBvdXRwdXRfZmlsZSA9IGZvcGVuKG91dHB1dF9maWxlbmFtZSwgInciKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgbG9nLT5udW1fZW50cmllczsgaSsrKSB7Ci0gICAgZ3ByX3RpbWVyX2VudHJ5ICplbnRyeSA9ICYobG9nLT5sb2dbaV0pOwotICAgIGlmIChncHJfdGltZV9jbXAoZW50cnktPnRtLCBncHJfdGltZV8wKGVudHJ5LT50bS5jbG9ja190eXBlKSkgPCAwKSB7Ci0gICAgICBlbnRyeS0+dG0gPSBncHJfdGltZV8wKGVudHJ5LT50bS5jbG9ja190eXBlKTsKLSAgICB9Ci0gICAgZnByaW50ZihvdXRwdXRfZmlsZSwKLSAgICAgICAgICAgICJ7XCJ0XCI6ICVsbGQuJTA5ZCwgXCJ0aGRcIjogXCIlZFwiLCBcInR5cGVcIjogXCIlY1wiLCBcInRhZ1wiOiAiCi0gICAgICAgICAgICAiXCIlc1wiLCBcImZpbGVcIjogXCIlc1wiLCBcImxpbmVcIjogJWQsIFwiaW1wXCI6ICVkfVxuIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpZW50cnktPnRtLnR2X3NlYywgKGludCllbnRyeS0+dG0udHZfbnNlYywgZW50cnktPnRoZCwKLSAgICAgICAgICAgIGVudHJ5LT50eXBlLCBlbnRyeS0+dGFnc3RyLCBlbnRyeS0+ZmlsZSwgZW50cnktPmxpbmUsCi0gICAgICAgICAgICBlbnRyeS0+aW1wb3J0YW50KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB3cml0aW5nX3RocmVhZCh2b2lkICp1bnVzZWQpIHsKLSAgZ3ByX3RpbWVyX2xvZyAqbG9nOwotICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXUpOwotICBmb3IgKDs7KSB7Ci0gICAgd2hpbGUgKChsb2cgPSB0aW1lcl9sb2dfcG9wX2Zyb250KCZnX2RvbmVfbG9ncykpID09IE5VTEwgJiYgIWdfc2h1dGRvd24pIHsKLSAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZnX2N2LCAmZ19tdSk7Ci0gICAgfQotICAgIGlmIChsb2cgIT0gTlVMTCkgewotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXUpOwotICAgICAgd3JpdGVfbG9nKGxvZyk7Ci0gICAgICBmcmVlKGxvZyk7Ci0gICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXUpOwotICAgIH0KLSAgICBpZiAoZ19zaHV0ZG93bikgewotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBmbHVzaF9sb2dzKGdwcl90aW1lcl9sb2dfbGlzdCAqbGlzdCkgewotICBncHJfdGltZXJfbG9nICpsb2c7Ci0gIHdoaWxlICgobG9nID0gdGltZXJfbG9nX3BvcF9mcm9udChsaXN0KSkgIT0gTlVMTCkgewotICAgIHdyaXRlX2xvZyhsb2cpOwotICAgIGZyZWUobG9nKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBmaW5pc2hfd3JpdGluZygpIHsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211KTsKLSAgZ19zaHV0ZG93biA9IDE7Ci0gIHB0aHJlYWRfY29uZF9zaWduYWwoJmdfY3YpOwotICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdSk7Ci0gIGdwcl90aGRfam9pbihnX3dyaXRpbmdfdGhyZWFkKTsKLQotICBncHJfbG9nKEdQUl9JTkZPLCAiZmx1c2hpbmcgbG9ncyIpOwotCi0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdSk7Ci0gIGZsdXNoX2xvZ3MoJmdfZG9uZV9sb2dzKTsKLSAgZmx1c2hfbG9ncygmZ19pbl9wcm9ncmVzc19sb2dzKTsKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXUpOwotCi0gIGlmIChvdXRwdXRfZmlsZSkgewotICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7Ci0gIH0KLX0KLQotdm9pZCBncHJfdGltZXJzX3NldF9sb2dfZmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfb3V0cHV0KCkgewotICBncHJfdGhkX29wdGlvbnMgb3B0aW9ucyA9IGdwcl90aGRfb3B0aW9uc19kZWZhdWx0KCk7Ci0gIGdwcl90aGRfb3B0aW9uc19zZXRfam9pbmFibGUoJm9wdGlvbnMpOwotICBncHJfdGhkX25ldygmZ193cml0aW5nX3RocmVhZCwgd3JpdGluZ190aHJlYWQsIE5VTEwsICZvcHRpb25zKTsKLSAgYXRleGl0KGZpbmlzaF93cml0aW5nKTsKLX0KLQotc3RhdGljIHZvaWQgcm90YXRlX2xvZygpIHsKLSAgZ3ByX3RpbWVyX2xvZyAqbmV3ID0gbWFsbG9jKHNpemVvZigqbmV3KSk7Ci0gIGdwcl9vbmNlX2luaXQoJmdfb25jZV9pbml0LCBpbml0X291dHB1dCk7Ci0gIG5ldy0+bnVtX2VudHJpZXMgPSAwOwotICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXUpOwotICBpZiAoZ190aHJlYWRfbG9nICE9IE5VTEwpIHsKLSAgICB0aW1lcl9sb2dfcmVtb3ZlKCZnX2luX3Byb2dyZXNzX2xvZ3MsIGdfdGhyZWFkX2xvZyk7Ci0gICAgaWYgKHRpbWVyX2xvZ19wdXNoX2JhY2soJmdfZG9uZV9sb2dzLCBnX3RocmVhZF9sb2cpKSB7Ci0gICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZnX2N2KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZ190aHJlYWRfaWQgPSBnX25leHRfdGhyZWFkX2lkKys7Ci0gIH0KLSAgdGltZXJfbG9nX3B1c2hfYmFjaygmZ19pbl9wcm9ncmVzc19sb2dzLCBuZXcpOwotICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdSk7Ci0gIGdfdGhyZWFkX2xvZyA9IG5ldzsKLX0KLQotc3RhdGljIHZvaWQgZ3ByX3RpbWVyc19sb2dfYWRkKGNvbnN0IGNoYXIgKnRhZ3N0ciwgbWFya2VyX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1wb3J0YW50LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgewotICBncHJfdGltZXJfZW50cnkgKmVudHJ5OwotCi0gIGlmIChnX3RocmVhZF9sb2cgPT0gTlVMTCB8fCBnX3RocmVhZF9sb2ctPm51bV9lbnRyaWVzID09IE1BWF9DT1VOVCkgewotICAgIHJvdGF0ZV9sb2coKTsKLSAgfQotCi0gIGVudHJ5ID0gJmdfdGhyZWFkX2xvZy0+bG9nW2dfdGhyZWFkX2xvZy0+bnVtX2VudHJpZXMrK107Ci0KLSAgZW50cnktPnRtID0gZ3ByX25vdyhHUFJfQ0xPQ0tfUFJFQ0lTRSk7Ci0gIGVudHJ5LT50YWdzdHIgPSB0YWdzdHI7Ci0gIGVudHJ5LT50eXBlID0gdHlwZTsKLSAgZW50cnktPmZpbGUgPSBmaWxlOwotICBlbnRyeS0+bGluZSA9IChzaG9ydClsaW5lOwotICBlbnRyeS0+aW1wb3J0YW50ID0gaW1wb3J0YW50ICE9IDA7Ci0gIGVudHJ5LT50aGQgPSBnX3RocmVhZF9pZDsKLX0KLQotLyogTGF0ZW5jeSBwcm9maWxlciBBUEkgaW1wbGVtZW50YXRpb24uICovCi12b2lkIGdwcl90aW1lcl9hZGRfbWFyayhjb25zdCBjaGFyICp0YWdzdHIsIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfdGltZXJzX2xvZ19hZGQodGFnc3RyLCBNQVJLLCBpbXBvcnRhbnQsIGZpbGUsIGxpbmUpOwotfQotCi12b2lkIGdwcl90aW1lcl9iZWdpbihjb25zdCBjaGFyICp0YWdzdHIsIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfdGltZXJzX2xvZ19hZGQodGFnc3RyLCBCRUdJTiwgaW1wb3J0YW50LCBmaWxlLCBsaW5lKTsKLX0KLQotdm9pZCBncHJfdGltZXJfZW5kKGNvbnN0IGNoYXIgKnRhZ3N0ciwgaW50IGltcG9ydGFudCwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfdGltZXJzX2xvZ19hZGQodGFnc3RyLCBFTkQsIGltcG9ydGFudCwgZmlsZSwgbGluZSk7Ci19Ci0KLS8qIEJhc2ljIHByb2ZpbGVyIHNwZWNpZmljIEFQSSBmdW5jdGlvbnMuICovCi12b2lkIGdwcl90aW1lcnNfZ2xvYmFsX2luaXQodm9pZCkge30KLQotdm9pZCBncHJfdGltZXJzX2dsb2JhbF9kZXN0cm95KHZvaWQpIHt9Ci0KLSNlbHNlICAvKiAhR1JQQ19CQVNJQ19QUk9GSUxFUiAqLwotdm9pZCBncHJfdGltZXJzX2dsb2JhbF9pbml0KHZvaWQpIHt9Ci0KLXZvaWQgZ3ByX3RpbWVyc19nbG9iYWxfZGVzdHJveSh2b2lkKSB7fQotCi12b2lkIGdwcl90aW1lcnNfc2V0X2xvZ19maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSkge30KLSNlbmRpZiAvKiBHUlBDX0JBU0lDX1BST0ZJTEVSICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9wcm9maWxpbmcvc3RhcF90aW1lcnMuYyBiL3NyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNkMWFmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1JQQ19TVEFQX1BST0ZJTEVSCi0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0KLSNpbmNsdWRlIDxzeXMvc2R0Lmg+Ci0vKiBHZW5lcmF0ZWQgZnJvbSBzcmMvY29yZS9wcm9maWxpbmcvc3RhcF9wcm9iZXMuZCAqLwotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5oIgotCi0vKiBMYXRlbmN5IHByb2ZpbGVyIEFQSSBpbXBsZW1lbnRhdGlvbi4gKi8KLXZvaWQgZ3ByX3RpbWVyX2FkZF9tYXJrKGludCB0YWcsIGNvbnN0IGNoYXIgKnRhZ3N0ciwgdm9pZCAqaWQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBfU1RBUF9BRERfTUFSSyh0YWcpOwotfQotCi12b2lkIGdwcl90aW1lcl9hZGRfaW1wb3J0YW50X21hcmsoaW50IHRhZywgY29uc3QgY2hhciAqdGFnc3RyLCB2b2lkICppZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgewotICBfU1RBUF9BRERfSU1QT1JUQU5UX01BUksodGFnKTsKLX0KLQotdm9pZCBncHJfdGltZXJfYmVnaW4oaW50IHRhZywgY29uc3QgY2hhciAqdGFnc3RyLCB2b2lkICppZCwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7Ci0gIF9TVEFQX1RJTUlOR19OU19CRUdJTih0YWcpOwotfQotCi12b2lkIGdwcl90aW1lcl9lbmQoaW50IHRhZywgY29uc3QgY2hhciAqdGFnc3RyLCB2b2lkICppZCwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBfU1RBUF9USU1JTkdfTlNfRU5EKHRhZyk7Ci19Ci0KLSNlbmRpZiAvKiBHUlBDX1NUQVBfUFJPRklMRVIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCBiL3NyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExODhkYy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1BST0ZJTElOR19USU1FUlNfSAotI2RlZmluZSBHUlBDX0NPUkVfUFJPRklMSU5HX1RJTUVSU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBncHJfdGltZXJzX2dsb2JhbF9pbml0KHZvaWQpOwotdm9pZCBncHJfdGltZXJzX2dsb2JhbF9kZXN0cm95KHZvaWQpOwotCi12b2lkIGdwcl90aW1lcl9hZGRfbWFyayhjb25zdCBjaGFyICp0YWdzdHIsIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7Ci12b2lkIGdwcl90aW1lcl9iZWdpbihjb25zdCBjaGFyICp0YWdzdHIsIGludCBpbXBvcnRhbnQsIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7Ci12b2lkIGdwcl90aW1lcl9lbmQoY29uc3QgY2hhciAqdGFnc3RyLCBpbnQgaW1wb3J0YW50LCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKLQotdm9pZCBncHJfdGltZXJzX3NldF9sb2dfZmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotCi0jaWYgIShkZWZpbmVkKEdSUENfU1RBUF9QUk9GSUxFUikgKyBkZWZpbmVkKEdSUENfQkFTSUNfUFJPRklMRVIpKQotLyogTm8gcHJvZmlsaW5nLiBOby1vcCBhbGwgdGhlIHRoaW5ncy4gKi8KLSNkZWZpbmUgR1BSX1RJTUVSX01BUksodGFnLCBpbXBvcnRhbnQpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBHUFJfVElNRVJfQkVHSU4odGFnLCBpbXBvcnRhbnQpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR1BSX1RJTUVSX0VORCh0YWcsIGltcG9ydGFudCkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNlbHNlIC8qIGF0IGxlYXN0IG9uZSBwcm9maWxlciByZXF1ZXN0ZWQuLi4gKi8KLS8qIC4uLiBob3BlZnVsbHkgb25seSBvbmUuICovCi0jaWYgZGVmaW5lZChHUlBDX1NUQVBfUFJPRklMRVIpICYmIGRlZmluZWQoR1JQQ19CQVNJQ19QUk9GSUxFUikKLSNlcnJvciAiR1JQQ19TVEFQX1BST0ZJTEVSIGFuZCBHUlBDX0JBU0lDX1BST0ZJTEVSIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIgotI2VuZGlmCi0KLS8qIEdlbmVyaWMgcHJvZmlsaW5nIGludGVyZmFjZS4gKi8KLSNkZWZpbmUgR1BSX1RJTUVSX01BUksodGFnLCBpbXBvcnRhbnQpIFwKLSAgZ3ByX3RpbWVyX2FkZF9tYXJrKHRhZywgaW1wb3J0YW50LCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi0jZGVmaW5lIEdQUl9USU1FUl9CRUdJTih0YWcsIGltcG9ydGFudCkgXAotICBncHJfdGltZXJfYmVnaW4odGFnLCBpbXBvcnRhbnQsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0KLSNkZWZpbmUgR1BSX1RJTUVSX0VORCh0YWcsIGltcG9ydGFudCkgXAotICBncHJfdGltZXJfZW5kKHRhZywgaW1wb3J0YW50LCBfX0ZJTEVfXywgX19MSU5FX18pOwotCi0jaWZkZWYgR1JQQ19TVEFQX1BST0ZJTEVSCi0vKiBFbXB0eSBwbGFjZWhvbGRlciBmb3Igbm93LiAqLwotI2VuZGlmIC8qIEdSUENfU1RBUF9QUk9GSUxFUiAqLwotCi0jaWZkZWYgR1JQQ19CQVNJQ19QUk9GSUxFUgotLyogRW1wdHkgcGxhY2Vob2xkZXIgZm9yIG5vdy4gKi8KLSNlbmRpZiAvKiBHUlBDX0JBU0lDX1BST0ZJTEVSICovCi0KLSNlbmRpZiAvKiBhdCBsZWFzdCBvbmUgcHJvZmlsZXIgcmVxdWVzdGVkLiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLQotI2lmIChkZWZpbmVkKEdSUENfU1RBUF9QUk9GSUxFUikgKyBkZWZpbmVkKEdSUENfQkFTSUNfUFJPRklMRVIpKQotbmFtZXNwYWNlIGdycGMgewotY2xhc3MgUHJvZmlsZVNjb3BlIHsKLSBwdWJsaWM6Ci0gIFByb2ZpbGVTY29wZShjb25zdCBjaGFyICpkZXNjLCBib29sIGltcG9ydGFudCkgOiBkZXNjXyhkZXNjKSB7Ci0gICAgR1BSX1RJTUVSX0JFR0lOKGRlc2NfLCBpbXBvcnRhbnQgPyAxIDogMCk7Ci0gIH0KLSAgflByb2ZpbGVTY29wZSgpIHsgR1BSX1RJTUVSX0VORChkZXNjXywgMCk7IH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGNoYXIgKmNvbnN0IGRlc2NfOwotfTsKLX0KLQotI2RlZmluZSBHUFJfVElNRVJfU0NPUEUodGFnLCBpbXBvcnRhbnQpIFwKLSAgOjpncnBjOjpQcm9maWxlU2NvcGUgX3Byb2ZpbGVfc2NvcGVfIyNfX0xJTkVfXygodGFnKSwgKGltcG9ydGFudCkpCi0jZWxzZQotI2RlZmluZSBHUFJfVElNRVJfU0NPUEUodGFnLCBpbXBvcnRhbnQpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9QUk9GSUxJTkdfVElNRVJTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIGIvc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWFlMzAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW5vcGIgY29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KLS8qIEdlbmVyYXRlZCBieSBuYW5vcGItMC4zLjUtZGV2ICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIKLQotI2lmIFBCX1BST1RPX0hFQURFUl9WRVJTSU9OICE9IDMwCi0jZXJyb3IgUmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIG5hbm9wYiBnZW5lcmF0b3IuCi0jZW5kaWYKLQotCi0KLWNvbnN0IHBiX2ZpZWxkX3QgZ3JwY19sYl92MF9EdXJhdGlvbl9maWVsZHNbM10gPSB7Ci0gICAgUEJfRklFTEQoICAxLCBJTlQ2NCAgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBGSVJTVCwgZ3JwY19sYl92MF9EdXJhdGlvbiwgc2Vjb25kcywgc2Vjb25kcywgMCksCi0gICAgUEJfRklFTEQoICAyLCBJTlQzMiAgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9EdXJhdGlvbiwgbmFub3MsIHNlY29uZHMsIDApLAotICAgIFBCX0xBU1RfRklFTEQKLX07Ci0KLWNvbnN0IHBiX2ZpZWxkX3QgZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlcXVlc3RfZmllbGRzWzNdID0gewotICAgIFBCX0ZJRUxEKCAgMSwgTUVTU0FHRSAsIE9QVElPTkFMLCBTVEFUSUMgICwgRklSU1QsIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0LCBpbml0aWFsX3JlcXVlc3QsIGluaXRpYWxfcmVxdWVzdCwgJmdycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVxdWVzdF9maWVsZHMpLAotICAgIFBCX0ZJRUxEKCAgMiwgTUVTU0FHRSAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0LCBjbGllbnRfc3RhdHMsIGluaXRpYWxfcmVxdWVzdCwgJmdycGNfbGJfdjBfQ2xpZW50U3RhdHNfZmllbGRzKSwKLSAgICBQQl9MQVNUX0ZJRUxECi19OwotCi1jb25zdCBwYl9maWVsZF90IGdycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVxdWVzdF9maWVsZHNbMl0gPSB7Ci0gICAgUEJfRklFTEQoICAxLCBTVFJJTkcgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBGSVJTVCwgZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXF1ZXN0LCBuYW1lLCBuYW1lLCAwKSwKLSAgICBQQl9MQVNUX0ZJRUxECi19OwotCi1jb25zdCBwYl9maWVsZF90IGdycGNfbGJfdjBfQ2xpZW50U3RhdHNfZmllbGRzWzRdID0gewotICAgIFBCX0ZJRUxEKCAgMSwgSU5UNjQgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgRklSU1QsIGdycGNfbGJfdjBfQ2xpZW50U3RhdHMsIHRvdGFsX3JlcXVlc3RzLCB0b3RhbF9yZXF1ZXN0cywgMCksCi0gICAgUEJfRklFTEQoICAyLCBJTlQ2NCAgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9DbGllbnRTdGF0cywgY2xpZW50X3JwY19lcnJvcnMsIHRvdGFsX3JlcXVlc3RzLCAwKSwKLSAgICBQQl9GSUVMRCggIDMsIElOVDY0ICAgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX0NsaWVudFN0YXRzLCBkcm9wcGVkX3JlcXVlc3RzLCBjbGllbnRfcnBjX2Vycm9ycywgMCksCi0gICAgUEJfTEFTVF9GSUVMRAotfTsKLQotY29uc3QgcGJfZmllbGRfdCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2VfZmllbGRzWzNdID0gewotICAgIFBCX0ZJRUxEKCAgMSwgTUVTU0FHRSAsIE9QVElPTkFMLCBTVEFUSUMgICwgRklSU1QsIGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSwgaW5pdGlhbF9yZXNwb25zZSwgaW5pdGlhbF9yZXNwb25zZSwgJmdycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVzcG9uc2VfZmllbGRzKSwKLSAgICBQQl9GSUVMRCggIDIsIE1FU1NBR0UgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2UsIHNlcnZlcl9saXN0LCBpbml0aWFsX3Jlc3BvbnNlLCAmZ3JwY19sYl92MF9TZXJ2ZXJMaXN0X2ZpZWxkcyksCi0gICAgUEJfTEFTVF9GSUVMRAotfTsKLQotY29uc3QgcGJfZmllbGRfdCBncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlX2ZpZWxkc1s0XSA9IHsKLSAgICBQQl9GSUVMRCggIDEsIFNUUklORyAgLCBPUFRJT05BTCwgU1RBVElDICAsIEZJUlNULCBncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlLCBjbGllbnRfY29uZmlnLCBjbGllbnRfY29uZmlnLCAwKSwKLSAgICBQQl9GSUVMRCggIDIsIFNUUklORyAgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlLCBsb2FkX2JhbGFuY2VyX2RlbGVnYXRlLCBjbGllbnRfY29uZmlnLCAwKSwKLSAgICBQQl9GSUVMRCggIDMsIE1FU1NBR0UgLCBPUFRJT05BTCwgU1RBVElDICAsIE9USEVSLCBncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlLCBjbGllbnRfc3RhdHNfcmVwb3J0X2ludGVydmFsLCBsb2FkX2JhbGFuY2VyX2RlbGVnYXRlLCAmZ3JwY19sYl92MF9EdXJhdGlvbl9maWVsZHMpLAotICAgIFBCX0xBU1RfRklFTEQKLX07Ci0KLWNvbnN0IHBiX2ZpZWxkX3QgZ3JwY19sYl92MF9TZXJ2ZXJMaXN0X2ZpZWxkc1szXSA9IHsKLSAgICBQQl9GSUVMRCggIDEsIE1FU1NBR0UgLCBSRVBFQVRFRCwgQ0FMTEJBQ0ssIEZJUlNULCBncnBjX2xiX3YwX1NlcnZlckxpc3QsIHNlcnZlcnMsIHNlcnZlcnMsICZncnBjX2xiX3YwX1NlcnZlcl9maWVsZHMpLAotICAgIFBCX0ZJRUxEKCAgMywgTUVTU0FHRSAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfU2VydmVyTGlzdCwgZXhwaXJhdGlvbl9pbnRlcnZhbCwgc2VydmVycywgJmdycGNfbGJfdjBfRHVyYXRpb25fZmllbGRzKSwKLSAgICBQQl9MQVNUX0ZJRUxECi19OwotCi1jb25zdCBwYl9maWVsZF90IGdycGNfbGJfdjBfU2VydmVyX2ZpZWxkc1s1XSA9IHsKLSAgICBQQl9GSUVMRCggIDEsIFNUUklORyAgLCBPUFRJT05BTCwgU1RBVElDICAsIEZJUlNULCBncnBjX2xiX3YwX1NlcnZlciwgaXBfYWRkcmVzcywgaXBfYWRkcmVzcywgMCksCi0gICAgUEJfRklFTEQoICAyLCBJTlQzMiAgICwgT1BUSU9OQUwsIFNUQVRJQyAgLCBPVEhFUiwgZ3JwY19sYl92MF9TZXJ2ZXIsIHBvcnQsIGlwX2FkZHJlc3MsIDApLAotICAgIFBCX0ZJRUxEKCAgMywgQllURVMgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfU2VydmVyLCBsb2FkX2JhbGFuY2VfdG9rZW4sIHBvcnQsIDApLAotICAgIFBCX0ZJRUxEKCAgNCwgQk9PTCAgICAsIE9QVElPTkFMLCBTVEFUSUMgICwgT1RIRVIsIGdycGNfbGJfdjBfU2VydmVyLCBkcm9wX3JlcXVlc3QsIGxvYWRfYmFsYW5jZV90b2tlbiwgMCksCi0gICAgUEJfTEFTVF9GSUVMRAotfTsKLQotCi0vKiBDaGVjayB0aGF0IGZpZWxkIGluZm9ybWF0aW9uIGZpdHMgaW4gcGJfZmllbGRfdCAqLwotI2lmICFkZWZpbmVkKFBCX0ZJRUxEXzMyQklUKQotLyogSWYgeW91IGdldCBhbiBlcnJvciBoZXJlLCBpdCBtZWFucyB0aGF0IHlvdSBuZWVkIHRvIGRlZmluZSBQQl9GSUVMRF8zMkJJVAotICogY29tcGlsZS10aW1lIG9wdGlvbi4gWW91IGNhbiBkbyB0aGF0IGluIHBiLmggb3Igb24gY29tcGlsZXIgY29tbWFuZCBsaW5lLgotICogCi0gKiBUaGUgcmVhc29uIHlvdSBuZWVkIHRvIGRvIHRoaXMgaXMgdGhhdCBzb21lIG9mIHlvdXIgbWVzc2FnZXMgY29udGFpbiB0YWcKLSAqIG51bWJlcnMgb3IgZmllbGQgc2l6ZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gd2hhdCBjYW4gZml0IGluIDggb3IgMTYgYml0Ci0gKiBmaWVsZCBkZXNjcmlwdG9ycy4KLSAqLwotUEJfU1RBVElDX0FTU0VSVCgocGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdCwgaW5pdGlhbF9yZXF1ZXN0KSA8IDY1NTM2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlcXVlc3QsIGNsaWVudF9zdGF0cykgPCA2NTUzNiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSwgaW5pdGlhbF9yZXNwb25zZSkgPCA2NTUzNiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSwgc2VydmVyX2xpc3QpIDwgNjU1MzYgJiYgcGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlLCBjbGllbnRfc3RhdHNfcmVwb3J0X2ludGVydmFsKSA8IDY1NTM2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9TZXJ2ZXJMaXN0LCBzZXJ2ZXJzKSA8IDY1NTM2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9TZXJ2ZXJMaXN0LCBleHBpcmF0aW9uX2ludGVydmFsKSA8IDY1NTM2KSwgWU9VX01VU1RfREVGSU5FX1BCX0ZJRUxEXzMyQklUX0ZPUl9NRVNTQUdFU19ncnBjX2xiX3YwX0R1cmF0aW9uX2dycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0X2dycGNfbGJfdjBfSW5pdGlhbExvYWRCYWxhbmNlUmVxdWVzdF9ncnBjX2xiX3YwX0NsaWVudFN0YXRzX2dycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZV9ncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlc3BvbnNlX2dycGNfbGJfdjBfU2VydmVyTGlzdF9ncnBjX2xiX3YwX1NlcnZlcikKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEJfRklFTERfMTZCSVQpICYmICFkZWZpbmVkKFBCX0ZJRUxEXzMyQklUKQotLyogSWYgeW91IGdldCBhbiBlcnJvciBoZXJlLCBpdCBtZWFucyB0aGF0IHlvdSBuZWVkIHRvIGRlZmluZSBQQl9GSUVMRF8xNkJJVAotICogY29tcGlsZS10aW1lIG9wdGlvbi4gWW91IGNhbiBkbyB0aGF0IGluIHBiLmggb3Igb24gY29tcGlsZXIgY29tbWFuZCBsaW5lLgotICogCi0gKiBUaGUgcmVhc29uIHlvdSBuZWVkIHRvIGRvIHRoaXMgaXMgdGhhdCBzb21lIG9mIHlvdXIgbWVzc2FnZXMgY29udGFpbiB0YWcKLSAqIG51bWJlcnMgb3IgZmllbGQgc2l6ZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gd2hhdCBjYW4gZml0IGluIHRoZSBkZWZhdWx0Ci0gKiA4IGJpdCBkZXNjcmlwdG9ycy4KLSAqLwotUEJfU1RBVElDX0FTU0VSVCgocGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdCwgaW5pdGlhbF9yZXF1ZXN0KSA8IDI1NiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXF1ZXN0LCBjbGllbnRfc3RhdHMpIDwgMjU2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9Mb2FkQmFsYW5jZVJlc3BvbnNlLCBpbml0aWFsX3Jlc3BvbnNlKSA8IDI1NiAmJiBwYl9tZW1iZXJzaXplKGdycGNfbGJfdjBfTG9hZEJhbGFuY2VSZXNwb25zZSwgc2VydmVyX2xpc3QpIDwgMjU2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZSwgY2xpZW50X3N0YXRzX3JlcG9ydF9pbnRlcnZhbCkgPCAyNTYgJiYgcGJfbWVtYmVyc2l6ZShncnBjX2xiX3YwX1NlcnZlckxpc3QsIHNlcnZlcnMpIDwgMjU2ICYmIHBiX21lbWJlcnNpemUoZ3JwY19sYl92MF9TZXJ2ZXJMaXN0LCBleHBpcmF0aW9uX2ludGVydmFsKSA8IDI1NiksIFlPVV9NVVNUX0RFRklORV9QQl9GSUVMRF8xNkJJVF9GT1JfTUVTU0FHRVNfZ3JwY19sYl92MF9EdXJhdGlvbl9ncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVxdWVzdF9ncnBjX2xiX3YwX0luaXRpYWxMb2FkQmFsYW5jZVJlcXVlc3RfZ3JwY19sYl92MF9DbGllbnRTdGF0c19ncnBjX2xiX3YwX0xvYWRCYWxhbmNlUmVzcG9uc2VfZ3JwY19sYl92MF9Jbml0aWFsTG9hZEJhbGFuY2VSZXNwb25zZV9ncnBjX2xiX3YwX1NlcnZlckxpc3RfZ3JwY19sYl92MF9TZXJ2ZXIpCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCBiL3NyYy9jb3JlL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU0YTFkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU0VDVVJJVFlfQVVUSF9GSUxURVJTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NFQ1VSSVRZX0FVVEhfRklMVEVSU19ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKLQotZXh0ZXJuIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19jbGllbnRfYXV0aF9maWx0ZXI7Ci1leHRlcm4gY29uc3QgZ3JwY19jaGFubmVsX2ZpbHRlciBncnBjX3NlcnZlcl9hdXRoX2ZpbHRlcjsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TRUNVUklUWV9BVVRIX0ZJTFRFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmMgYi9zcmMvY29yZS9zZWN1cml0eS9iNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwYjUyOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zZWN1cml0eS9iNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLS8qIC0tLSBDb25zdGFudHMuIC0tLSAqLwotCi1zdGF0aWMgY29uc3QgaW50OF90IGJhc2U2NF9ieXRlc1tdID0gewotICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDB4M0UsIC0xLCAgIC0xLCAgIC0xLCAgIDB4M0YsCi0gICAgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgMHgzRCwgLTEsICAgLTEsCi0gICAgLTEsICAgMHg3RiwgLTEsICAgLTEsICAgLTEsICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKLSAgICAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLAotICAgIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAotICAgIC0xLCAgIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsCi0gICAgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSwgMHgyRiwgMHgzMCwKLSAgICAweDMxLCAweDMyLCAweDMzLCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGJhc2U2NF91cmxfdW5zYWZlX2NoYXJzW10gPQotICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKLXN0YXRpYyBjb25zdCBjaGFyIGJhc2U2NF91cmxfc2FmZV9jaGFyc1tdID0KLSAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyI7Ci0KLSNkZWZpbmUgR1JQQ19CQVNFNjRfUEFEX0NIQVIgJz0nCi0jZGVmaW5lIEdSUENfQkFTRTY0X1BBRF9CWVRFIDB4N0YKLSNkZWZpbmUgR1JQQ19CQVNFNjRfTVVMVElMSU5FX0xJTkVfTEVOIDc2Ci0jZGVmaW5lIEdSUENfQkFTRTY0X01VTFRJTElORV9OVU1fQkxPQ0tTIChHUlBDX0JBU0U2NF9NVUxUSUxJTkVfTElORV9MRU4gLyA0KQotCi0vKiAtLS0gYmFzZTY0IGZ1bmN0aW9ucy4gLS0tICovCi0KLWNoYXIgKmdycGNfYmFzZTY0X2VuY29kZShjb25zdCB2b2lkICp2ZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgaW50IHVybF9zYWZlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdWx0aWxpbmUpIHsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSA9IHZkYXRhOwotICBjb25zdCBjaGFyICpiYXNlNjRfY2hhcnMgPQotICAgICAgdXJsX3NhZmUgPyBiYXNlNjRfdXJsX3NhZmVfY2hhcnMgOiBiYXNlNjRfdXJsX3Vuc2FmZV9jaGFyczsKLSAgc2l6ZV90IHJlc3VsdF9wcm9qZWN0ZWRfc2l6ZSA9Ci0gICAgICA0ICogKChkYXRhX3NpemUgKyAzKSAvIDMpICsKLSAgICAgIDIgKiAobXVsdGlsaW5lID8gKGRhdGFfc2l6ZSAvICgzICogR1JQQ19CQVNFNjRfTVVMVElMSU5FX05VTV9CTE9DS1MpKQotICAgICAgICAgICAgICAgICAgICAgOiAwKSArCi0gICAgICAxOwotICBjaGFyICpyZXN1bHQgPSBncHJfbWFsbG9jKHJlc3VsdF9wcm9qZWN0ZWRfc2l6ZSk7Ci0gIGNoYXIgKmN1cnJlbnQgPSByZXN1bHQ7Ci0gIHNpemVfdCBudW1fYmxvY2tzID0gMDsKLSAgc2l6ZV90IGkgPSAwOwotCi0gIC8qIEVuY29kZSBlYWNoIGJsb2NrLiAqLwotICB3aGlsZSAoZGF0YV9zaXplID49IDMpIHsKLSAgICAqY3VycmVudCsrID0gYmFzZTY0X2NoYXJzWyhkYXRhW2ldID4+IDIpICYgMHgzRl07Ci0gICAgKmN1cnJlbnQrKyA9Ci0gICAgICAgIGJhc2U2NF9jaGFyc1soKGRhdGFbaV0gJiAweDAzKSA8PCA0KSB8ICgoZGF0YVtpICsgMV0gPj4gNCkgJiAweDBGKV07Ci0gICAgKmN1cnJlbnQrKyA9Ci0gICAgICAgIGJhc2U2NF9jaGFyc1soKGRhdGFbaSArIDFdICYgMHgwRikgPDwgMikgfCAoKGRhdGFbaSArIDJdID4+IDYpICYgMHgwMyldOwotICAgICpjdXJyZW50KysgPSBiYXNlNjRfY2hhcnNbZGF0YVtpICsgMl0gJiAweDNGXTsKLQotICAgIGRhdGFfc2l6ZSAtPSAzOwotICAgIGkgKz0gMzsKLSAgICBpZiAobXVsdGlsaW5lICYmICgrK251bV9ibG9ja3MgPT0gR1JQQ19CQVNFNjRfTVVMVElMSU5FX05VTV9CTE9DS1MpKSB7Ci0gICAgICAqY3VycmVudCsrID0gJ1xyJzsKLSAgICAgICpjdXJyZW50KysgPSAnXG4nOwotICAgICAgbnVtX2Jsb2NrcyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyogVGFrZSBjYXJlIG9mIHRoZSB0YWlsLiAqLwotICBpZiAoZGF0YV9zaXplID09IDIpIHsKLSAgICAqY3VycmVudCsrID0gYmFzZTY0X2NoYXJzWyhkYXRhW2ldID4+IDIpICYgMHgzRl07Ci0gICAgKmN1cnJlbnQrKyA9Ci0gICAgICAgIGJhc2U2NF9jaGFyc1soKGRhdGFbaV0gJiAweDAzKSA8PCA0KSB8ICgoZGF0YVtpICsgMV0gPj4gNCkgJiAweDBGKV07Ci0gICAgKmN1cnJlbnQrKyA9IGJhc2U2NF9jaGFyc1soZGF0YVtpICsgMV0gJiAweDBGKSA8PCAyXTsKLSAgICAqY3VycmVudCsrID0gR1JQQ19CQVNFNjRfUEFEX0NIQVI7Ci0gIH0gZWxzZSBpZiAoZGF0YV9zaXplID09IDEpIHsKLSAgICAqY3VycmVudCsrID0gYmFzZTY0X2NoYXJzWyhkYXRhW2ldID4+IDIpICYgMHgzRl07Ci0gICAgKmN1cnJlbnQrKyA9IGJhc2U2NF9jaGFyc1soZGF0YVtpXSAmIDB4MDMpIDw8IDRdOwotICAgICpjdXJyZW50KysgPSBHUlBDX0JBU0U2NF9QQURfQ0hBUjsKLSAgICAqY3VycmVudCsrID0gR1JQQ19CQVNFNjRfUEFEX0NIQVI7Ci0gIH0KLQotICBHUFJfQVNTRVJUKGN1cnJlbnQgPj0gcmVzdWx0KTsKLSAgR1BSX0FTU0VSVCgodWludHB0cl90KShjdXJyZW50IC0gcmVzdWx0KSA8IHJlc3VsdF9wcm9qZWN0ZWRfc2l6ZSk7Ci0gIHJlc3VsdFtjdXJyZW50IC0gcmVzdWx0XSA9ICdcMCc7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWdwcl9zbGljZSBncnBjX2Jhc2U2NF9kZWNvZGUoY29uc3QgY2hhciAqYjY0LCBpbnQgdXJsX3NhZmUpIHsKLSAgcmV0dXJuIGdycGNfYmFzZTY0X2RlY29kZV93aXRoX2xlbihiNjQsIHN0cmxlbihiNjQpLCB1cmxfc2FmZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY29kZV9vbmVfY2hhcihjb25zdCB1bnNpZ25lZCBjaGFyICpjb2RlcywgdW5zaWduZWQgY2hhciAqcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcmVzdWx0X29mZnNldCkgewotICB1aW50MzJfdCBwYWNrZWQgPSAoKHVpbnQzMl90KWNvZGVzWzBdIDw8IDIpIHwgKCh1aW50MzJfdCljb2Rlc1sxXSA+PiA0KTsKLSAgcmVzdWx0WygqcmVzdWx0X29mZnNldCkrK10gPSAodW5zaWduZWQgY2hhcilwYWNrZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY29kZV90d29fY2hhcnMoY29uc3QgdW5zaWduZWQgY2hhciAqY29kZXMsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpyZXN1bHRfb2Zmc2V0KSB7Ci0gIHVpbnQzMl90IHBhY2tlZCA9ICgodWludDMyX3QpY29kZXNbMF0gPDwgMTApIHwgKCh1aW50MzJfdCljb2Rlc1sxXSA8PCA0KSB8Ci0gICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpY29kZXNbMl0gPj4gMik7Ci0gIHJlc3VsdFsoKnJlc3VsdF9vZmZzZXQpKytdID0gKHVuc2lnbmVkIGNoYXIpKHBhY2tlZCA+PiA4KTsKLSAgcmVzdWx0WygqcmVzdWx0X29mZnNldCkrK10gPSAodW5zaWduZWQgY2hhcikocGFja2VkKTsKLX0KLQotc3RhdGljIGludCBkZWNvZGVfZ3JvdXAoY29uc3QgdW5zaWduZWQgY2hhciAqY29kZXMsIHNpemVfdCBudW1fY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIHNpemVfdCAqcmVzdWx0X29mZnNldCkgewotICBHUFJfQVNTRVJUKG51bV9jb2RlcyA8PSA0KTsKLQotICAvKiBTaG9ydCBlbmQgZ3JvdXBzIHRoYXQgbWF5IG5vdCBoYXZlIHBhZGRpbmcuICovCi0gIGlmIChudW1fY29kZXMgPT0gMSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBncm91cC4gTXVzdCBiZSBhdCBsZWFzdCAyIGJ5dGVzLiIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChudW1fY29kZXMgPT0gMikgewotICAgIGRlY29kZV9vbmVfY2hhcihjb2RlcywgcmVzdWx0LCByZXN1bHRfb2Zmc2V0KTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAobnVtX2NvZGVzID09IDMpIHsKLSAgICBkZWNvZGVfdHdvX2NoYXJzKGNvZGVzLCByZXN1bHQsIHJlc3VsdF9vZmZzZXQpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyogUmVndWxhciA0IGJ5dGUgZ3JvdXBzIHdpdGggcGFkZGluZyBvciBub3QuICovCi0gIEdQUl9BU1NFUlQobnVtX2NvZGVzID09IDQpOwotICBpZiAoY29kZXNbMF0gPT0gR1JQQ19CQVNFNjRfUEFEX0JZVEUgfHwgY29kZXNbMV0gPT0gR1JQQ19CQVNFNjRfUEFEX0JZVEUpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgcGFkZGluZyBkZXRlY3RlZC4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoY29kZXNbMl0gPT0gR1JQQ19CQVNFNjRfUEFEX0JZVEUpIHsKLSAgICBpZiAoY29kZXNbM10gPT0gR1JQQ19CQVNFNjRfUEFEX0JZVEUpIHsKLSAgICAgIGRlY29kZV9vbmVfY2hhcihjb2RlcywgcmVzdWx0LCByZXN1bHRfb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHBhZGRpbmcgZGV0ZWN0ZWQuIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY29kZXNbM10gPT0gR1JQQ19CQVNFNjRfUEFEX0JZVEUpIHsKLSAgICBkZWNvZGVfdHdvX2NoYXJzKGNvZGVzLCByZXN1bHQsIHJlc3VsdF9vZmZzZXQpOwotICB9IGVsc2UgewotICAgIC8qIE5vIHBhZGRpbmcuICovCi0gICAgdWludDMyX3QgcGFja2VkID0gKCh1aW50MzJfdCljb2Rlc1swXSA8PCAxOCkgfCAoKHVpbnQzMl90KWNvZGVzWzFdIDw8IDEyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCljb2Rlc1syXSA8PCA2KSB8IGNvZGVzWzNdOwotICAgIHJlc3VsdFsoKnJlc3VsdF9vZmZzZXQpKytdID0gKHVuc2lnbmVkIGNoYXIpKHBhY2tlZCA+PiAxNik7Ci0gICAgcmVzdWx0WygqcmVzdWx0X29mZnNldCkrK10gPSAodW5zaWduZWQgY2hhcikocGFja2VkID4+IDgpOwotICAgIHJlc3VsdFsoKnJlc3VsdF9vZmZzZXQpKytdID0gKHVuc2lnbmVkIGNoYXIpKHBhY2tlZCk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWdwcl9zbGljZSBncnBjX2Jhc2U2NF9kZWNvZGVfd2l0aF9sZW4oY29uc3QgY2hhciAqYjY0LCBzaXplX3QgYjY0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVybF9zYWZlKSB7Ci0gIGdwcl9zbGljZSByZXN1bHQgPSBncHJfc2xpY2VfbWFsbG9jKGI2NF9sZW4pOwotICB1bnNpZ25lZCBjaGFyICpjdXJyZW50ID0gR1BSX1NMSUNFX1NUQVJUX1BUUihyZXN1bHQpOwotICBzaXplX3QgcmVzdWx0X3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyIGNvZGVzWzRdOwotICBzaXplX3QgbnVtX2NvZGVzID0gMDsKLQotICB3aGlsZSAoYjY0X2xlbi0tKSB7Ci0gICAgdW5zaWduZWQgY2hhciBjID0gKHVuc2lnbmVkIGNoYXIpKCpiNjQrKyk7Ci0gICAgc2lnbmVkIGNoYXIgY29kZTsKLSAgICBpZiAoYyA+PSBHUFJfQVJSQVlfU0laRShiYXNlNjRfYnl0ZXMpKSBjb250aW51ZTsKLSAgICBpZiAodXJsX3NhZmUpIHsKLSAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICcvJykgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgY2hhcmFjdGVyIGZvciB1cmwgc2FmZSBiYXNlNjQgJWMiLCBjKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgICAgfQotICAgICAgaWYgKGMgPT0gJy0nKSB7Ci0gICAgICAgIGMgPSAnKyc7Ci0gICAgICB9IGVsc2UgaWYgKGMgPT0gJ18nKSB7Ci0gICAgICAgIGMgPSAnLyc7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvZGUgPSBiYXNlNjRfYnl0ZXNbY107Ci0gICAgaWYgKGNvZGUgPT0gLTEpIHsKLSAgICAgIGlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBjaGFyYWN0ZXIgJWMiLCBjKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBjb2Rlc1tudW1fY29kZXMrK10gPSAodW5zaWduZWQgY2hhciljb2RlOwotICAgICAgaWYgKG51bV9jb2RlcyA9PSA0KSB7Ci0gICAgICAgIGlmICghZGVjb2RlX2dyb3VwKGNvZGVzLCBudW1fY29kZXMsIGN1cnJlbnQsICZyZXN1bHRfc2l6ZSkpIGdvdG8gZmFpbDsKLSAgICAgICAgbnVtX2NvZGVzID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAobnVtX2NvZGVzICE9IDAgJiYKLSAgICAgICFkZWNvZGVfZ3JvdXAoY29kZXMsIG51bV9jb2RlcywgY3VycmVudCwgJnJlc3VsdF9zaXplKSkgewotICAgIGdvdG8gZmFpbDsKLSAgfQotICBHUFJfU0xJQ0VfU0VUX0xFTkdUSChyZXN1bHQsIHJlc3VsdF9zaXplKTsKLSAgcmV0dXJuIHJlc3VsdDsKLQotZmFpbDoKLSAgZ3ByX3NsaWNlX3VucmVmKHJlc3VsdCk7Ci0gIHJldHVybiBncHJfZW1wdHlfc2xpY2UoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L2I2NC5oIGIvc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGY2OTUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TRUNVUklUWV9CNjRfSAotI2RlZmluZSBHUlBDX0NPUkVfU0VDVVJJVFlfQjY0X0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotCi0vKiBFbmNvZGVzIGRhdGEgdXNpbmcgYmFzZTY0LiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2FiaWxpdHkgdG8gZnJlZQotICAgdGhlIHJldHVybmVkIGNoYXIgKiB1c2luZyBncHJfZnJlZS4gUmV0dXJucyBOVUxMIG9uIE5VTEwgaW5wdXQuICovCi1jaGFyICpncnBjX2Jhc2U2NF9lbmNvZGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgaW50IHVybF9zYWZlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdWx0aWxpbmUpOwotCi0vKiBEZWNvZGVzIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBiYXNlNjQgc3BlY2lmaWNhdGlvbi4gUmV0dXJucyBhbiBlbXB0eQotICAgc2xpY2UgaW4gY2FzZSBvZiBmYWlsdXJlLiAqLwotZ3ByX3NsaWNlIGdycGNfYmFzZTY0X2RlY29kZShjb25zdCBjaGFyICpiNjQsIGludCB1cmxfc2FmZSk7Ci0KLS8qIFNhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgdGhlIGxlbmd0aCBpcyBwcm92aWRlZCBieSB0aGUgY2FsbGVyLiAqLwotZ3ByX3NsaWNlIGdycGNfYmFzZTY0X2RlY29kZV93aXRoX2xlbihjb25zdCBjaGFyICpiNjQsIHNpemVfdCBiNjRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXJsX3NhZmUpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NFQ1VSSVRZX0I2NF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyBiL3NyYy9jb3JlL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmMyM2VmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCi0KLSNkZWZpbmUgTUFYX0NSRURFTlRJQUxTX01FVEFEQVRBX0NPVU5UIDQKLQotLyogV2UgY2FuIGhhdmUgYSBwZXItY2FsbCBjcmVkZW50aWFscy4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkczsKLSAgZ3JwY19tZHN0ciAqaG9zdDsKLSAgZ3JwY19tZHN0ciAqbWV0aG9kOwotICAvKiBwb2xsc2V0IGJvdW5kIHRvIHRoaXMgY2FsbDsgaWYgd2UgbmVlZCB0byBtYWtlIGV4dGVybmFsCi0gICAgIG5ldHdvcmsgcmVxdWVzdHMsIHRoZXkgc2hvdWxkIGJlIGRvbmUgdW5kZXIgdGhpcyBwb2xsc2V0Ci0gICAgIHNvIHRoYXQgd29yayBjYW4gcHJvZ3Jlc3Mgd2hlbiB0aGlzIGNhbGwgd2FudHMgd29yayB0bwotICAgICBwcm9ncmVzcyAqLwotICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7Ci0gIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCBvcDsKLSAgdWludDhfdCBzZWN1cml0eV9jb250ZXh0X3NldDsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIG1kX2xpbmtzW01BWF9DUkVERU5USUFMU19NRVRBREFUQV9DT1VOVF07Ci0gIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGF1dGhfbWRfY29udGV4dDsKLX0gY2FsbF9kYXRhOwotCi0vKiBXZSBjYW4gaGF2ZSBhIHBlci1jaGFubmVsIGNyZWRlbnRpYWxzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzZWN1cml0eV9jb25uZWN0b3I7Ci0gIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQ7Ci19IGNoYW5uZWxfZGF0YTsKLQotc3RhdGljIHZvaWQgcmVzZXRfYXV0aF9tZXRhZGF0YV9jb250ZXh0KAotICAgIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0ICphdXRoX21kX2NvbnRleHQpIHsKLSAgaWYgKGF1dGhfbWRfY29udGV4dC0+c2VydmljZV91cmwgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKChjaGFyICopYXV0aF9tZF9jb250ZXh0LT5zZXJ2aWNlX3VybCk7Ci0gICAgYXV0aF9tZF9jb250ZXh0LT5zZXJ2aWNlX3VybCA9IE5VTEw7Ci0gIH0KLSAgaWYgKGF1dGhfbWRfY29udGV4dC0+bWV0aG9kX25hbWUgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKChjaGFyICopYXV0aF9tZF9jb250ZXh0LT5tZXRob2RfbmFtZSk7Ci0gICAgYXV0aF9tZF9jb250ZXh0LT5tZXRob2RfbmFtZSA9IE5VTEw7Ci0gIH0KLSAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYoCi0gICAgICAoZ3JwY19hdXRoX2NvbnRleHQgKilhdXRoX21kX2NvbnRleHQtPmNoYW5uZWxfYXV0aF9jb250ZXh0LAotICAgICAgImdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0Iik7Ci0gIGF1dGhfbWRfY29udGV4dC0+Y2hhbm5lbF9hdXRoX2NvbnRleHQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBidWJibGVfdXBfZXJyb3IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLCBjb25zdCBjaGFyICplcnJvcl9tc2cpIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgZ3ByX2xvZyhHUFJfRVJST1IsICJDbGllbnQgc2lkZSBhdXRoZW50aWNhdGlvbiBmYWlsdXJlOiAlcyIsIGVycm9yX21zZyk7Ci0gIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9hZGRfY2FuY2VsbGF0aW9uKCZjYWxsZC0+b3AsIHN0YXR1cyk7Ci0gIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCAmY2FsbGQtPm9wKTsKLX0KLQotc3RhdGljIHZvaWQgb25fY3JlZGVudGlhbHNfbWV0YWRhdGEoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWQgKm1kX2VsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9tZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfc3RhdHVzIHN0YXR1cykgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IChncnBjX2NhbGxfZWxlbWVudCAqKXVzZXJfZGF0YTsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCA9ICZjYWxsZC0+b3A7Ci0gIGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1kYjsKLSAgc2l6ZV90IGk7Ci0gIHJlc2V0X2F1dGhfbWV0YWRhdGFfY29udGV4dCgmY2FsbGQtPmF1dGhfbWRfY29udGV4dCk7Ci0gIGlmIChzdGF0dXMgIT0gR1JQQ19DUkVERU5USUFMU19PSykgewotICAgIGJ1YmJsZV91cF9lcnJvcihleGVjX2N0eCwgZWxlbSwgR1JQQ19TVEFUVVNfVU5BVVRIRU5USUNBVEVELAotICAgICAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbHMgZmFpbGVkIHRvIGdldCBtZXRhZGF0YS4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgR1BSX0FTU0VSVChudW1fbWQgPD0gTUFYX0NSRURFTlRJQUxTX01FVEFEQVRBX0NPVU5UKTsKLSAgR1BSX0FTU0VSVChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwpOwotICBtZGIgPSBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21kOyBpKyspIHsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF90YWlsKAotICAgICAgICBtZGIsICZjYWxsZC0+bWRfbGlua3NbaV0sCi0gICAgICAgIGdycGNfbWRlbGVtX2Zyb21fc2xpY2VzKGdwcl9zbGljZV9yZWYobWRfZWxlbXNbaV0ua2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX3JlZihtZF9lbGVtc1tpXS52YWx1ZSkpKTsKLSAgfQotICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgZWxlbSwgb3ApOwotfQotCi12b2lkIGJ1aWxkX2F1dGhfbWV0YWRhdGFfY29udGV4dChncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9kYXRhICpjYWxsZCkgewotICBjaGFyICpzZXJ2aWNlID0gZ3ByX3N0cmR1cChncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGNhbGxkLT5tZXRob2QpKTsKLSAgY2hhciAqbGFzdF9zbGFzaCA9IHN0cnJjaHIoc2VydmljZSwgJy8nKTsKLSAgY2hhciAqbWV0aG9kX25hbWUgPSBOVUxMOwotICBjaGFyICpzZXJ2aWNlX3VybCA9IE5VTEw7Ci0gIHJlc2V0X2F1dGhfbWV0YWRhdGFfY29udGV4dCgmY2FsbGQtPmF1dGhfbWRfY29udGV4dCk7Ci0gIGlmIChsYXN0X3NsYXNoID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk5vICcvJyBmb3VuZCBpbiBmdWxseSBxdWFsaWZpZWQgbWV0aG9kIG5hbWUiKTsKLSAgICBzZXJ2aWNlWzBdID0gJ1wwJzsKLSAgfSBlbHNlIGlmIChsYXN0X3NsYXNoID09IHNlcnZpY2UpIHsKLSAgICAvKiBObyBzZXJ2aWNlIHBhcnQgaW4gZnVsbHkgcXVhbGlmaWVkIG1ldGhvZCBuYW1lOiB3aWxsIGp1c3QgYmUgIi8iLiAqLwotICAgIHNlcnZpY2VbMV0gPSAnXDAnOwotICB9IGVsc2UgewotICAgICpsYXN0X3NsYXNoID0gJ1wwJzsKLSAgICBtZXRob2RfbmFtZSA9IGdwcl9zdHJkdXAobGFzdF9zbGFzaCArIDEpOwotICB9Ci0gIGlmIChtZXRob2RfbmFtZSA9PSBOVUxMKSBtZXRob2RfbmFtZSA9IGdwcl9zdHJkdXAoIiIpOwotICBncHJfYXNwcmludGYoJnNlcnZpY2VfdXJsLCAiJXM6Ly8lcyVzIiwKLSAgICAgICAgICAgICAgIHNjLT51cmxfc2NoZW1lID09IE5VTEwgPyAiIiA6IHNjLT51cmxfc2NoZW1lLAotICAgICAgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhjYWxsZC0+aG9zdCksIHNlcnZpY2UpOwotICBjYWxsZC0+YXV0aF9tZF9jb250ZXh0LnNlcnZpY2VfdXJsID0gc2VydmljZV91cmw7Ci0gIGNhbGxkLT5hdXRoX21kX2NvbnRleHQubWV0aG9kX25hbWUgPSBtZXRob2RfbmFtZTsKLSAgY2FsbGQtPmF1dGhfbWRfY29udGV4dC5jaGFubmVsX2F1dGhfY29udGV4dCA9Ci0gICAgICBHUlBDX0FVVEhfQ09OVEVYVF9SRUYoYXV0aF9jb250ZXh0LCAiZ3JwY19hdXRoX21ldGFkYXRhX2NvbnRleHQiKTsKLSAgZ3ByX2ZyZWUoc2VydmljZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfc2VjdXJpdHlfbWV0YWRhdGEoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKmN0eCA9Ci0gICAgICAoZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqKW9wLT5jb250ZXh0W0dSUENfQ09OVEVYVF9TRUNVUklUWV0udmFsdWU7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2hhbm5lbF9jYWxsX2NyZWRzID0KLSAgICAgIGNoYW5kLT5zZWN1cml0eV9jb25uZWN0b3ItPnJlcXVlc3RfbWV0YWRhdGFfY3JlZHM7Ci0gIGludCBjYWxsX2NyZWRzX2hhc19tZCA9IChjdHggIT0gTlVMTCkgJiYgKGN0eC0+Y3JlZHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGNoYW5uZWxfY2FsbF9jcmVkcyA9PSBOVUxMICYmICFjYWxsX2NyZWRzX2hhc19tZCkgewotICAgIC8qIFNraXAgc2VuZGluZyBtZXRhZGF0YSBhbHRvZ2V0aGVyLiAqLwotICAgIGdycGNfY2FsbF9uZXh0X29wKGV4ZWNfY3R4LCBlbGVtLCBvcCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGNoYW5uZWxfY2FsbF9jcmVkcyAhPSBOVUxMICYmIGNhbGxfY3JlZHNfaGFzX21kKSB7Ci0gICAgY2FsbGQtPmNyZWRzID0gZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19jcmVhdGUoY2hhbm5lbF9jYWxsX2NyZWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3JlZHMsIE5VTEwpOwotICAgIGlmIChjYWxsZC0+Y3JlZHMgPT0gTlVMTCkgewotICAgICAgYnViYmxlX3VwX2Vycm9yKGV4ZWNfY3R4LCBlbGVtLCBHUlBDX1NUQVRVU19JTlZBTElEX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBhdGlibGUgY3JlZGVudGlhbHMgc2V0IG9uIGNoYW5uZWwgYW5kIGNhbGwuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNhbGxkLT5jcmVkcyA9IGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWYoCi0gICAgICAgIGNhbGxfY3JlZHNfaGFzX21kID8gY3R4LT5jcmVkcyA6IGNoYW5uZWxfY2FsbF9jcmVkcyk7Ci0gIH0KLQotICBidWlsZF9hdXRoX21ldGFkYXRhX2NvbnRleHQoJmNoYW5kLT5zZWN1cml0eV9jb25uZWN0b3ItPmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZC0+YXV0aF9jb250ZXh0LCBjYWxsZCk7Ci0gIGNhbGxkLT5vcCA9ICpvcDsgLyogQ29weSBvcCAob3JpZ2luYXRlcyBmcm9tIHRoZSBjYWxsZXIncyBzdGFjaykuICovCi0gIEdQUl9BU1NFUlQoY2FsbGQtPnBvbGxzZXQpOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCi0gICAgICBleGVjX2N0eCwgY2FsbGQtPmNyZWRzLCBjYWxsZC0+cG9sbHNldCwgY2FsbGQtPmF1dGhfbWRfY29udGV4dCwKLSAgICAgIG9uX2NyZWRlbnRpYWxzX21ldGFkYXRhLCBlbGVtKTsKLX0KLQotc3RhdGljIHZvaWQgb25faG9zdF9jaGVja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gKGdycGNfY2FsbF9lbGVtZW50ICopdXNlcl9kYXRhOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotCi0gIGlmIChzdGF0dXMgPT0gR1JQQ19TRUNVUklUWV9PSykgewotICAgIHNlbmRfc2VjdXJpdHlfbWV0YWRhdGEoZXhlY19jdHgsIGVsZW0sICZjYWxsZC0+b3ApOwotICB9IGVsc2UgewotICAgIGNoYXIgKmVycm9yX21zZzsKLSAgICBncHJfYXNwcmludGYoJmVycm9yX21zZywgIkludmFsaWQgaG9zdCAlcyBzZXQgaW4gOmF1dGhvcml0eSBtZXRhZGF0YS4iLAotICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGNhbGxkLT5ob3N0KSk7Ci0gICAgYnViYmxlX3VwX2Vycm9yKGV4ZWNfY3R4LCBlbGVtLCBHUlBDX1NUQVRVU19JTlZBTElEX0FSR1VNRU5ULCBlcnJvcl9tc2cpOwotICAgIGdwcl9mcmVlKGVycm9yX21zZyk7Ci0gIH0KLX0KLQotLyogQ2FsbGVkIGVpdGhlcjoKLSAgICAgLSBpbiByZXNwb25zZSB0byBhbiBBUEkgY2FsbCAob3Igc2ltaWxhcikgZnJvbSBhYm92ZSwgdG8gc2VuZCBzb21ldGhpbmcKLSAgICAgLSBhIG5ldHdvcmsgZXZlbnQgKG9yIHNpbWlsYXIpIGZyb20gYmVsb3csIHRvIHJlY2VpdmUgc29tZXRoaW5nCi0gICBvcCBjb250YWlucyB0eXBlIGFuZCBjYWxsIGRpcmVjdGlvbiBpbmZvcm1hdGlvbiwgaW4gYWRkaXRpb24gdG8gdGhlIGRhdGEKLSAgIHRoYXQgaXMgYmVpbmcgc2VudCBvciByZWNlaXZlZC4gKi8KLXN0YXRpYyB2b2lkIGF1dGhfc3RhcnRfdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2FsbCBlbGVtZW50ICovCi0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGdycGNfbGlua2VkX21kZWxlbSAqbDsKLSAgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqc2VjX2N0eCA9IE5VTEw7Ci0KLSAgaWYgKGNhbGxkLT5zZWN1cml0eV9jb250ZXh0X3NldCA9PSAwICYmCi0gICAgICBvcC0+Y2FuY2VsX3dpdGhfc3RhdHVzID09IEdSUENfU1RBVFVTX09LKSB7Ci0gICAgY2FsbGQtPnNlY3VyaXR5X2NvbnRleHRfc2V0ID0gMTsKLSAgICBHUFJfQVNTRVJUKG9wLT5jb250ZXh0KTsKLSAgICBpZiAob3AtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICBvcC0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLnZhbHVlID0KLSAgICAgICAgICBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSgpOwotICAgICAgb3AtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS5kZXN0cm95ID0KLSAgICAgICAgICBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2Rlc3Ryb3k7Ci0gICAgfQotICAgIHNlY19jdHggPSBvcC0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLnZhbHVlOwotICAgIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKHNlY19jdHgtPmF1dGhfY29udGV4dCwgImNsaWVudCBhdXRoIGZpbHRlciIpOwotICAgIHNlY19jdHgtPmF1dGhfY29udGV4dCA9Ci0gICAgICAgIEdSUENfQVVUSF9DT05URVhUX1JFRihjaGFuZC0+YXV0aF9jb250ZXh0LCAiY2xpZW50X2F1dGhfZmlsdGVyIik7Ci0gIH0KLQotICBpZiAob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgZm9yIChsID0gb3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YS0+bGlzdC5oZWFkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7Ci0gICAgICBncnBjX21kZWxlbSAqbWQgPSBsLT5tZDsKLSAgICAgIC8qIFBvaW50ZXIgY29tcGFyaXNvbiBpcyBPSyBmb3IgbWRfZWxlbXMgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGNvbnRleHQuCi0gICAgICAgKi8KLSAgICAgIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfQVVUSE9SSVRZKSB7Ci0gICAgICAgIGlmIChjYWxsZC0+aG9zdCAhPSBOVUxMKSBHUlBDX01EU1RSX1VOUkVGKGNhbGxkLT5ob3N0KTsKLSAgICAgICAgY2FsbGQtPmhvc3QgPSBHUlBDX01EU1RSX1JFRihtZC0+dmFsdWUpOwotICAgICAgfSBlbHNlIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfUEFUSCkgewotICAgICAgICBpZiAoY2FsbGQtPm1ldGhvZCAhPSBOVUxMKSBHUlBDX01EU1RSX1VOUkVGKGNhbGxkLT5tZXRob2QpOwotICAgICAgICBjYWxsZC0+bWV0aG9kID0gR1JQQ19NRFNUUl9SRUYobWQtPnZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNhbGxkLT5ob3N0ICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IGNoYXIgKmNhbGxfaG9zdCA9IGdycGNfbWRzdHJfYXNfY19zdHJpbmcoY2FsbGQtPmhvc3QpOwotICAgICAgY2FsbGQtPm9wID0gKm9wOyAvKiBDb3B5IG9wIChvcmlnaW5hdGVzIGZyb20gdGhlIGNhbGxlcidzIHN0YWNrKS4gKi8KLSAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY2hlY2tfY2FsbF9ob3N0KAotICAgICAgICAgIGV4ZWNfY3R4LCBjaGFuZC0+c2VjdXJpdHlfY29ubmVjdG9yLCBjYWxsX2hvc3QsIGNoYW5kLT5hdXRoX2NvbnRleHQsCi0gICAgICAgICAgb25faG9zdF9jaGVja2VkLCBlbGVtKTsKLSAgICAgIHJldHVybjsgLyogZWFybHkgZXhpdCAqLwotICAgIH0KLSAgfQotCi0gIC8qIHBhc3MgY29udHJvbCBkb3duIHRoZSBzdGFjayAqLwotICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgZWxlbSwgb3ApOwotfQotCi0vKiBDb25zdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCi1zdGF0aWMgdm9pZCBpbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIG1lbXNldChjYWxsZCwgMCwgc2l6ZW9mKCpjYWxsZCkpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2FsbGQtPnBvbGxzZXQgPSBwb2xsc2V0OwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3VucmVmKGNhbGxkLT5jcmVkcyk7Ci0gIGlmIChjYWxsZC0+aG9zdCAhPSBOVUxMKSB7Ci0gICAgR1JQQ19NRFNUUl9VTlJFRihjYWxsZC0+aG9zdCk7Ci0gIH0KLSAgaWYgKGNhbGxkLT5tZXRob2QgIT0gTlVMTCkgewotICAgIEdSUENfTURTVFJfVU5SRUYoY2FsbGQtPm1ldGhvZCk7Ci0gIH0KLSAgcmVzZXRfYXV0aF9tZXRhZGF0YV9jb250ZXh0KCZjYWxsZC0+YXV0aF9tZF9jb250ZXh0KTsKLX0KLQotLyogQ29uc3RydWN0b3IgZm9yIGNoYW5uZWxfZGF0YSAqLwotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjID0KLSAgICAgIGdycGNfZmluZF9zZWN1cml0eV9jb25uZWN0b3JfaW5fYXJncyhhcmdzLT5jaGFubmVsX2FyZ3MpOwotICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0ID0KLSAgICAgIGdycGNfZmluZF9hdXRoX2NvbnRleHRfaW5fYXJncyhhcmdzLT5jaGFubmVsX2FyZ3MpOwotCi0gIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2hhbm5lbCBlbGVtZW50ICovCi0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0KLSAgLyogVGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBmaWx0ZXJzIHRlbmQgdG8gYmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgdG8KLSAgICAgaGFuZGxlIHRoZSBjYXNlIHRoYXQgdGhlcmUncyBubyAnbmV4dCcgZmlsdGVyIHRvIGNhbGwgb24gdGhlIHVwIG9yIGRvd24KLSAgICAgcGF0aCAqLwotICBHUFJfQVNTRVJUKCFhcmdzLT5pc19sYXN0KTsKLSAgR1BSX0FTU0VSVChzYyAhPSBOVUxMKTsKLSAgR1BSX0FTU0VSVChhdXRoX2NvbnRleHQgIT0gTlVMTCk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCi0gIGNoYW5kLT5zZWN1cml0eV9jb25uZWN0b3IgPQotICAgICAgKGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKilHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9SRUYoCi0gICAgICAgICAgc2MsICJjbGllbnRfYXV0aF9maWx0ZXIiKTsKLSAgY2hhbmQtPmF1dGhfY29udGV4dCA9Ci0gICAgICBHUlBDX0FVVEhfQ09OVEVYVF9SRUYoYXV0aF9jb250ZXh0LCAiY2xpZW50X2F1dGhfZmlsdGVyIik7Ci19Ci0KLS8qIERlc3RydWN0b3IgZm9yIGNoYW5uZWwgZGF0YSAqLwotc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSkgewotICAvKiBncmFiIHBvaW50ZXJzIHRvIG91ciBkYXRhIGZyb20gdGhlIGNoYW5uZWwgZWxlbWVudCAqLwotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYyA9IGNoYW5kLT5zZWN1cml0eV9jb25uZWN0b3I7Ci0gIGlmIChzYyAhPSBOVUxMKSB7Ci0gICAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoJnNjLT5iYXNlLCAiY2xpZW50X2F1dGhfZmlsdGVyIik7Ci0gIH0KLSAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYoY2hhbmQtPmF1dGhfY29udGV4dCwgImNsaWVudF9hdXRoX2ZpbHRlciIpOwotfQotCi1jb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfY2xpZW50X2F1dGhfZmlsdGVyID0gewotICAgIGF1dGhfc3RhcnRfdHJhbnNwb3J0X29wLCBncnBjX2NoYW5uZWxfbmV4dF9vcCwgc2l6ZW9mKGNhbGxfZGF0YSksCi0gICAgaW5pdF9jYWxsX2VsZW0sICAgICAgICAgIHNldF9wb2xsc2V0LCAgICAgICAgICBkZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwgICAgaW5pdF9jaGFubmVsX2VsZW0sICAgIGRlc3Ryb3lfY2hhbm5lbF9lbGVtLAotICAgIGdycGNfY2FsbF9uZXh0X2dldF9wZWVyLCAiY2xpZW50LWF1dGgifTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMgYi9zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODM0OGJjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9odHRwL2h0dHBjbGkuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9odHRwL3BhcnNlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLQotLyogLS0gQ29tbW9uLiAtLSAqLwotCi1zdHJ1Y3QgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0IHsKLSAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkczsKLSAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYjsKLSAgdm9pZCAqdXNlcl9kYXRhOwotfTsKLQotc3RhdGljIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqCi1ncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3RfY3JlYXRlKGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKnIgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0KSk7Ci0gIHItPmNyZWRzID0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihjcmVkcyk7Ci0gIHItPmNiID0gY2I7Ci0gIHItPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdF9kZXN0cm95KAotICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqcikgewotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoci0+Y3JlZHMpOwotICBncHJfZnJlZShyKTsKLX0KLQotZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfcmVmKAotICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybiBOVUxMOwotICBncHJfcmVmKCZjcmVkcy0+cmVmY291bnQpOwotICByZXR1cm4gY3JlZHM7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3VucmVmKGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybjsKLSAgaWYgKGdwcl91bnJlZigmY3JlZHMtPnJlZmNvdW50KSkgewotICAgIGlmIChjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdCAhPSBOVUxMKSBjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdChjcmVkcyk7Ci0gICAgZ3ByX2ZyZWUoY3JlZHMpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlbGVhc2UoZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjcmVkcykgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlbGVhc2UoY3JlZHM9JXApIiwgMSwgKGNyZWRzKSk7Ci0gIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc191bnJlZihjcmVkcyk7Ci19Ci0KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGlmIChjcmVkcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgZ3ByX3JlZigmY3JlZHMtPnJlZmNvdW50KTsKLSAgcmV0dXJuIGNyZWRzOwotfQotCi12b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGlmIChjcmVkcyA9PSBOVUxMKSByZXR1cm47Ci0gIGlmIChncHJfdW5yZWYoJmNyZWRzLT5yZWZjb3VudCkpIHsKLSAgICBpZiAoY3JlZHMtPnZ0YWJsZS0+ZGVzdHJ1Y3QgIT0gTlVMTCkgY3JlZHMtPnZ0YWJsZS0+ZGVzdHJ1Y3QoY3JlZHMpOwotICAgIGdwcl9mcmVlKGNyZWRzKTsKLSAgfQotfQotCi12b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWxlYXNlKGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9jcmVkZW50aWFsc19yZWxlYXNlKGNyZWRzPSVwKSIsIDEsIChjcmVkcykpOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoY3JlZHMpOwotfQotCi12b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc19nZXRfcmVxdWVzdF9tZXRhZGF0YSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywKLSAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCi0gICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGlmIChjcmVkcyA9PSBOVUxMIHx8IGNyZWRzLT52dGFibGUtPmdldF9yZXF1ZXN0X21ldGFkYXRhID09IE5VTEwpIHsKLSAgICBpZiAoY2IgIT0gTlVMTCkgewotICAgICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgTlVMTCwgMCwgR1JQQ19DUkVERU5USUFMU19PSyk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBjcmVkcy0+dnRhYmxlLT5nZXRfcmVxdWVzdF9tZXRhZGF0YShleGVjX2N0eCwgY3JlZHMsIHBvbGxzZXQsIGNvbnRleHQsIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEpOwotfQotCi1ncnBjX3NlY3VyaXR5X3N0YXR1cyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKLSAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNoYW5uZWxfY3JlZHMsIGNvbnN0IGNoYXIgKnRhcmdldCwKLSAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncywgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjLAotICAgIGdycGNfY2hhbm5lbF9hcmdzICoqbmV3X2FyZ3MpIHsKLSAgKm5ld19hcmdzID0gTlVMTDsKLSAgaWYgKGNoYW5uZWxfY3JlZHMgPT0gTlVMTCkgewotICAgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOwotICB9Ci0gIEdQUl9BU1NFUlQoY2hhbm5lbF9jcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yICE9IE5VTEwpOwotICByZXR1cm4gY2hhbm5lbF9jcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAotICAgICAgY2hhbm5lbF9jcmVkcywgTlVMTCwgdGFyZ2V0LCBhcmdzLCBzYywgbmV3X2FyZ3MpOwotfQotCi1ncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVmKAotICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcykgewotICBpZiAoY3JlZHMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gIGdwcl9yZWYoJmNyZWRzLT5yZWZjb3VudCk7Ci0gIHJldHVybiBjcmVkczsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc191bnJlZihncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybjsKLSAgaWYgKGdwcl91bnJlZigmY3JlZHMtPnJlZmNvdW50KSkgewotICAgIGlmIChjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdCAhPSBOVUxMKSBjcmVkcy0+dnRhYmxlLT5kZXN0cnVjdChjcmVkcyk7Ci0gICAgaWYgKGNyZWRzLT5wcm9jZXNzb3IuZGVzdHJveSAhPSBOVUxMICYmIGNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUgIT0gTlVMTCkgewotICAgICAgY3JlZHMtPnByb2Nlc3Nvci5kZXN0cm95KGNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUpOwotICAgIH0KLSAgICBncHJfZnJlZShjcmVkcyk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc19yZWxlYXNlKGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcykgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVsZWFzZShjcmVkcz0lcCkiLCAxLCAoY3JlZHMpKTsKLSAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdW5yZWYoY3JlZHMpOwotfQotCi1ncnBjX3NlY3VyaXR5X3N0YXR1cyBncnBjX3NlcnZlcl9jcmVkZW50aWFsc19jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAotICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcywgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKLSAgaWYgKGNyZWRzID09IE5VTEwgfHwgY3JlZHMtPnZ0YWJsZS0+Y3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvciA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJTZXJ2ZXIgY3JlZGVudGlhbHMgY2Fubm90IGNyZWF0ZSBzZWN1cml0eSBjb250ZXh0LiIpOwotICAgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOwotICB9Ci0gIHJldHVybiBjcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKGNyZWRzLCBzYyk7Ci19Ci0KLXZvaWQgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfc2V0X2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yKAotICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcywgZ3JwY19hdXRoX21ldGFkYXRhX3Byb2Nlc3NvciBwcm9jZXNzb3IpIHsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfc2V0X2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yKCIKLSAgICAgICJjcmVkcz0lcCwgIgotICAgICAgInByb2Nlc3Nvcj1ncnBjX2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yIHsgcHJvY2VzczogJXAsIHN0YXRlOiAlcCB9KSIsCi0gICAgICAzLCAoY3JlZHMsICh2b2lkICopKGludHB0cl90KXByb2Nlc3Nvci5wcm9jZXNzLCBwcm9jZXNzb3Iuc3RhdGUpKTsKLSAgaWYgKGNyZWRzID09IE5VTEwpIHJldHVybjsKLSAgaWYgKGNyZWRzLT5wcm9jZXNzb3IuZGVzdHJveSAhPSBOVUxMICYmIGNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUgIT0gTlVMTCkgewotICAgIGNyZWRzLT5wcm9jZXNzb3IuZGVzdHJveShjcmVkcy0+cHJvY2Vzc29yLnN0YXRlKTsKLSAgfQotICBjcmVkcy0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOwotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfY3JlZGVudGlhbHNfcG9pbnRlcl9hcmdfZGVzdHJveSh2b2lkICpwKSB7Ci0gIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3VucmVmKHApOwotfQotCi1zdGF0aWMgdm9pZCAqc2VydmVyX2NyZWRlbnRpYWxzX3BvaW50ZXJfYXJnX2NvcHkodm9pZCAqcCkgewotICByZXR1cm4gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVmKHApOwotfQotCi1zdGF0aWMgaW50IHNlcnZlcl9jcmVkZW50aWFsc19wb2ludGVyX2NtcCh2b2lkICphLCB2b2lkICpiKSB7Ci0gIHJldHVybiBHUFJfSUNNUChhLCBiKTsKLX0KLQotc3RhdGljIGNvbnN0IGdycGNfYXJnX3BvaW50ZXJfdnRhYmxlIGNyZWRfcHRyX3Z0YWJsZSA9IHsKLSAgICBzZXJ2ZXJfY3JlZGVudGlhbHNfcG9pbnRlcl9hcmdfY29weSwgc2VydmVyX2NyZWRlbnRpYWxzX3BvaW50ZXJfYXJnX2Rlc3Ryb3ksCi0gICAgc2VydmVyX2NyZWRlbnRpYWxzX3BvaW50ZXJfY21wfTsKLQotZ3JwY19hcmcgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdG9fYXJnKGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpwKSB7Ci0gIGdycGNfYXJnIGFyZzsKLSAgbWVtc2V0KCZhcmcsIDAsIHNpemVvZihncnBjX2FyZykpOwotICBhcmcudHlwZSA9IEdSUENfQVJHX1BPSU5URVI7Ci0gIGFyZy5rZXkgPSBHUlBDX1NFUlZFUl9DUkVERU5USUFMU19BUkc7Ci0gIGFyZy52YWx1ZS5wb2ludGVyLnAgPSBwOwotICBhcmcudmFsdWUucG9pbnRlci52dGFibGUgPSAmY3JlZF9wdHJfdnRhYmxlOwotICByZXR1cm4gYXJnOwotfQotCi1ncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZykgewotICBpZiAoc3RyY21wKGFyZy0+a2V5LCBHUlBDX1NFUlZFUl9DUkVERU5USUFMU19BUkcpICE9IDApIHJldHVybiBOVUxMOwotICBpZiAoYXJnLT50eXBlICE9IEdSUENfQVJHX1BPSU5URVIpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgdHlwZSAlZCBmb3IgYXJnICVzIiwgYXJnLT50eXBlLAotICAgICAgICAgICAgR1JQQ19TRVJWRVJfQ1JFREVOVElBTFNfQVJHKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gYXJnLT52YWx1ZS5wb2ludGVyLnA7Ci19Ci0KLWdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpncnBjX2ZpbmRfc2VydmVyX2NyZWRlbnRpYWxzX2luX2FyZ3MoCi0gICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpIHsKLSAgc2l6ZV90IGk7Ci0gIGlmIChhcmdzID09IE5VTEwpIHJldHVybiBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgewotICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpwID0KLSAgICAgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfZnJvbV9hcmcoJmFyZ3MtPmFyZ3NbaV0pOwotICAgIGlmIChwICE9IE5VTEwpIHJldHVybiBwOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiAtLSBTc2wgY3JlZGVudGlhbHMuIC0tICovCi0KLXN0YXRpYyB2b2lkIHNzbF9kZXN0cnVjdChncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGdycGNfc3NsX2NyZWRlbnRpYWxzICpjID0gKGdycGNfc3NsX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIGlmIChjLT5jb25maWcucGVtX3Jvb3RfY2VydHMgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9yb290X2NlcnRzKTsKLSAgaWYgKGMtPmNvbmZpZy5wZW1fcHJpdmF0ZV9rZXkgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleSk7Ci0gIGlmIChjLT5jb25maWcucGVtX2NlcnRfY2hhaW4gIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9jZXJ0X2NoYWluKTsKLX0KLQotc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9kZXN0cnVjdChncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzICpjID0gKGdycGNfc3NsX3NlcnZlcl9jcmVkZW50aWFscyAqKWNyZWRzOwotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGMtPmNvbmZpZy5udW1fa2V5X2NlcnRfcGFpcnM7IGkrKykgewotICAgIGlmIChjLT5jb25maWcucGVtX3ByaXZhdGVfa2V5c1tpXSAhPSBOVUxMKSB7Ci0gICAgICBncHJfZnJlZShjLT5jb25maWcucGVtX3ByaXZhdGVfa2V5c1tpXSk7Ci0gICAgfQotICAgIGlmIChjLT5jb25maWcucGVtX2NlcnRfY2hhaW5zW2ldICE9IE5VTEwpIHsKLSAgICAgIGdwcl9mcmVlKGMtPmNvbmZpZy5wZW1fY2VydF9jaGFpbnNbaV0pOwotICAgIH0KLSAgfQotICBpZiAoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleXMgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleXMpOwotICBpZiAoYy0+Y29uZmlnLnBlbV9wcml2YXRlX2tleXNfc2l6ZXMgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKGMtPmNvbmZpZy5wZW1fcHJpdmF0ZV9rZXlzX3NpemVzKTsKLSAgfQotICBpZiAoYy0+Y29uZmlnLnBlbV9jZXJ0X2NoYWlucyAhPSBOVUxMKSBncHJfZnJlZShjLT5jb25maWcucGVtX2NlcnRfY2hhaW5zKTsKLSAgaWYgKGMtPmNvbmZpZy5wZW1fY2VydF9jaGFpbnNfc2l6ZXMgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKGMtPmNvbmZpZy5wZW1fY2VydF9jaGFpbnNfc2l6ZXMpOwotICB9Ci0gIGlmIChjLT5jb25maWcucGVtX3Jvb3RfY2VydHMgIT0gTlVMTCkgZ3ByX2ZyZWUoYy0+Y29uZmlnLnBlbV9yb290X2NlcnRzKTsKLX0KLQotc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzIHNzbF9jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAotICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKLSAgICBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAotICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYywgZ3JwY19jaGFubmVsX2FyZ3MgKipuZXdfYXJncykgewotICBncnBjX3NzbF9jcmVkZW50aWFscyAqYyA9IChncnBjX3NzbF9jcmVkZW50aWFscyAqKWNyZWRzOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX09LOwotICBzaXplX3QgaSA9IDA7Ci0gIGNvbnN0IGNoYXIgKm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUgPSBOVUxMOwotICBncnBjX2FyZyBuZXdfYXJnOwotCi0gIGZvciAoaSA9IDA7IGFyZ3MgJiYgaSA8IGFyZ3MtPm51bV9hcmdzOyBpKyspIHsKLSAgICBncnBjX2FyZyAqYXJnID0gJmFyZ3MtPmFyZ3NbaV07Ci0gICAgaWYgKHN0cmNtcChhcmctPmtleSwgR1JQQ19TU0xfVEFSR0VUX05BTUVfT1ZFUlJJREVfQVJHKSA9PSAwICYmCi0gICAgICAgIGFyZy0+dHlwZSA9PSBHUlBDX0FSR19TVFJJTkcpIHsKLSAgICAgIG92ZXJyaWRkZW5fdGFyZ2V0X25hbWUgPSBhcmctPnZhbHVlLnN0cmluZzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBzdGF0dXMgPSBncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCi0gICAgICBjYWxsX2NyZWRzLCAmYy0+Y29uZmlnLCB0YXJnZXQsIG92ZXJyaWRkZW5fdGFyZ2V0X25hbWUsIHNjKTsKLSAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICBuZXdfYXJnLnR5cGUgPSBHUlBDX0FSR19TVFJJTkc7Ci0gIG5ld19hcmcua2V5ID0gR1JQQ19BUkdfSFRUUDJfU0NIRU1FOwotICBuZXdfYXJnLnZhbHVlLnN0cmluZyA9ICJodHRwcyI7Ci0gICpuZXdfYXJncyA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHlfYW5kX2FkZChhcmdzLCAmbmV3X2FyZywgMSk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBncnBjX3NlY3VyaXR5X3N0YXR1cyBzc2xfc2VydmVyX2NyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IoCi0gICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzLCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKipzYykgewotICBncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIHJldHVybiBncnBjX3NzbF9zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgmYy0+Y29uZmlnLCBzYyk7Ci19Ci0KLXN0YXRpYyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdnRhYmxlIHNzbF92dGFibGUgPSB7Ci0gICAgc3NsX2Rlc3RydWN0LCBzc2xfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07Ci0KLXN0YXRpYyBncnBjX3NlcnZlcl9jcmVkZW50aWFsc192dGFibGUgc3NsX3NlcnZlcl92dGFibGUgPSB7Ci0gICAgc3NsX3NlcnZlcl9kZXN0cnVjdCwgc3NsX3NlcnZlcl9jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yfTsKLQotc3RhdGljIHZvaWQgc3NsX2NvcHlfa2V5X21hdGVyaWFsKGNvbnN0IGNoYXIgKmlucHV0LCB1bnNpZ25lZCBjaGFyICoqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0cHV0X3NpemUpIHsKLSAgKm91dHB1dF9zaXplID0gc3RybGVuKGlucHV0KTsKLSAgKm91dHB1dCA9IGdwcl9tYWxsb2MoKm91dHB1dF9zaXplKTsKLSAgbWVtY3B5KCpvdXRwdXQsIGlucHV0LCAqb3V0cHV0X3NpemUpOwotfQotCi1zdGF0aWMgdm9pZCBzc2xfYnVpbGRfY29uZmlnKGNvbnN0IGNoYXIgKnBlbV9yb290X2NlcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NzbF9wZW1fa2V5X2NlcnRfcGFpciAqcGVtX2tleV9jZXJ0X3BhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3NsX2NvbmZpZyAqY29uZmlnKSB7Ci0gIGlmIChwZW1fcm9vdF9jZXJ0cyAhPSBOVUxMKSB7Ci0gICAgc3NsX2NvcHlfa2V5X21hdGVyaWFsKHBlbV9yb290X2NlcnRzLCAmY29uZmlnLT5wZW1fcm9vdF9jZXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX3Jvb3RfY2VydHNfc2l6ZSk7Ci0gIH0KLSAgaWYgKHBlbV9rZXlfY2VydF9wYWlyICE9IE5VTEwpIHsKLSAgICBHUFJfQVNTRVJUKHBlbV9rZXlfY2VydF9wYWlyLT5wcml2YXRlX2tleSAhPSBOVUxMKTsKLSAgICBHUFJfQVNTRVJUKHBlbV9rZXlfY2VydF9wYWlyLT5jZXJ0X2NoYWluICE9IE5VTEwpOwotICAgIHNzbF9jb3B5X2tleV9tYXRlcmlhbChwZW1fa2V5X2NlcnRfcGFpci0+cHJpdmF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBlbV9wcml2YXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX3ByaXZhdGVfa2V5X3NpemUpOwotICAgIHNzbF9jb3B5X2tleV9tYXRlcmlhbChwZW1fa2V5X2NlcnRfcGFpci0+Y2VydF9jaGFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX2NlcnRfY2hhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBlbV9jZXJ0X2NoYWluX3NpemUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNzbF9idWlsZF9zZXJ2ZXJfY29uZmlnKAotICAgIGNvbnN0IGNoYXIgKnBlbV9yb290X2NlcnRzLCBncnBjX3NzbF9wZW1fa2V5X2NlcnRfcGFpciAqcGVtX2tleV9jZXJ0X3BhaXJzLAotICAgIHNpemVfdCBudW1fa2V5X2NlcnRfcGFpcnMsIGludCBmb3JjZV9jbGllbnRfYXV0aCwKLSAgICBncnBjX3NzbF9zZXJ2ZXJfY29uZmlnICpjb25maWcpIHsKLSAgc2l6ZV90IGk7Ci0gIGNvbmZpZy0+Zm9yY2VfY2xpZW50X2F1dGggPSBmb3JjZV9jbGllbnRfYXV0aDsKLSAgaWYgKHBlbV9yb290X2NlcnRzICE9IE5VTEwpIHsKLSAgICBzc2xfY29weV9rZXlfbWF0ZXJpYWwocGVtX3Jvb3RfY2VydHMsICZjb25maWctPnBlbV9yb290X2NlcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5wZW1fcm9vdF9jZXJ0c19zaXplKTsKLSAgfQotICBpZiAobnVtX2tleV9jZXJ0X3BhaXJzID4gMCkgewotICAgIEdQUl9BU1NFUlQocGVtX2tleV9jZXJ0X3BhaXJzICE9IE5VTEwpOwotICAgIGNvbmZpZy0+cGVtX3ByaXZhdGVfa2V5cyA9Ci0gICAgICAgIGdwcl9tYWxsb2MobnVtX2tleV9jZXJ0X3BhaXJzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikpOwotICAgIGNvbmZpZy0+cGVtX2NlcnRfY2hhaW5zID0KLSAgICAgICAgZ3ByX21hbGxvYyhudW1fa2V5X2NlcnRfcGFpcnMgKiBzaXplb2YodW5zaWduZWQgY2hhciAqKSk7Ci0gICAgY29uZmlnLT5wZW1fcHJpdmF0ZV9rZXlzX3NpemVzID0KLSAgICAgICAgZ3ByX21hbGxvYyhudW1fa2V5X2NlcnRfcGFpcnMgKiBzaXplb2Yoc2l6ZV90KSk7Ci0gICAgY29uZmlnLT5wZW1fY2VydF9jaGFpbnNfc2l6ZXMgPQotICAgICAgICBncHJfbWFsbG9jKG51bV9rZXlfY2VydF9wYWlycyAqIHNpemVvZihzaXplX3QpKTsKLSAgfQotICBjb25maWctPm51bV9rZXlfY2VydF9wYWlycyA9IG51bV9rZXlfY2VydF9wYWlyczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9rZXlfY2VydF9wYWlyczsgaSsrKSB7Ci0gICAgR1BSX0FTU0VSVChwZW1fa2V5X2NlcnRfcGFpcnNbaV0ucHJpdmF0ZV9rZXkgIT0gTlVMTCk7Ci0gICAgR1BSX0FTU0VSVChwZW1fa2V5X2NlcnRfcGFpcnNbaV0uY2VydF9jaGFpbiAhPSBOVUxMKTsKLSAgICBzc2xfY29weV9rZXlfbWF0ZXJpYWwocGVtX2tleV9jZXJ0X3BhaXJzW2ldLnByaXZhdGVfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5wZW1fcHJpdmF0ZV9rZXlzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5wZW1fcHJpdmF0ZV9rZXlzX3NpemVzW2ldKTsKLSAgICBzc2xfY29weV9rZXlfbWF0ZXJpYWwocGVtX2tleV9jZXJ0X3BhaXJzW2ldLmNlcnRfY2hhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBlbV9jZXJ0X2NoYWluc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+cGVtX2NlcnRfY2hhaW5zX3NpemVzW2ldKTsKLSAgfQotfQotCi1ncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmdycGNfc3NsX2NyZWRlbnRpYWxzX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICpwZW1fcm9vdF9jZXJ0cywgZ3JwY19zc2xfcGVtX2tleV9jZXJ0X3BhaXIgKnBlbV9rZXlfY2VydF9wYWlyLAotICAgIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGdycGNfc3NsX2NyZWRlbnRpYWxzICpjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zc2xfY3JlZGVudGlhbHMpKTsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19zc2xfY3JlZGVudGlhbHNfY3JlYXRlKHBlbV9yb290X2NlcnRzPSVzLCAiCi0gICAgICAicGVtX2tleV9jZXJ0X3BhaXI9JXAsICIKLSAgICAgICJyZXNlcnZlZD0lcCkiLAotICAgICAgMywgKHBlbV9yb290X2NlcnRzLCBwZW1fa2V5X2NlcnRfcGFpciwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9jcmVkZW50aWFscykpOwotICBjLT5iYXNlLnR5cGUgPSBHUlBDX0NIQU5ORUxfQ1JFREVOVElBTFNfVFlQRV9TU0w7Ci0gIGMtPmJhc2UudnRhYmxlID0gJnNzbF92dGFibGU7Ci0gIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7Ci0gIHNzbF9idWlsZF9jb25maWcocGVtX3Jvb3RfY2VydHMsIHBlbV9rZXlfY2VydF9wYWlyLCAmYy0+Y29uZmlnKTsKLSAgcmV0dXJuICZjLT5iYXNlOwotfQotCi1ncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICpwZW1fcm9vdF9jZXJ0cywgZ3JwY19zc2xfcGVtX2tleV9jZXJ0X3BhaXIgKnBlbV9rZXlfY2VydF9wYWlycywKLSAgICBzaXplX3QgbnVtX2tleV9jZXJ0X3BhaXJzLCBpbnQgZm9yY2VfY2xpZW50X2F1dGgsIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGdycGNfc3NsX3NlcnZlcl9jcmVkZW50aWFscyAqYyA9Ci0gICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHMpKTsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19zc2xfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZSgiCi0gICAgICAicGVtX3Jvb3RfY2VydHM9JXMsIHBlbV9rZXlfY2VydF9wYWlycz0lcCwgbnVtX2tleV9jZXJ0X3BhaXJzPSVsdSwgIgotICAgICAgImZvcmNlX2NsaWVudF9hdXRoPSVkLCByZXNlcnZlZD0lcCkiLAotICAgICAgNSwgKHBlbV9yb290X2NlcnRzLCBwZW1fa2V5X2NlcnRfcGFpcnMsICh1bnNpZ25lZCBsb25nKW51bV9rZXlfY2VydF9wYWlycywKLSAgICAgICAgICBmb3JjZV9jbGllbnRfYXV0aCwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHMpKTsKLSAgYy0+YmFzZS50eXBlID0gR1JQQ19DSEFOTkVMX0NSRURFTlRJQUxTX1RZUEVfU1NMOwotICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZzc2xfc2VydmVyX3Z0YWJsZTsKLSAgc3NsX2J1aWxkX3NlcnZlcl9jb25maWcocGVtX3Jvb3RfY2VydHMsIHBlbV9rZXlfY2VydF9wYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2tleV9jZXJ0X3BhaXJzLCBmb3JjZV9jbGllbnRfYXV0aCwgJmMtPmNvbmZpZyk7Ci0gIHJldHVybiAmYy0+YmFzZTsKLX0KLQotLyogLS0gSnd0IGNyZWRlbnRpYWxzIC0tICovCi0KLXN0YXRpYyB2b2lkIGp3dF9yZXNldF9jYWNoZShncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzICpjKSB7Ci0gIGlmIChjLT5jYWNoZWQuand0X21kICE9IE5VTEwpIHsKLSAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGMtPmNhY2hlZC5qd3RfbWQpOwotICAgIGMtPmNhY2hlZC5qd3RfbWQgPSBOVUxMOwotICB9Ci0gIGlmIChjLT5jYWNoZWQuc2VydmljZV91cmwgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKGMtPmNhY2hlZC5zZXJ2aWNlX3VybCk7Ci0gICAgYy0+Y2FjaGVkLnNlcnZpY2VfdXJsID0gTlVMTDsKLSAgfQotICBjLT5jYWNoZWQuand0X2V4cGlyYXRpb24gPSBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLX0KLQotc3RhdGljIHZvaWQgand0X2Rlc3RydWN0KGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqYyA9Ci0gICAgICAoZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqKWNyZWRzOwotICBncnBjX2F1dGhfanNvbl9rZXlfZGVzdHJ1Y3QoJmMtPmtleSk7Ci0gIGp3dF9yZXNldF9jYWNoZShjKTsKLSAgZ3ByX211X2Rlc3Ryb3koJmMtPmNhY2hlX211KTsKLX0KLQotc3RhdGljIHZvaWQgand0X2dldF9yZXF1ZXN0X21ldGFkYXRhKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqYyA9Ci0gICAgICAoZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscyAqKWNyZWRzOwotICBncHJfdGltZXNwZWMgcmVmcmVzaF90aHJlc2hvbGQgPSBncHJfdGltZV9mcm9tX3NlY29uZHMoCi0gICAgICBHUlBDX1NFQ1VSRV9UT0tFTl9SRUZSRVNIX1RIUkVTSE9MRF9TRUNTLCBHUFJfVElNRVNQQU4pOwotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gcmV0dXJuIGEgY2FjaGVkIGp3dC4gKi8KLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqand0X21kID0gTlVMTDsKLSAgewotICAgIGdwcl9tdV9sb2NrKCZjLT5jYWNoZV9tdSk7Ci0gICAgaWYgKGMtPmNhY2hlZC5zZXJ2aWNlX3VybCAhPSBOVUxMICYmCi0gICAgICAgIHN0cmNtcChjLT5jYWNoZWQuc2VydmljZV91cmwsIGNvbnRleHQuc2VydmljZV91cmwpID09IDAgJiYKLSAgICAgICAgYy0+Y2FjaGVkLmp3dF9tZCAhPSBOVUxMICYmCi0gICAgICAgIChncHJfdGltZV9jbXAoZ3ByX3RpbWVfc3ViKGMtPmNhY2hlZC5qd3RfZXhwaXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpKSwKLSAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3RocmVzaG9sZCkgPiAwKSkgewotICAgICAgand0X21kID0gZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoYy0+Y2FjaGVkLmp3dF9tZCk7Ci0gICAgfQotICAgIGdwcl9tdV91bmxvY2soJmMtPmNhY2hlX211KTsKLSAgfQotCi0gIGlmIChqd3RfbWQgPT0gTlVMTCkgewotICAgIGNoYXIgKmp3dCA9IE5VTEw7Ci0gICAgLyogR2VuZXJhdGUgYSBuZXcgand0LiAqLwotICAgIGdwcl9tdV9sb2NrKCZjLT5jYWNoZV9tdSk7Ci0gICAgand0X3Jlc2V0X2NhY2hlKGMpOwotICAgIGp3dCA9IGdycGNfand0X2VuY29kZV9hbmRfc2lnbigmYy0+a2V5LCBjb250ZXh0LnNlcnZpY2VfdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5qd3RfbGlmZXRpbWUsIE5VTEwpOwotICAgIGlmIChqd3QgIT0gTlVMTCkgewotICAgICAgY2hhciAqbWRfdmFsdWU7Ci0gICAgICBncHJfYXNwcmludGYoJm1kX3ZhbHVlLCAiQmVhcmVyICVzIiwgand0KTsKLSAgICAgIGdwcl9mcmVlKGp3dCk7Ci0gICAgICBjLT5jYWNoZWQuand0X2V4cGlyYXRpb24gPQotICAgICAgICAgIGdwcl90aW1lX2FkZChncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGMtPmp3dF9saWZldGltZSk7Ci0gICAgICBjLT5jYWNoZWQuc2VydmljZV91cmwgPSBncHJfc3RyZHVwKGNvbnRleHQuc2VydmljZV91cmwpOwotICAgICAgYy0+Y2FjaGVkLmp3dF9tZCA9IGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfY3JlYXRlKDEpOwotICAgICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoCi0gICAgICAgICAgYy0+Y2FjaGVkLmp3dF9tZCwgR1JQQ19BVVRIT1JJWkFUSU9OX01FVEFEQVRBX0tFWSwgbWRfdmFsdWUpOwotICAgICAgZ3ByX2ZyZWUobWRfdmFsdWUpOwotICAgICAgand0X21kID0gZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoYy0+Y2FjaGVkLmp3dF9tZCk7Ci0gICAgfQotICAgIGdwcl9tdV91bmxvY2soJmMtPmNhY2hlX211KTsKLSAgfQotCi0gIGlmIChqd3RfbWQgIT0gTlVMTCkgewotICAgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIGp3dF9tZC0+ZW50cmllcywgand0X21kLT5udW1fZW50cmllcywKLSAgICAgICBHUlBDX0NSRURFTlRJQUxTX09LKTsKLSAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGp3dF9tZCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgTlVMTCwgMCwgR1JQQ19DUkVERU5USUFMU19FUlJPUik7Ci0gIH0KLX0KLQotc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgand0X3Z0YWJsZSA9IHtqd3RfZGVzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp3dF9nZXRfcmVxdWVzdF9tZXRhZGF0YX07Ci0KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqCi1ncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzX2NyZWF0ZV9mcm9tX2F1dGhfanNvbl9rZXkoCi0gICAgZ3JwY19hdXRoX2pzb25fa2V5IGtleSwgZ3ByX3RpbWVzcGVjIHRva2VuX2xpZmV0aW1lKSB7Ci0gIGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHMgKmM7Ci0gIGlmICghZ3JwY19hdXRoX2pzb25fa2V5X2lzX3ZhbGlkKCZrZXkpKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGlucHV0IGZvciBqd3QgY3JlZGVudGlhbHMgY3JlYXRpb24iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFscykpOwotICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHMpKTsKLSAgYy0+YmFzZS50eXBlID0gR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfSldUOwotICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZqd3RfdnRhYmxlOwotICBjLT5rZXkgPSBrZXk7Ci0gIGMtPmp3dF9saWZldGltZSA9IHRva2VuX2xpZmV0aW1lOwotICBncHJfbXVfaW5pdCgmYy0+Y2FjaGVfbXUpOwotICBqd3RfcmVzZXRfY2FjaGUoYyk7Ci0gIHJldHVybiAmYy0+YmFzZTsKLX0KLQotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICpqc29uX2tleSwgZ3ByX3RpbWVzcGVjIHRva2VuX2xpZmV0aW1lLCB2b2lkICpyZXNlcnZlZCkgewotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX3NlcnZpY2VfYWNjb3VudF9qd3RfYWNjZXNzX2NyZWRlbnRpYWxzX2NyZWF0ZSgiCi0gICAgICAianNvbl9rZXk9JXMsICIKLSAgICAgICJ0b2tlbl9saWZldGltZT0iCi0gICAgICAiZ3ByX3RpbWVzcGVjIHsgdHZfc2VjOiAlbGxkLCB0dl9uc2VjOiAlZCwgY2xvY2tfdHlwZTogJWQgfSwgIgotICAgICAgInJlc2VydmVkPSVwKSIsCi0gICAgICA1LAotICAgICAgKGpzb25fa2V5LCAobG9uZyBsb25nKXRva2VuX2xpZmV0aW1lLnR2X3NlYywgKGludCl0b2tlbl9saWZldGltZS50dl9uc2VjLAotICAgICAgIChpbnQpdG9rZW5fbGlmZXRpbWUuY2xvY2tfdHlwZSwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKLSAgcmV0dXJuIGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fYXV0aF9qc29uX2tleSgKLSAgICAgIGdycGNfYXV0aF9qc29uX2tleV9jcmVhdGVfZnJvbV9zdHJpbmcoanNvbl9rZXkpLCB0b2tlbl9saWZldGltZSk7Ci19Ci0KLS8qIC0tIE9hdXRoMlRva2VuRmV0Y2hlciBjcmVkZW50aWFscyAtLSAqLwotCi1zdGF0aWMgdm9pZCBvYXV0aDJfdG9rZW5fZmV0Y2hlcl9kZXN0cnVjdChncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKmMgPQotICAgICAgKGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKiljcmVkczsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV91bnJlZihjLT5hY2Nlc3NfdG9rZW5fbWQpOwotICBncHJfbXVfZGVzdHJveSgmYy0+bXUpOwotICBncnBjX2h0dHBjbGlfY29udGV4dF9kZXN0cm95KCZjLT5odHRwY2xpX2NvbnRleHQpOwotfQotCi1ncnBjX2NyZWRlbnRpYWxzX3N0YXR1cwotZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFsc19wYXJzZV9zZXJ2ZXJfcmVzcG9uc2UoCi0gICAgY29uc3QgZ3JwY19odHRwX3Jlc3BvbnNlICpyZXNwb25zZSwgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqKnRva2VuX21kLAotICAgIGdwcl90aW1lc3BlYyAqdG9rZW5fbGlmZXRpbWUpIHsKLSAgY2hhciAqbnVsbF90ZXJtaW5hdGVkX2JvZHkgPSBOVUxMOwotICBjaGFyICpuZXdfYWNjZXNzX3Rva2VuID0gTlVMTDsKLSAgZ3JwY19jcmVkZW50aWFsc19zdGF0dXMgc3RhdHVzID0gR1JQQ19DUkVERU5USUFMU19PSzsKLSAgZ3JwY19qc29uICpqc29uID0gTlVMTDsKLQotICBpZiAocmVzcG9uc2UgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiUmVjZWl2ZWQgTlVMTCByZXNwb25zZS4iKTsKLSAgICBzdGF0dXMgPSBHUlBDX0NSRURFTlRJQUxTX0VSUk9SOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgaWYgKHJlc3BvbnNlLT5ib2R5X2xlbmd0aCA+IDApIHsKLSAgICBudWxsX3Rlcm1pbmF0ZWRfYm9keSA9IGdwcl9tYWxsb2MocmVzcG9uc2UtPmJvZHlfbGVuZ3RoICsgMSk7Ci0gICAgbnVsbF90ZXJtaW5hdGVkX2JvZHlbcmVzcG9uc2UtPmJvZHlfbGVuZ3RoXSA9ICdcMCc7Ci0gICAgbWVtY3B5KG51bGxfdGVybWluYXRlZF9ib2R5LCByZXNwb25zZS0+Ym9keSwgcmVzcG9uc2UtPmJvZHlfbGVuZ3RoKTsKLSAgfQotCi0gIGlmIChyZXNwb25zZS0+c3RhdHVzICE9IDIwMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2FsbCB0byBodHRwIHNlcnZlciBlbmRlZCB3aXRoIGVycm9yICVkIFslc10uIiwKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zdGF0dXMsCi0gICAgICAgICAgICBudWxsX3Rlcm1pbmF0ZWRfYm9keSAhPSBOVUxMID8gbnVsbF90ZXJtaW5hdGVkX2JvZHkgOiAiIik7Ci0gICAgc3RhdHVzID0gR1JQQ19DUkVERU5USUFMU19FUlJPUjsKLSAgICBnb3RvIGVuZDsKLSAgfSBlbHNlIHsKLSAgICBncnBjX2pzb24gKmFjY2Vzc190b2tlbiA9IE5VTEw7Ci0gICAgZ3JwY19qc29uICp0b2tlbl90eXBlID0gTlVMTDsKLSAgICBncnBjX2pzb24gKmV4cGlyZXNfaW4gPSBOVUxMOwotICAgIGdycGNfanNvbiAqcHRyOwotICAgIGpzb24gPSBncnBjX2pzb25fcGFyc2Vfc3RyaW5nKG51bGxfdGVybWluYXRlZF9ib2R5KTsKLSAgICBpZiAoanNvbiA9PSBOVUxMKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBwYXJzZSBKU09OIGZyb20gJXMiLCBudWxsX3Rlcm1pbmF0ZWRfYm9keSk7Ci0gICAgICBzdGF0dXMgPSBHUlBDX0NSRURFTlRJQUxTX0VSUk9SOwotICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGlmIChqc29uLT50eXBlICE9IEdSUENfSlNPTl9PQkpFQ1QpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiUmVzcG9uc2Ugc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QiKTsKLSAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgZm9yIChwdHIgPSBqc29uLT5jaGlsZDsgcHRyOyBwdHIgPSBwdHItPm5leHQpIHsKLSAgICAgIGlmIChzdHJjbXAocHRyLT5rZXksICJhY2Nlc3NfdG9rZW4iKSA9PSAwKSB7Ci0gICAgICAgIGFjY2Vzc190b2tlbiA9IHB0cjsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHB0ci0+a2V5LCAidG9rZW5fdHlwZSIpID09IDApIHsKLSAgICAgICAgdG9rZW5fdHlwZSA9IHB0cjsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHB0ci0+a2V5LCAiZXhwaXJlc19pbiIpID09IDApIHsKLSAgICAgICAgZXhwaXJlc19pbiA9IHB0cjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGFjY2Vzc190b2tlbiA9PSBOVUxMIHx8IGFjY2Vzc190b2tlbi0+dHlwZSAhPSBHUlBDX0pTT05fU1RSSU5HKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3Npbmcgb3IgaW52YWxpZCBhY2Nlc3NfdG9rZW4gaW4gSlNPTi4iKTsKLSAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgaWYgKHRva2VuX3R5cGUgPT0gTlVMTCB8fCB0b2tlbl90eXBlLT50eXBlICE9IEdSUENfSlNPTl9TVFJJTkcpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTWlzc2luZyBvciBpbnZhbGlkIHRva2VuX3R5cGUgaW4gSlNPTi4iKTsKLSAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgaWYgKGV4cGlyZXNfaW4gPT0gTlVMTCB8fCBleHBpcmVzX2luLT50eXBlICE9IEdSUENfSlNPTl9OVU1CRVIpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTWlzc2luZyBvciBpbnZhbGlkIGV4cGlyZXNfaW4gaW4gSlNPTi4iKTsKLSAgICAgIHN0YXR1cyA9IEdSUENfQ1JFREVOVElBTFNfRVJST1I7Ci0gICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgZ3ByX2FzcHJpbnRmKCZuZXdfYWNjZXNzX3Rva2VuLCAiJXMgJXMiLCB0b2tlbl90eXBlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuLT52YWx1ZSk7Ci0gICAgdG9rZW5fbGlmZXRpbWUtPnR2X3NlYyA9IHN0cnRvbChleHBpcmVzX2luLT52YWx1ZSwgTlVMTCwgMTApOwotICAgIHRva2VuX2xpZmV0aW1lLT50dl9uc2VjID0gMDsKLSAgICB0b2tlbl9saWZldGltZS0+Y2xvY2tfdHlwZSA9IEdQUl9USU1FU1BBTjsKLSAgICBpZiAoKnRva2VuX21kICE9IE5VTEwpIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfdW5yZWYoKnRva2VuX21kKTsKLSAgICAqdG9rZW5fbWQgPSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZSgxKTsKLSAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZF9jc3RyaW5ncygKLSAgICAgICAgKnRva2VuX21kLCBHUlBDX0FVVEhPUklaQVRJT05fTUVUQURBVEFfS0VZLCBuZXdfYWNjZXNzX3Rva2VuKTsKLSAgICBzdGF0dXMgPSBHUlBDX0NSRURFTlRJQUxTX09LOwotICB9Ci0KLWVuZDoKLSAgaWYgKHN0YXR1cyAhPSBHUlBDX0NSRURFTlRJQUxTX09LICYmICgqdG9rZW5fbWQgIT0gTlVMTCkpIHsKLSAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKCp0b2tlbl9tZCk7Ci0gICAgKnRva2VuX21kID0gTlVMTDsKLSAgfQotICBpZiAobnVsbF90ZXJtaW5hdGVkX2JvZHkgIT0gTlVMTCkgZ3ByX2ZyZWUobnVsbF90ZXJtaW5hdGVkX2JvZHkpOwotICBpZiAobmV3X2FjY2Vzc190b2tlbiAhPSBOVUxMKSBncHJfZnJlZShuZXdfYWNjZXNzX3Rva2VuKTsKLSAgaWYgKGpzb24gIT0gTlVMTCkgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX29hdXRoMl90b2tlbl9mZXRjaGVyX2h0dHBfcmVzcG9uc2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICBjb25zdCBncnBjX2h0dHBfcmVzcG9uc2UgKnJlc3BvbnNlKSB7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqciA9Ci0gICAgICAoZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0ICopdXNlcl9kYXRhOwotICBncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICpjID0KLSAgICAgIChncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICopci0+Y3JlZHM7Ci0gIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZTsKLSAgZ3JwY19jcmVkZW50aWFsc19zdGF0dXMgc3RhdHVzOwotCi0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIHN0YXR1cyA9IGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHNfcGFyc2Vfc2VydmVyX3Jlc3BvbnNlKAotICAgICAgcmVzcG9uc2UsICZjLT5hY2Nlc3NfdG9rZW5fbWQsICZ0b2tlbl9saWZldGltZSk7Ci0gIGlmIChzdGF0dXMgPT0gR1JQQ19DUkVERU5USUFMU19PSykgewotICAgIGMtPnRva2VuX2V4cGlyYXRpb24gPQotICAgICAgICBncHJfdGltZV9hZGQoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCB0b2tlbl9saWZldGltZSk7Ci0gICAgci0+Y2IoZXhlY19jdHgsIHItPnVzZXJfZGF0YSwgYy0+YWNjZXNzX3Rva2VuX21kLT5lbnRyaWVzLAotICAgICAgICAgIGMtPmFjY2Vzc190b2tlbl9tZC0+bnVtX2VudHJpZXMsIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgYy0+dG9rZW5fZXhwaXJhdGlvbiA9IGdwcl9pbmZfcGFzdChHUFJfQ0xPQ0tfUkVBTFRJTUUpOwotICAgIHItPmNiKGV4ZWNfY3R4LCByLT51c2VyX2RhdGEsIE5VTEwsIDAsIHN0YXR1cyk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmYy0+bXUpOwotICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3RfZGVzdHJveShyKTsKLX0KLQotc3RhdGljIHZvaWQgb2F1dGgyX3Rva2VuX2ZldGNoZXJfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCi0gICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAotICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSkgewotICBncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICpjID0KLSAgICAgIChncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIGdwcl90aW1lc3BlYyByZWZyZXNoX3RocmVzaG9sZCA9IGdwcl90aW1lX2Zyb21fc2Vjb25kcygKLSAgICAgIEdSUENfU0VDVVJFX1RPS0VOX1JFRlJFU0hfVEhSRVNIT0xEX1NFQ1MsIEdQUl9USU1FU1BBTik7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKmNhY2hlZF9hY2Nlc3NfdG9rZW5fbWQgPSBOVUxMOwotICB7Ci0gICAgZ3ByX211X2xvY2soJmMtPm11KTsKLSAgICBpZiAoYy0+YWNjZXNzX3Rva2VuX21kICE9IE5VTEwgJiYKLSAgICAgICAgKGdwcl90aW1lX2NtcCgKLSAgICAgICAgICAgICBncHJfdGltZV9zdWIoYy0+dG9rZW5fZXhwaXJhdGlvbiwgZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpKSwKLSAgICAgICAgICAgICByZWZyZXNoX3RocmVzaG9sZCkgPiAwKSkgewotICAgICAgY2FjaGVkX2FjY2Vzc190b2tlbl9tZCA9Ci0gICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoYy0+YWNjZXNzX3Rva2VuX21kKTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmYy0+bXUpOwotICB9Ci0gIGlmIChjYWNoZWRfYWNjZXNzX3Rva2VuX21kICE9IE5VTEwpIHsKLSAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBjYWNoZWRfYWNjZXNzX3Rva2VuX21kLT5lbnRyaWVzLAotICAgICAgIGNhY2hlZF9hY2Nlc3NfdG9rZW5fbWQtPm51bV9lbnRyaWVzLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKLSAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGNhY2hlZF9hY2Nlc3NfdG9rZW5fbWQpOwotICB9IGVsc2UgewotICAgIGMtPmZldGNoX2Z1bmMoCi0gICAgICAgIGV4ZWNfY3R4LAotICAgICAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3RfY3JlYXRlKGNyZWRzLCBjYiwgdXNlcl9kYXRhKSwKLSAgICAgICAgJmMtPmh0dHBjbGlfY29udGV4dCwgcG9sbHNldCwgb25fb2F1dGgyX3Rva2VuX2ZldGNoZXJfaHR0cF9yZXNwb25zZSwKLSAgICAgICAgZ3ByX3RpbWVfYWRkKGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgcmVmcmVzaF90aHJlc2hvbGQpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBpbml0X29hdXRoMl90b2tlbl9mZXRjaGVyKGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZmV0Y2hfb2F1dGgyX2Z1bmMgZmV0Y2hfZnVuYykgewotICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMpKTsKLSAgYy0+YmFzZS50eXBlID0gR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfT0FVVEgyOwotICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOwotICBncHJfbXVfaW5pdCgmYy0+bXUpOwotICBjLT50b2tlbl9leHBpcmF0aW9uID0gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gIGMtPmZldGNoX2Z1bmMgPSBmZXRjaF9mdW5jOwotICBncnBjX2h0dHBjbGlfY29udGV4dF9pbml0KCZjLT5odHRwY2xpX2NvbnRleHQpOwotfQotCi0vKiAtLSBHb29nbGVDb21wdXRlRW5naW5lIGNyZWRlbnRpYWxzLiAtLSAqLwotCi1zdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZSBjb21wdXRlX2VuZ2luZV92dGFibGUgPSB7Ci0gICAgb2F1dGgyX3Rva2VuX2ZldGNoZXJfZGVzdHJ1Y3QsIG9hdXRoMl90b2tlbl9mZXRjaGVyX2dldF9yZXF1ZXN0X21ldGFkYXRhfTsKLQotc3RhdGljIHZvaWQgY29tcHV0ZV9lbmdpbmVfZmV0Y2hfb2F1dGgyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKm1ldGFkYXRhX3JlcSwKLSAgICBncnBjX2h0dHBjbGlfY29udGV4dCAqaHR0cGNsaV9jb250ZXh0LCBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIHJlc3BvbnNlX2NiLCBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKLSAgZ3JwY19odHRwX2hlYWRlciBoZWFkZXIgPSB7Ik1ldGFkYXRhLUZsYXZvciIsICJHb29nbGUifTsKLSAgZ3JwY19odHRwY2xpX3JlcXVlc3QgcmVxdWVzdDsKLSAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YoZ3JwY19odHRwY2xpX3JlcXVlc3QpKTsKLSAgcmVxdWVzdC5ob3N0ID0gR1JQQ19DT01QVVRFX0VOR0lORV9NRVRBREFUQV9IT1NUOwotICByZXF1ZXN0Lmh0dHAucGF0aCA9IEdSUENfQ09NUFVURV9FTkdJTkVfTUVUQURBVEFfVE9LRU5fUEFUSDsKLSAgcmVxdWVzdC5odHRwLmhkcl9jb3VudCA9IDE7Ci0gIHJlcXVlc3QuaHR0cC5oZHJzID0gJmhlYWRlcjsKLSAgZ3JwY19odHRwY2xpX2dldChleGVjX2N0eCwgaHR0cGNsaV9jb250ZXh0LCBwb2xsc2V0LCAmcmVxdWVzdCwgZGVhZGxpbmUsCi0gICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfY2IsIG1ldGFkYXRhX3JlcSk7Ci19Ci0KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19nb29nbGVfY29tcHV0ZV9lbmdpbmVfY3JlZGVudGlhbHNfY3JlYXRlKAotICAgIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGdycGNfb2F1dGgyX3Rva2VuX2ZldGNoZXJfY3JlZGVudGlhbHMgKmMgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFscykpOwotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jb21wdXRlX2VuZ2luZV9jcmVkZW50aWFsc19jcmVhdGUocmVzZXJ2ZWQ9JXApIiwgMSwKLSAgICAgICAgICAgICAgICAgKHJlc2VydmVkKSk7Ci0gIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7Ci0gIGluaXRfb2F1dGgyX3Rva2VuX2ZldGNoZXIoYywgY29tcHV0ZV9lbmdpbmVfZmV0Y2hfb2F1dGgyKTsKLSAgYy0+YmFzZS52dGFibGUgPSAmY29tcHV0ZV9lbmdpbmVfdnRhYmxlOwotICByZXR1cm4gJmMtPmJhc2U7Ci19Ci0KLS8qIC0tIEdvb2dsZVJlZnJlc2hUb2tlbiBjcmVkZW50aWFscy4gLS0gKi8KLQotc3RhdGljIHZvaWQgcmVmcmVzaF90b2tlbl9kZXN0cnVjdChncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKmMgPQotICAgICAgKGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKiljcmVkczsKLSAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fZGVzdHJ1Y3QoJmMtPnJlZnJlc2hfdG9rZW4pOwotICBvYXV0aDJfdG9rZW5fZmV0Y2hlcl9kZXN0cnVjdCgmYy0+YmFzZS5iYXNlKTsKLX0KLQotc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgcmVmcmVzaF90b2tlbl92dGFibGUgPSB7Ci0gICAgcmVmcmVzaF90b2tlbl9kZXN0cnVjdCwgb2F1dGgyX3Rva2VuX2ZldGNoZXJfZ2V0X3JlcXVlc3RfbWV0YWRhdGF9OwotCi1zdGF0aWMgdm9pZCByZWZyZXNoX3Rva2VuX2ZldGNoX29hdXRoMigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0ICptZXRhZGF0YV9yZXEsCi0gICAgZ3JwY19odHRwY2xpX2NvbnRleHQgKmh0dHBjbGlfY29udGV4dCwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgIGdycGNfaHR0cGNsaV9yZXNwb25zZV9jYiByZXNwb25zZV9jYiwgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7Ci0gIGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKmMgPQotICAgICAgKGdycGNfZ29vZ2xlX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHMgKiltZXRhZGF0YV9yZXEtPmNyZWRzOwotICBncnBjX2h0dHBfaGVhZGVyIGhlYWRlciA9IHsiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9OwotICBncnBjX2h0dHBjbGlfcmVxdWVzdCByZXF1ZXN0OwotICBjaGFyICpib2R5ID0gTlVMTDsKLSAgZ3ByX2FzcHJpbnRmKCZib2R5LCBHUlBDX1JFRlJFU0hfVE9LRU5fUE9TVF9CT0RZX0ZPUk1BVF9TVFJJTkcsCi0gICAgICAgICAgICAgICBjLT5yZWZyZXNoX3Rva2VuLmNsaWVudF9pZCwgYy0+cmVmcmVzaF90b2tlbi5jbGllbnRfc2VjcmV0LAotICAgICAgICAgICAgICAgYy0+cmVmcmVzaF90b2tlbi5yZWZyZXNoX3Rva2VuKTsKLSAgbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YoZ3JwY19odHRwY2xpX3JlcXVlc3QpKTsKLSAgcmVxdWVzdC5ob3N0ID0gR1JQQ19HT09HTEVfT0FVVEgyX1NFUlZJQ0VfSE9TVDsKLSAgcmVxdWVzdC5odHRwLnBhdGggPSBHUlBDX0dPT0dMRV9PQVVUSDJfU0VSVklDRV9UT0tFTl9QQVRIOwotICByZXF1ZXN0Lmh0dHAuaGRyX2NvdW50ID0gMTsKLSAgcmVxdWVzdC5odHRwLmhkcnMgPSAmaGVhZGVyOwotICByZXF1ZXN0LmhhbmRzaGFrZXIgPSAmZ3JwY19odHRwY2xpX3NzbDsKLSAgZ3JwY19odHRwY2xpX3Bvc3QoZXhlY19jdHgsIGh0dHBjbGlfY29udGV4dCwgcG9sbHNldCwgJnJlcXVlc3QsIGJvZHksCi0gICAgICAgICAgICAgICAgICAgIHN0cmxlbihib2R5KSwgZGVhZGxpbmUsIHJlc3BvbnNlX2NiLCBtZXRhZGF0YV9yZXEpOwotICBncHJfZnJlZShib2R5KTsKLX0KLQotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICoKLWdycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX3JlZnJlc2hfdG9rZW4oCi0gICAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gcmVmcmVzaF90b2tlbikgewotICBncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzICpjOwotICBpZiAoIWdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2lzX3ZhbGlkKCZyZWZyZXNoX3Rva2VuKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBpbnB1dCBmb3IgcmVmcmVzaCB0b2tlbiBjcmVkZW50aWFscyBjcmVhdGlvbiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoZ3JwY19nb29nbGVfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFscykpOwotICBpbml0X29hdXRoMl90b2tlbl9mZXRjaGVyKCZjLT5iYXNlLCByZWZyZXNoX3Rva2VuX2ZldGNoX29hdXRoMik7Ci0gIGMtPmJhc2UuYmFzZS52dGFibGUgPSAmcmVmcmVzaF90b2tlbl92dGFibGU7Ci0gIGMtPnJlZnJlc2hfdG9rZW4gPSByZWZyZXNoX3Rva2VuOwotICByZXR1cm4gJmMtPmJhc2UuYmFzZTsKLX0KLQotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICpqc29uX3JlZnJlc2hfdG9rZW4sIHZvaWQgKnJlc2VydmVkKSB7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGUoanNvbl9yZWZyZXNoX3Rva2VuPSVzLCAiCi0gICAgICAicmVzZXJ2ZWQ9JXApIiwKLSAgICAgIDIsIChqc29uX3JlZnJlc2hfdG9rZW4sIHJlc2VydmVkKSk7Ci0gIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7Ci0gIHJldHVybiBncnBjX3JlZnJlc2hfdG9rZW5fY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fYXV0aF9yZWZyZXNoX3Rva2VuKAotICAgICAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fY3JlYXRlX2Zyb21fc3RyaW5nKGpzb25fcmVmcmVzaF90b2tlbikpOwotfQotCi0vKiAtLSBNZXRhZGF0YS1vbmx5IGNyZWRlbnRpYWxzLiAtLSAqLwotCi1zdGF0aWMgdm9pZCBtZF9vbmx5X3Rlc3RfZGVzdHJ1Y3QoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgewotICBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqYyA9IChncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqKWNyZWRzOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGMtPm1kX3N0b3JlKTsKLX0KLQotc3RhdGljIHZvaWQgb25fc2ltdWxhdGVkX3Rva2VuX2ZldGNoX2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2VzcykgewotICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKnIgPQotICAgICAgKGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqKXVzZXJfZGF0YTsKLSAgZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHMgKilyLT5jcmVkczsKLSAgci0+Y2IoZXhlY19jdHgsIHItPnVzZXJfZGF0YSwgYy0+bWRfc3RvcmUtPmVudHJpZXMsIGMtPm1kX3N0b3JlLT5udW1fZW50cmllcywKLSAgICAgICAgR1JQQ19DUkVERU5USUFMU19PSyk7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdF9kZXN0cm95KHIpOwotfQotCi1zdGF0aWMgdm9pZCBtZF9vbmx5X3Rlc3RfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCi0gICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAotICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsIHZvaWQgKnVzZXJfZGF0YSkgewotICBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqYyA9IChncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqKWNyZWRzOwotCi0gIGlmIChjLT5pc19hc3luYykgewotICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdCAqY2JfYXJnID0KLSAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9yZXF1ZXN0X2NyZWF0ZShjcmVkcywgY2IsIHVzZXJfZGF0YSk7Ci0gICAgZ3JwY19leGVjdXRvcl9lbnF1ZXVlKAotICAgICAgICBncnBjX2Nsb3N1cmVfY3JlYXRlKG9uX3NpbXVsYXRlZF90b2tlbl9mZXRjaF9kb25lLCBjYl9hcmcpLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBjLT5tZF9zdG9yZS0+ZW50cmllcywgMSwgR1JQQ19DUkVERU5USUFMU19PSyk7Ci0gIH0KLX0KLQotc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgbWRfb25seV90ZXN0X3Z0YWJsZSA9IHsKLSAgICBtZF9vbmx5X3Rlc3RfZGVzdHJ1Y3QsIG1kX29ubHlfdGVzdF9nZXRfcmVxdWVzdF9tZXRhZGF0YX07Ci0KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHNfY3JlYXRlKAotICAgIGNvbnN0IGNoYXIgKm1kX2tleSwgY29uc3QgY2hhciAqbWRfdmFsdWUsIGludCBpc19hc3luYykgewotICBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscyAqYyA9Ci0gICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFscykpOwotICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfbWRfb25seV90ZXN0X2NyZWRlbnRpYWxzKSk7Ci0gIGMtPmJhc2UudHlwZSA9IEdSUENfQ0FMTF9DUkVERU5USUFMU19UWVBFX09BVVRIMjsKLSAgYy0+YmFzZS52dGFibGUgPSAmbWRfb25seV90ZXN0X3Z0YWJsZTsKLSAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLnJlZmNvdW50LCAxKTsKLSAgYy0+bWRfc3RvcmUgPSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZSgxKTsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoYy0+bWRfc3RvcmUsIG1kX2tleSwgbWRfdmFsdWUpOwotICBjLT5pc19hc3luYyA9IGlzX2FzeW5jOwotICByZXR1cm4gJmMtPmJhc2U7Ci19Ci0KLS8qIC0tIE9hdXRoMiBBY2Nlc3MgVG9rZW4gY3JlZGVudGlhbHMuIC0tICovCi0KLXN0YXRpYyB2b2lkIGFjY2Vzc190b2tlbl9kZXN0cnVjdChncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzICpjID0gKGdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfdW5yZWYoYy0+YWNjZXNzX3Rva2VuX21kKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXNzX3Rva2VuX2dldF9yZXF1ZXN0X21ldGFkYXRhKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzLAotICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwgZ3JwY19hdXRoX21ldGFkYXRhX2NvbnRleHQgY29udGV4dCwKLSAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMgKiljcmVkczsKLSAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgYy0+YWNjZXNzX3Rva2VuX21kLT5lbnRyaWVzLCAxLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKLX0KLQotc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgYWNjZXNzX3Rva2VuX3Z0YWJsZSA9IHsKLSAgICBhY2Nlc3NfdG9rZW5fZGVzdHJ1Y3QsIGFjY2Vzc190b2tlbl9nZXRfcmVxdWVzdF9tZXRhZGF0YX07Ci0KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHNfY3JlYXRlKAotICAgIGNvbnN0IGNoYXIgKmFjY2Vzc190b2tlbiwgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMgKmMgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19hY2Nlc3NfdG9rZW5fY3JlZGVudGlhbHMpKTsKLSAgY2hhciAqdG9rZW5fbWRfdmFsdWU7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzX2NyZWF0ZShhY2Nlc3NfdG9rZW49JXMsICIKLSAgICAgICJyZXNlcnZlZD0lcCkiLAotICAgICAgMiwgKGFjY2Vzc190b2tlbiwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX2FjY2Vzc190b2tlbl9jcmVkZW50aWFscykpOwotICBjLT5iYXNlLnR5cGUgPSBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9PQVVUSDI7Ci0gIGMtPmJhc2UudnRhYmxlID0gJmFjY2Vzc190b2tlbl92dGFibGU7Ci0gIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7Ci0gIGMtPmFjY2Vzc190b2tlbl9tZCA9IGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfY3JlYXRlKDEpOwotICBncHJfYXNwcmludGYoJnRva2VuX21kX3ZhbHVlLCAiQmVhcmVyICVzIiwgYWNjZXNzX3Rva2VuKTsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoCi0gICAgICBjLT5hY2Nlc3NfdG9rZW5fbWQsIEdSUENfQVVUSE9SSVpBVElPTl9NRVRBREFUQV9LRVksIHRva2VuX21kX3ZhbHVlKTsKLSAgZ3ByX2ZyZWUodG9rZW5fbWRfdmFsdWUpOwotICByZXR1cm4gJmMtPmJhc2U7Ci19Ci0KLS8qIC0tIEZha2UgdHJhbnNwb3J0IHNlY3VyaXR5IGNyZWRlbnRpYWxzLiAtLSAqLwotCi1zdGF0aWMgZ3JwY19zZWN1cml0eV9zdGF0dXMgZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKLSAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKLSAgICBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAotICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYywgZ3JwY19jaGFubmVsX2FyZ3MgKipuZXdfYXJncykgewotICAqc2MgPSBncnBjX2Zha2VfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKGNhbGxfY3JlZHMpOwotICByZXR1cm4gR1JQQ19TRUNVUklUWV9PSzsKLX0KLQotc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzCi1mYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKLSAgICBncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqYywgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKLSAgKnNjID0gZ3JwY19mYWtlX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKCk7Ci0gIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOwotfQotCi1zdGF0aWMgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3Z0YWJsZQotICAgIGZha2VfdHJhbnNwb3J0X3NlY3VyaXR5X2NyZWRlbnRpYWxzX3Z0YWJsZSA9IHsKLSAgICAgICAgTlVMTCwgZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07Ci0KLXN0YXRpYyBncnBjX3NlcnZlcl9jcmVkZW50aWFsc192dGFibGUKLSAgICBmYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlZGVudGlhbHNfdnRhYmxlID0gewotICAgICAgICBOVUxMLCBmYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07Ci0KLWdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqZ3JwY19mYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9jcmVkZW50aWFsc19jcmVhdGUoCi0gICAgdm9pZCkgewotICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMpKTsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMpKTsKLSAgYy0+dHlwZSA9IEdSUENfQ0hBTk5FTF9DUkVERU5USUFMU19UWVBFX0ZBS0VfVFJBTlNQT1JUX1NFQ1VSSVRZOwotICBjLT52dGFibGUgPSAmZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlZGVudGlhbHNfdnRhYmxlOwotICBncHJfcmVmX2luaXQoJmMtPnJlZmNvdW50LCAxKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLWdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpncnBjX2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5X3NlcnZlcl9jcmVkZW50aWFsc19jcmVhdGUoCi0gICAgdm9pZCkgewotICBncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc2VydmVyX2NyZWRlbnRpYWxzKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMpKTsKLSAgYy0+dHlwZSA9IEdSUENfQ0hBTk5FTF9DUkVERU5USUFMU19UWVBFX0ZBS0VfVFJBTlNQT1JUX1NFQ1VSSVRZOwotICBncHJfcmVmX2luaXQoJmMtPnJlZmNvdW50LCAxKTsKLSAgYy0+dnRhYmxlID0gJmZha2VfdHJhbnNwb3J0X3NlY3VyaXR5X3NlcnZlcl9jcmVkZW50aWFsc192dGFibGU7Ci0gIHJldHVybiBjOwotfQotCi0vKiAtLSBDb21wb3NpdGUgY2FsbCBjcmVkZW50aWFscy4gLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICpjb21wb3NpdGVfY3JlZHM7Ci0gIHNpemVfdCBjcmVkc19pbmRleDsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqbWRfZWxlbXM7Ci0gIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGF1dGhfbWRfY29udGV4dDsKLSAgdm9pZCAqdXNlcl9kYXRhOwotICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2I7Ci19IGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfbWV0YWRhdGFfY29udGV4dDsKLQotc3RhdGljIHZvaWQgY29tcG9zaXRlX2NhbGxfZGVzdHJ1Y3QoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgewotICBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICpjID0gKGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHMgKiljcmVkczsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjLT5pbm5lci5udW1fY3JlZHM7IGkrKykgewotICAgIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihjLT5pbm5lci5jcmVkc19hcnJheVtpXSk7Ci0gIH0KLSAgZ3ByX2ZyZWUoYy0+aW5uZXIuY3JlZHNfYXJyYXkpOwotfQotCi1zdGF0aWMgdm9pZCBjb21wb3NpdGVfY2FsbF9tZF9jb250ZXh0X2Rlc3Ryb3koCi0gICAgZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19tZXRhZGF0YV9jb250ZXh0ICpjdHgpIHsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV91bnJlZihjdHgtPm1kX2VsZW1zKTsKLSAgZ3ByX2ZyZWUoY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgY29tcG9zaXRlX2NhbGxfbWV0YWRhdGFfY2IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWQgKm1kX2VsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9tZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfc3RhdHVzIHN0YXR1cykgewotICBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX21ldGFkYXRhX2NvbnRleHQgKmN0eCA9Ci0gICAgICAoZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19tZXRhZGF0YV9jb250ZXh0ICopdXNlcl9kYXRhOwotICBpZiAoc3RhdHVzICE9IEdSUENfQ1JFREVOVElBTFNfT0spIHsKLSAgICBjdHgtPmNiKGV4ZWNfY3R4LCBjdHgtPnVzZXJfZGF0YSwgTlVMTCwgMCwgc3RhdHVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBDb3B5IHRoZSBtZXRhZGF0YSBpbiB0aGUgY29udGV4dC4gKi8KLSAgaWYgKG51bV9tZCA+IDApIHsKLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21kOyBpKyspIHsKLSAgICAgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfYWRkKGN0eC0+bWRfZWxlbXMsIG1kX2VsZW1zW2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kX2VsZW1zW2ldLnZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvKiBTZWUgaWYgd2UgbmVlZCB0byBnZXQgc29tZSBtb3JlIG1ldGFkYXRhLiAqLwotICBpZiAoY3R4LT5jcmVkc19pbmRleCA8IGN0eC0+Y29tcG9zaXRlX2NyZWRzLT5pbm5lci5udW1fY3JlZHMpIHsKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmlubmVyX2NyZWRzID0KLSAgICAgICAgY3R4LT5jb21wb3NpdGVfY3JlZHMtPmlubmVyLmNyZWRzX2FycmF5W2N0eC0+Y3JlZHNfaW5kZXgrK107Ci0gICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2dldF9yZXF1ZXN0X21ldGFkYXRhKAotICAgICAgICBleGVjX2N0eCwgaW5uZXJfY3JlZHMsIGN0eC0+cG9sbHNldCwgY3R4LT5hdXRoX21kX2NvbnRleHQsCi0gICAgICAgIGNvbXBvc2l0ZV9jYWxsX21ldGFkYXRhX2NiLCBjdHgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFdlJ3JlIGRvbmUhLiAqLwotICBjdHgtPmNiKGV4ZWNfY3R4LCBjdHgtPnVzZXJfZGF0YSwgY3R4LT5tZF9lbGVtcy0+ZW50cmllcywKLSAgICAgICAgICBjdHgtPm1kX2VsZW1zLT5udW1fZW50cmllcywgR1JQQ19DUkVERU5USUFMU19PSyk7Ci0gIGNvbXBvc2l0ZV9jYWxsX21kX2NvbnRleHRfZGVzdHJveShjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBjb21wb3NpdGVfY2FsbF9nZXRfcmVxdWVzdF9tZXRhZGF0YSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywKLSAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGF1dGhfbWRfY29udGV4dCwKLSAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFscyAqYyA9IChncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfbWV0YWRhdGFfY29udGV4dCAqY3R4OwotCi0gIGN0eCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfbWV0YWRhdGFfY29udGV4dCkpOwotICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19tZXRhZGF0YV9jb250ZXh0KSk7Ci0gIGN0eC0+YXV0aF9tZF9jb250ZXh0ID0gYXV0aF9tZF9jb250ZXh0OwotICBjdHgtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKLSAgY3R4LT5jYiA9IGNiOwotICBjdHgtPmNvbXBvc2l0ZV9jcmVkcyA9IGM7Ci0gIGN0eC0+cG9sbHNldCA9IHBvbGxzZXQ7Ci0gIGN0eC0+bWRfZWxlbXMgPSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZShjLT5pbm5lci5udW1fY3JlZHMpOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfZ2V0X3JlcXVlc3RfbWV0YWRhdGEoCi0gICAgICBleGVjX2N0eCwgYy0+aW5uZXIuY3JlZHNfYXJyYXlbY3R4LT5jcmVkc19pbmRleCsrXSwgcG9sbHNldCwKLSAgICAgIGF1dGhfbWRfY29udGV4dCwgY29tcG9zaXRlX2NhbGxfbWV0YWRhdGFfY2IsIGN0eCk7Ci19Ci0KLXN0YXRpYyBncnBjX2NhbGxfY3JlZGVudGlhbHNfdnRhYmxlIGNvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZSA9IHsKLSAgICBjb21wb3NpdGVfY2FsbF9kZXN0cnVjdCwgY29tcG9zaXRlX2NhbGxfZ2V0X3JlcXVlc3RfbWV0YWRhdGF9OwotCi1zdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2FycmF5IGdldF9jcmVkc19hcnJheSgKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKipjcmVkc19hZGRyKSB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFsc19hcnJheSByZXN1bHQ7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMgPSAqY3JlZHNfYWRkcjsKLSAgcmVzdWx0LmNyZWRzX2FycmF5ID0gY3JlZHNfYWRkcjsKLSAgcmVzdWx0Lm51bV9jcmVkcyA9IDE7Ci0gIGlmIChzdHJjbXAoY3JlZHMtPnR5cGUsIEdSUENfQ0FMTF9DUkVERU5USUFMU19UWVBFX0NPTVBPU0lURSkgPT0gMCkgewotICAgIHJlc3VsdCA9ICpncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX2dldF9jcmVkZW50aWFscyhjcmVkcyk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzX2NyZWF0ZSgKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzMSwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkczIsCi0gICAgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgc2l6ZV90IGk7Ci0gIHNpemVfdCBjcmVkc19hcnJheV9ieXRlX3NpemU7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFsc19hcnJheSBjcmVkczFfYXJyYXk7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFsc19hcnJheSBjcmVkczJfYXJyYXk7Ci0gIGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHMgKmM7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfY3JlYXRlKGNyZWRzMT0lcCwgY3JlZHMyPSVwLCAiCi0gICAgICAicmVzZXJ2ZWQ9JXApIiwKLSAgICAgIDMsIChjcmVkczEsIGNyZWRzMiwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKLSAgR1BSX0FTU0VSVChjcmVkczEgIT0gTlVMTCk7Ci0gIEdQUl9BU1NFUlQoY3JlZHMyICE9IE5VTEwpOwotICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFscykpOwotICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHMpKTsKLSAgYy0+YmFzZS50eXBlID0gR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfQ09NUE9TSVRFOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZjb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc192dGFibGU7Ci0gIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7Ci0gIGNyZWRzMV9hcnJheSA9IGdldF9jcmVkc19hcnJheSgmY3JlZHMxKTsKLSAgY3JlZHMyX2FycmF5ID0gZ2V0X2NyZWRzX2FycmF5KCZjcmVkczIpOwotICBjLT5pbm5lci5udW1fY3JlZHMgPSBjcmVkczFfYXJyYXkubnVtX2NyZWRzICsgY3JlZHMyX2FycmF5Lm51bV9jcmVkczsKLSAgY3JlZHNfYXJyYXlfYnl0ZV9zaXplID0gYy0+aW5uZXIubnVtX2NyZWRzICogc2l6ZW9mKGdycGNfY2FsbF9jcmVkZW50aWFscyAqKTsKLSAgYy0+aW5uZXIuY3JlZHNfYXJyYXkgPSBncHJfbWFsbG9jKGNyZWRzX2FycmF5X2J5dGVfc2l6ZSk7Ci0gIG1lbXNldChjLT5pbm5lci5jcmVkc19hcnJheSwgMCwgY3JlZHNfYXJyYXlfYnl0ZV9zaXplKTsKLSAgZm9yIChpID0gMDsgaSA8IGNyZWRzMV9hcnJheS5udW1fY3JlZHM7IGkrKykgewotICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3VyX2NyZWRzID0gY3JlZHMxX2FycmF5LmNyZWRzX2FycmF5W2ldOwotICAgIGMtPmlubmVyLmNyZWRzX2FycmF5W2ldID0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihjdXJfY3JlZHMpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBjcmVkczJfYXJyYXkubnVtX2NyZWRzOyBpKyspIHsKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmN1cl9jcmVkcyA9IGNyZWRzMl9hcnJheS5jcmVkc19hcnJheVtpXTsKLSAgICBjLT5pbm5lci5jcmVkc19hcnJheVtpICsgY3JlZHMxX2FycmF5Lm51bV9jcmVkc10gPQotICAgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKGN1cl9jcmVkcyk7Ci0gIH0KLSAgcmV0dXJuICZjLT5iYXNlOwotfQotCi1jb25zdCBncnBjX2NhbGxfY3JlZGVudGlhbHNfYXJyYXkgKgotZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19nZXRfY3JlZGVudGlhbHMoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcykgewotICBjb25zdCBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICpjID0KLSAgICAgIChjb25zdCBncnBjX2NvbXBvc2l0ZV9jYWxsX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIEdQUl9BU1NFUlQoc3RyY21wKGNyZWRzLT50eXBlLCBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9DT01QT1NJVEUpID09IDApOwotICByZXR1cm4gJmMtPmlubmVyOwotfQotCi1ncnBjX2NhbGxfY3JlZGVudGlhbHMgKmdycGNfY3JlZGVudGlhbHNfY29udGFpbnNfdHlwZSgKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzLCBjb25zdCBjaGFyICp0eXBlLAotICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqKmNvbXBvc2l0ZV9jcmVkcykgewotICBzaXplX3QgaTsKLSAgaWYgKHN0cmNtcChjcmVkcy0+dHlwZSwgdHlwZSkgPT0gMCkgewotICAgIGlmIChjb21wb3NpdGVfY3JlZHMgIT0gTlVMTCkgKmNvbXBvc2l0ZV9jcmVkcyA9IE5VTEw7Ci0gICAgcmV0dXJuIGNyZWRzOwotICB9IGVsc2UgaWYgKHN0cmNtcChjcmVkcy0+dHlwZSwgR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfQ09NUE9TSVRFKSA9PSAwKSB7Ci0gICAgY29uc3QgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2FycmF5ICppbm5lcl9jcmVkc19hcnJheSA9Ci0gICAgICAgIGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHNfZ2V0X2NyZWRlbnRpYWxzKGNyZWRzKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5uZXJfY3JlZHNfYXJyYXktPm51bV9jcmVkczsgaSsrKSB7Ci0gICAgICBpZiAoc3RyY21wKHR5cGUsIGlubmVyX2NyZWRzX2FycmF5LT5jcmVkc19hcnJheVtpXS0+dHlwZSkgPT0gMCkgewotICAgICAgICBpZiAoY29tcG9zaXRlX2NyZWRzICE9IE5VTEwpICpjb21wb3NpdGVfY3JlZHMgPSBjcmVkczsKLSAgICAgICAgcmV0dXJuIGlubmVyX2NyZWRzX2FycmF5LT5jcmVkc19hcnJheVtpXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIC0tIElBTSBjcmVkZW50aWFscy4gLS0gKi8KLQotc3RhdGljIHZvaWQgaWFtX2Rlc3RydWN0KGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgZ3JwY19nb29nbGVfaWFtX2NyZWRlbnRpYWxzICpjID0gKGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscyAqKWNyZWRzOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3VucmVmKGMtPmlhbV9tZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlhbV9nZXRfcmVxdWVzdF9tZXRhZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscyAqYyA9IChncnBjX2dvb2dsZV9pYW1fY3JlZGVudGlhbHMgKiljcmVkczsKLSAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgYy0+aWFtX21kLT5lbnRyaWVzLCBjLT5pYW1fbWQtPm51bV9lbnRyaWVzLAotICAgICBHUlBDX0NSRURFTlRJQUxTX09LKTsKLX0KLQotc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgaWFtX3Z0YWJsZSA9IHtpYW1fZGVzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhbV9nZXRfcmVxdWVzdF9tZXRhZGF0YX07Ci0KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19nb29nbGVfaWFtX2NyZWRlbnRpYWxzX2NyZWF0ZSgKLSAgICBjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqYXV0aG9yaXR5X3NlbGVjdG9yLCB2b2lkICpyZXNlcnZlZCkgewotICBncnBjX2dvb2dsZV9pYW1fY3JlZGVudGlhbHMgKmM7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfaWFtX2NyZWRlbnRpYWxzX2NyZWF0ZSh0b2tlbj0lcywgYXV0aG9yaXR5X3NlbGVjdG9yPSVzLCAiCi0gICAgICAicmVzZXJ2ZWQ9JXApIiwKLSAgICAgIDMsICh0b2tlbiwgYXV0aG9yaXR5X3NlbGVjdG9yLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKHJlc2VydmVkID09IE5VTEwpOwotICBHUFJfQVNTRVJUKHRva2VuICE9IE5VTEwpOwotICBHUFJfQVNTRVJUKGF1dGhvcml0eV9zZWxlY3RvciAhPSBOVUxMKTsKLSAgYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscykpOwotICBtZW1zZXQoYywgMCwgc2l6ZW9mKGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFscykpOwotICBjLT5iYXNlLnR5cGUgPSBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9JQU07Ci0gIGMtPmJhc2UudnRhYmxlID0gJmlhbV92dGFibGU7Ci0gIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7Ci0gIGMtPmlhbV9tZCA9IGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfY3JlYXRlKDIpOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZF9jc3RyaW5ncygKLSAgICAgIGMtPmlhbV9tZCwgR1JQQ19JQU1fQVVUSE9SSVpBVElPTl9UT0tFTl9NRVRBREFUQV9LRVksIHRva2VuKTsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9hZGRfY3N0cmluZ3MoCi0gICAgICBjLT5pYW1fbWQsIEdSUENfSUFNX0FVVEhPUklUWV9TRUxFQ1RPUl9NRVRBREFUQV9LRVksIGF1dGhvcml0eV9zZWxlY3Rvcik7Ci0gIHJldHVybiAmYy0+YmFzZTsKLX0KLQotLyogLS0gUGx1Z2luIGNyZWRlbnRpYWxzLiAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKnVzZXJfZGF0YTsKLSAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYjsKLX0gZ3JwY19tZXRhZGF0YV9wbHVnaW5fcmVxdWVzdDsKLQotc3RhdGljIHZvaWQgcGx1Z2luX2Rlc3RydWN0KGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKiljcmVkczsKLSAgaWYgKGMtPnBsdWdpbi5zdGF0ZSAhPSBOVUxMICYmIGMtPnBsdWdpbi5kZXN0cm95ICE9IE5VTEwpIHsKLSAgICBjLT5wbHVnaW4uZGVzdHJveShjLT5wbHVnaW4uc3RhdGUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHBsdWdpbl9tZF9yZXF1ZXN0X21ldGFkYXRhX3JlYWR5KHZvaWQgKnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX21ldGFkYXRhICptZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX2RldGFpbHMpIHsKLSAgLyogY2FsbGVkIGZyb20gYXBwbGljYXRpb24gY29kZSAqLwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBncnBjX21ldGFkYXRhX3BsdWdpbl9yZXF1ZXN0ICpyID0gKGdycGNfbWV0YWRhdGFfcGx1Z2luX3JlcXVlc3QgKilyZXF1ZXN0OwotICBpZiAoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7Ci0gICAgaWYgKGVycm9yX2RldGFpbHMgIT0gTlVMTCkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJHZXR0aW5nIG1ldGFkYXRhIGZyb20gcGx1Z2luIGZhaWxlZCB3aXRoIGVycm9yOiAlcyIsCi0gICAgICAgICAgICAgIGVycm9yX2RldGFpbHMpOwotICAgIH0KLSAgICByLT5jYigmZXhlY19jdHgsIHItPnVzZXJfZGF0YSwgTlVMTCwgMCwgR1JQQ19DUkVERU5USUFMU19FUlJPUik7Ci0gIH0gZWxzZSB7Ci0gICAgc2l6ZV90IGk7Ci0gICAgZ3JwY19jcmVkZW50aWFsc19tZCAqbWRfYXJyYXkgPSBOVUxMOwotICAgIGlmIChudW1fbWQgPiAwKSB7Ci0gICAgICBtZF9hcnJheSA9IGdwcl9tYWxsb2MobnVtX21kICogc2l6ZW9mKGdycGNfY3JlZGVudGlhbHNfbWQpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbWQ7IGkrKykgewotICAgICAgICBtZF9hcnJheVtpXS5rZXkgPSBncHJfc2xpY2VfZnJvbV9jb3BpZWRfc3RyaW5nKG1kW2ldLmtleSk7Ci0gICAgICAgIG1kX2FycmF5W2ldLnZhbHVlID0KLSAgICAgICAgICAgIGdwcl9zbGljZV9mcm9tX2NvcGllZF9idWZmZXIobWRbaV0udmFsdWUsIG1kW2ldLnZhbHVlX2xlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHItPmNiKCZleGVjX2N0eCwgci0+dXNlcl9kYXRhLCBtZF9hcnJheSwgbnVtX21kLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKLSAgICBpZiAobWRfYXJyYXkgIT0gTlVMTCkgewotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9tZDsgaSsrKSB7Ci0gICAgICAgIGdwcl9zbGljZV91bnJlZihtZF9hcnJheVtpXS5rZXkpOwotICAgICAgICBncHJfc2xpY2VfdW5yZWYobWRfYXJyYXlbaV0udmFsdWUpOwotICAgICAgfQotICAgICAgZ3ByX2ZyZWUobWRfYXJyYXkpOwotICAgIH0KLSAgfQotICBncHJfZnJlZShyKTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgcGx1Z2luX2dldF9yZXF1ZXN0X21ldGFkYXRhKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKmMgPSAoZ3JwY19wbHVnaW5fY3JlZGVudGlhbHMgKiljcmVkczsKLSAgaWYgKGMtPnBsdWdpbi5nZXRfbWV0YWRhdGEgIT0gTlVMTCkgewotICAgIGdycGNfbWV0YWRhdGFfcGx1Z2luX3JlcXVlc3QgKnJlcXVlc3QgPSBncHJfbWFsbG9jKHNpemVvZigqcmVxdWVzdCkpOwotICAgIG1lbXNldChyZXF1ZXN0LCAwLCBzaXplb2YoKnJlcXVlc3QpKTsKLSAgICByZXF1ZXN0LT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7Ci0gICAgcmVxdWVzdC0+Y2IgPSBjYjsKLSAgICBjLT5wbHVnaW4uZ2V0X21ldGFkYXRhKGMtPnBsdWdpbi5zdGF0ZSwgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbl9tZF9yZXF1ZXN0X21ldGFkYXRhX3JlYWR5LCByZXF1ZXN0KTsKLSAgfSBlbHNlIHsKLSAgICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBOVUxMLCAwLCBHUlBDX0NSRURFTlRJQUxTX09LKTsKLSAgfQotfQotCi1zdGF0aWMgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZSBwbHVnaW5fdnRhYmxlID0gewotICAgIHBsdWdpbl9kZXN0cnVjdCwgcGx1Z2luX2dldF9yZXF1ZXN0X21ldGFkYXRhfTsKLQotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX21ldGFkYXRhX2NyZWRlbnRpYWxzX2NyZWF0ZV9mcm9tX3BsdWdpbigKLSAgICBncnBjX21ldGFkYXRhX2NyZWRlbnRpYWxzX3BsdWdpbiBwbHVnaW4sIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGdycGNfcGx1Z2luX2NyZWRlbnRpYWxzICpjID0gZ3ByX21hbGxvYyhzaXplb2YoKmMpKTsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfbWV0YWRhdGFfY3JlZGVudGlhbHNfY3JlYXRlX2Zyb21fcGx1Z2luKHJlc2VydmVkPSVwKSIsIDEsCi0gICAgICAgICAgICAgICAgIChyZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKHJlc2VydmVkID09IE5VTEwpOwotICBtZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7Ci0gIGMtPmJhc2UudHlwZSA9IHBsdWdpbi50eXBlOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZwbHVnaW5fdnRhYmxlOwotICBncHJfcmVmX2luaXQoJmMtPmJhc2UucmVmY291bnQsIDEpOwotICBjLT5wbHVnaW4gPSBwbHVnaW47Ci0gIHJldHVybiAmYy0+YmFzZTsKLX0KLQotLyogLS0gQ29tcG9zaXRlIGNoYW5uZWwgY3JlZGVudGlhbHMuIC0tICovCi0KLXN0YXRpYyB2b2lkIGNvbXBvc2l0ZV9jaGFubmVsX2Rlc3RydWN0KGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFscyAqYyA9Ci0gICAgICAoZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFscyAqKWNyZWRzOwotICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdW5yZWYoYy0+aW5uZXJfY3JlZHMpOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoYy0+Y2FsbF9jcmVkcyk7Ci19Ci0KLXN0YXRpYyBncnBjX3NlY3VyaXR5X3N0YXR1cyBjb21wb3NpdGVfY2hhbm5lbF9jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAotICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKLSAgICBjb25zdCBjaGFyICp0YXJnZXQsIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAotICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYywgZ3JwY19jaGFubmVsX2FyZ3MgKipuZXdfYXJncykgewotICBncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzICpjID0KLSAgICAgIChncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzICopY3JlZHM7Ci0gIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfRVJST1I7Ci0KLSAgR1BSX0FTU0VSVChjLT5pbm5lcl9jcmVkcyAhPSBOVUxMICYmIGMtPmNhbGxfY3JlZHMgIT0gTlVMTCAmJgotICAgICAgICAgICAgIGMtPmlubmVyX2NyZWRzLT52dGFibGUgIT0gTlVMTCAmJgotICAgICAgICAgICAgIGMtPmlubmVyX2NyZWRzLT52dGFibGUtPmNyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IgIT0gTlVMTCk7Ci0gIC8qIElmIHdlIGFyZSBwYXNzZWQgYSBjYWxsX2NyZWRzLCBjcmVhdGUgYSBjYWxsIGNvbXBvc2l0ZSB0byBwYXNzIGl0Ci0gICAgIGRvd25zdHJlYW0uICovCi0gIGlmIChjYWxsX2NyZWRzICE9IE5VTEwpIHsKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNvbXBvc2l0ZV9jYWxsX2NyZWRzID0KLSAgICAgICAgZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19jcmVhdGUoYy0+Y2FsbF9jcmVkcywgY2FsbF9jcmVkcywgTlVMTCk7Ci0gICAgc3RhdHVzID0gYy0+aW5uZXJfY3JlZHMtPnZ0YWJsZS0+Y3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKLSAgICAgICAgYy0+aW5uZXJfY3JlZHMsIGNvbXBvc2l0ZV9jYWxsX2NyZWRzLCB0YXJnZXQsIGFyZ3MsIHNjLCBuZXdfYXJncyk7Ci0gICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3VucmVmKGNvbXBvc2l0ZV9jYWxsX2NyZWRzKTsKLSAgfSBlbHNlIHsKLSAgICBzdGF0dXMgPSBjLT5pbm5lcl9jcmVkcy0+dnRhYmxlLT5jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAotICAgICAgICBjLT5pbm5lcl9jcmVkcywgYy0+Y2FsbF9jcmVkcywgdGFyZ2V0LCBhcmdzLCBzYywgbmV3X2FyZ3MpOwotICB9Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdnRhYmxlIGNvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzX3Z0YWJsZSA9IHsKLSAgICBjb21wb3NpdGVfY2hhbm5lbF9kZXN0cnVjdCwgY29tcG9zaXRlX2NoYW5uZWxfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3Rvcn07Ci0KLWdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFsc19jcmVhdGUoCi0gICAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjaGFubmVsX2NyZWRzLCBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNhbGxfY3JlZHMsCi0gICAgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgZ3JwY19jb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFscyAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLSAgR1BSX0FTU0VSVChjaGFubmVsX2NyZWRzICE9IE5VTEwgJiYgY2FsbF9jcmVkcyAhPSBOVUxMICYmIHJlc2VydmVkID09IE5VTEwpOwotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX2NvbXBvc2l0ZV9jaGFubmVsX2NyZWRlbnRpYWxzX2NyZWF0ZShjaGFubmVsX2NyZWRzPSVwLCAiCi0gICAgICAiY2FsbF9jcmVkcz0lcCwgcmVzZXJ2ZWQ9JXApIiwKLSAgICAgIDMsIChjaGFubmVsX2NyZWRzLCBjYWxsX2NyZWRzLCByZXNlcnZlZCkpOwotICBjLT5iYXNlLnR5cGUgPSBjaGFubmVsX2NyZWRzLT50eXBlOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZjb21wb3NpdGVfY2hhbm5lbF9jcmVkZW50aWFsc192dGFibGU7Ci0gIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5yZWZjb3VudCwgMSk7Ci0gIGMtPmlubmVyX2NyZWRzID0gZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlZihjaGFubmVsX2NyZWRzKTsKLSAgYy0+Y2FsbF9jcmVkcyA9IGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWYoY2FsbF9jcmVkcyk7Ci0gIHJldHVybiAmYy0+YmFzZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmggYi9zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmE3Y2M3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU0VDVVJJVFlfQ1JFREVOVElBTFNfSAotI2RlZmluZSBHUlBDX0NPUkVfU0VDVVJJVFlfQ1JFREVOVElBTFNfSAotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0jaW5jbHVkZSA8Z3JwYy9ncnBjX3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIKLQotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvcGFyc2VyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgotCi1zdHJ1Y3QgZ3JwY19odHRwX3Jlc3BvbnNlOwotCi0vKiAtLS0gQ29uc3RhbnRzLiAtLS0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19DUkVERU5USUFMU19PSyA9IDAsCi0gIEdSUENfQ1JFREVOVElBTFNfRVJST1IKLX0gZ3JwY19jcmVkZW50aWFsc19zdGF0dXM7Ci0KLSNkZWZpbmUgR1JQQ19GQUtFX1RSQU5TUE9SVF9TRUNVUklUWV9UWVBFICJmYWtlIgotCi0jZGVmaW5lIEdSUENfQ0hBTk5FTF9DUkVERU5USUFMU19UWVBFX1NTTCAiU3NsIgotI2RlZmluZSBHUlBDX0NIQU5ORUxfQ1JFREVOVElBTFNfVFlQRV9GQUtFX1RSQU5TUE9SVF9TRUNVUklUWSBcCi0gICJGYWtlVHJhbnNwb3J0U2VjdXJpdHkiCi0KLSNkZWZpbmUgR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfT0FVVEgyICJPYXV0aDIiCi0jZGVmaW5lIEdSUENfQ0FMTF9DUkVERU5USUFMU19UWVBFX0pXVCAiSnd0IgotI2RlZmluZSBHUlBDX0NBTExfQ1JFREVOVElBTFNfVFlQRV9JQU0gIklhbSIKLSNkZWZpbmUgR1JQQ19DQUxMX0NSRURFTlRJQUxTX1RZUEVfQ09NUE9TSVRFICJDb21wb3NpdGUiCi0KLSNkZWZpbmUgR1JQQ19BVVRIT1JJWkFUSU9OX01FVEFEQVRBX0tFWSAiYXV0aG9yaXphdGlvbiIKLSNkZWZpbmUgR1JQQ19JQU1fQVVUSE9SSVpBVElPTl9UT0tFTl9NRVRBREFUQV9LRVkgXAotICAieC1nb29nLWlhbS1hdXRob3JpemF0aW9uLXRva2VuIgotI2RlZmluZSBHUlBDX0lBTV9BVVRIT1JJVFlfU0VMRUNUT1JfTUVUQURBVEFfS0VZICJ4LWdvb2ctaWFtLWF1dGhvcml0eS1zZWxlY3RvciIKLQotI2RlZmluZSBHUlBDX0dPT0dMRV9DTE9VRF9TREtfQ09ORklHX0RJUkVDVE9SWSAiZ2Nsb3VkIgotI2RlZmluZSBHUlBDX0dPT0dMRV9XRUxMX0tOT1dOX0NSRURFTlRJQUxTX0ZJTEUgXAotICAiYXBwbGljYXRpb25fZGVmYXVsdF9jcmVkZW50aWFscy5qc29uIgotCi0jZGVmaW5lIEdSUENfU0VDVVJFX1RPS0VOX1JFRlJFU0hfVEhSRVNIT0xEX1NFQ1MgNjAKLQotI2RlZmluZSBHUlBDX0NPTVBVVEVfRU5HSU5FX01FVEFEQVRBX0hPU1QgIm1ldGFkYXRhIgotI2RlZmluZSBHUlBDX0NPTVBVVEVfRU5HSU5FX01FVEFEQVRBX1RPS0VOX1BBVEggXAotICAiL2NvbXB1dGVNZXRhZGF0YS92MS9pbnN0YW5jZS9zZXJ2aWNlLWFjY291bnRzL2RlZmF1bHQvdG9rZW4iCi0KLSNkZWZpbmUgR1JQQ19HT09HTEVfT0FVVEgyX1NFUlZJQ0VfSE9TVCAid3d3Lmdvb2dsZWFwaXMuY29tIgotI2RlZmluZSBHUlBDX0dPT0dMRV9PQVVUSDJfU0VSVklDRV9UT0tFTl9QQVRIICIvb2F1dGgyL3YzL3Rva2VuIgotCi0jZGVmaW5lIEdSUENfU0VSVklDRV9BQ0NPVU5UX1BPU1RfQk9EWV9QUkVGSVggICAgICAgICAgICAgICAgICAgICAgICAgXAotICAiZ3JhbnRfdHlwZT11cm4lM0FpZXRmJTNBcGFyYW1zJTNBb2F1dGglM0FncmFudC10eXBlJTNBand0LWJlYXJlciYiIFwKLSAgImFzc2VydGlvbj0iCi0KLSNkZWZpbmUgR1JQQ19SRUZSRVNIX1RPS0VOX1BPU1RfQk9EWV9GT1JNQVRfU1RSSU5HIFwKLSAgImNsaWVudF9pZD0lcyZjbGllbnRfc2VjcmV0PSVzJnJlZnJlc2hfdG9rZW49JXMmZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIgotCi0vKiAtLS0gR29vZ2xlIHV0aWxzIC0tLSAqLwotCi0vKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZ3ByX2ZyZWUgdGhlIHJlc3VsdCBpZiBub3QgTlVMTC4gKi8KLWNoYXIgKmdycGNfZ2V0X3dlbGxfa25vd25fZ29vZ2xlX2NyZWRlbnRpYWxzX2ZpbGVfcGF0aCh2b2lkKTsKLQotLyogSW1wbGVtZW50YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBkaWZmZXJlbnQgcGxhdGZvcm1zLiAqLwotY2hhciAqZ3JwY19nZXRfd2VsbF9rbm93bl9nb29nbGVfY3JlZGVudGlhbHNfZmlsZV9wYXRoX2ltcGwodm9pZCk7Ci0KLS8qIE92ZXJyaWRlIGZvciB0ZXN0aW5nIG9ubHkuIE5vdCB0aHJlYWQtc2FmZSAqLwotdHlwZWRlZiBjaGFyICooKmdycGNfd2VsbF9rbm93bl9jcmVkZW50aWFsc19wYXRoX2dldHRlcikodm9pZCk7Ci12b2lkIGdycGNfb3ZlcnJpZGVfd2VsbF9rbm93bl9jcmVkZW50aWFsc19wYXRoX2dldHRlcigKLSAgICBncnBjX3dlbGxfa25vd25fY3JlZGVudGlhbHNfcGF0aF9nZXR0ZXIgZ2V0dGVyKTsKLQotLyogLS0tIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscy4gLS0tICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAoKmRlc3RydWN0KShncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMpOwotCi0gIGdycGNfc2VjdXJpdHlfc3RhdHVzICgqY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcikoCi0gICAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmMsIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY2FsbF9jcmVkcywKLSAgICAgIGNvbnN0IGNoYXIgKnRhcmdldCwgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MsCi0gICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MsIGdycGNfY2hhbm5lbF9hcmdzICoqbmV3X2FyZ3MpOwotfSBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdnRhYmxlOwotCi1zdHJ1Y3QgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzIHsKLSAgY29uc3QgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3Z0YWJsZSAqdnRhYmxlOwotICBjb25zdCBjaGFyICp0eXBlOwotICBncHJfcmVmY291bnQgcmVmY291bnQ7Ci19OwotCi1ncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmdycGNfY2hhbm5lbF9jcmVkZW50aWFsc19yZWYoCi0gICAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjcmVkcyk7Ci12b2lkIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc191bnJlZihncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmNyZWRzKTsKLQotLyogQ3JlYXRlcyBhIHNlY3VyaXR5IGNvbm5lY3RvciBmb3IgdGhlIGNoYW5uZWwuIE1heSBhbHNvIGNyZWF0ZSBuZXcgY2hhbm5lbAotICAgYXJncyBmb3IgdGhlIGNoYW5uZWwgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcGFzc2VkIGluIGNvbnN0IGFyZ3MgaWYKLSAgIHJldHVybmVkIG5vbiBOVUxMLiBJbiB0aGF0IGNhc2UgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZwotICAgbmV3X2FyZ3MgYWZ0ZXIgY2hhbm5lbCBjcmVhdGlvbi4gKi8KLWdycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc19jcmVhdGVfc2VjdXJpdHlfY29ubmVjdG9yKAotICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqY3JlZHMsIGNvbnN0IGNoYXIgKnRhcmdldCwKLSAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncywgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjLAotICAgIGdycGNfY2hhbm5lbF9hcmdzICoqbmV3X2FyZ3MpOwotCi0vKiAtLS0gZ3JwY19jcmVkZW50aWFsc19tZC4gLS0tICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3ByX3NsaWNlIGtleTsKLSAgZ3ByX3NsaWNlIHZhbHVlOwotfSBncnBjX2NyZWRlbnRpYWxzX21kOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWQgKmVudHJpZXM7Ci0gIHNpemVfdCBudW1fZW50cmllczsKLSAgc2l6ZV90IGFsbG9jYXRlZDsKLSAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OwotfSBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlOwotCi1ncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2NyZWF0ZSgKLSAgICBzaXplX3QgaW5pdGlhbF9jYXBhY2l0eSk7Ci0KLS8qIFdpbGwgcmVmIGtleSBhbmQgdmFsdWUuICovCi12b2lkIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfYWRkKGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKnN0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Uga2V5LCBncHJfc2xpY2UgdmFsdWUpOwotdm9pZCBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZF9jc3RyaW5ncyhncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci1ncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX3JlZigKLSAgICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSk7Ci12b2lkIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfdW5yZWYoZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqc3RvcmUpOwotCi0vKiAtLS0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzLiAtLS0gKi8KLQotdHlwZWRlZiB2b2lkICgqZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NyZWRlbnRpYWxzX21kICptZF9lbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NyZWRlbnRpYWxzX3N0YXR1cyBzdGF0dXMpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKCpkZXN0cnVjdCkoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjKTsKLSAgdm9pZCAoKmdldF9yZXF1ZXN0X21ldGFkYXRhKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmMsIGdycGNfcG9sbHNldCAqcG9sbHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfbWV0YWRhdGFfY29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKLX0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3Z0YWJsZTsKLQotc3RydWN0IGdycGNfY2FsbF9jcmVkZW50aWFscyB7Ci0gIGNvbnN0IGdycGNfY2FsbF9jcmVkZW50aWFsc192dGFibGUgKnZ0YWJsZTsKLSAgY29uc3QgY2hhciAqdHlwZTsKLSAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OwotfTsKLQotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpOwotdm9pZCBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcyk7Ci12b2lkIGdycGNfY2FsbF9jcmVkZW50aWFsc19nZXRfcmVxdWVzdF9tZXRhZGF0YSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywKLSAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsIGdycGNfYXV0aF9tZXRhZGF0YV9jb250ZXh0IGNvbnRleHQsCi0gICAgZ3JwY19jcmVkZW50aWFsc19tZXRhZGF0YV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKipjcmVkc19hcnJheTsKLSAgc2l6ZV90IG51bV9jcmVkczsKLX0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX2FycmF5OwotCi1jb25zdCBncnBjX2NhbGxfY3JlZGVudGlhbHNfYXJyYXkgKgotZ3JwY19jb21wb3NpdGVfY2FsbF9jcmVkZW50aWFsc19nZXRfY3JlZGVudGlhbHMoCi0gICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjb21wb3NpdGVfY3JlZHMpOwotCi0vKiBSZXR1cm5zIGNyZWRzIGlmIGNyZWRzIGlzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBvciB0aGUgaW5uZXIgY3JlZHMgb2YgdGhlCi0gICBzcGVjaWZpZWQgdHlwZSAoaWYgZm91bmQpLCBpZiB0aGUgY3JlZHMgaXMgb2YgdHlwZSBDT01QT1NJVEUuCi0gICBJZiBjb21wb3NpdGVfY3JlZHMgaXMgbm90IE5VTEwsICpjb21wb3NpdGVfY3JlZHMgd2lsbCBwb2ludCB0byBjcmVkcyBpZiBvZgotICAgdHlwZSBDT01QT1NJVEUgaW4gY2FzZSBvZiBzdWNjZXNzLiAqLwotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpncnBjX2NyZWRlbnRpYWxzX2NvbnRhaW5zX3R5cGUoCi0gICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkcywgY29uc3QgY2hhciAqdHlwZSwKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKipjb21wb3NpdGVfY3JlZHMpOwotCi0vKiBFeHBvc2VkIGZvciB0ZXN0aW5nIG9ubHkuICovCi1ncnBjX2NyZWRlbnRpYWxzX3N0YXR1cwotZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFsc19wYXJzZV9zZXJ2ZXJfcmVzcG9uc2UoCi0gICAgY29uc3Qgc3RydWN0IGdycGNfaHR0cF9yZXNwb25zZSAqcmVzcG9uc2UsCi0gICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqKnRva2VuX21kLCBncHJfdGltZXNwZWMgKnRva2VuX2xpZmV0aW1lKTsKLQotdm9pZCBncnBjX2ZsdXNoX2NhY2hlZF9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscyh2b2lkKTsKLQotLyogTWV0YWRhdGEtb25seSBjcmVkZW50aWFscyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCB2YWx1ZSB3aGVyZQotICAgYXN5bmNocm9uaWNpdHkgY2FuIGJlIHNpbXVsYXRlZCBmb3IgdGVzdGluZy4gKi8KLWdycGNfY2FsbF9jcmVkZW50aWFscyAqZ3JwY19tZF9vbmx5X3Rlc3RfY3JlZGVudGlhbHNfY3JlYXRlKAotICAgIGNvbnN0IGNoYXIgKm1kX2tleSwgY29uc3QgY2hhciAqbWRfdmFsdWUsIGludCBpc19hc3luYyk7Ci0KLS8qIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIGp3dCBjcmVkZW50aWFscyBmcm9tIGFuIGFscmVhZHkgcGFyc2VkIGpzb24ga2V5LgotICAgVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBrZXkuICovCi1ncnBjX2NhbGxfY3JlZGVudGlhbHMgKgotZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX2pzb25fa2V5KAotICAgIGdycGNfYXV0aF9qc29uX2tleSBrZXksIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSk7Ci0KLS8qIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIHJlZnJlc2ggdG9rZW4gY3JlZGVudGlhbHMgZnJvbSBhbiBhbHJlYWR5IHBhcnNlZAotICAgcmVmcmVzaCB0b2tlbi4gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZWZyZXNoIHRva2VuLiAqLwotZ3JwY19jYWxsX2NyZWRlbnRpYWxzICoKLWdycGNfcmVmcmVzaF90b2tlbl9jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX3JlZnJlc2hfdG9rZW4oCi0gICAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gdG9rZW4pOwotCi0vKiAtLS0gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMuIC0tLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKCpkZXN0cnVjdCkoZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmMpOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyAoKmNyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IpKAotICAgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmMsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjKTsKLX0gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfdnRhYmxlOwotCi1zdHJ1Y3QgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgewotICBjb25zdCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc192dGFibGUgKnZ0YWJsZTsKLSAgY29uc3QgY2hhciAqdHlwZTsKLSAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OwotICBncnBjX2F1dGhfbWV0YWRhdGFfcHJvY2Vzc29yIHByb2Nlc3NvcjsKLX07Ci0KLWdycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IoCi0gICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzLCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKipzYyk7Ci0KLWdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpncnBjX3NlcnZlcl9jcmVkZW50aWFsc19yZWYoCi0gICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzKTsKLQotdm9pZCBncnBjX3NlcnZlcl9jcmVkZW50aWFsc191bnJlZihncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqY3JlZHMpOwotCi0jZGVmaW5lIEdSUENfU0VSVkVSX0NSRURFTlRJQUxTX0FSRyAiZ3JwYy5zZXJ2ZXJfY3JlZGVudGlhbHMiCi0KLWdycGNfYXJnIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3RvX2FyZyhncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqYyk7Ci1ncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZyk7Ci1ncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19maW5kX3NlcnZlcl9jcmVkZW50aWFsc19pbl9hcmdzKAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKTsKLQotLyogLS0gRmFrZSB0cmFuc3BvcnQgc2VjdXJpdHkgY3JlZGVudGlhbHMuIC0tICovCi0KLS8qIENyZWF0ZXMgYSBmYWtlIHRyYW5zcG9ydCBzZWN1cml0eSBjcmVkZW50aWFscyBvYmplY3QgZm9yIHRlc3RpbmcuICovCi1ncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmdycGNfZmFrZV90cmFuc3BvcnRfc2VjdXJpdHlfY3JlZGVudGlhbHNfY3JlYXRlKHZvaWQpOwotLyogQ3JlYXRlcyBhIGZha2Ugc2VydmVyIHRyYW5zcG9ydCBzZWN1cml0eSBjcmVkZW50aWFscyBvYmplY3QgZm9yIHRlc3RpbmcuICovCi1ncnBjX3NlcnZlcl9jcmVkZW50aWFscyAqZ3JwY19mYWtlX3RyYW5zcG9ydF9zZWN1cml0eV9zZXJ2ZXJfY3JlZGVudGlhbHNfY3JlYXRlKAotICAgIHZvaWQpOwotCi0vKiAtLSBTc2wgY3JlZGVudGlhbHMuIC0tICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzIGJhc2U7Ci0gIGdycGNfc3NsX2NvbmZpZyBjb25maWc7Ci19IGdycGNfc3NsX2NyZWRlbnRpYWxzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzIGJhc2U7Ci0gIGdycGNfc3NsX3NlcnZlcl9jb25maWcgY29uZmlnOwotfSBncnBjX3NzbF9zZXJ2ZXJfY3JlZGVudGlhbHM7Ci0KLS8qIC0tIENoYW5uZWwgY29tcG9zaXRlIGNyZWRlbnRpYWxzLiAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyBiYXNlOwotICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHMgKmlubmVyX2NyZWRzOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNhbGxfY3JlZHM7Ci19IGdycGNfY29tcG9zaXRlX2NoYW5uZWxfY3JlZGVudGlhbHM7Ci0KLS8qIC0tIEp3dCBjcmVkZW50aWFscyAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOwotCi0gIC8qIEhhdmUgYSBzaW1wbGUgY2FjaGUgZm9yIG5vdyB3aXRoIGp1c3QgMSBlbnRyeS4gV2UgY291bGQgaGF2ZSBhIG1hcCBiYXNlZCBvbgotICAgICB0aGUgc2VydmljZV91cmwgZm9yIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG9uZS4gKi8KLSAgZ3ByX211IGNhY2hlX211OwotICBzdHJ1Y3QgewotICAgIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKmp3dF9tZDsKLSAgICBjaGFyICpzZXJ2aWNlX3VybDsKLSAgICBncHJfdGltZXNwZWMgand0X2V4cGlyYXRpb247Ci0gIH0gY2FjaGVkOwotCi0gIGdycGNfYXV0aF9qc29uX2tleSBrZXk7Ci0gIGdwcl90aW1lc3BlYyBqd3RfbGlmZXRpbWU7Ci19IGdycGNfc2VydmljZV9hY2NvdW50X2p3dF9hY2Nlc3NfY3JlZGVudGlhbHM7Ci0KLS8qIC0tIE9hdXRoMlRva2VuRmV0Y2hlciBjcmVkZW50aWFscyAtLQotCi0gICBUaGlzIG9iamVjdCBpcyBhIGJhc2UgZm9yIGNyZWRlbnRpYWxzIHRoYXQgbmVlZCB0byBhY3F1aXJlIGFuIG9hdXRoMiB0b2tlbgotICAgZnJvbSBhbiBodHRwIHNlcnZpY2UuICovCi0KLXR5cGVkZWYgc3RydWN0IGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdAotICAgIGdycGNfY3JlZGVudGlhbHNfbWV0YWRhdGFfcmVxdWVzdDsKLQotdHlwZWRlZiB2b2lkICgqZ3JwY19mZXRjaF9vYXV0aDJfZnVuYykoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NyZWRlbnRpYWxzX21ldGFkYXRhX3JlcXVlc3QgKnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfaHR0cGNsaV9jb250ZXh0ICpodHRwX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKnBvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2h0dHBjbGlfcmVzcG9uc2VfY2IgcmVzcG9uc2VfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOwotICBncHJfbXUgbXU7Ci0gIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKmFjY2Vzc190b2tlbl9tZDsKLSAgZ3ByX3RpbWVzcGVjIHRva2VuX2V4cGlyYXRpb247Ci0gIGdycGNfaHR0cGNsaV9jb250ZXh0IGh0dHBjbGlfY29udGV4dDsKLSAgZ3JwY19mZXRjaF9vYXV0aDJfZnVuYyBmZXRjaF9mdW5jOwotfSBncnBjX29hdXRoMl90b2tlbl9mZXRjaGVyX2NyZWRlbnRpYWxzOwotCi0vKiAtLSBHb29nbGVSZWZyZXNoVG9rZW4gY3JlZGVudGlhbHMuIC0tICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19vYXV0aDJfdG9rZW5fZmV0Y2hlcl9jcmVkZW50aWFscyBiYXNlOwotICBncnBjX2F1dGhfcmVmcmVzaF90b2tlbiByZWZyZXNoX3Rva2VuOwotfSBncnBjX2dvb2dsZV9yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzOwotCi0vKiAtLSBPYXV0aDIgQWNjZXNzIFRva2VuIGNyZWRlbnRpYWxzLiAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICphY2Nlc3NfdG9rZW5fbWQ7Ci19IGdycGNfYWNjZXNzX3Rva2VuX2NyZWRlbnRpYWxzOwotCi0vKiAtLSAgTWV0YWRhdGEtb25seSBUZXN0IGNyZWRlbnRpYWxzLiAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICptZF9zdG9yZTsKLSAgaW50IGlzX2FzeW5jOwotfSBncnBjX21kX29ubHlfdGVzdF9jcmVkZW50aWFsczsKLQotLyogLS0gR29vZ2xlSUFNIGNyZWRlbnRpYWxzLiAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICppYW1fbWQ7Ci19IGdycGNfZ29vZ2xlX2lhbV9jcmVkZW50aWFsczsKLQotLyogLS0gQ29tcG9zaXRlIGNyZWRlbnRpYWxzLiAtLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFscyBiYXNlOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfYXJyYXkgaW5uZXI7Ci19IGdycGNfY29tcG9zaXRlX2NhbGxfY3JlZGVudGlhbHM7Ci0KLS8qIC0tIFBsdWdpbiBjcmVkZW50aWFscy4gLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NhbGxfY3JlZGVudGlhbHMgYmFzZTsKLSAgZ3JwY19tZXRhZGF0YV9jcmVkZW50aWFsc19wbHVnaW4gcGx1Z2luOwotICBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpwbHVnaW5fbWQ7Ci19IGdycGNfcGx1Z2luX2NyZWRlbnRpYWxzOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NFQ1VSSVRZX0NSRURFTlRJQUxTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMgYi9zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGExMzJmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX21ldGFkYXRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIHZvaWQgc3RvcmVfZW5zdXJlX2NhcGFjaXR5KGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKnN0b3JlKSB7Ci0gIGlmIChzdG9yZS0+bnVtX2VudHJpZXMgPT0gc3RvcmUtPmFsbG9jYXRlZCkgewotICAgIHN0b3JlLT5hbGxvY2F0ZWQgPSAoc3RvcmUtPmFsbG9jYXRlZCA9PSAwKSA/IDEgOiBzdG9yZS0+YWxsb2NhdGVkICogMjsKLSAgICBzdG9yZS0+ZW50cmllcyA9IGdwcl9yZWFsbG9jKAotICAgICAgICBzdG9yZS0+ZW50cmllcywgc3RvcmUtPmFsbG9jYXRlZCAqIHNpemVvZihncnBjX2NyZWRlbnRpYWxzX21kKSk7Ci0gIH0KLX0KLQotZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9jcmVhdGUoCi0gICAgc2l6ZV90IGluaXRpYWxfY2FwYWNpdHkpIHsKLSAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqc3RvcmUgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSkpOwotICBtZW1zZXQoc3RvcmUsIDAsIHNpemVvZihncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlKSk7Ci0gIGlmIChpbml0aWFsX2NhcGFjaXR5ID4gMCkgewotICAgIHN0b3JlLT5lbnRyaWVzID0gZ3ByX21hbGxvYyhpbml0aWFsX2NhcGFjaXR5ICogc2l6ZW9mKGdycGNfY3JlZGVudGlhbHNfbWQpKTsKLSAgICBzdG9yZS0+YWxsb2NhdGVkID0gaW5pdGlhbF9jYXBhY2l0eTsKLSAgfQotICBncHJfcmVmX2luaXQoJnN0b3JlLT5yZWZjb3VudCwgMSk7Ci0gIHJldHVybiBzdG9yZTsKLX0KLQotdm9pZCBncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlX2FkZChncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIGtleSwgZ3ByX3NsaWNlIHZhbHVlKSB7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKSByZXR1cm47Ci0gIHN0b3JlX2Vuc3VyZV9jYXBhY2l0eShzdG9yZSk7Ci0gIHN0b3JlLT5lbnRyaWVzW3N0b3JlLT5udW1fZW50cmllc10ua2V5ID0gZ3ByX3NsaWNlX3JlZihrZXkpOwotICBzdG9yZS0+ZW50cmllc1tzdG9yZS0+bnVtX2VudHJpZXNdLnZhbHVlID0gZ3ByX3NsaWNlX3JlZih2YWx1ZSk7Ci0gIHN0b3JlLT5udW1fZW50cmllcysrOwotfQotCi12b2lkIGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmVfYWRkX2NzdHJpbmdzKGdycGNfY3JlZGVudGlhbHNfbWRfc3RvcmUgKnN0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKSByZXR1cm47Ci0gIHN0b3JlX2Vuc3VyZV9jYXBhY2l0eShzdG9yZSk7Ci0gIHN0b3JlLT5lbnRyaWVzW3N0b3JlLT5udW1fZW50cmllc10ua2V5ID0gZ3ByX3NsaWNlX2Zyb21fY29waWVkX3N0cmluZyhrZXkpOwotICBzdG9yZS0+ZW50cmllc1tzdG9yZS0+bnVtX2VudHJpZXNdLnZhbHVlID0KLSAgICAgIGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcodmFsdWUpOwotICBzdG9yZS0+bnVtX2VudHJpZXMrKzsKLX0KLQotZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV9yZWYoCi0gICAgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZSAqc3RvcmUpIHsKLSAgaWYgKHN0b3JlID09IE5VTEwpIHJldHVybiBOVUxMOwotICBncHJfcmVmKCZzdG9yZS0+cmVmY291bnQpOwotICByZXR1cm4gc3RvcmU7Ci19Ci0KLXZvaWQgZ3JwY19jcmVkZW50aWFsc19tZF9zdG9yZV91bnJlZihncnBjX2NyZWRlbnRpYWxzX21kX3N0b3JlICpzdG9yZSkgewotICBpZiAoc3RvcmUgPT0gTlVMTCkgcmV0dXJuOwotICBpZiAoZ3ByX3VucmVmKCZzdG9yZS0+cmVmY291bnQpKSB7Ci0gICAgaWYgKHN0b3JlLT5lbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgIHNpemVfdCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHN0b3JlLT5udW1fZW50cmllczsgaSsrKSB7Ci0gICAgICAgIGdwcl9zbGljZV91bnJlZihzdG9yZS0+ZW50cmllc1tpXS5rZXkpOwotICAgICAgICBncHJfc2xpY2VfdW5yZWYoc3RvcmUtPmVudHJpZXNbaV0udmFsdWUpOwotICAgICAgfQotICAgICAgZ3ByX2ZyZWUoc3RvcmUtPmVudHJpZXMpOwotICAgIH0KLSAgICBncHJfZnJlZShzdG9yZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMgYi9zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzkyYmQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfRklMRQotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotY2hhciAqZ3JwY19nZXRfd2VsbF9rbm93bl9nb29nbGVfY3JlZGVudGlhbHNfZmlsZV9wYXRoX2ltcGwodm9pZCkgewotICBjaGFyICpyZXN1bHQgPSBOVUxMOwotICBjaGFyICpob21lID0gZ3ByX2dldGVudigiSE9NRSIpOwotICBpZiAoaG9tZSA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgZ2V0IEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZ3ByX2FzcHJpbnRmKCZyZXN1bHQsICIlcy8uY29uZmlnLyVzLyVzIiwgaG9tZSwKLSAgICAgICAgICAgICAgIEdSUENfR09PR0xFX0NMT1VEX1NES19DT05GSUdfRElSRUNUT1JZLAotICAgICAgICAgICAgICAgR1JQQ19HT09HTEVfV0VMTF9LTk9XTl9DUkVERU5USUFMU19GSUxFKTsKLSAgZ3ByX2ZyZWUoaG9tZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfUE9TSVhfRklMRSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyBiL3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTlmNzAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9XSU4zMgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotY2hhciAqZ3JwY19nZXRfd2VsbF9rbm93bl9nb29nbGVfY3JlZGVudGlhbHNfZmlsZV9wYXRoX2ltcGwodm9pZCkgewotICBjaGFyICpyZXN1bHQgPSBOVUxMOwotICBjaGFyICphcHBkYXRhX3BhdGggPSBncHJfZ2V0ZW52KCJBUFBEQVRBIik7Ci0gIGlmIChhcHBkYXRhX3BhdGggPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBBUFBEQVRBIGVudmlyb25tZW50IHZhcmlhYmxlLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAiJXMvJXMvJXMiLCBhcHBkYXRhX3BhdGgsCi0gICAgICAgICAgICAgICBHUlBDX0dPT0dMRV9DTE9VRF9TREtfQ09ORklHX0RJUkVDVE9SWSwKLSAgICAgICAgICAgICAgIEdSUENfR09PR0xFX1dFTExfS05PV05fQ1JFREVOVElBTFNfRklMRSk7Ci0gIGdwcl9mcmVlKGFwcGRhdGFfcGF0aCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMgYi9zcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcyZTg2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9wYXJzZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIKLQotLyogLS0gQ29uc3RhbnRzLiAtLSAqLwotCi0jZGVmaW5lIEdSUENfQ09NUFVURV9FTkdJTkVfREVURUNUSU9OX0hPU1QgIm1ldGFkYXRhLmdvb2dsZS5pbnRlcm5hbCIKLQotLyogLS0gRGVmYXVsdCBjcmVkZW50aWFscy4gLS0gKi8KLQotc3RhdGljIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqZGVmYXVsdF9jcmVkZW50aWFscyA9IE5VTEw7Ci1zdGF0aWMgaW50IGNvbXB1dGVfZW5naW5lX2RldGVjdGlvbl9kb25lID0gMDsKLXN0YXRpYyBncHJfbXUgZ19zdGF0ZV9tdTsKLXN0YXRpYyBncHJfbXUgKmdfcG9sbGluZ19tdTsKLXN0YXRpYyBncHJfb25jZSBnX29uY2UgPSBHUFJfT05DRV9JTklUOwotCi1zdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfY3JlZGVudGlhbHModm9pZCkgeyBncHJfbXVfaW5pdCgmZ19zdGF0ZV9tdSk7IH0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX3BvbGxzZXQgKnBvbGxzZXQ7Ci0gIGludCBpc19kb25lOwotICBpbnQgc3VjY2VzczsKLX0gY29tcHV0ZV9lbmdpbmVfZGV0ZWN0b3I7Ci0KLXN0YXRpYyB2b2lkIG9uX2NvbXB1dGVfZW5naW5lX2RldGVjdGlvbl9odHRwX3Jlc3BvbnNlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCi0gICAgY29uc3QgZ3JwY19odHRwX3Jlc3BvbnNlICpyZXNwb25zZSkgewotICBjb21wdXRlX2VuZ2luZV9kZXRlY3RvciAqZGV0ZWN0b3IgPSAoY29tcHV0ZV9lbmdpbmVfZGV0ZWN0b3IgKil1c2VyX2RhdGE7Ci0gIGlmIChyZXNwb25zZSAhPSBOVUxMICYmIHJlc3BvbnNlLT5zdGF0dXMgPT0gMjAwICYmIHJlc3BvbnNlLT5oZHJfY291bnQgPiAwKSB7Ci0gICAgLyogSW50ZXJuZXQgcHJvdmlkZXJzIGNhbiByZXR1cm4gYSBnZW5lcmljIHJlc3BvbnNlIHRvIGFsbCByZXF1ZXN0cywgc28KLSAgICAgICBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgdGhhdCBtZXRhZGF0YSBoZWFkZXIgaXMgcHJlc2VudCBhbHNvLiAqLwotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCByZXNwb25zZS0+aGRyX2NvdW50OyBpKyspIHsKLSAgICAgIGdycGNfaHR0cF9oZWFkZXIgKmhlYWRlciA9ICZyZXNwb25zZS0+aGRyc1tpXTsKLSAgICAgIGlmIChzdHJjbXAoaGVhZGVyLT5rZXksICJNZXRhZGF0YS1GbGF2b3IiKSA9PSAwICYmCi0gICAgICAgICAgc3RyY21wKGhlYWRlci0+dmFsdWUsICJHb29nbGUiKSA9PSAwKSB7Ci0gICAgICAgIGRldGVjdG9yLT5zdWNjZXNzID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGdwcl9tdV9sb2NrKGdfcG9sbGluZ19tdSk7Ci0gIGRldGVjdG9yLT5pc19kb25lID0gMTsKLSAgZ3JwY19wb2xsc2V0X2tpY2soZGV0ZWN0b3ItPnBvbGxzZXQsIE5VTEwpOwotICBncHJfbXVfdW5sb2NrKGdfcG9sbGluZ19tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcCwgYm9vbCBzKSB7Ci0gIGdycGNfcG9sbHNldF9kZXN0cm95KHApOwotfQotCi1zdGF0aWMgaW50IGlzX3N0YWNrX3J1bm5pbmdfb25fY29tcHV0ZV9lbmdpbmUodm9pZCkgewotICBjb21wdXRlX2VuZ2luZV9kZXRlY3RvciBkZXRlY3RvcjsKLSAgZ3JwY19odHRwY2xpX3JlcXVlc3QgcmVxdWVzdDsKLSAgZ3JwY19odHRwY2xpX2NvbnRleHQgY29udGV4dDsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLSAgZ3JwY19jbG9zdXJlIGRlc3Ryb3lfY2xvc3VyZTsKLQotICAvKiBUaGUgaHR0cCBjYWxsIGlzIGxvY2FsLiBJZiBpdCB0YWtlcyBtb3JlIHRoYW4gb25lIHNlYywgaXQgaXMgZm9yIHN1cmUgbm90Ci0gICAgIG9uIGNvbXB1dGUgZW5naW5lLiAqLwotICBncHJfdGltZXNwZWMgbWF4X2RldGVjdGlvbl9kZWxheSA9IGdwcl90aW1lX2Zyb21fc2Vjb25kcygxLCBHUFJfVElNRVNQQU4pOwotCi0gIGRldGVjdG9yLnBvbGxzZXQgPSBncHJfbWFsbG9jKGdycGNfcG9sbHNldF9zaXplKCkpOwotICBncnBjX3BvbGxzZXRfaW5pdChkZXRlY3Rvci5wb2xsc2V0LCAmZ19wb2xsaW5nX211KTsKLSAgZGV0ZWN0b3IuaXNfZG9uZSA9IDA7Ci0gIGRldGVjdG9yLnN1Y2Nlc3MgPSAwOwotCi0gIG1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKGdycGNfaHR0cGNsaV9yZXF1ZXN0KSk7Ci0gIHJlcXVlc3QuaG9zdCA9IEdSUENfQ09NUFVURV9FTkdJTkVfREVURUNUSU9OX0hPU1Q7Ci0gIHJlcXVlc3QuaHR0cC5wYXRoID0gIi8iOwotCi0gIGdycGNfaHR0cGNsaV9jb250ZXh0X2luaXQoJmNvbnRleHQpOwotCi0gIGdycGNfaHR0cGNsaV9nZXQoCi0gICAgICAmZXhlY19jdHgsICZjb250ZXh0LCBkZXRlY3Rvci5wb2xsc2V0LCAmcmVxdWVzdCwKLSAgICAgIGdwcl90aW1lX2FkZChncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIG1heF9kZXRlY3Rpb25fZGVsYXkpLAotICAgICAgb25fY29tcHV0ZV9lbmdpbmVfZGV0ZWN0aW9uX2h0dHBfcmVzcG9uc2UsICZkZXRlY3Rvcik7Ci0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLQotICAvKiBCbG9jayB1bnRpbCB3ZSBnZXQgdGhlIHJlc3BvbnNlLiBUaGlzIGlzIG5vdCBpZGVhbCBidXQgdGhpcyBzaG91bGQgb25seSBiZQotICAgICBjYWxsZWQgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9jZXNzIGJ5IHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzLiAqLwotICBncHJfbXVfbG9jayhnX3BvbGxpbmdfbXUpOwotICB3aGlsZSAoIWRldGVjdG9yLmlzX2RvbmUpIHsKLSAgICBncnBjX3BvbGxzZXRfd29ya2VyICp3b3JrZXIgPSBOVUxMOwotICAgIGdycGNfcG9sbHNldF93b3JrKCZleGVjX2N0eCwgZGV0ZWN0b3IucG9sbHNldCwgJndvcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpLAotICAgICAgICAgICAgICAgICAgICAgIGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKGdfcG9sbGluZ19tdSk7Ci0KLSAgZ3JwY19odHRwY2xpX2NvbnRleHRfZGVzdHJveSgmY29udGV4dCk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZkZXN0cm95X2Nsb3N1cmUsIGRlc3Ryb3lfcG9sbHNldCwgZGV0ZWN0b3IucG9sbHNldCk7Ci0gIGdycGNfcG9sbHNldF9zaHV0ZG93bigmZXhlY19jdHgsIGRldGVjdG9yLnBvbGxzZXQsICZkZXN0cm95X2Nsb3N1cmUpOwotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotICBnX3BvbGxpbmdfbXUgPSBOVUxMOwotCi0gIGdwcl9mcmVlKGRldGVjdG9yLnBvbGxzZXQpOwotCi0gIHJldHVybiBkZXRlY3Rvci5zdWNjZXNzOwotfQotCi0vKiBUYWtlcyBvd25lcnNoaXAgb2YgY3JlZHNfcGF0aCBpZiBub3QgTlVMTC4gKi8KLXN0YXRpYyBncnBjX2NhbGxfY3JlZGVudGlhbHMgKmNyZWF0ZV9kZWZhdWx0X2NyZWRzX2Zyb21fcGF0aChjaGFyICpjcmVkc19wYXRoKSB7Ci0gIGdycGNfanNvbiAqanNvbiA9IE5VTEw7Ci0gIGdycGNfYXV0aF9qc29uX2tleSBrZXk7Ci0gIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIHRva2VuOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKnJlc3VsdCA9IE5VTEw7Ci0gIGdwcl9zbGljZSBjcmVkc19kYXRhID0gZ3ByX2VtcHR5X3NsaWNlKCk7Ci0gIGludCBmaWxlX29rID0gMDsKLSAgaWYgKGNyZWRzX3BhdGggPT0gTlVMTCkgZ290byBlbmQ7Ci0gIGNyZWRzX2RhdGEgPSBncHJfbG9hZF9maWxlKGNyZWRzX3BhdGgsIDAsICZmaWxlX29rKTsKLSAgaWYgKCFmaWxlX29rKSBnb3RvIGVuZDsKLSAganNvbiA9IGdycGNfanNvbl9wYXJzZV9zdHJpbmdfd2l0aF9sZW4oCi0gICAgICAoY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoY3JlZHNfZGF0YSksIEdQUl9TTElDRV9MRU5HVEgoY3JlZHNfZGF0YSkpOwotICBpZiAoanNvbiA9PSBOVUxMKSBnb3RvIGVuZDsKLQotICAvKiBGaXJzdCwgdHJ5IGFuIGF1dGgganNvbiBrZXkuICovCi0gIGtleSA9IGdycGNfYXV0aF9qc29uX2tleV9jcmVhdGVfZnJvbV9qc29uKGpzb24pOwotICBpZiAoZ3JwY19hdXRoX2pzb25fa2V5X2lzX3ZhbGlkKCZrZXkpKSB7Ci0gICAgcmVzdWx0ID0KLSAgICAgICAgZ3JwY19zZXJ2aWNlX2FjY291bnRfand0X2FjY2Vzc19jcmVkZW50aWFsc19jcmVhdGVfZnJvbV9hdXRoX2pzb25fa2V5KAotICAgICAgICAgICAga2V5LCBncnBjX21heF9hdXRoX3Rva2VuX2xpZmV0aW1lKCkpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgLyogVGhlbiB0cnkgYSByZWZyZXNoIHRva2VuIGlmIHRoZSBhdXRoIGpzb24ga2V5IHdhcyBpbnZhbGlkLiAqLwotICB0b2tlbiA9IGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2NyZWF0ZV9mcm9tX2pzb24oanNvbik7Ci0gIGlmIChncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9pc192YWxpZCgmdG9rZW4pKSB7Ci0gICAgcmVzdWx0ID0KLSAgICAgICAgZ3JwY19yZWZyZXNoX3Rva2VuX2NyZWRlbnRpYWxzX2NyZWF0ZV9mcm9tX2F1dGhfcmVmcmVzaF90b2tlbih0b2tlbik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLQotZW5kOgotICBpZiAoY3JlZHNfcGF0aCAhPSBOVUxMKSBncHJfZnJlZShjcmVkc19wYXRoKTsKLSAgZ3ByX3NsaWNlX3VucmVmKGNyZWRzX2RhdGEpOwotICBpZiAoanNvbiAhPSBOVUxMKSBncnBjX2pzb25fZGVzdHJveShqc29uKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpncnBjX2dvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzX2NyZWF0ZSh2b2lkKSB7Ci0gIGdycGNfY2hhbm5lbF9jcmVkZW50aWFscyAqcmVzdWx0ID0gTlVMTDsKLSAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjYWxsX2NyZWRzID0gTlVMTDsKLQotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFsc19jcmVhdGUodm9pZCkiLCAwLCAoKSk7Ci0KLSAgZ3ByX29uY2VfaW5pdCgmZ19vbmNlLCBpbml0X2RlZmF1bHRfY3JlZGVudGlhbHMpOwotCi0gIGdwcl9tdV9sb2NrKCZnX3N0YXRlX211KTsKLQotICBpZiAoZGVmYXVsdF9jcmVkZW50aWFscyAhPSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzX3JlZihkZWZhdWx0X2NyZWRlbnRpYWxzKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIC8qIEZpcnN0LCB0cnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiAqLwotICBjYWxsX2NyZWRzID0gY3JlYXRlX2RlZmF1bHRfY3JlZHNfZnJvbV9wYXRoKAotICAgICAgZ3ByX2dldGVudihHUlBDX0dPT0dMRV9DUkVERU5USUFMU19FTlZfVkFSKSk7Ci0gIGlmIChjYWxsX2NyZWRzICE9IE5VTEwpIGdvdG8gZW5kOwotCi0gIC8qIFRoZW4gdGhlIHdlbGwta25vd24gZmlsZS4gKi8KLSAgY2FsbF9jcmVkcyA9IGNyZWF0ZV9kZWZhdWx0X2NyZWRzX2Zyb21fcGF0aCgKLSAgICAgIGdycGNfZ2V0X3dlbGxfa25vd25fZ29vZ2xlX2NyZWRlbnRpYWxzX2ZpbGVfcGF0aCgpKTsKLSAgaWYgKGNhbGxfY3JlZHMgIT0gTlVMTCkgZ290byBlbmQ7Ci0KLSAgLyogQXQgbGFzdCB0cnkgdG8gc2VlIGlmIHdlJ3JlIG9uIGNvbXB1dGUgZW5naW5lIChkbyB0aGUgZGV0ZWN0aW9uIG9ubHkgb25jZQotICAgICBzaW5jZSBpdCByZXF1aXJlcyBhIG5ldHdvcmsgdGVzdCkuICovCi0gIGlmICghY29tcHV0ZV9lbmdpbmVfZGV0ZWN0aW9uX2RvbmUpIHsKLSAgICBpbnQgbmVlZF9jb21wdXRlX2VuZ2luZV9jcmVkcyA9IGlzX3N0YWNrX3J1bm5pbmdfb25fY29tcHV0ZV9lbmdpbmUoKTsKLSAgICBjb21wdXRlX2VuZ2luZV9kZXRlY3Rpb25fZG9uZSA9IDE7Ci0gICAgaWYgKG5lZWRfY29tcHV0ZV9lbmdpbmVfY3JlZHMpIHsKLSAgICAgIGNhbGxfY3JlZHMgPSBncnBjX2dvb2dsZV9jb21wdXRlX2VuZ2luZV9jcmVkZW50aWFsc19jcmVhdGUoTlVMTCk7Ci0gICAgfQotICB9Ci0KLWVuZDoKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgaWYgKGNhbGxfY3JlZHMgIT0gTlVMTCkgewotICAgICAgLyogQmxlbmQgd2l0aCBkZWZhdWx0IHNzbCBjcmVkZW50aWFscyBhbmQgYWRkIGEgZ2xvYmFsIHJlZmVyZW5jZSBzbyB0aGF0Ci0gICAgICAgICBpdAotICAgICAgICAgY2FuIGJlIGNhY2hlZCBhbmQgcmUtc2VydmVkLiAqLwotICAgICAgZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpzc2xfY3JlZHMgPQotICAgICAgICAgIGdycGNfc3NsX2NyZWRlbnRpYWxzX2NyZWF0ZShOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgIGRlZmF1bHRfY3JlZGVudGlhbHMgPSBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfcmVmKAotICAgICAgICAgIGdycGNfY29tcG9zaXRlX2NoYW5uZWxfY3JlZGVudGlhbHNfY3JlYXRlKHNzbF9jcmVkcywgY2FsbF9jcmVkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Ci0gICAgICBHUFJfQVNTRVJUKGRlZmF1bHRfY3JlZGVudGlhbHMgIT0gTlVMTCk7Ci0gICAgICBncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfdW5yZWYoc3NsX2NyZWRzKTsKLSAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihjYWxsX2NyZWRzKTsKLSAgICAgIHJlc3VsdCA9IGRlZmF1bHRfY3JlZGVudGlhbHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBnb29nbGUgZGVmYXVsdCBjcmVkZW50aWFscy4iKTsKLSAgICB9Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19zdGF0ZV9tdSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgZ3JwY19mbHVzaF9jYWNoZWRfZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHModm9pZCkgewotICBncHJfb25jZV9pbml0KCZnX29uY2UsIGluaXRfZGVmYXVsdF9jcmVkZW50aWFscyk7Ci0gIGdwcl9tdV9sb2NrKCZnX3N0YXRlX211KTsKLSAgaWYgKGRlZmF1bHRfY3JlZGVudGlhbHMgIT0gTlVMTCkgewotICAgIGdycGNfY2hhbm5lbF9jcmVkZW50aWFsc191bnJlZihkZWZhdWx0X2NyZWRlbnRpYWxzKTsKLSAgICBkZWZhdWx0X2NyZWRlbnRpYWxzID0gTlVMTDsKLSAgfQotICBjb21wdXRlX2VuZ2luZV9kZXRlY3Rpb25fZG9uZSA9IDA7Ci0gIGdwcl9tdV91bmxvY2soJmdfc3RhdGVfbXUpOwotfQotCi0vKiAtLSBXZWxsIGtub3duIGNyZWRlbnRpYWxzIHBhdGguIC0tICovCi0KLXN0YXRpYyBncnBjX3dlbGxfa25vd25fY3JlZGVudGlhbHNfcGF0aF9nZXR0ZXIgY3JlZHNfcGF0aF9nZXR0ZXIgPSBOVUxMOwotCi1jaGFyICpncnBjX2dldF93ZWxsX2tub3duX2dvb2dsZV9jcmVkZW50aWFsc19maWxlX3BhdGgodm9pZCkgewotICBpZiAoY3JlZHNfcGF0aF9nZXR0ZXIgIT0gTlVMTCkgcmV0dXJuIGNyZWRzX3BhdGhfZ2V0dGVyKCk7Ci0gIHJldHVybiBncnBjX2dldF93ZWxsX2tub3duX2dvb2dsZV9jcmVkZW50aWFsc19maWxlX3BhdGhfaW1wbCgpOwotfQotCi12b2lkIGdycGNfb3ZlcnJpZGVfd2VsbF9rbm93bl9jcmVkZW50aWFsc19wYXRoX2dldHRlcigKLSAgICBncnBjX3dlbGxfa25vd25fY3JlZGVudGlhbHNfcGF0aF9nZXR0ZXIgZ2V0dGVyKSB7Ci0gIGNyZWRzX3BhdGhfZ2V0dGVyID0gZ2V0dGVyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmMgYi9zcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiMTBhMC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmgiCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKLQotI2RlZmluZSBHUlBDX0lOSVRJQUxfSEFORFNIQUtFX0JVRkZFUl9TSVpFIDI1NgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpjb25uZWN0b3I7Ci0gIHRzaV9oYW5kc2hha2VyICpoYW5kc2hha2VyOwotICBib29sIGlzX2NsaWVudF9zaWRlOwotICB1bnNpZ25lZCBjaGFyICpoYW5kc2hha2VfYnVmZmVyOwotICBzaXplX3QgaGFuZHNoYWtlX2J1ZmZlcl9zaXplOwotICBncnBjX2VuZHBvaW50ICp3cmFwcGVkX2VuZHBvaW50OwotICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZW5kcG9pbnQ7Ci0gIGdwcl9zbGljZV9idWZmZXIgbGVmdF9vdmVyczsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBpbmNvbWluZzsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBvdXRnb2luZzsKLSAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYjsKLSAgdm9pZCAqdXNlcl9kYXRhOwotICBncnBjX2Nsb3N1cmUgb25faGFuZHNoYWtlX2RhdGFfc2VudF90b19wZWVyOwotICBncnBjX2Nsb3N1cmUgb25faGFuZHNoYWtlX2RhdGFfcmVjZWl2ZWRfZnJvbV9wZWVyOwotICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0OwotfSBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZTsKLQotc3RhdGljIHZvaWQgb25faGFuZHNoYWtlX2RhdGFfcmVjZWl2ZWRfZnJvbV9wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNldHVwLCBib29sIHN1Y2Nlc3MpOwotCi1zdGF0aWMgdm9pZCBvbl9oYW5kc2hha2VfZGF0YV9zZW50X3RvX3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnNldHVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7Ci0KLXN0YXRpYyB2b2lkIHNlY3VyaXR5X2Nvbm5lY3Rvcl9yZW1vdmVfaGFuZHNoYWtlKGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoKSB7Ci0gIEdQUl9BU1NFUlQoIWgtPmlzX2NsaWVudF9zaWRlKTsKLSAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfaGFuZHNoYWtlX2xpc3QgKm5vZGU7Ci0gIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0ICp0bXA7Ci0gIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MgPQotICAgICAgKGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKWgtPmNvbm5lY3RvcjsKLSAgZ3ByX211X2xvY2soJnNjLT5tdSk7Ci0gIG5vZGUgPSBzYy0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlczsKLSAgaWYgKG5vZGUgJiYgbm9kZS0+aGFuZHNoYWtlID09IGgpIHsKLSAgICBzYy0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlcyA9IG5vZGUtPm5leHQ7Ci0gICAgZ3ByX2ZyZWUobm9kZSk7Ci0gICAgZ3ByX211X3VubG9jaygmc2MtPm11KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgd2hpbGUgKG5vZGUpIHsKLSAgICBpZiAobm9kZS0+bmV4dC0+aGFuZHNoYWtlID09IGgpIHsKLSAgICAgIHRtcCA9IG5vZGUtPm5leHQ7Ci0gICAgICBub2RlLT5uZXh0ID0gbm9kZS0+bmV4dC0+bmV4dDsKLSAgICAgIGdwcl9mcmVlKHRtcCk7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZzYy0+bXUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZzYy0+bXUpOwotfQotCi1zdGF0aWMgdm9pZCBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3N1Y2Nlc3MpIHsKLSAgaWYgKCFoLT5pc19jbGllbnRfc2lkZSkgewotICAgIHNlY3VyaXR5X2Nvbm5lY3Rvcl9yZW1vdmVfaGFuZHNoYWtlKGgpOwotICB9Ci0gIGlmIChpc19zdWNjZXNzKSB7Ci0gICAgaC0+Y2IoZXhlY19jdHgsIGgtPnVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9PSywgaC0+c2VjdXJlX2VuZHBvaW50LAotICAgICAgICAgIGgtPmF1dGhfY29udGV4dCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGgtPnNlY3VyZV9lbmRwb2ludCAhPSBOVUxMKSB7Ci0gICAgICBncnBjX2VuZHBvaW50X3NodXRkb3duKGV4ZWNfY3R4LCBoLT5zZWN1cmVfZW5kcG9pbnQpOwotICAgICAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCBoLT5zZWN1cmVfZW5kcG9pbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX2VuZHBvaW50X2Rlc3Ryb3koZXhlY19jdHgsIGgtPndyYXBwZWRfZW5kcG9pbnQpOwotICAgIH0KLSAgICBoLT5jYihleGVjX2N0eCwgaC0+dXNlcl9kYXRhLCBHUlBDX1NFQ1VSSVRZX0VSUk9SLCBOVUxMLCBOVUxMKTsKLSAgfQotICBpZiAoaC0+aGFuZHNoYWtlciAhPSBOVUxMKSB0c2lfaGFuZHNoYWtlcl9kZXN0cm95KGgtPmhhbmRzaGFrZXIpOwotICBpZiAoaC0+aGFuZHNoYWtlX2J1ZmZlciAhPSBOVUxMKSBncHJfZnJlZShoLT5oYW5kc2hha2VfYnVmZmVyKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZoLT5sZWZ0X292ZXJzKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZoLT5vdXRnb2luZyk7Ci0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmaC0+aW5jb21pbmcpOwotICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihoLT5hdXRoX2NvbnRleHQsICJoYW5kc2hha2UiKTsKLSAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoaC0+Y29ubmVjdG9yLCAiaGFuZHNoYWtlIik7Ci0gIGdwcl9mcmVlKGgpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9wZWVyX2NoZWNrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgewotICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCA9IHVzZXJfZGF0YTsKLSAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqcHJvdGVjdG9yOwotICB0c2lfcmVzdWx0IHJlc3VsdDsKLSAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFcnJvciBjaGVja2luZyBwZWVyLiIpOwotICAgIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaC0+YXV0aF9jb250ZXh0ID0gR1JQQ19BVVRIX0NPTlRFWFRfUkVGKGF1dGhfY29udGV4dCwgImhhbmRzaGFrZSIpOwotICByZXN1bHQgPQotICAgICAgdHNpX2hhbmRzaGFrZXJfY3JlYXRlX2ZyYW1lX3Byb3RlY3RvcihoLT5oYW5kc2hha2VyLCBOVUxMLCAmcHJvdGVjdG9yKTsKLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkZyYW1lIHByb3RlY3RvciBjcmVhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAotICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7Ci0gICAgc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmUoZXhlY19jdHgsIGgsIDApOwotICAgIHJldHVybjsKLSAgfQotICBoLT5zZWN1cmVfZW5kcG9pbnQgPQotICAgICAgZ3JwY19zZWN1cmVfZW5kcG9pbnRfY3JlYXRlKHByb3RlY3RvciwgaC0+d3JhcHBlZF9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5sZWZ0X292ZXJzLnNsaWNlcywgaC0+bGVmdF9vdmVycy5jb3VudCk7Ci0gIGgtPmxlZnRfb3ZlcnMuY291bnQgPSAwOwotICBoLT5sZWZ0X292ZXJzLmxlbmd0aCA9IDA7Ci0gIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAxKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBjaGVja19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCkgewotICB0c2lfcGVlciBwZWVyOwotICB0c2lfcmVzdWx0IHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcihoLT5oYW5kc2hha2VyLCAmcGVlcik7Ci0KLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlBlZXIgZXh0cmFjdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlcyIsCi0gICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKLSAgICBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShleGVjX2N0eCwgaCwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2NoZWNrX3BlZXIoZXhlY19jdHgsIGgtPmNvbm5lY3RvciwgcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9wZWVyX2NoZWNrZWQsIGgpOwotfQotCi1zdGF0aWMgdm9pZCBzZW5kX2hhbmRzaGFrZV9ieXRlc190b19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCkgewotICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIGdwcl9zbGljZSB0b19zZW5kOwotCi0gIGRvIHsKLSAgICBzaXplX3QgdG9fc2VuZF9zaXplID0gaC0+aGFuZHNoYWtlX2J1ZmZlcl9zaXplIC0gb2Zmc2V0OwotICAgIHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX2dldF9ieXRlc190b19zZW5kX3RvX3BlZXIoCi0gICAgICAgIGgtPmhhbmRzaGFrZXIsIGgtPmhhbmRzaGFrZV9idWZmZXIgKyBvZmZzZXQsICZ0b19zZW5kX3NpemUpOwotICAgIG9mZnNldCArPSB0b19zZW5kX3NpemU7Ci0gICAgaWYgKHJlc3VsdCA9PSBUU0lfSU5DT01QTEVURV9EQVRBKSB7Ci0gICAgICBoLT5oYW5kc2hha2VfYnVmZmVyX3NpemUgKj0gMjsKLSAgICAgIGgtPmhhbmRzaGFrZV9idWZmZXIgPQotICAgICAgICAgIGdwcl9yZWFsbG9jKGgtPmhhbmRzaGFrZV9idWZmZXIsIGgtPmhhbmRzaGFrZV9idWZmZXJfc2l6ZSk7Ci0gICAgfQotICB9IHdoaWxlIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZSBmYWlsZWQgd2l0aCBlcnJvciAlcyIsCi0gICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKLSAgICBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShleGVjX2N0eCwgaCwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdG9fc2VuZCA9Ci0gICAgICBncHJfc2xpY2VfZnJvbV9jb3BpZWRfYnVmZmVyKChjb25zdCBjaGFyICopaC0+aGFuZHNoYWtlX2J1ZmZlciwgb2Zmc2V0KTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoJmgtPm91dGdvaW5nKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmgtPm91dGdvaW5nLCB0b19zZW5kKTsKLSAgLyogVE9ETyhrbGVtcG5lcixqYm9ldWYpOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIGNsaWVudCBzZXR1cAotICAgICBkZWFkbGluZSAqLwotICBncnBjX2VuZHBvaW50X3dyaXRlKGV4ZWNfY3R4LCBoLT53cmFwcGVkX2VuZHBvaW50LCAmaC0+b3V0Z29pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgJmgtPm9uX2hhbmRzaGFrZV9kYXRhX3NlbnRfdG9fcGVlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2hhbmRzaGFrZV9kYXRhX3JlY2VpdmVkX2Zyb21fcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpoYW5kc2hha2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoID0gaGFuZHNoYWtlOwotICBzaXplX3QgY29uc3VtZWRfc2xpY2Vfc2l6ZSA9IDA7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICBzaXplX3QgaTsKLSAgc2l6ZV90IG51bV9sZWZ0X292ZXJzOwotICBpbnQgaGFzX2xlZnRfb3ZlcnNfaW5fY3VycmVudF9zbGljZSA9IDA7Ci0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJSZWFkIGZhaWxlZC4iKTsKLSAgICBzZWN1cml0eV9oYW5kc2hha2VfZG9uZShleGVjX2N0eCwgaCwgMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGgtPmluY29taW5nLmNvdW50OyBpKyspIHsKLSAgICBjb25zdW1lZF9zbGljZV9zaXplID0gR1BSX1NMSUNFX0xFTkdUSChoLT5pbmNvbWluZy5zbGljZXNbaV0pOwotICAgIHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX3Byb2Nlc3NfYnl0ZXNfZnJvbV9wZWVyKAotICAgICAgICBoLT5oYW5kc2hha2VyLCBHUFJfU0xJQ0VfU1RBUlRfUFRSKGgtPmluY29taW5nLnNsaWNlc1tpXSksCi0gICAgICAgICZjb25zdW1lZF9zbGljZV9zaXplKTsKLSAgICBpZiAoIXRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKGgtPmhhbmRzaGFrZXIpKSBicmVhazsKLSAgfQotCi0gIGlmICh0c2lfaGFuZHNoYWtlcl9pc19pbl9wcm9ncmVzcyhoLT5oYW5kc2hha2VyKSkgewotICAgIC8qIFdlIG1heSBuZWVkIG1vcmUgZGF0YS4gKi8KLSAgICBpZiAocmVzdWx0ID09IFRTSV9JTkNPTVBMRVRFX0RBVEEpIHsKLSAgICAgIGdycGNfZW5kcG9pbnRfcmVhZChleGVjX2N0eCwgaC0+d3JhcHBlZF9lbmRwb2ludCwgJmgtPmluY29taW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5vbl9oYW5kc2hha2VfZGF0YV9yZWNlaXZlZF9mcm9tX3BlZXIpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZW5kX2hhbmRzaGFrZV9ieXRlc190b19wZWVyKGV4ZWNfY3R4LCBoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSGFuZHNoYWtlIGZhaWxlZCB3aXRoIGVycm9yICVzIiwKLSAgICAgICAgICAgIHRzaV9yZXN1bHRfdG9fc3RyaW5nKHJlc3VsdCkpOwotICAgIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBIYW5kc2hha2UgaXMgZG9uZSBhbmQgc3VjY2Vzc2Z1bCB0aGlzIHBvaW50LiAqLwotICBoYXNfbGVmdF9vdmVyc19pbl9jdXJyZW50X3NsaWNlID0KLSAgICAgIChjb25zdW1lZF9zbGljZV9zaXplIDwgR1BSX1NMSUNFX0xFTkdUSChoLT5pbmNvbWluZy5zbGljZXNbaV0pKTsKLSAgbnVtX2xlZnRfb3ZlcnMgPQotICAgICAgKGhhc19sZWZ0X292ZXJzX2luX2N1cnJlbnRfc2xpY2UgPyAxIDogMCkgKyBoLT5pbmNvbWluZy5jb3VudCAtIGkgLSAxOwotICBpZiAobnVtX2xlZnRfb3ZlcnMgPT0gMCkgewotICAgIGNoZWNrX3BlZXIoZXhlY19jdHgsIGgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFB1dCB0aGUgbGVmdG92ZXJzIGluIG91ciBidWZmZXIgKG93bmVyc2hpcCB0cmFuc2ZlcmVkKS4gKi8KLSAgaWYgKGhhc19sZWZ0X292ZXJzX2luX2N1cnJlbnRfc2xpY2UpIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgKLSAgICAgICAgJmgtPmxlZnRfb3ZlcnMsCi0gICAgICAgIGdwcl9zbGljZV9zcGxpdF90YWlsKCZoLT5pbmNvbWluZy5zbGljZXNbaV0sIGNvbnN1bWVkX3NsaWNlX3NpemUpKTsKLSAgICBncHJfc2xpY2VfdW5yZWYoCi0gICAgICAgIGgtPmluY29taW5nLnNsaWNlc1tpXSk7IC8qIHNwbGl0X3RhaWwgYWJvdmUgaW5jcmVtZW50cyByZWZjb3VudC4gKi8KLSAgfQotICBncHJfc2xpY2VfYnVmZmVyX2FkZG4oCi0gICAgICAmaC0+bGVmdF9vdmVycywgJmgtPmluY29taW5nLnNsaWNlc1tpICsgMV0sCi0gICAgICBudW1fbGVmdF9vdmVycyAtIChzaXplX3QpaGFzX2xlZnRfb3ZlcnNfaW5fY3VycmVudF9zbGljZSk7Ci0gIGNoZWNrX3BlZXIoZXhlY19jdHgsIGgpOwotfQotCi0vKiBJZiBoYW5kc2hha2UgaXMgTlVMTCwgdGhlIGhhbmRzaGFrZSBpcyBkb25lLiAqLwotc3RhdGljIHZvaWQgb25faGFuZHNoYWtlX2RhdGFfc2VudF90b19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRzaGFrZSwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoID0gaGFuZHNoYWtlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdyaXRlIGlzIE9LLiAqLwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIldyaXRlIGZhaWxlZC4iKTsKLSAgICBpZiAoaGFuZHNoYWtlICE9IE5VTEwpIHNlY3VyaXR5X2hhbmRzaGFrZV9kb25lKGV4ZWNfY3R4LCBoLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBXZSBtYXkgYmUgZG9uZS4gKi8KLSAgaWYgKHRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKGgtPmhhbmRzaGFrZXIpKSB7Ci0gICAgLyogVE9ETyhrbGVtcG5lcixqYm9ldWYpOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIGNsaWVudCBzZXR1cAotICAgICAgIGRlYWRsaW5lICovCi0gICAgZ3JwY19lbmRwb2ludF9yZWFkKGV4ZWNfY3R4LCBoLT53cmFwcGVkX2VuZHBvaW50LCAmaC0+aW5jb21pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICZoLT5vbl9oYW5kc2hha2VfZGF0YV9yZWNlaXZlZF9mcm9tX3BlZXIpOwotICB9IGVsc2UgewotICAgIGNoZWNrX3BlZXIoZXhlY19jdHgsIGgpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19kb19zZWN1cml0eV9oYW5kc2hha2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9oYW5kc2hha2VyICpoYW5kc2hha2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqY29ubmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NsaWVudF9zaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdCAqaGFuZHNoYWtlX25vZGU7Ci0gIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlICpoID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZWN1cml0eV9oYW5kc2hha2UpKTsKLSAgbWVtc2V0KGgsIDAsIHNpemVvZihncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSkpOwotICBoLT5oYW5kc2hha2VyID0gaGFuZHNoYWtlcjsKLSAgaC0+Y29ubmVjdG9yID0gR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKGNvbm5lY3RvciwgImhhbmRzaGFrZSIpOwotICBoLT5pc19jbGllbnRfc2lkZSA9IGlzX2NsaWVudF9zaWRlOwotICBoLT5oYW5kc2hha2VfYnVmZmVyX3NpemUgPSBHUlBDX0lOSVRJQUxfSEFORFNIQUtFX0JVRkZFUl9TSVpFOwotICBoLT5oYW5kc2hha2VfYnVmZmVyID0gZ3ByX21hbGxvYyhoLT5oYW5kc2hha2VfYnVmZmVyX3NpemUpOwotICBoLT53cmFwcGVkX2VuZHBvaW50ID0gbm9uc2VjdXJlX2VuZHBvaW50OwotICBoLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7Ci0gIGgtPmNiID0gY2I7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZoLT5vbl9oYW5kc2hha2VfZGF0YV9zZW50X3RvX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgIG9uX2hhbmRzaGFrZV9kYXRhX3NlbnRfdG9fcGVlciwgaCk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZoLT5vbl9oYW5kc2hha2VfZGF0YV9yZWNlaXZlZF9mcm9tX3BlZXIsCi0gICAgICAgICAgICAgICAgICAgIG9uX2hhbmRzaGFrZV9kYXRhX3JlY2VpdmVkX2Zyb21fcGVlciwgaCk7Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmaC0+bGVmdF9vdmVycyk7Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmaC0+b3V0Z29pbmcpOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmgtPmluY29taW5nKTsKLSAgaWYgKCFpc19jbGllbnRfc2lkZSkgewotICAgIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2VydmVyX2Nvbm5lY3RvciA9Ci0gICAgICAgIChncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKiljb25uZWN0b3I7Ci0gICAgaGFuZHNoYWtlX25vZGUgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdCkpOwotICAgIGhhbmRzaGFrZV9ub2RlLT5oYW5kc2hha2UgPSBoOwotICAgIGdwcl9tdV9sb2NrKCZzZXJ2ZXJfY29ubmVjdG9yLT5tdSk7Ci0gICAgaGFuZHNoYWtlX25vZGUtPm5leHQgPSBzZXJ2ZXJfY29ubmVjdG9yLT5oYW5kc2hha2luZ19oYW5kc2hha2VzOwotICAgIHNlcnZlcl9jb25uZWN0b3ItPmhhbmRzaGFraW5nX2hhbmRzaGFrZXMgPSBoYW5kc2hha2Vfbm9kZTsKLSAgICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXJfY29ubmVjdG9yLT5tdSk7Ci0gIH0KLSAgc2VuZF9oYW5kc2hha2VfYnl0ZXNfdG9fcGVlcihleGVjX2N0eCwgaCk7Ci19Ci0KLXZvaWQgZ3JwY19zZWN1cml0eV9oYW5kc2hha2Vfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRzaGFrZSkgewotICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZSAqaCA9IGhhbmRzaGFrZTsKLSAgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihleGVjX2N0eCwgaC0+d3JhcHBlZF9lbmRwb2ludCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuaCBiL3NyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODcyMDQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU0VDVVJJVFlfSEFORFNIQUtFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NFQ1VSSVRZX0hBTkRTSEFLRV9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgotCi0vKiBDYWxscyB0aGUgY2FsbGJhY2sgdXBvbiBjb21wbGV0aW9uLiBUYWtlcyBvd2Vyc2hpcCBvZiBoYW5kc2hha2VyLiAqLwotdm9pZCBncnBjX2RvX3NlY3VyaXR5X2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX2hhbmRzaGFrZXIgKmhhbmRzaGFrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpjb25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY2xpZW50X3NpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKLQotdm9pZCBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqaGFuZHNoYWtlKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TRUNVUklUWV9IQU5EU0hBS0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5jIGIvc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJlNWJmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9iNjQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi0jaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+Ci0KLS8qIC0tLSBDb25zdGFudHMuIC0tLSAqLwotCi0vKiAxIGhvdXIgbWF4LiAqLwotZ3ByX3RpbWVzcGVjIGdycGNfbWF4X2F1dGhfdG9rZW5fbGlmZXRpbWUoKSB7Ci0gIGdwcl90aW1lc3BlYyBvdXQ7Ci0gIG91dC50dl9zZWMgPSAzNjAwOwotICBvdXQudHZfbnNlYyA9IDA7Ci0gIG91dC5jbG9ja190eXBlID0gR1BSX1RJTUVTUEFOOwotICByZXR1cm4gb3V0OwotfQotCi0jZGVmaW5lIEdSUENfSldUX1JTQV9TSEEyNTZfQUxHT1JJVEhNICJSUzI1NiIKLSNkZWZpbmUgR1JQQ19KV1RfVFlQRSAiSldUIgotCi0vKiAtLS0gT3ZlcnJpZGUgZm9yIHRlc3RpbmcuIC0tLSAqLwotCi1zdGF0aWMgZ3JwY19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlIGdfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZSA9IE5VTEw7Ci0KLS8qIC0tLSBncnBjX2F1dGhfanNvbl9rZXkuIC0tLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqanNvbl9nZXRfc3RyaW5nX3Byb3BlcnR5KGNvbnN0IGdycGNfanNvbiAqanNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcF9uYW1lKSB7Ci0gIGdycGNfanNvbiAqY2hpbGQ7Ci0gIGZvciAoY2hpbGQgPSBqc29uLT5jaGlsZDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgewotICAgIGlmIChzdHJjbXAoY2hpbGQtPmtleSwgcHJvcF9uYW1lKSA9PSAwKSBicmVhazsKLSAgfQotICBpZiAoY2hpbGQgPT0gTlVMTCB8fCBjaGlsZC0+dHlwZSAhPSBHUlBDX0pTT05fU1RSSU5HKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIG9yIG1pc3NpbmcgJXMgcHJvcGVydHkuIiwgcHJvcF9uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gY2hpbGQtPnZhbHVlOwotfQotCi1zdGF0aWMgaW50IHNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoY29uc3QgZ3JwY19qc29uICpqc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqanNvbl9rZXlfZmllbGQpIHsKLSAgY29uc3QgY2hhciAqcHJvcF92YWx1ZSA9IGpzb25fZ2V0X3N0cmluZ19wcm9wZXJ0eShqc29uLCBwcm9wX25hbWUpOwotICBpZiAocHJvcF92YWx1ZSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgKmpzb25fa2V5X2ZpZWxkID0gZ3ByX3N0cmR1cChwcm9wX3ZhbHVlKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBncnBjX2F1dGhfanNvbl9rZXlfaXNfdmFsaWQoY29uc3QgZ3JwY19hdXRoX2pzb25fa2V5ICpqc29uX2tleSkgewotICByZXR1cm4gKGpzb25fa2V5ICE9IE5VTEwpICYmCi0gICAgICAgICBzdHJjbXAoanNvbl9rZXktPnR5cGUsIEdSUENfQVVUSF9KU09OX1RZUEVfSU5WQUxJRCk7Ci19Ci0KLWdycGNfYXV0aF9qc29uX2tleSBncnBjX2F1dGhfanNvbl9rZXlfY3JlYXRlX2Zyb21fanNvbihjb25zdCBncnBjX2pzb24gKmpzb24pIHsKLSAgZ3JwY19hdXRoX2pzb25fa2V5IHJlc3VsdDsKLSAgQklPICpiaW8gPSBOVUxMOwotICBjb25zdCBjaGFyICpwcm9wX3ZhbHVlOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0KLSAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihncnBjX2F1dGhfanNvbl9rZXkpKTsKLSAgcmVzdWx0LnR5cGUgPSBHUlBDX0FVVEhfSlNPTl9UWVBFX0lOVkFMSUQ7Ci0gIGlmIChqc29uID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQganNvbi4iKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIHByb3BfdmFsdWUgPSBqc29uX2dldF9zdHJpbmdfcHJvcGVydHkoanNvbiwgInR5cGUiKTsKLSAgaWYgKHByb3BfdmFsdWUgPT0gTlVMTCB8fAotICAgICAgc3RyY21wKHByb3BfdmFsdWUsIEdSUENfQVVUSF9KU09OX1RZUEVfU0VSVklDRV9BQ0NPVU5UKSkgewotICAgIGdvdG8gZW5kOwotICB9Ci0gIHJlc3VsdC50eXBlID0gR1JQQ19BVVRIX0pTT05fVFlQRV9TRVJWSUNFX0FDQ09VTlQ7Ci0KLSAgaWYgKCFzZXRfanNvbl9rZXlfc3RyaW5nX3Byb3BlcnR5KGpzb24sICJwcml2YXRlX2tleV9pZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LnByaXZhdGVfa2V5X2lkKSB8fAotICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9pZCIsICZyZXN1bHQuY2xpZW50X2lkKSB8fAotICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9lbWFpbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LmNsaWVudF9lbWFpbCkpIHsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIHByb3BfdmFsdWUgPSBqc29uX2dldF9zdHJpbmdfcHJvcGVydHkoanNvbiwgInByaXZhdGVfa2V5Iik7Ci0gIGlmIChwcm9wX3ZhbHVlID09IE5VTEwpIHsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKLSAgc3VjY2VzcyA9IEJJT19wdXRzKGJpbywgcHJvcF92YWx1ZSk7Ci0gIGlmICgoc3VjY2VzcyA8IDApIHx8ICgoc2l6ZV90KXN1Y2Nlc3MgIT0gc3RybGVuKHByb3BfdmFsdWUpKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IHdyaXRlIGludG8gb3BlbnNzbCBCSU8uIik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLSAgcmVzdWx0LnByaXZhdGVfa2V5ID0gUEVNX3JlYWRfYmlvX1JTQVByaXZhdGVLZXkoYmlvLCBOVUxMLCBOVUxMLCAiIik7Ci0gIGlmIChyZXN1bHQucHJpdmF0ZV9rZXkgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGRlc2VyaWFsaXplIHByaXZhdGUga2V5LiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIHN1Y2Nlc3MgPSAxOwotCi1lbmQ6Ci0gIGlmIChiaW8gIT0gTlVMTCkgQklPX2ZyZWUoYmlvKTsKLSAgaWYgKCFzdWNjZXNzKSBncnBjX2F1dGhfanNvbl9rZXlfZGVzdHJ1Y3QoJnJlc3VsdCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWdycGNfYXV0aF9qc29uX2tleSBncnBjX2F1dGhfanNvbl9rZXlfY3JlYXRlX2Zyb21fc3RyaW5nKAotICAgIGNvbnN0IGNoYXIgKmpzb25fc3RyaW5nKSB7Ci0gIGNoYXIgKnNjcmF0Y2hwYWQgPSBncHJfc3RyZHVwKGpzb25fc3RyaW5nKTsKLSAgZ3JwY19qc29uICpqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZyhzY3JhdGNocGFkKTsKLSAgZ3JwY19hdXRoX2pzb25fa2V5IHJlc3VsdCA9IGdycGNfYXV0aF9qc29uX2tleV9jcmVhdGVfZnJvbV9qc29uKGpzb24pOwotICBpZiAoanNvbiAhPSBOVUxMKSBncnBjX2pzb25fZGVzdHJveShqc29uKTsKLSAgZ3ByX2ZyZWUoc2NyYXRjaHBhZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgZ3JwY19hdXRoX2pzb25fa2V5X2Rlc3RydWN0KGdycGNfYXV0aF9qc29uX2tleSAqanNvbl9rZXkpIHsKLSAgaWYgKGpzb25fa2V5ID09IE5VTEwpIHJldHVybjsKLSAganNvbl9rZXktPnR5cGUgPSBHUlBDX0FVVEhfSlNPTl9UWVBFX0lOVkFMSUQ7Ci0gIGlmIChqc29uX2tleS0+Y2xpZW50X2lkICE9IE5VTEwpIHsKLSAgICBncHJfZnJlZShqc29uX2tleS0+Y2xpZW50X2lkKTsKLSAgICBqc29uX2tleS0+Y2xpZW50X2lkID0gTlVMTDsKLSAgfQotICBpZiAoanNvbl9rZXktPnByaXZhdGVfa2V5X2lkICE9IE5VTEwpIHsKLSAgICBncHJfZnJlZShqc29uX2tleS0+cHJpdmF0ZV9rZXlfaWQpOwotICAgIGpzb25fa2V5LT5wcml2YXRlX2tleV9pZCA9IE5VTEw7Ci0gIH0KLSAgaWYgKGpzb25fa2V5LT5jbGllbnRfZW1haWwgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKGpzb25fa2V5LT5jbGllbnRfZW1haWwpOwotICAgIGpzb25fa2V5LT5jbGllbnRfZW1haWwgPSBOVUxMOwotICB9Ci0gIGlmIChqc29uX2tleS0+cHJpdmF0ZV9rZXkgIT0gTlVMTCkgewotICAgIFJTQV9mcmVlKGpzb25fa2V5LT5wcml2YXRlX2tleSk7Ci0gICAganNvbl9rZXktPnByaXZhdGVfa2V5ID0gTlVMTDsKLSAgfQotfQotCi0vKiAtLS0gand0IGVuY29kaW5nIGFuZCBzaWduYXR1cmUuIC0tLSAqLwotCi1zdGF0aWMgZ3JwY19qc29uICpjcmVhdGVfY2hpbGQoZ3JwY19qc29uICpicm90aGVyLCBncnBjX2pzb24gKnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfanNvbl90eXBlIHR5cGUpIHsKLSAgZ3JwY19qc29uICpjaGlsZCA9IGdycGNfanNvbl9jcmVhdGUodHlwZSk7Ci0gIGlmIChicm90aGVyKSBicm90aGVyLT5uZXh0ID0gY2hpbGQ7Ci0gIGlmICghcGFyZW50LT5jaGlsZCkgcGFyZW50LT5jaGlsZCA9IGNoaWxkOwotICBjaGlsZC0+cGFyZW50ID0gcGFyZW50OwotICBjaGlsZC0+dmFsdWUgPSB2YWx1ZTsKLSAgY2hpbGQtPmtleSA9IGtleTsKLSAgcmV0dXJuIGNoaWxkOwotfQotCi1zdGF0aWMgY2hhciAqZW5jb2RlZF9qd3RfaGVhZGVyKGNvbnN0IGNoYXIgKmtleV9pZCwgY29uc3QgY2hhciAqYWxnb3JpdGhtKSB7Ci0gIGdycGNfanNvbiAqanNvbiA9IGdycGNfanNvbl9jcmVhdGUoR1JQQ19KU09OX09CSkVDVCk7Ci0gIGdycGNfanNvbiAqY2hpbGQgPSBOVUxMOwotICBjaGFyICpqc29uX3N0ciA9IE5VTEw7Ci0gIGNoYXIgKnJlc3VsdCA9IE5VTEw7Ci0KLSAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoTlVMTCwganNvbiwgImFsZyIsIGFsZ29yaXRobSwgR1JQQ19KU09OX1NUUklORyk7Ci0gIGNoaWxkID0gY3JlYXRlX2NoaWxkKGNoaWxkLCBqc29uLCAidHlwIiwgR1JQQ19KV1RfVFlQRSwgR1JQQ19KU09OX1NUUklORyk7Ci0gIGNyZWF0ZV9jaGlsZChjaGlsZCwganNvbiwgImtpZCIsIGtleV9pZCwgR1JQQ19KU09OX1NUUklORyk7Ci0KLSAganNvbl9zdHIgPSBncnBjX2pzb25fZHVtcF90b19zdHJpbmcoanNvbiwgMCk7Ci0gIHJlc3VsdCA9IGdycGNfYmFzZTY0X2VuY29kZShqc29uX3N0ciwgc3RybGVuKGpzb25fc3RyKSwgMSwgMCk7Ci0gIGdwcl9mcmVlKGpzb25fc3RyKTsKLSAgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjaGFyICplbmNvZGVkX2p3dF9jbGFpbShjb25zdCBncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGllbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSwgY29uc3QgY2hhciAqc2NvcGUpIHsKLSAgZ3JwY19qc29uICpqc29uID0gZ3JwY19qc29uX2NyZWF0ZShHUlBDX0pTT05fT0JKRUNUKTsKLSAgZ3JwY19qc29uICpjaGlsZCA9IE5VTEw7Ci0gIGNoYXIgKmpzb25fc3RyID0gTlVMTDsKLSAgY2hhciAqcmVzdWx0ID0gTlVMTDsKLSAgZ3ByX3RpbWVzcGVjIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgZ3ByX3RpbWVzcGVjIGV4cGlyYXRpb24gPSBncHJfdGltZV9hZGQobm93LCB0b2tlbl9saWZldGltZSk7Ci0gIGNoYXIgbm93X3N0cltHUFJfTFRPQV9NSU5fQlVGU0laRV07Ci0gIGNoYXIgZXhwaXJhdGlvbl9zdHJbR1BSX0xUT0FfTUlOX0JVRlNJWkVdOwotICBpZiAoZ3ByX3RpbWVfY21wKHRva2VuX2xpZmV0aW1lLCBncnBjX21heF9hdXRoX3Rva2VuX2xpZmV0aW1lKCkpID4gMCkgewotICAgIGdwcl9sb2coR1BSX0lORk8sICJDcm9wcGluZyB0b2tlbiBsaWZldGltZSB0byBtYXhpbXVtIGFsbG93ZWQgdmFsdWUuIik7Ci0gICAgZXhwaXJhdGlvbiA9IGdwcl90aW1lX2FkZChub3csIGdycGNfbWF4X2F1dGhfdG9rZW5fbGlmZXRpbWUoKSk7Ci0gIH0KLSAgaW50NjRfdHRvYShub3cudHZfc2VjLCBub3dfc3RyKTsKLSAgaW50NjRfdHRvYShleHBpcmF0aW9uLnR2X3NlYywgZXhwaXJhdGlvbl9zdHIpOwotCi0gIGNoaWxkID0KLSAgICAgIGNyZWF0ZV9jaGlsZChOVUxMLCBqc29uLCAiaXNzIiwganNvbl9rZXktPmNsaWVudF9lbWFpbCwgR1JQQ19KU09OX1NUUklORyk7Ci0gIGlmIChzY29wZSAhPSBOVUxMKSB7Ci0gICAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoY2hpbGQsIGpzb24sICJzY29wZSIsIHNjb3BlLCBHUlBDX0pTT05fU1RSSU5HKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBVbnNjb3BlZCBKV1RzIG5lZWQgYSBzdWIgZmllbGQuICovCi0gICAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoY2hpbGQsIGpzb24sICJzdWIiLCBqc29uX2tleS0+Y2xpZW50X2VtYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfSlNPTl9TVFJJTkcpOwotICB9Ci0KLSAgY2hpbGQgPSBjcmVhdGVfY2hpbGQoY2hpbGQsIGpzb24sICJhdWQiLCBhdWRpZW5jZSwgR1JQQ19KU09OX1NUUklORyk7Ci0gIGNoaWxkID0gY3JlYXRlX2NoaWxkKGNoaWxkLCBqc29uLCAiaWF0Iiwgbm93X3N0ciwgR1JQQ19KU09OX05VTUJFUik7Ci0gIGNyZWF0ZV9jaGlsZChjaGlsZCwganNvbiwgImV4cCIsIGV4cGlyYXRpb25fc3RyLCBHUlBDX0pTT05fTlVNQkVSKTsKLQotICBqc29uX3N0ciA9IGdycGNfanNvbl9kdW1wX3RvX3N0cmluZyhqc29uLCAwKTsKLSAgcmVzdWx0ID0gZ3JwY19iYXNlNjRfZW5jb2RlKGpzb25fc3RyLCBzdHJsZW4oanNvbl9zdHIpLCAxLCAwKTsKLSAgZ3ByX2ZyZWUoanNvbl9zdHIpOwotICBncnBjX2pzb25fZGVzdHJveShqc29uKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGNoYXIgKmRvdF9jb25jYXRfYW5kX2ZyZWVfc3RyaW5ncyhjaGFyICpzdHIxLCBjaGFyICpzdHIyKSB7Ci0gIHNpemVfdCBzdHIxX2xlbiA9IHN0cmxlbihzdHIxKTsKLSAgc2l6ZV90IHN0cjJfbGVuID0gc3RybGVuKHN0cjIpOwotICBzaXplX3QgcmVzdWx0X2xlbiA9IHN0cjFfbGVuICsgMSAvKiBkb3QgKi8gKyBzdHIyX2xlbjsKLSAgY2hhciAqcmVzdWx0ID0gZ3ByX21hbGxvYyhyZXN1bHRfbGVuICsgMSAvKiBOVUxMIHRlcm1pbmF0ZWQgKi8pOwotICBjaGFyICpjdXJyZW50ID0gcmVzdWx0OwotICBtZW1jcHkoY3VycmVudCwgc3RyMSwgc3RyMV9sZW4pOwotICBjdXJyZW50ICs9IHN0cjFfbGVuOwotICAqKGN1cnJlbnQrKykgPSAnLic7Ci0gIG1lbWNweShjdXJyZW50LCBzdHIyLCBzdHIyX2xlbik7Ci0gIGN1cnJlbnQgKz0gc3RyMl9sZW47Ci0gIEdQUl9BU1NFUlQoY3VycmVudCA+PSByZXN1bHQpOwotICBHUFJfQVNTRVJUKCh1aW50cHRyX3QpKGN1cnJlbnQgLSByZXN1bHQpID09IHJlc3VsdF9sZW4pOwotICAqY3VycmVudCA9ICdcMCc7Ci0gIGdwcl9mcmVlKHN0cjEpOwotICBncHJfZnJlZShzdHIyKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgRVZQX01EICpvcGVuc3NsX2RpZ2VzdF9mcm9tX2FsZ29yaXRobShjb25zdCBjaGFyICphbGdvcml0aG0pIHsKLSAgaWYgKHN0cmNtcChhbGdvcml0aG0sIEdSUENfSldUX1JTQV9TSEEyNTZfQUxHT1JJVEhNKSA9PSAwKSB7Ci0gICAgcmV0dXJuIEVWUF9zaGEyNTYoKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVua25vd24gYWxnb3JpdGhtICVzLiIsIGFsZ29yaXRobSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY2hhciAqY29tcHV0ZV9hbmRfZW5jb2RlX3NpZ25hdHVyZShjb25zdCBncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWduYXR1cmVfYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zaWduKSB7Ci0gIGNvbnN0IEVWUF9NRCAqbWQgPSBvcGVuc3NsX2RpZ2VzdF9mcm9tX2FsZ29yaXRobShzaWduYXR1cmVfYWxnb3JpdGhtKTsKLSAgRVZQX01EX0NUWCAqbWRfY3R4ID0gTlVMTDsKLSAgRVZQX1BLRVkgKmtleSA9IEVWUF9QS0VZX25ldygpOwotICBzaXplX3Qgc2lnX2xlbiA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKnNpZyA9IE5VTEw7Ci0gIGNoYXIgKnJlc3VsdCA9IE5VTEw7Ci0gIGlmIChtZCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgbWRfY3R4ID0gRVZQX01EX0NUWF9jcmVhdGUoKTsKLSAgaWYgKG1kX2N0eCA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIE1EX0NUWCIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIEVWUF9QS0VZX3NldDFfUlNBKGtleSwganNvbl9rZXktPnByaXZhdGVfa2V5KTsKLSAgaWYgKEVWUF9EaWdlc3RTaWduSW5pdChtZF9jdHgsIE5VTEwsIG1kLCBOVUxMLCBrZXkpICE9IDEpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkRpZ2VzdEluaXQgZmFpbGVkLiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIGlmIChFVlBfRGlnZXN0U2lnblVwZGF0ZShtZF9jdHgsIHRvX3NpZ24sIHN0cmxlbih0b19zaWduKSkgIT0gMSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRGlnZXN0VXBkYXRlIGZhaWxlZC4iKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBpZiAoRVZQX0RpZ2VzdFNpZ25GaW5hbChtZF9jdHgsIE5VTEwsICZzaWdfbGVuKSAhPSAxKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJEaWdlc3RGaW5hbCAoZ2V0IHNpZ25hdHVyZSBsZW5ndGgpIGZhaWxlZC4iKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBzaWcgPSBncHJfbWFsbG9jKHNpZ19sZW4pOwotICBpZiAoRVZQX0RpZ2VzdFNpZ25GaW5hbChtZF9jdHgsIHNpZywgJnNpZ19sZW4pICE9IDEpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkRpZ2VzdEZpbmFsIChzaWduYXR1cmUgY29tcHV0ZSkgZmFpbGVkLiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIHJlc3VsdCA9IGdycGNfYmFzZTY0X2VuY29kZShzaWcsIHNpZ19sZW4sIDEsIDApOwotCi1lbmQ6Ci0gIGlmIChrZXkgIT0gTlVMTCkgRVZQX1BLRVlfZnJlZShrZXkpOwotICBpZiAobWRfY3R4ICE9IE5VTEwpIEVWUF9NRF9DVFhfZGVzdHJveShtZF9jdHgpOwotICBpZiAoc2lnICE9IE5VTEwpIGdwcl9mcmVlKHNpZyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWNoYXIgKmdycGNfand0X2VuY29kZV9hbmRfc2lnbihjb25zdCBncnBjX2F1dGhfanNvbl9rZXkgKmpzb25fa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGllbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSwgY29uc3QgY2hhciAqc2NvcGUpIHsKLSAgaWYgKGdfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIGdfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZShqc29uX2tleSwgYXVkaWVuY2UsIHRva2VuX2xpZmV0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUpOwotICB9IGVsc2UgewotICAgIGNvbnN0IGNoYXIgKnNpZ19hbGdvID0gR1JQQ19KV1RfUlNBX1NIQTI1Nl9BTEdPUklUSE07Ci0gICAgY2hhciAqdG9fc2lnbiA9IGRvdF9jb25jYXRfYW5kX2ZyZWVfc3RyaW5ncygKLSAgICAgICAgZW5jb2RlZF9qd3RfaGVhZGVyKGpzb25fa2V5LT5wcml2YXRlX2tleV9pZCwgc2lnX2FsZ28pLAotICAgICAgICBlbmNvZGVkX2p3dF9jbGFpbShqc29uX2tleSwgYXVkaWVuY2UsIHRva2VuX2xpZmV0aW1lLCBzY29wZSkpOwotICAgIGNoYXIgKnNpZyA9IGNvbXB1dGVfYW5kX2VuY29kZV9zaWduYXR1cmUoanNvbl9rZXksIHNpZ19hbGdvLCB0b19zaWduKTsKLSAgICBpZiAoc2lnID09IE5VTEwpIHsKLSAgICAgIGdwcl9mcmVlKHRvX3NpZ24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBkb3RfY29uY2F0X2FuZF9mcmVlX3N0cmluZ3ModG9fc2lnbiwgc2lnKTsKLSAgfQotfQotCi12b2lkIGdycGNfand0X2VuY29kZV9hbmRfc2lnbl9zZXRfb3ZlcnJpZGUoCi0gICAgZ3JwY19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlIGZ1bmMpIHsKLSAgZ19qd3RfZW5jb2RlX2FuZF9zaWduX292ZXJyaWRlID0gZnVuYzsKLX0KLQotLyogLS0tIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIC0tLSAqLwotCi1pbnQgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5faXNfdmFsaWQoCi0gICAgY29uc3QgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gKnJlZnJlc2hfdG9rZW4pIHsKLSAgcmV0dXJuIChyZWZyZXNoX3Rva2VuICE9IE5VTEwpICYmCi0gICAgICAgICBzdHJjbXAocmVmcmVzaF90b2tlbi0+dHlwZSwgR1JQQ19BVVRIX0pTT05fVFlQRV9JTlZBTElEKTsKLX0KLQotZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fY3JlYXRlX2Zyb21fanNvbigKLSAgICBjb25zdCBncnBjX2pzb24gKmpzb24pIHsKLSAgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gcmVzdWx0OwotICBjb25zdCBjaGFyICpwcm9wX3ZhbHVlOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0KLSAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihncnBjX2F1dGhfcmVmcmVzaF90b2tlbikpOwotICByZXN1bHQudHlwZSA9IEdSUENfQVVUSF9KU09OX1RZUEVfSU5WQUxJRDsKLSAgaWYgKGpzb24gPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBqc29uLiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgcHJvcF92YWx1ZSA9IGpzb25fZ2V0X3N0cmluZ19wcm9wZXJ0eShqc29uLCAidHlwZSIpOwotICBpZiAocHJvcF92YWx1ZSA9PSBOVUxMIHx8Ci0gICAgICBzdHJjbXAocHJvcF92YWx1ZSwgR1JQQ19BVVRIX0pTT05fVFlQRV9BVVRIT1JJWkVEX1VTRVIpKSB7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLSAgcmVzdWx0LnR5cGUgPSBHUlBDX0FVVEhfSlNPTl9UWVBFX0FVVEhPUklaRURfVVNFUjsKLQotICBpZiAoIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9zZWNyZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdC5jbGllbnRfc2VjcmV0KSB8fAotICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgImNsaWVudF9pZCIsICZyZXN1bHQuY2xpZW50X2lkKSB8fAotICAgICAgIXNldF9qc29uX2tleV9zdHJpbmdfcHJvcGVydHkoanNvbiwgInJlZnJlc2hfdG9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdC5yZWZyZXNoX3Rva2VuKSkgewotICAgIGdvdG8gZW5kOwotICB9Ci0gIHN1Y2Nlc3MgPSAxOwotCi1lbmQ6Ci0gIGlmICghc3VjY2VzcykgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fZGVzdHJ1Y3QoJnJlc3VsdCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2NyZWF0ZV9mcm9tX3N0cmluZygKLSAgICBjb25zdCBjaGFyICpqc29uX3N0cmluZykgewotICBjaGFyICpzY3JhdGNocGFkID0gZ3ByX3N0cmR1cChqc29uX3N0cmluZyk7Ci0gIGdycGNfanNvbiAqanNvbiA9IGdycGNfanNvbl9wYXJzZV9zdHJpbmcoc2NyYXRjaHBhZCk7Ci0gIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIHJlc3VsdCA9Ci0gICAgICBncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9jcmVhdGVfZnJvbV9qc29uKGpzb24pOwotICBpZiAoanNvbiAhPSBOVUxMKSBncnBjX2pzb25fZGVzdHJveShqc29uKTsKLSAgZ3ByX2ZyZWUoc2NyYXRjaHBhZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5fZGVzdHJ1Y3QoZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gKnJlZnJlc2hfdG9rZW4pIHsKLSAgaWYgKHJlZnJlc2hfdG9rZW4gPT0gTlVMTCkgcmV0dXJuOwotICByZWZyZXNoX3Rva2VuLT50eXBlID0gR1JQQ19BVVRIX0pTT05fVFlQRV9JTlZBTElEOwotICBpZiAocmVmcmVzaF90b2tlbi0+Y2xpZW50X2lkICE9IE5VTEwpIHsKLSAgICBncHJfZnJlZShyZWZyZXNoX3Rva2VuLT5jbGllbnRfaWQpOwotICAgIHJlZnJlc2hfdG9rZW4tPmNsaWVudF9pZCA9IE5VTEw7Ci0gIH0KLSAgaWYgKHJlZnJlc2hfdG9rZW4tPmNsaWVudF9zZWNyZXQgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKHJlZnJlc2hfdG9rZW4tPmNsaWVudF9zZWNyZXQpOwotICAgIHJlZnJlc2hfdG9rZW4tPmNsaWVudF9zZWNyZXQgPSBOVUxMOwotICB9Ci0gIGlmIChyZWZyZXNoX3Rva2VuLT5yZWZyZXNoX3Rva2VuICE9IE5VTEwpIHsKLSAgICBncHJfZnJlZShyZWZyZXNoX3Rva2VuLT5yZWZyZXNoX3Rva2VuKTsKLSAgICByZWZyZXNoX3Rva2VuLT5yZWZyZXNoX3Rva2VuID0gTlVMTDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIGIvc3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTgzZjliLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TRUNVUklUWV9KU09OX1RPS0VOX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NFQ1VSSVRZX0pTT05fVE9LRU5fSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbi5oIgotCi0vKiAtLS0gQ29uc3RhbnRzLiAtLS0gKi8KLQotI2RlZmluZSBHUlBDX0pXVF9PQVVUSDJfQVVESUVOQ0UgImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92My90b2tlbiIKLQotI2RlZmluZSBHUlBDX0FVVEhfSlNPTl9UWVBFX0lOVkFMSUQgImludmFsaWQiCi0jZGVmaW5lIEdSUENfQVVUSF9KU09OX1RZUEVfU0VSVklDRV9BQ0NPVU5UICJzZXJ2aWNlX2FjY291bnQiCi0jZGVmaW5lIEdSUENfQVVUSF9KU09OX1RZUEVfQVVUSE9SSVpFRF9VU0VSICJhdXRob3JpemVkX3VzZXIiCi0KLS8qIC0tLSBhdXRoX2pzb25fa2V5IHBhcnNpbmcuIC0tLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKnR5cGU7Ci0gIGNoYXIgKnByaXZhdGVfa2V5X2lkOwotICBjaGFyICpjbGllbnRfaWQ7Ci0gIGNoYXIgKmNsaWVudF9lbWFpbDsKLSAgUlNBICpwcml2YXRlX2tleTsKLX0gZ3JwY19hdXRoX2pzb25fa2V5OwotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIG9iamVjdCBpcyB2YWxpZCwgMCBvdGhlcndpc2UuICovCi1pbnQgZ3JwY19hdXRoX2pzb25fa2V5X2lzX3ZhbGlkKGNvbnN0IGdycGNfYXV0aF9qc29uX2tleSAqanNvbl9rZXkpOwotCi0vKiBDcmVhdGVzIGEganNvbl9rZXkgb2JqZWN0IGZyb20gc3RyaW5nLiBSZXR1cm5zIGFuIGludmFsaWQgb2JqZWN0IGlmIGEgcGFyc2luZwotICAgZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQuICovCi1ncnBjX2F1dGhfanNvbl9rZXkgZ3JwY19hdXRoX2pzb25fa2V5X2NyZWF0ZV9mcm9tX3N0cmluZygKLSAgICBjb25zdCBjaGFyICpqc29uX3N0cmluZyk7Ci0KLS8qIENyZWF0ZXMgYSBqc29uX2tleSBvYmplY3QgZnJvbSBwYXJzZWQganNvbi4gUmV0dXJucyBhbiBpbnZhbGlkIG9iamVjdCBpZiBhCi0gICBwYXJzaW5nIGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLiAqLwotZ3JwY19hdXRoX2pzb25fa2V5IGdycGNfYXV0aF9qc29uX2tleV9jcmVhdGVfZnJvbV9qc29uKGNvbnN0IGdycGNfanNvbiAqanNvbik7Ci0KLS8qIERlc3RydWN0cyB0aGUgb2JqZWN0LiAqLwotdm9pZCBncnBjX2F1dGhfanNvbl9rZXlfZGVzdHJ1Y3QoZ3JwY19hdXRoX2pzb25fa2V5ICpqc29uX2tleSk7Ci0KLS8qIC0tLSBqc29uIHRva2VuIGVuY29kaW5nIGFuZCBzaWduaW5nLiAtLS0gKi8KLQotLyogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGdwcl9mcmVlIG9uIHRoZSByZXR1cm5lZCB2YWx1ZS4gTWF5IHJldHVybgotICAgTlVMTCBvbiBpbnZhbGlkIGlucHV0LiBUaGUgc2NvcGUgcGFyYW1ldGVyIG1heSBiZSBOVUxMLiAqLwotY2hhciAqZ3JwY19qd3RfZW5jb2RlX2FuZF9zaWduKGNvbnN0IGdycGNfYXV0aF9qc29uX2tleSAqanNvbl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXVkaWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIHRva2VuX2xpZmV0aW1lLCBjb25zdCBjaGFyICpzY29wZSk7Ci0KLS8qIE92ZXJyaWRlIGVuY29kZV9hbmRfc2lnbiBmdW5jdGlvbiBmb3IgdGVzdGluZy4gKi8KLXR5cGVkZWYgY2hhciAqKCpncnBjX2p3dF9lbmNvZGVfYW5kX3NpZ25fb3ZlcnJpZGUpKAotICAgIGNvbnN0IGdycGNfYXV0aF9qc29uX2tleSAqanNvbl9rZXksIGNvbnN0IGNoYXIgKmF1ZGllbmNlLAotICAgIGdwcl90aW1lc3BlYyB0b2tlbl9saWZldGltZSwgY29uc3QgY2hhciAqc2NvcGUpOwotCi0vKiBTZXQgYSBjdXN0b20gZW5jb2RlX2FuZF9zaWduIG92ZXJyaWRlIGZvciB0ZXN0aW5nLiAqLwotdm9pZCBncnBjX2p3dF9lbmNvZGVfYW5kX3NpZ25fc2V0X292ZXJyaWRlKAotICAgIGdycGNfand0X2VuY29kZV9hbmRfc2lnbl9vdmVycmlkZSBmdW5jKTsKLQotLyogLS0tIGF1dGhfcmVmcmVzaF90b2tlbiBwYXJzaW5nLiAtLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICp0eXBlOwotICBjaGFyICpjbGllbnRfaWQ7Ci0gIGNoYXIgKmNsaWVudF9zZWNyZXQ7Ci0gIGNoYXIgKnJlZnJlc2hfdG9rZW47Ci19IGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuOwotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIG9iamVjdCBpcyB2YWxpZCwgMCBvdGhlcndpc2UuICovCi1pbnQgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW5faXNfdmFsaWQoCi0gICAgY29uc3QgZ3JwY19hdXRoX3JlZnJlc2hfdG9rZW4gKnJlZnJlc2hfdG9rZW4pOwotCi0vKiBDcmVhdGVzIGEgcmVmcmVzaCB0b2tlbiBvYmplY3QgZnJvbSBzdHJpbmcuIFJldHVybnMgYW4gaW52YWxpZCBvYmplY3QgaWYgYQotICAgcGFyc2luZyBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZC4gKi8KLWdycGNfYXV0aF9yZWZyZXNoX3Rva2VuIGdycGNfYXV0aF9yZWZyZXNoX3Rva2VuX2NyZWF0ZV9mcm9tX3N0cmluZygKLSAgICBjb25zdCBjaGFyICpqc29uX3N0cmluZyk7Ci0KLS8qIENyZWF0ZXMgYSByZWZyZXNoIHRva2VuIG9iamVjdCBmcm9tIHBhcnNlZCBqc29uLiBSZXR1cm5zIGFuIGludmFsaWQgb2JqZWN0IGlmCi0gICBhIHBhcnNpbmcgZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQuICovCi1ncnBjX2F1dGhfcmVmcmVzaF90b2tlbiBncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9jcmVhdGVfZnJvbV9qc29uKAotICAgIGNvbnN0IGdycGNfanNvbiAqanNvbik7Ci0KLS8qIERlc3RydWN0cyB0aGUgb2JqZWN0LiAqLwotdm9pZCBncnBjX2F1dGhfcmVmcmVzaF90b2tlbl9kZXN0cnVjdChncnBjX2F1dGhfcmVmcmVzaF90b2tlbiAqcmVmcmVzaF90b2tlbik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU0VDVVJJVFlfSlNPTl9UT0tFTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyBiL3NyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI4ZTA1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5jCisrKyAvZGV2L251bGwKQEAgLTEsODQzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL3NzbF90eXBlcy5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KLQotLyogLS0tIFV0aWxzLiAtLS0gKi8KLQotY29uc3QgY2hhciAqZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzX3RvX3N0cmluZygKLSAgICBncnBjX2p3dF92ZXJpZmllcl9zdGF0dXMgc3RhdHVzKSB7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBHUlBDX0pXVF9WRVJJRklFUl9PSzoKLSAgICAgIHJldHVybiAiT0siOwotICAgIGNhc2UgR1JQQ19KV1RfVkVSSUZJRVJfQkFEX1NJR05BVFVSRToKLSAgICAgIHJldHVybiAiQkFEX1NJR05BVFVSRSI7Ci0gICAgY2FzZSBHUlBDX0pXVF9WRVJJRklFUl9CQURfRk9STUFUOgotICAgICAgcmV0dXJuICJCQURfRk9STUFUIjsKLSAgICBjYXNlIEdSUENfSldUX1ZFUklGSUVSX0JBRF9BVURJRU5DRToKLSAgICAgIHJldHVybiAiQkFEX0FVRElFTkNFIjsKLSAgICBjYXNlIEdSUENfSldUX1ZFUklGSUVSX0tFWV9SRVRSSUVWQUxfRVJST1I6Ci0gICAgICByZXR1cm4gIktFWV9SRVRSSUVWQUxfRVJST1IiOwotICAgIGNhc2UgR1JQQ19KV1RfVkVSSUZJRVJfVElNRV9DT05TVFJBSU5UX0ZBSUxVUkU6Ci0gICAgICByZXR1cm4gIlRJTUVfQ09OU1RSQUlOVF9GQUlMVVJFIjsKLSAgICBjYXNlIEdSUENfSldUX1ZFUklGSUVSX0dFTkVSSUNfRVJST1I6Ci0gICAgICByZXR1cm4gIkdFTkVSSUNfRVJST1IiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04iOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBFVlBfTUQgKmV2cF9tZF9mcm9tX2FsZyhjb25zdCBjaGFyICphbGcpIHsKLSAgaWYgKHN0cmNtcChhbGcsICJSUzI1NiIpID09IDApIHsKLSAgICByZXR1cm4gRVZQX3NoYTI1NigpOwotICB9IGVsc2UgaWYgKHN0cmNtcChhbGcsICJSUzM4NCIpID09IDApIHsKLSAgICByZXR1cm4gRVZQX3NoYTM4NCgpOwotICB9IGVsc2UgaWYgKHN0cmNtcChhbGcsICJSUzUxMiIpID09IDApIHsKLSAgICByZXR1cm4gRVZQX3NoYTUxMigpOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyBncnBjX2pzb24gKnBhcnNlX2pzb25fcGFydF9mcm9tX2p3dChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpidWZmZXIpIHsKLSAgZ3JwY19qc29uICpqc29uOwotCi0gICpidWZmZXIgPSBncnBjX2Jhc2U2NF9kZWNvZGVfd2l0aF9sZW4oc3RyLCBsZW4sIDEpOwotICBpZiAoR1BSX1NMSUNFX0lTX0VNUFRZKCpidWZmZXIpKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGJhc2U2NC4iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbigoY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoKmJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoKmJ1ZmZlcikpOwotICBpZiAoanNvbiA9PSBOVUxMKSB7Ci0gICAgZ3ByX3NsaWNlX3VucmVmKCpidWZmZXIpOwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSlNPTiBwYXJzaW5nIGVycm9yLiIpOwotICB9Ci0gIHJldHVybiBqc29uOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdmFsaWRhdGVfc3RyaW5nX2ZpZWxkKGNvbnN0IGdycGNfanNvbiAqanNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5KSB7Ci0gIGlmIChqc29uLT50eXBlICE9IEdSUENfSlNPTl9TVFJJTkcpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgJXMgZmllbGQgWyVzXSIsIGtleSwganNvbi0+dmFsdWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBqc29uLT52YWx1ZTsKLX0KLQotc3RhdGljIGdwcl90aW1lc3BlYyB2YWxpZGF0ZV90aW1lX2ZpZWxkKGNvbnN0IGdycGNfanNvbiAqanNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXkpIHsKLSAgZ3ByX3RpbWVzcGVjIHJlc3VsdCA9IGdwcl90aW1lXzAoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgaWYgKGpzb24tPnR5cGUgIT0gR1JQQ19KU09OX05VTUJFUikgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCAlcyBmaWVsZCBbJXNdIiwga2V5LCBqc29uLT52YWx1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICByZXN1bHQudHZfc2VjID0gc3RydG9sKGpzb24tPnZhbHVlLCBOVUxMLCAxMCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIC0tLSBKT1NFIGhlYWRlci4gc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUjc2VjdGlvbi00IC0tLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKmFsZzsKLSAgY29uc3QgY2hhciAqa2lkOwotICBjb25zdCBjaGFyICp0eXA7Ci0gIC8qIFRPRE8oamJvZXVmKTogQWRkIG90aGVycyBhcyBuZWVkZWQgKGprdSwgandrLCB4NXUsIHg1YyBhbmQgc28gb24uLi4pLiAqLwotICBncHJfc2xpY2UgYnVmZmVyOwotfSBqb3NlX2hlYWRlcjsKLQotc3RhdGljIHZvaWQgam9zZV9oZWFkZXJfZGVzdHJveShqb3NlX2hlYWRlciAqaCkgewotICBncHJfc2xpY2VfdW5yZWYoaC0+YnVmZmVyKTsKLSAgZ3ByX2ZyZWUoaCk7Ci19Ci0KLS8qIFRha2VzIG93bmVyc2hpcCBvZiBqc29uIGFuZCBidWZmZXIuICovCi1zdGF0aWMgam9zZV9oZWFkZXIgKmpvc2VfaGVhZGVyX2Zyb21fanNvbihncnBjX2pzb24gKmpzb24sIGdwcl9zbGljZSBidWZmZXIpIHsKLSAgZ3JwY19qc29uICpjdXI7Ci0gIGpvc2VfaGVhZGVyICpoID0gZ3ByX21hbGxvYyhzaXplb2Yoam9zZV9oZWFkZXIpKTsKLSAgbWVtc2V0KGgsIDAsIHNpemVvZihqb3NlX2hlYWRlcikpOwotICBoLT5idWZmZXIgPSBidWZmZXI7Ci0gIGZvciAoY3VyID0ganNvbi0+Y2hpbGQ7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKLSAgICBpZiAoc3RyY21wKGN1ci0+a2V5LCAiYWxnIikgPT0gMCkgewotICAgICAgLyogV2Ugb25seSBzdXBwb3J0IFJTQS0xLjUgc2lnbmF0dXJlcyBmb3Igbm93LgotICAgICAgICAgQmV3YXJlIG9mIHRoaXMgaWYgd2UgYWRkIEhNQUMgc3VwcG9ydDoKLSAgICAgICAgIGh0dHBzOi8vYXV0aDAuY29tL2Jsb2cvMjAxNS8wMy8zMS9jcml0aWNhbC12dWxuZXJhYmlsaXRpZXMtaW4tanNvbi13ZWItdG9rZW4tbGlicmFyaWVzLwotICAgICAgICovCi0gICAgICBpZiAoY3VyLT50eXBlICE9IEdSUENfSlNPTl9TVFJJTkcgfHwgc3RybmNtcChjdXItPnZhbHVlLCAiUlMiLCAyKSB8fAotICAgICAgICAgIGV2cF9tZF9mcm9tX2FsZyhjdXItPnZhbHVlKSA9PSBOVUxMKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBhbGcgZmllbGQgWyVzXSIsIGN1ci0+dmFsdWUpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgICAgfQotICAgICAgaC0+YWxnID0gY3VyLT52YWx1ZTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChjdXItPmtleSwgInR5cCIpID09IDApIHsKLSAgICAgIGgtPnR5cCA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJ0eXAiKTsKLSAgICAgIGlmIChoLT50eXAgPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChjdXItPmtleSwgImtpZCIpID09IDApIHsKLSAgICAgIGgtPmtpZCA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJraWQiKTsKLSAgICAgIGlmIChoLT5raWQgPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgICB9Ci0gIH0KLSAgaWYgKGgtPmFsZyA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIGFsZyBmaWVsZC4iKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIGdycGNfanNvbl9kZXN0cm95KGpzb24pOwotICBoLT5idWZmZXIgPSBidWZmZXI7Ci0gIHJldHVybiBoOwotCi1lcnJvcjoKLSAgZ3JwY19qc29uX2Rlc3Ryb3koanNvbik7Ci0gIGpvc2VfaGVhZGVyX2Rlc3Ryb3koaCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiAtLS0gSldUIGNsYWltcy4gc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEgKi8KLQotc3RydWN0IGdycGNfand0X2NsYWltcyB7Ci0gIC8qIFdlbGwga25vd24gcHJvcGVydGllcyBhbHJlYWR5IHBhcnNlZC4gKi8KLSAgY29uc3QgY2hhciAqc3ViOwotICBjb25zdCBjaGFyICppc3M7Ci0gIGNvbnN0IGNoYXIgKmF1ZDsKLSAgY29uc3QgY2hhciAqanRpOwotICBncHJfdGltZXNwZWMgaWF0OwotICBncHJfdGltZXNwZWMgZXhwOwotICBncHJfdGltZXNwZWMgbmJmOwotCi0gIGdycGNfanNvbiAqanNvbjsKLSAgZ3ByX3NsaWNlIGJ1ZmZlcjsKLX07Ci0KLXZvaWQgZ3JwY19qd3RfY2xhaW1zX2Rlc3Ryb3koZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKLSAgZ3JwY19qc29uX2Rlc3Ryb3koY2xhaW1zLT5qc29uKTsKLSAgZ3ByX3NsaWNlX3VucmVmKGNsYWltcy0+YnVmZmVyKTsKLSAgZ3ByX2ZyZWUoY2xhaW1zKTsKLX0KLQotY29uc3QgZ3JwY19qc29uICpncnBjX2p3dF9jbGFpbXNfanNvbihjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcykgewotICBpZiAoY2xhaW1zID09IE5VTEwpIHJldHVybiBOVUxMOwotICByZXR1cm4gY2xhaW1zLT5qc29uOwotfQotCi1jb25zdCBjaGFyICpncnBjX2p3dF9jbGFpbXNfc3ViamVjdChjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcykgewotICBpZiAoY2xhaW1zID09IE5VTEwpIHJldHVybiBOVUxMOwotICByZXR1cm4gY2xhaW1zLT5zdWI7Ci19Ci0KLWNvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19pc3N1ZXIoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKLSAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGNsYWltcy0+aXNzOwotfQotCi1jb25zdCBjaGFyICpncnBjX2p3dF9jbGFpbXNfaWQoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKLSAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGNsYWltcy0+anRpOwotfQotCi1jb25zdCBjaGFyICpncnBjX2p3dF9jbGFpbXNfYXVkaWVuY2UoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKLSAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGNsYWltcy0+YXVkOwotfQotCi1ncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2lzc3VlZF9hdChjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcykgewotICBpZiAoY2xhaW1zID09IE5VTEwpIHJldHVybiBncHJfaW5mX3Bhc3QoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgcmV0dXJuIGNsYWltcy0+aWF0OwotfQotCi1ncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2V4cGlyZXNfYXQoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKLSAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgcmV0dXJuIGNsYWltcy0+ZXhwOwotfQotCi1ncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX25vdF9iZWZvcmUoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpIHsKLSAgaWYgKGNsYWltcyA9PSBOVUxMKSByZXR1cm4gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gIHJldHVybiBjbGFpbXMtPm5iZjsKLX0KLQotLyogVGFrZXMgb3duZXJzaGlwIG9mIGpzb24gYW5kIGJ1ZmZlciBldmVuIGluIGNhc2Ugb2YgZmFpbHVyZS4gKi8KLWdycGNfand0X2NsYWltcyAqZ3JwY19qd3RfY2xhaW1zX2Zyb21fanNvbihncnBjX2pzb24gKmpzb24sIGdwcl9zbGljZSBidWZmZXIpIHsKLSAgZ3JwY19qc29uICpjdXI7Ci0gIGdycGNfand0X2NsYWltcyAqY2xhaW1zID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19qd3RfY2xhaW1zKSk7Ci0gIG1lbXNldChjbGFpbXMsIDAsIHNpemVvZihncnBjX2p3dF9jbGFpbXMpKTsKLSAgY2xhaW1zLT5qc29uID0ganNvbjsKLSAgY2xhaW1zLT5idWZmZXIgPSBidWZmZXI7Ci0gIGNsYWltcy0+aWF0ID0gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gIGNsYWltcy0+bmJmID0gZ3ByX2luZl9wYXN0KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gIGNsYWltcy0+ZXhwID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLQotICAvKiBQZXIgdGhlIHNwZWMsIGFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiAqLwotICBmb3IgKGN1ciA9IGpzb24tPmNoaWxkOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7Ci0gICAgaWYgKHN0cmNtcChjdXItPmtleSwgInN1YiIpID09IDApIHsKLSAgICAgIGNsYWltcy0+c3ViID0gdmFsaWRhdGVfc3RyaW5nX2ZpZWxkKGN1ciwgInN1YiIpOwotICAgICAgaWYgKGNsYWltcy0+c3ViID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJpc3MiKSA9PSAwKSB7Ci0gICAgICBjbGFpbXMtPmlzcyA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJpc3MiKTsKLSAgICAgIGlmIChjbGFpbXMtPmlzcyA9PSBOVUxMKSBnb3RvIGVycm9yOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKGN1ci0+a2V5LCAiYXVkIikgPT0gMCkgewotICAgICAgY2xhaW1zLT5hdWQgPSB2YWxpZGF0ZV9zdHJpbmdfZmllbGQoY3VyLCAiYXVkIik7Ci0gICAgICBpZiAoY2xhaW1zLT5hdWQgPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChjdXItPmtleSwgImp0aSIpID09IDApIHsKLSAgICAgIGNsYWltcy0+anRpID0gdmFsaWRhdGVfc3RyaW5nX2ZpZWxkKGN1ciwgImp0aSIpOwotICAgICAgaWYgKGNsYWltcy0+anRpID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJpYXQiKSA9PSAwKSB7Ci0gICAgICBjbGFpbXMtPmlhdCA9IHZhbGlkYXRlX3RpbWVfZmllbGQoY3VyLCAiaWF0Iik7Ci0gICAgICBpZiAoZ3ByX3RpbWVfY21wKGNsYWltcy0+aWF0LCBncHJfdGltZV8wKEdQUl9DTE9DS19SRUFMVElNRSkpID09IDApCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJleHAiKSA9PSAwKSB7Ci0gICAgICBjbGFpbXMtPmV4cCA9IHZhbGlkYXRlX3RpbWVfZmllbGQoY3VyLCAiZXhwIik7Ci0gICAgICBpZiAoZ3ByX3RpbWVfY21wKGNsYWltcy0+ZXhwLCBncHJfdGltZV8wKEdQUl9DTE9DS19SRUFMVElNRSkpID09IDApCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoY3VyLT5rZXksICJuYmYiKSA9PSAwKSB7Ci0gICAgICBjbGFpbXMtPm5iZiA9IHZhbGlkYXRlX3RpbWVfZmllbGQoY3VyLCAibmJmIik7Ci0gICAgICBpZiAoZ3ByX3RpbWVfY21wKGNsYWltcy0+bmJmLCBncHJfdGltZV8wKEdQUl9DTE9DS19SRUFMVElNRSkpID09IDApCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjbGFpbXM7Ci0KLWVycm9yOgotICBncnBjX2p3dF9jbGFpbXNfZGVzdHJveShjbGFpbXMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzIGdycGNfand0X2NsYWltc19jaGVjayhjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXVkaWVuY2UpIHsKLSAgZ3ByX3RpbWVzcGVjIHNrZXdlZF9ub3c7Ci0gIGludCBhdWRpZW5jZV9vazsKLQotICBHUFJfQVNTRVJUKGNsYWltcyAhPSBOVUxMKTsKLQotICBza2V3ZWRfbm93ID0KLSAgICAgIGdwcl90aW1lX2FkZChncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGdycGNfand0X3ZlcmlmaWVyX2Nsb2NrX3NrZXcpOwotICBpZiAoZ3ByX3RpbWVfY21wKHNrZXdlZF9ub3csIGNsYWltcy0+bmJmKSA8IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkpXVCBpcyBub3QgdmFsaWQgeWV0LiIpOwotICAgIHJldHVybiBHUlBDX0pXVF9WRVJJRklFUl9USU1FX0NPTlNUUkFJTlRfRkFJTFVSRTsKLSAgfQotICBza2V3ZWRfbm93ID0KLSAgICAgIGdwcl90aW1lX3N1YihncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIGdycGNfand0X3ZlcmlmaWVyX2Nsb2NrX3NrZXcpOwotICBpZiAoZ3ByX3RpbWVfY21wKHNrZXdlZF9ub3csIGNsYWltcy0+ZXhwKSA+IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkpXVCBpcyBleHBpcmVkLiIpOwotICAgIHJldHVybiBHUlBDX0pXVF9WRVJJRklFUl9USU1FX0NPTlNUUkFJTlRfRkFJTFVSRTsKLSAgfQotCi0gIGlmIChhdWRpZW5jZSA9PSBOVUxMKSB7Ci0gICAgYXVkaWVuY2Vfb2sgPSBjbGFpbXMtPmF1ZCA9PSBOVUxMOwotICB9IGVsc2UgewotICAgIGF1ZGllbmNlX29rID0gY2xhaW1zLT5hdWQgIT0gTlVMTCAmJiBzdHJjbXAoYXVkaWVuY2UsIGNsYWltcy0+YXVkKSA9PSAwOwotICB9Ci0gIGlmICghYXVkaWVuY2Vfb2spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkF1ZGllbmNlIG1pc21hdGNoOiBleHBlY3RlZCAlcyBhbmQgZm91bmQgJXMuIiwKLSAgICAgICAgICAgIGF1ZGllbmNlID09IE5VTEwgPyAiTlVMTCIgOiBhdWRpZW5jZSwKLSAgICAgICAgICAgIGNsYWltcy0+YXVkID09IE5VTEwgPyAiTlVMTCIgOiBjbGFpbXMtPmF1ZCk7Ci0gICAgcmV0dXJuIEdSUENfSldUX1ZFUklGSUVSX0JBRF9BVURJRU5DRTsKLSAgfQotICByZXR1cm4gR1JQQ19KV1RfVkVSSUZJRVJfT0s7Ci19Ci0KLS8qIC0tLSB2ZXJpZmllcl9jYl9jdHggb2JqZWN0LiAtLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2p3dF92ZXJpZmllciAqdmVyaWZpZXI7Ci0gIGdycGNfcG9sbHNldCAqcG9sbHNldDsKLSAgam9zZV9oZWFkZXIgKmhlYWRlcjsKLSAgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXM7Ci0gIGNoYXIgKmF1ZGllbmNlOwotICBncHJfc2xpY2Ugc2lnbmF0dXJlOwotICBncHJfc2xpY2Ugc2lnbmVkX2RhdGE7Ci0gIHZvaWQgKnVzZXJfZGF0YTsKLSAgZ3JwY19qd3RfdmVyaWZpY2F0aW9uX2RvbmVfY2IgdXNlcl9jYjsKLX0gdmVyaWZpZXJfY2JfY3R4OwotCi0vKiBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIGhlYWRlciwgY2xhaW1zIGFuZCBzaWduYXR1cmUuICovCi1zdGF0aWMgdmVyaWZpZXJfY2JfY3R4ICp2ZXJpZmllcl9jYl9jdHhfY3JlYXRlKAotICAgIGdycGNfand0X3ZlcmlmaWVyICp2ZXJpZmllciwgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBqb3NlX2hlYWRlciAqaGVhZGVyLAotICAgIGdycGNfand0X2NsYWltcyAqY2xhaW1zLCBjb25zdCBjaGFyICphdWRpZW5jZSwgZ3ByX3NsaWNlIHNpZ25hdHVyZSwKLSAgICBjb25zdCBjaGFyICpzaWduZWRfand0LCBzaXplX3Qgc2lnbmVkX2p3dF9sZW4sIHZvaWQgKnVzZXJfZGF0YSwKLSAgICBncnBjX2p3dF92ZXJpZmljYXRpb25fZG9uZV9jYiBjYikgewotICB2ZXJpZmllcl9jYl9jdHggKmN0eCA9IGdwcl9tYWxsb2Moc2l6ZW9mKHZlcmlmaWVyX2NiX2N0eCkpOwotICBtZW1zZXQoY3R4LCAwLCBzaXplb2YodmVyaWZpZXJfY2JfY3R4KSk7Ci0gIGN0eC0+dmVyaWZpZXIgPSB2ZXJpZmllcjsKLSAgY3R4LT5wb2xsc2V0ID0gcG9sbHNldDsKLSAgY3R4LT5oZWFkZXIgPSBoZWFkZXI7Ci0gIGN0eC0+YXVkaWVuY2UgPSBncHJfc3RyZHVwKGF1ZGllbmNlKTsKLSAgY3R4LT5jbGFpbXMgPSBjbGFpbXM7Ci0gIGN0eC0+c2lnbmF0dXJlID0gc2lnbmF0dXJlOwotICBjdHgtPnNpZ25lZF9kYXRhID0gZ3ByX3NsaWNlX2Zyb21fY29waWVkX2J1ZmZlcihzaWduZWRfand0LCBzaWduZWRfand0X2xlbik7Ci0gIGN0eC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOwotICBjdHgtPnVzZXJfY2IgPSBjYjsKLSAgcmV0dXJuIGN0eDsKLX0KLQotdm9pZCB2ZXJpZmllcl9jYl9jdHhfZGVzdHJveSh2ZXJpZmllcl9jYl9jdHggKmN0eCkgewotICBpZiAoY3R4LT5hdWRpZW5jZSAhPSBOVUxMKSBncHJfZnJlZShjdHgtPmF1ZGllbmNlKTsKLSAgaWYgKGN0eC0+Y2xhaW1zICE9IE5VTEwpIGdycGNfand0X2NsYWltc19kZXN0cm95KGN0eC0+Y2xhaW1zKTsKLSAgZ3ByX3NsaWNlX3VucmVmKGN0eC0+c2lnbmF0dXJlKTsKLSAgZ3ByX3NsaWNlX3VucmVmKGN0eC0+c2lnbmVkX2RhdGEpOwotICBqb3NlX2hlYWRlcl9kZXN0cm95KGN0eC0+aGVhZGVyKTsKLSAgLyogVE9ETzogc2VlIHdoYXQgdG8gZG8gd2l0aCBjbGFpbXMuLi4gKi8KLSAgZ3ByX2ZyZWUoY3R4KTsKLX0KLQotLyogLS0tIGdycGNfand0X3ZlcmlmaWVyIG9iamVjdC4gLS0tICovCi0KLS8qIENsb2NrIHNrZXcgZGVmYXVsdHMgdG8gb25lIG1pbnV0ZS4gKi8KLWdwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9jbG9ja19za2V3ID0gezYwLCAwLCBHUFJfVElNRVNQQU59OwotCi0vKiBNYXggZGVsYXkgZGVmYXVsdHMgdG8gb25lIG1pbnV0ZS4gKi8KLWdwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9tYXhfZGVsYXkgPSB7NjAsIDAsIEdQUl9USU1FU1BBTn07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqZW1haWxfZG9tYWluOwotICBjaGFyICprZXlfdXJsX3ByZWZpeDsKLX0gZW1haWxfa2V5X21hcHBpbmc7Ci0KLXN0cnVjdCBncnBjX2p3dF92ZXJpZmllciB7Ci0gIGVtYWlsX2tleV9tYXBwaW5nICptYXBwaW5nczsKLSAgc2l6ZV90IG51bV9tYXBwaW5nczsgLyogU2hvdWxkIGJlIHZlcnkgZmV3LCBsaW5lYXIgc2VhcmNoIG9rLiAqLwotICBzaXplX3QgYWxsb2NhdGVkX21hcHBpbmdzOwotICBncnBjX2h0dHBjbGlfY29udGV4dCBodHRwX2N0eDsKLX07Ci0KLXN0YXRpYyBncnBjX2pzb24gKmpzb25fZnJvbV9odHRwKGNvbnN0IGdycGNfaHR0cGNsaV9yZXNwb25zZSAqcmVzcG9uc2UpIHsKLSAgZ3JwY19qc29uICpqc29uID0gTlVMTDsKLQotICBpZiAocmVzcG9uc2UgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSFRUUCByZXNwb25zZSBpcyBOVUxMLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmIChyZXNwb25zZS0+c3RhdHVzICE9IDIwMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2FsbCB0byBodHRwIHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciAlZC4iLAotICAgICAgICAgICAgcmVzcG9uc2UtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBqc29uID0gZ3JwY19qc29uX3BhcnNlX3N0cmluZ193aXRoX2xlbihyZXNwb25zZS0+Ym9keSwgcmVzcG9uc2UtPmJvZHlfbGVuZ3RoKTsKLSAgaWYgKGpzb24gPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBKU09OIGZvdW5kIGluIHJlc3BvbnNlLiIpOwotICB9Ci0gIHJldHVybiBqc29uOwotfQotCi1zdGF0aWMgY29uc3QgZ3JwY19qc29uICpmaW5kX3Byb3BlcnR5X2J5X25hbWUoY29uc3QgZ3JwY19qc29uICpqc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgY29uc3QgZ3JwY19qc29uICpjdXI7Ci0gIGZvciAoY3VyID0ganNvbi0+Y2hpbGQ7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKLSAgICBpZiAoc3RyY21wKGN1ci0+a2V5LCBuYW1lKSA9PSAwKSByZXR1cm4gY3VyOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgRVZQX1BLRVkgKmV4dHJhY3RfcGtleV9mcm9tX3g1MDkoY29uc3QgY2hhciAqeDUwOV9zdHIpIHsKLSAgWDUwOSAqeDUwOSA9IE5VTEw7Ci0gIEVWUF9QS0VZICpyZXN1bHQgPSBOVUxMOwotICBCSU8gKmJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOwotICBzaXplX3QgbGVuID0gc3RybGVuKHg1MDlfc3RyKTsKLSAgR1BSX0FTU0VSVChsZW4gPCBJTlRfTUFYKTsKLSAgQklPX3dyaXRlKGJpbywgeDUwOV9zdHIsIChpbnQpbGVuKTsKLSAgeDUwOSA9IFBFTV9yZWFkX2Jpb19YNTA5KGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIGlmICh4NTA5ID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSB4NTA5IGNlcnQuIik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLSAgcmVzdWx0ID0gWDUwOV9nZXRfcHVia2V5KHg1MDkpOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNhbm5vdCBmaW5kIHB1YmxpYyBrZXkgaW4gWDUwOSBjZXJ0LiIpOwotICB9Ci0KLWVuZDoKLSAgQklPX2ZyZWUoYmlvKTsKLSAgaWYgKHg1MDkgIT0gTlVMTCkgWDUwOV9mcmVlKHg1MDkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgQklHTlVNICpiaWdudW1fZnJvbV9iYXNlNjQoY29uc3QgY2hhciAqYjY0KSB7Ci0gIEJJR05VTSAqcmVzdWx0ID0gTlVMTDsKLSAgZ3ByX3NsaWNlIGJpbjsKLQotICBpZiAoYjY0ID09IE5VTEwpIHJldHVybiBOVUxMOwotICBiaW4gPSBncnBjX2Jhc2U2NF9kZWNvZGUoYjY0LCAxKTsKLSAgaWYgKEdQUl9TTElDRV9JU19FTVBUWShiaW4pKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGJhc2U2NCBmb3IgYmlnIG51bS4iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXN1bHQgPSBCTl9iaW4yYm4oR1BSX1NMSUNFX1NUQVJUX1BUUihiaW4pLAotICAgICAgICAgICAgICAgICAgICAgVFNJX1NJWkVfQVNfU0laRShHUFJfU0xJQ0VfTEVOR1RIKGJpbikpLCBOVUxMKTsKLSAgZ3ByX3NsaWNlX3VucmVmKGJpbik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBFVlBfUEtFWSAqcGtleV9mcm9tX2p3ayhjb25zdCBncnBjX2pzb24gKmpzb24sIGNvbnN0IGNoYXIgKmt0eSkgewotICBjb25zdCBncnBjX2pzb24gKmtleV9wcm9wOwotICBSU0EgKnJzYSA9IE5VTEw7Ci0gIEVWUF9QS0VZICpyZXN1bHQgPSBOVUxMOwotCi0gIEdQUl9BU1NFUlQoa3R5ICE9IE5VTEwgJiYganNvbiAhPSBOVUxMKTsKLSAgaWYgKHN0cmNtcChrdHksICJSU0EiKSAhPSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbnN1cHBvcnRlZCBrZXkgdHlwZSAlcy4iLCBrdHkpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIHJzYSA9IFJTQV9uZXcoKTsKLSAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIHJzYSBrZXkuIik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLSAgZm9yIChrZXlfcHJvcCA9IGpzb24tPmNoaWxkOyBrZXlfcHJvcCAhPSBOVUxMOyBrZXlfcHJvcCA9IGtleV9wcm9wLT5uZXh0KSB7Ci0gICAgaWYgKHN0cmNtcChrZXlfcHJvcC0+a2V5LCAibiIpID09IDApIHsKLSAgICAgIHJzYS0+biA9IGJpZ251bV9mcm9tX2Jhc2U2NCh2YWxpZGF0ZV9zdHJpbmdfZmllbGQoa2V5X3Byb3AsICJuIikpOwotICAgICAgaWYgKHJzYS0+biA9PSBOVUxMKSBnb3RvIGVuZDsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChrZXlfcHJvcC0+a2V5LCAiZSIpID09IDApIHsKLSAgICAgIHJzYS0+ZSA9IGJpZ251bV9mcm9tX2Jhc2U2NCh2YWxpZGF0ZV9zdHJpbmdfZmllbGQoa2V5X3Byb3AsICJlIikpOwotICAgICAgaWYgKHJzYS0+ZSA9PSBOVUxMKSBnb3RvIGVuZDsKLSAgICB9Ci0gIH0KLSAgaWYgKHJzYS0+ZSA9PSBOVUxMIHx8IHJzYS0+biA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIFJTQSBwdWJsaWMga2V5IGZpZWxkLiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIHJlc3VsdCA9IEVWUF9QS0VZX25ldygpOwotICBFVlBfUEtFWV9zZXQxX1JTQShyZXN1bHQsIHJzYSk7IC8qIHVwcmVmcyByc2EuICovCi0KLWVuZDoKLSAgaWYgKHJzYSAhPSBOVUxMKSBSU0FfZnJlZShyc2EpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgRVZQX1BLRVkgKmZpbmRfdmVyaWZpY2F0aW9uX2tleShjb25zdCBncnBjX2pzb24gKmpzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWFkZXJfYWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVhZGVyX2tpZCkgewotICBjb25zdCBncnBjX2pzb24gKmprZXk7Ci0gIGNvbnN0IGdycGNfanNvbiAqandrX2tleXM7Ci0gIC8qIFRyeSB0byBwYXJzZSB0aGUganNvbiBhcyBhIEpXSyBzZXQ6Ci0gICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE3I3NlY3Rpb24tNS4gKi8KLSAgandrX2tleXMgPSBmaW5kX3Byb3BlcnR5X2J5X25hbWUoanNvbiwgImtleXMiKTsKLSAgaWYgKGp3a19rZXlzID09IE5VTEwpIHsKLSAgICAvKiBVc2UgdGhlIGdvb2dsZSBwcm9wcmlldGFyeSBmb3JtYXQgd2hpY2ggaXM6Ci0gICAgICAgeyA8a2lkMT46IDx4NTA5MT4sIDxraWQyPjogPHg1MDkyPiwgLi4uIH0gKi8KLSAgICBjb25zdCBncnBjX2pzb24gKmN1ciA9IGZpbmRfcHJvcGVydHlfYnlfbmFtZShqc29uLCBoZWFkZXJfa2lkKTsKLSAgICBpZiAoY3VyID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIHJldHVybiBleHRyYWN0X3BrZXlfZnJvbV94NTA5KGN1ci0+dmFsdWUpOwotICB9Ci0KLSAgaWYgKGp3a19rZXlzLT50eXBlICE9IEdSUENfSlNPTl9BUlJBWSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZSBvZiBrZXlzIHByb3BlcnR5IGluIGp3a3Mga2V5IHNldC4iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAvKiBLZXkgZm9ybWF0IGlzIHNwZWNpZmllZCBpbjoKLSAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTgjc2VjdGlvbi02LiAqLwotICBmb3IgKGprZXkgPSBqd2tfa2V5cy0+Y2hpbGQ7IGprZXkgIT0gTlVMTDsgamtleSA9IGprZXktPm5leHQpIHsKLSAgICBncnBjX2pzb24gKmtleV9wcm9wOwotICAgIGNvbnN0IGNoYXIgKmFsZyA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqa2lkID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICprdHkgPSBOVUxMOwotCi0gICAgaWYgKGprZXktPnR5cGUgIT0gR1JQQ19KU09OX09CSkVDVCkgY29udGludWU7Ci0gICAgZm9yIChrZXlfcHJvcCA9IGprZXktPmNoaWxkOyBrZXlfcHJvcCAhPSBOVUxMOyBrZXlfcHJvcCA9IGtleV9wcm9wLT5uZXh0KSB7Ci0gICAgICBpZiAoc3RyY21wKGtleV9wcm9wLT5rZXksICJhbGciKSA9PSAwICYmCi0gICAgICAgICAga2V5X3Byb3AtPnR5cGUgPT0gR1JQQ19KU09OX1NUUklORykgewotICAgICAgICBhbGcgPSBrZXlfcHJvcC0+dmFsdWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChrZXlfcHJvcC0+a2V5LCAia2lkIikgPT0gMCAmJgotICAgICAgICAgICAgICAgICBrZXlfcHJvcC0+dHlwZSA9PSBHUlBDX0pTT05fU1RSSU5HKSB7Ci0gICAgICAgIGtpZCA9IGtleV9wcm9wLT52YWx1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGtleV9wcm9wLT5rZXksICJrdHkiKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgIGtleV9wcm9wLT50eXBlID09IEdSUENfSlNPTl9TVFJJTkcpIHsKLSAgICAgICAga3R5ID0ga2V5X3Byb3AtPnZhbHVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoYWxnICE9IE5VTEwgJiYga2lkICE9IE5VTEwgJiYga3R5ICE9IE5VTEwgJiYKLSAgICAgICAgc3RyY21wKGtpZCwgaGVhZGVyX2tpZCkgPT0gMCAmJiBzdHJjbXAoYWxnLCBoZWFkZXJfYWxnKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gcGtleV9mcm9tX2p3ayhqa2V5LCBrdHkpOwotICAgIH0KLSAgfQotICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcga2V5IGluIGtleSBzZXQgZm9yIGtpZD0lcyBhbmQgYWxnPSVzIiwKLSAgICAgICAgICBoZWFkZXJfa2lkLCBoZWFkZXJfYWxnKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X2p3dF9zaWduYXR1cmUoRVZQX1BLRVkgKmtleSwgY29uc3QgY2hhciAqYWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Ugc2lnbmF0dXJlLCBncHJfc2xpY2Ugc2lnbmVkX2RhdGEpIHsKLSAgRVZQX01EX0NUWCAqbWRfY3R4ID0gRVZQX01EX0NUWF9jcmVhdGUoKTsKLSAgY29uc3QgRVZQX01EICptZCA9IGV2cF9tZF9mcm9tX2FsZyhhbGcpOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICBHUFJfQVNTRVJUKG1kICE9IE5VTEwpOyAvKiBDaGVja2VkIGJlZm9yZS4gKi8KLSAgaWYgKG1kX2N0eCA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIEVWUF9NRF9DVFguIik7Ci0gICAgZ290byBlbmQ7Ci0gIH0KLSAgaWYgKEVWUF9EaWdlc3RWZXJpZnlJbml0KG1kX2N0eCwgTlVMTCwgbWQsIE5VTEwsIGtleSkgIT0gMSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRVZQX0RpZ2VzdFZlcmlmeUluaXQgZmFpbGVkLiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIGlmIChFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlKG1kX2N0eCwgR1BSX1NMSUNFX1NUQVJUX1BUUihzaWduZWRfZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoc2lnbmVkX2RhdGEpKSAhPSAxKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJFVlBfRGlnZXN0VmVyaWZ5VXBkYXRlIGZhaWxlZC4iKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBpZiAoRVZQX0RpZ2VzdFZlcmlmeUZpbmFsKG1kX2N0eCwgR1BSX1NMSUNFX1NUQVJUX1BUUihzaWduYXR1cmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoc2lnbmF0dXJlKSkgIT0gMSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSldUIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLiIpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIHJlc3VsdCA9IDE7Ci0KLWVuZDoKLSAgaWYgKG1kX2N0eCAhPSBOVUxMKSBFVlBfTURfQ1RYX2Rlc3Ryb3kobWRfY3R4KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgb25fa2V5c19yZXRyaWV2ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXNwb25zZSAqcmVzcG9uc2UpIHsKLSAgZ3JwY19qc29uICpqc29uID0ganNvbl9mcm9tX2h0dHAocmVzcG9uc2UpOwotICB2ZXJpZmllcl9jYl9jdHggKmN0eCA9ICh2ZXJpZmllcl9jYl9jdHggKil1c2VyX2RhdGE7Ci0gIEVWUF9QS0VZICp2ZXJpZmljYXRpb25fa2V5ID0gTlVMTDsKLSAgZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzIHN0YXR1cyA9IEdSUENfSldUX1ZFUklGSUVSX0dFTkVSSUNfRVJST1I7Ci0gIGdycGNfand0X2NsYWltcyAqY2xhaW1zID0gTlVMTDsKLQotICBpZiAoanNvbiA9PSBOVUxMKSB7Ci0gICAgc3RhdHVzID0gR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUjsKLSAgICBnb3RvIGVuZDsKLSAgfQotICB2ZXJpZmljYXRpb25fa2V5ID0KLSAgICAgIGZpbmRfdmVyaWZpY2F0aW9uX2tleShqc29uLCBjdHgtPmhlYWRlci0+YWxnLCBjdHgtPmhlYWRlci0+a2lkKTsKLSAgaWYgKHZlcmlmaWNhdGlvbl9rZXkgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgdmVyaWZpY2F0aW9uIGtleSB3aXRoIGtpZCAlcy4iLAotICAgICAgICAgICAgY3R4LT5oZWFkZXItPmtpZCk7Ci0gICAgc3RhdHVzID0gR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUjsKLSAgICBnb3RvIGVuZDsKLSAgfQotCi0gIGlmICghdmVyaWZ5X2p3dF9zaWduYXR1cmUodmVyaWZpY2F0aW9uX2tleSwgY3R4LT5oZWFkZXItPmFsZywgY3R4LT5zaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zaWduZWRfZGF0YSkpIHsKLSAgICBzdGF0dXMgPSBHUlBDX0pXVF9WRVJJRklFUl9CQURfU0lHTkFUVVJFOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLSAgc3RhdHVzID0gZ3JwY19qd3RfY2xhaW1zX2NoZWNrKGN0eC0+Y2xhaW1zLCBjdHgtPmF1ZGllbmNlKTsKLSAgaWYgKHN0YXR1cyA9PSBHUlBDX0pXVF9WRVJJRklFUl9PSykgewotICAgIC8qIFBhc3Mgb3duZXJzaGlwLiAqLwotICAgIGNsYWltcyA9IGN0eC0+Y2xhaW1zOwotICAgIGN0eC0+Y2xhaW1zID0gTlVMTDsKLSAgfQotCi1lbmQ6Ci0gIGlmIChqc29uICE9IE5VTEwpIGdycGNfanNvbl9kZXN0cm95KGpzb24pOwotICBpZiAodmVyaWZpY2F0aW9uX2tleSAhPSBOVUxMKSBFVlBfUEtFWV9mcmVlKHZlcmlmaWNhdGlvbl9rZXkpOwotICBjdHgtPnVzZXJfY2IoY3R4LT51c2VyX2RhdGEsIHN0YXR1cywgY2xhaW1zKTsKLSAgdmVyaWZpZXJfY2JfY3R4X2Rlc3Ryb3koY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgb25fb3BlbmlkX2NvbmZpZ19yZXRyaWV2ZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfaHR0cGNsaV9yZXNwb25zZSAqcmVzcG9uc2UpIHsKLSAgY29uc3QgZ3JwY19qc29uICpjdXI7Ci0gIGdycGNfanNvbiAqanNvbiA9IGpzb25fZnJvbV9odHRwKHJlc3BvbnNlKTsKLSAgdmVyaWZpZXJfY2JfY3R4ICpjdHggPSAodmVyaWZpZXJfY2JfY3R4ICopdXNlcl9kYXRhOwotICBncnBjX2h0dHBjbGlfcmVxdWVzdCByZXE7Ci0gIGNvbnN0IGNoYXIgKmp3a3NfdXJpOwotCi0gIC8qIFRPRE8oamJvZXVmKTogQ2FjaGUgdGhlIGp3a3NfdXJpIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgaG9wIG5leHQgdGltZS4gKi8KLSAgaWYgKGpzb24gPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgY3VyID0gZmluZF9wcm9wZXJ0eV9ieV9uYW1lKGpzb24sICJqd2tzX3VyaSIpOwotICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIGp3a3NfdXJpIGluIG9wZW5pZCBjb25maWcuIik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBqd2tzX3VyaSA9IHZhbGlkYXRlX3N0cmluZ19maWVsZChjdXIsICJqd2tzX3VyaSIpOwotICBpZiAoandrc191cmkgPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgaWYgKHN0cnN0cihqd2tzX3VyaSwgImh0dHBzOi8vIikgIT0gandrc191cmkpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgbm9uIGh0dHBzIGp3a3NfdXJpOiAlcy4iLCBqd2tzX3VyaSk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBqd2tzX3VyaSArPSA4OwotICByZXEuaGFuZHNoYWtlciA9ICZncnBjX2h0dHBjbGlfc3NsOwotICByZXEuaG9zdCA9IGdwcl9zdHJkdXAoandrc191cmkpOwotICByZXEuaHR0cC5wYXRoID0gc3RyY2hyKGp3a3NfdXJpLCAnLycpOwotICBpZiAocmVxLmh0dHAucGF0aCA9PSBOVUxMKSB7Ci0gICAgcmVxLmh0dHAucGF0aCA9ICIiOwotICB9IGVsc2UgewotICAgICoocmVxLmhvc3QgKyAocmVxLmh0dHAucGF0aCAtIGp3a3NfdXJpKSkgPSAnXDAnOwotICB9Ci0gIGdycGNfaHR0cGNsaV9nZXQoCi0gICAgICBleGVjX2N0eCwgJmN0eC0+dmVyaWZpZXItPmh0dHBfY3R4LCBjdHgtPnBvbGxzZXQsICZyZXEsCi0gICAgICBncHJfdGltZV9hZGQoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLCBncnBjX2p3dF92ZXJpZmllcl9tYXhfZGVsYXkpLAotICAgICAgb25fa2V5c19yZXRyaWV2ZWQsIGN0eCk7Ci0gIGdycGNfanNvbl9kZXN0cm95KGpzb24pOwotICBncHJfZnJlZShyZXEuaG9zdCk7Ci0gIHJldHVybjsKLQotZXJyb3I6Ci0gIGlmIChqc29uICE9IE5VTEwpIGdycGNfanNvbl9kZXN0cm95KGpzb24pOwotICBjdHgtPnVzZXJfY2IoY3R4LT51c2VyX2RhdGEsIEdSUENfSldUX1ZFUklGSUVSX0tFWV9SRVRSSUVWQUxfRVJST1IsIE5VTEwpOwotICB2ZXJpZmllcl9jYl9jdHhfZGVzdHJveShjdHgpOwotfQotCi1zdGF0aWMgZW1haWxfa2V5X21hcHBpbmcgKnZlcmlmaWVyX2dldF9tYXBwaW5nKGdycGNfand0X3ZlcmlmaWVyICp2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbWFpbF9kb21haW4pIHsKLSAgc2l6ZV90IGk7Ci0gIGlmICh2LT5tYXBwaW5ncyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IHYtPm51bV9tYXBwaW5nczsgaSsrKSB7Ci0gICAgaWYgKHN0cmNtcChlbWFpbF9kb21haW4sIHYtPm1hcHBpbmdzW2ldLmVtYWlsX2RvbWFpbikgPT0gMCkgewotICAgICAgcmV0dXJuICZ2LT5tYXBwaW5nc1tpXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHZlcmlmaWVyX3B1dF9tYXBwaW5nKGdycGNfand0X3ZlcmlmaWVyICp2LCBjb25zdCBjaGFyICplbWFpbF9kb21haW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlfdXJsX3ByZWZpeCkgewotICBlbWFpbF9rZXlfbWFwcGluZyAqbWFwcGluZyA9IHZlcmlmaWVyX2dldF9tYXBwaW5nKHYsIGVtYWlsX2RvbWFpbik7Ci0gIEdQUl9BU1NFUlQodi0+bnVtX21hcHBpbmdzIDwgdi0+YWxsb2NhdGVkX21hcHBpbmdzKTsKLSAgaWYgKG1hcHBpbmcgIT0gTlVMTCkgewotICAgIGdwcl9mcmVlKG1hcHBpbmctPmtleV91cmxfcHJlZml4KTsKLSAgICBtYXBwaW5nLT5rZXlfdXJsX3ByZWZpeCA9IGdwcl9zdHJkdXAoa2V5X3VybF9wcmVmaXgpOwotICAgIHJldHVybjsKLSAgfQotICB2LT5tYXBwaW5nc1t2LT5udW1fbWFwcGluZ3NdLmVtYWlsX2RvbWFpbiA9IGdwcl9zdHJkdXAoZW1haWxfZG9tYWluKTsKLSAgdi0+bWFwcGluZ3Nbdi0+bnVtX21hcHBpbmdzXS5rZXlfdXJsX3ByZWZpeCA9IGdwcl9zdHJkdXAoa2V5X3VybF9wcmVmaXgpOwotICB2LT5udW1fbWFwcGluZ3MrKzsKLSAgR1BSX0FTU0VSVCh2LT5udW1fbWFwcGluZ3MgPD0gdi0+YWxsb2NhdGVkX21hcHBpbmdzKTsKLX0KLQotLyogVGFrZXMgb3duZXJzaGlwIG9mIGN0eC4gKi8KLXN0YXRpYyB2b2lkIHJldHJpZXZlX2tleV9hbmRfdmVyaWZ5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZXJfY2JfY3R4ICpjdHgpIHsKLSAgY29uc3QgY2hhciAqYXRfc2lnbjsKLSAgZ3JwY19odHRwY2xpX3Jlc3BvbnNlX2NiIGh0dHBfY2I7Ci0gIGNoYXIgKnBhdGhfcHJlZml4ID0gTlVMTDsKLSAgY29uc3QgY2hhciAqaXNzOwotICBncnBjX2h0dHBjbGlfcmVxdWVzdCByZXE7Ci0gIG1lbXNldCgmcmVxLCAwLCBzaXplb2YoZ3JwY19odHRwY2xpX3JlcXVlc3QpKTsKLSAgcmVxLmhhbmRzaGFrZXIgPSAmZ3JwY19odHRwY2xpX3NzbDsKLQotICBHUFJfQVNTRVJUKGN0eCAhPSBOVUxMICYmIGN0eC0+aGVhZGVyICE9IE5VTEwgJiYgY3R4LT5jbGFpbXMgIT0gTlVMTCk7Ci0gIGlzcyA9IGN0eC0+Y2xhaW1zLT5pc3M7Ci0gIGlmIChjdHgtPmhlYWRlci0+a2lkID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3Npbmcga2lkIGluIGpvc2UgaGVhZGVyLiIpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLSAgaWYgKGlzcyA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJNaXNzaW5nIGlzcyBpbiBjbGFpbXMuIik7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIC8qIFRoaXMgY29kZSByZWxpZXMgb246Ci0gICAgIGh0dHBzOi8vb3BlbmlkLm5ldC9zcGVjcy9vcGVuaWQtY29ubmVjdC1kaXNjb3ZlcnktMV8wLmh0bWwKLSAgICAgTm9ib2R5IHNlZW1zIHRvIGltcGxlbWVudCB0aGUgYWNjb3VudC9lbWFpbC93ZWJmaW5nZXIgcGFydCAyLiBvZiB0aGUgc3BlYwotICAgICBzbyB3ZSB3aWxsIHJlbHkgaW5zdGVhZCBvbiBlbWFpbC91cmwgbWFwcGluZ3MgaWYgd2UgZGV0ZWN0IHN1Y2ggYW4gaXNzdWVyLgotICAgICBQYXJ0IDQsIG9uIHRoZSBvdGhlciBoYW5kIGlzIGltcGxlbWVudGVkIGJ5IGJvdGggZ29vZ2xlIGFuZCBzYWxlc2ZvcmNlLiAqLwotCi0gIC8qIFZlcnkgbm9uLXNvcGhpc3RpY2F0ZWQgd2F5IHRvIGRldGVjdCBhbiBlbWFpbCBhZGRyZXNzLiBTaG91bGQgYmUgZ29vZAotICAgICBlbm91Z2ggZm9yIG5vdy4uLiAqLwotICBhdF9zaWduID0gc3RyY2hyKGlzcywgJ0AnKTsKLSAgaWYgKGF0X3NpZ24gIT0gTlVMTCkgewotICAgIGVtYWlsX2tleV9tYXBwaW5nICptYXBwaW5nOwotICAgIGNvbnN0IGNoYXIgKmVtYWlsX2RvbWFpbiA9IGF0X3NpZ24gKyAxOwotICAgIEdQUl9BU1NFUlQoY3R4LT52ZXJpZmllciAhPSBOVUxMKTsKLSAgICBtYXBwaW5nID0gdmVyaWZpZXJfZ2V0X21hcHBpbmcoY3R4LT52ZXJpZmllciwgZW1haWxfZG9tYWluKTsKLSAgICBpZiAobWFwcGluZyA9PSBOVUxMKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3NpbmcgbWFwcGluZyBmb3IgaXNzdWVyIGVtYWlsLiIpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgcmVxLmhvc3QgPSBncHJfc3RyZHVwKG1hcHBpbmctPmtleV91cmxfcHJlZml4KTsKLSAgICBwYXRoX3ByZWZpeCA9IHN0cmNocihyZXEuaG9zdCwgJy8nKTsKLSAgICBpZiAocGF0aF9wcmVmaXggPT0gTlVMTCkgewotICAgICAgZ3ByX2FzcHJpbnRmKCZyZXEuaHR0cC5wYXRoLCAiLyVzIiwgaXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgKihwYXRoX3ByZWZpeCsrKSA9ICdcMCc7Ci0gICAgICBncHJfYXNwcmludGYoJnJlcS5odHRwLnBhdGgsICIvJXMvJXMiLCBwYXRoX3ByZWZpeCwgaXNzKTsKLSAgICB9Ci0gICAgaHR0cF9jYiA9IG9uX2tleXNfcmV0cmlldmVkOwotICB9IGVsc2UgewotICAgIHJlcS5ob3N0ID0gZ3ByX3N0cmR1cChzdHJzdHIoaXNzLCAiaHR0cHM6Ly8iKSA9PSBpc3MgPyBpc3MgKyA4IDogaXNzKTsKLSAgICBwYXRoX3ByZWZpeCA9IHN0cmNocihyZXEuaG9zdCwgJy8nKTsKLSAgICBpZiAocGF0aF9wcmVmaXggPT0gTlVMTCkgewotICAgICAgcmVxLmh0dHAucGF0aCA9IGdwcl9zdHJkdXAoR1JQQ19PUEVOSURfQ09ORklHX1VSTF9TVUZGSVgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAqKHBhdGhfcHJlZml4KyspID0gMDsKLSAgICAgIGdwcl9hc3ByaW50ZigmcmVxLmh0dHAucGF0aCwgIi8lcyVzIiwgcGF0aF9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgR1JQQ19PUEVOSURfQ09ORklHX1VSTF9TVUZGSVgpOwotICAgIH0KLSAgICBodHRwX2NiID0gb25fb3BlbmlkX2NvbmZpZ19yZXRyaWV2ZWQ7Ci0gIH0KLQotICBncnBjX2h0dHBjbGlfZ2V0KAotICAgICAgZXhlY19jdHgsICZjdHgtPnZlcmlmaWVyLT5odHRwX2N0eCwgY3R4LT5wb2xsc2V0LCAmcmVxLAotICAgICAgZ3ByX3RpbWVfYWRkKGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgZ3JwY19qd3RfdmVyaWZpZXJfbWF4X2RlbGF5KSwKLSAgICAgIGh0dHBfY2IsIGN0eCk7Ci0gIGdwcl9mcmVlKHJlcS5ob3N0KTsKLSAgZ3ByX2ZyZWUocmVxLmh0dHAucGF0aCk7Ci0gIHJldHVybjsKLQotZXJyb3I6Ci0gIGN0eC0+dXNlcl9jYihjdHgtPnVzZXJfZGF0YSwgR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUiwgTlVMTCk7Ci0gIHZlcmlmaWVyX2NiX2N0eF9kZXN0cm95KGN0eCk7Ci19Ci0KLXZvaWQgZ3JwY19qd3RfdmVyaWZpZXJfdmVyaWZ5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qd3RfdmVyaWZpZXIgKnZlcmlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0LCBjb25zdCBjaGFyICpqd3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdWRpZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfand0X3ZlcmlmaWNhdGlvbl9kb25lX2NiIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGNvbnN0IGNoYXIgKmRvdCA9IE5VTEw7Ci0gIGdycGNfanNvbiAqanNvbjsKLSAgam9zZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7Ci0gIGdycGNfand0X2NsYWltcyAqY2xhaW1zID0gTlVMTDsKLSAgZ3ByX3NsaWNlIGhlYWRlcl9idWZmZXI7Ci0gIGdwcl9zbGljZSBjbGFpbXNfYnVmZmVyOwotICBncHJfc2xpY2Ugc2lnbmF0dXJlOwotICBzaXplX3Qgc2lnbmVkX2p3dF9sZW47Ci0gIGNvbnN0IGNoYXIgKmN1ciA9IGp3dDsKLQotICBHUFJfQVNTRVJUKHZlcmlmaWVyICE9IE5VTEwgJiYgand0ICE9IE5VTEwgJiYgYXVkaWVuY2UgIT0gTlVMTCAmJiBjYiAhPSBOVUxMKTsKLSAgZG90ID0gc3RyY2hyKGN1ciwgJy4nKTsKLSAgaWYgKGRvdCA9PSBOVUxMKSBnb3RvIGVycm9yOwotICBqc29uID0gcGFyc2VfanNvbl9wYXJ0X2Zyb21fand0KGN1ciwgKHNpemVfdCkoZG90IC0gY3VyKSwgJmhlYWRlcl9idWZmZXIpOwotICBpZiAoanNvbiA9PSBOVUxMKSBnb3RvIGVycm9yOwotICBoZWFkZXIgPSBqb3NlX2hlYWRlcl9mcm9tX2pzb24oanNvbiwgaGVhZGVyX2J1ZmZlcik7Ci0gIGlmIChoZWFkZXIgPT0gTlVMTCkgZ290byBlcnJvcjsKLQotICBjdXIgPSBkb3QgKyAxOwotICBkb3QgPSBzdHJjaHIoY3VyLCAnLicpOwotICBpZiAoZG90ID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gIGpzb24gPSBwYXJzZV9qc29uX3BhcnRfZnJvbV9qd3QoY3VyLCAoc2l6ZV90KShkb3QgLSBjdXIpLCAmY2xhaW1zX2J1ZmZlcik7Ci0gIGlmIChqc29uID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gIGNsYWltcyA9IGdycGNfand0X2NsYWltc19mcm9tX2pzb24oanNvbiwgY2xhaW1zX2J1ZmZlcik7Ci0gIGlmIChjbGFpbXMgPT0gTlVMTCkgZ290byBlcnJvcjsKLQotICBzaWduZWRfand0X2xlbiA9IChzaXplX3QpKGRvdCAtIGp3dCk7Ci0gIGN1ciA9IGRvdCArIDE7Ci0gIHNpZ25hdHVyZSA9IGdycGNfYmFzZTY0X2RlY29kZShjdXIsIDEpOwotICBpZiAoR1BSX1NMSUNFX0lTX0VNUFRZKHNpZ25hdHVyZSkpIGdvdG8gZXJyb3I7Ci0gIHJldHJpZXZlX2tleV9hbmRfdmVyaWZ5KAotICAgICAgZXhlY19jdHgsCi0gICAgICB2ZXJpZmllcl9jYl9jdHhfY3JlYXRlKHZlcmlmaWVyLCBwb2xsc2V0LCBoZWFkZXIsIGNsYWltcywgYXVkaWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwgand0LCBzaWduZWRfand0X2xlbiwgdXNlcl9kYXRhLCBjYikpOwotICByZXR1cm47Ci0KLWVycm9yOgotICBpZiAoaGVhZGVyICE9IE5VTEwpIGpvc2VfaGVhZGVyX2Rlc3Ryb3koaGVhZGVyKTsKLSAgaWYgKGNsYWltcyAhPSBOVUxMKSBncnBjX2p3dF9jbGFpbXNfZGVzdHJveShjbGFpbXMpOwotICBjYih1c2VyX2RhdGEsIEdSUENfSldUX1ZFUklGSUVSX0JBRF9GT1JNQVQsIE5VTEwpOwotfQotCi1ncnBjX2p3dF92ZXJpZmllciAqZ3JwY19qd3RfdmVyaWZpZXJfY3JlYXRlKAotICAgIGNvbnN0IGdycGNfand0X3ZlcmlmaWVyX2VtYWlsX2RvbWFpbl9rZXlfdXJsX21hcHBpbmcgKm1hcHBpbmdzLAotICAgIHNpemVfdCBudW1fbWFwcGluZ3MpIHsKLSAgZ3JwY19qd3RfdmVyaWZpZXIgKnYgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX2p3dF92ZXJpZmllcikpOwotICBtZW1zZXQodiwgMCwgc2l6ZW9mKGdycGNfand0X3ZlcmlmaWVyKSk7Ci0gIGdycGNfaHR0cGNsaV9jb250ZXh0X2luaXQoJnYtPmh0dHBfY3R4KTsKLQotICAvKiBXZSBrbm93IGF0IGxlYXN0IG9mIG9uZSBtYXBwaW5nLiAqLwotICB2LT5hbGxvY2F0ZWRfbWFwcGluZ3MgPSAxICsgbnVtX21hcHBpbmdzOwotICB2LT5tYXBwaW5ncyA9IGdwcl9tYWxsb2Modi0+YWxsb2NhdGVkX21hcHBpbmdzICogc2l6ZW9mKGVtYWlsX2tleV9tYXBwaW5nKSk7Ci0gIHZlcmlmaWVyX3B1dF9tYXBwaW5nKHYsIEdSUENfR09PR0xFX1NFUlZJQ0VfQUNDT1VOVFNfRU1BSUxfRE9NQUlOLAotICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0dPT0dMRV9TRVJWSUNFX0FDQ09VTlRTX0tFWV9VUkxfUFJFRklYKTsKLSAgLyogVXNlci1Qcm92aWRlZCBtYXBwaW5ncy4gKi8KLSAgaWYgKG1hcHBpbmdzICE9IE5VTEwpIHsKLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hcHBpbmdzOyBpKyspIHsKLSAgICAgIHZlcmlmaWVyX3B1dF9tYXBwaW5nKHYsIG1hcHBpbmdzW2ldLmVtYWlsX2RvbWFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzW2ldLmtleV91cmxfcHJlZml4KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHY7Ci19Ci0KLXZvaWQgZ3JwY19qd3RfdmVyaWZpZXJfZGVzdHJveShncnBjX2p3dF92ZXJpZmllciAqdikgewotICBzaXplX3QgaTsKLSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuOwotICBncnBjX2h0dHBjbGlfY29udGV4dF9kZXN0cm95KCZ2LT5odHRwX2N0eCk7Ci0gIGlmICh2LT5tYXBwaW5ncyAhPSBOVUxMKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IHYtPm51bV9tYXBwaW5nczsgaSsrKSB7Ci0gICAgICBncHJfZnJlZSh2LT5tYXBwaW5nc1tpXS5lbWFpbF9kb21haW4pOwotICAgICAgZ3ByX2ZyZWUodi0+bWFwcGluZ3NbaV0ua2V5X3VybF9wcmVmaXgpOwotICAgIH0KLSAgICBncHJfZnJlZSh2LT5tYXBwaW5ncyk7Ci0gIH0KLSAgZ3ByX2ZyZWUodik7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCBiL3NyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODk4ZDIxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NFQ1VSSVRZX0pXVF9WRVJJRklFUl9ICi0jZGVmaW5lIEdSUENfQ09SRV9TRUNVUklUWV9KV1RfVkVSSUZJRVJfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbi5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLQotLyogLS0tIENvbnN0YW50cy4gLS0tICovCi0KLSNkZWZpbmUgR1JQQ19PUEVOSURfQ09ORklHX1VSTF9TVUZGSVggIi8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiIKLSNkZWZpbmUgR1JQQ19HT09HTEVfU0VSVklDRV9BQ0NPVU5UU19FTUFJTF9ET01BSU4gXAotICAiZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iCi0jZGVmaW5lIEdSUENfR09PR0xFX1NFUlZJQ0VfQUNDT1VOVFNfS0VZX1VSTF9QUkVGSVggXAotICAid3d3Lmdvb2dsZWFwaXMuY29tL3JvYm90L3YxL21ldGFkYXRhL3g1MDkiCi0KLS8qIC0tLSBncnBjX2p3dF92ZXJpZmllcl9zdGF0dXMuIC0tLSAqLwotCi10eXBlZGVmIGVudW0gewotICBHUlBDX0pXVF9WRVJJRklFUl9PSyA9IDAsCi0gIEdSUENfSldUX1ZFUklGSUVSX0JBRF9TSUdOQVRVUkUsCi0gIEdSUENfSldUX1ZFUklGSUVSX0JBRF9GT1JNQVQsCi0gIEdSUENfSldUX1ZFUklGSUVSX0JBRF9BVURJRU5DRSwKLSAgR1JQQ19KV1RfVkVSSUZJRVJfS0VZX1JFVFJJRVZBTF9FUlJPUiwKLSAgR1JQQ19KV1RfVkVSSUZJRVJfVElNRV9DT05TVFJBSU5UX0ZBSUxVUkUsCi0gIEdSUENfSldUX1ZFUklGSUVSX0dFTkVSSUNfRVJST1IKLX0gZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzOwotCi1jb25zdCBjaGFyICpncnBjX2p3dF92ZXJpZmllcl9zdGF0dXNfdG9fc3RyaW5nKGdycGNfand0X3ZlcmlmaWVyX3N0YXR1cyBzdGF0dXMpOwotCi0vKiAtLS0gZ3JwY19qd3RfY2xhaW1zLiAtLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19qd3RfY2xhaW1zIGdycGNfand0X2NsYWltczsKLQotdm9pZCBncnBjX2p3dF9jbGFpbXNfZGVzdHJveShncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7Ci0KLS8qIFJldHVybnMgdGhlIHdob2xlIEpTT04gdHJlZSBvZiB0aGUgY2xhaW1zLiAqLwotY29uc3QgZ3JwY19qc29uICpncnBjX2p3dF9jbGFpbXNfanNvbihjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7Ci0KLS8qIEFjY2VzcyB0byByZWdpc3RlcmVkIGNsYWltcyBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxOSNwYWdlLTkgKi8KLWNvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19zdWJqZWN0KGNvbnN0IGdycGNfand0X2NsYWltcyAqY2xhaW1zKTsKLWNvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19pc3N1ZXIoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpOwotY29uc3QgY2hhciAqZ3JwY19qd3RfY2xhaW1zX2lkKGNvbnN0IGdycGNfand0X2NsYWltcyAqY2xhaW1zKTsKLWNvbnN0IGNoYXIgKmdycGNfand0X2NsYWltc19hdWRpZW5jZShjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7Ci1ncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2lzc3VlZF9hdChjb25zdCBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7Ci1ncHJfdGltZXNwZWMgZ3JwY19qd3RfY2xhaW1zX2V4cGlyZXNfYXQoY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMpOwotZ3ByX3RpbWVzcGVjIGdycGNfand0X2NsYWltc19ub3RfYmVmb3JlKGNvbnN0IGdycGNfand0X2NsYWltcyAqY2xhaW1zKTsKLQotLyogLS0tIGdycGNfand0X3ZlcmlmaWVyLiAtLS0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19qd3RfdmVyaWZpZXIgZ3JwY19qd3RfdmVyaWZpZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhlIGVtYWlsIGRvbWFpbiBpcyB0aGUgcGFydCBhZnRlciB0aGUgQCBzaWduLiAqLwotICBjb25zdCBjaGFyICplbWFpbF9kb21haW47Ci0KLSAgLyogVGhlIGtleSB1cmwgcHJlZml4IHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgaXNzdWVyOgotICAgICBodHRwczovLzxrZXlfdXJsX3ByZWZpeD4vPGlzc3Vlcl9lbWFpbD4KLSAgICAgVGhlcmVmb3JlIHRoZSBrZXlfdXJsX3ByZWZpeCBtdXN0IE5PVCBjb250YWluIGh0dHBzOi8vLiAqLwotICBjb25zdCBjaGFyICprZXlfdXJsX3ByZWZpeDsKLX0gZ3JwY19qd3RfdmVyaWZpZXJfZW1haWxfZG9tYWluX2tleV91cmxfbWFwcGluZzsKLQotLyogR2xvYmFscyB0byBjb250cm9sIHRoZSB2ZXJpZmllci4gTm90IHRocmVhZC1zYWZlLiAqLwotZXh0ZXJuIGdwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9jbG9ja19za2V3OwotZXh0ZXJuIGdwcl90aW1lc3BlYyBncnBjX2p3dF92ZXJpZmllcl9tYXhfZGVsYXk7Ci0KLS8qIFRoZSB2ZXJpZmllciBjYW4gYmUgY3JlYXRlZCB3aXRoIHNvbWUgY3VzdG9tIG1hcHBpbmdzIHRvIGhlbHAgd2l0aCBrZXkKLSAgIGRpc2NvdmVyeSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaXNzdWVyIGlzIGFuIGVtYWlsIGFkZHJlc3MuCi0gICBtYXBwaW5ncyBjYW4gYmUgTlVMTCBpbiB3aGljaCBjYXNlIG51bV9tYXBwaW5ncyBNVVNUIGJlIDAuCi0gICBBIHZlcmlmaWVyIG9iamVjdCBoYXMgb25lIGJ1aWx0LWluIG1hcHBpbmcgKHVubGVzcyBvdmVycmlkZGVuKToKLSAgIEdSUENfR09PR0xFX1NFUlZJQ0VfQUNDT1VOVFNfRU1BSUxfRE9NQUlOIC0+Ci0gICBHUlBDX0dPT0dMRV9TRVJWSUNFX0FDQ09VTlRTX0tFWV9VUkxfUFJFRklYLiovCi1ncnBjX2p3dF92ZXJpZmllciAqZ3JwY19qd3RfdmVyaWZpZXJfY3JlYXRlKAotICAgIGNvbnN0IGdycGNfand0X3ZlcmlmaWVyX2VtYWlsX2RvbWFpbl9rZXlfdXJsX21hcHBpbmcgKm1hcHBpbmdzLAotICAgIHNpemVfdCBudW1fbWFwcGluZ3MpOwotCi0vKlRoZSB2ZXJpZmllciBtdXN0IG5vdCBiZSBkZXN0cm95ZWQgaWYgdGhlcmUgYXJlIHN0aWxsIG91dHN0YW5kaW5nIGNhbGxiYWNrcy4qLwotdm9pZCBncnBjX2p3dF92ZXJpZmllcl9kZXN0cm95KGdycGNfand0X3ZlcmlmaWVyICp2ZXJpZmllcik7Ci0KLS8qIFVzZXIgcHJvdmlkZWQgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIEpXVAotICAgaXMgZG9uZSAobWF5YmUgaW4gYW5vdGhlciB0aHJlYWQpLgotICAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZWUgdG8gY2FsbCBncnBjX2p3dF9jbGFpbXNfZGVzdHJveSBvbgotICAgdGhlIGNsYWltcy4gKi8KLXR5cGVkZWYgdm9pZCAoKmdycGNfand0X3ZlcmlmaWNhdGlvbl9kb25lX2NiKSh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19qd3RfdmVyaWZpZXJfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2p3dF9jbGFpbXMgKmNsYWltcyk7Ci0KLS8qIFZlcmlmaWVzIGZvciB0aGUgSldUIGZvciB0aGUgZ2l2ZW4gZXhwZWN0ZWQgYXVkaWVuY2UuICovCi12b2lkIGdycGNfand0X3ZlcmlmaWVyX3ZlcmlmeShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfand0X3ZlcmlmaWVyICp2ZXJpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCwgY29uc3QgY2hhciAqand0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXVkaWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2p3dF92ZXJpZmljYXRpb25fZG9uZV9jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLS8qIC0tLSBURVNUSU5HIE9OTFkgZXhwb3NlZCBmdW5jdGlvbnMuIC0tLSAqLwotCi1ncnBjX2p3dF9jbGFpbXMgKmdycGNfand0X2NsYWltc19mcm9tX2pzb24oZ3JwY19qc29uICpqc29uLCBncHJfc2xpY2UgYnVmZmVyKTsKLWdycGNfand0X3ZlcmlmaWVyX3N0YXR1cyBncnBjX2p3dF9jbGFpbXNfY2hlY2soY29uc3QgZ3JwY19qd3RfY2xhaW1zICpjbGFpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmF1ZGllbmNlKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TRUNVUklUWV9KV1RfVkVSSUZJRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMgYi9zcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiMDgxZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgotCi0jZGVmaW5lIFNUQUdJTkdfQlVGRkVSX1NJWkUgODE5MgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfZW5kcG9pbnQgYmFzZTsKLSAgZ3JwY19lbmRwb2ludCAqd3JhcHBlZF9lcDsKLSAgc3RydWN0IHRzaV9mcmFtZV9wcm90ZWN0b3IgKnByb3RlY3RvcjsKLSAgZ3ByX211IHByb3RlY3Rvcl9tdTsKLSAgLyogc2F2ZWQgdXBwZXIgbGV2ZWwgY2FsbGJhY2tzIGFuZCB1c2VyX2RhdGEuICovCi0gIGdycGNfY2xvc3VyZSAqcmVhZF9jYjsKLSAgZ3JwY19jbG9zdXJlICp3cml0ZV9jYjsKLSAgZ3JwY19jbG9zdXJlIG9uX3JlYWQ7Ci0gIGdwcl9zbGljZV9idWZmZXIgKnJlYWRfYnVmZmVyOwotICBncHJfc2xpY2VfYnVmZmVyIHNvdXJjZV9idWZmZXI7Ci0gIC8qIHNhdmVkIGhhbmRzaGFrZXIgbGVmdG92ZXIgZGF0YSB0byB1bnByb3RlY3QuICovCi0gIGdwcl9zbGljZV9idWZmZXIgbGVmdG92ZXJfYnl0ZXM7Ci0gIC8qIGJ1ZmZlcnMgZm9yIHJlYWQgYW5kIHdyaXRlICovCi0gIGdwcl9zbGljZSByZWFkX3N0YWdpbmdfYnVmZmVyOwotCi0gIGdwcl9zbGljZSB3cml0ZV9zdGFnaW5nX2J1ZmZlcjsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBvdXRwdXRfYnVmZmVyOwotCi0gIGdwcl9yZWZjb3VudCByZWY7Ci19IHNlY3VyZV9lbmRwb2ludDsKLQotaW50IGdycGNfdHJhY2Vfc2VjdXJlX2VuZHBvaW50ID0gMDsKLQotc3RhdGljIHZvaWQgZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgc2VjdXJlX2VuZHBvaW50ICpzZWN1cmVfZXApIHsKLSAgc2VjdXJlX2VuZHBvaW50ICplcCA9IHNlY3VyZV9lcDsKLSAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCBlcC0+d3JhcHBlZF9lcCk7Ci0gIHRzaV9mcmFtZV9wcm90ZWN0b3JfZGVzdHJveShlcC0+cHJvdGVjdG9yKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZlcC0+bGVmdG92ZXJfYnl0ZXMpOwotICBncHJfc2xpY2VfdW5yZWYoZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIpOwotICBncHJfc2xpY2VfdW5yZWYoZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZlcC0+b3V0cHV0X2J1ZmZlcik7Ci0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmZXAtPnNvdXJjZV9idWZmZXIpOwotICBncHJfbXVfZGVzdHJveSgmZXAtPnByb3RlY3Rvcl9tdSk7Ci0gIGdwcl9mcmVlKGVwKTsKLX0KLQotLyojZGVmaW5lIEdSUENfU0VDVVJFX0VORFBPSU5UX1JFRkNPVU5UX0RFQlVHKi8KLSNpZmRlZiBHUlBDX1NFQ1VSRV9FTkRQT0lOVF9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBTRUNVUkVfRU5EUE9JTlRfVU5SRUYoZXhlY19jdHgsIGVwLCByZWFzb24pIFwKLSAgc2VjdXJlX2VuZHBvaW50X3VucmVmKChleGVjX2N0eCksIChlcCksIChyZWFzb24pLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIFNFQ1VSRV9FTkRQT0lOVF9SRUYoZXAsIHJlYXNvbikgXAotICBzZWN1cmVfZW5kcG9pbnRfcmVmKChlcCksIChyZWFzb24pLCBfX0ZJTEVfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBzZWN1cmVfZW5kcG9pbnRfdW5yZWYoc2VjdXJlX2VuZHBvaW50ICplcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmVfbGlzdCAqY2xvc3VyZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbiwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsICJTRUNFTkRQIHVucmVmICVwIDogJXMgJWQgLT4gJWQiLAotICAgICAgICAgIGVwLCByZWFzb24sIGVwLT5yZWYuY291bnQsIGVwLT5yZWYuY291bnQgLSAxKTsKLSAgaWYgKGdwcl91bnJlZigmZXAtPnJlZikpIHsKLSAgICBkZXN0cm95KGV4ZWNfY3R4LCBlcCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc2VjdXJlX2VuZHBvaW50X3JlZihzZWN1cmVfZW5kcG9pbnQgKmVwLCBjb25zdCBjaGFyICpyZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7Ci0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIlNFQ0VORFAgICByZWYgJXAgOiAlcyAlZCAtPiAlZCIsCi0gICAgICAgICAgZXAsIHJlYXNvbiwgZXAtPnJlZi5jb3VudCwgZXAtPnJlZi5jb3VudCArIDEpOwotICBncHJfcmVmKCZlcC0+cmVmKTsKLX0KLSNlbHNlCi0jZGVmaW5lIFNFQ1VSRV9FTkRQT0lOVF9VTlJFRihleGVjX2N0eCwgZXAsIHJlYXNvbikgXAotICBzZWN1cmVfZW5kcG9pbnRfdW5yZWYoKGV4ZWNfY3R4KSwgKGVwKSkKLSNkZWZpbmUgU0VDVVJFX0VORFBPSU5UX1JFRihlcCwgcmVhc29uKSBzZWN1cmVfZW5kcG9pbnRfcmVmKChlcCkpCi1zdGF0aWMgdm9pZCBzZWN1cmVfZW5kcG9pbnRfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX2VuZHBvaW50ICplcCkgewotICBpZiAoZ3ByX3VucmVmKCZlcC0+cmVmKSkgewotICAgIGRlc3Ryb3koZXhlY19jdHgsIGVwKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzZWN1cmVfZW5kcG9pbnRfcmVmKHNlY3VyZV9lbmRwb2ludCAqZXApIHsgZ3ByX3JlZigmZXAtPnJlZik7IH0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBmbHVzaF9yZWFkX3N0YWdpbmdfYnVmZmVyKHNlY3VyZV9lbmRwb2ludCAqZXAsIHVpbnQ4X3QgKipjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiplbmQpIHsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoZXAtPnJlYWRfYnVmZmVyLCBlcC0+cmVhZF9zdGFnaW5nX2J1ZmZlcik7Ci0gIGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyID0gZ3ByX3NsaWNlX21hbGxvYyhTVEFHSU5HX0JVRkZFUl9TSVpFKTsKLSAgKmN1ciA9IEdQUl9TTElDRV9TVEFSVF9QVFIoZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIpOwotICAqZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIpOwotfQotCi1zdGF0aWMgdm9pZCBjYWxsX3JlYWRfY2IoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHNlY3VyZV9lbmRwb2ludCAqZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKSB7Ci0gIGlmIChncnBjX3RyYWNlX3NlY3VyZV9lbmRwb2ludCkgewotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBlcC0+cmVhZF9idWZmZXItPmNvdW50OyBpKyspIHsKLSAgICAgIGNoYXIgKmRhdGEgPSBncHJfZHVtcF9zbGljZShlcC0+cmVhZF9idWZmZXItPnNsaWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfRFVNUF9IRVggfCBHUFJfRFVNUF9BU0NJSSk7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywgIlJFQUQgJXA6ICVzIiwgZXAsIGRhdGEpOwotICAgICAgZ3ByX2ZyZWUoZGF0YSk7Ci0gICAgfQotICB9Ci0gIGVwLT5yZWFkX2J1ZmZlciA9IE5VTEw7Ci0gIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgZXAtPnJlYWRfY2IsIHN1Y2Nlc3MsIE5VTEwpOwotICBTRUNVUkVfRU5EUE9JTlRfVU5SRUYoZXhlY19jdHgsIGVwLCAicmVhZCIpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2VzcykgewotICB1bnNpZ25lZCBpOwotICB1aW50OF90IGtlZXBfbG9vcGluZyA9IDA7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICBzZWN1cmVfZW5kcG9pbnQgKmVwID0gKHNlY3VyZV9lbmRwb2ludCAqKXVzZXJfZGF0YTsKLSAgdWludDhfdCAqY3VyID0gR1BSX1NMSUNFX1NUQVJUX1BUUihlcC0+cmVhZF9zdGFnaW5nX2J1ZmZlcik7Ci0gIHVpbnQ4X3QgKmVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyKTsKLQotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZihlcC0+cmVhZF9idWZmZXIpOwotICAgIGNhbGxfcmVhZF9jYihleGVjX2N0eCwgZXAsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qIFRPRE8oeWFuZ2cpIGNoZWNrIGVycm9yLCBtYXliZSBiYWlsIG91dCBlYXJseSAqLwotICBmb3IgKGkgPSAwOyBpIDwgZXAtPnNvdXJjZV9idWZmZXIuY291bnQ7IGkrKykgewotICAgIGdwcl9zbGljZSBlbmNyeXB0ZWQgPSBlcC0+c291cmNlX2J1ZmZlci5zbGljZXNbaV07Ci0gICAgdWludDhfdCAqbWVzc2FnZV9ieXRlcyA9IEdQUl9TTElDRV9TVEFSVF9QVFIoZW5jcnlwdGVkKTsKLSAgICBzaXplX3QgbWVzc2FnZV9zaXplID0gR1BSX1NMSUNFX0xFTkdUSChlbmNyeXB0ZWQpOwotCi0gICAgd2hpbGUgKG1lc3NhZ2Vfc2l6ZSA+IDAgfHwga2VlcF9sb29waW5nKSB7Ci0gICAgICBzaXplX3QgdW5wcm90ZWN0ZWRfYnVmZmVyX3NpemVfd3JpdHRlbiA9IChzaXplX3QpKGVuZCAtIGN1cik7Ci0gICAgICBzaXplX3QgcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSA9IG1lc3NhZ2Vfc2l6ZTsKLSAgICAgIGdwcl9tdV9sb2NrKCZlcC0+cHJvdGVjdG9yX211KTsKLSAgICAgIHJlc3VsdCA9IHRzaV9mcmFtZV9wcm90ZWN0b3JfdW5wcm90ZWN0KGVwLT5wcm90ZWN0b3IsIG1lc3NhZ2VfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSwgY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVucHJvdGVjdGVkX2J1ZmZlcl9zaXplX3dyaXR0ZW4pOwotICAgICAgZ3ByX211X3VubG9jaygmZXAtPnByb3RlY3Rvcl9tdSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkRlY3J5cHRpb24gZXJyb3I6ICVzIiwKLSAgICAgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtZXNzYWdlX2J5dGVzICs9IHByb2Nlc3NlZF9tZXNzYWdlX3NpemU7Ci0gICAgICBtZXNzYWdlX3NpemUgLT0gcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZTsKLSAgICAgIGN1ciArPSB1bnByb3RlY3RlZF9idWZmZXJfc2l6ZV93cml0dGVuOwotCi0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBmbHVzaF9yZWFkX3N0YWdpbmdfYnVmZmVyKGVwLCAmY3VyLCAmZW5kKTsKLSAgICAgICAgLyogRm9yY2UgdG8gZW50ZXIgdGhlIGxvb3AgYWdhaW4gdG8gZXh0cmFjdCBidWZmZXJlZCBieXRlcyBpbiBwcm90ZWN0b3IuCi0gICAgICAgICAgIFRoZSBieXRlcyBjb3VsZCBiZSBidWZmZXJlZCBiZWNhdXNlIG9mIHJ1bm5pbmcgb3V0IG9mIHN0YWdpbmdfYnVmZmVyLgotICAgICAgICAgICBJZiB0aGlzIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiBhbGwgc2xpY2VzLCBkb2luZyBhbm90aGVyIHVucHJvdGVjdAotICAgICAgICAgICBhdm9pZHMgbGVhdmluZyBkYXRhIGluIHRoZSBwcm90ZWN0b3IuICovCi0gICAgICAgIGtlZXBfbG9vcGluZyA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHVucHJvdGVjdGVkX2J1ZmZlcl9zaXplX3dyaXR0ZW4gPiAwKSB7Ci0gICAgICAgIGtlZXBfbG9vcGluZyA9IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBrZWVwX2xvb3BpbmcgPSAwOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7Ci0gIH0KLQotICBpZiAoY3VyICE9IEdQUl9TTElDRV9TVEFSVF9QVFIoZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIpKSB7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoCi0gICAgICAgIGVwLT5yZWFkX2J1ZmZlciwKLSAgICAgICAgZ3ByX3NsaWNlX3NwbGl0X2hlYWQoCi0gICAgICAgICAgICAmZXAtPnJlYWRfc3RhZ2luZ19idWZmZXIsCi0gICAgICAgICAgICAoc2l6ZV90KShjdXIgLSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGVwLT5yZWFkX3N0YWdpbmdfYnVmZmVyKSkpKTsKLSAgfQotCi0gIC8qIFRPRE8oeWFuZ2cpIGV4cGVyaW1lbnQgd2l0aCBtb3ZpbmcgdGhpcyBibG9jayBhZnRlciByZWFkX2NiIHRvIHNlZSBpZiBpdAotICAgICBoZWxwcyBsYXRlbmN5ICovCi0gIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKCZlcC0+c291cmNlX2J1ZmZlcik7Ci0KLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZihlcC0+cmVhZF9idWZmZXIpOwotICAgIGNhbGxfcmVhZF9jYihleGVjX2N0eCwgZXAsIDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNhbGxfcmVhZF9jYihleGVjX2N0eCwgZXAsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRwb2ludF9yZWFkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2VuZHBvaW50ICpzZWN1cmVfZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnNsaWNlcywgZ3JwY19jbG9zdXJlICpjYikgewotICBzZWN1cmVfZW5kcG9pbnQgKmVwID0gKHNlY3VyZV9lbmRwb2ludCAqKXNlY3VyZV9lcDsKLSAgZXAtPnJlYWRfY2IgPSBjYjsKLSAgZXAtPnJlYWRfYnVmZmVyID0gc2xpY2VzOwotICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZihlcC0+cmVhZF9idWZmZXIpOwotCi0gIFNFQ1VSRV9FTkRQT0lOVF9SRUYoZXAsICJyZWFkIik7Ci0gIGlmIChlcC0+bGVmdG92ZXJfYnl0ZXMuY291bnQpIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX3N3YXAoJmVwLT5sZWZ0b3Zlcl9ieXRlcywgJmVwLT5zb3VyY2VfYnVmZmVyKTsKLSAgICBHUFJfQVNTRVJUKGVwLT5sZWZ0b3Zlcl9ieXRlcy5jb3VudCA9PSAwKTsKLSAgICBvbl9yZWFkKGV4ZWNfY3R4LCBlcCwgMSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ3JwY19lbmRwb2ludF9yZWFkKGV4ZWNfY3R4LCBlcC0+d3JhcHBlZF9lcCwgJmVwLT5zb3VyY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgJmVwLT5vbl9yZWFkKTsKLX0KLQotc3RhdGljIHZvaWQgZmx1c2hfd3JpdGVfc3RhZ2luZ19idWZmZXIoc2VjdXJlX2VuZHBvaW50ICplcCwgdWludDhfdCAqKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiplbmQpIHsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmVwLT5vdXRwdXRfYnVmZmVyLCBlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIpOwotICBlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIgPSBncHJfc2xpY2VfbWFsbG9jKFNUQUdJTkdfQlVGRkVSX1NJWkUpOwotICAqY3VyID0gR1BSX1NMSUNFX1NUQVJUX1BUUihlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIpOwotICAqZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKTsKLX0KLQotc3RhdGljIHZvaWQgZW5kcG9pbnRfd3JpdGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnNsaWNlcywgZ3JwY19jbG9zdXJlICpjYikgewotICB1bnNpZ25lZCBpOwotICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKLSAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKilzZWN1cmVfZXA7Ci0gIHVpbnQ4X3QgKmN1ciA9IEdQUl9TTElDRV9TVEFSVF9QVFIoZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKTsKLSAgdWludDhfdCAqZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoZXAtPndyaXRlX3N0YWdpbmdfYnVmZmVyKTsKLQotICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZigmZXAtPm91dHB1dF9idWZmZXIpOwotCi0gIGlmIChncnBjX3RyYWNlX3NlY3VyZV9lbmRwb2ludCkgewotICAgIGZvciAoaSA9IDA7IGkgPCBzbGljZXMtPmNvdW50OyBpKyspIHsKLSAgICAgIGNoYXIgKmRhdGEgPQotICAgICAgICAgIGdwcl9kdW1wX3NsaWNlKHNsaWNlcy0+c2xpY2VzW2ldLCBHUFJfRFVNUF9IRVggfCBHUFJfRFVNUF9BU0NJSSk7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywgIldSSVRFICVwOiAlcyIsIGVwLCBkYXRhKTsKLSAgICAgIGdwcl9mcmVlKGRhdGEpOwotICAgIH0KLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBzbGljZXMtPmNvdW50OyBpKyspIHsKLSAgICBncHJfc2xpY2UgcGxhaW4gPSBzbGljZXMtPnNsaWNlc1tpXTsKLSAgICB1aW50OF90ICptZXNzYWdlX2J5dGVzID0gR1BSX1NMSUNFX1NUQVJUX1BUUihwbGFpbik7Ci0gICAgc2l6ZV90IG1lc3NhZ2Vfc2l6ZSA9IEdQUl9TTElDRV9MRU5HVEgocGxhaW4pOwotICAgIHdoaWxlIChtZXNzYWdlX3NpemUgPiAwKSB7Ci0gICAgICBzaXplX3QgcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQgPSAoc2l6ZV90KShlbmQgLSBjdXIpOwotICAgICAgc2l6ZV90IHByb2Nlc3NlZF9tZXNzYWdlX3NpemUgPSBtZXNzYWdlX3NpemU7Ci0gICAgICBncHJfbXVfbG9jaygmZXAtPnByb3RlY3Rvcl9tdSk7Ci0gICAgICByZXN1bHQgPSB0c2lfZnJhbWVfcHJvdGVjdG9yX3Byb3RlY3QoZXAtPnByb3RlY3RvciwgbWVzc2FnZV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSwgY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0ZWRfYnVmZmVyX3NpemVfdG9fc2VuZCk7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZlcC0+cHJvdGVjdG9yX211KTsKLSAgICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRW5jcnlwdGlvbiBlcnJvcjogJXMiLAotICAgICAgICAgICAgICAgIHRzaV9yZXN1bHRfdG9fc3RyaW5nKHJlc3VsdCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG1lc3NhZ2VfYnl0ZXMgKz0gcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZTsKLSAgICAgIG1lc3NhZ2Vfc2l6ZSAtPSBwcm9jZXNzZWRfbWVzc2FnZV9zaXplOwotICAgICAgY3VyICs9IHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kOwotCi0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBmbHVzaF93cml0ZV9zdGFnaW5nX2J1ZmZlcihlcCwgJmN1ciwgJmVuZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKLSAgfQotICBpZiAocmVzdWx0ID09IFRTSV9PSykgewotICAgIHNpemVfdCBzdGlsbF9wZW5kaW5nX3NpemU7Ci0gICAgZG8gewotICAgICAgc2l6ZV90IHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kID0gKHNpemVfdCkoZW5kIC0gY3VyKTsKLSAgICAgIGdwcl9tdV9sb2NrKCZlcC0+cHJvdGVjdG9yX211KTsKLSAgICAgIHJlc3VsdCA9IHRzaV9mcmFtZV9wcm90ZWN0b3JfcHJvdGVjdF9mbHVzaChlcC0+cHJvdGVjdG9yLCBjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGlsbF9wZW5kaW5nX3NpemUpOwotICAgICAgZ3ByX211X3VubG9jaygmZXAtPnByb3RlY3Rvcl9tdSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7Ci0gICAgICBjdXIgKz0gcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQ7Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBmbHVzaF93cml0ZV9zdGFnaW5nX2J1ZmZlcihlcCwgJmN1ciwgJmVuZCk7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoc3RpbGxfcGVuZGluZ19zaXplID4gMCk7Ci0gICAgaWYgKGN1ciAhPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGVwLT53cml0ZV9zdGFnaW5nX2J1ZmZlcikpIHsKLSAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAotICAgICAgICAgICZlcC0+b3V0cHV0X2J1ZmZlciwKLSAgICAgICAgICBncHJfc2xpY2Vfc3BsaXRfaGVhZCgKLSAgICAgICAgICAgICAgJmVwLT53cml0ZV9zdGFnaW5nX2J1ZmZlciwKLSAgICAgICAgICAgICAgKHNpemVfdCkoY3VyIC0gR1BSX1NMSUNFX1NUQVJUX1BUUihlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIpKSkpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgLyogVE9ETyh5YW5nZykgZG8gZGlmZmVyZW50IHRoaW5ncyBhY2NvcmRpbmcgdG8gdGhlIGVycm9yIHR5cGU/ICovCi0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9yZXNldF9hbmRfdW5yZWYoJmVwLT5vdXRwdXRfYnVmZmVyKTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGNiLCBmYWxzZSwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZ3JwY19lbmRwb2ludF93cml0ZShleGVjX2N0eCwgZXAtPndyYXBwZWRfZXAsICZlcC0+b3V0cHV0X2J1ZmZlciwgY2IpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRwb2ludF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnNlY3VyZV9lcCkgewotICBzZWN1cmVfZW5kcG9pbnQgKmVwID0gKHNlY3VyZV9lbmRwb2ludCAqKXNlY3VyZV9lcDsKLSAgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihleGVjX2N0eCwgZXAtPndyYXBwZWRfZXApOwotfQotCi1zdGF0aWMgdm9pZCBlbmRwb2ludF9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZXApIHsKLSAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKilzZWN1cmVfZXA7Ci0gIFNFQ1VSRV9FTkRQT0lOVF9VTlJFRihleGVjX2N0eCwgZXAsICJkZXN0cm95Iik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZHBvaW50X2FkZF90b19wb2xsc2V0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7Ci0gIHNlY3VyZV9lbmRwb2ludCAqZXAgPSAoc2VjdXJlX2VuZHBvaW50ICopc2VjdXJlX2VwOwotICBncnBjX2VuZHBvaW50X2FkZF90b19wb2xsc2V0KGV4ZWNfY3R4LCBlcC0+d3JhcHBlZF9lcCwgcG9sbHNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZHBvaW50X2FkZF90b19wb2xsc2V0X3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpIHsKLSAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKilzZWN1cmVfZXA7Ci0gIGdycGNfZW5kcG9pbnRfYWRkX3RvX3BvbGxzZXRfc2V0KGV4ZWNfY3R4LCBlcC0+d3JhcHBlZF9lcCwgcG9sbHNldF9zZXQpOwotfQotCi1zdGF0aWMgY2hhciAqZW5kcG9pbnRfZ2V0X3BlZXIoZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VwKSB7Ci0gIHNlY3VyZV9lbmRwb2ludCAqZXAgPSAoc2VjdXJlX2VuZHBvaW50ICopc2VjdXJlX2VwOwotICByZXR1cm4gZ3JwY19lbmRwb2ludF9nZXRfcGVlcihlcC0+d3JhcHBlZF9lcCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBncnBjX2VuZHBvaW50X3Z0YWJsZSB2dGFibGUgPSB7Ci0gICAgZW5kcG9pbnRfcmVhZCwgICAgICAgICAgIGVuZHBvaW50X3dyaXRlLAotICAgIGVuZHBvaW50X2FkZF90b19wb2xsc2V0LCBlbmRwb2ludF9hZGRfdG9fcG9sbHNldF9zZXQsCi0gICAgZW5kcG9pbnRfc2h1dGRvd24sICAgICAgIGVuZHBvaW50X2Rlc3Ryb3ksCi0gICAgZW5kcG9pbnRfZ2V0X3BlZXJ9OwotCi1ncnBjX2VuZHBvaW50ICpncnBjX3NlY3VyZV9lbmRwb2ludF9jcmVhdGUoCi0gICAgc3RydWN0IHRzaV9mcmFtZV9wcm90ZWN0b3IgKnByb3RlY3RvciwgZ3JwY19lbmRwb2ludCAqdHJhbnNwb3J0LAotICAgIGdwcl9zbGljZSAqbGVmdG92ZXJfc2xpY2VzLCBzaXplX3QgbGVmdG92ZXJfbnNsaWNlcykgewotICBzaXplX3QgaTsKLSAgc2VjdXJlX2VuZHBvaW50ICplcCA9IChzZWN1cmVfZW5kcG9pbnQgKilncHJfbWFsbG9jKHNpemVvZihzZWN1cmVfZW5kcG9pbnQpKTsKLSAgZXAtPmJhc2UudnRhYmxlID0gJnZ0YWJsZTsKLSAgZXAtPndyYXBwZWRfZXAgPSB0cmFuc3BvcnQ7Ci0gIGVwLT5wcm90ZWN0b3IgPSBwcm90ZWN0b3I7Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmZXAtPmxlZnRvdmVyX2J5dGVzKTsKLSAgZm9yIChpID0gMDsgaSA8IGxlZnRvdmVyX25zbGljZXM7IGkrKykgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZlcC0+bGVmdG92ZXJfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX3JlZihsZWZ0b3Zlcl9zbGljZXNbaV0pKTsKLSAgfQotICBlcC0+d3JpdGVfc3RhZ2luZ19idWZmZXIgPSBncHJfc2xpY2VfbWFsbG9jKFNUQUdJTkdfQlVGRkVSX1NJWkUpOwotICBlcC0+cmVhZF9zdGFnaW5nX2J1ZmZlciA9IGdwcl9zbGljZV9tYWxsb2MoU1RBR0lOR19CVUZGRVJfU0laRSk7Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmZXAtPm91dHB1dF9idWZmZXIpOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmVwLT5zb3VyY2VfYnVmZmVyKTsKLSAgZXAtPnJlYWRfYnVmZmVyID0gTlVMTDsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmVwLT5vbl9yZWFkLCBvbl9yZWFkLCBlcCk7Ci0gIGdwcl9tdV9pbml0KCZlcC0+cHJvdGVjdG9yX211KTsKLSAgZ3ByX3JlZl9pbml0KCZlcC0+cmVmLCAxKTsKLSAgcmV0dXJuICZlcC0+YmFzZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oIGIvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjhmODQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TRUNVUklUWV9TRUNVUkVfRU5EUE9JTlRfSAotI2RlZmluZSBHUlBDX0NPUkVfU0VDVVJJVFlfU0VDVVJFX0VORFBPSU5UX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0KLXN0cnVjdCB0c2lfZnJhbWVfcHJvdGVjdG9yOwotCi1leHRlcm4gaW50IGdycGNfdHJhY2Vfc2VjdXJlX2VuZHBvaW50OwotCi0vKiBUYWtlcyBvd25lcnNoaXAgb2YgcHJvdGVjdG9yIGFuZCB0b193cmFwLCBhbmQgcmVmcyBsZWZ0b3Zlcl9zbGljZXMuICovCi1ncnBjX2VuZHBvaW50ICpncnBjX3NlY3VyZV9lbmRwb2ludF9jcmVhdGUoCi0gICAgc3RydWN0IHRzaV9mcmFtZV9wcm90ZWN0b3IgKnByb3RlY3RvciwgZ3JwY19lbmRwb2ludCAqdG9fd3JhcCwKLSAgICBncHJfc2xpY2UgKmxlZnRvdmVyX3NsaWNlcywgc2l6ZV90IGxlZnRvdmVyX25zbGljZXMpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NFQ1VSSVRZX1NFQ1VSRV9FTkRQT0lOVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyBiL3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmVjMjYzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jCisrKyAvZGV2L251bGwKQEAgLTEsODEyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIKLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9ob3N0X3BvcnQuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIKLQotLyogLS0gQ29uc3RhbnRzLiAtLSAqLwotCi0jaWZuZGVmIElOU1RBTExfUFJFRklYCi1zdGF0aWMgY29uc3QgY2hhciAqaW5zdGFsbGVkX3Jvb3RzX3BhdGggPSAiL3Vzci9zaGFyZS9ncnBjL3Jvb3RzLnBlbSI7Ci0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKmluc3RhbGxlZF9yb290c19wYXRoID0KLSAgICBJTlNUQUxMX1BSRUZJWCAiL3NoYXJlL2dycGMvcm9vdHMucGVtIjsKLSNlbmRpZgotCi0vKiAtLSBPdmVycmlkZGVuIGRlZmF1bHQgcm9vdHMuIC0tICovCi0KLXN0YXRpYyBncnBjX3NzbF9yb290c19vdmVycmlkZV9jYWxsYmFjayBzc2xfcm9vdHNfb3ZlcnJpZGVfY2IgPSBOVUxMOwotCi12b2lkIGdycGNfc2V0X3NzbF9yb290c19vdmVycmlkZV9jYWxsYmFjayhncnBjX3NzbF9yb290c19vdmVycmlkZV9jYWxsYmFjayBjYikgewotICBzc2xfcm9vdHNfb3ZlcnJpZGVfY2IgPSBjYjsKLX0KLQotLyogLS0gQ2lwaGVyIHN1aXRlcy4gLS0gKi8KLQotLyogRGVmaW5lcyB0aGUgY2lwaGVyIHN1aXRlcyB0aGF0IHdlIGFjY2VwdCBieSBkZWZhdWx0LiBBbGwgdGhlc2UgY2lwaGVyIHN1aXRlcwotICAgYXJlIGNvbXBsaWFudCB3aXRoIEhUVFAyLiAqLwotI2RlZmluZSBHUlBDX1NTTF9DSVBIRVJfU1VJVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTY6RUNESEUtUlNBLUFFUzEyOC1TSEEyNTY6RUNESEUtUlNBLUFFUzI1Ni0iIFwKLSAgIlNIQTM4NDpFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQiCi0KLXN0YXRpYyBncHJfb25jZSBjaXBoZXJfc3VpdGVzX29uY2UgPSBHUFJfT05DRV9JTklUOwotc3RhdGljIGNvbnN0IGNoYXIgKmNpcGhlcl9zdWl0ZXMgPSBOVUxMOwotCi1zdGF0aWMgdm9pZCBpbml0X2NpcGhlcl9zdWl0ZXModm9pZCkgewotICBjaGFyICpvdmVycmlkZGVuID0gZ3ByX2dldGVudigiR1JQQ19TU0xfQ0lQSEVSX1NVSVRFUyIpOwotICBjaXBoZXJfc3VpdGVzID0gb3ZlcnJpZGRlbiAhPSBOVUxMID8gb3ZlcnJpZGRlbiA6IEdSUENfU1NMX0NJUEhFUl9TVUlURVM7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzc2xfY2lwaGVyX3N1aXRlcyh2b2lkKSB7Ci0gIGdwcl9vbmNlX2luaXQoJmNpcGhlcl9zdWl0ZXNfb25jZSwgaW5pdF9jaXBoZXJfc3VpdGVzKTsKLSAgcmV0dXJuIGNpcGhlcl9zdWl0ZXM7Ci19Ci0KLS8qIC0tIENvbW1vbiBtZXRob2RzLiAtLSAqLwotCi0vKiBSZXR1cm5zIHRoZSBmaXJzdCBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZS4gKi8KLWNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICp0c2lfcGVlcl9nZXRfcHJvcGVydHlfYnlfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7Ci0gIHNpemVfdCBpOwotICBpZiAocGVlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IHBlZXItPnByb3BlcnR5X2NvdW50OyBpKyspIHsKLSAgICBjb25zdCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkgPSAmcGVlci0+cHJvcGVydGllc1tpXTsKLSAgICBpZiAobmFtZSA9PSBOVUxMICYmIHByb3BlcnR5LT5uYW1lID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgIT0gTlVMTCAmJiBwcm9wZXJ0eS0+bmFtZSAhPSBOVUxMICYmCi0gICAgICAgIHN0cmNtcChwcm9wZXJ0eS0+bmFtZSwgbmFtZSkgPT0gMCkgewotICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3Jfc2h1dGRvd24oCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqY29ubmVjdG9yKSB7Ci0gIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0ICp0bXA7Ci0gIGdwcl9tdV9sb2NrKCZjb25uZWN0b3ItPm11KTsKLSAgd2hpbGUgKGNvbm5lY3Rvci0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlcykgewotICAgIHRtcCA9IGNvbm5lY3Rvci0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlczsKLSAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9zaHV0ZG93bigKLSAgICAgICAgZXhlY19jdHgsIGNvbm5lY3Rvci0+aGFuZHNoYWtpbmdfaGFuZHNoYWtlcy0+aGFuZHNoYWtlKTsKLSAgICBjb25uZWN0b3ItPmhhbmRzaGFraW5nX2hhbmRzaGFrZXMgPSB0bXAtPm5leHQ7Ci0gICAgZ3ByX2ZyZWUodG1wKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZjb25uZWN0b3ItPm11KTsKLX0KLQotdm9pZCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LCBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiIGNiLAotICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBpZiAoc2MgPT0gTlVMTCB8fCBub25zZWN1cmVfZW5kcG9pbnQgPT0gTlVMTCkgewotICAgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIEdSUENfU0VDVVJJVFlfRVJST1IsIE5VTEwsIE5VTEwpOwotICB9IGVsc2UgewotICAgIHNjLT5kb19oYW5kc2hha2UoZXhlY19jdHgsIHNjLCBub25zZWN1cmVfZW5kcG9pbnQsIGNiLCB1c2VyX2RhdGEpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKLSAgICBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgKmFjY2VwdG9yLCBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCi0gICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGlmIChzYyA9PSBOVUxMIHx8IG5vbnNlY3VyZV9lbmRwb2ludCA9PSBOVUxMKSB7Ci0gICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUiwgTlVMTCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgc2MtPmRvX2hhbmRzaGFrZShleGVjX2N0eCwgc2MsIGFjY2VwdG9yLCBub25zZWN1cmVfZW5kcG9pbnQsIGNiLCB1c2VyX2RhdGEpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGlmIChzYyA9PSBOVUxMKSB7Ci0gICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUiwgTlVMTCk7Ci0gICAgdHNpX3BlZXJfZGVzdHJ1Y3QoJnBlZXIpOwotICB9IGVsc2UgewotICAgIHNjLT52dGFibGUtPmNoZWNrX3BlZXIoZXhlY19jdHgsIHNjLCBwZWVyLCBjYiwgdXNlcl9kYXRhKTsKLSAgfQotfQotCi12b2lkIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfY2hlY2tfY2FsbF9ob3N0KAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKLSAgICBjb25zdCBjaGFyICpob3N0LCBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0LAotICAgIGdycGNfc2VjdXJpdHlfY2FsbF9ob3N0X2NoZWNrX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKLSAgaWYgKHNjID09IE5VTEwgfHwgc2MtPmNoZWNrX2NhbGxfaG9zdCA9PSBOVUxMKSB7Ci0gICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgR1JQQ19TRUNVUklUWV9FUlJPUik7Ci0gIH0gZWxzZSB7Ci0gICAgc2MtPmNoZWNrX2NhbGxfaG9zdChleGVjX2N0eCwgc2MsIGhvc3QsIGF1dGhfY29udGV4dCwgY2IsIHVzZXJfZGF0YSk7Ci0gIH0KLX0KLQotI2lmZGVmIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1JFRkNPVU5UX0RFQlVHCi1ncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfcmVmKAotICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCi0gICAgY29uc3QgY2hhciAqcmVhc29uKSB7Ci0gIGlmIChzYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAotICAgICAgICAgICJTRUNVUklUWV9DT05ORUNUT1I6JXAgICByZWYgJWQgLT4gJWQgJXMiLCBzYywKLSAgICAgICAgICAoaW50KXNjLT5yZWZjb3VudC5jb3VudCwgKGludClzYy0+cmVmY291bnQuY291bnQgKyAxLCByZWFzb24pOwotI2Vsc2UKLWdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9yZWYoCi0gICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7Ci0gIGlmIChzYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSNlbmRpZgotICBncHJfcmVmKCZzYy0+cmVmY291bnQpOwotICByZXR1cm4gc2M7Ci19Ci0KLSNpZmRlZiBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9SRUZDT1VOVF9ERUJVRwotdm9pZCBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl91bnJlZihncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pIHsKLSAgaWYgKHNjID09IE5VTEwpIHJldHVybjsKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLAotICAgICAgICAgICJTRUNVUklUWV9DT05ORUNUT1I6JXAgdW5yZWYgJWQgLT4gJWQgJXMiLCBzYywKLSAgICAgICAgICAoaW50KXNjLT5yZWZjb3VudC5jb3VudCwgKGludClzYy0+cmVmY291bnQuY291bnQgLSAxLCByZWFzb24pOwotI2Vsc2UKLXZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdW5yZWYoZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7Ci0gIGlmIChzYyA9PSBOVUxMKSByZXR1cm47Ci0jZW5kaWYKLSAgaWYgKGdwcl91bnJlZigmc2MtPnJlZmNvdW50KSkgc2MtPnZ0YWJsZS0+ZGVzdHJveShzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rvcl9wb2ludGVyX2FyZ19kZXN0cm95KHZvaWQgKnApIHsKLSAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYocCwgImNvbm5lY3Rvcl9wb2ludGVyX2FyZyIpOwotfQotCi1zdGF0aWMgdm9pZCAqY29ubmVjdG9yX3BvaW50ZXJfYXJnX2NvcHkodm9pZCAqcCkgewotICByZXR1cm4gR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKHAsICJjb25uZWN0b3JfcG9pbnRlcl9hcmciKTsKLX0KLQotc3RhdGljIGludCBjb25uZWN0b3JfcG9pbnRlcl9jbXAodm9pZCAqYSwgdm9pZCAqYikgeyByZXR1cm4gR1BSX0lDTVAoYSwgYik7IH0KLQotc3RhdGljIGNvbnN0IGdycGNfYXJnX3BvaW50ZXJfdnRhYmxlIGNvbm5lY3Rvcl9wb2ludGVyX3Z0YWJsZSA9IHsKLSAgICBjb25uZWN0b3JfcG9pbnRlcl9hcmdfY29weSwgY29ubmVjdG9yX3BvaW50ZXJfYXJnX2Rlc3Ryb3ksCi0gICAgY29ubmVjdG9yX3BvaW50ZXJfY21wfTsKLQotZ3JwY19hcmcgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdG9fYXJnKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYykgewotICBncnBjX2FyZyByZXN1bHQ7Ci0gIHJlc3VsdC50eXBlID0gR1JQQ19BUkdfUE9JTlRFUjsKLSAgcmVzdWx0LmtleSA9IEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX0FSRzsKLSAgcmVzdWx0LnZhbHVlLnBvaW50ZXIudnRhYmxlID0gJmNvbm5lY3Rvcl9wb2ludGVyX3Z0YWJsZTsKLSAgcmVzdWx0LnZhbHVlLnBvaW50ZXIucCA9IHNjOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1ncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZykgewotICBpZiAoc3RyY21wKGFyZy0+a2V5LCBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9BUkcpKSByZXR1cm4gTlVMTDsKLSAgaWYgKGFyZy0+dHlwZSAhPSBHUlBDX0FSR19QT0lOVEVSKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHR5cGUgJWQgZm9yIGFyZyAlcyIsIGFyZy0+dHlwZSwKLSAgICAgICAgICAgIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX0FSRyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGFyZy0+dmFsdWUucG9pbnRlci5wOwotfQotCi1ncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19maW5kX3NlY3VyaXR5X2Nvbm5lY3Rvcl9pbl9hcmdzKAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKSB7Ci0gIHNpemVfdCBpOwotICBpZiAoYXJncyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ3MtPm51bV9hcmdzOyBpKyspIHsKLSAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MgPQotICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9mcm9tX2FyZygmYXJncy0+YXJnc1tpXSk7Ci0gICAgaWYgKHNjICE9IE5VTEwpIHJldHVybiBzYzsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogLS0gRmFrZSBpbXBsZW1lbnRhdGlvbi4gLS0gKi8KLQotc3RhdGljIHZvaWQgZmFrZV9jaGFubmVsX2Rlc3Ryb3koZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7Ci0gIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmMgPSAoZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoYy0+cmVxdWVzdF9tZXRhZGF0YV9jcmVkcyk7Ci0gIGdwcl9mcmVlKHNjKTsKLX0KLQotc3RhdGljIHZvaWQgZmFrZV9zZXJ2ZXJfZGVzdHJveShncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MpIHsKLSAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpjID0gKGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotICBncHJfbXVfZGVzdHJveSgmYy0+bXUpOwotICBncHJfZnJlZShzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZha2VfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsIHRzaV9wZWVyIHBlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9wZWVyX2NoZWNrX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpIHsKLSAgY29uc3QgY2hhciAqcHJvcF9uYW1lOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX09LOwotICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0ID0gTlVMTDsKLSAgaWYgKHBlZXIucHJvcGVydHlfY291bnQgIT0gMSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRmFrZSBwZWVycyBzaG91bGQgb25seSBoYXZlIDEgcHJvcGVydHkuIik7Ci0gICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9FUlJPUjsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBwcm9wX25hbWUgPSBwZWVyLnByb3BlcnRpZXNbMF0ubmFtZTsKLSAgaWYgKHByb3BfbmFtZSA9PSBOVUxMIHx8Ci0gICAgICBzdHJjbXAocHJvcF9uYW1lLCBUU0lfQ0VSVElGSUNBVEVfVFlQRV9QRUVSX1BST1BFUlRZKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5leHBlY3RlZCBwcm9wZXJ0eSBpbiBmYWtlIHBlZXI6ICVzLiIsCi0gICAgICAgICAgICBwcm9wX25hbWUgPT0gTlVMTCA/ICI8RU1QVFk+IiA6IHByb3BfbmFtZSk7Ci0gICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9FUlJPUjsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBpZiAoc3RybmNtcChwZWVyLnByb3BlcnRpZXNbMF0udmFsdWUuZGF0YSwgVFNJX0ZBS0VfQ0VSVElGSUNBVEVfVFlQRSwKLSAgICAgICAgICAgICAgcGVlci5wcm9wZXJ0aWVzWzBdLnZhbHVlLmxlbmd0aCkpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgdmFsdWUgZm9yIGNlcnQgdHlwZSBwcm9wZXJ0eS4iKTsKLSAgICBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX0VSUk9SOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIGF1dGhfY29udGV4dCA9IGdycGNfYXV0aF9jb250ZXh0X2NyZWF0ZShOVUxMKTsKLSAgZ3JwY19hdXRoX2NvbnRleHRfYWRkX2NzdHJpbmdfcHJvcGVydHkoCi0gICAgICBhdXRoX2NvbnRleHQsIEdSUENfVFJBTlNQT1JUX1NFQ1VSSVRZX1RZUEVfUFJPUEVSVFlfTkFNRSwKLSAgICAgIEdSUENfRkFLRV9UUkFOU1BPUlRfU0VDVVJJVFlfVFlQRSk7Ci0KLWVuZDoKLSAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgc3RhdHVzLCBhdXRoX2NvbnRleHQpOwotICBncnBjX2F1dGhfY29udGV4dF91bnJlZihhdXRoX2NvbnRleHQpOwotICB0c2lfcGVlcl9kZXN0cnVjdCgmcGVlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZha2VfY2hhbm5lbF9jaGVja19jYWxsX2hvc3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIEdSUENfU0VDVVJJVFlfT0spOwotfQotCi1zdGF0aWMgdm9pZCBmYWtlX2NoYW5uZWxfZG9faGFuZHNoYWtlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19kb19zZWN1cml0eV9oYW5kc2hha2UoZXhlY19jdHgsIHRzaV9jcmVhdGVfZmFrZV9oYW5kc2hha2VyKDEpLCAmc2MtPmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIG5vbnNlY3VyZV9lbmRwb2ludCwgY2IsIHVzZXJfZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZha2Vfc2VydmVyX2RvX2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9hY2NlcHRvciAqYWNjZXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqbm9uc2VjdXJlX2VuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGdycGNfZG9fc2VjdXJpdHlfaGFuZHNoYWtlKGV4ZWNfY3R4LCB0c2lfY3JlYXRlX2Zha2VfaGFuZHNoYWtlcigwKSwgJnNjLT5iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbm9uc2VjdXJlX2VuZHBvaW50LCBjYiwgdXNlcl9kYXRhKTsKLX0KLQotc3RhdGljIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3Z0YWJsZSBmYWtlX2NoYW5uZWxfdnRhYmxlID0gewotICAgIGZha2VfY2hhbm5lbF9kZXN0cm95LCBmYWtlX2NoZWNrX3BlZXJ9OwotCi1zdGF0aWMgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdnRhYmxlIGZha2Vfc2VydmVyX3Z0YWJsZSA9IHtmYWtlX3NlcnZlcl9kZXN0cm95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV9jaGVja19wZWVyfTsKLQotZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19mYWtlX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMpIHsKLSAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLSAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLnJlZmNvdW50LCAxKTsKLSAgYy0+YmFzZS51cmxfc2NoZW1lID0gR1JQQ19GQUtFX1NFQ1VSSVRZX1VSTF9TQ0hFTUU7Ci0gIGMtPmJhc2UudnRhYmxlID0gJmZha2VfY2hhbm5lbF92dGFibGU7Ci0gIGMtPnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMgPSBncnBjX2NhbGxfY3JlZGVudGlhbHNfcmVmKHJlcXVlc3RfbWV0YWRhdGFfY3JlZHMpOwotICBjLT5jaGVja19jYWxsX2hvc3QgPSBmYWtlX2NoYW5uZWxfY2hlY2tfY2FsbF9ob3N0OwotICBjLT5kb19oYW5kc2hha2UgPSBmYWtlX2NoYW5uZWxfZG9faGFuZHNoYWtlOwotICByZXR1cm4gYzsKLX0KLQotZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX2Zha2Vfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCi0gICAgdm9pZCkgewotICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKmMgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yKSk7Ci0gIG1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKLSAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLnJlZmNvdW50LCAxKTsKLSAgYy0+YmFzZS52dGFibGUgPSAmZmFrZV9zZXJ2ZXJfdnRhYmxlOwotICBjLT5iYXNlLnVybF9zY2hlbWUgPSBHUlBDX0ZBS0VfU0VDVVJJVFlfVVJMX1NDSEVNRTsKLSAgYy0+ZG9faGFuZHNoYWtlID0gZmFrZV9zZXJ2ZXJfZG9faGFuZHNoYWtlOwotICBncHJfbXVfaW5pdCgmYy0+bXUpOwotICByZXR1cm4gYzsKLX0KLQotLyogLS0tIFNzbCBpbXBsZW1lbnRhdGlvbi4gLS0tICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciBiYXNlOwotICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqaGFuZHNoYWtlcl9mYWN0b3J5OwotICBjaGFyICp0YXJnZXRfbmFtZTsKLSAgY2hhciAqb3ZlcnJpZGRlbl90YXJnZXRfbmFtZTsKLX0gZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yIGJhc2U7Ci0gIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpoYW5kc2hha2VyX2ZhY3Rvcnk7Ci19IGdycGNfc3NsX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3I7Ci0KLXN0YXRpYyB2b2lkIHNzbF9jaGFubmVsX2Rlc3Ryb3koZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKSB7Ci0gIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KLSAgICAgIChncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotICBncnBjX2NhbGxfY3JlZGVudGlhbHNfdW5yZWYoYy0+YmFzZS5yZXF1ZXN0X21ldGFkYXRhX2NyZWRzKTsKLSAgaWYgKGMtPmhhbmRzaGFrZXJfZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveShjLT5oYW5kc2hha2VyX2ZhY3RvcnkpOwotICB9Ci0gIGlmIChjLT50YXJnZXRfbmFtZSAhPSBOVUxMKSBncHJfZnJlZShjLT50YXJnZXRfbmFtZSk7Ci0gIGlmIChjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lICE9IE5VTEwpIGdwcl9mcmVlKGMtPm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUpOwotICBncHJfZnJlZShzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzbF9zZXJ2ZXJfZGVzdHJveShncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MpIHsKLSAgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9Ci0gICAgICAoZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotCi0gIGlmIChjLT5oYW5kc2hha2VyX2ZhY3RvcnkgIT0gTlVMTCkgewotICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koYy0+aGFuZHNoYWtlcl9mYWN0b3J5KTsKLSAgfQotICBncHJfbXVfZGVzdHJveSgmYy0+YmFzZS5tdSk7Ci0gIGdwcl9mcmVlKHNjKTsKLX0KLQotc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzIHNzbF9jcmVhdGVfaGFuZHNoYWtlcigKLSAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqaGFuZHNoYWtlcl9mYWN0b3J5LCBib29sIGlzX2NsaWVudCwKLSAgICBjb25zdCBjaGFyICpwZWVyX25hbWUsIHRzaV9oYW5kc2hha2VyICoqaGFuZHNoYWtlcikgewotICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKLSAgaWYgKGhhbmRzaGFrZXJfZmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gR1JQQ19TRUNVUklUWV9FUlJPUjsKLSAgcmVzdWx0ID0gdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXIoCi0gICAgICBoYW5kc2hha2VyX2ZhY3RvcnksIGlzX2NsaWVudCA/IHBlZXJfbmFtZSA6IE5VTEwsIGhhbmRzaGFrZXIpOwotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSGFuZHNoYWtlciBjcmVhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAotICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7Ci0gICAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7Ci0gIH0KLSAgcmV0dXJuIEdSUENfU0VDVVJJVFlfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzbF9jaGFubmVsX2RvX2hhbmRzaGFrZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmMgPQotICAgICAgKGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7Ci0gIHRzaV9oYW5kc2hha2VyICpoYW5kc2hha2VyOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBzc2xfY3JlYXRlX2hhbmRzaGFrZXIoCi0gICAgICBjLT5oYW5kc2hha2VyX2ZhY3RvcnksIHRydWUsCi0gICAgICBjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lICE9IE5VTEwgPyBjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjLT50YXJnZXRfbmFtZSwKLSAgICAgICZoYW5kc2hha2VyKTsKLSAgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7Ci0gICAgY2IoZXhlY19jdHgsIHVzZXJfZGF0YSwgc3RhdHVzLCBOVUxMLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBncnBjX2RvX3NlY3VyaXR5X2hhbmRzaGFrZShleGVjX2N0eCwgaGFuZHNoYWtlciwgJnNjLT5iYXNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlY3VyZV9lbmRwb2ludCwgY2IsIHVzZXJfZGF0YSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9kb19oYW5kc2hha2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yICphY2NlcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfaGFuZHNoYWtlX2RvbmVfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqYyA9Ci0gICAgICAoZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotICB0c2lfaGFuZHNoYWtlciAqaGFuZHNoYWtlcjsKLSAgZ3JwY19zZWN1cml0eV9zdGF0dXMgc3RhdHVzID0KLSAgICAgIHNzbF9jcmVhdGVfaGFuZHNoYWtlcihjLT5oYW5kc2hha2VyX2ZhY3RvcnksIGZhbHNlLCBOVUxMLCAmaGFuZHNoYWtlcik7Ci0gIGlmIChzdGF0dXMgIT0gR1JQQ19TRUNVUklUWV9PSykgewotICAgIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIHN0YXR1cywgTlVMTCwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3JwY19kb19zZWN1cml0eV9oYW5kc2hha2UoZXhlY19jdHgsIGhhbmRzaGFrZXIsICZzYy0+YmFzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc2VjdXJlX2VuZHBvaW50LCBjYiwgdXNlcl9kYXRhKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IHNzbF9ob3N0X21hdGNoZXNfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwgY29uc3QgY2hhciAqcGVlcl9uYW1lKSB7Ci0gIGNoYXIgKmFsbG9jYXRlZF9uYW1lID0gTlVMTDsKLSAgaW50IHI7Ci0KLSAgaWYgKHN0cmNocihwZWVyX25hbWUsICc6JykgIT0gTlVMTCkgewotICAgIGNoYXIgKmlnbm9yZWRfcG9ydDsKLSAgICBncHJfc3BsaXRfaG9zdF9wb3J0KHBlZXJfbmFtZSwgJmFsbG9jYXRlZF9uYW1lLCAmaWdub3JlZF9wb3J0KTsKLSAgICBncHJfZnJlZShpZ25vcmVkX3BvcnQpOwotICAgIHBlZXJfbmFtZSA9IGFsbG9jYXRlZF9uYW1lOwotICAgIGlmICghcGVlcl9uYW1lKSByZXR1cm4gMDsKLSAgfQotICByID0gdHNpX3NzbF9wZWVyX21hdGNoZXNfbmFtZShwZWVyLCBwZWVyX25hbWUpOwotICBncHJfZnJlZShhbGxvY2F0ZWRfbmFtZSk7Ci0gIHJldHVybiByOwotfQotCi1ncnBjX2F1dGhfY29udGV4dCAqdHNpX3NzbF9wZWVyX3RvX2F1dGhfY29udGV4dChjb25zdCB0c2lfcGVlciAqcGVlcikgewotICBzaXplX3QgaTsKLSAgZ3JwY19hdXRoX2NvbnRleHQgKmN0eCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKnBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSA9IE5VTEw7Ci0KLSAgLyogVGhlIGNhbGxlciBoYXMgY2hlY2tlZCB0aGUgY2VydGlmaWNhdGUgdHlwZSBwcm9wZXJ0eS4gKi8KLSAgR1BSX0FTU0VSVChwZWVyLT5wcm9wZXJ0eV9jb3VudCA+PSAxKTsKLSAgY3R4ID0gZ3JwY19hdXRoX2NvbnRleHRfY3JlYXRlKE5VTEwpOwotICBncnBjX2F1dGhfY29udGV4dF9hZGRfY3N0cmluZ19wcm9wZXJ0eSgKLSAgICAgIGN0eCwgR1JQQ19UUkFOU1BPUlRfU0VDVVJJVFlfVFlQRV9QUk9QRVJUWV9OQU1FLAotICAgICAgR1JQQ19TU0xfVFJBTlNQT1JUX1NFQ1VSSVRZX1RZUEUpOwotICBmb3IgKGkgPSAwOyBpIDwgcGVlci0+cHJvcGVydHlfY291bnQ7IGkrKykgewotICAgIGNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wID0gJnBlZXItPnByb3BlcnRpZXNbaV07Ci0gICAgaWYgKHByb3AtPm5hbWUgPT0gTlVMTCkgY29udGludWU7Ci0gICAgaWYgKHN0cmNtcChwcm9wLT5uYW1lLCBUU0lfWDUwOV9TVUJKRUNUX0NPTU1PTl9OQU1FX1BFRVJfUFJPUEVSVFkpID09IDApIHsKLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHN1YmplY3QgYWx0IG5hbWUsIGhhdmUgdGhlIENOIGFzIHRoZSBpZGVudGl0eS4gKi8KLSAgICAgIGlmIChwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgPT0gTlVMTCkgewotICAgICAgICBwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgPSBHUlBDX1g1MDlfQ05fUFJPUEVSVFlfTkFNRTsKLSAgICAgIH0KLSAgICAgIGdycGNfYXV0aF9jb250ZXh0X2FkZF9wcm9wZXJ0eShjdHgsIEdSUENfWDUwOV9DTl9QUk9QRVJUWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmRhdGEsIHByb3AtPnZhbHVlLmxlbmd0aCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAocHJvcC0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBUU0lfWDUwOV9TVUJKRUNUX0FMVEVSTkFUSVZFX05BTUVfUEVFUl9QUk9QRVJUWSkgPT0gMCkgewotICAgICAgcGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lID0gR1JQQ19YNTA5X1NBTl9QUk9QRVJUWV9OQU1FOwotICAgICAgZ3JwY19hdXRoX2NvbnRleHRfYWRkX3Byb3BlcnR5KGN0eCwgR1JQQ19YNTA5X1NBTl9QUk9QRVJUWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmRhdGEsIHByb3AtPnZhbHVlLmxlbmd0aCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAocHJvcC0+bmFtZSwgVFNJX1g1MDlfUEVNX0NFUlRfUFJPUEVSVFkpID09IDApIHsKLSAgICAgIGdycGNfYXV0aF9jb250ZXh0X2FkZF9wcm9wZXJ0eShjdHgsIEdSUENfWDUwOV9QRU1fQ0VSVF9QUk9QRVJUWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmRhdGEsIHByb3AtPnZhbHVlLmxlbmd0aCk7Ci0gICAgfQotICB9Ci0gIGlmIChwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgIT0gTlVMTCkgewotICAgIEdQUl9BU1NFUlQoZ3JwY19hdXRoX2NvbnRleHRfc2V0X3BlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSgKLSAgICAgICAgICAgICAgICAgICBjdHgsIHBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSkgPT0gMSk7Ci0gIH0KLSAgcmV0dXJuIGN0eDsKLX0KLQotc3RhdGljIGdycGNfc2VjdXJpdHlfc3RhdHVzIHNzbF9jaGVja19wZWVyKGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwZWVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNpX3BlZXIgKnBlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKiphdXRoX2NvbnRleHQpIHsKLSAgLyogQ2hlY2sgdGhlIEFMUE4uICovCi0gIGNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICpwID0KLSAgICAgIHRzaV9wZWVyX2dldF9wcm9wZXJ0eV9ieV9uYW1lKHBlZXIsIFRTSV9TU0xfQUxQTl9TRUxFQ1RFRF9QUk9UT0NPTCk7Ci0gIGlmIChwID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIk1pc3Npbmcgc2VsZWN0ZWQgQUxQTiBwcm9wZXJ0eS4iKTsKLSAgICByZXR1cm4gR1JQQ19TRUNVUklUWV9FUlJPUjsKLSAgfQotICBpZiAoIWdycGNfY2h0dHAyX2lzX2FscG5fdmVyc2lvbl9zdXBwb3J0ZWQocC0+dmFsdWUuZGF0YSwgcC0+dmFsdWUubGVuZ3RoKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBBTFBOIHZhbHVlLiIpOwotICAgIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOwotICB9Ci0KLSAgLyogQ2hlY2sgdGhlIHBlZXIgbmFtZSBpZiBzcGVjaWZpZWQuICovCi0gIGlmIChwZWVyX25hbWUgIT0gTlVMTCAmJiAhc3NsX2hvc3RfbWF0Y2hlc19uYW1lKHBlZXIsIHBlZXJfbmFtZSkpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlBlZXIgbmFtZSAlcyBpcyBub3QgaW4gcGVlciBjZXJ0aWZpY2F0ZSIsIHBlZXJfbmFtZSk7Ci0gICAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7Ci0gIH0KLSAgKmF1dGhfY29udGV4dCA9IHRzaV9zc2xfcGVlcl90b19hdXRoX2NvbnRleHQocGVlcik7Ci0gIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOwotfQotCi1zdGF0aWMgdm9pZCBzc2xfY2hhbm5lbF9jaGVja19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsIHRzaV9wZWVyIHBlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfcGVlcl9jaGVja19jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpjID0KLSAgICAgIChncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqKXNjOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXM7Ci0gIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQgPSBOVUxMOwotICBzdGF0dXMgPSBzc2xfY2hlY2tfcGVlcihzYywgYy0+b3ZlcnJpZGRlbl90YXJnZXRfbmFtZSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjLT50YXJnZXRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlZXIsICZhdXRoX2NvbnRleHQpOwotICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBzdGF0dXMsIGF1dGhfY29udGV4dCk7Ci0gIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKGF1dGhfY29udGV4dCk7Ci0gIHRzaV9wZWVyX2Rlc3RydWN0KCZwZWVyKTsKLX0KLQotc3RhdGljIHZvaWQgc3NsX3NlcnZlcl9jaGVja19wZWVyKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpzYywgdHNpX3BlZXIgcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQgPSBOVUxMOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBzc2xfY2hlY2tfcGVlcihzYywgTlVMTCwgJnBlZXIsICZhdXRoX2NvbnRleHQpOwotICB0c2lfcGVlcl9kZXN0cnVjdCgmcGVlcik7Ci0gIGNiKGV4ZWNfY3R4LCB1c2VyX2RhdGEsIHN0YXR1cywgYXV0aF9jb250ZXh0KTsKLSAgZ3JwY19hdXRoX2NvbnRleHRfdW5yZWYoYXV0aF9jb250ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgYWRkX3NoYWxsb3dfYXV0aF9wcm9wZXJ0eV90b19wZWVyKHRzaV9wZWVyICpwZWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0c2lfcHJvcF9uYW1lKSB7Ci0gIHRzaV9wZWVyX3Byb3BlcnR5ICp0c2lfcHJvcCA9ICZwZWVyLT5wcm9wZXJ0aWVzW3BlZXItPnByb3BlcnR5X2NvdW50KytdOwotICB0c2lfcHJvcC0+bmFtZSA9IChjaGFyICopdHNpX3Byb3BfbmFtZTsKLSAgdHNpX3Byb3AtPnZhbHVlLmRhdGEgPSBwcm9wLT52YWx1ZTsKLSAgdHNpX3Byb3AtPnZhbHVlLmxlbmd0aCA9IHByb3AtPnZhbHVlX2xlbmd0aDsKLX0KLQotdHNpX3BlZXIgdHNpX3NoYWxsb3dfcGVlcl9mcm9tX3NzbF9hdXRoX2NvbnRleHQoCi0gICAgY29uc3QgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgewotICBzaXplX3QgbWF4X251bV9wcm9wcyA9IDA7Ci0gIGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvciBpdDsKLSAgY29uc3QgZ3JwY19hdXRoX3Byb3BlcnR5ICpwcm9wOwotICB0c2lfcGVlciBwZWVyOwotICBtZW1zZXQoJnBlZXIsIDAsIHNpemVvZihwZWVyKSk7Ci0KLSAgaXQgPSBncnBjX2F1dGhfY29udGV4dF9wcm9wZXJ0eV9pdGVyYXRvcihhdXRoX2NvbnRleHQpOwotICB3aGlsZSAoZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX25leHQoJml0KSAhPSBOVUxMKSBtYXhfbnVtX3Byb3BzKys7Ci0KLSAgaWYgKG1heF9udW1fcHJvcHMgPiAwKSB7Ci0gICAgcGVlci5wcm9wZXJ0aWVzID0gZ3ByX21hbGxvYyhtYXhfbnVtX3Byb3BzICogc2l6ZW9mKHRzaV9wZWVyX3Byb3BlcnR5KSk7Ci0gICAgaXQgPSBncnBjX2F1dGhfY29udGV4dF9wcm9wZXJ0eV9pdGVyYXRvcihhdXRoX2NvbnRleHQpOwotICAgIHdoaWxlICgocHJvcCA9IGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvcl9uZXh0KCZpdCkpICE9IE5VTEwpIHsKLSAgICAgIGlmIChzdHJjbXAocHJvcC0+bmFtZSwgR1JQQ19YNTA5X1NBTl9QUk9QRVJUWV9OQU1FKSA9PSAwKSB7Ci0gICAgICAgIGFkZF9zaGFsbG93X2F1dGhfcHJvcGVydHlfdG9fcGVlcigKLSAgICAgICAgICAgICZwZWVyLCBwcm9wLCBUU0lfWDUwOV9TVUJKRUNUX0FMVEVSTkFUSVZFX05BTUVfUEVFUl9QUk9QRVJUWSk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChwcm9wLT5uYW1lLCBHUlBDX1g1MDlfQ05fUFJPUEVSVFlfTkFNRSkgPT0gMCkgewotICAgICAgICBhZGRfc2hhbGxvd19hdXRoX3Byb3BlcnR5X3RvX3BlZXIoCi0gICAgICAgICAgICAmcGVlciwgcHJvcCwgVFNJX1g1MDlfU1VCSkVDVF9DT01NT05fTkFNRV9QRUVSX1BST1BFUlRZKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHByb3AtPm5hbWUsIEdSUENfWDUwOV9QRU1fQ0VSVF9QUk9QRVJUWV9OQU1FKSA9PSAwKSB7Ci0gICAgICAgIGFkZF9zaGFsbG93X2F1dGhfcHJvcGVydHlfdG9fcGVlcigmcGVlciwgcHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTSV9YNTA5X1BFTV9DRVJUX1BST1BFUlRZKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBlZXI7Ci19Ci0KLXZvaWQgdHNpX3NoYWxsb3dfcGVlcl9kZXN0cnVjdCh0c2lfcGVlciAqcGVlcikgewotICBpZiAocGVlci0+cHJvcGVydGllcyAhPSBOVUxMKSBncHJfZnJlZShwZWVyLT5wcm9wZXJ0aWVzKTsKLX0KLQotc3RhdGljIHZvaWQgc3NsX2NoYW5uZWxfY2hlY2tfY2FsbF9ob3N0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYiBjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmMgPQotICAgICAgKGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICopc2M7Ci0gIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyA9IEdSUENfU0VDVVJJVFlfRVJST1I7Ci0gIHRzaV9wZWVyIHBlZXIgPSB0c2lfc2hhbGxvd19wZWVyX2Zyb21fc3NsX2F1dGhfY29udGV4dChhdXRoX2NvbnRleHQpOwotICBpZiAoc3NsX2hvc3RfbWF0Y2hlc19uYW1lKCZwZWVyLCBob3N0KSkgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9PSzsKLQotICAvKiBJZiB0aGUgdGFyZ2V0IG5hbWUgd2FzIG92ZXJyaWRkZW4sIHRoZW4gdGhlIG9yaWdpbmFsIHRhcmdldF9uYW1lIHdhcwotICAgICAnY2hlY2tlZCcgdHJhbnNpdGl2ZWx5IGR1cmluZyB0aGUgcHJldmlvdXMgcGVlciBjaGVjayBhdCB0aGUgZW5kIG9mIHRoZQotICAgICBoYW5kc2hha2UuICovCi0gIGlmIChjLT5vdmVycmlkZGVuX3RhcmdldF9uYW1lICE9IE5VTEwgJiYgc3RyY21wKGhvc3QsIGMtPnRhcmdldF9uYW1lKSA9PSAwKSB7Ci0gICAgc3RhdHVzID0gR1JQQ19TRUNVUklUWV9PSzsKLSAgfQotICBjYihleGVjX2N0eCwgdXNlcl9kYXRhLCBzdGF0dXMpOwotICB0c2lfc2hhbGxvd19wZWVyX2Rlc3RydWN0KCZwZWVyKTsKLX0KLQotc3RhdGljIGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3Z0YWJsZSBzc2xfY2hhbm5lbF92dGFibGUgPSB7Ci0gICAgc3NsX2NoYW5uZWxfZGVzdHJveSwgc3NsX2NoYW5uZWxfY2hlY2tfcGVlcn07Ci0KLXN0YXRpYyBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl92dGFibGUgc3NsX3NlcnZlcl92dGFibGUgPSB7Ci0gICAgc3NsX3NlcnZlcl9kZXN0cm95LCBzc2xfc2VydmVyX2NoZWNrX3BlZXJ9OwotCi1zdGF0aWMgZ3ByX3NsaWNlIGNvbXB1dGVfZGVmYXVsdF9wZW1fcm9vdF9jZXJ0c19vbmNlKHZvaWQpIHsKLSAgZ3ByX3NsaWNlIHJlc3VsdCA9IGdwcl9lbXB0eV9zbGljZSgpOwotCi0gIC8qIEZpcnN0IHRyeSB0byBsb2FkIHRoZSByb290cyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gKi8KLSAgY2hhciAqZGVmYXVsdF9yb290X2NlcnRzX3BhdGggPQotICAgICAgZ3ByX2dldGVudihHUlBDX0RFRkFVTFRfU1NMX1JPT1RTX0ZJTEVfUEFUSF9FTlZfVkFSKTsKLSAgaWYgKGRlZmF1bHRfcm9vdF9jZXJ0c19wYXRoICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPSBncHJfbG9hZF9maWxlKGRlZmF1bHRfcm9vdF9jZXJ0c19wYXRoLCAwLCBOVUxMKTsKLSAgICBncHJfZnJlZShkZWZhdWx0X3Jvb3RfY2VydHNfcGF0aCk7Ci0gIH0KLQotICAvKiBUcnkgb3ZlcnJpZGRlbiByb290cyBpZiBuZWVkZWQuICovCi0gIGdycGNfc3NsX3Jvb3RzX292ZXJyaWRlX3Jlc3VsdCBvdnJkX3JlcyA9IEdSUENfU1NMX1JPT1RTX09WRVJSSURFX0ZBSUw7Ci0gIGlmIChHUFJfU0xJQ0VfSVNfRU1QVFkocmVzdWx0KSAmJiBzc2xfcm9vdHNfb3ZlcnJpZGVfY2IgIT0gTlVMTCkgewotICAgIGNoYXIgKnBlbV9yb290X2NlcnRzID0gTlVMTDsKLSAgICBvdnJkX3JlcyA9IHNzbF9yb290c19vdmVycmlkZV9jYigmcGVtX3Jvb3RfY2VydHMpOwotICAgIGlmIChvdnJkX3JlcyA9PSBHUlBDX1NTTF9ST09UU19PVkVSUklERV9PSykgewotICAgICAgR1BSX0FTU0VSVChwZW1fcm9vdF9jZXJ0cyAhPSBOVUxMKTsKLSAgICAgIHJlc3VsdCA9IGdwcl9zbGljZV9uZXcocGVtX3Jvb3RfY2VydHMsIHN0cmxlbihwZW1fcm9vdF9jZXJ0cyksIGdwcl9mcmVlKTsKLSAgICB9Ci0gIH0KLQotICAvKiBGYWxsIGJhY2sgdG8gaW5zdGFsbGVkIGNlcnRzIGlmIG5lZWRlZC4gKi8KLSAgaWYgKEdQUl9TTElDRV9JU19FTVBUWShyZXN1bHQpICYmCi0gICAgICBvdnJkX3JlcyAhPSBHUlBDX1NTTF9ST09UU19PVkVSUklERV9GQUlMX1BFUk1BTkVOVExZKSB7Ci0gICAgcmVzdWx0ID0gZ3ByX2xvYWRfZmlsZShpbnN0YWxsZWRfcm9vdHNfcGF0aCwgMCwgTlVMTCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGdwcl9zbGljZSBkZWZhdWx0X3BlbV9yb290X2NlcnRzOwotCi1zdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfcGVtX3Jvb3RfY2VydHModm9pZCkgewotICBkZWZhdWx0X3BlbV9yb290X2NlcnRzID0gY29tcHV0ZV9kZWZhdWx0X3BlbV9yb290X2NlcnRzX29uY2UoKTsKLX0KLQotZ3ByX3NsaWNlIGdycGNfZ2V0X2RlZmF1bHRfc3NsX3Jvb3RzX2Zvcl90ZXN0aW5nKHZvaWQpIHsKLSAgcmV0dXJuIGNvbXB1dGVfZGVmYXVsdF9wZW1fcm9vdF9jZXJ0c19vbmNlKCk7Ci19Ci0KLXNpemVfdCBncnBjX2dldF9kZWZhdWx0X3NzbF9yb290cyhjb25zdCB1bnNpZ25lZCBjaGFyICoqcGVtX3Jvb3RfY2VydHMpIHsKLSAgLyogVE9ETyhqYm9ldWZAZ29vZ2xlLmNvbSk6IE1heWJlIHJldmlzaXQgdGhlIGFwcHJvYWNoIHdoaWNoIGNvbnNpc3RzIGluCi0gICAgIGxvYWRpbmcgYWxsIHRoZSByb290cyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3MuICovCi0gIHN0YXRpYyBncHJfb25jZSBvbmNlID0gR1BSX09OQ0VfSU5JVDsKLSAgZ3ByX29uY2VfaW5pdCgmb25jZSwgaW5pdF9kZWZhdWx0X3BlbV9yb290X2NlcnRzKTsKLSAgKnBlbV9yb290X2NlcnRzID0gR1BSX1NMSUNFX1NUQVJUX1BUUihkZWZhdWx0X3BlbV9yb290X2NlcnRzKTsKLSAgcmV0dXJuIEdQUl9TTElDRV9MRU5HVEgoZGVmYXVsdF9wZW1fcm9vdF9jZXJ0cyk7Ci19Ci0KLWdycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMsCi0gICAgY29uc3QgZ3JwY19zc2xfY29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLAotICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUsIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYykgewotICBzaXplX3QgbnVtX2FscG5fcHJvdG9jb2xzID0gZ3JwY19jaHR0cDJfbnVtX2FscG5fdmVyc2lvbnMoKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqKmFscG5fcHJvdG9jb2xfc3RyaW5ncyA9Ci0gICAgICBncHJfbWFsbG9jKHNpemVvZihjb25zdCBjaGFyICopICogbnVtX2FscG5fcHJvdG9jb2xzKTsKLSAgdW5zaWduZWQgY2hhciAqYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3RocyA9Ci0gICAgICBncHJfbWFsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIG51bV9hbHBuX3Byb3RvY29scyk7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICBncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqYzsKLSAgc2l6ZV90IGk7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9yb290X2NlcnRzOwotICBzaXplX3QgcGVtX3Jvb3RfY2VydHNfc2l6ZTsKLSAgY2hhciAqcG9ydDsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FscG5fcHJvdG9jb2xzOyBpKyspIHsKLSAgICBhbHBuX3Byb3RvY29sX3N0cmluZ3NbaV0gPQotICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKWdycGNfY2h0dHAyX2dldF9hbHBuX3ZlcnNpb25faW5kZXgoaSk7Ci0gICAgYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3Roc1tpXSA9Ci0gICAgICAgICh1bnNpZ25lZCBjaGFyKXN0cmxlbihncnBjX2NodHRwMl9nZXRfYWxwbl92ZXJzaW9uX2luZGV4KGkpKTsKLSAgfQotCi0gIGlmIChjb25maWcgPT0gTlVMTCB8fCB0YXJnZXRfbmFtZSA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJBbiBzc2wgY2hhbm5lbCBuZWVkcyBhIGNvbmZpZyBhbmQgYSB0YXJnZXQgbmFtZS4iKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIGlmIChjb25maWctPnBlbV9yb290X2NlcnRzID09IE5VTEwpIHsKLSAgICBwZW1fcm9vdF9jZXJ0c19zaXplID0gZ3JwY19nZXRfZGVmYXVsdF9zc2xfcm9vdHMoJnBlbV9yb290X2NlcnRzKTsKLSAgICBpZiAocGVtX3Jvb3RfY2VydHMgPT0gTlVMTCB8fCBwZW1fcm9vdF9jZXJ0c19zaXplID09IDApIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCBkZWZhdWx0IHBlbSByb290IGNlcnRzLiIpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcGVtX3Jvb3RfY2VydHMgPSBjb25maWctPnBlbV9yb290X2NlcnRzOwotICAgIHBlbV9yb290X2NlcnRzX3NpemUgPSBjb25maWctPnBlbV9yb290X2NlcnRzX3NpemU7Ci0gIH0KLQotICBjID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19zc2xfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IpKTsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvcikpOwotCi0gIGdwcl9yZWZfaW5pdCgmYy0+YmFzZS5iYXNlLnJlZmNvdW50LCAxKTsKLSAgYy0+YmFzZS5iYXNlLnZ0YWJsZSA9ICZzc2xfY2hhbm5lbF92dGFibGU7Ci0gIGMtPmJhc2UuYmFzZS51cmxfc2NoZW1lID0gR1JQQ19TU0xfVVJMX1NDSEVNRTsKLSAgYy0+YmFzZS5yZXF1ZXN0X21ldGFkYXRhX2NyZWRzID0KLSAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFsc19yZWYocmVxdWVzdF9tZXRhZGF0YV9jcmVkcyk7Ci0gIGMtPmJhc2UuY2hlY2tfY2FsbF9ob3N0ID0gc3NsX2NoYW5uZWxfY2hlY2tfY2FsbF9ob3N0OwotICBjLT5iYXNlLmRvX2hhbmRzaGFrZSA9IHNzbF9jaGFubmVsX2RvX2hhbmRzaGFrZTsKLSAgZ3ByX3NwbGl0X2hvc3RfcG9ydCh0YXJnZXRfbmFtZSwgJmMtPnRhcmdldF9uYW1lLCAmcG9ydCk7Ci0gIGdwcl9mcmVlKHBvcnQpOwotICBpZiAob3ZlcnJpZGRlbl90YXJnZXRfbmFtZSAhPSBOVUxMKSB7Ci0gICAgYy0+b3ZlcnJpZGRlbl90YXJnZXRfbmFtZSA9IGdwcl9zdHJkdXAob3ZlcnJpZGRlbl90YXJnZXRfbmFtZSk7Ci0gIH0KLSAgcmVzdWx0ID0gdHNpX2NyZWF0ZV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSgKLSAgICAgIGNvbmZpZy0+cGVtX3ByaXZhdGVfa2V5LCBjb25maWctPnBlbV9wcml2YXRlX2tleV9zaXplLAotICAgICAgY29uZmlnLT5wZW1fY2VydF9jaGFpbiwgY29uZmlnLT5wZW1fY2VydF9jaGFpbl9zaXplLCBwZW1fcm9vdF9jZXJ0cywKLSAgICAgIHBlbV9yb290X2NlcnRzX3NpemUsIHNzbF9jaXBoZXJfc3VpdGVzKCksIGFscG5fcHJvdG9jb2xfc3RyaW5ncywKLSAgICAgIGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMsICh1aW50MTZfdCludW1fYWxwbl9wcm90b2NvbHMsCi0gICAgICAmYy0+aGFuZHNoYWtlcl9mYWN0b3J5KTsKLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZXIgZmFjdG9yeSBjcmVhdGlvbiBmYWlsZWQgd2l0aCAlcy4iLAotICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7Ci0gICAgc3NsX2NoYW5uZWxfZGVzdHJveSgmYy0+YmFzZS5iYXNlKTsKLSAgICAqc2MgPSBOVUxMOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLSAgKnNjID0gJmMtPmJhc2U7Ci0gIGdwcl9mcmVlKCh2b2lkICopYWxwbl9wcm90b2NvbF9zdHJpbmdzKTsKLSAgZ3ByX2ZyZWUoYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3Rocyk7Ci0gIHJldHVybiBHUlBDX1NFQ1VSSVRZX09LOwotCi1lcnJvcjoKLSAgZ3ByX2ZyZWUoKHZvaWQgKilhbHBuX3Byb3RvY29sX3N0cmluZ3MpOwotICBncHJfZnJlZShhbHBuX3Byb3RvY29sX3N0cmluZ19sZW5ndGhzKTsKLSAgcmV0dXJuIEdSUENfU0VDVVJJVFlfRVJST1I7Ci19Ci0KLWdycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc3NsX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAotICAgIGNvbnN0IGdycGNfc3NsX3NlcnZlcl9jb25maWcgKmNvbmZpZywgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICoqc2MpIHsKLSAgc2l6ZV90IG51bV9hbHBuX3Byb3RvY29scyA9IGdycGNfY2h0dHAyX251bV9hbHBuX3ZlcnNpb25zKCk7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphbHBuX3Byb3RvY29sX3N0cmluZ3MgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoY29uc3QgY2hhciAqKSAqIG51bV9hbHBuX3Byb3RvY29scyk7Ci0gIHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMgPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YodW5zaWduZWQgY2hhcikgKiBudW1fYWxwbl9wcm90b2NvbHMpOwotICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKLSAgZ3JwY19zc2xfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqYzsKLSAgc2l6ZV90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bV9hbHBuX3Byb3RvY29sczsgaSsrKSB7Ci0gICAgYWxwbl9wcm90b2NvbF9zdHJpbmdzW2ldID0KLSAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilncnBjX2NodHRwMl9nZXRfYWxwbl92ZXJzaW9uX2luZGV4KGkpOwotICAgIGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHNbaV0gPQotICAgICAgICAodW5zaWduZWQgY2hhcilzdHJsZW4oZ3JwY19jaHR0cDJfZ2V0X2FscG5fdmVyc2lvbl9pbmRleChpKSk7Ci0gIH0KLQotICBpZiAoY29uZmlnID09IE5VTEwgfHwgY29uZmlnLT5udW1fa2V5X2NlcnRfcGFpcnMgPT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQW4gU1NMIHNlcnZlciBuZWVkcyBhIGtleSBhbmQgYSBjZXJ0LiIpOwotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLSAgYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfc3NsX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IpKTsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZihncnBjX3NzbF9zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yKSk7Ci0KLSAgZ3ByX3JlZl9pbml0KCZjLT5iYXNlLmJhc2UucmVmY291bnQsIDEpOwotICBjLT5iYXNlLmJhc2UudXJsX3NjaGVtZSA9IEdSUENfU1NMX1VSTF9TQ0hFTUU7Ci0gIGMtPmJhc2UuYmFzZS52dGFibGUgPSAmc3NsX3NlcnZlcl92dGFibGU7Ci0gIHJlc3VsdCA9IHRzaV9jcmVhdGVfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkoCi0gICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKiljb25maWctPnBlbV9wcml2YXRlX2tleXMsCi0gICAgICBjb25maWctPnBlbV9wcml2YXRlX2tleXNfc2l6ZXMsCi0gICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKiljb25maWctPnBlbV9jZXJ0X2NoYWlucywKLSAgICAgIGNvbmZpZy0+cGVtX2NlcnRfY2hhaW5zX3NpemVzLCBjb25maWctPm51bV9rZXlfY2VydF9wYWlycywKLSAgICAgIGNvbmZpZy0+cGVtX3Jvb3RfY2VydHMsIGNvbmZpZy0+cGVtX3Jvb3RfY2VydHNfc2l6ZSwKLSAgICAgIGNvbmZpZy0+Zm9yY2VfY2xpZW50X2F1dGgsIHNzbF9jaXBoZXJfc3VpdGVzKCksIGFscG5fcHJvdG9jb2xfc3RyaW5ncywKLSAgICAgIGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMsICh1aW50MTZfdCludW1fYWxwbl9wcm90b2NvbHMsCi0gICAgICAmYy0+aGFuZHNoYWtlcl9mYWN0b3J5KTsKLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZXIgZmFjdG9yeSBjcmVhdGlvbiBmYWlsZWQgd2l0aCAlcy4iLAotICAgICAgICAgICAgdHNpX3Jlc3VsdF90b19zdHJpbmcocmVzdWx0KSk7Ci0gICAgc3NsX3NlcnZlcl9kZXN0cm95KCZjLT5iYXNlLmJhc2UpOwotICAgICpzYyA9IE5VTEw7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBncHJfbXVfaW5pdCgmYy0+YmFzZS5tdSk7Ci0gIGMtPmJhc2UuZG9faGFuZHNoYWtlID0gc3NsX3NlcnZlcl9kb19oYW5kc2hha2U7Ci0gICpzYyA9ICZjLT5iYXNlOwotICBncHJfZnJlZSgodm9pZCAqKWFscG5fcHJvdG9jb2xfc3RyaW5ncyk7Ci0gIGdwcl9mcmVlKGFscG5fcHJvdG9jb2xfc3RyaW5nX2xlbmd0aHMpOwotICByZXR1cm4gR1JQQ19TRUNVUklUWV9PSzsKLQotZXJyb3I6Ci0gIGdwcl9mcmVlKCh2b2lkICopYWxwbl9wcm90b2NvbF9zdHJpbmdzKTsKLSAgZ3ByX2ZyZWUoYWxwbl9wcm90b2NvbF9zdHJpbmdfbGVuZ3Rocyk7Ci0gIHJldHVybiBHUlBDX1NFQ1VSSVRZX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmggYi9zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5MTVlYi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TRUNVUklUWV9TRUNVUklUWV9DT05ORUNUT1JfSAotI2RlZmluZSBHUlBDX0NPUkVfU0VDVVJJVFlfU0VDVVJJVFlfQ09OTkVDVE9SX0gKLQotI2luY2x1ZGUgPGdycGMvZ3JwY19zZWN1cml0eS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0KLS8qIC0tLSBzdGF0dXMgZW51bS4gLS0tICovCi0KLXR5cGVkZWYgZW51bSB7IEdSUENfU0VDVVJJVFlfT0sgPSAwLCBHUlBDX1NFQ1VSSVRZX0VSUk9SIH0gZ3JwY19zZWN1cml0eV9zdGF0dXM7Ci0KLS8qIC0tLSBVUkwgc2NoZW1lcy4gLS0tICovCi0KLSNkZWZpbmUgR1JQQ19TU0xfVVJMX1NDSEVNRSAiaHR0cHMiCi0jZGVmaW5lIEdSUENfRkFLRV9TRUNVUklUWV9VUkxfU0NIRU1FICJodHRwK2Zha2Vfc2VjdXJpdHkiCi0KLS8qIC0tLSBzZWN1cml0eV9jb25uZWN0b3Igb2JqZWN0LiAtLS0KLQotICAgIEEgc2VjdXJpdHkgY29ubmVjdG9yIG9iamVjdCByZXByZXNlbnRzIGF3YXkgdG8gY29uZmlndXJlIHRoZSB1bmRlcmx5aW5nCi0gICAgdHJhbnNwb3J0IHNlY3VyaXR5IG1lY2hhbmlzbSBhbmQgY2hlY2sgdGhlIHJlc3VsdGluZyB0cnVzdGVkIHBlZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvcjsKLQotI2RlZmluZSBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9BUkcgImdycGMuc2VjdXJpdHlfY29ubmVjdG9yIgotCi10eXBlZGVmIHZvaWQgKCpncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCk7Ci0KLS8qIE93bmVyc2hpcCBvZiB0aGUgc2VjdXJlX2VuZHBvaW50IGlzIHRyYW5zZmVyZWQuICovCi10eXBlZGVmIHZvaWQgKCpncnBjX3NlY3VyaXR5X2hhbmRzaGFrZV9kb25lX2NiKSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLCBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMsCi0gICAgZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VuZHBvaW50LCBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0KTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2b2lkICgqZGVzdHJveSkoZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKTsKLSAgdm9pZCAoKmNoZWNrX3BlZXIpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICB0c2lfcGVlciBwZWVyLCBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOwotfSBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl92dGFibGU7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0IHsKLSAgdm9pZCAqaGFuZHNoYWtlOwotICBzdHJ1Y3QgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfaGFuZHNoYWtlX2xpc3QgKm5leHQ7Ci19IGdycGNfc2VjdXJpdHlfY29ubmVjdG9yX2hhbmRzaGFrZV9saXN0OwotCi1zdHJ1Y3QgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgewotICBjb25zdCBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl92dGFibGUgKnZ0YWJsZTsKLSAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OwotICBjb25zdCBjaGFyICp1cmxfc2NoZW1lOwotfTsKLQotLyogUmVmY291bnRpbmcuICovCi0jaWZkZWYgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGQ09VTlRfREVCVUcKLSNkZWZpbmUgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfUkVGKHAsIHIpIFwKLSAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfcmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi0jZGVmaW5lIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1VOUkVGKHAsIHIpIFwKLSAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdW5yZWYoKHApLCBfX0ZJTEVfXywgX19MSU5FX18sIChyKSkKLWdycGNfc2VjdXJpdHlfY29ubmVjdG9yICpncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9yZWYoCi0gICAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnBvbGljeSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCi0gICAgY29uc3QgY2hhciAqcmVhc29uKTsKLXZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdW5yZWYoZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci0jZWxzZQotI2RlZmluZSBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9SRUYocCwgcikgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfcmVmKChwKSkKLSNkZWZpbmUgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYocCwgcikgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdW5yZWYoKHApKQotZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKmdycGNfc2VjdXJpdHlfY29ubmVjdG9yX3JlZigKLSAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqcG9saWN5KTsKLXZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdW5yZWYoZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnBvbGljeSk7Ci0jZW5kaWYKLQotLyogQ2hlY2sgdGhlIHBlZXIuIENhbGxlZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBlZXIgb2JqZWN0LgotICAgVGhlIGNhbGxiYWNrIHdpbGwgaW5jbHVkZSB0aGUgcmVzdWx0aW5nIGF1dGhfY29udGV4dC4gKi8KLXZvaWQgZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfY2hlY2tfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3BlZXJfY2hlY2tfY2IgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKLQotLyogVXRpbCB0byBlbmNhcHN1bGF0ZSB0aGUgY29ubmVjdG9yIGluIGEgY2hhbm5lbCBhcmcuICovCi1ncnBjX2FyZyBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl90b19hcmcoZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKnNjKTsKLQotLyogVXRpbCB0byBnZXQgdGhlIGNvbm5lY3RvciBmcm9tIGEgY2hhbm5lbCBhcmcuICovCi1ncnBjX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZyk7Ci0KLS8qIFV0aWwgdG8gZmluZCB0aGUgY29ubmVjdG9yIGZyb20gY2hhbm5lbCBhcmdzLiAqLwotZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgKmdycGNfZmluZF9zZWN1cml0eV9jb25uZWN0b3JfaW5fYXJncygKLSAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncyk7Ci0KLS8qIC0tLSBjaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciBvYmplY3QuIC0tLQotCi0gICAgQSBjaGFubmVsIHNlY3VyaXR5IGNvbm5lY3RvciBvYmplY3QgcmVwcmVzZW50cyBhd2F5IHRvIGNvbmZpZ3VyZSB0aGUKLSAgICB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzZWN1cml0eSBtZWNoYW5pc20gb24gdGhlIGNsaWVudCBzaWRlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yOwotCi10eXBlZGVmIHZvaWQgKCpncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYikoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cyk7Ci0KLXN0cnVjdCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yIHsKLSAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgYmFzZTsKLSAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpyZXF1ZXN0X21ldGFkYXRhX2NyZWRzOwotICB2b2lkICgqY2hlY2tfY2FsbF9ob3N0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfY2FsbF9ob3N0X2NoZWNrX2NiIGNiLCB2b2lkICp1c2VyX2RhdGEpOwotICB2b2lkICgqZG9faGFuZHNoYWtlKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKLX07Ci0KLS8qIENoZWNrcyB0aGF0IHRoZSBob3N0IHRoYXQgd2lsbCBiZSBzZXQgZm9yIGEgY2FsbCBpcyBhY2NlcHRhYmxlLiAqLwotdm9pZCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NoZWNrX2NhbGxfaG9zdCgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgY29uc3QgY2hhciAqaG9zdCwgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCwKLSAgICBncnBjX3NlY3VyaXR5X2NhbGxfaG9zdF9jaGVja19jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKLQotLyogSGFuZHNoYWtlLiAqLwotdm9pZCBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3RvciAqY29ubmVjdG9yLAotICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwKLSAgICB2b2lkICp1c2VyX2RhdGEpOwotCi0vKiAtLS0gc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciBvYmplY3QuIC0tLQotCi0gICAgQSBzZXJ2ZXIgc2VjdXJpdHkgY29ubmVjdG9yIG9iamVjdCByZXByZXNlbnRzIGF3YXkgdG8gY29uZmlndXJlIHRoZQotICAgIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNlY3VyaXR5IG1lY2hhbmlzbSBvbiB0aGUgc2VydmVyIHNpZGUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yOwotCi1zdHJ1Y3QgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yIHsKLSAgZ3JwY19zZWN1cml0eV9jb25uZWN0b3IgYmFzZTsKLSAgZ3ByX211IG11OwotICBncnBjX3NlY3VyaXR5X2Nvbm5lY3Rvcl9oYW5kc2hha2VfbGlzdCAqaGFuZHNoYWtpbmdfaGFuZHNoYWtlczsKLSAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmNoYW5uZWxfYXJnczsKLSAgdm9pZCAoKmRvX2hhbmRzaGFrZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqc2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfdGNwX3NlcnZlcl9hY2NlcHRvciAqYWNjZXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKm5vbnNlY3VyZV9lbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKLX07Ci0KLXZvaWQgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2RvX2hhbmRzaGFrZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpzYywKLSAgICBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgKmFjY2VwdG9yLCBncnBjX2VuZHBvaW50ICpub25zZWN1cmVfZW5kcG9pbnQsCi0gICAgZ3JwY19zZWN1cml0eV9oYW5kc2hha2VfZG9uZV9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKTsKLQotdm9pZCBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3Jfc2h1dGRvd24oCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKLQotLyogLS0tIENyZWF0aW9uIHNlY3VyaXR5IGNvbm5lY3RvcnMuIC0tLSAqLwotCi0vKiBGb3IgVEVTVElORyBPTkxZIQotICAgQ3JlYXRlcyBhIGZha2UgY29ubmVjdG9yIHRoYXQgZW11bGF0ZXMgcmVhbCBjaGFubmVsIHNlY3VyaXR5LiAgKi8KLWdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKmdycGNfZmFrZV9jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9jcmVhdGUoCi0gICAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpyZXF1ZXN0X21ldGFkYXRhX2NyZWRzKTsKLQotLyogRm9yIFRFU1RJTkcgT05MWSEKLSAgIENyZWF0ZXMgYSBmYWtlIGNvbm5lY3RvciB0aGF0IGVtdWxhdGVzIHJlYWwgc2VydmVyIHNlY3VyaXR5LiAgKi8KLWdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqZ3JwY19mYWtlX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3JfY3JlYXRlKAotICAgIHZvaWQpOwotCi0vKiBDb25maWcgZm9yIHNzbCBjbGllbnRzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyICpwZW1fcHJpdmF0ZV9rZXk7Ci0gIHNpemVfdCBwZW1fcHJpdmF0ZV9rZXlfc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqcGVtX2NlcnRfY2hhaW47Ci0gIHNpemVfdCBwZW1fY2VydF9jaGFpbl9zaXplOwotICB1bnNpZ25lZCBjaGFyICpwZW1fcm9vdF9jZXJ0czsKLSAgc2l6ZV90IHBlbV9yb290X2NlcnRzX3NpemU7Ci19IGdycGNfc3NsX2NvbmZpZzsKLQotLyogQ3JlYXRlcyBhbiBTU0wgY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IuCi0gICAtIHJlcXVlc3RfbWV0YWRhdGFfY3JlZHMgaXMgdGhlIGNyZWRlbnRpYWxzIG9iamVjdCB3aGljaCBtZXRhZGF0YQotICAgICB3aWxsIGJlIHNlbnQgd2l0aCBlYWNoIHJlcXVlc3QuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBOVUxMLgotICAgLSBjb25maWcgaXMgdGhlIFNTTCBjb25maWcgdG8gYmUgdXNlZCBmb3IgdGhlIFNTTCBjaGFubmVsIGVzdGFibGlzaG1lbnQuCi0gICAtIGlzX2NsaWVudCBzaG91bGQgYmUgMCBmb3IgYSBzZXJ2ZXIgb3IgYSBub24tMCB2YWx1ZSBmb3IgYSBjbGllbnQuCi0gICAtIHNlY3VyZV9wZWVyX25hbWUgaXMgdGhlIHNlY3VyZSBwZWVyIG5hbWUgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBpbgotICAgICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NoZWNrX3BlZXIuIFRoaXMgcGFyYW1ldGVyIG1heSBiZSBOVUxMIGluCi0gICAgIHdoaWNoIGNhc2UgdGhlIHBlZXIgbmFtZSB3aWxsIG5vdCBiZSBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhpcyBwYXJhbWV0ZXIKLSAgICAgaXMgbm90IE5VTEwsIHRoZW4sIHBlbV9yb290X2NlcnRzIHNob3VsZCBub3QgYmUgTlVMTCBlaXRoZXIuCi0gICAtIHNjIGlzIGEgcG9pbnRlciBvbiB0aGUgY29ubmVjdG9yIHRvIGJlIGNyZWF0ZWQuCi0gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBHUlBDX1NFQ1VSSVRZX09LIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBhCi0gIHNwZWNpZmljIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotKi8KLWdycGNfc2VjdXJpdHlfc3RhdHVzIGdycGNfc3NsX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKLSAgICBncnBjX2NhbGxfY3JlZGVudGlhbHMgKnJlcXVlc3RfbWV0YWRhdGFfY3JlZHMsCi0gICAgY29uc3QgZ3JwY19zc2xfY29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lLAotICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRkZW5fdGFyZ2V0X25hbWUsIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKipzYyk7Ci0KLS8qIEdldHMgdGhlIGRlZmF1bHQgc3NsIHJvb3RzLiAqLwotc2l6ZV90IGdycGNfZ2V0X2RlZmF1bHRfc3NsX3Jvb3RzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZW1fcm9vdF9jZXJ0cyk7Ci0KLS8qIEV4cG9zZWQgZm9yIFRFU1RJTkcgT05MWSEuICovCi1ncHJfc2xpY2UgZ3JwY19nZXRfZGVmYXVsdF9zc2xfcm9vdHNfZm9yX3Rlc3Rpbmcodm9pZCk7Ci0KLS8qIENvbmZpZyBmb3Igc3NsIHNlcnZlcnMuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgKipwZW1fcHJpdmF0ZV9rZXlzOwotICBzaXplX3QgKnBlbV9wcml2YXRlX2tleXNfc2l6ZXM7Ci0gIHVuc2lnbmVkIGNoYXIgKipwZW1fY2VydF9jaGFpbnM7Ci0gIHNpemVfdCAqcGVtX2NlcnRfY2hhaW5zX3NpemVzOwotICBzaXplX3QgbnVtX2tleV9jZXJ0X3BhaXJzOwotICB1bnNpZ25lZCBjaGFyICpwZW1fcm9vdF9jZXJ0czsKLSAgc2l6ZV90IHBlbV9yb290X2NlcnRzX3NpemU7Ci0gIGludCBmb3JjZV9jbGllbnRfYXV0aDsKLX0gZ3JwY19zc2xfc2VydmVyX2NvbmZpZzsKLQotLyogQ3JlYXRlcyBhbiBTU0wgc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3Rvci4KLSAgIC0gY29uZmlnIGlzIHRoZSBTU0wgY29uZmlnIHRvIGJlIHVzZWQgZm9yIHRoZSBTU0wgY2hhbm5lbCBlc3RhYmxpc2htZW50LgotICAgLSBzYyBpcyBhIHBvaW50ZXIgb24gdGhlIGNvbm5lY3RvciB0byBiZSBjcmVhdGVkLgotICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgR1JQQ19TRUNVUklUWV9PSyBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgYQotICBzcGVjaWZpYyBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSovCi1ncnBjX3NlY3VyaXR5X3N0YXR1cyBncnBjX3NzbF9zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX2NyZWF0ZSgKLSAgICBjb25zdCBncnBjX3NzbF9zZXJ2ZXJfY29uZmlnICpjb25maWcsIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3RvciAqKnNjKTsKLQotLyogVXRpbC4gKi8KLWNvbnN0IHRzaV9wZWVyX3Byb3BlcnR5ICp0c2lfcGVlcl9nZXRfcHJvcGVydHlfYnlfbmFtZShjb25zdCB0c2lfcGVlciAqcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKLQotLyogRXhwb3NlZCBmb3IgdGVzdGluZyBvbmx5LiAqLwotZ3JwY19hdXRoX2NvbnRleHQgKnRzaV9zc2xfcGVlcl90b19hdXRoX2NvbnRleHQoY29uc3QgdHNpX3BlZXIgKnBlZXIpOwotdHNpX3BlZXIgdHNpX3NoYWxsb3dfcGVlcl9mcm9tX3NzbF9hdXRoX2NvbnRleHQoCi0gICAgY29uc3QgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCk7Ci12b2lkIHRzaV9zaGFsbG93X3BlZXJfZGVzdHJ1Y3QodHNpX3BlZXIgKnBlZXIpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTk5FQ1RPUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMgYi9zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWZjMGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiCi0KLSNpbmNsdWRlIDxncnBjL2dycGNfc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0KLS8qIC0tLSBncnBjX2NhbGwgLS0tICovCi0KLWdycGNfY2FsbF9lcnJvciBncnBjX2NhbGxfc2V0X2NyZWRlbnRpYWxzKGdycGNfY2FsbCAqY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlZHMpIHsKLSAgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqY3R4ID0gTlVMTDsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9zZXRfY3JlZGVudGlhbHMoY2FsbD0lcCwgY3JlZHM9JXApIiwgMiwKLSAgICAgICAgICAgICAgICAgKGNhbGwsIGNyZWRzKSk7Ci0gIGlmICghZ3JwY19jYWxsX2lzX2NsaWVudChjYWxsKSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTWV0aG9kIGlzIGNsaWVudC1zaWRlIG9ubHkuIik7Ci0gICAgcmV0dXJuIEdSUENfQ0FMTF9FUlJPUl9OT1RfT05fU0VSVkVSOwotICB9Ci0gIGN0eCA9IChncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0ICopZ3JwY19jYWxsX2NvbnRleHRfZ2V0KAotICAgICAgY2FsbCwgR1JQQ19DT05URVhUX1NFQ1VSSVRZKTsKLSAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgY3R4ID0gZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dF9jcmVhdGUoKTsKLSAgICBjdHgtPmNyZWRzID0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihjcmVkcyk7Ci0gICAgZ3JwY19jYWxsX2NvbnRleHRfc2V0KGNhbGwsIEdSUENfQ09OVEVYVF9TRUNVUklUWSwgY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2Rlc3Ryb3kpOwotICB9IGVsc2UgewotICAgIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihjdHgtPmNyZWRzKTsKLSAgICBjdHgtPmNyZWRzID0gZ3JwY19jYWxsX2NyZWRlbnRpYWxzX3JlZihjcmVkcyk7Ci0gIH0KLSAgcmV0dXJuIEdSUENfQ0FMTF9PSzsKLX0KLQotZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfY2FsbF9hdXRoX2NvbnRleHQoZ3JwY19jYWxsICpjYWxsKSB7Ci0gIHZvaWQgKnNlY19jdHggPSBncnBjX2NhbGxfY29udGV4dF9nZXQoY2FsbCwgR1JQQ19DT05URVhUX1NFQ1VSSVRZKTsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9hdXRoX2NvbnRleHQoY2FsbD0lcCkiLCAxLCAoY2FsbCkpOwotICBpZiAoc2VjX2N0eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGdycGNfY2FsbF9pc19jbGllbnQoY2FsbCkKLSAgICAgICAgICAgICA/IEdSUENfQVVUSF9DT05URVhUX1JFRigKLSAgICAgICAgICAgICAgICAgICAoKGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKilzZWNfY3R4KS0+YXV0aF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICJncnBjX2NhbGxfYXV0aF9jb250ZXh0IGNsaWVudCIpCi0gICAgICAgICAgICAgOiBHUlBDX0FVVEhfQ09OVEVYVF9SRUYoCi0gICAgICAgICAgICAgICAgICAgKChncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0ICopc2VjX2N0eCktPmF1dGhfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAiZ3JwY19jYWxsX2F1dGhfY29udGV4dCBzZXJ2ZXIiKTsKLX0KLQotdm9pZCBncnBjX2F1dGhfY29udGV4dF9yZWxlYXNlKGdycGNfYXV0aF9jb250ZXh0ICpjb250ZXh0KSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2F1dGhfY29udGV4dF9yZWxlYXNlKGNvbnRleHQ9JXApIiwgMSwgKGNvbnRleHQpKTsKLSAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYoY29udGV4dCwgImdycGNfYXV0aF9jb250ZXh0X3VucmVmIik7Ci19Ci0KLS8qIC0tLSBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0IC0tLSAqLwotCi1ncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0ICpncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSh2b2lkKSB7Ci0gIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKmN0eCA9Ci0gICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0KSk7Ci0gIG1lbXNldChjdHgsIDAsIHNpemVvZihncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0KSk7Ci0gIHJldHVybiBjdHg7Ci19Ci0KLXZvaWQgZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dF9kZXN0cm95KHZvaWQgKmN0eCkgewotICBncnBjX2NsaWVudF9zZWN1cml0eV9jb250ZXh0ICpjID0gKGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgKiljdHg7Ci0gIGdycGNfY2FsbF9jcmVkZW50aWFsc191bnJlZihjLT5jcmVkcyk7Ci0gIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKGMtPmF1dGhfY29udGV4dCwgImNsaWVudF9zZWN1cml0eV9jb250ZXh0Iik7Ci0gIGdwcl9mcmVlKGN0eCk7Ci19Ci0KLS8qIC0tLSBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0IC0tLSAqLwotCi1ncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0ICpncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSh2b2lkKSB7Ci0gIGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKmN0eCA9Ci0gICAgICBncHJfbWFsbG9jKHNpemVvZihncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0KSk7Ci0gIG1lbXNldChjdHgsIDAsIHNpemVvZihncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0KSk7Ci0gIHJldHVybiBjdHg7Ci19Ci0KLXZvaWQgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dF9kZXN0cm95KHZvaWQgKmN0eCkgewotICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0ICpjID0gKGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKiljdHg7Ci0gIEdSUENfQVVUSF9DT05URVhUX1VOUkVGKGMtPmF1dGhfY29udGV4dCwgInNlcnZlcl9zZWN1cml0eV9jb250ZXh0Iik7Ci0gIGdwcl9mcmVlKGN0eCk7Ci19Ci0KLS8qIC0tLSBncnBjX2F1dGhfY29udGV4dCAtLS0gKi8KLQotc3RhdGljIGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvciBlbXB0eV9pdGVyYXRvciA9IHtOVUxMLCAwLCBOVUxMfTsKLQotZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfYXV0aF9jb250ZXh0X2NyZWF0ZShncnBjX2F1dGhfY29udGV4dCAqY2hhaW5lZCkgewotICBncnBjX2F1dGhfY29udGV4dCAqY3R4ID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19hdXRoX2NvbnRleHQpKTsKLSAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKGdycGNfYXV0aF9jb250ZXh0KSk7Ci0gIGdwcl9yZWZfaW5pdCgmY3R4LT5yZWZjb3VudCwgMSk7Ci0gIGlmIChjaGFpbmVkICE9IE5VTEwpIHsKLSAgICBjdHgtPmNoYWluZWQgPSBHUlBDX0FVVEhfQ09OVEVYVF9SRUYoY2hhaW5lZCwgImNoYWluZWQiKTsKLSAgICBjdHgtPnBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZSA9Ci0gICAgICAgIGN0eC0+Y2hhaW5lZC0+cGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lOwotICB9Ci0gIHJldHVybiBjdHg7Ci19Ci0KLSNpZmRlZiBHUlBDX0FVVEhfQ09OVEVYVF9SRUZDT1VOVF9ERUJVRwotZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfYXV0aF9jb250ZXh0X3JlZihncnBjX2F1dGhfY29udGV4dCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKSB7Ci0gIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKLSAgICAgICAgICAiQVVUSF9DT05URVhUOiVwICAgcmVmICVkIC0+ICVkICVzIiwgY3R4LCAoaW50KWN0eC0+cmVmY291bnQuY291bnQsCi0gICAgICAgICAgKGludCljdHgtPnJlZmNvdW50LmNvdW50ICsgMSwgcmVhc29uKTsKLSNlbHNlCi1ncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfcmVmKGdycGNfYXV0aF9jb250ZXh0ICpjdHgpIHsKLSAgaWYgKGN0eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSNlbmRpZgotICBncHJfcmVmKCZjdHgtPnJlZmNvdW50KTsKLSAgcmV0dXJuIGN0eDsKLX0KLQotI2lmZGVmIEdSUENfQVVUSF9DT05URVhUX1JFRkNPVU5UX0RFQlVHCi12b2lkIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKGdycGNfYXV0aF9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pIHsKLSAgaWYgKGN0eCA9PSBOVUxMKSByZXR1cm47Ci0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKLSAgICAgICAgICAiQVVUSF9DT05URVhUOiVwIHVucmVmICVkIC0+ICVkICVzIiwgY3R4LCAoaW50KWN0eC0+cmVmY291bnQuY291bnQsCi0gICAgICAgICAgKGludCljdHgtPnJlZmNvdW50LmNvdW50IC0gMSwgcmVhc29uKTsKLSNlbHNlCi12b2lkIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKGdycGNfYXV0aF9jb250ZXh0ICpjdHgpIHsKLSAgaWYgKGN0eCA9PSBOVUxMKSByZXR1cm47Ci0jZW5kaWYKLSAgaWYgKGdwcl91bnJlZigmY3R4LT5yZWZjb3VudCkpIHsKLSAgICBzaXplX3QgaTsKLSAgICBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihjdHgtPmNoYWluZWQsICJjaGFpbmVkIik7Ci0gICAgaWYgKGN0eC0+cHJvcGVydGllcy5hcnJheSAhPSBOVUxMKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5wcm9wZXJ0aWVzLmNvdW50OyBpKyspIHsKLSAgICAgICAgZ3JwY19hdXRoX3Byb3BlcnR5X3Jlc2V0KCZjdHgtPnByb3BlcnRpZXMuYXJyYXlbaV0pOwotICAgICAgfQotICAgICAgZ3ByX2ZyZWUoY3R4LT5wcm9wZXJ0aWVzLmFycmF5KTsKLSAgICB9Ci0gICAgZ3ByX2ZyZWUoY3R4KTsKLSAgfQotfQotCi1jb25zdCBjaGFyICpncnBjX2F1dGhfY29udGV4dF9wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUoCi0gICAgY29uc3QgZ3JwY19hdXRoX2NvbnRleHQgKmN0eCkgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19hdXRoX2NvbnRleHRfcGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lKGN0eD0lcCkiLCAxLAotICAgICAgICAgICAgICAgICAoY3R4KSk7Ci0gIHJldHVybiBjdHgtPnBlZXJfaWRlbnRpdHlfcHJvcGVydHlfbmFtZTsKLX0KLQotaW50IGdycGNfYXV0aF9jb250ZXh0X3NldF9wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUoZ3JwY19hdXRoX2NvbnRleHQgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yIGl0ID0KLSAgICAgIGdycGNfYXV0aF9jb250ZXh0X2ZpbmRfcHJvcGVydGllc19ieV9uYW1lKGN0eCwgbmFtZSk7Ci0gIGNvbnN0IGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcCA9IGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvcl9uZXh0KCZpdCk7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfYXV0aF9jb250ZXh0X3NldF9wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUoY3R4PSVwLCBuYW1lPSVzKSIsIDIsCi0gICAgICAoY3R4LCBuYW1lKSk7Ci0gIGlmIChwcm9wID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlByb3BlcnR5IG5hbWUgJXMgbm90IGZvdW5kIGluIGF1dGggY29udGV4dC4iLAotICAgICAgICAgICAgbmFtZSAhPSBOVUxMID8gbmFtZSA6ICJOVUxMIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgY3R4LT5wZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWUgPSBwcm9wLT5uYW1lOwotICByZXR1cm4gMTsKLX0KLQotaW50IGdycGNfYXV0aF9jb250ZXh0X3BlZXJfaXNfYXV0aGVudGljYXRlZChjb25zdCBncnBjX2F1dGhfY29udGV4dCAqY3R4KSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2F1dGhfY29udGV4dF9wZWVyX2lzX2F1dGhlbnRpY2F0ZWQoY3R4PSVwKSIsIDEsIChjdHgpKTsKLSAgcmV0dXJuIGN0eC0+cGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lID09IE5VTEwgPyAwIDogMTsKLX0KLQotZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yIGdycGNfYXV0aF9jb250ZXh0X3Byb3BlcnR5X2l0ZXJhdG9yKAotICAgIGNvbnN0IGdycGNfYXV0aF9jb250ZXh0ICpjdHgpIHsKLSAgZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yIGl0ID0gZW1wdHlfaXRlcmF0b3I7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2F1dGhfY29udGV4dF9wcm9wZXJ0eV9pdGVyYXRvcihjdHg9JXApIiwgMSwgKGN0eCkpOwotICBpZiAoY3R4ID09IE5VTEwpIHJldHVybiBpdDsKLSAgaXQuY3R4ID0gY3R4OwotICByZXR1cm4gaXQ7Ci19Ci0KLWNvbnN0IGdycGNfYXV0aF9wcm9wZXJ0eSAqZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX25leHQoCi0gICAgZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yICppdCkgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX25leHQoaXQ9JXApIiwgMSwgKGl0KSk7Ci0gIGlmIChpdCA9PSBOVUxMIHx8IGl0LT5jdHggPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gIHdoaWxlIChpdC0+aW5kZXggPT0gaXQtPmN0eC0+cHJvcGVydGllcy5jb3VudCkgewotICAgIGlmIChpdC0+Y3R4LT5jaGFpbmVkID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIGl0LT5jdHggPSBpdC0+Y3R4LT5jaGFpbmVkOwotICAgIGl0LT5pbmRleCA9IDA7Ci0gIH0KLSAgaWYgKGl0LT5uYW1lID09IE5VTEwpIHsKLSAgICByZXR1cm4gJml0LT5jdHgtPnByb3BlcnRpZXMuYXJyYXlbaXQtPmluZGV4KytdOwotICB9IGVsc2UgewotICAgIHdoaWxlIChpdC0+aW5kZXggPCBpdC0+Y3R4LT5wcm9wZXJ0aWVzLmNvdW50KSB7Ci0gICAgICBjb25zdCBncnBjX2F1dGhfcHJvcGVydHkgKnByb3AgPSAmaXQtPmN0eC0+cHJvcGVydGllcy5hcnJheVtpdC0+aW5kZXgrK107Ci0gICAgICBHUFJfQVNTRVJUKHByb3AtPm5hbWUgIT0gTlVMTCk7Ci0gICAgICBpZiAoc3RyY21wKGl0LT5uYW1lLCBwcm9wLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgICAgfQotICAgIH0KLSAgICAvKiBXZSBjb3VsZCBub3QgZmluZCB0aGUgbmFtZSwgdHJ5IGFub3RoZXIgcm91bmQuICovCi0gICAgcmV0dXJuIGdycGNfYXV0aF9wcm9wZXJ0eV9pdGVyYXRvcl9uZXh0KGl0KTsKLSAgfQotfQotCi1ncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgZ3JwY19hdXRoX2NvbnRleHRfZmluZF9wcm9wZXJ0aWVzX2J5X25hbWUoCi0gICAgY29uc3QgZ3JwY19hdXRoX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSkgewotICBncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgaXQgPSBlbXB0eV9pdGVyYXRvcjsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfYXV0aF9jb250ZXh0X2ZpbmRfcHJvcGVydGllc19ieV9uYW1lKGN0eD0lcCwgbmFtZT0lcykiLAotICAgICAgICAgICAgICAgICAyLCAoY3R4LCBuYW1lKSk7Ci0gIGlmIChjdHggPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpIHJldHVybiBlbXB0eV9pdGVyYXRvcjsKLSAgaXQuY3R4ID0gY3R4OwotICBpdC5uYW1lID0gbmFtZTsKLSAgcmV0dXJuIGl0OwotfQotCi1ncnBjX2F1dGhfcHJvcGVydHlfaXRlcmF0b3IgZ3JwY19hdXRoX2NvbnRleHRfcGVlcl9pZGVudGl0eSgKLSAgICBjb25zdCBncnBjX2F1dGhfY29udGV4dCAqY3R4KSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2F1dGhfY29udGV4dF9wZWVyX2lkZW50aXR5KGN0eD0lcCkiLCAxLCAoY3R4KSk7Ci0gIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuIGVtcHR5X2l0ZXJhdG9yOwotICByZXR1cm4gZ3JwY19hdXRoX2NvbnRleHRfZmluZF9wcm9wZXJ0aWVzX2J5X25hbWUoCi0gICAgICBjdHgsIGN0eC0+cGVlcl9pZGVudGl0eV9wcm9wZXJ0eV9uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgZW5zdXJlX2F1dGhfY29udGV4dF9jYXBhY2l0eShncnBjX2F1dGhfY29udGV4dCAqY3R4KSB7Ci0gIGlmIChjdHgtPnByb3BlcnRpZXMuY291bnQgPT0gY3R4LT5wcm9wZXJ0aWVzLmNhcGFjaXR5KSB7Ci0gICAgY3R4LT5wcm9wZXJ0aWVzLmNhcGFjaXR5ID0KLSAgICAgICAgR1BSX01BWChjdHgtPnByb3BlcnRpZXMuY2FwYWNpdHkgKyA4LCBjdHgtPnByb3BlcnRpZXMuY2FwYWNpdHkgKiAyKTsKLSAgICBjdHgtPnByb3BlcnRpZXMuYXJyYXkgPQotICAgICAgICBncHJfcmVhbGxvYyhjdHgtPnByb3BlcnRpZXMuYXJyYXksCi0gICAgICAgICAgICAgICAgICAgIGN0eC0+cHJvcGVydGllcy5jYXBhY2l0eSAqIHNpemVvZihncnBjX2F1dGhfcHJvcGVydHkpKTsKLSAgfQotfQotCi12b2lkIGdycGNfYXV0aF9jb250ZXh0X2FkZF9wcm9wZXJ0eShncnBjX2F1dGhfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW5ndGgpIHsKLSAgZ3JwY19hdXRoX3Byb3BlcnR5ICpwcm9wOwotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX2F1dGhfY29udGV4dF9hZGRfcHJvcGVydHkoY3R4PSVwLCBuYW1lPSVzLCB2YWx1ZT0lKi4qcywgIgotICAgICAgInZhbHVlX2xlbmd0aD0lbHUpIiwKLSAgICAgIDYsIChjdHgsIG5hbWUsIChpbnQpdmFsdWVfbGVuZ3RoLCAoaW50KXZhbHVlX2xlbmd0aCwgdmFsdWUsCi0gICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdmFsdWVfbGVuZ3RoKSk7Ci0gIGVuc3VyZV9hdXRoX2NvbnRleHRfY2FwYWNpdHkoY3R4KTsKLSAgcHJvcCA9ICZjdHgtPnByb3BlcnRpZXMuYXJyYXlbY3R4LT5wcm9wZXJ0aWVzLmNvdW50KytdOwotICBwcm9wLT5uYW1lID0gZ3ByX3N0cmR1cChuYW1lKTsKLSAgcHJvcC0+dmFsdWUgPSBncHJfbWFsbG9jKHZhbHVlX2xlbmd0aCArIDEpOwotICBtZW1jcHkocHJvcC0+dmFsdWUsIHZhbHVlLCB2YWx1ZV9sZW5ndGgpOwotICBwcm9wLT52YWx1ZVt2YWx1ZV9sZW5ndGhdID0gJ1wwJzsKLSAgcHJvcC0+dmFsdWVfbGVuZ3RoID0gdmFsdWVfbGVuZ3RoOwotfQotCi12b2lkIGdycGNfYXV0aF9jb250ZXh0X2FkZF9jc3RyaW5nX3Byb3BlcnR5KGdycGNfYXV0aF9jb250ZXh0ICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7Ci0gIGdycGNfYXV0aF9wcm9wZXJ0eSAqcHJvcDsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19hdXRoX2NvbnRleHRfYWRkX2NzdHJpbmdfcHJvcGVydHkoY3R4PSVwLCBuYW1lPSVzLCB2YWx1ZT0lcykiLCAzLAotICAgICAgKGN0eCwgbmFtZSwgdmFsdWUpKTsKLSAgZW5zdXJlX2F1dGhfY29udGV4dF9jYXBhY2l0eShjdHgpOwotICBwcm9wID0gJmN0eC0+cHJvcGVydGllcy5hcnJheVtjdHgtPnByb3BlcnRpZXMuY291bnQrK107Ci0gIHByb3AtPm5hbWUgPSBncHJfc3RyZHVwKG5hbWUpOwotICBwcm9wLT52YWx1ZSA9IGdwcl9zdHJkdXAodmFsdWUpOwotICBwcm9wLT52YWx1ZV9sZW5ndGggPSBzdHJsZW4odmFsdWUpOwotfQotCi12b2lkIGdycGNfYXV0aF9wcm9wZXJ0eV9yZXNldChncnBjX2F1dGhfcHJvcGVydHkgKnByb3BlcnR5KSB7Ci0gIGdwcl9mcmVlKHByb3BlcnR5LT5uYW1lKTsKLSAgZ3ByX2ZyZWUocHJvcGVydHktPnZhbHVlKTsKLSAgbWVtc2V0KHByb3BlcnR5LCAwLCBzaXplb2YoZ3JwY19hdXRoX3Byb3BlcnR5KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1dGhfY29udGV4dF9wb2ludGVyX2FyZ19kZXN0cm95KHZvaWQgKnApIHsKLSAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYocCwgImF1dGhfY29udGV4dF9wb2ludGVyX2FyZyIpOwotfQotCi1zdGF0aWMgdm9pZCAqYXV0aF9jb250ZXh0X3BvaW50ZXJfYXJnX2NvcHkodm9pZCAqcCkgewotICByZXR1cm4gR1JQQ19BVVRIX0NPTlRFWFRfUkVGKHAsICJhdXRoX2NvbnRleHRfcG9pbnRlcl9hcmciKTsKLX0KLQotc3RhdGljIGludCBhdXRoX2NvbnRleHRfcG9pbnRlcl9jbXAodm9pZCAqYSwgdm9pZCAqYikgeyByZXR1cm4gR1BSX0lDTVAoYSwgYik7IH0KLQotc3RhdGljIGNvbnN0IGdycGNfYXJnX3BvaW50ZXJfdnRhYmxlIGF1dGhfY29udGV4dF9wb2ludGVyX3Z0YWJsZSA9IHsKLSAgICBhdXRoX2NvbnRleHRfcG9pbnRlcl9hcmdfY29weSwgYXV0aF9jb250ZXh0X3BvaW50ZXJfYXJnX2Rlc3Ryb3ksCi0gICAgYXV0aF9jb250ZXh0X3BvaW50ZXJfY21wfTsKLQotZ3JwY19hcmcgZ3JwY19hdXRoX2NvbnRleHRfdG9fYXJnKGdycGNfYXV0aF9jb250ZXh0ICpwKSB7Ci0gIGdycGNfYXJnIGFyZzsKLSAgbWVtc2V0KCZhcmcsIDAsIHNpemVvZihncnBjX2FyZykpOwotICBhcmcudHlwZSA9IEdSUENfQVJHX1BPSU5URVI7Ci0gIGFyZy5rZXkgPSBHUlBDX0FVVEhfQ09OVEVYVF9BUkc7Ci0gIGFyZy52YWx1ZS5wb2ludGVyLnAgPSBwOwotICBhcmcudmFsdWUucG9pbnRlci52dGFibGUgPSAmYXV0aF9jb250ZXh0X3BvaW50ZXJfdnRhYmxlOwotICByZXR1cm4gYXJnOwotfQotCi1ncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfZnJvbV9hcmcoY29uc3QgZ3JwY19hcmcgKmFyZykgewotICBpZiAoc3RyY21wKGFyZy0+a2V5LCBHUlBDX0FVVEhfQ09OVEVYVF9BUkcpICE9IDApIHJldHVybiBOVUxMOwotICBpZiAoYXJnLT50eXBlICE9IEdSUENfQVJHX1BPSU5URVIpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgdHlwZSAlZCBmb3IgYXJnICVzIiwgYXJnLT50eXBlLAotICAgICAgICAgICAgR1JQQ19BVVRIX0NPTlRFWFRfQVJHKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gYXJnLT52YWx1ZS5wb2ludGVyLnA7Ci19Ci0KLWdycGNfYXV0aF9jb250ZXh0ICpncnBjX2ZpbmRfYXV0aF9jb250ZXh0X2luX2FyZ3MoCi0gICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpIHsKLSAgc2l6ZV90IGk7Ci0gIGlmIChhcmdzID09IE5VTEwpIHJldHVybiBOVUxMOwotICBmb3IgKGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgewotICAgIGdycGNfYXV0aF9jb250ZXh0ICpwID0gZ3JwY19hdXRoX2NvbnRleHRfZnJvbV9hcmcoJmFyZ3MtPmFyZ3NbaV0pOwotICAgIGlmIChwICE9IE5VTEwpIHJldHVybiBwOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIGIvc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYwMWY1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TRUNVUklUWV9TRUNVUklUWV9DT05URVhUX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTlRFWFRfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCi0KLS8qIC0tLSBncnBjX2F1dGhfY29udGV4dCAtLS0KLQotICAgSGlnaCBsZXZlbCBhdXRoZW50aWNhdGlvbiBjb250ZXh0IG9iamVjdC4gQ2FuIG9wdGlvbmFsbHkgYmUgY2hhaW5lZC4gKi8KLQotLyogUHJvcGVydHkgbmFtZXMgYXJlIGFsd2F5cyBOVUxMIHRlcm1pbmF0ZWQuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19hdXRoX3Byb3BlcnR5ICphcnJheTsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgY2FwYWNpdHk7Ci19IGdycGNfYXV0aF9wcm9wZXJ0eV9hcnJheTsKLQotc3RydWN0IGdycGNfYXV0aF9jb250ZXh0IHsKLSAgc3RydWN0IGdycGNfYXV0aF9jb250ZXh0ICpjaGFpbmVkOwotICBncnBjX2F1dGhfcHJvcGVydHlfYXJyYXkgcHJvcGVydGllczsKLSAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OwotICBjb25zdCBjaGFyICpwZWVyX2lkZW50aXR5X3Byb3BlcnR5X25hbWU7Ci0gIGdycGNfcG9sbHNldCAqcG9sbHNldDsKLX07Ci0KLS8qIENyZWF0aW9uLiAqLwotZ3JwY19hdXRoX2NvbnRleHQgKmdycGNfYXV0aF9jb250ZXh0X2NyZWF0ZShncnBjX2F1dGhfY29udGV4dCAqY2hhaW5lZCk7Ci0KLS8qIFJlZmNvdW50aW5nLiAqLwotI2lmZGVmIEdSUENfQVVUSF9DT05URVhUX1JFRkNPVU5UX0RFQlVHCi0jZGVmaW5lIEdSUENfQVVUSF9DT05URVhUX1JFRihwLCByKSBcCi0gIGdycGNfYXV0aF9jb250ZXh0X3JlZigocCksIF9fRklMRV9fLCBfX0xJTkVfXywgKHIpKQotI2RlZmluZSBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihwLCByKSBcCi0gIGdycGNfYXV0aF9jb250ZXh0X3VucmVmKChwKSwgX19GSUxFX18sIF9fTElORV9fLCAocikpCi1ncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfcmVmKGdycGNfYXV0aF9jb250ZXh0ICpwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwotdm9pZCBncnBjX2F1dGhfY29udGV4dF91bnJlZihncnBjX2F1dGhfY29udGV4dCAqcG9saWN5LCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgY29uc3QgY2hhciAqcmVhc29uKTsKLSNlbHNlCi0jZGVmaW5lIEdSUENfQVVUSF9DT05URVhUX1JFRihwLCByKSBncnBjX2F1dGhfY29udGV4dF9yZWYoKHApKQotI2RlZmluZSBHUlBDX0FVVEhfQ09OVEVYVF9VTlJFRihwLCByKSBncnBjX2F1dGhfY29udGV4dF91bnJlZigocCkpCi1ncnBjX2F1dGhfY29udGV4dCAqZ3JwY19hdXRoX2NvbnRleHRfcmVmKGdycGNfYXV0aF9jb250ZXh0ICpwb2xpY3kpOwotdm9pZCBncnBjX2F1dGhfY29udGV4dF91bnJlZihncnBjX2F1dGhfY29udGV4dCAqcG9saWN5KTsKLSNlbmRpZgotCi12b2lkIGdycGNfYXV0aF9wcm9wZXJ0eV9yZXNldChncnBjX2F1dGhfcHJvcGVydHkgKnByb3BlcnR5KTsKLQotLyogLS0tIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHQgLS0tCi0KLSAgIEludGVybmFsIGNsaWVudC1zaWRlIHNlY3VyaXR5IGNvbnRleHQuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jYWxsX2NyZWRlbnRpYWxzICpjcmVkczsKLSAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dDsKLX0gZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dDsKLQotZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dCAqZ3JwY19jbGllbnRfc2VjdXJpdHlfY29udGV4dF9jcmVhdGUodm9pZCk7Ci12b2lkIGdycGNfY2xpZW50X3NlY3VyaXR5X2NvbnRleHRfZGVzdHJveSh2b2lkICpjdHgpOwotCi0vKiAtLS0gZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dCAtLS0KLQotICAgSW50ZXJuYWwgc2VydmVyLXNpZGUgc2VjdXJpdHkgY29udGV4dC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0OwotfSBncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0OwotCi1ncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0ICpncnBjX3NlcnZlcl9zZWN1cml0eV9jb250ZXh0X2NyZWF0ZSh2b2lkKTsKLXZvaWQgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dF9kZXN0cm95KHZvaWQgKmN0eCk7Ci0KLS8qIC0tLSBDaGFubmVsIGFyZ3MgZm9yIGF1dGggY29udGV4dCAtLS0gKi8KLSNkZWZpbmUgR1JQQ19BVVRIX0NPTlRFWFRfQVJHICJncnBjLmF1dGhfY29udGV4dCIKLQotZ3JwY19hcmcgZ3JwY19hdXRoX2NvbnRleHRfdG9fYXJnKGdycGNfYXV0aF9jb250ZXh0ICpjKTsKLWdycGNfYXV0aF9jb250ZXh0ICpncnBjX2F1dGhfY29udGV4dF9mcm9tX2FyZyhjb25zdCBncnBjX2FyZyAqYXJnKTsKLWdycGNfYXV0aF9jb250ZXh0ICpncnBjX2ZpbmRfYXV0aF9jb250ZXh0X2luX2FyZ3MoCi0gICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NFQ1VSSVRZX1NFQ1VSSVRZX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMgYi9zcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNDExZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgY2FsbF9kYXRhIHsKLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl9pbml0aWFsX21ldGFkYXRhOwotICAvKiBDbG9zdXJlIHRvIGNhbGwgd2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBhdXRoX29uX3JlY3YgaG9vay4gKi8KLSAgZ3JwY19jbG9zdXJlICpvbl9kb25lX3JlY3Y7Ci0gIC8qIFJlY2VpdmUgY2xvc3VyZXMgYXJlIGNoYWluZWQ6IHdlIGluamVjdCB0aGlzIGNsb3N1cmUgYXMgdGhlIG9uX2RvbmVfcmVjdgotICAgICB1cC1jYWxsIG9uIHRyYW5zcG9ydF9vcCwgYW5kIHJlbWVtYmVyIHRvIGNhbGwgb3VyIG9uX2RvbmVfcmVjdiBtZW1iZXIgYWZ0ZXIKLSAgICAgaGFuZGxpbmcgaXQuICovCi0gIGdycGNfY2xvc3VyZSBhdXRoX29uX3JlY3Y7Ci0gIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCB0cmFuc3BvcnRfb3A7Ci0gIGdycGNfbWV0YWRhdGFfYXJyYXkgbWQ7Ci0gIGNvbnN0IGdycGNfbWV0YWRhdGEgKmNvbnN1bWVkX21kOwotICBzaXplX3QgbnVtX2NvbnN1bWVkX21kOwotICBncnBjX2F1dGhfY29udGV4dCAqYXV0aF9jb250ZXh0OwotfSBjYWxsX2RhdGE7Ci0KLXR5cGVkZWYgc3RydWN0IGNoYW5uZWxfZGF0YSB7Ci0gIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQ7Ci0gIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkczsKLX0gY2hhbm5lbF9kYXRhOwotCi1zdGF0aWMgZ3JwY19tZXRhZGF0YV9hcnJheSBtZXRhZGF0YV9iYXRjaF90b19tZF9hcnJheSgKLSAgICBjb25zdCBncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCkgewotICBncnBjX2xpbmtlZF9tZGVsZW0gKmw7Ci0gIGdycGNfbWV0YWRhdGFfYXJyYXkgcmVzdWx0OwotICBncnBjX21ldGFkYXRhX2FycmF5X2luaXQoJnJlc3VsdCk7Ci0gIGZvciAobCA9IGJhdGNoLT5saXN0LmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKLSAgICBncnBjX21ldGFkYXRhICp1c3JfbWQgPSBOVUxMOwotICAgIGdycGNfbWRlbGVtICptZCA9IGwtPm1kOwotICAgIGdycGNfbWRzdHIgKmtleSA9IG1kLT5rZXk7Ci0gICAgZ3JwY19tZHN0ciAqdmFsdWUgPSBtZC0+dmFsdWU7Ci0gICAgaWYgKHJlc3VsdC5jb3VudCA9PSByZXN1bHQuY2FwYWNpdHkpIHsKLSAgICAgIHJlc3VsdC5jYXBhY2l0eSA9IEdQUl9NQVgocmVzdWx0LmNhcGFjaXR5ICsgOCwgcmVzdWx0LmNhcGFjaXR5ICogMik7Ci0gICAgICByZXN1bHQubWV0YWRhdGEgPQotICAgICAgICAgIGdwcl9yZWFsbG9jKHJlc3VsdC5tZXRhZGF0YSwgcmVzdWx0LmNhcGFjaXR5ICogc2l6ZW9mKGdycGNfbWV0YWRhdGEpKTsKLSAgICB9Ci0gICAgdXNyX21kID0gJnJlc3VsdC5tZXRhZGF0YVtyZXN1bHQuY291bnQrK107Ci0gICAgdXNyX21kLT5rZXkgPSBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGtleSk7Ci0gICAgdXNyX21kLT52YWx1ZSA9IGdycGNfbWRzdHJfYXNfY19zdHJpbmcodmFsdWUpOwotICAgIHVzcl9tZC0+dmFsdWVfbGVuZ3RoID0gR1BSX1NMSUNFX0xFTkdUSCh2YWx1ZS0+c2xpY2UpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBncnBjX21kZWxlbSAqcmVtb3ZlX2NvbnN1bWVkX21kKHZvaWQgKnVzZXJfZGF0YSwgZ3JwY19tZGVsZW0gKm1kKSB7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0gdXNlcl9kYXRhOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGNhbGxkLT5udW1fY29uc3VtZWRfbWQ7IGkrKykgewotICAgIGNvbnN0IGdycGNfbWV0YWRhdGEgKmNvbnN1bWVkX21kID0gJmNhbGxkLT5jb25zdW1lZF9tZFtpXTsKLSAgICAvKiBNYXliZSB3ZSBjb3VsZCBkbyBhIHBvaW50ZXIgY29tcGFyaXNvbiBidXQgd2UgZG8gbm90IGhhdmUgYW55IGd1YXJhbnRlZQotICAgICAgIHRoYXQgdGhlIG1ldGFkYXRhIHByb2Nlc3NvciB1c2VkIHRoZSBzYW1lIHBvaW50ZXJzIGZvciBjb25zdW1lZF9tZCBpbiB0aGUKLSAgICAgICBjYWxsYmFjay4gKi8KLSAgICBpZiAoR1BSX1NMSUNFX0xFTkdUSChtZC0+a2V5LT5zbGljZSkgIT0gc3RybGVuKGNvbnN1bWVkX21kLT5rZXkpIHx8Ci0gICAgICAgIEdQUl9TTElDRV9MRU5HVEgobWQtPnZhbHVlLT5zbGljZSkgIT0gY29uc3VtZWRfbWQtPnZhbHVlX2xlbmd0aCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChtZW1jbXAoR1BSX1NMSUNFX1NUQVJUX1BUUihtZC0+a2V5LT5zbGljZSksIGNvbnN1bWVkX21kLT5rZXksCi0gICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKG1kLT5rZXktPnNsaWNlKSkgPT0gMCAmJgotICAgICAgICBtZW1jbXAoR1BSX1NMSUNFX1NUQVJUX1BUUihtZC0+dmFsdWUtPnNsaWNlKSwgY29uc3VtZWRfbWQtPnZhbHVlLAotICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChtZC0+dmFsdWUtPnNsaWNlKSkgPT0gMCkgewotICAgICAgcmV0dXJuIE5VTEw7IC8qIERlbGV0ZS4gKi8KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1kOwotfQotCi0vKiBjYWxsZWQgZnJvbSBhcHBsaWNhdGlvbiBjb2RlICovCi1zdGF0aWMgdm9pZCBvbl9tZF9wcm9jZXNzaW5nX2RvbmUoCi0gICAgdm9pZCAqdXNlcl9kYXRhLCBjb25zdCBncnBjX21ldGFkYXRhICpjb25zdW1lZF9tZCwgc2l6ZV90IG51bV9jb25zdW1lZF9tZCwKLSAgICBjb25zdCBncnBjX21ldGFkYXRhICpyZXNwb25zZV9tZCwgc2l6ZV90IG51bV9yZXNwb25zZV9tZCwKLSAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywgY29uc3QgY2hhciAqZXJyb3JfZGV0YWlscykgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IHVzZXJfZGF0YTsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICAvKiBUT0RPKGpib2V1Zik6IEltcGxlbWVudCBzdXBwb3J0IGZvciByZXNwb25zZV9tZC4gKi8KLSAgaWYgKHJlc3BvbnNlX21kICE9IE5VTEwgJiYgbnVtX3Jlc3BvbnNlX21kID4gMCkgewotICAgIGdwcl9sb2coR1BSX0lORk8sCi0gICAgICAgICAgICAicmVzcG9uc2VfbWQgaW4gYXV0aCBtZXRhZGF0YSBwcm9jZXNzaW5nIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdy4gIgotICAgICAgICAgICAgIklnbm9yaW5nLi4uIik7Ci0gIH0KLQotICBpZiAoc3RhdHVzID09IEdSUENfU1RBVFVTX09LKSB7Ci0gICAgY2FsbGQtPmNvbnN1bWVkX21kID0gY29uc3VtZWRfbWQ7Ci0gICAgY2FsbGQtPm51bV9jb25zdW1lZF9tZCA9IG51bV9jb25zdW1lZF9tZDsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhLCByZW1vdmVfY29uc3VtZWRfbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgZ3JwY19tZXRhZGF0YV9hcnJheV9kZXN0cm95KCZjYWxsZC0+bWQpOwotICAgIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiKCZleGVjX2N0eCwgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2JfYXJnLCAxKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfc2xpY2UgbWVzc2FnZTsKLSAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgY2xvc2Vfb3A7Ci0gICAgbWVtc2V0KCZjbG9zZV9vcCwgMCwgc2l6ZW9mKGNsb3NlX29wKSk7Ci0gICAgZ3JwY19tZXRhZGF0YV9hcnJheV9kZXN0cm95KCZjYWxsZC0+bWQpOwotICAgIGVycm9yX2RldGFpbHMgPSBlcnJvcl9kZXRhaWxzICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyb3JfZGV0YWlscwotICAgICAgICAgICAgICAgICAgICAgICAgOiAiQXV0aGVudGljYXRpb24gbWV0YWRhdGEgcHJvY2Vzc2luZyBmYWlsZWQuIjsKLSAgICBtZXNzYWdlID0gZ3ByX3NsaWNlX2Zyb21fY29waWVkX3N0cmluZyhlcnJvcl9kZXRhaWxzKTsKLSAgICBjYWxsZC0+dHJhbnNwb3J0X29wLnNlbmRfaW5pdGlhbF9tZXRhZGF0YSA9IE5VTEw7Ci0gICAgaWYgKGNhbGxkLT50cmFuc3BvcnRfb3Auc2VuZF9tZXNzYWdlICE9IE5VTEwpIHsKLSAgICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveSgmZXhlY19jdHgsIGNhbGxkLT50cmFuc3BvcnRfb3Auc2VuZF9tZXNzYWdlKTsKLSAgICAgIGNhbGxkLT50cmFuc3BvcnRfb3Auc2VuZF9tZXNzYWdlID0gTlVMTDsKLSAgICB9Ci0gICAgY2FsbGQtPnRyYW5zcG9ydF9vcC5zZW5kX3RyYWlsaW5nX21ldGFkYXRhID0gTlVMTDsKLSAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfYWRkX2Nsb3NlKCZjbG9zZV9vcCwgc3RhdHVzLCAmbWVzc2FnZSk7Ci0gICAgZ3JwY19jYWxsX25leHRfb3AoJmV4ZWNfY3R4LCBlbGVtLCAmY2xvc2Vfb3ApOwotICAgIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiKCZleGVjX2N0eCwgY2FsbGQtPm9uX2RvbmVfcmVjdi0+Y2JfYXJnLCAwKTsKLSAgfQotCi0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1dGhfb25fcmVjdihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IHVzZXJfZGF0YTsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBpZiAoY2hhbmQtPmNyZWRzLT5wcm9jZXNzb3IucHJvY2VzcyAhPSBOVUxMKSB7Ci0gICAgICBjYWxsZC0+bWQgPSBtZXRhZGF0YV9iYXRjaF90b19tZF9hcnJheShjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhKTsKLSAgICAgIGNoYW5kLT5jcmVkcy0+cHJvY2Vzc29yLnByb2Nlc3MoCi0gICAgICAgICAgY2hhbmQtPmNyZWRzLT5wcm9jZXNzb3Iuc3RhdGUsIGNhbGxkLT5hdXRoX2NvbnRleHQsCi0gICAgICAgICAgY2FsbGQtPm1kLm1ldGFkYXRhLCBjYWxsZC0+bWQuY291bnQsIG9uX21kX3Byb2Nlc3NpbmdfZG9uZSwgZWxlbSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGNhbGxkLT5vbl9kb25lX3JlY3YtPmNiKGV4ZWNfY3R4LCBjYWxsZC0+b25fZG9uZV9yZWN2LT5jYl9hcmcsIHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfcmVjdl9vcHNfbWRfY2FsbGJhY2tzKGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0KLSAgaWYgKG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgewotICAgIC8qIHN1YnN0aXR1dGUgb3VyIGNhbGxiYWNrIGZvciB0aGUgaGlnaGVyIGNhbGxiYWNrICovCi0gICAgY2FsbGQtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YSA9IG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gICAgY2FsbGQtPm9uX2RvbmVfcmVjdiA9IG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7Ci0gICAgb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9ICZjYWxsZC0+YXV0aF9vbl9yZWN2OwotICAgIGNhbGxkLT50cmFuc3BvcnRfb3AgPSAqb3A7Ci0gIH0KLX0KLQotLyogQ2FsbGVkIGVpdGhlcjoKLSAgICAgLSBpbiByZXNwb25zZSB0byBhbiBBUEkgY2FsbCAob3Igc2ltaWxhcikgZnJvbSBhYm92ZSwgdG8gc2VuZCBzb21ldGhpbmcKLSAgICAgLSBhIG5ldHdvcmsgZXZlbnQgKG9yIHNpbWlsYXIpIGZyb20gYmVsb3csIHRvIHJlY2VpdmUgc29tZXRoaW5nCi0gICBvcCBjb250YWlucyB0eXBlIGFuZCBjYWxsIGRpcmVjdGlvbiBpbmZvcm1hdGlvbiwgaW4gYWRkaXRpb24gdG8gdGhlIGRhdGEKLSAgIHRoYXQgaXMgYmVpbmcgc2VudCBvciByZWNlaXZlZC4gKi8KLXN0YXRpYyB2b2lkIGF1dGhfc3RhcnRfdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIHNldF9yZWN2X29wc19tZF9jYWxsYmFja3MoZWxlbSwgb3ApOwotICBncnBjX2NhbGxfbmV4dF9vcChleGVjX2N0eCwgZWxlbSwgb3ApOwotfQotCi0vKiBDb25zdHJ1Y3RvciBmb3IgY2FsbF9kYXRhICovCi1zdGF0aWMgdm9pZCBpbml0X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudF9hcmdzICphcmdzKSB7Ci0gIC8qIGdyYWIgcG9pbnRlcnMgdG8gb3VyIGRhdGEgZnJvbSB0aGUgY2FsbCBlbGVtZW50ICovCi0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHQgKnNlcnZlcl9jdHggPSBOVUxMOwotCi0gIC8qIGluaXRpYWxpemUgbWVtYmVycyAqLwotICBtZW1zZXQoY2FsbGQsIDAsIHNpemVvZigqY2FsbGQpKTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5hdXRoX29uX3JlY3YsIGF1dGhfb25fcmVjdiwgZWxlbSk7Ci0KLSAgaWYgKGFyZ3MtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZSAhPSBOVUxMKSB7Ci0gICAgYXJncy0+Y29udGV4dFtHUlBDX0NPTlRFWFRfU0VDVVJJVFldLmRlc3Ryb3koCi0gICAgICAgIGFyZ3MtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZSk7Ci0gIH0KLQotICBzZXJ2ZXJfY3R4ID0gZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29udGV4dF9jcmVhdGUoKTsKLSAgc2VydmVyX2N0eC0+YXV0aF9jb250ZXh0ID0gZ3JwY19hdXRoX2NvbnRleHRfY3JlYXRlKGNoYW5kLT5hdXRoX2NvbnRleHQpOwotICBjYWxsZC0+YXV0aF9jb250ZXh0ID0gc2VydmVyX2N0eC0+YXV0aF9jb250ZXh0OwotCi0gIGFyZ3MtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS52YWx1ZSA9IHNlcnZlcl9jdHg7Ci0gIGFyZ3MtPmNvbnRleHRbR1JQQ19DT05URVhUX1NFQ1VSSVRZXS5kZXN0cm95ID0KLSAgICAgIGdycGNfc2VydmVyX3NlY3VyaXR5X2NvbnRleHRfZGVzdHJveTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3BvbGxzZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7fQotCi0vKiBEZXN0cnVjdG9yIGZvciBjYWxsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2FsbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHt9Ci0KLS8qIENvbnN0cnVjdG9yIGZvciBjaGFubmVsX2RhdGEgKi8KLXN0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudF9hcmdzICphcmdzKSB7Ci0gIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQgPQotICAgICAgZ3JwY19maW5kX2F1dGhfY29udGV4dF9pbl9hcmdzKGFyZ3MtPmNoYW5uZWxfYXJncyk7Ci0gIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzICpjcmVkcyA9Ci0gICAgICBncnBjX2ZpbmRfc2VydmVyX2NyZWRlbnRpYWxzX2luX2FyZ3MoYXJncy0+Y2hhbm5lbF9hcmdzKTsKLSAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjaGFubmVsIGVsZW1lbnQgKi8KLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLQotICBHUFJfQVNTRVJUKCFhcmdzLT5pc19sYXN0KTsKLSAgR1BSX0FTU0VSVChhdXRoX2NvbnRleHQgIT0gTlVMTCk7Ci0gIEdQUl9BU1NFUlQoY3JlZHMgIT0gTlVMTCk7Ci0KLSAgLyogaW5pdGlhbGl6ZSBtZW1iZXJzICovCi0gIGNoYW5kLT5hdXRoX2NvbnRleHQgPQotICAgICAgR1JQQ19BVVRIX0NPTlRFWFRfUkVGKGF1dGhfY29udGV4dCwgInNlcnZlcl9hdXRoX2ZpbHRlciIpOwotICBjaGFuZC0+Y3JlZHMgPSBncnBjX3NlcnZlcl9jcmVkZW50aWFsc19yZWYoY3JlZHMpOwotfQotCi0vKiBEZXN0cnVjdG9yIGZvciBjaGFubmVsIGRhdGEgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHsKLSAgLyogZ3JhYiBwb2ludGVycyB0byBvdXIgZGF0YSBmcm9tIHRoZSBjaGFubmVsIGVsZW1lbnQgKi8KLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgR1JQQ19BVVRIX0NPTlRFWFRfVU5SRUYoY2hhbmQtPmF1dGhfY29udGV4dCwgInNlcnZlcl9hdXRoX2ZpbHRlciIpOwotICBncnBjX3NlcnZlcl9jcmVkZW50aWFsc191bnJlZihjaGFuZC0+Y3JlZHMpOwotfQotCi1jb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfc2VydmVyX2F1dGhfZmlsdGVyID0gewotICAgIGF1dGhfc3RhcnRfdHJhbnNwb3J0X29wLCBncnBjX2NoYW5uZWxfbmV4dF9vcCwgc2l6ZW9mKGNhbGxfZGF0YSksCi0gICAgaW5pdF9jYWxsX2VsZW0sICAgICAgICAgIHNldF9wb2xsc2V0LCAgICAgICAgICBkZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwgICAgaW5pdF9jaGFubmVsX2VsZW0sICAgIGRlc3Ryb3lfY2hhbm5lbF9lbGVtLAotICAgIGdycGNfY2FsbF9uZXh0X2dldF9wZWVyLCAic2VydmVyLWF1dGgifTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMgYi9zcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfc2VjdXJlX2NodHRwMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI5Y2E5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgewotICBncnBjX3NlcnZlciAqc2VydmVyOwotICBncnBjX3RjcF9zZXJ2ZXIgKnRjcDsKLSAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yICpzYzsKLSAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzOwotICBpbnQgaXNfc2h1dGRvd247Ci0gIGdwcl9tdSBtdTsKLSAgZ3ByX3JlZmNvdW50IHJlZmNvdW50OwotICBncnBjX2Nsb3N1cmUgZGVzdHJveV9jbG9zdXJlOwotICBncnBjX2Nsb3N1cmUgKmRlc3Ryb3lfY2FsbGJhY2s7Ci19IGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZTsKLQotc3RhdGljIHZvaWQgc3RhdGVfcmVmKGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZSAqc3RhdGUpIHsKLSAgZ3ByX3JlZigmc3RhdGUtPnJlZmNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgc3RhdGVfdW5yZWYoZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSkgewotICBpZiAoZ3ByX3VucmVmKCZzdGF0ZS0+cmVmY291bnQpKSB7Ci0gICAgLyogZW5zdXJlIGFsbCB0aHJlYWRzIGhhdmUgdW5sb2NrZWQgKi8KLSAgICBncHJfbXVfbG9jaygmc3RhdGUtPm11KTsKLSAgICBncHJfbXVfdW5sb2NrKCZzdGF0ZS0+bXUpOwotICAgIC8qIGNsZWFuIHVwICovCi0gICAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoJnN0YXRlLT5zYy0+YmFzZSwgInNlcnZlciIpOwotICAgIGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX3VucmVmKHN0YXRlLT5jcmVkcyk7Ci0gICAgZ3ByX2ZyZWUoc3RhdGUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3RyYW5zcG9ydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqc3RhdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgewotICBncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgKnN0YXRlID0gc3RhdGVwOwotICBncnBjX2NoYW5uZWxfYXJncyAqYXJnc19jb3B5OwotICBncnBjX2FyZyBhcmdzX3RvX2FkZFsyXTsKLSAgYXJnc190b19hZGRbMF0gPSBncnBjX3NlcnZlcl9jcmVkZW50aWFsc190b19hcmcoc3RhdGUtPmNyZWRzKTsKLSAgYXJnc190b19hZGRbMV0gPSBncnBjX2F1dGhfY29udGV4dF90b19hcmcoYXV0aF9jb250ZXh0KTsKLSAgYXJnc19jb3B5ID0gZ3JwY19jaGFubmVsX2FyZ3NfY29weV9hbmRfYWRkKAotICAgICAgZ3JwY19zZXJ2ZXJfZ2V0X2NoYW5uZWxfYXJncyhzdGF0ZS0+c2VydmVyKSwgYXJnc190b19hZGQsCi0gICAgICBHUFJfQVJSQVlfU0laRShhcmdzX3RvX2FkZCkpOwotICBncnBjX3NlcnZlcl9zZXR1cF90cmFuc3BvcnQoZXhlY19jdHgsIHN0YXRlLT5zZXJ2ZXIsIHRyYW5zcG9ydCwgYXJnc19jb3B5KTsKLSAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShhcmdzX2NvcHkpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9zZWN1cmVfaGFuZHNoYWtlX2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnN0YXRlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19lbmRwb2ludCAqc2VjdXJlX2VuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYXV0aF9jb250ZXh0ICphdXRoX2NvbnRleHQpIHsKLSAgZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSA9IHN0YXRlcDsKLSAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydDsKLSAgaWYgKHN0YXR1cyA9PSBHUlBDX1NFQ1VSSVRZX09LKSB7Ci0gICAgaWYgKHNlY3VyZV9lbmRwb2ludCkgewotICAgICAgZ3ByX211X2xvY2soJnN0YXRlLT5tdSk7Ci0gICAgICBpZiAoIXN0YXRlLT5pc19zaHV0ZG93bikgewotICAgICAgICB0cmFuc3BvcnQgPSBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAotICAgICAgICAgICAgZXhlY19jdHgsIGdycGNfc2VydmVyX2dldF9jaGFubmVsX2FyZ3Moc3RhdGUtPnNlcnZlciksCi0gICAgICAgICAgICBzZWN1cmVfZW5kcG9pbnQsIDApOwotICAgICAgICBzZXR1cF90cmFuc3BvcnQoZXhlY19jdHgsIHN0YXRlLCB0cmFuc3BvcnQsIGF1dGhfY29udGV4dCk7Ci0gICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9zdGFydF9yZWFkaW5nKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIE5VTEwsIDApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogV2UgbmVlZCB0byBjb25zdW1lIHRoaXMgaGVyZSwgYmVjYXVzZSB0aGUgc2VydmVyIG1heSBhbHJlYWR5IGhhdmUKLSAgICAgICAgICogZ29uZSBhd2F5LiAqLwotICAgICAgICBncnBjX2VuZHBvaW50X2Rlc3Ryb3koZXhlY19jdHgsIHNlY3VyZV9lbmRwb2ludCk7Ci0gICAgICB9Ci0gICAgICBncHJfbXVfdW5sb2NrKCZzdGF0ZS0+bXUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNlY3VyZSB0cmFuc3BvcnQgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBzdGF0dXMpOwotICB9Ci0gIHN0YXRlX3VucmVmKHN0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQgb25fYWNjZXB0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzdGF0ZXAsIGdycGNfZW5kcG9pbnQgKnRjcCwKLSAgICAgICAgICAgICAgICAgICAgICBncnBjX3RjcF9zZXJ2ZXJfYWNjZXB0b3IgKmFjY2VwdG9yKSB7Ci0gIGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZSAqc3RhdGUgPSBzdGF0ZXA7Ci0gIHN0YXRlX3JlZihzdGF0ZSk7Ci0gIGdycGNfc2VydmVyX3NlY3VyaXR5X2Nvbm5lY3Rvcl9kb19oYW5kc2hha2UoCi0gICAgICBleGVjX2N0eCwgc3RhdGUtPnNjLCBhY2NlcHRvciwgdGNwLCBvbl9zZWN1cmVfaGFuZHNoYWtlX2RvbmUsIHN0YXRlKTsKLX0KLQotLyogU2VydmVyIGNhbGxiYWNrOiBzdGFydCBsaXN0ZW5pbmcgb24gb3VyIHBvcnRzICovCi1zdGF0aWMgdm9pZCBzdGFydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwgdm9pZCAqc3RhdGVwLAotICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50KSB7Ci0gIGdycGNfc2VydmVyX3NlY3VyZV9zdGF0ZSAqc3RhdGUgPSBzdGF0ZXA7Ci0gIGdycGNfdGNwX3NlcnZlcl9zdGFydChleGVjX2N0eCwgc3RhdGUtPnRjcCwgcG9sbHNldHMsIHBvbGxzZXRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbl9hY2NlcHQsIHN0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveV9kb25lKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzdGF0ZXAsIGJvb2wgc3VjY2VzcykgewotICBncnBjX3NlcnZlcl9zZWN1cmVfc3RhdGUgKnN0YXRlID0gc3RhdGVwOwotICBpZiAoc3RhdGUtPmRlc3Ryb3lfY2FsbGJhY2sgIT0gTlVMTCkgewotICAgIHN0YXRlLT5kZXN0cm95X2NhbGxiYWNrLT5jYihleGVjX2N0eCwgc3RhdGUtPmRlc3Ryb3lfY2FsbGJhY2stPmNiX2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzcyk7Ci0gIH0KLSAgZ3JwY19zZXJ2ZXJfc2VjdXJpdHlfY29ubmVjdG9yX3NodXRkb3duKGV4ZWNfY3R4LCBzdGF0ZS0+c2MpOwotICBzdGF0ZV91bnJlZihzdGF0ZSk7Ci19Ci0KLS8qIFNlcnZlciBjYWxsYmFjazogZGVzdHJveSB0aGUgdGNwIGxpc3RlbmVyIChzbyB3ZSBkb24ndCBnZW5lcmF0ZSBmdXJ0aGVyCi0gICBjYWxsYmFja3MpICovCi1zdGF0aWMgdm9pZCBkZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICpzdGF0ZXAsCi0gICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2FsbGJhY2spIHsKLSAgZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSA9IHN0YXRlcDsKLSAgZ3JwY190Y3Bfc2VydmVyICp0Y3A7Ci0gIGdwcl9tdV9sb2NrKCZzdGF0ZS0+bXUpOwotICBzdGF0ZS0+aXNfc2h1dGRvd24gPSAxOwotICBzdGF0ZS0+ZGVzdHJveV9jYWxsYmFjayA9IGNhbGxiYWNrOwotICB0Y3AgPSBzdGF0ZS0+dGNwOwotICBncHJfbXVfdW5sb2NrKCZzdGF0ZS0+bXUpOwotICBncnBjX3RjcF9zZXJ2ZXJfdW5yZWYoZXhlY19jdHgsIHRjcCk7Ci19Ci0KLWludCBncnBjX3NlcnZlcl9hZGRfc2VjdXJlX2h0dHAyX3BvcnQoZ3JwY19zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHMgKmNyZWRzKSB7Ci0gIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpyZXNvbHZlZCA9IE5VTEw7Ci0gIGdycGNfdGNwX3NlcnZlciAqdGNwID0gTlVMTDsKLSAgZ3JwY19zZXJ2ZXJfc2VjdXJlX3N0YXRlICpzdGF0ZSA9IE5VTEw7Ci0gIHNpemVfdCBpOwotICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gIGludCBwb3J0X251bSA9IC0xOwotICBpbnQgcG9ydF90ZW1wOwotICBncnBjX3NlY3VyaXR5X3N0YXR1cyBzdGF0dXMgPSBHUlBDX1NFQ1VSSVRZX0VSUk9SOwotICBncnBjX3NlcnZlcl9zZWN1cml0eV9jb25uZWN0b3IgKnNjID0gTlVMTDsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX3NlcnZlcl9hZGRfc2VjdXJlX2h0dHAyX3BvcnQoIgotICAgICAgInNlcnZlcj0lcCwgYWRkcj0lcywgY3JlZHM9JXApIiwKLSAgICAgIDMsIChzZXJ2ZXIsIGFkZHIsIGNyZWRzKSk7Ci0KLSAgLyogY3JlYXRlIHNlY3VyaXR5IGNvbnRleHQgKi8KLSAgaWYgKGNyZWRzID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gIHN0YXR1cyA9IGdycGNfc2VydmVyX2NyZWRlbnRpYWxzX2NyZWF0ZV9zZWN1cml0eV9jb25uZWN0b3IoY3JlZHMsICZzYyk7Ci0gIGlmIChzdGF0dXMgIT0gR1JQQ19TRUNVUklUWV9PSykgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgc2VjdXJlIHNlcnZlciB3aXRoIGNyZWRlbnRpYWxzIG9mIHR5cGUgJXMuIiwKLSAgICAgICAgICAgIGNyZWRzLT50eXBlKTsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIHNjLT5jaGFubmVsX2FyZ3MgPSBncnBjX3NlcnZlcl9nZXRfY2hhbm5lbF9hcmdzKHNlcnZlcik7Ci0KLSAgLyogcmVzb2x2ZSBhZGRyZXNzICovCi0gIHJlc29sdmVkID0gZ3JwY19ibG9ja2luZ19yZXNvbHZlX2FkZHJlc3MoYWRkciwgImh0dHBzIik7Ci0gIGlmICghcmVzb2x2ZWQpIHsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0gIHN0YXRlID0gZ3ByX21hbGxvYyhzaXplb2YoKnN0YXRlKSk7Ci0gIG1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmc3RhdGUtPmRlc3Ryb3lfY2xvc3VyZSwgZGVzdHJveV9kb25lLCBzdGF0ZSk7Ci0gIHRjcCA9IGdycGNfdGNwX3NlcnZlcl9jcmVhdGUoJnN0YXRlLT5kZXN0cm95X2Nsb3N1cmUpOwotICBpZiAoIXRjcCkgewotICAgIGdvdG8gZXJyb3I7Ci0gIH0KLQotICBzdGF0ZS0+c2VydmVyID0gc2VydmVyOwotICBzdGF0ZS0+dGNwID0gdGNwOwotICBzdGF0ZS0+c2MgPSBzYzsKLSAgc3RhdGUtPmNyZWRzID0gZ3JwY19zZXJ2ZXJfY3JlZGVudGlhbHNfcmVmKGNyZWRzKTsKLSAgc3RhdGUtPmlzX3NodXRkb3duID0gMDsKLSAgZ3ByX211X2luaXQoJnN0YXRlLT5tdSk7Ci0gIGdwcl9yZWZfaW5pdCgmc3RhdGUtPnJlZmNvdW50LCAxKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcmVzb2x2ZWQtPm5hZGRyczsgaSsrKSB7Ci0gICAgcG9ydF90ZW1wID0gZ3JwY190Y3Bfc2VydmVyX2FkZF9wb3J0KAotICAgICAgICB0Y3AsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVzb2x2ZWQtPmFkZHJzW2ldLmFkZHIsCi0gICAgICAgIHJlc29sdmVkLT5hZGRyc1tpXS5sZW4pOwotICAgIGlmIChwb3J0X3RlbXAgPiAwKSB7Ci0gICAgICBpZiAocG9ydF9udW0gPT0gLTEpIHsKLSAgICAgICAgcG9ydF9udW0gPSBwb3J0X3RlbXA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHUFJfQVNTRVJUKHBvcnRfbnVtID09IHBvcnRfdGVtcCk7Ci0gICAgICB9Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgfQotICBpZiAoY291bnQgPT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTm8gYWRkcmVzcyBhZGRlZCBvdXQgb2YgdG90YWwgJWQgcmVzb2x2ZWQiLAotICAgICAgICAgICAgcmVzb2x2ZWQtPm5hZGRycyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBpZiAoY291bnQgIT0gcmVzb2x2ZWQtPm5hZGRycykgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiT25seSAlZCBhZGRyZXNzZXMgYWRkZWQgb3V0IG9mIHRvdGFsICVkIHJlc29sdmVkIiwKLSAgICAgICAgICAgIGNvdW50LCByZXNvbHZlZC0+bmFkZHJzKTsKLSAgICAvKiBpZiBpdCdzIGFuIGVycm9yLCBkb24ndCB3ZSB3YW50IHRvIGdvdG8gZXJyb3I7IGhlcmUgPyAqLwotICB9Ci0gIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzX2Rlc3Ryb3kocmVzb2x2ZWQpOwotCi0gIC8qIFJlZ2lzdGVyIHdpdGggdGhlIHNlcnZlciBvbmx5IHVwb24gc3VjY2VzcyAqLwotICBncnBjX3NlcnZlcl9hZGRfbGlzdGVuZXIoJmV4ZWNfY3R4LCBzZXJ2ZXIsIHN0YXRlLCBzdGFydCwgZGVzdHJveSk7Ci0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgcmV0dXJuIHBvcnRfbnVtOwotCi0vKiBFcnJvciBwYXRoOiBjbGVhbnVwIGFuZCByZXR1cm4gKi8KLWVycm9yOgotICBpZiAocmVzb2x2ZWQpIHsKLSAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlc29sdmVkKTsKLSAgfQotICBpZiAodGNwKSB7Ci0gICAgZ3JwY190Y3Bfc2VydmVyX3VucmVmKCZleGVjX2N0eCwgdGNwKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoc2MpIHsKLSAgICAgIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1VOUkVGKCZzYy0+YmFzZSwgInNlcnZlciIpOwotICAgIH0KLSAgICBpZiAoc3RhdGUpIHsKLSAgICAgIGdwcl9mcmVlKHN0YXRlKTsKLSAgICB9Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbml0LmMgYi9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTk2MmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKLQotdm9pZCBjZW5zdXNfaW5pdCh2b2lkKSB7Ci0gIGNlbnN1c190cmFjaW5nX2luaXQoKTsKLSAgY2Vuc3VzX3N0YXRzX3N0b3JlX2luaXQoKTsKLX0KLQotdm9pZCBjZW5zdXNfc2h1dGRvd24odm9pZCkgewotICBjZW5zdXNfc3RhdHNfc3RvcmVfc2h1dGRvd24oKTsKLSAgY2Vuc3VzX3RyYWNpbmdfc2h1dGRvd24oKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIGIvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGZmOTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVEFUSVNUSUNTX0NFTlNVU19JTlRFUkZBQ0VfSAotI2RlZmluZSBHUlBDX0NPUkVfU1RBVElTVElDU19DRU5TVVNfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluZGl2aWR1YWwgY2Vuc3VzIHRyYWNlIGFubm90YXRpb24uICovCi0jZGVmaW5lIENFTlNVU19NQVhfQU5OT1RBVElPTl9MRU5HVEggMjAwCi0KLS8qIFN0cnVjdHVyZSBvZiBhIGNlbnN1cyBvcCBpZC4gRGVmaW5lIGFzIHN0cnVjdHVyZSBiZWNhdXNlIDY0Yml0IGludGVnZXIgaXMgbm90Ci0gICBhdmFpbGFibGUgb24gZXZlcnkgcGxhdGZvcm0gZm9yIEM4OS4gKi8KLXR5cGVkZWYgc3RydWN0IGNlbnN1c19vcF9pZCB7Ci0gIHVpbnQzMl90IHVwcGVyOwotICB1aW50MzJfdCBsb3dlcjsKLX0gY2Vuc3VzX29wX2lkOwotCi10eXBlZGVmIHN0cnVjdCBjZW5zdXNfcnBjX3N0YXRzIGNlbnN1c19ycGNfc3RhdHM7Ci0KLS8qIEluaXRpYWxpemVzIENlbnN1cyBsaWJyYXJ5LiBOby1vcCBpZiBDZW5zdXMgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gKi8KLXZvaWQgY2Vuc3VzX2luaXQodm9pZCk7Ci0KLS8qIFNodXRkb3duIENlbnN1cyBMaWJyYXJ5LiAqLwotdm9pZCBjZW5zdXNfc2h1dGRvd24odm9pZCk7Ci0KLS8qIEFubm90YXRlcyBncnBjIG1ldGhvZCBuYW1lIG9uIGEgY2Vuc3VzX29wX2lkLiBUaGUgbWV0aG9kIG5hbWUgaGFzIHRoZSBmb3JtYXQKLSAgIG9mIDxmdWxsIHF1YW50aWZpZWQgcnBjIHNlcnZpY2UgbmFtZT4vPHJwYyBmdW5jdGlvbiBuYW1lPi4gUmV0dXJucyAwIGlmZgotICAgb3BfaWQgYW5kIG1ldGhvZF9uYW1lIGFyZSBhbGwgdmFsaWQuIG9wX2lkIGlzIHZhbGlkIGFmdGVyIGl0cyBjcmVhdGlvbiBhbmQKLSAgIGJlZm9yZSBjYWxsaW5nIGNlbnN1c190cmFjaW5nX2VuZF9vcCgpLgotCi0gICBUT0RPKGhvbmd5dSk6IEZpZ3VyZSBvdXQgdmFsaWQgY2hhcmFjdGVycyBzZXQgZm9yIHNlcnZpY2UgbmFtZSBhbmQgY29tbWFuZAotICAgbmFtZSBhbmQgZG9jdW1lbnQgcmVxdWlyZW1lbnRzIGhlcmUuKi8KLWludCBjZW5zdXNfYWRkX21ldGhvZF90YWcoY2Vuc3VzX29wX2lkIG9wX2lkLCBjb25zdCBjaGFyICptZXRob2RfbmFtZSk7Ci0KLS8qIEFubm90YXRlcyB0cmFjaW5nIGluZm9ybWF0aW9uIHRvIGEgc3BlY2lmaWMgb3BfaWQuCi0gICBVcCB0byBDRU5TVVNfTUFYX0FOTk9UQVRJT05fTEVOR1RIIGJ5dGVzIGFyZSByZWNvcmRlZC4gKi8KLXZvaWQgY2Vuc3VzX3RyYWNpbmdfcHJpbnQoY2Vuc3VzX29wX2lkIG9wX2lkLCBjb25zdCBjaGFyICphbm5vdGF0aW9uKTsKLQotLyogU3RhcnRzIHRyYWNpbmcgZm9yIGFuIFJQQy4gUmV0dXJucyBhIGxvY2FsbHkgdW5pcXVlIGNlbnN1c19vcF9pZCAqLwotY2Vuc3VzX29wX2lkIGNlbnN1c190cmFjaW5nX3N0YXJ0X29wKHZvaWQpOwotCi0vKiBFbmRzIHRyYWNpbmcuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGludmFsaWRhdGUgdGhlIGlucHV0IG9wX2lkLiAqLwotdm9pZCBjZW5zdXNfdHJhY2luZ19lbmRfb3AoY2Vuc3VzX29wX2lkIG9wX2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVEFUSVNUSUNTX0NFTlNVU19JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmMgYi9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwMmQxYy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDYwMyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0vKiBBdmFpbGFibGUgbG9nIHNwYWNlIGlzIGRpdmlkZWQgdXAgaW4gYmxvY2tzIG9mCi0gICBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIGJ5dGVzLiBBIGJsb2NrIGNhbiBiZSBpbiBvbmUgb2YgdGhlCi0gICBmb2xsb3dpbmcgdGhyZWUgZGF0YSBzdHJ1Y3R1cmVzOgotICAgLSBGcmVlIGJsb2NrcyAoZnJlZV9ibG9ja19saXN0KQotICAgLSBCbG9ja3Mgd2l0aCB1bnJlYWQgZGF0YSAoZGlydHlfYmxvY2tfbGlzdCkKLSAgIC0gQmxvY2tzIGN1cnJlbnRseSBhdHRhY2hlZCB0byBjb3JlcyAoY29yZV9sb2NhbF9ibG9ja3NbXSkKLQotICAgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpIG1vdmVzIGEgYmxvY2sgZnJvbSBjb3JlX2xvY2FsX2Jsb2Nrc1tdIHRvIHRoZQotICAgZW5kIG9mIGRpcnR5X2Jsb2NrX2xpc3Qgd2hlbiBibG9jazoKLSAgIC0gaXMgb3V0LW9mLXNwYWNlIE9SCi0gICAtIGhhcyBhbiBpbmNvbXBsZXRlIHJlY29yZCAoYW4gaW5jb21wbGV0ZSByZWNvcmQgb2NjdXJzIHdoZW4gYSB0aHJlYWQgY2FsbHMKLSAgICAgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpIGFuZCBpcyBjb250ZXh0LXN3aXRjaGVkIGJlZm9yZSBjYWxsaW5nCi0gICAgIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkKLSAgIFNvLCBibG9ja3MgaW4gZGlydHlfYmxvY2tfbGlzdCBhcmUgb3JkZXJlZCwgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0LCBieSB0aW1lCi0gICB3aGVuIGJsb2NrIGlzIGRldGFjaGVkIGZyb20gdGhlIGNvcmUuCi0KLSAgIGNlbnN1c19sb2dfcmVhZF9uZXh0KCkgZmlyc3QgaXRlcmF0ZXMgb3ZlciBkaXJ0eV9ibG9ja19saXN0IGFuZCB0aGVuCi0gICBjb3JlX2xvY2FsX2Jsb2Nrc1tdLiBJdCBtb3ZlcyBjb21wbGV0ZWx5IHJlYWQgYmxvY2tzIGZyb20gZGlydHlfYmxvY2tfbGlzdAotICAgdG8gZnJlZV9ibG9ja19saXN0LiBCbG9ja3MgaW4gY29yZV9sb2NhbF9ibG9ja3NbXSBhcmUgbm90IGZyZWVkLCBldmVuIHdoZW4KLSAgIGNvbXBsZXRlbHkgcmVhZC4KLQotICAgSWYgbG9nIGlzIGNvbmZpZ3VyZWQgdG8gZGlzY2FyZCBvbGQgcmVjb3JkcyBhbmQgZnJlZV9ibG9ja19saXN0IGlzIGVtcHR5LAotICAgY2Vuc3VzX2xvZ19zdGFydF93cml0ZSgpIGl0ZXJhdGVzIG92ZXIgZGlydHlfYmxvY2tfbGlzdCB0byBhbGxvY2F0ZSBhCi0gICBuZXcgYmxvY2suIEl0IG1vdmVzIHRoZSBvbGRlc3QgYXZhaWxhYmxlIGJsb2NrIChubyBwZW5kaW5nIHJlYWQvd3JpdGUpIHRvCi0gICBjb3JlX2xvY2FsX2Jsb2Nrc1tdLgotCi0gICBjb3JlX2xvY2FsX2Jsb2NrX3N0cnVjdCBpcyB1c2VkIHRvIGltcGxlbWVudCBhIG1hcCBmcm9tIGNvcmUgaWQgdG8gdGhlIGJsb2NrCi0gICBhc3NvY2lhdGVkIHdpdGggdGhhdCBjb3JlLiBUaGlzIG1hcHBpbmcgaXMgYWR2aXNvcnkuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlCi0gICBibG9jayByZXR1cm5lZCBieSB0aGlzIG1hcHBpbmcgaXMgbm8gbG9uZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGNvcmUuIFRoaXMKLSAgIG1hcHBpbmcgaXMgdXBkYXRlZCwgbGF6aWx5LCBieSBjZW5zdXNfbG9nX3N0YXJ0X3dyaXRlKCkuCi0KLSAgIExvY2tpbmcgaW4gYmxvY2sgc3RydWN0OgotCi0gICBFeGNsdXNpdmUgZ19sb2cubG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgYW55IGZ1bmN0aW9ucyBvcGVyYXRvbmcgb24KLSAgIGJsb2NrIHN0cnVjdHMgZXhjZXB0IGNlbnN1c19sb2dfc3RhcnRfd3JpdGUoKSBhbmQKLSAgIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkuCi0KLSAgIFdyaXRlcyB0byBhIGJsb2NrIGFyZSBzZXJpYWxpemVkIHZpYSB3cml0ZXJfbG9jay4KLSAgIGNlbnN1c19sb2dfc3RhcnRfd3JpdGUoKSBhY3F1aXJlcyB0aGlzIGxvY2sgYW5kCi0gICBjZW5zdXNfbG9nX2VuZF93cml0ZSgpIHJlbGVhc2VzIGl0LiBPbiBmYWlsdXJlIHRvIGFjcXVpcmUgdGhlIGxvY2ssCi0gICB3cml0ZXIgYWxsb2NhdGVzIGEgbmV3IGJsb2NrIGZvciB0aGUgY3VycmVudCBjb3JlIGFuZCB1cGRhdGVzCi0gICBjb3JlX2xvY2FsX2Jsb2NrIGFjY29yZGluZ2x5LgotCi0gICBTaW11bHRhbmVvdXMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIGlzIGFsbG93ZWQuIFJlYWRlciBjYW4gc2FmZWx5IHJlYWQgdXAgdG8KLSAgIGNvbW1pdHRlZCBieXRlcyAoYnl0ZXNfY29tbWl0dGVkKS4KLQotICAgcmVhZGVyX2xvY2sgcHJvdGVjdHMgdGhlIGJsb2NrLCBjdXJyZW50bHkgYmVpbmcgcmVhZCwgZnJvbSBnZXR0aW5nIHJlY3ljbGVkLgotICAgc3RhcnRfcmVhZCgpIGFjcXVpcmVzIHJlYWRlcl9sb2NrIGFuZCBlbmRfcmVhZCgpIHJlbGVhc2VzIHRoZSBsb2NrLgotCi0gICBSZWFkL3dyaXRlIGFjY2VzcyB0byBhIGJsb2NrIGlzIGRpc2FibGVkIHZpYSB0cnlfZGlzYWJsZV9hY2Nlc3MoKS4gSXQgcmV0dXJucwotICAgd2l0aCBib3RoIHdyaXRlcl9sb2NrIGFuZCByZWFkZXJfbG9jayBoZWxkLiBUaGVzZSBsb2NrcyBhcmUgc3Vic2VxdWVudGx5Ci0gICByZWxlYXNlZCBieSBlbmFibGVfYWNjZXNzKCkgdG8gZW5hYmxlIGFjY2VzcyB0byB0aGUgYmxvY2suCi0KLSAgIEEgbm90ZSBvbiBuYW1pbmc6IE1vc3QgZnVuY3Rpb24vc3RydWN0IG5hbWVzIGFyZSBwcmVwZW5kZWQgYnkgY2xfCi0gICAoc2hvcnRoYW5kIGZvciBjZW5zdXNfbG9nKS4gRnVydGhlciwgZnVuY3Rpb25zIHRoYXQgbWFuaXB1bGF0ZSBzdHJ1Y3R1cmVzCi0gICBpbmNsdWRlIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAotICAgYXJndW1lbnQuIEUuZy4gY2xfYmxvY2tfaW5pdGlhbGl6ZSgpIHdpbGwgaW5pdGlhbGl6ZSBhIGNsX2Jsb2NrLgotKi8KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2cuaCIKLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2NwdS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBFbmQgb2YgcGxhdGZvcm0gc3BlY2lmaWMgY29kZSAqLwotCi10eXBlZGVmIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrX2xpc3Rfc3RydWN0IHsKLSAgc3RydWN0IGNlbnN1c19sb2dfYmxvY2tfbGlzdF9zdHJ1Y3QgKm5leHQ7Ci0gIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrX2xpc3Rfc3RydWN0ICpwcmV2OwotICBzdHJ1Y3QgY2Vuc3VzX2xvZ19ibG9jayAqYmxvY2s7Ci19IGNsX2Jsb2NrX2xpc3Rfc3RydWN0OwotCi10eXBlZGVmIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrIHsKLSAgLyogUG9pbnRlciB0byB1bmRlcmx5aW5nIGJ1ZmZlciAqLwotICBjaGFyICpidWZmZXI7Ci0gIGdwcl9hdG0gd3JpdGVyX2xvY2s7Ci0gIGdwcl9hdG0gcmVhZGVyX2xvY2s7Ci0gIC8qIEtlZXBzIGNvbXBsZXRlbHkgd3JpdHRlbiBieXRlcy4gRGVjbGFyZWQgYXRvbWljIGJlY2F1c2UgYWNjZXNzZWQKLSAgICAgc2ltdWx0YW5lb3VzbHkgYnkgcmVhZGVyIGFuZCB3cml0ZXIuICovCi0gIGdwcl9hdG0gYnl0ZXNfY29tbWl0dGVkOwotICAvKiBCeXRlcyBhbHJlYWR5IHJlYWQgKi8KLSAgaW50MzJfdCBieXRlc19yZWFkOwotICAvKiBMaW5rcyBmb3IgbGlzdCAqLwotICBjbF9ibG9ja19saXN0X3N0cnVjdCBsaW5rOwotLyogV2Ugd2FudCB0aGlzIHN0cnVjdHVyZSB0byBiZSBjYWNoZWxpbmUgYWxpZ25lZC4gV2UgYXNzdW1lIHRoZSBmb2xsb3dpbmcKLSAgIHNpemVzIGZvciB0aGUgdmFyaW91cyBwYXJ0cyBvbiAzMi82NGJpdCBzeXN0ZW1zOgotICAgdHlwZSAgICAgICAgICAgICAgICAgMzJiIHNpemUgICAgNjRiIHNpemUKLSAgIGNoYXIqICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgIDgKLSAgIDN4IGdwcl9hdG0gICAgICAgICAgICAgMTIgICAgICAgICAgMjQKLSAgIGludDMyX3QgICAgICAgICAgICAgICA0ICAgICAgICAgICA4IChhc3N1bWVzIHBhZGRpbmcpCi0gICBjbF9ibG9ja19saXN0X3N0cnVjdCAgIDEyICAgICAgICAgIDI0Ci0gICBUT1RBTCAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgIDY0Ci0KLSAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiBvdXIgY2FjaGVsaW5lIGFuZCB0aGUgYXJjaGl0ZWN0dXJlLCB3ZQotICAgc2VsZWN0aXZlbHkgYWRkIGNoYXIgYnVmZmVyaW5nIHRvIHRoaXMgc3RydWN0dXJlLiBUaGUgc2l6ZSBpcyBjaGVja2VkCi0gICB2aWEgYXNzZXJ0IGluIGNlbnN1c19sb2dfaW5pdGlhbGl6ZSgpLiAqLwotI2lmIGRlZmluZWQoR1BSX0FSQ0hfNjQpCi0jZGVmaW5lIENMX0JMT0NLX1BBRF9TSVpFIChHUFJfQ0FDSEVMSU5FX1NJWkUgLSA2NCkKLSNlbHNlCi0jaWYgZGVmaW5lZChHUFJfQVJDSF8zMikKLSNkZWZpbmUgQ0xfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDMyKQotI2Vsc2UKLSNlcnJvciAiVW5rbm93biBhcmNoaXRlY3R1cmUiCi0jZW5kaWYKLSNlbmRpZgotI2lmIENMX0JMT0NLX1BBRF9TSVpFID4gMAotICBjaGFyIHBhZGRpbmdbQ0xfQkxPQ0tfUEFEX1NJWkVdOwotI2VuZGlmCi19IGNsX2Jsb2NrOwotCi0vKiBBIGxpc3Qgb2YgY2xfYmxvY2tzLCBkb3VibHktbGlua2VkIHRocm91Z2ggY2xfYmxvY2s6OmxpbmsuICovCi10eXBlZGVmIHN0cnVjdCBjZW5zdXNfbG9nX2Jsb2NrX2xpc3QgewotICBpbnQzMl90IGNvdW50OyAgICAgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zIGluIGxpc3QuICovCi0gIGNsX2Jsb2NrX2xpc3Rfc3RydWN0IGh0OyAvKiBoZWFkL3RhaWwgb2YgbGlua2VkIGxpc3QuICovCi19IGNsX2Jsb2NrX2xpc3Q7Ci0KLS8qIENhY2hlbGluZSBhbGlnbmVkIGJsb2NrIHBvaW50ZXJzIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcuIEJsb2NrIHBvaW50ZXIgbXVzdAotICAgYmUgaW5pdGlhbGl6ZWQgdmlhIHNldF9ibG9jaygpLCBiZWZvcmUgY2FsbGluZyBvdGhlciBmdW5jdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IGNlbnN1c19sb2dfY29yZV9sb2NhbF9ibG9jayB7Ci0gIGdwcl9hdG0gYmxvY2s7Ci0vKiBFbnN1cmUgY2FjaGxpbmUgYWxpZ25tZW50OiB3ZSBhc3N1bWUgc2l6ZW9mKGdwcl9hdG0pID09IDQgb3IgOCAqLwotI2lmIGRlZmluZWQoR1BSX0FSQ0hfNjQpCi0jZGVmaW5lIENMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDgpCi0jZWxzZQotI2lmIGRlZmluZWQoR1BSX0FSQ0hfMzIpCi0jZGVmaW5lIENMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkUgKEdQUl9DQUNIRUxJTkVfU0laRSAtIDQpCi0jZWxzZQotI2Vycm9yICJVbmtub3duIGFyY2hpdGVjdHVyZSIKLSNlbmRpZgotI2VuZGlmCi0jaWYgQ0xfQ09SRV9MT0NBTF9CTE9DS19QQURfU0laRSA+IDAKLSAgY2hhciBwYWRkaW5nW0NMX0NPUkVfTE9DQUxfQkxPQ0tfUEFEX1NJWkVdOwotI2VuZGlmCi19IGNsX2NvcmVfbG9jYWxfYmxvY2s7Ci0KLXN0cnVjdCBjZW5zdXNfbG9nIHsKLSAgaW50IGRpc2NhcmRfb2xkX3JlY29yZHM7Ci0gIC8qIE51bWJlciBvZiBjb3JlcyAoYWthIGhhcmR3YXJlLWNvbnRleHRzKSAqLwotICB1bnNpZ25lZCBudW1fY29yZXM7Ci0gIC8qIG51bWJlciBvZiBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIGJsb2NrcyBpbiBsb2cgKi8KLSAgaW50MzJfdCBudW1fYmxvY2tzOwotICBjbF9ibG9jayAqYmxvY2tzOyAgICAgICAgICAgICAgICAgICAgICAgLyogQmxvY2sgbWV0YWRhdGEuICovCi0gIGNsX2NvcmVfbG9jYWxfYmxvY2sgKmNvcmVfbG9jYWxfYmxvY2tzOyAvKiBLZWVwcyBjb3JlIHRvIGJsb2NrIG1hcHBpbmdzLiAqLwotICBncHJfbXUgbG9jazsKLSAgaW50IGluaXRpYWxpemVkOyAvKiBoYXMgbG9nIGJlZW4gaW5pdGlhbGl6ZWQ/ICovCi0gIC8qIEtlZXBzIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIGl0ZXJhdG9yLiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQKLSAgICAgaXRlcmF0b3IgaGFzIHJlYWNoZWQgdGhlIGVuZC4gY2Vuc3VzX2xvZ19pbml0X3JlYWRlcigpIHJlc2V0cyB0aGUKLSAgICAgdmFsdWUgdG8gbnVtX2NvcmUgdG8gcmVzdGFydCBpdGVyYXRpb24uICovCi0gIHVpbnQzMl90IHJlYWRfaXRlcmF0b3Jfc3RhdGU7Ci0gIC8qIFBvaW50cyB0byB0aGUgYmxvY2sgYmVpbmcgcmVhZC4gSWYgbm9uLU5VTEwsIHRoZSBibG9jayBpcyBsb2NrZWQgZm9yCi0gICAgIHJlYWRpbmcgKGJsb2NrX2JlaW5nX3JlYWRfLT5yZWFkZXJfbG9jayBpcyBoZWxkKS4gKi8KLSAgY2xfYmxvY2sgKmJsb2NrX2JlaW5nX3JlYWQ7Ci0gIC8qIEEgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQgbG9nIGlzIGZ1bGwuICovCi0gIGdwcl9hdG0gaXNfZnVsbDsKLSAgY2hhciAqYnVmZmVyOwotICBjbF9ibG9ja19saXN0IGZyZWVfYmxvY2tfbGlzdDsKLSAgY2xfYmxvY2tfbGlzdCBkaXJ0eV9ibG9ja19saXN0OwotICBncHJfYXRtIG91dF9vZl9zcGFjZV9jb3VudDsKLX07Ci0KLS8qIFNpbmdsZSBpbnRlcm5hbCBsb2cgKi8KLXN0YXRpYyBzdHJ1Y3QgY2Vuc3VzX2xvZyBnX2xvZzsKLQotLyogRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBhbiBhdG9taWMgbWVtb3J5IGxvY2F0aW9uIHVzZWQgYXMgYSBsb2NrICovCi0KLS8qIFJldHVybnMgbm9uLXplcm8gaWYgbG9jayBpcyBhY3F1aXJlZCAqLwotc3RhdGljIGludCBjbF90cnlfbG9jayhncHJfYXRtICpsb2NrKSB7IHJldHVybiBncHJfYXRtX2FjcV9jYXMobG9jaywgMCwgMSk7IH0KLQotc3RhdGljIHZvaWQgY2xfdW5sb2NrKGdwcl9hdG0gKmxvY2spIHsgZ3ByX2F0bV9yZWxfc3RvcmUobG9jaywgMCk7IH0KLQotLyogRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBjbF9jb3JlX2xvY2FsX2Jsb2NrJ3MgKi8KLQotc3RhdGljIHZvaWQgY2xfY29yZV9sb2NhbF9ibG9ja19zZXRfYmxvY2soY2xfY29yZV9sb2NhbF9ibG9jayAqY2xiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfYmxvY2sgKmJsb2NrKSB7Ci0gIGdwcl9hdG1fcmVsX3N0b3JlKCZjbGItPmJsb2NrLCAoZ3ByX2F0bSlibG9jayk7Ci19Ci0KLXN0YXRpYyBjbF9ibG9jayAqY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soY2xfY29yZV9sb2NhbF9ibG9jayAqY2xiKSB7Ci0gIHJldHVybiAoY2xfYmxvY2sgKilncHJfYXRtX2FjcV9sb2FkKCZjbGItPmJsb2NrKTsKLX0KLQotLyogRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBjbF9ibG9ja19saXN0X3N0cnVjdCdzICovCi0KLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3Rfc3RydWN0X2luaXRpYWxpemUoY2xfYmxvY2tfbGlzdF9zdHJ1Y3QgKmJscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfYmxvY2sgKmJsb2NrKSB7Ci0gIGJscy0+bmV4dCA9IGJscy0+cHJldiA9IGJsczsKLSAgYmxzLT5ibG9jayA9IGJsb2NrOwotfQotCi0vKiBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2Jsb2NrX2xpc3QncyAqLwotCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X2luaXRpYWxpemUoY2xfYmxvY2tfbGlzdCAqbGlzdCkgewotICBsaXN0LT5jb3VudCA9IDA7Ci0gIGNsX2Jsb2NrX2xpc3Rfc3RydWN0X2luaXRpYWxpemUoJmxpc3QtPmh0LCBOVUxMKTsKLX0KLQotLyogUmV0dXJucyBoZWFkIG9mICp0aGlzLCBvciBOVUxMIGlmIGVtcHR5LiAqLwotc3RhdGljIGNsX2Jsb2NrICpjbF9ibG9ja19saXN0X2hlYWQoY2xfYmxvY2tfbGlzdCAqbGlzdCkgewotICByZXR1cm4gbGlzdC0+aHQubmV4dC0+YmxvY2s7Ci19Ci0KLS8qIEluc2VydCBlbGVtZW50ICplIGFmdGVyICpwb3MuICovCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X2luc2VydChjbF9ibG9ja19saXN0ICpsaXN0LCBjbF9ibG9ja19saXN0X3N0cnVjdCAqcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfYmxvY2tfbGlzdF9zdHJ1Y3QgKmUpIHsKLSAgbGlzdC0+Y291bnQrKzsKLSAgZS0+bmV4dCA9IHBvcy0+bmV4dDsKLSAgZS0+cHJldiA9IHBvczsKLSAgZS0+bmV4dC0+cHJldiA9IGU7Ci0gIGUtPnByZXYtPm5leHQgPSBlOwotfQotCi0vKiBJbnNlcnQgYmxvY2sgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X2hlYWQoY2xfYmxvY2tfbGlzdCAqbGlzdCwgY2xfYmxvY2sgKmJsb2NrKSB7Ci0gIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0KGxpc3QsICZsaXN0LT5odCwgJmJsb2NrLT5saW5rKTsKLX0KLQotLyogSW5zZXJ0IGJsb2NrIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0ICovCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19saXN0X2luc2VydF9hdF90YWlsKGNsX2Jsb2NrX2xpc3QgKmxpc3QsIGNsX2Jsb2NrICpibG9jaykgewotICBjbF9ibG9ja19saXN0X2luc2VydChsaXN0LCBsaXN0LT5odC5wcmV2LCAmYmxvY2stPmxpbmspOwotfQotCi0vKiBSZW1vdmVzIGJsb2NrICpiLiBSZXF1aXJlcyAqYiBiZSBpbiB0aGUgbGlzdC4gKi8KLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKGNsX2Jsb2NrX2xpc3QgKmxpc3QsIGNsX2Jsb2NrICpiKSB7Ci0gIGxpc3QtPmNvdW50LS07Ci0gIGItPmxpbmsubmV4dC0+cHJldiA9IGItPmxpbmsucHJldjsKLSAgYi0+bGluay5wcmV2LT5uZXh0ID0gYi0+bGluay5uZXh0OwotfQotCi0vKiBGdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIGNsX2Jsb2NrJ3MgKi8KLQotc3RhdGljIHZvaWQgY2xfYmxvY2tfaW5pdGlhbGl6ZShjbF9ibG9jayAqYmxvY2ssIGNoYXIgKmJ1ZmZlcikgewotICBibG9jay0+YnVmZmVyID0gYnVmZmVyOwotICBncHJfYXRtX3JlbF9zdG9yZSgmYmxvY2stPndyaXRlcl9sb2NrLCAwKTsKLSAgZ3ByX2F0bV9yZWxfc3RvcmUoJmJsb2NrLT5yZWFkZXJfbG9jaywgMCk7Ci0gIGdwcl9hdG1fcmVsX3N0b3JlKCZibG9jay0+Ynl0ZXNfY29tbWl0dGVkLCAwKTsKLSAgYmxvY2stPmJ5dGVzX3JlYWQgPSAwOwotICBjbF9ibG9ja19saXN0X3N0cnVjdF9pbml0aWFsaXplKCZibG9jay0+bGluaywgYmxvY2spOwotfQotCi0vKiBHdWFyZHMgYWdhaW5zdCBleHBvc2luZyBwYXJ0aWFsbHkgd3JpdHRlbiBidWZmZXIgdG8gdGhlIHJlYWRlci4gKi8KLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX3NldF9ieXRlc19jb21taXR0ZWQoY2xfYmxvY2sgKmJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzX2NvbW1pdHRlZCkgewotICBncHJfYXRtX3JlbF9zdG9yZSgmYmxvY2stPmJ5dGVzX2NvbW1pdHRlZCwgYnl0ZXNfY29tbWl0dGVkKTsKLX0KLQotc3RhdGljIGludDMyX3QgY2xfYmxvY2tfZ2V0X2J5dGVzX2NvbW1pdHRlZChjbF9ibG9jayAqYmxvY2spIHsKLSAgcmV0dXJuIGdwcl9hdG1fYWNxX2xvYWQoJmJsb2NrLT5ieXRlc19jb21taXR0ZWQpOwotfQotCi0vKiBUcmllcyB0byBkaXNhYmxlIGZ1dHVyZSByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGlzIGJsb2NrLiBTdWNjZWVkcyBpZjoKLSAgIC0gbm8gaW4tcHJvZ3Jlc3Mgd3JpdGUgQU5ECi0gICAtIG5vIGluLXByb2dyZXNzIHJlYWQgQU5ECi0gICAtICdkaXNjYXJkX2RhdGEnIHNldCB0byB0cnVlIE9SIG5vIHVucmVhZCBkYXRhCi0gICBPbiBzdWNjZXNzLCBjbGVhcnMgdGhlIGJsb2NrIHN0YXRlIGFuZCByZXR1cm5zIHdpdGggd3JpdGVyX2xvY2tfIGFuZAotICAgcmVhZGVyX2xvY2tfIGhlbGQuIFRoZXNlIGxvY2tzIGFyZSByZWxlYXNlZCBieSBhIHN1YnNlcXVlbnQKLSAgIGNsX2Jsb2NrX2FjY2Vzc19lbmFibGUoKSBjYWxsLiAqLwotc3RhdGljIGludCBjbF9ibG9ja190cnlfZGlzYWJsZV9hY2Nlc3MoY2xfYmxvY2sgKmJsb2NrLCBpbnQgZGlzY2FyZF9kYXRhKSB7Ci0gIGlmICghY2xfdHJ5X2xvY2soJmJsb2NrLT53cml0ZXJfbG9jaykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoIWNsX3RyeV9sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spKSB7Ci0gICAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghZGlzY2FyZF9kYXRhICYmCi0gICAgICAoYmxvY2stPmJ5dGVzX3JlYWQgIT0gY2xfYmxvY2tfZ2V0X2J5dGVzX2NvbW1pdHRlZChibG9jaykpKSB7Ci0gICAgY2xfdW5sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spOwotICAgIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBjbF9ibG9ja19zZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrLCAwKTsKLSAgYmxvY2stPmJ5dGVzX3JlYWQgPSAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgY2xfYmxvY2tfZW5hYmxlX2FjY2VzcyhjbF9ibG9jayAqYmxvY2spIHsKLSAgY2xfdW5sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spOwotICBjbF91bmxvY2soJmJsb2NrLT53cml0ZXJfbG9jayk7Ci19Ci0KLS8qIFJldHVybnMgd2l0aCB3cml0ZXJfbG9jayBoZWxkLiAqLwotc3RhdGljIHZvaWQgKmNsX2Jsb2NrX3N0YXJ0X3dyaXRlKGNsX2Jsb2NrICpibG9jaywgc2l6ZV90IHNpemUpIHsKLSAgaW50MzJfdCBieXRlc19jb21taXR0ZWQ7Ci0gIGlmICghY2xfdHJ5X2xvY2soJmJsb2NrLT53cml0ZXJfbG9jaykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBieXRlc19jb21taXR0ZWQgPSBjbF9ibG9ja19nZXRfYnl0ZXNfY29tbWl0dGVkKGJsb2NrKTsKLSAgaWYgKGJ5dGVzX2NvbW1pdHRlZCArIHNpemUgPiBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSkgewotICAgIGNsX3VubG9jaygmYmxvY2stPndyaXRlcl9sb2NrKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gYmxvY2stPmJ1ZmZlciArIGJ5dGVzX2NvbW1pdHRlZDsKLX0KLQotLyogUmVsZWFzZXMgd3JpdGVyX2xvY2sgYW5kIGluY3JlbWVudHMgY29tbWl0dGVkIGJ5dGVzIGJ5ICdieXRlc193cml0dGVuJy4KLSAgJ2J5dGVzX3dyaXR0ZW4nIG11c3QgYmUgPD0gJ3NpemUnIHNwZWNpZmllZCBpbiB0aGUgY29ycmVzcG9uZGluZwotICBTdGFydFdyaXRlKCkgY2FsbC4gVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZS4gKi8KLXN0YXRpYyB2b2lkIGNsX2Jsb2NrX2VuZF93cml0ZShjbF9ibG9jayAqYmxvY2ssIHNpemVfdCBieXRlc193cml0dGVuKSB7Ci0gIGNsX2Jsb2NrX3NldF9ieXRlc19jb21taXR0ZWQoCi0gICAgICBibG9jaywgY2xfYmxvY2tfZ2V0X2J5dGVzX2NvbW1pdHRlZChibG9jaykgKyBieXRlc193cml0dGVuKTsKLSAgY2xfdW5sb2NrKCZibG9jay0+d3JpdGVyX2xvY2spOwotfQotCi0vKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgdW5yZWFkIGJ5dGUgaW4gYnVmZmVyLiBUaGUgbnVtYmVyIG9mIGJ5dGVzCi0gICBhdmFpbGFibGUgYXJlIHJldHVybmVkIGluICdieXRlc19hdmFpbGFibGUnLiBBY3F1aXJlcyByZWFkZXIgbG9jayB0aGF0IGlzCi0gICByZWxlYXNlZCBieSBhIHN1YnNlcXVlbnQgY2xfYmxvY2tfZW5kX3JlYWQoKSBjYWxsLiBSZXR1cm5zIE5VTEwgaWY6Ci0gICAtIHJlYWQgaW4gcHJvZ3Jlc3MKLSAgIC0gbm8gZGF0YSBhdmFpbGFibGUgKi8KLXN0YXRpYyB2b2lkICpjbF9ibG9ja19zdGFydF9yZWFkKGNsX2Jsb2NrICpibG9jaywgc2l6ZV90ICpieXRlc19hdmFpbGFibGUpIHsKLSAgdm9pZCAqcmVjb3JkOwotICBpZiAoIWNsX3RyeV9sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgLyogYnl0ZXNfY29tbWl0dGVkIG1heSBjaGFuZ2UgZnJvbSB1bmRlciB1cy4gVXNlIGJ5dGVzX2F2YWlsYWJsZSB0byB1cGRhdGUKLSAgICAgYnl0ZXNfcmVhZCBiZWxvdy4gKi8KLSAgKmJ5dGVzX2F2YWlsYWJsZSA9IGNsX2Jsb2NrX2dldF9ieXRlc19jb21taXR0ZWQoYmxvY2spIC0gYmxvY2stPmJ5dGVzX3JlYWQ7Ci0gIGlmICgqYnl0ZXNfYXZhaWxhYmxlID09IDApIHsKLSAgICBjbF91bmxvY2soJmJsb2NrLT5yZWFkZXJfbG9jayk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmVjb3JkID0gYmxvY2stPmJ1ZmZlciArIGJsb2NrLT5ieXRlc19yZWFkOwotICBibG9jay0+Ynl0ZXNfcmVhZCArPSAqYnl0ZXNfYXZhaWxhYmxlOwotICByZXR1cm4gcmVjb3JkOwotfQotCi1zdGF0aWMgdm9pZCBjbF9ibG9ja19lbmRfcmVhZChjbF9ibG9jayAqYmxvY2spIHsKLSAgY2xfdW5sb2NrKCZibG9jay0+cmVhZGVyX2xvY2spOwotfQotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgb3BlcmF0aW5nIG9uIGdfbG9nICovCi0KLS8qIEFsbG9jYXRlcyBhIG5ldyBmcmVlIGJsb2NrIChvciByZWN5Y2xlcyBhbiBhdmFpbGFibGUgZGlydHkgYmxvY2sgaWYgbG9nIGlzCi0gICBjb25maWd1cmVkIHRvIGRpc2NhcmQgb2xkIHJlY29yZHMpLiBSZXR1cm5zIE5VTEwgaWYgb3V0LW9mLXNwYWNlLiAqLwotc3RhdGljIGNsX2Jsb2NrICpjbF9hbGxvY2F0ZV9ibG9jayh2b2lkKSB7Ci0gIGNsX2Jsb2NrICpibG9jayA9IGNsX2Jsb2NrX2xpc3RfaGVhZCgmZ19sb2cuZnJlZV9ibG9ja19saXN0KTsKLSAgaWYgKGJsb2NrICE9IE5VTEwpIHsKLSAgICBjbF9ibG9ja19saXN0X3JlbW92ZSgmZ19sb2cuZnJlZV9ibG9ja19saXN0LCBibG9jayk7Ci0gICAgcmV0dXJuIGJsb2NrOwotICB9Ci0gIGlmICghZ19sb2cuZGlzY2FyZF9vbGRfcmVjb3JkcykgewotICAgIC8qIE5vIGZyZWUgYmxvY2sgYW5kIGxvZyBpcyBjb25maWd1cmVkIHRvIGtlZXAgb2xkIHJlY29yZHMuICovCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgLyogUmVjeWNsZSBkaXJ0eSBibG9jay4gU3RhcnQgZnJvbSB0aGUgb2xkZXN0LiAqLwotICBmb3IgKGJsb2NrID0gY2xfYmxvY2tfbGlzdF9oZWFkKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0KTsgYmxvY2sgIT0gTlVMTDsKLSAgICAgICBibG9jayA9IGJsb2NrLT5saW5rLm5leHQtPmJsb2NrKSB7Ci0gICAgaWYgKGNsX2Jsb2NrX3RyeV9kaXNhYmxlX2FjY2VzcyhibG9jaywgMSAvKiBkaXNjYXJkIGRhdGEgKi8pKSB7Ci0gICAgICBjbF9ibG9ja19saXN0X3JlbW92ZSgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCwgYmxvY2spOwotICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQWxsb2NhdGVzIGEgbmV3IGJsb2NrIGFuZCB1cGRhdGVzIGNvcmUgaWQgPT4gYmxvY2sgbWFwcGluZy4gJ29sZF9ibG9jaycKLSAgIHBvaW50cyB0byB0aGUgYmxvY2sgdGhhdCB0aGUgY2FsbGVyIHRoaW5rcyBpcyBhdHRhY2hlZCB0bwotICAgJ2NvcmVfaWQnLiAnb2xkX2Jsb2NrJyBtYXkgYmUgTlVMTC4gUmV0dXJucyBub24temVybyBpZjoKLSAgIC0gYWxsb2NhdGVkIGEgbmV3IGJsb2NrIE9SCi0gICAtICdjb3JlX2lkJyA9PiAnb2xkX2Jsb2NrJyBtYXBwaW5nIGNoYW5nZWQgKGFub3RoZXIgdGhyZWFkIGFsbG9jYXRlZCBhCi0gICAgIGJsb2NrIGJlZm9yZSBsb2NrIHdhcyBhY3F1aXJlZCkuICovCi1zdGF0aWMgaW50IGNsX2FsbG9jYXRlX2NvcmVfbG9jYWxfYmxvY2soaW50MzJfdCBjb3JlX2lkLCBjbF9ibG9jayAqb2xkX2Jsb2NrKSB7Ci0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGxvY2ssIGNoZWNrIGlmIGNvcmUtbG9jYWwgbWFwcGluZyBoYXMgY2hhbmdlZC4gKi8KLSAgY2xfY29yZV9sb2NhbF9ibG9jayAqY29yZV9sb2NhbF9ibG9jayA9ICZnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrc1tjb3JlX2lkXTsKLSAgY2xfYmxvY2sgKmJsb2NrID0gY2xfY29yZV9sb2NhbF9ibG9ja19nZXRfYmxvY2soY29yZV9sb2NhbF9ibG9jayk7Ci0gIGlmICgoYmxvY2sgIT0gTlVMTCkgJiYgKGJsb2NrICE9IG9sZF9ibG9jaykpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAoYmxvY2sgIT0gTlVMTCkgewotICAgIGNsX2NvcmVfbG9jYWxfYmxvY2tfc2V0X2Jsb2NrKGNvcmVfbG9jYWxfYmxvY2ssIE5VTEwpOwotICAgIGNsX2Jsb2NrX2xpc3RfaW5zZXJ0X2F0X3RhaWwoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QsIGJsb2NrKTsKLSAgfQotICBibG9jayA9IGNsX2FsbG9jYXRlX2Jsb2NrKCk7Ci0gIGlmIChibG9jayA9PSBOVUxMKSB7Ci0gICAgZ3ByX2F0bV9yZWxfc3RvcmUoJmdfbG9nLmlzX2Z1bGwsIDEpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGNsX2NvcmVfbG9jYWxfYmxvY2tfc2V0X2Jsb2NrKGNvcmVfbG9jYWxfYmxvY2ssIGJsb2NrKTsKLSAgY2xfYmxvY2tfZW5hYmxlX2FjY2VzcyhibG9jayk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2xfYmxvY2sgKmNsX2dldF9ibG9jayh2b2lkICpyZWNvcmQpIHsKLSAgdWludHB0cl90IHAgPSAodWludHB0cl90KSgoY2hhciAqKXJlY29yZCAtIGdfbG9nLmJ1ZmZlcik7Ci0gIHVpbnRwdHJfdCBpbmRleCA9IHAgPj4gQ0VOU1VTX0xPR18yX01BWF9SRUNPUkRfU0laRTsKLSAgcmV0dXJuICZnX2xvZy5ibG9ja3NbaW5kZXhdOwotfQotCi0vKiBHZXRzIHRoZSBuZXh0IGJsb2NrIHRvIHJlYWQgYW5kIHRyaWVzIHRvIGZyZWUgJ3ByZXYnIGJsb2NrIChpZiBub3QgTlVMTCkuCi0gICBSZXR1cm5zIE5VTEwgaWYgcmVhY2hlZCB0aGUgZW5kLiAqLwotc3RhdGljIGNsX2Jsb2NrICpjbF9uZXh0X2Jsb2NrX3RvX3JlYWQoY2xfYmxvY2sgKnByZXYpIHsKLSAgY2xfYmxvY2sgKmJsb2NrID0gTlVMTDsKLSAgaWYgKGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUgPT0gZ19sb2cubnVtX2NvcmVzKSB7Ci0gICAgLyogV2UgYXJlIHRyYXZlcnNpbmcgZGlydHkgbGlzdDsgZmluZCB0aGUgbmV4dCBkaXJ0eSBibG9jay4gKi8KLSAgICBpZiAocHJldiAhPSBOVUxMKSB7Ci0gICAgICAvKiBUcnkgdG8gZnJlZSB0aGUgcHJldmlvdXMgYmxvY2sgaWYgdGhlcmUgaXMgbm8gdW5yZWFkIGRhdGEuIFRoaXMgYmxvY2sKLSAgICAgICAgIG1heSBoYXZlIHVucmVhZCBkYXRhIGlmIHByZXZpb3VzbHkgaW5jb21wbGV0ZSByZWNvcmQgY29tcGxldGVkIGJldHdlZW4KLSAgICAgICAgIHJlYWRfbmV4dCgpIGNhbGxzLiAqLwotICAgICAgYmxvY2sgPSBwcmV2LT5saW5rLm5leHQtPmJsb2NrOwotICAgICAgaWYgKGNsX2Jsb2NrX3RyeV9kaXNhYmxlX2FjY2VzcyhwcmV2LCAwIC8qIGRvIG5vdCBkaXNjYXJkIGRhdGEgKi8pKSB7Ci0gICAgICAgIGNsX2Jsb2NrX2xpc3RfcmVtb3ZlKCZnX2xvZy5kaXJ0eV9ibG9ja19saXN0LCBwcmV2KTsKLSAgICAgICAgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfaGVhZCgmZ19sb2cuZnJlZV9ibG9ja19saXN0LCBwcmV2KTsKLSAgICAgICAgZ3ByX2F0bV9yZWxfc3RvcmUoJmdfbG9nLmlzX2Z1bGwsIDApOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBibG9jayA9IGNsX2Jsb2NrX2xpc3RfaGVhZCgmZ19sb2cuZGlydHlfYmxvY2tfbGlzdCk7Ci0gICAgfQotICAgIGlmIChibG9jayAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gYmxvY2s7Ci0gICAgfQotICAgIC8qIFdlIGFyZSBkb25lIHdpdGggdGhlIGRpcnR5IGxpc3Q7IG1vdmluZyBvbiB0byBjb3JlLWxvY2FsIGJsb2Nrcy4gKi8KLSAgfQotICB3aGlsZSAoZ19sb2cucmVhZF9pdGVyYXRvcl9zdGF0ZSA+IDApIHsKLSAgICBnX2xvZy5yZWFkX2l0ZXJhdG9yX3N0YXRlLS07Ci0gICAgYmxvY2sgPSBjbF9jb3JlX2xvY2FsX2Jsb2NrX2dldF9ibG9jaygKLSAgICAgICAgJmdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzW2dfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGVdKTsKLSAgICBpZiAoYmxvY2sgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRXh0ZXJuYWwgZnVuY3Rpb25zOiBwcmltYXJ5IHN0YXRzX2xvZyBpbnRlcmZhY2UgKi8KLXZvaWQgY2Vuc3VzX2xvZ19pbml0aWFsaXplKHNpemVfdCBzaXplX2luX21iLCBpbnQgZGlzY2FyZF9vbGRfcmVjb3JkcykgewotICBpbnQzMl90IGl4OwotICAvKiBDaGVjayBjYWNoZWxpbmUgYWxpZ25tZW50LiAqLwotICBHUFJfQVNTRVJUKHNpemVvZihjbF9ibG9jaykgJSBHUFJfQ0FDSEVMSU5FX1NJWkUgPT0gMCk7Ci0gIEdQUl9BU1NFUlQoc2l6ZW9mKGNsX2NvcmVfbG9jYWxfYmxvY2spICUgR1BSX0NBQ0hFTElORV9TSVpFID09IDApOwotICBHUFJfQVNTRVJUKCFnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGdfbG9nLmRpc2NhcmRfb2xkX3JlY29yZHMgPSBkaXNjYXJkX29sZF9yZWNvcmRzOwotICBnX2xvZy5udW1fY29yZXMgPSBncHJfY3B1X251bV9jb3JlcygpOwotICAvKiBFbnN1cmUgYXQgbGVhc3QgYXMgbWFueSBibG9ja3MgYXMgdGhlcmUgYXJlIGNvcmVzLiAqLwotICBnX2xvZy5udW1fYmxvY2tzID0gR1BSX01BWCgKLSAgICAgIGdfbG9nLm51bV9jb3JlcywgKHNpemVfaW5fbWIgPDwgMjApID4+IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUpOwotICBncHJfbXVfaW5pdCgmZ19sb2cubG9jayk7Ci0gIGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUgPSAwOwotICBnX2xvZy5ibG9ja19iZWluZ19yZWFkID0gTlVMTDsKLSAgZ3ByX2F0bV9yZWxfc3RvcmUoJmdfbG9nLmlzX2Z1bGwsIDApOwotICBnX2xvZy5jb3JlX2xvY2FsX2Jsb2NrcyA9IChjbF9jb3JlX2xvY2FsX2Jsb2NrICopZ3ByX21hbGxvY19hbGlnbmVkKAotICAgICAgZ19sb2cubnVtX2NvcmVzICogc2l6ZW9mKGNsX2NvcmVfbG9jYWxfYmxvY2spLCBHUFJfQ0FDSEVMSU5FX1NJWkVfTE9HKTsKLSAgbWVtc2V0KGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzLCAwLAotICAgICAgICAgZ19sb2cubnVtX2NvcmVzICogc2l6ZW9mKGNsX2NvcmVfbG9jYWxfYmxvY2spKTsKLSAgZ19sb2cuYmxvY2tzID0gKGNsX2Jsb2NrICopZ3ByX21hbGxvY19hbGlnbmVkKAotICAgICAgZ19sb2cubnVtX2Jsb2NrcyAqIHNpemVvZihjbF9ibG9jayksIEdQUl9DQUNIRUxJTkVfU0laRV9MT0cpOwotICBtZW1zZXQoZ19sb2cuYmxvY2tzLCAwLCBnX2xvZy5udW1fYmxvY2tzICogc2l6ZW9mKGNsX2Jsb2NrKSk7Ci0gIGdfbG9nLmJ1ZmZlciA9IGdwcl9tYWxsb2MoZ19sb2cubnVtX2Jsb2NrcyAqIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKTsKLSAgbWVtc2V0KGdfbG9nLmJ1ZmZlciwgMCwgZ19sb2cubnVtX2Jsb2NrcyAqIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFKTsKLSAgY2xfYmxvY2tfbGlzdF9pbml0aWFsaXplKCZnX2xvZy5mcmVlX2Jsb2NrX2xpc3QpOwotICBjbF9ibG9ja19saXN0X2luaXRpYWxpemUoJmdfbG9nLmRpcnR5X2Jsb2NrX2xpc3QpOwotICBmb3IgKGl4ID0gMDsgaXggPCBnX2xvZy5udW1fYmxvY2tzOyArK2l4KSB7Ci0gICAgY2xfYmxvY2sgKmJsb2NrID0gZ19sb2cuYmxvY2tzICsgaXg7Ci0gICAgY2xfYmxvY2tfaW5pdGlhbGl6ZShibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdfbG9nLmJ1ZmZlciArIChDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSAqIGl4KSk7Ci0gICAgY2xfYmxvY2tfdHJ5X2Rpc2FibGVfYWNjZXNzKGJsb2NrLCAxIC8qIGRpc2NhcmQgZGF0YSAqLyk7Ci0gICAgY2xfYmxvY2tfbGlzdF9pbnNlcnRfYXRfdGFpbCgmZ19sb2cuZnJlZV9ibG9ja19saXN0LCBibG9jayk7Ci0gIH0KLSAgZ3ByX2F0bV9yZWxfc3RvcmUoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCwgMCk7Ci0gIGdfbG9nLmluaXRpYWxpemVkID0gMTsKLX0KLQotdm9pZCBjZW5zdXNfbG9nX3NodXRkb3duKHZvaWQpIHsKLSAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGdwcl9tdV9kZXN0cm95KCZnX2xvZy5sb2NrKTsKLSAgZ3ByX2ZyZWVfYWxpZ25lZChnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrcyk7Ci0gIGdfbG9nLmNvcmVfbG9jYWxfYmxvY2tzID0gTlVMTDsKLSAgZ3ByX2ZyZWVfYWxpZ25lZChnX2xvZy5ibG9ja3MpOwotICBnX2xvZy5ibG9ja3MgPSBOVUxMOwotICBncHJfZnJlZShnX2xvZy5idWZmZXIpOwotICBnX2xvZy5idWZmZXIgPSBOVUxMOwotICBnX2xvZy5pbml0aWFsaXplZCA9IDA7Ci19Ci0KLXZvaWQgKmNlbnN1c19sb2dfc3RhcnRfd3JpdGUoc2l6ZV90IHNpemUpIHsKLSAgLyogVXNlZCB0byBib3VuZCBudW1iZXIgb2YgdGltZXMgYmxvY2sgYWxsb2NhdGlvbiBpcyBhdHRlbXB0ZWQuICovCi0gIGludDMyX3QgYXR0ZW1wdHNfcmVtYWluaW5nID0gZ19sb2cubnVtX2Jsb2NrczsKLSAgLyogVE9ETyhhdmVpdGNoKTogbW92ZSB0aGlzIGluc2lkZSB0aGUgZG8gbG9vcCB3aGVuIGN1cnJlbnRfY3B1IGlzIGZpeGVkICovCi0gIGludDMyX3QgY29yZV9pZCA9IGdwcl9jcHVfY3VycmVudF9jcHUoKTsKLSAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGlmIChzaXplID4gQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkUpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBkbyB7Ci0gICAgaW50IGFsbG9jYXRlZDsKLSAgICB2b2lkICpyZWNvcmQgPSBOVUxMOwotICAgIGNsX2Jsb2NrICpibG9jayA9Ci0gICAgICAgIGNsX2NvcmVfbG9jYWxfYmxvY2tfZ2V0X2Jsb2NrKCZnX2xvZy5jb3JlX2xvY2FsX2Jsb2Nrc1tjb3JlX2lkXSk7Ci0gICAgaWYgKGJsb2NrICYmIChyZWNvcmQgPSBjbF9ibG9ja19zdGFydF93cml0ZShibG9jaywgc2l6ZSkpKSB7Ci0gICAgICByZXR1cm4gcmVjb3JkOwotICAgIH0KLSAgICAvKiBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrLiBXZSBhcmUgaGVyZSBpZjoKLSAgICAgICAtIE5vIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBPUgotICAgICAgIC0gV3JpdGUgaW4tcHJvZ3Jlc3Mgb24gdGhlIGJsb2NrIE9SCi0gICAgICAgLSBibG9jayBpcyBvdXQgb2Ygc3BhY2UgKi8KLSAgICBpZiAoZ3ByX2F0bV9hY3FfbG9hZCgmZ19sb2cuaXNfZnVsbCkpIHsKLSAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCwgMSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZ3ByX211X2xvY2soJmdfbG9nLmxvY2spOwotICAgIGFsbG9jYXRlZCA9IGNsX2FsbG9jYXRlX2NvcmVfbG9jYWxfYmxvY2soY29yZV9pZCwgYmxvY2spOwotICAgIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOwotICAgIGlmICghYWxsb2NhdGVkKSB7Ci0gICAgICBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZnX2xvZy5vdXRfb2Zfc3BhY2VfY291bnQsIDEpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9IHdoaWxlIChhdHRlbXB0c19yZW1haW5pbmctLSk7Ci0gIC8qIEdpdmUgdXAuICovCi0gIGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJmdfbG9nLm91dF9vZl9zcGFjZV9jb3VudCwgMSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIGNlbnN1c19sb2dfZW5kX3dyaXRlKHZvaWQgKnJlY29yZCwgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4pIHsKLSAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGNsX2Jsb2NrX2VuZF93cml0ZShjbF9nZXRfYmxvY2socmVjb3JkKSwgYnl0ZXNfd3JpdHRlbik7Ci19Ci0KLXZvaWQgY2Vuc3VzX2xvZ19pbml0X3JlYWRlcih2b2lkKSB7Ci0gIEdQUl9BU1NFUlQoZ19sb2cuaW5pdGlhbGl6ZWQpOwotICBncHJfbXVfbG9jaygmZ19sb2cubG9jayk7Ci0gIC8qIElmIGEgYmxvY2sgaXMgbG9ja2VkIGZvciByZWFkaW5nIHVubG9jayBpdC4gKi8KLSAgaWYgKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgIT0gTlVMTCkgewotICAgIGNsX2Jsb2NrX2VuZF9yZWFkKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQpOwotICAgIGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgPSBOVUxMOwotICB9Ci0gIGdfbG9nLnJlYWRfaXRlcmF0b3Jfc3RhdGUgPSBnX2xvZy5udW1fY29yZXM7Ci0gIGdwcl9tdV91bmxvY2soJmdfbG9nLmxvY2spOwotfQotCi1jb25zdCB2b2lkICpjZW5zdXNfbG9nX3JlYWRfbmV4dChzaXplX3QgKmJ5dGVzX2F2YWlsYWJsZSkgewotICBHUFJfQVNTRVJUKGdfbG9nLmluaXRpYWxpemVkKTsKLSAgZ3ByX211X2xvY2soJmdfbG9nLmxvY2spOwotICBpZiAoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCAhPSBOVUxMKSB7Ci0gICAgY2xfYmxvY2tfZW5kX3JlYWQoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCk7Ci0gIH0KLSAgZG8gewotICAgIGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgPSBjbF9uZXh0X2Jsb2NrX3RvX3JlYWQoZ19sb2cuYmxvY2tfYmVpbmdfcmVhZCk7Ci0gICAgaWYgKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQgIT0gTlVMTCkgewotICAgICAgdm9pZCAqcmVjb3JkID0KLSAgICAgICAgICBjbF9ibG9ja19zdGFydF9yZWFkKGdfbG9nLmJsb2NrX2JlaW5nX3JlYWQsIGJ5dGVzX2F2YWlsYWJsZSk7Ci0gICAgICBpZiAocmVjb3JkICE9IE5VTEwpIHsKLSAgICAgICAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7Ci0gICAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgICB9Ci0gICAgfQotICB9IHdoaWxlIChnX2xvZy5ibG9ja19iZWluZ19yZWFkICE9IE5VTEwpOwotICBncHJfbXVfdW5sb2NrKCZnX2xvZy5sb2NrKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXNpemVfdCBjZW5zdXNfbG9nX3JlbWFpbmluZ19zcGFjZSh2b2lkKSB7Ci0gIHNpemVfdCBzcGFjZTsKLSAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7Ci0gIGdwcl9tdV9sb2NrKCZnX2xvZy5sb2NrKTsKLSAgaWYgKGdfbG9nLmRpc2NhcmRfb2xkX3JlY29yZHMpIHsKLSAgICAvKiBSZW1haW5pbmcgc3BhY2UgaXMgbm90IG1lYW5pbmdmdWw7IGp1c3QgcmV0dXJuIHRoZSBlbnRpcmUgbG9nIHNwYWNlLiAqLwotICAgIHNwYWNlID0gZ19sb2cubnVtX2Jsb2NrcyA8PCBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFOwotICB9IGVsc2UgewotICAgIHNwYWNlID0gZ19sb2cuZnJlZV9ibG9ja19saXN0LmNvdW50ICogQ0VOU1VTX0xPR19NQVhfUkVDT1JEX1NJWkU7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19sb2cubG9jayk7Ci0gIHJldHVybiBzcGFjZTsKLX0KLQotaW50IGNlbnN1c19sb2dfb3V0X29mX3NwYWNlX2NvdW50KHZvaWQpIHsKLSAgR1BSX0FTU0VSVChnX2xvZy5pbml0aWFsaXplZCk7Ci0gIHJldHVybiBncHJfYXRtX2FjcV9sb2FkKCZnX2xvZy5vdXRfb2Zfc3BhY2VfY291bnQpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmggYi9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjZTBkNC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NUQVRJU1RJQ1NfQ0VOU1VTX0xPR19ICi0jZGVmaW5lIEdSUENfQ09SRV9TVEFUSVNUSUNTX0NFTlNVU19MT0dfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIE1heGltdW0gcmVjb3JkIHNpemUsIGluIGJ5dGVzLiAqLwotI2RlZmluZSBDRU5TVVNfTE9HXzJfTUFYX1JFQ09SRF9TSVpFIDE0IC8qIDJeMTQgPSAxNktCICovCi0jZGVmaW5lIENFTlNVU19MT0dfTUFYX1JFQ09SRF9TSVpFICgxIDw8IENFTlNVU19MT0dfMl9NQVhfUkVDT1JEX1NJWkUpCi0KLS8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgbG9nZ2luZyBzdWJzeXN0ZW0gd2l0aCB0aGUgZ2l2ZW4gbG9nIHNpemUuIEEgbG9nCi0gICBzaXplIG9mIDAgd2lsbCByZXN1bHQgaW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGxvZyBmb3IgdGhlIHBsYXRmb3JtCi0gICAoYXBwcm94aW1hdGVseSBDRU5TVVNfTE9HX01BWF9SRUNPUkRfU0laRSAqIGdwcl9jcHVfbnVtX2NvcmVzKCkpLiBJZgotICAgZGlzY2FyZF9vbGRfcmVjb3JkcyBpcyBub24temVybywgdGhlbiBuZXcgcmVjb3JkcyB3aWxsIGRpc3BsYWNlIG9sZGVyIG9uZXMKLSAgIHdoZW4gdGhlIGxvZyBpcyBmdWxsLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIKLSAgIGNlbnN1c19sb2cgZnVuY3Rpb25zLgotKi8KLXZvaWQgY2Vuc3VzX2xvZ19pbml0aWFsaXplKHNpemVfdCBzaXplX2luX21iLCBpbnQgZGlzY2FyZF9vbGRfcmVjb3Jkcyk7Ci0KLS8qIFNodXRkb3duIHRoZSBsb2dnaW5nIHN1YnN5c3RlbS4gQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQ6Ci0gICAtIG5vIGluIHByb2dyZXNzIG9yIGZ1dHVyZSBjYWxsIHRvIGFueSBjZW5zdXNfbG9nIGZ1bmN0aW9ucwotICAgLSBubyBpbmNvbXBsZXRlIHJlY29yZHMKLSovCi12b2lkIGNlbnN1c19sb2dfc2h1dGRvd24odm9pZCk7Ci0KLS8qIEFsbG9jYXRlcyBhbmQgcmV0dXJucyBhICdzaXplJyBieXRlcyByZWNvcmQgYW5kIG1hcmtzIGl0IGluIHVzZS4gQQotICAgc3Vic2VxdWVudCBjZW5zdXNfbG9nX2VuZF93cml0ZSgpIG1hcmtzIHRoZSByZWNvcmQgY29tcGxldGUuIFRoZQotICAgJ2J5dGVzX3dyaXR0ZW4nIGNlbnN1c19sb2dfZW5kX3dyaXRlKCkgYXJndW1lbnQgbXVzdCBiZSA8PQotICAgJ3NpemUnLiBSZXR1cm5zIE5VTEwgaWYgb3V0LW9mLXNwYWNlIEFORDoKLSAgICAgICAtIGxvZyBpcyBjb25maWd1cmVkIHRvIGtlZXAgb2xkIHJlY29yZHMgT1IKLSAgICAgICAtIGFsbCBibG9ja3MgYXJlIHBpbm5lZCBieSBpbmNvbXBsZXRlIHJlY29yZHMuCi0qLwotdm9pZCAqY2Vuc3VzX2xvZ19zdGFydF93cml0ZShzaXplX3Qgc2l6ZSk7Ci0KLXZvaWQgY2Vuc3VzX2xvZ19lbmRfd3JpdGUodm9pZCAqcmVjb3JkLCBzaXplX3QgYnl0ZXNfd3JpdHRlbik7Ci0KLS8qIGNlbnN1c19sb2dfcmVhZF9uZXh0KCkgaXRlcmF0ZXMgb3ZlciBibG9ja3Mgd2l0aCBkYXRhIGFuZCBmb3IgZWFjaCBibG9jawotICAgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHVucmVhZCBieXRlLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlCi0gICByZWFkIGFyZSByZXR1cm5lZCBpbiAnYnl0ZXNfYXZhaWxhYmxlJy4gUmVhZGVyIGlzIGV4cGVjdGVkIHRvIHJlYWQgYWxsCi0gICBhdmFpbGFibGUgZGF0YS4gUmVhZGluZyB0aGUgZGF0YSBjb25zdW1lcyBpdCBpLmUuIGl0IGNhbm5vdCBiZSByZWFkIGFnYWluLgotICAgY2Vuc3VzX2xvZ19yZWFkX25leHQoKSByZXR1cm5zIE5VTEwgaWYgdGhlIGVuZCBpcyByZWFjaGVkIGkuZSBsYXN0IGJsb2NrCi0gICBpcyByZWFkLiBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKCkgc3RhcnRzIHRoZSBpdGVyYXRpb24gb3IgYWJvcnRzIHRoZQotICAgY3VycmVudCBpdGVyYXRpb24uCi0qLwotdm9pZCBjZW5zdXNfbG9nX2luaXRfcmVhZGVyKHZvaWQpOwotY29uc3Qgdm9pZCAqY2Vuc3VzX2xvZ19yZWFkX25leHQoc2l6ZV90ICpieXRlc19hdmFpbGFibGUpOwotCi0vKiBSZXR1cm5zIGVzdGltYXRlZCByZW1haW5pbmcgc3BhY2UgYWNyb3NzIGFsbCBibG9ja3MsIGluIGJ5dGVzLiBJZiBsb2cgaXMKLSAgIGNvbmZpZ3VyZWQgdG8gZGlzY2FyZCBvbGQgcmVjb3JkcywgcmV0dXJucyB0b3RhbCBsb2cgc3BhY2UuIE90aGVyd2lzZSwKLSAgIHJldHVybnMgc3BhY2UgYXZhaWxhYmxlIGluIGVtcHR5IGJsb2NrcyAocGFydGlhbGx5IGZpbGxlZCBibG9ja3MgYXJlCi0gICB0cmVhdGVkIGFzIGZ1bGwpLgotKi8KLXNpemVfdCBjZW5zdXNfbG9nX3JlbWFpbmluZ19zcGFjZSh2b2lkKTsKLQotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIGdwcmNfc3RhdHNfbG9nX3N0YXJ0X3dyaXRlKCkgZmFpbGVkIGR1ZSB0bwotICAgb3V0LW9mLXNwYWNlLiAqLwotaW50IGNlbnN1c19sb2dfb3V0X29mX3NwYWNlX2NvdW50KHZvaWQpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NUQVRJU1RJQ1NfQ0VOU1VTX0xPR19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuYyBiL3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzhkNmZkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGUuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi0jZGVmaW5lIE5VTV9JTlRFUlZBTFMgMwotI2RlZmluZSBNSU5VVEVfSU5URVJWQUwgMAotI2RlZmluZSBIT1VSX0lOVEVSVkFMIDEKLSNkZWZpbmUgVE9UQUxfSU5URVJWQUwgMgotCi0vKiBmb3IgZWFzaWVyIHR5cGluZyAqLwotdHlwZWRlZiBjZW5zdXNfcGVyX21ldGhvZF9ycGNfc3RhdHMgcGVyX21ldGhvZF9zdGF0czsKLQotLyogRW5zdXJlIG11IGlzIG9ubHkgaW5pdGlhbGl6ZWQgb25jZS4gKi8KLXN0YXRpYyBncHJfb25jZSBnX3N0YXRzX3N0b3JlX211X2luaXQgPSBHUFJfT05DRV9JTklUOwotLyogR3VhcmRzIHR3byBzdGF0cyBzdG9yZXMuICovCi1zdGF0aWMgZ3ByX211IGdfbXU7Ci1zdGF0aWMgY2Vuc3VzX2h0ICpnX2NsaWVudF9zdGF0c19zdG9yZSA9IE5VTEw7Ci1zdGF0aWMgY2Vuc3VzX2h0ICpnX3NlcnZlcl9zdGF0c19zdG9yZSA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIGluaXRfbXV0ZXgodm9pZCkgeyBncHJfbXVfaW5pdCgmZ19tdSk7IH0KLQotc3RhdGljIHZvaWQgaW5pdF9tdXRleF9vbmNlKHZvaWQpIHsKLSAgZ3ByX29uY2VfaW5pdCgmZ19zdGF0c19zdG9yZV9tdV9pbml0LCBpbml0X211dGV4KTsKLX0KLQotc3RhdGljIGludCBjbXBfc3RyX2tleXMoY29uc3Qgdm9pZCAqazEsIGNvbnN0IHZvaWQgKmsyKSB7Ci0gIHJldHVybiBzdHJjbXAoKGNvbnN0IGNoYXIgKilrMSwgKGNvbnN0IGNoYXIgKilrMik7Ci19Ci0KLS8qIFRPRE8oaG9uZ3l1KTogcmVwbGFjZSBpdCB3aXRoIGNpdHloYXNoNjQgKi8KLXN0YXRpYyB1aW50NjRfdCBzaW1wbGVfaGFzaChjb25zdCB2b2lkICprKSB7Ci0gIHNpemVfdCBsZW4gPSBzdHJsZW4oayk7Ci0gIHVpbnQ2NF90IGhpZ2hlciA9IGdwcl9tdXJtdXJfaGFzaDMoKGNvbnN0IGNoYXIgKilrLCBsZW4gLyAyLCAwKTsKLSAgcmV0dXJuIGhpZ2hlciA8PCAzMiB8Ci0gICAgICAgICBncHJfbXVybXVyX2hhc2gzKChjb25zdCBjaGFyICopayArIGxlbiAvIDIsIGxlbiAtIGxlbiAvIDIsIDApOwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVfc3RhdHModm9pZCAqc3RhdHMpIHsKLSAgY2Vuc3VzX3dpbmRvd19zdGF0c19kZXN0cm95KChzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyAqKXN0YXRzKTsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlX2tleSh2b2lkICprZXkpIHsgZ3ByX2ZyZWUoa2V5KTsgfQotCi1zdGF0aWMgY29uc3QgY2Vuc3VzX2h0X29wdGlvbiBodF9vcHQgPSB7Ci0gICAgQ0VOU1VTX0hUX1BPSU5URVIgLyoga2V5IHR5cGUgKi8sIDE5OTkgLyogbl9vZl9idWNrZXRzICovLAotICAgIHNpbXBsZV9oYXNoIC8qIGhhc2ggZnVuY3Rpb24gKi8sICBjbXBfc3RyX2tleXMgLyoga2V5IGNvbXBhcmF0b3IgKi8sCi0gICAgZGVsZXRlX3N0YXRzIC8qIGRhdGEgZGVsZXRlciAqLywgIGRlbGV0ZV9rZXkgLyoga2V5IGRlbGV0ZXIgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGluaXRfcnBjX3N0YXRzKHZvaWQgKnN0YXRzKSB7Ci0gIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKGNlbnN1c19ycGNfc3RhdHMpKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhdF9hZGRfcHJvcG9ydGlvbihkb3VibGUgcCwgdm9pZCAqYmFzZSwgY29uc3Qgdm9pZCAqYWRkbWUpIHsKLSAgY2Vuc3VzX3JwY19zdGF0cyAqYiA9IChjZW5zdXNfcnBjX3N0YXRzICopYmFzZTsKLSAgY2Vuc3VzX3JwY19zdGF0cyAqYSA9IChjZW5zdXNfcnBjX3N0YXRzICopYWRkbWU7Ci0gIGItPmNudCArPSBwICogYS0+Y250OwotICBiLT5ycGNfZXJyb3JfY250ICs9IHAgKiBhLT5ycGNfZXJyb3JfY250OwotICBiLT5hcHBfZXJyb3JfY250ICs9IHAgKiBhLT5hcHBfZXJyb3JfY250OwotICBiLT5lbGFwc2VkX3RpbWVfbXMgKz0gcCAqIGEtPmVsYXBzZWRfdGltZV9tczsKLSAgYi0+YXBpX3JlcXVlc3RfYnl0ZXMgKz0gcCAqIGEtPmFwaV9yZXF1ZXN0X2J5dGVzOwotICBiLT53aXJlX3JlcXVlc3RfYnl0ZXMgKz0gcCAqIGEtPndpcmVfcmVxdWVzdF9ieXRlczsKLSAgYi0+YXBpX3Jlc3BvbnNlX2J5dGVzICs9IHAgKiBhLT5hcGlfcmVzcG9uc2VfYnl0ZXM7Ci0gIGItPndpcmVfcmVzcG9uc2VfYnl0ZXMgKz0gcCAqIGEtPndpcmVfcmVzcG9uc2VfYnl0ZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXRfYWRkKHZvaWQgKmJhc2UsIGNvbnN0IHZvaWQgKmFkZG1lKSB7Ci0gIHN0YXRfYWRkX3Byb3BvcnRpb24oMS4wLCBiYXNlLCBhZGRtZSk7Ci19Ci0KLXN0YXRpYyBncHJfdGltZXNwZWMgbWluX2hvdXJfdG90YWxfaW50ZXJ2YWxzWzNdID0gewotICAgIHs2MCwgMH0sIHszNjAwLCAwfSwgezM2MDAwMDAwLCAwfX07Ci0KLXN0YXRpYyBjb25zdCBjZW5zdXNfd2luZG93X3N0YXRzX3N0YXRfaW5mbyB3aW5kb3dfc3RhdHNfc2V0dGluZ3MgPSB7Ci0gICAgc2l6ZW9mKGNlbnN1c19ycGNfc3RhdHMpLCBpbml0X3JwY19zdGF0cywgc3RhdF9hZGQsIHN0YXRfYWRkX3Byb3BvcnRpb259OwotCi1jZW5zdXNfcnBjX3N0YXRzICpjZW5zdXNfcnBjX3N0YXRzX2NyZWF0ZV9lbXB0eSh2b2lkKSB7Ci0gIGNlbnN1c19ycGNfc3RhdHMgKnJldCA9Ci0gICAgICAoY2Vuc3VzX3JwY19zdGF0cyAqKWdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c19ycGNfc3RhdHMpKTsKLSAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKGNlbnN1c19ycGNfc3RhdHMpKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHNfc2V0X2VtcHR5KGNlbnN1c19hZ2dyZWdhdGVkX3JwY19zdGF0cyAqZGF0YSkgewotICBpbnQgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fZW50cmllczsgaSsrKSB7Ci0gICAgaWYgKGRhdGEtPnN0YXRzW2ldLm1ldGhvZCAhPSBOVUxMKSB7Ci0gICAgICBncHJfZnJlZSgodm9pZCAqKWRhdGEtPnN0YXRzW2ldLm1ldGhvZCk7Ci0gICAgfQotICB9Ci0gIGlmIChkYXRhLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgZ3ByX2ZyZWUoZGF0YS0+c3RhdHMpOwotICB9Ci0gIGRhdGEtPm51bV9lbnRyaWVzID0gMDsKLSAgZGF0YS0+c3RhdHMgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCByZWNvcmRfc3RhdHMoY2Vuc3VzX2h0ICpzdG9yZSwgY2Vuc3VzX29wX2lkIG9wX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnN1c19ycGNfc3RhdHMgKnN0YXRzKSB7Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgaWYgKHN0b3JlICE9IE5VTEwpIHsKLSAgICBjZW5zdXNfdHJhY2Vfb2JqICp0cmFjZSA9IE5VTEw7Ci0gICAgY2Vuc3VzX2ludGVybmFsX2xvY2tfdHJhY2Vfc3RvcmUoKTsKLSAgICB0cmFjZSA9IGNlbnN1c19nZXRfdHJhY2Vfb2JqX2xvY2tlZChvcF9pZCk7Ci0gICAgaWYgKHRyYWNlICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZF9uYW1lID0gY2Vuc3VzX2dldF90cmFjZV9tZXRob2RfbmFtZSh0cmFjZSk7Ci0gICAgICBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyAqd2luZG93X3N0YXRzID0gTlVMTDsKLSAgICAgIGNlbnN1c19odF9rZXkga2V5OwotICAgICAga2V5LnB0ciA9ICh2b2lkICopbWV0aG9kX25hbWU7Ci0gICAgICB3aW5kb3dfc3RhdHMgPSBjZW5zdXNfaHRfZmluZChzdG9yZSwga2V5KTsKLSAgICAgIGNlbnN1c19pbnRlcm5hbF91bmxvY2tfdHJhY2Vfc3RvcmUoKTsKLSAgICAgIGlmICh3aW5kb3dfc3RhdHMgPT0gTlVMTCkgewotICAgICAgICB3aW5kb3dfc3RhdHMgPSBjZW5zdXNfd2luZG93X3N0YXRzX2NyZWF0ZSgzLCBtaW5faG91cl90b3RhbF9pbnRlcnZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAmd2luZG93X3N0YXRzX3NldHRpbmdzKTsKLSAgICAgICAga2V5LnB0ciA9IGdwcl9zdHJkdXAoa2V5LnB0cik7Ci0gICAgICAgIGNlbnN1c19odF9pbnNlcnQoc3RvcmUsIGtleSwgKHZvaWQgKil3aW5kb3dfc3RhdHMpOwotICAgICAgfQotICAgICAgY2Vuc3VzX3dpbmRvd19zdGF0c19hZGQod2luZG93X3N0YXRzLCBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIHN0YXRzKTsKLSAgICB9IGVsc2UgewotICAgICAgY2Vuc3VzX2ludGVybmFsX3VubG9ja190cmFjZV9zdG9yZSgpOwotICAgIH0KLSAgfQotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLX0KLQotdm9pZCBjZW5zdXNfcmVjb3JkX3JwY19jbGllbnRfc3RhdHMoY2Vuc3VzX29wX2lkIG9wX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2Vuc3VzX3JwY19zdGF0cyAqc3RhdHMpIHsKLSAgcmVjb3JkX3N0YXRzKGdfY2xpZW50X3N0YXRzX3N0b3JlLCBvcF9pZCwgc3RhdHMpOwotfQotCi12b2lkIGNlbnN1c19yZWNvcmRfcnBjX3NlcnZlcl9zdGF0cyhjZW5zdXNfb3BfaWQgb3BfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW5zdXNfcnBjX3N0YXRzICpzdGF0cykgewotICByZWNvcmRfc3RhdHMoZ19zZXJ2ZXJfc3RhdHNfc3RvcmUsIG9wX2lkLCBzdGF0cyk7Ci19Ci0KLS8qIEdldCBzdGF0cyBmcm9tIGlucHV0IHN0YXRzIHN0b3JlICovCi1zdGF0aWMgdm9pZCBnZXRfc3RhdHMoY2Vuc3VzX2h0ICpzdG9yZSwgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzICpkYXRhKSB7Ci0gIEdQUl9BU1NFUlQoZGF0YSAhPSBOVUxMKTsKLSAgaWYgKGRhdGEtPm51bV9lbnRyaWVzICE9IDApIHsKLSAgICBjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHNfc2V0X2VtcHR5KGRhdGEpOwotICB9Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgaWYgKHN0b3JlICE9IE5VTEwpIHsKLSAgICBzaXplX3QgbjsKLSAgICB1bnNpZ25lZCBpLCBqOwotICAgIGdwcl90aW1lc3BlYyBub3cgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gICAgY2Vuc3VzX2h0X2t2ICprdiA9IGNlbnN1c19odF9nZXRfYWxsX2VsZW1lbnRzKHN0b3JlLCAmbik7Ci0gICAgaWYgKGt2ICE9IE5VTEwpIHsKLSAgICAgIGRhdGEtPm51bV9lbnRyaWVzID0gbjsKLSAgICAgIGRhdGEtPnN0YXRzID0KLSAgICAgICAgICAocGVyX21ldGhvZF9zdGF0cyAqKWdwcl9tYWxsb2Moc2l6ZW9mKHBlcl9tZXRob2Rfc3RhdHMpICogbik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGNlbnN1c193aW5kb3dfc3RhdHNfc3VtcyBzdW1zW05VTV9JTlRFUlZBTFNdOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgTlVNX0lOVEVSVkFMUzsgaisrKSB7Ci0gICAgICAgICAgc3Vtc1tqXS5zdGF0aXN0aWMgPSAodm9pZCAqKWNlbnN1c19ycGNfc3RhdHNfY3JlYXRlX2VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS0+c3RhdHNbaV0ubWV0aG9kID0gZ3ByX3N0cmR1cChrdltpXS5rLnB0cik7Ci0gICAgICAgIGNlbnN1c193aW5kb3dfc3RhdHNfZ2V0X3N1bXMoa3ZbaV0udiwgbm93LCBzdW1zKTsKLSAgICAgICAgZGF0YS0+c3RhdHNbaV0ubWludXRlX3N0YXRzID0KLSAgICAgICAgICAgICooY2Vuc3VzX3JwY19zdGF0cyAqKXN1bXNbTUlOVVRFX0lOVEVSVkFMXS5zdGF0aXN0aWM7Ci0gICAgICAgIGRhdGEtPnN0YXRzW2ldLmhvdXJfc3RhdHMgPQotICAgICAgICAgICAgKihjZW5zdXNfcnBjX3N0YXRzICopc3Vtc1tIT1VSX0lOVEVSVkFMXS5zdGF0aXN0aWM7Ci0gICAgICAgIGRhdGEtPnN0YXRzW2ldLnRvdGFsX3N0YXRzID0KLSAgICAgICAgICAgICooY2Vuc3VzX3JwY19zdGF0cyAqKXN1bXNbVE9UQUxfSU5URVJWQUxdLnN0YXRpc3RpYzsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IE5VTV9JTlRFUlZBTFM7IGorKykgewotICAgICAgICAgIGdwcl9mcmVlKHN1bXNbal0uc3RhdGlzdGljKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZ3ByX2ZyZWUoa3YpOwotICAgIH0KLSAgfQotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLX0KLQotdm9pZCBjZW5zdXNfZ2V0X2NsaWVudF9zdGF0cyhjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGEpIHsKLSAgZ2V0X3N0YXRzKGdfY2xpZW50X3N0YXRzX3N0b3JlLCBkYXRhKTsKLX0KLQotdm9pZCBjZW5zdXNfZ2V0X3NlcnZlcl9zdGF0cyhjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGEpIHsKLSAgZ2V0X3N0YXRzKGdfc2VydmVyX3N0YXRzX3N0b3JlLCBkYXRhKTsKLX0KLQotdm9pZCBjZW5zdXNfc3RhdHNfc3RvcmVfaW5pdCh2b2lkKSB7Ci0gIGluaXRfbXV0ZXhfb25jZSgpOwotICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gIGlmIChnX2NsaWVudF9zdGF0c19zdG9yZSA9PSBOVUxMICYmIGdfc2VydmVyX3N0YXRzX3N0b3JlID09IE5VTEwpIHsKLSAgICBnX2NsaWVudF9zdGF0c19zdG9yZSA9IGNlbnN1c19odF9jcmVhdGUoJmh0X29wdCk7Ci0gICAgZ19zZXJ2ZXJfc3RhdHNfc3RvcmUgPSBjZW5zdXNfaHRfY3JlYXRlKCZodF9vcHQpOwotICB9IGVsc2UgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2Vuc3VzIHN0YXRzIHN0b3JlIGFscmVhZHkgaW5pdGlhbGl6ZWQuIik7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci19Ci0KLXZvaWQgY2Vuc3VzX3N0YXRzX3N0b3JlX3NodXRkb3duKHZvaWQpIHsKLSAgaW5pdF9tdXRleF9vbmNlKCk7Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgaWYgKGdfY2xpZW50X3N0YXRzX3N0b3JlICE9IE5VTEwpIHsKLSAgICBjZW5zdXNfaHRfZGVzdHJveShnX2NsaWVudF9zdGF0c19zdG9yZSk7Ci0gICAgZ19jbGllbnRfc3RhdHNfc3RvcmUgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2Vuc3VzIHNlcnZlciBzdGF0cyBzdG9yZSBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gIH0KLSAgaWYgKGdfc2VydmVyX3N0YXRzX3N0b3JlICE9IE5VTEwpIHsKLSAgICBjZW5zdXNfaHRfZGVzdHJveShnX3NlcnZlcl9zdGF0c19zdG9yZSk7Ci0gICAgZ19zZXJ2ZXJfc3RhdHNfc3RvcmUgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2Vuc3VzIGNsaWVudCBzdGF0cyBzdG9yZSBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19tdSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCBiL3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2YyMjBlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NUQVRJU1RJQ1NfQ0VOU1VTX1JQQ19TVEFUU19ICi0jZGVmaW5lIEdSUENfQ09SRV9TVEFUSVNUSUNTX0NFTlNVU19SUENfU1RBVFNfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1zdHJ1Y3QgY2Vuc3VzX3JwY19zdGF0cyB7Ci0gIHVpbnQ2NF90IGNudDsKLSAgdWludDY0X3QgcnBjX2Vycm9yX2NudDsKLSAgdWludDY0X3QgYXBwX2Vycm9yX2NudDsKLSAgZG91YmxlIGVsYXBzZWRfdGltZV9tczsKLSAgZG91YmxlIGFwaV9yZXF1ZXN0X2J5dGVzOwotICBkb3VibGUgd2lyZV9yZXF1ZXN0X2J5dGVzOwotICBkb3VibGUgYXBpX3Jlc3BvbnNlX2J5dGVzOwotICBkb3VibGUgd2lyZV9yZXNwb25zZV9ieXRlczsKLX07Ci0KLS8qIENyZWF0ZXMgYW4gZW1wdHkgcnBjIHN0YXRzIG9iamVjdCBvbiBoZWFwLiAqLwotY2Vuc3VzX3JwY19zdGF0cyAqY2Vuc3VzX3JwY19zdGF0c19jcmVhdGVfZW1wdHkodm9pZCk7Ci0KLXR5cGVkZWYgc3RydWN0IGNlbnN1c19wZXJfbWV0aG9kX3JwY19zdGF0cyB7Ci0gIGNvbnN0IGNoYXIgKm1ldGhvZDsKLSAgY2Vuc3VzX3JwY19zdGF0cyBtaW51dGVfc3RhdHM7IC8qIGN1bXVsYXRpdmUgc3RhdHMgaW4gdGhlIHBhc3QgbWludXRlICovCi0gIGNlbnN1c19ycGNfc3RhdHMgaG91cl9zdGF0czsgICAvKiBjdW11bGF0aXZlIHN0YXRzIGluIHRoZSBwYXN0IGhvdXIgKi8KLSAgY2Vuc3VzX3JwY19zdGF0cyB0b3RhbF9zdGF0czsgIC8qIGN1bXVsYXRpdmUgc3RhdHMgZnJvbSBsYXN0IGdjICovCi19IGNlbnN1c19wZXJfbWV0aG9kX3JwY19zdGF0czsKLQotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzIHsKLSAgaW50IG51bV9lbnRyaWVzOwotICBjZW5zdXNfcGVyX21ldGhvZF9ycGNfc3RhdHMgKnN0YXRzOwotfSBjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHM7Ci0KLS8qIEluaXRpYWxpemVzIGFuIGFnZ3JlZ2F0ZWQgcnBjIHN0YXRzIG9iamVjdCB0byBhbiBlbXB0eSBzdGF0ZS4gKi8KLXZvaWQgY2Vuc3VzX2FnZ3JlZ2F0ZWRfcnBjX3N0YXRzX3NldF9lbXB0eShjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGEpOwotCi0vKiBSZWNvcmRzIGNsaWVudCBzaWRlIHN0YXRzIG9mIGEgcnBjLiAqLwotdm9pZCBjZW5zdXNfcmVjb3JkX3JwY19jbGllbnRfc3RhdHMoY2Vuc3VzX29wX2lkIG9wX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2Vuc3VzX3JwY19zdGF0cyAqc3RhdHMpOwotCi0vKiBSZWNvcmRzIHNlcnZlciBzaWRlIHN0YXRzIG9mIGEgcnBjLiAqLwotdm9pZCBjZW5zdXNfcmVjb3JkX3JwY19zZXJ2ZXJfc3RhdHMoY2Vuc3VzX29wX2lkIG9wX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2Vuc3VzX3JwY19zdGF0cyAqc3RhdHMpOwotCi0vKiBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIGludGVuZGVkIGZvciBpbnByb2Nlc3MgcXVlcnkgb2YKLSAgIHBlci1zZXJ2aWNlIHBlci1tZXRob2Qgc3RhdHMgZnJvbSBncnBjIGltcGxlbWVudGF0aW9ucy4gKi8KLQotLyogUG9wdWxhdGVzICpkYXRhX21hcCB3aXRoIHNlcnZlciBzaWRlIGFnZ3JlZ2F0ZWQgcGVyLXNlcnZpY2UgcGVyLW1ldGhvZAotICAgc3RhdHMuCi0gICBETyBOT1QgQ0FMTCBmcm9tIG91dHNpZGUgb2YgZ3JwYyBjb2RlLiAqLwotdm9pZCBjZW5zdXNfZ2V0X3NlcnZlcl9zdGF0cyhjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGFfbWFwKTsKLQotLyogUG9wdWxhdGVzICpkYXRhX21hcCB3aXRoIGNsaWVudCBzaWRlIGFnZ3JlZ2F0ZWQgcGVyLXNlcnZpY2UgcGVyLW1ldGhvZAotICAgc3RhdHMuCi0gICBETyBOT1QgQ0FMTCBmcm9tIG91dHNpZGUgb2YgZ3JwYyBjb2RlLiAqLwotdm9pZCBjZW5zdXNfZ2V0X2NsaWVudF9zdGF0cyhjZW5zdXNfYWdncmVnYXRlZF9ycGNfc3RhdHMgKmRhdGFfbWFwKTsKLQotdm9pZCBjZW5zdXNfc3RhdHNfc3RvcmVfaW5pdCh2b2lkKTsKLXZvaWQgY2Vuc3VzX3N0YXRzX3N0b3JlX3NodXRkb3duKHZvaWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NUQVRJU1RJQ1NfQ0VOU1VTX1JQQ19TVEFUU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmMgYi9zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkODI0OTguLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGUuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi12b2lkIGNlbnN1c190cmFjZV9vYmpfZGVzdHJveShjZW5zdXNfdHJhY2Vfb2JqICpvYmopIHsKLSAgY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24gKnAgPSBvYmotPmFubm90YXRpb25zOwotICB3aGlsZSAocCAhPSBOVUxMKSB7Ci0gICAgY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24gKm5leHQgPSBwLT5uZXh0OwotICAgIGdwcl9mcmVlKHApOwotICAgIHAgPSBuZXh0OwotICB9Ci0gIGdwcl9mcmVlKG9iai0+bWV0aG9kKTsKLSAgZ3ByX2ZyZWUob2JqKTsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlX3RyYWNlX29iaih2b2lkICpvYmopIHsKLSAgY2Vuc3VzX3RyYWNlX29ial9kZXN0cm95KChjZW5zdXNfdHJhY2Vfb2JqICopb2JqKTsKLX0KLQotc3RhdGljIGNvbnN0IGNlbnN1c19odF9vcHRpb24gaHRfb3B0ID0gewotICAgIENFTlNVU19IVF9VSU5UNjQgLyoga2V5IHR5cGUgKi8sCi0gICAgNTcxIC8qIG5fb2ZfYnVja2V0cyAqLywKLSAgICBOVUxMIC8qIGhhc2ggKi8sCi0gICAgTlVMTCAvKiBjb21wYXJlX2tleXMgKi8sCi0gICAgZGVsZXRlX3RyYWNlX29iaiAvKiBkZWxldGUgZGF0YSAqLywKLSAgICBOVUxMIC8qIGRlbGV0ZSBrZXkgKi8KLX07Ci0KLXN0YXRpYyBncHJfb25jZSBnX2luaXRfbXV0ZXhfb25jZSA9IEdQUl9PTkNFX0lOSVQ7Ci1zdGF0aWMgZ3ByX211IGdfbXU7IC8qIEd1YXJkcyBmb2xsb3dpbmcgdHdvIHN0YXRpYyB2YXJpYWJsZXMuICovCi1zdGF0aWMgY2Vuc3VzX2h0ICpnX3RyYWNlX3N0b3JlID0gTlVMTDsKLXN0YXRpYyB1aW50NjRfdCBnX2lkID0gMDsKLQotc3RhdGljIGNlbnN1c19odF9rZXkgb3BfaWRfYXNfa2V5KGNlbnN1c19vcF9pZCAqaWQpIHsKLSAgcmV0dXJuICooY2Vuc3VzX2h0X2tleSAqKWlkOwotfQotCi1zdGF0aWMgdWludDY0X3Qgb3BfaWRfMl91aW50NjQoY2Vuc3VzX29wX2lkICppZCkgewotICB1aW50NjRfdCByZXQ7Ci0gIG1lbWNweSgmcmV0LCBpZCwgc2l6ZW9mKGNlbnN1c19vcF9pZCkpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpbml0X211dGV4KHZvaWQpIHsgZ3ByX211X2luaXQoJmdfbXUpOyB9Ci0KLXN0YXRpYyB2b2lkIGluaXRfbXV0ZXhfb25jZSh2b2lkKSB7Ci0gIGdwcl9vbmNlX2luaXQoJmdfaW5pdF9tdXRleF9vbmNlLCBpbml0X211dGV4KTsKLX0KLQotY2Vuc3VzX29wX2lkIGNlbnN1c190cmFjaW5nX3N0YXJ0X29wKHZvaWQpIHsKLSAgZ3ByX211X2xvY2soJmdfbXUpOwotICB7Ci0gICAgY2Vuc3VzX3RyYWNlX29iaiAqcmV0ID0gZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX3RyYWNlX29iaikpOwotICAgIG1lbXNldChyZXQsIDAsIHNpemVvZihjZW5zdXNfdHJhY2Vfb2JqKSk7Ci0gICAgZ19pZCsrOwotICAgIG1lbWNweSgmcmV0LT5pZCwgJmdfaWQsIHNpemVvZihjZW5zdXNfb3BfaWQpKTsKLSAgICByZXQtPnJwY19zdGF0cy5jbnQgPSAxOwotICAgIHJldC0+dHMgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gICAgY2Vuc3VzX2h0X2luc2VydChnX3RyYWNlX3N0b3JlLCBvcF9pZF9hc19rZXkoJnJldC0+aWQpLCAodm9pZCAqKXJldCk7Ci0gICAgZ3ByX2xvZyhHUFJfREVCVUcsICJTdGFydCB0cmFjaW5nIGZvciBpZCAlbHUiLCBnX2lkKTsKLSAgICBncHJfbXVfdW5sb2NrKCZnX211KTsKLSAgICByZXR1cm4gcmV0LT5pZDsKLSAgfQotfQotCi1pbnQgY2Vuc3VzX2FkZF9tZXRob2RfdGFnKGNlbnN1c19vcF9pZCBvcF9pZCwgY29uc3QgY2hhciAqbWV0aG9kKSB7Ci0gIGludCByZXQgPSAwOwotICBjZW5zdXNfdHJhY2Vfb2JqICp0cmFjZSA9IE5VTEw7Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgdHJhY2UgPSBjZW5zdXNfaHRfZmluZChnX3RyYWNlX3N0b3JlLCBvcF9pZF9hc19rZXkoJm9wX2lkKSk7Ci0gIGlmICh0cmFjZSA9PSBOVUxMKSB7Ci0gICAgcmV0ID0gMTsKLSAgfSBlbHNlIHsKLSAgICB0cmFjZS0+bWV0aG9kID0gZ3ByX3N0cmR1cChtZXRob2QpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmdfbXUpOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIGNlbnN1c190cmFjaW5nX3ByaW50KGNlbnN1c19vcF9pZCBvcF9pZCwgY29uc3QgY2hhciAqYW5ub190eHQpIHsKLSAgY2Vuc3VzX3RyYWNlX29iaiAqdHJhY2UgPSBOVUxMOwotICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gIHRyYWNlID0gY2Vuc3VzX2h0X2ZpbmQoZ190cmFjZV9zdG9yZSwgb3BfaWRfYXNfa2V5KCZvcF9pZCkpOwotICBpZiAodHJhY2UgIT0gTlVMTCkgewotICAgIGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICphbm5vID0gZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24pKTsKLSAgICBhbm5vLT50cyA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgICB7Ci0gICAgICBjaGFyICpkID0gYW5uby0+dHh0OwotICAgICAgY29uc3QgY2hhciAqcyA9IGFubm9fdHh0OwotICAgICAgaW50IG4gPSAwOwotICAgICAgZm9yICg7IG4gPCBDRU5TVVNfTUFYX0FOTk9UQVRJT05fTEVOR1RIICYmICpzICE9ICdcMCc7ICsrbikgewotICAgICAgICAqZCsrID0gKnMrKzsKLSAgICAgIH0KLSAgICAgICpkID0gJ1wwJzsKLSAgICB9Ci0gICAgYW5uby0+bmV4dCA9IHRyYWNlLT5hbm5vdGF0aW9uczsKLSAgICB0cmFjZS0+YW5ub3RhdGlvbnMgPSBhbm5vOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmdfbXUpOwotfQotCi12b2lkIGNlbnN1c190cmFjaW5nX2VuZF9vcChjZW5zdXNfb3BfaWQgb3BfaWQpIHsKLSAgY2Vuc3VzX3RyYWNlX29iaiAqdHJhY2UgPSBOVUxMOwotICBncHJfbXVfbG9jaygmZ19tdSk7Ci0gIHRyYWNlID0gY2Vuc3VzX2h0X2ZpbmQoZ190cmFjZV9zdG9yZSwgb3BfaWRfYXNfa2V5KCZvcF9pZCkpOwotICBpZiAodHJhY2UgIT0gTlVMTCkgewotICAgIHRyYWNlLT5ycGNfc3RhdHMuZWxhcHNlZF90aW1lX21zID0gZ3ByX3RpbWVzcGVjX3RvX21pY3JvcygKLSAgICAgICAgZ3ByX3RpbWVfc3ViKGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKSwgdHJhY2UtPnRzKSk7Ci0gICAgZ3ByX2xvZyhHUFJfREVCVUcsICJFbmQgdHJhY2luZyBmb3IgaWQgJWx1LCBtZXRob2QgJXMsIGxhdGVuY3kgJWYgdXMiLAotICAgICAgICAgICAgb3BfaWRfMl91aW50NjQoJm9wX2lkKSwgdHJhY2UtPm1ldGhvZCwKLSAgICAgICAgICAgIHRyYWNlLT5ycGNfc3RhdHMuZWxhcHNlZF90aW1lX21zKTsKLSAgICBjZW5zdXNfaHRfZXJhc2UoZ190cmFjZV9zdG9yZSwgb3BfaWRfYXNfa2V5KCZvcF9pZCkpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmdfbXUpOwotfQotCi12b2lkIGNlbnN1c190cmFjaW5nX2luaXQodm9pZCkgewotICBpbml0X211dGV4X29uY2UoKTsKLSAgZ3ByX211X2xvY2soJmdfbXUpOwotICBpZiAoZ190cmFjZV9zdG9yZSA9PSBOVUxMKSB7Ci0gICAgZ19pZCA9IDE7Ci0gICAgZ190cmFjZV9zdG9yZSA9IGNlbnN1c19odF9jcmVhdGUoJmh0X29wdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDZW5zdXMgdHJhY2Ugc3RvcmUgYWxyZWFkeSBpbml0aWFsaXplZC4iKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLX0KLQotdm9pZCBjZW5zdXNfdHJhY2luZ19zaHV0ZG93bih2b2lkKSB7Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgaWYgKGdfdHJhY2Vfc3RvcmUgIT0gTlVMTCkgewotICAgIGNlbnN1c19odF9kZXN0cm95KGdfdHJhY2Vfc3RvcmUpOwotICAgIGdfdHJhY2Vfc3RvcmUgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2Vuc3VzIHRyYWNlIHN0b3JlIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKLSAgfQotICBncHJfbXVfdW5sb2NrKCZnX211KTsKLX0KLQotdm9pZCBjZW5zdXNfaW50ZXJuYWxfbG9ja190cmFjZV9zdG9yZSh2b2lkKSB7IGdwcl9tdV9sb2NrKCZnX211KTsgfQotCi12b2lkIGNlbnN1c19pbnRlcm5hbF91bmxvY2tfdHJhY2Vfc3RvcmUodm9pZCkgeyBncHJfbXVfdW5sb2NrKCZnX211KTsgfQotCi1jZW5zdXNfdHJhY2Vfb2JqICpjZW5zdXNfZ2V0X3RyYWNlX29ial9sb2NrZWQoY2Vuc3VzX29wX2lkIG9wX2lkKSB7Ci0gIGlmIChnX3RyYWNlX3N0b3JlID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNlbnN1cyB0cmFjZSBzdG9yZSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIChjZW5zdXNfdHJhY2Vfb2JqICopY2Vuc3VzX2h0X2ZpbmQoZ190cmFjZV9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaWRfYXNfa2V5KCZvcF9pZCkpOwotfQotCi1jb25zdCBjaGFyICpjZW5zdXNfZ2V0X3RyYWNlX21ldGhvZF9uYW1lKGNvbnN0IGNlbnN1c190cmFjZV9vYmogKnRyYWNlKSB7Ci0gIHJldHVybiB0cmFjZS0+bWV0aG9kOwotfQotCi1zdGF0aWMgY2Vuc3VzX3RyYWNlX2Fubm90YXRpb24gKmR1cF9hbm5vdGF0aW9uX2NoYWluKAotICAgIGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpmcm9tKSB7Ci0gIGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpyZXQgPSBOVUxMOwotICBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbiAqKnRvID0gJnJldDsKLSAgZm9yICg7IGZyb20gIT0gTlVMTDsgZnJvbSA9IGZyb20tPm5leHQpIHsKLSAgICAqdG8gPSBncHJfbWFsbG9jKHNpemVvZihjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbikpOwotICAgIG1lbWNweSgqdG8sIGZyb20sIHNpemVvZihjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbikpOwotICAgIHRvID0gJigqdG8pLT5uZXh0OwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjZW5zdXNfdHJhY2Vfb2JqICp0cmFjZV9vYmpfZHVwKGNlbnN1c190cmFjZV9vYmogKmZyb20pIHsKLSAgY2Vuc3VzX3RyYWNlX29iaiAqdG8gPSBOVUxMOwotICBHUFJfQVNTRVJUKGZyb20gIT0gTlVMTCk7Ci0gIHRvID0gZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX3RyYWNlX29iaikpOwotICB0by0+aWQgPSBmcm9tLT5pZDsKLSAgdG8tPnRzID0gZnJvbS0+dHM7Ci0gIHRvLT5ycGNfc3RhdHMgPSBmcm9tLT5ycGNfc3RhdHM7Ci0gIHRvLT5tZXRob2QgPSBncHJfc3RyZHVwKGZyb20tPm1ldGhvZCk7Ci0gIHRvLT5hbm5vdGF0aW9ucyA9IGR1cF9hbm5vdGF0aW9uX2NoYWluKGZyb20tPmFubm90YXRpb25zKTsKLSAgcmV0dXJuIHRvOwotfQotCi1jZW5zdXNfdHJhY2Vfb2JqICoqY2Vuc3VzX2dldF9hY3RpdmVfb3BzKGludCAqbnVtX2FjdGl2ZV9vcHMpIHsKLSAgY2Vuc3VzX3RyYWNlX29iaiAqKnJldCA9IE5VTEw7Ci0gIGdwcl9tdV9sb2NrKCZnX211KTsKLSAgaWYgKGdfdHJhY2Vfc3RvcmUgIT0gTlVMTCkgewotICAgIHNpemVfdCBuID0gMDsKLSAgICBjZW5zdXNfaHRfa3YgKmFsbF9rdnMgPSBjZW5zdXNfaHRfZ2V0X2FsbF9lbGVtZW50cyhnX3RyYWNlX3N0b3JlLCAmbik7Ci0gICAgKm51bV9hY3RpdmVfb3BzID0gKGludCluOwotICAgIGlmIChuICE9IDApIHsKLSAgICAgIHNpemVfdCBpID0gMDsKLSAgICAgIHJldCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGNlbnN1c190cmFjZV9vYmogKikgKiBuKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgcmV0W2ldID0gdHJhY2Vfb2JqX2R1cCgoY2Vuc3VzX3RyYWNlX29iaiAqKWFsbF9rdnNbaV0udik7Ci0gICAgICB9Ci0gICAgfQotICAgIGdwcl9mcmVlKGFsbF9rdnMpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmdfbXUpOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5oIGIvc3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjExZTk1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NUQVRJU1RJQ1NfQ0VOU1VTX1RSQUNJTkdfSAotI2RlZmluZSBHUlBDX0NPUkVfU1RBVElTVElDU19DRU5TVVNfVFJBQ0lOR19ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIgotCi0vKiBXQVJOSU5HOiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBBUElzIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBhcmUgZm9yIEdSUEMKLSAgIGxpYnJhcnkncyBpbnRlcm5hbCB1c2UgT05MWS4gVGhleSBtaWdodCBiZSBjaGFuZ2VkIGluIGJhY2t3YXJkLWluY29tcGF0aWJsZQotICAgd2F5cyBhbmQgYXJlIG5vdCBzdWJqZWN0IHRvIGFueSBkZXByZWNhdGlvbiBwb2xpY3kuCi0gICBUaGV5IGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIGV4dGVybmFsIHVzZS4KLSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBTdHJ1Y3QgZm9yIGEgdHJhY2UgYW5ub3RhdGlvbi4gKi8KLXR5cGVkZWYgc3RydWN0IGNlbnN1c190cmFjZV9hbm5vdGF0aW9uIHsKLSAgZ3ByX3RpbWVzcGVjIHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lc3RhbXAgb2YgdGhlIGFubm90YXRpb24gKi8KLSAgY2hhciB0eHRbQ0VOU1VTX01BWF9BTk5PVEFUSU9OX0xFTkdUSCArIDFdOyAvKiBhY3R1YWwgdHh0IGFubm90YXRpb24gKi8KLSAgc3RydWN0IGNlbnN1c190cmFjZV9hbm5vdGF0aW9uICpuZXh0OwotfSBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbjsKLQotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3RyYWNlX29iaiB7Ci0gIGNlbnN1c19vcF9pZCBpZDsKLSAgZ3ByX3RpbWVzcGVjIHRzOwotICBjZW5zdXNfcnBjX3N0YXRzIHJwY19zdGF0czsKLSAgY2hhciAqbWV0aG9kOwotICBjZW5zdXNfdHJhY2VfYW5ub3RhdGlvbiAqYW5ub3RhdGlvbnM7Ci19IGNlbnN1c190cmFjZV9vYmo7Ci0KLS8qIERlbGV0ZXMgdHJhY2Ugb2JqZWN0LiAqLwotdm9pZCBjZW5zdXNfdHJhY2Vfb2JqX2Rlc3Ryb3koY2Vuc3VzX3RyYWNlX29iaiAqb2JqKTsKLQotLyogSW5pdGlhbGl6ZXMgdHJhY2Ugc3RvcmUuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkIHNhZmUuICovCi12b2lkIGNlbnN1c190cmFjaW5nX2luaXQodm9pZCk7Ci0KLS8qIFNodXRzZG93biB0cmFjZSBzdG9yZS4gVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQgc2FmZS4gKi8KLXZvaWQgY2Vuc3VzX3RyYWNpbmdfc2h1dGRvd24odm9pZCk7Ci0KLS8qIEdldHMgdHJhY2Ugb2JqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IG9wX2lkLiBSZXR1cm5zIE5VTEwgaWYgdHJhY2Ugc3RvcmUKLSAgIGlzIG5vdCBpbml0aWFsaXplZCBvciB0cmFjZSBvYmogaXMgbm90IGZvdW5kLiBSZXF1aXJlcyB0cmFjZSBzdG9yZSBiZWluZwotICAgbG9ja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICovCi1jZW5zdXNfdHJhY2Vfb2JqICpjZW5zdXNfZ2V0X3RyYWNlX29ial9sb2NrZWQoY2Vuc3VzX29wX2lkIG9wX2lkKTsKLQotLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFjcXVpcmUgYW5kIHJlbGVhc2UgdGhlIHRyYWNlIHN0b3JlIGdsb2JhbCBsb2NrLgotICAgVGhleSBhcmUgZm9yIGNlbnN1cyBpbnRlcm5hbCB1c2Ugb25seS4gKi8KLXZvaWQgY2Vuc3VzX2ludGVybmFsX2xvY2tfdHJhY2Vfc3RvcmUodm9pZCk7Ci12b2lkIGNlbnN1c19pbnRlcm5hbF91bmxvY2tfdHJhY2Vfc3RvcmUodm9pZCk7Ci0KLS8qIEdldHMgbWV0aG9kIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCB0cmFjZSBvYmplY3QuICovCi1jb25zdCBjaGFyICpjZW5zdXNfZ2V0X3RyYWNlX21ldGhvZF9uYW1lKGNvbnN0IGNlbnN1c190cmFjZV9vYmogKnRyYWNlKTsKLQotLyogUmV0dXJucyBhbiBhcnJheSBvZiBwb2ludGVycyB0byB0cmFjZSBvYmplY3RzIG9mIGN1cnJlbnRseSBhY3RpdmUgb3BlcmF0aW9ucwotICAgYW5kIGZpbGxzIGluIG51bWJlciBvZiBhY3RpdmUgb3BlcmF0aW9ucy4gUmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUKLSAgIG9wZXJhdGlvbnMuCi0gICBDYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgb2JqZWN0cy4gKi8KLWNlbnN1c190cmFjZV9vYmogKipjZW5zdXNfZ2V0X2FjdGl2ZV9vcHMoaW50ICpudW1fYWN0aXZlX29wcyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1RBVElTVElDU19DRU5TVVNfVFJBQ0lOR19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGUuYyBiL3NyYy9jb3JlL3N0YXRpc3RpY3MvaGFzaF90YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWY3OWMwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N0YXRpc3RpY3MvaGFzaF90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGUuaCIKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2RlZmluZSBDRU5TVVNfSFRfTlVNX0JVQ0tFVFMgMTk5OQotCi0vKiBBIHNpbmdsZSBoYXNoIHRhYmxlIGRhdGEgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IGh0X2VudHJ5IHsKLSAgY2Vuc3VzX2h0X2tleSBrZXk7Ci0gIHZvaWQgKmRhdGE7Ci0gIHN0cnVjdCBodF9lbnRyeSAqbmV4dDsKLX0gaHRfZW50cnk7Ci0KLS8qIGhhc2ggdGFibGUgYnVja2V0ICovCi10eXBlZGVmIHN0cnVjdCBidWNrZXQgewotICAvKiBOVUxMIGlmIGJ1Y2tldCBpcyBlbXB0eSAqLwotICBodF9lbnRyeSAqbmV4dDsKLSAgLyogLTEgaWYgYWxsIGJ1Y2tldHMgYXJlIGVtcHR5LiAqLwotICBpbnQzMl90IHByZXZfbm9uX2VtcHR5X2J1Y2tldDsKLSAgLyogLTEgaWYgYWxsIGJ1Y2tldHMgYXJlIGVtcHR5LiAqLwotICBpbnQzMl90IG5leHRfbm9uX2VtcHR5X2J1Y2tldDsKLX0gYnVja2V0OwotCi1zdHJ1Y3QgdW5yZXNpemFibGVfaGFzaF90YWJsZSB7Ci0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZSAqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyogTnVtYmVyIG9mIGJ1Y2tldHMgKi8KLSAgdWludDMyX3QgbnVtX2J1Y2tldHM7Ci0gIC8qIEFycmF5IG9mIGJ1Y2tldHMgaW5pdGlhbGl6ZWQgYXQgY3JlYXRpb24gdGltZS4gTWVtb3J5IGNvbnN1bXB0aW9uIGlzCi0gICAgIDE2IGJ5dGVzIHBlciBidWNrZXQgb24gYSA2NC1iaXQgcGxhdGZvcm0uICovCi0gIGJ1Y2tldCAqYnVja2V0czsKLSAgLyogSW5kZXggb2YgdGhlIGZpcnN0IG5vbi1lbXB0eSBidWNrZXQuIC0xIGlmZiBzaXplID09IDAuICovCi0gIGludDMyX3QgZmlyc3Rfbm9uX2VtcHR5X2J1Y2tldDsKLSAgLyogSW5kZXggb2YgdGhlIGxhc3Qgbm9uX2VtcHR5IGJ1Y2tldC4gLTEgaWZmIHNpemUgPT0gMC4gKi8KLSAgaW50MzJfdCBsYXN0X25vbl9lbXB0eV9idWNrZXQ7Ci0gIC8qIEltbXV0YWJsZSBvcHRpb25zIG9mIHRoaXMgaGFzaCB0YWJsZSwgaW5pdGlhbGl6ZWQgYXQgY3JlYXRpb24gdGltZS4gKi8KLSAgY2Vuc3VzX2h0X29wdGlvbiBvcHRpb25zOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZW50cnlfbG9jYXRvciB7Ci0gIGludDMyX3QgYnVja2V0X2lkeDsKLSAgaW50IGlzX2ZpcnN0X2luX2NoYWluOwotICBpbnQgZm91bmQ7Ci0gIGh0X2VudHJ5ICpwcmV2X2VudHJ5OwotfSBlbnRyeV9sb2NhdG9yOwotCi0vKiBBc3NlcnRzIGlmIG9wdGlvbiBpcyBub3QgdmFsaWQuICovCi12b2lkIGNoZWNrX29wdGlvbnMoY29uc3QgY2Vuc3VzX2h0X29wdGlvbiAqb3B0aW9uKSB7Ci0gIEdQUl9BU1NFUlQob3B0aW9uICE9IE5VTEwpOwotICBHUFJfQVNTRVJUKG9wdGlvbi0+bnVtX2J1Y2tldHMgPiAwKTsKLSAgR1BSX0FTU0VSVChvcHRpb24tPmtleV90eXBlID09IENFTlNVU19IVF9VSU5UNjQgfHwKLSAgICAgICAgICAgICBvcHRpb24tPmtleV90eXBlID09IENFTlNVU19IVF9QT0lOVEVSKTsKLSAgaWYgKG9wdGlvbi0+a2V5X3R5cGUgPT0gQ0VOU1VTX0hUX1VJTlQ2NCkgewotICAgIEdQUl9BU1NFUlQob3B0aW9uLT5oYXNoID09IE5VTEwpOwotICB9IGVsc2UgaWYgKG9wdGlvbi0+a2V5X3R5cGUgPT0gQ0VOU1VTX0hUX1BPSU5URVIpIHsKLSAgICBHUFJfQVNTRVJUKG9wdGlvbi0+aGFzaCAhPSBOVUxMKTsKLSAgICBHUFJfQVNTRVJUKG9wdGlvbi0+Y29tcGFyZV9rZXlzICE9IE5VTEwpOwotICB9Ci19Ci0KLSNkZWZpbmUgUkVNT1ZFX05FWFQob3B0aW9ucywgcHRyKSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGh0X2VudHJ5ICp0bXAgPSAocHRyKS0+bmV4dDsgIFwKLSAgICAocHRyKS0+bmV4dCA9IHRtcC0+bmV4dDsgICAgICBcCi0gICAgZGVsZXRlX2VudHJ5KG9wdGlvbnMsIHRtcCk7ICAgXAotICB9IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZCBkZWxldGVfZW50cnkoY29uc3QgY2Vuc3VzX2h0X29wdGlvbiAqb3B0LCBodF9lbnRyeSAqcCkgewotICBpZiAob3B0LT5kZWxldGVfZGF0YSAhPSBOVUxMKSB7Ci0gICAgb3B0LT5kZWxldGVfZGF0YShwLT5kYXRhKTsKLSAgfQotICBpZiAob3B0LT5kZWxldGVfa2V5ICE9IE5VTEwpIHsKLSAgICBvcHQtPmRlbGV0ZV9rZXkocC0+a2V5LnB0cik7Ci0gIH0KLSAgZ3ByX2ZyZWUocCk7Ci19Ci0KLXN0YXRpYyB1aW50NjRfdCBoYXNoKGNvbnN0IGNlbnN1c19odF9vcHRpb24gKm9wdCwgY2Vuc3VzX2h0X2tleSBrZXkpIHsKLSAgcmV0dXJuIG9wdC0+a2V5X3R5cGUgPT0gQ0VOU1VTX0hUX1VJTlQ2NCA/IGtleS52YWwgOiBvcHQtPmhhc2goa2V5LnB0cik7Ci19Ci0KLWNlbnN1c19odCAqY2Vuc3VzX2h0X2NyZWF0ZShjb25zdCBjZW5zdXNfaHRfb3B0aW9uICpvcHRpb24pIHsKLSAgaW50IGk7Ci0gIGNlbnN1c19odCAqcmV0ID0gTlVMTDsKLSAgY2hlY2tfb3B0aW9ucyhvcHRpb24pOwotICByZXQgPSAoY2Vuc3VzX2h0ICopZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX2h0KSk7Ci0gIHJldC0+c2l6ZSA9IDA7Ci0gIHJldC0+bnVtX2J1Y2tldHMgPSBvcHRpb24tPm51bV9idWNrZXRzOwotICByZXQtPmJ1Y2tldHMgPSAoYnVja2V0ICopZ3ByX21hbGxvYyhzaXplb2YoYnVja2V0KSAqIHJldC0+bnVtX2J1Y2tldHMpOwotICByZXQtPm9wdGlvbnMgPSAqb3B0aW9uOwotICAvKiBpbml0aWFsaXplIGVhY2ggYnVja2V0ICovCi0gIGZvciAoaSA9IDA7IGkgPCByZXQtPm9wdGlvbnMubnVtX2J1Y2tldHM7IGkrKykgewotICAgIHJldC0+YnVja2V0c1tpXS5wcmV2X25vbl9lbXB0eV9idWNrZXQgPSAtMTsKLSAgICByZXQtPmJ1Y2tldHNbaV0ubmV4dF9ub25fZW1wdHlfYnVja2V0ID0gLTE7Ci0gICAgcmV0LT5idWNrZXRzW2ldLm5leHQgPSBOVUxMOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGZpbmRfYnVja2V0X2lkeChjb25zdCBjZW5zdXNfaHQgKmh0LCBjZW5zdXNfaHRfa2V5IGtleSkgewotICByZXR1cm4gaGFzaCgmaHQtPm9wdGlvbnMsIGtleSkgJSBodC0+bnVtX2J1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbnQga2V5c19tYXRjaChjb25zdCBjZW5zdXNfaHRfb3B0aW9uICpvcHQsIGNvbnN0IGh0X2VudHJ5ICpwLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnN1c19odF9rZXkga2V5KSB7Ci0gIEdQUl9BU1NFUlQob3B0LT5rZXlfdHlwZSA9PSBDRU5TVVNfSFRfVUlOVDY0IHx8Ci0gICAgICAgICAgICAgb3B0LT5rZXlfdHlwZSA9PSBDRU5TVVNfSFRfUE9JTlRFUik7Ci0gIGlmIChvcHQtPmtleV90eXBlID09IENFTlNVU19IVF9VSU5UNjQpIHJldHVybiBwLT5rZXkudmFsID09IGtleS52YWw7Ci0gIHJldHVybiAhb3B0LT5jb21wYXJlX2tleXMoKHAtPmtleSkucHRyLCBrZXkucHRyKTsKLX0KLQotc3RhdGljIGVudHJ5X2xvY2F0b3IgaHRfZmluZChjb25zdCBjZW5zdXNfaHQgKmh0LCBjZW5zdXNfaHRfa2V5IGtleSkgewotICBlbnRyeV9sb2NhdG9yIGxvYyA9IHswLCAwLCAwLCBOVUxMfTsKLSAgaW50MzJfdCBpZHggPSAwOwotICBodF9lbnRyeSAqcHRyID0gTlVMTDsKLSAgR1BSX0FTU0VSVChodCAhPSBOVUxMKTsKLSAgaWR4ID0gZmluZF9idWNrZXRfaWR4KGh0LCBrZXkpOwotICBwdHIgPSBodC0+YnVja2V0c1tpZHhdLm5leHQ7Ci0gIGlmIChwdHIgPT0gTlVMTCkgewotICAgIC8qIGJ1Y2tldCBpcyBlbXB0eSAqLwotICAgIHJldHVybiBsb2M7Ci0gIH0KLSAgaWYgKGtleXNfbWF0Y2goJmh0LT5vcHRpb25zLCBwdHIsIGtleSkpIHsKLSAgICBsb2MuYnVja2V0X2lkeCA9IGlkeDsKLSAgICBsb2MuaXNfZmlyc3RfaW5fY2hhaW4gPSAxOwotICAgIGxvYy5mb3VuZCA9IDE7Ci0gICAgcmV0dXJuIGxvYzsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKDsgcHRyLT5uZXh0ICE9IE5VTEw7IHB0ciA9IHB0ci0+bmV4dCkgewotICAgICAgaWYgKGtleXNfbWF0Y2goJmh0LT5vcHRpb25zLCBwdHItPm5leHQsIGtleSkpIHsKLSAgICAgICAgbG9jLmJ1Y2tldF9pZHggPSBpZHg7Ci0gICAgICAgIGxvYy5pc19maXJzdF9pbl9jaGFpbiA9IDA7Ci0gICAgICAgIGxvYy5mb3VuZCA9IDE7Ci0gICAgICAgIGxvYy5wcmV2X2VudHJ5ID0gcHRyOwotICAgICAgICByZXR1cm4gbG9jOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBDb3VsZCBub3QgZmluZCB0aGUga2V5ICovCi0gIHJldHVybiBsb2M7Ci19Ci0KLXZvaWQgKmNlbnN1c19odF9maW5kKGNvbnN0IGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9rZXkga2V5KSB7Ci0gIGVudHJ5X2xvY2F0b3IgbG9jID0gaHRfZmluZChodCwga2V5KTsKLSAgaWYgKGxvYy5mb3VuZCA9PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGxvYy5pc19maXJzdF9pbl9jaGFpbiA/IGh0LT5idWNrZXRzW2xvYy5idWNrZXRfaWR4XS5uZXh0LT5kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2MucHJldl9lbnRyeS0+bmV4dC0+ZGF0YTsKLX0KLQotdm9pZCBjZW5zdXNfaHRfaW5zZXJ0KGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9rZXkga2V5LCB2b2lkICpkYXRhKSB7Ci0gIGludDMyX3QgaWR4ID0gZmluZF9idWNrZXRfaWR4KGh0LCBrZXkpOwotICBodF9lbnRyeSAqcHRyID0gTlVMTDsKLSAgZW50cnlfbG9jYXRvciBsb2MgPSBodF9maW5kKGh0LCBrZXkpOwotICBpZiAobG9jLmZvdW5kKSB7Ci0gICAgLyogUmVwbGFjZSBvbGQgdmFsdWUgd2l0aCBuZXcgdmFsdWUuICovCi0gICAgcHRyID0gbG9jLmlzX2ZpcnN0X2luX2NoYWluID8gaHQtPmJ1Y2tldHNbbG9jLmJ1Y2tldF9pZHhdLm5leHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2MucHJldl9lbnRyeS0+bmV4dDsKLSAgICBpZiAoaHQtPm9wdGlvbnMuZGVsZXRlX2RhdGEgIT0gTlVMTCkgewotICAgICAgaHQtPm9wdGlvbnMuZGVsZXRlX2RhdGEocHRyLT5kYXRhKTsKLSAgICB9Ci0gICAgcHRyLT5kYXRhID0gZGF0YTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUuICovCi0gIGlmIChodC0+c2l6ZSA9PSAwKSB7Ci0gICAgaHQtPmJ1Y2tldHNbaWR4XS5uZXh0X25vbl9lbXB0eV9idWNrZXQgPSAtMTsKLSAgICBodC0+YnVja2V0c1tpZHhdLnByZXZfbm9uX2VtcHR5X2J1Y2tldCA9IC0xOwotICAgIGh0LT5maXJzdF9ub25fZW1wdHlfYnVja2V0ID0gaWR4OwotICAgIGh0LT5sYXN0X25vbl9lbXB0eV9idWNrZXQgPSBpZHg7Ci0gIH0gZWxzZSBpZiAoaHQtPmJ1Y2tldHNbaWR4XS5uZXh0ID09IE5VTEwpIHsKLSAgICAvKiBmaXJzdCBlbnRyeSBpbiB0aGUgYnVja2V0LiAqLwotICAgIGh0LT5idWNrZXRzW2h0LT5sYXN0X25vbl9lbXB0eV9idWNrZXRdLm5leHRfbm9uX2VtcHR5X2J1Y2tldCA9IGlkeDsKLSAgICBodC0+YnVja2V0c1tpZHhdLnByZXZfbm9uX2VtcHR5X2J1Y2tldCA9IGh0LT5sYXN0X25vbl9lbXB0eV9idWNrZXQ7Ci0gICAgaHQtPmJ1Y2tldHNbaWR4XS5uZXh0X25vbl9lbXB0eV9idWNrZXQgPSAtMTsKLSAgICBodC0+bGFzdF9ub25fZW1wdHlfYnVja2V0ID0gaWR4OwotICB9Ci0gIHB0ciA9IChodF9lbnRyeSAqKWdwcl9tYWxsb2Moc2l6ZW9mKGh0X2VudHJ5KSk7Ci0gIHB0ci0+a2V5ID0ga2V5OwotICBwdHItPmRhdGEgPSBkYXRhOwotICBwdHItPm5leHQgPSBodC0+YnVja2V0c1tpZHhdLm5leHQ7Ci0gIGh0LT5idWNrZXRzW2lkeF0ubmV4dCA9IHB0cjsKLSAgaHQtPnNpemUrKzsKLX0KLQotdm9pZCBjZW5zdXNfaHRfZXJhc2UoY2Vuc3VzX2h0ICpodCwgY2Vuc3VzX2h0X2tleSBrZXkpIHsKLSAgZW50cnlfbG9jYXRvciBsb2MgPSBodF9maW5kKGh0LCBrZXkpOwotICBpZiAobG9jLmZvdW5kID09IDApIHsKLSAgICAvKiBub29wIGlmIG5vdCBmb3VuZCAqLwotICAgIHJldHVybjsKLSAgfQotICBodC0+c2l6ZS0tOwotICBpZiAobG9jLmlzX2ZpcnN0X2luX2NoYWluKSB7Ci0gICAgYnVja2V0ICpiID0gJmh0LT5idWNrZXRzW2xvYy5idWNrZXRfaWR4XTsKLSAgICBHUFJfQVNTRVJUKGItPm5leHQgIT0gTlVMTCk7Ci0gICAgLyogVGhlIG9ubHkgZW50cnkgaW4gdGhlIGJ1Y2tldCAqLwotICAgIGlmIChiLT5uZXh0LT5uZXh0ID09IE5VTEwpIHsKLSAgICAgIGludCBwcmV2ID0gYi0+cHJldl9ub25fZW1wdHlfYnVja2V0OwotICAgICAgaW50IG5leHQgPSBiLT5uZXh0X25vbl9lbXB0eV9idWNrZXQ7Ci0gICAgICBpZiAocHJldiAhPSAtMSkgewotICAgICAgICBodC0+YnVja2V0c1twcmV2XS5uZXh0X25vbl9lbXB0eV9idWNrZXQgPSBuZXh0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaHQtPmZpcnN0X25vbl9lbXB0eV9idWNrZXQgPSBuZXh0OwotICAgICAgfQotICAgICAgaWYgKG5leHQgIT0gLTEpIHsKLSAgICAgICAgaHQtPmJ1Y2tldHNbbmV4dF0ucHJldl9ub25fZW1wdHlfYnVja2V0ID0gcHJldjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGh0LT5sYXN0X25vbl9lbXB0eV9idWNrZXQgPSBwcmV2OwotICAgICAgfQotICAgIH0KLSAgICBSRU1PVkVfTkVYVCgmaHQtPm9wdGlvbnMsIGIpOwotICB9IGVsc2UgewotICAgIEdQUl9BU1NFUlQobG9jLnByZXZfZW50cnktPm5leHQgIT0gTlVMTCk7Ci0gICAgUkVNT1ZFX05FWFQoJmh0LT5vcHRpb25zLCBsb2MucHJldl9lbnRyeSk7Ci0gIH0KLX0KLQotLyogUmV0dXJucyBOVUxMIGlmIGlucHV0IHRhYmxlIGlzIGVtcHR5LiAqLwotY2Vuc3VzX2h0X2t2ICpjZW5zdXNfaHRfZ2V0X2FsbF9lbGVtZW50cyhjb25zdCBjZW5zdXNfaHQgKmh0LCBzaXplX3QgKm51bSkgewotICBjZW5zdXNfaHRfa3YgKnJldCA9IE5VTEw7Ci0gIGludCBpID0gMDsKLSAgaW50MzJfdCBpZHggPSAtMTsKLSAgR1BSX0FTU0VSVChodCAhPSBOVUxMICYmIG51bSAhPSBOVUxMKTsKLSAgKm51bSA9IGh0LT5zaXplOwotICBpZiAoKm51bSA9PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXQgPSAoY2Vuc3VzX2h0X2t2ICopZ3ByX21hbGxvYyhzaXplb2YoY2Vuc3VzX2h0X2t2KSAqIGh0LT5zaXplKTsKLSAgaWR4ID0gaHQtPmZpcnN0X25vbl9lbXB0eV9idWNrZXQ7Ci0gIHdoaWxlIChpZHggPj0gMCkgewotICAgIGh0X2VudHJ5ICpwdHIgPSBodC0+YnVja2V0c1tpZHhdLm5leHQ7Ci0gICAgZm9yICg7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPm5leHQpIHsKLSAgICAgIHJldFtpXS5rID0gcHRyLT5rZXk7Ci0gICAgICByZXRbaV0udiA9IHB0ci0+ZGF0YTsKLSAgICAgIGkrKzsKLSAgICB9Ci0gICAgaWR4ID0gaHQtPmJ1Y2tldHNbaWR4XS5uZXh0X25vbl9lbXB0eV9idWNrZXQ7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaHRfZGVsZXRlX2VudHJ5X2NoYWluKGNvbnN0IGNlbnN1c19odF9vcHRpb24gKm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRfZW50cnkgKmZpcnN0KSB7Ci0gIGlmIChmaXJzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChmaXJzdC0+bmV4dCAhPSBOVUxMKSB7Ci0gICAgaHRfZGVsZXRlX2VudHJ5X2NoYWluKG9wdGlvbnMsIGZpcnN0LT5uZXh0KTsKLSAgfQotICBkZWxldGVfZW50cnkob3B0aW9ucywgZmlyc3QpOwotfQotCi12b2lkIGNlbnN1c19odF9kZXN0cm95KGNlbnN1c19odCAqaHQpIHsKLSAgdW5zaWduZWQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGh0LT5udW1fYnVja2V0czsgKytpKSB7Ci0gICAgaHRfZGVsZXRlX2VudHJ5X2NoYWluKCZodC0+b3B0aW9ucywgaHQtPmJ1Y2tldHNbaV0ubmV4dCk7Ci0gIH0KLSAgZ3ByX2ZyZWUoaHQtPmJ1Y2tldHMpOwotICBncHJfZnJlZShodCk7Ci19Ci0KLXNpemVfdCBjZW5zdXNfaHRfZ2V0X3NpemUoY29uc3QgY2Vuc3VzX2h0ICpodCkgeyByZXR1cm4gaHQtPnNpemU7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N0YXRpc3RpY3MvaGFzaF90YWJsZS5oIGIvc3JjL2NvcmUvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YmYyYmEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3RhdGlzdGljcy9oYXNoX3RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1RBVElTVElDU19IQVNIX1RBQkxFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NUQVRJU1RJQ1NfSEFTSF9UQUJMRV9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLS8qIEEgY2hhaW4gYmFzZWQgaGFzaCB0YWJsZSB3aXRoIGZpeGVkIG51bWJlciBvZiBidWNrZXRzLgotICAgWW91ciBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIHRoaXMgY29kZSBkaXJlY3RseS4gSXQgaXMgaW1wbGVtZW50ZWQgZm9yIHRoZQotICAgdXNlIGNhc2UgaW4gY2Vuc3VzIHRyYWNlIHN0b3JlIGFuZCBzdGF0cyBzdG9yZSwgd2hlcmUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgIHRoZSB0YWJsZSBpcyBpbiB0aGUgc2NhbGUgb2YgdXB0byBzZXZlcmFsIHRob3VzYW5kcywgZW50cmllcyBhcmUgYWRkZWQgYW5kCi0gICByZW1vdmVkIGZyb20gdGhlIHRhYmxlIHZlcnkgZnJlcXVlbnRseSAofjEwMGsvcyksIHRoZSBmcmVxdWVuY3kgb2YgZmluZCgpCi0gICBvcGVyYXRpb25zIGlzIHJvdWdobHkgc2V2ZXJhbCB0aW1lcyBvZiB0aGUgZnJlcXVlbmN5IG9mIGluc2VydCgpIGFuZCBlcmFzZSgpCi0gICBDb21wYXJpbmcgdG8gZmluZCgpLCB0aGUgaW5zZXJ0KCksIGVyYXNlKCkgYW5kIGdldF9hbGxfZW50cmllcygpIG9wZXJhdGlvbnMKLSAgIGFyZSBtdWNoIGxlc3MgZnJlcWVudCAoPDEvcykuCi0KLSAgIFBlciBidWNrZXQgbWVtb3J5IG92ZXJoZWFkIGlzIGFib3V0ICg4ICsgc2l6ZW9mKGludHB0cl90KSBieXRlcy4KLSAgIFBlciBlbnRyeSBtZW1vcnkgb3ZlcmhlYWQgaXMgYWJvdXQgKDggKyAyICogc2l6ZW9mKGludHB0cl90KSBieXRlcy4KLQotICAgQWxsIGZ1bmN0aW9ucyBhcmUgbm90IHRocmVhZC1zYWZlLiBTeW5jaHJvbml6YXRpb24gd2lsbCBiZSBwcm92aWRlZCBpbiB0aGUKLSAgIHVwcGVyIGxheWVyIChpbiB0cmFjZSBzdG9yZSBhbmQgc3RhdHMgc3RvcmUpLgotKi8KLQotLyogT3BhcXVlIGhhc2ggdGFibGUgc3RydWN0ICovCi10eXBlZGVmIHN0cnVjdCB1bnJlc2l6YWJsZV9oYXNoX3RhYmxlIGNlbnN1c19odDsKLQotLyogQ3VycmVudGx5LCB0aGUgaGFzaF90YWJsZSBjYW4gdGFrZSB0d28gdHlwZXMgb2Yga2V5cy4gKHVpbnQ2NCBmb3IgdHJhY2UKLSAgIHN0b3JlIGFuZCBjb25zdCBjaGFyKiBmb3Igc3RhdHMgc3RvcmUpLiAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnQ2NF90IHZhbDsKLSAgdm9pZCAqcHRyOwotfSBjZW5zdXNfaHRfa2V5OwotCi10eXBlZGVmIGVudW0gY2Vuc3VzX2h0X2tleV90eXBlIHsKLSAgQ0VOU1VTX0hUX1VJTlQ2NCA9IDAsCi0gIENFTlNVU19IVF9QT0lOVEVSID0gMQotfSBjZW5zdXNfaHRfa2V5X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGNlbnN1c19odF9vcHRpb24gewotICAvKiBUeXBlIG9mIGhhc2gga2V5ICovCi0gIGNlbnN1c19odF9rZXlfdHlwZSBrZXlfdHlwZTsKLSAgLyogRGVzaXJlZCBudW1iZXIgb2YgYnVja2V0cywgcHJlZmVyYWJseSBhIHByaW1lIG51bWJlciAqLwotICBpbnQzMl90IG51bV9idWNrZXRzOwotICAvKiBGdWNudGlvbiB0byBjYWxjdWxhdGUgdWludDY0IGhhc2ggdmFsdWUgb2YgdGhlIGtleS4gT25seSB0YWtlcyBlZmZlY3QgaWYKLSAgICAga2V5X3R5cGUgaXMgUE9JTlRFUi4gKi8KLSAgdWludDY0X3QgKCpoYXNoKShjb25zdCB2b2lkICopOwotICAvKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBrZXlzLCByZXR1cm5zIDAgaWZmIGVxdWFsLiBPbmx5IHRha2VzIGVmZmVjdCBpZgotICAgICBrZXlfdHlwZSBpcyBQT0lOVEVSICovCi0gIGludCAoKmNvbXBhcmVfa2V5cykoY29uc3Qgdm9pZCAqazEsIGNvbnN0IHZvaWQgKmsyKTsKLSAgLyogVmFsdWUgZGVsZXRlci4gTlVMTCBpZiBubyBzcGVjaWFsaXplZCBkZWxldGUgZnVuY3Rpb24gaXMgbmVlZGVkLiAqLwotICB2b2lkICgqZGVsZXRlX2RhdGEpKHZvaWQgKik7Ci0gIC8qIEtleSBkZWxldGVyLiBOVUxMIGlmIHRhYmxlIGRvZXMgbm90IG93biB0aGUga2V5LiAoZS5nLiBrZXkgaXMgcGFydCBvZiB0aGUKLSAgICAgdmFsdWUgb3Iga2V5IGlzIG5vdCBvd25lZCBieSB0aGUgdGFibGUuKSAqLwotICB2b2lkICgqZGVsZXRlX2tleSkodm9pZCAqKTsKLX0gY2Vuc3VzX2h0X29wdGlvbjsKLQotLyogQ3JlYXRlcyBhIGhhc2h0YWJsZSB3aXRoIGZpeGVkIG51bWJlciBvZiBidWNrZXRzIGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MKLSAgIHNwZWNpZmllZCBpbiAnb3B0aW9ucycgYXJnLiBGdW5jdGlvbiBwb2ludGVycyAiaGFzaCIgYW5kICJjb21wYXJlX2tleXMiIG11c3QKLSAgIGJlIHByb3ZpZGVkIGlmIGtleV90eXBlIGlzIFBPSU5URVIuIEFzc2VydHMgaWYgZmFpbCB0byBjcmVhdGUuICovCi1jZW5zdXNfaHQgKmNlbnN1c19odF9jcmVhdGUoY29uc3QgY2Vuc3VzX2h0X29wdGlvbiAqb3B0aW9ucyk7Ci0KLS8qIERlbGV0ZXMgaGFzaCB0YWJsZSBpbnN0YW5jZS4gRnJlZXMgYWxsIGR5bmFtaWMgbWVtb3J5IG93bmVkIGJ5IGh0LiovCi12b2lkIGNlbnN1c19odF9kZXN0cm95KGNlbnN1c19odCAqaHQpOwotCi0vKiBJbnNlcnRzIHRoZSBpbnB1dCBrZXktdmFsIHBhaXIgaW50byBoYXNoX3RhYmxlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZSBzYW1lIGtleQotICAgZXhpc3RzIGluIHRoZSB0YWJsZSwgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgaW5wdXQKLSAgIHZhbC4gKi8KLXZvaWQgY2Vuc3VzX2h0X2luc2VydChjZW5zdXNfaHQgKmh0LCBjZW5zdXNfaHRfa2V5IGtleSwgdm9pZCAqdmFsKTsKLQotLyogUmV0dXJucyBwb2ludGVyIHRvIGRhdGEsIHJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuICovCi12b2lkICpjZW5zdXNfaHRfZmluZChjb25zdCBjZW5zdXNfaHQgKmh0LCBjZW5zdXNfaHRfa2V5IGtleSk7Ci0KLS8qIEVyYXNlIGhhc2ggdGFibGUgZW50cnkgd2l0aCBpbnB1dCBrZXkuIE5vb3AgaWYga2V5IGlzIG5vdCBmb3VuZC4gKi8KLXZvaWQgY2Vuc3VzX2h0X2VyYXNlKGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9rZXkga2V5KTsKLQotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX2h0X2t2IHsKLSAgY2Vuc3VzX2h0X2tleSBrOwotICB2b2lkICp2OwotfSBjZW5zdXNfaHRfa3Y7Ci0KLS8qIFJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIHZhbHVlcyBpbiB0aGUgaGFzaCB0YWJsZS4gT3JkZXIgb2YgdGhlCi0gICBlbGVtZW50cyBjYW4gYmUgYXJiaXRyYXJ5LiBTZXRzICdudW0nIHRvIHRoZSBzaXplIG9mIHJldHVybmVkIGFycmF5LiBDYWxsZXIKLSAgIG93bnMgcmV0dXJuZWQgYXJyYXkuICovCi1jZW5zdXNfaHRfa3YgKmNlbnN1c19odF9nZXRfYWxsX2VsZW1lbnRzKGNvbnN0IGNlbnN1c19odCAqaHQsIHNpemVfdCAqbnVtKTsKLQotLyogUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMga2VwdC4gKi8KLXNpemVfdCBjZW5zdXNfaHRfZ2V0X3NpemUoY29uc3QgY2Vuc3VzX2h0ICpodCk7Ci0KLS8qIEZ1bmN0b3IgYXBwbGllZCBvbiBlYWNoIGtleS12YWx1ZSBwYWlyIHdoaWxlIGl0ZXJhdGluZyB0aHJvdWdoIGVudHJpZXMgaW4gdGhlCi0gICB0YWJsZS4gVGhlIGZ1bmN0b3Igc2hvdWxkIG5vdCBtdXRhdGUgZGF0YS4gKi8KLXR5cGVkZWYgdm9pZCAoKmNlbnN1c19odF9pdHJfY2IpKGNlbnN1c19odF9rZXkga2V5LCBjb25zdCB2b2lkICp2YWxfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc3RhdGUpOwotCi0vKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIGhhc2hfdGFibGUuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgotICAgc2hvdWxkIG5vdCBpbnZhbGlkYXRlIGRhdGEgZW50cmllcy4gKi8KLXVpbnQ2NF90IGNlbnN1c19odF9mb3JfYWxsKGNvbnN0IGNlbnN1c19odCAqaHQsIGNlbnN1c19odF9pdHJfY2IpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NUQVRJU1RJQ1NfSEFTSF9UQUJMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5jIGIvc3JjL2NvcmUvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyOTY4Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5oIgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIHR5cGVkZWZzIG1ha2UgdHlwaW5nIGxvbmcgbmFtZXMgZWFzaWVyLiBVc2UgY3dzIChmb3IgY2Vuc3VzX3dpbmRvd19zdGF0cykgKi8KLXR5cGVkZWYgY2Vuc3VzX3dpbmRvd19zdGF0c19zdGF0X2luZm8gY3dzX3N0YXRfaW5mbzsKLXR5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHNfc3VtIGN3c19zdW07Ci0KLS8qIEVhY2ggaW50ZXJ2YWwgaXMgY29tcG9zZWQgb2YgYSBudW1iZXIgb2YgYnVja2V0cywgd2hpY2ggaG9sZCBhIGNvdW50IG9mCi0gICBlbnRyaWVzIGFuZCBhIHNpbmdsZSBzdGF0aXN0aWMgKi8KLXR5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHNfYnVja2V0IHsKLSAgaW50NjRfdCBjb3VudDsKLSAgdm9pZCAqc3RhdGlzdGljOwotfSBjd3NfYnVja2V0OwotCi0vKiBFYWNoIGludGVydmFsIGhhcyBhIHNldCBvZiBidWNrZXRzLCBhbmQgdGhlIHZhcmlhYmxlcyBuZWVkZWQgdG8ga2VlcAotICAgdHJhY2sgb2YgdGhlaXIgY3VycmVudCBzdGF0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0c19pbnRlcnZhbF9zdGF0cyB7Ci0gIC8qIFRoZSBidWNrZXRzLiBUaGVyZSB3aWxsIGJlICdncmFudWxhcml0eScgKyAxIG9mIHRoZXNlLiAqLwotICBjd3NfYnVja2V0ICpidWNrZXRzOwotICAvKiBJbmRleCBvZiB0aGUgYnVja2V0IGNvbnRhaW5pbmcgdGhlIHNtYWxsZXN0IHRpbWUgaW50ZXJ2YWwuICovCi0gIGludCBib3R0b21fYnVja2V0OwotICAvKiBUaGUgc21hbGxlc3QgdGltZSBzdG9yYWJsZSBpbiB0aGUgY3VycmVudCB3aW5kb3cuICovCi0gIGludDY0X3QgYm90dG9tOwotICAvKiBUaGUgbGFyZ2VzdCB0aW1lIHN0b3JhYmxlIGluIHRoZSBjdXJyZW50IHdpbmRvdyArIDFucyAqLwotICBpbnQ2NF90IHRvcDsKLSAgLyogVGhlIHdpZHRoIG9mIGVhY2ggYnVja2V0IGluIG5zLiAqLwotICBpbnQ2NF90IHdpZHRoOwotfSBjd3NfaW50ZXJ2YWxfc3RhdHM7Ci0KLXR5cGVkZWYgc3RydWN0IGNlbnN1c193aW5kb3dfc3RhdHMgewotICAvKiBOdW1iZXIgb2YgaW50ZXJ2YWxzLiAqLwotICBpbnQgbmludGVydmFsczsKLSAgLyogTnVtYmVyIG9mIGJ1Y2tldHMgaW4gZWFjaCBpbnRlcnZhbC4gJ2dyYW51bGFyaXR5JyArIDEuICovCi0gIGludCBuYnVja2V0czsKLSAgLyogUmVjb3JkIG9mIHN0YXRfaW5mby4gKi8KLSAgY3dzX3N0YXRfaW5mbyBzdGF0X2luZm87Ci0gIC8qIFN0YXRzIGZvciBlYWNoIGludGVydmFsLiAqLwotICBjd3NfaW50ZXJ2YWxfc3RhdHMgKmludGVydmFsX3N0YXRzOwotICAvKiBUaGUgdGltZSB0aGUgbmV3c2V0IHN0YXQgd2FzIHJlY29yZGVkLiAqLwotICBpbnQ2NF90IG5ld2VzdF90aW1lOwotfSB3aW5kb3dfc3RhdHM7Ci0KLS8qIENhbGN1bGF0ZSBhbiBhY3R1YWwgYnVja2V0IGluZGV4IGZyb20gYSBsb2dpY2FsIGluZGV4ICdJRFgnLiBPdGhlcgotICAgcGFyYW1ldGVycyBzdXBwbHkgaW5mb3JtYXRpb24gb24gdGhlIGludGVydmFsIHN0cnVjdCBhbmQgb3ZlcmFsbCBzdGF0cy4gKi8KLSNkZWZpbmUgQlVDS0VUX0lEWChJUywgSURYLCBXU1RBVFMpIFwKLSAgKChJUy0+Ym90dG9tX2J1Y2tldCArIChJRFgpKSAlIFdTVEFUUy0+bmJ1Y2tldHMpCi0KLS8qIFRoZSBtYXhpbXVtIHNlY29uZHMgdmFsdWUgd2UgY2FuIGhhdmUgaW4gYSB2YWxpZCB0aW1lc3BlYy4gTW9yZSB0aGFuIHRoaXMKLSAgIHdpbGwgcmVzdWx0IGluIG92ZXJmbG93IGluIHRpbWVzcGVjX3RvX25zKCkuIFRoaXMgd29ya3Mgb3V0IHRvIH4yOTIgeWVhcnMuCi0gICBUT0RPOiBjb25zaWRlciB1c2luZyBkb3VibGVzIGluc3RlYWQgb2YgaW50NjQuICovCi1zdGF0aWMgaW50NjRfdCBtYXhfc2Vjb25kcyA9IChHUFJfSU5UNjRfTUFYIC0gR1BSX05TX1BFUl9TRUMpIC8gR1BSX05TX1BFUl9TRUM7Ci0KLXN0YXRpYyBpbnQ2NF90IHRpbWVzcGVjX3RvX25zKGNvbnN0IGdwcl90aW1lc3BlYyB0cykgewotICBpZiAodHMudHZfc2VjID4gbWF4X3NlY29uZHMpIHsKLSAgICByZXR1cm4gR1BSX0lOVDY0X01BWCAtIDE7Ci0gIH0KLSAgcmV0dXJuIHRzLnR2X3NlYyAqIEdQUl9OU19QRVJfU0VDICsgdHMudHZfbnNlYzsKLX0KLQotc3RhdGljIHZvaWQgY3dzX2luaXRpYWxpemVfc3RhdGlzdGljKHZvaWQgKnN0YXRpc3RpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjd3Nfc3RhdF9pbmZvICpzdGF0X2luZm8pIHsKLSAgaWYgKHN0YXRfaW5mby0+c3RhdF9pbml0aWFsaXplID09IE5VTEwpIHsKLSAgICBtZW1zZXQoc3RhdGlzdGljLCAwLCBzdGF0X2luZm8tPnN0YXRfc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdF9pbmZvLT5zdGF0X2luaXRpYWxpemUoc3RhdGlzdGljKTsKLSAgfQotfQotCi0vKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBzdGF0aXN0aWMgKi8KLXN0YXRpYyB2b2lkICpjd3NfY3JlYXRlX3N0YXRpc3RpYyhjb25zdCBjd3Nfc3RhdF9pbmZvICpzdGF0X2luZm8pIHsKLSAgdm9pZCAqc3RhdCA9IGdwcl9tYWxsb2Moc3RhdF9pbmZvLT5zdGF0X3NpemUpOwotICBjd3NfaW5pdGlhbGl6ZV9zdGF0aXN0aWMoc3RhdCwgc3RhdF9pbmZvKTsKLSAgcmV0dXJuIHN0YXQ7Ci19Ci0KLXdpbmRvd19zdGF0cyAqY2Vuc3VzX3dpbmRvd19zdGF0c19jcmVhdGUoaW50IG5pbnRlcnZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwcl90aW1lc3BlYyBpbnRlcnZhbHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyYW51bGFyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjd3Nfc3RhdF9pbmZvICpzdGF0X2luZm8pIHsKLSAgd2luZG93X3N0YXRzICpyZXQ7Ci0gIGludCBpOwotICAvKiB2YWxpZGF0ZSBpbnB1dHMgKi8KLSAgR1BSX0FTU0VSVChuaW50ZXJ2YWxzID4gMCAmJiBncmFudWxhcml0eSA+IDIgJiYgaW50ZXJ2YWxzICE9IE5VTEwgJiYKLSAgICAgICAgICAgICBzdGF0X2luZm8gIT0gTlVMTCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuaW50ZXJ2YWxzOyBpKyspIHsKLSAgICBpbnQ2NF90IG5zID0gdGltZXNwZWNfdG9fbnMoaW50ZXJ2YWxzW2ldKTsKLSAgICBHUFJfQVNTRVJUKGludGVydmFsc1tpXS50dl9zZWMgPj0gMCAmJiBpbnRlcnZhbHNbaV0udHZfbnNlYyA+PSAwICYmCi0gICAgICAgICAgICAgICBpbnRlcnZhbHNbaV0udHZfbnNlYyA8IEdQUl9OU19QRVJfU0VDICYmIG5zID49IDEwMCAmJgotICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHkgKiAxMCA8PSBucyk7Ci0gIH0KLSAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzICovCi0gIHJldCA9ICh3aW5kb3dfc3RhdHMgKilncHJfbWFsbG9jKHNpemVvZih3aW5kb3dfc3RhdHMpKTsKLSAgcmV0LT5uaW50ZXJ2YWxzID0gbmludGVydmFsczsKLSAgcmV0LT5uYnVja2V0cyA9IGdyYW51bGFyaXR5ICsgMTsKLSAgcmV0LT5zdGF0X2luZm8gPSAqc3RhdF9pbmZvOwotICByZXQtPmludGVydmFsX3N0YXRzID0KLSAgICAgIChjd3NfaW50ZXJ2YWxfc3RhdHMgKilncHJfbWFsbG9jKG5pbnRlcnZhbHMgKiBzaXplb2YoY3dzX2ludGVydmFsX3N0YXRzKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuaW50ZXJ2YWxzOyBpKyspIHsKLSAgICBpbnQ2NF90IHNpemVfbnMgPSB0aW1lc3BlY190b19ucyhpbnRlcnZhbHNbaV0pOwotICAgIGN3c19pbnRlcnZhbF9zdGF0cyAqaXMgPSByZXQtPmludGVydmFsX3N0YXRzICsgaTsKLSAgICBjd3NfYnVja2V0ICpidWNrZXRzID0gaXMtPmJ1Y2tldHMgPQotICAgICAgICAoY3dzX2J1Y2tldCAqKWdwcl9tYWxsb2MocmV0LT5uYnVja2V0cyAqIHNpemVvZihjd3NfYnVja2V0KSk7Ci0gICAgaW50IGI7Ci0gICAgZm9yIChiID0gMDsgYiA8IHJldC0+bmJ1Y2tldHM7IGIrKykgewotICAgICAgYnVja2V0c1tiXS5zdGF0aXN0aWMgPSBjd3NfY3JlYXRlX3N0YXRpc3RpYyhzdGF0X2luZm8pOwotICAgICAgYnVja2V0c1tiXS5jb3VudCA9IDA7Ci0gICAgfQotICAgIGlzLT5ib3R0b21fYnVja2V0ID0gMDsKLSAgICBpcy0+Ym90dG9tID0gMDsKLSAgICBpcy0+d2lkdGggPSBzaXplX25zIC8gZ3JhbnVsYXJpdHk7Ci0gICAgLyogQ2hlY2sgZm9yIHBvc3NpYmxlIG92ZXJmbG93IGlzc3VlcywgYW5kIG1heGltaXplIGludGVydmFsIHNpemUgaWYgdGhlCi0gICAgICAgdXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nIGxhcmdlIGVub3VnaC4gKi8KLSAgICBpZiAoKEdQUl9JTlQ2NF9NQVggLSBpcy0+d2lkdGgpID4gc2l6ZV9ucykgewotICAgICAgaXMtPnRvcCA9IHNpemVfbnMgKyBpcy0+d2lkdGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlzLT50b3AgPSBHUFJfSU5UNjRfTUFYOwotICAgICAgaXMtPndpZHRoID0gR1BSX0lOVDY0X01BWCAvIChncmFudWxhcml0eSArIDEpOwotICAgIH0KLSAgICAvKiBJZiBzaXplIGRvZXNuJ3QgZGl2aWRlIGV2ZW5seSwgd2UgY2FuIGhhdmUgYSB3aWR0aCBzbGlnaHRseSB0b28gc21hbGw7Ci0gICAgICAgYmV0dGVyIHRvIGhhdmUgaXQgc2xpZ2h0bHkgbGFyZ2UuICovCi0gICAgaWYgKChzaXplX25zIC0gKGdyYW51bGFyaXR5ICsgMSkgKiBpcy0+d2lkdGgpID4gMCkgewotICAgICAgaXMtPndpZHRoICs9IDE7Ci0gICAgfQotICB9Ci0gIHJldC0+bmV3ZXN0X3RpbWUgPSAwOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBXaGVuIHdlIHRyeSBhZGRpbmcgYSBtZWFzdXJlbWVudCBhYm92ZSB0aGUgY3VycmVudCBpbnRlcnZhbCByYW5nZSwgd2UKLSAgIG5lZWQgdG8gInNoaWZ0IiB0aGUgYnVja2V0cyBzdWZmaWNpZW50bHkgdG8gY292ZXIgdGhlIG5ldyByYW5nZS4gKi8KLXN0YXRpYyB2b2lkIGN3c19zaGlmdF9idWNrZXRzKGNvbnN0IHdpbmRvd19zdGF0cyAqd3N0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dzX2ludGVydmFsX3N0YXRzICppcywgaW50NjRfdCB3aGVuX25zKSB7Ci0gIGludCBpOwotICAvKiBudW1iZXIgb2YgYnVja2V0IHRpbWUgd2lkdGhzIHRvICJzaGlmdCIgKi8KLSAgaW50IHNoaWZ0OwotICAvKiBudW1iZXIgb2YgYnVja2V0cyB0byBjbGVhciAqLwotICBpbnQgbmNsZWFyOwotICBHUFJfQVNTRVJUKHdoZW5fbnMgPj0gaXMtPnRvcCk7Ci0gIC8qIG51bWJlciBvZiBidWNrZXQgdGltZSB3aWR0aHMgdG8gInNoaWZ0IiAqLwotICBzaGlmdCA9ICgod2hlbl9ucyAtIGlzLT50b3ApIC8gaXMtPndpZHRoKSArIDE7Ci0gIC8qIG51bWJlciBvZiBidWNrZXRzIHRvIGNsZWFyIC0gbGltaXRlZCBieSBhY3R1YWwgbnVtYmVyIG9mIGJ1Y2tldHMgKi8KLSAgbmNsZWFyID0gR1BSX01JTihzaGlmdCwgd3N0YXRzLT5uYnVja2V0cyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuY2xlYXI7IGkrKykgewotICAgIGludCBiID0gQlVDS0VUX0lEWChpcywgaSwgd3N0YXRzKTsKLSAgICBpcy0+YnVja2V0c1tiXS5jb3VudCA9IDA7Ci0gICAgY3dzX2luaXRpYWxpemVfc3RhdGlzdGljKGlzLT5idWNrZXRzW2JdLnN0YXRpc3RpYywgJndzdGF0cy0+c3RhdF9pbmZvKTsKLSAgfQotICAvKiBhZGp1c3QgdG9wL2JvdHRvbSB0aW1lcyBhbmQgY3VycmVudCBib3R0b20gYnVja2V0ICovCi0gIGlzLT5ib3R0b21fYnVja2V0ID0gQlVDS0VUX0lEWChpcywgc2hpZnQsIHdzdGF0cyk7Ci0gIGlzLT50b3AgKz0gc2hpZnQgKiBpcy0+d2lkdGg7Ci0gIGlzLT5ib3R0b20gKz0gc2hpZnQgKiBpcy0+d2lkdGg7Ci19Ci0KLXZvaWQgY2Vuc3VzX3dpbmRvd19zdGF0c19hZGQod2luZG93X3N0YXRzICp3c3RhdHMsIGNvbnN0IGdwcl90aW1lc3BlYyB3aGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzdGF0X3ZhbHVlKSB7Ci0gIGludCBpOwotICBpbnQ2NF90IHdoZW5fbnMgPSB0aW1lc3BlY190b19ucyh3aGVuKTsKLSAgR1BSX0FTU0VSVCh3c3RhdHMtPmludGVydmFsX3N0YXRzICE9IE5VTEwpOwotICBmb3IgKGkgPSAwOyBpIDwgd3N0YXRzLT5uaW50ZXJ2YWxzOyBpKyspIHsKLSAgICBjd3NfaW50ZXJ2YWxfc3RhdHMgKmlzID0gd3N0YXRzLT5pbnRlcnZhbF9zdGF0cyArIGk7Ci0gICAgY3dzX2J1Y2tldCAqYnVja2V0OwotICAgIGlmICh3aGVuX25zIDwgaXMtPmJvdHRvbSkgeyAvKiBCZWxvdyBzbWFsbGVzdCB0aW1lIGluIGludGVydmFsOiBkcm9wICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHdoZW5fbnMgPj0gaXMtPnRvcCkgeyAvKiBhYm92ZSBsaW1pdDogc2hpZnQgYnVja2V0cyAqLwotICAgICAgY3dzX3NoaWZ0X2J1Y2tldHMod3N0YXRzLCBpcywgd2hlbl9ucyk7Ci0gICAgfQotICAgIC8qIEFkZCB0aGUgc3RhdC4gKi8KLSAgICBHUFJfQVNTRVJUKGlzLT5ib3R0b20gPD0gd2hlbl9ucyAmJiB3aGVuX25zIDwgaXMtPnRvcCk7Ci0gICAgYnVja2V0ID0gaXMtPmJ1Y2tldHMgKwotICAgICAgICAgICAgIEJVQ0tFVF9JRFgoaXMsICh3aGVuX25zIC0gaXMtPmJvdHRvbSkgLyBpcy0+d2lkdGgsIHdzdGF0cyk7Ci0gICAgYnVja2V0LT5jb3VudCsrOwotICAgIHdzdGF0cy0+c3RhdF9pbmZvLnN0YXRfYWRkKGJ1Y2tldC0+c3RhdGlzdGljLCBzdGF0X3ZhbHVlKTsKLSAgfQotICBpZiAod2hlbl9ucyA+IHdzdGF0cy0+bmV3ZXN0X3RpbWUpIHsKLSAgICB3c3RhdHMtPm5ld2VzdF90aW1lID0gd2hlbl9uczsKLSAgfQotfQotCi0vKiBBZGQgYSBzcGVjaWZpYyBidWNrZXQgY29udGVudHMgdG8gYW4gYWNjdW11bGF0aW5nIHRvdGFsLiAqLwotc3RhdGljIHZvaWQgY3dzX2FkZF9idWNrZXRfdG9fc3VtKGN3c19zdW0gKnN1bSwgY29uc3QgY3dzX2J1Y2tldCAqYnVja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN3c19zdGF0X2luZm8gKnN0YXRfaW5mbykgewotICBzdW0tPmNvdW50ICs9IGJ1Y2tldC0+Y291bnQ7Ci0gIHN0YXRfaW5mby0+c3RhdF9hZGQoc3VtLT5zdGF0aXN0aWMsIGJ1Y2tldC0+c3RhdGlzdGljKTsKLX0KLQotLyogQWRkIGEgcHJvcG9ydGlvbiB0byBhbiBhY2N1bXVsYXRpbmcgc3VtLiAqLwotc3RhdGljIHZvaWQgY3dzX2FkZF9wcm9wb3J0aW9uX3RvX3N1bShkb3VibGUgcCwgY3dzX3N1bSAqc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjd3NfYnVja2V0ICpidWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN3c19zdGF0X2luZm8gKnN0YXRfaW5mbykgewotICBzdW0tPmNvdW50ICs9IHAgKiBidWNrZXQtPmNvdW50OwotICBzdGF0X2luZm8tPnN0YXRfYWRkX3Byb3BvcnRpb24ocCwgc3VtLT5zdGF0aXN0aWMsIGJ1Y2tldC0+c3RhdGlzdGljKTsKLX0KLQotdm9pZCBjZW5zdXNfd2luZG93X3N0YXRzX2dldF9zdW1zKGNvbnN0IHdpbmRvd19zdGF0cyAqd3N0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwcl90aW1lc3BlYyB3aGVuLCBjd3Nfc3VtIHN1bXNbXSkgewotICBpbnQgaTsKLSAgaW50NjRfdCB3aGVuX25zID0gdGltZXNwZWNfdG9fbnMod2hlbik7Ci0gIEdQUl9BU1NFUlQod3N0YXRzLT5pbnRlcnZhbF9zdGF0cyAhPSBOVUxMKTsKLSAgZm9yIChpID0gMDsgaSA8IHdzdGF0cy0+bmludGVydmFsczsgaSsrKSB7Ci0gICAgaW50IHdoZW5fYnVja2V0OwotICAgIGludCBuZXdfYnVja2V0OwotICAgIGRvdWJsZSBsYXN0X3Byb3BvcnRpb24gPSAxLjA7Ci0gICAgZG91YmxlIGJvdHRvbV9wcm9wb3J0aW9uOwotICAgIGN3c19pbnRlcnZhbF9zdGF0cyAqaXMgPSB3c3RhdHMtPmludGVydmFsX3N0YXRzICsgaTsKLSAgICBjd3Nfc3VtICpzdW0gPSBzdW1zICsgaTsKLSAgICBzdW0tPmNvdW50ID0gMDsKLSAgICBjd3NfaW5pdGlhbGl6ZV9zdGF0aXN0aWMoc3VtLT5zdGF0aXN0aWMsICZ3c3RhdHMtPnN0YXRfaW5mbyk7Ci0gICAgaWYgKHdoZW5fbnMgPCBpcy0+Ym90dG9tKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHdoZW5fbnMgPj0gaXMtPnRvcCkgewotICAgICAgY3dzX3NoaWZ0X2J1Y2tldHMod3N0YXRzLCBpcywgd2hlbl9ucyk7Ci0gICAgfQotICAgIC8qIENhbGN1bGF0aW5nIHRoZSBhcHByb3ByaWF0ZSBhbW91bnQgb2Ygd2hpY2ggYnVja2V0cyB0byB1c2UgY2FuIGdldAotICAgICAgIGNvbXBsaWNhdGVkLiBFc3NlbnRpYWxseSB0aGVyZSBhcmUgdHdvIGNhc2VzOgotICAgICAgIDEpIGlmIHRoZSAidG9wIiBidWNrZXQgKG5ld19idWNrZXQsIHdoZXJlIHRoZSBuZXdlc3QgYWRkaXRpb25zIHRvIHRoZQotICAgICAgIHN0YXRzIHJlY29yZGVkIGFyZSBlbnRlcmVkKSBjb3JyZXNwb25kcyB0byAnd2hlbicsIHRoZW4gd2UgbmVlZAotICAgICAgIHRvIHRha2UgYSBwcm9wb3J0aW9uIG9mIGl0IC0gKGlmIHdoZW4gPCBuZXdlc3RfdGltZSkgb3IgdGhlIGZ1bGwKLSAgICAgICB0aGluZy4gV2UgYWxzbyAocG9zc2libHkpIG5lZWQgdG8gdGFrZSBhIGNvcnJlc3BvbmRpbmcKLSAgICAgICBwcm9wb3J0aW9uIG9mIHRoZSBib3R0b20gYnVja2V0LgotICAgICAgIDIpIE90aGVyIGNhc2VzLCB3ZSBqdXN0IHRha2UgYSBzdHJhaWdodCBwcm9wb3J0aW9uLgotICAgICAqLwotICAgIHdoZW5fYnVja2V0ID0gKHdoZW5fbnMgLSBpcy0+Ym90dG9tKSAvIGlzLT53aWR0aDsKLSAgICBuZXdfYnVja2V0ID0gKHdzdGF0cy0+bmV3ZXN0X3RpbWUgLSBpcy0+Ym90dG9tKSAvIGlzLT53aWR0aDsKLSAgICBpZiAobmV3X2J1Y2tldCA9PSB3aGVuX2J1Y2tldCkgewotICAgICAgaW50NjRfdCBib3R0b21fYnVja2V0X3RpbWUgPSBpcy0+Ym90dG9tICsgd2hlbl9idWNrZXQgKiBpcy0+d2lkdGg7Ci0gICAgICBpZiAod2hlbl9ucyA8IHdzdGF0cy0+bmV3ZXN0X3RpbWUpIHsKLSAgICAgICAgbGFzdF9wcm9wb3J0aW9uID0gKGRvdWJsZSkod2hlbl9ucyAtIGJvdHRvbV9idWNrZXRfdGltZSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSh3c3RhdHMtPm5ld2VzdF90aW1lIC0gYm90dG9tX2J1Y2tldF90aW1lKTsKLSAgICAgICAgYm90dG9tX3Byb3BvcnRpb24gPQotICAgICAgICAgICAgKGRvdWJsZSkoaXMtPndpZHRoIC0gKHdoZW5fbnMgLSBib3R0b21fYnVja2V0X3RpbWUpKSAvIGlzLT53aWR0aDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvdHRvbV9wcm9wb3J0aW9uID0KLSAgICAgICAgICAgIChkb3VibGUpKGlzLT53aWR0aCAtICh3c3RhdHMtPm5ld2VzdF90aW1lIC0gYm90dG9tX2J1Y2tldF90aW1lKSkgLwotICAgICAgICAgICAgaXMtPndpZHRoOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBsYXN0X3Byb3BvcnRpb24gPQotICAgICAgICAgIChkb3VibGUpKHdoZW5fbnMgKyAxIC0gaXMtPmJvdHRvbSAtIHdoZW5fYnVja2V0ICogaXMtPndpZHRoKSAvCi0gICAgICAgICAgaXMtPndpZHRoOwotICAgICAgYm90dG9tX3Byb3BvcnRpb24gPSAxLjAgLSBsYXN0X3Byb3BvcnRpb247Ci0gICAgfQotICAgIGN3c19hZGRfcHJvcG9ydGlvbl90b19zdW0obGFzdF9wcm9wb3J0aW9uLCBzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy0+YnVja2V0cyArIEJVQ0tFVF9JRFgoaXMsIHdoZW5fYnVja2V0LCB3c3RhdHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndzdGF0cy0+c3RhdF9pbmZvKTsKLSAgICBpZiAod2hlbl9idWNrZXQgIT0gMCkgeyAvKiBsYXN0IGJ1Y2tldCBpc24ndCBhbHNvIGJvdHRvbSBidWNrZXQgKi8KLSAgICAgIGludCBiOwotICAgICAgLyogQWRkIGFsbCBvZiAiYm90dG9tIiBidWNrZXQgaWYgd2UgYXJlIGxvb2tpbmcgYXQgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgICBmdWxsIGludGVydmFsLCBvciBhIHByb3BvcnRpb24gaWYgd2UgYXJlIGFkZGluZyBmdWxsIGludGVydmFsLiAqLwotICAgICAgY3dzX2FkZF9wcm9wb3J0aW9uX3RvX3N1bSgKLSAgICAgICAgICAod2hlbl9idWNrZXQgPT0gd3N0YXRzLT5uYnVja2V0cyAtIDEgPyBib3R0b21fcHJvcG9ydGlvbiA6IDEuMCksIHN1bSwKLSAgICAgICAgICBpcy0+YnVja2V0cyArIGlzLT5ib3R0b21fYnVja2V0LCAmd3N0YXRzLT5zdGF0X2luZm8pOwotICAgICAgLyogQWRkIGFsbCB0aGUgcmVtYWluaW5nIGJ1Y2tldHMgKGV2ZXJ5dGhpbmcgYnV0IHRvcCBhbmQgYm90dG9tKS4gKi8KLSAgICAgIGZvciAoYiA9IDE7IGIgPCB3aGVuX2J1Y2tldDsgYisrKSB7Ci0gICAgICAgIGN3c19hZGRfYnVja2V0X3RvX3N1bShzdW0sIGlzLT5idWNrZXRzICsgQlVDS0VUX0lEWChpcywgYiwgd3N0YXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3c3RhdHMtPnN0YXRfaW5mbyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgY2Vuc3VzX3dpbmRvd19zdGF0c19kZXN0cm95KHdpbmRvd19zdGF0cyAqd3N0YXRzKSB7Ci0gIGludCBpOwotICBHUFJfQVNTRVJUKHdzdGF0cy0+aW50ZXJ2YWxfc3RhdHMgIT0gTlVMTCk7Ci0gIGZvciAoaSA9IDA7IGkgPCB3c3RhdHMtPm5pbnRlcnZhbHM7IGkrKykgewotICAgIGludCBiOwotICAgIGZvciAoYiA9IDA7IGIgPCB3c3RhdHMtPm5idWNrZXRzOyBiKyspIHsKLSAgICAgIGdwcl9mcmVlKHdzdGF0cy0+aW50ZXJ2YWxfc3RhdHNbaV0uYnVja2V0c1tiXS5zdGF0aXN0aWMpOwotICAgIH0KLSAgICBncHJfZnJlZSh3c3RhdHMtPmludGVydmFsX3N0YXRzW2ldLmJ1Y2tldHMpOwotICB9Ci0gIGdwcl9mcmVlKHdzdGF0cy0+aW50ZXJ2YWxfc3RhdHMpOwotICAvKiBFbnN1cmUgYW55IHVzZS1hZnRlciBmcmVlIHRyaWdnZXJzIGFzc2VydC4gKi8KLSAgd3N0YXRzLT5pbnRlcnZhbF9zdGF0cyA9IE5VTEw7Ci0gIGdwcl9mcmVlKHdzdGF0cyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5oIGIvc3JjL2NvcmUvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0Mjc3MS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NUQVRJU1RJQ1NfV0lORE9XX1NUQVRTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NUQVRJU1RJQ1NfV0lORE9XX1NUQVRTX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0KLS8qIEtlZXAgcm9sbGluZyBzdW1zIG9mIGEgdXNlci1kZWZpbmVkIHN0YXRpc3RpYyAoY29udGFpbmluZyBhIG51bWJlciBvZgotICAgbWVhc3VyZW1lbnRzKSBvdmVyIGEgYSBudW1iZXIgb2YgdGltZSBpbnRlcnZhbHMgKCJ3aW5kb3dzIikuIEZvciBleGFtcGxlLAotICAgeW91IGNhbiB1c2UgYSB3aW5kb3dfc3RhdHMgb2JqZWN0IHRvIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhcwotICAgIkFwcHJveGltYXRlbHkgaG93IG1hbnkgUlBDcy9zIGRpZCBJIHJlY2VpdmUgb3ZlciB0aGUgcGFzdCBtaW51dGUsIGFuZAotICAgYXBwcm94aW1hdGVseSBob3cgbWFueSBieXRlcyBkaWQgSSBzZW5kIG91dCBvdmVyIHRoYXQgcGVyaW9kPyIuCi0KLSAgIFRoZSB0eXBlIG9mIGRhdGEgdG8gcmVjb3JkLCBhbmQgdGhlIHRpbWUgaW50ZXJ2YWxzIHRvIGtlZXAgYXJlIHNwZWNpZmllZAotICAgd2hlbiBjcmVhdGluZyB0aGUgb2JqZWN0IHZpYSBhIGNhbGwgdG8gY2Vuc3VzX3dpbmRvd19zdGF0c19jcmVhdGUoKS4KLQotICAgQSB3aW5kb3cncyBpbnRlcnZhbCBpcyBkaXZpZGVkIGludG8gb25lIG9yIG1vcmUgImJ1Y2tldHMiOyB0aGUgaW50ZXJ2YWwKLSAgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2YgYnVja2V0cy4gSW50ZXJuYWxseSwgdGhlc2UgYnVja2V0cwotICAgY29udHJvbCB0aGUgZ3JhbnVsYXJpdHkgb2Ygd2luZG93X3N0YXRzJyBtZWFzdXJlbWVudHMuIEluY3JlYXNpbmcgdGhlCi0gICBudW1iZXIgb2YgYnVja2V0cyBsZXRzIHRoZSBvYmplY3QgcmVzcG9uZCBtb3JlIHF1aWNrbHkgdG8gY2hhbmdlcyBpbiB0aGUKLSAgIG92ZXJhbGwgcmF0ZSBvZiBkYXRhIGFkZGVkIGludG8gdGhlIG9iamVjdCwgYXQgdGhlIGNvc3Qgb2YgYWRkaXRpb25hbAotICAgbWVtb3J5IHVzYWdlLgotCi0gICBIZXJlJ3Mgc29tZSBjb2RlIHdoaWNoIGtlZXBzIG9uZSBtaW51dGUvaG91ciBtZWFzdXJlbWVudHMgZm9yIHR3byB2YWx1ZXMKLSAgIChsYXRlbmN5IGluIHNlY29uZHMgYW5kIGJ5dGVzIHRyYW5zZmVycmVkKSwgd2l0aCBlYWNoIGludGVydmFsIGRpdmlkZWQgaW50bwotICAgNCBidWNrZXRzLgotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgbXlfc3RhdCB7Ci0gICAgICBkb3VibGUgbGF0ZW5jeTsKLSAgICAgIGludCBieXRlczsKLSAgICB9IG15X3N0YXQ7Ci0KLSAgICB2b2lkIGFkZF9teV9zdGF0KHZvaWQqIGJhc2UsIGNvbnN0IHZvaWQqIGFkZG1lKSB7Ci0gICAgICBteV9zdGF0KiBiID0gKG15X3N0YXQqKWJhc2U7Ci0gICAgICBjb25zdCBteV9zdGF0KiBhID0gKGNvbnN0IG15X3N0YXQqKWFkZG1lOwotICAgICAgYi0+bGF0ZW5jeSArPSBhLT5sYXRlbmN5OwotICAgICAgYi0+Ynl0ZXMgKz0gYS0+Ynl0ZXM7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRfcHJvcG9ydGlvbl9teV9zdGF0KGRvdWJsZSBwLCB2b2lkKiBiYXNlLCBjb25zdCB2b2lkKiBhZGRtZSkgewotICAgICAgKG15X3N0YXQqKXJlc3VsdC0+bGF0ZW5jeSArPSBwICogKGNvbnN0IG15X3N0YXQqKWJhc2UtPmxhdGVuY3k7Ci0gICAgICAobXlfc3RhdCopcmVzdWx0LT5ieXRlcyArPSBwICogKGNvbnN0IG15X3N0YXQqKWJhc2UtPmJ5dGVzOwotICAgIH0KLQotICAgICNkZWZpbmUga051bUludGVydmFscyAyCi0gICAgI2RlZmluZSBrTWluSW50ZXJ2YWwgMAotICAgICNkZWZpbmUga0hvdXJJbnRlcnZhbCAxCi0gICAgI2RlZmluZSBrTnVtQnVja2V0cyA0Ci0KLSAgICBjb25zdCBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0c19zdGF0X2luZm8ga015U3RhdEluZm8KLSAgICAgICAgPSB7IHNpemVvZihteV9zdGF0KSwgTlVMTCwgYWRkX215X3N0YXQsIGFkZF9wcm9wb3J0aW9uX215X3N0YXQgfTsKLSAgICBncHJfdGltZXNwZWMgaW50ZXJ2YWxzW2tOdW1JbnRlcnZhbHNdID0ge3s2MCwgMH0sIHszNjAwLCAwfX07Ci0gICAgbXlfc3RhdCBzdGF0OwotICAgIG15X3N0YXQgc3Vtc1trTnVtSW50ZXJ2YWxzXTsKLSAgICBjZW5zdXNfd2luZG93X3N0YXRzX3N1bXMgcmVzdWx0W2tOdW1JbnRlcnZhbHNdOwotICAgIHN0cnVjdCBjZW5zdXNfd2luZG93X3N0YXRzKiBzdGF0cwotICAgICAgICA9IGNlbnN1c193aW5kb3dfc3RhdHNfY3JlYXRlKGtOdW1JbnRlcnZhbHMsIGludGVydmFscywga051bUJ1Y2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtNeVN0YXRJbmZvKTsKLSAgICAvLyBSZWNvcmQgYSBuZXcgZXZlbnQsIHRha2luZyAxNS4zbXMsIHRyYW5zZmVycmluZyAxNzg0IGJ5dGVzLgotICAgIHN0YXQubGF0ZW5jeSA9IDAuMTUzOwotICAgIHN0YXQuYnl0ZXMgPSAxNzg0OwotICAgIGNlbnN1c193aW5kb3dfc3RhdHNfYWRkKHN0YXRzLCBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksICZzdGF0KTsKLSAgICAvLyBHZXQgc3VtcyBhbmQgcHJpbnQgdGhlbSBvdXQKLSAgICByZXN1bHRba01pbkludGVydmFsXS5zdGF0aXN0aWMgPSAmc3Vtc1trTWluSW50ZXJ2YWxdOwotICAgIHJlc3VsdFtrSG91ckludGVydmFsXS5zdGF0aXN0aWMgPSAmc3Vtc1trSG91ckludGVydmFsXTsKLSAgICBjZW5zdXNfd2luZG93X3N0YXRzX2dldF9zdW1zKHN0YXRzLCBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSksIHJlc3VsdCk7Ci0gICAgcHJpbnRmKCIlZCBldmVudHMvbWluLCBhdmVyYWdlIHRpbWUgJWdzLCBhdmVyYWdlIGJ5dGVzICVnXG4iLAotICAgICAgICAgICByZXN1bHRba01pbkludGVydmFsXS5jb3VudCwKLSAgICAgICAgICAgKG15X3N0YXQqKXJlc3VsdFtrTWluSW50ZXJ2YWxdLnN0YXRpc3RpYy0+bGF0ZW5jeSAvCi0gICAgICAgICAgICAgcmVzdWx0W2tNaW5JbnRlcnZhbF0uY291bnQsCi0gICAgICAgICAgIChteV9zdGF0KilyZXN1bHRba01pbkludGVydmFsXS5zdGF0aXN0aWMtPmJ5dGVzIC8KLSAgICAgICAgICAgICByZXN1bHRba01pbkludGVydmFsXS5jb3VudAotICAgICAgICAgICk7Ci0gICAgcHJpbnRmKCIlZCBldmVudHMvaHIsIGF2ZXJhZ2UgdGltZSAlZ3MsIGF2ZXJhZ2UgYnl0ZXMgJWdcbiIsCi0gICAgICAgICAgIHJlc3VsdFtrSG91ckludGVydmFsXS5jb3VudCwKLSAgICAgICAgICAgKG15X3N0YXQqKXJlc3VsdFtrSG91ckludGVydmFsXS5zdGF0aXN0aWMtPmxhdGVuY3kgLwotICAgICAgICAgICAgIHJlc3VsdFtrSG91ckludGVydmFsXS5jb3VudCwKLSAgICAgICAgICAgKG15X3N0YXQqKXJlc3VsdFtrSG91ckludGVydmFsXS5zdGF0aXN0aWMtPmJ5dGVzIC8KLSAgICAgICAgICAgICByZXN1bHRba0hvdXJJbnRlcnZhbF0uY291bnQKLSAgICAgICAgICApOwotKi8KLQotLyogT3BhcXVlIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIHdpbmRvd19zdGF0cyBvYmplY3QgKi8KLXN0cnVjdCBjZW5zdXNfd2luZG93X3N0YXRzOwotCi0vKiBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSBBUEkgdXNlciBvbiB0aGUgaW5mb3JtYXRpb24gdGhleSB3YW50IHRvIHJlY29yZCAqLwotdHlwZWRlZiBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0c19zdGF0X2luZm8gewotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdXNlci1kZWZpbmVkIG9iamVjdC4gKi8KLSAgc2l6ZV90IHN0YXRfc2l6ZTsKLSAgLyogRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhIHVzZXItZGVmaW5lZCBzdGF0aXN0aWNzIG9iamVjdC4gSWYgdGhpcyBpcyBzZXQKLSAgICogdG8gTlVMTCwgdGhlbiB0aGUgb2JqZWN0IHdpbGwgYmUgemVyby1pbml0aWFsaXplZC4gKi8KLSAgdm9pZCAoKnN0YXRfaW5pdGlhbGl6ZSkodm9pZCAqc3RhdCk7Ci0gIC8qIEZ1bmN0aW9uIHRvIGFkZCBvbmUgdXNlci1kZWZpbmVkIHN0YXRpc3RpY3Mgb2JqZWN0ICgnYWRkbWUnKSB0byAnYmFzZScgKi8KLSAgdm9pZCAoKnN0YXRfYWRkKSh2b2lkICpiYXNlLCBjb25zdCB2b2lkICphZGRtZSk7Ci0gIC8qIEFzIGZvciBwcmV2aW91cyBmdW5jdGlvbiwgYnV0IG9ubHkgYWRkIGEgcHJvcG9ydGlvbiAncCcuIFRoaXMgQVBJIHdpbGwKLSAgICAgY3VycmVudGx5IG9ubHkgdXNlICdwJyB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLDFdLCBidXQgb3RoZXIgdmFsdWVzIGFyZQotICAgICBwb3NzaWJsZSBpbiB0aGUgZnV0dXJlLCBhbmQgc2hvdWxkIGJlIHN1cHBvcnRlZC4gKi8KLSAgdm9pZCAoKnN0YXRfYWRkX3Byb3BvcnRpb24pKGRvdWJsZSBwLCB2b2lkICpiYXNlLCBjb25zdCB2b2lkICphZGRtZSk7Ci19IGNlbnN1c193aW5kb3dfc3RhdHNfc3RhdF9pbmZvOwotCi0vKiBDcmVhdGUgYSBuZXcgd2luZG93X3N0YXRzIG9iamVjdC4gJ25pbnRlcnZhbHMnIGlzIHRoZSBudW1iZXIgb2YKLSAgICdpbnRlcnZhbHMnLCBhbmQgbXVzdCBiZSA+PTEuICdncmFudWxhcml0eScgaXMgdGhlIG51bWJlciBvZiBidWNrZXRzLCB3aXRoCi0gICBhIGxhcmdlciBudW1iZXIgdXNpbmcgbW9yZSBtZW1vcnksIGJ1dCBwcm92aWRpbmcgZ3JlYXRlciBhY2N1cmFjeSBvZgotICAgcmVzdWx0cy4gJ2dyYW51bGFyaXR5IHNob3VsZCBiZSA+IDIuIFdlIGFsc28gcmVxdWlyZSB0aGF0IGVhY2ggaW50ZXJ2YWwgYmUKLSAgIGF0IGxlYXN0IDEwICogJ2dyYW51bGFyaXR5JyBuYW5vc2Vjb25kcyBpbiBzaXplLiAnc3RhdF9pbmZvJyBjb250YWlucwotICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRpc3RpYyB0byBiZSBnYXRoZXJlZC4gSW50ZXJ2YWxzIGdyZWF0ZXIgdGhhbiB+MTkyCi0gICB5ZWFycyB3aWxsIGJlIHRyZWF0ZWQgYXMgZXNzZW50aWFsbHkgaW5maW5pdGUgaW4gc2l6ZS4gVGhpcyBmdW5jdGlvbiB3aWxsCi0gICBHUFJfQVNTRVJUKCkgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgY3JlYXRlZCBvciBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgaGF2ZQotICAgaW52YWxpZCB2YWx1ZXMuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUuICovCi1zdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyAqY2Vuc3VzX3dpbmRvd19zdGF0c19jcmVhdGUoCi0gICAgaW50IG5pbnRlcnZhbHMsIGNvbnN0IGdwcl90aW1lc3BlYyBpbnRlcnZhbHNbXSwgaW50IGdyYW51bGFyaXR5LAotICAgIGNvbnN0IGNlbnN1c193aW5kb3dfc3RhdHNfc3RhdF9pbmZvICpzdGF0X2luZm8pOwotCi0vKiBBZGQgYSBuZXcgbWVhc3VyZW1lbnQgKGluICdzdGF0X3ZhbHVlJyksIGFzIG9mIGEgZ2l2ZW4gdGltZSAoJ3doZW4nKS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLWNvbXBhdGlibGUuICovCi12b2lkIGNlbnN1c193aW5kb3dfc3RhdHNfYWRkKHN0cnVjdCBjZW5zdXNfd2luZG93X3N0YXRzICp3c3RhdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwcl90aW1lc3BlYyB3aGVuLCBjb25zdCB2b2lkICpzdGF0X3ZhbHVlKTsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gcmVjb3JkIGEgc2luZ2xlIGludGVydmFscyBzdW0gZm9yIGEgZ2l2ZW4gc3RhdGlzdGljICovCi10eXBlZGVmIHN0cnVjdCBjZW5zdXNfd2luZG93X3N0YXRzX3N1bSB7Ci0gIC8qIFRvdGFsIGNvdW50IG9mIHNhbXBsZXMuIE5vdGUgdGhhdCBiZWNhdXNlIHNvbWUgaW50ZXJuYWwgaW50ZXJwb2xhdGlvbgotICAgICBpcyBwZXJmb3JtZWQsIHRoZSBjb3VudCBvZiBzYW1wbGVzIHJldHVybmVkIGZvciBlYWNoIGludGVydmFsIG1heSBub3QgYmUgYW4KLSAgICAgaW50ZWdyYWwgdmFsdWUuICovCi0gIGRvdWJsZSBjb3VudDsKLSAgLyogU3VtIGZvciBzdGF0aXN0aWMgKi8KLSAgdm9pZCAqc3RhdGlzdGljOwotfSBjZW5zdXNfd2luZG93X3N0YXRzX3N1bXM7Ci0KLS8qIFJldHJpZXZlIGEgc2V0IG9mIGFsbCB2YWx1ZXMgc3RvcmVkIGluIGEgd2luZG93X3N0YXRzIG9iamVjdCAnd3N0YXRzJy4gVGhlCi0gICBudW1iZXIgb2YgJ3N1bXMnIE1VU1QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciAnbmludGVydmFscycgdXNlZCBpbgotICAgY2Vuc3VzX3dpbmRvd19zdGF0c19jcmVhdGUoKS4gVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtY29tcGF0aWJsZS4gKi8KLXZvaWQgY2Vuc3VzX3dpbmRvd19zdGF0c19nZXRfc3Vtcyhjb25zdCBzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyAqd3N0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwcl90aW1lc3BlYyB3aGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjZW5zdXNfd2luZG93X3N0YXRzX3N1bSBzdW1zW10pOwotCi0vKiBEZXN0cm95IGEgd2luZG93X3N0YXRzIG9iamVjdC4gT25jZSB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCwgdGhlCi0gICBvYmplY3Qgd2lsbCBubyBsb25nZXIgYmUgdXNhYmxlIGZyb20gYW55IG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMgKGFuZAotICAgY2FsbGluZyB0aGVtIHdpbGwgbW9zdCBsaWtlbHkgcmVzdWx0IGluIGEgTlVMTC1wb2ludGVyIGRlcmVmZXJlbmNlIG9yCi0gICBhc3NlcnRpb24gZmFpbHVyZSkuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLWNvbXBhdGlibGUuICovCi12b2lkIGNlbnN1c193aW5kb3dfc3RhdHNfZGVzdHJveShzdHJ1Y3QgY2Vuc3VzX3dpbmRvd19zdGF0cyAqd3N0YXRzKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVEFUSVNUSUNTX1dJTkRPV19TVEFUU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMgYi9zcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWZiOGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotCi1zdGF0aWMgZ3ByX2FsbG9jYXRpb25fZnVuY3Rpb25zIGdfYWxsb2NfZnVuY3Rpb25zID0ge21hbGxvYywgcmVhbGxvYywgZnJlZX07Ci0KLWdwcl9hbGxvY2F0aW9uX2Z1bmN0aW9ucyBncHJfZ2V0X2FsbG9jYXRpb25fZnVuY3Rpb25zKCkgewotICByZXR1cm4gZ19hbGxvY19mdW5jdGlvbnM7Ci19Ci0KLXZvaWQgZ3ByX3NldF9hbGxvY2F0aW9uX2Z1bmN0aW9ucyhncHJfYWxsb2NhdGlvbl9mdW5jdGlvbnMgZnVuY3Rpb25zKSB7Ci0gIEdQUl9BU1NFUlQoZnVuY3Rpb25zLm1hbGxvY19mbiAhPSBOVUxMKTsKLSAgR1BSX0FTU0VSVChmdW5jdGlvbnMucmVhbGxvY19mbiAhPSBOVUxMKTsKLSAgR1BSX0FTU0VSVChmdW5jdGlvbnMuZnJlZV9mbiAhPSBOVUxMKTsKLSAgZ19hbGxvY19mdW5jdGlvbnMgPSBmdW5jdGlvbnM7Ci19Ci0KLXZvaWQgKmdwcl9tYWxsb2Moc2l6ZV90IHNpemUpIHsKLSAgdm9pZCAqcDsKLSAgR1BSX1RJTUVSX0JFR0lOKCJncHJfbWFsbG9jIiwgMCk7Ci0gIHAgPSBnX2FsbG9jX2Z1bmN0aW9ucy5tYWxsb2NfZm4oc2l6ZSk7Ci0gIGlmICghcCkgewotICAgIGFib3J0KCk7Ci0gIH0KLSAgR1BSX1RJTUVSX0VORCgiZ3ByX21hbGxvYyIsIDApOwotICByZXR1cm4gcDsKLX0KLQotdm9pZCBncHJfZnJlZSh2b2lkICpwKSB7Ci0gIEdQUl9USU1FUl9CRUdJTigiZ3ByX2ZyZWUiLCAwKTsKLSAgZ19hbGxvY19mdW5jdGlvbnMuZnJlZV9mbihwKTsKLSAgR1BSX1RJTUVSX0VORCgiZ3ByX2ZyZWUiLCAwKTsKLX0KLQotdm9pZCAqZ3ByX3JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IHNpemUpIHsKLSAgR1BSX1RJTUVSX0JFR0lOKCJncHJfcmVhbGxvYyIsIDApOwotICBwID0gZ19hbGxvY19mdW5jdGlvbnMucmVhbGxvY19mbihwLCBzaXplKTsKLSAgaWYgKCFwKSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBHUFJfVElNRVJfRU5EKCJncHJfcmVhbGxvYyIsIDApOwotICByZXR1cm4gcDsKLX0KLQotdm9pZCAqZ3ByX21hbGxvY19hbGlnbmVkKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50X2xvZykgewotICBzaXplX3QgYWxpZ25tZW50ID0gKChzaXplX3QpMSkgPDwgYWxpZ25tZW50X2xvZzsKLSAgc2l6ZV90IGV4dHJhID0gYWxpZ25tZW50IC0gMSArIHNpemVvZih2b2lkICopOwotICB2b2lkICpwID0gZ3ByX21hbGxvYyhzaXplICsgZXh0cmEpOwotICB2b2lkICoqcmV0ID0gKHZvaWQgKiopKCgodWludHB0cl90KXAgKyBleHRyYSkgJiB+KGFsaWdubWVudCAtIDEpKTsKLSAgcmV0Wy0xXSA9IHA7Ci0gIHJldHVybiAodm9pZCAqKXJldDsKLX0KLQotdm9pZCBncHJfZnJlZV9hbGlnbmVkKHZvaWQgKnB0cikgeyBncHJfZnJlZSgoKHZvaWQgKiopcHRyKVstMV0pOyB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuYyBiL3NyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NmYjc3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotdm9pZCBncHJfYmFja29mZl9pbml0KGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBkb3VibGUgbXVsdGlwbGllciwgZG91YmxlIGppdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90aW1lb3V0X21pbGxpcywgaW50NjRfdCBtYXhfdGltZW91dF9taWxsaXMpIHsKLSAgYmFja29mZi0+bXVsdGlwbGllciA9IG11bHRpcGxpZXI7Ci0gIGJhY2tvZmYtPmppdHRlciA9IGppdHRlcjsKLSAgYmFja29mZi0+bWluX3RpbWVvdXRfbWlsbGlzID0gbWluX3RpbWVvdXRfbWlsbGlzOwotICBiYWNrb2ZmLT5tYXhfdGltZW91dF9taWxsaXMgPSBtYXhfdGltZW91dF9taWxsaXM7Ci0gIGJhY2tvZmYtPnJuZ19zdGF0ZSA9ICh1aW50MzJfdClncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSkudHZfbnNlYzsKLX0KLQotZ3ByX3RpbWVzcGVjIGdwcl9iYWNrb2ZmX2JlZ2luKGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBncHJfdGltZXNwZWMgbm93KSB7Ci0gIGJhY2tvZmYtPmN1cnJlbnRfdGltZW91dF9taWxsaXMgPSBiYWNrb2ZmLT5taW5fdGltZW91dF9taWxsaXM7Ci0gIHJldHVybiBncHJfdGltZV9hZGQoCi0gICAgICBub3csIGdwcl90aW1lX2Zyb21fbWlsbGlzKGJhY2tvZmYtPmN1cnJlbnRfdGltZW91dF9taWxsaXMsIEdQUl9USU1FU1BBTikpOwotfQotCi0vKiBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLiAqLwotc3RhdGljIGRvdWJsZSBnZW5lcmF0ZV91bmlmb3JtX3JhbmRvbV9udW1iZXIodWludDMyX3QgKnJuZ19zdGF0ZSkgewotICAqcm5nX3N0YXRlID0gKDExMDM1MTUyNDUgKiAqcm5nX3N0YXRlICsgMTIzNDUpICUgKCh1aW50MzJfdCkxIDw8IDMxKTsKLSAgcmV0dXJuICpybmdfc3RhdGUgLyAoZG91YmxlKSgodWludDMyX3QpMSA8PCAzMSk7Ci19Ci0KLWdwcl90aW1lc3BlYyBncHJfYmFja29mZl9zdGVwKGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBncHJfdGltZXNwZWMgbm93KSB7Ci0gIGRvdWJsZSBuZXdfdGltZW91dF9taWxsaXMgPQotICAgICAgYmFja29mZi0+bXVsdGlwbGllciAqIChkb3VibGUpYmFja29mZi0+Y3VycmVudF90aW1lb3V0X21pbGxpczsKLSAgZG91YmxlIGppdHRlcl9yYW5nZSA9IGJhY2tvZmYtPmppdHRlciAqIG5ld190aW1lb3V0X21pbGxpczsKLSAgZG91YmxlIGppdHRlciA9Ci0gICAgICAoMiAqIGdlbmVyYXRlX3VuaWZvcm1fcmFuZG9tX251bWJlcigmYmFja29mZi0+cm5nX3N0YXRlKSAtIDEpICoKLSAgICAgIGppdHRlcl9yYW5nZTsKLSAgYmFja29mZi0+Y3VycmVudF90aW1lb3V0X21pbGxpcyA9Ci0gICAgICBHUFJfQ0xBTVAoKGludDY0X3QpKG5ld190aW1lb3V0X21pbGxpcyArIGppdHRlciksCi0gICAgICAgICAgICAgICAgYmFja29mZi0+bWluX3RpbWVvdXRfbWlsbGlzLCBiYWNrb2ZmLT5tYXhfdGltZW91dF9taWxsaXMpOwotICByZXR1cm4gZ3ByX3RpbWVfYWRkKAotICAgICAgbm93LCBncHJfdGltZV9mcm9tX21pbGxpcyhiYWNrb2ZmLT5jdXJyZW50X3RpbWVvdXRfbWlsbGlzLCBHUFJfVElNRVNQQU4pKTsKLX0KLQotdm9pZCBncHJfYmFja29mZl9yZXNldChncHJfYmFja29mZiAqYmFja29mZikgewotICAvLyBmb3JjZXMgc3RlcCgpIHRvIHJldHVybiBhIHRpbWVvdXQgb2YgbWluX3RpbWVvdXRfbWlsbGlzCi0gIGJhY2tvZmYtPmN1cnJlbnRfdGltZW91dF9taWxsaXMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmggYi9zcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5MzNjMy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVBQT1JUX0JBQ0tPRkZfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9CQUNLT0ZGX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8vIGNvbnN0OiBtdWx0aXBsaWVyIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMKLSAgZG91YmxlIG11bHRpcGxpZXI7Ci0gIC8vLyBjb25zdDogYW1vdW50IHRvIHJhbmRvbWl6ZSBiYWNrb2ZmcwotICBkb3VibGUgaml0dGVyOwotICAvLy8gY29uc3Q6IG1pbmltdW0gdGltZSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzCi0gIGludDY0X3QgbWluX3RpbWVvdXRfbWlsbGlzOwotICAvLy8gY29uc3Q6IG1heGltdW0gdGltZSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzCi0gIGludDY0X3QgbWF4X3RpbWVvdXRfbWlsbGlzOwotCi0gIC8vLyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotICB1aW50MzJfdCBybmdfc3RhdGU7Ci0KLSAgLy8vIGN1cnJlbnQgcmV0cnkgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKLSAgaW50NjRfdCBjdXJyZW50X3RpbWVvdXRfbWlsbGlzOwotfSBncHJfYmFja29mZjsKLQotLy8vIEluaXRpYWxpemUgYmFja29mZiBtYWNoaW5lcnkgLSBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlc3Ryb3llZAotdm9pZCBncHJfYmFja29mZl9pbml0KGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBkb3VibGUgbXVsdGlwbGllciwgZG91YmxlIGppdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90aW1lb3V0X21pbGxpcywgaW50NjRfdCBtYXhfdGltZW91dF9taWxsaXMpOwotCi0vLy8gQmVnaW4gcmV0cnkgbG9vcDogcmV0dXJucyBhIHRpbWVzcGVjIGZvciB0aGUgTkVYVCByZXRyeQotZ3ByX3RpbWVzcGVjIGdwcl9iYWNrb2ZmX2JlZ2luKGdwcl9iYWNrb2ZmICpiYWNrb2ZmLCBncHJfdGltZXNwZWMgbm93KTsKLS8vLyBTdGVwIGEgcmV0cnkgbG9vcDogcmV0dXJucyBhIHRpbWVzcGVjIGZvciB0aGUgTkVYVCByZXRyeQotZ3ByX3RpbWVzcGVjIGdwcl9iYWNrb2ZmX3N0ZXAoZ3ByX2JhY2tvZmYgKmJhY2tvZmYsIGdwcl90aW1lc3BlYyBub3cpOwotLy8vIFJlc2V0IHRoZSBiYWNrb2ZmLCBzbyB0aGUgbmV4dCBncHJfYmFja29mZl9zdGVwIHdpbGwgYmUgYSBncHJfYmFja29mZl9iZWdpbgotLy8vIGluc3RlYWQKLXZvaWQgZ3ByX2JhY2tvZmZfcmVzZXQoZ3ByX2JhY2tvZmYgKmJhY2tvZmYpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUFBPUlRfQkFDS09GRl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmggYi9zcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTE4MDMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VQUE9SVF9CTE9DS19BTk5PVEFURV9ICi0jZGVmaW5lIEdSUENfQ09SRV9TVVBQT1JUX0JMT0NLX0FOTk9UQVRFX0gKLQotLyogVGhlc2UgYW5ub3RhdGlvbnMgaWRlbnRpZnkgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHJlZ2lvbnMgd2hlcmUKLSAgIHRoZSBjb2RlIG1heSBibG9jayBmb3IgcmVhc29ucyBvdGhlciB0aGFuIHN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnMuCi0gICBUaGVzZSBpbmNsdWRlIHBvbGwsIGVwb2xsLCBhbmQgZ2V0YWRkcmluZm8uICovCi0KLSNkZWZpbmUgR1JQQ19TQ0hFRFVMSU5HX1NUQVJUX0JMT0NLSU5HX1JFR0lPTiBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotI2RlZmluZSBHUlBDX1NDSEVEVUxJTkdfRU5EX0JMT0NLSU5HX1JFR0lPTiBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVBQT1JUX0JMT0NLX0FOTk9UQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvY21kbGluZS5jIGIvc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjQ2YTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9jbWRsaW5lLmg+Ci0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLXR5cGVkZWYgZW51bSB7IEFSR1RZUEVfSU5ULCBBUkdUWVBFX0JPT0wsIEFSR1RZUEVfU1RSSU5HIH0gYXJndHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgYXJnIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqaGVscDsKLSAgYXJndHlwZSB0eXBlOwotICB2b2lkICp2YWx1ZTsKLSAgc3RydWN0IGFyZyAqbmV4dDsKLX0gYXJnOwotCi1zdHJ1Y3QgZ3ByX2NtZGxpbmUgewotICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKLSAgYXJnICphcmdzOwotICBjb25zdCBjaGFyICphcmd2MDsKLQotICBjb25zdCBjaGFyICpleHRyYV9hcmdfbmFtZTsKLSAgY29uc3QgY2hhciAqZXh0cmFfYXJnX2hlbHA7Ci0gIHZvaWQgKCpleHRyYV9hcmcpKHZvaWQgKnVzZXJfZGF0YSwgY29uc3QgY2hhciAqYXJnKTsKLSAgdm9pZCAqZXh0cmFfYXJnX3VzZXJfZGF0YTsKLQotICBpbnQgKCpzdGF0ZSkoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICphcmcpOwotICBhcmcgKmN1cl9hcmc7Ci0KLSAgaW50IHN1cnZpdmVfZmFpbHVyZTsKLX07Ci0KLXN0YXRpYyBpbnQgbm9ybWFsX3N0YXRlKGdwcl9jbWRsaW5lICpjbCwgY2hhciAqYXJnKTsKLQotZ3ByX2NtZGxpbmUgKmdwcl9jbWRsaW5lX2NyZWF0ZShjb25zdCBjaGFyICpkZXNjcmlwdGlvbikgewotICBncHJfY21kbGluZSAqY2wgPSBncHJfbWFsbG9jKHNpemVvZihncHJfY21kbGluZSkpOwotICBtZW1zZXQoY2wsIDAsIHNpemVvZihncHJfY21kbGluZSkpOwotCi0gIGNsLT5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICBjbC0+c3RhdGUgPSBub3JtYWxfc3RhdGU7Ci0KLSAgcmV0dXJuIGNsOwotfQotCi12b2lkIGdwcl9jbWRsaW5lX3NldF9zdXJ2aXZlX2ZhaWx1cmUoZ3ByX2NtZGxpbmUgKmNsKSB7Ci0gIGNsLT5zdXJ2aXZlX2ZhaWx1cmUgPSAxOwotfQotCi12b2lkIGdwcl9jbWRsaW5lX2Rlc3Ryb3koZ3ByX2NtZGxpbmUgKmNsKSB7Ci0gIHdoaWxlIChjbC0+YXJncykgewotICAgIGFyZyAqYSA9IGNsLT5hcmdzOwotICAgIGNsLT5hcmdzID0gYS0+bmV4dDsKLSAgICBncHJfZnJlZShhKTsKLSAgfQotICBncHJfZnJlZShjbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9hcmcoZ3ByX2NtZGxpbmUgKmNsLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpoZWxwLAotICAgICAgICAgICAgICAgICAgICBhcmd0eXBlIHR5cGUsIHZvaWQgKnZhbHVlKSB7Ci0gIGFyZyAqYTsKLQotICBmb3IgKGEgPSBjbC0+YXJnczsgYTsgYSA9IGEtPm5leHQpIHsKLSAgICBHUFJfQVNTRVJUKDAgIT0gc3RyY21wKGEtPm5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIGEgPSBncHJfbWFsbG9jKHNpemVvZihhcmcpKTsKLSAgbWVtc2V0KGEsIDAsIHNpemVvZihhcmcpKTsKLSAgYS0+bmFtZSA9IG5hbWU7Ci0gIGEtPmhlbHAgPSBoZWxwOwotICBhLT50eXBlID0gdHlwZTsKLSAgYS0+dmFsdWUgPSB2YWx1ZTsKLSAgYS0+bmV4dCA9IGNsLT5hcmdzOwotICBjbC0+YXJncyA9IGE7Ci19Ci0KLXZvaWQgZ3ByX2NtZGxpbmVfYWRkX2ludChncHJfY21kbGluZSAqY2wsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmhlbHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2YWx1ZSkgewotICBhZGRfYXJnKGNsLCBuYW1lLCBoZWxwLCBBUkdUWVBFX0lOVCwgdmFsdWUpOwotfQotCi12b2lkIGdwcl9jbWRsaW5lX2FkZF9mbGFnKGdwcl9jbWRsaW5lICpjbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaGVscCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp2YWx1ZSkgewotICBhZGRfYXJnKGNsLCBuYW1lLCBoZWxwLCBBUkdUWVBFX0JPT0wsIHZhbHVlKTsKLX0KLQotdm9pZCBncHJfY21kbGluZV9hZGRfc3RyaW5nKGdwcl9jbWRsaW5lICpjbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaGVscCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWUpIHsKLSAgYWRkX2FyZyhjbCwgbmFtZSwgaGVscCwgQVJHVFlQRV9TVFJJTkcsIHZhbHVlKTsKLX0KLQotdm9pZCBncHJfY21kbGluZV9vbl9leHRyYV9hcmcoCi0gICAgZ3ByX2NtZGxpbmUgKmNsLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpoZWxwLAotICAgIHZvaWQgKCpvbl9leHRyYV9hcmcpKHZvaWQgKnVzZXJfZGF0YSwgY29uc3QgY2hhciAqYXJnKSwgdm9pZCAqdXNlcl9kYXRhKSB7Ci0gIEdQUl9BU1NFUlQoIWNsLT5leHRyYV9hcmcpOwotICBHUFJfQVNTRVJUKG9uX2V4dHJhX2FyZyk7Ci0KLSAgY2wtPmV4dHJhX2FyZyA9IG9uX2V4dHJhX2FyZzsKLSAgY2wtPmV4dHJhX2FyZ191c2VyX2RhdGEgPSB1c2VyX2RhdGE7Ci0gIGNsLT5leHRyYV9hcmdfbmFtZSA9IG5hbWU7Ci0gIGNsLT5leHRyYV9hcmdfaGVscCA9IGhlbHA7Ci19Ci0KLS8qIHJlY3Vyc2l2ZWx5IGRlc2NlbmQgYXJndW1lbnQgbGlzdCwgYWRkaW5nIHRoZSBsYXN0IGVsZW1lbnQKLSAgIHRvIHMgZmlyc3QgLSBzbyB0aGF0IGFyZ3VtZW50cyBhcmUgYWRkZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZQotICAgYWRkZWQgdG8gdGhlIGxpc3QgYnkgYXBpIGNhbGxzICovCi1zdGF0aWMgdm9pZCBhZGRfYXJnc190b191c2FnZShncHJfc3RydmVjICpzLCBhcmcgKmEpIHsKLSAgY2hhciAqdG1wOwotCi0gIGlmICghYSkgcmV0dXJuOwotICBhZGRfYXJnc190b191c2FnZShzLCBhLT5uZXh0KTsKLQotICBzd2l0Y2ggKGEtPnR5cGUpIHsKLSAgICBjYXNlIEFSR1RZUEVfQk9PTDoKLSAgICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiIFstLSVzfC0tbm8tJXNdIiwgYS0+bmFtZSwgYS0+bmFtZSk7Ci0gICAgICBncHJfc3RydmVjX2FkZChzLCB0bXApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUkdUWVBFX1NUUklORzoKLSAgICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiIFstLSVzPXN0cmluZ10iLCBhLT5uYW1lKTsKLSAgICAgIGdwcl9zdHJ2ZWNfYWRkKHMsIHRtcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFSR1RZUEVfSU5UOgotICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICIgWy0tJXM9aW50XSIsIGEtPm5hbWUpOwotICAgICAgZ3ByX3N0cnZlY19hZGQocywgdG1wKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLWNoYXIgKmdwcl9jbWRsaW5lX3VzYWdlX3N0cmluZyhncHJfY21kbGluZSAqY2wsIGNvbnN0IGNoYXIgKmFyZ3YwKSB7Ci0gIC8qIFRPRE8oY3RpbGxlcik6IG1ha2UgdGhpcyBwcmV0dGllciAqLwotICBncHJfc3RydmVjIHM7Ci0gIGNoYXIgKnRtcDsKLSAgY29uc3QgY2hhciAqbmFtZSA9IHN0cnJjaHIoYXJndjAsICcvJyk7Ci0KLSAgaWYgKG5hbWUpIHsKLSAgICBuYW1lKys7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9IGFyZ3YwOwotICB9Ci0KLSAgZ3ByX3N0cnZlY19pbml0KCZzKTsKLQotICBncHJfYXNwcmludGYoJnRtcCwgIlVzYWdlOiAlcyIsIG5hbWUpOwotICBncHJfc3RydmVjX2FkZCgmcywgdG1wKTsKLSAgYWRkX2FyZ3NfdG9fdXNhZ2UoJnMsIGNsLT5hcmdzKTsKLSAgaWYgKGNsLT5leHRyYV9hcmcpIHsKLSAgICBncHJfYXNwcmludGYoJnRtcCwgIiBbJXMuLi5dIiwgY2wtPmV4dHJhX2FyZ19uYW1lKTsKLSAgICBncHJfc3RydmVjX2FkZCgmcywgdG1wKTsKLSAgfQotICBncHJfc3RydmVjX2FkZCgmcywgZ3ByX3N0cmR1cCgiXG4iKSk7Ci0KLSAgdG1wID0gZ3ByX3N0cnZlY19mbGF0dGVuKCZzLCBOVUxMKTsKLSAgZ3ByX3N0cnZlY19kZXN0cm95KCZzKTsKLSAgcmV0dXJuIHRtcDsKLX0KLQotc3RhdGljIGludCBwcmludF91c2FnZV9hbmRfZGllKGdwcl9jbWRsaW5lICpjbCkgewotICBjaGFyICp1c2FnZSA9IGdwcl9jbWRsaW5lX3VzYWdlX3N0cmluZyhjbCwgY2wtPmFyZ3YwKTsKLSAgZnByaW50ZihzdGRlcnIsICIlcyIsIHVzYWdlKTsKLSAgZ3ByX2ZyZWUodXNhZ2UpOwotICBpZiAoIWNsLT5zdXJ2aXZlX2ZhaWx1cmUpIHsKLSAgICBleGl0KDEpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dHJhX3N0YXRlKGdwcl9jbWRsaW5lICpjbCwgY2hhciAqc3RyKSB7Ci0gIGlmICghY2wtPmV4dHJhX2FyZykgewotICAgIHJldHVybiBwcmludF91c2FnZV9hbmRfZGllKGNsKTsKLSAgfQotICBjbC0+ZXh0cmFfYXJnKGNsLT5leHRyYV9hcmdfdXNlcl9kYXRhLCBzdHIpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGFyZyAqZmluZF9hcmcoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICpuYW1lKSB7Ci0gIGFyZyAqYTsKLQotICBmb3IgKGEgPSBjbC0+YXJnczsgYTsgYSA9IGEtPm5leHQpIHsKLSAgICBpZiAoMCA9PSBzdHJjbXAoYS0+bmFtZSwgbmFtZSkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmICghYSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBhcmd1bWVudDogJXNcbiIsIG5hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyBpbnQgdmFsdWVfc3RhdGUoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICpzdHIpIHsKLSAgbG9uZyBpbnR2YWw7Ci0gIGNoYXIgKmVuZDsKLQotICBHUFJfQVNTRVJUKGNsLT5jdXJfYXJnKTsKLQotICBzd2l0Y2ggKGNsLT5jdXJfYXJnLT50eXBlKSB7Ci0gICAgY2FzZSBBUkdUWVBFX0lOVDoKLSAgICAgIGludHZhbCA9IHN0cnRvbChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgfHwgaW50dmFsIDwgSU5UX01JTiB8fCBpbnR2YWwgPiBJTlRfTUFYKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXhwZWN0ZWQgaW50ZWdlciwgZ290ICclcycgZm9yICVzXG4iLCBzdHIsCi0gICAgICAgICAgICAgICAgY2wtPmN1cl9hcmctPm5hbWUpOwotICAgICAgICByZXR1cm4gcHJpbnRfdXNhZ2VfYW5kX2RpZShjbCk7Ci0gICAgICB9Ci0gICAgICAqKGludCAqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IChpbnQpaW50dmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUkdUWVBFX0JPT0w6Ci0gICAgICBpZiAoMCA9PSBzdHJjbXAoc3RyLCAiMSIpIHx8IDAgPT0gc3RyY21wKHN0ciwgInRydWUiKSkgewotICAgICAgICAqKGludCAqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKHN0ciwgIjAiKSB8fCAwID09IHN0cmNtcChzdHIsICJmYWxzZSIpKSB7Ci0gICAgICAgICooaW50ICopY2wtPmN1cl9hcmctPnZhbHVlID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXhwZWN0ZWQgYm9vbGVhbiwgZ290ICclcycgZm9yICVzXG4iLCBzdHIsCi0gICAgICAgICAgICAgICAgY2wtPmN1cl9hcmctPm5hbWUpOwotICAgICAgICByZXR1cm4gcHJpbnRfdXNhZ2VfYW5kX2RpZShjbCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFSR1RZUEVfU1RSSU5HOgotICAgICAgKihjaGFyICoqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IHN0cjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgY2wtPnN0YXRlID0gbm9ybWFsX3N0YXRlOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBub3JtYWxfc3RhdGUoZ3ByX2NtZGxpbmUgKmNsLCBjaGFyICpzdHIpIHsKLSAgY2hhciAqZXEgPSBOVUxMOwotICBjaGFyICp0bXAgPSBOVUxMOwotICBjaGFyICphcmdfbmFtZSA9IE5VTEw7Ci0gIGludCByID0gMTsKLQotICBpZiAoMCA9PSBzdHJjbXAoc3RyLCAiLWhlbHAiKSB8fCAwID09IHN0cmNtcChzdHIsICItLWhlbHAiKSB8fAotICAgICAgMCA9PSBzdHJjbXAoc3RyLCAiLWgiKSkgewotICAgIHJldHVybiBwcmludF91c2FnZV9hbmRfZGllKGNsKTsKLSAgfQotCi0gIGNsLT5jdXJfYXJnID0gTlVMTDsKLQotICBpZiAoc3RyWzBdID09ICctJykgewotICAgIGlmIChzdHJbMV0gPT0gJy0nKSB7Ci0gICAgICBpZiAoc3RyWzJdID09IDApIHsKLSAgICAgICAgLyogaGFuZGxlICctLScgdG8gbW92ZSB0byBqdXN0IGV4dHJhIGFyZ3MgKi8KLSAgICAgICAgY2wtPnN0YXRlID0gZXh0cmFfc3RhdGU7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgc3RyICs9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0ciArPSAxOwotICAgIH0KLSAgICAvKiBmaXJzdCBieXRlIG9mIHN0ciBpcyBub3cgcGFzdCB0aGUgbGVhZGluZyAnLScgb3IgJy0tJyAqLwotICAgIGlmIChzdHJbMF0gPT0gJ24nICYmIHN0clsxXSA9PSAnbycgJiYgc3RyWzJdID09ICctJykgewotICAgICAgLyogc3RyIGlzIG9mIHRoZSBmb3JtICctLW5vLWZvbycgLSBpdCdzIGEgZmxhZyBkaXNhYmxlICovCi0gICAgICBzdHIgKz0gMzsKLSAgICAgIGNsLT5jdXJfYXJnID0gZmluZF9hcmcoY2wsIHN0cik7Ci0gICAgICBpZiAoY2wtPmN1cl9hcmcgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gcHJpbnRfdXNhZ2VfYW5kX2RpZShjbCk7Ci0gICAgICB9Ci0gICAgICBpZiAoY2wtPmN1cl9hcmctPnR5cGUgIT0gQVJHVFlQRV9CT09MKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgaXMgbm90IGEgZmxhZyBhcmd1bWVudFxuIiwgc3RyKTsKLSAgICAgICAgcmV0dXJuIHByaW50X3VzYWdlX2FuZF9kaWUoY2wpOwotICAgICAgfQotICAgICAgKihpbnQgKiljbC0+Y3VyX2FyZy0+dmFsdWUgPSAwOwotICAgICAgcmV0dXJuIDE7IC8qIGVhcmx5IG91dCAqLwotICAgIH0KLSAgICBlcSA9IHN0cmNocihzdHIsICc9Jyk7Ci0gICAgaWYgKGVxICE9IE5VTEwpIHsKLSAgICAgIC8qIGNvcHkgdGhlIHN0cmluZyBpbnRvIGEgdGVtcCBidWZmZXIgYW5kIGV4dHJhY3QgdGhlIG5hbWUgKi8KLSAgICAgIHRtcCA9IGFyZ19uYW1lID0gZ3ByX21hbGxvYygoc2l6ZV90KShlcSAtIHN0ciArIDEpKTsKLSAgICAgIG1lbWNweShhcmdfbmFtZSwgc3RyLCAoc2l6ZV90KShlcSAtIHN0cikpOwotICAgICAgYXJnX25hbWVbZXEgLSBzdHJdID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgYXJnX25hbWUgPSBzdHI7Ci0gICAgfQotICAgIGNsLT5jdXJfYXJnID0gZmluZF9hcmcoY2wsIGFyZ19uYW1lKTsKLSAgICBpZiAoY2wtPmN1cl9hcmcgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIHByaW50X3VzYWdlX2FuZF9kaWUoY2wpOwotICAgIH0KLSAgICBpZiAoZXEgIT0gTlVMTCkgewotICAgICAgLyogc3RyIHdhcyBvZiB0aGUgdHlwZSAtLWZvbz12YWx1ZSwgcGFyc2UgdGhlIHZhbHVlICovCi0gICAgICByID0gdmFsdWVfc3RhdGUoY2wsIGVxICsgMSk7Ci0gICAgfSBlbHNlIGlmIChjbC0+Y3VyX2FyZy0+dHlwZSAhPSBBUkdUWVBFX0JPT0wpIHsKLSAgICAgIC8qIGZsYWcgdHlwZXMgZG9uJ3QgaGF2ZSBhICctLWZvbyB2YWx1ZScgdmFyaWFudCwgb3RoZXIgdHlwZXMgZG8gKi8KLSAgICAgIGNsLT5zdGF0ZSA9IHZhbHVlX3N0YXRlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBmbGFnIHBhcmFtZXRlcjoganVzdCBzZXQgdGhlIHZhbHVlICovCi0gICAgICAqKGludCAqKWNsLT5jdXJfYXJnLT52YWx1ZSA9IDE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHIgPSBleHRyYV9zdGF0ZShjbCwgc3RyKTsKLSAgfQotCi0gIGdwcl9mcmVlKHRtcCk7Ci0gIHJldHVybiByOwotfQotCi1pbnQgZ3ByX2NtZGxpbmVfcGFyc2UoZ3ByX2NtZGxpbmUgKmNsLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgaW50IGk7Ci0KLSAgR1BSX0FTU0VSVChhcmdjID49IDEpOwotICBjbC0+YXJndjAgPSBhcmd2WzBdOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBpZiAoIWNsLT5zdGF0ZShjbCwgYXJndltpXSkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvY3B1X2lwaG9uZS5jIGIvc3JjL2NvcmUvc3VwcG9ydC9jcHVfaXBob25lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjQ5YjQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9jcHVfaXBob25lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfQ1BVX0lQSE9ORQotCi0vKiBQcm9iYWJseSAyIGluc3RlYWQgb2YgMSwgYnV0IHNlZSBjb21tZW50IG9uIGdwcl9jcHVfY3VycmVudF9jcHUuICovCi11bnNpZ25lZCBncHJfY3B1X251bV9jb3Jlcyh2b2lkKSB7IHJldHVybiAxOyB9Ci0KLS8qIE1vc3QgY29kZSB0aGF0J3MgdXNpbmcgdGhpcyBpcyB1c2luZyBpdCB0byBzaGFyZCBhY3Jvc3Mgd29yayBxdWV1ZXMuIFNvCi0gICB1bmxlc3MgcHJvZmlsaW5nIHNob3dzIGl0J3MgYSBwcm9ibGVtIG9yIHRoZXJlIGFwcGVhcnMgYSB3YXkgdG8gZGV0ZWN0IHRoZQotICAgY3VycmVudGx5IHJ1bm5pbmcgQ1BVIGNvcmUsIGxldCdzIGhhdmUgaXQgc2hhcmQgdGhlIGRlZmF1bHQgd2F5LgotICAgTm90ZSB0aGF0IHRoZSBpbnRlcmZhY2UgaW4gY3B1LmggbGV0cyBncHJfY3B1X251bV9jb3JlcyByZXR1cm4gMCwgYnV0IGRvaW5nCi0gICBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciBncHJfY3B1X2N1cnJlbnRfY3B1IHRvIHNhdGlzZnkgaXRzIHN0YXRlZCByYW5nZSwKLSAgIGFuZCBzb21lIGNvZGUgbWlnaHQgYmUgcmVseWluZyBvbiBpdC4gKi8KLXVuc2lnbmVkIGdwcl9jcHVfY3VycmVudF9jcHUodm9pZCkgeyByZXR1cm4gMDsgfQotCi0jZW5kaWYgLyogR1BSX0NQVV9JUEhPTkUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvY3B1X3dpbmRvd3MuYyBiL3NyYy9jb3JlL3N1cHBvcnQvY3B1X3dpbmRvd3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMmViMC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2NwdV93aW5kb3dzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOMzIKLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLXVuc2lnbmVkIGdwcl9jcHVfbnVtX2NvcmVzKHZvaWQpIHsKLSAgU1lTVEVNX0lORk8gc2k7Ci0gIEdldFN5c3RlbUluZm8oJnNpKTsKLSAgcmV0dXJuIHNpLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOwotfQotCi11bnNpZ25lZCBncHJfY3B1X2N1cnJlbnRfY3B1KHZvaWQpIHsgcmV0dXJuIEdldEN1cnJlbnRQcm9jZXNzb3JOdW1iZXIoKTsgfQotCi0jZW5kaWYgLyogR1BSX1dJTjMyICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2Vudi5oIGIvc3JjL2NvcmUvc3VwcG9ydC9lbnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwMjQ1Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2Vudi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VQUE9SVF9FTlZfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9FTlZfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEVudiB1dGlsaXR5IGZ1bmN0aW9ucyAqLwotCi0vKiBHZXRzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgIFJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nLiBJdCBpcyB0aGUgcmVzcG9uc2FiaWxpdHkgb2YgdGhlIGNhbGxlciB0bwotICAgZ3ByX2ZyZWUgdGhlIHJldHVybiB2YWx1ZSBpZiBub3QgTlVMTCAod2hpY2ggbWVhbnMgdGhhdCB0aGUgZW52aXJvbm1lbnQKLSAgIHZhcmlhYmxlIGV4aXN0cykuICovCi1jaGFyICpncHJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpOwotCi0vKiBTZXRzIHRoZSB0aGUgZW52aXJvbm1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gKi8KLXZvaWQgZ3ByX3NldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VQUE9SVF9FTlZfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9lbnZfbGludXguYyBiL3NyYy9jb3JlL3N1cHBvcnQvZW52X2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTFmODQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9lbnZfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLS8qIGZvciBzZWN1cmVfZ2V0ZW52LiAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX0xJTlVYX0VOVgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1jaGFyICpncHJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpIHsKLSNpZiBkZWZpbmVkKEdQUl9CQUNLV0FSRFNfQ09NUEFUSUJJTElUWV9NT0RFKQotICB0eXBlZGVmIGNoYXIgKigqZ2V0ZW52X3R5cGUpKGNvbnN0IGNoYXIgKik7Ci0gIHN0YXRpYyBnZXRlbnZfdHlwZSBnZXRlbnZfZnVuYyA9IE5VTEw7Ci0gIC8qIENoZWNrIHRvIHNlZSB3aGljaCBnZXRlbnYgdmFyaWFudCBpcyBzdXBwb3J0ZWQgKGdvIGZyb20gbW9zdAotICAgKiB0byBsZWFzdCBzZWN1cmUpICovCi0gIGNvbnN0IGNoYXIgKm5hbWVzW10gPSB7InNlY3VyZV9nZXRlbnYiLCAiX19zZWN1cmVfZ2V0ZW52IiwgImdldGVudiJ9OwotICBmb3IgKHNpemVfdCBpID0gMDsgZ2V0ZW52X2Z1bmMgPT0gTlVMTCAmJiBpIDwgR1BSX0FSUkFZX1NJWkUobmFtZXMpOyBpKyspIHsKLSAgICBnZXRlbnZfZnVuYyA9IChnZXRlbnZfdHlwZSlkbHN5bShSVExEX0RFRkFVTFQsIG5hbWVzW2ldKTsKLSAgICBpZiAoZ2V0ZW52X2Z1bmMgIT0gTlVMTCAmJiBzdHJzdHIobmFtZXNbaV0sICJzZWN1cmUiKSA9PSBOVUxMKSB7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywKLSAgICAgICAgICAgICAgIldhcm5pbmc6IGluc2VjdXJlIGVudmlyb25tZW50IHJlYWQgZnVuY3Rpb24gJyVzJyB1c2VkIiwKLSAgICAgICAgICAgICAgbmFtZXNbaV0pOwotICAgIH0KLSAgfQotICBjaGFyICpyZXN1bHQgPSBnZXRlbnZfZnVuYyhuYW1lKTsKLSAgcmV0dXJuIHJlc3VsdCA9PSBOVUxMID8gcmVzdWx0IDogZ3ByX3N0cmR1cChyZXN1bHQpOwotI2VsaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDE3KQotICBjaGFyICpyZXN1bHQgPSBzZWN1cmVfZ2V0ZW52KG5hbWUpOwotICByZXR1cm4gcmVzdWx0ID09IE5VTEwgPyByZXN1bHQgOiBncHJfc3RyZHVwKHJlc3VsdCk7Ci0jZWxzZQotICBncHJfbG9nKEdQUl9ERUJVRywgIldhcm5pbmc6IGluc2VjdXJlIGVudmlyb25tZW50IHJlYWQgZnVuY3Rpb24gJyVzJyB1c2VkIiwKLSAgICAgICAgICAiZ2V0ZW52Iik7Ci0gIGNoYXIgKnJlc3VsdCA9IGdldGVudihuYW1lKTsKLSAgcmV0dXJuIHJlc3VsdCA9PSBOVUxMID8gcmVzdWx0IDogZ3ByX3N0cmR1cChyZXN1bHQpOwotI2VuZGlmCi19Ci0KLXZvaWQgZ3ByX3NldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkgewotICBpbnQgcmVzID0gc2V0ZW52KG5hbWUsIHZhbHVlLCAxKTsKLSAgR1BSX0FTU0VSVChyZXMgPT0gMCk7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfTElOVVhfRU5WICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2Vudl9wb3NpeC5jIGIvc3JjL2NvcmUvc3VwcG9ydC9lbnZfcG9zaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2MjEyYi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2Vudl9wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfRU5WCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1jaGFyICpncHJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgY2hhciAqcmVzdWx0ID0gZ2V0ZW52KG5hbWUpOwotICByZXR1cm4gcmVzdWx0ID09IE5VTEwgPyByZXN1bHQgOiBncHJfc3RyZHVwKHJlc3VsdCk7Ci19Ci0KLXZvaWQgZ3ByX3NldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkgewotICBpbnQgcmVzID0gc2V0ZW52KG5hbWUsIHZhbHVlLCAxKTsKLSAgR1BSX0FTU0VSVChyZXMgPT0gMCk7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfUE9TSVhfRU5WICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jIGIvc3JjL2NvcmUvc3VwcG9ydC9lbnZfd2luMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyNTgyOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2Vudl93aW4zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOMzIKLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotI2lmZGVmIF9fTUlOR1czMl9fCi1lcnJub190IGdldGVudl9zKHNpemVfdCAqc2l6ZV9uZWVkZWQsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcm5hbWUpOwotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotCi1jaGFyICpncHJfZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKnJlc3VsdCA9IE5VTEw7Ci0gIGVycm5vX3QgZXJyOwotCi0gIGVyciA9IGdldGVudl9zKCZzaXplLCBOVUxMLCAwLCBuYW1lKTsKLSAgaWYgKGVyciB8fCAoc2l6ZSA9PSAwKSkgcmV0dXJuIE5VTEw7Ci0gIHJlc3VsdCA9IGdwcl9tYWxsb2Moc2l6ZSk7Ci0gIGVyciA9IGdldGVudl9zKCZzaXplLCByZXN1bHQsIHNpemUsIG5hbWUpOwotICBpZiAoZXJyKSB7Ci0gICAgZ3ByX2ZyZWUocmVzdWx0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIGdwcl9zZXRlbnYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpIHsKLSAgZXJybm9fdCByZXMgPSBfcHV0ZW52X3MobmFtZSwgdmFsdWUpOwotICBHUFJfQVNTRVJUKHJlcyA9PSAwKTsKLX0KLQotI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYyBiL3NyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjQzYTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotaW50IGdwcl9qb2luX2hvc3RfcG9ydChjaGFyICoqb3V0LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkgewotICBpZiAoaG9zdFswXSAhPSAnWycgJiYgc3RyY2hyKGhvc3QsICc6JykgIT0gTlVMTCkgewotICAgIC8qIElQdjYgbGl0ZXJhbHMgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFja2V0cy4gKi8KLSAgICByZXR1cm4gZ3ByX2FzcHJpbnRmKG91dCwgIlslc106JWQiLCBob3N0LCBwb3J0KTsKLSAgfSBlbHNlIHsKLSAgICAvKiBPcmRpbmFyeSBub24tYnJhY2tldGVkIGhvc3Q6cG9ydC4gKi8KLSAgICByZXR1cm4gZ3ByX2FzcHJpbnRmKG91dCwgIiVzOiVkIiwgaG9zdCwgcG9ydCk7Ci0gIH0KLX0KLQotaW50IGdwcl9zcGxpdF9ob3N0X3BvcnQoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKmhvc3QsIGNoYXIgKipwb3J0KSB7Ci0gIGNvbnN0IGNoYXIgKmhvc3Rfc3RhcnQ7Ci0gIHNpemVfdCBob3N0X2xlbjsKLSAgY29uc3QgY2hhciAqcG9ydF9zdGFydDsKLQotICAqaG9zdCA9IE5VTEw7Ci0gICpwb3J0ID0gTlVMTDsKLQotICBpZiAobmFtZVswXSA9PSAnWycpIHsKLSAgICAvKiBQYXJzZSBhIGJyYWNrZXRlZCBob3N0LCB0eXBpY2FsbHkgYW4gSVB2NiBsaXRlcmFsLiAqLwotICAgIGNvbnN0IGNoYXIgKnJicmFja2V0ID0gc3RyY2hyKG5hbWUsICddJyk7Ci0gICAgaWYgKHJicmFja2V0ID09IE5VTEwpIHsKLSAgICAgIC8qIFVubWF0Y2hlZCBbICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHJicmFja2V0WzFdID09ICdcMCcpIHsKLSAgICAgIC8qIF08ZW5kPiAqLwotICAgICAgcG9ydF9zdGFydCA9IE5VTEw7Ci0gICAgfSBlbHNlIGlmIChyYnJhY2tldFsxXSA9PSAnOicpIHsKLSAgICAgIC8qIF06PHBvcnQ/PiAqLwotICAgICAgcG9ydF9zdGFydCA9IHJicmFja2V0ICsgMjsKLSAgICB9IGVsc2UgewotICAgICAgLyogXTxpbnZhbGlkPiAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGhvc3Rfc3RhcnQgPSBuYW1lICsgMTsKLSAgICBob3N0X2xlbiA9IChzaXplX3QpKHJicmFja2V0IC0gaG9zdF9zdGFydCk7Ci0gICAgaWYgKG1lbWNocihob3N0X3N0YXJ0LCAnOicsIGhvc3RfbGVuKSA9PSBOVUxMKSB7Ci0gICAgICAvKiBSZXF1aXJlIGFsbCBicmFja2V0ZWQgaG9zdHMgdG8gY29udGFpbiBhIGNvbG9uLCBiZWNhdXNlIGEgaG9zdG5hbWUgb3IKLSAgICAgICAgIElQdjQgYWRkcmVzcyBzaG91bGQgbmV2ZXIgdXNlIGJyYWNrZXRzLiAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvbnN0IGNoYXIgKmNvbG9uID0gc3RyY2hyKG5hbWUsICc6Jyk7Ci0gICAgaWYgKGNvbG9uICE9IE5VTEwgJiYgc3RyY2hyKGNvbG9uICsgMSwgJzonKSA9PSBOVUxMKSB7Ci0gICAgICAvKiBFeGFjdGx5IDEgY29sb24uICBTcGxpdCBpbnRvIGhvc3Q6cG9ydC4gKi8KLSAgICAgIGhvc3Rfc3RhcnQgPSBuYW1lOwotICAgICAgaG9zdF9sZW4gPSAoc2l6ZV90KShjb2xvbiAtIG5hbWUpOwotICAgICAgcG9ydF9zdGFydCA9IGNvbG9uICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgLyogMCBvciAyKyBjb2xvbnMuICBCYXJlIGhvc3RuYW1lIG9yIElQdjYgbGl0ZWFyYWwuICovCi0gICAgICBob3N0X3N0YXJ0ID0gbmFtZTsKLSAgICAgIGhvc3RfbGVuID0gc3RybGVuKG5hbWUpOwotICAgICAgcG9ydF9zdGFydCA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgLyogQWxsb2NhdGUgcmV0dXJuIHZhbHVlcy4gKi8KLSAgKmhvc3QgPSBncHJfbWFsbG9jKGhvc3RfbGVuICsgMSk7Ci0gIG1lbWNweSgqaG9zdCwgaG9zdF9zdGFydCwgaG9zdF9sZW4pOwotICAoKmhvc3QpW2hvc3RfbGVuXSA9ICdcMCc7Ci0KLSAgaWYgKHBvcnRfc3RhcnQgIT0gTlVMTCkgewotICAgICpwb3J0ID0gZ3ByX3N0cmR1cChwb3J0X3N0YXJ0KTsKLSAgfQotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuYyBiL3NyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MGJkNjIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1ncHJfc2xpY2UgZ3ByX2xvYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGFkZF9udWxsX3Rlcm1pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN1Y2Nlc3MpIHsKLSAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBOVUxMOwotICBzaXplX3QgY29udGVudHNfc2l6ZSA9IDA7Ci0gIGNoYXIgKmVycm9yX21zZyA9IE5VTEw7Ci0gIGdwcl9zbGljZSByZXN1bHQgPSBncHJfZW1wdHlfc2xpY2UoKTsKLSAgRklMRSAqZmlsZTsKLSAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOwotCi0gIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047Ci0gIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICBncHJfYXNwcmludGYoJmVycm9yX21zZywgIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMgKGVycm9yID0gJXMpLiIsIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIEdQUl9BU1NFUlQoZXJyb3JfbXNnICE9IE5VTEwpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKLSAgLyogQ29udmVydGluZyB0byBzaXplX3Qgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBpdCB3aWxsIG5vdCBmYWlsICovCi0gIGNvbnRlbnRzX3NpemUgPSAoc2l6ZV90KWZ0ZWxsKGZpbGUpOwotICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7Ci0gIGNvbnRlbnRzID0gZ3ByX21hbGxvYyhjb250ZW50c19zaXplICsgKGFkZF9udWxsX3Rlcm1pbmF0b3IgPyAxIDogMCkpOwotICBieXRlc19yZWFkID0gZnJlYWQoY29udGVudHMsIDEsIGNvbnRlbnRzX3NpemUsIGZpbGUpOwotICBpZiAoYnl0ZXNfcmVhZCA8IGNvbnRlbnRzX3NpemUpIHsKLSAgICBHUFJfQVNTRVJUKGZlcnJvcihmaWxlKSk7Ci0gICAgZ3ByX2FzcHJpbnRmKCZlcnJvcl9tc2csICJFcnJvciAlcyBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgZmlsZSAlcy4iLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubyksIGZpbGVuYW1lKTsKLSAgICBHUFJfQVNTRVJUKGVycm9yX21zZyAhPSBOVUxMKTsKLSAgICBnb3RvIGVuZDsKLSAgfQotICBpZiAoc3VjY2VzcyAhPSBOVUxMKSAqc3VjY2VzcyA9IDE7Ci0gIGlmIChhZGRfbnVsbF90ZXJtaW5hdG9yKSB7Ci0gICAgY29udGVudHNbY29udGVudHNfc2l6ZSsrXSA9IDA7Ci0gIH0KLSAgcmVzdWx0ID0gZ3ByX3NsaWNlX25ldyhjb250ZW50cywgY29udGVudHNfc2l6ZSwgZ3ByX2ZyZWUpOwotCi1lbmQ6Ci0gIGlmIChlcnJvcl9tc2cgIT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMiLCBlcnJvcl9tc2cpOwotICAgIGdwcl9mcmVlKGVycm9yX21zZyk7Ci0gICAgaWYgKHN1Y2Nlc3MgIT0gTlVMTCkgKnN1Y2Nlc3MgPSAwOwotICB9Ci0gIGlmIChmaWxlICE9IE5VTEwpIGZjbG9zZShmaWxlKTsKLSAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047Ci0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIGIvc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5NjY1NC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VQUE9SVF9MT0FEX0ZJTEVfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9MT0FEX0ZJTEVfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIExvYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBpbnRvIGEgc2xpY2UuIGFkZF9udWxsX3Rlcm1pbmF0b3Igd2lsbCBhZGQKLSAgIGEgTlVMTCB0ZXJtaW5hdG9yIGlmIG5vbi16ZXJvLiBUaGUgc3VjY2VzcyBwYXJhbWV0ZXIsIGlmIG5vdCBOVUxMLAotICAgd2lsbCBiZSBzZXQgdG8gMSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIDAgaW4gY2FzZSBvZiBmYWlsdXJlLiAqLwotZ3ByX3NsaWNlIGdwcl9sb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBhZGRfbnVsbF90ZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzdWNjZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVBQT1JUX0xPQURfRklMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2xvZy5jIGIvc3JjL2NvcmUvc3VwcG9ydC9sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxNTZhNS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2xvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWV4dGVybiB2b2lkIGdwcl9kZWZhdWx0X2xvZyhncHJfbG9nX2Z1bmNfYXJncyAqYXJncyk7Ci1zdGF0aWMgZ3ByX2xvZ19mdW5jIGdfbG9nX2Z1bmMgPSBncHJfZGVmYXVsdF9sb2c7Ci0KLWNvbnN0IGNoYXIgKmdwcl9sb2dfc2V2ZXJpdHlfc3RyaW5nKGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHkpIHsKLSAgc3dpdGNoIChzZXZlcml0eSkgewotICAgIGNhc2UgR1BSX0xPR19TRVZFUklUWV9ERUJVRzoKLSAgICAgIHJldHVybiAiRCI7Ci0gICAgY2FzZSBHUFJfTE9HX1NFVkVSSVRZX0lORk86Ci0gICAgICByZXR1cm4gIkkiOwotICAgIGNhc2UgR1BSX0xPR19TRVZFUklUWV9FUlJPUjoKLSAgICAgIHJldHVybiAiRSI7Ci0gIH0KLSAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICJVTktOT1dOIik7Ci19Ci0KLXZvaWQgZ3ByX2xvZ19tZXNzYWdlKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBncHJfbG9nX3NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkgewotICBncHJfbG9nX2Z1bmNfYXJncyBsZmFyZ3M7Ci0gIG1lbXNldCgmbGZhcmdzLCAwLCBzaXplb2YobGZhcmdzKSk7Ci0gIGxmYXJncy5maWxlID0gZmlsZTsKLSAgbGZhcmdzLmxpbmUgPSBsaW5lOwotICBsZmFyZ3Muc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgbGZhcmdzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICBnX2xvZ19mdW5jKCZsZmFyZ3MpOwotfQotCi12b2lkIGdwcl9zZXRfbG9nX2Z1bmN0aW9uKGdwcl9sb2dfZnVuYyBmKSB7IGdfbG9nX2Z1bmMgPSBmOyB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L2xvZ193aW4zMi5jIGIvc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllYzA5MS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L2xvZ193aW4zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1dJTjMyCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2dfd2luMzIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oIgotCi12b2lkIGdwcl9sb2coY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKLSAgY2hhciAqbWVzc2FnZSA9IE5VTEw7Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldDsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGxlbmd0aC4gKi8KLSAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgcmV0ID0gX3ZzY3ByaW50Zihmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgbWVzc2FnZSA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyLCB3aXRoIHNwYWNlIGZvciB0aGUgTlVMIHRlcm1pbmF0b3IuICovCi0gICAgc2l6ZV90IHN0cnBfYnVmbGVuID0gKHNpemVfdClyZXQgKyAxOwotICAgIG1lc3NhZ2UgPSBncHJfbWFsbG9jKHN0cnBfYnVmbGVuKTsKLQotICAgIC8qIFByaW50IHRvIHRoZSBidWZmZXIuICovCi0gICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgICByZXQgPSB2c25wcmludGZfcyhtZXNzYWdlLCBzdHJwX2J1ZmxlbiwgX1RSVU5DQVRFLCBmb3JtYXQsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLSAgICBpZiAoKHNpemVfdClyZXQgIT0gc3RycF9idWZsZW4gLSAxKSB7Ci0gICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCi0gICAgICBncHJfZnJlZShtZXNzYWdlKTsKLSAgICAgIG1lc3NhZ2UgPSBOVUxMOwotICAgIH0KLSAgfQotCi0gIGdwcl9sb2dfbWVzc2FnZShmaWxlLCBsaW5lLCBzZXZlcml0eSwgbWVzc2FnZSk7Ci0gIGdwcl9mcmVlKG1lc3NhZ2UpOwotfQotCi0vKiBTaW1wbGUgc3RhcnRlciBpbXBsZW1lbnRhdGlvbiAqLwotdm9pZCBncHJfZGVmYXVsdF9sb2coZ3ByX2xvZ19mdW5jX2FyZ3MgKmFyZ3MpIHsKLSAgY2hhciAqZmluYWxfc2xhc2g7Ci0gIGNvbnN0IGNoYXIgKmRpc3BsYXlfZmlsZTsKLSAgY2hhciB0aW1lX2J1ZmZlcls2NF07Ci0gIHRpbWVfdCB0aW1lcjsKLSAgZ3ByX3RpbWVzcGVjIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgc3RydWN0IHRtIHRtOwotCi0gIHRpbWVyID0gKHRpbWVfdClub3cudHZfc2VjOwotICBmaW5hbF9zbGFzaCA9IHN0cnJjaHIoYXJncy0+ZmlsZSwgJ1xcJyk7Ci0gIGlmIChmaW5hbF9zbGFzaCA9PSBOVUxMKQotICAgIGRpc3BsYXlfZmlsZSA9IGFyZ3MtPmZpbGU7Ci0gIGVsc2UKLSAgICBkaXNwbGF5X2ZpbGUgPSBmaW5hbF9zbGFzaCArIDE7Ci0KLSAgaWYgKGxvY2FsdGltZV9zKCZ0bSwgJnRpbWVyKSkgewotICAgIHN0cmNweSh0aW1lX2J1ZmZlciwgImVycm9yOmxvY2FsdGltZSIpOwotICB9IGVsc2UgaWYgKDAgPT0KLSAgICAgICAgICAgICBzdHJmdGltZSh0aW1lX2J1ZmZlciwgc2l6ZW9mKHRpbWVfYnVmZmVyKSwgIiVtJWQgJUg6JU06JVMiLCAmdG0pKSB7Ci0gICAgc3RyY3B5KHRpbWVfYnVmZmVyLCAiZXJyb3I6c3RyZnRpbWUiKTsKLSAgfQotCi0gIGZwcmludGYoc3RkZXJyLCAiJXMlcy4lMDl1ICU1bHUgJXM6JWRdICVzXG4iLAotICAgICAgICAgIGdwcl9sb2dfc2V2ZXJpdHlfc3RyaW5nKGFyZ3MtPnNldmVyaXR5KSwgdGltZV9idWZmZXIsCi0gICAgICAgICAgKGludCkobm93LnR2X25zZWMpLCBHZXRDdXJyZW50VGhyZWFkSWQoKSwgZGlzcGxheV9maWxlLCBhcmdzLT5saW5lLAotICAgICAgICAgIGFyZ3MtPm1lc3NhZ2UpOwotICBmZmx1c2goc3RkZXJyKTsKLX0KLQotY2hhciAqZ3ByX2Zvcm1hdF9tZXNzYWdlKGludCBtZXNzYWdlaWQpIHsKLSAgTFBUU1RSIHRtZXNzYWdlOwotICBjaGFyICptZXNzYWdlOwotICBEV09SRCBzdGF0dXMgPSBGb3JtYXRNZXNzYWdlKAotICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAotICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAotICAgICAgTlVMTCwgKERXT1JEKW1lc3NhZ2VpZCwgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCi0gICAgICAoTFBUU1RSKSgmdG1lc3NhZ2UpLCAwLCBOVUxMKTsKLSAgaWYgKHN0YXR1cyA9PSAwKSByZXR1cm4gZ3ByX3N0cmR1cCgiVW5hYmxlIHRvIHJldHJpZXZlIGVycm9yIHN0cmluZyIpOwotICBtZXNzYWdlID0gZ3ByX3RjaGFyX3RvX2NoYXIodG1lc3NhZ2UpOwotICBMb2NhbEZyZWUodG1lc3NhZ2UpOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5jIGIvc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI2MWMwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIgotCi0jZGVmaW5lIFJPVEwzMih4LCByKSAoKHgpIDw8IChyKSkgfCAoKHgpID4+ICgzMiAtIChyKSkpCi0KLSNkZWZpbmUgRk1JWDMyKGgpICAgIFwKLSAgKGgpIF49IChoKSA+PiAxNjsgIFwKLSAgKGgpICo9IDB4ODVlYmNhNmI7IFwKLSAgKGgpIF49IChoKSA+PiAxMzsgIFwKLSAgKGgpICo9IDB4YzJiMmFlMzU7IFwKLSAgKGgpIF49IChoKSA+PiAxNjsKLQotLyogQmxvY2sgcmVhZCAtIGlmIHlvdXIgcGxhdGZvcm0gbmVlZHMgdG8gZG8gZW5kaWFuLXN3YXBwaW5nIG9yIGNhbiBvbmx5Ci0gICBoYW5kbGUgYWxpZ25lZCByZWFkcywgZG8gdGhlIGNvbnZlcnNpb24gaGVyZSAqLwotI2RlZmluZSBHRVRCTE9DSzMyKHAsIGkpIChwKVsoaSldCi0KLXVpbnQzMl90IGdwcl9tdXJtdXJfaGFzaDMoY29uc3Qgdm9pZCAqa2V5LCBzaXplX3QgbGVuLCB1aW50MzJfdCBzZWVkKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKWtleTsKLSAgY29uc3Qgc2l6ZV90IG5ibG9ja3MgPSBsZW4gLyA0OwotICBpbnQgaTsKLQotICB1aW50MzJfdCBoMSA9IHNlZWQ7Ci0gIHVpbnQzMl90IGsxOwotCi0gIGNvbnN0IHVpbnQzMl90IGMxID0gMHhjYzllMmQ1MTsKLSAgY29uc3QgdWludDMyX3QgYzIgPSAweDFiODczNTkzOwotCi0gIGNvbnN0IHVpbnQzMl90ICpibG9ja3MgPSAoKGNvbnN0IHVpbnQzMl90ICopa2V5KSArIG5ibG9ja3M7Ci0gIGNvbnN0IHVpbnQ4X3QgKnRhaWwgPSAoY29uc3QgdWludDhfdCAqKShkYXRhICsgbmJsb2NrcyAqIDQpOwotCi0gIC8qIGJvZHkgKi8KLSAgZm9yIChpID0gLShpbnQpbmJsb2NrczsgaTsgaSsrKSB7Ci0gICAgazEgPSBHRVRCTE9DSzMyKGJsb2NrcywgaSk7Ci0KLSAgICBrMSAqPSBjMTsKLSAgICBrMSA9IFJPVEwzMihrMSwgMTUpOwotICAgIGsxICo9IGMyOwotCi0gICAgaDEgXj0gazE7Ci0gICAgaDEgPSBST1RMMzIoaDEsIDEzKTsKLSAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7Ci0gIH0KLQotICBrMSA9IDA7Ci0KLSAgLyogdGFpbCAqLwotICBzd2l0Y2ggKGxlbiAmIDMpIHsKLSAgICBjYXNlIDM6Ci0gICAgICBrMSBePSAoKHVpbnQzMl90KXRhaWxbMl0pIDw8IDE2OwotICAgIGNhc2UgMjoKLSAgICAgIGsxIF49ICgodWludDMyX3QpdGFpbFsxXSkgPDwgODsKLSAgICBjYXNlIDE6Ci0gICAgICBrMSBePSB0YWlsWzBdOwotICAgICAgazEgKj0gYzE7Ci0gICAgICBrMSA9IFJPVEwzMihrMSwgMTUpOwotICAgICAgazEgKj0gYzI7Ci0gICAgICBoMSBePSBrMTsKLSAgfTsKLQotICAvKiBmaW5hbGl6YXRpb24gKi8KLSAgaDEgXj0gKHVpbnQzMl90KWxlbjsKLSAgRk1JWDMyKGgxKTsKLSAgcmV0dXJuIGgxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIGIvc3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjBiMzk5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NVUFBPUlRfTVVSTVVSX0hBU0hfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9NVVJNVVJfSEFTSF9ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIGNvbXB1dGUgdGhlIGhhc2ggb2Yga2V5IChsZW5ndGggbGVuKSAqLwotdWludDMyX3QgZ3ByX211cm11cl9oYXNoMyhjb25zdCB2b2lkICprZXksIHNpemVfdCBsZW4sIHVpbnQzMl90IHNlZWQpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUFBPUlRfTVVSTVVSX0hBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jIGIvc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWE3Yzc3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvc2xpY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1ncHJfc2xpY2UgZ3ByX2VtcHR5X3NsaWNlKHZvaWQpIHsKLSAgZ3ByX3NsaWNlIG91dDsKLSAgb3V0LnJlZmNvdW50ID0gMDsKLSAgb3V0LmRhdGEuaW5saW5lZC5sZW5ndGggPSAwOwotICByZXR1cm4gb3V0OwotfQotCi1ncHJfc2xpY2UgZ3ByX3NsaWNlX3JlZihncHJfc2xpY2Ugc2xpY2UpIHsKLSAgaWYgKHNsaWNlLnJlZmNvdW50KSB7Ci0gICAgc2xpY2UucmVmY291bnQtPnJlZihzbGljZS5yZWZjb3VudCk7Ci0gIH0KLSAgcmV0dXJuIHNsaWNlOwotfQotCi12b2lkIGdwcl9zbGljZV91bnJlZihncHJfc2xpY2Ugc2xpY2UpIHsKLSAgaWYgKHNsaWNlLnJlZmNvdW50KSB7Ci0gICAgc2xpY2UucmVmY291bnQtPnVucmVmKHNsaWNlLnJlZmNvdW50KTsKLSAgfQotfQotCi0vKiBncHJfc2xpY2VfZnJvbV9zdGF0aWNfc3RyaW5nIHN1cHBvcnQgc3RydWN0dXJlIC0gYSByZWZjb3VudCB0aGF0IGRvZXMKLSAgIG5vdGhpbmcgKi8KLXN0YXRpYyB2b2lkIG5vb3BfcmVmX29yX3VucmVmKHZvaWQgKnVudXNlZCkge30KLQotc3RhdGljIGdwcl9zbGljZV9yZWZjb3VudCBub29wX3JlZmNvdW50ID0ge25vb3BfcmVmX29yX3VucmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb3BfcmVmX29yX3VucmVmfTsKLQotZ3ByX3NsaWNlIGdwcl9zbGljZV9mcm9tX3N0YXRpY19zdHJpbmcoY29uc3QgY2hhciAqcykgewotICBncHJfc2xpY2Ugc2xpY2U7Ci0gIHNsaWNlLnJlZmNvdW50ID0gJm5vb3BfcmVmY291bnQ7Ci0gIHNsaWNlLmRhdGEucmVmY291bnRlZC5ieXRlcyA9ICh1aW50OF90ICopczsKLSAgc2xpY2UuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA9IHN0cmxlbihzKTsKLSAgcmV0dXJuIHNsaWNlOwotfQotCi0vKiBncHJfc2xpY2VfbmV3IHN1cHBvcnQgc3RydWN0dXJlcyAtIHdlIGNyZWF0ZSBhIHJlZmNvdW50IG9iamVjdCBleHRlbmRlZAotICAgd2l0aCB0aGUgdXNlciBwcm92aWRlZCBkYXRhIHBvaW50ZXIgJiBkZXN0cm95IGZ1bmN0aW9uICovCi10eXBlZGVmIHN0cnVjdCBuZXdfc2xpY2VfcmVmY291bnQgewotICBncHJfc2xpY2VfcmVmY291bnQgcmM7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotICB2b2lkICgqdXNlcl9kZXN0cm95KSh2b2lkICopOwotICB2b2lkICp1c2VyX2RhdGE7Ci19IG5ld19zbGljZV9yZWZjb3VudDsKLQotc3RhdGljIHZvaWQgbmV3X3NsaWNlX3JlZih2b2lkICpwKSB7Ci0gIG5ld19zbGljZV9yZWZjb3VudCAqciA9IHA7Ci0gIGdwcl9yZWYoJnItPnJlZnMpOwotfQotCi1zdGF0aWMgdm9pZCBuZXdfc2xpY2VfdW5yZWYodm9pZCAqcCkgewotICBuZXdfc2xpY2VfcmVmY291bnQgKnIgPSBwOwotICBpZiAoZ3ByX3VucmVmKCZyLT5yZWZzKSkgewotICAgIHItPnVzZXJfZGVzdHJveShyLT51c2VyX2RhdGEpOwotICAgIGdwcl9mcmVlKHIpOwotICB9Ci19Ci0KLWdwcl9zbGljZSBncHJfc2xpY2VfbmV3KHZvaWQgKnAsIHNpemVfdCBsZW4sIHZvaWQgKCpkZXN0cm95KSh2b2lkICopKSB7Ci0gIGdwcl9zbGljZSBzbGljZTsKLSAgbmV3X3NsaWNlX3JlZmNvdW50ICpyYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKG5ld19zbGljZV9yZWZjb3VudCkpOwotICBncHJfcmVmX2luaXQoJnJjLT5yZWZzLCAxKTsKLSAgcmMtPnJjLnJlZiA9IG5ld19zbGljZV9yZWY7Ci0gIHJjLT5yYy51bnJlZiA9IG5ld19zbGljZV91bnJlZjsKLSAgcmMtPnVzZXJfZGVzdHJveSA9IGRlc3Ryb3k7Ci0gIHJjLT51c2VyX2RhdGEgPSBwOwotCi0gIHNsaWNlLnJlZmNvdW50ID0gJnJjLT5yYzsKLSAgc2xpY2UuZGF0YS5yZWZjb3VudGVkLmJ5dGVzID0gcDsKLSAgc2xpY2UuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA9IGxlbjsKLSAgcmV0dXJuIHNsaWNlOwotfQotCi0vKiBncHJfc2xpY2VfbmV3X3dpdGhfbGVuIHN1cHBvcnQgc3RydWN0dXJlcyAtIHdlIGNyZWF0ZSBhIHJlZmNvdW50IG9iamVjdAotICAgZXh0ZW5kZWQgd2l0aCB0aGUgdXNlciBwcm92aWRlZCBkYXRhIHBvaW50ZXIgJiBkZXN0cm95IGZ1bmN0aW9uICovCi10eXBlZGVmIHN0cnVjdCBuZXdfd2l0aF9sZW5fc2xpY2VfcmVmY291bnQgewotICBncHJfc2xpY2VfcmVmY291bnQgcmM7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotICB2b2lkICp1c2VyX2RhdGE7Ci0gIHNpemVfdCB1c2VyX2xlbmd0aDsKLSAgdm9pZCAoKnVzZXJfZGVzdHJveSkodm9pZCAqLCBzaXplX3QpOwotfSBuZXdfd2l0aF9sZW5fc2xpY2VfcmVmY291bnQ7Ci0KLXN0YXRpYyB2b2lkIG5ld193aXRoX2xlbl9yZWYodm9pZCAqcCkgewotICBuZXdfd2l0aF9sZW5fc2xpY2VfcmVmY291bnQgKnIgPSBwOwotICBncHJfcmVmKCZyLT5yZWZzKTsKLX0KLQotc3RhdGljIHZvaWQgbmV3X3dpdGhfbGVuX3VucmVmKHZvaWQgKnApIHsKLSAgbmV3X3dpdGhfbGVuX3NsaWNlX3JlZmNvdW50ICpyID0gcDsKLSAgaWYgKGdwcl91bnJlZigmci0+cmVmcykpIHsKLSAgICByLT51c2VyX2Rlc3Ryb3koci0+dXNlcl9kYXRhLCByLT51c2VyX2xlbmd0aCk7Ci0gICAgZ3ByX2ZyZWUocik7Ci0gIH0KLX0KLQotZ3ByX3NsaWNlIGdwcl9zbGljZV9uZXdfd2l0aF9sZW4odm9pZCAqcCwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cm95KSh2b2lkICosIHNpemVfdCkpIHsKLSAgZ3ByX3NsaWNlIHNsaWNlOwotICBuZXdfd2l0aF9sZW5fc2xpY2VfcmVmY291bnQgKnJjID0KLSAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKG5ld193aXRoX2xlbl9zbGljZV9yZWZjb3VudCkpOwotICBncHJfcmVmX2luaXQoJnJjLT5yZWZzLCAxKTsKLSAgcmMtPnJjLnJlZiA9IG5ld193aXRoX2xlbl9yZWY7Ci0gIHJjLT5yYy51bnJlZiA9IG5ld193aXRoX2xlbl91bnJlZjsKLSAgcmMtPnVzZXJfZGVzdHJveSA9IGRlc3Ryb3k7Ci0gIHJjLT51c2VyX2RhdGEgPSBwOwotICByYy0+dXNlcl9sZW5ndGggPSBsZW47Ci0KLSAgc2xpY2UucmVmY291bnQgPSAmcmMtPnJjOwotICBzbGljZS5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSBwOwotICBzbGljZS5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gbGVuOwotICByZXR1cm4gc2xpY2U7Ci19Ci0KLWdwcl9zbGljZSBncHJfc2xpY2VfZnJvbV9jb3BpZWRfYnVmZmVyKGNvbnN0IGNoYXIgKnNvdXJjZSwgc2l6ZV90IGxlbmd0aCkgewotICBncHJfc2xpY2Ugc2xpY2UgPSBncHJfc2xpY2VfbWFsbG9jKGxlbmd0aCk7Ci0gIG1lbWNweShHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKSwgc291cmNlLCBsZW5ndGgpOwotICByZXR1cm4gc2xpY2U7Ci19Ci0KLWdwcl9zbGljZSBncHJfc2xpY2VfZnJvbV9jb3BpZWRfc3RyaW5nKGNvbnN0IGNoYXIgKnNvdXJjZSkgewotICByZXR1cm4gZ3ByX3NsaWNlX2Zyb21fY29waWVkX2J1ZmZlcihzb3VyY2UsIHN0cmxlbihzb3VyY2UpKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncHJfc2xpY2VfcmVmY291bnQgYmFzZTsKLSAgZ3ByX3JlZmNvdW50IHJlZnM7Ci19IG1hbGxvY19yZWZjb3VudDsKLQotc3RhdGljIHZvaWQgbWFsbG9jX3JlZih2b2lkICpwKSB7Ci0gIG1hbGxvY19yZWZjb3VudCAqciA9IHA7Ci0gIGdwcl9yZWYoJnItPnJlZnMpOwotfQotCi1zdGF0aWMgdm9pZCBtYWxsb2NfdW5yZWYodm9pZCAqcCkgewotICBtYWxsb2NfcmVmY291bnQgKnIgPSBwOwotICBpZiAoZ3ByX3VucmVmKCZyLT5yZWZzKSkgewotICAgIGdwcl9mcmVlKHIpOwotICB9Ci19Ci0KLWdwcl9zbGljZSBncHJfc2xpY2VfbWFsbG9jKHNpemVfdCBsZW5ndGgpIHsKLSAgZ3ByX3NsaWNlIHNsaWNlOwotCi0gIGlmIChsZW5ndGggPiBzaXplb2Yoc2xpY2UuZGF0YS5pbmxpbmVkLmJ5dGVzKSkgewotICAgIC8qIE1lbW9yeSBsYXlvdXQgdXNlZCBieSB0aGUgc2xpY2UgY3JlYXRlZCBoZXJlOgotCi0gICAgICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgfCByZWZjb3VudCAgfCBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLSAgICAgICByZWZjb3VudCBpcyBhIG1hbGxvY19yZWZjb3VudAotICAgICAgIGJ5dGVzIGlzIGFuIGFycmF5IG9mIGJ5dGVzIG9mIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoCi0gICAgICAgQm90aCBwYXJ0cyBhcmUgcGxhY2VkIGluIHRoZSBzYW1lIGFsbG9jYXRpb24gcmV0dXJuZWQgZnJvbSBncHJfbWFsbG9jICovCi0gICAgbWFsbG9jX3JlZmNvdW50ICpyYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKG1hbGxvY19yZWZjb3VudCkgKyBsZW5ndGgpOwotCi0gICAgLyogSW5pdGlhbCByZWZjb3VudCBvbiByYyBpcyAxIC0gYW5kIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byByZWxlYXNlCi0gICAgICAgdGhpcyByZWZlcmVuY2UuICovCi0gICAgZ3ByX3JlZl9pbml0KCZyYy0+cmVmcywgMSk7Ci0KLSAgICByYy0+YmFzZS5yZWYgPSBtYWxsb2NfcmVmOwotICAgIHJjLT5iYXNlLnVucmVmID0gbWFsbG9jX3VucmVmOwotCi0gICAgLyogQnVpbGQgdXAgdGhlIHNsaWNlIHRvIGJlIHJldHVybmVkLiAqLwotICAgIC8qIFRoZSBzbGljZXMgcmVmY291bnQgcG9pbnRzIGJhY2sgdG8gdGhlIGFsbG9jYXRlZCBibG9jay4gKi8KLSAgICBzbGljZS5yZWZjb3VudCA9ICZyYy0+YmFzZTsKLSAgICAvKiBUaGUgZGF0YSBieXRlcyBhcmUgcGxhY2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSByZWZjb3VudCBzdHJ1Y3QgKi8KLSAgICBzbGljZS5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSAodWludDhfdCAqKShyYyArIDEpOwotICAgIC8qIEFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jayBpcyBzZXQgdG8gdGhlIHJlcXVlc3RlZCBsZW5ndGggKi8KLSAgICBzbGljZS5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gbGVuZ3RoOwotICB9IGVsc2UgewotICAgIC8qIHNtYWxsIHNsaWNlOiBqdXN0IGlubGluZSB0aGUgZGF0YSAqLwotICAgIHNsaWNlLnJlZmNvdW50ID0gTlVMTDsKLSAgICBzbGljZS5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpbGVuZ3RoOwotICB9Ci0gIHJldHVybiBzbGljZTsKLX0KLQotZ3ByX3NsaWNlIGdwcl9zbGljZV9zdWJfbm9fcmVmKGdwcl9zbGljZSBzb3VyY2UsIHNpemVfdCBiZWdpbiwgc2l6ZV90IGVuZCkgewotICBncHJfc2xpY2Ugc3Vic2V0OwotCi0gIEdQUl9BU1NFUlQoZW5kID49IGJlZ2luKTsKLQotICBpZiAoc291cmNlLnJlZmNvdW50KSB7Ci0gICAgLyogRW5mb3JjZSBwcmVjb25kaXRpb25zICovCi0gICAgR1BSX0FTU0VSVChzb3VyY2UuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA+PSBlbmQpOwotCi0gICAgLyogQnVpbGQgdGhlIHJlc3VsdCAqLwotICAgIHN1YnNldC5yZWZjb3VudCA9IHNvdXJjZS5yZWZjb3VudDsKLSAgICAvKiBQb2ludCBpbnRvIHRoZSBzb3VyY2UgYXJyYXkgKi8KLSAgICBzdWJzZXQuZGF0YS5yZWZjb3VudGVkLmJ5dGVzID0gc291cmNlLmRhdGEucmVmY291bnRlZC5ieXRlcyArIGJlZ2luOwotICAgIHN1YnNldC5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gZW5kIC0gYmVnaW47Ci0gIH0gZWxzZSB7Ci0gICAgLyogRW5mb3JjZSBwcmVjb25kaXRpb25zICovCi0gICAgR1BSX0FTU0VSVChzb3VyY2UuZGF0YS5pbmxpbmVkLmxlbmd0aCA+PSBlbmQpOwotICAgIHN1YnNldC5yZWZjb3VudCA9IE5VTEw7Ci0gICAgc3Vic2V0LmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdCkoZW5kIC0gYmVnaW4pOwotICAgIG1lbWNweShzdWJzZXQuZGF0YS5pbmxpbmVkLmJ5dGVzLCBzb3VyY2UuZGF0YS5pbmxpbmVkLmJ5dGVzICsgYmVnaW4sCi0gICAgICAgICAgIGVuZCAtIGJlZ2luKTsKLSAgfQotICByZXR1cm4gc3Vic2V0OwotfQotCi1ncHJfc2xpY2UgZ3ByX3NsaWNlX3N1YihncHJfc2xpY2Ugc291cmNlLCBzaXplX3QgYmVnaW4sIHNpemVfdCBlbmQpIHsKLSAgZ3ByX3NsaWNlIHN1YnNldDsKLQotICBpZiAoZW5kIC0gYmVnaW4gPD0gc2l6ZW9mKHN1YnNldC5kYXRhLmlubGluZWQuYnl0ZXMpKSB7Ci0gICAgc3Vic2V0LnJlZmNvdW50ID0gTlVMTDsKLSAgICBzdWJzZXQuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KShlbmQgLSBiZWdpbik7Ci0gICAgbWVtY3B5KHN1YnNldC5kYXRhLmlubGluZWQuYnl0ZXMsIEdQUl9TTElDRV9TVEFSVF9QVFIoc291cmNlKSArIGJlZ2luLAotICAgICAgICAgICBlbmQgLSBiZWdpbik7Ci0gIH0gZWxzZSB7Ci0gICAgc3Vic2V0ID0gZ3ByX3NsaWNlX3N1Yl9ub19yZWYoc291cmNlLCBiZWdpbiwgZW5kKTsKLSAgICAvKiBCdW1wIHRoZSByZWZjb3VudCAqLwotICAgIHN1YnNldC5yZWZjb3VudC0+cmVmKHN1YnNldC5yZWZjb3VudCk7Ci0gIH0KLSAgcmV0dXJuIHN1YnNldDsKLX0KLQotZ3ByX3NsaWNlIGdwcl9zbGljZV9zcGxpdF90YWlsKGdwcl9zbGljZSAqc291cmNlLCBzaXplX3Qgc3BsaXQpIHsKLSAgZ3ByX3NsaWNlIHRhaWw7Ci0KLSAgaWYgKHNvdXJjZS0+cmVmY291bnQgPT0gTlVMTCkgewotICAgIC8qIGlubGluZWQgZGF0YSwgY29weSBpdCBvdXQgKi8KLSAgICBHUFJfQVNTRVJUKHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA+PSBzcGxpdCk7Ci0gICAgdGFpbC5yZWZjb3VudCA9IE5VTEw7Ci0gICAgdGFpbC5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpKHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmxlbmd0aCAtIHNwbGl0KTsKLSAgICBtZW1jcHkodGFpbC5kYXRhLmlubGluZWQuYnl0ZXMsIHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmJ5dGVzICsgc3BsaXQsCi0gICAgICAgICAgIHRhaWwuZGF0YS5pbmxpbmVkLmxlbmd0aCk7Ci0gICAgc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3Qpc3BsaXQ7Ci0gIH0gZWxzZSB7Ci0gICAgc2l6ZV90IHRhaWxfbGVuZ3RoID0gc291cmNlLT5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoIC0gc3BsaXQ7Ci0gICAgR1BSX0FTU0VSVChzb3VyY2UtPmRhdGEucmVmY291bnRlZC5sZW5ndGggPj0gc3BsaXQpOwotICAgIGlmICh0YWlsX2xlbmd0aCA8IHNpemVvZih0YWlsLmRhdGEuaW5saW5lZC5ieXRlcykpIHsKLSAgICAgIC8qIENvcHkgb3V0IHRoZSBieXRlcyAtIGl0J2xsIGJlIGNoZWFwZXIgdGhhbiByZWZjb3VudGluZyAqLwotICAgICAgdGFpbC5yZWZjb3VudCA9IE5VTEw7Ci0gICAgICB0YWlsLmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdCl0YWlsX2xlbmd0aDsKLSAgICAgIG1lbWNweSh0YWlsLmRhdGEuaW5saW5lZC5ieXRlcywgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgKyBzcGxpdCwKLSAgICAgICAgICAgICB0YWlsX2xlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEJ1aWxkIHRoZSByZXN1bHQgKi8KLSAgICAgIHRhaWwucmVmY291bnQgPSBzb3VyY2UtPnJlZmNvdW50OwotICAgICAgLyogQnVtcCB0aGUgcmVmY291bnQgKi8KLSAgICAgIHRhaWwucmVmY291bnQtPnJlZih0YWlsLnJlZmNvdW50KTsKLSAgICAgIC8qIFBvaW50IGludG8gdGhlIHNvdXJjZSBhcnJheSAqLwotICAgICAgdGFpbC5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSBzb3VyY2UtPmRhdGEucmVmY291bnRlZC5ieXRlcyArIHNwbGl0OwotICAgICAgdGFpbC5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID0gdGFpbF9sZW5ndGg7Ci0gICAgfQotICAgIHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA9IHNwbGl0OwotICB9Ci0KLSAgcmV0dXJuIHRhaWw7Ci19Ci0KLWdwcl9zbGljZSBncHJfc2xpY2Vfc3BsaXRfaGVhZChncHJfc2xpY2UgKnNvdXJjZSwgc2l6ZV90IHNwbGl0KSB7Ci0gIGdwcl9zbGljZSBoZWFkOwotCi0gIGlmIChzb3VyY2UtPnJlZmNvdW50ID09IE5VTEwpIHsKLSAgICBHUFJfQVNTRVJUKHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA+PSBzcGxpdCk7Ci0KLSAgICBoZWFkLnJlZmNvdW50ID0gTlVMTDsKLSAgICBoZWFkLmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdClzcGxpdDsKLSAgICBtZW1jcHkoaGVhZC5kYXRhLmlubGluZWQuYnl0ZXMsIHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmJ5dGVzLCBzcGxpdCk7Ci0gICAgc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoID0KLSAgICAgICAgKHVpbnQ4X3QpKHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmxlbmd0aCAtIHNwbGl0KTsKLSAgICBtZW1tb3ZlKHNvdXJjZS0+ZGF0YS5pbmxpbmVkLmJ5dGVzLCBzb3VyY2UtPmRhdGEuaW5saW5lZC5ieXRlcyArIHNwbGl0LAotICAgICAgICAgICAgc291cmNlLT5kYXRhLmlubGluZWQubGVuZ3RoKTsKLSAgfSBlbHNlIGlmIChzcGxpdCA8IHNpemVvZihoZWFkLmRhdGEuaW5saW5lZC5ieXRlcykpIHsKLSAgICBHUFJfQVNTRVJUKHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA+PSBzcGxpdCk7Ci0KLSAgICBoZWFkLnJlZmNvdW50ID0gTlVMTDsKLSAgICBoZWFkLmRhdGEuaW5saW5lZC5sZW5ndGggPSAodWludDhfdClzcGxpdDsKLSAgICBtZW1jcHkoaGVhZC5kYXRhLmlubGluZWQuYnl0ZXMsIHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmJ5dGVzLCBzcGxpdCk7Ci0gICAgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgKz0gc3BsaXQ7Ci0gICAgc291cmNlLT5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoIC09IHNwbGl0OwotICB9IGVsc2UgewotICAgIEdQUl9BU1NFUlQoc291cmNlLT5kYXRhLnJlZmNvdW50ZWQubGVuZ3RoID49IHNwbGl0KTsKLQotICAgIC8qIEJ1aWxkIHRoZSByZXN1bHQgKi8KLSAgICBoZWFkLnJlZmNvdW50ID0gc291cmNlLT5yZWZjb3VudDsKLSAgICAvKiBCdW1wIHRoZSByZWZjb3VudCAqLwotICAgIGhlYWQucmVmY291bnQtPnJlZihoZWFkLnJlZmNvdW50KTsKLSAgICAvKiBQb2ludCBpbnRvIHRoZSBzb3VyY2UgYXJyYXkgKi8KLSAgICBoZWFkLmRhdGEucmVmY291bnRlZC5ieXRlcyA9IHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmJ5dGVzOwotICAgIGhlYWQuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA9IHNwbGl0OwotICAgIHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmJ5dGVzICs9IHNwbGl0OwotICAgIHNvdXJjZS0+ZGF0YS5yZWZjb3VudGVkLmxlbmd0aCAtPSBzcGxpdDsKLSAgfQotCi0gIHJldHVybiBoZWFkOwotfQotCi1pbnQgZ3ByX3NsaWNlX2NtcChncHJfc2xpY2UgYSwgZ3ByX3NsaWNlIGIpIHsKLSAgaW50IGQgPSAoaW50KShHUFJfU0xJQ0VfTEVOR1RIKGEpIC0gR1BSX1NMSUNFX0xFTkdUSChiKSk7Ci0gIGlmIChkICE9IDApIHJldHVybiBkOwotICByZXR1cm4gbWVtY21wKEdQUl9TTElDRV9TVEFSVF9QVFIoYSksIEdQUl9TTElDRV9TVEFSVF9QVFIoYiksCi0gICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChhKSk7Ci19Ci0KLWludCBncHJfc2xpY2Vfc3RyX2NtcChncHJfc2xpY2UgYSwgY29uc3QgY2hhciAqYikgewotICBzaXplX3QgYl9sZW5ndGggPSBzdHJsZW4oYik7Ci0gIGludCBkID0gKGludCkoR1BSX1NMSUNFX0xFTkdUSChhKSAtIGJfbGVuZ3RoKTsKLSAgaWYgKGQgIT0gMCkgcmV0dXJuIGQ7Ci0gIHJldHVybiBtZW1jbXAoR1BSX1NMSUNFX1NUQVJUX1BUUihhKSwgYiwgYl9sZW5ndGgpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zbGljZV9idWZmZXIuYyBiL3NyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjExMWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9zbGljZV9idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0vKiBncm93IGEgYnVmZmVyOyByZXF1aXJlcyBHUlBDX1NMSUNFX0JVRkZFUl9JTkxJTkVfRUxFTUVOVFMgPiAxICovCi0jZGVmaW5lIEdST1coeCkgKDMgKiAoeCkgLyAyKQotCi1zdGF0aWMgdm9pZCBtYXliZV9lbWJpZ2dlbihncHJfc2xpY2VfYnVmZmVyICpzYikgewotICBpZiAoc2ItPmNvdW50ID09IHNiLT5jYXBhY2l0eSkgewotICAgIHNiLT5jYXBhY2l0eSA9IEdST1coc2ItPmNhcGFjaXR5KTsKLSAgICBHUFJfQVNTRVJUKHNiLT5jYXBhY2l0eSA+IHNiLT5jb3VudCk7Ci0gICAgaWYgKHNiLT5zbGljZXMgPT0gc2ItPmlubGluZWQpIHsKLSAgICAgIHNiLT5zbGljZXMgPSBncHJfbWFsbG9jKHNiLT5jYXBhY2l0eSAqIHNpemVvZihncHJfc2xpY2UpKTsKLSAgICAgIG1lbWNweShzYi0+c2xpY2VzLCBzYi0+aW5saW5lZCwgc2ItPmNvdW50ICogc2l6ZW9mKGdwcl9zbGljZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzYi0+c2xpY2VzID0gZ3ByX3JlYWxsb2Moc2ItPnNsaWNlcywgc2ItPmNhcGFjaXR5ICogc2l6ZW9mKGdwcl9zbGljZSkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGdwcl9zbGljZV9idWZmZXJfaW5pdChncHJfc2xpY2VfYnVmZmVyICpzYikgewotICBzYi0+Y291bnQgPSAwOwotICBzYi0+bGVuZ3RoID0gMDsKLSAgc2ItPmNhcGFjaXR5ID0gR1JQQ19TTElDRV9CVUZGRVJfSU5MSU5FX0VMRU1FTlRTOwotICBzYi0+c2xpY2VzID0gc2ItPmlubGluZWQ7Ci19Ci0KLXZvaWQgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KGdwcl9zbGljZV9idWZmZXIgKnNiKSB7Ci0gIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKHNiKTsKLSAgaWYgKHNiLT5zbGljZXMgIT0gc2ItPmlubGluZWQpIHsKLSAgICBncHJfZnJlZShzYi0+c2xpY2VzKTsKLSAgfQotfQotCi11aW50OF90ICpncHJfc2xpY2VfYnVmZmVyX3RpbnlfYWRkKGdwcl9zbGljZV9idWZmZXIgKnNiLCBzaXplX3QgbikgewotICBncHJfc2xpY2UgKmJhY2s7Ci0gIHVpbnQ4X3QgKm91dDsKLQotICBzYi0+bGVuZ3RoICs9IG47Ci0KLSAgaWYgKHNiLT5jb3VudCA9PSAwKSBnb3RvIGFkZF9uZXc7Ci0gIGJhY2sgPSAmc2ItPnNsaWNlc1tzYi0+Y291bnQgLSAxXTsKLSAgaWYgKGJhY2stPnJlZmNvdW50KSBnb3RvIGFkZF9uZXc7Ci0gIGlmICgoYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCArIG4pID4gc2l6ZW9mKGJhY2stPmRhdGEuaW5saW5lZC5ieXRlcykpCi0gICAgZ290byBhZGRfbmV3OwotICBvdXQgPSBiYWNrLT5kYXRhLmlubGluZWQuYnl0ZXMgKyBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoOwotICBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpKGJhY2stPmRhdGEuaW5saW5lZC5sZW5ndGggKyBuKTsKLSAgcmV0dXJuIG91dDsKLQotYWRkX25ldzoKLSAgbWF5YmVfZW1iaWdnZW4oc2IpOwotICBiYWNrID0gJnNiLT5zbGljZXNbc2ItPmNvdW50XTsKLSAgc2ItPmNvdW50Kys7Ci0gIGJhY2stPnJlZmNvdW50ID0gTlVMTDsKLSAgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KW47Ci0gIHJldHVybiBiYWNrLT5kYXRhLmlubGluZWQuYnl0ZXM7Ci19Ci0KLXNpemVfdCBncHJfc2xpY2VfYnVmZmVyX2FkZF9pbmRleGVkKGdwcl9zbGljZV9idWZmZXIgKnNiLCBncHJfc2xpY2UgcykgewotICBzaXplX3Qgb3V0ID0gc2ItPmNvdW50OwotICBtYXliZV9lbWJpZ2dlbihzYik7Ci0gIHNiLT5zbGljZXNbb3V0XSA9IHM7Ci0gIHNiLT5sZW5ndGggKz0gR1BSX1NMSUNFX0xFTkdUSChzKTsKLSAgc2ItPmNvdW50ID0gb3V0ICsgMTsKLSAgcmV0dXJuIG91dDsKLX0KLQotdm9pZCBncHJfc2xpY2VfYnVmZmVyX2FkZChncHJfc2xpY2VfYnVmZmVyICpzYiwgZ3ByX3NsaWNlIHMpIHsKLSAgc2l6ZV90IG4gPSBzYi0+Y291bnQ7Ci0gIC8qIGlmIGJvdGggdGhlIGxhc3Qgc2xpY2UgaW4gdGhlIHNsaWNlIGJ1ZmZlciBhbmQgdGhlIHNsaWNlIGJlaW5nIGFkZGVkCi0gICAgIGFyZSBpbmxpbmVkICh0aGF0IGlzLCB0aGF0IHRoZXkgY2FycnkgdGhlaXIgZGF0YSBpbnNpZGUgdGhlIHNsaWNlIGRhdGEKLSAgICAgc3RydWN0dXJlKSwgYW5kIHRoZSBiYWNrIHNsaWNlIGlzIG5vdCBmdWxsLCB0aGVuIGNvbmNhdGVuYXRlIGRpcmVjdGx5Ci0gICAgIGludG8gdGhlIGJhY2sgc2xpY2UsIHByZXZlbnRpbmcgbWFueSBzbWFsbCBzbGljZXMgYmVpbmcgcGFzc2VkIGludG8KLSAgICAgd3JpdGVzICovCi0gIGlmICghcy5yZWZjb3VudCAmJiBuKSB7Ci0gICAgZ3ByX3NsaWNlICpiYWNrID0gJnNiLT5zbGljZXNbbiAtIDFdOwotICAgIGlmICghYmFjay0+cmVmY291bnQgJiYgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA8IEdQUl9TTElDRV9JTkxJTkVEX1NJWkUpIHsKLSAgICAgIGlmIChzLmRhdGEuaW5saW5lZC5sZW5ndGggKyBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoIDw9Ci0gICAgICAgICAgR1BSX1NMSUNFX0lOTElORURfU0laRSkgewotICAgICAgICBtZW1jcHkoYmFjay0+ZGF0YS5pbmxpbmVkLmJ5dGVzICsgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCwKLSAgICAgICAgICAgICAgIHMuZGF0YS5pbmxpbmVkLmJ5dGVzLCBzLmRhdGEuaW5saW5lZC5sZW5ndGgpOwotICAgICAgICBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoID0KLSAgICAgICAgICAgICh1aW50OF90KShiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoICsgcy5kYXRhLmlubGluZWQubGVuZ3RoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemVfdCBjcDEgPSBHUFJfU0xJQ0VfSU5MSU5FRF9TSVpFIC0gYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aDsKLSAgICAgICAgbWVtY3B5KGJhY2stPmRhdGEuaW5saW5lZC5ieXRlcyArIGJhY2stPmRhdGEuaW5saW5lZC5sZW5ndGgsCi0gICAgICAgICAgICAgICBzLmRhdGEuaW5saW5lZC5ieXRlcywgY3AxKTsKLSAgICAgICAgYmFjay0+ZGF0YS5pbmxpbmVkLmxlbmd0aCA9IEdQUl9TTElDRV9JTkxJTkVEX1NJWkU7Ci0gICAgICAgIG1heWJlX2VtYmlnZ2VuKHNiKTsKLSAgICAgICAgYmFjayA9ICZzYi0+c2xpY2VzW25dOwotICAgICAgICBzYi0+Y291bnQgPSBuICsgMTsKLSAgICAgICAgYmFjay0+cmVmY291bnQgPSBOVUxMOwotICAgICAgICBiYWNrLT5kYXRhLmlubGluZWQubGVuZ3RoID0gKHVpbnQ4X3QpKHMuZGF0YS5pbmxpbmVkLmxlbmd0aCAtIGNwMSk7Ci0gICAgICAgIG1lbWNweShiYWNrLT5kYXRhLmlubGluZWQuYnl0ZXMsIHMuZGF0YS5pbmxpbmVkLmJ5dGVzICsgY3AxLAotICAgICAgICAgICAgICAgcy5kYXRhLmlubGluZWQubGVuZ3RoIC0gY3AxKTsKLSAgICAgIH0KLSAgICAgIHNiLT5sZW5ndGggKz0gcy5kYXRhLmlubGluZWQubGVuZ3RoOwotICAgICAgcmV0dXJuOyAvKiBlYXJseSBvdXQgKi8KLSAgICB9Ci0gIH0KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChzYiwgcyk7Ci19Ci0KLXZvaWQgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRuKGdwcl9zbGljZV9idWZmZXIgKnNiLCBncHJfc2xpY2UgKnMsIHNpemVfdCBuKSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoc2IsIHNbaV0pOwotICB9Ci19Ci0KLXZvaWQgZ3ByX3NsaWNlX2J1ZmZlcl9wb3AoZ3ByX3NsaWNlX2J1ZmZlciAqc2IpIHsKLSAgaWYgKHNiLT5jb3VudCAhPSAwKSB7Ci0gICAgc2l6ZV90IGNvdW50ID0gLS1zYi0+Y291bnQ7Ci0gICAgc2ItPmxlbmd0aCAtPSBHUFJfU0xJQ0VfTEVOR1RIKHNiLT5zbGljZXNbY291bnRdKTsKLSAgfQotfQotCi12b2lkIGdwcl9zbGljZV9idWZmZXJfcmVzZXRfYW5kX3VucmVmKGdwcl9zbGljZV9idWZmZXIgKnNiKSB7Ci0gIHNpemVfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzYi0+Y291bnQ7IGkrKykgewotICAgIGdwcl9zbGljZV91bnJlZihzYi0+c2xpY2VzW2ldKTsKLSAgfQotCi0gIHNiLT5jb3VudCA9IDA7Ci0gIHNiLT5sZW5ndGggPSAwOwotfQotCi12b2lkIGdwcl9zbGljZV9idWZmZXJfc3dhcChncHJfc2xpY2VfYnVmZmVyICphLCBncHJfc2xpY2VfYnVmZmVyICpiKSB7Ci0gIEdQUl9TV0FQKHNpemVfdCwgYS0+Y291bnQsIGItPmNvdW50KTsKLSAgR1BSX1NXQVAoc2l6ZV90LCBhLT5jYXBhY2l0eSwgYi0+Y2FwYWNpdHkpOwotICBHUFJfU1dBUChzaXplX3QsIGEtPmxlbmd0aCwgYi0+bGVuZ3RoKTsKLQotICBpZiAoYS0+c2xpY2VzID09IGEtPmlubGluZWQpIHsKLSAgICBpZiAoYi0+c2xpY2VzID09IGItPmlubGluZWQpIHsKLSAgICAgIC8qIHN3YXAgY29udGVudHMgb2YgaW5saW5lZCBidWZmZXIgKi8KLSAgICAgIGdwcl9zbGljZSB0ZW1wW0dSUENfU0xJQ0VfQlVGRkVSX0lOTElORV9FTEVNRU5UU107Ci0gICAgICBtZW1jcHkodGVtcCwgYS0+c2xpY2VzLCBiLT5jb3VudCAqIHNpemVvZihncHJfc2xpY2UpKTsKLSAgICAgIG1lbWNweShhLT5zbGljZXMsIGItPnNsaWNlcywgYS0+Y291bnQgKiBzaXplb2YoZ3ByX3NsaWNlKSk7Ci0gICAgICBtZW1jcHkoYi0+c2xpY2VzLCB0ZW1wLCBiLT5jb3VudCAqIHNpemVvZihncHJfc2xpY2UpKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogYSBpcyBpbmxpbmVkLCBiIGlzIG5vdCAtIGNvcHkgYSBpbmxpbmVkIGludG8gYiwgZml4IHBvaW50ZXJzICovCi0gICAgICBhLT5zbGljZXMgPSBiLT5zbGljZXM7Ci0gICAgICBiLT5zbGljZXMgPSBiLT5pbmxpbmVkOwotICAgICAgbWVtY3B5KGItPnNsaWNlcywgYS0+aW5saW5lZCwgYi0+Y291bnQgKiBzaXplb2YoZ3ByX3NsaWNlKSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGItPnNsaWNlcyA9PSBiLT5pbmxpbmVkKSB7Ci0gICAgLyogYiBpcyBpbmxpbmVkLCBhIGlzIG5vdCAtIGNvcHkgYiBpbmxpbmVkIGludCBhLCBmaXggcG9pbnRlcnMgKi8KLSAgICBiLT5zbGljZXMgPSBhLT5zbGljZXM7Ci0gICAgYS0+c2xpY2VzID0gYS0+aW5saW5lZDsKLSAgICBtZW1jcHkoYS0+c2xpY2VzLCBiLT5pbmxpbmVkLCBhLT5jb3VudCAqIHNpemVvZihncHJfc2xpY2UpKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBubyBpbmxpbmluZzogZWFzeSBzd2FwICovCi0gICAgR1BSX1NXQVAoZ3ByX3NsaWNlICosIGEtPnNsaWNlcywgYi0+c2xpY2VzKTsKLSAgfQotfQotCi12b2lkIGdwcl9zbGljZV9idWZmZXJfbW92ZV9pbnRvKGdwcl9zbGljZV9idWZmZXIgKnNyYywgZ3ByX3NsaWNlX2J1ZmZlciAqZHN0KSB7Ci0gIC8qIGFueXRoaW5nIHRvIG1vdmU/ICovCi0gIGlmIChzcmMtPmNvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogYW55dGhpbmcgaW4gZHN0PyAqLwotICBpZiAoZHN0LT5jb3VudCA9PSAwKSB7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9zd2FwKHNyYywgZHN0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogYm90aCBidWZmZXJzIGhhdmUgZGF0YSAtIGNvcHksIGFuZCByZXNldCBzcmMgKi8KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRuKGRzdCwgc3JjLT5zbGljZXMsIHNyYy0+Y291bnQpOwotICBzcmMtPmNvdW50ID0gMDsKLSAgc3JjLT5sZW5ndGggPSAwOwotfQotCi12b2lkIGdwcl9zbGljZV9idWZmZXJfbW92ZV9maXJzdChncHJfc2xpY2VfYnVmZmVyICpzcmMsIHNpemVfdCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqZHN0KSB7Ci0gIHNpemVfdCBzcmNfaWR4OwotICBzaXplX3Qgb3V0cHV0X2xlbiA9IGRzdC0+bGVuZ3RoICsgbjsKLSAgc2l6ZV90IG5ld19pbnB1dF9sZW4gPSBzcmMtPmxlbmd0aCAtIG47Ci0gIEdQUl9BU1NFUlQoc3JjLT5sZW5ndGggPj0gbik7Ci0gIGlmIChzcmMtPmxlbmd0aCA9PSBuKSB7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9tb3ZlX2ludG8oc3JjLCBkc3QpOwotICAgIHJldHVybjsKLSAgfQotICBzcmNfaWR4ID0gMDsKLSAgd2hpbGUgKHNyY19pZHggPCBzcmMtPmNhcGFjaXR5KSB7Ci0gICAgZ3ByX3NsaWNlIHNsaWNlID0gc3JjLT5zbGljZXNbc3JjX2lkeF07Ci0gICAgc2l6ZV90IHNsaWNlX2xlbiA9IEdQUl9TTElDRV9MRU5HVEgoc2xpY2UpOwotICAgIGlmIChuID4gc2xpY2VfbGVuKSB7Ci0gICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZChkc3QsIHNsaWNlKTsKLSAgICAgIG4gLT0gc2xpY2VfbGVuOwotICAgICAgc3JjX2lkeCsrOwotICAgIH0gZWxzZSBpZiAobiA9PSBzbGljZV9sZW4pIHsKLSAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKGRzdCwgc2xpY2UpOwotICAgICAgc3JjX2lkeCsrOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsgLyogbiA8IHNsaWNlX2xlbiAqLwotICAgICAgc3JjLT5zbGljZXNbc3JjX2lkeF0gPSBncHJfc2xpY2Vfc3BsaXRfdGFpbCgmc2xpY2UsIG4pOwotICAgICAgR1BSX0FTU0VSVChHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKSA9PSBuKTsKLSAgICAgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChzcmMtPnNsaWNlc1tzcmNfaWR4XSkgPT0gc2xpY2VfbGVuIC0gbik7Ci0gICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZChkc3QsIHNsaWNlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBHUFJfQVNTRVJUKGRzdC0+bGVuZ3RoID09IG91dHB1dF9sZW4pOwotICBtZW1tb3ZlKHNyYy0+c2xpY2VzLCBzcmMtPnNsaWNlcyArIHNyY19pZHgsCi0gICAgICAgICAgc2l6ZW9mKGdwcl9zbGljZSkgKiAoc3JjLT5jb3VudCAtIHNyY19pZHgpKTsKLSAgc3JjLT5jb3VudCAtPSBzcmNfaWR4OwotICBzcmMtPmxlbmd0aCA9IG5ld19pbnB1dF9sZW47Ci0gIEdQUl9BU1NFUlQoc3JjLT5jb3VudCA+IDApOwotfQotCi12b2lkIGdwcl9zbGljZV9idWZmZXJfdHJpbV9lbmQoZ3ByX3NsaWNlX2J1ZmZlciAqc2IsIHNpemVfdCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKmdhcmJhZ2UpIHsKLSAgR1BSX0FTU0VSVChuIDw9IHNiLT5sZW5ndGgpOwotICBzYi0+bGVuZ3RoIC09IG47Ci0gIGZvciAoOzspIHsKLSAgICBzaXplX3QgaWR4ID0gc2ItPmNvdW50IC0gMTsKLSAgICBncHJfc2xpY2Ugc2xpY2UgPSBzYi0+c2xpY2VzW2lkeF07Ci0gICAgc2l6ZV90IHNsaWNlX2xlbiA9IEdQUl9TTElDRV9MRU5HVEgoc2xpY2UpOwotICAgIGlmIChzbGljZV9sZW4gPiBuKSB7Ci0gICAgICBzYi0+c2xpY2VzW2lkeF0gPSBncHJfc2xpY2Vfc3BsaXRfaGVhZCgmc2xpY2UsIHNsaWNlX2xlbiAtIG4pOwotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChnYXJiYWdlLCBzbGljZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChzbGljZV9sZW4gPT0gbikgewotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChnYXJiYWdlLCBzbGljZSk7Ci0gICAgICBzYi0+Y291bnQgPSBpZHg7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkX2luZGV4ZWQoZ2FyYmFnZSwgc2xpY2UpOwotICAgICAgbiAtPSBzbGljZV9sZW47Ci0gICAgICBzYi0+Y291bnQgPSBpZHg7Ci0gICAgfQotICB9Ci19Ci0KLWdwcl9zbGljZSBncHJfc2xpY2VfYnVmZmVyX3Rha2VfZmlyc3QoZ3ByX3NsaWNlX2J1ZmZlciAqc2IpIHsKLSAgZ3ByX3NsaWNlIHNsaWNlOwotICBHUFJfQVNTRVJUKHNiLT5jb3VudCA+IDApOwotICBzbGljZSA9IHNiLT5zbGljZXNbMF07Ci0gIG1lbW1vdmUoJnNiLT5zbGljZXNbMF0sICZzYi0+c2xpY2VzWzFdLCAoc2ItPmNvdW50IC0gMSkgKiBzaXplb2YoZ3ByX3NsaWNlKSk7Ci0gIHNiLT5jb3VudC0tOwotICBzYi0+bGVuZ3RoIC09IEdQUl9TTElDRV9MRU5HVEgoc2xpY2UpOwotICByZXR1cm4gc2xpY2U7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMgYi9zcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMGJiZmEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotLyogVGhlIGxvY2tmcmVlIG5vZGUgc3RydWN0dXJlIGlzIGEgc2luZ2xlIGFyY2hpdGVjdHVyZS1sZXZlbAotICAgd29yZCB0aGF0IGFsbG93cyBmb3IgYW4gYXRvbWljIENBUyB0byBzZXQgaXQgdXAuICovCi1zdHJ1Y3QgbG9ja2ZyZWVfbm9kZV9jb250ZW50cyB7Ci0gIC8qIG5leHQgdGhpbmcgdG8gbG9vayBhdC4gQWN0dWFsIGluZGV4IGZvciBoZWFkLCBuZXh0IGluZGV4IG90aGVyd2lzZSAqLwotICB1aW50MTZfdCBpbmRleDsKLSNpZmRlZiBHUFJfQVJDSF82NAotICB1aW50MTZfdCBwYWQ7Ci0gIHVpbnQzMl90IGFiYV9jdHI7Ci0jZWxzZQotI2lmZGVmIEdQUl9BUkNIXzMyCi0gIHVpbnQxNl90IGFiYV9jdHI7Ci0jZWxzZQotI2Vycm9yIFVuc3VwcG9ydGVkIGJpdCB3aWR0aCBhcmNoaXRlY3R1cmUKLSNlbmRpZgotI2VuZGlmCi19OwotCi0vKiBVc2UgYSB1bmlvbiB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgaW4gdGhlIHNhbWUgYml0cyBhcyBhbiBhdG0gd29yZCAqLwotdHlwZWRlZiB1bmlvbiBsb2NrZnJlZV9ub2RlIHsKLSAgZ3ByX2F0bSBhdG07Ci0gIHN0cnVjdCBsb2NrZnJlZV9ub2RlX2NvbnRlbnRzIGNvbnRlbnRzOwotfSBsb2NrZnJlZV9ub2RlOwotCi0vKiBtYWtlIHN1cmUgdGhhdCBlbnRyaWVzIGFsaWduZWQgdG8gOC1ieXRlcyAqLwotI2RlZmluZSBFTlRSWV9BTElHTk1FTlRfQklUUyAzCi0vKiByZXNlcnZlIHRoaXMgZW50cnkgYXMgaW52YWxpZCAqLwotI2RlZmluZSBJTlZBTElEX0VOVFJZX0lOREVYICgoMSA8PCAxNikgLSAxKQotCi1zdHJ1Y3QgZ3ByX3N0YWNrX2xvY2tmcmVlIHsKLSAgbG9ja2ZyZWVfbm9kZSAqZW50cmllczsKLSAgbG9ja2ZyZWVfbm9kZSBoZWFkOyAvKiBBbiBhdG9taWMgZW50cnkgZGVzY3JpYmluZyBjdXJyIGhlYWQgKi8KLQotI2lmbmRlZiBOREVCVUcKLSAgLyogQml0bWFwIG9mIHB1c2hlZCBlbnRyaWVzIHRvIGNoZWNrIGZvciBkb3VibGUtcHVzaCBvciBwb3AgKi8KLSAgZ3ByX2F0bSBwdXNoZWRbKElOVkFMSURfRU5UUllfSU5ERVggKyAxKSAvICg4ICogc2l6ZW9mKGdwcl9hdG0pKV07Ci0jZW5kaWYKLX07Ci0KLWdwcl9zdGFja19sb2NrZnJlZSAqZ3ByX3N0YWNrX2xvY2tmcmVlX2NyZWF0ZShzaXplX3QgZW50cmllcykgewotICBncHJfc3RhY2tfbG9ja2ZyZWUgKnN0YWNrOwotICBzdGFjayA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpzdGFjaykpOwotICAvKiBTaW5jZSB3ZSBvbmx5IGFsbG9jYXRlIDE2IGJpdHMgdG8gcmVwcmVzZW50IGFuIGVudHJ5IG51bWJlciwKLSAgICogbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHdpdGhpbiB0aGUgZGVzaXJlZCByYW5nZSAqLwotICAvKiBSZXNlcnZlIHRoZSBoaWdoZXN0IGVudHJ5IG51bWJlciBhcyBhIGR1bW15ICovCi0gIEdQUl9BU1NFUlQoZW50cmllcyA8IElOVkFMSURfRU5UUllfSU5ERVgpOwotICBzdGFjay0+ZW50cmllcyA9IGdwcl9tYWxsb2NfYWxpZ25lZChlbnRyaWVzICogc2l6ZW9mKHN0YWNrLT5lbnRyaWVzWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5UUllfQUxJR05NRU5UX0JJVFMpOwotICAvKiBDbGVhciBvdXQgYWxsIGVudHJpZXMgKi8KLSAgbWVtc2V0KHN0YWNrLT5lbnRyaWVzLCAwLCBlbnRyaWVzICogc2l6ZW9mKHN0YWNrLT5lbnRyaWVzWzBdKSk7Ci0gIG1lbXNldCgmc3RhY2stPmhlYWQsIDAsIHNpemVvZihzdGFjay0+aGVhZCkpOwotI2lmbmRlZiBOREVCVUcKLSAgbWVtc2V0KCZzdGFjay0+cHVzaGVkLCAwLCBzaXplb2Yoc3RhY2stPnB1c2hlZCkpOwotI2VuZGlmCi0KLSAgR1BSX0FTU0VSVChzaXplb2Yoc3RhY2stPmVudHJpZXMtPmF0bSkgPT0gc2l6ZW9mKHN0YWNrLT5lbnRyaWVzLT5jb250ZW50cykpOwotCi0gIC8qIFBvaW50IHRoZSBoZWFkIGF0IHJlc2VydmVkIGR1bW15IGVudHJ5ICovCi0gIHN0YWNrLT5oZWFkLmNvbnRlbnRzLmluZGV4ID0gSU5WQUxJRF9FTlRSWV9JTkRFWDsKLS8qIEZpbGwgaW4gdGhlIHBhZCBhbmQgYWJhX2N0ciB0byBhdm9pZCBjb25mdXNpbmcgbWVtY2hlY2sgdG9vbHMgKi8KLSNpZmRlZiBHUFJfQVJDSF82NAotICBzdGFjay0+aGVhZC5jb250ZW50cy5wYWQgPSAwOwotI2VuZGlmCi0gIHN0YWNrLT5oZWFkLmNvbnRlbnRzLmFiYV9jdHIgPSAwOwotICByZXR1cm4gc3RhY2s7Ci19Ci0KLXZvaWQgZ3ByX3N0YWNrX2xvY2tmcmVlX2Rlc3Ryb3koZ3ByX3N0YWNrX2xvY2tmcmVlICpzdGFjaykgewotICBncHJfZnJlZV9hbGlnbmVkKHN0YWNrLT5lbnRyaWVzKTsKLSAgZ3ByX2ZyZWUoc3RhY2spOwotfQotCi1pbnQgZ3ByX3N0YWNrX2xvY2tmcmVlX3B1c2goZ3ByX3N0YWNrX2xvY2tmcmVlICpzdGFjaywgaW50IGVudHJ5KSB7Ci0gIGxvY2tmcmVlX25vZGUgaGVhZDsKLSAgbG9ja2ZyZWVfbm9kZSBuZXdoZWFkOwotICBsb2NrZnJlZV9ub2RlIGN1cmVudDsKLSAgbG9ja2ZyZWVfbm9kZSBuZXdlbnQ7Ci0KLSAgLyogRmlyc3QgZmlsbCBpbiB0aGUgZW50cnkncyBpbmRleCBhbmQgYWJhIGN0ciBmb3IgbmV3IGhlYWQgKi8KLSAgbmV3aGVhZC5jb250ZW50cy5pbmRleCA9ICh1aW50MTZfdCllbnRyeTsKLSNpZmRlZiBHUFJfQVJDSF82NAotICAvKiBGaWxsIGluIHRoZSBwYWQgdG8gYXZvaWQgY29uZnVzaW5nIG1lbWNoZWNrIHRvb2xzICovCi0gIG5ld2hlYWQuY29udGVudHMucGFkID0gMDsKLSNlbmRpZgotCi0gIC8qIEFsc28gcG9zdC1pbmNyZW1lbnQgdGhlIGFiYV9jdHIgKi8KLSAgY3VyZW50LmF0bSA9IGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZzdGFjay0+ZW50cmllc1tlbnRyeV0uYXRtKTsKLSAgbmV3aGVhZC5jb250ZW50cy5hYmFfY3RyID0gKytjdXJlbnQuY29udGVudHMuYWJhX2N0cjsKLSAgZ3ByX2F0bV9ub19iYXJyaWVyX3N0b3JlKCZzdGFjay0+ZW50cmllc1tlbnRyeV0uYXRtLCBjdXJlbnQuYXRtKTsKLQotI2lmbmRlZiBOREVCVUcKLSAgLyogQ2hlY2sgZm9yIGRvdWJsZSBwdXNoICovCi0gIHsKLSAgICBpbnQgcHVzaGVkX2luZGV4ID0gZW50cnkgLyAoaW50KSg4ICogc2l6ZW9mKGdwcl9hdG0pKTsKLSAgICBpbnQgcHVzaGVkX2JpdCA9IGVudHJ5ICUgKGludCkoOCAqIHNpemVvZihncHJfYXRtKSk7Ci0gICAgZ3ByX2F0bSBvbGRfdmFsOwotCi0gICAgb2xkX3ZhbCA9IGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJnN0YWNrLT5wdXNoZWRbcHVzaGVkX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdwcl9hdG0pMSA8PCBwdXNoZWRfYml0KSk7Ci0gICAgR1BSX0FTU0VSVCgob2xkX3ZhbCAmICgoKGdwcl9hdG0pMSkgPDwgcHVzaGVkX2JpdCkpID09IDApOwotICB9Ci0jZW5kaWYKLQotICBkbyB7Ci0gICAgLyogQXRvbWljYWxseSBnZXQgdGhlIGV4aXN0aW5nIGhlYWQgdmFsdWUgZm9yIHVzZSAqLwotICAgIGhlYWQuYXRtID0gZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJihzdGFjay0+aGVhZC5hdG0pKTsKLSAgICAvKiBQb2ludCB0byBpdCAqLwotICAgIG5ld2VudC5hdG0gPSBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmc3RhY2stPmVudHJpZXNbZW50cnldLmF0bSk7Ci0gICAgbmV3ZW50LmNvbnRlbnRzLmluZGV4ID0gaGVhZC5jb250ZW50cy5pbmRleDsKLSAgICBncHJfYXRtX25vX2JhcnJpZXJfc3RvcmUoJnN0YWNrLT5lbnRyaWVzW2VudHJ5XS5hdG0sIG5ld2VudC5hdG0pOwotICB9IHdoaWxlICghZ3ByX2F0bV9yZWxfY2FzKCYoc3RhY2stPmhlYWQuYXRtKSwgaGVhZC5hdG0sIG5ld2hlYWQuYXRtKSk7Ci0gIC8qIFVzZSByZWxfY2FzIGFib3ZlIHRvIG1ha2Ugc3VyZSB0aGF0IGVudHJ5IGluZGV4IGlzIHNldCBwcm9wZXJseSAqLwotICByZXR1cm4gaGVhZC5jb250ZW50cy5pbmRleCA9PSBJTlZBTElEX0VOVFJZX0lOREVYOwotfQotCi1pbnQgZ3ByX3N0YWNrX2xvY2tmcmVlX3BvcChncHJfc3RhY2tfbG9ja2ZyZWUgKnN0YWNrKSB7Ci0gIGxvY2tmcmVlX25vZGUgaGVhZDsKLSAgbG9ja2ZyZWVfbm9kZSBuZXdoZWFkOwotCi0gIGRvIHsKLSAgICBoZWFkLmF0bSA9IGdwcl9hdG1fYWNxX2xvYWQoJihzdGFjay0+aGVhZC5hdG0pKTsKLSAgICBpZiAoaGVhZC5jb250ZW50cy5pbmRleCA9PSBJTlZBTElEX0VOVFJZX0lOREVYKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG5ld2hlYWQuYXRtID0KLSAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJihzdGFjay0+ZW50cmllc1toZWFkLmNvbnRlbnRzLmluZGV4XS5hdG0pKTsKLQotICB9IHdoaWxlICghZ3ByX2F0bV9ub19iYXJyaWVyX2NhcygmKHN0YWNrLT5oZWFkLmF0bSksIGhlYWQuYXRtLCBuZXdoZWFkLmF0bSkpOwotI2lmbmRlZiBOREVCVUcKLSAgLyogQ2hlY2sgZm9yIHZhbGlkIHBvcCAqLwotICB7Ci0gICAgaW50IHB1c2hlZF9pbmRleCA9IGhlYWQuY29udGVudHMuaW5kZXggLyAoOCAqIHNpemVvZihncHJfYXRtKSk7Ci0gICAgaW50IHB1c2hlZF9iaXQgPSBoZWFkLmNvbnRlbnRzLmluZGV4ICUgKDggKiBzaXplb2YoZ3ByX2F0bSkpOwotICAgIGdwcl9hdG0gb2xkX3ZhbDsKLQotICAgIG9sZF92YWwgPSBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZzdGFjay0+cHVzaGVkW3B1c2hlZF9pbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSgoZ3ByX2F0bSkxIDw8IHB1c2hlZF9iaXQpKTsKLSAgICBHUFJfQVNTRVJUKChvbGRfdmFsICYgKCgoZ3ByX2F0bSkxKSA8PCBwdXNoZWRfYml0KSkgIT0gMCk7Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBoZWFkLmNvbnRlbnRzLmluZGV4OwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIGIvc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZkMDZkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NVUFBPUlRfU1RBQ0tfTE9DS0ZSRUVfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9TVEFDS19MT0NLRlJFRV9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgZ3ByX3N0YWNrX2xvY2tmcmVlIGdwcl9zdGFja19sb2NrZnJlZTsKLQotLyogVGhpcyBzdGFjayBtdXN0IHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gdHJhY2suCi0gICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGFsbG93cyB1cCB0byA2NTUzNCBlbnRyaWVzICovCi1ncHJfc3RhY2tfbG9ja2ZyZWUgKmdwcl9zdGFja19sb2NrZnJlZV9jcmVhdGUoc2l6ZV90IGVudHJpZXMpOwotdm9pZCBncHJfc3RhY2tfbG9ja2ZyZWVfZGVzdHJveShncHJfc3RhY2tfbG9ja2ZyZWUgKnN0YWNrKTsKLQotLyogUGFzcyBpbiBhIHZhbGlkIGVudHJ5IG51bWJlciBmb3IgdGhlIG5leHQgc3RhY2sgZW50cnkgKi8KLS8qIFJldHVybnMgMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9uIHRoZSBzdGFjaywgMCBvdGhlcndpc2UgKi8KLWludCBncHJfc3RhY2tfbG9ja2ZyZWVfcHVzaChncHJfc3RhY2tfbG9ja2ZyZWUgKiwgaW50IGVudHJ5KTsKLQotLyogUmV0dXJucyAtMSBvbiBlbXB0eSBvciB0aGUgYWN0dWFsIGVudHJ5IG51bWJlciAqLwotaW50IGdwcl9zdGFja19sb2NrZnJlZV9wb3AoZ3ByX3N0YWNrX2xvY2tmcmVlICpzdGFjayk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VQUE9SVF9TVEFDS19MT0NLRlJFRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3N0cmluZy5jIGIvc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1NDFkZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L3N0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLWNoYXIgKmdwcl9zdHJkdXAoY29uc3QgY2hhciAqc3JjKSB7Ci0gIGNoYXIgKmRzdDsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAoIXNyYykgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgbGVuID0gc3RybGVuKHNyYykgKyAxOwotICBkc3QgPSBncHJfbWFsbG9jKGxlbik7Ci0KLSAgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCi0gIHJldHVybiBkc3Q7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc2l6ZV90IGNhcGFjaXR5OwotICBzaXplX3QgbGVuZ3RoOwotICBjaGFyICpkYXRhOwotfSBkdW1wX291dDsKLQotc3RhdGljIGR1bXBfb3V0IGR1bXBfb3V0X2NyZWF0ZSh2b2lkKSB7Ci0gIGR1bXBfb3V0IHIgPSB7MCwgMCwgTlVMTH07Ci0gIHJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wX291dF9hcHBlbmQoZHVtcF9vdXQgKm91dCwgY2hhciBjKSB7Ci0gIGlmIChvdXQtPmxlbmd0aCA9PSBvdXQtPmNhcGFjaXR5KSB7Ci0gICAgb3V0LT5jYXBhY2l0eSA9IEdQUl9NQVgoOCwgMiAqIG91dC0+Y2FwYWNpdHkpOwotICAgIG91dC0+ZGF0YSA9IGdwcl9yZWFsbG9jKG91dC0+ZGF0YSwgb3V0LT5jYXBhY2l0eSk7Ci0gIH0KLSAgb3V0LT5kYXRhW291dC0+bGVuZ3RoKytdID0gYzsKLX0KLQotc3RhdGljIHZvaWQgaGV4ZHVtcChkdW1wX291dCAqb3V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgaGV4WzE2XSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLQotICBjb25zdCB1aW50OF90ICpjb25zdCBiZWcgPSAoY29uc3QgdWludDhfdCAqKWJ1ZjsKLSAgY29uc3QgdWludDhfdCAqY29uc3QgZW5kID0gYmVnICsgbGVuOwotICBjb25zdCB1aW50OF90ICpjdXI7Ci0KLSAgZm9yIChjdXIgPSBiZWc7IGN1ciAhPSBlbmQ7ICsrY3VyKSB7Ci0gICAgaWYgKGN1ciAhPSBiZWcpIGR1bXBfb3V0X2FwcGVuZChvdXQsICcgJyk7Ci0gICAgZHVtcF9vdXRfYXBwZW5kKG91dCwgaGV4WypjdXIgPj4gNF0pOwotICAgIGR1bXBfb3V0X2FwcGVuZChvdXQsIGhleFsqY3VyICYgMHhmXSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYXNjaWlkdW1wKGR1bXBfb3V0ICpvdXQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgewotICBjb25zdCB1aW50OF90ICpjb25zdCBiZWcgPSAoY29uc3QgdWludDhfdCAqKWJ1ZjsKLSAgY29uc3QgdWludDhfdCAqY29uc3QgZW5kID0gYmVnICsgbGVuOwotICBjb25zdCB1aW50OF90ICpjdXI7Ci0gIGludCBvdXRfd2FzX2VtcHR5ID0gKG91dC0+bGVuZ3RoID09IDApOwotICBpZiAoIW91dF93YXNfZW1wdHkpIHsKLSAgICBkdW1wX291dF9hcHBlbmQob3V0LCAnICcpOwotICAgIGR1bXBfb3V0X2FwcGVuZChvdXQsICdcJycpOwotICB9Ci0gIGZvciAoY3VyID0gYmVnOyBjdXIgIT0gZW5kOyArK2N1cikgewotICAgIGR1bXBfb3V0X2FwcGVuZChvdXQsIChjaGFyKShpc3ByaW50KCpjdXIpID8gKihjaGFyICopY3VyIDogJy4nKSk7Ci0gIH0KLSAgaWYgKCFvdXRfd2FzX2VtcHR5KSB7Ci0gICAgZHVtcF9vdXRfYXBwZW5kKG91dCwgJ1wnJyk7Ci0gIH0KLX0KLQotY2hhciAqZ3ByX2R1bXAoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLCB1aW50MzJfdCBmbGFncykgewotICBkdW1wX291dCBvdXQgPSBkdW1wX291dF9jcmVhdGUoKTsKLSAgaWYgKGZsYWdzICYgR1BSX0RVTVBfSEVYKSB7Ci0gICAgaGV4ZHVtcCgmb3V0LCBidWYsIGxlbik7Ci0gIH0KLSAgaWYgKGZsYWdzICYgR1BSX0RVTVBfQVNDSUkpIHsKLSAgICBhc2NpaWR1bXAoJm91dCwgYnVmLCBsZW4pOwotICB9Ci0gIGR1bXBfb3V0X2FwcGVuZCgmb3V0LCAwKTsKLSAgcmV0dXJuIG91dC5kYXRhOwotfQotCi1jaGFyICpncHJfZHVtcF9zbGljZShncHJfc2xpY2UgcywgdWludDMyX3QgZmxhZ3MpIHsKLSAgcmV0dXJuIGdwcl9kdW1wKChjb25zdCBjaGFyICopR1BSX1NMSUNFX1NUQVJUX1BUUihzKSwgR1BSX1NMSUNFX0xFTkdUSChzKSwKLSAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLX0KLQotaW50IGdwcl9wYXJzZV9ieXRlc190b191aW50MzIoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLCB1aW50MzJfdCAqcmVzdWx0KSB7Ci0gIHVpbnQzMl90IG91dCA9IDA7Ci0gIHVpbnQzMl90IG5ldzsKLSAgc2l6ZV90IGk7Ci0KLSAgaWYgKGxlbiA9PSAwKSByZXR1cm4gMDsgLyogbXVzdCBoYXZlIHNvbWUgYnl0ZXMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBpZiAoYnVmW2ldIDwgJzAnIHx8IGJ1ZltpXSA+ICc5JykgcmV0dXJuIDA7IC8qIGJhZCBjaGFyICovCi0gICAgbmV3ID0gMTAgKiBvdXQgKyAodWludDMyX3QpKGJ1ZltpXSAtICcwJyk7Ci0gICAgaWYgKG5ldyA8IG91dCkgcmV0dXJuIDA7IC8qIG92ZXJmbG93ICovCi0gICAgb3V0ID0gbmV3OwotICB9Ci0KLSAgKnJlc3VsdCA9IG91dDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgZ3ByX3JldmVyc2VfYnl0ZXMoY2hhciAqc3RyLCBpbnQgbGVuKSB7Ci0gIGNoYXIgKnAxLCAqcDI7Ci0gIGZvciAocDEgPSBzdHIsIHAyID0gc3RyICsgbGVuIC0gMTsgcDIgPiBwMTsgKytwMSwgLS1wMikgewotICAgIGNoYXIgdGVtcCA9ICpwMTsKLSAgICAqcDEgPSAqcDI7Ci0gICAgKnAyID0gdGVtcDsKLSAgfQotfQotCi1pbnQgZ3ByX2x0b2EobG9uZyB2YWx1ZSwgY2hhciAqc3RyaW5nKSB7Ci0gIGxvbmcgc2lnbjsKLSAgaW50IGkgPSAwOwotCi0gIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgc3RyaW5nWzBdID0gJzAnOwotICAgIHN0cmluZ1sxXSA9IDA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBzaWduID0gdmFsdWUgPCAwID8gLTEgOiAxOwotICB3aGlsZSAodmFsdWUpIHsKLSAgICBzdHJpbmdbaSsrXSA9IChjaGFyKSgnMCcgKyBzaWduICogKHZhbHVlICUgMTApKTsKLSAgICB2YWx1ZSAvPSAxMDsKLSAgfQotICBpZiAoc2lnbiA8IDApIHN0cmluZ1tpKytdID0gJy0nOwotICBncHJfcmV2ZXJzZV9ieXRlcyhzdHJpbmcsIGkpOwotICBzdHJpbmdbaV0gPSAwOwotICByZXR1cm4gaTsKLX0KLQotaW50IGludDY0X3R0b2EoaW50NjRfdCB2YWx1ZSwgY2hhciAqc3RyaW5nKSB7Ci0gIGludDY0X3Qgc2lnbjsKLSAgaW50IGkgPSAwOwotCi0gIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgc3RyaW5nWzBdID0gJzAnOwotICAgIHN0cmluZ1sxXSA9IDA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBzaWduID0gdmFsdWUgPCAwID8gLTEgOiAxOwotICB3aGlsZSAodmFsdWUpIHsKLSAgICBzdHJpbmdbaSsrXSA9IChjaGFyKSgnMCcgKyBzaWduICogKHZhbHVlICUgMTApKTsKLSAgICB2YWx1ZSAvPSAxMDsKLSAgfQotICBpZiAoc2lnbiA8IDApIHN0cmluZ1tpKytdID0gJy0nOwotICBncHJfcmV2ZXJzZV9ieXRlcyhzdHJpbmcsIGkpOwotICBzdHJpbmdbaV0gPSAwOwotICByZXR1cm4gaTsKLX0KLQotY2hhciAqZ3ByX3N0cmpvaW4oY29uc3QgY2hhciAqKnN0cnMsIHNpemVfdCBuc3Rycywgc2l6ZV90ICpmaW5hbF9sZW5ndGgpIHsKLSAgcmV0dXJuIGdwcl9zdHJqb2luX3NlcChzdHJzLCBuc3RycywgIiIsIGZpbmFsX2xlbmd0aCk7Ci19Ci0KLWNoYXIgKmdwcl9zdHJqb2luX3NlcChjb25zdCBjaGFyICoqc3Rycywgc2l6ZV90IG5zdHJzLCBjb25zdCBjaGFyICpzZXAsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpmaW5hbF9sZW5ndGgpIHsKLSAgY29uc3Qgc2l6ZV90IHNlcF9sZW4gPSBzdHJsZW4oc2VwKTsKLSAgc2l6ZV90IG91dF9sZW5ndGggPSAwOwotICBzaXplX3QgaTsKLSAgY2hhciAqb3V0OwotICBmb3IgKGkgPSAwOyBpIDwgbnN0cnM7IGkrKykgewotICAgIG91dF9sZW5ndGggKz0gc3RybGVuKHN0cnNbaV0pOwotICB9Ci0gIG91dF9sZW5ndGggKz0gMTsgLyogbnVsbCB0ZXJtaW5hdG9yICovCi0gIGlmIChuc3RycyA+IDApIHsKLSAgICBvdXRfbGVuZ3RoICs9IHNlcF9sZW4gKiAobnN0cnMgLSAxKTsgLyogc2VwYXJhdG9ycyAqLwotICB9Ci0gIG91dCA9IGdwcl9tYWxsb2Mob3V0X2xlbmd0aCk7Ci0gIG91dF9sZW5ndGggPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbnN0cnM7IGkrKykgewotICAgIGNvbnN0IHNpemVfdCBzbGVuID0gc3RybGVuKHN0cnNbaV0pOwotICAgIGlmIChpICE9IDApIHsKLSAgICAgIG1lbWNweShvdXQgKyBvdXRfbGVuZ3RoLCBzZXAsIHNlcF9sZW4pOwotICAgICAgb3V0X2xlbmd0aCArPSBzZXBfbGVuOwotICAgIH0KLSAgICBtZW1jcHkob3V0ICsgb3V0X2xlbmd0aCwgc3Ryc1tpXSwgc2xlbik7Ci0gICAgb3V0X2xlbmd0aCArPSBzbGVuOwotICB9Ci0gIG91dFtvdXRfbGVuZ3RoXSA9IDA7Ci0gIGlmIChmaW5hbF9sZW5ndGggIT0gTlVMTCkgewotICAgICpmaW5hbF9sZW5ndGggPSBvdXRfbGVuZ3RoOwotICB9Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLS8qKiBGaW5kcyB0aGUgaW5pdGlhbCAoXGEgYmVnaW4pIGFuZCBmaW5hbCAoXGEgZW5kKSBvZmZzZXRzIG9mIHRoZSBuZXh0Ci0gKiBzdWJzdHJpbmcgZnJvbSBcYSBzdHIgKyBcYSByZWFkX29mZnNldCB1bnRpbCB0aGUgbmV4dCBcYSBzZXAgb3IgdGhlIGVuZCBvZiBcYQotICogc3RyLgotICoKLSAqIFJldHVybnMgMSBhbmQgdXBkYXRlcyBcYSBiZWdpbiBhbmQgXGEgZW5kLiBSZXR1cm5zIDAgb3RoZXJ3aXNlLiAqLwotc3RhdGljIGludCBzbGljZV9maW5kX3NlcGFyYXRvcl9vZmZzZXQoY29uc3QgZ3ByX3NsaWNlIHN0ciwgY29uc3QgY2hhciAqc2VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHJlYWRfb2Zmc2V0LCBzaXplX3QgKmJlZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICplbmQpIHsKLSAgc2l6ZV90IGk7Ci0gIGNvbnN0IHVpbnQ4X3QgKnN0cl9wdHIgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHN0cikgKyByZWFkX29mZnNldDsKLSAgY29uc3Qgc2l6ZV90IHN0cl9sZW4gPSBHUFJfU0xJQ0VfTEVOR1RIKHN0cikgLSByZWFkX29mZnNldDsKLSAgY29uc3Qgc2l6ZV90IHNlcF9sZW4gPSBzdHJsZW4oc2VwKTsKLSAgaWYgKHN0cl9sZW4gPCBzZXBfbGVuKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDw9IHN0cl9sZW4gLSBzZXBfbGVuOyBpKyspIHsKLSAgICBpZiAobWVtY21wKHN0cl9wdHIgKyBpLCBzZXAsIHNlcF9sZW4pID09IDApIHsKLSAgICAgICpiZWdpbiA9IHJlYWRfb2Zmc2V0OwotICAgICAgKmVuZCA9IHJlYWRfb2Zmc2V0ICsgaTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBncHJfc2xpY2Vfc3BsaXQoZ3ByX3NsaWNlIHN0ciwgY29uc3QgY2hhciAqc2VwLCBncHJfc2xpY2VfYnVmZmVyICpkc3QpIHsKLSAgY29uc3Qgc2l6ZV90IHNlcF9sZW4gPSBzdHJsZW4oc2VwKTsKLSAgc2l6ZV90IGJlZ2luLCBlbmQ7Ci0KLSAgR1BSX0FTU0VSVChzZXBfbGVuID4gMCk7Ci0KLSAgaWYgKHNsaWNlX2ZpbmRfc2VwYXJhdG9yX29mZnNldChzdHIsIHNlcCwgMCwgJmJlZ2luLCAmZW5kKSAhPSAwKSB7Ci0gICAgZG8gewotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChkc3QsIGdwcl9zbGljZV9zdWIoc3RyLCBiZWdpbiwgZW5kKSk7Ci0gICAgfSB3aGlsZSAoc2xpY2VfZmluZF9zZXBhcmF0b3Jfb2Zmc2V0KHN0ciwgc2VwLCBlbmQgKyBzZXBfbGVuLCAmYmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmQpICE9IDApOwotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkX2luZGV4ZWQoCi0gICAgICAgIGRzdCwgZ3ByX3NsaWNlX3N1YihzdHIsIGVuZCArIHNlcF9sZW4sIEdQUl9TTElDRV9MRU5HVEgoc3RyKSkpOwotICB9IGVsc2UgeyAvKiBubyBzZXAgZm91bmQsIGFkZCB3aG9sZSBpbnB1dCAqLwotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkX2luZGV4ZWQoZHN0LCBncHJfc2xpY2VfcmVmKHN0cikpOwotICB9Ci19Ci0KLXZvaWQgZ3ByX3N0cnZlY19pbml0KGdwcl9zdHJ2ZWMgKnN2KSB7IG1lbXNldChzdiwgMCwgc2l6ZW9mKCpzdikpOyB9Ci0KLXZvaWQgZ3ByX3N0cnZlY19kZXN0cm95KGdwcl9zdHJ2ZWMgKnN2KSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc3YtPmNvdW50OyBpKyspIHsKLSAgICBncHJfZnJlZShzdi0+c3Ryc1tpXSk7Ci0gIH0KLSAgZ3ByX2ZyZWUoc3YtPnN0cnMpOwotfQotCi12b2lkIGdwcl9zdHJ2ZWNfYWRkKGdwcl9zdHJ2ZWMgKnN2LCBjaGFyICpzdHIpIHsKLSAgaWYgKHN2LT5jb3VudCA9PSBzdi0+Y2FwYWNpdHkpIHsKLSAgICBzdi0+Y2FwYWNpdHkgPSBHUFJfTUFYKHN2LT5jYXBhY2l0eSArIDgsIHN2LT5jYXBhY2l0eSAqIDIpOwotICAgIHN2LT5zdHJzID0gZ3ByX3JlYWxsb2Moc3YtPnN0cnMsIHNpemVvZihjaGFyICopICogc3YtPmNhcGFjaXR5KTsKLSAgfQotICBzdi0+c3Ryc1tzdi0+Y291bnQrK10gPSBzdHI7Ci19Ci0KLWNoYXIgKmdwcl9zdHJ2ZWNfZmxhdHRlbihncHJfc3RydmVjICpzdiwgc2l6ZV90ICpmaW5hbF9sZW5ndGgpIHsKLSAgcmV0dXJuIGdwcl9zdHJqb2luKChjb25zdCBjaGFyICoqKXN2LT5zdHJzLCBzdi0+Y291bnQsIGZpbmFsX2xlbmd0aCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIGIvc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMTY4OC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NVUFBPUlRfU1RSSU5HX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NVUFBPUlRfU1RSSU5HX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogU3RyaW5nIHV0aWxpdHkgZnVuY3Rpb25zICovCi0KLS8qIEZsYWdzIGZvciBncHJfZHVtcCBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgR1BSX0RVTVBfSEVYIDB4MDAwMDAwMDEKLSNkZWZpbmUgR1BSX0RVTVBfQVNDSUkgMHgwMDAwMDAwMgotCi0vKiBDb252ZXJ0cyBhcnJheSBidWYsIG9mIGxlbmd0aCBsZW4sIGludG8gYSBDIHN0cmluZyAgYWNjb3JkaW5nIHRvIHRoZSBmbGFncy4KLSAgIFJlc3VsdCBzaG91bGQgYmUgZnJlZWQgd2l0aCBncHJfZnJlZSgpICovCi1jaGFyICpncHJfZHVtcChjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sIHVpbnQzMl90IGZsYWdzKTsKLQotLyogQ2FsbHMgZ3ByX2R1bXAgb24gYSBzbGljZS4gKi8KLWNoYXIgKmdwcl9kdW1wX3NsaWNlKGdwcl9zbGljZSBzbGljZSwgdWludDMyX3QgZmxhZ3MpOwotCi0vKiBQYXJzZXMgYW4gYXJyYXkgb2YgYnl0ZXMgaW50byBhbiBpbnRlZ2VyIChiYXNlIDEwKS4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsCi0gICAwIG9uIGZhaWx1cmUuICovCi1pbnQgZ3ByX3BhcnNlX2J5dGVzX3RvX3VpbnQzMihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlc3VsdCk7Ci0KLS8qIE1pbmltdW0gYnVmZmVyIHNpemUgZm9yIGNhbGxpbmcgbHRvYSAqLwotI2RlZmluZSBHUFJfTFRPQV9NSU5fQlVGU0laRSAoMyAqIHNpemVvZihsb25nKSkKLQotLyogQ29udmVydCBhIGxvbmcgdG8gYSBzdHJpbmcgaW4gYmFzZSAxMDsgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZQotICAgb3V0cHV0IHN0cmluZyAob3IgMCBvbiBmYWlsdXJlKS4KLSAgIG91dHB1dCBtdXN0IGJlIGF0IGxlYXN0IEdQUl9MVE9BX01JTl9CVUZTSVpFIGJ5dGVzIGxvbmcuICovCi1pbnQgZ3ByX2x0b2EobG9uZyB2YWx1ZSwgY2hhciAqb3V0cHV0KTsKLQotLyogTWluaW11bSBidWZmZXIgc2l6ZSBmb3IgY2FsbGluZyBpbnQ2NHRvYSAqLwotI2RlZmluZSBHUFJfSU5UNjRUT0FfTUlOX0JVRlNJWkUgKDMgKiBzaXplb2YoaW50NjRfdCkpCi0KLS8qIENvbnZlcnQgYW4gaW50NjQgdG8gYSBzdHJpbmcgaW4gYmFzZSAxMDsgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZQotb3V0cHV0IHN0cmluZyAob3IgMCBvbiBmYWlsdXJlKS4KLW91dHB1dCBtdXN0IGJlIGF0IGxlYXN0IEdQUl9JTlQ2NFRPQV9NSU5fQlVGU0laRSBieXRlcyBsb25nLgotTk9URTogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHN1ZmZpY2llbnQgYml0IHdpZHRoIGV2ZW4gb24gV2luIHg2NCwKLXdoZXJlIGxvbmcgaXMgMzJiaXQgaXMgc2l6ZS4qLwotaW50IGludDY0X3R0b2EoaW50NjRfdCB2YWx1ZSwgY2hhciAqb3V0cHV0KTsKLQotLyogUmV2ZXJzZSBhIHJ1biBvZiBieXRlcyAqLwotdm9pZCBncHJfcmV2ZXJzZV9ieXRlcyhjaGFyICpzdHIsIGludCBsZW4pOwotCi0vKiBKb2luIGEgc2V0IG9mIHN0cmluZ3MsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLSAgIFRvdGFsIGNvbWJpbmVkIGxlbmd0aCAoZXhjbHVkaW5nIG51bGwgdGVybWluYXRvcikgaXMgcmV0dXJuZWQgaW4gdG90YWxfbGVuZ3RoCi0gICBpZiBpdCBpcyBub24tbnVsbC4gKi8KLWNoYXIgKmdwcl9zdHJqb2luKGNvbnN0IGNoYXIgKipzdHJzLCBzaXplX3QgbnN0cnMsIHNpemVfdCAqdG90YWxfbGVuZ3RoKTsKLQotLyogSm9pbiBhIHNldCBvZiBzdHJpbmdzIHVzaW5nIGEgc2VwYXJhdG9yLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0gICBUb3RhbCBjb21iaW5lZCBsZW5ndGggKGV4Y2x1ZGluZyBudWxsIHRlcm1pbmF0b3IpIGlzIHJldHVybmVkIGluIHRvdGFsX2xlbmd0aAotICAgaWYgaXQgaXMgbm9uLW51bGwuICovCi1jaGFyICpncHJfc3Ryam9pbl9zZXAoY29uc3QgY2hhciAqKnN0cnMsIHNpemVfdCBuc3RycywgY29uc3QgY2hhciAqc2VwLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90YWxfbGVuZ3RoKTsKLQotLyoqIFNwbGl0IFxhIHN0ciBieSB0aGUgc2VwYXJhdG9yIFxhIHNlcC4gUmVzdWx0cyBhcmUgc3RvcmVkIGluIFxhIGRzdCwgd2hpY2gKLSAqIHNob3VsZCBiZSBhIHByb3Blcmx5IGluaXRpYWxpemVkIGluc3RhbmNlLiAqLwotdm9pZCBncHJfc2xpY2Vfc3BsaXQoZ3ByX3NsaWNlIHN0ciwgY29uc3QgY2hhciAqc2VwLCBncHJfc2xpY2VfYnVmZmVyICpkc3QpOwotCi0vKiBBIHZlY3RvciBvZiBzdHJpbmdzLi4uIGZvciBidWlsZGluZyB1cCBhIGZpbmFsIHN0cmluZyBvbmUgcGllY2UgYXQgYSB0aW1lICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKipzdHJzOwotICBzaXplX3QgY291bnQ7Ci0gIHNpemVfdCBjYXBhY2l0eTsKLX0gZ3ByX3N0cnZlYzsKLQotLyogSW5pdGlhbGl6ZS9kZXN0cm95ICovCi12b2lkIGdwcl9zdHJ2ZWNfaW5pdChncHJfc3RydmVjICpzdHJzKTsKLXZvaWQgZ3ByX3N0cnZlY19kZXN0cm95KGdwcl9zdHJ2ZWMgKnN0cnMpOwotLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RydmVjLCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHN0cmluZyAqLwotdm9pZCBncHJfc3RydmVjX2FkZChncHJfc3RydmVjICpzdHJzLCBjaGFyICphZGQpOwotLyogUmV0dXJuIGEgam9pbmVkIHN0cmluZyB3aXRoIGFsbCBhZGRlZCBzdWJzdHJpbmdzLCBvcHRpb25hbGx5IHNldHRpbmcKLSAgIHRvdGFsX2xlbmd0aCBhcyBwZXIgZ3ByX3N0cmpvaW4gKi8KLWNoYXIgKmdwcl9zdHJ2ZWNfZmxhdHRlbihncHJfc3RydmVjICpzdHJzLCBzaXplX3QgKnRvdGFsX2xlbmd0aCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VQUE9SVF9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuYyBiL3NyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODA5MDcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0vKiBQb3NpeCBjb2RlIGZvciBncHIgc25wcmludGYgc3VwcG9ydC4gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOMzIKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLWludCBncHJfYXNwcmludGYoY2hhciAqKnN0cnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldDsKLSAgc2l6ZV90IHN0cnBfYnVmbGVuOwotCi0gIC8qIERldGVybWluZSB0aGUgbGVuZ3RoLiAqLwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICByZXQgPSBfdnNjcHJpbnRmKGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICAqc3RycCA9IE5VTEw7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyLCB3aXRoIHNwYWNlIGZvciB0aGUgTlVMIHRlcm1pbmF0b3IuICovCi0gIHN0cnBfYnVmbGVuID0gKHNpemVfdClyZXQgKyAxOwotICBpZiAoKCpzdHJwID0gZ3ByX21hbGxvYyhzdHJwX2J1ZmxlbikpID09IE5VTEwpIHsKLSAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJlY2F1c2UgZ3ByX21hbGxvYygpIGNhbGxzIGFib3J0KCkuICovCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogUHJpbnQgdG8gdGhlIGJ1ZmZlci4gKi8KLSAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgcmV0ID0gdnNucHJpbnRmX3MoKnN0cnAsIHN0cnBfYnVmbGVuLCBfVFJVTkNBVEUsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgaWYgKChzaXplX3QpcmV0ID09IHN0cnBfYnVmbGVuIC0gMSkgewotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCi0gIGdwcl9mcmVlKCpzdHJwKTsKLSAgKnN0cnAgPSBOVUxMOwotICByZXR1cm4gLTE7Ci19Ci0KLSNpZiBkZWZpbmVkIFVOSUNPREUgfHwgZGVmaW5lZCBfVU5JQ09ERQotTFBUU1RSCi1ncHJfY2hhcl90b190Y2hhcihMUENTVFIgaW5wdXQpIHsKLSAgTFBUU1RSIHJldDsKLSAgaW50IG5lZWRlZCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgaW5wdXQsIC0xLCBOVUxMLCAwKTsKLSAgaWYgKG5lZWRlZCA8PSAwKSByZXR1cm4gTlVMTDsKLSAgcmV0ID0gZ3ByX21hbGxvYygodW5zaWduZWQpbmVlZGVkICogc2l6ZW9mKFRDSEFSKSk7Ci0gIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgaW5wdXQsIC0xLCByZXQsIG5lZWRlZCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLUxQU1RSCi1ncHJfdGNoYXJfdG9fY2hhcihMUENUU1RSIGlucHV0KSB7Ci0gIExQU1RSIHJldDsKLSAgaW50IG5lZWRlZCA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgaW5wdXQsIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLSAgaWYgKG5lZWRlZCA8PSAwKSByZXR1cm4gTlVMTDsKLSAgcmV0ID0gZ3ByX21hbGxvYygodW5zaWduZWQpbmVlZGVkKTsKLSAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLCBpbnB1dCwgLTEsIHJldCwgbmVlZGVkLCBOVUxMLCBOVUxMKTsKLSAgcmV0dXJuIHJldDsKLX0KLSNlbHNlCi1jaGFyICpncHJfdGNoYXJfdG9fY2hhcihMUFRTVFIgaW5wdXQpIHsgcmV0dXJuIGdwcl9zdHJkdXAoaW5wdXQpOyB9Ci0KLWNoYXIgKmdwcl9jaGFyX3RvX3RjaGFyKExQVFNUUiBpbnB1dCkgeyByZXR1cm4gZ3ByX3N0cmR1cChpbnB1dCk7IH0KLSNlbmRpZgotCi0jZW5kaWYgLyogR1BSX1dJTjMyICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oIGIvc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhZThkOS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VQUE9SVF9TVFJJTkdfV0lOMzJfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9TVFJJTkdfV0lOMzJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9XSU4zMgotCi0vKiBUaGVzZSBhbGxvY2F0ZSBuZXcgc3RyaW5ncyB1c2luZyBncHJfbWFsbG9jIHRvIGNvbnZlcnQgZnJvbSBhbmQgdG8gdXRmLTguICovCi1MUFRTVFIgZ3ByX2NoYXJfdG9fdGNoYXIoTFBDU1RSIGlucHV0KTsKLUxQU1RSIGdwcl90Y2hhcl90b19jaGFyKExQQ1RTVFIgaW5wdXQpOwotCi0jZW5kaWYgLyogR1BSX1dJTjMyICovCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VQUE9SVF9TVFJJTkdfV0lOMzJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyBiL3NyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZmJlZmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lORE9XU19TVUJQUk9DRVNTCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0Y2hhci5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3VicHJvY2Vzcy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIKLQotc3RydWN0IGdwcl9zdWJwcm9jZXNzIHsKLSAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKLSAgaW50IGpvaW5lZDsKLSAgaW50IGludGVycnVwdGVkOwotfTsKLQotY29uc3QgY2hhciAqZ3ByX3N1YnByb2Nlc3NfYmluYXJ5X2V4dGVuc2lvbigpIHsgcmV0dXJuICIuZXhlIjsgfQotCi1ncHJfc3VicHJvY2VzcyAqZ3ByX3N1YnByb2Nlc3NfY3JlYXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgewotICBncHJfc3VicHJvY2VzcyAqcjsKLQotICBTVEFSVFVQSU5GTyBzaTsKLSAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKLQotICBjaGFyICphcmdzID0gZ3ByX3N0cmpvaW5fc2VwKGFyZ3YsIChzaXplX3QpYXJnYywgIiAiLCBOVUxMKTsKLSAgVENIQVIgKmFyZ3NfdGNoYXI7Ci0KLSAgYXJnc190Y2hhciA9IGdwcl9jaGFyX3RvX3RjaGFyKGFyZ3MpOwotICBncHJfZnJlZShhcmdzKTsKLQotICBtZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsKLSAgc2kuY2IgPSBzaXplb2Yoc2kpOwotICBtZW1zZXQoJnBpLCAwLCBzaXplb2YocGkpKTsKLQotICBpZiAoIUNyZWF0ZVByb2Nlc3MoTlVMTCwgYXJnc190Y2hhciwgTlVMTCwgTlVMTCwgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAsIE5VTEwsIE5VTEwsICZzaSwgJnBpKSkgewotICAgIGdwcl9mcmVlKGFyZ3NfdGNoYXIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGdwcl9mcmVlKGFyZ3NfdGNoYXIpOwotCi0gIHIgPSBncHJfbWFsbG9jKHNpemVvZihncHJfc3VicHJvY2VzcykpOwotICBtZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7Ci0gIHItPnBpID0gcGk7Ci0gIHJldHVybiByOwotfQotCi12b2lkIGdwcl9zdWJwcm9jZXNzX2Rlc3Ryb3koZ3ByX3N1YnByb2Nlc3MgKnApIHsKLSAgaWYgKHApIHsKLSAgICBpZiAoIXAtPmpvaW5lZCkgewotICAgICAgZ3ByX3N1YnByb2Nlc3NfaW50ZXJydXB0KHApOwotICAgICAgZ3ByX3N1YnByb2Nlc3Nfam9pbihwKTsKLSAgICB9Ci0gICAgaWYgKHAtPnBpLmhQcm9jZXNzKSB7Ci0gICAgICBDbG9zZUhhbmRsZShwLT5waS5oUHJvY2Vzcyk7Ci0gICAgfQotICAgIGlmIChwLT5waS5oVGhyZWFkKSB7Ci0gICAgICBDbG9zZUhhbmRsZShwLT5waS5oVGhyZWFkKTsKLSAgICB9Ci0gICAgZ3ByX2ZyZWUocCk7Ci0gIH0KLX0KLQotaW50IGdwcl9zdWJwcm9jZXNzX2pvaW4oZ3ByX3N1YnByb2Nlc3MgKnApIHsKLSAgRFdPUkQgZHdFeGl0Q29kZTsKLSAgaWYgKEdldEV4aXRDb2RlUHJvY2VzcyhwLT5waS5oUHJvY2VzcywgJmR3RXhpdENvZGUpKSB7Ci0gICAgaWYgKGR3RXhpdENvZGUgPT0gU1RJTExfQUNUSVZFKSB7Ci0gICAgICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdChwLT5waS5oUHJvY2VzcywgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApIHsKLSAgICAgICAgcC0+am9pbmVkID0gMTsKLSAgICAgICAgZ290byBnZXRFeGl0Q29kZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZCB0byBqb2luCi0gICAgfSBlbHNlIHsKLSAgICAgIGdvdG8gZ2V0RXhpdENvZGU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZCB0byBnZXQgZXhpdCBjb2RlCi0gIH0KLQotZ2V0RXhpdENvZGU6Ci0gIGlmIChwLT5pbnRlcnJ1cHRlZCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChHZXRFeGl0Q29kZVByb2Nlc3MocC0+cGkuaFByb2Nlc3MsICZkd0V4aXRDb2RlKSkgewotICAgIHJldHVybiAoaW50KWR3RXhpdENvZGU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOyAgLy8gZmFpbGVkIHRvIGdldCBleGl0IGNvZGUKLSAgfQotfQotCi12b2lkIGdwcl9zdWJwcm9jZXNzX2ludGVycnVwdChncHJfc3VicHJvY2VzcyAqcCkgewotICBEV09SRCBkd0V4aXRDb2RlOwotICBpZiAoR2V0RXhpdENvZGVQcm9jZXNzKHAtPnBpLmhQcm9jZXNzLCAmZHdFeGl0Q29kZSkpIHsKLSAgICBpZiAoZHdFeGl0Q29kZSA9PSBTVElMTF9BQ1RJVkUpIHsKLSAgICAgIGdwcl9sb2coR1BSX0lORk8sICJzZW5kaW5nIGN0cmwtYnJlYWsiKTsKLSAgICAgIEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudChDVFJMX0JSRUFLX0VWRU5ULCBwLT5waS5kd1Byb2Nlc3NJZCk7Ci0gICAgICBwLT5qb2luZWQgPSAxOwotICAgICAgcC0+aW50ZXJydXB0ZWQgPSAxOwotICAgIH0KLSAgfQotICByZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBHUFJfV0lORE9XU19TVUJQUk9DRVNTICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3N5bmNfcG9zaXguYyBiL3NyYy9jb3JlL3N1cHBvcnQvc3luY19wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRkMGFjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvc3luY19wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaWZkZWYgR1BSX1BPU0lYX1NZTkMKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotCi12b2lkIGdwcl9tdV9pbml0KGdwcl9tdSogbXUpIHsgR1BSX0FTU0VSVChwdGhyZWFkX211dGV4X2luaXQobXUsIE5VTEwpID09IDApOyB9Ci0KLXZvaWQgZ3ByX211X2Rlc3Ryb3koZ3ByX211KiBtdSkgeyBHUFJfQVNTRVJUKHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtdSkgPT0gMCk7IH0KLQotdm9pZCBncHJfbXVfbG9jayhncHJfbXUqIG11KSB7Ci0gIEdQUl9USU1FUl9CRUdJTigiZ3ByX211X2xvY2siLCAwKTsKLSAgR1BSX0FTU0VSVChwdGhyZWFkX211dGV4X2xvY2sobXUpID09IDApOwotICBHUFJfVElNRVJfRU5EKCJncHJfbXVfbG9jayIsIDApOwotfQotCi12b2lkIGdwcl9tdV91bmxvY2soZ3ByX211KiBtdSkgewotICBHUFJfVElNRVJfQkVHSU4oImdwcl9tdV91bmxvY2siLCAwKTsKLSAgR1BSX0FTU0VSVChwdGhyZWFkX211dGV4X3VubG9jayhtdSkgPT0gMCk7Ci0gIEdQUl9USU1FUl9FTkQoImdwcl9tdV91bmxvY2siLCAwKTsKLX0KLQotaW50IGdwcl9tdV90cnlsb2NrKGdwcl9tdSogbXUpIHsKLSAgaW50IGVycjsKLSAgR1BSX1RJTUVSX0JFR0lOKCJncHJfbXVfdHJ5bG9jayIsIDApOwotICBlcnIgPSBwdGhyZWFkX211dGV4X3RyeWxvY2sobXUpOwotICBHUFJfQVNTRVJUKGVyciA9PSAwIHx8IGVyciA9PSBFQlVTWSk7Ci0gIEdQUl9USU1FUl9FTkQoImdwcl9tdV90cnlsb2NrIiwgMCk7Ci0gIHJldHVybiBlcnIgPT0gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBncHJfY3ZfaW5pdChncHJfY3YqIGN2KSB7IEdQUl9BU1NFUlQocHRocmVhZF9jb25kX2luaXQoY3YsIE5VTEwpID09IDApOyB9Ci0KLXZvaWQgZ3ByX2N2X2Rlc3Ryb3koZ3ByX2N2KiBjdikgeyBHUFJfQVNTRVJUKHB0aHJlYWRfY29uZF9kZXN0cm95KGN2KSA9PSAwKTsgfQotCi1pbnQgZ3ByX2N2X3dhaXQoZ3ByX2N2KiBjdiwgZ3ByX211KiBtdSwgZ3ByX3RpbWVzcGVjIGFic19kZWFkbGluZSkgewotICBpbnQgZXJyID0gMDsKLSAgaWYgKGdwcl90aW1lX2NtcChhYnNfZGVhZGxpbmUsIGdwcl9pbmZfZnV0dXJlKGFic19kZWFkbGluZS5jbG9ja190eXBlKSkgPT0KLSAgICAgIDApIHsKLSAgICBlcnIgPSBwdGhyZWFkX2NvbmRfd2FpdChjdiwgbXUpOwotICB9IGVsc2UgewotICAgIHN0cnVjdCB0aW1lc3BlYyBhYnNfZGVhZGxpbmVfdHM7Ci0gICAgYWJzX2RlYWRsaW5lID0gZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShhYnNfZGVhZGxpbmUsIEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gICAgYWJzX2RlYWRsaW5lX3RzLnR2X3NlYyA9ICh0aW1lX3QpYWJzX2RlYWRsaW5lLnR2X3NlYzsKLSAgICBhYnNfZGVhZGxpbmVfdHMudHZfbnNlYyA9IGFic19kZWFkbGluZS50dl9uc2VjOwotICAgIGVyciA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoY3YsIG11LCAmYWJzX2RlYWRsaW5lX3RzKTsKLSAgfQotICBHUFJfQVNTRVJUKGVyciA9PSAwIHx8IGVyciA9PSBFVElNRURPVVQgfHwgZXJyID09IEVBR0FJTik7Ci0gIHJldHVybiBlcnIgPT0gRVRJTUVET1VUOwotfQotCi12b2lkIGdwcl9jdl9zaWduYWwoZ3ByX2N2KiBjdikgeyBHUFJfQVNTRVJUKHB0aHJlYWRfY29uZF9zaWduYWwoY3YpID09IDApOyB9Ci0KLXZvaWQgZ3ByX2N2X2Jyb2FkY2FzdChncHJfY3YqIGN2KSB7Ci0gIEdQUl9BU1NFUlQocHRocmVhZF9jb25kX2Jyb2FkY2FzdChjdikgPT0gMCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgZ3ByX29uY2VfaW5pdChncHJfb25jZSogb25jZSwgdm9pZCAoKmluaXRfZnVuY3Rpb24pKHZvaWQpKSB7Ci0gIEdQUl9BU1NFUlQocHRocmVhZF9vbmNlKG9uY2UsIGluaXRfZnVuY3Rpb24pID09IDApOwotfQotCi0jZW5kaWYgLyogR1JQX1BPU0lYX1NZTkMgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGhkLmMgYi9zcmMvY29yZS9zdXBwb3J0L3RoZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRhZWI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvdGhkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyogUG9zaXggaW1wbGVtZW50YXRpb24gZm9yIGdwciB0aHJlYWRzLiAqLwotCi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+Ci0KLWVudW0geyBHUFJfVEhEX0pPSU5BQkxFID0gMSB9OwotCi1ncHJfdGhkX29wdGlvbnMgZ3ByX3RoZF9vcHRpb25zX2RlZmF1bHQodm9pZCkgewotICBncHJfdGhkX29wdGlvbnMgb3B0aW9uczsKLSAgbWVtc2V0KCZvcHRpb25zLCAwLCBzaXplb2Yob3B0aW9ucykpOwotICByZXR1cm4gb3B0aW9uczsKLX0KLQotdm9pZCBncHJfdGhkX29wdGlvbnNfc2V0X2RldGFjaGVkKGdwcl90aGRfb3B0aW9ucyogb3B0aW9ucykgewotICBvcHRpb25zLT5mbGFncyAmPSB+R1BSX1RIRF9KT0lOQUJMRTsKLX0KLQotdm9pZCBncHJfdGhkX29wdGlvbnNfc2V0X2pvaW5hYmxlKGdwcl90aGRfb3B0aW9ucyogb3B0aW9ucykgewotICBvcHRpb25zLT5mbGFncyB8PSBHUFJfVEhEX0pPSU5BQkxFOwotfQotCi1pbnQgZ3ByX3RoZF9vcHRpb25zX2lzX2RldGFjaGVkKGNvbnN0IGdwcl90aGRfb3B0aW9ucyogb3B0aW9ucykgewotICBpZiAoIW9wdGlvbnMpIHJldHVybiAxOwotICByZXR1cm4gKG9wdGlvbnMtPmZsYWdzICYgR1BSX1RIRF9KT0lOQUJMRSkgPT0gMDsKLX0KLQotaW50IGdwcl90aGRfb3B0aW9uc19pc19qb2luYWJsZShjb25zdCBncHJfdGhkX29wdGlvbnMqIG9wdGlvbnMpIHsKLSAgaWYgKCFvcHRpb25zKSByZXR1cm4gMDsKLSAgcmV0dXJuIChvcHRpb25zLT5mbGFncyAmIEdQUl9USERfSk9JTkFCTEUpID09IEdQUl9USERfSk9JTkFCTEU7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIGIvc3JjL2NvcmUvc3VwcG9ydC90aGRfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiOTA0ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VQUE9SVF9USERfSU5URVJOQUxfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9USERfSU5URVJOQUxfSAotCi0vKiBJbnRlcm5hbCBpbnRlcmZhY2VzIGJldHdlZW4gbW9kdWxlcyB3aXRoaW4gdGhlIGdwciBzdXBwb3J0IGxpYnJhcnkuICAqLwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUFBPUlRfVEhEX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGltZV9wb3NpeC5jIGIvc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTllMDguLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8c3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuaD4KLQotI2lmZGVmIEdQUl9QT1NJWF9USU1FCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgX19saW51eF9fCi0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIKLQotc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB0aW1lc3BlY19mcm9tX2dwcihncHJfdGltZXNwZWMgZ3RzKSB7Ci0gIHN0cnVjdCB0aW1lc3BlYyBydjsKLSAgaWYgKHNpemVvZih0aW1lX3QpIDwgc2l6ZW9mKGludDY0X3QpKSB7Ci0gICAgLyogZmluZSB0byBhc3NlcnQsIGFzIHRoaXMgaXMgb25seSB1c2VkIGluIGdwcl9zbGVlcF91bnRpbCAqLwotICAgIEdQUl9BU1NFUlQoZ3RzLnR2X3NlYyA8PSBJTlQzMl9NQVggJiYgZ3RzLnR2X3NlYyA+PSBJTlQzMl9NSU4pOwotICB9Ci0gIHJ2LnR2X3NlYyA9ICh0aW1lX3QpZ3RzLnR2X3NlYzsKLSAgcnYudHZfbnNlYyA9IGd0cy50dl9uc2VjOwotICByZXR1cm4gcnY7Ci19Ci0KLSNpZiBfUE9TSVhfVElNRVJTID4gMAotc3RhdGljIGdwcl90aW1lc3BlYyBncHJfZnJvbV90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9jbG9ja190eXBlIGNsb2NrX3R5cGUpIHsKLSAgLyoKLSAgICogdGltZXNwZWMudHZfc2VjIGNhbiBoYXZlIHNtYWxsZXIgc2l6ZSB0aGFuIGdwcl90aW1lc3BlYy50dl9zZWMsCi0gICAqIGJ1dCB3ZSBhcmUgb25seSB1c2luZyB0aGlzIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBncHJfbm93Ci0gICAqIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBoYW5kbGUgImluZmluaXR5IiB2YWx1ZXMuCi0gICAqLwotICBncHJfdGltZXNwZWMgcnY7Ci0gIHJ2LnR2X3NlYyA9IHRzLnR2X3NlYzsKLSAgcnYudHZfbnNlYyA9IChpbnQzMl90KXRzLnR2X25zZWM7Ci0gIHJ2LmNsb2NrX3R5cGUgPSBjbG9ja190eXBlOwotICByZXR1cm4gcnY7Ci19Ci0KLS8qKiBtYXBzIGdwcl9jbG9ja190eXBlIC0tPiBjbG9ja2lkX3QgZm9yIGNsb2NrX2dldHRpbWUgKi8KLXN0YXRpYyBjb25zdCBjbG9ja2lkX3QgY2xvY2tpZF9mb3JfZ3ByX2Nsb2NrW10gPSB7Q0xPQ0tfTU9OT1RPTklDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9DS19SRUFMVElNRX07Ci0KLXZvaWQgZ3ByX3RpbWVfaW5pdCh2b2lkKSB7IGdwcl9wcmVjaXNlX2Nsb2NrX2luaXQoKTsgfQotCi1ncHJfdGltZXNwZWMgZ3ByX25vdyhncHJfY2xvY2tfdHlwZSBjbG9ja190eXBlKSB7Ci0gIHN0cnVjdCB0aW1lc3BlYyBub3c7Ci0gIEdQUl9BU1NFUlQoY2xvY2tfdHlwZSAhPSBHUFJfVElNRVNQQU4pOwotICBpZiAoY2xvY2tfdHlwZSA9PSBHUFJfQ0xPQ0tfUFJFQ0lTRSkgewotICAgIGdwcl90aW1lc3BlYyByZXQ7Ci0gICAgZ3ByX3ByZWNpc2VfY2xvY2tfbm93KCZyZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0gZWxzZSB7Ci0jaWYgZGVmaW5lZChHUFJfQkFDS1dBUkRTX0NPTVBBVElCSUxJVFlfTU9ERSkgJiYgZGVmaW5lZChfX2xpbnV4X18pCi0gICAgLyogYXZvaWQgQUJJIHByb2JsZW1zIGJ5IGludm9raW5nIHN5c2NhbGxzIGRpcmVjdGx5ICovCi0gICAgc3lzY2FsbChTWVNfY2xvY2tfZ2V0dGltZSwgY2xvY2tpZF9mb3JfZ3ByX2Nsb2NrW2Nsb2NrX3R5cGVdLCAmbm93KTsKLSNlbHNlCi0gICAgY2xvY2tfZ2V0dGltZShjbG9ja2lkX2Zvcl9ncHJfY2xvY2tbY2xvY2tfdHlwZV0sICZub3cpOwotI2VuZGlmCi0gICAgcmV0dXJuIGdwcl9mcm9tX3RpbWVzcGVjKG5vdywgY2xvY2tfdHlwZSk7Ci0gIH0KLX0KLSNlbHNlCi0vKiBGb3Igc29tZSByZWFzb24gQXBwbGUncyBPU2VzIGhhdmVuJ3QgaW1wbGVtZW50ZWQgY2xvY2tfZ2V0dGltZS4gKi8KLQotI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgotI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotc3RhdGljIGRvdWJsZSBnX3RpbWVfc2NhbGU7Ci1zdGF0aWMgdWludDY0X3QgZ190aW1lX3N0YXJ0OwotCi12b2lkIGdwcl90aW1lX2luaXQodm9pZCkgewotICBtYWNoX3RpbWViYXNlX2luZm9fZGF0YV90IHRiID0gezAsIDF9OwotICBncHJfcHJlY2lzZV9jbG9ja19pbml0KCk7Ci0gIG1hY2hfdGltZWJhc2VfaW5mbygmdGIpOwotICBnX3RpbWVfc2NhbGUgPSB0Yi5udW1lcjsKLSAgZ190aW1lX3NjYWxlIC89IHRiLmRlbm9tOwotICBnX3RpbWVfc3RhcnQgPSBtYWNoX2Fic29sdXRlX3RpbWUoKTsKLX0KLQotZ3ByX3RpbWVzcGVjIGdwcl9ub3coZ3ByX2Nsb2NrX3R5cGUgY2xvY2spIHsKLSAgZ3ByX3RpbWVzcGVjIG5vdzsKLSAgc3RydWN0IHRpbWV2YWwgbm93X3R2OwotICBkb3VibGUgbm93X2RibDsKLQotICBub3cuY2xvY2tfdHlwZSA9IGNsb2NrOwotICBzd2l0Y2ggKGNsb2NrKSB7Ci0gICAgY2FzZSBHUFJfQ0xPQ0tfUkVBTFRJTUU6Ci0gICAgICBnZXR0aW1lb2ZkYXkoJm5vd190diwgTlVMTCk7Ci0gICAgICBub3cudHZfc2VjID0gbm93X3R2LnR2X3NlYzsKLSAgICAgIG5vdy50dl9uc2VjID0gbm93X3R2LnR2X3VzZWMgKiAxMDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUFJfQ0xPQ0tfTU9OT1RPTklDOgotICAgICAgbm93X2RibCA9IChtYWNoX2Fic29sdXRlX3RpbWUoKSAtIGdfdGltZV9zdGFydCkgKiBnX3RpbWVfc2NhbGU7Ci0gICAgICBub3cudHZfc2VjID0gKGludDY0X3QpKG5vd19kYmwgKiAxZS05KTsKLSAgICAgIG5vdy50dl9uc2VjID0gKGludDMyX3QpKG5vd19kYmwgLSAoKGRvdWJsZSlub3cudHZfc2VjKSAqIDFlOSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQUl9DTE9DS19QUkVDSVNFOgotICAgICAgZ3ByX3ByZWNpc2VfY2xvY2tfbm93KCZub3cpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUFJfVElNRVNQQU46Ci0gICAgICBhYm9ydCgpOwotICB9Ci0KLSAgcmV0dXJuIG5vdzsKLX0KLSNlbmRpZgotCi12b2lkIGdwcl9zbGVlcF91bnRpbChncHJfdGltZXNwZWMgdW50aWwpIHsKLSAgZ3ByX3RpbWVzcGVjIG5vdzsKLSAgZ3ByX3RpbWVzcGVjIGRlbHRhOwotICBzdHJ1Y3QgdGltZXNwZWMgZGVsdGFfdHM7Ci0gIGludCBuc19yZXN1bHQ7Ci0KLSAgZm9yICg7OykgewotICAgIC8qIFdlIGNvdWxkIHNpbXBsaWZ5IGJ5IHVzaW5nIGNsb2NrX25hbm9zbGVlcCBpbnN0ZWFkLCBidXQgaXQgbWlnaHQgYmUKLSAgICAgKiBzbGlnaHRseSBsZXNzIHBvcnRhYmxlLiAqLwotICAgIG5vdyA9IGdwcl9ub3codW50aWwuY2xvY2tfdHlwZSk7Ci0gICAgaWYgKGdwcl90aW1lX2NtcCh1bnRpbCwgbm93KSA8PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGVsdGEgPSBncHJfdGltZV9zdWIodW50aWwsIG5vdyk7Ci0gICAgZGVsdGFfdHMgPSB0aW1lc3BlY19mcm9tX2dwcihkZWx0YSk7Ci0gICAgR1JQQ19TQ0hFRFVMSU5HX1NUQVJUX0JMT0NLSU5HX1JFR0lPTjsKLSAgICBuc19yZXN1bHQgPSBuYW5vc2xlZXAoJmRlbHRhX3RzLCBOVUxMKTsKLSAgICBHUlBDX1NDSEVEVUxJTkdfRU5EX0JMT0NLSU5HX1JFR0lPTjsKLSAgICBpZiAobnNfcmVzdWx0ID09IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLyogR1BSX1BPU0lYX1RJTUUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMgYi9zcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmNmNzRiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBHUlBDX1RJTUVSU19SRFRTQwotI2lmIGRlZmluZWQoX19pMzg2X18pCi1zdGF0aWMgdm9pZCBncHJfZ2V0X2N5Y2xlX2NvdW50ZXIobG9uZyBsb25nIGludCAqY2xrKSB7Ci0gIGxvbmcgbG9uZyBpbnQgcmV0OwotICBfX2FzbV9fIHZvbGF0aWxlKCJyZHRzYyIgOiAiPUEiKHJldCkpOwotICAqY2xrID0gcmV0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hbWQ2NF9fKQotc3RhdGljIHZvaWQgZ3ByX2dldF9jeWNsZV9jb3VudGVyKGxvbmcgbG9uZyBpbnQgKmNsaykgewotICB1bnNpZ25lZCBsb25nIGxvbmcgbG93LCBoaWdoOwotICBfX2FzbV9fIHZvbGF0aWxlKCJyZHRzYyIgOiAiPWEiKGxvdyksICI9ZCIoaGlnaCkpOwotICAqY2xrID0gKGxvbmcgbG9uZykoaGlnaCA8PCAzMikgfCAobG9uZyBsb25nKWxvdzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgZG91YmxlIGN5Y2xlc19wZXJfc2Vjb25kID0gMDsKLXN0YXRpYyBsb25nIGxvbmcgaW50IHN0YXJ0X2N5Y2xlOwotdm9pZCBncHJfcHJlY2lzZV9jbG9ja19pbml0KHZvaWQpIHsKLSAgdGltZV90IHN0YXJ0OwotICBsb25nIGxvbmcgZW5kX2N5Y2xlOwotICBncHJfbG9nKEdQUl9ERUJVRywgIkNhbGlicmF0aW5nIHRpbWVycyIpOwotICBzdGFydCA9IHRpbWUoTlVMTCk7Ci0gIHdoaWxlICh0aW1lKE5VTEwpID09IHN0YXJ0KQotICAgIDsKLSAgZ3ByX2dldF9jeWNsZV9jb3VudGVyKCZzdGFydF9jeWNsZSk7Ci0gIHdoaWxlICh0aW1lKE5VTEwpIDw9IHN0YXJ0ICsgMTApCi0gICAgOwotICBncHJfZ2V0X2N5Y2xlX2NvdW50ZXIoJmVuZF9jeWNsZSk7Ci0gIGN5Y2xlc19wZXJfc2Vjb25kID0gKGRvdWJsZSkoZW5kX2N5Y2xlIC0gc3RhcnRfY3ljbGUpIC8gMTAuMDsKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICIuLi4gY3ljbGVzX3Blcl9zZWNvbmQgPSAlZlxuIiwgY3ljbGVzX3Blcl9zZWNvbmQpOwotfQotCi12b2lkIGdwcl9wcmVjaXNlX2Nsb2NrX25vdyhncHJfdGltZXNwZWMgKmNsaykgewotICBsb25nIGxvbmcgaW50IGNvdW50ZXI7Ci0gIGRvdWJsZSBzZWNzOwotICBncHJfZ2V0X2N5Y2xlX2NvdW50ZXIoJmNvdW50ZXIpOwotICBzZWNzID0gKGRvdWJsZSkoY291bnRlciAtIHN0YXJ0X2N5Y2xlKSAvIGN5Y2xlc19wZXJfc2Vjb25kOwotICBjbGstPmNsb2NrX3R5cGUgPSBHUFJfQ0xPQ0tfUFJFQ0lTRTsKLSAgY2xrLT50dl9zZWMgPSAoaW50NjRfdClzZWNzOwotICBjbGstPnR2X25zZWMgPSAoaW50MzJfdCkoMWU5ICogKHNlY3MgLSAoZG91YmxlKWNsay0+dHZfc2VjKSk7Ci19Ci0KLSNlbHNlICAvKiBHUlBDX1RJTUVSU19SRFRTQyAqLwotdm9pZCBncHJfcHJlY2lzZV9jbG9ja19pbml0KHZvaWQpIHt9Ci0KLXZvaWQgZ3ByX3ByZWNpc2VfY2xvY2tfbm93KGdwcl90aW1lc3BlYyAqY2xrKSB7Ci0gICpjbGsgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gIGNsay0+Y2xvY2tfdHlwZSA9IEdQUl9DTE9DS19QUkVDSVNFOwotfQotI2VuZGlmIC8qIEdSUENfVElNRVJTX1JEVFNDICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oIGIvc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxYzk5YS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VQUE9SVF9USU1FX1BSRUNJU0VfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VQUE9SVF9USU1FX1BSRUNJU0VfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLQotdm9pZCBncHJfcHJlY2lzZV9jbG9ja19pbml0KHZvaWQpOwotdm9pZCBncHJfcHJlY2lzZV9jbG9ja19ub3coZ3ByX3RpbWVzcGVjICpjbGspOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUFBPUlRfVElNRV9QUkVDSVNFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdGltZV93aW4zMi5jIGIvc3JjL2NvcmUvc3VwcG9ydC90aW1lX3dpbjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzQ0ZDMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC90aW1lX3dpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyogV2luMzIgY29kZSBmb3IgZ3ByIHRpbWUgc3VwcG9ydC4gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfV0lOMzIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxzcmMvY29yZS9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oPgotI2luY2x1ZGUgPHN5cy90aW1lYi5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIgotCi1zdGF0aWMgTEFSR0VfSU5URUdFUiBnX3N0YXJ0X3RpbWU7Ci1zdGF0aWMgZG91YmxlIGdfdGltZV9zY2FsZTsKLQotdm9pZCBncHJfdGltZV9pbml0KHZvaWQpIHsKLSAgTEFSR0VfSU5URUdFUiBmcmVxdWVuY3k7Ci0gIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXF1ZW5jeSk7Ci0gIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZnX3N0YXJ0X3RpbWUpOwotICBnX3RpbWVfc2NhbGUgPSAxLjAgLyAoZG91YmxlKWZyZXF1ZW5jeS5RdWFkUGFydDsKLX0KLQotZ3ByX3RpbWVzcGVjIGdwcl9ub3coZ3ByX2Nsb2NrX3R5cGUgY2xvY2spIHsKLSAgZ3ByX3RpbWVzcGVjIG5vd190djsKLSAgTE9OR0xPTkcgZGlmZjsKLSAgc3RydWN0IF90aW1lYiBub3dfdGI7Ci0gIExBUkdFX0lOVEVHRVIgdGltZXN0YW1wOwotICBkb3VibGUgbm93X2RibDsKLSAgbm93X3R2LmNsb2NrX3R5cGUgPSBjbG9jazsKLSAgc3dpdGNoIChjbG9jaykgewotICAgIGNhc2UgR1BSX0NMT0NLX1JFQUxUSU1FOgotICAgICAgX2Z0aW1lX3MoJm5vd190Yik7Ci0gICAgICBub3dfdHYudHZfc2VjID0gKGludDY0X3Qpbm93X3RiLnRpbWU7Ci0gICAgICBub3dfdHYudHZfbnNlYyA9IG5vd190Yi5taWxsaXRtICogMTAwMDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BSX0NMT0NLX01PTk9UT05JQzoKLSAgICBjYXNlIEdQUl9DTE9DS19QUkVDSVNFOgotICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnRpbWVzdGFtcCk7Ci0gICAgICBkaWZmID0gdGltZXN0YW1wLlF1YWRQYXJ0IC0gZ19zdGFydF90aW1lLlF1YWRQYXJ0OwotICAgICAgbm93X2RibCA9IChkb3VibGUpZGlmZiAqIGdfdGltZV9zY2FsZTsKLSAgICAgIG5vd190di50dl9zZWMgPSAoaW50NjRfdClub3dfZGJsOwotICAgICAgbm93X3R2LnR2X25zZWMgPSAoaW50MzJfdCkoKG5vd19kYmwgLSAoZG91YmxlKW5vd190di50dl9zZWMpICogMWU5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BSX1RJTUVTUEFOOgotICAgICAgYWJvcnQoKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBub3dfdHY7Ci19Ci0KLXZvaWQgZ3ByX3NsZWVwX3VudGlsKGdwcl90aW1lc3BlYyB1bnRpbCkgewotICBncHJfdGltZXNwZWMgbm93OwotICBncHJfdGltZXNwZWMgZGVsdGE7Ci0gIGludDY0X3Qgc2xlZXBfbWlsbGlzOwotCi0gIGZvciAoOzspIHsKLSAgICAvKiBXZSBjb3VsZCBzaW1wbGlmeSBieSB1c2luZyBjbG9ja19uYW5vc2xlZXAgaW5zdGVhZCwgYnV0IGl0IG1pZ2h0IGJlCi0gICAgICogc2xpZ2h0bHkgbGVzcyBwb3J0YWJsZS4gKi8KLSAgICBub3cgPSBncHJfbm93KHVudGlsLmNsb2NrX3R5cGUpOwotICAgIGlmIChncHJfdGltZV9jbXAodW50aWwsIG5vdykgPD0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlbHRhID0gZ3ByX3RpbWVfc3ViKHVudGlsLCBub3cpOwotICAgIHNsZWVwX21pbGxpcyA9Ci0gICAgICAgIGRlbHRhLnR2X3NlYyAqIEdQUl9NU19QRVJfU0VDICsgZGVsdGEudHZfbnNlYyAvIEdQUl9OU19QRVJfTVM7Ci0gICAgR1BSX0FTU0VSVCgoc2xlZXBfbWlsbGlzID49IDApICYmIChzbGVlcF9taWxsaXMgPD0gSU5UX01BWCkpOwotICAgIEdSUENfU0NIRURVTElOR19TVEFSVF9CTE9DS0lOR19SRUdJT047Ci0gICAgU2xlZXAoKERXT1JEKXNsZWVwX21pbGxpcyk7Ci0gICAgR1JQQ19TQ0hFRFVMSU5HX0VORF9CTE9DS0lOR19SRUdJT047Ci0gIH0KLX0KLQotI2VuZGlmIC8qIEdQUl9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC90bHNfcHRocmVhZC5jIGIvc3JjL2NvcmUvc3VwcG9ydC90bHNfcHRocmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgzYTZlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvdGxzX3B0aHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9QVEhSRUFEX1RMUwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3Rscy5oPgotCi1pbnRwdHJfdCBncHJfdGxzX3NldChzdHJ1Y3QgZ3ByX3B0aHJlYWRfdGhyZWFkX2xvY2FsICp0bHMsIGludHB0cl90IHZhbHVlKSB7Ci0gIEdQUl9BU1NFUlQoMCA9PSBwdGhyZWFkX3NldHNwZWNpZmljKHRscy0+a2V5LCAodm9pZCAqKXZhbHVlKSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotI2VuZGlmIC8qIEdQUl9QVEhSRUFEX1RMUyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlLmggYi9zcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2Zjg2OS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NVUFBPUlRfVE1QRklMRV9ICi0jZGVmaW5lIEdSUENfQ09SRV9TVVBQT1JUX1RNUEZJTEVfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBmcm9tIGEgcHJlZml4LgotICAgSWYgdG1wX2ZpbGVuYW1lIGlzIG5vdCBOVUxMLCAqdG1wX2ZpbGVuYW1lIGlzIGFzc2lnbmVkIHRoZSBuYW1lIG9mIHRoZQotICAgY3JlYXRlZCBmaWxlIGFuZCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBncHJfZnJlZSBpdAotICAgdW5sZXNzIGFuIGVycm9yIG9jY3VycyBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgc2V0IHRvIE5VTEwuICovCi1GSUxFICpncHJfdG1wZmlsZShjb25zdCBjaGFyICpwcmVmaXgsIGNoYXIgKip0bXBfZmlsZW5hbWUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUFBPUlRfVE1QRklMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyBiL3NyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTZlZWFjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLSNpZmRlZiBHUFJfUE9TSVhfRklMRQotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlLmgiCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLQotRklMRSAqZ3ByX3RtcGZpbGUoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqdG1wX2ZpbGVuYW1lKSB7Ci0gIEZJTEUgKnJlc3VsdCA9IE5VTEw7Ci0gIGNoYXIgKnRlbXBsYXRlOwotICBpbnQgZmQ7Ci0KLSAgaWYgKHRtcF9maWxlbmFtZSAhPSBOVUxMKSAqdG1wX2ZpbGVuYW1lID0gTlVMTDsKLQotICBncHJfYXNwcmludGYoJnRlbXBsYXRlLCAiL3RtcC8lc19YWFhYWFgiLCBwcmVmaXgpOwotICBHUFJfQVNTRVJUKHRlbXBsYXRlICE9IE5VTEwpOwotCi0gIGZkID0gbWtzdGVtcCh0ZW1wbGF0ZSk7Ci0gIGlmIChmZCA9PSAtMSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAibWtzdGVtcCBmYWlsZWQgZm9yIHRlbXBsYXRlICVzIHdpdGggZXJyb3IgJXMuIiwKLSAgICAgICAgICAgIHRlbXBsYXRlLCBzdHJlcnJvcihlcnJubykpOwotICAgIGdvdG8gZW5kOwotICB9Ci0gIHJlc3VsdCA9IGZkb3BlbihmZCwgIncrIik7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gZmlsZSAlcyBmcm9tIGZkICVkIChlcnJvciA9ICVzKS4iLAotICAgICAgICAgICAgdGVtcGxhdGUsIGZkLCBzdHJlcnJvcihlcnJubykpOwotICAgIHVubGluayh0ZW1wbGF0ZSk7Ci0gICAgY2xvc2UoZmQpOwotICAgIGdvdG8gZW5kOwotICB9Ci0KLWVuZDoKLSAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIHRtcF9maWxlbmFtZSAhPSBOVUxMKSB7Ci0gICAgKnRtcF9maWxlbmFtZSA9IHRlbXBsYXRlOwotICB9IGVsc2UgewotICAgIGdwcl9mcmVlKHRlbXBsYXRlKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0jZW5kaWYgLyogR1BSX1BPU0lYX0ZJTEUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZV93aW4zMi5jIGIvc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDBmMDAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotI2lmZGVmIEdQUl9XSU4zMgotCi0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRjaGFyLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oIgotCi1GSUxFICpncHJfdG1wZmlsZShjb25zdCBjaGFyICpwcmVmaXgsIGNoYXIgKip0bXBfZmlsZW5hbWVfb3V0KSB7Ci0gIEZJTEUgKnJlc3VsdCA9IE5VTEw7Ci0gIExQVFNUUiB0ZW1wbGF0ZV9zdHJpbmcgPSBOVUxMOwotICBUQ0hBUiB0bXBfcGF0aFtNQVhfUEFUSF07Ci0gIFRDSEFSIHRtcF9maWxlbmFtZVtNQVhfUEFUSF07Ci0gIERXT1JEIHN0YXR1czsKLSAgVUlOVCBzdWNjZXNzOwotCi0gIGlmICh0bXBfZmlsZW5hbWVfb3V0ICE9IE5VTEwpICp0bXBfZmlsZW5hbWVfb3V0ID0gTlVMTDsKLQotICAvKiBDb252ZXJ0IG91ciBwcmVmaXggdG8gVENIQVIuICovCi0gIHRlbXBsYXRlX3N0cmluZyA9IGdwcl9jaGFyX3RvX3RjaGFyKHByZWZpeCk7Ci0gIEdQUl9BU1NFUlQodGVtcGxhdGVfc3RyaW5nKTsKLQotICAvKiBHZXQgdGhlIHBhdGggdG8gdGhlIGJlc3QgdGVtcG9yYXJ5IGZvbGRlciBhdmFpbGFibGUuICovCi0gIHN0YXR1cyA9IEdldFRlbXBQYXRoKE1BWF9QQVRILCB0bXBfcGF0aCk7Ci0gIGlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPiBNQVhfUEFUSCkgZ290byBlbmQ7Ci0KLSAgLyogR2VuZXJhdGUgYSB1bmlxdWUgZmlsZW5hbWUgd2l0aCBvdXIgdGVtcGxhdGUgKyB0ZW1wb3JhcnkgcGF0aC4gKi8KLSAgc3VjY2VzcyA9IEdldFRlbXBGaWxlTmFtZSh0bXBfcGF0aCwgdGVtcGxhdGVfc3RyaW5nLCAwLCB0bXBfZmlsZW5hbWUpOwotICBpZiAoIXN1Y2Nlc3MpIGdvdG8gZW5kOwotCi0gIC8qIE9wZW4gYSBmaWxlIHRoZXJlLiAqLwotICBpZiAoX3Rmb3Blbl9zKCZyZXN1bHQsIHRtcF9maWxlbmFtZSwgVEVYVCgid2IrIikpICE9IDApIGdvdG8gZW5kOwotCi1lbmQ6Ci0gIGlmIChyZXN1bHQgJiYgdG1wX2ZpbGVuYW1lX291dCkgewotICAgICp0bXBfZmlsZW5hbWVfb3V0ID0gZ3ByX3RjaGFyX3RvX2NoYXIodG1wX2ZpbGVuYW1lKTsKLSAgfQotCi0gIGdwcl9mcmVlKHRlbXBsYXRlX3N0cmluZyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZiAvKiBHUFJfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvYWxhcm0uYyBiL3NyYy9jb3JlL3N1cmZhY2UvYWxhcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4NTI4NS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL2FsYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKLQotc3RydWN0IGdycGNfYWxhcm0gewotICBncnBjX3RpbWVyIGFsYXJtOwotICBncnBjX2NxX2NvbXBsZXRpb24gY29tcGxldGlvbjsKLSAgLyoqIGNvbXBsZXRpb24gcXVldWUgd2hlcmUgZXZlbnRzIGFib3V0IHRoaXMgYWxhcm0gd2lsbCBiZSBwb3N0ZWQgKi8KLSAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcTsKLSAgLyoqIHVzZXIgc3VwcGxpZWQgdGFnICovCi0gIHZvaWQgKnRhZzsKLX07Ci0KLXN0YXRpYyB2b2lkIGRvX25vdGhpbmdfZW5kX2NvbXBsZXRpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpjKSB7fQotCi1zdGF0aWMgdm9pZCBhbGFybV9jYihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19hbGFybSAqYWxhcm0gPSBhcmc7Ci0gIGdycGNfY3FfZW5kX29wKGV4ZWNfY3R4LCBhbGFybS0+Y3EsIGFsYXJtLT50YWcsIHN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgIGRvX25vdGhpbmdfZW5kX2NvbXBsZXRpb24sIE5VTEwsICZhbGFybS0+Y29tcGxldGlvbik7Ci19Ci0KLWdycGNfYWxhcm0gKmdycGNfYWxhcm1fY3JlYXRlKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsIGdwcl90aW1lc3BlYyBkZWFkbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRhZykgewotICBncnBjX2FsYXJtICphbGFybSA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfYWxhcm0pKTsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUlBDX0NRX0lOVEVSTkFMX1JFRihjcSwgImFsYXJtIik7Ci0gIGFsYXJtLT5jcSA9IGNxOwotICBhbGFybS0+dGFnID0gdGFnOwotCi0gIGdycGNfY3FfYmVnaW5fb3AoY3EsIHRhZyk7Ci0gIGdycGNfdGltZXJfaW5pdCgmZXhlY19jdHgsICZhbGFybS0+YWxhcm0sCi0gICAgICAgICAgICAgICAgICBncHJfY29udmVydF9jbG9ja190eXBlKGRlYWRsaW5lLCBHUFJfQ0xPQ0tfTU9OT1RPTklDKSwKLSAgICAgICAgICAgICAgICAgIGFsYXJtX2NiLCBhbGFybSwgZ3ByX25vdyhHUFJfQ0xPQ0tfTU9OT1RPTklDKSk7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIHJldHVybiBhbGFybTsKLX0KLQotdm9pZCBncnBjX2FsYXJtX2NhbmNlbChncnBjX2FsYXJtICphbGFybSkgewotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBncnBjX3RpbWVyX2NhbmNlbCgmZXhlY19jdHgsICZhbGFybS0+YWxhcm0pOwotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotfQotCi12b2lkIGdycGNfYWxhcm1fZGVzdHJveShncnBjX2FsYXJtICphbGFybSkgewotICBncnBjX2FsYXJtX2NhbmNlbChhbGFybSk7Ci0gIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoYWxhcm0tPmNxLCAiYWxhcm0iKTsKLSAgZ3ByX2ZyZWUoYWxhcm0pOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYyBiL3NyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMGI5MDAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIKLQotaW50IGdycGNfYXBpX3RyYWNlID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmggYi9zcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjUzODI5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVJGQUNFX0FQSV9UUkFDRV9ICi0jZGVmaW5lIEdSUENfQ09SRV9TVVJGQUNFX0FQSV9UUkFDRV9ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvZGVidWcvdHJhY2UuaCIKLQotZXh0ZXJuIGludCBncnBjX2FwaV90cmFjZTsKLQotLyogUHJvdmlkZSB1bndyYXBwaW5nIG1hY3JvcyBiZWNhdXNlIHdlJ3JlIGluIEM4OSBhbmQgdmFyaWFkaWMgbWFjcm9zIHdlcmVuJ3QKLSAgIGludHJvZHVjZWQgdW50aWwgQzk5Li4uICovCi0jZGVmaW5lIEdSUENfQVBJX1RSQUNFX1VOV1JBUDAoKQotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVAxKGEpICwgYQotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVAyKGEsIGIpICwgYSwgYgotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVAzKGEsIGIsIGMpICwgYSwgYiwgYwotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA0KGEsIGIsIGMsIGQpICwgYSwgYiwgYywgZAotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA1KGEsIGIsIGMsIGQsIGUpICwgYSwgYiwgYywgZCwgZQotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA2KGEsIGIsIGMsIGQsIGUsIGYpICwgYSwgYiwgYywgZCwgZSwgZgotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA3KGEsIGIsIGMsIGQsIGUsIGYsIGcpICwgYSwgYiwgYywgZCwgZSwgZiwgZwotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA4KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICwgYSwgYiwgYywgZCwgZSwgZiwgZywgaAotI2RlZmluZSBHUlBDX0FQSV9UUkFDRV9VTldSQVA5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpIFwKLSAgLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpCi0jZGVmaW5lIEdSUENfQVBJX1RSQUNFX1VOV1JBUDEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopIFwKLSAgLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqCi0KLS8qIER1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2YgQzg5J3MgcHJlcHJvY2Vzc29yLCB0aGUgYXJpdHkgb2YgdGhlIHZhci1hcmcgbGlzdAotICAgJ25hcmdzJyBtdXN0IGJlIHNwZWNpZmllZC4gKi8KLSNkZWZpbmUgR1JQQ19BUElfVFJBQ0UoZm10LCBuYXJncywgYXJncykgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoZ3JwY19hcGlfdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ3ByX2xvZyhHUFJfSU5GTywgZm10IEdSUENfQVBJX1RSQUNFX1VOV1JBUCMjbmFyZ3MgYXJncyk7IFwKLSAgfQotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUkZBQ0VfQVBJX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyBiL3NyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzOWM0NS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGdycGMvYnl0ZV9idWZmZXIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLWdycGNfYnl0ZV9idWZmZXIgKmdycGNfcmF3X2J5dGVfYnVmZmVyX2NyZWF0ZShncHJfc2xpY2UgKnNsaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnNsaWNlcykgewotICByZXR1cm4gZ3JwY19yYXdfY29tcHJlc3NlZF9ieXRlX2J1ZmZlcl9jcmVhdGUoc2xpY2VzLCBuc2xpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DT01QUkVTU19OT05FKTsKLX0KLQotZ3JwY19ieXRlX2J1ZmZlciAqZ3JwY19yYXdfY29tcHJlc3NlZF9ieXRlX2J1ZmZlcl9jcmVhdGUoCi0gICAgZ3ByX3NsaWNlICpzbGljZXMsIHNpemVfdCBuc2xpY2VzLCBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBjb21wcmVzc2lvbikgewotICBzaXplX3QgaTsKLSAgZ3JwY19ieXRlX2J1ZmZlciAqYmIgPSBtYWxsb2Moc2l6ZW9mKGdycGNfYnl0ZV9idWZmZXIpKTsKLSAgYmItPnR5cGUgPSBHUlBDX0JCX1JBVzsKLSAgYmItPmRhdGEucmF3LmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247Ci0gIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmYmItPmRhdGEucmF3LnNsaWNlX2J1ZmZlcik7Ci0gIGZvciAoaSA9IDA7IGkgPCBuc2xpY2VzOyBpKyspIHsKLSAgICBncHJfc2xpY2VfcmVmKHNsaWNlc1tpXSk7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIsIHNsaWNlc1tpXSk7Ci0gIH0KLSAgcmV0dXJuIGJiOwotfQotCi1ncnBjX2J5dGVfYnVmZmVyICpncnBjX3Jhd19ieXRlX2J1ZmZlcl9mcm9tX3JlYWRlcigKLSAgICBncnBjX2J5dGVfYnVmZmVyX3JlYWRlciAqcmVhZGVyKSB7Ci0gIGdycGNfYnl0ZV9idWZmZXIgKmJiID0gbWFsbG9jKHNpemVvZihncnBjX2J5dGVfYnVmZmVyKSk7Ci0gIGdwcl9zbGljZSBzbGljZTsKLSAgYmItPnR5cGUgPSBHUlBDX0JCX1JBVzsKLSAgYmItPmRhdGEucmF3LmNvbXByZXNzaW9uID0gR1JQQ19DT01QUkVTU19OT05FOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIpOwotCi0gIHdoaWxlIChncnBjX2J5dGVfYnVmZmVyX3JlYWRlcl9uZXh0KHJlYWRlciwgJnNsaWNlKSkgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZiYi0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLCBzbGljZSk7Ci0gIH0KLSAgcmV0dXJuIGJiOwotfQotCi1ncnBjX2J5dGVfYnVmZmVyICpncnBjX2J5dGVfYnVmZmVyX2NvcHkoZ3JwY19ieXRlX2J1ZmZlciAqYmIpIHsKLSAgc3dpdGNoIChiYi0+dHlwZSkgewotICAgIGNhc2UgR1JQQ19CQl9SQVc6Ci0gICAgICByZXR1cm4gZ3JwY19yYXdfYnl0ZV9idWZmZXJfY3JlYXRlKGJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIuc2xpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLmNvdW50KTsKLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gTlVMTCk7Ci19Ci0KLXZvaWQgZ3JwY19ieXRlX2J1ZmZlcl9kZXN0cm95KGdycGNfYnl0ZV9idWZmZXIgKmJiKSB7Ci0gIGlmICghYmIpIHJldHVybjsKLSAgc3dpdGNoIChiYi0+dHlwZSkgewotICAgIGNhc2UgR1JQQ19CQl9SQVc6Ci0gICAgICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJmJiLT5kYXRhLnJhdy5zbGljZV9idWZmZXIpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgZnJlZShiYik7Ci19Ci0KLXNpemVfdCBncnBjX2J5dGVfYnVmZmVyX2xlbmd0aChncnBjX2J5dGVfYnVmZmVyICpiYikgewotICBzd2l0Y2ggKGJiLT50eXBlKSB7Ci0gICAgY2FzZSBHUlBDX0JCX1JBVzoKLSAgICAgIHJldHVybiBiYi0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLmxlbmd0aDsKLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jIGIvc3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0MThmYS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL2J5dGVfYnVmZmVyX3JlYWRlci5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9ieXRlX2J1ZmZlci5oPgotI2luY2x1ZGUgPGdycGMvY29tcHJlc3Npb24uaD4KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIgotCi1zdGF0aWMgaW50IGlzX2NvbXByZXNzZWQoZ3JwY19ieXRlX2J1ZmZlciAqYnVmZmVyKSB7Ci0gIHN3aXRjaCAoYnVmZmVyLT50eXBlKSB7Ci0gICAgY2FzZSBHUlBDX0JCX1JBVzoKLSAgICAgIGlmIChidWZmZXItPmRhdGEucmF3LmNvbXByZXNzaW9uID09IEdSUENfQ09NUFJFU1NfTk9ORSkgewotICAgICAgICByZXR1cm4gMCAvKiBHUFJfRkFMU0UgKi87Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gMSAvKiBHUFJfVFJVRSAqLzsKLX0KLQotdm9pZCBncnBjX2J5dGVfYnVmZmVyX3JlYWRlcl9pbml0KGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyICpyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19ieXRlX2J1ZmZlciAqYnVmZmVyKSB7Ci0gIGdwcl9zbGljZV9idWZmZXIgZGVjb21wcmVzc2VkX3NsaWNlc19idWZmZXI7Ci0gIHJlYWRlci0+YnVmZmVyX2luID0gYnVmZmVyOwotICBzd2l0Y2ggKHJlYWRlci0+YnVmZmVyX2luLT50eXBlKSB7Ci0gICAgY2FzZSBHUlBDX0JCX1JBVzoKLSAgICAgIGdwcl9zbGljZV9idWZmZXJfaW5pdCgmZGVjb21wcmVzc2VkX3NsaWNlc19idWZmZXIpOwotICAgICAgaWYgKGlzX2NvbXByZXNzZWQocmVhZGVyLT5idWZmZXJfaW4pKSB7Ci0gICAgICAgIGdycGNfbXNnX2RlY29tcHJlc3MocmVhZGVyLT5idWZmZXJfaW4tPmRhdGEucmF3LmNvbXByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXItPmJ1ZmZlcl9pbi0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWNvbXByZXNzZWRfc2xpY2VzX2J1ZmZlcik7Ci0gICAgICAgIHJlYWRlci0+YnVmZmVyX291dCA9Ci0gICAgICAgICAgICBncnBjX3Jhd19ieXRlX2J1ZmZlcl9jcmVhdGUoZGVjb21wcmVzc2VkX3NsaWNlc19idWZmZXIuc2xpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcHJlc3NlZF9zbGljZXNfYnVmZmVyLmNvdW50KTsKLSAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZkZWNvbXByZXNzZWRfc2xpY2VzX2J1ZmZlcik7Ci0gICAgICB9IGVsc2UgeyAvKiBub3QgY29tcHJlc3NlZCwgdXNlIHRoZSBpbnB1dCBidWZmZXIgYXMgb3V0cHV0ICovCi0gICAgICAgIHJlYWRlci0+YnVmZmVyX291dCA9IHJlYWRlci0+YnVmZmVyX2luOwotICAgICAgfQotICAgICAgcmVhZGVyLT5jdXJyZW50LmluZGV4ID0gMDsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXJfZGVzdHJveShncnBjX2J5dGVfYnVmZmVyX3JlYWRlciAqcmVhZGVyKSB7Ci0gIHN3aXRjaCAocmVhZGVyLT5idWZmZXJfaW4tPnR5cGUpIHsKLSAgICBjYXNlIEdSUENfQkJfUkFXOgotICAgICAgLyoga2VlcGluZyB0aGUgc2FtZSBpZi1lbHNlIHN0cnVjdHVyZSBhcyBpbiB0aGUgaW5pdCBmdW5jdGlvbiAqLwotICAgICAgaWYgKGlzX2NvbXByZXNzZWQocmVhZGVyLT5idWZmZXJfaW4pKSB7Ci0gICAgICAgIGdycGNfYnl0ZV9idWZmZXJfZGVzdHJveShyZWFkZXItPmJ1ZmZlcl9vdXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotaW50IGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX25leHQoZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXIgKnJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqc2xpY2UpIHsKLSAgc3dpdGNoIChyZWFkZXItPmJ1ZmZlcl9pbi0+dHlwZSkgewotICAgIGNhc2UgR1JQQ19CQl9SQVc6IHsKLSAgICAgIGdwcl9zbGljZV9idWZmZXIgKnNsaWNlX2J1ZmZlcjsKLSAgICAgIHNsaWNlX2J1ZmZlciA9ICZyZWFkZXItPmJ1ZmZlcl9vdXQtPmRhdGEucmF3LnNsaWNlX2J1ZmZlcjsKLSAgICAgIGlmIChyZWFkZXItPmN1cnJlbnQuaW5kZXggPCBzbGljZV9idWZmZXItPmNvdW50KSB7Ci0gICAgICAgICpzbGljZSA9IGdwcl9zbGljZV9yZWYoc2xpY2VfYnVmZmVyLT5zbGljZXNbcmVhZGVyLT5jdXJyZW50LmluZGV4XSk7Ci0gICAgICAgIHJlYWRlci0+Y3VycmVudC5pbmRleCArPSAxOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotZ3ByX3NsaWNlIGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX3JlYWRhbGwoZ3JwY19ieXRlX2J1ZmZlcl9yZWFkZXIgKnJlYWRlcikgewotICBncHJfc2xpY2UgaW5fc2xpY2U7Ci0gIHNpemVfdCBieXRlc19yZWFkID0gMDsKLSAgY29uc3Qgc2l6ZV90IGlucHV0X3NpemUgPSBncnBjX2J5dGVfYnVmZmVyX2xlbmd0aChyZWFkZXItPmJ1ZmZlcl9vdXQpOwotICBncHJfc2xpY2Ugb3V0X3NsaWNlID0gZ3ByX3NsaWNlX21hbGxvYyhpbnB1dF9zaXplKTsKLSAgdWludDhfdCAqY29uc3Qgb3V0YnVmID0gR1BSX1NMSUNFX1NUQVJUX1BUUihvdXRfc2xpY2UpOyAvKiBqdXN0IGFuIGFsaWFzICovCi0KLSAgd2hpbGUgKGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX25leHQocmVhZGVyLCAmaW5fc2xpY2UpICE9IDApIHsKLSAgICBjb25zdCBzaXplX3Qgc2xpY2VfbGVuZ3RoID0gR1BSX1NMSUNFX0xFTkdUSChpbl9zbGljZSk7Ci0gICAgbWVtY3B5KCYob3V0YnVmW2J5dGVzX3JlYWRdKSwgR1BSX1NMSUNFX1NUQVJUX1BUUihpbl9zbGljZSksIHNsaWNlX2xlbmd0aCk7Ci0gICAgYnl0ZXNfcmVhZCArPSBzbGljZV9sZW5ndGg7Ci0gICAgZ3ByX3NsaWNlX3VucmVmKGluX3NsaWNlKTsKLSAgICBHUFJfQVNTRVJUKGJ5dGVzX3JlYWQgPD0gaW5wdXRfc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIG91dF9zbGljZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2FsbC5jIGIvc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMWNkMWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvY29tcHJlc3Npb24uaD4KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKLQotLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGJhdGNoZXMgcG9zc2libGUuCi0gICAgQmFzZWQgdXBvbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbGx5IHF1ZXVlYWJsZSBvcHMgaW4gdGhlIGJhdGNoCi0gICBhcGk6Ci0gICAgICAtIGluaXRpYWwgbWV0YWRhdGEgc2VuZAotICAgICAgLSBtZXNzYWdlIHNlbmQKLSAgICAgIC0gc3RhdHVzL2Nsb3NlIHNlbmQgKGRlcGVuZGluZyBvbiBjbGllbnQvc2VydmVyKQotICAgICAgLSBpbml0aWFsIG1ldGFkYXRhIHJlY3YKLSAgICAgIC0gbWVzc2FnZSByZWN2Ci0gICAgICAtIHN0YXR1cy9jbG9zZSByZWN2IChkZXBlbmRpbmcgb24gY2xpZW50L3NlcnZlcikgKi8KLSNkZWZpbmUgTUFYX0NPTkNVUlJFTlRfQkFUQ0hFUyA2Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19pb3JlcV9jb21wbGV0aW9uX2Z1bmMgb25fY29tcGxldGU7Ci0gIHZvaWQgKnVzZXJfZGF0YTsKLSAgaW50IHN1Y2Nlc3M7Ci19IGNvbXBsZXRlZF9yZXF1ZXN0OwotCi0jZGVmaW5lIE1BWF9TRU5EX0VYVFJBX01FVEFEQVRBX0NPVU5UIDMKLQotLyogU3RhdHVzIGRhdGEgZm9yIGEgcmVxdWVzdCBjYW4gY29tZSBmcm9tIHNldmVyYWwgc291cmNlczsgdGhpcwotICAgZW51bWVyYXRlcyB0aGVtIGFsbCwgYW5kIGFjdHMgYXMgYSBwcmlvcml0eSBzb3J0aW5nIGZvciB3aGljaAotICAgc3RhdHVzIHRvIHJldHVybiB0byB0aGUgYXBwbGljYXRpb24gLSBlYXJsaWVyIGVudHJpZXMgb3ZlcnJpZGUKLSAgIGxhdGVyIG9uZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIFN0YXR1cyBjYW1lIGZyb20gdGhlIGFwcGxpY2F0aW9uIGxheWVyIG92ZXJyaWRpbmcgd2hhdGV2ZXIKLSAgICAgdGhlIHdpcmUgc2F5cyAqLwotICBTVEFUVVNfRlJPTV9BUElfT1ZFUlJJREUgPSAwLAotICAvKiBTdGF0dXMgd2FzIGNyZWF0ZWQgYnkgc29tZSBpbnRlcm5hbCBjaGFubmVsIHN0YWNrIG9wZXJhdGlvbiAqLwotICBTVEFUVVNfRlJPTV9DT1JFLAotICAvKiBTdGF0dXMgY2FtZSBmcm9tICd0aGUgd2lyZScgLSBvciBzb21ld2hlcmUgYmVsb3cgdGhlIHN1cmZhY2UKLSAgICAgbGF5ZXIgKi8KLSAgU1RBVFVTX0ZST01fV0lSRSwKLSAgLyogU3RhdHVzIGNhbWUgZnJvbSB0aGUgc2VydmVyIHNlbmRpbmcgc3RhdHVzICovCi0gIFNUQVRVU19GUk9NX1NFUlZFUl9TVEFUVVMsCi0gIFNUQVRVU19TT1VSQ0VfQ09VTlQKLX0gc3RhdHVzX3NvdXJjZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGlzX3NldDsKLSAgZ3JwY19zdGF0dXNfY29kZSBjb2RlOwotICBncnBjX21kc3RyICpkZXRhaWxzOwotfSByZWNlaXZlZF9zdGF0dXM7Ci0KLS8qIEhvdyBmYXIgdGhyb3VnaCB0aGUgR1JQQyBzdHJlYW0gaGF2ZSB3ZSByZWFkPyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgLyogV2UgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIGluaXRpYWwgbWV0YWRhdGEgdG8gY29tcGxldGUgKi8KLSAgUkVBRF9TVEFURV9JTklUSUFMID0gMCwKLSAgLyogV2UgaGF2ZSBnb3R0ZW4gaW5pdGlhbCBtZXRhZGF0YSwgYW5kIGFyZSByZWFkaW5nIGVpdGhlcgotICAgICBtZXNzYWdlcyBvciB0cmFpbGluZyBtZXRhZGF0YSAqLwotICBSRUFEX1NUQVRFX0dPVF9JTklUSUFMX01FVEFEQVRBLAotICAvKiBUaGUgc3RyZWFtIGlzIGNsb3NlZCBmb3IgcmVhZGluZyAqLwotICBSRUFEX1NUQVRFX1JFQURfQ0xPU0VELAotICAvKiBUaGUgc3RyZWFtIGlzIGNsb3NlZCBmb3IgcmVhZGluZyAmIHdyaXRpbmcgKi8KLSAgUkVBRF9TVEFURV9TVFJFQU1fQ0xPU0VECi19IHJlYWRfc3RhdGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFdSSVRFX1NUQVRFX0lOSVRJQUwgPSAwLAotICBXUklURV9TVEFURV9TVEFSVEVELAotICBXUklURV9TVEFURV9XUklURV9DTE9TRUQKLX0gd3JpdGVfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IGJhdGNoX2NvbnRyb2wgewotICBncnBjX2NhbGwgKmNhbGw7Ci0gIGdycGNfY3FfY29tcGxldGlvbiBjcV9jb21wbGV0aW9uOwotICBncnBjX2Nsb3N1cmUgZmluaXNoX2JhdGNoOwotICB2b2lkICpub3RpZnlfdGFnOwotICBncHJfcmVmY291bnQgc3RlcHNfdG9fY29tcGxldGU7Ci0KLSAgdWludDhfdCBzZW5kX2luaXRpYWxfbWV0YWRhdGE7Ci0gIHVpbnQ4X3Qgc2VuZF9tZXNzYWdlOwotICB1aW50OF90IHNlbmRfZmluYWxfb3A7Ci0gIHVpbnQ4X3QgcmVjdl9pbml0aWFsX21ldGFkYXRhOwotICB1aW50OF90IHJlY3ZfbWVzc2FnZTsKLSAgdWludDhfdCByZWN2X2ZpbmFsX29wOwotICB1aW50OF90IGlzX25vdGlmeV90YWdfY2xvc3VyZTsKLSAgdWludDhfdCBzdWNjZXNzOwotfSBiYXRjaF9jb250cm9sOwotCi1zdHJ1Y3QgZ3JwY19jYWxsIHsKLSAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcTsKLSAgZ3JwY19jaGFubmVsICpjaGFubmVsOwotICBncnBjX2NhbGwgKnBhcmVudDsKLSAgZ3JwY19jYWxsICpmaXJzdF9jaGlsZDsKLSAgLyogVE9ETyhjdGlsbGVyKTogc2hhcmUgd2l0aCBjcSBpZiBwb3NzaWJsZT8gKi8KLSAgZ3ByX211IG11OwotCi0gIC8qIGNsaWVudCBvciBzZXJ2ZXIgY2FsbCAqLwotICB1aW50OF90IGlzX2NsaWVudDsKLSAgLyogaXMgdGhlIGFsYXJtIHNldCAqLwotICB1aW50OF90IGhhdmVfYWxhcm07Ci0gIC8qKiBoYXMgZ3JwY19jYWxsX2Rlc3Ryb3kgYmVlbiBjYWxsZWQgKi8KLSAgdWludDhfdCBkZXN0cm95X2NhbGxlZDsKLSAgLyoqIGZsYWcgaW5kaWNhdGluZyB0aGF0IGNhbmNlbGxhdGlvbiBpcyBpbmhlcml0ZWQgKi8KLSAgdWludDhfdCBjYW5jZWxsYXRpb25faXNfaW5oZXJpdGVkOwotICAvKiogYml0bWFzayBvZiBsaXZlIGJhdGNoZXMgKi8KLSAgdWludDhfdCB1c2VkX2JhdGNoZXM7Ci0gIC8qKiB3aGljaCBvcHMgYXJlIGluLWZsaWdodCAqLwotICB1aW50OF90IHNlbnRfaW5pdGlhbF9tZXRhZGF0YTsKLSAgdWludDhfdCBzZW5kaW5nX21lc3NhZ2U7Ci0gIHVpbnQ4X3Qgc2VudF9maW5hbF9vcDsKLSAgdWludDhfdCByZWNlaXZlZF9pbml0aWFsX21ldGFkYXRhOwotICB1aW50OF90IHJlY2VpdmluZ19tZXNzYWdlOwotICB1aW50OF90IHJlY2VpdmVkX2ZpbmFsX29wOwotCi0gIC8qIGhhdmUgd2UgcmVjZWl2ZWQgaW5pdGlhbCBtZXRhZGF0YSAqLwotICBib29sIGhhc19pbml0aWFsX21kX2JlZW5fcmVjZWl2ZWQ7Ci0KLSAgYmF0Y2hfY29udHJvbCBhY3RpdmVfYmF0Y2hlc1tNQVhfQ09OQ1VSUkVOVF9CQVRDSEVTXTsKLQotICAvKiBmaXJzdCBpZHg6IGlzX3JlY2VpdmluZywgc2Vjb25kIGlkeDogaXNfdHJhaWxpbmcgKi8KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCBtZXRhZGF0YV9iYXRjaFsyXVsyXTsKLQotICAvKiBCdWZmZXJlZCByZWFkIG1ldGFkYXRhIHdhaXRpbmcgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICBFbGVtZW50IDAgaXMgaW5pdGlhbCBtZXRhZGF0YSwgZWxlbWVudCAxIGlzIHRyYWlsaW5nIG1ldGFkYXRhLiAqLwotICBncnBjX21ldGFkYXRhX2FycmF5ICpidWZmZXJlZF9tZXRhZGF0YVsyXTsKLQotICAvKiBSZWNlaXZlZCBjYWxsIHN0YXR1c2VzIGZyb20gdmFyaW91cyBzb3VyY2VzICovCi0gIHJlY2VpdmVkX3N0YXR1cyBzdGF0dXNbU1RBVFVTX1NPVVJDRV9DT1VOVF07Ci0KLSAgLyogQ29tcHJlc3Npb24gYWxnb3JpdGhtIGZvciB0aGUgY2FsbCAqLwotICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBjb21wcmVzc2lvbl9hbGdvcml0aG07Ci0gIC8qIFN1cHBvcnRlZCBlbmNvZGluZ3MgKGNvbXByZXNzaW9uIGFsZ29yaXRobXMpLCBhIGJpdHNldCAqLwotICB1aW50MzJfdCBlbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcjsKLQotICAvKiBDb250ZXh0cyBmb3IgdmFyaW91cyBzdWJzeXN0ZW1zIChzZWN1cml0eSwgdHJhY2luZywgLi4uKS4gKi8KLSAgZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudCBjb250ZXh0W0dSUENfQ09OVEVYVF9DT1VOVF07Ci0KLSAgLyogRGVhZGxpbmUgYWxhcm0gLSBpZiBoYXZlX2FsYXJtIGlzIG5vbi16ZXJvICovCi0gIGdycGNfdGltZXIgYWxhcm07Ci0KLSAgLyogZm9yIHRoZSBjbGllbnQsIGV4dHJhIG1ldGFkYXRhIGlzIGluaXRpYWwgbWV0YWRhdGE7IGZvciB0aGUKLSAgICAgc2VydmVyLCBpdCdzIHRyYWlsaW5nIG1ldGFkYXRhICovCi0gIGdycGNfbGlua2VkX21kZWxlbSBzZW5kX2V4dHJhX21ldGFkYXRhW01BWF9TRU5EX0VYVFJBX01FVEFEQVRBX0NPVU5UXTsKLSAgaW50IHNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQ7Ci0gIGdwcl90aW1lc3BlYyBzZW5kX2RlYWRsaW5lOwotCi0gIC8qKiBzaWJsaW5nczogY2hpbGRyZW4gb2YgdGhlIHNhbWUgcGFyZW50IGZvcm0gYSBsaXN0LCBhbmQgdGhpcyBsaXN0IGlzCi0gICAgIHByb3RlY3RlZCB1bmRlcgotICAgICAgcGFyZW50LT5tdSAqLwotICBncnBjX2NhbGwgKnNpYmxpbmdfbmV4dDsKLSAgZ3JwY19jYWxsICpzaWJsaW5nX3ByZXY7Ci0KLSAgZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtIHNlbmRpbmdfc3RyZWFtOwotICBncnBjX2J5dGVfc3RyZWFtICpyZWNlaXZpbmdfc3RyZWFtOwotICBncnBjX2J5dGVfYnVmZmVyICoqcmVjZWl2aW5nX2J1ZmZlcjsKLSAgZ3ByX3NsaWNlIHJlY2VpdmluZ19zbGljZTsKLSAgZ3JwY19jbG9zdXJlIHJlY2VpdmluZ19zbGljZV9yZWFkeTsKLSAgZ3JwY19jbG9zdXJlIHJlY2VpdmluZ19zdHJlYW1fcmVhZHk7Ci0gIGdycGNfY2xvc3VyZSByZWNlaXZpbmdfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeTsKLSAgdWludDMyX3QgdGVzdF9vbmx5X2xhc3RfbWVzc2FnZV9mbGFnczsKLQotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIGdycGNfc3RhdHVzX2NvZGUgKnN0YXR1czsKLSAgICAgIGNoYXIgKipzdGF0dXNfZGV0YWlsczsKLSAgICAgIHNpemVfdCAqc3RhdHVzX2RldGFpbHNfY2FwYWNpdHk7Ci0gICAgfSBjbGllbnQ7Ci0gICAgc3RydWN0IHsKLSAgICAgIGludCAqY2FuY2VsbGVkOwotICAgIH0gc2VydmVyOwotICB9IGZpbmFsX29wOwotCi0gIHN0cnVjdCB7Ci0gICAgdm9pZCAqYmN0bHA7Ci0gICAgYm9vbCBzdWNjZXNzOwotICB9IHNhdmVkX3JlY2VpdmluZ19zdHJlYW1fcmVhZHlfY3R4OwotfTsKLQotI2RlZmluZSBDQUxMX1NUQUNLX0ZST01fQ0FMTChjYWxsKSAoKGdycGNfY2FsbF9zdGFjayAqKSgoY2FsbCkgKyAxKSkKLSNkZWZpbmUgQ0FMTF9GUk9NX0NBTExfU1RBQ0soY2FsbF9zdGFjaykgKCgoZ3JwY19jYWxsICopKGNhbGxfc3RhY2spKSAtIDEpCi0jZGVmaW5lIENBTExfRUxFTV9GUk9NX0NBTEwoY2FsbCwgaWR4KSBcCi0gIGdycGNfY2FsbF9zdGFja19lbGVtZW50KENBTExfU1RBQ0tfRlJPTV9DQUxMKGNhbGwpLCBpZHgpCi0jZGVmaW5lIENBTExfRlJPTV9UT1BfRUxFTSh0b3BfZWxlbSkgXAotICBDQUxMX0ZST01fQ0FMTF9TVEFDSyhncnBjX2NhbGxfc3RhY2tfZnJvbV90b3BfZWxlbWVudCh0b3BfZWxlbSkpCi0KLXN0YXRpYyB2b2lkIHNldF9kZWFkbGluZV9hbGFybShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSk7Ci1zdGF0aWMgdm9pZCBleGVjdXRlX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGwgKmNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOwotc3RhdGljIGdycGNfY2FsbF9lcnJvciBjYW5jZWxfd2l0aF9zdGF0dXMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOwotc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpjYWxsX3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7Ci1zdGF0aWMgdm9pZCByZWNlaXZpbmdfc2xpY2VfcmVhZHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmJjdGxwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2Vzcyk7Ci0KLWdycGNfY2FsbCAqZ3JwY19jYWxsX2NyZWF0ZShncnBjX2NoYW5uZWwgKmNoYW5uZWwsIGdycGNfY2FsbCAqcGFyZW50X2NhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvcGFnYXRpb25fbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl90cmFuc3BvcnRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqKmFkZF9pbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhZGRfaW5pdGlhbF9tZXRhZGF0YV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgc2VuZF9kZWFkbGluZSkgewotICBzaXplX3QgaSwgajsKLSAgZ3JwY19jaGFubmVsX3N0YWNrICpjaGFubmVsX3N0YWNrID0gZ3JwY19jaGFubmVsX2dldF9jaGFubmVsX3N0YWNrKGNoYW5uZWwpOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBncnBjX2NhbGwgKmNhbGw7Ci0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jYWxsX2NyZWF0ZSIsIDApOwotICBjYWxsID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19jYWxsKSArIGNoYW5uZWxfc3RhY2stPmNhbGxfc3RhY2tfc2l6ZSk7Ci0gIG1lbXNldChjYWxsLCAwLCBzaXplb2YoZ3JwY19jYWxsKSk7Ci0gIGdwcl9tdV9pbml0KCZjYWxsLT5tdSk7Ci0gIGNhbGwtPmNoYW5uZWwgPSBjaGFubmVsOwotICBjYWxsLT5jcSA9IGNxOwotICBjYWxsLT5wYXJlbnQgPSBwYXJlbnRfY2FsbDsKLSAgY2FsbC0+aXNfY2xpZW50ID0gc2VydmVyX3RyYW5zcG9ydF9kYXRhID09IE5VTEw7Ci0gIGlmIChjYWxsLT5pc19jbGllbnQpIHsKLSAgICBHUFJfQVNTRVJUKGFkZF9pbml0aWFsX21ldGFkYXRhX2NvdW50IDwgTUFYX1NFTkRfRVhUUkFfTUVUQURBVEFfQ09VTlQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBhZGRfaW5pdGlhbF9tZXRhZGF0YV9jb3VudDsgaSsrKSB7Ci0gICAgICBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhW2ldLm1kID0gYWRkX2luaXRpYWxfbWV0YWRhdGFbaV07Ci0gICAgfQotICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQgPSAoaW50KWFkZF9pbml0aWFsX21ldGFkYXRhX2NvdW50OwotICB9IGVsc2UgewotICAgIEdQUl9BU1NFUlQoYWRkX2luaXRpYWxfbWV0YWRhdGFfY291bnQgPT0gMCk7Ci0gICAgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCA9IDA7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKLSAgICAgIGNhbGwtPm1ldGFkYXRhX2JhdGNoW2ldW2pdLmRlYWRsaW5lID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX01PTk9UT05JQyk7Ci0gICAgfQotICB9Ci0gIGNhbGwtPnNlbmRfZGVhZGxpbmUgPSBzZW5kX2RlYWRsaW5lOwotICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGNoYW5uZWwsICJjYWxsIik7Ci0gIC8qIGluaXRpYWwgcmVmY291bnQgZHJvcHBlZCBieSBncnBjX2NhbGxfZGVzdHJveSAqLwotICBncnBjX2NhbGxfc3RhY2tfaW5pdCgmZXhlY19jdHgsIGNoYW5uZWxfc3RhY2ssIDEsIGRlc3Ryb3lfY2FsbCwgY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+Y29udGV4dCwgc2VydmVyX3RyYW5zcG9ydF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBDQUxMX1NUQUNLX0ZST01fQ0FMTChjYWxsKSk7Ci0gIGlmIChjcSAhPSBOVUxMKSB7Ci0gICAgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY3EsICJiaW5kIik7Ci0gICAgZ3JwY19jYWxsX3N0YWNrX3NldF9wb2xsc2V0KCZleGVjX2N0eCwgQ0FMTF9TVEFDS19GUk9NX0NBTEwoY2FsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfcG9sbHNldChjcSkpOwotICB9Ci0gIGlmIChwYXJlbnRfY2FsbCAhPSBOVUxMKSB7Ci0gICAgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihwYXJlbnRfY2FsbCwgImNoaWxkIik7Ci0gICAgR1BSX0FTU0VSVChjYWxsLT5pc19jbGllbnQpOwotICAgIEdQUl9BU1NFUlQoIXBhcmVudF9jYWxsLT5pc19jbGllbnQpOwotCi0gICAgZ3ByX211X2xvY2soJnBhcmVudF9jYWxsLT5tdSk7Ci0KLSAgICBpZiAocHJvcGFnYXRpb25fbWFzayAmIEdSUENfUFJPUEFHQVRFX0RFQURMSU5FKSB7Ci0gICAgICBzZW5kX2RlYWRsaW5lID0gZ3ByX3RpbWVfbWluKAotICAgICAgICAgIGdwcl9jb252ZXJ0X2Nsb2NrX3R5cGUoc2VuZF9kZWFkbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9jYWxsLT5zZW5kX2RlYWRsaW5lLmNsb2NrX3R5cGUpLAotICAgICAgICAgIHBhcmVudF9jYWxsLT5zZW5kX2RlYWRsaW5lKTsKLSAgICB9Ci0gICAgLyogZm9yIG5vdyBHUlBDX1BST1BBR0FURV9UUkFDSU5HX0NPTlRFWFQgKk1VU1QqIGJlIHBhc3NlZCB3aXRoCi0gICAgICogR1JQQ19QUk9QQUdBVEVfU1RBVFNfQ09OVEVYVCAqLwotICAgIC8qIFRPRE8oY3RpbGxlcik6IFRoaXMgc2hvdWxkIGNoYW5nZSB0byB1c2UgdGhlIGFwcHJvcHJpYXRlIGNlbnN1cyBzdGFydF9vcAotICAgICAqIGNhbGwuICovCi0gICAgaWYgKHByb3BhZ2F0aW9uX21hc2sgJiBHUlBDX1BST1BBR0FURV9DRU5TVVNfVFJBQ0lOR19DT05URVhUKSB7Ci0gICAgICBHUFJfQVNTRVJUKHByb3BhZ2F0aW9uX21hc2sgJiBHUlBDX1BST1BBR0FURV9DRU5TVVNfU1RBVFNfQ09OVEVYVCk7Ci0gICAgICBncnBjX2NhbGxfY29udGV4dF9zZXQoY2FsbCwgR1JQQ19DT05URVhUX1RSQUNJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2NhbGwtPmNvbnRleHRbR1JQQ19DT05URVhUX1RSQUNJTkddLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBHUFJfQVNTRVJUKHByb3BhZ2F0aW9uX21hc2sgJiBHUlBDX1BST1BBR0FURV9DRU5TVVNfU1RBVFNfQ09OVEVYVCk7Ci0gICAgfQotICAgIGlmIChwcm9wYWdhdGlvbl9tYXNrICYgR1JQQ19QUk9QQUdBVEVfQ0FOQ0VMTEFUSU9OKSB7Ci0gICAgICBjYWxsLT5jYW5jZWxsYXRpb25faXNfaW5oZXJpdGVkID0gMTsKLSAgICB9Ci0KLSAgICBpZiAocGFyZW50X2NhbGwtPmZpcnN0X2NoaWxkID09IE5VTEwpIHsKLSAgICAgIHBhcmVudF9jYWxsLT5maXJzdF9jaGlsZCA9IGNhbGw7Ci0gICAgICBjYWxsLT5zaWJsaW5nX25leHQgPSBjYWxsLT5zaWJsaW5nX3ByZXYgPSBjYWxsOwotICAgIH0gZWxzZSB7Ci0gICAgICBjYWxsLT5zaWJsaW5nX25leHQgPSBwYXJlbnRfY2FsbC0+Zmlyc3RfY2hpbGQ7Ci0gICAgICBjYWxsLT5zaWJsaW5nX3ByZXYgPSBwYXJlbnRfY2FsbC0+Zmlyc3RfY2hpbGQtPnNpYmxpbmdfcHJldjsKLSAgICAgIGNhbGwtPnNpYmxpbmdfbmV4dC0+c2libGluZ19wcmV2ID0gY2FsbC0+c2libGluZ19wcmV2LT5zaWJsaW5nX25leHQgPQotICAgICAgICAgIGNhbGw7Ci0gICAgfQotCi0gICAgZ3ByX211X3VubG9jaygmcGFyZW50X2NhbGwtPm11KTsKLSAgfQotICBpZiAoZ3ByX3RpbWVfY21wKHNlbmRfZGVhZGxpbmUsIGdwcl9pbmZfZnV0dXJlKHNlbmRfZGVhZGxpbmUuY2xvY2tfdHlwZSkpICE9Ci0gICAgICAwKSB7Ci0gICAgc2V0X2RlYWRsaW5lX2FsYXJtKCZleGVjX2N0eCwgY2FsbCwgc2VuZF9kZWFkbGluZSk7Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jYWxsX2NyZWF0ZSIsIDApOwotICByZXR1cm4gY2FsbDsKLX0KLQotdm9pZCBncnBjX2NhbGxfc2V0X2NvbXBsZXRpb25fcXVldWUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EpIHsKLSAgR1BSX0FTU0VSVChjcSk7Ci0gIGNhbGwtPmNxID0gY3E7Ci0gIEdSUENfQ1FfSU5URVJOQUxfUkVGKGNxLCAiYmluZCIpOwotICBncnBjX2NhbGxfc3RhY2tfc2V0X3BvbGxzZXQoZXhlY19jdHgsIENBTExfU1RBQ0tfRlJPTV9DQUxMKGNhbGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9wb2xsc2V0KGNxKSk7Ci19Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBSRUZfUkVBU09OIHJlYXNvbgotI2RlZmluZSBSRUZfQVJHICwgY29uc3QgY2hhciAqcmVhc29uCi0jZWxzZQotI2RlZmluZSBSRUZfUkVBU09OICIiCi0jZGVmaW5lIFJFRl9BUkcKLSNlbmRpZgotdm9pZCBncnBjX2NhbGxfaW50ZXJuYWxfcmVmKGdycGNfY2FsbCAqYyBSRUZfQVJHKSB7Ci0gIEdSUENfQ0FMTF9TVEFDS19SRUYoQ0FMTF9TVEFDS19GUk9NX0NBTEwoYyksIFJFRl9SRUFTT04pOwotfQotdm9pZCBncnBjX2NhbGxfaW50ZXJuYWxfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqYyBSRUZfQVJHKSB7Ci0gIEdSUENfQ0FMTF9TVEFDS19VTlJFRihleGVjX2N0eCwgQ0FMTF9TVEFDS19GUk9NX0NBTEwoYyksIFJFRl9SRUFTT04pOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NhbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNhbGwsIGJvb2wgc3VjY2VzcykgewotICBzaXplX3QgaTsKLSAgaW50IGlpOwotICBncnBjX2NhbGwgKmMgPSBjYWxsOwotICBHUFJfVElNRVJfQkVHSU4oImRlc3Ryb3lfY2FsbCIsIDApOwotICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9kZXN0cm95KAotICAgICAgICAmYy0+bWV0YWRhdGFfYmF0Y2hbMSAvKiBpc19yZWNlaXZpbmcgKi9dW2kgLyogaXNfaW5pdGlhbCAqL10pOwotICB9Ci0gIGlmIChjLT5yZWNlaXZpbmdfc3RyZWFtICE9IE5VTEwpIHsKLSAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGMtPnJlY2VpdmluZ19zdHJlYW0pOwotICB9Ci0gIGdycGNfY2FsbF9zdGFja19kZXN0cm95KGV4ZWNfY3R4LCBDQUxMX1NUQUNLX0ZST01fQ0FMTChjKSk7Ci0gIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgYy0+Y2hhbm5lbCwgImNhbGwiKTsKLSAgZ3ByX211X2Rlc3Ryb3koJmMtPm11KTsKLSAgZm9yIChpID0gMDsgaSA8IFNUQVRVU19TT1VSQ0VfQ09VTlQ7IGkrKykgewotICAgIGlmIChjLT5zdGF0dXNbaV0uZGV0YWlscykgewotICAgICAgR1JQQ19NRFNUUl9VTlJFRihjLT5zdGF0dXNbaV0uZGV0YWlscyk7Ci0gICAgfQotICB9Ci0gIGZvciAoaWkgPSAwOyBpaSA8IGMtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQ7IGlpKyspIHsKLSAgICBHUlBDX01ERUxFTV9VTlJFRihjLT5zZW5kX2V4dHJhX21ldGFkYXRhW2lpXS5tZCk7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IEdSUENfQ09OVEVYVF9DT1VOVDsgaSsrKSB7Ci0gICAgaWYgKGMtPmNvbnRleHRbaV0uZGVzdHJveSkgewotICAgICAgYy0+Y29udGV4dFtpXS5kZXN0cm95KGMtPmNvbnRleHRbaV0udmFsdWUpOwotICAgIH0KLSAgfQotICBpZiAoYy0+Y3EpIHsKLSAgICBHUlBDX0NRX0lOVEVSTkFMX1VOUkVGKGMtPmNxLCAiYmluZCIpOwotICB9Ci0gIGdwcl9mcmVlKGMpOwotICBHUFJfVElNRVJfRU5EKCJkZXN0cm95X2NhbGwiLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3N0YXR1c19jb2RlKGdycGNfY2FsbCAqY2FsbCwgc3RhdHVzX3NvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhdHVzKSB7Ci0gIGlmIChjYWxsLT5zdGF0dXNbc291cmNlXS5pc19zZXQpIHJldHVybjsKLQotICBjYWxsLT5zdGF0dXNbc291cmNlXS5pc19zZXQgPSAxOwotICBjYWxsLT5zdGF0dXNbc291cmNlXS5jb2RlID0gKGdycGNfc3RhdHVzX2NvZGUpc3RhdHVzOwotCi0gIC8qIFRPRE8oY3RpbGxlcik6IHdoYXQgdG8gZG8gYWJvdXQgdGhlIGZsdXNoIHRoYXQgd2FzIHByZXZpb3VzbHkgaGVyZSAqLwotfQotCi1zdGF0aWMgdm9pZCBzZXRfY29tcHJlc3Npb25fYWxnb3JpdGhtKGdycGNfY2FsbCAqY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gYWxnbykgewotICBjYWxsLT5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBhbGdvOwotfQotCi1ncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBncnBjX2NhbGxfdGVzdF9vbmx5X2dldF9jb21wcmVzc2lvbl9hbGdvcml0aG0oCi0gICAgZ3JwY19jYWxsICpjYWxsKSB7Ci0gIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGFsZ29yaXRobTsKLSAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKLSAgYWxnb3JpdGhtID0gY2FsbC0+Y29tcHJlc3Npb25fYWxnb3JpdGhtOwotICBncHJfbXVfdW5sb2NrKCZjYWxsLT5tdSk7Ci0gIHJldHVybiBhbGdvcml0aG07Ci19Ci0KLXVpbnQzMl90IGdycGNfY2FsbF90ZXN0X29ubHlfZ2V0X21lc3NhZ2VfZmxhZ3MoZ3JwY19jYWxsICpjYWxsKSB7Ci0gIHVpbnQzMl90IGZsYWdzOwotICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOwotICBmbGFncyA9IGNhbGwtPnRlc3Rfb25seV9sYXN0X21lc3NhZ2VfZmxhZ3M7Ci0gIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKLSAgcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2VuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyKHZvaWQgKnApIHsgcmV0dXJuOyB9Ci0KLXN0YXRpYyB2b2lkIHNldF9lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcihncnBjX2NhbGwgKmNhbGwsIGdycGNfbWRlbGVtICptZGVsKSB7Ci0gIHNpemVfdCBpOwotICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG07Ci0gIGdwcl9zbGljZV9idWZmZXIgYWNjZXB0X2VuY29kaW5nX3BhcnRzOwotICBncHJfc2xpY2UgYWNjZXB0X2VuY29kaW5nX3NsaWNlOwotICB2b2lkICphY2NlcHRlZF91c2VyX2RhdGE7Ci0KLSAgYWNjZXB0ZWRfdXNlcl9kYXRhID0KLSAgICAgIGdycGNfbWRlbGVtX2dldF91c2VyX2RhdGEobWRlbCwgZGVzdHJveV9lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcik7Ci0gIGlmIChhY2NlcHRlZF91c2VyX2RhdGEgIT0gTlVMTCkgewotICAgIGNhbGwtPmVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyID0KLSAgICAgICAgKHVpbnQzMl90KSgoKHVpbnRwdHJfdClhY2NlcHRlZF91c2VyX2RhdGEpIC0gMSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYWNjZXB0X2VuY29kaW5nX3NsaWNlID0gbWRlbC0+dmFsdWUtPnNsaWNlOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmFjY2VwdF9lbmNvZGluZ19wYXJ0cyk7Ci0gIGdwcl9zbGljZV9zcGxpdChhY2NlcHRfZW5jb2Rpbmdfc2xpY2UsICIsIiwgJmFjY2VwdF9lbmNvZGluZ19wYXJ0cyk7Ci0KLSAgLyogTm8gbmVlZCB0byB6ZXJvIGNhbGwtPmVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyOiBncnBjX2NhbGxfY3JlYXRlIGFscmVhZHkKLSAgICogemVyb2VzIHRoZSB3aG9sZSBncnBjX2NhbGwgKi8KLSAgLyogQWx3YXlzIHN1cHBvcnQgbm8gY29tcHJlc3Npb24gKi8KLSAgR1BSX0JJVFNFVCgmY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIsIEdSUENfQ09NUFJFU1NfTk9ORSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhY2NlcHRfZW5jb2RpbmdfcGFydHMuY291bnQ7IGkrKykgewotICAgIGNvbnN0IGdwcl9zbGljZSAqYWNjZXB0X2VuY29kaW5nX2VudHJ5X3NsaWNlID0KLSAgICAgICAgJmFjY2VwdF9lbmNvZGluZ19wYXJ0cy5zbGljZXNbaV07Ci0gICAgaWYgKGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX3BhcnNlKAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKCphY2NlcHRfZW5jb2RpbmdfZW50cnlfc2xpY2UpLAotICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSCgqYWNjZXB0X2VuY29kaW5nX2VudHJ5X3NsaWNlKSwgJmFsZ29yaXRobSkpIHsKLSAgICAgIEdQUl9CSVRTRVQoJmNhbGwtPmVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyLCBhbGdvcml0aG0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBjaGFyICphY2NlcHRfZW5jb2RpbmdfZW50cnlfc3RyID0KLSAgICAgICAgICBncHJfZHVtcF9zbGljZSgqYWNjZXB0X2VuY29kaW5nX2VudHJ5X3NsaWNlLCBHUFJfRFVNUF9BU0NJSSk7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICAgIkludmFsaWQgZW50cnkgaW4gYWNjZXB0IGVuY29kaW5nIG1ldGFkYXRhOiAnJXMnLiBJZ25vcmluZy4iLAotICAgICAgICAgICAgICBhY2NlcHRfZW5jb2RpbmdfZW50cnlfc3RyKTsKLSAgICAgIGdwcl9mcmVlKGFjY2VwdF9lbmNvZGluZ19lbnRyeV9zdHIpOwotICAgIH0KLSAgfQotCi0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmYWNjZXB0X2VuY29kaW5nX3BhcnRzKTsKLQotICBncnBjX21kZWxlbV9zZXRfdXNlcl9kYXRhKAotICAgICAgbWRlbCwgZGVzdHJveV9lbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlciwKLSAgICAgICh2b2lkICopKCgodWludHB0cl90KWNhbGwtPmVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyKSArIDEpKTsKLX0KLQotdWludDMyX3QgZ3JwY19jYWxsX3Rlc3Rfb25seV9nZXRfZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIoZ3JwY19jYWxsICpjYWxsKSB7Ci0gIHVpbnQzMl90IGVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyOwotICBncHJfbXVfbG9jaygmY2FsbC0+bXUpOwotICBlbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlciA9IGNhbGwtPmVuY29kaW5nc19hY2NlcHRlZF9ieV9wZWVyOwotICBncHJfbXVfdW5sb2NrKCZjYWxsLT5tdSk7Ci0gIHJldHVybiBlbmNvZGluZ3NfYWNjZXB0ZWRfYnlfcGVlcjsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3N0YXR1c19kZXRhaWxzKGdycGNfY2FsbCAqY2FsbCwgc3RhdHVzX3NvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZHN0ciAqc3RhdHVzKSB7Ci0gIGlmIChjYWxsLT5zdGF0dXNbc291cmNlXS5kZXRhaWxzICE9IE5VTEwpIHsKLSAgICBHUlBDX01EU1RSX1VOUkVGKGNhbGwtPnN0YXR1c1tzb3VyY2VdLmRldGFpbHMpOwotICB9Ci0gIGNhbGwtPnN0YXR1c1tzb3VyY2VdLmRldGFpbHMgPSBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9maW5hbF9zdGF0dXMoZ3JwY19jYWxsICpjYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqc2V0X3ZhbHVlKShncnBjX3N0YXR1c19jb2RlIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNldF92YWx1ZV91c2VyX2RhdGEpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBTVEFUVVNfU09VUkNFX0NPVU5UOyBpKyspIHsKLSAgICBpZiAoY2FsbC0+c3RhdHVzW2ldLmlzX3NldCkgewotICAgICAgc2V0X3ZhbHVlKGNhbGwtPnN0YXR1c1tpXS5jb2RlLCBzZXRfdmFsdWVfdXNlcl9kYXRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgaWYgKGNhbGwtPmlzX2NsaWVudCkgewotICAgIHNldF92YWx1ZShHUlBDX1NUQVRVU19VTktOT1dOLCBzZXRfdmFsdWVfdXNlcl9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICBzZXRfdmFsdWUoR1JQQ19TVEFUVVNfT0ssIHNldF92YWx1ZV91c2VyX2RhdGEpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9maW5hbF9kZXRhaWxzKGdycGNfY2FsbCAqY2FsbCwgY2hhciAqKm91dF9kZXRhaWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfZGV0YWlsc19jYXBhY2l0eSkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IFNUQVRVU19TT1VSQ0VfQ09VTlQ7IGkrKykgewotICAgIGlmIChjYWxsLT5zdGF0dXNbaV0uaXNfc2V0KSB7Ci0gICAgICBpZiAoY2FsbC0+c3RhdHVzW2ldLmRldGFpbHMpIHsKLSAgICAgICAgZ3ByX3NsaWNlIGRldGFpbHMgPSBjYWxsLT5zdGF0dXNbaV0uZGV0YWlscy0+c2xpY2U7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBHUFJfU0xJQ0VfTEVOR1RIKGRldGFpbHMpOwotICAgICAgICBpZiAobGVuICsgMSA+ICpvdXRfZGV0YWlsc19jYXBhY2l0eSkgewotICAgICAgICAgICpvdXRfZGV0YWlsc19jYXBhY2l0eSA9Ci0gICAgICAgICAgICAgIEdQUl9NQVgobGVuICsgMSwgKm91dF9kZXRhaWxzX2NhcGFjaXR5ICogMyAvIDIpOwotICAgICAgICAgICpvdXRfZGV0YWlscyA9IGdwcl9yZWFsbG9jKCpvdXRfZGV0YWlscywgKm91dF9kZXRhaWxzX2NhcGFjaXR5KTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKm91dF9kZXRhaWxzLCBHUFJfU0xJQ0VfU1RBUlRfUFRSKGRldGFpbHMpLCBsZW4pOwotICAgICAgICAoKm91dF9kZXRhaWxzKVtsZW5dID0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdvdG8gbm9fZGV0YWlsczsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotbm9fZGV0YWlsczoKLSAgaWYgKDAgPT0gKm91dF9kZXRhaWxzX2NhcGFjaXR5KSB7Ci0gICAgKm91dF9kZXRhaWxzX2NhcGFjaXR5ID0gODsKLSAgICAqb3V0X2RldGFpbHMgPSBncHJfbWFsbG9jKCpvdXRfZGV0YWlsc19jYXBhY2l0eSk7Ci0gIH0KLSAgKipvdXRfZGV0YWlscyA9IDA7Ci19Ci0KLXN0YXRpYyBncnBjX2xpbmtlZF9tZGVsZW0gKmxpbmtlZF9mcm9tX21kKGdycGNfbWV0YWRhdGEgKm1kKSB7Ci0gIHJldHVybiAoZ3JwY19saW5rZWRfbWRlbGVtICopJm1kLT5pbnRlcm5hbF9kYXRhOwotfQotCi1zdGF0aWMgaW50IHByZXBhcmVfYXBwbGljYXRpb25fbWV0YWRhdGEoZ3JwY19jYWxsICpjYWxsLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZXRhZGF0YSAqbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3RyYWlsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVwZW5kX2V4dHJhX21ldGFkYXRhKSB7Ci0gIGludCBpOwotICBncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCA9Ci0gICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMCAvKiBpc19yZWNlaXZpbmcgKi9dW2lzX3RyYWlsaW5nXTsKLSAgaWYgKHByZXBlbmRfZXh0cmFfbWV0YWRhdGEpIHsKLSAgICBpZiAoY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCA9PSAwKSB7Ci0gICAgICBwcmVwZW5kX2V4dHJhX21ldGFkYXRhID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpID0gMDsgaSA8IGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQ7IGkrKykgewotICAgICAgICBHUlBDX01ERUxFTV9SRUYoY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YVtpXS5tZCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbaV0ucHJldiA9ICZjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhW2kgLSAxXTsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50IC0gMTsgaSsrKSB7Ci0gICAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbaV0ubmV4dCA9ICZjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhW2kgKyAxXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBncnBjX21ldGFkYXRhICptZCA9ICZtZXRhZGF0YVtpXTsKLSAgICBncnBjX2xpbmtlZF9tZGVsZW0gKmwgPSAoZ3JwY19saW5rZWRfbWRlbGVtICopJm1kLT5pbnRlcm5hbF9kYXRhOwotICAgIEdQUl9BU1NFUlQoc2l6ZW9mKGdycGNfbGlua2VkX21kZWxlbSkgPT0gc2l6ZW9mKG1kLT5pbnRlcm5hbF9kYXRhKSk7Ci0gICAgbC0+bWQgPSBncnBjX21kZWxlbV9mcm9tX3N0cmluZ19hbmRfYnVmZmVyKAotICAgICAgICBtZC0+a2V5LCAoY29uc3QgdWludDhfdCAqKW1kLT52YWx1ZSwgbWQtPnZhbHVlX2xlbmd0aCk7Ci0gICAgaWYgKCFncnBjX2hlYWRlcl9rZXlfaXNfbGVnYWwoZ3JwY19tZHN0cl9hc19jX3N0cmluZyhsLT5tZC0+a2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX01EU1RSX0xFTkdUSChsLT5tZC0+a2V5KSkpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiYXR0ZW1wdCB0byBzZW5kIGludmFsaWQgbWV0YWRhdGEga2V5OiAlcyIsCi0gICAgICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcobC0+bWQtPmtleSkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIGlmICghZ3JwY19pc19iaW5hcnlfaGVhZGVyKGdycGNfbWRzdHJfYXNfY19zdHJpbmcobC0+bWQtPmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURTVFJfTEVOR1RIKGwtPm1kLT5rZXkpKSAmJgotICAgICAgICAgICAgICAgIWdycGNfaGVhZGVyX25vbmJpbl92YWx1ZV9pc19sZWdhbCgKLSAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGwtPm1kLT52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgR1JQQ19NRFNUUl9MRU5HVEgobC0+bWQtPnZhbHVlKSkpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiYXR0ZW1wdCB0byBzZW5kIGludmFsaWQgbWV0YWRhdGEgdmFsdWUiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICBmb3IgKGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotICAgIGxpbmtlZF9mcm9tX21kKCZtZXRhZGF0YVtpXSktPnByZXYgPSBsaW5rZWRfZnJvbV9tZCgmbWV0YWRhdGFbaSAtIDFdKTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspIHsKLSAgICBsaW5rZWRfZnJvbV9tZCgmbWV0YWRhdGFbaV0pLT5uZXh0ID0gbGlua2VkX2Zyb21fbWQoJm1ldGFkYXRhW2kgKyAxXSk7Ci0gIH0KLSAgc3dpdGNoIChwcmVwZW5kX2V4dHJhX21ldGFkYXRhICogMiArIChjb3VudCAhPSAwKSkgewotICAgIGNhc2UgMDoKLSAgICAgIC8qIG5vIHByZXBlbmQsIG5vIG1ldGFkYXRhID0+IG5vdGhpbmcgdG8gZG8gKi8KLSAgICAgIGJhdGNoLT5saXN0LmhlYWQgPSBiYXRjaC0+bGlzdC50YWlsID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIC8qIG1ldGFkYXRhLCBidXQgbm8gcHJlcGVuZCAqLwotICAgICAgYmF0Y2gtPmxpc3QuaGVhZCA9IGxpbmtlZF9mcm9tX21kKCZtZXRhZGF0YVswXSk7Ci0gICAgICBiYXRjaC0+bGlzdC50YWlsID0gbGlua2VkX2Zyb21fbWQoJm1ldGFkYXRhW2NvdW50IC0gMV0pOwotICAgICAgYmF0Y2gtPmxpc3QuaGVhZC0+cHJldiA9IE5VTEw7Ci0gICAgICBiYXRjaC0+bGlzdC50YWlsLT5uZXh0ID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIC8qIHByZXBlbmQsIGJ1dCBubyBtZCAqLwotICAgICAgYmF0Y2gtPmxpc3QuaGVhZCA9ICZjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhWzBdOwotICAgICAgYmF0Y2gtPmxpc3QudGFpbCA9Ci0gICAgICAgICAgJmNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCAtIDFdOwotICAgICAgYmF0Y2gtPmxpc3QuaGVhZC0+cHJldiA9IE5VTEw7Ci0gICAgICBiYXRjaC0+bGlzdC50YWlsLT5uZXh0ID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIC8qIHByZXBlbmQgQU5EIG1kICovCi0gICAgICBiYXRjaC0+bGlzdC5oZWFkID0gJmNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbMF07Ci0gICAgICBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhW2NhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQgLSAxXS5uZXh0ID0KLSAgICAgICAgICBsaW5rZWRfZnJvbV9tZCgmbWV0YWRhdGFbMF0pOwotICAgICAgbGlua2VkX2Zyb21fbWQoJm1ldGFkYXRhWzBdKS0+cHJldiA9Ci0gICAgICAgICAgJmNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbY2FsbC0+c2VuZF9leHRyYV9tZXRhZGF0YV9jb3VudCAtIDFdOwotICAgICAgYmF0Y2gtPmxpc3QudGFpbCA9IGxpbmtlZF9mcm9tX21kKCZtZXRhZGF0YVtjb3VudCAtIDFdKTsKLSAgICAgIGJhdGNoLT5saXN0LmhlYWQtPnByZXYgPSBOVUxMOwotICAgICAgYmF0Y2gtPmxpc3QudGFpbC0+bmV4dCA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuIDApOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgZ3JwY19jYWxsX2Rlc3Ryb3koZ3JwY19jYWxsICpjKSB7Ci0gIGludCBjYW5jZWw7Ci0gIGdycGNfY2FsbCAqcGFyZW50ID0gYy0+cGFyZW50OwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotCi0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jYWxsX2Rlc3Ryb3kiLCAwKTsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9kZXN0cm95KGM9JXApIiwgMSwgKGMpKTsKLQotICBpZiAocGFyZW50KSB7Ci0gICAgZ3ByX211X2xvY2soJnBhcmVudC0+bXUpOwotICAgIGlmIChjID09IHBhcmVudC0+Zmlyc3RfY2hpbGQpIHsKLSAgICAgIHBhcmVudC0+Zmlyc3RfY2hpbGQgPSBjLT5zaWJsaW5nX25leHQ7Ci0gICAgICBpZiAoYyA9PSBwYXJlbnQtPmZpcnN0X2NoaWxkKSB7Ci0gICAgICAgIHBhcmVudC0+Zmlyc3RfY2hpbGQgPSBOVUxMOwotICAgICAgfQotICAgICAgYy0+c2libGluZ19wcmV2LT5zaWJsaW5nX25leHQgPSBjLT5zaWJsaW5nX25leHQ7Ci0gICAgICBjLT5zaWJsaW5nX25leHQtPnNpYmxpbmdfcHJldiA9IGMtPnNpYmxpbmdfcHJldjsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmcGFyZW50LT5tdSk7Ci0gICAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKCZleGVjX2N0eCwgcGFyZW50LCAiY2hpbGQiKTsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIEdQUl9BU1NFUlQoIWMtPmRlc3Ryb3lfY2FsbGVkKTsKLSAgYy0+ZGVzdHJveV9jYWxsZWQgPSAxOwotICBpZiAoYy0+aGF2ZV9hbGFybSkgewotICAgIGdycGNfdGltZXJfY2FuY2VsKCZleGVjX2N0eCwgJmMtPmFsYXJtKTsKLSAgfQotICBjYW5jZWwgPSAhYy0+cmVjZWl2ZWRfZmluYWxfb3A7Ci0gIGdwcl9tdV91bmxvY2soJmMtPm11KTsKLSAgaWYgKGNhbmNlbCkgZ3JwY19jYWxsX2NhbmNlbChjLCBOVUxMKTsKLSAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKCZleGVjX2N0eCwgYywgImRlc3Ryb3kiKTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jYWxsX2Rlc3Ryb3kiLCAwKTsKLX0KLQotZ3JwY19jYWxsX2Vycm9yIGdycGNfY2FsbF9jYW5jZWwoZ3JwY19jYWxsICpjYWxsLCB2b2lkICpyZXNlcnZlZCkgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jYWxsX2NhbmNlbChjYWxsPSVwLCByZXNlcnZlZD0lcCkiLCAyLCAoY2FsbCwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOwotICByZXR1cm4gZ3JwY19jYWxsX2NhbmNlbF93aXRoX3N0YXR1cyhjYWxsLCBHUlBDX1NUQVRVU19DQU5DRUxMRUQsICJDYW5jZWxsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLX0KLQotZ3JwY19jYWxsX2Vycm9yIGdycGNfY2FsbF9jYW5jZWxfd2l0aF9zdGF0dXMoZ3JwY19jYWxsICpjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGdycGNfY2FsbF9lcnJvciByOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX2NhbGxfY2FuY2VsX3dpdGhfc3RhdHVzKCIKLSAgICAgICJjPSVwLCBzdGF0dXM9JWQsIGRlc2NyaXB0aW9uPSVzLCByZXNlcnZlZD0lcCkiLAotICAgICAgNCwgKGMsIChpbnQpc3RhdHVzLCBkZXNjcmlwdGlvbiwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVChyZXNlcnZlZCA9PSBOVUxMKTsKLSAgZ3ByX211X2xvY2soJmMtPm11KTsKLSAgciA9IGNhbmNlbF93aXRoX3N0YXR1cygmZXhlY19jdHgsIGMsIHN0YXR1cywgZGVzY3JpcHRpb24pOwotICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIHJldHVybiByOwotfQotCi10eXBlZGVmIHN0cnVjdCBjYW5jZWxfY2xvc3VyZSB7Ci0gIGdycGNfY2xvc3VyZSBjbG9zdXJlOwotICBncnBjX2NhbGwgKmNhbGw7Ci0gIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzOwotfSBjYW5jZWxfY2xvc3VyZTsKLQotc3RhdGljIHZvaWQgZG9uZV9jYW5jZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNjcCwgYm9vbCBzdWNjZXNzKSB7Ci0gIGNhbmNlbF9jbG9zdXJlICpjYyA9IGNjcDsKLSAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYy0+Y2FsbCwgImNhbmNlbCIpOwotICBncHJfZnJlZShjYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfY2FuY2VsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpjY3AsIGJvb2wgc3VjY2VzcykgewotICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Agb3A7Ci0gIGNhbmNlbF9jbG9zdXJlICpjYyA9IGNjcDsKLSAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7Ci0gIG9wLmNhbmNlbF93aXRoX3N0YXR1cyA9IGNjLT5zdGF0dXM7Ci0gIC8qIHJldXNlIGNsb3N1cmUgdG8gY2F0Y2ggY29tcGxldGlvbiAqLwotICBncnBjX2Nsb3N1cmVfaW5pdCgmY2MtPmNsb3N1cmUsIGRvbmVfY2FuY2VsLCBjYyk7Ci0gIG9wLm9uX2NvbXBsZXRlID0gJmNjLT5jbG9zdXJlOwotICBleGVjdXRlX29wKGV4ZWNfY3R4LCBjYy0+Y2FsbCwgJm9wKTsKLX0KLQotc3RhdGljIGdycGNfY2FsbF9lcnJvciBjYW5jZWxfd2l0aF9zdGF0dXMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbCAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pIHsKLSAgZ3JwY19tZHN0ciAqZGV0YWlscyA9Ci0gICAgICBkZXNjcmlwdGlvbiA/IGdycGNfbWRzdHJfZnJvbV9zdHJpbmcoZGVzY3JpcHRpb24pIDogTlVMTDsKLSAgY2FuY2VsX2Nsb3N1cmUgKmNjID0gZ3ByX21hbGxvYyhzaXplb2YoKmNjKSk7Ci0KLSAgR1BSX0FTU0VSVChzdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0spOwotCi0gIHNldF9zdGF0dXNfY29kZShjLCBTVEFUVVNfRlJPTV9BUElfT1ZFUlJJREUsICh1aW50MzJfdClzdGF0dXMpOwotICBzZXRfc3RhdHVzX2RldGFpbHMoYywgU1RBVFVTX0ZST01fQVBJX09WRVJSSURFLCBkZXRhaWxzKTsKLQotICBncnBjX2Nsb3N1cmVfaW5pdCgmY2MtPmNsb3N1cmUsIHNlbmRfY2FuY2VsLCBjYyk7Ci0gIGNjLT5jYWxsID0gYzsKLSAgY2MtPnN0YXR1cyA9IHN0YXR1czsKLSAgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjLCAiY2FuY2VsIik7Ci0gIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJmNjLT5jbG9zdXJlLCB0cnVlLCBOVUxMKTsKLQotICByZXR1cm4gR1JQQ19DQUxMX09LOwotfQotCi1zdGF0aWMgdm9pZCBleGVjdXRlX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGwgKmNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW07Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJleGVjdXRlX29wIiwgMCk7Ci0gIGVsZW0gPSBDQUxMX0VMRU1fRlJPTV9DQUxMKGNhbGwsIDApOwotICBvcC0+Y29udGV4dCA9IGNhbGwtPmNvbnRleHQ7Ci0gIGVsZW0tPmZpbHRlci0+c3RhcnRfdHJhbnNwb3J0X3N0cmVhbV9vcChleGVjX2N0eCwgZWxlbSwgb3ApOwotICBHUFJfVElNRVJfRU5EKCJleGVjdXRlX29wIiwgMCk7Ci19Ci0KLWNoYXIgKmdycGNfY2FsbF9nZXRfcGVlcihncnBjX2NhbGwgKmNhbGwpIHsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSBDQUxMX0VMRU1fRlJPTV9DQUxMKGNhbGwsIDApOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBjaGFyICpyZXN1bHQ7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2NhbGxfZ2V0X3BlZXIoJXApIiwgMSwgKGNhbGwpKTsKLSAgcmVzdWx0ID0gZWxlbS0+ZmlsdGVyLT5nZXRfcGVlcigmZXhlY19jdHgsIGVsZW0pOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICByZXN1bHQgPSBncnBjX2NoYW5uZWxfZ2V0X3RhcmdldChjYWxsLT5jaGFubmVsKTsKLSAgfQotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICByZXN1bHQgPSBncHJfc3RyZHVwKCJ1bmtub3duIik7Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotZ3JwY19jYWxsICpncnBjX2NhbGxfZnJvbV90b3BfZWxlbWVudChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgewotICByZXR1cm4gQ0FMTF9GUk9NX1RPUF9FTEVNKGVsZW0pOwotfQotCi1zdGF0aWMgdm9pZCBjYWxsX2FsYXJtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2VzcykgewotICBncnBjX2NhbGwgKmNhbGwgPSBhcmc7Ci0gIGdwcl9tdV9sb2NrKCZjYWxsLT5tdSk7Ci0gIGNhbGwtPmhhdmVfYWxhcm0gPSAwOwotICBpZiAoc3VjY2VzcykgewotICAgIGNhbmNlbF93aXRoX3N0YXR1cyhleGVjX2N0eCwgY2FsbCwgR1JQQ19TVEFUVVNfREVBRExJTkVfRVhDRUVERUQsCi0gICAgICAgICAgICAgICAgICAgICAgICJEZWFkbGluZSBFeGNlZWRlZCIpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKLSAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYWxsLCAiYWxhcm0iKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2RlYWRsaW5lX2FsYXJtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGwgKmNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKSB7Ci0gIGlmIChjYWxsLT5oYXZlX2FsYXJtKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJBdHRlbXB0IHRvIHNldCBkZWFkbGluZSBhbGFybSB0d2ljZSIpOwotICAgIGFzc2VydCgwKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjYWxsLCAiYWxhcm0iKTsKLSAgY2FsbC0+aGF2ZV9hbGFybSA9IDE7Ci0gIGNhbGwtPnNlbmRfZGVhZGxpbmUgPSBncHJfY29udmVydF9jbG9ja190eXBlKGRlYWRsaW5lLCBHUFJfQ0xPQ0tfTU9OT1RPTklDKTsKLSAgZ3JwY190aW1lcl9pbml0KGV4ZWNfY3R4LCAmY2FsbC0+YWxhcm0sIGNhbGwtPnNlbmRfZGVhZGxpbmUsIGNhbGxfYWxhcm0sIGNhbGwsCi0gICAgICAgICAgICAgICAgICBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLX0KLQotLyogd2Ugb2Zmc2V0IHN0YXR1cyBieSBhIHNtYWxsIGFtb3VudCB3aGVuIHN0b3JpbmcgaXQgaW50byB0cmFuc3BvcnQgbWV0YWRhdGEKLSAgIGFzIG1ldGFkYXRhIGNhbm5vdCBzdG9yZSBhIDAgdmFsdWUgKHdoaWNoIGlzIHVzZWQgYXMgT0sgZm9yIGdycGNfc3RhdHVzX2NvZGVzCi0gICAqLwotI2RlZmluZSBTVEFUVVNfT0ZGU0VUIDEKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc3RhdHVzKHZvaWQgKmlnbm9yZWQpIHt9Ci0KLXN0YXRpYyB1aW50MzJfdCBkZWNvZGVfc3RhdHVzKGdycGNfbWRlbGVtICptZCkgewotICB1aW50MzJfdCBzdGF0dXM7Ci0gIHZvaWQgKnVzZXJfZGF0YTsKLSAgaWYgKG1kID09IEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzApIHJldHVybiAwOwotICBpZiAobWQgPT0gR1JQQ19NREVMRU1fR1JQQ19TVEFUVVNfMSkgcmV0dXJuIDE7Ci0gIGlmIChtZCA9PSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18yKSByZXR1cm4gMjsKLSAgdXNlcl9kYXRhID0gZ3JwY19tZGVsZW1fZ2V0X3VzZXJfZGF0YShtZCwgZGVzdHJveV9zdGF0dXMpOwotICBpZiAodXNlcl9kYXRhICE9IE5VTEwpIHsKLSAgICBzdGF0dXMgPSAoKHVpbnQzMl90KShpbnRwdHJfdCl1c2VyX2RhdGEpIC0gU1RBVFVTX09GRlNFVDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoIWdwcl9wYXJzZV9ieXRlc190b191aW50MzIoZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKG1kLT52YWx1ZS0+c2xpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKSkgewotICAgICAgc3RhdHVzID0gR1JQQ19TVEFUVVNfVU5LTk9XTjsgLyogY291bGQgbm90IHBhcnNlIHN0YXR1cyBjb2RlICovCi0gICAgfQotICAgIGdycGNfbWRlbGVtX3NldF91c2VyX2RhdGEobWQsIGRlc3Ryb3lfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoaW50cHRyX3QpKHN0YXR1cyArIFNUQVRVU19PRkZTRVQpKTsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdWludDMyX3QgZGVjb2RlX2NvbXByZXNzaW9uKGdycGNfbWRlbGVtICptZCkgewotICBncnBjX2NvbXByZXNzaW9uX2FsZ29yaXRobSBhbGdvcml0aG0gPQotICAgICAgZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG1fZnJvbV9tZHN0cihtZC0+dmFsdWUpOwotICBpZiAoYWxnb3JpdGhtID09IEdSUENfQ09NUFJFU1NfQUxHT1JJVEhNU19DT1VOVCkgewotICAgIGNvbnN0IGNoYXIgKm1kX2Nfc3RyID0gZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpOwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG06ICclcyciLCBtZF9jX3N0cik7Ci0gIH0KLSAgcmV0dXJuIGFsZ29yaXRobTsKLX0KLQotc3RhdGljIGdycGNfbWRlbGVtICpyZWN2X2NvbW1vbl9maWx0ZXIoZ3JwY19jYWxsICpjYWxsLCBncnBjX21kZWxlbSAqZWxlbSkgewotICBpZiAoZWxlbS0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19TVEFUVVMpIHsKLSAgICBHUFJfVElNRVJfQkVHSU4oInN0YXR1cyIsIDApOwotICAgIHNldF9zdGF0dXNfY29kZShjYWxsLCBTVEFUVVNfRlJPTV9XSVJFLCBkZWNvZGVfc3RhdHVzKGVsZW0pKTsKLSAgICBHUFJfVElNRVJfRU5EKCJzdGF0dXMiLCAwKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIGlmIChlbGVtLT5rZXkgPT0gR1JQQ19NRFNUUl9HUlBDX01FU1NBR0UpIHsKLSAgICBHUFJfVElNRVJfQkVHSU4oInN0YXR1cy1kZXRhaWxzIiwgMCk7Ci0gICAgc2V0X3N0YXR1c19kZXRhaWxzKGNhbGwsIFNUQVRVU19GUk9NX1dJUkUsIEdSUENfTURTVFJfUkVGKGVsZW0tPnZhbHVlKSk7Ci0gICAgR1BSX1RJTUVSX0VORCgic3RhdHVzLWRldGFpbHMiLCAwKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gZWxlbTsKLX0KLQotc3RhdGljIGdycGNfbWRlbGVtICpwdWJsaXNoX2FwcF9tZXRhZGF0YShncnBjX2NhbGwgKmNhbGwsIGdycGNfbWRlbGVtICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfdHJhaWxpbmcpIHsKLSAgZ3JwY19tZXRhZGF0YV9hcnJheSAqZGVzdDsKLSAgZ3JwY19tZXRhZGF0YSAqbWR1c3I7Ci0gIEdQUl9USU1FUl9CRUdJTigicHVibGlzaF9hcHBfbWV0YWRhdGEiLCAwKTsKLSAgZGVzdCA9IGNhbGwtPmJ1ZmZlcmVkX21ldGFkYXRhW2lzX3RyYWlsaW5nXTsKLSAgaWYgKGRlc3QtPmNvdW50ID09IGRlc3QtPmNhcGFjaXR5KSB7Ci0gICAgZGVzdC0+Y2FwYWNpdHkgPSBHUFJfTUFYKGRlc3QtPmNhcGFjaXR5ICsgOCwgZGVzdC0+Y2FwYWNpdHkgKiAyKTsKLSAgICBkZXN0LT5tZXRhZGF0YSA9Ci0gICAgICAgIGdwcl9yZWFsbG9jKGRlc3QtPm1ldGFkYXRhLCBzaXplb2YoZ3JwY19tZXRhZGF0YSkgKiBkZXN0LT5jYXBhY2l0eSk7Ci0gIH0KLSAgbWR1c3IgPSAmZGVzdC0+bWV0YWRhdGFbZGVzdC0+Y291bnQrK107Ci0gIG1kdXNyLT5rZXkgPSBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKGVsZW0tPmtleSk7Ci0gIG1kdXNyLT52YWx1ZSA9IGdycGNfbWRzdHJfYXNfY19zdHJpbmcoZWxlbS0+dmFsdWUpOwotICBtZHVzci0+dmFsdWVfbGVuZ3RoID0gR1BSX1NMSUNFX0xFTkdUSChlbGVtLT52YWx1ZS0+c2xpY2UpOwotICBHUFJfVElNRVJfRU5EKCJwdWJsaXNoX2FwcF9tZXRhZGF0YSIsIDApOwotICByZXR1cm4gZWxlbTsKLX0KLQotc3RhdGljIGdycGNfbWRlbGVtICpyZWN2X2luaXRpYWxfZmlsdGVyKHZvaWQgKmNhbGxwLCBncnBjX21kZWxlbSAqZWxlbSkgewotICBncnBjX2NhbGwgKmNhbGwgPSBjYWxscDsKLSAgZWxlbSA9IHJlY3ZfY29tbW9uX2ZpbHRlcihjYWxsLCBlbGVtKTsKLSAgaWYgKGVsZW0gPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgaWYgKGVsZW0tPmtleSA9PSBHUlBDX01EU1RSX0dSUENfRU5DT0RJTkcpIHsKLSAgICBHUFJfVElNRVJfQkVHSU4oImNvbXByZXNzaW9uX2FsZ29yaXRobSIsIDApOwotICAgIHNldF9jb21wcmVzc2lvbl9hbGdvcml0aG0oY2FsbCwgZGVjb2RlX2NvbXByZXNzaW9uKGVsZW0pKTsKLSAgICBHUFJfVElNRVJfRU5EKCJjb21wcmVzc2lvbl9hbGdvcml0aG0iLCAwKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIGlmIChlbGVtLT5rZXkgPT0gR1JQQ19NRFNUUl9HUlBDX0FDQ0VQVF9FTkNPRElORykgewotICAgIEdQUl9USU1FUl9CRUdJTigiZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIiLCAwKTsKLSAgICBzZXRfZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIoY2FsbCwgZWxlbSk7Ci0gICAgR1BSX1RJTUVSX0VORCgiZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIiLCAwKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcHVibGlzaF9hcHBfbWV0YWRhdGEoY2FsbCwgZWxlbSwgMCk7Ci0gIH0KLX0KLQotc3RhdGljIGdycGNfbWRlbGVtICpyZWN2X3RyYWlsaW5nX2ZpbHRlcih2b2lkICpjYWxscCwgZ3JwY19tZGVsZW0gKmVsZW0pIHsKLSAgZ3JwY19jYWxsICpjYWxsID0gY2FsbHA7Ci0gIGVsZW0gPSByZWN2X2NvbW1vbl9maWx0ZXIoY2FsbCwgZWxlbSk7Ci0gIGlmIChlbGVtID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcHVibGlzaF9hcHBfbWV0YWRhdGEoY2FsbCwgZWxlbSwgMSk7Ci0gIH0KLX0KLQotZ3JwY19jYWxsX3N0YWNrICpncnBjX2NhbGxfZ2V0X2NhbGxfc3RhY2soZ3JwY19jYWxsICpjYWxsKSB7Ci0gIHJldHVybiBDQUxMX1NUQUNLX0ZST01fQ0FMTChjYWxsKTsKLX0KLQotLyoKLSAqIEJBVENIIEFQSSBJTVBMRU1FTlRBVElPTgotICovCi0KLXN0YXRpYyB2b2lkIHNldF9zdGF0dXNfdmFsdWVfZGlyZWN0bHkoZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMsIHZvaWQgKmRlc3QpIHsKLSAgKihncnBjX3N0YXR1c19jb2RlICopZGVzdCA9IHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2NhbmNlbGxlZF92YWx1ZShncnBjX3N0YXR1c19jb2RlIHN0YXR1cywgdm9pZCAqZGVzdCkgewotICAqKGludCAqKWRlc3QgPSAoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKTsKLX0KLQotc3RhdGljIGludCBhcmVfd3JpdGVfZmxhZ3NfdmFsaWQodWludDMyX3QgZmxhZ3MpIHsKLSAgLyogY2hlY2sgdGhhdCBvbmx5IGJpdHMgaW4gR1JQQ19XUklURV8oSU5URVJOQUw/KV9VU0VEX01BU0sgYXJlIHNldCAqLwotICBjb25zdCB1aW50MzJfdCBhbGxvd2VkX3dyaXRlX3Bvc2l0aW9ucyA9Ci0gICAgICAoR1JQQ19XUklURV9VU0VEX01BU0sgfCBHUlBDX1dSSVRFX0lOVEVSTkFMX1VTRURfTUFTSyk7Ci0gIGNvbnN0IHVpbnQzMl90IGludmFsaWRfcG9zaXRpb25zID0gfmFsbG93ZWRfd3JpdGVfcG9zaXRpb25zOwotICByZXR1cm4gIShmbGFncyAmIGludmFsaWRfcG9zaXRpb25zKTsKLX0KLQotc3RhdGljIGJhdGNoX2NvbnRyb2wgKmFsbG9jYXRlX2JhdGNoX2NvbnRyb2woZ3JwY19jYWxsICpjYWxsKSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTkNVUlJFTlRfQkFUQ0hFUzsgaSsrKSB7Ci0gICAgaWYgKChjYWxsLT51c2VkX2JhdGNoZXMgJiAoMSA8PCBpKSkgPT0gMCkgewotICAgICAgY2FsbC0+dXNlZF9iYXRjaGVzID0gKHVpbnQ4X3QpKGNhbGwtPnVzZWRfYmF0Y2hlcyB8ICh1aW50OF90KSgxIDw8IGkpKTsKLSAgICAgIHJldHVybiAmY2FsbC0+YWN0aXZlX2JhdGNoZXNbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBmaW5pc2hfYmF0Y2hfY29tcGxldGlvbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpzdG9yYWdlKSB7Ci0gIGJhdGNoX2NvbnRyb2wgKmJjdGwgPSB1c2VyX2RhdGE7Ci0gIGdycGNfY2FsbCAqY2FsbCA9IGJjdGwtPmNhbGw7Ci0gIGdwcl9tdV9sb2NrKCZjYWxsLT5tdSk7Ci0gIGNhbGwtPnVzZWRfYmF0Y2hlcyA9ICh1aW50OF90KSgKLSAgICAgIGNhbGwtPnVzZWRfYmF0Y2hlcyAmIH4odWludDhfdCkoMSA8PCAoYmN0bCAtIGNhbGwtPmFjdGl2ZV9iYXRjaGVzKSkpOwotICBncHJfbXVfdW5sb2NrKCZjYWxsLT5tdSk7Ci0gIEdSUENfQ0FMTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgY2FsbCwgImNvbXBsZXRpb24iKTsKLX0KLQotc3RhdGljIHZvaWQgcG9zdF9iYXRjaF9jb21wbGV0aW9uKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoX2NvbnRyb2wgKmJjdGwpIHsKLSAgZ3JwY19jYWxsICpjYWxsID0gYmN0bC0+Y2FsbDsKLSAgaWYgKGJjdGwtPmlzX25vdGlmeV90YWdfY2xvc3VyZSkgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgYmN0bC0+bm90aWZ5X3RhZywgYmN0bC0+c3VjY2VzcywgTlVMTCk7Ci0gICAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKLSAgICBiY3RsLT5jYWxsLT51c2VkX2JhdGNoZXMgPQotICAgICAgICAodWludDhfdCkoYmN0bC0+Y2FsbC0+dXNlZF9iYXRjaGVzICYKLSAgICAgICAgICAgICAgICAgIH4odWludDhfdCkoMSA8PCAoYmN0bCAtIGJjdGwtPmNhbGwtPmFjdGl2ZV9iYXRjaGVzKSkpOwotICAgIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKLSAgICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGNhbGwsICJjb21wbGV0aW9uIik7Ci0gIH0gZWxzZSB7Ci0gICAgZ3JwY19jcV9lbmRfb3AoZXhlY19jdHgsIGJjdGwtPmNhbGwtPmNxLCBiY3RsLT5ub3RpZnlfdGFnLCBiY3RsLT5zdWNjZXNzLAotICAgICAgICAgICAgICAgICAgIGZpbmlzaF9iYXRjaF9jb21wbGV0aW9uLCBiY3RsLCAmYmN0bC0+Y3FfY29tcGxldGlvbik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY29udGludWVfcmVjZWl2aW5nX3NsaWNlcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hfY29udHJvbCAqYmN0bCkgewotICBncnBjX2NhbGwgKmNhbGwgPSBiY3RsLT5jYWxsOwotICBmb3IgKDs7KSB7Ci0gICAgc2l6ZV90IHJlbWFpbmluZyA9IGNhbGwtPnJlY2VpdmluZ19zdHJlYW0tPmxlbmd0aCAtCi0gICAgICAgICAgICAgICAgICAgICAgICgqY2FsbC0+cmVjZWl2aW5nX2J1ZmZlciktPmRhdGEucmF3LnNsaWNlX2J1ZmZlci5sZW5ndGg7Ci0gICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7Ci0gICAgICBjYWxsLT5yZWNlaXZpbmdfbWVzc2FnZSA9IDA7Ci0gICAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGNhbGwtPnJlY2VpdmluZ19zdHJlYW0pOwotICAgICAgY2FsbC0+cmVjZWl2aW5nX3N0cmVhbSA9IE5VTEw7Ci0gICAgICBpZiAoZ3ByX3VucmVmKCZiY3RsLT5zdGVwc190b19jb21wbGV0ZSkpIHsKLSAgICAgICAgcG9zdF9iYXRjaF9jb21wbGV0aW9uKGV4ZWNfY3R4LCBiY3RsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGdycGNfYnl0ZV9zdHJlYW1fbmV4dChleGVjX2N0eCwgY2FsbC0+cmVjZWl2aW5nX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsLT5yZWNlaXZpbmdfc2xpY2UsIHJlbWFpbmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsLT5yZWNlaXZpbmdfc2xpY2VfcmVhZHkpKSB7Ci0gICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmKCpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyKS0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+cmVjZWl2aW5nX3NsaWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCByZWNlaXZpbmdfc2xpY2VfcmVhZHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmJjdGxwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBiYXRjaF9jb250cm9sICpiY3RsID0gYmN0bHA7Ci0gIGdycGNfY2FsbCAqY2FsbCA9IGJjdGwtPmNhbGw7Ci0KLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmKCpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyKS0+ZGF0YS5yYXcuc2xpY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPnJlY2VpdmluZ19zbGljZSk7Ci0gICAgY29udGludWVfcmVjZWl2aW5nX3NsaWNlcyhleGVjX2N0eCwgYmN0bCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3JwY19ieXRlX3N0cmVhbV9kZXN0cm95KGV4ZWNfY3R4LCBjYWxsLT5yZWNlaXZpbmdfc3RyZWFtKTsKLSAgICBjYWxsLT5yZWNlaXZpbmdfc3RyZWFtID0gTlVMTDsKLSAgICBncnBjX2J5dGVfYnVmZmVyX2Rlc3Ryb3koKmNhbGwtPnJlY2VpdmluZ19idWZmZXIpOwotICAgICpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyID0gTlVMTDsKLSAgICBpZiAoZ3ByX3VucmVmKCZiY3RsLT5zdGVwc190b19jb21wbGV0ZSkpIHsKLSAgICAgIHBvc3RfYmF0Y2hfY29tcGxldGlvbihleGVjX2N0eCwgYmN0bCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfZGF0YV9hZnRlcl9tZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgYmF0Y2hfY29udHJvbCAqYmN0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19jYWxsICpjYWxsID0gYmN0bC0+Y2FsbDsKLSAgaWYgKGNhbGwtPnJlY2VpdmluZ19zdHJlYW0gPT0gTlVMTCkgewotICAgICpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyID0gTlVMTDsKLSAgICBjYWxsLT5yZWNlaXZpbmdfbWVzc2FnZSA9IDA7Ci0gICAgaWYgKGdwcl91bnJlZigmYmN0bC0+c3RlcHNfdG9fY29tcGxldGUpKSB7Ci0gICAgICBwb3N0X2JhdGNoX2NvbXBsZXRpb24oZXhlY19jdHgsIGJjdGwpOwotICAgIH0KLSAgfSBlbHNlIGlmIChjYWxsLT5yZWNlaXZpbmdfc3RyZWFtLT5sZW5ndGggPgotICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9nZXRfbWF4X21lc3NhZ2VfbGVuZ3RoKGNhbGwtPmNoYW5uZWwpKSB7Ci0gICAgY2FuY2VsX3dpdGhfc3RhdHVzKGV4ZWNfY3R4LCBjYWxsLCBHUlBDX1NUQVRVU19JTlRFUk5BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIk1heCBtZXNzYWdlIHNpemUgZXhjZWVkZWQiKTsKLSAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGNhbGwtPnJlY2VpdmluZ19zdHJlYW0pOwotICAgIGNhbGwtPnJlY2VpdmluZ19zdHJlYW0gPSBOVUxMOwotICAgICpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyID0gTlVMTDsKLSAgICBjYWxsLT5yZWNlaXZpbmdfbWVzc2FnZSA9IDA7Ci0gICAgaWYgKGdwcl91bnJlZigmYmN0bC0+c3RlcHNfdG9fY29tcGxldGUpKSB7Ci0gICAgICBwb3N0X2JhdGNoX2NvbXBsZXRpb24oZXhlY19jdHgsIGJjdGwpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjYWxsLT50ZXN0X29ubHlfbGFzdF9tZXNzYWdlX2ZsYWdzID0gY2FsbC0+cmVjZWl2aW5nX3N0cmVhbS0+ZmxhZ3M7Ci0gICAgaWYgKChjYWxsLT5yZWNlaXZpbmdfc3RyZWFtLT5mbGFncyAmIEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1MpICYmCi0gICAgICAgIChjYWxsLT5jb21wcmVzc2lvbl9hbGdvcml0aG0gPiBHUlBDX0NPTVBSRVNTX05PTkUpKSB7Ci0gICAgICAqY2FsbC0+cmVjZWl2aW5nX2J1ZmZlciA9IGdycGNfcmF3X2NvbXByZXNzZWRfYnl0ZV9idWZmZXJfY3JlYXRlKAotICAgICAgICAgIE5VTEwsIDAsIGNhbGwtPmNvbXByZXNzaW9uX2FsZ29yaXRobSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpjYWxsLT5yZWNlaXZpbmdfYnVmZmVyID0gZ3JwY19yYXdfYnl0ZV9idWZmZXJfY3JlYXRlKE5VTEwsIDApOwotICAgIH0KLSAgICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbC0+cmVjZWl2aW5nX3NsaWNlX3JlYWR5LCByZWNlaXZpbmdfc2xpY2VfcmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgYmN0bCk7Ci0gICAgY29udGludWVfcmVjZWl2aW5nX3NsaWNlcyhleGVjX2N0eCwgYmN0bCk7Ci0gICAgLyogZWFybHkgb3V0ICovCi0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlY2VpdmluZ19zdHJlYW1fcmVhZHkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmJjdGxwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgYmF0Y2hfY29udHJvbCAqYmN0bCA9IGJjdGxwOwotICBncnBjX2NhbGwgKmNhbGwgPSBiY3RsLT5jYWxsOwotCi0gIGdwcl9tdV9sb2NrKCZiY3RsLT5jYWxsLT5tdSk7Ci0gIGlmIChiY3RsLT5jYWxsLT5oYXNfaW5pdGlhbF9tZF9iZWVuX3JlY2VpdmVkKSB7Ci0gICAgZ3ByX211X3VubG9jaygmYmN0bC0+Y2FsbC0+bXUpOwotICAgIHByb2Nlc3NfZGF0YV9hZnRlcl9tZChleGVjX2N0eCwgYmN0bHAsIHN1Y2Nlc3MpOwotICB9IGVsc2UgewotICAgIGNhbGwtPnNhdmVkX3JlY2VpdmluZ19zdHJlYW1fcmVhZHlfY3R4LmJjdGxwID0gYmN0bHA7Ci0gICAgY2FsbC0+c2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHguc3VjY2VzcyA9IHN1Y2Nlc3M7Ci0gICAgZ3ByX211X3VubG9jaygmYmN0bC0+Y2FsbC0+bXUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlY2VpdmluZ19pbml0aWFsX21ldGFkYXRhX3JlYWR5KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmN0bHAsIGJvb2wgc3VjY2VzcykgewotICBiYXRjaF9jb250cm9sICpiY3RsID0gYmN0bHA7Ci0gIGdycGNfY2FsbCAqY2FsbCA9IGJjdGwtPmNhbGw7Ci0KLSAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKLQotICBncnBjX21ldGFkYXRhX2JhdGNoICptZCA9Ci0gICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMSAvKiBpc19yZWNlaXZpbmcgKi9dWzAgLyogaXNfdHJhaWxpbmcgKi9dOwotICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihtZCwgcmVjdl9pbml0aWFsX2ZpbHRlciwgY2FsbCk7Ci0gIGNhbGwtPmhhc19pbml0aWFsX21kX2JlZW5fcmVjZWl2ZWQgPSB0cnVlOwotCi0gIGlmIChncHJfdGltZV9jbXAobWQtPmRlYWRsaW5lLCBncHJfaW5mX2Z1dHVyZShtZC0+ZGVhZGxpbmUuY2xvY2tfdHlwZSkpICE9Ci0gICAgICAgICAgMCAmJgotICAgICAgIWNhbGwtPmlzX2NsaWVudCkgewotICAgIEdQUl9USU1FUl9CRUdJTigic2V0X2RlYWRsaW5lX2FsYXJtIiwgMCk7Ci0gICAgc2V0X2RlYWRsaW5lX2FsYXJtKGV4ZWNfY3R4LCBjYWxsLCBtZC0+ZGVhZGxpbmUpOwotICAgIEdQUl9USU1FUl9FTkQoInNldF9kZWFkbGluZV9hbGFybSIsIDApOwotICB9Ci0KLSAgaWYgKGNhbGwtPnNhdmVkX3JlY2VpdmluZ19zdHJlYW1fcmVhZHlfY3R4LmJjdGxwICE9IE5VTEwpIHsKLSAgICBncnBjX2Nsb3N1cmUgKnNhdmVkX3Jzcl9jbG9zdXJlID0gZ3JwY19jbG9zdXJlX2NyZWF0ZSgKLSAgICAgICAgcmVjZWl2aW5nX3N0cmVhbV9yZWFkeSwgY2FsbC0+c2F2ZWRfcmVjZWl2aW5nX3N0cmVhbV9yZWFkeV9jdHguYmN0bHApOwotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgc2F2ZWRfcnNyX2Nsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPnNhdmVkX3JlY2VpdmluZ19zdHJlYW1fcmVhZHlfY3R4LnN1Y2Nlc3MsIE5VTEwpOwotICAgIGNhbGwtPnNhdmVkX3JlY2VpdmluZ19zdHJlYW1fcmVhZHlfY3R4LmJjdGxwID0gTlVMTDsKLSAgfQotCi0gIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKLQotICBpZiAoZ3ByX3VucmVmKCZiY3RsLT5zdGVwc190b19jb21wbGV0ZSkpIHsKLSAgICBwb3N0X2JhdGNoX2NvbXBsZXRpb24oZXhlY19jdHgsIGJjdGwpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmlzaF9iYXRjaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYmN0bHAsIGJvb2wgc3VjY2VzcykgewotICBiYXRjaF9jb250cm9sICpiY3RsID0gYmN0bHA7Ci0gIGdycGNfY2FsbCAqY2FsbCA9IGJjdGwtPmNhbGw7Ci0gIGdycGNfY2FsbCAqY2hpbGRfY2FsbDsKLSAgZ3JwY19jYWxsICpuZXh0X2NoaWxkX2NhbGw7Ci0KLSAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKLSAgaWYgKGJjdGwtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSkgewotICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfZGVzdHJveSgKLSAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzAgLyogaXNfcmVjZWl2aW5nICovXVswIC8qIGlzX3RyYWlsaW5nICovXSk7Ci0gIH0KLSAgaWYgKGJjdGwtPnNlbmRfbWVzc2FnZSkgewotICAgIGNhbGwtPnNlbmRpbmdfbWVzc2FnZSA9IDA7Ci0gIH0KLSAgaWYgKGJjdGwtPnNlbmRfZmluYWxfb3ApIHsKLSAgICBncnBjX21ldGFkYXRhX2JhdGNoX2Rlc3Ryb3koCi0gICAgICAgICZjYWxsLT5tZXRhZGF0YV9iYXRjaFswIC8qIGlzX3JlY2VpdmluZyAqL11bMSAvKiBpc190cmFpbGluZyAqL10pOwotICB9Ci0gIGlmIChiY3RsLT5yZWN2X2ZpbmFsX29wKSB7Ci0gICAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqbWQgPQotICAgICAgICAmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMSAvKiBpc19yZWNlaXZpbmcgKi9dWzEgLyogaXNfdHJhaWxpbmcgKi9dOwotICAgIGdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyKG1kLCByZWN2X3RyYWlsaW5nX2ZpbHRlciwgY2FsbCk7Ci0KLSAgICBpZiAoY2FsbC0+aGF2ZV9hbGFybSkgewotICAgICAgZ3JwY190aW1lcl9jYW5jZWwoZXhlY19jdHgsICZjYWxsLT5hbGFybSk7Ci0gICAgfQotICAgIC8qIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gdG8gYW55IGludGVyZXN0ZWQgY2hpbGRyZW4gKi8KLSAgICBjaGlsZF9jYWxsID0gY2FsbC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaWYgKGNoaWxkX2NhbGwgIT0gTlVMTCkgewotICAgICAgZG8gewotICAgICAgICBuZXh0X2NoaWxkX2NhbGwgPSBjaGlsZF9jYWxsLT5zaWJsaW5nX25leHQ7Ci0gICAgICAgIGlmIChjaGlsZF9jYWxsLT5jYW5jZWxsYXRpb25faXNfaW5oZXJpdGVkKSB7Ci0gICAgICAgICAgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjaGlsZF9jYWxsLCAicHJvcGFnYXRlX2NhbmNlbCIpOwotICAgICAgICAgIGdycGNfY2FsbF9jYW5jZWwoY2hpbGRfY2FsbCwgTlVMTCk7Ci0gICAgICAgICAgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjaGlsZF9jYWxsLCAicHJvcGFnYXRlX2NhbmNlbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkX2NhbGwgPSBuZXh0X2NoaWxkX2NhbGw7Ci0gICAgICB9IHdoaWxlIChjaGlsZF9jYWxsICE9IGNhbGwtPmZpcnN0X2NoaWxkKTsKLSAgICB9Ci0KLSAgICBpZiAoY2FsbC0+aXNfY2xpZW50KSB7Ci0gICAgICBnZXRfZmluYWxfc3RhdHVzKGNhbGwsIHNldF9zdGF0dXNfdmFsdWVfZGlyZWN0bHksCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPmZpbmFsX29wLmNsaWVudC5zdGF0dXMpOwotICAgICAgZ2V0X2ZpbmFsX2RldGFpbHMoY2FsbCwgY2FsbC0+ZmluYWxfb3AuY2xpZW50LnN0YXR1c19kZXRhaWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+ZmluYWxfb3AuY2xpZW50LnN0YXR1c19kZXRhaWxzX2NhcGFjaXR5KTsKLSAgICB9IGVsc2UgewotICAgICAgZ2V0X2ZpbmFsX3N0YXR1cyhjYWxsLCBzZXRfY2FuY2VsbGVkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5maW5hbF9vcC5zZXJ2ZXIuY2FuY2VsbGVkKTsKLSAgICB9Ci0KLSAgICBzdWNjZXNzID0gMTsKLSAgfQotICBiY3RsLT5zdWNjZXNzID0gc3VjY2VzcyAhPSAwOwotICBncHJfbXVfdW5sb2NrKCZjYWxsLT5tdSk7Ci0gIGlmIChncHJfdW5yZWYoJmJjdGwtPnN0ZXBzX3RvX2NvbXBsZXRlKSkgewotICAgIHBvc3RfYmF0Y2hfY29tcGxldGlvbihleGVjX2N0eCwgYmN0bCk7Ci0gIH0KLX0KLQotc3RhdGljIGdycGNfY2FsbF9lcnJvciBjYWxsX3N0YXJ0X2JhdGNoKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbCAqY2FsbCwgY29uc3QgZ3JwY19vcCAqb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub3BzLCB2b2lkICpub3RpZnlfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19ub3RpZnlfdGFnX2Nsb3N1cmUpIHsKLSAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIHN0cmVhbV9vcDsKLSAgc2l6ZV90IGk7Ci0gIGNvbnN0IGdycGNfb3AgKm9wOwotICBiYXRjaF9jb250cm9sICpiY3RsOwotICBpbnQgbnVtX2NvbXBsZXRpb25fY2FsbGJhY2tzX25lZWRlZCA9IDE7Ci0gIGdycGNfY2FsbF9lcnJvciBlcnJvciA9IEdSUENfQ0FMTF9PSzsKLQotICBHUFJfVElNRVJfQkVHSU4oImdycGNfY2FsbF9zdGFydF9iYXRjaCIsIDApOwotCi0gIEdSUENfQ0FMTF9MT0dfQkFUQ0goR1BSX0lORk8sIGNhbGwsIG9wcywgbm9wcywgbm90aWZ5X3RhZyk7Ci0KLSAgbWVtc2V0KCZzdHJlYW1fb3AsIDAsIHNpemVvZihzdHJlYW1fb3ApKTsKLQotICAvKiBUT0RPKGN0aWxsZXIpOiB0aGlzIGZlZWxzIGxpa2UgaXQgY291bGQgYmUgbWFkZSBsb2NrLWZyZWUgKi8KLSAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKLSAgYmN0bCA9IGFsbG9jYXRlX2JhdGNoX2NvbnRyb2woY2FsbCk7Ci0gIG1lbXNldChiY3RsLCAwLCBzaXplb2YoKmJjdGwpKTsKLSAgYmN0bC0+Y2FsbCA9IGNhbGw7Ci0gIGJjdGwtPm5vdGlmeV90YWcgPSBub3RpZnlfdGFnOwotICBiY3RsLT5pc19ub3RpZnlfdGFnX2Nsb3N1cmUgPSAodWludDhfdCkoaXNfbm90aWZ5X3RhZ19jbG9zdXJlICE9IDApOwotCi0gIGlmIChub3BzID09IDApIHsKLSAgICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGNhbGwsICJjb21wbGV0aW9uIik7Ci0gICAgYmN0bC0+c3VjY2VzcyA9IDE7Ci0gICAgaWYgKCFpc19ub3RpZnlfdGFnX2Nsb3N1cmUpIHsKLSAgICAgIGdycGNfY3FfYmVnaW5fb3AoY2FsbC0+Y3EsIG5vdGlmeV90YWcpOwotICAgIH0KLSAgICBncHJfbXVfdW5sb2NrKCZjYWxsLT5tdSk7Ci0gICAgcG9zdF9iYXRjaF9jb21wbGV0aW9uKGV4ZWNfY3R4LCBiY3RsKTsKLSAgICBlcnJvciA9IEdSUENfQ0FMTF9PSzsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLQotICAvKiByZXdyaXRlIGJhdGNoIG9wcyBpbnRvIGEgdHJhbnNwb3J0IG9wICovCi0gIGZvciAoaSA9IDA7IGkgPCBub3BzOyBpKyspIHsKLSAgICBvcCA9ICZvcHNbaV07Ci0gICAgaWYgKG9wLT5yZXNlcnZlZCAhPSBOVUxMKSB7Ci0gICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUjsKLSAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOwotICAgIH0KLSAgICBzd2l0Y2ggKG9wLT5vcCkgewotICAgICAgY2FzZSBHUlBDX09QX1NFTkRfSU5JVElBTF9NRVRBREFUQToKLSAgICAgICAgLyogRmxhZyB2YWxpZGF0aW9uOiBjdXJyZW50bHkgYWxsb3cgbm8gZmxhZ3MgKi8KLSAgICAgICAgaWYgKG9wLT5mbGFncyAhPSAwKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbC0+c2VudF9pbml0aWFsX21ldGFkYXRhKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfVE9PX01BTllfT1BFUkFUSU9OUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAob3AtPmRhdGEuc2VuZF9pbml0aWFsX21ldGFkYXRhLmNvdW50ID4gSU5UX01BWCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYmN0bC0+c2VuZF9pbml0aWFsX21ldGFkYXRhID0gMTsKLSAgICAgICAgY2FsbC0+c2VudF9pbml0aWFsX21ldGFkYXRhID0gMTsKLSAgICAgICAgaWYgKCFwcmVwYXJlX2FwcGxpY2F0aW9uX21ldGFkYXRhKAotICAgICAgICAgICAgICAgIGNhbGwsIChpbnQpb3AtPmRhdGEuc2VuZF9pbml0aWFsX21ldGFkYXRhLmNvdW50LAotICAgICAgICAgICAgICAgIG9wLT5kYXRhLnNlbmRfaW5pdGlhbF9tZXRhZGF0YS5tZXRhZGF0YSwgMCwgY2FsbC0+aXNfY2xpZW50KSkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVE9ETyhjdGlsbGVyKToganVzdCBtYWtlIHRoZXNlIHRoZSBzYW1lIHZhcmlhYmxlPyAqLwotICAgICAgICBjYWxsLT5tZXRhZGF0YV9iYXRjaFswXVswXS5kZWFkbGluZSA9IGNhbGwtPnNlbmRfZGVhZGxpbmU7Ci0gICAgICAgIHN0cmVhbV9vcC5zZW5kX2luaXRpYWxfbWV0YWRhdGEgPQotICAgICAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzAgLyogaXNfcmVjZWl2aW5nICovXVswIC8qIGlzX3RyYWlsaW5nICovXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfT1BfU0VORF9NRVNTQUdFOgotICAgICAgICBpZiAoIWFyZV93cml0ZV9mbGFnc192YWxpZChvcC0+ZmxhZ3MpKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAob3AtPmRhdGEuc2VuZF9tZXNzYWdlID09IE5VTEwpIHsKLSAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX01FU1NBR0U7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGwtPnNlbmRpbmdfbWVzc2FnZSkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX1RPT19NQU5ZX09QRVJBVElPTlM7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYmN0bC0+c2VuZF9tZXNzYWdlID0gMTsKLSAgICAgICAgY2FsbC0+c2VuZGluZ19tZXNzYWdlID0gMTsKLSAgICAgICAgZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtX2luaXQoCi0gICAgICAgICAgICAmY2FsbC0+c2VuZGluZ19zdHJlYW0sCi0gICAgICAgICAgICAmb3AtPmRhdGEuc2VuZF9tZXNzYWdlLT5kYXRhLnJhdy5zbGljZV9idWZmZXIsIG9wLT5mbGFncyk7Ci0gICAgICAgIHN0cmVhbV9vcC5zZW5kX21lc3NhZ2UgPSAmY2FsbC0+c2VuZGluZ19zdHJlYW0uYmFzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfT1BfU0VORF9DTE9TRV9GUk9NX0NMSUVOVDoKLSAgICAgICAgLyogRmxhZyB2YWxpZGF0aW9uOiBjdXJyZW50bHkgYWxsb3cgbm8gZmxhZ3MgKi8KLSAgICAgICAgaWYgKG9wLT5mbGFncyAhPSAwKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWNhbGwtPmlzX2NsaWVudCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX05PVF9PTl9TRVJWRVI7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGwtPnNlbnRfZmluYWxfb3ApIHsKLSAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9UT09fTUFOWV9PUEVSQVRJT05TOwotICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIGJjdGwtPnNlbmRfZmluYWxfb3AgPSAxOwotICAgICAgICBjYWxsLT5zZW50X2ZpbmFsX29wID0gMTsKLSAgICAgICAgc3RyZWFtX29wLnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgPQotICAgICAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzAgLyogaXNfcmVjZWl2aW5nICovXVsxIC8qIGlzX3RyYWlsaW5nICovXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfT1BfU0VORF9TVEFUVVNfRlJPTV9TRVJWRVI6Ci0gICAgICAgIC8qIEZsYWcgdmFsaWRhdGlvbjogY3VycmVudGx5IGFsbG93IG5vIGZsYWdzICovCi0gICAgICAgIGlmIChvcC0+ZmxhZ3MgIT0gMCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfRkxBR1M7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGwtPmlzX2NsaWVudCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX05PVF9PTl9DTElFTlQ7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGwtPnNlbnRfZmluYWxfb3ApIHsKLSAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9UT09fTUFOWV9PUEVSQVRJT05TOwotICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci50cmFpbGluZ19tZXRhZGF0YV9jb3VudCA+Ci0gICAgICAgICAgICBJTlRfTUFYKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9NRVRBREFUQTsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBiY3RsLT5zZW5kX2ZpbmFsX29wID0gMTsKLSAgICAgICAgY2FsbC0+c2VudF9maW5hbF9vcCA9IDE7Ci0gICAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFfY291bnQgPSAxOwotICAgICAgICBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhWzBdLm1kID0gZ3JwY19jaGFubmVsX2dldF9yZWZmZWRfc3RhdHVzX2VsZW0oCi0gICAgICAgICAgICBjYWxsLT5jaGFubmVsLCBvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci5zdGF0dXMpOwotICAgICAgICBpZiAob3AtPmRhdGEuc2VuZF9zdGF0dXNfZnJvbV9zZXJ2ZXIuc3RhdHVzX2RldGFpbHMgIT0gTlVMTCkgewotICAgICAgICAgIGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbMV0ubWQgPSBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCi0gICAgICAgICAgICAgIEdSUENfTURTVFJfR1JQQ19NRVNTQUdFLAotICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKAotICAgICAgICAgICAgICAgICAgb3AtPmRhdGEuc2VuZF9zdGF0dXNfZnJvbV9zZXJ2ZXIuc3RhdHVzX2RldGFpbHMpKTsKLSAgICAgICAgICBjYWxsLT5zZW5kX2V4dHJhX21ldGFkYXRhX2NvdW50Kys7Ci0gICAgICAgICAgc2V0X3N0YXR1c19kZXRhaWxzKAotICAgICAgICAgICAgICBjYWxsLCBTVEFUVVNfRlJPTV9BUElfT1ZFUlJJREUsCi0gICAgICAgICAgICAgIEdSUENfTURTVFJfUkVGKGNhbGwtPnNlbmRfZXh0cmFfbWV0YWRhdGFbMV0ubWQtPnZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0X3N0YXR1c19jb2RlKGNhbGwsIFNUQVRVU19GUk9NX0FQSV9PVkVSUklERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci5zdGF0dXMpOwotICAgICAgICBpZiAoIXByZXBhcmVfYXBwbGljYXRpb25fbWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgY2FsbCwKLSAgICAgICAgICAgICAgICAoaW50KW9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnRyYWlsaW5nX21ldGFkYXRhX2NvdW50LAotICAgICAgICAgICAgICAgIG9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnRyYWlsaW5nX21ldGFkYXRhLCAxLCAxKSkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfTUVUQURBVEE7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtX29wLnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgPQotICAgICAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzAgLyogaXNfcmVjZWl2aW5nICovXVsxIC8qIGlzX3RyYWlsaW5nICovXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfT1BfUkVDVl9JTklUSUFMX01FVEFEQVRBOgotICAgICAgICAvKiBGbGFnIHZhbGlkYXRpb246IGN1cnJlbnRseSBhbGxvdyBubyBmbGFncyAqLwotICAgICAgICBpZiAob3AtPmZsYWdzICE9IDApIHsKLSAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9JTlZBTElEX0ZMQUdTOwotICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsLT5yZWNlaXZlZF9pbml0aWFsX21ldGFkYXRhKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfVE9PX01BTllfT1BFUkFUSU9OUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBjYWxsLT5yZWNlaXZlZF9pbml0aWFsX21ldGFkYXRhID0gMTsKLSAgICAgICAgY2FsbC0+YnVmZmVyZWRfbWV0YWRhdGFbMF0gPSBvcC0+ZGF0YS5yZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gICAgICAgIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsLT5yZWNlaXZpbmdfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nX2luaXRpYWxfbWV0YWRhdGFfcmVhZHksIGJjdGwpOwotICAgICAgICBiY3RsLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgPSAxOwotICAgICAgICBzdHJlYW1fb3AucmVjdl9pbml0aWFsX21ldGFkYXRhID0KLSAgICAgICAgICAgICZjYWxsLT5tZXRhZGF0YV9iYXRjaFsxIC8qIGlzX3JlY2VpdmluZyAqL11bMCAvKiBpc190cmFpbGluZyAqL107Ci0gICAgICAgIHN0cmVhbV9vcC5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgPQotICAgICAgICAgICAgJmNhbGwtPnJlY2VpdmluZ19pbml0aWFsX21ldGFkYXRhX3JlYWR5OwotICAgICAgICBudW1fY29tcGxldGlvbl9jYWxsYmFja3NfbmVlZGVkKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHUlBDX09QX1JFQ1ZfTUVTU0FHRToKLSAgICAgICAgLyogRmxhZyB2YWxpZGF0aW9uOiBjdXJyZW50bHkgYWxsb3cgbm8gZmxhZ3MgKi8KLSAgICAgICAgaWYgKG9wLT5mbGFncyAhPSAwKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfSU5WQUxJRF9GTEFHUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbC0+cmVjZWl2aW5nX21lc3NhZ2UpIHsKLSAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9UT09fTUFOWV9PUEVSQVRJT05TOwotICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIGNhbGwtPnJlY2VpdmluZ19tZXNzYWdlID0gMTsKLSAgICAgICAgYmN0bC0+cmVjdl9tZXNzYWdlID0gMTsKLSAgICAgICAgY2FsbC0+cmVjZWl2aW5nX2J1ZmZlciA9IG9wLT5kYXRhLnJlY3ZfbWVzc2FnZTsKLSAgICAgICAgc3RyZWFtX29wLnJlY3ZfbWVzc2FnZSA9ICZjYWxsLT5yZWNlaXZpbmdfc3RyZWFtOwotICAgICAgICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbC0+cmVjZWl2aW5nX3N0cmVhbV9yZWFkeSwgcmVjZWl2aW5nX3N0cmVhbV9yZWFkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmN0bCk7Ci0gICAgICAgIHN0cmVhbV9vcC5yZWN2X21lc3NhZ2VfcmVhZHkgPSAmY2FsbC0+cmVjZWl2aW5nX3N0cmVhbV9yZWFkeTsKLSAgICAgICAgbnVtX2NvbXBsZXRpb25fY2FsbGJhY2tzX25lZWRlZCsrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1JQQ19PUF9SRUNWX1NUQVRVU19PTl9DTElFTlQ6Ci0gICAgICAgIC8qIEZsYWcgdmFsaWRhdGlvbjogY3VycmVudGx5IGFsbG93IG5vIGZsYWdzICovCi0gICAgICAgIGlmIChvcC0+ZmxhZ3MgIT0gMCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfRkxBR1M7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjYWxsLT5pc19jbGllbnQpIHsKLSAgICAgICAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9OT1RfT05fU0VSVkVSOwotICAgICAgICAgIGdvdG8gZG9uZV93aXRoX2Vycm9yOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsLT5yZWNlaXZlZF9maW5hbF9vcCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX1RPT19NQU5ZX09QRVJBVElPTlM7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FsbC0+cmVjZWl2ZWRfZmluYWxfb3AgPSAxOwotICAgICAgICBjYWxsLT5idWZmZXJlZF9tZXRhZGF0YVsxXSA9Ci0gICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X3N0YXR1c19vbl9jbGllbnQudHJhaWxpbmdfbWV0YWRhdGE7Ci0gICAgICAgIGNhbGwtPmZpbmFsX29wLmNsaWVudC5zdGF0dXMgPSBvcC0+ZGF0YS5yZWN2X3N0YXR1c19vbl9jbGllbnQuc3RhdHVzOwotICAgICAgICBjYWxsLT5maW5hbF9vcC5jbGllbnQuc3RhdHVzX2RldGFpbHMgPQotICAgICAgICAgICAgb3AtPmRhdGEucmVjdl9zdGF0dXNfb25fY2xpZW50LnN0YXR1c19kZXRhaWxzOwotICAgICAgICBjYWxsLT5maW5hbF9vcC5jbGllbnQuc3RhdHVzX2RldGFpbHNfY2FwYWNpdHkgPQotICAgICAgICAgICAgb3AtPmRhdGEucmVjdl9zdGF0dXNfb25fY2xpZW50LnN0YXR1c19kZXRhaWxzX2NhcGFjaXR5OwotICAgICAgICBiY3RsLT5yZWN2X2ZpbmFsX29wID0gMTsKLSAgICAgICAgc3RyZWFtX29wLnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGEgPQotICAgICAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzEgLyogaXNfcmVjZWl2aW5nICovXVsxIC8qIGlzX3RyYWlsaW5nICovXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdSUENfT1BfUkVDVl9DTE9TRV9PTl9TRVJWRVI6Ci0gICAgICAgIC8qIEZsYWcgdmFsaWRhdGlvbjogY3VycmVudGx5IGFsbG93IG5vIGZsYWdzICovCi0gICAgICAgIGlmIChvcC0+ZmxhZ3MgIT0gMCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX0lOVkFMSURfRkxBR1M7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGwtPmlzX2NsaWVudCkgewotICAgICAgICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX05PVF9PTl9DTElFTlQ7Ci0gICAgICAgICAgZ290byBkb25lX3dpdGhfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGwtPnJlY2VpdmVkX2ZpbmFsX29wKSB7Ci0gICAgICAgICAgZXJyb3IgPSBHUlBDX0NBTExfRVJST1JfVE9PX01BTllfT1BFUkFUSU9OUzsKLSAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBjYWxsLT5yZWNlaXZlZF9maW5hbF9vcCA9IDE7Ci0gICAgICAgIGNhbGwtPmZpbmFsX29wLnNlcnZlci5jYW5jZWxsZWQgPQotICAgICAgICAgICAgb3AtPmRhdGEucmVjdl9jbG9zZV9vbl9zZXJ2ZXIuY2FuY2VsbGVkOwotICAgICAgICBiY3RsLT5yZWN2X2ZpbmFsX29wID0gMTsKLSAgICAgICAgc3RyZWFtX29wLnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGEgPQotICAgICAgICAgICAgJmNhbGwtPm1ldGFkYXRhX2JhdGNoWzEgLyogaXNfcmVjZWl2aW5nICovXVsxIC8qIGlzX3RyYWlsaW5nICovXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjYWxsLCAiY29tcGxldGlvbiIpOwotICBpZiAoIWlzX25vdGlmeV90YWdfY2xvc3VyZSkgewotICAgIGdycGNfY3FfYmVnaW5fb3AoY2FsbC0+Y3EsIG5vdGlmeV90YWcpOwotICB9Ci0gIGdwcl9yZWZfaW5pdCgmYmN0bC0+c3RlcHNfdG9fY29tcGxldGUsIG51bV9jb21wbGV0aW9uX2NhbGxiYWNrc19uZWVkZWQpOwotCi0gIHN0cmVhbV9vcC5jb250ZXh0ID0gY2FsbC0+Y29udGV4dDsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmJjdGwtPmZpbmlzaF9iYXRjaCwgZmluaXNoX2JhdGNoLCBiY3RsKTsKLSAgc3RyZWFtX29wLm9uX2NvbXBsZXRlID0gJmJjdGwtPmZpbmlzaF9iYXRjaDsKLSAgZ3ByX211X3VubG9jaygmY2FsbC0+bXUpOwotCi0gIGV4ZWN1dGVfb3AoZXhlY19jdHgsIGNhbGwsICZzdHJlYW1fb3ApOwotCi1kb25lOgotICBHUFJfVElNRVJfRU5EKCJncnBjX2NhbGxfc3RhcnRfYmF0Y2giLCAwKTsKLSAgcmV0dXJuIGVycm9yOwotCi1kb25lX3dpdGhfZXJyb3I6Ci0gIC8qIHJldmVyc2UgYW55IG11dGF0aW9ucyB0aGF0IG9jY3VyZWQgKi8KLSAgaWYgKGJjdGwtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSkgewotICAgIGNhbGwtPnNlbnRfaW5pdGlhbF9tZXRhZGF0YSA9IDA7Ci0gICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9jbGVhcigmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMF1bMF0pOwotICB9Ci0gIGlmIChiY3RsLT5zZW5kX21lc3NhZ2UpIHsKLSAgICBjYWxsLT5zZW5kaW5nX21lc3NhZ2UgPSAwOwotICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShleGVjX2N0eCwgJmNhbGwtPnNlbmRpbmdfc3RyZWFtLmJhc2UpOwotICB9Ci0gIGlmIChiY3RsLT5zZW5kX2ZpbmFsX29wKSB7Ci0gICAgY2FsbC0+c2VudF9maW5hbF9vcCA9IDA7Ci0gICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9jbGVhcigmY2FsbC0+bWV0YWRhdGFfYmF0Y2hbMF1bMV0pOwotICB9Ci0gIGlmIChiY3RsLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEpIHsKLSAgICBjYWxsLT5yZWNlaXZlZF9pbml0aWFsX21ldGFkYXRhID0gMDsKLSAgfQotICBpZiAoYmN0bC0+cmVjdl9tZXNzYWdlKSB7Ci0gICAgY2FsbC0+cmVjZWl2aW5nX21lc3NhZ2UgPSAwOwotICB9Ci0gIGlmIChiY3RsLT5yZWN2X2ZpbmFsX29wKSB7Ci0gICAgY2FsbC0+cmVjZWl2ZWRfZmluYWxfb3AgPSAwOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKLSAgZ290byBkb25lOwotfQotCi1ncnBjX2NhbGxfZXJyb3IgZ3JwY19jYWxsX3N0YXJ0X2JhdGNoKGdycGNfY2FsbCAqY2FsbCwgY29uc3QgZ3JwY19vcCAqb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm9wcywgdm9pZCAqdGFnLCB2b2lkICpyZXNlcnZlZCkgewotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBncnBjX2NhbGxfZXJyb3IgZXJyOwotCi0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfY2FsbF9zdGFydF9iYXRjaChjYWxsPSVwLCBvcHM9JXAsIG5vcHM9JWx1LCB0YWc9JXAsIHJlc2VydmVkPSVwKSIsCi0gICAgICA1LCAoY2FsbCwgb3BzLCAodW5zaWduZWQgbG9uZylub3BzLCB0YWcsIHJlc2VydmVkKSk7Ci0KLSAgaWYgKHJlc2VydmVkICE9IE5VTEwpIHsKLSAgICBlcnIgPSBHUlBDX0NBTExfRVJST1I7Ci0gIH0gZWxzZSB7Ci0gICAgZXJyID0gY2FsbF9zdGFydF9iYXRjaCgmZXhlY19jdHgsIGNhbGwsIG9wcywgbm9wcywgdGFnLCAwKTsKLSAgfQotCi0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLWdycGNfY2FsbF9lcnJvciBncnBjX2NhbGxfc3RhcnRfYmF0Y2hfYW5kX2V4ZWN1dGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbCAqY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19vcCAqb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKSB7Ci0gIHJldHVybiBjYWxsX3N0YXJ0X2JhdGNoKGV4ZWNfY3R4LCBjYWxsLCBvcHMsIG5vcHMsIGNsb3N1cmUsIDEpOwotfQotCi12b2lkIGdycGNfY2FsbF9jb250ZXh0X3NldChncnBjX2NhbGwgKmNhbGwsIGdycGNfY29udGV4dF9pbmRleCBlbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUsIHZvaWQgKCpkZXN0cm95KSh2b2lkICp2YWx1ZSkpIHsKLSAgaWYgKGNhbGwtPmNvbnRleHRbZWxlbV0uZGVzdHJveSkgewotICAgIGNhbGwtPmNvbnRleHRbZWxlbV0uZGVzdHJveShjYWxsLT5jb250ZXh0W2VsZW1dLnZhbHVlKTsKLSAgfQotICBjYWxsLT5jb250ZXh0W2VsZW1dLnZhbHVlID0gdmFsdWU7Ci0gIGNhbGwtPmNvbnRleHRbZWxlbV0uZGVzdHJveSA9IGRlc3Ryb3k7Ci19Ci0KLXZvaWQgKmdycGNfY2FsbF9jb250ZXh0X2dldChncnBjX2NhbGwgKmNhbGwsIGdycGNfY29udGV4dF9pbmRleCBlbGVtKSB7Ci0gIHJldHVybiBjYWxsLT5jb250ZXh0W2VsZW1dLnZhbHVlOwotfQotCi11aW50OF90IGdycGNfY2FsbF9pc19jbGllbnQoZ3JwY19jYWxsICpjYWxsKSB7IHJldHVybiBjYWxsLT5pc19jbGllbnQ7IH0KLQotZ3JwY19jb21wcmVzc2lvbl9hbGdvcml0aG0gZ3JwY19jYWxsX2NvbXByZXNzaW9uX2Zvcl9sZXZlbCgKLSAgICBncnBjX2NhbGwgKmNhbGwsIGdycGNfY29tcHJlc3Npb25fbGV2ZWwgbGV2ZWwpIHsKLSAgZ3ByX211X2xvY2soJmNhbGwtPm11KTsKLSAgY29uc3QgdWludDMyX3QgYWNjZXB0ZWRfZW5jb2RpbmdzID0gY2FsbC0+ZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXI7Ci0gIGdwcl9tdV91bmxvY2soJmNhbGwtPm11KTsKLSAgcmV0dXJuIGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtX2Zvcl9sZXZlbChsZXZlbCwgYWNjZXB0ZWRfZW5jb2RpbmdzKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIGIvc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZWRmMDMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VSRkFDRV9DQUxMX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NVUkZBQ0VfQ0FMTF9ICi0KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIgotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0jaW5jbHVkZSA8Z3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHZvaWQgKCpncnBjX2lvcmVxX2NvbXBsZXRpb25fZnVuYykoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsICpjYWxsLCBpbnQgc3VjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOwotCi1ncnBjX2NhbGwgKmdycGNfY2FsbF9jcmVhdGUoZ3JwY19jaGFubmVsICpjaGFubmVsLCBncnBjX2NhbGwgKnBhcmVudF9jYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByb3BhZ2F0aW9uX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZXJ2ZXJfdHJhbnNwb3J0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKiphZGRfaW5pdGlhbF9tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWRkX2luaXRpYWxfbWV0YWRhdGFfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIHNlbmRfZGVhZGxpbmUpOwotCi12b2lkIGdycGNfY2FsbF9zZXRfY29tcGxldGlvbl9xdWV1ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSk7Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotdm9pZCBncnBjX2NhbGxfaW50ZXJuYWxfcmVmKGdycGNfY2FsbCAqY2FsbCwgY29uc3QgY2hhciAqcmVhc29uKTsKLXZvaWQgZ3JwY19jYWxsX2ludGVybmFsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGwgKmNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwotI2RlZmluZSBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGNhbGwsIHJlYXNvbikgXAotICBncnBjX2NhbGxfaW50ZXJuYWxfcmVmKGNhbGwsIHJlYXNvbikKLSNkZWZpbmUgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYWxsLCByZWFzb24pIFwKLSAgZ3JwY19jYWxsX2ludGVybmFsX3VucmVmKGV4ZWNfY3R4LCBjYWxsLCByZWFzb24pCi0jZWxzZQotdm9pZCBncnBjX2NhbGxfaW50ZXJuYWxfcmVmKGdycGNfY2FsbCAqY2FsbCk7Ci12b2lkIGdycGNfY2FsbF9pbnRlcm5hbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsICpjYWxsKTsKLSNkZWZpbmUgR1JQQ19DQUxMX0lOVEVSTkFMX1JFRihjYWxsLCByZWFzb24pIGdycGNfY2FsbF9pbnRlcm5hbF9yZWYoY2FsbCkKLSNkZWZpbmUgR1JQQ19DQUxMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYWxsLCByZWFzb24pIFwKLSAgZ3JwY19jYWxsX2ludGVybmFsX3VucmVmKGV4ZWNfY3R4LCBjYWxsKQotI2VuZGlmCi0KLWdycGNfY2FsbF9zdGFjayAqZ3JwY19jYWxsX2dldF9jYWxsX3N0YWNrKGdycGNfY2FsbCAqY2FsbCk7Ci0KLWdycGNfY2FsbF9lcnJvciBncnBjX2NhbGxfc3RhcnRfYmF0Y2hfYW5kX2V4ZWN1dGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbCAqY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19vcCAqb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpjbG9zdXJlKTsKLQotLyogR2l2ZW4gdGhlIHRvcCBjYWxsX2VsZW1lbnQsIGdldCB0aGUgY2FsbCBvYmplY3QuICovCi1ncnBjX2NhbGwgKmdycGNfY2FsbF9mcm9tX3RvcF9lbGVtZW50KGdycGNfY2FsbF9lbGVtZW50ICpzdXJmYWNlX2VsZW1lbnQpOwotCi12b2lkIGdycGNfY2FsbF9sb2dfYmF0Y2goY2hhciAqZmlsZSwgaW50IGxpbmUsIGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsICpjYWxsLCBjb25zdCBncnBjX29wICpvcHMsIHNpemVfdCBub3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRhZyk7Ci0KLS8qIFNldCBhIGNvbnRleHQgcG9pbnRlci4KLSAgIE5vIHRocmVhZCBzYWZldHkgZ3VhcmFudGVlcyBhcmUgbWFkZSB3cnQgdGhpcyB2YWx1ZS4gKi8KLXZvaWQgZ3JwY19jYWxsX2NvbnRleHRfc2V0KGdycGNfY2FsbCAqY2FsbCwgZ3JwY19jb250ZXh0X2luZGV4IGVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp2YWx1ZSwgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnZhbHVlKSk7Ci0vKiBHZXQgYSBjb250ZXh0IHBvaW50ZXIuICovCi12b2lkICpncnBjX2NhbGxfY29udGV4dF9nZXQoZ3JwY19jYWxsICpjYWxsLCBncnBjX2NvbnRleHRfaW5kZXggZWxlbSk7Ci0KLSNkZWZpbmUgR1JQQ19DQUxMX0xPR19CQVRDSChzZXYsIGNhbGwsIG9wcywgbm9wcywgdGFnKSBcCi0gIGlmIChncnBjX2FwaV90cmFjZSkgZ3JwY19jYWxsX2xvZ19iYXRjaChzZXYsIGNhbGwsIG9wcywgbm9wcywgdGFnKQotCi11aW50OF90IGdycGNfY2FsbF9pc19jbGllbnQoZ3JwY19jYWxsICpjYWxsKTsKLQotLyogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBmb3IgdGhlIHJlcXVlc3RlZCBjb21wcmVzc2lvbiBcYQotICogbGV2ZWwgaW4gdGhlIGNvbnRleHQgb2YgXGEgY2FsbC4gKi8KLWdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY2FsbF9jb21wcmVzc2lvbl9mb3JfbGV2ZWwoCi0gICAgZ3JwY19jYWxsICpjYWxsLCBncnBjX2NvbXByZXNzaW9uX2xldmVsIGxldmVsKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVJGQUNFX0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyBiL3NyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZjAwMjkuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2RldGFpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0KLXZvaWQgZ3JwY19jYWxsX2RldGFpbHNfaW5pdChncnBjX2NhbGxfZGV0YWlscyogY2QpIHsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2FsbF9kZXRhaWxzX2luaXQoY2Q9JXApIiwgMSwgKGNkKSk7Ci0gIG1lbXNldChjZCwgMCwgc2l6ZW9mKCpjZCkpOwotfQotCi12b2lkIGdycGNfY2FsbF9kZXRhaWxzX2Rlc3Ryb3koZ3JwY19jYWxsX2RldGFpbHMqIGNkKSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2NhbGxfZGV0YWlsc19kZXN0cm95KGNkPSVwKSIsIDEsIChjZCkpOwotICBncHJfZnJlZShjZC0+bWV0aG9kKTsKLSAgZ3ByX2ZyZWUoY2QtPmhvc3QpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jIGIvc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQyMTE2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1zdGF0aWMgdm9pZCBhZGRfbWV0YWRhdGEoZ3ByX3N0cnZlYyAqYiwgY29uc3QgZ3JwY19tZXRhZGF0YSAqbWQsIHNpemVfdCBjb3VudCkgewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBncHJfc3RydmVjX2FkZChiLCBncHJfc3RyZHVwKCJcbmtleT0iKSk7Ci0gICAgZ3ByX3N0cnZlY19hZGQoYiwgZ3ByX3N0cmR1cChtZFtpXS5rZXkpKTsKLQotICAgIGdwcl9zdHJ2ZWNfYWRkKGIsIGdwcl9zdHJkdXAoIiB2YWx1ZT0iKSk7Ci0gICAgZ3ByX3N0cnZlY19hZGQoYiwgZ3ByX2R1bXAobWRbaV0udmFsdWUsIG1kW2ldLnZhbHVlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfRFVNUF9IRVggfCBHUFJfRFVNUF9BU0NJSSkpOwotICB9Ci19Ci0KLWNoYXIgKmdycGNfb3Bfc3RyaW5nKGNvbnN0IGdycGNfb3AgKm9wKSB7Ci0gIGNoYXIgKnRtcDsKLSAgY2hhciAqb3V0OwotCi0gIGdwcl9zdHJ2ZWMgYjsKLSAgZ3ByX3N0cnZlY19pbml0KCZiKTsKLQotICBzd2l0Y2ggKG9wLT5vcCkgewotICAgIGNhc2UgR1JQQ19PUF9TRU5EX0lOSVRJQUxfTUVUQURBVEE6Ci0gICAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiU0VORF9JTklUSUFMX01FVEFEQVRBIikpOwotICAgICAgYWRkX21ldGFkYXRhKCZiLCBvcC0+ZGF0YS5zZW5kX2luaXRpYWxfbWV0YWRhdGEubWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgb3AtPmRhdGEuc2VuZF9pbml0aWFsX21ldGFkYXRhLmNvdW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1JQQ19PUF9TRU5EX01FU1NBR0U6Ci0gICAgICBncHJfYXNwcmludGYoJnRtcCwgIlNFTkRfTUVTU0FHRSBwdHI9JXAiLCBvcC0+ZGF0YS5zZW5kX21lc3NhZ2UpOwotICAgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfT1BfU0VORF9DTE9TRV9GUk9NX0NMSUVOVDoKLSAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCJTRU5EX0NMT1NFX0ZST01fQ0xJRU5UIikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUlBDX09QX1NFTkRfU1RBVFVTX0ZST01fU0VSVkVSOgotICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJTRU5EX1NUQVRVU19GUk9NX1NFUlZFUiBzdGF0dXM9JWQgZGV0YWlscz0lcyIsCi0gICAgICAgICAgICAgICAgICAgb3AtPmRhdGEuc2VuZF9zdGF0dXNfZnJvbV9zZXJ2ZXIuc3RhdHVzLAotICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnNlbmRfc3RhdHVzX2Zyb21fc2VydmVyLnN0YXR1c19kZXRhaWxzKTsKLSAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCB0bXApOwotICAgICAgYWRkX21ldGFkYXRhKCZiLCBvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci50cmFpbGluZ19tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5zZW5kX3N0YXR1c19mcm9tX3NlcnZlci50cmFpbGluZ19tZXRhZGF0YV9jb3VudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfT1BfUkVDVl9JTklUSUFMX01FVEFEQVRBOgotICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJSRUNWX0lOSVRJQUxfTUVUQURBVEEgcHRyPSVwIiwKLSAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X2luaXRpYWxfbWV0YWRhdGEpOwotICAgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfT1BfUkVDVl9NRVNTQUdFOgotICAgICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJSRUNWX01FU1NBR0UgcHRyPSVwIiwgb3AtPmRhdGEucmVjdl9tZXNzYWdlKTsKLSAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCB0bXApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUlBDX09QX1JFQ1ZfU1RBVFVTX09OX0NMSUVOVDoKLSAgICAgIGdwcl9hc3ByaW50ZigmdG1wLAotICAgICAgICAgICAgICAgICAgICJSRUNWX1NUQVRVU19PTl9DTElFTlQgbWV0YWRhdGE9JXAgc3RhdHVzPSVwIGRldGFpbHM9JXAiLAotICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnJlY3Zfc3RhdHVzX29uX2NsaWVudC50cmFpbGluZ19tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X3N0YXR1c19vbl9jbGllbnQuc3RhdHVzLAotICAgICAgICAgICAgICAgICAgIG9wLT5kYXRhLnJlY3Zfc3RhdHVzX29uX2NsaWVudC5zdGF0dXNfZGV0YWlscyk7Ci0gICAgICBncHJfc3RydmVjX2FkZCgmYiwgdG1wKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1JQQ19PUF9SRUNWX0NMT1NFX09OX1NFUlZFUjoKLSAgICAgIGdwcl9hc3ByaW50ZigmdG1wLCAiUkVDVl9DTE9TRV9PTl9TRVJWRVIgY2FuY2VsbGVkPSVwIiwKLSAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YS5yZWN2X2Nsb3NlX29uX3NlcnZlci5jYW5jZWxsZWQpOwotICAgICAgZ3ByX3N0cnZlY19hZGQoJmIsIHRtcCk7Ci0gIH0KLSAgb3V0ID0gZ3ByX3N0cnZlY19mbGF0dGVuKCZiLCBOVUxMKTsKLSAgZ3ByX3N0cnZlY19kZXN0cm95KCZiKTsKLQotICByZXR1cm4gb3V0OwotfQotCi12b2lkIGdycGNfY2FsbF9sb2dfYmF0Y2goY2hhciAqZmlsZSwgaW50IGxpbmUsIGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsICpjYWxsLCBjb25zdCBncnBjX29wICpvcHMsIHNpemVfdCBub3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRhZykgewotICBjaGFyICp0bXA7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbm9wczsgaSsrKSB7Ci0gICAgdG1wID0gZ3JwY19vcF9zdHJpbmcoJm9wc1tpXSk7Ci0gICAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBzZXZlcml0eSwgIm9wc1slZF06ICVzIiwgaSwgdG1wKTsKLSAgICBncHJfZnJlZSh0bXApOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmggYi9zcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzQzYTMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VSRkFDRV9DQUxMX1RFU1RfT05MWV9ICi0jZGVmaW5lIEdSUENfQ09SRV9TVVJGQUNFX0NBTExfVEVTVF9PTkxZX0gKLQotI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKiBSZXR1cm4gdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBmcm9tIFxhIGNhbGwuCi0gKgotICogXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBzaG91bGQgXGIgb25seSBiZSB1c2VkIGluIHRlc3QgY29kZS4gKi8KLWdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGdycGNfY2FsbF90ZXN0X29ubHlfZ2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobSgKLSAgICBncnBjX2NhbGwgKmNhbGwpOwotCi0vKiogUmV0dXJuIHRoZSBtZXNzYWdlIGZsYWdzIGZyb20gXGEgY2FsbC4KLSAqCi0gKiBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBcYiBvbmx5IGJlIHVzZWQgaW4gdGVzdCBjb2RlLiAqLwotdWludDMyX3QgZ3JwY19jYWxsX3Rlc3Rfb25seV9nZXRfbWVzc2FnZV9mbGFncyhncnBjX2NhbGwgKmNhbGwpOwotCi0vKiogUmV0dXJucyBhIGJpdHNldCBmb3IgdGhlIGVuY29kaW5ncyAoY29tcHJlc3Npb24gYWxnb3JpdGhtcykgc3VwcG9ydGVkIGJ5IFxhCi0gKiBjYWxsJ3MgcGVlci4KLSAqCi0gKiBUbyBiZSBpbmRleGVkIGJ5IGdycGNfY29tcHJlc3Npb25fYWxnb3JpdGhtIGVudW0gdmFsdWVzLiAqLwotdWludDMyX3QgZ3JwY19jYWxsX3Rlc3Rfb25seV9nZXRfZW5jb2RpbmdzX2FjY2VwdGVkX2J5X3BlZXIoZ3JwY19jYWxsICpjYWxsKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVJGQUNFX0NBTExfVEVTVF9PTkxZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5jIGIvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTBiNjQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2luaXQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCi0KLS8qKiBDYWNoZSBncnBjLXN0YXR1czogWCBtZGVsZW1zIGZvciBYID0gMC4uTlVNX0NBQ0hFRF9TVEFUVVNfRUxFTVMuCi0gKiAgQXZvaWRzIG5lZWRpbmcgdG8gdGFrZSBhIG1ldGFkYXRhIGNvbnRleHQgbG9jayBmb3Igc2VuZGluZyBzdGF0dXMKLSAqICBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgPD0gTlVNX0NBQ0hFRF9TVEFUVVNfRUxFTVMuCi0gKiAgU2l6ZWQgdG8gYWxsb3cgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBjb2RlcyB0byBmaXQgaW4KLSAqICAoT0ssIENhbmNlbGxlZCwgVW5rbm93bikuICovCi0jZGVmaW5lIE5VTV9DQUNIRURfU1RBVFVTX0VMRU1TIDMKLQotdHlwZWRlZiBzdHJ1Y3QgcmVnaXN0ZXJlZF9jYWxsIHsKLSAgZ3JwY19tZGVsZW0gKnBhdGg7Ci0gIGdycGNfbWRlbGVtICphdXRob3JpdHk7Ci0gIHN0cnVjdCByZWdpc3RlcmVkX2NhbGwgKm5leHQ7Ci19IHJlZ2lzdGVyZWRfY2FsbDsKLQotc3RydWN0IGdycGNfY2hhbm5lbCB7Ci0gIGludCBpc19jbGllbnQ7Ci0gIHVpbnQzMl90IG1heF9tZXNzYWdlX2xlbmd0aDsKLSAgZ3JwY19tZGVsZW0gKmRlZmF1bHRfYXV0aG9yaXR5OwotCi0gIGdwcl9tdSByZWdpc3RlcmVkX2NhbGxfbXU7Ci0gIHJlZ2lzdGVyZWRfY2FsbCAqcmVnaXN0ZXJlZF9jYWxsczsKLSAgY2hhciAqdGFyZ2V0OwotfTsKLQotI2RlZmluZSBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSAoKGdycGNfY2hhbm5lbF9zdGFjayAqKSgoYykgKyAxKSkKLSNkZWZpbmUgQ0hBTk5FTF9GUk9NX0NIQU5ORUxfU1RBQ0soY2hhbm5lbF9zdGFjaykgXAotICAoKChncnBjX2NoYW5uZWwgKikoY2hhbm5lbF9zdGFjaykpIC0gMSkKLSNkZWZpbmUgQ0hBTk5FTF9GUk9NX1RPUF9FTEVNKHRvcF9lbGVtKSBcCi0gIENIQU5ORUxfRlJPTV9DSEFOTkVMX1NUQUNLKGdycGNfY2hhbm5lbF9zdGFja19mcm9tX3RvcF9lbGVtZW50KHRvcF9lbGVtKSkKLQotLyogdGhlIHByb3RvYnVmIGxpYnJhcnkgd2lsbCAoYnkgZGVmYXVsdCkgc3RhcnQgd2FybmluZyBhdCAxMDBtZWdzICovCi0jZGVmaW5lIERFRkFVTFRfTUFYX01FU1NBR0VfTEVOR1RIICgxMDAgKiAxMDI0ICogMTAyNCkKLQotc3RhdGljIHZvaWQgZGVzdHJveV9jaGFubmVsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsIGJvb2wgc3VjY2Vzcyk7Ci0KLWdycGNfY2hhbm5lbCAqZ3JwY19jaGFubmVsX2NyZWF0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY29uc3QgY2hhciAqdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9zdGFja190eXBlIGNoYW5uZWxfc3RhY2tfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqb3B0aW9uYWxfdHJhbnNwb3J0KSB7Ci0gIGJvb2wgaXNfY2xpZW50ID0gZ3JwY19jaGFubmVsX3N0YWNrX3R5cGVfaXNfY2xpZW50KGNoYW5uZWxfc3RhY2tfdHlwZSk7Ci0KLSAgZ3JwY19jaGFubmVsICpjaGFubmVsID0gZ3JwY19jaGFubmVsX2luaXRfY3JlYXRlX3N0YWNrKAotICAgICAgZXhlY19jdHgsIGNoYW5uZWxfc3RhY2tfdHlwZSwgc2l6ZW9mKGdycGNfY2hhbm5lbCksIGFyZ3MsIDEsCi0gICAgICBkZXN0cm95X2NoYW5uZWwsIE5VTEwsIG9wdGlvbmFsX3RyYW5zcG9ydCk7Ci0KLSAgbWVtc2V0KGNoYW5uZWwsIDAsIHNpemVvZigqY2hhbm5lbCkpOwotICBjaGFubmVsLT50YXJnZXQgPSBncHJfc3RyZHVwKHRhcmdldCk7Ci0gIGNoYW5uZWwtPmlzX2NsaWVudCA9IGlzX2NsaWVudDsKLSAgZ3ByX211X2luaXQoJmNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbF9tdSk7Ci0gIGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHMgPSBOVUxMOwotCi0gIGNoYW5uZWwtPm1heF9tZXNzYWdlX2xlbmd0aCA9IERFRkFVTFRfTUFYX01FU1NBR0VfTEVOR1RIOwotICBpZiAoYXJncykgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgewotICAgICAgaWYgKDAgPT0gc3RyY21wKGFyZ3MtPmFyZ3NbaV0ua2V5LCBHUlBDX0FSR19NQVhfTUVTU0FHRV9MRU5HVEgpKSB7Ci0gICAgICAgIGlmIChhcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfSU5URUdFUikgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMgaWdub3JlZDogaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQVJHX01BWF9NRVNTQUdFX0xFTkdUSCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyIDwgMCkgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMgaWdub3JlZDogaXQgbXVzdCBiZSA+PSAwIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQVJHX01BWF9NRVNTQUdFX0xFTkdUSCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2hhbm5lbC0+bWF4X21lc3NhZ2VfbGVuZ3RoID0gKHVpbnQzMl90KWFyZ3MtPmFyZ3NbaV0udmFsdWUuaW50ZWdlcjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICgwID09IHN0cmNtcChhcmdzLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfREVGQVVMVF9BVVRIT1JJVFkpKSB7Ci0gICAgICAgIGlmIChhcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfU1RSSU5HKSB7Ci0gICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlcyBpZ25vcmVkOiBpdCBtdXN0IGJlIGEgc3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0RFRkFVTFRfQVVUSE9SSVRZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkpIHsKLSAgICAgICAgICAgIC8qIHNldHRpbmcgdGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYW55dGhpbmcgZWxzZSAqLwotICAgICAgICAgICAgR1JQQ19NREVMRU1fVU5SRUYoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaGFubmVsLT5kZWZhdWx0X2F1dGhvcml0eSA9IGdycGNfbWRlbGVtX2Zyb21fc3RyaW5ncygKLSAgICAgICAgICAgICAgIjphdXRob3JpdHkiLCBhcmdzLT5hcmdzW2ldLnZhbHVlLnN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoMCA9PQotICAgICAgICAgICAgICAgICBzdHJjbXAoYXJncy0+YXJnc1tpXS5rZXksIEdSUENfU1NMX1RBUkdFVF9OQU1FX09WRVJSSURFX0FSRykpIHsKLSAgICAgICAgaWYgKGFyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19TVFJJTkcpIHsKLSAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzIGlnbm9yZWQ6IGl0IG11c3QgYmUgYSBzdHJpbmciLAotICAgICAgICAgICAgICAgICAgR1JQQ19TU0xfVEFSR0VUX05BTUVfT1ZFUlJJREVfQVJHKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkpIHsKLSAgICAgICAgICAgIC8qIG90aGVyIHdheXMgb2Ygc2V0dGluZyB0aGlzIChub3RhYmx5IHNzbCkgdGFrZSBwcmVjZWRlbmNlICovCi0gICAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgIiVzIGlnbm9yZWQ6IGRlZmF1bHQgaG9zdCBhbHJlYWR5IHNldCBzb21lIG90aGVyIHdheSIsCi0gICAgICAgICAgICAgICAgICAgIEdSUENfU1NMX1RBUkdFVF9OQU1FX09WRVJSSURFX0FSRyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYW5uZWwtPmRlZmF1bHRfYXV0aG9yaXR5ID0gZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKAotICAgICAgICAgICAgICAgICI6YXV0aG9yaXR5IiwgYXJncy0+YXJnc1tpXS52YWx1ZS5zdHJpbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChjaGFubmVsLT5pc19jbGllbnQgJiYgY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkgPT0gTlVMTCAmJgotICAgICAgdGFyZ2V0ICE9IE5VTEwpIHsKLSAgICBjaGFyICpkZWZhdWx0X2F1dGhvcml0eSA9IGdycGNfZ2V0X2RlZmF1bHRfYXV0aG9yaXR5KHRhcmdldCk7Ci0gICAgaWYgKGRlZmF1bHRfYXV0aG9yaXR5KSB7Ci0gICAgICBjaGFubmVsLT5kZWZhdWx0X2F1dGhvcml0eSA9Ci0gICAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKCI6YXV0aG9yaXR5IiwgZGVmYXVsdF9hdXRob3JpdHkpOwotICAgIH0KLSAgICBncHJfZnJlZShkZWZhdWx0X2F1dGhvcml0eSk7Ci0gIH0KLQotICByZXR1cm4gY2hhbm5lbDsKLX0KLQotY2hhciAqZ3JwY19jaGFubmVsX2dldF90YXJnZXQoZ3JwY19jaGFubmVsICpjaGFubmVsKSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX2NoYW5uZWxfZ2V0X3RhcmdldChjaGFubmVsPSVwKSIsIDEsIChjaGFubmVsKSk7Ci0gIHJldHVybiBncHJfc3RyZHVwKGNoYW5uZWwtPnRhcmdldCk7Ci19Ci0KLXN0YXRpYyBncnBjX2NhbGwgKmdycGNfY2hhbm5lbF9jcmVhdGVfY2FsbF9pbnRlcm5hbCgKLSAgICBncnBjX2NoYW5uZWwgKmNoYW5uZWwsIGdycGNfY2FsbCAqcGFyZW50X2NhbGwsIHVpbnQzMl90IHByb3BhZ2F0aW9uX21hc2ssCi0gICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSwgZ3JwY19tZGVsZW0gKnBhdGhfbWRlbGVtLAotICAgIGdycGNfbWRlbGVtICphdXRob3JpdHlfbWRlbGVtLCBncHJfdGltZXNwZWMgZGVhZGxpbmUpIHsKLSAgZ3JwY19tZGVsZW0gKnNlbmRfbWV0YWRhdGFbMl07Ci0gIHNpemVfdCBudW1fbWV0YWRhdGEgPSAwOwotCi0gIEdQUl9BU1NFUlQoY2hhbm5lbC0+aXNfY2xpZW50KTsKLQotICBzZW5kX21ldGFkYXRhW251bV9tZXRhZGF0YSsrXSA9IHBhdGhfbWRlbGVtOwotICBpZiAoYXV0aG9yaXR5X21kZWxlbSAhPSBOVUxMKSB7Ci0gICAgc2VuZF9tZXRhZGF0YVtudW1fbWV0YWRhdGErK10gPSBhdXRob3JpdHlfbWRlbGVtOwotICB9IGVsc2UgaWYgKGNoYW5uZWwtPmRlZmF1bHRfYXV0aG9yaXR5ICE9IE5VTEwpIHsKLSAgICBzZW5kX21ldGFkYXRhW251bV9tZXRhZGF0YSsrXSA9IEdSUENfTURFTEVNX1JFRihjaGFubmVsLT5kZWZhdWx0X2F1dGhvcml0eSk7Ci0gIH0KLQotICByZXR1cm4gZ3JwY19jYWxsX2NyZWF0ZShjaGFubmVsLCBwYXJlbnRfY2FsbCwgcHJvcGFnYXRpb25fbWFzaywgY3EsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbWV0YWRhdGEsIG51bV9tZXRhZGF0YSwgZGVhZGxpbmUpOwotfQotCi1ncnBjX2NhbGwgKmdycGNfY2hhbm5lbF9jcmVhdGVfY2FsbChncnBjX2NoYW5uZWwgKmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGwgKnBhcmVudF9jYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvcGFnYXRpb25fbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QsIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIHZvaWQgKnJlc2VydmVkKSB7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfY2hhbm5lbF9jcmVhdGVfY2FsbCgiCi0gICAgICAiY2hhbm5lbD0lcCwgcGFyZW50X2NhbGw9JXAsIHByb3BhZ2F0aW9uX21hc2s9JXgsIGNxPSVwLCBtZXRob2Q9JXMsICIKLSAgICAgICJob3N0PSVzLCAiCi0gICAgICAiZGVhZGxpbmU9Z3ByX3RpbWVzcGVjIHsgdHZfc2VjOiAlbGxkLCB0dl9uc2VjOiAlZCwgY2xvY2tfdHlwZTogJWQgfSwgIgotICAgICAgInJlc2VydmVkPSVwKSIsCi0gICAgICAxMCwgKGNoYW5uZWwsIHBhcmVudF9jYWxsLCAodW5zaWduZWQpcHJvcGFnYXRpb25fbWFzaywgY3EsIG1ldGhvZCwgaG9zdCwKLSAgICAgICAgICAgKGxvbmcgbG9uZylkZWFkbGluZS50dl9zZWMsIChpbnQpZGVhZGxpbmUudHZfbnNlYywKLSAgICAgICAgICAgKGludClkZWFkbGluZS5jbG9ja190eXBlLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0gIHJldHVybiBncnBjX2NoYW5uZWxfY3JlYXRlX2NhbGxfaW50ZXJuYWwoCi0gICAgICBjaGFubmVsLCBwYXJlbnRfY2FsbCwgcHJvcGFnYXRpb25fbWFzaywgY3EsCi0gICAgICBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoR1JQQ19NRFNUUl9QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRzdHJfZnJvbV9zdHJpbmcobWV0aG9kKSksCi0gICAgICBob3N0ID8gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfQVVUSE9SSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKGhvc3QpKQotICAgICAgICAgICA6IE5VTEwsCi0gICAgICBkZWFkbGluZSk7Ci19Ci0KLXZvaWQgKmdycGNfY2hhbm5lbF9yZWdpc3Rlcl9jYWxsKGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgY29uc3QgY2hhciAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgcmVnaXN0ZXJlZF9jYWxsICpyYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKHJlZ2lzdGVyZWRfY2FsbCkpOwotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX2NoYW5uZWxfcmVnaXN0ZXJfY2FsbChjaGFubmVsPSVwLCBtZXRob2Q9JXMsIGhvc3Q9JXMsIHJlc2VydmVkPSVwKSIsCi0gICAgICA0LCAoY2hhbm5lbCwgbWV0aG9kLCBob3N0LCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0gIHJjLT5wYXRoID0gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhtZXRob2QpKTsKLSAgcmMtPmF1dGhvcml0eSA9IGhvc3QgPyBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfTURTVFJfQVVUSE9SSVRZLCBncnBjX21kc3RyX2Zyb21fc3RyaW5nKGhvc3QpKQotICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7Ci0gIGdwcl9tdV9sb2NrKCZjaGFubmVsLT5yZWdpc3RlcmVkX2NhbGxfbXUpOwotICByYy0+bmV4dCA9IGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHM7Ci0gIGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHMgPSByYzsKLSAgZ3ByX211X3VubG9jaygmY2hhbm5lbC0+cmVnaXN0ZXJlZF9jYWxsX211KTsKLSAgcmV0dXJuIHJjOwotfQotCi1ncnBjX2NhbGwgKmdycGNfY2hhbm5lbF9jcmVhdGVfcmVnaXN0ZXJlZF9jYWxsKAotICAgIGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgZ3JwY19jYWxsICpwYXJlbnRfY2FsbCwgdWludDMyX3QgcHJvcGFnYXRpb25fbWFzaywKLSAgICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNvbXBsZXRpb25fcXVldWUsIHZvaWQgKnJlZ2lzdGVyZWRfY2FsbF9oYW5kbGUsCi0gICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCB2b2lkICpyZXNlcnZlZCkgewotICByZWdpc3RlcmVkX2NhbGwgKnJjID0gcmVnaXN0ZXJlZF9jYWxsX2hhbmRsZTsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19jaGFubmVsX2NyZWF0ZV9yZWdpc3RlcmVkX2NhbGwoIgotICAgICAgImNoYW5uZWw9JXAsIHBhcmVudF9jYWxsPSVwLCBwcm9wYWdhdGlvbl9tYXNrPSV4LCBjb21wbGV0aW9uX3F1ZXVlPSVwLCAiCi0gICAgICAicmVnaXN0ZXJlZF9jYWxsX2hhbmRsZT0lcCwgIgotICAgICAgImRlYWRsaW5lPWdwcl90aW1lc3BlYyB7IHR2X3NlYzogJWxsZCwgdHZfbnNlYzogJWQsIGNsb2NrX3R5cGU6ICVkIH0sICIKLSAgICAgICJyZXNlcnZlZD0lcCkiLAotICAgICAgOSwgKGNoYW5uZWwsIHBhcmVudF9jYWxsLCAodW5zaWduZWQpcHJvcGFnYXRpb25fbWFzaywgY29tcGxldGlvbl9xdWV1ZSwKLSAgICAgICAgICByZWdpc3RlcmVkX2NhbGxfaGFuZGxlLCAobG9uZyBsb25nKWRlYWRsaW5lLnR2X3NlYywKLSAgICAgICAgICAoaW50KWRlYWRsaW5lLnR2X25zZWMsIChpbnQpZGVhZGxpbmUuY2xvY2tfdHlwZSwgcmVzZXJ2ZWQpKTsKLSAgR1BSX0FTU0VSVCghcmVzZXJ2ZWQpOwotICByZXR1cm4gZ3JwY19jaGFubmVsX2NyZWF0ZV9jYWxsX2ludGVybmFsKAotICAgICAgY2hhbm5lbCwgcGFyZW50X2NhbGwsIHByb3BhZ2F0aW9uX21hc2ssIGNvbXBsZXRpb25fcXVldWUsCi0gICAgICBHUlBDX01ERUxFTV9SRUYocmMtPnBhdGgpLAotICAgICAgcmMtPmF1dGhvcml0eSA/IEdSUENfTURFTEVNX1JFRihyYy0+YXV0aG9yaXR5KSA6IE5VTEwsIGRlYWRsaW5lKTsKLX0KLQotI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCi0jZGVmaW5lIFJFRl9SRUFTT04gcmVhc29uCi0jZGVmaW5lIFJFRl9BUkcgLCBjb25zdCBjaGFyICpyZWFzb24KLSNlbHNlCi0jZGVmaW5lIFJFRl9SRUFTT04gIiIKLSNkZWZpbmUgUkVGX0FSRwotI2VuZGlmCi12b2lkIGdycGNfY2hhbm5lbF9pbnRlcm5hbF9yZWYoZ3JwY19jaGFubmVsICpjIFJFRl9BUkcpIHsKLSAgR1JQQ19DSEFOTkVMX1NUQUNLX1JFRihDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSwgUkVGX1JFQVNPTik7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX2ludGVybmFsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsICpjIFJFRl9BUkcpIHsKLSAgR1JQQ19DSEFOTkVMX1NUQUNLX1VOUkVGKGV4ZWNfY3R4LCBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjKSwgUkVGX1JFQVNPTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2VzcykgewotICBncnBjX2NoYW5uZWwgKmNoYW5uZWwgPSBhcmc7Ci0gIGdycGNfY2hhbm5lbF9zdGFja19kZXN0cm95KGV4ZWNfY3R4LCBDSEFOTkVMX1NUQUNLX0ZST01fQ0hBTk5FTChjaGFubmVsKSk7Ci0gIHdoaWxlIChjaGFubmVsLT5yZWdpc3RlcmVkX2NhbGxzKSB7Ci0gICAgcmVnaXN0ZXJlZF9jYWxsICpyYyA9IGNoYW5uZWwtPnJlZ2lzdGVyZWRfY2FsbHM7Ci0gICAgY2hhbm5lbC0+cmVnaXN0ZXJlZF9jYWxscyA9IHJjLT5uZXh0OwotICAgIEdSUENfTURFTEVNX1VOUkVGKHJjLT5wYXRoKTsKLSAgICBpZiAocmMtPmF1dGhvcml0eSkgewotICAgICAgR1JQQ19NREVMRU1fVU5SRUYocmMtPmF1dGhvcml0eSk7Ci0gICAgfQotICAgIGdwcl9mcmVlKHJjKTsKLSAgfQotICBpZiAoY2hhbm5lbC0+ZGVmYXVsdF9hdXRob3JpdHkgIT0gTlVMTCkgewotICAgIEdSUENfTURFTEVNX1VOUkVGKGNoYW5uZWwtPmRlZmF1bHRfYXV0aG9yaXR5KTsKLSAgfQotICBncHJfbXVfZGVzdHJveSgmY2hhbm5lbC0+cmVnaXN0ZXJlZF9jYWxsX211KTsKLSAgZ3ByX2ZyZWUoY2hhbm5lbC0+dGFyZ2V0KTsKLSAgZ3ByX2ZyZWUoY2hhbm5lbCk7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX2Rlc3Ryb3koZ3JwY19jaGFubmVsICpjaGFubmVsKSB7Ci0gIGdycGNfdHJhbnNwb3J0X29wIG9wOwotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbTsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY2hhbm5lbF9kZXN0cm95KGNoYW5uZWw9JXApIiwgMSwgKGNoYW5uZWwpKTsKLSAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7Ci0gIG9wLmRpc2Nvbm5lY3QgPSAxOwotICBlbGVtID0gZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoQ0hBTk5FTF9TVEFDS19GUk9NX0NIQU5ORUwoY2hhbm5lbCksIDApOwotICBlbGVtLT5maWx0ZXItPnN0YXJ0X3RyYW5zcG9ydF9vcCgmZXhlY19jdHgsIGVsZW0sICZvcCk7Ci0KLSAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKCZleGVjX2N0eCwgY2hhbm5lbCwgImNoYW5uZWwiKTsKLQotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotfQotCi1ncnBjX2NoYW5uZWxfc3RhY2sgKmdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhncnBjX2NoYW5uZWwgKmNoYW5uZWwpIHsKLSAgcmV0dXJuIENIQU5ORUxfU1RBQ0tfRlJPTV9DSEFOTkVMKGNoYW5uZWwpOwotfQotCi1ncnBjX21kZWxlbSAqZ3JwY19jaGFubmVsX2dldF9yZWZmZWRfc3RhdHVzX2VsZW0oZ3JwY19jaGFubmVsICpjaGFubmVsLCBpbnQgaSkgewotICBjaGFyIHRtcFtHUFJfTFRPQV9NSU5fQlVGU0laRV07Ci0gIHN3aXRjaCAoaSkgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18wOwotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18xOwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18yOwotICB9Ci0gIGdwcl9sdG9hKGksIHRtcCk7Ci0gIHJldHVybiBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoR1JQQ19NRFNUUl9HUlBDX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHRtcCkpOwotfQotCi11aW50MzJfdCBncnBjX2NoYW5uZWxfZ2V0X21heF9tZXNzYWdlX2xlbmd0aChncnBjX2NoYW5uZWwgKmNoYW5uZWwpIHsKLSAgcmV0dXJuIGNoYW5uZWwtPm1heF9tZXNzYWdlX2xlbmd0aDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIGIvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODAzZmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVJGQUNFX0NIQU5ORUxfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIKLQotZ3JwY19jaGFubmVsICpncnBjX2NoYW5uZWxfY3JlYXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjb25zdCBjaGFyICp0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX3R5cGUgY2hhbm5lbF9zdGFja190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICpvcHRpb25hbF90cmFuc3BvcnQpOwotCi0vKiogR2V0IGEgKGJvcnJvd2VkKSBwb2ludGVyIHRvIHRoaXMgY2hhbm5lbHMgdW5kZXJseWluZyBjaGFubmVsIHN0YWNrICovCi1ncnBjX2NoYW5uZWxfc3RhY2sgKmdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhncnBjX2NoYW5uZWwgKmNoYW5uZWwpOwotCi0vKiogR2V0IGEgZ3JwY19tZGVsZW0gb2YgZ3JwYy1zdGF0dXM6IFggd2hlcmUgWCBpcyB0aGUgbnVtZXJpYyB2YWx1ZSBvZgotICAgIHN0YXR1c19jb2RlLgotCi0gICAgVGhlIHJldHVybmVkIGVsZW0gaXMgb3duZWQgYnkgdGhlIGNhbGxlci4gKi8KLWdycGNfbWRlbGVtICpncnBjX2NoYW5uZWxfZ2V0X3JlZmZlZF9zdGF0dXNfZWxlbShncnBjX2NoYW5uZWwgKmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c19jb2RlKTsKLXVpbnQzMl90IGdycGNfY2hhbm5lbF9nZXRfbWF4X21lc3NhZ2VfbGVuZ3RoKGdycGNfY2hhbm5lbCAqY2hhbm5lbCk7Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotdm9pZCBncnBjX2NoYW5uZWxfaW50ZXJuYWxfcmVmKGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgY29uc3QgY2hhciAqcmVhc29uKTsKLXZvaWQgZ3JwY19jaGFubmVsX2ludGVybmFsX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWwgKmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwotI2RlZmluZSBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGNoYW5uZWwsIHJlYXNvbikgXAotICBncnBjX2NoYW5uZWxfaW50ZXJuYWxfcmVmKGNoYW5uZWwsIHJlYXNvbikKLSNkZWZpbmUgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjaGFubmVsLCByZWFzb24pIFwKLSAgZ3JwY19jaGFubmVsX2ludGVybmFsX3VucmVmKGV4ZWNfY3R4LCBjaGFubmVsLCByZWFzb24pCi0jZWxzZQotdm9pZCBncnBjX2NoYW5uZWxfaW50ZXJuYWxfcmVmKGdycGNfY2hhbm5lbCAqY2hhbm5lbCk7Ci12b2lkIGdycGNfY2hhbm5lbF9pbnRlcm5hbF91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbCAqY2hhbm5lbCk7Ci0jZGVmaW5lIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoY2hhbm5lbCwgcmVhc29uKSBcCi0gIGdycGNfY2hhbm5lbF9pbnRlcm5hbF9yZWYoY2hhbm5lbCkKLSNkZWZpbmUgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjaGFubmVsLCByZWFzb24pIFwKLSAgZ3JwY19jaGFubmVsX2ludGVybmFsX3VucmVmKGV4ZWNfY3R4LCBjaGFubmVsKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyBiL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNjc5My4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKLQotZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKLSAgICBncnBjX2NoYW5uZWwgKmNoYW5uZWwsIGludCB0cnlfdG9fY29ubmVjdCkgewotICAvKiBmb3J3YXJkIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgY2xpZW50IGNoYW5uZWwgKi8KLSAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmNsaWVudF9jaGFubmVsX2VsZW0gPQotICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2xhc3RfZWxlbWVudChncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCkpOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdGF0ZTsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZShjaGFubmVsPSVwLCB0cnlfdG9fY29ubmVjdD0lZCkiLCAyLAotICAgICAgKGNoYW5uZWwsIHRyeV90b19jb25uZWN0KSk7Ci0gIGlmIChjbGllbnRfY2hhbm5lbF9lbGVtLT5maWx0ZXIgPT0gJmdycGNfY2xpZW50X2NoYW5uZWxfZmlsdGVyKSB7Ci0gICAgc3RhdGUgPSBncnBjX2NsaWVudF9jaGFubmVsX2NoZWNrX2Nvbm5lY3Rpdml0eV9zdGF0ZSgKLSAgICAgICAgJmV4ZWNfY3R4LCBjbGllbnRfY2hhbm5lbF9lbGVtLCB0cnlfdG9fY29ubmVjdCk7Ci0gICAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgICByZXR1cm4gc3RhdGU7Ci0gIH0KLSAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgImdycGNfY2hhbm5lbF9jaGVja19jb25uZWN0aXZpdHlfc3RhdGUgY2FsbGVkIG9uIHNvbWV0aGluZyB0aGF0IGlzICIKLSAgICAgICAgICAibm90IGEgKHUpY2xpZW50IGNoYW5uZWwsIGJ1dCAnJXMnIiwKLSAgICAgICAgICBjbGllbnRfY2hhbm5lbF9lbGVtLT5maWx0ZXItPm5hbWUpOwotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotICByZXR1cm4gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU7Ci19Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFdBSVRJTkcsCi0gIENBTExJTkdfQkFDSywKLSAgQ0FMTElOR19CQUNLX0FORF9GSU5JU0hFRCwKLSAgQ0FMTEVEX0JBQ0sKLX0gY2FsbGJhY2tfcGhhc2U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3ByX211IG11OwotICBjYWxsYmFja19waGFzZSBwaGFzZTsKLSAgaW50IHN1Y2Nlc3M7Ci0gIGdycGNfY2xvc3VyZSBvbl9jb21wbGV0ZTsKLSAgZ3JwY190aW1lciBhbGFybTsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGU7Ci0gIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3E7Ci0gIGdycGNfY3FfY29tcGxldGlvbiBjb21wbGV0aW9uX3N0b3JhZ2U7Ci0gIGdycGNfY2hhbm5lbCAqY2hhbm5lbDsKLSAgdm9pZCAqdGFnOwotfSBzdGF0ZV93YXRjaGVyOwotCi1zdGF0aWMgdm9pZCBkZWxldGVfc3RhdGVfd2F0Y2hlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgc3RhdGVfd2F0Y2hlciAqdykgewotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqY2xpZW50X2NoYW5uZWxfZWxlbSA9IGdycGNfY2hhbm5lbF9zdGFja19sYXN0X2VsZW1lbnQoCi0gICAgICBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2sody0+Y2hhbm5lbCkpOwotICBpZiAoY2xpZW50X2NoYW5uZWxfZWxlbS0+ZmlsdGVyID09ICZncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlcikgewotICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgdy0+Y2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhdGNoX2NoYW5uZWxfY29ubmVjdGl2aXR5Iik7Ci0gIH0gZWxzZSB7Ci0gICAgYWJvcnQoKTsKLSAgfQotICBncHJfbXVfZGVzdHJveSgmdy0+bXUpOwotICBncHJfZnJlZSh3KTsKLX0KLQotc3RhdGljIHZvaWQgZmluaXNoZWRfY29tcGxldGlvbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqaWdub3JlZCkgewotICBpbnQgZGVsZXRlID0gMDsKLSAgc3RhdGVfd2F0Y2hlciAqdyA9IHB3OwotICBncHJfbXVfbG9jaygmdy0+bXUpOwotICBzd2l0Y2ggKHctPnBoYXNlKSB7Ci0gICAgY2FzZSBXQUlUSU5HOgotICAgIGNhc2UgQ0FMTEVEX0JBQ0s6Ci0gICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKLSAgICBjYXNlIENBTExJTkdfQkFDSzoKLSAgICAgIHctPnBoYXNlID0gQ0FMTEVEX0JBQ0s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENBTExJTkdfQkFDS19BTkRfRklOSVNIRUQ6Ci0gICAgICBkZWxldGUgPSAxOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmdy0+bXUpOwotCi0gIGlmIChkZWxldGUpIHsKLSAgICBkZWxldGVfc3RhdGVfd2F0Y2hlcihleGVjX2N0eCwgdyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcGFydGx5X2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHN0YXRlX3dhdGNoZXIgKncsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVlX3RvX2NvbXBsZXRpb24pIHsKLSAgaW50IGRlbGV0ZSA9IDA7Ci0KLSAgaWYgKGR1ZV90b19jb21wbGV0aW9uKSB7Ci0gICAgZ3JwY190aW1lcl9jYW5jZWwoZXhlY19jdHgsICZ3LT5hbGFybSk7Ci0gIH0KLQotICBncHJfbXVfbG9jaygmdy0+bXUpOwotICBpZiAoZHVlX3RvX2NvbXBsZXRpb24pIHsKLSAgICB3LT5zdWNjZXNzID0gMTsKLSAgfQotICBzd2l0Y2ggKHctPnBoYXNlKSB7Ci0gICAgY2FzZSBXQUlUSU5HOgotICAgICAgdy0+cGhhc2UgPSBDQUxMSU5HX0JBQ0s7Ci0gICAgICBncnBjX2NxX2VuZF9vcChleGVjX2N0eCwgdy0+Y3EsIHctPnRhZywgdy0+c3VjY2VzcywgZmluaXNoZWRfY29tcGxldGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIHcsICZ3LT5jb21wbGV0aW9uX3N0b3JhZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDQUxMSU5HX0JBQ0s6Ci0gICAgICB3LT5waGFzZSA9IENBTExJTkdfQkFDS19BTkRfRklOSVNIRUQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENBTExJTkdfQkFDS19BTkRfRklOSVNIRUQ6Ci0gICAgICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKLSAgICBjYXNlIENBTExFRF9CQUNLOgotICAgICAgZGVsZXRlID0gMTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJnctPm11KTsKLQotICBpZiAoZGVsZXRlKSB7Ci0gICAgZGVsZXRlX3N0YXRlX3dhdGNoZXIoZXhlY19jdHgsIHcpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHdhdGNoX2NvbXBsZXRlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwdywgYm9vbCBzdWNjZXNzKSB7Ci0gIHBhcnRseV9kb25lKGV4ZWNfY3R4LCBwdywgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpbWVvdXRfY29tcGxldGUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnB3LCBib29sIHN1Y2Nlc3MpIHsKLSAgcGFydGx5X2RvbmUoZXhlY19jdHgsIHB3LCAwKTsKLX0KLQotdm9pZCBncnBjX2NoYW5uZWxfd2F0Y2hfY29ubmVjdGl2aXR5X3N0YXRlKAotICAgIGdycGNfY2hhbm5lbCAqY2hhbm5lbCwgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgbGFzdF9vYnNlcnZlZF9zdGF0ZSwKLSAgICBncHJfdGltZXNwZWMgZGVhZGxpbmUsIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsIHZvaWQgKnRhZykgewotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqY2xpZW50X2NoYW5uZWxfZWxlbSA9Ci0gICAgICBncnBjX2NoYW5uZWxfc3RhY2tfbGFzdF9lbGVtZW50KGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFubmVsKSk7Ci0gIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7Ci0gIHN0YXRlX3dhdGNoZXIgKncgPSBncHJfbWFsbG9jKHNpemVvZigqdykpOwotCi0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfY2hhbm5lbF93YXRjaF9jb25uZWN0aXZpdHlfc3RhdGUoIgotICAgICAgImNoYW5uZWw9JXAsIGxhc3Rfb2JzZXJ2ZWRfc3RhdGU9JWQsICIKLSAgICAgICJkZWFkbGluZT1ncHJfdGltZXNwZWMgeyB0dl9zZWM6ICVsbGQsIHR2X25zZWM6ICVkLCBjbG9ja190eXBlOiAlZCB9LCAiCi0gICAgICAiY3E9JXAsIHRhZz0lcCkiLAotICAgICAgNywgKGNoYW5uZWwsIChpbnQpbGFzdF9vYnNlcnZlZF9zdGF0ZSwgKGxvbmcgbG9uZylkZWFkbGluZS50dl9zZWMsCi0gICAgICAgICAgKGludClkZWFkbGluZS50dl9uc2VjLCAoaW50KWRlYWRsaW5lLmNsb2NrX3R5cGUsIGNxLCB0YWcpKTsKLQotICBncnBjX2NxX2JlZ2luX29wKGNxLCB0YWcpOwotCi0gIGdwcl9tdV9pbml0KCZ3LT5tdSk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZ3LT5vbl9jb21wbGV0ZSwgd2F0Y2hfY29tcGxldGUsIHcpOwotICB3LT5waGFzZSA9IFdBSVRJTkc7Ci0gIHctPnN0YXRlID0gbGFzdF9vYnNlcnZlZF9zdGF0ZTsKLSAgdy0+c3VjY2VzcyA9IDA7Ci0gIHctPmNxID0gY3E7Ci0gIHctPnRhZyA9IHRhZzsKLSAgdy0+Y2hhbm5lbCA9IGNoYW5uZWw7Ci0KLSAgZ3JwY190aW1lcl9pbml0KCZleGVjX2N0eCwgJnctPmFsYXJtLAotICAgICAgICAgICAgICAgICAgZ3ByX2NvbnZlcnRfY2xvY2tfdHlwZShkZWFkbGluZSwgR1BSX0NMT0NLX01PTk9UT05JQyksCi0gICAgICAgICAgICAgICAgICB0aW1lb3V0X2NvbXBsZXRlLCB3LCBncHJfbm93KEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLQotICBpZiAoY2xpZW50X2NoYW5uZWxfZWxlbS0+ZmlsdGVyID09ICZncnBjX2NsaWVudF9jaGFubmVsX2ZpbHRlcikgewotICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoY2hhbm5lbCwgIndhdGNoX2NoYW5uZWxfY29ubmVjdGl2aXR5Iik7Ci0gICAgZ3JwY19jbGllbnRfY2hhbm5lbF93YXRjaF9jb25uZWN0aXZpdHlfc3RhdGUoJmV4ZWNfY3R4LCBjbGllbnRfY2hhbm5lbF9lbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfcG9sbHNldChjcSksICZ3LT5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdy0+b25fY29tcGxldGUpOwotICB9IGVsc2UgewotICAgIGFib3J0KCk7Ci0gIH0KLQotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jIGIvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM0NDdjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2Nvbm5lY3RvciBiYXNlOwotICBncHJfcmVmY291bnQgcmVmczsKLQotICBncnBjX2Nsb3N1cmUgKm5vdGlmeTsKLSAgZ3JwY19jb25uZWN0X2luX2FyZ3MgYXJnczsKLSAgZ3JwY19jb25uZWN0X291dF9hcmdzICpyZXN1bHQ7Ci0gIGdycGNfY2xvc3VyZSBpbml0aWFsX3N0cmluZ19zZW50OwotICBncHJfc2xpY2VfYnVmZmVyIGluaXRpYWxfc3RyaW5nX2J1ZmZlcjsKLQotICBncnBjX2VuZHBvaW50ICp0Y3A7Ci0KLSAgZ3JwY19jbG9zdXJlIGNvbm5lY3RlZDsKLX0gY29ubmVjdG9yOwotCi1zdGF0aWMgdm9pZCBjb25uZWN0b3JfcmVmKGdycGNfY29ubmVjdG9yICpjb24pIHsKLSAgY29ubmVjdG9yICpjID0gKGNvbm5lY3RvciAqKWNvbjsKLSAgZ3ByX3JlZigmYy0+cmVmcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rvcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbikgewotICBjb25uZWN0b3IgKmMgPSAoY29ubmVjdG9yICopY29uOwotICBpZiAoZ3ByX3VucmVmKCZjLT5yZWZzKSkgewotICAgIC8qIGMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlciBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlc3Ryb3llZCAqLwotICAgIGdwcl9mcmVlKGMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2luaXRpYWxfY29ubmVjdF9zdHJpbmdfc2VudChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBjb25uZWN0b3JfdW5yZWYoZXhlY19jdHgsIGFyZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3RlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKLSAgY29ubmVjdG9yICpjID0gYXJnOwotICBncnBjX2Nsb3N1cmUgKm5vdGlmeTsKLSAgZ3JwY19lbmRwb2ludCAqdGNwID0gYy0+dGNwOwotICBpZiAodGNwICE9IE5VTEwpIHsKLSAgICBpZiAoIUdQUl9TTElDRV9JU19FTVBUWShjLT5hcmdzLmluaXRpYWxfY29ubmVjdF9zdHJpbmcpKSB7Ci0gICAgICBncnBjX2Nsb3N1cmVfaW5pdCgmYy0+aW5pdGlhbF9zdHJpbmdfc2VudCwgb25faW5pdGlhbF9jb25uZWN0X3N0cmluZ19zZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYyk7Ci0gICAgICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJmMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlcik7Ci0gICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmYy0+aW5pdGlhbF9zdHJpbmdfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJncy5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKTsKLSAgICAgIGNvbm5lY3Rvcl9yZWYoYXJnKTsKLSAgICAgIGdycGNfZW5kcG9pbnRfd3JpdGUoZXhlY19jdHgsIHRjcCwgJmMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmMtPmluaXRpYWxfc3RyaW5nX3NlbnQpOwotICAgIH0KLSAgICBjLT5yZXN1bHQtPnRyYW5zcG9ydCA9Ci0gICAgICAgIGdycGNfY3JlYXRlX2NodHRwMl90cmFuc3BvcnQoZXhlY19jdHgsIGMtPmFyZ3MuY2hhbm5lbF9hcmdzLCB0Y3AsIDEpOwotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9zdGFydF9yZWFkaW5nKGV4ZWNfY3R4LCBjLT5yZXN1bHQtPnRyYW5zcG9ydCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICBHUFJfQVNTRVJUKGMtPnJlc3VsdC0+dHJhbnNwb3J0KTsKLSAgICBjLT5yZXN1bHQtPmNoYW5uZWxfYXJncyA9IGMtPmFyZ3MuY2hhbm5lbF9hcmdzOwotICB9IGVsc2UgewotICAgIG1lbXNldChjLT5yZXN1bHQsIDAsIHNpemVvZigqYy0+cmVzdWx0KSk7Ci0gIH0KLSAgbm90aWZ5ID0gYy0+bm90aWZ5OwotICBjLT5ub3RpZnkgPSBOVUxMOwotICBub3RpZnktPmNiKGV4ZWNfY3R4LCBub3RpZnktPmNiX2FyZywgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rvcl9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbikge30KLQotc3RhdGljIHZvaWQgY29ubmVjdG9yX2Nvbm5lY3QoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2Nvbm5lY3RfaW5fYXJncyAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdF9vdXRfYXJncyAqcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpub3RpZnkpIHsKLSAgY29ubmVjdG9yICpjID0gKGNvbm5lY3RvciAqKWNvbjsKLSAgR1BSX0FTU0VSVChjLT5ub3RpZnkgPT0gTlVMTCk7Ci0gIEdQUl9BU1NFUlQobm90aWZ5LT5jYik7Ci0gIGMtPm5vdGlmeSA9IG5vdGlmeTsKLSAgYy0+YXJncyA9ICphcmdzOwotICBjLT5yZXN1bHQgPSByZXN1bHQ7Ci0gIGMtPnRjcCA9IE5VTEw7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZjLT5jb25uZWN0ZWQsIGNvbm5lY3RlZCwgYyk7Ci0gIGdycGNfdGNwX2NsaWVudF9jb25uZWN0KGV4ZWNfY3R4LCAmYy0+Y29ubmVjdGVkLCAmYy0+dGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5pbnRlcmVzdGVkX3BhcnRpZXMsIGFyZ3MtPmFkZHIsIGFyZ3MtPmFkZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5kZWFkbGluZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBncnBjX2Nvbm5lY3Rvcl92dGFibGUgY29ubmVjdG9yX3Z0YWJsZSA9IHsKLSAgICBjb25uZWN0b3JfcmVmLCBjb25uZWN0b3JfdW5yZWYsIGNvbm5lY3Rvcl9zaHV0ZG93biwgY29ubmVjdG9yX2Nvbm5lY3R9OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5IGJhc2U7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotICBncnBjX2NoYW5uZWxfYXJncyAqbWVyZ2VfYXJnczsKLSAgZ3JwY19jaGFubmVsICptYXN0ZXI7Ci19IHN1YmNoYW5uZWxfZmFjdG9yeTsKLQotc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9mYWN0b3J5X3JlZihncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc2NmKSB7Ci0gIHN1YmNoYW5uZWxfZmFjdG9yeSAqZiA9IChzdWJjaGFubmVsX2ZhY3RvcnkgKilzY2Y7Ci0gIGdwcl9yZWYoJmYtPnJlZnMpOwotfQotCi1zdGF0aWMgdm9pZCBzdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnNjZikgewotICBzdWJjaGFubmVsX2ZhY3RvcnkgKmYgPSAoc3ViY2hhbm5lbF9mYWN0b3J5ICopc2NmOwotICBpZiAoZ3ByX3VucmVmKCZmLT5yZWZzKSkgewotICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgZi0+bWFzdGVyLCAic3ViY2hhbm5lbF9mYWN0b3J5Iik7Ci0gICAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShmLT5tZXJnZV9hcmdzKTsKLSAgICBncHJfZnJlZShmKTsKLSAgfQotfQotCi1zdGF0aWMgZ3JwY19zdWJjaGFubmVsICpzdWJjaGFubmVsX2ZhY3RvcnlfY3JlYXRlX3N1YmNoYW5uZWwoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzY2YsCi0gICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpIHsKLSAgc3ViY2hhbm5lbF9mYWN0b3J5ICpmID0gKHN1YmNoYW5uZWxfZmFjdG9yeSAqKXNjZjsKLSAgY29ubmVjdG9yICpjID0gZ3ByX21hbGxvYyhzaXplb2YoKmMpKTsKLSAgZ3JwY19jaGFubmVsX2FyZ3MgKmZpbmFsX2FyZ3MgPQotICAgICAgZ3JwY19jaGFubmVsX2FyZ3NfbWVyZ2UoYXJncy0+YXJncywgZi0+bWVyZ2VfYXJncyk7Ci0gIGdycGNfc3ViY2hhbm5lbCAqczsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZjb25uZWN0b3JfdnRhYmxlOwotICBncHJfcmVmX2luaXQoJmMtPnJlZnMsIDEpOwotICBhcmdzLT5hcmdzID0gZmluYWxfYXJnczsKLSAgcyA9IGdycGNfc3ViY2hhbm5lbF9jcmVhdGUoZXhlY19jdHgsICZjLT5iYXNlLCBhcmdzKTsKLSAgZ3JwY19jb25uZWN0b3JfdW5yZWYoZXhlY19jdHgsICZjLT5iYXNlKTsKLSAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShmaW5hbF9hcmdzKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjb25zdCBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV92dGFibGUgc3ViY2hhbm5lbF9mYWN0b3J5X3Z0YWJsZSA9IHsKLSAgICBzdWJjaGFubmVsX2ZhY3RvcnlfcmVmLCBzdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYsCi0gICAgc3ViY2hhbm5lbF9mYWN0b3J5X2NyZWF0ZV9zdWJjaGFubmVsfTsKLQotLyogQ3JlYXRlIGEgY2xpZW50IGNoYW5uZWw6Ci0gICBBc3luY2hyb25vdXNseTogLSByZXNvbHZlIHRhcmdldAotICAgICAgICAgICAgICAgICAgIC0gY29ubmVjdCB0byBpdCAodHJ5aW5nIGFsdGVybmF0aXZlcyBhcyBwcmVzZW50ZWQpCi0gICAgICAgICAgICAgICAgICAgLSBwZXJmb3JtIGhhbmRzaGFrZXMgKi8KLWdycGNfY2hhbm5lbCAqZ3JwY19pbnNlY3VyZV9jaGFubmVsX2NyZWF0ZShjb25zdCBjaGFyICp0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgZ3JwY19jaGFubmVsICpjaGFubmVsID0gTlVMTDsKLSAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXI7Ci0gIHN1YmNoYW5uZWxfZmFjdG9yeSAqZjsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19pbnNlY3VyZV9jaGFubmVsX2NyZWF0ZSh0YXJnZXQ9JXAsIGFyZ3M9JXAsIHJlc2VydmVkPSVwKSIsIDMsCi0gICAgICAodGFyZ2V0LCBhcmdzLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0KLSAgY2hhbm5lbCA9Ci0gICAgICBncnBjX2NoYW5uZWxfY3JlYXRlKCZleGVjX2N0eCwgdGFyZ2V0LCBhcmdzLCBHUlBDX0NMSUVOVF9DSEFOTkVMLCBOVUxMKTsKLQotICBmID0gZ3ByX21hbGxvYyhzaXplb2YoKmYpKTsKLSAgZi0+YmFzZS52dGFibGUgPSAmc3ViY2hhbm5lbF9mYWN0b3J5X3Z0YWJsZTsKLSAgZ3ByX3JlZl9pbml0KCZmLT5yZWZzLCAxKTsKLSAgZi0+bWVyZ2VfYXJncyA9IGdycGNfY2hhbm5lbF9hcmdzX2NvcHkoYXJncyk7Ci0gIGYtPm1hc3RlciA9IGNoYW5uZWw7Ci0gIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoZi0+bWFzdGVyLCAic3ViY2hhbm5lbF9mYWN0b3J5Iik7Ci0gIHJlc29sdmVyID0gZ3JwY19yZXNvbHZlcl9jcmVhdGUodGFyZ2V0LCAmZi0+YmFzZSk7Ci0gIGlmICghcmVzb2x2ZXIpIHsKLSAgICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfVU5SRUYoJmV4ZWNfY3R4LCBmLT5tYXN0ZXIsICJzdWJjaGFubmVsX2ZhY3RvcnkiKTsKLSAgICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV91bnJlZigmZXhlY19jdHgsICZmLT5iYXNlKTsKLSAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZ3JwY19jbGllbnRfY2hhbm5lbF9zZXRfcmVzb2x2ZXIoCi0gICAgICAmZXhlY19jdHgsIGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFubmVsKSwgcmVzb2x2ZXIpOwotICBHUlBDX1JFU09MVkVSX1VOUkVGKCZleGVjX2N0eCwgcmVzb2x2ZXIsICJjcmVhdGUiKTsKLSAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoJmV4ZWNfY3R4LCAmZi0+YmFzZSk7Ci0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLQotICByZXR1cm4gY2hhbm5lbDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMgYi9zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzk2MmYzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi10eXBlZGVmIHN0cnVjdCBzdGFnZV9zbG90IHsKLSAgZ3JwY19jaGFubmVsX2luaXRfc3RhZ2UgZm47Ci0gIHZvaWQgKmFyZzsKLSAgaW50IHByaW9yaXR5OwotICBzaXplX3QgaW5zZXJ0aW9uX29yZGVyOwotfSBzdGFnZV9zbG90OwotCi10eXBlZGVmIHN0cnVjdCBzdGFnZV9zbG90cyB7Ci0gIHN0YWdlX3Nsb3QgKnNsb3RzOwotICBzaXplX3QgbnVtX3Nsb3RzOwotICBzaXplX3QgY2FwX3Nsb3RzOwotfSBzdGFnZV9zbG90czsKLQotc3RhdGljIHN0YWdlX3Nsb3RzIGdfc2xvdHNbR1JQQ19OVU1fQ0hBTk5FTF9TVEFDS19UWVBFU107Ci1zdGF0aWMgYm9vbCBnX2ZpbmFsaXplZDsKLQotdm9pZCBncnBjX2NoYW5uZWxfaW5pdF9pbml0KHZvaWQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBHUlBDX05VTV9DSEFOTkVMX1NUQUNLX1RZUEVTOyBpKyspIHsKLSAgICBnX3Nsb3RzW2ldLnNsb3RzID0gTlVMTDsKLSAgICBnX3Nsb3RzW2ldLm51bV9zbG90cyA9IDA7Ci0gICAgZ19zbG90c1tpXS5jYXBfc2xvdHMgPSAwOwotICB9Ci0gIGdfZmluYWxpemVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoZ3JwY19jaGFubmVsX3N0YWNrX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfaW5pdF9zdGFnZSBzdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc3RhZ2VfYXJnKSB7Ci0gIEdQUl9BU1NFUlQoIWdfZmluYWxpemVkKTsKLSAgaWYgKGdfc2xvdHNbdHlwZV0uY2FwX3Nsb3RzID09IGdfc2xvdHNbdHlwZV0ubnVtX3Nsb3RzKSB7Ci0gICAgZ19zbG90c1t0eXBlXS5jYXBfc2xvdHMgPSBHUFJfTUFYKDgsIDMgKiBnX3Nsb3RzW3R5cGVdLmNhcF9zbG90cyAvIDIpOwotICAgIGdfc2xvdHNbdHlwZV0uc2xvdHMgPQotICAgICAgICBncHJfcmVhbGxvYyhnX3Nsb3RzW3R5cGVdLnNsb3RzLAotICAgICAgICAgICAgICAgICAgICBnX3Nsb3RzW3R5cGVdLmNhcF9zbG90cyAqIHNpemVvZigqZ19zbG90c1t0eXBlXS5zbG90cykpOwotICB9Ci0gIHN0YWdlX3Nsb3QgKnMgPSAmZ19zbG90c1t0eXBlXS5zbG90c1tnX3Nsb3RzW3R5cGVdLm51bV9zbG90cysrXTsKLSAgcy0+aW5zZXJ0aW9uX29yZGVyID0gZ19zbG90c1t0eXBlXS5udW1fc2xvdHM7Ci0gIHMtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gIHMtPmZuID0gc3RhZ2U7Ci0gIHMtPmFyZyA9IHN0YWdlX2FyZzsKLX0KLQotc3RhdGljIGludCBjb21wYXJlX3Nsb3RzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKLSAgY29uc3Qgc3RhZ2Vfc2xvdCAqc2EgPSBhOwotICBjb25zdCBzdGFnZV9zbG90ICpzYiA9IGI7Ci0KLSAgaW50IGMgPSBHUFJfSUNNUChzYS0+cHJpb3JpdHksIHNiLT5wcmlvcml0eSk7Ci0gIGlmIChjICE9IDApIHJldHVybiBjOwotICByZXR1cm4gR1BSX0lDTVAoc2EtPmluc2VydGlvbl9vcmRlciwgc2ItPmluc2VydGlvbl9vcmRlcik7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX2luaXRfZmluYWxpemUodm9pZCkgewotICBHUFJfQVNTRVJUKCFnX2ZpbmFsaXplZCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgR1JQQ19OVU1fQ0hBTk5FTF9TVEFDS19UWVBFUzsgaSsrKSB7Ci0gICAgcXNvcnQoZ19zbG90c1tpXS5zbG90cywgZ19zbG90c1tpXS5udW1fc2xvdHMsIHNpemVvZigqZ19zbG90c1tpXS5zbG90cyksCi0gICAgICAgICAgY29tcGFyZV9zbG90cyk7Ci0gIH0KLSAgZ19maW5hbGl6ZWQgPSB0cnVlOwotfQotCi12b2lkIGdycGNfY2hhbm5lbF9pbml0X3NodXRkb3duKHZvaWQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBHUlBDX05VTV9DSEFOTkVMX1NUQUNLX1RZUEVTOyBpKyspIHsKLSAgICBncHJfZnJlZShnX3Nsb3RzW2ldLnNsb3RzKTsKLSAgICBnX3Nsb3RzW2ldLnNsb3RzID0gKHZvaWQgKikodWludHB0cl90KTB4ZGVhZGJlZWY7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVfZm9yX3R5cGUoZ3JwY19jaGFubmVsX3N0YWNrX3R5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEdSUENfQ0xJRU5UX0NIQU5ORUw6Ci0gICAgICByZXR1cm4gIkNMSUVOVF9DSEFOTkVMIjsKLSAgICBjYXNlIEdSUENfQ0xJRU5UX1NVQkNIQU5ORUw6Ci0gICAgICByZXR1cm4gIkNMSUVOVF9TVUJDSEFOTkVMIjsKLSAgICBjYXNlIEdSUENfU0VSVkVSX0NIQU5ORUw6Ci0gICAgICByZXR1cm4gIlNFUlZFUl9DSEFOTkVMIjsKLSAgICBjYXNlIEdSUENfQ0xJRU5UX0xBTUVfQ0hBTk5FTDoKLSAgICAgIHJldHVybiAiQ0xJRU5UX0xBTUVfQ0hBTk5FTCI7Ci0gICAgY2FzZSBHUlBDX0NMSUVOVF9ESVJFQ1RfQ0hBTk5FTDoKLSAgICAgIHJldHVybiAiQ0xJRU5UX0RJUkVDVF9DSEFOTkVMIjsKLSAgICBjYXNlIEdSUENfTlVNX0NIQU5ORUxfU1RBQ0tfVFlQRVM6Ci0gICAgICBicmVhazsKLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gIlVOS05PV04iKTsKLX0KLQotdm9pZCAqZ3JwY19jaGFubmVsX2luaXRfY3JlYXRlX3N0YWNrKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfc3RhY2tfdHlwZSB0eXBlLCBzaXplX3QgcHJlZml4X2J5dGVzLAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLCBpbnQgaW5pdGlhbF9yZWZzLCBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwKLSAgICB2b2lkICpkZXN0cm95X2FyZywgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCkgewotICBHUFJfQVNTRVJUKGdfZmluYWxpemVkKTsKLQotICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciA9IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2NyZWF0ZSgpOwotICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9zZXRfbmFtZShidWlsZGVyLCBuYW1lX2Zvcl90eXBlKHR5cGUpKTsKLSAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfc2V0X2NoYW5uZWxfYXJndW1lbnRzKGJ1aWxkZXIsIGFyZ3MpOwotICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9zZXRfdHJhbnNwb3J0KGJ1aWxkZXIsIHRyYW5zcG9ydCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnX3Nsb3RzW3R5cGVdLm51bV9zbG90czsgaSsrKSB7Ci0gICAgY29uc3Qgc3RhZ2Vfc2xvdCAqc2xvdCA9ICZnX3Nsb3RzW3R5cGVdLnNsb3RzW2ldOwotICAgIGlmICghc2xvdC0+Zm4oYnVpbGRlciwgc2xvdC0+YXJnKSkgewotICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZGVzdHJveShidWlsZGVyKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9maW5pc2goZXhlY19jdHgsIGJ1aWxkZXIsIHByZWZpeF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3JlZnMsIGRlc3Ryb3ksIGRlc3Ryb3lfYXJnKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmggYi9zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZhZWY2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX0lOSVRfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX0lOSVRfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKLQotLy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgd2F5IGZvciBwbHVnaW5zIChhbmQgdGhlIGdycGMgY29yZSBsaWJyYXJ5IGl0c2VsZikKLS8vLyB0byByZWdpc3RlciBtdXRhdG9ycyBmb3IgY2hhbm5lbCBzdGFja3MuCi0vLy8gSXQgYWxzbyBwcm92aWRlcyBhIHVuaXZlcnNhbCBlbnRyeSBwYXRoIHRvIHJ1biB0aG9zZSBtdXRhdG9ycyB0byBidWlsZAotLy8vIGEgY2hhbm5lbCBzdGFjayBmb3IgdmFyaW91cyBzdWJzeXN0ZW1zLgotCi0vLy8gT25lIHN0YWdlIG9mIG11dGF0aW9uOiBjYWxsIGZ1bmN0aW9ucyBhZ2FpbnN0IFxhIGJ1aWxkZXIgdG8gaW5mbHVlbmNlIHRoZQotLy8vIGZpbmFsbHkgY29uc3RydWN0ZWQgY2hhbm5lbCBzdGFjawotdHlwZWRlZiBib29sICgqZ3JwY19jaGFubmVsX2luaXRfc3RhZ2UpKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7Ci0KLS8vLyBHbG9iYWwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN5c3RlbQotdm9pZCBncnBjX2NoYW5uZWxfaW5pdF9pbml0KHZvaWQpOwotCi0vLy8gUmVnaXN0ZXIgb25lIHN0YWdlIG9mIG11dGF0b3JzLgotLy8vIFN0YWdlcyBhcmUgcnVuIGluIHByaW9yaXR5IG9yZGVyIChsb3dlc3QgdG8gaGlnaGVzdCksIGFuZCB0aGVuIGluCi0vLy8gcmVnaXN0cmF0aW9uIG9yZGVyIChpbiB0aGUgY2FzZSBvZiBhIHRpZSkuCi0vLy8gU3RhZ2VzIGFyZSByZWdpc3RlcmVkIGFnYWluc3Qgb25lIG9mIHRoZSBwcmUtZGV0ZXJtaW5lZCBjaGFubmVsIHN0YWNrCi0vLy8gdHlwZXMuCi12b2lkIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKGdycGNfY2hhbm5lbF9zdGFja190eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2luaXRfc3RhZ2Ugc3RhZ2VfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN0YWdlX2FyZyk7Ci0KLS8vLyBGaW5hbGl6ZSByZWdpc3RyYXRpb24uIE5vIG1vcmUgY2FsbHMgdG8gZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UgYXJlCi0vLy8gYWxsb3dlZC4KLXZvaWQgZ3JwY19jaGFubmVsX2luaXRfZmluYWxpemUodm9pZCk7Ci0vLy8gU2h1dGRvd24gdGhlIGNoYW5uZWwgaW5pdCBzeXN0ZW0KLXZvaWQgZ3JwY19jaGFubmVsX2luaXRfc2h1dGRvd24odm9pZCk7Ci0KLS8vLyBDb25zdHJ1Y3QgYSBjaGFubmVsIHN0YWNrIG9mIHNvbWUgc29ydDogc2VlIGNoYW5uZWxfc3RhY2suaCBmb3IgZGV0YWlscwotLy8vIFxhIHR5cGUgaXMgdGhlIHR5cGUgb2YgY2hhbm5lbCBzdGFjayB0byBjcmVhdGUKLS8vLyBcYSBwcmVmaXhfYnl0ZXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBiZWZvcmUgdGhlIGNoYW5uZWwgc3RhY2sgdG8gYWxsb2NhdGUKLS8vLyBcYSBhcmdzIGFyZSBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyBmb3IgdGhlIGNoYW5uZWwgc3RhY2sKLS8vLyBcYSBpbml0aWFsX3JlZnMgaXMgdGhlIGluaXRpYWwgcmVmY291bnQgdG8gZ2l2ZSB0aGUgY2hhbm5lbCBzdGFjawotLy8vIFxhIGRlc3Ryb3kgYW5kIFxhIGRlc3Ryb3lfYXJnIHNwZWNpZnkgaG93IHRvIGRlc3Ryb3kgdGhlIGNoYW5uZWwgc3RhY2sKLS8vLyAgICBpZiBkZXN0cm95X2FyZyBpcyBOVUxMLCB0aGUgcmV0dXJuZWQgdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKLS8vLyAgICBzdWJzdGl0dXRlZAotLy8vIFxhIG9wdGlvbmFsX3RyYW5zcG9ydCBpcyBlaXRoZXIgTlVMTCBvciBhIGNvbnN0cnVjdGVkIHRyYW5zcG9ydCBvYmplY3QKLS8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYmFzZSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCAodGhlIGFjdHVhbCBjaGFubmVsCi0vLy8gc3RhY2sgb2JqZWN0IHdpbGwgYmUgcHJlZml4X2J5dGVzIHBhc3QgdGhhdCBwb2ludGVyKQotdm9pZCAqZ3JwY19jaGFubmVsX2luaXRfY3JlYXRlX3N0YWNrKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfc3RhY2tfdHlwZSB0eXBlLCBzaXplX3QgcHJlZml4X2J5dGVzLAotICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzLCBpbnQgaW5pdGlhbF9yZWZzLCBncnBjX2lvbWdyX2NiX2Z1bmMgZGVzdHJveSwKLSAgICB2b2lkICpkZXN0cm95X2FyZywgZ3JwY190cmFuc3BvcnQgKm9wdGlvbmFsX3RyYW5zcG9ydCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX0lOSVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyBiL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4M2YxYzguLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2Nsb3N1cmUgY2xvc3VyZTsKLSAgdm9pZCAqdGFnOwotICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxOwotICBncnBjX2NxX2NvbXBsZXRpb24gY29tcGxldGlvbl9zdG9yYWdlOwotfSBwaW5nX3Jlc3VsdDsKLQotc3RhdGljIHZvaWQgcGluZ19kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpzdG9yYWdlKSB7Ci0gIGdwcl9mcmVlKGFyZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBpbmdfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKLSAgcGluZ19yZXN1bHQgKnByID0gYXJnOwotICBncnBjX2NxX2VuZF9vcChleGVjX2N0eCwgcHItPmNxLCBwci0+dGFnLCBzdWNjZXNzLCBwaW5nX2Rlc3Ryb3ksIHByLAotICAgICAgICAgICAgICAgICAmcHItPmNvbXBsZXRpb25fc3RvcmFnZSk7Ci19Ci0KLXZvaWQgZ3JwY19jaGFubmVsX3BpbmcoZ3JwY19jaGFubmVsICpjaGFubmVsLCBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxLAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0YWcsIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGdycGNfdHJhbnNwb3J0X29wIG9wOwotICBwaW5nX3Jlc3VsdCAqcHIgPSBncHJfbWFsbG9jKHNpemVvZigqcHIpKTsKLSAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKnRvcF9lbGVtID0KLSAgICAgIGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFubmVsKSwgMCk7Ci0gIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7Ci0gIEdQUl9BU1NFUlQocmVzZXJ2ZWQgPT0gTlVMTCk7Ci0gIG1lbXNldCgmb3AsIDAsIHNpemVvZihvcCkpOwotICBwci0+dGFnID0gdGFnOwotICBwci0+Y3EgPSBjcTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnByLT5jbG9zdXJlLCBwaW5nX2RvbmUsIHByKTsKLSAgb3Auc2VuZF9waW5nID0gJnByLT5jbG9zdXJlOwotICBvcC5iaW5kX3BvbGxzZXQgPSBncnBjX2NxX3BvbGxzZXQoY3EpOwotICBncnBjX2NxX2JlZ2luX29wKGNxLCB0YWcpOwotICB0b3BfZWxlbS0+ZmlsdGVyLT5zdGFydF90cmFuc3BvcnRfb3AoJmV4ZWNfY3R4LCB0b3BfZWxlbSwgJm9wKTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMgYi9zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZlOTQ5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0KLWJvb2wgZ3JwY19jaGFubmVsX3N0YWNrX3R5cGVfaXNfY2xpZW50KGdycGNfY2hhbm5lbF9zdGFja190eXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHUlBDX0NMSUVOVF9DSEFOTkVMOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBHUlBDX0NMSUVOVF9TVUJDSEFOTkVMOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBHUlBDX0NMSUVOVF9MQU1FX0NIQU5ORUw6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBHUlBDX1NFUlZFUl9DSEFOTkVMOgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgR1JQQ19OVU1fQ0hBTk5FTF9TVEFDS19UWVBFUzoKLSAgICAgIGJyZWFrOwotICB9Ci0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiB0cnVlOyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIGIvc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhMWI5Yy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX1NUQUNLX1RZUEVfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9DSEFOTkVMX1NUQUNLX1RZUEVfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotCi10eXBlZGVmIGVudW0gewotICAvLyBub3JtYWwgdG9wLWhhbGYgY2xpZW50IGNoYW5uZWwgd2l0aCBsb2FkLWJhbGFuY2luZywgY29ubmVjdGlvbiBtYW5hZ2VtZW50Ci0gIEdSUENfQ0xJRU5UX0NIQU5ORUwsCi0gIC8vIGJvdHRvbS1oYWxmIG9mIGEgY2xpZW50IGNoYW5uZWw6IGV2ZXJ5dGhpbmcgdGhhdCBoYXBwZW5zIHBvc3QtbG9hZAotICAvLyBiYWxhbmNpbmcgKGJvdW5kIHRvIGEgc3BlY2lmaWMgdHJhbnNwb3J0KQotICBHUlBDX0NMSUVOVF9TVUJDSEFOTkVMLAotICAvLyBhIHBlcm1hbmVudGx5IGJyb2tlbiBjbGllbnQgY2hhbm5lbAotICBHUlBDX0NMSUVOVF9MQU1FX0NIQU5ORUwsCi0gIC8vIGEgZGlyZWN0bHkgY29ubmVjdGVkIGNsaWVudCBjaGFubmVsICh3aXRob3V0IGxvYWQtYmFsYW5jaW5nLCBkaXJlY3RseSB0YWxrcwotICAvLyB0byBhIHRyYW5zcG9ydCkKLSAgR1JQQ19DTElFTlRfRElSRUNUX0NIQU5ORUwsCi0gIC8vIHNlcnZlciBzaWRlIGNoYW5uZWwKLSAgR1JQQ19TRVJWRVJfQ0hBTk5FTCwKLSAgLy8gbXVzdCBiZSBsYXN0Ci0gIEdSUENfTlVNX0NIQU5ORUxfU1RBQ0tfVFlQRVMKLX0gZ3JwY19jaGFubmVsX3N0YWNrX3R5cGU7Ci0KLWJvb2wgZ3JwY19jaGFubmVsX3N0YWNrX3R5cGVfaXNfY2xpZW50KGdycGNfY2hhbm5lbF9zdGFja190eXBlIHR5cGUpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1NVUkZBQ0VfQ0hBTk5FTF9TVEFDS19UWVBFX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIGIvc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjgxOGUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hdG0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90aW1lci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX3BvbGxzZXRfd29ya2VyICoqd29ya2VyOwotICB2b2lkICp0YWc7Ci19IHBsdWNrZXI7Ci0KLS8qIENvbXBsZXRpb24gcXVldWUgc3RydWN0dXJlICovCi1zdHJ1Y3QgZ3JwY19jb21wbGV0aW9uX3F1ZXVlIHsKLSAgLyoqIG93bmVkIGJ5IHBvbGxzZXQgKi8KLSAgZ3ByX211ICptdTsKLSAgLyoqIGNvbXBsZXRlZCBldmVudHMgKi8KLSAgZ3JwY19jcV9jb21wbGV0aW9uIGNvbXBsZXRlZF9oZWFkOwotICBncnBjX2NxX2NvbXBsZXRpb24gKmNvbXBsZXRlZF90YWlsOwotICAvKiogTnVtYmVyIG9mIHBlbmRpbmcgZXZlbnRzICgrMSBpZiB3ZSdyZSBub3Qgc2h1dGRvd24pICovCi0gIGdwcl9yZWZjb3VudCBwZW5kaW5nX2V2ZW50czsKLSAgLyoqIE9uY2Ugb3duaW5nX3JlZnMgZHJvcHMgdG8gemVybywgd2Ugd2lsbCBkZXN0cm95IHRoZSBjcSAqLwotICBncHJfcmVmY291bnQgb3duaW5nX3JlZnM7Ci0gIC8qKiAwIGluaXRpYWxseSwgMSBvbmNlIHdlJ3ZlIGJlZ3VuIHNodXR0aW5nIGRvd24gKi8KLSAgaW50IHNodXRkb3duOwotICBpbnQgc2h1dGRvd25fY2FsbGVkOwotICBpbnQgaXNfc2VydmVyX2NxOwotICBpbnQgbnVtX3BsdWNrZXJzOwotICBwbHVja2VyIHBsdWNrZXJzW0dSUENfTUFYX0NPTVBMRVRJT05fUVVFVUVfUExVQ0tFUlNdOwotICBncnBjX2Nsb3N1cmUgcG9sbHNldF9zaHV0ZG93bl9kb25lOwotCi0jaWZuZGVmIE5ERUJVRwotICB2b2lkICoqb3V0c3RhbmRpbmdfdGFnczsKLSAgc2l6ZV90IG91dHN0YW5kaW5nX3RhZ19jb3VudDsKLSAgc2l6ZV90IG91dHN0YW5kaW5nX3RhZ19jYXBhY2l0eTsKLSNlbmRpZgotCi0gIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqbmV4dF9mcmVlOwotfTsKLQotI2RlZmluZSBQT0xMU0VUX0ZST01fQ1EoY3EpICgoZ3JwY19wb2xsc2V0ICopKGNxICsgMSkpCi0KLXN0YXRpYyBncHJfbXUgZ19mcmVlbGlzdF9tdTsKLXN0YXRpYyBncnBjX2NvbXBsZXRpb25fcXVldWUgKmdfZnJlZWxpc3Q7Ci0KLXN0YXRpYyB2b2lkIG9uX3BvbGxzZXRfc2h1dGRvd25fZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzKTsKLQotdm9pZCBncnBjX2NxX2dsb2JhbF9pbml0KHZvaWQpIHsgZ3ByX211X2luaXQoJmdfZnJlZWxpc3RfbXUpOyB9Ci0KLXZvaWQgZ3JwY19jcV9nbG9iYWxfc2h1dGRvd24odm9pZCkgewotICBncHJfbXVfZGVzdHJveSgmZ19mcmVlbGlzdF9tdSk7Ci0gIHdoaWxlIChnX2ZyZWVsaXN0KSB7Ci0gICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpuZXh0ID0gZ19mcmVlbGlzdC0+bmV4dF9mcmVlOwotICAgIGdycGNfcG9sbHNldF9kZXN0cm95KFBPTExTRVRfRlJPTV9DUShnX2ZyZWVsaXN0KSk7Ci0jaWZuZGVmIE5ERUJVRwotICAgIGdwcl9mcmVlKGdfZnJlZWxpc3QtPm91dHN0YW5kaW5nX3RhZ3MpOwotI2VuZGlmCi0gICAgZ3ByX2ZyZWUoZ19mcmVlbGlzdCk7Ci0gICAgZ19mcmVlbGlzdCA9IG5leHQ7Ci0gIH0KLX0KLQotc3RydWN0IGdycGNfY3FfYWxhcm0gewotICBncnBjX3RpbWVyIGFsYXJtOwotICBncnBjX2NxX2NvbXBsZXRpb24gY29tcGxldGlvbjsKLSAgLyoqIGNvbXBsZXRpb24gcXVldWUgd2hlcmUgZXZlbnRzIGFib3V0IHRoaXMgYWxhcm0gd2lsbCBiZSBwb3N0ZWQgKi8KLSAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcTsKLSAgLyoqIHVzZXIgc3VwcGxpZWQgdGFnICovCi0gIHZvaWQgKnRhZzsKLX07Ci0KLWdycGNfY29tcGxldGlvbl9xdWV1ZSAqZ3JwY19jb21wbGV0aW9uX3F1ZXVlX2NyZWF0ZSh2b2lkICpyZXNlcnZlZCkgewotICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NvbXBsZXRpb25fcXVldWVfY3JlYXRlIiwgMCk7Ci0KLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfY29tcGxldGlvbl9xdWV1ZV9jcmVhdGUocmVzZXJ2ZWQ9JXApIiwgMSwgKHJlc2VydmVkKSk7Ci0KLSAgZ3ByX211X2xvY2soJmdfZnJlZWxpc3RfbXUpOwotICBpZiAoZ19mcmVlbGlzdCA9PSBOVUxMKSB7Ci0gICAgZ3ByX211X3VubG9jaygmZ19mcmVlbGlzdF9tdSk7Ci0KLSAgICBjYyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY29tcGxldGlvbl9xdWV1ZSkgKyBncnBjX3BvbGxzZXRfc2l6ZSgpKTsKLSAgICBncnBjX3BvbGxzZXRfaW5pdChQT0xMU0VUX0ZST01fQ1EoY2MpLCAmY2MtPm11KTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgY2MtPm91dHN0YW5kaW5nX3RhZ3MgPSBOVUxMOwotICAgIGNjLT5vdXRzdGFuZGluZ190YWdfY2FwYWNpdHkgPSAwOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgY2MgPSBnX2ZyZWVsaXN0OwotICAgIGdfZnJlZWxpc3QgPSBnX2ZyZWVsaXN0LT5uZXh0X2ZyZWU7Ci0gICAgZ3ByX211X3VubG9jaygmZ19mcmVlbGlzdF9tdSk7Ci0gICAgLyogcG9sbHNldCBhbHJlYWR5IGluaXRpYWxpemVkICovCi0gIH0KLQotICAvKiBJbml0aWFsIHJlZiBpcyBkcm9wcGVkIGJ5IGdycGNfY29tcGxldGlvbl9xdWV1ZV9zaHV0ZG93biAqLwotICBncHJfcmVmX2luaXQoJmNjLT5wZW5kaW5nX2V2ZW50cywgMSk7Ci0gIC8qIE9uZSBmb3IgZGVzdHJveSgpLCBvbmUgZm9yIHBvbGxzZXRfc2h1dGRvd24gKi8KLSAgZ3ByX3JlZl9pbml0KCZjYy0+b3duaW5nX3JlZnMsIDIpOwotICBjYy0+Y29tcGxldGVkX3RhaWwgPSAmY2MtPmNvbXBsZXRlZF9oZWFkOwotICBjYy0+Y29tcGxldGVkX2hlYWQubmV4dCA9ICh1aW50cHRyX3QpY2MtPmNvbXBsZXRlZF90YWlsOwotICBjYy0+c2h1dGRvd24gPSAwOwotICBjYy0+c2h1dGRvd25fY2FsbGVkID0gMDsKLSAgY2MtPmlzX3NlcnZlcl9jcSA9IDA7Ci0gIGNjLT5udW1fcGx1Y2tlcnMgPSAwOwotI2lmbmRlZiBOREVCVUcKLSAgY2MtPm91dHN0YW5kaW5nX3RhZ19jb3VudCA9IDA7Ci0jZW5kaWYKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmNjLT5wb2xsc2V0X3NodXRkb3duX2RvbmUsIG9uX3BvbGxzZXRfc2h1dGRvd25fZG9uZSwgY2MpOwotCi0gIEdQUl9USU1FUl9FTkQoImdycGNfY29tcGxldGlvbl9xdWV1ZV9jcmVhdGUiLCAwKTsKLQotICByZXR1cm4gY2M7Ci19Ci0KLSNpZmRlZiBHUlBDX0NRX1JFRl9DT1VOVF9ERUJVRwotdm9pZCBncnBjX2NxX2ludGVybmFsX3JlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjLCBjb25zdCBjaGFyICpyZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSB7Ci0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywgIkNROiVwICAgcmVmICVkIC0+ICVkICVzIiwgY2MsCi0gICAgICAgICAgKGludCljYy0+b3duaW5nX3JlZnMuY291bnQsIChpbnQpY2MtPm93bmluZ19yZWZzLmNvdW50ICsgMSwgcmVhc29uKTsKLSNlbHNlCi12b2lkIGdycGNfY3FfaW50ZXJuYWxfcmVmKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MpIHsKLSNlbmRpZgotICBncHJfcmVmKCZjYy0+b3duaW5nX3JlZnMpOwotfQotCi1zdGF0aWMgdm9pZCBvbl9wb2xsc2V0X3NodXRkb3duX2RvbmUoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYyA9IGFyZzsKLSAgR1JQQ19DUV9JTlRFUk5BTF9VTlJFRihjYywgInBvbGxzZXRfZGVzdHJveSIpOwotfQotCi0jaWZkZWYgR1JQQ19DUV9SRUZfQ09VTlRfREVCVUcKLXZvaWQgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjLCBjb25zdCBjaGFyICpyZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKLSAgZ3ByX2xvZyhmaWxlLCBsaW5lLCBHUFJfTE9HX1NFVkVSSVRZX0RFQlVHLCAiQ1E6JXAgdW5yZWYgJWQgLT4gJWQgJXMiLCBjYywKLSAgICAgICAgICAoaW50KWNjLT5vd25pbmdfcmVmcy5jb3VudCwgKGludCljYy0+b3duaW5nX3JlZnMuY291bnQgLSAxLCByZWFzb24pOwotI2Vsc2UKLXZvaWQgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKSB7Ci0jZW5kaWYKLSAgaWYgKGdwcl91bnJlZigmY2MtPm93bmluZ19yZWZzKSkgewotICAgIEdQUl9BU1NFUlQoY2MtPmNvbXBsZXRlZF9oZWFkLm5leHQgPT0gKHVpbnRwdHJfdCkmY2MtPmNvbXBsZXRlZF9oZWFkKTsKLSAgICBncnBjX3BvbGxzZXRfcmVzZXQoUE9MTFNFVF9GUk9NX0NRKGNjKSk7Ci0gICAgZ3ByX211X2xvY2soJmdfZnJlZWxpc3RfbXUpOwotICAgIGNjLT5uZXh0X2ZyZWUgPSBnX2ZyZWVsaXN0OwotICAgIGdfZnJlZWxpc3QgPSBjYzsKLSAgICBncHJfbXVfdW5sb2NrKCZnX2ZyZWVsaXN0X211KTsKLSAgfQotfQotCi12b2lkIGdycGNfY3FfYmVnaW5fb3AoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgdm9pZCAqdGFnKSB7Ci0jaWZuZGVmIE5ERUJVRwotICBncHJfbXVfbG9jayhjYy0+bXUpOwotICBHUFJfQVNTRVJUKCFjYy0+c2h1dGRvd25fY2FsbGVkKTsKLSAgaWYgKGNjLT5vdXRzdGFuZGluZ190YWdfY291bnQgPT0gY2MtPm91dHN0YW5kaW5nX3RhZ19jYXBhY2l0eSkgewotICAgIGNjLT5vdXRzdGFuZGluZ190YWdfY2FwYWNpdHkgPSBHUFJfTUFYKDQsIDIgKiBjYy0+b3V0c3RhbmRpbmdfdGFnX2NhcGFjaXR5KTsKLSAgICBjYy0+b3V0c3RhbmRpbmdfdGFncyA9Ci0gICAgICAgIGdwcl9yZWFsbG9jKGNjLT5vdXRzdGFuZGluZ190YWdzLCBzaXplb2YoKmNjLT5vdXRzdGFuZGluZ190YWdzKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtPm91dHN0YW5kaW5nX3RhZ19jYXBhY2l0eSk7Ci0gIH0KLSAgY2MtPm91dHN0YW5kaW5nX3RhZ3NbY2MtPm91dHN0YW5kaW5nX3RhZ19jb3VudCsrXSA9IHRhZzsKLSAgZ3ByX211X3VubG9jayhjYy0+bXUpOwotI2VuZGlmCi0gIGdwcl9yZWYoJmNjLT5wZW5kaW5nX2V2ZW50cyk7Ci19Ci0KLS8qIFNpZ25hbCB0aGUgZW5kIG9mIGFuIG9wZXJhdGlvbiAtIGlmIHRoaXMgaXMgdGhlIGxhc3Qgd2FpdGluZy10by1iZS1xdWV1ZWQKLSAgIGV2ZW50LCB0aGVuIGVudGVyIHNodXRkb3duIG1vZGUgKi8KLS8qIFF1ZXVlIGEgR1JQQ19PUF9DT01QTEVURUQgb3BlcmF0aW9uICovCi12b2lkIGdycGNfY3FfZW5kX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjLAotICAgICAgICAgICAgICAgICAgICB2b2lkICp0YWcsIGludCBzdWNjZXNzLAotICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9uZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmRvbmVfYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpzdG9yYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqZG9uZV9hcmcsIGdycGNfY3FfY29tcGxldGlvbiAqc3RvcmFnZSkgewotICBpbnQgc2h1dGRvd247Ci0gIGludCBpOwotICBncnBjX3BvbGxzZXRfd29ya2VyICpwbHVja193b3JrZXI7Ci0jaWZuZGVmIE5ERUJVRwotICBpbnQgZm91bmQgPSAwOwotI2VuZGlmCi0KLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NxX2VuZF9vcCIsIDApOwotCi0gIHN0b3JhZ2UtPnRhZyA9IHRhZzsKLSAgc3RvcmFnZS0+ZG9uZSA9IGRvbmU7Ci0gIHN0b3JhZ2UtPmRvbmVfYXJnID0gZG9uZV9hcmc7Ci0gIHN0b3JhZ2UtPm5leHQgPQotICAgICAgKCh1aW50cHRyX3QpJmNjLT5jb21wbGV0ZWRfaGVhZCkgfCAoKHVpbnRwdHJfdCkoc3VjY2VzcyAhPSAwKSk7Ci0KLSAgZ3ByX211X2xvY2soY2MtPm11KTsKLSNpZm5kZWYgTkRFQlVHCi0gIGZvciAoaSA9IDA7IGkgPCAoaW50KWNjLT5vdXRzdGFuZGluZ190YWdfY291bnQ7IGkrKykgewotICAgIGlmIChjYy0+b3V0c3RhbmRpbmdfdGFnc1tpXSA9PSB0YWcpIHsKLSAgICAgIGNjLT5vdXRzdGFuZGluZ190YWdfY291bnQtLTsKLSAgICAgIEdQUl9TV0FQKHZvaWQgKiwgY2MtPm91dHN0YW5kaW5nX3RhZ3NbaV0sCi0gICAgICAgICAgICAgICBjYy0+b3V0c3RhbmRpbmdfdGFnc1tjYy0+b3V0c3RhbmRpbmdfdGFnX2NvdW50XSk7Ci0gICAgICBmb3VuZCA9IDE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgR1BSX0FTU0VSVChmb3VuZCk7Ci0jZW5kaWYKLSAgc2h1dGRvd24gPSBncHJfdW5yZWYoJmNjLT5wZW5kaW5nX2V2ZW50cyk7Ci0gIGlmICghc2h1dGRvd24pIHsKLSAgICBjYy0+Y29tcGxldGVkX3RhaWwtPm5leHQgPQotICAgICAgICAoKHVpbnRwdHJfdClzdG9yYWdlKSB8ICgxdSAmICh1aW50cHRyX3QpY2MtPmNvbXBsZXRlZF90YWlsLT5uZXh0KTsKLSAgICBjYy0+Y29tcGxldGVkX3RhaWwgPSBzdG9yYWdlOwotICAgIHBsdWNrX3dvcmtlciA9IE5VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNjLT5udW1fcGx1Y2tlcnM7IGkrKykgewotICAgICAgaWYgKGNjLT5wbHVja2Vyc1tpXS50YWcgPT0gdGFnKSB7Ci0gICAgICAgIHBsdWNrX3dvcmtlciA9ICpjYy0+cGx1Y2tlcnNbaV0ud29ya2VyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ3JwY19wb2xsc2V0X2tpY2soUE9MTFNFVF9GUk9NX0NRKGNjKSwgcGx1Y2tfd29ya2VyKTsKLSAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2MtPmNvbXBsZXRlZF90YWlsLT5uZXh0ID0KLSAgICAgICAgKCh1aW50cHRyX3Qpc3RvcmFnZSkgfCAoMXUgJiAodWludHB0cl90KWNjLT5jb21wbGV0ZWRfdGFpbC0+bmV4dCk7Ci0gICAgY2MtPmNvbXBsZXRlZF90YWlsID0gc3RvcmFnZTsKLSAgICBHUFJfQVNTRVJUKCFjYy0+c2h1dGRvd24pOwotICAgIEdQUl9BU1NFUlQoY2MtPnNodXRkb3duX2NhbGxlZCk7Ci0gICAgY2MtPnNodXRkb3duID0gMTsKLSAgICBncnBjX3BvbGxzZXRfc2h1dGRvd24oZXhlY19jdHgsIFBPTExTRVRfRlJPTV9DUShjYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjYy0+cG9sbHNldF9zaHV0ZG93bl9kb25lKTsKLSAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7Ci0gIH0KLQotICBHUFJfVElNRVJfRU5EKCJncnBjX2NxX2VuZF9vcCIsIDApOwotfQotCi1ncnBjX2V2ZW50IGdycGNfY29tcGxldGlvbl9xdWV1ZV9uZXh0KGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl90aW1lc3BlYyBkZWFkbGluZSwgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgZ3JwY19ldmVudCByZXQ7Ci0gIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciA9IE5VTEw7Ci0gIGludCBmaXJzdF9sb29wID0gMTsKLSAgZ3ByX3RpbWVzcGVjIG5vdzsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUFJfVElNRVJfQkVHSU4oImdycGNfY29tcGxldGlvbl9xdWV1ZV9uZXh0IiwgMCk7Ci0KLSAgR1JQQ19BUElfVFJBQ0UoCi0gICAgICAiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX25leHQoIgotICAgICAgImNjPSVwLCAiCi0gICAgICAiZGVhZGxpbmU9Z3ByX3RpbWVzcGVjIHsgdHZfc2VjOiAlbGxkLCB0dl9uc2VjOiAlZCwgY2xvY2tfdHlwZTogJWQgfSwgIgotICAgICAgInJlc2VydmVkPSVwKSIsCi0gICAgICA1LCAoY2MsIChsb25nIGxvbmcpZGVhZGxpbmUudHZfc2VjLCAoaW50KWRlYWRsaW5lLnR2X25zZWMsCi0gICAgICAgICAgKGludClkZWFkbGluZS5jbG9ja190eXBlLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0KLSAgZGVhZGxpbmUgPSBncHJfY29udmVydF9jbG9ja190eXBlKGRlYWRsaW5lLCBHUFJfQ0xPQ0tfTU9OT1RPTklDKTsKLQotICBHUlBDX0NRX0lOVEVSTkFMX1JFRihjYywgIm5leHQiKTsKLSAgZ3ByX211X2xvY2soY2MtPm11KTsKLSAgZm9yICg7OykgewotICAgIGlmIChjYy0+Y29tcGxldGVkX3RhaWwgIT0gJmNjLT5jb21wbGV0ZWRfaGVhZCkgewotICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpjID0gKGdycGNfY3FfY29tcGxldGlvbiAqKWNjLT5jb21wbGV0ZWRfaGVhZC5uZXh0OwotICAgICAgY2MtPmNvbXBsZXRlZF9oZWFkLm5leHQgPSBjLT5uZXh0ICYgfih1aW50cHRyX3QpMTsKLSAgICAgIGlmIChjID09IGNjLT5jb21wbGV0ZWRfdGFpbCkgewotICAgICAgICBjYy0+Y29tcGxldGVkX3RhaWwgPSAmY2MtPmNvbXBsZXRlZF9oZWFkOwotICAgICAgfQotICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOwotICAgICAgcmV0LnR5cGUgPSBHUlBDX09QX0NPTVBMRVRFOwotICAgICAgcmV0LnN1Y2Nlc3MgPSBjLT5uZXh0ICYgMXU7Ci0gICAgICByZXQudGFnID0gYy0+dGFnOwotICAgICAgYy0+ZG9uZSgmZXhlY19jdHgsIGMtPmRvbmVfYXJnLCBjKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoY2MtPnNodXRkb3duKSB7Ci0gICAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7Ci0gICAgICBtZW1zZXQoJnJldCwgMCwgc2l6ZW9mKHJldCkpOwotICAgICAgcmV0LnR5cGUgPSBHUlBDX1FVRVVFX1NIVVRET1dOOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQyk7Ci0gICAgaWYgKCFmaXJzdF9sb29wICYmIGdwcl90aW1lX2NtcChub3csIGRlYWRsaW5lKSA+PSAwKSB7Ci0gICAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7Ci0gICAgICBtZW1zZXQoJnJldCwgMCwgc2l6ZW9mKHJldCkpOwotICAgICAgcmV0LnR5cGUgPSBHUlBDX1FVRVVFX1RJTUVPVVQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZmlyc3RfbG9vcCA9IDA7Ci0gICAgLyogQ2hlY2sgYWxhcm1zIC0gdGhlc2UgYXJlIGEgZ2xvYmFsIHJlc291cmNlIHNvIHdlIGp1c3QgcGluZwotICAgICAgIGVhY2ggdGltZSB0aHJvdWdoIG9uIGV2ZXJ5IHBvbGxzZXQuCi0gICAgICAgTWF5IHVwZGF0ZSBkZWFkbGluZSB0byBlbnN1cmUgdGltZWx5IHdha2V1cHMuCi0gICAgICAgVE9ETyhjdGlsbGVyKTogY2FuIHRoaXMgd29yayBiZSBsb2NhbGl6ZWQ/ICovCi0gICAgZ3ByX3RpbWVzcGVjIGl0ZXJhdGlvbl9kZWFkbGluZSA9IGRlYWRsaW5lOwotICAgIGlmIChncnBjX3RpbWVyX2NoZWNrKCZleGVjX2N0eCwgbm93LCAmaXRlcmF0aW9uX2RlYWRsaW5lKSkgewotICAgICAgR1BSX1RJTUVSX01BUksoImFsYXJtX3RyaWdnZXJlZCIsIDApOwotICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOwotICAgICAgZ3JwY19leGVjX2N0eF9mbHVzaCgmZXhlY19jdHgpOwotICAgICAgZ3ByX211X2xvY2soY2MtPm11KTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX3BvbGxzZXRfd29yaygmZXhlY19jdHgsIFBPTExTRVRfRlJPTV9DUShjYyksICZ3b3JrZXIsIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbl9kZWFkbGluZSk7Ci0gICAgfQotICB9Ci0gIEdSUENfU1VSRkFDRV9UUkFDRV9SRVRVUk5FRF9FVkVOVChjYywgJnJldCk7Ci0gIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoY2MsICJuZXh0Iik7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0KLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX25leHQiLCAwKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkZF9wbHVja2VyKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIHZvaWQgKnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqKndvcmtlcikgewotICBpZiAoY2MtPm51bV9wbHVja2VycyA9PSBHUlBDX01BWF9DT01QTEVUSU9OX1FVRVVFX1BMVUNLRVJTKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgY2MtPnBsdWNrZXJzW2NjLT5udW1fcGx1Y2tlcnNdLnRhZyA9IHRhZzsKLSAgY2MtPnBsdWNrZXJzW2NjLT5udW1fcGx1Y2tlcnNdLndvcmtlciA9IHdvcmtlcjsKLSAgY2MtPm51bV9wbHVja2VycysrOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgZGVsX3BsdWNrZXIoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgdm9pZCAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3dvcmtlciAqKndvcmtlcikgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGNjLT5udW1fcGx1Y2tlcnM7IGkrKykgewotICAgIGlmIChjYy0+cGx1Y2tlcnNbaV0udGFnID09IHRhZyAmJiBjYy0+cGx1Y2tlcnNbaV0ud29ya2VyID09IHdvcmtlcikgewotICAgICAgY2MtPm51bV9wbHVja2Vycy0tOwotICAgICAgR1BSX1NXQVAocGx1Y2tlciwgY2MtPnBsdWNrZXJzW2ldLCBjYy0+cGx1Y2tlcnNbY2MtPm51bV9wbHVja2Vyc10pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKLX0KLQotZ3JwY19ldmVudCBncnBjX2NvbXBsZXRpb25fcXVldWVfcGx1Y2soZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgdm9pZCAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLCB2b2lkICpyZXNlcnZlZCkgewotICBncnBjX2V2ZW50IHJldDsKLSAgZ3JwY19jcV9jb21wbGV0aW9uICpjOwotICBncnBjX2NxX2NvbXBsZXRpb24gKnByZXY7Ci0gIGdycGNfcG9sbHNldF93b3JrZXIgKndvcmtlciA9IE5VTEw7Ci0gIGdwcl90aW1lc3BlYyBub3c7Ci0gIGludCBmaXJzdF9sb29wID0gMTsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUFJfVElNRVJfQkVHSU4oImdycGNfY29tcGxldGlvbl9xdWV1ZV9wbHVjayIsIDApOwotCi0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfY29tcGxldGlvbl9xdWV1ZV9wbHVjaygiCi0gICAgICAiY2M9JXAsIHRhZz0lcCwgIgotICAgICAgImRlYWRsaW5lPWdwcl90aW1lc3BlYyB7IHR2X3NlYzogJWxsZCwgdHZfbnNlYzogJWQsIGNsb2NrX3R5cGU6ICVkIH0sICIKLSAgICAgICJyZXNlcnZlZD0lcCkiLAotICAgICAgNiwgKGNjLCB0YWcsIChsb25nIGxvbmcpZGVhZGxpbmUudHZfc2VjLCAoaW50KWRlYWRsaW5lLnR2X25zZWMsCi0gICAgICAgICAgKGludClkZWFkbGluZS5jbG9ja190eXBlLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0KLSAgZGVhZGxpbmUgPSBncHJfY29udmVydF9jbG9ja190eXBlKGRlYWRsaW5lLCBHUFJfQ0xPQ0tfTU9OT1RPTklDKTsKLQotICBHUlBDX0NRX0lOVEVSTkFMX1JFRihjYywgInBsdWNrIik7Ci0gIGdwcl9tdV9sb2NrKGNjLT5tdSk7Ci0gIGZvciAoOzspIHsKLSAgICBwcmV2ID0gJmNjLT5jb21wbGV0ZWRfaGVhZDsKLSAgICB3aGlsZSAoKGMgPSAoZ3JwY19jcV9jb21wbGV0aW9uICopKHByZXYtPm5leHQgJiB+KHVpbnRwdHJfdCkxKSkgIT0KLSAgICAgICAgICAgJmNjLT5jb21wbGV0ZWRfaGVhZCkgewotICAgICAgaWYgKGMtPnRhZyA9PSB0YWcpIHsKLSAgICAgICAgcHJldi0+bmV4dCA9IChwcmV2LT5uZXh0ICYgKHVpbnRwdHJfdCkxKSB8IChjLT5uZXh0ICYgfih1aW50cHRyX3QpMSk7Ci0gICAgICAgIGlmIChjID09IGNjLT5jb21wbGV0ZWRfdGFpbCkgewotICAgICAgICAgIGNjLT5jb21wbGV0ZWRfdGFpbCA9IHByZXY7Ci0gICAgICAgIH0KLSAgICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOwotICAgICAgICByZXQudHlwZSA9IEdSUENfT1BfQ09NUExFVEU7Ci0gICAgICAgIHJldC5zdWNjZXNzID0gYy0+bmV4dCAmIDF1OwotICAgICAgICByZXQudGFnID0gYy0+dGFnOwotICAgICAgICBjLT5kb25lKCZleGVjX2N0eCwgYy0+ZG9uZV9hcmcsIGMpOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICB9Ci0gICAgICBwcmV2ID0gYzsKLSAgICB9Ci0gICAgaWYgKGNjLT5zaHV0ZG93bikgewotICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOwotICAgICAgbWVtc2V0KCZyZXQsIDAsIHNpemVvZihyZXQpKTsKLSAgICAgIHJldC50eXBlID0gR1JQQ19RVUVVRV9TSFVURE9XTjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoIWFkZF9wbHVja2VyKGNjLCB0YWcsICZ3b3JrZXIpKSB7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywKLSAgICAgICAgICAgICAgIlRvbyBtYW55IG91dHN0YW5kaW5nIGdycGNfY29tcGxldGlvbl9xdWV1ZV9wbHVjayBjYWxsczogbWF4aW11bSAiCi0gICAgICAgICAgICAgICJpcyAlZCIsCi0gICAgICAgICAgICAgIEdSUENfTUFYX0NPTVBMRVRJT05fUVVFVUVfUExVQ0tFUlMpOwotICAgICAgZ3ByX211X3VubG9jayhjYy0+bXUpOwotICAgICAgbWVtc2V0KCZyZXQsIDAsIHNpemVvZihyZXQpKTsKLSAgICAgIC8qIFRPRE8oY3RpbGxlcik6IHNob3VsZCB3ZSB1c2UgYSBkaWZmZXJlbnQgcmVzdWx0IGhlcmUgKi8KLSAgICAgIHJldC50eXBlID0gR1JQQ19RVUVVRV9USU1FT1VUOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5vdyA9IGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQyk7Ci0gICAgaWYgKCFmaXJzdF9sb29wICYmIGdwcl90aW1lX2NtcChub3csIGRlYWRsaW5lKSA+PSAwKSB7Ci0gICAgICBkZWxfcGx1Y2tlcihjYywgdGFnLCAmd29ya2VyKTsKLSAgICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKLSAgICAgIG1lbXNldCgmcmV0LCAwLCBzaXplb2YocmV0KSk7Ci0gICAgICByZXQudHlwZSA9IEdSUENfUVVFVUVfVElNRU9VVDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBmaXJzdF9sb29wID0gMDsKLSAgICAvKiBDaGVjayBhbGFybXMgLSB0aGVzZSBhcmUgYSBnbG9iYWwgcmVzb3VyY2Ugc28gd2UganVzdCBwaW5nCi0gICAgICAgZWFjaCB0aW1lIHRocm91Z2ggb24gZXZlcnkgcG9sbHNldC4KLSAgICAgICBNYXkgdXBkYXRlIGRlYWRsaW5lIHRvIGVuc3VyZSB0aW1lbHkgd2FrZXVwcy4KLSAgICAgICBUT0RPKGN0aWxsZXIpOiBjYW4gdGhpcyB3b3JrIGJlIGxvY2FsaXplZD8gKi8KLSAgICBncHJfdGltZXNwZWMgaXRlcmF0aW9uX2RlYWRsaW5lID0gZGVhZGxpbmU7Ci0gICAgaWYgKGdycGNfdGltZXJfY2hlY2soJmV4ZWNfY3R4LCBub3csICZpdGVyYXRpb25fZGVhZGxpbmUpKSB7Ci0gICAgICBHUFJfVElNRVJfTUFSSygiYWxhcm1fdHJpZ2dlcmVkIiwgMCk7Ci0gICAgICBncHJfbXVfdW5sb2NrKGNjLT5tdSk7Ci0gICAgICBncnBjX2V4ZWNfY3R4X2ZsdXNoKCZleGVjX2N0eCk7Ci0gICAgICBncHJfbXVfbG9jayhjYy0+bXUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX3BvbGxzZXRfd29yaygmZXhlY19jdHgsIFBPTExTRVRfRlJPTV9DUShjYyksICZ3b3JrZXIsIG5vdywKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbl9kZWFkbGluZSk7Ci0gICAgfQotICAgIGRlbF9wbHVja2VyKGNjLCB0YWcsICZ3b3JrZXIpOwotICB9Ci1kb25lOgotICBHUlBDX1NVUkZBQ0VfVFJBQ0VfUkVUVVJORURfRVZFTlQoY2MsICZyZXQpOwotICBHUlBDX0NRX0lOVEVSTkFMX1VOUkVGKGNjLCAicGx1Y2siKTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLQotICBHUFJfVElNRVJfRU5EKCJncnBjX2NvbXBsZXRpb25fcXVldWVfcGx1Y2siLCAwKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBTaHV0ZG93biBzaW1wbHkgZHJvcHMgYSByZWYgdGhhdCB3ZSByZXNlcnZlZCBhdCBjcmVhdGlvbiB0aW1lOyBpZiB3ZSBkcm9wCi0gICB0byB6ZXJvIGhlcmUsIHRoZW4gZW50ZXIgc2h1dGRvd24gbW9kZSBhbmQgd2FrZSB1cCBhbnkgd2FpdGVycyAqLwotdm9pZCBncnBjX2NvbXBsZXRpb25fcXVldWVfc2h1dGRvd24oZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYykgewotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICBHUFJfVElNRVJfQkVHSU4oImdycGNfY29tcGxldGlvbl9xdWV1ZV9zaHV0ZG93biIsIDApOwotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3NodXRkb3duKGNjPSVwKSIsIDEsIChjYykpOwotICBncHJfbXVfbG9jayhjYy0+bXUpOwotICBpZiAoY2MtPnNodXRkb3duX2NhbGxlZCkgewotICAgIGdwcl9tdV91bmxvY2soY2MtPm11KTsKLSAgICBHUFJfVElNRVJfRU5EKCJncnBjX2NvbXBsZXRpb25fcXVldWVfc2h1dGRvd24iLCAwKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY2MtPnNodXRkb3duX2NhbGxlZCA9IDE7Ci0gIGlmIChncHJfdW5yZWYoJmNjLT5wZW5kaW5nX2V2ZW50cykpIHsKLSAgICBHUFJfQVNTRVJUKCFjYy0+c2h1dGRvd24pOwotICAgIGNjLT5zaHV0ZG93biA9IDE7Ci0gICAgZ3JwY19wb2xsc2V0X3NodXRkb3duKCZleGVjX2N0eCwgUE9MTFNFVF9GUk9NX0NRKGNjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNjLT5wb2xsc2V0X3NodXRkb3duX2RvbmUpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soY2MtPm11KTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3NodXRkb3duIiwgMCk7Ci19Ci0KLXZvaWQgZ3JwY19jb21wbGV0aW9uX3F1ZXVlX2Rlc3Ryb3koZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYykgewotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX2Rlc3Ryb3koY2M9JXApIiwgMSwgKGNjKSk7Ci0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX2Rlc3Ryb3kiLCAwKTsKLSAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlX3NodXRkb3duKGNjKTsKLSAgR1JQQ19DUV9JTlRFUk5BTF9VTlJFRihjYywgImRlc3Ryb3kiKTsKLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jb21wbGV0aW9uX3F1ZXVlX2Rlc3Ryb3kiLCAwKTsKLX0KLQotZ3JwY19wb2xsc2V0ICpncnBjX2NxX3BvbGxzZXQoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYykgewotICByZXR1cm4gUE9MTFNFVF9GUk9NX0NRKGNjKTsKLX0KLQotdm9pZCBncnBjX2NxX21hcmtfc2VydmVyX2NxKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MpIHsgY2MtPmlzX3NlcnZlcl9jcSA9IDE7IH0KLQotaW50IGdycGNfY3FfaXNfc2VydmVyX2NxKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MpIHsgcmV0dXJuIGNjLT5pc19zZXJ2ZXJfY3E7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIGIvc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxM2Q4OWMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVJGQUNFX0NPTVBMRVRJT05fUVVFVUVfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9DT01QTEVUSU9OX1FVRVVFX0gKLQotLyogSW50ZXJuYWwgQVBJIGZvciBjb21wbGV0aW9uIHF1ZXVlcyAqLwotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX2NxX2NvbXBsZXRpb24gewotICAvKiogdXNlciBzdXBwbGllZCB0YWcgKi8KLSAgdm9pZCAqdGFnOwotICAvKiogZG9uZSBjYWxsYmFjayAtIGNhbGxlZCB3aGVuIHRoaXMgcXVldWUgZWxlbWVudCBpcyBubyBsb25nZXIKLSAgICAgIG5lZWRlZCBieSB0aGUgY29tcGxldGlvbiBxdWV1ZSAqLwotICB2b2lkICgqZG9uZSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmRvbmVfYXJnLAotICAgICAgICAgICAgICAgc3RydWN0IGdycGNfY3FfY29tcGxldGlvbiAqYyk7Ci0gIHZvaWQgKmRvbmVfYXJnOwotICAvKiogbmV4dCBwb2ludGVyOyBsb3cgYml0IGlzIHVzZWQgdG8gaW5kaWNhdGUgc3VjY2VzcyBvciBub3QgKi8KLSAgdWludHB0cl90IG5leHQ7Ci19IGdycGNfY3FfY29tcGxldGlvbjsKLQotI2lmZGVmIEdSUENfQ1FfUkVGX0NPVU5UX0RFQlVHCi12b2lkIGdycGNfY3FfaW50ZXJuYWxfcmVmKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIGNvbnN0IGNoYXIgKnJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwotdm9pZCBncnBjX2NxX2ludGVybmFsX3VucmVmKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsIGNvbnN0IGNoYXIgKnJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Ci0jZGVmaW5lIEdSUENfQ1FfSU5URVJOQUxfUkVGKGNjLCByZWFzb24pIFwKLSAgZ3JwY19jcV9pbnRlcm5hbF9yZWYoY2MsIHJlYXNvbiwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBHUlBDX0NRX0lOVEVSTkFMX1VOUkVGKGNjLCByZWFzb24pIFwKLSAgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihjYywgcmVhc29uLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZWxzZQotdm9pZCBncnBjX2NxX2ludGVybmFsX3JlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKLXZvaWQgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKLSNkZWZpbmUgR1JQQ19DUV9JTlRFUk5BTF9SRUYoY2MsIHJlYXNvbikgZ3JwY19jcV9pbnRlcm5hbF9yZWYoY2MpCi0jZGVmaW5lIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoY2MsIHJlYXNvbikgZ3JwY19jcV9pbnRlcm5hbF91bnJlZihjYykKLSNlbmRpZgotCi0vKiBGbGFnIHRoYXQgYW4gb3BlcmF0aW9uIGlzIGJlZ2lubmluZzogdGhlIGNvbXBsZXRpb24gY2hhbm5lbCB3aWxsIG5vdCBmaW5pc2gKLSAgIHNodXRkb3duIHVudGlsIGEgY29ycmVuc3BvbmRpbmcgZ3JwY19jcV9lbmRfKiBjYWxsIGlzIG1hZGUuCi0gICBcYSB0YWcgaXMgY3VycmVudGx5IHVzZWQgb25seSBpbiBkZWJ1ZyBidWlsZHMuICovCi12b2lkIGdycGNfY3FfYmVnaW5fb3AoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYywgdm9pZCAqdGFnKTsKLQotLyogUXVldWUgYSBHUlBDX09QX0NPTVBMRVRFRCBvcGVyYXRpb247IHRhZyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHRhZyBwYXNzZWQgdG8KLSAgIGdycGNfY3FfYmVnaW5fb3AgKi8KLXZvaWQgZ3JwY19jcV9lbmRfb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY2MsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKnRhZywgaW50IHN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb25lKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZG9uZV9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NxX2NvbXBsZXRpb24gKnN0b3JhZ2UpLAotICAgICAgICAgICAgICAgICAgICB2b2lkICpkb25lX2FyZywgZ3JwY19jcV9jb21wbGV0aW9uICpzdG9yYWdlKTsKLQotZ3JwY19wb2xsc2V0ICpncnBjX2NxX3BvbGxzZXQoZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjYyk7Ci0KLXZvaWQgZ3JwY19jcV9tYXJrX3NlcnZlcl9jcShncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKLWludCBncnBjX2NxX2lzX3NlcnZlcl9jcShncnBjX2NvbXBsZXRpb25fcXVldWUgKmNjKTsKLQotdm9pZCBncnBjX2NxX2dsb2JhbF9pbml0KHZvaWQpOwotdm9pZCBncnBjX2NxX2dsb2JhbF9zaHV0ZG93bih2b2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVJGQUNFX0NPTVBMRVRJT05fUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyBiL3NyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTM3MmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGdycGMvYnl0ZV9idWZmZXIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi1zdGF0aWMgdm9pZCBhZGRoZHIoZ3ByX3N0cnZlYyAqYnVmLCBncnBjX2V2ZW50ICpldikgewotICBjaGFyICp0bXA7Ci0gIGdwcl9hc3ByaW50ZigmdG1wLCAidGFnOiVwIiwgZXYtPnRhZyk7Ci0gIGdwcl9zdHJ2ZWNfYWRkKGJ1ZiwgdG1wKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmVycnN0cihpbnQgc3VjY2VzcykgeyByZXR1cm4gc3VjY2VzcyA/ICJPSyIgOiAiRVJST1IiOyB9Ci0KLXN0YXRpYyB2b2lkIGFkZGVycihncHJfc3RydmVjICpidWYsIGludCBzdWNjZXNzKSB7Ci0gIGNoYXIgKnRtcDsKLSAgZ3ByX2FzcHJpbnRmKCZ0bXAsICIgJXMiLCBlcnJzdHIoc3VjY2VzcykpOwotICBncHJfc3RydmVjX2FkZChidWYsIHRtcCk7Ci19Ci0KLWNoYXIgKmdycGNfZXZlbnRfc3RyaW5nKGdycGNfZXZlbnQgKmV2KSB7Ci0gIGNoYXIgKm91dDsKLSAgZ3ByX3N0cnZlYyBidWY7Ci0KLSAgaWYgKGV2ID09IE5VTEwpIHJldHVybiBncHJfc3RyZHVwKCJudWxsIik7Ci0KLSAgZ3ByX3N0cnZlY19pbml0KCZidWYpOwotCi0gIHN3aXRjaCAoZXYtPnR5cGUpIHsKLSAgICBjYXNlIEdSUENfUVVFVUVfVElNRU9VVDoKLSAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZidWYsIGdwcl9zdHJkdXAoIlFVRVVFX1RJTUVPVVQiKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfUVVFVUVfU0hVVERPV046Ci0gICAgICBncHJfc3RydmVjX2FkZCgmYnVmLCBncHJfc3RyZHVwKCJRVUVVRV9TSFVURE9XTiIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1JQQ19PUF9DT01QTEVURToKLSAgICAgIGdwcl9zdHJ2ZWNfYWRkKCZidWYsIGdwcl9zdHJkdXAoIk9QX0NPTVBMRVRFOiAiKSk7Ci0gICAgICBhZGRoZHIoJmJ1ZiwgZXYpOwotICAgICAgYWRkZXJyKCZidWYsIGV2LT5zdWNjZXNzKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgb3V0ID0gZ3ByX3N0cnZlY19mbGF0dGVuKCZidWYsIE5VTEwpOwotICBncHJfc3RydmVjX2Rlc3Ryb3koJmJ1Zik7Ci0gIHJldHVybiBvdXQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIGIvc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1OThjZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfU1VSRkFDRV9FVkVOVF9TVFJJTkdfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9FVkVOVF9TVFJJTkdfSAotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0KLS8qIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbiBldmVudC4gTXVzdCBiZSBsYXRlciBmcmVlZCB3aXRoIGdwcl9mcmVlKCkgKi8KLWNoYXIgKmdycGNfZXZlbnRfc3RyaW5nKGdycGNfZXZlbnQgKmV2KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVJGQUNFX0VWRU5UX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL2luaXQuYyBiL3NyYy9jb3JlL3N1cmZhY2UvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzRkYjNlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotLyogVE9ETyhjdGlsbGVyKTogZmluZCBhbm90aGVyIHdheT8gLSBiZXR0ZXIgbm90IHRvIGluY2x1ZGUgY2Vuc3VzIGhlcmUgKi8KLSNpbmNsdWRlICJzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgiCi0KLSNpZm5kZWYgR1JQQ19ERUZBVUxUX05BTUVfUFJFRklYCi0jZGVmaW5lIEdSUENfREVGQVVMVF9OQU1FX1BSRUZJWCAiZG5zOi8vLyIKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9QTFVHSU5TIDEyOAotCi1zdGF0aWMgZ3ByX29uY2UgZ19iYXNpY19pbml0ID0gR1BSX09OQ0VfSU5JVDsKLXN0YXRpYyBncHJfbXUgZ19pbml0X211Owotc3RhdGljIGludCBnX2luaXRpYWxpemF0aW9uczsKLQotc3RhdGljIHZvaWQgZG9fYmFzaWNfaW5pdCh2b2lkKSB7Ci0gIGdwcl9tdV9pbml0KCZnX2luaXRfbXUpOwotICAvKiBUT0RPKGN0aWxsZXIpOiBpZGVhbGx5IHJlbW92ZSB0aGlzIHN0cmljdCBsaW5rYWdlICovCi0gIGdycGNfcmVnaXN0ZXJfcGx1Z2luKGNlbnN1c19ncnBjX3BsdWdpbl9pbml0LCBjZW5zdXNfZ3JwY19wbHVnaW5fZGVzdHJveSk7Ci0gIGdfaW5pdGlhbGl6YXRpb25zID0gMDsKLX0KLQotc3RhdGljIGJvb2wgYXBwZW5kX2ZpbHRlcihncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgdm9pZCAqYXJnKSB7Ci0gIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9hcHBlbmRfZmlsdGVyKAotICAgICAgYnVpbGRlciwgKGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgKilhcmcsIE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgYm9vbCBwcmVwZW5kX2ZpbHRlcihncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgdm9pZCAqYXJnKSB7Ci0gIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKLSAgICAgIGJ1aWxkZXIsIChjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICopYXJnLCBOVUxMLCBOVUxMKTsKLX0KLQotc3RhdGljIGJvb2wgbWF5YmVfYWRkX2h0dHBfZmlsdGVyKGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykgewotICBncnBjX3RyYW5zcG9ydCAqdCA9IGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF90cmFuc3BvcnQoYnVpbGRlcik7Ci0gIGlmICh0ICYmIHN0cnN0cih0LT52dGFibGUtPm5hbWUsICJodHRwIikpIHsKLSAgICByZXR1cm4gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfcHJlcGVuZF9maWx0ZXIoCi0gICAgICAgIGJ1aWxkZXIsIChjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyICopYXJnLCBOVUxMLCBOVUxMKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfYnVpbHRpbl9jaGFubmVsX2luaXQoKSB7Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX0NIQU5ORUwsIElOVF9NQVgsIHByZXBlbmRfZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZncnBjX2NvbXByZXNzX2ZpbHRlcik7Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19jb21wcmVzc19maWx0ZXIpOwotICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX1NFUlZFUl9DSEFOTkVMLCBJTlRfTUFYLCBwcmVwZW5kX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZ3JwY19jb21wcmVzc19maWx0ZXIpOwotICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX0NMSUVOVF9TVUJDSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZV9hZGRfaHR0cF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmdycGNfaHR0cF9jbGllbnRfZmlsdGVyKTsKLSAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfU1VCQ0hBTk5FTCwgSU5UX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hZGRfY29ubmVjdGVkX2ZpbHRlciwgTlVMTCk7Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZV9hZGRfaHR0cF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmdycGNfaHR0cF9jbGllbnRfZmlsdGVyKTsKLSAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfRElSRUNUX0NIQU5ORUwsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYWRkX2Nvbm5lY3RlZF9maWx0ZXIsIE5VTEwpOwotICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX1NFUlZFUl9DSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZV9hZGRfaHR0cF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmdycGNfaHR0cF9zZXJ2ZXJfZmlsdGVyKTsKLSAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19TRVJWRVJfQ0hBTk5FTCwgSU5UX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hZGRfY29ubmVjdGVkX2ZpbHRlciwgTlVMTCk7Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX0NIQU5ORUwsIElOVF9NQVgsIGFwcGVuZF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmdycGNfY2xpZW50X2NoYW5uZWxfZmlsdGVyKTsKLSAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19DTElFTlRfTEFNRV9DSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfZmlsdGVyLCAodm9pZCAqKSZncnBjX2xhbWVfZmlsdGVyKTsKLSAgZ3JwY19jaGFubmVsX2luaXRfcmVnaXN0ZXJfc3RhZ2UoR1JQQ19TRVJWRVJfQ0hBTk5FTCwgSU5UX01BWCwgcHJlcGVuZF9maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmdycGNfc2VydmVyX3RvcF9maWx0ZXIpOwotfQotCi10eXBlZGVmIHN0cnVjdCBncnBjX3BsdWdpbiB7Ci0gIHZvaWQgKCppbml0KSgpOwotICB2b2lkICgqZGVzdHJveSkoKTsKLX0gZ3JwY19wbHVnaW47Ci0KLXN0YXRpYyBncnBjX3BsdWdpbiBnX2FsbF9vZl90aGVfcGx1Z2luc1tNQVhfUExVR0lOU107Ci1zdGF0aWMgaW50IGdfbnVtYmVyX29mX3BsdWdpbnMgPSAwOwotCi12b2lkIGdycGNfcmVnaXN0ZXJfcGx1Z2luKHZvaWQgKCppbml0KSh2b2lkKSwgdm9pZCAoKmRlc3Ryb3kpKHZvaWQpKSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX3JlZ2lzdGVyX3BsdWdpbihpbml0PSVwLCBkZXN0cm95PSVwKSIsIDIsCi0gICAgICAgICAgICAgICAgICgodm9pZCAqKShpbnRwdHJfdClpbml0LCAodm9pZCAqKShpbnRwdHJfdClkZXN0cm95KSk7Ci0gIEdQUl9BU1NFUlQoZ19udW1iZXJfb2ZfcGx1Z2lucyAhPSBNQVhfUExVR0lOUyk7Ci0gIGdfYWxsX29mX3RoZV9wbHVnaW5zW2dfbnVtYmVyX29mX3BsdWdpbnNdLmluaXQgPSBpbml0OwotICBnX2FsbF9vZl90aGVfcGx1Z2luc1tnX251bWJlcl9vZl9wbHVnaW5zXS5kZXN0cm95ID0gZGVzdHJveTsKLSAgZ19udW1iZXJfb2ZfcGx1Z2lucysrOwotfQotCi12b2lkIGdycGNfaW5pdCh2b2lkKSB7Ci0gIGludCBpOwotICBncHJfb25jZV9pbml0KCZnX2Jhc2ljX2luaXQsIGRvX2Jhc2ljX2luaXQpOwotCi0gIGdwcl9tdV9sb2NrKCZnX2luaXRfbXUpOwotICBpZiAoKytnX2luaXRpYWxpemF0aW9ucyA9PSAxKSB7Ci0gICAgZ3ByX3RpbWVfaW5pdCgpOwotICAgIGdycGNfbWRjdHhfZ2xvYmFsX2luaXQoKTsKLSAgICBncnBjX2NoYW5uZWxfaW5pdF9pbml0KCk7Ci0gICAgZ3JwY19sYl9wb2xpY3lfcmVnaXN0cnlfaW5pdChncnBjX3BpY2tfZmlyc3RfbGJfZmFjdG9yeV9jcmVhdGUoKSk7Ci0gICAgZ3JwY19yZWdpc3Rlcl9sYl9wb2xpY3koZ3JwY19waWNrX2ZpcnN0X2xiX2ZhY3RvcnlfY3JlYXRlKCkpOwotICAgIGdycGNfcmVnaXN0ZXJfbGJfcG9saWN5KGdycGNfcm91bmRfcm9iaW5fbGJfZmFjdG9yeV9jcmVhdGUoKSk7Ci0gICAgZ3JwY19yZXNvbHZlcl9yZWdpc3RyeV9pbml0KEdSUENfREVGQVVMVF9OQU1FX1BSRUZJWCk7Ci0gICAgZ3JwY19yZWdpc3Rlcl9yZXNvbHZlcl90eXBlKGdycGNfZG5zX3Jlc29sdmVyX2ZhY3RvcnlfY3JlYXRlKCkpOwotICAgIGdycGNfcmVnaXN0ZXJfcmVzb2x2ZXJfdHlwZShncnBjX2lwdjRfcmVzb2x2ZXJfZmFjdG9yeV9jcmVhdGUoKSk7Ci0gICAgZ3JwY19yZWdpc3Rlcl9yZXNvbHZlcl90eXBlKGdycGNfaXB2Nl9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSgpKTsKLSNpZmRlZiBHUFJfUE9TSVhfU09DS0VUCi0gICAgZ3JwY19yZWdpc3Rlcl9yZXNvbHZlcl90eXBlKGdycGNfdW5peF9yZXNvbHZlcl9mYWN0b3J5X2NyZWF0ZSgpKTsKLSNlbmRpZgotICAgIGdycGNfcmVnaXN0ZXJfdHJhY2VyKCJhcGkiLCAmZ3JwY19hcGlfdHJhY2UpOwotICAgIGdycGNfcmVnaXN0ZXJfdHJhY2VyKCJjaGFubmVsIiwgJmdycGNfdHJhY2VfY2hhbm5lbCk7Ci0gICAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoImh0dHAiLCAmZ3JwY19odHRwX3RyYWNlKTsKLSAgICBncnBjX3JlZ2lzdGVyX3RyYWNlcigiZmxvd2N0bCIsICZncnBjX2Zsb3djdGxfdHJhY2UpOwotICAgIGdycGNfcmVnaXN0ZXJfdHJhY2VyKCJjb25uZWN0aXZpdHlfc3RhdGUiLCAmZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2UpOwotICAgIGdycGNfcmVnaXN0ZXJfdHJhY2VyKCJjaGFubmVsX3N0YWNrX2J1aWxkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICZncnBjX3RyYWNlX2NoYW5uZWxfc3RhY2tfYnVpbGRlcik7Ci0gICAgZ3JwY19zZWN1cml0eV9wcmVfaW5pdCgpOwotICAgIGdycGNfaW9tZ3JfaW5pdCgpOwotICAgIGdycGNfZXhlY3V0b3JfaW5pdCgpOwotICAgIGdycGNfdHJhY2VyX2luaXQoIkdSUENfVFJBQ0UiKTsKLSAgICBncHJfdGltZXJzX2dsb2JhbF9pbml0KCk7Ci0gICAgZ3JwY19jcV9nbG9iYWxfaW5pdCgpOwotICAgIGdycGNfc3ViY2hhbm5lbF9pbmRleF9pbml0KCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGdfbnVtYmVyX29mX3BsdWdpbnM7IGkrKykgewotICAgICAgaWYgKGdfYWxsX29mX3RoZV9wbHVnaW5zW2ldLmluaXQgIT0gTlVMTCkgewotICAgICAgICBnX2FsbF9vZl90aGVfcGx1Z2luc1tpXS5pbml0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIHJlZ2lzdGVyIGNoYW5uZWwgZmluYWxpemF0aW9uIEFGVEVSIGFsbCBwbHVnaW5zLCB0byBlbnN1cmUgdGhhdCBpdCdzIHJ1bgotICAgICAqIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lICovCi0gICAgZ3JwY19yZWdpc3Rlcl9zZWN1cml0eV9maWx0ZXJzKCk7Ci0gICAgcmVnaXN0ZXJfYnVpbHRpbl9jaGFubmVsX2luaXQoKTsKLSAgICAvKiBubyBtb3JlIGNoYW5nZXMgdG8gY2hhbm5lbCBpbml0IHBpcGVsaW5lcyAqLwotICAgIGdycGNfY2hhbm5lbF9pbml0X2ZpbmFsaXplKCk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmZ19pbml0X211KTsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfaW5pdCh2b2lkKSIsIDAsICgpKTsKLX0KLQotdm9pZCBncnBjX3NodXRkb3duKHZvaWQpIHsKLSAgaW50IGk7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX3NodXRkb3duKHZvaWQpIiwgMCwgKCkpOwotICBncHJfbXVfbG9jaygmZ19pbml0X211KTsKLSAgaWYgKC0tZ19pbml0aWFsaXphdGlvbnMgPT0gMCkgewotICAgIGdycGNfZXhlY3V0b3Jfc2h1dGRvd24oKTsKLSAgICBncnBjX2NxX2dsb2JhbF9zaHV0ZG93bigpOwotICAgIGdycGNfaW9tZ3Jfc2h1dGRvd24oKTsKLSAgICBncnBjX3N1YmNoYW5uZWxfaW5kZXhfc2h1dGRvd24oKTsKLSAgICBncHJfdGltZXJzX2dsb2JhbF9kZXN0cm95KCk7Ci0gICAgZ3JwY190cmFjZXJfc2h1dGRvd24oKTsKLSAgICBncnBjX3Jlc29sdmVyX3JlZ2lzdHJ5X3NodXRkb3duKCk7Ci0gICAgZ3JwY19sYl9wb2xpY3lfcmVnaXN0cnlfc2h1dGRvd24oKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZ19udW1iZXJfb2ZfcGx1Z2luczsgaSsrKSB7Ci0gICAgICBpZiAoZ19hbGxfb2ZfdGhlX3BsdWdpbnNbaV0uZGVzdHJveSAhPSBOVUxMKSB7Ci0gICAgICAgIGdfYWxsX29mX3RoZV9wbHVnaW5zW2ldLmRlc3Ryb3koKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ3JwY19jaGFubmVsX2luaXRfc2h1dGRvd24oKTsKLSAgICBncnBjX21kY3R4X2dsb2JhbF9zaHV0ZG93bigpOwotICB9Ci0gIGdwcl9tdV91bmxvY2soJmdfaW5pdF9tdSk7Ci19Ci0KLWludCBncnBjX2lzX2luaXRpYWxpemVkKHZvaWQpIHsKLSAgaW50IHI7Ci0gIGdwcl9vbmNlX2luaXQoJmdfYmFzaWNfaW5pdCwgZG9fYmFzaWNfaW5pdCk7Ci0gIGdwcl9tdV9sb2NrKCZnX2luaXRfbXUpOwotICByID0gZ19pbml0aWFsaXphdGlvbnMgPiAwOwotICBncHJfbXVfdW5sb2NrKCZnX2luaXRfbXUpOwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvaW5pdC5oIGIvc3JjL2NvcmUvc3VyZmFjZS9pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzU4YzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVJGQUNFX0lOSVRfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9JTklUX0gKLQotdm9pZCBncnBjX3JlZ2lzdGVyX3NlY3VyaXR5X2ZpbHRlcnModm9pZCk7Ci12b2lkIGdycGNfc2VjdXJpdHlfcHJlX2luaXQodm9pZCk7Ci1pbnQgZ3JwY19pc19pbml0aWFsaXplZCh2b2lkKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVJGQUNFX0lOSVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jIGIvc3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGQ2NmE4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvaW5pdF9zZWN1cmUuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2luaXQuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvZGVidWcvdHJhY2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLQotdm9pZCBncnBjX3NlY3VyaXR5X3ByZV9pbml0KHZvaWQpIHsKLSAgZ3JwY19yZWdpc3Rlcl90cmFjZXIoInNlY3VyZV9lbmRwb2ludCIsICZncnBjX3RyYWNlX3NlY3VyZV9lbmRwb2ludCk7Ci0gIGdycGNfcmVnaXN0ZXJfdHJhY2VyKCJ0cmFuc3BvcnRfc2VjdXJpdHkiLCAmdHNpX3RyYWNpbmdfZW5hYmxlZCk7Ci19Ci0KLXN0YXRpYyBib29sIG1heWJlX3ByZXBlbmRfY2xpZW50X2F1dGhfZmlsdGVyKAotICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyICpidWlsZGVyLCB2b2lkICphcmcpIHsKLSAgY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MgPQotICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfZ2V0X2NoYW5uZWxfYXJndW1lbnRzKGJ1aWxkZXIpOwotICBpZiAoYXJncykgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy0+bnVtX2FyZ3M7IGkrKykgewotICAgICAgaWYgKDAgPT0gc3RyY21wKEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX0FSRywgYXJncy0+YXJnc1tpXS5rZXkpKSB7Ci0gICAgICAgIHJldHVybiBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlcl9wcmVwZW5kX2ZpbHRlcigKLSAgICAgICAgICAgIGJ1aWxkZXIsICZncnBjX2NsaWVudF9hdXRoX2ZpbHRlciwgTlVMTCwgTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBtYXliZV9wcmVwZW5kX3NlcnZlcl9hdXRoX2ZpbHRlcigKLSAgICBncnBjX2NoYW5uZWxfc3RhY2tfYnVpbGRlciAqYnVpbGRlciwgdm9pZCAqYXJnKSB7Ci0gIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzID0KLSAgICAgIGdycGNfY2hhbm5lbF9zdGFja19idWlsZGVyX2dldF9jaGFubmVsX2FyZ3VtZW50cyhidWlsZGVyKTsKLSAgaWYgKGFyZ3MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3MtPm51bV9hcmdzOyBpKyspIHsKLSAgICAgIGlmICgwID09IHN0cmNtcChHUlBDX1NFUlZFUl9DUkVERU5USUFMU19BUkcsIGFyZ3MtPmFyZ3NbaV0ua2V5KSkgewotICAgICAgICByZXR1cm4gZ3JwY19jaGFubmVsX3N0YWNrX2J1aWxkZXJfcHJlcGVuZF9maWx0ZXIoCi0gICAgICAgICAgICBidWlsZGVyLCAmZ3JwY19zZXJ2ZXJfYXV0aF9maWx0ZXIsIE5VTEwsIE5VTEwpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBncnBjX3JlZ2lzdGVyX3NlY3VyaXR5X2ZpbHRlcnModm9pZCkgewotICBncnBjX2NoYW5uZWxfaW5pdF9yZWdpc3Rlcl9zdGFnZShHUlBDX0NMSUVOVF9TVUJDSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZV9wcmVwZW5kX2NsaWVudF9hdXRoX2ZpbHRlciwgTlVMTCk7Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfQ0xJRU5UX0RJUkVDVF9DSEFOTkVMLCBJTlRfTUFYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZV9wcmVwZW5kX2NsaWVudF9hdXRoX2ZpbHRlciwgTlVMTCk7Ci0gIGdycGNfY2hhbm5lbF9pbml0X3JlZ2lzdGVyX3N0YWdlKEdSUENfU0VSVkVSX0NIQU5ORUwsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlX3ByZXBlbmRfc2VydmVyX2F1dGhfZmlsdGVyLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2UvaW5pdF91bnNlY3VyZS5jIGIvc3JjL2NvcmUvc3VyZmFjZS9pbml0X3Vuc2VjdXJlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OGZjYzguLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9pbml0X3Vuc2VjdXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmgiCi0KLXZvaWQgZ3JwY19zZWN1cml0eV9wcmVfaW5pdCh2b2lkKSB7fQotCi12b2lkIGdycGNfcmVnaXN0ZXJfc2VjdXJpdHlfZmlsdGVycyh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jIGIvc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWYzYTc0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oIgotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIHN0YXR1czsKLSAgZ3JwY19saW5rZWRfbWRlbGVtIGRldGFpbHM7Ci19IGNhbGxfZGF0YTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX3N0YXR1c19jb2RlIGVycm9yX2NvZGU7Ci0gIGNvbnN0IGNoYXIgKmVycm9yX21lc3NhZ2U7Ci19IGNoYW5uZWxfZGF0YTsKLQotc3RhdGljIHZvaWQgZmlsbF9tZXRhZGF0YShncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwgZ3JwY19tZXRhZGF0YV9iYXRjaCAqbWRiKSB7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGNoYXIgdG1wW0dQUl9MVE9BX01JTl9CVUZTSVpFXTsKLSAgZ3ByX2x0b2EoY2hhbmQtPmVycm9yX2NvZGUsIHRtcCk7Ci0gIGNhbGxkLT5zdGF0dXMubWQgPSBncnBjX21kZWxlbV9mcm9tX3N0cmluZ3MoImdycGMtc3RhdHVzIiwgdG1wKTsKLSAgY2FsbGQtPmRldGFpbHMubWQgPQotICAgICAgZ3JwY19tZGVsZW1fZnJvbV9zdHJpbmdzKCJncnBjLW1lc3NhZ2UiLCBjaGFuZC0+ZXJyb3JfbWVzc2FnZSk7Ci0gIGNhbGxkLT5zdGF0dXMucHJldiA9IGNhbGxkLT5kZXRhaWxzLm5leHQgPSBOVUxMOwotICBjYWxsZC0+c3RhdHVzLm5leHQgPSAmY2FsbGQtPmRldGFpbHM7Ci0gIGNhbGxkLT5kZXRhaWxzLnByZXYgPSAmY2FsbGQtPnN0YXR1czsKLSAgbWRiLT5saXN0LmhlYWQgPSAmY2FsbGQtPnN0YXR1czsKLSAgbWRiLT5saXN0LnRhaWwgPSAmY2FsbGQtPmRldGFpbHM7Ci0gIG1kYi0+ZGVhZGxpbmUgPSBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfUkVBTFRJTUUpOwotfQotCi1zdGF0aWMgdm9pZCBsYW1lX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgewotICBHUlBDX0NBTExfTE9HX09QKEdQUl9JTkZPLCBlbGVtLCBvcCk7Ci0gIGlmIChvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBmaWxsX21ldGFkYXRhKGVsZW0sIG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKG9wLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBmaWxsX21ldGFkYXRhKGVsZW0sIG9wLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhKTsKLSAgfQotICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZShleGVjX2N0eCwgb3ApOwotfQotCi1zdGF0aWMgY2hhciAqbGFtZV9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0pIHsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGxhbWVfc3RhcnRfdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3ApIHsKLSAgaWYgKG9wLT5vbl9jb25uZWN0aXZpdHlfc3RhdGVfY2hhbmdlKSB7Ci0gICAgR1BSX0FTU0VSVCgqb3AtPmNvbm5lY3Rpdml0eV9zdGF0ZSAhPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRSk7Ci0gICAgKm9wLT5jb25uZWN0aXZpdHlfc3RhdGUgPSBHUlBDX0NIQU5ORUxfRkFUQUxfRkFJTFVSRTsKLSAgICBvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZS0+Y2IoCi0gICAgICAgIGV4ZWNfY3R4LCBvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZS0+Y2JfYXJnLCAxKTsKLSAgfQotICBpZiAob3AtPm9uX2NvbnN1bWVkICE9IE5VTEwpIHsKLSAgICBvcC0+b25fY29uc3VtZWQtPmNiKGV4ZWNfY3R4LCBvcC0+b25fY29uc3VtZWQtPmNiX2FyZywgMSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncykge30KLQotc3RhdGljIHZvaWQgZGVzdHJveV9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkge30KLQotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgR1BSX0FTU0VSVChhcmdzLT5pc19maXJzdCk7Ci0gIEdQUl9BU1NFUlQoYXJncy0+aXNfbGFzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbF9lbGVtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2VsZW1lbnQgKmVsZW0pIHt9Ci0KLWNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19sYW1lX2ZpbHRlciA9IHsKLSAgICBsYW1lX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AsCi0gICAgbGFtZV9zdGFydF90cmFuc3BvcnRfb3AsCi0gICAgc2l6ZW9mKGNhbGxfZGF0YSksCi0gICAgaW5pdF9jYWxsX2VsZW0sCi0gICAgZ3JwY19jYWxsX3N0YWNrX2lnbm9yZV9zZXRfcG9sbHNldCwKLSAgICBkZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKLSAgICBpbml0X2NoYW5uZWxfZWxlbSwKLSAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKLSAgICBsYW1lX2dldF9wZWVyLAotICAgICJsYW1lLWNsaWVudCIsCi19OwotCi0jZGVmaW5lIENIQU5ORUxfU1RBQ0tfRlJPTV9DSEFOTkVMKGMpICgoZ3JwY19jaGFubmVsX3N0YWNrICopKChjKSArIDEpKQotCi1ncnBjX2NoYW5uZWwgKmdycGNfbGFtZV9jbGllbnRfY2hhbm5lbF9jcmVhdGUoY29uc3QgY2hhciAqdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9tZXNzYWdlKSB7Ci0gIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7Ci0gIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtOwotICBjaGFubmVsX2RhdGEgKmNoYW5kOwotICBncnBjX2NoYW5uZWwgKmNoYW5uZWwgPSBncnBjX2NoYW5uZWxfY3JlYXRlKCZleGVjX2N0eCwgdGFyZ2V0LCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0xJRU5UX0xBTUVfQ0hBTk5FTCwgTlVMTCk7Ci0gIGVsZW0gPSBncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudChncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCksIDApOwotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX2xhbWVfY2xpZW50X2NoYW5uZWxfY3JlYXRlKHRhcmdldD0lcywgZXJyb3JfY29kZT0lZCwgIgotICAgICAgImVycm9yX21lc3NhZ2U9JXMpIiwKLSAgICAgIDMsICh0YXJnZXQsIChpbnQpZXJyb3JfY29kZSwgZXJyb3JfbWVzc2FnZSkpOwotICBHUFJfQVNTRVJUKGVsZW0tPmZpbHRlciA9PSAmZ3JwY19sYW1lX2ZpbHRlcik7Ci0gIGNoYW5kID0gKGNoYW5uZWxfZGF0YSAqKWVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgY2hhbmQtPmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotICBjaGFuZC0+ZXJyb3JfbWVzc2FnZSA9IGVycm9yX21lc3NhZ2U7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIHJldHVybiBjaGFubmVsOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oIGIvc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjNhYmQyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVJGQUNFX0xBTUVfQ0xJRU5UX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NVUkZBQ0VfTEFNRV9DTElFTlRfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0KLWV4dGVybiBjb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfbGFtZV9maWx0ZXI7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VSRkFDRV9MQU1FX0NMSUVOVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMgYi9zcmMvY29yZS9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2JmMTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIKLQotdm9pZCBncnBjX21ldGFkYXRhX2FycmF5X2luaXQoZ3JwY19tZXRhZGF0YV9hcnJheSogYXJyYXkpIHsKLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfbWV0YWRhdGFfYXJyYXlfaW5pdChhcnJheT0lcCkiLCAxLCAoYXJyYXkpKTsKLSAgbWVtc2V0KGFycmF5LCAwLCBzaXplb2YoKmFycmF5KSk7Ci19Ci0KLXZvaWQgZ3JwY19tZXRhZGF0YV9hcnJheV9kZXN0cm95KGdycGNfbWV0YWRhdGFfYXJyYXkqIGFycmF5KSB7Ci0gIEdSUENfQVBJX1RSQUNFKCJncnBjX21ldGFkYXRhX2FycmF5X2Rlc3Ryb3koYXJyYXk9JXApIiwgMSwgKGFycmF5KSk7Ci0gIGdwcl9mcmVlKGFycmF5LT5tZXRhZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIGIvc3JjL2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3NTIyMi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2Nvbm5lY3RvciBiYXNlOwotICBncHJfcmVmY291bnQgcmVmczsKLQotICBncnBjX2NoYW5uZWxfc2VjdXJpdHlfY29ubmVjdG9yICpzZWN1cml0eV9jb25uZWN0b3I7Ci0KLSAgZ3JwY19jbG9zdXJlICpub3RpZnk7Ci0gIGdycGNfY29ubmVjdF9pbl9hcmdzIGFyZ3M7Ci0gIGdycGNfY29ubmVjdF9vdXRfYXJncyAqcmVzdWx0OwotICBncnBjX2Nsb3N1cmUgaW5pdGlhbF9zdHJpbmdfc2VudDsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBpbml0aWFsX3N0cmluZ19idWZmZXI7Ci0KLSAgZ3ByX211IG11OwotICBncnBjX2VuZHBvaW50ICpjb25uZWN0aW5nX2VuZHBvaW50OwotICBncnBjX2VuZHBvaW50ICpuZXdseV9jb25uZWN0aW5nX2VuZHBvaW50OwotCi0gIGdycGNfY2xvc3VyZSBjb25uZWN0ZWRfY2xvc3VyZTsKLX0gY29ubmVjdG9yOwotCi1zdGF0aWMgdm9pZCBjb25uZWN0b3JfcmVmKGdycGNfY29ubmVjdG9yICpjb24pIHsKLSAgY29ubmVjdG9yICpjID0gKGNvbm5lY3RvciAqKWNvbjsKLSAgZ3ByX3JlZigmYy0+cmVmcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rvcl91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0b3IgKmNvbikgewotICBjb25uZWN0b3IgKmMgPSAoY29ubmVjdG9yICopY29uOwotICBpZiAoZ3ByX3VucmVmKCZjLT5yZWZzKSkgewotICAgIC8qIGMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlciBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlc3Ryb3llZCAqLwotICAgIGdwcl9mcmVlKGMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX3NlY3VyZV9oYW5kc2hha2VfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VjdXJpdHlfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICpzZWN1cmVfZW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19hdXRoX2NvbnRleHQgKmF1dGhfY29udGV4dCkgewotICBjb25uZWN0b3IgKmMgPSBhcmc7Ci0gIGdycGNfY2xvc3VyZSAqbm90aWZ5OwotICBncnBjX2NoYW5uZWxfYXJncyAqYXJnc19jb3B5ID0gTlVMTDsKLSAgZ3ByX211X2xvY2soJmMtPm11KTsKLSAgaWYgKGMtPmNvbm5lY3RpbmdfZW5kcG9pbnQgPT0gTlVMTCkgewotICAgIG1lbXNldChjLT5yZXN1bHQsIDAsIHNpemVvZigqYy0+cmVzdWx0KSk7Ci0gICAgZ3ByX211X3VubG9jaygmYy0+bXUpOwotICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBHUlBDX1NFQ1VSSVRZX09LKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJTZWN1cmUgaGFuZHNoYWtlIGZhaWxlZCB3aXRoIGVycm9yICVkLiIsIHN0YXR1cyk7Ci0gICAgbWVtc2V0KGMtPnJlc3VsdCwgMCwgc2l6ZW9mKCpjLT5yZXN1bHQpKTsKLSAgICBjLT5jb25uZWN0aW5nX2VuZHBvaW50ID0gTlVMTDsKLSAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3JwY19hcmcgYXV0aF9jb250ZXh0X2FyZzsKLSAgICBjLT5jb25uZWN0aW5nX2VuZHBvaW50ID0gTlVMTDsKLSAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gICAgYy0+cmVzdWx0LT50cmFuc3BvcnQgPSBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAotICAgICAgICBleGVjX2N0eCwgYy0+YXJncy5jaGFubmVsX2FyZ3MsIHNlY3VyZV9lbmRwb2ludCwgMSk7Ci0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3N0YXJ0X3JlYWRpbmcoZXhlY19jdHgsIGMtPnJlc3VsdC0+dHJhbnNwb3J0LCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgIGF1dGhfY29udGV4dF9hcmcgPSBncnBjX2F1dGhfY29udGV4dF90b19hcmcoYXV0aF9jb250ZXh0KTsKLSAgICBhcmdzX2NvcHkgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5X2FuZF9hZGQoYy0+YXJncy5jaGFubmVsX2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRoX2NvbnRleHRfYXJnLCAxKTsKLSAgICBjLT5yZXN1bHQtPmNoYW5uZWxfYXJncyA9IGFyZ3NfY29weTsKLSAgfQotICBub3RpZnkgPSBjLT5ub3RpZnk7Ci0gIGMtPm5vdGlmeSA9IE5VTEw7Ci0gIC8qIGxvb2sgYXQgYy0+YXJncyB3aGljaCBhcmUgY29ubmVjdG9yIGFyZ3MuICovCi0gIG5vdGlmeS0+Y2IoZXhlY19jdHgsIG5vdGlmeS0+Y2JfYXJnLCAxKTsKLSAgaWYgKGFyZ3NfY29weSAhPSBOVUxMKSBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGFyZ3NfY29weSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX2luaXRpYWxfY29ubmVjdF9zdHJpbmdfc2VudChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBjb25uZWN0b3IgKmMgPSBhcmc7Ci0gIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3JfZG9faGFuZHNoYWtlKGV4ZWNfY3R4LCBjLT5zZWN1cml0eV9jb25uZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNvbm5lY3RpbmdfZW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3NlY3VyZV9oYW5kc2hha2VfZG9uZSwgYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3RlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHsKLSAgY29ubmVjdG9yICpjID0gYXJnOwotICBncnBjX2Nsb3N1cmUgKm5vdGlmeTsKLSAgZ3JwY19lbmRwb2ludCAqdGNwID0gYy0+bmV3bHlfY29ubmVjdGluZ19lbmRwb2ludDsKLSAgaWYgKHRjcCAhPSBOVUxMKSB7Ci0gICAgZ3ByX211X2xvY2soJmMtPm11KTsKLSAgICBHUFJfQVNTRVJUKGMtPmNvbm5lY3RpbmdfZW5kcG9pbnQgPT0gTlVMTCk7Ci0gICAgYy0+Y29ubmVjdGluZ19lbmRwb2ludCA9IHRjcDsKLSAgICBncHJfbXVfdW5sb2NrKCZjLT5tdSk7Ci0gICAgaWYgKCFHUFJfU0xJQ0VfSVNfRU1QVFkoYy0+YXJncy5pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nKSkgewotICAgICAgZ3JwY19jbG9zdXJlX2luaXQoJmMtPmluaXRpYWxfc3RyaW5nX3NlbnQsIG9uX2luaXRpYWxfY29ubmVjdF9zdHJpbmdfc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMpOwotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZjLT5pbml0aWFsX3N0cmluZ19idWZmZXIpOwotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJmMtPmluaXRpYWxfc3RyaW5nX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFyZ3MuaW5pdGlhbF9jb25uZWN0X3N0cmluZyk7Ci0gICAgICBncnBjX2VuZHBvaW50X3dyaXRlKGV4ZWNfY3R4LCB0Y3AsICZjLT5pbml0aWFsX3N0cmluZ19idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5pbml0aWFsX3N0cmluZ19zZW50KTsKLSAgICB9IGVsc2UgewotICAgICAgZ3JwY19jaGFubmVsX3NlY3VyaXR5X2Nvbm5lY3Rvcl9kb19oYW5kc2hha2UoCi0gICAgICAgICAgZXhlY19jdHgsIGMtPnNlY3VyaXR5X2Nvbm5lY3RvciwgdGNwLCBvbl9zZWN1cmVfaGFuZHNoYWtlX2RvbmUsIGMpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtZW1zZXQoYy0+cmVzdWx0LCAwLCBzaXplb2YoKmMtPnJlc3VsdCkpOwotICAgIG5vdGlmeSA9IGMtPm5vdGlmeTsKLSAgICBjLT5ub3RpZnkgPSBOVUxMOwotICAgIG5vdGlmeS0+Y2IoZXhlY19jdHgsIG5vdGlmeS0+Y2JfYXJnLCAxKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjb25uZWN0b3Jfc2h1dGRvd24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY29ubmVjdG9yICpjb24pIHsKLSAgY29ubmVjdG9yICpjID0gKGNvbm5lY3RvciAqKWNvbjsKLSAgZ3JwY19lbmRwb2ludCAqZXA7Ci0gIGdwcl9tdV9sb2NrKCZjLT5tdSk7Ci0gIGVwID0gYy0+Y29ubmVjdGluZ19lbmRwb2ludDsKLSAgYy0+Y29ubmVjdGluZ19lbmRwb2ludCA9IE5VTEw7Ci0gIGdwcl9tdV91bmxvY2soJmMtPm11KTsKLSAgaWYgKGVwKSB7Ci0gICAgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihleGVjX2N0eCwgZXApOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rvcl9jb25uZWN0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2Nvbm5lY3RvciAqY29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwY19jb25uZWN0X2luX2FyZ3MgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rfb3V0X2FyZ3MgKnJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqbm90aWZ5KSB7Ci0gIGNvbm5lY3RvciAqYyA9IChjb25uZWN0b3IgKiljb247Ci0gIEdQUl9BU1NFUlQoYy0+bm90aWZ5ID09IE5VTEwpOwotICBHUFJfQVNTRVJUKG5vdGlmeS0+Y2IpOwotICBjLT5ub3RpZnkgPSBub3RpZnk7Ci0gIGMtPmFyZ3MgPSAqYXJnczsKLSAgYy0+cmVzdWx0ID0gcmVzdWx0OwotICBncHJfbXVfbG9jaygmYy0+bXUpOwotICBHUFJfQVNTRVJUKGMtPmNvbm5lY3RpbmdfZW5kcG9pbnQgPT0gTlVMTCk7Ci0gIGdwcl9tdV91bmxvY2soJmMtPm11KTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJmMtPmNvbm5lY3RlZF9jbG9zdXJlLCBjb25uZWN0ZWQsIGMpOwotICBncnBjX3RjcF9jbGllbnRfY29ubmVjdCgKLSAgICAgIGV4ZWNfY3R4LCAmYy0+Y29ubmVjdGVkX2Nsb3N1cmUsICZjLT5uZXdseV9jb25uZWN0aW5nX2VuZHBvaW50LAotICAgICAgYXJncy0+aW50ZXJlc3RlZF9wYXJ0aWVzLCBhcmdzLT5hZGRyLCBhcmdzLT5hZGRyX2xlbiwgYXJncy0+ZGVhZGxpbmUpOwotfQotCi1zdGF0aWMgY29uc3QgZ3JwY19jb25uZWN0b3JfdnRhYmxlIGNvbm5lY3Rvcl92dGFibGUgPSB7Ci0gICAgY29ubmVjdG9yX3JlZiwgY29ubmVjdG9yX3VucmVmLCBjb25uZWN0b3Jfc2h1dGRvd24sIGNvbm5lY3Rvcl9jb25uZWN0fTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSBiYXNlOwotICBncHJfcmVmY291bnQgcmVmczsKLSAgZ3JwY19jaGFubmVsX2FyZ3MgKm1lcmdlX2FyZ3M7Ci0gIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNlY3VyaXR5X2Nvbm5lY3RvcjsKLSAgZ3JwY19jaGFubmVsICptYXN0ZXI7Ci19IHN1YmNoYW5uZWxfZmFjdG9yeTsKLQotc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9mYWN0b3J5X3JlZihncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc2NmKSB7Ci0gIHN1YmNoYW5uZWxfZmFjdG9yeSAqZiA9IChzdWJjaGFubmVsX2ZhY3RvcnkgKilzY2Y7Ci0gIGdwcl9yZWYoJmYtPnJlZnMpOwotfQotCi1zdGF0aWMgdm9pZCBzdWJjaGFubmVsX2ZhY3RvcnlfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnNjZikgewotICBzdWJjaGFubmVsX2ZhY3RvcnkgKmYgPSAoc3ViY2hhbm5lbF9mYWN0b3J5ICopc2NmOwotICBpZiAoZ3ByX3VucmVmKCZmLT5yZWZzKSkgewotICAgIEdSUENfU0VDVVJJVFlfQ09OTkVDVE9SX1VOUkVGKCZmLT5zZWN1cml0eV9jb25uZWN0b3ItPmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YmNoYW5uZWxfZmFjdG9yeSIpOwotICAgIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9VTlJFRihleGVjX2N0eCwgZi0+bWFzdGVyLCAic3ViY2hhbm5lbF9mYWN0b3J5Iik7Ci0gICAgZ3JwY19jaGFubmVsX2FyZ3NfZGVzdHJveShmLT5tZXJnZV9hcmdzKTsKLSAgICBncHJfZnJlZShmKTsKLSAgfQotfQotCi1zdGF0aWMgZ3JwY19zdWJjaGFubmVsICpzdWJjaGFubmVsX2ZhY3RvcnlfY3JlYXRlX3N1YmNoYW5uZWwoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzY2YsCi0gICAgZ3JwY19zdWJjaGFubmVsX2FyZ3MgKmFyZ3MpIHsKLSAgc3ViY2hhbm5lbF9mYWN0b3J5ICpmID0gKHN1YmNoYW5uZWxfZmFjdG9yeSAqKXNjZjsKLSAgY29ubmVjdG9yICpjID0gZ3ByX21hbGxvYyhzaXplb2YoKmMpKTsKLSAgZ3JwY19jaGFubmVsX2FyZ3MgKmZpbmFsX2FyZ3MgPQotICAgICAgZ3JwY19jaGFubmVsX2FyZ3NfbWVyZ2UoYXJncy0+YXJncywgZi0+bWVyZ2VfYXJncyk7Ci0gIGdycGNfc3ViY2hhbm5lbCAqczsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOwotICBjLT5iYXNlLnZ0YWJsZSA9ICZjb25uZWN0b3JfdnRhYmxlOwotICBjLT5zZWN1cml0eV9jb25uZWN0b3IgPSBmLT5zZWN1cml0eV9jb25uZWN0b3I7Ci0gIGdwcl9tdV9pbml0KCZjLT5tdSk7Ci0gIGdwcl9yZWZfaW5pdCgmYy0+cmVmcywgMSk7Ci0gIGFyZ3MtPmFyZ3MgPSBmaW5hbF9hcmdzOwotICBzID0gZ3JwY19zdWJjaGFubmVsX2NyZWF0ZShleGVjX2N0eCwgJmMtPmJhc2UsIGFyZ3MpOwotICBncnBjX2Nvbm5lY3Rvcl91bnJlZihleGVjX2N0eCwgJmMtPmJhc2UpOwotICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KGZpbmFsX2FyZ3MpOwotICByZXR1cm4gczsKLX0KLQotc3RhdGljIGNvbnN0IGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5X3Z0YWJsZSBzdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlID0gewotICAgIHN1YmNoYW5uZWxfZmFjdG9yeV9yZWYsIHN1YmNoYW5uZWxfZmFjdG9yeV91bnJlZiwKLSAgICBzdWJjaGFubmVsX2ZhY3RvcnlfY3JlYXRlX3N1YmNoYW5uZWx9OwotCi0vKiBDcmVhdGUgYSBzZWN1cmUgY2xpZW50IGNoYW5uZWw6Ci0gICBBc3luY2hyb25vdXNseTogLSByZXNvbHZlIHRhcmdldAotICAgICAgICAgICAgICAgICAgIC0gY29ubmVjdCB0byBpdCAodHJ5aW5nIGFsdGVybmF0aXZlcyBhcyBwcmVzZW50ZWQpCi0gICAgICAgICAgICAgICAgICAgLSBwZXJmb3JtIGhhbmRzaGFrZXMgKi8KLWdycGNfY2hhbm5lbCAqZ3JwY19zZWN1cmVfY2hhbm5lbF9jcmVhdGUoZ3JwY19jaGFubmVsX2NyZWRlbnRpYWxzICpjcmVkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgZ3JwY19jaGFubmVsICpjaGFubmVsOwotICBncnBjX2FyZyBjb25uZWN0b3JfYXJnOwotICBncnBjX2NoYW5uZWxfYXJncyAqYXJnc19jb3B5OwotICBncnBjX2NoYW5uZWxfYXJncyAqbmV3X2FyZ3NfZnJvbV9jb25uZWN0b3I7Ci0gIGdycGNfY2hhbm5lbF9zZWN1cml0eV9jb25uZWN0b3IgKnNlY3VyaXR5X2Nvbm5lY3RvcjsKLSAgZ3JwY19yZXNvbHZlciAqcmVzb2x2ZXI7Ci0gIHN1YmNoYW5uZWxfZmFjdG9yeSAqZjsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX3NlY3VyZV9jaGFubmVsX2NyZWF0ZShjcmVkcz0lcCwgdGFyZ2V0PSVzLCBhcmdzPSVwLCAiCi0gICAgICAicmVzZXJ2ZWQ9JXApIiwKLSAgICAgIDQsIChjcmVkcywgdGFyZ2V0LCBhcmdzLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKHJlc2VydmVkID09IE5VTEwpOwotCi0gIGlmIChncnBjX2ZpbmRfc2VjdXJpdHlfY29ubmVjdG9yX2luX2FyZ3MoYXJncykgIT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ2Fubm90IHNldCBzZWN1cml0eSBjb250ZXh0IGluIGNoYW5uZWwgYXJncy4iKTsKLSAgICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotICAgIHJldHVybiBncnBjX2xhbWVfY2xpZW50X2NoYW5uZWxfY3JlYXRlKAotICAgICAgICB0YXJnZXQsIEdSUENfU1RBVFVTX0lOVkFMSURfQVJHVU1FTlQsCi0gICAgICAgICJTZWN1cml0eSBjb25uZWN0b3IgZXhpc3RzIGluIGNoYW5uZWwgYXJncy4iKTsKLSAgfQotCi0gIGlmIChncnBjX2NoYW5uZWxfY3JlZGVudGlhbHNfY3JlYXRlX3NlY3VyaXR5X2Nvbm5lY3RvcigKLSAgICAgICAgICBjcmVkcywgdGFyZ2V0LCBhcmdzLCAmc2VjdXJpdHlfY29ubmVjdG9yLCAmbmV3X2FyZ3NfZnJvbV9jb25uZWN0b3IpICE9Ci0gICAgICBHUlBDX1NFQ1VSSVRZX09LKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLSAgICByZXR1cm4gZ3JwY19sYW1lX2NsaWVudF9jaGFubmVsX2NyZWF0ZSgKLSAgICAgICAgdGFyZ2V0LCBHUlBDX1NUQVRVU19JTlZBTElEX0FSR1VNRU5ULAotICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBzZWN1cml0eSBjb25uZWN0b3IuIik7Ci0gIH0KLQotICBjb25uZWN0b3JfYXJnID0gZ3JwY19zZWN1cml0eV9jb25uZWN0b3JfdG9fYXJnKCZzZWN1cml0eV9jb25uZWN0b3ItPmJhc2UpOwotICBhcmdzX2NvcHkgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5X2FuZF9hZGQoCi0gICAgICBuZXdfYXJnc19mcm9tX2Nvbm5lY3RvciAhPSBOVUxMID8gbmV3X2FyZ3NfZnJvbV9jb25uZWN0b3IgOiBhcmdzLAotICAgICAgJmNvbm5lY3Rvcl9hcmcsIDEpOwotCi0gIGNoYW5uZWwgPSBncnBjX2NoYW5uZWxfY3JlYXRlKCZleGVjX2N0eCwgdGFyZ2V0LCBhcmdzX2NvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0xJRU5UX0NIQU5ORUwsIE5VTEwpOwotCi0gIGYgPSBncHJfbWFsbG9jKHNpemVvZigqZikpOwotICBmLT5iYXNlLnZ0YWJsZSA9ICZzdWJjaGFubmVsX2ZhY3RvcnlfdnRhYmxlOwotICBncHJfcmVmX2luaXQoJmYtPnJlZnMsIDEpOwotICBHUlBDX1NFQ1VSSVRZX0NPTk5FQ1RPUl9SRUYoJnNlY3VyaXR5X2Nvbm5lY3Rvci0+YmFzZSwgInN1YmNoYW5uZWxfZmFjdG9yeSIpOwotICBmLT5zZWN1cml0eV9jb25uZWN0b3IgPSBzZWN1cml0eV9jb25uZWN0b3I7Ci0gIGYtPm1lcmdlX2FyZ3MgPSBncnBjX2NoYW5uZWxfYXJnc19jb3B5KGFyZ3NfY29weSk7Ci0gIGYtPm1hc3RlciA9IGNoYW5uZWw7Ci0gIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoY2hhbm5lbCwgInN1YmNoYW5uZWxfZmFjdG9yeSIpOwotICByZXNvbHZlciA9IGdycGNfcmVzb2x2ZXJfY3JlYXRlKHRhcmdldCwgJmYtPmJhc2UpOwotICBpZiAocmVzb2x2ZXIpIHsKLSAgICBncnBjX2NsaWVudF9jaGFubmVsX3NldF9yZXNvbHZlcigKLSAgICAgICAgJmV4ZWNfY3R4LCBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCksIHJlc29sdmVyKTsKLSAgICBHUlBDX1JFU09MVkVSX1VOUkVGKCZleGVjX2N0eCwgcmVzb2x2ZXIsICJjcmVhdGUiKTsKLSAgfQotICBncnBjX3N1YmNoYW5uZWxfZmFjdG9yeV91bnJlZigmZXhlY19jdHgsICZmLT5iYXNlKTsKLSAgR1JQQ19TRUNVUklUWV9DT05ORUNUT1JfVU5SRUYoJnNlY3VyaXR5X2Nvbm5lY3Rvci0+YmFzZSwgImNoYW5uZWxfY3JlYXRlIik7Ci0gIGdycGNfY2hhbm5lbF9hcmdzX2Rlc3Ryb3koYXJnc19jb3B5KTsKLSAgaWYgKG5ld19hcmdzX2Zyb21fY29ubmVjdG9yICE9IE5VTEwpIHsKLSAgICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KG5ld19hcmdzX2Zyb21fY29ubmVjdG9yKTsKLSAgfQotCi0gIGlmICghcmVzb2x2ZXIpIHsKLSAgICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfVU5SRUYoJmV4ZWNfY3R4LCBjaGFubmVsLCAic3ViY2hhbm5lbF9mYWN0b3J5Iik7Ci0gICAgY2hhbm5lbCA9IE5VTEw7Ci0gIH0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLQotICByZXR1cm4gY2hhbm5lbDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmMgYi9zcmMvY29yZS9zdXJmYWNlL3NlcnZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTJmMmIzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvaW5pdC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgbGlzdGVuZXIgewotICB2b2lkICphcmc7Ci0gIHZvaWQgKCpzdGFydCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKipwb2xsc2V0cywgc2l6ZV90IHBvbGxzZXRfY291bnQpOwotICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqY2xvc3VyZSk7Ci0gIHN0cnVjdCBsaXN0ZW5lciAqbmV4dDsKLSAgZ3JwY19jbG9zdXJlIGRlc3Ryb3lfZG9uZTsKLX0gbGlzdGVuZXI7Ci0KLXR5cGVkZWYgc3RydWN0IGNhbGxfZGF0YSBjYWxsX2RhdGE7Ci10eXBlZGVmIHN0cnVjdCBjaGFubmVsX2RhdGEgY2hhbm5lbF9kYXRhOwotdHlwZWRlZiBzdHJ1Y3QgcmVnaXN0ZXJlZF9tZXRob2QgcmVnaXN0ZXJlZF9tZXRob2Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2FsbF9kYXRhICpuZXh0OwotICBjYWxsX2RhdGEgKnByZXY7Ci19IGNhbGxfbGluazsKLQotdHlwZWRlZiBlbnVtIHsgQkFUQ0hfQ0FMTCwgUkVHSVNURVJFRF9DQUxMIH0gcmVxdWVzdGVkX2NhbGxfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVxdWVzdGVkX2NhbGwgewotICByZXF1ZXN0ZWRfY2FsbF90eXBlIHR5cGU7Ci0gIHZvaWQgKnRhZzsKLSAgZ3JwY19zZXJ2ZXIgKnNlcnZlcjsKLSAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcV9ib3VuZF90b19jYWxsOwotICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxX2Zvcl9ub3RpZmljYXRpb247Ci0gIGdycGNfY2FsbCAqKmNhbGw7Ci0gIGdycGNfY3FfY29tcGxldGlvbiBjb21wbGV0aW9uOwotICBncnBjX21ldGFkYXRhX2FycmF5ICppbml0aWFsX21ldGFkYXRhOwotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIGdycGNfY2FsbF9kZXRhaWxzICpkZXRhaWxzOwotICAgIH0gYmF0Y2g7Ci0gICAgc3RydWN0IHsKLSAgICAgIHJlZ2lzdGVyZWRfbWV0aG9kICpyZWdpc3RlcmVkX21ldGhvZDsKLSAgICAgIGdwcl90aW1lc3BlYyAqZGVhZGxpbmU7Ci0gICAgICBncnBjX2J5dGVfYnVmZmVyICoqb3B0aW9uYWxfcGF5bG9hZDsKLSAgICB9IHJlZ2lzdGVyZWQ7Ci0gIH0gZGF0YTsKLSAgZ3JwY19jbG9zdXJlIHB1Ymxpc2g7Ci19IHJlcXVlc3RlZF9jYWxsOwotCi10eXBlZGVmIHN0cnVjdCBjaGFubmVsX3JlZ2lzdGVyZWRfbWV0aG9kIHsKLSAgcmVnaXN0ZXJlZF9tZXRob2QgKnNlcnZlcl9yZWdpc3RlcmVkX21ldGhvZDsKLSAgZ3JwY19tZHN0ciAqbWV0aG9kOwotICBncnBjX21kc3RyICpob3N0OwotfSBjaGFubmVsX3JlZ2lzdGVyZWRfbWV0aG9kOwotCi1zdHJ1Y3QgY2hhbm5lbF9kYXRhIHsKLSAgZ3JwY19zZXJ2ZXIgKnNlcnZlcjsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgY29ubmVjdGl2aXR5X3N0YXRlOwotICBncnBjX2NoYW5uZWwgKmNoYW5uZWw7Ci0gIC8qIGxpbmtlZCBsaXN0IG9mIGFsbCBjaGFubmVscyBvbiBhIHNlcnZlciAqLwotICBjaGFubmVsX2RhdGEgKm5leHQ7Ci0gIGNoYW5uZWxfZGF0YSAqcHJldjsKLSAgY2hhbm5lbF9yZWdpc3RlcmVkX21ldGhvZCAqcmVnaXN0ZXJlZF9tZXRob2RzOwotICB1aW50MzJfdCByZWdpc3RlcmVkX21ldGhvZF9zbG90czsKLSAgdWludDMyX3QgcmVnaXN0ZXJlZF9tZXRob2RfbWF4X3Byb2JlczsKLSAgZ3JwY19jbG9zdXJlIGZpbmlzaF9kZXN0cm95X2NoYW5uZWxfY2xvc3VyZTsKLSAgZ3JwY19jbG9zdXJlIGNoYW5uZWxfY29ubmVjdGl2aXR5X2NoYW5nZWQ7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzaHV0ZG93bl90YWcgewotICB2b2lkICp0YWc7Ci0gIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3E7Ci0gIGdycGNfY3FfY29tcGxldGlvbiBjb21wbGV0aW9uOwotfSBzaHV0ZG93bl90YWc7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIHdhaXRpbmcgZm9yIG1ldGFkYXRhICovCi0gIE5PVF9TVEFSVEVELAotICAvKiBpbml0YWwgbWV0YWRhdGEgcmVhZCwgbm90IGZsb3cgY29udHJvbGxlZCBpbiB5ZXQgKi8KLSAgUEVORElORywKLSAgLyogZmxvdyBjb250cm9sbGVkIGluLCBvbiBjb21wbGV0aW9uIHF1ZXVlICovCi0gIEFDVElWQVRFRCwKLSAgLyogY2FuY2VsbGVkIGJlZm9yZSBiZWluZyBxdWV1ZWQgKi8KLSAgWk9NQklFRAotfSBjYWxsX3N0YXRlOwotCi10eXBlZGVmIHN0cnVjdCByZXF1ZXN0X21hdGNoZXIgcmVxdWVzdF9tYXRjaGVyOwotCi1zdHJ1Y3QgY2FsbF9kYXRhIHsKLSAgZ3JwY19jYWxsICpjYWxsOwotCi0gIC8qKiBwcm90ZWN0cyBzdGF0ZSAqLwotICBncHJfbXUgbXVfc3RhdGU7Ci0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGNhbGwgLSBzZWUgY2FsbF9zdGF0ZSAqLwotICBjYWxsX3N0YXRlIHN0YXRlOwotCi0gIGdycGNfbWRzdHIgKnBhdGg7Ci0gIGdycGNfbWRzdHIgKmhvc3Q7Ci0gIGdwcl90aW1lc3BlYyBkZWFkbGluZTsKLQotICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxX25ldzsKLQotICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gIGdycGNfbWV0YWRhdGFfYXJyYXkgaW5pdGlhbF9tZXRhZGF0YTsKLQotICBncnBjX2Nsb3N1cmUgZ290X2luaXRpYWxfbWV0YWRhdGE7Ci0gIGdycGNfY2xvc3VyZSBzZXJ2ZXJfb25fcmVjdl9pbml0aWFsX21ldGFkYXRhOwotICBncnBjX2Nsb3N1cmUga2lsbF96b21iaWVfY2xvc3VyZTsKLSAgZ3JwY19jbG9zdXJlICpvbl9kb25lX3JlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLQotICBjYWxsX2RhdGEgKnBlbmRpbmdfbmV4dDsKLX07Ci0KLXN0cnVjdCByZXF1ZXN0X21hdGNoZXIgewotICBjYWxsX2RhdGEgKnBlbmRpbmdfaGVhZDsKLSAgY2FsbF9kYXRhICpwZW5kaW5nX3RhaWw7Ci0gIGdwcl9zdGFja19sb2NrZnJlZSAqcmVxdWVzdHM7Ci19OwotCi1zdHJ1Y3QgcmVnaXN0ZXJlZF9tZXRob2QgewotICBjaGFyICptZXRob2Q7Ci0gIGNoYXIgKmhvc3Q7Ci0gIHJlcXVlc3RfbWF0Y2hlciByZXF1ZXN0X21hdGNoZXI7Ci0gIHJlZ2lzdGVyZWRfbWV0aG9kICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NoYW5uZWwgKipjaGFubmVsczsKLSAgc2l6ZV90IG51bV9jaGFubmVsczsKLX0gY2hhbm5lbF9icm9hZGNhc3RlcjsKLQotc3RydWN0IGdycGNfc2VydmVyIHsKLSAgZ3JwY19jaGFubmVsX2FyZ3MgKmNoYW5uZWxfYXJnczsKLQotICBncnBjX2NvbXBsZXRpb25fcXVldWUgKipjcXM7Ci0gIGdycGNfcG9sbHNldCAqKnBvbGxzZXRzOwotICBzaXplX3QgY3FfY291bnQ7Ci0KLSAgLyogVGhlIHR3byBmb2xsb3dpbmcgbXV0ZXhlcyBjb250cm9sIGFjY2VzcyB0byBzZXJ2ZXItc3RhdGUKLSAgICAgbXVfZ2xvYmFsIGNvbnRyb2xzIGFjY2VzcyB0byBub24tY2FsbC1yZWxhdGVkIHN0YXRlIChlLmcuLCBjaGFubmVsIHN0YXRlKQotICAgICBtdV9jYWxsIGNvbnRyb2xzIGFjY2VzcyB0byBjYWxsLXJlbGF0ZWQgc3RhdGUgKGUuZy4sIHRoZSBjYWxsIGxpc3RzKQotCi0gICAgIElmIHRoZXkgYXJlIGV2ZXIgcmVxdWlyZWQgdG8gYmUgbmVzdGVkLCB5b3UgbXVzdCBsb2NrIG11X2dsb2JhbAotICAgICBiZWZvcmUgbXVfY2FsbC4gVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBpbiBzaHV0ZG93biBwcm9jZXNzaW5nCi0gICAgIChncnBjX3NlcnZlcl9zaHV0ZG93bl9hbmRfbm90aWZ5IGFuZCBtYXliZV9maW5pc2hfc2h1dGRvd24pICovCi0gIGdwcl9tdSBtdV9nbG9iYWw7IC8qIG11dGV4IGZvciBzZXJ2ZXIgYW5kIGNoYW5uZWwgc3RhdGUgKi8KLSAgZ3ByX211IG11X2NhbGw7ICAgLyogbXV0ZXggZm9yIGNhbGwtc3BlY2lmaWMgc3RhdGUgKi8KLQotICByZWdpc3RlcmVkX21ldGhvZCAqcmVnaXN0ZXJlZF9tZXRob2RzOwotICByZXF1ZXN0X21hdGNoZXIgdW5yZWdpc3RlcmVkX3JlcXVlc3RfbWF0Y2hlcjsKLSAgLyoqIGZyZWUgbGlzdCBvZiBhdmFpbGFibGUgcmVxdWVzdGVkX2NhbGxzIGluZGljZXMgKi8KLSAgZ3ByX3N0YWNrX2xvY2tmcmVlICpyZXF1ZXN0X2ZyZWVsaXN0OwotICAvKiogcmVxdWVzdGVkIGNhbGwgYmFja2luZyBkYXRhICovCi0gIHJlcXVlc3RlZF9jYWxsICpyZXF1ZXN0ZWRfY2FsbHM7Ci0gIHNpemVfdCBtYXhfcmVxdWVzdGVkX2NhbGxzOwotCi0gIGdwcl9hdG0gc2h1dGRvd25fZmxhZzsKLSAgdWludDhfdCBzaHV0ZG93bl9wdWJsaXNoZWQ7Ci0gIHNpemVfdCBudW1fc2h1dGRvd25fdGFnczsKLSAgc2h1dGRvd25fdGFnICpzaHV0ZG93bl90YWdzOwotCi0gIGNoYW5uZWxfZGF0YSByb290X2NoYW5uZWxfZGF0YTsKLQotICBsaXN0ZW5lciAqbGlzdGVuZXJzOwotICBpbnQgbGlzdGVuZXJzX2Rlc3Ryb3llZDsKLSAgZ3ByX3JlZmNvdW50IGludGVybmFsX3JlZmNvdW50OwotCi0gIC8qKiB3aGVuIGRpZCB3ZSBwcmludCB0aGUgbGFzdCBzaHV0ZG93biBwcm9ncmVzcyBtZXNzYWdlICovCi0gIGdwcl90aW1lc3BlYyBsYXN0X3NodXRkb3duX21lc3NhZ2VfdGltZTsKLX07Ci0KLSNkZWZpbmUgU0VSVkVSX0ZST01fQ0FMTF9FTEVNKGVsZW0pIFwKLSAgKCgoY2hhbm5lbF9kYXRhICopKGVsZW0pLT5jaGFubmVsX2RhdGEpLT5zZXJ2ZXIpCi0KLXN0YXRpYyB2b2lkIGJlZ2luX2NhbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxfZGF0YSAqY2FsbGQsIHJlcXVlc3RlZF9jYWxsICpyYyk7Ci1zdGF0aWMgdm9pZCBmYWlsX2NhbGwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2NhbGwgKnJjKTsKLS8qIEJlZm9yZSBjYWxsaW5nIG1heWJlX2ZpbmlzaF9zaHV0ZG93biwgd2UgbXVzdCBob2xkIG11X2dsb2JhbCBhbmQgbm90Ci0gICBob2xkIG11X2NhbGwgKi8KLXN0YXRpYyB2b2lkIG1heWJlX2ZpbmlzaF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlcik7Ci0KLS8qCi0gKiBjaGFubmVsIGJyb2FkY2FzdGVyCi0gKi8KLQotLyogYXNzdW1lcyBzZXJ2ZXIgbG9ja2VkICovCi1zdGF0aWMgdm9pZCBjaGFubmVsX2Jyb2FkY2FzdGVyX2luaXQoZ3JwY19zZXJ2ZXIgKnMsIGNoYW5uZWxfYnJvYWRjYXN0ZXIgKmNiKSB7Ci0gIGNoYW5uZWxfZGF0YSAqYzsKLSAgc2l6ZV90IGNvdW50ID0gMDsKLSAgZm9yIChjID0gcy0+cm9vdF9jaGFubmVsX2RhdGEubmV4dDsgYyAhPSAmcy0+cm9vdF9jaGFubmVsX2RhdGE7IGMgPSBjLT5uZXh0KSB7Ci0gICAgY291bnQrKzsKLSAgfQotICBjYi0+bnVtX2NoYW5uZWxzID0gY291bnQ7Ci0gIGNiLT5jaGFubmVscyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpjYi0+Y2hhbm5lbHMpICogY2ItPm51bV9jaGFubmVscyk7Ci0gIGNvdW50ID0gMDsKLSAgZm9yIChjID0gcy0+cm9vdF9jaGFubmVsX2RhdGEubmV4dDsgYyAhPSAmcy0+cm9vdF9jaGFubmVsX2RhdGE7IGMgPSBjLT5uZXh0KSB7Ci0gICAgY2ItPmNoYW5uZWxzW2NvdW50KytdID0gYy0+Y2hhbm5lbDsKLSAgICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfUkVGKGMtPmNoYW5uZWwsICJicm9hZGNhc3QiKTsKLSAgfQotfQotCi1zdHJ1Y3Qgc2h1dGRvd25fY2xlYW51cF9hcmdzIHsKLSAgZ3JwY19jbG9zdXJlIGNsb3N1cmU7Ci0gIGdwcl9zbGljZSBzbGljZTsKLX07Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX2NsZWFudXAoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdGF0dXNfaWdub3JlZCkgewotICBzdHJ1Y3Qgc2h1dGRvd25fY2xlYW51cF9hcmdzICphID0gYXJnOwotICBncHJfc2xpY2VfdW5yZWYoYS0+c2xpY2UpOwotICBncHJfZnJlZShhKTsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaGFubmVsICpjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZF9nb2F3YXksIGludCBzZW5kX2Rpc2Nvbm5lY3QpIHsKLSAgZ3JwY190cmFuc3BvcnRfb3Agb3A7Ci0gIHN0cnVjdCBzaHV0ZG93bl9jbGVhbnVwX2FyZ3MgKnNjOwotICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbTsKLQotICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKLSAgb3Auc2VuZF9nb2F3YXkgPSBzZW5kX2dvYXdheTsKLSAgc2MgPSBncHJfbWFsbG9jKHNpemVvZigqc2MpKTsKLSAgc2MtPnNsaWNlID0gZ3ByX3NsaWNlX2Zyb21fY29waWVkX3N0cmluZygiU2VydmVyIHNodXRkb3duIik7Ci0gIG9wLmdvYXdheV9tZXNzYWdlID0gJnNjLT5zbGljZTsKLSAgb3AuZ29hd2F5X3N0YXR1cyA9IEdSUENfU1RBVFVTX09LOwotICBvcC5kaXNjb25uZWN0ID0gc2VuZF9kaXNjb25uZWN0OwotICBncnBjX2Nsb3N1cmVfaW5pdCgmc2MtPmNsb3N1cmUsIHNodXRkb3duX2NsZWFudXAsIHNjKTsKLSAgb3Aub25fY29uc3VtZWQgPSAmc2MtPmNsb3N1cmU7Ci0KLSAgZWxlbSA9IGdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KGdycGNfY2hhbm5lbF9nZXRfY2hhbm5lbF9zdGFjayhjaGFubmVsKSwgMCk7Ci0gIGVsZW0tPmZpbHRlci0+c3RhcnRfdHJhbnNwb3J0X29wKGV4ZWNfY3R4LCBlbGVtLCAmb3ApOwotfQotCi1zdGF0aWMgdm9pZCBjaGFubmVsX2Jyb2FkY2FzdGVyX3NodXRkb3duKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2Jyb2FkY2FzdGVyICpjYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRfZ29hd2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9yY2VfZGlzY29ubmVjdCkgewotICBzaXplX3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2ItPm51bV9jaGFubmVsczsgaSsrKSB7Ci0gICAgc2VuZF9zaHV0ZG93bihleGVjX2N0eCwgY2ItPmNoYW5uZWxzW2ldLCBzZW5kX2dvYXdheSwgZm9yY2VfZGlzY29ubmVjdCk7Ci0gICAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjYi0+Y2hhbm5lbHNbaV0sICJicm9hZGNhc3QiKTsKLSAgfQotICBncHJfZnJlZShjYi0+Y2hhbm5lbHMpOwotfQotCi0vKgotICogcmVxdWVzdF9tYXRjaGVyCi0gKi8KLQotc3RhdGljIHZvaWQgcmVxdWVzdF9tYXRjaGVyX2luaXQocmVxdWVzdF9tYXRjaGVyICpybSwgc2l6ZV90IGVudHJpZXMpIHsKLSAgbWVtc2V0KHJtLCAwLCBzaXplb2YoKnJtKSk7Ci0gIHJtLT5yZXF1ZXN0cyA9IGdwcl9zdGFja19sb2NrZnJlZV9jcmVhdGUoZW50cmllcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlcXVlc3RfbWF0Y2hlcl9kZXN0cm95KHJlcXVlc3RfbWF0Y2hlciAqcm0pIHsKLSAgR1BSX0FTU0VSVChncHJfc3RhY2tfbG9ja2ZyZWVfcG9wKHJtLT5yZXF1ZXN0cykgPT0gLTEpOwotICBncHJfc3RhY2tfbG9ja2ZyZWVfZGVzdHJveShybS0+cmVxdWVzdHMpOwotfQotCi1zdGF0aWMgdm9pZCBraWxsX3pvbWJpZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZWxlbSwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfY2FsbF9kZXN0cm95KGdycGNfY2FsbF9mcm9tX3RvcF9lbGVtZW50KGVsZW0pKTsKLX0KLQotc3RhdGljIHZvaWQgcmVxdWVzdF9tYXRjaGVyX3pvbWJpZnlfYWxsX3BlbmRpbmdfY2FsbHMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X21hdGNoZXIgKnJtKSB7Ci0gIHdoaWxlIChybS0+cGVuZGluZ19oZWFkKSB7Ci0gICAgY2FsbF9kYXRhICpjYWxsZCA9IHJtLT5wZW5kaW5nX2hlYWQ7Ci0gICAgcm0tPnBlbmRpbmdfaGVhZCA9IGNhbGxkLT5wZW5kaW5nX25leHQ7Ci0gICAgZ3ByX211X2xvY2soJmNhbGxkLT5tdV9zdGF0ZSk7Ci0gICAgY2FsbGQtPnN0YXRlID0gWk9NQklFRDsKLSAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOwotICAgIGdycGNfY2xvc3VyZV9pbml0KAotICAgICAgICAmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIGtpbGxfem9tYmllLAotICAgICAgICBncnBjX2NhbGxfc3RhY2tfZWxlbWVudChncnBjX2NhbGxfZ2V0X2NhbGxfc3RhY2soY2FsbGQtPmNhbGwpLCAwKSk7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIHRydWUsIE5VTEwpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlcXVlc3RfbWF0Y2hlcl9raWxsX3JlcXVlc3RzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZXJ2ZXIgKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfbWF0Y2hlciAqcm0pIHsKLSAgaW50IHJlcXVlc3RfaWQ7Ci0gIHdoaWxlICgocmVxdWVzdF9pZCA9IGdwcl9zdGFja19sb2NrZnJlZV9wb3Aocm0tPnJlcXVlc3RzKSkgIT0gLTEpIHsKLSAgICBmYWlsX2NhbGwoZXhlY19jdHgsIHNlcnZlciwgJnNlcnZlci0+cmVxdWVzdGVkX2NhbGxzW3JlcXVlc3RfaWRdKTsKLSAgfQotfQotCi0vKgotICogc2VydmVyIHByb3BlcgotICovCi0KLXN0YXRpYyB2b2lkIHNlcnZlcl9yZWYoZ3JwY19zZXJ2ZXIgKnNlcnZlcikgewotICBncHJfcmVmKCZzZXJ2ZXItPmludGVybmFsX3JlZmNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX2RlbGV0ZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlcikgewotICByZWdpc3RlcmVkX21ldGhvZCAqcm07Ci0gIHNpemVfdCBpOwotICBncnBjX2NoYW5uZWxfYXJnc19kZXN0cm95KHNlcnZlci0+Y2hhbm5lbF9hcmdzKTsKLSAgZ3ByX211X2Rlc3Ryb3koJnNlcnZlci0+bXVfZ2xvYmFsKTsKLSAgZ3ByX211X2Rlc3Ryb3koJnNlcnZlci0+bXVfY2FsbCk7Ci0gIHdoaWxlICgocm0gPSBzZXJ2ZXItPnJlZ2lzdGVyZWRfbWV0aG9kcykgIT0gTlVMTCkgewotICAgIHNlcnZlci0+cmVnaXN0ZXJlZF9tZXRob2RzID0gcm0tPm5leHQ7Ci0gICAgcmVxdWVzdF9tYXRjaGVyX2Rlc3Ryb3koJnJtLT5yZXF1ZXN0X21hdGNoZXIpOwotICAgIGdwcl9mcmVlKHJtLT5tZXRob2QpOwotICAgIGdwcl9mcmVlKHJtLT5ob3N0KTsKLSAgICBncHJfZnJlZShybSk7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IHNlcnZlci0+Y3FfY291bnQ7IGkrKykgewotICAgIEdSUENfQ1FfSU5URVJOQUxfVU5SRUYoc2VydmVyLT5jcXNbaV0sICJzZXJ2ZXIiKTsKLSAgfQotICByZXF1ZXN0X21hdGNoZXJfZGVzdHJveSgmc2VydmVyLT51bnJlZ2lzdGVyZWRfcmVxdWVzdF9tYXRjaGVyKTsKLSAgZ3ByX3N0YWNrX2xvY2tmcmVlX2Rlc3Ryb3koc2VydmVyLT5yZXF1ZXN0X2ZyZWVsaXN0KTsKLSAgZ3ByX2ZyZWUoc2VydmVyLT5jcXMpOwotICBncHJfZnJlZShzZXJ2ZXItPnBvbGxzZXRzKTsKLSAgZ3ByX2ZyZWUoc2VydmVyLT5zaHV0ZG93bl90YWdzKTsKLSAgZ3ByX2ZyZWUoc2VydmVyLT5yZXF1ZXN0ZWRfY2FsbHMpOwotICBncHJfZnJlZShzZXJ2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKLSAgaWYgKGdwcl91bnJlZigmc2VydmVyLT5pbnRlcm5hbF9yZWZjb3VudCkpIHsKLSAgICBzZXJ2ZXJfZGVsZXRlKGV4ZWNfY3R4LCBzZXJ2ZXIpOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgaXNfY2hhbm5lbF9vcnBoYW5lZChjaGFubmVsX2RhdGEgKmNoYW5kKSB7Ci0gIHJldHVybiBjaGFuZC0+bmV4dCA9PSBjaGFuZDsKLX0KLQotc3RhdGljIHZvaWQgb3JwaGFuX2NoYW5uZWwoY2hhbm5lbF9kYXRhICpjaGFuZCkgewotICBjaGFuZC0+bmV4dC0+cHJldiA9IGNoYW5kLT5wcmV2OwotICBjaGFuZC0+cHJldi0+bmV4dCA9IGNoYW5kLT5uZXh0OwotICBjaGFuZC0+bmV4dCA9IGNoYW5kLT5wcmV2ID0gY2hhbmQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmlzaF9kZXN0cm95X2NoYW5uZWwoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGNkOwotICBncnBjX3NlcnZlciAqc2VydmVyID0gY2hhbmQtPnNlcnZlcjsKLSAgR1JQQ19DSEFOTkVMX0lOVEVSTkFMX1VOUkVGKGV4ZWNfY3R4LCBjaGFuZC0+Y2hhbm5lbCwgInNlcnZlciIpOwotICBzZXJ2ZXJfdW5yZWYoZXhlY19jdHgsIHNlcnZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY2hhbm5lbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgY2hhbm5lbF9kYXRhICpjaGFuZCkgewotICBpZiAoaXNfY2hhbm5lbF9vcnBoYW5lZChjaGFuZCkpIHJldHVybjsKLSAgR1BSX0FTU0VSVChjaGFuZC0+c2VydmVyICE9IE5VTEwpOwotICBvcnBoYW5fY2hhbm5lbChjaGFuZCk7Ci0gIHNlcnZlcl9yZWYoY2hhbmQtPnNlcnZlcik7Ci0gIG1heWJlX2ZpbmlzaF9zaHV0ZG93bihleGVjX2N0eCwgY2hhbmQtPnNlcnZlcik7Ci0gIGNoYW5kLT5maW5pc2hfZGVzdHJveV9jaGFubmVsX2Nsb3N1cmUuY2IgPSBmaW5pc2hfZGVzdHJveV9jaGFubmVsOwotICBjaGFuZC0+ZmluaXNoX2Rlc3Ryb3lfY2hhbm5lbF9jbG9zdXJlLmNiX2FyZyA9IGNoYW5kOwotCi0gIGdycGNfdHJhbnNwb3J0X29wIG9wOwotICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKLSAgb3Auc2V0X2FjY2VwdF9zdHJlYW0gPSB0cnVlOwotICBvcC5vbl9jb25zdW1lZCA9ICZjaGFuZC0+ZmluaXNoX2Rlc3Ryb3lfY2hhbm5lbF9jbG9zdXJlOwotICBncnBjX2NoYW5uZWxfbmV4dF9vcChleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX3N0YWNrX2VsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbmQtPmNoYW5uZWwpLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgJm9wKTsKLX0KLQotc3RhdGljIHZvaWQgZmluaXNoX3N0YXJ0X25ld19ycGMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwgcmVxdWVzdF9tYXRjaGVyICpybSkgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBpbnQgcmVxdWVzdF9pZDsKLQotICBpZiAoZ3ByX2F0bV9hY3FfbG9hZCgmc2VydmVyLT5zaHV0ZG93bl9mbGFnKSkgewotICAgIGdwcl9tdV9sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOwotICAgIGNhbGxkLT5zdGF0ZSA9IFpPTUJJRUQ7Ci0gICAgZ3ByX211X3VubG9jaygmY2FsbGQtPm11X3N0YXRlKTsKLSAgICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIGtpbGxfem9tYmllLCBlbGVtKTsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZjYWxsZC0+a2lsbF96b21iaWVfY2xvc3VyZSwgdHJ1ZSwgTlVMTCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcmVxdWVzdF9pZCA9IGdwcl9zdGFja19sb2NrZnJlZV9wb3Aocm0tPnJlcXVlc3RzKTsKLSAgaWYgKHJlcXVlc3RfaWQgPT0gLTEpIHsKLSAgICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9jYWxsKTsKLSAgICBncHJfbXVfbG9jaygmY2FsbGQtPm11X3N0YXRlKTsKLSAgICBjYWxsZC0+c3RhdGUgPSBQRU5ESU5HOwotICAgIGdwcl9tdV91bmxvY2soJmNhbGxkLT5tdV9zdGF0ZSk7Ci0gICAgaWYgKHJtLT5wZW5kaW5nX2hlYWQgPT0gTlVMTCkgewotICAgICAgcm0tPnBlbmRpbmdfdGFpbCA9IHJtLT5wZW5kaW5nX2hlYWQgPSBjYWxsZDsKLSAgICB9IGVsc2UgewotICAgICAgcm0tPnBlbmRpbmdfdGFpbC0+cGVuZGluZ19uZXh0ID0gY2FsbGQ7Ci0gICAgICBybS0+cGVuZGluZ190YWlsID0gY2FsbGQ7Ci0gICAgfQotICAgIGNhbGxkLT5wZW5kaW5nX25leHQgPSBOVUxMOwotICAgIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfY2FsbCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX211X2xvY2soJmNhbGxkLT5tdV9zdGF0ZSk7Ci0gICAgY2FsbGQtPnN0YXRlID0gQUNUSVZBVEVEOwotICAgIGdwcl9tdV91bmxvY2soJmNhbGxkLT5tdV9zdGF0ZSk7Ci0gICAgYmVnaW5fY2FsbChleGVjX2N0eCwgc2VydmVyLCBjYWxsZCwgJnNlcnZlci0+cmVxdWVzdGVkX2NhbGxzW3JlcXVlc3RfaWRdKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9uZXdfcnBjKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSkgewotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBncnBjX3NlcnZlciAqc2VydmVyID0gY2hhbmQtPnNlcnZlcjsKLSAgdWludDMyX3QgaTsKLSAgdWludDMyX3QgaGFzaDsKLSAgY2hhbm5lbF9yZWdpc3RlcmVkX21ldGhvZCAqcm07Ci0KLSAgaWYgKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHMgJiYgY2FsbGQtPnBhdGggJiYgY2FsbGQtPmhvc3QpIHsKLSAgICAvKiBUT0RPKGN0aWxsZXIpOiB1bmlmeSB0aGVzZSB0d28gc2VhcmNoZXMgKi8KLSAgICAvKiBjaGVjayBmb3IgYW4gZXhhY3QgbWF0Y2ggd2l0aCBob3N0ICovCi0gICAgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChjYWxsZC0+aG9zdC0+aGFzaCwgY2FsbGQtPnBhdGgtPmhhc2gpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kX21heF9wcm9iZXM7IGkrKykgewotICAgICAgcm0gPSAmY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kc1soaGFzaCArIGkpICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kX3Nsb3RzXTsKLSAgICAgIGlmICghcm0pIGJyZWFrOwotICAgICAgaWYgKHJtLT5ob3N0ICE9IGNhbGxkLT5ob3N0KSBjb250aW51ZTsKLSAgICAgIGlmIChybS0+bWV0aG9kICE9IGNhbGxkLT5wYXRoKSBjb250aW51ZTsKLSAgICAgIGZpbmlzaF9zdGFydF9uZXdfcnBjKGV4ZWNfY3R4LCBzZXJ2ZXIsIGVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcm0tPnNlcnZlcl9yZWdpc3RlcmVkX21ldGhvZC0+cmVxdWVzdF9tYXRjaGVyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLyogY2hlY2sgZm9yIGEgd2lsZGNhcmQgbWV0aG9kIGRlZmluaXRpb24gKG5vIGhvc3Qgc2V0KSAqLwotICAgIGhhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0goMCwgY2FsbGQtPnBhdGgtPmhhc2gpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kX21heF9wcm9iZXM7IGkrKykgewotICAgICAgcm0gPSAmY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kc1soaGFzaCArIGkpICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kX3Nsb3RzXTsKLSAgICAgIGlmICghcm0pIGJyZWFrOwotICAgICAgaWYgKHJtLT5ob3N0ICE9IE5VTEwpIGNvbnRpbnVlOwotICAgICAgaWYgKHJtLT5tZXRob2QgIT0gY2FsbGQtPnBhdGgpIGNvbnRpbnVlOwotICAgICAgZmluaXNoX3N0YXJ0X25ld19ycGMoZXhlY19jdHgsIHNlcnZlciwgZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZybS0+c2VydmVyX3JlZ2lzdGVyZWRfbWV0aG9kLT5yZXF1ZXN0X21hdGNoZXIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBmaW5pc2hfc3RhcnRfbmV3X3JwYyhleGVjX2N0eCwgc2VydmVyLCBlbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT51bnJlZ2lzdGVyZWRfcmVxdWVzdF9tYXRjaGVyKTsKLX0KLQotc3RhdGljIGludCBudW1fbGlzdGVuZXJzKGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKLSAgbGlzdGVuZXIgKmw7Ci0gIGludCBuID0gMDsKLSAgZm9yIChsID0gc2VydmVyLT5saXN0ZW5lcnM7IGw7IGwgPSBsLT5uZXh0KSB7Ci0gICAgbisrOwotICB9Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgdm9pZCBkb25lX3NodXRkb3duX2V2ZW50KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqY29tcGxldGlvbikgewotICBzZXJ2ZXJfdW5yZWYoZXhlY19jdHgsIHNlcnZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgbnVtX2NoYW5uZWxzKGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZDsKLSAgaW50IG4gPSAwOwotICBmb3IgKGNoYW5kID0gc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YS5uZXh0OwotICAgICAgIGNoYW5kICE9ICZzZXJ2ZXItPnJvb3RfY2hhbm5lbF9kYXRhOyBjaGFuZCA9IGNoYW5kLT5uZXh0KSB7Ci0gICAgbisrOwotICB9Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgdm9pZCBraWxsX3BlbmRpbmdfd29ya19sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zZXJ2ZXIgKnNlcnZlcikgewotICByZWdpc3RlcmVkX21ldGhvZCAqcm07Ci0gIHJlcXVlc3RfbWF0Y2hlcl9raWxsX3JlcXVlc3RzKGV4ZWNfY3R4LCBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXItPnVucmVnaXN0ZXJlZF9yZXF1ZXN0X21hdGNoZXIpOwotICByZXF1ZXN0X21hdGNoZXJfem9tYmlmeV9hbGxfcGVuZGluZ19jYWxscygKLSAgICAgIGV4ZWNfY3R4LCAmc2VydmVyLT51bnJlZ2lzdGVyZWRfcmVxdWVzdF9tYXRjaGVyKTsKLSAgZm9yIChybSA9IHNlcnZlci0+cmVnaXN0ZXJlZF9tZXRob2RzOyBybTsgcm0gPSBybS0+bmV4dCkgewotICAgIHJlcXVlc3RfbWF0Y2hlcl9raWxsX3JlcXVlc3RzKGV4ZWNfY3R4LCBzZXJ2ZXIsICZybS0+cmVxdWVzdF9tYXRjaGVyKTsKLSAgICByZXF1ZXN0X21hdGNoZXJfem9tYmlmeV9hbGxfcGVuZGluZ19jYWxscyhleGVjX2N0eCwgJnJtLT5yZXF1ZXN0X21hdGNoZXIpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG1heWJlX2ZpbmlzaF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlciAqc2VydmVyKSB7Ci0gIHNpemVfdCBpOwotICBpZiAoIWdwcl9hdG1fYWNxX2xvYWQoJnNlcnZlci0+c2h1dGRvd25fZmxhZykgfHwgc2VydmVyLT5zaHV0ZG93bl9wdWJsaXNoZWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBraWxsX3BlbmRpbmdfd29ya19sb2NrZWQoZXhlY19jdHgsIHNlcnZlcik7Ci0KLSAgaWYgKHNlcnZlci0+cm9vdF9jaGFubmVsX2RhdGEubmV4dCAhPSAmc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YSB8fAotICAgICAgc2VydmVyLT5saXN0ZW5lcnNfZGVzdHJveWVkIDwgbnVtX2xpc3RlbmVycyhzZXJ2ZXIpKSB7Ci0gICAgaWYgKGdwcl90aW1lX2NtcChncHJfdGltZV9zdWIoZ3ByX25vdyhHUFJfQ0xPQ0tfUkVBTFRJTUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+bGFzdF9zaHV0ZG93bl9tZXNzYWdlX3RpbWUpLAotICAgICAgICAgICAgICAgICAgICAgZ3ByX3RpbWVfZnJvbV9zZWNvbmRzKDEsIEdQUl9USU1FU1BBTikpID49IDApIHsKLSAgICAgIHNlcnZlci0+bGFzdF9zaHV0ZG93bl9tZXNzYWdlX3RpbWUgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywKLSAgICAgICAgICAgICAgIldhaXRpbmcgZm9yICVkIGNoYW5uZWxzIGFuZCAlZC8lZCBsaXN0ZW5lcnMgdG8gYmUgZGVzdHJveWVkIgotICAgICAgICAgICAgICAiIGJlZm9yZSBzaHV0dGluZyBkb3duIHNlcnZlciIsCi0gICAgICAgICAgICAgIG51bV9jaGFubmVscyhzZXJ2ZXIpLAotICAgICAgICAgICAgICBudW1fbGlzdGVuZXJzKHNlcnZlcikgLSBzZXJ2ZXItPmxpc3RlbmVyc19kZXN0cm95ZWQsCi0gICAgICAgICAgICAgIG51bV9saXN0ZW5lcnMoc2VydmVyKSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBzZXJ2ZXItPnNodXRkb3duX3B1Ymxpc2hlZCA9IDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBzZXJ2ZXItPm51bV9zaHV0ZG93bl90YWdzOyBpKyspIHsKLSAgICBzZXJ2ZXJfcmVmKHNlcnZlcik7Ci0gICAgZ3JwY19jcV9lbmRfb3AoZXhlY19jdHgsIHNlcnZlci0+c2h1dGRvd25fdGFnc1tpXS5jcSwKLSAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPnNodXRkb3duX3RhZ3NbaV0udGFnLCAxLCBkb25lX3NodXRkb3duX2V2ZW50LCBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgJnNlcnZlci0+c2h1dGRvd25fdGFnc1tpXS5jb21wbGV0aW9uKTsKLSAgfQotfQotCi1zdGF0aWMgZ3JwY19tZGVsZW0gKnNlcnZlcl9maWx0ZXIodm9pZCAqdXNlcl9kYXRhLCBncnBjX21kZWxlbSAqbWQpIHsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSB1c2VyX2RhdGE7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfUEFUSCkgewotICAgIGNhbGxkLT5wYXRoID0gR1JQQ19NRFNUUl9SRUYobWQtPnZhbHVlKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfQVVUSE9SSVRZKSB7Ci0gICAgY2FsbGQtPmhvc3QgPSBHUlBDX01EU1RSX1JFRihtZC0+dmFsdWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBtZDsKLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX29uX3JlY3ZfaW5pdGlhbF9tZXRhZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPSBwdHI7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGdwcl90aW1lc3BlYyBvcF9kZWFkbGluZTsKLQotICBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhLCBzZXJ2ZXJfZmlsdGVyLCBlbGVtKTsKLSAgb3BfZGVhZGxpbmUgPSBjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhLT5kZWFkbGluZTsKLSAgaWYgKDAgIT0gZ3ByX3RpbWVfY21wKG9wX2RlYWRsaW5lLCBncHJfaW5mX2Z1dHVyZShvcF9kZWFkbGluZS5jbG9ja190eXBlKSkpIHsKLSAgICBjYWxsZC0+ZGVhZGxpbmUgPSBvcF9kZWFkbGluZTsKLSAgfQotICBpZiAoY2FsbGQtPmhvc3QgJiYgY2FsbGQtPnBhdGgpIHsKLSAgICAvKiBkbyBub3RoaW5nICovCi0gIH0gZWxzZSB7Ci0gICAgc3VjY2VzcyA9IDA7Ci0gIH0KLQotICBjYWxsZC0+b25fZG9uZV9yZWN2X2luaXRpYWxfbWV0YWRhdGEtPmNiKAotICAgICAgZXhlY19jdHgsIGNhbGxkLT5vbl9kb25lX3JlY3ZfaW5pdGlhbF9tZXRhZGF0YS0+Y2JfYXJnLCBzdWNjZXNzKTsKLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX211dGF0ZV9vcChncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotCi0gIGlmIChvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBjYWxsZC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBjYWxsZC0+b25fZG9uZV9yZWN2X2luaXRpYWxfbWV0YWRhdGEgPSBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5OwotICAgIG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgPSAmY2FsbGQtPnNlcnZlcl9vbl9yZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc2VydmVyX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgR1JQQ19DQUxMX0xPR19PUChHUFJfSU5GTywgZWxlbSwgb3ApOwotICBzZXJ2ZXJfbXV0YXRlX29wKGVsZW0sIG9wKTsKLSAgZ3JwY19jYWxsX25leHRfb3AoZXhlY19jdHgsIGVsZW0sIG9wKTsKLX0KLQotc3RhdGljIHZvaWQgZ290X2luaXRpYWxfbWV0YWRhdGEoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcykgewotICBncnBjX2NhbGxfZWxlbWVudCAqZWxlbSA9IHB0cjsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICBzdGFydF9uZXdfcnBjKGV4ZWNfY3R4LCBlbGVtKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfbXVfbG9jaygmY2FsbGQtPm11X3N0YXRlKTsKLSAgICBpZiAoY2FsbGQtPnN0YXRlID09IE5PVF9TVEFSVEVEKSB7Ci0gICAgICBjYWxsZC0+c3RhdGUgPSBaT01CSUVEOwotICAgICAgZ3ByX211X3VubG9jaygmY2FsbGQtPm11X3N0YXRlKTsKLSAgICAgIGdycGNfY2xvc3VyZV9pbml0KCZjYWxsZC0+a2lsbF96b21iaWVfY2xvc3VyZSwga2lsbF96b21iaWUsIGVsZW0pOwotICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCAmY2FsbGQtPmtpbGxfem9tYmllX2Nsb3N1cmUsIHRydWUsIE5VTEwpOwotICAgIH0gZWxzZSBpZiAoY2FsbGQtPnN0YXRlID09IFBFTkRJTkcpIHsKLSAgICAgIGNhbGxkLT5zdGF0ZSA9IFpPTUJJRUQ7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOwotICAgICAgLyogem9tYmllZCBjYWxsIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gaXQncyByZW1vdmVkIGZyb20gdGhlIHBlbmRpbmcKLSAgICAgICAgIHF1ZXVlLi4uIGxhdGVyICovCi0gICAgfSBlbHNlIHsKLSAgICAgIGdwcl9tdV91bmxvY2soJmNhbGxkLT5tdV9zdGF0ZSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9zdHJlYW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0cmFuc3BvcnRfc2VydmVyX2RhdGEpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGNkOwotICAvKiBjcmVhdGUgYSBjYWxsICovCi0gIGdycGNfY2FsbCAqY2FsbCA9Ci0gICAgICBncnBjX2NhbGxfY3JlYXRlKGNoYW5kLT5jaGFubmVsLCBOVUxMLCAwLCBOVUxMLCB0cmFuc3BvcnRfc2VydmVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGdwcl9pbmZfZnV0dXJlKEdQUl9DTE9DS19NT05PVE9OSUMpKTsKLSAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0gPQotICAgICAgZ3JwY19jYWxsX3N0YWNrX2VsZW1lbnQoZ3JwY19jYWxsX2dldF9jYWxsX3N0YWNrKGNhbGwpLCAwKTsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IGVsZW0tPmNhbGxfZGF0YTsKLSAgZ3JwY19vcCBvcDsKLSAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7Ci0gIG9wLm9wID0gR1JQQ19PUF9SRUNWX0lOSVRJQUxfTUVUQURBVEE7Ci0gIG9wLmRhdGEucmVjdl9pbml0aWFsX21ldGFkYXRhID0gJmNhbGxkLT5pbml0aWFsX21ldGFkYXRhOwotICBncnBjX2Nsb3N1cmVfaW5pdCgmY2FsbGQtPmdvdF9pbml0aWFsX21ldGFkYXRhLCBnb3RfaW5pdGlhbF9tZXRhZGF0YSwgZWxlbSk7Ci0gIGdycGNfY2FsbF9zdGFydF9iYXRjaF9hbmRfZXhlY3V0ZShleGVjX2N0eCwgY2FsbCwgJm9wLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxkLT5nb3RfaW5pdGlhbF9tZXRhZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoYW5uZWxfY29ubmVjdGl2aXR5X2NoYW5nZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvbWdyX3N0YXR1c19pZ25vcmVkKSB7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBjZDsKLSAgZ3JwY19zZXJ2ZXIgKnNlcnZlciA9IGNoYW5kLT5zZXJ2ZXI7Ci0gIGlmIChjaGFuZC0+Y29ubmVjdGl2aXR5X3N0YXRlICE9IEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFKSB7Ci0gICAgZ3JwY190cmFuc3BvcnRfb3Agb3A7Ci0gICAgbWVtc2V0KCZvcCwgMCwgc2l6ZW9mKG9wKSk7Ci0gICAgb3Aub25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSA9ICZjaGFuZC0+Y2hhbm5lbF9jb25uZWN0aXZpdHlfY2hhbmdlZCwKLSAgICBvcC5jb25uZWN0aXZpdHlfc3RhdGUgPSAmY2hhbmQtPmNvbm5lY3Rpdml0eV9zdGF0ZTsKLSAgICBncnBjX2NoYW5uZWxfbmV4dF9vcChleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfc3RhY2tfZWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaGFubmVsX2dldF9jaGFubmVsX3N0YWNrKGNoYW5kLT5jaGFubmVsKSwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJm9wKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOwotICAgIGRlc3Ryb3lfY2hhbm5lbChleGVjX2N0eCwgY2hhbmQpOwotICAgIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKLSAgICBHUlBDX0NIQU5ORUxfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGNoYW5kLT5jaGFubmVsLCAiY29ubmVjdGl2aXR5Iik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jYWxsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2FsbF9lbGVtZW50ICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnRfYXJncyAqYXJncykgewotICBjYWxsX2RhdGEgKmNhbGxkID0gZWxlbS0+Y2FsbF9kYXRhOwotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBtZW1zZXQoY2FsbGQsIDAsIHNpemVvZihjYWxsX2RhdGEpKTsKLSAgY2FsbGQtPmRlYWRsaW5lID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgY2FsbGQtPmNhbGwgPSBncnBjX2NhbGxfZnJvbV90b3BfZWxlbWVudChlbGVtKTsKLSAgZ3ByX211X2luaXQoJmNhbGxkLT5tdV9zdGF0ZSk7Ci0KLSAgZ3JwY19jbG9zdXJlX2luaXQoJmNhbGxkLT5zZXJ2ZXJfb25fcmVjdl9pbml0aWFsX21ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfb25fcmVjdl9pbml0aWFsX21ldGFkYXRhLCBlbGVtKTsKLQotICBzZXJ2ZXJfcmVmKGNoYW5kLT5zZXJ2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NhbGxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2FsbF9lbGVtZW50ICplbGVtKSB7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0KLSAgR1BSX0FTU0VSVChjYWxsZC0+c3RhdGUgIT0gUEVORElORyk7Ci0KLSAgaWYgKGNhbGxkLT5ob3N0KSB7Ci0gICAgR1JQQ19NRFNUUl9VTlJFRihjYWxsZC0+aG9zdCk7Ci0gIH0KLSAgaWYgKGNhbGxkLT5wYXRoKSB7Ci0gICAgR1JQQ19NRFNUUl9VTlJFRihjYWxsZC0+cGF0aCk7Ci0gIH0KLSAgZ3JwY19tZXRhZGF0YV9hcnJheV9kZXN0cm95KCZjYWxsZC0+aW5pdGlhbF9tZXRhZGF0YSk7Ci0KLSAgZ3ByX211X2Rlc3Ryb3koJmNhbGxkLT5tdV9zdGF0ZSk7Ci0KLSAgc2VydmVyX3VucmVmKGV4ZWNfY3R4LCBjaGFuZC0+c2VydmVyKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2VsZW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZWxlbWVudCAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50X2FyZ3MgKmFyZ3MpIHsKLSAgY2hhbm5lbF9kYXRhICpjaGFuZCA9IGVsZW0tPmNoYW5uZWxfZGF0YTsKLSAgR1BSX0FTU0VSVChhcmdzLT5pc19maXJzdCk7Ci0gIEdQUl9BU1NFUlQoIWFyZ3MtPmlzX2xhc3QpOwotICBjaGFuZC0+c2VydmVyID0gTlVMTDsKLSAgY2hhbmQtPmNoYW5uZWwgPSBOVUxMOwotICBjaGFuZC0+bmV4dCA9IGNoYW5kLT5wcmV2ID0gY2hhbmQ7Ci0gIGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHMgPSBOVUxMOwotICBjaGFuZC0+Y29ubmVjdGl2aXR5X3N0YXRlID0gR1JQQ19DSEFOTkVMX0lETEU7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZjaGFuZC0+Y2hhbm5lbF9jb25uZWN0aXZpdHlfY2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jb25uZWN0aXZpdHlfY2hhbmdlZCwgY2hhbmQpOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NoYW5uZWxfZWxlbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2hhbm5lbF9lbGVtZW50ICplbGVtKSB7Ci0gIHNpemVfdCBpOwotICBjaGFubmVsX2RhdGEgKmNoYW5kID0gZWxlbS0+Y2hhbm5lbF9kYXRhOwotICBpZiAoY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kcykgewotICAgIGZvciAoaSA9IDA7IGkgPCBjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2Rfc2xvdHM7IGkrKykgewotICAgICAgaWYgKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbaV0ubWV0aG9kKSB7Ci0gICAgICAgIEdSUENfTURTVFJfVU5SRUYoY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kc1tpXS5tZXRob2QpOwotICAgICAgfQotICAgICAgaWYgKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbaV0uaG9zdCkgewotICAgICAgICBHUlBDX01EU1RSX1VOUkVGKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbaV0uaG9zdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdwcl9mcmVlKGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHMpOwotICB9Ci0gIGlmIChjaGFuZC0+c2VydmVyKSB7Ci0gICAgZ3ByX211X2xvY2soJmNoYW5kLT5zZXJ2ZXItPm11X2dsb2JhbCk7Ci0gICAgY2hhbmQtPm5leHQtPnByZXYgPSBjaGFuZC0+cHJldjsKLSAgICBjaGFuZC0+cHJldi0+bmV4dCA9IGNoYW5kLT5uZXh0OwotICAgIGNoYW5kLT5uZXh0ID0gY2hhbmQtPnByZXYgPSBjaGFuZDsKLSAgICBtYXliZV9maW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIGNoYW5kLT5zZXJ2ZXIpOwotICAgIGdwcl9tdV91bmxvY2soJmNoYW5kLT5zZXJ2ZXItPm11X2dsb2JhbCk7Ci0gICAgc2VydmVyX3VucmVmKGV4ZWNfY3R4LCBjaGFuZC0+c2VydmVyKTsKLSAgfQotfQotCi1jb25zdCBncnBjX2NoYW5uZWxfZmlsdGVyIGdycGNfc2VydmVyX3RvcF9maWx0ZXIgPSB7Ci0gICAgc2VydmVyX3N0YXJ0X3RyYW5zcG9ydF9zdHJlYW1fb3AsCi0gICAgZ3JwY19jaGFubmVsX25leHRfb3AsCi0gICAgc2l6ZW9mKGNhbGxfZGF0YSksCi0gICAgaW5pdF9jYWxsX2VsZW0sCi0gICAgZ3JwY19jYWxsX3N0YWNrX2lnbm9yZV9zZXRfcG9sbHNldCwKLSAgICBkZXN0cm95X2NhbGxfZWxlbSwKLSAgICBzaXplb2YoY2hhbm5lbF9kYXRhKSwKLSAgICBpbml0X2NoYW5uZWxfZWxlbSwKLSAgICBkZXN0cm95X2NoYW5uZWxfZWxlbSwKLSAgICBncnBjX2NhbGxfbmV4dF9nZXRfcGVlciwKLSAgICAic2VydmVyIiwKLX07Ci0KLXZvaWQgZ3JwY19zZXJ2ZXJfcmVnaXN0ZXJfY29tcGxldGlvbl9xdWV1ZShncnBjX3NlcnZlciAqc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgc2l6ZV90IGksIG47Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfc2VydmVyX3JlZ2lzdGVyX2NvbXBsZXRpb25fcXVldWUoc2VydmVyPSVwLCBjcT0lcCwgcmVzZXJ2ZWQ9JXApIiwgMywKLSAgICAgIChzZXJ2ZXIsIGNxLCByZXNlcnZlZCkpOwotICBHUFJfQVNTRVJUKCFyZXNlcnZlZCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzZXJ2ZXItPmNxX2NvdW50OyBpKyspIHsKLSAgICBpZiAoc2VydmVyLT5jcXNbaV0gPT0gY3EpIHJldHVybjsKLSAgfQotICBHUlBDX0NRX0lOVEVSTkFMX1JFRihjcSwgInNlcnZlciIpOwotICBncnBjX2NxX21hcmtfc2VydmVyX2NxKGNxKTsKLSAgbiA9IHNlcnZlci0+Y3FfY291bnQrKzsKLSAgc2VydmVyLT5jcXMgPSBncHJfcmVhbGxvYyhzZXJ2ZXItPmNxcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPmNxX2NvdW50ICogc2l6ZW9mKGdycGNfY29tcGxldGlvbl9xdWV1ZSAqKSk7Ci0gIHNlcnZlci0+Y3FzW25dID0gY3E7Ci19Ci0KLWdycGNfc2VydmVyICpncnBjX3NlcnZlcl9jcmVhdGUoY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmFyZ3MsIHZvaWQgKnJlc2VydmVkKSB7Ci0gIHNpemVfdCBpOwotCi0gIEdSUENfQVBJX1RSQUNFKCJncnBjX3NlcnZlcl9jcmVhdGUoJXAsICVwKSIsIDIsIChhcmdzLCByZXNlcnZlZCkpOwotCi0gIGdycGNfc2VydmVyICpzZXJ2ZXIgPSBncHJfbWFsbG9jKHNpemVvZihncnBjX3NlcnZlcikpOwotCi0gIEdQUl9BU1NFUlQoZ3JwY19pc19pbml0aWFsaXplZCgpICYmICJjYWxsIGdycGNfaW5pdCgpIik7Ci0KLSAgbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKGdycGNfc2VydmVyKSk7Ci0KLSAgZ3ByX211X2luaXQoJnNlcnZlci0+bXVfZ2xvYmFsKTsKLSAgZ3ByX211X2luaXQoJnNlcnZlci0+bXVfY2FsbCk7Ci0KLSAgLyogZGVjcmVtZW50ZWQgYnkgZ3JwY19zZXJ2ZXJfZGVzdHJveSAqLwotICBncHJfcmVmX2luaXQoJnNlcnZlci0+aW50ZXJuYWxfcmVmY291bnQsIDEpOwotICBzZXJ2ZXItPnJvb3RfY2hhbm5lbF9kYXRhLm5leHQgPSBzZXJ2ZXItPnJvb3RfY2hhbm5lbF9kYXRhLnByZXYgPQotICAgICAgJnNlcnZlci0+cm9vdF9jaGFubmVsX2RhdGE7Ci0KLSAgLyogVE9ETyhjdGlsbGVyKTogZXhwb3NlIGEgY2hhbm5lbF9hcmcgZm9yIHRoaXMgKi8KLSAgc2VydmVyLT5tYXhfcmVxdWVzdGVkX2NhbGxzID0gMzI3Njg7Ci0gIHNlcnZlci0+cmVxdWVzdF9mcmVlbGlzdCA9Ci0gICAgICBncHJfc3RhY2tfbG9ja2ZyZWVfY3JlYXRlKHNlcnZlci0+bWF4X3JlcXVlc3RlZF9jYWxscyk7Ci0gIGZvciAoaSA9IDA7IGkgPCAoc2l6ZV90KXNlcnZlci0+bWF4X3JlcXVlc3RlZF9jYWxsczsgaSsrKSB7Ci0gICAgZ3ByX3N0YWNrX2xvY2tmcmVlX3B1c2goc2VydmVyLT5yZXF1ZXN0X2ZyZWVsaXN0LCAoaW50KWkpOwotICB9Ci0gIHJlcXVlc3RfbWF0Y2hlcl9pbml0KCZzZXJ2ZXItPnVucmVnaXN0ZXJlZF9yZXF1ZXN0X21hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+bWF4X3JlcXVlc3RlZF9jYWxscyk7Ci0gIHNlcnZlci0+cmVxdWVzdGVkX2NhbGxzID0gZ3ByX21hbGxvYyhzZXJ2ZXItPm1heF9yZXF1ZXN0ZWRfY2FsbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzZXJ2ZXItPnJlcXVlc3RlZF9jYWxscykpOwotCi0gIHNlcnZlci0+Y2hhbm5lbF9hcmdzID0gZ3JwY19jaGFubmVsX2FyZ3NfY29weShhcmdzKTsKLQotICByZXR1cm4gc2VydmVyOwotfQotCi1zdGF0aWMgaW50IHN0cmVxKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpIHsKLSAgaWYgKGEgPT0gTlVMTCAmJiBiID09IE5VTEwpIHJldHVybiAxOwotICBpZiAoYSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKGIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIHJldHVybiAwID09IHN0cmNtcChhLCBiKTsKLX0KLQotdm9pZCAqZ3JwY19zZXJ2ZXJfcmVnaXN0ZXJfbWV0aG9kKGdycGNfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKm1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0KSB7Ci0gIHJlZ2lzdGVyZWRfbWV0aG9kICptOwotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfcmVnaXN0ZXJfbWV0aG9kKHNlcnZlcj0lcCwgbWV0aG9kPSVzLCBob3N0PSVzKSIsCi0gICAgICAgICAgICAgICAgIDMsIChzZXJ2ZXIsIG1ldGhvZCwgaG9zdCkpOwotICBpZiAoIW1ldGhvZCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgImdycGNfc2VydmVyX3JlZ2lzdGVyX21ldGhvZCBtZXRob2Qgc3RyaW5nIGNhbm5vdCBiZSBOVUxMIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZm9yIChtID0gc2VydmVyLT5yZWdpc3RlcmVkX21ldGhvZHM7IG07IG0gPSBtLT5uZXh0KSB7Ci0gICAgaWYgKHN0cmVxKG0tPm1ldGhvZCwgbWV0aG9kKSAmJiBzdHJlcShtLT5ob3N0LCBob3N0KSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJkdXBsaWNhdGUgcmVnaXN0cmF0aW9uIGZvciAlc0AlcyIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIG0gPSBncHJfbWFsbG9jKHNpemVvZihyZWdpc3RlcmVkX21ldGhvZCkpOwotICBtZW1zZXQobSwgMCwgc2l6ZW9mKCptKSk7Ci0gIHJlcXVlc3RfbWF0Y2hlcl9pbml0KCZtLT5yZXF1ZXN0X21hdGNoZXIsIHNlcnZlci0+bWF4X3JlcXVlc3RlZF9jYWxscyk7Ci0gIG0tPm1ldGhvZCA9IGdwcl9zdHJkdXAobWV0aG9kKTsKLSAgbS0+aG9zdCA9IGdwcl9zdHJkdXAoaG9zdCk7Ci0gIG0tPm5leHQgPSBzZXJ2ZXItPnJlZ2lzdGVyZWRfbWV0aG9kczsKLSAgc2VydmVyLT5yZWdpc3RlcmVkX21ldGhvZHMgPSBtOwotICByZXR1cm4gbTsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9zdGFydChncnBjX3NlcnZlciAqc2VydmVyKSB7Ci0gIGxpc3RlbmVyICpsOwotICBzaXplX3QgaTsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfc3RhcnQoc2VydmVyPSVwKSIsIDEsIChzZXJ2ZXIpKTsKLQotICBzZXJ2ZXItPnBvbGxzZXRzID0gZ3ByX21hbGxvYyhzaXplb2YoZ3JwY19wb2xsc2V0ICopICogc2VydmVyLT5jcV9jb3VudCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzZXJ2ZXItPmNxX2NvdW50OyBpKyspIHsKLSAgICBzZXJ2ZXItPnBvbGxzZXRzW2ldID0gZ3JwY19jcV9wb2xsc2V0KHNlcnZlci0+Y3FzW2ldKTsKLSAgfQotCi0gIGZvciAobCA9IHNlcnZlci0+bGlzdGVuZXJzOyBsOyBsID0gbC0+bmV4dCkgewotICAgIGwtPnN0YXJ0KCZleGVjX2N0eCwgc2VydmVyLCBsLT5hcmcsIHNlcnZlci0+cG9sbHNldHMsIHNlcnZlci0+Y3FfY291bnQpOwotICB9Ci0KLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9zZXR1cF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICphcmdzKSB7Ci0gIHNpemVfdCBpOwotICBzaXplX3QgbnVtX3JlZ2lzdGVyZWRfbWV0aG9kczsKLSAgc2l6ZV90IGFsbG9jOwotICByZWdpc3RlcmVkX21ldGhvZCAqcm07Ci0gIGNoYW5uZWxfcmVnaXN0ZXJlZF9tZXRob2QgKmNybTsKLSAgZ3JwY19jaGFubmVsICpjaGFubmVsOwotICBjaGFubmVsX2RhdGEgKmNoYW5kOwotICBncnBjX21kc3RyICpob3N0OwotICBncnBjX21kc3RyICptZXRob2Q7Ci0gIHVpbnQzMl90IGhhc2g7Ci0gIHNpemVfdCBzbG90czsKLSAgdWludDMyX3QgcHJvYmVzOwotICB1aW50MzJfdCBtYXhfcHJvYmVzID0gMDsKLSAgZ3JwY190cmFuc3BvcnRfb3Agb3A7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHMtPmNxX2NvdW50OyBpKyspIHsKLSAgICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKLSAgICBvcC5iaW5kX3BvbGxzZXQgPSBncnBjX2NxX3BvbGxzZXQocy0+Y3FzW2ldKTsKLSAgICBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGV4ZWNfY3R4LCB0cmFuc3BvcnQsICZvcCk7Ci0gIH0KLQotICBjaGFubmVsID0KLSAgICAgIGdycGNfY2hhbm5lbF9jcmVhdGUoZXhlY19jdHgsIE5VTEwsIGFyZ3MsIEdSUENfU0VSVkVSX0NIQU5ORUwsIHRyYW5zcG9ydCk7Ci0gIGNoYW5kID0gKGNoYW5uZWxfZGF0YSAqKWdycGNfY2hhbm5lbF9zdGFja19lbGVtZW50KAotICAgICAgICAgICAgICBncnBjX2NoYW5uZWxfZ2V0X2NoYW5uZWxfc3RhY2soY2hhbm5lbCksIDApCi0gICAgICAgICAgICAgIC0+Y2hhbm5lbF9kYXRhOwotICBjaGFuZC0+c2VydmVyID0gczsKLSAgc2VydmVyX3JlZihzKTsKLSAgY2hhbmQtPmNoYW5uZWwgPSBjaGFubmVsOwotCi0gIG51bV9yZWdpc3RlcmVkX21ldGhvZHMgPSAwOwotICBmb3IgKHJtID0gcy0+cmVnaXN0ZXJlZF9tZXRob2RzOyBybTsgcm0gPSBybS0+bmV4dCkgewotICAgIG51bV9yZWdpc3RlcmVkX21ldGhvZHMrKzsKLSAgfQotICAvKiBidWlsZCBhIGxvb2t1cCB0YWJsZSBwaHJhc2VkIGluIHRlcm1zIG9mIG1kc3RyJ3MgaW4gdGhpcyBjaGFubmVscyBjb250ZXh0Ci0gICAgIHRvIHF1aWNrbHkgZmluZCByZWdpc3RlcmVkIG1ldGhvZHMgKi8KLSAgaWYgKG51bV9yZWdpc3RlcmVkX21ldGhvZHMgPiAwKSB7Ci0gICAgc2xvdHMgPSAyICogbnVtX3JlZ2lzdGVyZWRfbWV0aG9kczsKLSAgICBhbGxvYyA9IHNpemVvZihjaGFubmVsX3JlZ2lzdGVyZWRfbWV0aG9kKSAqIHNsb3RzOwotICAgIGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHMgPSBncHJfbWFsbG9jKGFsbG9jKTsKLSAgICBtZW1zZXQoY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kcywgMCwgYWxsb2MpOwotICAgIGZvciAocm0gPSBzLT5yZWdpc3RlcmVkX21ldGhvZHM7IHJtOyBybSA9IHJtLT5uZXh0KSB7Ci0gICAgICBob3N0ID0gcm0tPmhvc3QgPyBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHJtLT5ob3N0KSA6IE5VTEw7Ci0gICAgICBtZXRob2QgPSBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHJtLT5tZXRob2QpOwotICAgICAgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChob3N0ID8gaG9zdC0+aGFzaCA6IDAsIG1ldGhvZC0+aGFzaCk7Ci0gICAgICBmb3IgKHByb2JlcyA9IDA7IGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZHNbKGhhc2ggKyBwcm9iZXMpICUgc2xvdHNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VydmVyX3JlZ2lzdGVyZWRfbWV0aG9kICE9IE5VTEw7Ci0gICAgICAgICAgIHByb2JlcysrKQotICAgICAgICA7Ci0gICAgICBpZiAocHJvYmVzID4gbWF4X3Byb2JlcykgbWF4X3Byb2JlcyA9IHByb2JlczsKLSAgICAgIGNybSA9ICZjaGFuZC0+cmVnaXN0ZXJlZF9tZXRob2RzWyhoYXNoICsgcHJvYmVzKSAlIHNsb3RzXTsKLSAgICAgIGNybS0+c2VydmVyX3JlZ2lzdGVyZWRfbWV0aG9kID0gcm07Ci0gICAgICBjcm0tPmhvc3QgPSBob3N0OwotICAgICAgY3JtLT5tZXRob2QgPSBtZXRob2Q7Ci0gICAgfQotICAgIEdQUl9BU1NFUlQoc2xvdHMgPD0gVUlOVDMyX01BWCk7Ci0gICAgY2hhbmQtPnJlZ2lzdGVyZWRfbWV0aG9kX3Nsb3RzID0gKHVpbnQzMl90KXNsb3RzOwotICAgIGNoYW5kLT5yZWdpc3RlcmVkX21ldGhvZF9tYXhfcHJvYmVzID0gbWF4X3Byb2JlczsKLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZzLT5tdV9nbG9iYWwpOwotICBjaGFuZC0+bmV4dCA9ICZzLT5yb290X2NoYW5uZWxfZGF0YTsKLSAgY2hhbmQtPnByZXYgPSBjaGFuZC0+bmV4dC0+cHJldjsKLSAgY2hhbmQtPm5leHQtPnByZXYgPSBjaGFuZC0+cHJldi0+bmV4dCA9IGNoYW5kOwotICBncHJfbXVfdW5sb2NrKCZzLT5tdV9nbG9iYWwpOwotCi0gIEdSUENfQ0hBTk5FTF9JTlRFUk5BTF9SRUYoY2hhbm5lbCwgImNvbm5lY3Rpdml0eSIpOwotICBtZW1zZXQoJm9wLCAwLCBzaXplb2Yob3ApKTsKLSAgb3Auc2V0X2FjY2VwdF9zdHJlYW0gPSB0cnVlOwotICBvcC5zZXRfYWNjZXB0X3N0cmVhbV9mbiA9IGFjY2VwdF9zdHJlYW07Ci0gIG9wLnNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YSA9IGNoYW5kOwotICBvcC5vbl9jb25uZWN0aXZpdHlfc3RhdGVfY2hhbmdlID0gJmNoYW5kLT5jaGFubmVsX2Nvbm5lY3Rpdml0eV9jaGFuZ2VkOwotICBvcC5jb25uZWN0aXZpdHlfc3RhdGUgPSAmY2hhbmQtPmNvbm5lY3Rpdml0eV9zdGF0ZTsKLSAgb3AuZGlzY29ubmVjdCA9IGdwcl9hdG1fYWNxX2xvYWQoJnMtPnNodXRkb3duX2ZsYWcpICE9IDA7Ci0gIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fb3AoZXhlY19jdHgsIHRyYW5zcG9ydCwgJm9wKTsKLX0KLQotdm9pZCBkb25lX3B1Ymxpc2hlZF9zaHV0ZG93bihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqZG9uZV9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY3FfY29tcGxldGlvbiAqc3RvcmFnZSkgewotICAodm9pZClkb25lX2FyZzsKLSAgZ3ByX2ZyZWUoc3RvcmFnZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpc3RlbmVyX2Rlc3Ryb3lfZG9uZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgZ3JwY19zZXJ2ZXIgKnNlcnZlciA9IHM7Ci0gIGdwcl9tdV9sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7Ci0gIHNlcnZlci0+bGlzdGVuZXJzX2Rlc3Ryb3llZCsrOwotICBtYXliZV9maW5pc2hfc2h1dGRvd24oZXhlY19jdHgsIHNlcnZlcik7Ci0gIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9zaHV0ZG93bl9hbmRfbm90aWZ5KGdycGNfc2VydmVyICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcSwgdm9pZCAqdGFnKSB7Ci0gIGxpc3RlbmVyICpsOwotICBzaHV0ZG93bl90YWcgKnNkdDsKLSAgY2hhbm5lbF9icm9hZGNhc3RlciBicm9hZGNhc3RlcjsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfc2h1dGRvd25fYW5kX25vdGlmeShzZXJ2ZXI9JXAsIGNxPSVwLCB0YWc9JXApIiwgMywKLSAgICAgICAgICAgICAgICAgKHNlcnZlciwgY3EsIHRhZykpOwotCi0gIC8qIGxvY2ssIGFuZCBnYXRoZXIgdXAgc29tZSBzdHVmZiB0byBkbyAqLwotICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOwotICBncnBjX2NxX2JlZ2luX29wKGNxLCB0YWcpOwotICBpZiAoc2VydmVyLT5zaHV0ZG93bl9wdWJsaXNoZWQpIHsKLSAgICBncnBjX2NxX2VuZF9vcCgmZXhlY19jdHgsIGNxLCB0YWcsIDEsIGRvbmVfcHVibGlzaGVkX3NodXRkb3duLCBOVUxMLAotICAgICAgICAgICAgICAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY3FfY29tcGxldGlvbikpKTsKLSAgICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7Ci0gICAgZ290byBkb25lOwotICB9Ci0gIHNlcnZlci0+c2h1dGRvd25fdGFncyA9Ci0gICAgICBncHJfcmVhbGxvYyhzZXJ2ZXItPnNodXRkb3duX3RhZ3MsCi0gICAgICAgICAgICAgICAgICBzaXplb2Yoc2h1dGRvd25fdGFnKSAqIChzZXJ2ZXItPm51bV9zaHV0ZG93bl90YWdzICsgMSkpOwotICBzZHQgPSAmc2VydmVyLT5zaHV0ZG93bl90YWdzW3NlcnZlci0+bnVtX3NodXRkb3duX3RhZ3MrK107Ci0gIHNkdC0+dGFnID0gdGFnOwotICBzZHQtPmNxID0gY3E7Ci0gIGlmIChncHJfYXRtX2FjcV9sb2FkKCZzZXJ2ZXItPnNodXRkb3duX2ZsYWcpKSB7Ci0gICAgZ3ByX211X3VubG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIHNlcnZlci0+bGFzdF9zaHV0ZG93bl9tZXNzYWdlX3RpbWUgPSBncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSk7Ci0KLSAgY2hhbm5lbF9icm9hZGNhc3Rlcl9pbml0KHNlcnZlciwgJmJyb2FkY2FzdGVyKTsKLQotICBncHJfYXRtX3JlbF9zdG9yZSgmc2VydmVyLT5zaHV0ZG93bl9mbGFnLCAxKTsKLQotICAvKiBjb2xsZWN0IGFsbCB1bnJlZ2lzdGVyZWQgdGhlbiByZWdpc3RlcmVkIGNhbGxzICovCi0gIGdwcl9tdV9sb2NrKCZzZXJ2ZXItPm11X2NhbGwpOwotICBraWxsX3BlbmRpbmdfd29ya19sb2NrZWQoJmV4ZWNfY3R4LCBzZXJ2ZXIpOwotICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2NhbGwpOwotCi0gIG1heWJlX2ZpbmlzaF9zaHV0ZG93bigmZXhlY19jdHgsIHNlcnZlcik7Ci0gIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKLQotICAvKiBTaHV0ZG93biBsaXN0ZW5lcnMgKi8KLSAgZm9yIChsID0gc2VydmVyLT5saXN0ZW5lcnM7IGw7IGwgPSBsLT5uZXh0KSB7Ci0gICAgZ3JwY19jbG9zdXJlX2luaXQoJmwtPmRlc3Ryb3lfZG9uZSwgbGlzdGVuZXJfZGVzdHJveV9kb25lLCBzZXJ2ZXIpOwotICAgIGwtPmRlc3Ryb3koJmV4ZWNfY3R4LCBzZXJ2ZXIsIGwtPmFyZywgJmwtPmRlc3Ryb3lfZG9uZSk7Ci0gIH0KLQotICBjaGFubmVsX2Jyb2FkY2FzdGVyX3NodXRkb3duKCZleGVjX2N0eCwgJmJyb2FkY2FzdGVyLCAxLCAwKTsKLQotZG9uZToKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9jYW5jZWxfYWxsX2NhbGxzKGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKLSAgY2hhbm5lbF9icm9hZGNhc3RlciBicm9hZGNhc3RlcjsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLQotICBHUlBDX0FQSV9UUkFDRSgiZ3JwY19zZXJ2ZXJfY2FuY2VsX2FsbF9jYWxscyhzZXJ2ZXI9JXApIiwgMSwgKHNlcnZlcikpOwotCi0gIGdwcl9tdV9sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7Ci0gIGNoYW5uZWxfYnJvYWRjYXN0ZXJfaW5pdChzZXJ2ZXIsICZicm9hZGNhc3Rlcik7Ci0gIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfZ2xvYmFsKTsKLQotICBjaGFubmVsX2Jyb2FkY2FzdGVyX3NodXRkb3duKCZleGVjX2N0eCwgJmJyb2FkY2FzdGVyLCAwLCAxKTsKLSAgZ3JwY19leGVjX2N0eF9maW5pc2goJmV4ZWNfY3R4KTsKLX0KLQotdm9pZCBncnBjX3NlcnZlcl9kZXN0cm95KGdycGNfc2VydmVyICpzZXJ2ZXIpIHsKLSAgbGlzdGVuZXIgKmw7Ci0gIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7Ci0KLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX2Rlc3Ryb3koc2VydmVyPSVwKSIsIDEsIChzZXJ2ZXIpKTsKLQotICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOwotICBHUFJfQVNTRVJUKGdwcl9hdG1fYWNxX2xvYWQoJnNlcnZlci0+c2h1dGRvd25fZmxhZykgfHwgIXNlcnZlci0+bGlzdGVuZXJzKTsKLSAgR1BSX0FTU0VSVChzZXJ2ZXItPmxpc3RlbmVyc19kZXN0cm95ZWQgPT0gbnVtX2xpc3RlbmVycyhzZXJ2ZXIpKTsKLQotICB3aGlsZSAoc2VydmVyLT5saXN0ZW5lcnMpIHsKLSAgICBsID0gc2VydmVyLT5saXN0ZW5lcnM7Ci0gICAgc2VydmVyLT5saXN0ZW5lcnMgPSBsLT5uZXh0OwotICAgIGdwcl9mcmVlKGwpOwotICB9Ci0KLSAgZ3ByX211X3VubG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOwotCi0gIHNlcnZlcl91bnJlZigmZXhlY19jdHgsIHNlcnZlcik7Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci19Ci0KLXZvaWQgZ3JwY19zZXJ2ZXJfYWRkX2xpc3RlbmVyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICphcmcsCi0gICAgdm9pZCAoKnN0YXJ0KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50KSwKLSAgICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9kb25lKSkgewotICBsaXN0ZW5lciAqbCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGxpc3RlbmVyKSk7Ci0gIGwtPmFyZyA9IGFyZzsKLSAgbC0+c3RhcnQgPSBzdGFydDsKLSAgbC0+ZGVzdHJveSA9IGRlc3Ryb3k7Ci0gIGwtPm5leHQgPSBzZXJ2ZXItPmxpc3RlbmVyczsKLSAgc2VydmVyLT5saXN0ZW5lcnMgPSBsOwotfQotCi1zdGF0aWMgZ3JwY19jYWxsX2Vycm9yIHF1ZXVlX2NhbGxfcmVxdWVzdChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc2VydmVyICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfY2FsbCAqcmMpIHsKLSAgY2FsbF9kYXRhICpjYWxsZCA9IE5VTEw7Ci0gIHJlcXVlc3RfbWF0Y2hlciAqcm0gPSBOVUxMOwotICBpbnQgcmVxdWVzdF9pZDsKLSAgaWYgKGdwcl9hdG1fYWNxX2xvYWQoJnNlcnZlci0+c2h1dGRvd25fZmxhZykpIHsKLSAgICBmYWlsX2NhbGwoZXhlY19jdHgsIHNlcnZlciwgcmMpOwotICAgIHJldHVybiBHUlBDX0NBTExfT0s7Ci0gIH0KLSAgcmVxdWVzdF9pZCA9IGdwcl9zdGFja19sb2NrZnJlZV9wb3Aoc2VydmVyLT5yZXF1ZXN0X2ZyZWVsaXN0KTsKLSAgaWYgKHJlcXVlc3RfaWQgPT0gLTEpIHsKLSAgICAvKiBvdXQgb2YgcmVxdWVzdCBpZHM6IGp1c3QgZmFpbCB0aGlzIG9uZSAqLwotICAgIGZhaWxfY2FsbChleGVjX2N0eCwgc2VydmVyLCByYyk7Ci0gICAgcmV0dXJuIEdSUENfQ0FMTF9PSzsKLSAgfQotICBzd2l0Y2ggKHJjLT50eXBlKSB7Ci0gICAgY2FzZSBCQVRDSF9DQUxMOgotICAgICAgcm0gPSAmc2VydmVyLT51bnJlZ2lzdGVyZWRfcmVxdWVzdF9tYXRjaGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRUdJU1RFUkVEX0NBTEw6Ci0gICAgICBybSA9ICZyYy0+ZGF0YS5yZWdpc3RlcmVkLnJlZ2lzdGVyZWRfbWV0aG9kLT5yZXF1ZXN0X21hdGNoZXI7Ci0gICAgICBicmVhazsKLSAgfQotICBzZXJ2ZXItPnJlcXVlc3RlZF9jYWxsc1tyZXF1ZXN0X2lkXSA9ICpyYzsKLSAgZ3ByX2ZyZWUocmMpOwotICBpZiAoZ3ByX3N0YWNrX2xvY2tmcmVlX3B1c2gocm0tPnJlcXVlc3RzLCByZXF1ZXN0X2lkKSkgewotICAgIC8qIHRoaXMgd2FzIHRoZSBmaXJzdCBxdWV1ZWQgcmVxdWVzdDogd2UgbmVlZCB0byBsb2NrIGFuZCBzdGFydAotICAgICAgIG1hdGNoaW5nIGNhbGxzICovCi0gICAgZ3ByX211X2xvY2soJnNlcnZlci0+bXVfY2FsbCk7Ci0gICAgd2hpbGUgKChjYWxsZCA9IHJtLT5wZW5kaW5nX2hlYWQpICE9IE5VTEwpIHsKLSAgICAgIHJlcXVlc3RfaWQgPSBncHJfc3RhY2tfbG9ja2ZyZWVfcG9wKHJtLT5yZXF1ZXN0cyk7Ci0gICAgICBpZiAocmVxdWVzdF9pZCA9PSAtMSkgYnJlYWs7Ci0gICAgICBybS0+cGVuZGluZ19oZWFkID0gY2FsbGQtPnBlbmRpbmdfbmV4dDsKLSAgICAgIGdwcl9tdV91bmxvY2soJnNlcnZlci0+bXVfY2FsbCk7Ci0gICAgICBncHJfbXVfbG9jaygmY2FsbGQtPm11X3N0YXRlKTsKLSAgICAgIGlmIChjYWxsZC0+c3RhdGUgPT0gWk9NQklFRCkgewotICAgICAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOwotICAgICAgICBncnBjX2Nsb3N1cmVfaW5pdCgKLSAgICAgICAgICAgICZjYWxsZC0+a2lsbF96b21iaWVfY2xvc3VyZSwga2lsbF96b21iaWUsCi0gICAgICAgICAgICBncnBjX2NhbGxfc3RhY2tfZWxlbWVudChncnBjX2NhbGxfZ2V0X2NhbGxfc3RhY2soY2FsbGQtPmNhbGwpLCAwKSk7Ci0gICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJmNhbGxkLT5raWxsX3pvbWJpZV9jbG9zdXJlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHUFJfQVNTRVJUKGNhbGxkLT5zdGF0ZSA9PSBQRU5ESU5HKTsKLSAgICAgICAgY2FsbGQtPnN0YXRlID0gQUNUSVZBVEVEOwotICAgICAgICBncHJfbXVfdW5sb2NrKCZjYWxsZC0+bXVfc3RhdGUpOwotICAgICAgICBiZWdpbl9jYWxsKGV4ZWNfY3R4LCBzZXJ2ZXIsIGNhbGxkLAotICAgICAgICAgICAgICAgICAgICZzZXJ2ZXItPnJlcXVlc3RlZF9jYWxsc1tyZXF1ZXN0X2lkXSk7Ci0gICAgICB9Ci0gICAgICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9jYWxsKTsKLSAgICB9Ci0gICAgZ3ByX211X3VubG9jaygmc2VydmVyLT5tdV9jYWxsKTsKLSAgfQotICByZXR1cm4gR1JQQ19DQUxMX09LOwotfQotCi1ncnBjX2NhbGxfZXJyb3IgZ3JwY19zZXJ2ZXJfcmVxdWVzdF9jYWxsKAotICAgIGdycGNfc2VydmVyICpzZXJ2ZXIsIGdycGNfY2FsbCAqKmNhbGwsIGdycGNfY2FsbF9kZXRhaWxzICpkZXRhaWxzLAotICAgIGdycGNfbWV0YWRhdGFfYXJyYXkgKmluaXRpYWxfbWV0YWRhdGEsCi0gICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcV9ib3VuZF90b19jYWxsLAotICAgIGdycGNfY29tcGxldGlvbl9xdWV1ZSAqY3FfZm9yX25vdGlmaWNhdGlvbiwgdm9pZCAqdGFnKSB7Ci0gIGdycGNfY2FsbF9lcnJvciBlcnJvcjsKLSAgZ3JwY19leGVjX2N0eCBleGVjX2N0eCA9IEdSUENfRVhFQ19DVFhfSU5JVDsKLSAgcmVxdWVzdGVkX2NhbGwgKnJjID0gZ3ByX21hbGxvYyhzaXplb2YoKnJjKSk7Ci0gIEdSUENfQVBJX1RSQUNFKAotICAgICAgImdycGNfc2VydmVyX3JlcXVlc3RfY2FsbCgiCi0gICAgICAic2VydmVyPSVwLCBjYWxsPSVwLCBkZXRhaWxzPSVwLCBpbml0aWFsX21ldGFkYXRhPSVwLCAiCi0gICAgICAiY3FfYm91bmRfdG9fY2FsbD0lcCwgY3FfZm9yX25vdGlmaWNhdGlvbj0lcCwgdGFnPSVwKSIsCi0gICAgICA3LCAoc2VydmVyLCBjYWxsLCBkZXRhaWxzLCBpbml0aWFsX21ldGFkYXRhLCBjcV9ib3VuZF90b19jYWxsLAotICAgICAgICAgIGNxX2Zvcl9ub3RpZmljYXRpb24sIHRhZykpOwotICBpZiAoIWdycGNfY3FfaXNfc2VydmVyX2NxKGNxX2Zvcl9ub3RpZmljYXRpb24pKSB7Ci0gICAgZ3ByX2ZyZWUocmMpOwotICAgIGVycm9yID0gR1JQQ19DQUxMX0VSUk9SX05PVF9TRVJWRVJfQ09NUExFVElPTl9RVUVVRTsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLSAgZ3JwY19jcV9iZWdpbl9vcChjcV9mb3Jfbm90aWZpY2F0aW9uLCB0YWcpOwotICBkZXRhaWxzLT5yZXNlcnZlZCA9IE5VTEw7Ci0gIHJjLT50eXBlID0gQkFUQ0hfQ0FMTDsKLSAgcmMtPnNlcnZlciA9IHNlcnZlcjsKLSAgcmMtPnRhZyA9IHRhZzsKLSAgcmMtPmNxX2JvdW5kX3RvX2NhbGwgPSBjcV9ib3VuZF90b19jYWxsOwotICByYy0+Y3FfZm9yX25vdGlmaWNhdGlvbiA9IGNxX2Zvcl9ub3RpZmljYXRpb247Ci0gIHJjLT5jYWxsID0gY2FsbDsKLSAgcmMtPmRhdGEuYmF0Y2guZGV0YWlscyA9IGRldGFpbHM7Ci0gIHJjLT5pbml0aWFsX21ldGFkYXRhID0gaW5pdGlhbF9tZXRhZGF0YTsKLSAgZXJyb3IgPSBxdWV1ZV9jYWxsX3JlcXVlc3QoJmV4ZWNfY3R4LCBzZXJ2ZXIsIHJjKTsKLWRvbmU6Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotZ3JwY19jYWxsX2Vycm9yIGdycGNfc2VydmVyX3JlcXVlc3RfcmVnaXN0ZXJlZF9jYWxsKAotICAgIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKnJtcCwgZ3JwY19jYWxsICoqY2FsbCwgZ3ByX3RpbWVzcGVjICpkZWFkbGluZSwKLSAgICBncnBjX21ldGFkYXRhX2FycmF5ICppbml0aWFsX21ldGFkYXRhLCBncnBjX2J5dGVfYnVmZmVyICoqb3B0aW9uYWxfcGF5bG9hZCwKLSAgICBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxX2JvdW5kX3RvX2NhbGwsCi0gICAgZ3JwY19jb21wbGV0aW9uX3F1ZXVlICpjcV9mb3Jfbm90aWZpY2F0aW9uLCB2b2lkICp0YWcpIHsKLSAgZ3JwY19jYWxsX2Vycm9yIGVycm9yOwotICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwotICByZXF1ZXN0ZWRfY2FsbCAqcmMgPSBncHJfbWFsbG9jKHNpemVvZigqcmMpKTsKLSAgcmVnaXN0ZXJlZF9tZXRob2QgKnJtID0gcm1wOwotICBHUlBDX0FQSV9UUkFDRSgKLSAgICAgICJncnBjX3NlcnZlcl9yZXF1ZXN0X3JlZ2lzdGVyZWRfY2FsbCgiCi0gICAgICAic2VydmVyPSVwLCBybXA9JXAsIGNhbGw9JXAsIGRlYWRsaW5lPSVwLCBpbml0aWFsX21ldGFkYXRhPSVwLCAiCi0gICAgICAib3B0aW9uYWxfcGF5bG9hZD0lcCwgY3FfYm91bmRfdG9fY2FsbD0lcCwgY3FfZm9yX25vdGlmaWNhdGlvbj0lcCwgIgotICAgICAgInRhZz0lcCkiLAotICAgICAgOSwgKHNlcnZlciwgcm1wLCBjYWxsLCBkZWFkbGluZSwgaW5pdGlhbF9tZXRhZGF0YSwgb3B0aW9uYWxfcGF5bG9hZCwKLSAgICAgICAgICBjcV9ib3VuZF90b19jYWxsLCBjcV9mb3Jfbm90aWZpY2F0aW9uLCB0YWcpKTsKLSAgaWYgKCFncnBjX2NxX2lzX3NlcnZlcl9jcShjcV9mb3Jfbm90aWZpY2F0aW9uKSkgewotICAgIGdwcl9mcmVlKHJjKTsKLSAgICBlcnJvciA9IEdSUENfQ0FMTF9FUlJPUl9OT1RfU0VSVkVSX0NPTVBMRVRJT05fUVVFVUU7Ci0gICAgZ290byBkb25lOwotICB9Ci0gIGdycGNfY3FfYmVnaW5fb3AoY3FfZm9yX25vdGlmaWNhdGlvbiwgdGFnKTsKLSAgcmMtPnR5cGUgPSBSRUdJU1RFUkVEX0NBTEw7Ci0gIHJjLT5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gIHJjLT50YWcgPSB0YWc7Ci0gIHJjLT5jcV9ib3VuZF90b19jYWxsID0gY3FfYm91bmRfdG9fY2FsbDsKLSAgcmMtPmNxX2Zvcl9ub3RpZmljYXRpb24gPSBjcV9mb3Jfbm90aWZpY2F0aW9uOwotICByYy0+Y2FsbCA9IGNhbGw7Ci0gIHJjLT5kYXRhLnJlZ2lzdGVyZWQucmVnaXN0ZXJlZF9tZXRob2QgPSBybTsKLSAgcmMtPmRhdGEucmVnaXN0ZXJlZC5kZWFkbGluZSA9IGRlYWRsaW5lOwotICByYy0+aW5pdGlhbF9tZXRhZGF0YSA9IGluaXRpYWxfbWV0YWRhdGE7Ci0gIHJjLT5kYXRhLnJlZ2lzdGVyZWQub3B0aW9uYWxfcGF5bG9hZCA9IG9wdGlvbmFsX3BheWxvYWQ7Ci0gIGVycm9yID0gcXVldWVfY2FsbF9yZXF1ZXN0KCZleGVjX2N0eCwgc2VydmVyLCByYyk7Ci1kb25lOgotICBncnBjX2V4ZWNfY3R4X2ZpbmlzaCgmZXhlY19jdHgpOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1Ymxpc2hfcmVnaXN0ZXJlZF9vcl9iYXRjaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsIGJvb2wgc3VjY2Vzcyk7Ci0KLXN0YXRpYyB2b2lkIGNwc3RyKGNoYXIgKipkZXN0LCBzaXplX3QgKmNhcGFjaXR5LCBncnBjX21kc3RyICp2YWx1ZSkgewotICBncHJfc2xpY2Ugc2xpY2UgPSB2YWx1ZS0+c2xpY2U7Ci0gIHNpemVfdCBsZW4gPSBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKTsKLQotICBpZiAobGVuICsgMSA+ICpjYXBhY2l0eSkgewotICAgICpjYXBhY2l0eSA9IEdQUl9NQVgobGVuICsgMSwgKmNhcGFjaXR5ICogMik7Ci0gICAgKmRlc3QgPSBncHJfcmVhbGxvYygqZGVzdCwgKmNhcGFjaXR5KTsKLSAgfQotICBtZW1jcHkoKmRlc3QsIGdycGNfbWRzdHJfYXNfY19zdHJpbmcodmFsdWUpLCBsZW4gKyAxKTsKLX0KLQotc3RhdGljIHZvaWQgYmVnaW5fY2FsbChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9kYXRhICpjYWxsZCwgcmVxdWVzdGVkX2NhbGwgKnJjKSB7Ci0gIGdycGNfb3Agb3BzWzFdOwotICBncnBjX29wICpvcCA9IG9wczsKLQotICBtZW1zZXQob3BzLCAwLCBzaXplb2Yob3BzKSk7Ci0KLSAgLyogY2FsbGVkIG9uY2UgaW5pdGlhbCBtZXRhZGF0YSBoYXMgYmVlbiByZWFkIGJ5IHRoZSBjYWxsLCBidXQgQkVGT1JFCi0gICAgIHRoZSBpb3JlcSB0byBmZXRjaCBpdCBvdXQgb2YgdGhlIGNhbGwgaGFzIGJlZW4gZXhlY3V0ZWQuCi0gICAgIFRoaXMgbWVhbnMgbWV0YWRhdGEgcmVsYXRlZCBmaWVsZHMgY2FuIGJlIHJlbGllZCBvbiBpbiBjYWxsZCwgYnV0IHRvCi0gICAgIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGFycmF5IHBhc3NlZCBieSB0aGUgY2xpZW50LCB3ZSBuZWVkIHRvIHBlcmZvcm0KLSAgICAgYW4gaW9yZXEgb3AsIHRoYXQgc2hvdWxkIGNvbXBsZXRlIGltbWVkaWF0ZWx5LiAqLwotCi0gIGdycGNfY2FsbF9zZXRfY29tcGxldGlvbl9xdWV1ZShleGVjX2N0eCwgY2FsbGQtPmNhbGwsIHJjLT5jcV9ib3VuZF90b19jYWxsKTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnJjLT5wdWJsaXNoLCBwdWJsaXNoX3JlZ2lzdGVyZWRfb3JfYmF0Y2gsIHJjKTsKLSAgKnJjLT5jYWxsID0gY2FsbGQtPmNhbGw7Ci0gIGNhbGxkLT5jcV9uZXcgPSByYy0+Y3FfZm9yX25vdGlmaWNhdGlvbjsKLSAgR1BSX1NXQVAoZ3JwY19tZXRhZGF0YV9hcnJheSwgKnJjLT5pbml0aWFsX21ldGFkYXRhLCBjYWxsZC0+aW5pdGlhbF9tZXRhZGF0YSk7Ci0gIHN3aXRjaCAocmMtPnR5cGUpIHsKLSAgICBjYXNlIEJBVENIX0NBTEw6Ci0gICAgICBHUFJfQVNTRVJUKGNhbGxkLT5ob3N0ICE9IE5VTEwpOwotICAgICAgR1BSX0FTU0VSVChjYWxsZC0+cGF0aCAhPSBOVUxMKTsKLSAgICAgIGNwc3RyKCZyYy0+ZGF0YS5iYXRjaC5kZXRhaWxzLT5ob3N0LAotICAgICAgICAgICAgJnJjLT5kYXRhLmJhdGNoLmRldGFpbHMtPmhvc3RfY2FwYWNpdHksIGNhbGxkLT5ob3N0KTsKLSAgICAgIGNwc3RyKCZyYy0+ZGF0YS5iYXRjaC5kZXRhaWxzLT5tZXRob2QsCi0gICAgICAgICAgICAmcmMtPmRhdGEuYmF0Y2guZGV0YWlscy0+bWV0aG9kX2NhcGFjaXR5LCBjYWxsZC0+cGF0aCk7Ci0gICAgICByYy0+ZGF0YS5iYXRjaC5kZXRhaWxzLT5kZWFkbGluZSA9IGNhbGxkLT5kZWFkbGluZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVHSVNURVJFRF9DQUxMOgotICAgICAgKnJjLT5kYXRhLnJlZ2lzdGVyZWQuZGVhZGxpbmUgPSBjYWxsZC0+ZGVhZGxpbmU7Ci0gICAgICBpZiAocmMtPmRhdGEucmVnaXN0ZXJlZC5vcHRpb25hbF9wYXlsb2FkKSB7Ci0gICAgICAgIG9wLT5vcCA9IEdSUENfT1BfUkVDVl9NRVNTQUdFOwotICAgICAgICBvcC0+ZGF0YS5yZWN2X21lc3NhZ2UgPSByYy0+ZGF0YS5yZWdpc3RlcmVkLm9wdGlvbmFsX3BheWxvYWQ7Ci0gICAgICAgIG9wKys7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICk7Ci0gIH0KLQotICBHUlBDX0NBTExfSU5URVJOQUxfUkVGKGNhbGxkLT5jYWxsLCAic2VydmVyIik7Ci0gIGdycGNfY2FsbF9zdGFydF9iYXRjaF9hbmRfZXhlY3V0ZShleGVjX2N0eCwgY2FsbGQtPmNhbGwsIG9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKG9wIC0gb3BzKSwgJnJjLT5wdWJsaXNoKTsKLX0KLQotc3RhdGljIHZvaWQgZG9uZV9yZXF1ZXN0X2V2ZW50KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jcV9jb21wbGV0aW9uICpjKSB7Ci0gIHJlcXVlc3RlZF9jYWxsICpyYyA9IHJlcTsKLSAgZ3JwY19zZXJ2ZXIgKnNlcnZlciA9IHJjLT5zZXJ2ZXI7Ci0KLSAgaWYgKHJjID49IHNlcnZlci0+cmVxdWVzdGVkX2NhbGxzICYmCi0gICAgICByYyA8IHNlcnZlci0+cmVxdWVzdGVkX2NhbGxzICsgc2VydmVyLT5tYXhfcmVxdWVzdGVkX2NhbGxzKSB7Ci0gICAgR1BSX0FTU0VSVChyYyAtIHNlcnZlci0+cmVxdWVzdGVkX2NhbGxzIDw9IElOVF9NQVgpOwotICAgIGdwcl9zdGFja19sb2NrZnJlZV9wdXNoKHNlcnZlci0+cmVxdWVzdF9mcmVlbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShyYyAtIHNlcnZlci0+cmVxdWVzdGVkX2NhbGxzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ3ByX2ZyZWUocmVxKTsKLSAgfQotCi0gIHNlcnZlcl91bnJlZihleGVjX2N0eCwgc2VydmVyKTsKLX0KLQotc3RhdGljIHZvaWQgZmFpbF9jYWxsKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9jYWxsICpyYykgewotICAqcmMtPmNhbGwgPSBOVUxMOwotICByYy0+aW5pdGlhbF9tZXRhZGF0YS0+Y291bnQgPSAwOwotCi0gIHNlcnZlcl9yZWYoc2VydmVyKTsKLSAgZ3JwY19jcV9lbmRfb3AoZXhlY19jdHgsIHJjLT5jcV9mb3Jfbm90aWZpY2F0aW9uLCByYy0+dGFnLCAwLAotICAgICAgICAgICAgICAgICBkb25lX3JlcXVlc3RfZXZlbnQsIHJjLCAmcmMtPmNvbXBsZXRpb24pOwotfQotCi1zdGF0aWMgdm9pZCBwdWJsaXNoX3JlZ2lzdGVyZWRfb3JfYmF0Y2goZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnByYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpIHsKLSAgcmVxdWVzdGVkX2NhbGwgKnJjID0gcHJjOwotICBncnBjX2NhbGwgKmNhbGwgPSAqcmMtPmNhbGw7Ci0gIGdycGNfY2FsbF9lbGVtZW50ICplbGVtID0KLSAgICAgIGdycGNfY2FsbF9zdGFja19lbGVtZW50KGdycGNfY2FsbF9nZXRfY2FsbF9zdGFjayhjYWxsKSwgMCk7Ci0gIGNhbGxfZGF0YSAqY2FsbGQgPSBlbGVtLT5jYWxsX2RhdGE7Ci0gIGNoYW5uZWxfZGF0YSAqY2hhbmQgPSBlbGVtLT5jaGFubmVsX2RhdGE7Ci0gIHNlcnZlcl9yZWYoY2hhbmQtPnNlcnZlcik7Ci0gIGdycGNfY3FfZW5kX29wKGV4ZWNfY3R4LCBjYWxsZC0+Y3FfbmV3LCByYy0+dGFnLCBzdWNjZXNzLCBkb25lX3JlcXVlc3RfZXZlbnQsCi0gICAgICAgICAgICAgICAgIHJjLCAmcmMtPmNvbXBsZXRpb24pOwotICBHUlBDX0NBTExfSU5URVJOQUxfVU5SRUYoZXhlY19jdHgsIGNhbGwsICJzZXJ2ZXIiKTsKLX0KLQotY29uc3QgZ3JwY19jaGFubmVsX2FyZ3MgKmdycGNfc2VydmVyX2dldF9jaGFubmVsX2FyZ3MoZ3JwY19zZXJ2ZXIgKnNlcnZlcikgewotICByZXR1cm4gc2VydmVyLT5jaGFubmVsX2FyZ3M7Ci19Ci0KLWludCBncnBjX3NlcnZlcl9oYXNfb3Blbl9jb25uZWN0aW9ucyhncnBjX3NlcnZlciAqc2VydmVyKSB7Ci0gIGludCByOwotICBncHJfbXVfbG9jaygmc2VydmVyLT5tdV9nbG9iYWwpOwotICByID0gc2VydmVyLT5yb290X2NoYW5uZWxfZGF0YS5uZXh0ICE9ICZzZXJ2ZXItPnJvb3RfY2hhbm5lbF9kYXRhOwotICBncHJfbXVfdW5sb2NrKCZzZXJ2ZXItPm11X2dsb2JhbCk7Ci0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCBiL3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjJlYWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1NVUkZBQ0VfU0VSVkVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1NVUkZBQ0VfU0VSVkVSX0gKLQotI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKLQotZXh0ZXJuIGNvbnN0IGdycGNfY2hhbm5lbF9maWx0ZXIgZ3JwY19zZXJ2ZXJfdG9wX2ZpbHRlcjsKLQotLyogQWRkIGEgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcjogd2hlbiB0aGUgc2VydmVyIHN0YXJ0cywgaXQgd2lsbCBjYWxsIHN0YXJ0LAotICAgYW5kIHdoZW4gaXQgc2h1dHMgZG93biwgaXQgd2lsbCBjYWxsIGRlc3Ryb3kgKi8KLXZvaWQgZ3JwY19zZXJ2ZXJfYWRkX2xpc3RlbmVyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICpsaXN0ZW5lciwKLSAgICB2b2lkICgqc3RhcnQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXQgKipwb2xsc2V0cywgc2l6ZV90IG5wb2xsc2V0cyksCi0gICAgdm9pZCAoKmRlc3Ryb3kpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICphcmcsCi0gICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqb25fZG9uZSkpOwotCi0vKiBTZXR1cCBhIHRyYW5zcG9ydCAtIGNyZWF0ZXMgYSBjaGFubmVsIHN0YWNrLCBiaW5kcyB0aGUgdHJhbnNwb3J0IHRvIHRoZQotICAgc2VydmVyICovCi12b2lkIGdycGNfc2VydmVyX3NldHVwX3RyYW5zcG9ydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19zZXJ2ZXIgKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqYXJncyk7Ci0KLWNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpncnBjX3NlcnZlcl9nZXRfY2hhbm5lbF9hcmdzKGdycGNfc2VydmVyICpzZXJ2ZXIpOwotCi1pbnQgZ3JwY19zZXJ2ZXJfaGFzX29wZW5fY29ubmVjdGlvbnMoZ3JwY19zZXJ2ZXIgKnNlcnZlcik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfU1VSRkFDRV9TRVJWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMgYi9zcmMvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NzYwZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgotCi1zdGF0aWMgdm9pZCBzZXR1cF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KSB7Ci0gIGdycGNfc2VydmVyX3NldHVwX3RyYW5zcG9ydChleGVjX2N0eCwgc2VydmVyLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3NlcnZlcl9nZXRfY2hhbm5lbF9hcmdzKHNlcnZlcikpOwotfQotCi1zdGF0aWMgdm9pZCBuZXdfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfZW5kcG9pbnQgKnRjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190Y3Bfc2VydmVyX2FjY2VwdG9yICphY2NlcHRvcikgewotICAvKgotICAgKiBCZXdhcmUgdGhhdCB0aGUgY2FsbCB0byBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KCkgaGFzIHRvIGhhcHBlbiBiZWZvcmUKLSAgICogZ3JwY190Y3Bfc2VydmVyX2Rlc3Ryb3koKS4gVGhpcyBpcyBmaW5lIGhlcmUsIGJ1dCBzaW1pbGFyIGNvZGUKLSAgICogYXN5bmNocm9ub3VzbHkgZG9pbmcgYSBoYW5kc2hha2UgaW5zdGVhZCBvZiBjYWxsaW5nIGdycGNfdGNwX3NlcnZlcl9zdGFydCgpCi0gICAqIChhcyBpbiBzZXJ2ZXJfc2VjdXJlX2NodHRwMi5jKSBuZWVkcyB0byBhZGQgc3luY2hyb25pemF0aW9uIHRvIGF2b2lkIHRoaXMKLSAgICogY2FzZS4KLSAgICovCi0gIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAotICAgICAgZXhlY19jdHgsIGdycGNfc2VydmVyX2dldF9jaGFubmVsX2FyZ3Moc2VydmVyKSwgdGNwLCAwKTsKLSAgc2V0dXBfdHJhbnNwb3J0KGV4ZWNfY3R4LCBzZXJ2ZXIsIHRyYW5zcG9ydCk7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9zdGFydF9yZWFkaW5nKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIE5VTEwsIDApOwotfQotCi0vKiBTZXJ2ZXIgY2FsbGJhY2s6IHN0YXJ0IGxpc3RlbmluZyBvbiBvdXIgcG9ydHMgKi8KLXN0YXRpYyB2b2lkIHN0YXJ0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3NlcnZlciAqc2VydmVyLCB2b2lkICp0Y3BwLAotICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICoqcG9sbHNldHMsIHNpemVfdCBwb2xsc2V0X2NvdW50KSB7Ci0gIGdycGNfdGNwX3NlcnZlciAqdGNwID0gdGNwcDsKLSAgZ3JwY190Y3Bfc2VydmVyX3N0YXJ0KGV4ZWNfY3R4LCB0Y3AsIHBvbGxzZXRzLCBwb2xsc2V0X2NvdW50LCBuZXdfdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyKTsKLX0KLQotLyogU2VydmVyIGNhbGxiYWNrOiBkZXN0cm95IHRoZSB0Y3AgbGlzdGVuZXIgKHNvIHdlIGRvbid0IGdlbmVyYXRlIGZ1cnRoZXIKLSAgIGNhbGxiYWNrcykgKi8KLXN0YXRpYyB2b2lkIGRlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKnRjcHAsCi0gICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqZGVzdHJveV9kb25lKSB7Ci0gIGdycGNfdGNwX3NlcnZlciAqdGNwID0gdGNwcDsKLSAgZ3JwY190Y3Bfc2VydmVyX3VucmVmKGV4ZWNfY3R4LCB0Y3ApOwotICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGRlc3Ryb3lfZG9uZSwgdHJ1ZSwgTlVMTCk7Ci19Ci0KLWludCBncnBjX3NlcnZlcl9hZGRfaW5zZWN1cmVfaHR0cDJfcG9ydChncnBjX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICphZGRyKSB7Ci0gIGdycGNfcmVzb2x2ZWRfYWRkcmVzc2VzICpyZXNvbHZlZCA9IE5VTEw7Ci0gIGdycGNfdGNwX3NlcnZlciAqdGNwID0gTlVMTDsKLSAgc2l6ZV90IGk7Ci0gIHVuc2lnbmVkIGNvdW50ID0gMDsKLSAgaW50IHBvcnRfbnVtID0gLTE7Ci0gIGludCBwb3J0X3RlbXA7Ci0gIGdycGNfZXhlY19jdHggZXhlY19jdHggPSBHUlBDX0VYRUNfQ1RYX0lOSVQ7Ci0KLSAgR1JQQ19BUElfVFJBQ0UoImdycGNfc2VydmVyX2FkZF9pbnNlY3VyZV9odHRwMl9wb3J0KHNlcnZlcj0lcCwgYWRkcj0lcykiLCAyLAotICAgICAgICAgICAgICAgICAoc2VydmVyLCBhZGRyKSk7Ci0KLSAgcmVzb2x2ZWQgPSBncnBjX2Jsb2NraW5nX3Jlc29sdmVfYWRkcmVzcyhhZGRyLCAiaHR0cCIpOwotICBpZiAoIXJlc29sdmVkKSB7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIHRjcCA9IGdycGNfdGNwX3NlcnZlcl9jcmVhdGUoTlVMTCk7Ci0gIEdQUl9BU1NFUlQodGNwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcmVzb2x2ZWQtPm5hZGRyczsgaSsrKSB7Ci0gICAgcG9ydF90ZW1wID0gZ3JwY190Y3Bfc2VydmVyX2FkZF9wb3J0KAotICAgICAgICB0Y3AsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVzb2x2ZWQtPmFkZHJzW2ldLmFkZHIsCi0gICAgICAgIHJlc29sdmVkLT5hZGRyc1tpXS5sZW4pOwotICAgIGlmIChwb3J0X3RlbXAgPiAwKSB7Ci0gICAgICBpZiAocG9ydF9udW0gPT0gLTEpIHsKLSAgICAgICAgcG9ydF9udW0gPSBwb3J0X3RlbXA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHUFJfQVNTRVJUKHBvcnRfbnVtID09IHBvcnRfdGVtcCk7Ci0gICAgICB9Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgfQotICBpZiAoY291bnQgPT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiTm8gYWRkcmVzcyBhZGRlZCBvdXQgb2YgdG90YWwgJWQgcmVzb2x2ZWQiLAotICAgICAgICAgICAgcmVzb2x2ZWQtPm5hZGRycyk7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotICBpZiAoY291bnQgIT0gcmVzb2x2ZWQtPm5hZGRycykgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiT25seSAlZCBhZGRyZXNzZXMgYWRkZWQgb3V0IG9mIHRvdGFsICVkIHJlc29sdmVkIiwKLSAgICAgICAgICAgIGNvdW50LCByZXNvbHZlZC0+bmFkZHJzKTsKLSAgfQotICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlc29sdmVkKTsKLQotICAvKiBSZWdpc3RlciB3aXRoIHRoZSBzZXJ2ZXIgb25seSB1cG9uIHN1Y2Nlc3MgKi8KLSAgZ3JwY19zZXJ2ZXJfYWRkX2xpc3RlbmVyKCZleGVjX2N0eCwgc2VydmVyLCB0Y3AsIHN0YXJ0LCBkZXN0cm95KTsKLSAgZ290byBkb25lOwotCi0vKiBFcnJvciBwYXRoOiBjbGVhbnVwIGFuZCByZXR1cm4gKi8KLWVycm9yOgotICBpZiAocmVzb2x2ZWQpIHsKLSAgICBncnBjX3Jlc29sdmVkX2FkZHJlc3Nlc19kZXN0cm95KHJlc29sdmVkKTsKLSAgfQotICBpZiAodGNwKSB7Ci0gICAgZ3JwY190Y3Bfc2VydmVyX3VucmVmKCZleGVjX2N0eCwgdGNwKTsKLSAgfQotICBwb3J0X251bSA9IDA7Ci0KLWRvbmU6Ci0gIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7Ci0gIHJldHVybiBwb3J0X251bTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIGIvc3JjL2NvcmUvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWE4OGUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9TVVJGQUNFX1NVUkZBQ0VfVFJBQ0VfSAotI2RlZmluZSBHUlBDX0NPUkVfU1VSRkFDRV9TVVJGQUNFX1RSQUNFX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiCi0KLSNkZWZpbmUgR1JQQ19TVVJGQUNFX1RSQUNFX1JFVFVSTkVEX0VWRU5UKGNxLCBldmVudCkgICAgXAotICBpZiAoZ3JwY19hcGlfdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAqX2V2ID0gZ3JwY19ldmVudF9zdHJpbmcoZXZlbnQpOyAgICAgICAgICAgICAgIFwKLSAgICBncHJfbG9nKEdQUl9JTkZPLCAiUkVUVVJOX0VWRU5UWyVwXTogJXMiLCBjcSwgX2V2KTsgXAotICAgIGdwcl9mcmVlKF9ldik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEdSUENfQ09SRV9TVVJGQUNFX1NVUkZBQ0VfVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2ZmIyYy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotaW50IGdycGNfYnl0ZV9zdHJlYW1fbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0sIGdwcl9zbGljZSAqc2xpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZV9oaW50LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7Ci0gIHJldHVybiBieXRlX3N0cmVhbS0+bmV4dChleGVjX2N0eCwgYnl0ZV9zdHJlYW0sIHNsaWNlLCBtYXhfc2l6ZV9oaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fY29tcGxldGUpOwotfQotCi12b2lkIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfYnl0ZV9zdHJlYW0gKmJ5dGVfc3RyZWFtKSB7Ci0gIGJ5dGVfc3RyZWFtLT5kZXN0cm95KGV4ZWNfY3R4LCBieXRlX3N0cmVhbSk7Ci19Ci0KLS8qIHNsaWNlX2J1ZmZlcl9zdHJlYW0gKi8KLQotc3RhdGljIGludCBzbGljZV9idWZmZXJfc3RyZWFtX25leHQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqc2xpY2UsIHNpemVfdCBtYXhfc2l6ZV9oaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSkgewotICBncnBjX3NsaWNlX2J1ZmZlcl9zdHJlYW0gKnN0cmVhbSA9IChncnBjX3NsaWNlX2J1ZmZlcl9zdHJlYW0gKilieXRlX3N0cmVhbTsKLSAgR1BSX0FTU0VSVChzdHJlYW0tPmN1cnNvciA8IHN0cmVhbS0+YmFja2luZ19idWZmZXItPmNvdW50KTsKLSAgKnNsaWNlID0gZ3ByX3NsaWNlX3JlZihzdHJlYW0tPmJhY2tpbmdfYnVmZmVyLT5zbGljZXNbc3RyZWFtLT5jdXJzb3JdKTsKLSAgc3RyZWFtLT5jdXJzb3IrKzsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHNsaWNlX2J1ZmZlcl9zdHJlYW1fZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSkge30KLQotdm9pZCBncnBjX3NsaWNlX2J1ZmZlcl9zdHJlYW1faW5pdChncnBjX3NsaWNlX2J1ZmZlcl9zdHJlYW0gKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgewotICBHUFJfQVNTRVJUKHNsaWNlX2J1ZmZlci0+bGVuZ3RoIDw9IFVJTlQzMl9NQVgpOwotICBzdHJlYW0tPmJhc2UubGVuZ3RoID0gKHVpbnQzMl90KXNsaWNlX2J1ZmZlci0+bGVuZ3RoOwotICBzdHJlYW0tPmJhc2UuZmxhZ3MgPSBmbGFnczsKLSAgc3RyZWFtLT5iYXNlLm5leHQgPSBzbGljZV9idWZmZXJfc3RyZWFtX25leHQ7Ci0gIHN0cmVhbS0+YmFzZS5kZXN0cm95ID0gc2xpY2VfYnVmZmVyX3N0cmVhbV9kZXN0cm95OwotICBzdHJlYW0tPmJhY2tpbmdfYnVmZmVyID0gc2xpY2VfYnVmZmVyOwotICBzdHJlYW0tPmN1cnNvciA9IDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQyZDA3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0JZVEVfU1RSRUFNX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9CWVRFX1NUUkVBTV9ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIKLQotLyoqIEludGVybmFsIGJpdCBmbGFnIGZvciBncnBjX2JlZ2luX21lc3NhZ2UncyBcYSBmbGFncyBzaWduYWxpbmcgdGhlIHVzZSBvZgotICogY29tcHJlc3Npb24gZm9yIHRoZSBtZXNzYWdlICovCi0jZGVmaW5lIEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1MgKDB4ODAwMDAwMDB1KQotLyoqIE1hc2sgb2YgYWxsIHZhbGlkIGludGVybmFsIGZsYWdzLiAqLwotI2RlZmluZSBHUlBDX1dSSVRFX0lOVEVSTkFMX1VTRURfTUFTSyAoR1JQQ19XUklURV9JTlRFUk5BTF9DT01QUkVTUykKLQotc3RydWN0IGdycGNfYnl0ZV9zdHJlYW07Ci10eXBlZGVmIHN0cnVjdCBncnBjX2J5dGVfc3RyZWFtIGdycGNfYnl0ZV9zdHJlYW07Ci0KLXN0cnVjdCBncnBjX2J5dGVfc3RyZWFtIHsKLSAgdWludDMyX3QgbGVuZ3RoOwotICB1aW50MzJfdCBmbGFnczsKLSAgaW50ICgqbmV4dCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfYnl0ZV9zdHJlYW0gKmJ5dGVfc3RyZWFtLAotICAgICAgICAgICAgICBncHJfc2xpY2UgKnNsaWNlLCBzaXplX3QgbWF4X3NpemVfaGludCwKLSAgICAgICAgICAgICAgZ3JwY19jbG9zdXJlICpvbl9jb21wbGV0ZSk7Ci0gIHZvaWQgKCpkZXN0cm95KShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0pOwotfTsKLQotLyogcmV0dXJucyAxIGlmIHRoZSBieXRlcyBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IChpbiB3aGljaCBjYXNlCi0gKiBvbl9jb21wbGV0ZSB3aWxsIG5vdCBiZSBjYWxsZWQpLCAwIGlmIHRoZSBieXRlcyB3aWxsIGJlIGF2YWlsYWJsZQotICogYXN5bmNocm9ub3VzbHkuCi0gKgotICogb24gZW50cnksICpyZW1haW5pbmcgY2FuIGJlIHNldCBhcyBhIGhpbnQgYXMgdG8gdGhlIG1heGltdW0gbnVtYmVyCi0gKiBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIGFjY2VwdGFibGUgdG8gcmVhZC4KLSAqCi0gKiBmaWxscyAqYnVmZmVyLCAqbGVuZ3RoLCAqcmVtYWluaW5nIHdpdGggdGhlIGJ5dGVzLCBsZW5ndGggb2YgYnl0ZXMKLSAqIGFuZCBsZW5ndGggb2YgZGF0YSByZW1haW5pbmcgdG8gYmUgcmVhZCBiZWZvcmUgZWl0aGVyIHJldHVybmluZyAxCi0gKiBvciBjYWxsaW5nIG9uX2NvbXBsZXRlLgotICoKLSAqIG9uY2UgYSBzbGljZSBpcyByZXR1cm5lZCBpbnRvICpzbGljZSwgaXQgaXMgb3duZWQgYnkgdGhlIGNhbGxlci4KLSAqLwotaW50IGdycGNfYnl0ZV9zdHJlYW1fbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19ieXRlX3N0cmVhbSAqYnl0ZV9zdHJlYW0sIGdwcl9zbGljZSAqc2xpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZV9oaW50LCBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKTsKLQotdm9pZCBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSk7Ci0KLS8qIGdycGNfYnl0ZV9zdHJlYW0gdGhhdCB3cmFwcyBhIHNsaWNlIGJ1ZmZlciAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtIHsKLSAgZ3JwY19ieXRlX3N0cmVhbSBiYXNlOwotICBncHJfc2xpY2VfYnVmZmVyICpiYWNraW5nX2J1ZmZlcjsKLSAgc2l6ZV90IGN1cnNvcjsKLX0gZ3JwY19zbGljZV9idWZmZXJfc3RyZWFtOwotCi12b2lkIGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbV9pbml0KGdycGNfc2xpY2VfYnVmZmVyX3N0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfYnVmZmVyICpzbGljZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfQllURV9TVFJFQU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkYTRlNi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgiCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotLyogaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHN1cHBvcnRlZF92ZXJzaW9uc1tdID0geyJoMiJ9OwotCi1pbnQgZ3JwY19jaHR0cDJfaXNfYWxwbl92ZXJzaW9uX3N1cHBvcnRlZChjb25zdCBjaGFyICp2ZXJzaW9uLCBzaXplX3Qgc2l6ZSkgewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IEdQUl9BUlJBWV9TSVpFKHN1cHBvcnRlZF92ZXJzaW9ucyk7IGkrKykgewotICAgIGlmICghc3RybmNtcCh2ZXJzaW9uLCBzdXBwb3J0ZWRfdmVyc2lvbnNbaV0sIHNpemUpKSByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc2l6ZV90IGdycGNfY2h0dHAyX251bV9hbHBuX3ZlcnNpb25zKHZvaWQpIHsKLSAgcmV0dXJuIEdQUl9BUlJBWV9TSVpFKHN1cHBvcnRlZF92ZXJzaW9ucyk7Ci19Ci0KLWNvbnN0IGNoYXIgKmdycGNfY2h0dHAyX2dldF9hbHBuX3ZlcnNpb25faW5kZXgoc2l6ZV90IGkpIHsKLSAgR1BSX0FTU0VSVChpIDwgR1BSX0FSUkFZX1NJWkUoc3VwcG9ydGVkX3ZlcnNpb25zKSk7Ci0gIHJldHVybiBzdXBwb3J0ZWRfdmVyc2lvbnNbaV07Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODAxMGUzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9BTFBOX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfQUxQTl9ICi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogUmV0dW5zIDEgaWYgdGhlIHZlcnNpb24gaXMgc3VwcG9ydGVkLCAwIG90aGVyd2lzZS4gKi8KLWludCBncnBjX2NodHRwMl9pc19hbHBuX3ZlcnNpb25fc3VwcG9ydGVkKGNvbnN0IGNoYXIgKnZlcnNpb24sIHNpemVfdCBzaXplKTsKLQotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb3RvY29sIHZlcnNpb25zIHRvIGFkdmVydGlzZSAqLwotc2l6ZV90IGdycGNfY2h0dHAyX251bV9hbHBuX3ZlcnNpb25zKHZvaWQpOwotCi0vKiBSZXR1cm5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGF0IGluZGV4IGkgKDAgPD0gaSA8Ci0gKiBncnBjX2NodHRwMl9udW1fYWxwbl92ZXJzaW9ucygpKSAqLwotY29uc3QgY2hhciAqZ3JwY19jaHR0cDJfZ2V0X2FscG5fdmVyc2lvbl9pbmRleChzaXplX3QgaSk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9BTFBOX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzMTE2Mi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgYWxwaGFiZXRbXSA9Ci0gICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IGJpdHM7Ci0gIHVpbnQ4X3QgbGVuZ3RoOwotfSBiNjRfaHVmZl9zeW07Ci0KLXN0YXRpYyBjb25zdCBiNjRfaHVmZl9zeW0gaHVmZl9hbHBoYWJldFs2NF0gPSB7Ci0gICAgezB4MjEsIDZ9LCB7MHg1ZCwgN30sIHsweDVlLCA3fSwgICB7MHg1ZiwgN30sIHsweDYwLCA3fSwgezB4NjEsIDd9LAotICAgIHsweDYyLCA3fSwgezB4NjMsIDd9LCB7MHg2NCwgN30sICAgezB4NjUsIDd9LCB7MHg2NiwgN30sIHsweDY3LCA3fSwKLSAgICB7MHg2OCwgN30sIHsweDY5LCA3fSwgezB4NmEsIDd9LCAgIHsweDZiLCA3fSwgezB4NmMsIDd9LCB7MHg2ZCwgN30sCi0gICAgezB4NmUsIDd9LCB7MHg2ZiwgN30sIHsweDcwLCA3fSwgICB7MHg3MSwgN30sIHsweDcyLCA3fSwgezB4ZmMsIDh9LAotICAgIHsweDczLCA3fSwgezB4ZmQsIDh9LCB7MHgzLCA1fSwgICAgezB4MjMsIDZ9LCB7MHg0LCA1fSwgIHsweDI0LCA2fSwKLSAgICB7MHg1LCA1fSwgIHsweDI1LCA2fSwgezB4MjYsIDZ9LCAgIHsweDI3LCA2fSwgezB4NiwgNX0sICB7MHg3NCwgN30sCi0gICAgezB4NzUsIDd9LCB7MHgyOCwgNn0sIHsweDI5LCA2fSwgICB7MHgyYSwgNn0sIHsweDcsIDV9LCAgezB4MmIsIDZ9LAotICAgIHsweDc2LCA3fSwgezB4MmMsIDZ9LCB7MHg4LCA1fSwgICAgezB4OSwgNX0sICB7MHgyZCwgNn0sIHsweDc3LCA3fSwKLSAgICB7MHg3OCwgN30sIHsweDc5LCA3fSwgezB4N2EsIDd9LCAgIHsweDdiLCA3fSwgezB4MCwgNX0sICB7MHgxLCA1fSwKLSAgICB7MHgyLCA1fSwgIHsweDE5LCA2fSwgezB4MWEsIDZ9LCAgIHsweDFiLCA2fSwgezB4MWMsIDZ9LCB7MHgxZCwgNn0sCi0gICAgezB4MWUsIDZ9LCB7MHgxZiwgNn0sIHsweDdmYiwgMTF9LCB7MHgxOCwgNn19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCB0YWlsX3h0cmFbM10gPSB7MCwgMiwgM307Ci0KLWdwcl9zbGljZSBncnBjX2NodHRwMl9iYXNlNjRfZW5jb2RlKGdwcl9zbGljZSBpbnB1dCkgewotICBzaXplX3QgaW5wdXRfbGVuZ3RoID0gR1BSX1NMSUNFX0xFTkdUSChpbnB1dCk7Ci0gIHNpemVfdCBpbnB1dF90cmlwbGV0cyA9IGlucHV0X2xlbmd0aCAvIDM7Ci0gIHNpemVfdCB0YWlsX2Nhc2UgPSBpbnB1dF9sZW5ndGggJSAzOwotICBzaXplX3Qgb3V0cHV0X2xlbmd0aCA9IGlucHV0X3RyaXBsZXRzICogNCArIHRhaWxfeHRyYVt0YWlsX2Nhc2VdOwotICBncHJfc2xpY2Ugb3V0cHV0ID0gZ3ByX3NsaWNlX21hbGxvYyhvdXRwdXRfbGVuZ3RoKTsKLSAgdWludDhfdCAqaW4gPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGlucHV0KTsKLSAgY2hhciAqb3V0ID0gKGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKG91dHB1dCk7Ci0gIHNpemVfdCBpOwotCi0gIC8qIGVuY29kZSBmdWxsIHRyaXBsZXRzICovCi0gIGZvciAoaSA9IDA7IGkgPCBpbnB1dF90cmlwbGV0czsgaSsrKSB7Ci0gICAgb3V0WzBdID0gYWxwaGFiZXRbaW5bMF0gPj4gMl07Ci0gICAgb3V0WzFdID0gYWxwaGFiZXRbKChpblswXSAmIDB4MykgPDwgNCkgfCAoaW5bMV0gPj4gNCldOwotICAgIG91dFsyXSA9IGFscGhhYmV0WygoaW5bMV0gJiAweGYpIDw8IDIpIHwgKGluWzJdID4+IDYpXTsKLSAgICBvdXRbM10gPSBhbHBoYWJldFtpblsyXSAmIDB4M2ZdOwotICAgIG91dCArPSA0OwotICAgIGluICs9IDM7Ci0gIH0KLQotICAvKiBlbmNvZGUgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICBzd2l0Y2ggKHRhaWxfY2FzZSkgewotICAgIGNhc2UgMDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIG91dFswXSA9IGFscGhhYmV0W2luWzBdID4+IDJdOwotICAgICAgb3V0WzFdID0gYWxwaGFiZXRbKGluWzBdICYgMHgzKSA8PCA0XTsKLSAgICAgIG91dCArPSAyOwotICAgICAgaW4gKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG91dFswXSA9IGFscGhhYmV0W2luWzBdID4+IDJdOwotICAgICAgb3V0WzFdID0gYWxwaGFiZXRbKChpblswXSAmIDB4MykgPDwgNCkgfCAoaW5bMV0gPj4gNCldOwotICAgICAgb3V0WzJdID0gYWxwaGFiZXRbKGluWzFdICYgMHhmKSA8PCAyXTsKLSAgICAgIG91dCArPSAzOwotICAgICAgaW4gKz0gMjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgR1BSX0FTU0VSVChvdXQgPT0gKGNoYXIgKilHUFJfU0xJQ0VfRU5EX1BUUihvdXRwdXQpKTsKLSAgR1BSX0FTU0VSVChpbiA9PSBHUFJfU0xJQ0VfRU5EX1BUUihpbnB1dCkpOwotICByZXR1cm4gb3V0cHV0OwotfQotCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfaHVmZm1hbl9jb21wcmVzcyhncHJfc2xpY2UgaW5wdXQpIHsKLSAgc2l6ZV90IG5iaXRzOwotICB1aW50OF90ICppbjsKLSAgdWludDhfdCAqb3V0OwotICBncHJfc2xpY2Ugb3V0cHV0OwotICB1aW50MzJfdCB0ZW1wID0gMDsKLSAgdWludDMyX3QgdGVtcF9sZW5ndGggPSAwOwotCi0gIG5iaXRzID0gMDsKLSAgZm9yIChpbiA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaW5wdXQpOyBpbiAhPSBHUFJfU0xJQ0VfRU5EX1BUUihpbnB1dCk7ICsraW4pIHsKLSAgICBuYml0cyArPSBncnBjX2NodHRwMl9odWZmc3ltc1sqaW5dLmxlbmd0aDsKLSAgfQotCi0gIG91dHB1dCA9IGdwcl9zbGljZV9tYWxsb2MobmJpdHMgLyA4ICsgKG5iaXRzICUgOCAhPSAwKSk7Ci0gIG91dCA9IEdQUl9TTElDRV9TVEFSVF9QVFIob3V0cHV0KTsKLSAgZm9yIChpbiA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaW5wdXQpOyBpbiAhPSBHUFJfU0xJQ0VfRU5EX1BUUihpbnB1dCk7ICsraW4pIHsKLSAgICBpbnQgc3ltID0gKmluOwotICAgIHRlbXAgPDw9IGdycGNfY2h0dHAyX2h1ZmZzeW1zW3N5bV0ubGVuZ3RoOwotICAgIHRlbXAgfD0gZ3JwY19jaHR0cDJfaHVmZnN5bXNbc3ltXS5iaXRzOwotICAgIHRlbXBfbGVuZ3RoICs9IGdycGNfY2h0dHAyX2h1ZmZzeW1zW3N5bV0ubGVuZ3RoOwotCi0gICAgd2hpbGUgKHRlbXBfbGVuZ3RoID4gOCkgewotICAgICAgdGVtcF9sZW5ndGggLT0gODsKLSAgICAgICpvdXQrKyA9ICh1aW50OF90KSh0ZW1wID4+IHRlbXBfbGVuZ3RoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAodGVtcF9sZW5ndGgpIHsKLSAgICAvKiBOQjogdGhlIGZvbGxvd2luZyBpbnRlZ2VyIGFyaXRobWV0aWMgb3BlcmF0aW9uIG5lZWRzIHRvIGJlIGluIGl0cwotICAgICAqIGV4cGFuZGVkIGZvcm0gZHVlIHRvIHRoZSAiaW50ZWdyYWwgcHJvbW90aW9uIiBwZXJmb3JtZWQgKHNlZSBzZWN0aW9uCi0gICAgICogMy4yLjEuMSBvZiB0aGUgQzg5IGRyYWZ0IHN0YW5kYXJkKS4gQSBjYXN0IHRvIHRoZSBzbWFsbGVyIGNvbnRhaW5lciB0eXBlCi0gICAgICogaXMgdGhlbiByZXF1aXJlZCB0byBhdm9pZCB0aGUgY29tcGlsZXIgd2FybmluZyAqLwotICAgICpvdXQrKyA9ICh1aW50OF90KSgodWludDhfdCkodGVtcCA8PCAoOHUgLSB0ZW1wX2xlbmd0aCkpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKDB4ZmZ1ID4+IHRlbXBfbGVuZ3RoKSk7Ci0gIH0KLQotICBHUFJfQVNTRVJUKG91dCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihvdXRwdXQpKTsKLQotICByZXR1cm4gb3V0cHV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IHRlbXA7Ci0gIHVpbnQzMl90IHRlbXBfbGVuZ3RoOwotICB1aW50OF90ICpvdXQ7Ci19IGh1ZmZfb3V0OwotCi1zdGF0aWMgdm9pZCBlbmNfZmx1c2hfc29tZShodWZmX291dCAqb3V0KSB7Ci0gIHdoaWxlIChvdXQtPnRlbXBfbGVuZ3RoID4gOCkgewotICAgIG91dC0+dGVtcF9sZW5ndGggLT0gODsKLSAgICAqb3V0LT5vdXQrKyA9ICh1aW50OF90KShvdXQtPnRlbXAgPj4gb3V0LT50ZW1wX2xlbmd0aCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZW5jX2FkZDIoaHVmZl9vdXQgKm91dCwgdWludDhfdCBhLCB1aW50OF90IGIpIHsKLSAgYjY0X2h1ZmZfc3ltIHNhID0gaHVmZl9hbHBoYWJldFthXTsKLSAgYjY0X2h1ZmZfc3ltIHNiID0gaHVmZl9hbHBoYWJldFtiXTsKLSAgb3V0LT50ZW1wID0gKG91dC0+dGVtcCA8PCAoc2EubGVuZ3RoICsgc2IubGVuZ3RoKSkgfAotICAgICAgICAgICAgICAoKHVpbnQzMl90KXNhLmJpdHMgPDwgc2IubGVuZ3RoKSB8IHNiLmJpdHM7Ci0gIG91dC0+dGVtcF9sZW5ndGggKz0gKHVpbnQzMl90KXNhLmxlbmd0aCArICh1aW50MzJfdClzYi5sZW5ndGg7Ci0gIGVuY19mbHVzaF9zb21lKG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuY19hZGQxKGh1ZmZfb3V0ICpvdXQsIHVpbnQ4X3QgYSkgewotICBiNjRfaHVmZl9zeW0gc2EgPSBodWZmX2FscGhhYmV0W2FdOwotICBvdXQtPnRlbXAgPSAob3V0LT50ZW1wIDw8IHNhLmxlbmd0aCkgfCBzYS5iaXRzOwotICBvdXQtPnRlbXBfbGVuZ3RoICs9IHNhLmxlbmd0aDsKLSAgZW5jX2ZsdXNoX3NvbWUob3V0KTsKLX0KLQotZ3ByX3NsaWNlIGdycGNfY2h0dHAyX2Jhc2U2NF9lbmNvZGVfYW5kX2h1ZmZtYW5fY29tcHJlc3MoZ3ByX3NsaWNlIGlucHV0KSB7Ci0gIHNpemVfdCBpbnB1dF9sZW5ndGggPSBHUFJfU0xJQ0VfTEVOR1RIKGlucHV0KTsKLSAgc2l6ZV90IGlucHV0X3RyaXBsZXRzID0gaW5wdXRfbGVuZ3RoIC8gMzsKLSAgc2l6ZV90IHRhaWxfY2FzZSA9IGlucHV0X2xlbmd0aCAlIDM7Ci0gIHNpemVfdCBvdXRwdXRfc3ltcyA9IGlucHV0X3RyaXBsZXRzICogNCArIHRhaWxfeHRyYVt0YWlsX2Nhc2VdOwotICBzaXplX3QgbWF4X291dHB1dF9iaXRzID0gMTEgKiBvdXRwdXRfc3ltczsKLSAgc2l6ZV90IG1heF9vdXRwdXRfbGVuZ3RoID0gbWF4X291dHB1dF9iaXRzIC8gOCArIChtYXhfb3V0cHV0X2JpdHMgJSA4ICE9IDApOwotICBncHJfc2xpY2Ugb3V0cHV0ID0gZ3ByX3NsaWNlX21hbGxvYyhtYXhfb3V0cHV0X2xlbmd0aCk7Ci0gIHVpbnQ4X3QgKmluID0gR1BSX1NMSUNFX1NUQVJUX1BUUihpbnB1dCk7Ci0gIHVpbnQ4X3QgKnN0YXJ0X291dCA9IEdQUl9TTElDRV9TVEFSVF9QVFIob3V0cHV0KTsKLSAgaHVmZl9vdXQgb3V0OwotICBzaXplX3QgaTsKLQotICBvdXQudGVtcCA9IDA7Ci0gIG91dC50ZW1wX2xlbmd0aCA9IDA7Ci0gIG91dC5vdXQgPSBzdGFydF9vdXQ7Ci0KLSAgLyogZW5jb2RlIGZ1bGwgdHJpcGxldHMgKi8KLSAgZm9yIChpID0gMDsgaSA8IGlucHV0X3RyaXBsZXRzOyBpKyspIHsKLSAgICBlbmNfYWRkMigmb3V0LCBpblswXSA+PiAyLCAodWludDhfdCkoKGluWzBdICYgMHgzKSA8PCA0KSB8IChpblsxXSA+PiA0KSk7Ci0gICAgZW5jX2FkZDIoJm91dCwgKHVpbnQ4X3QpKChpblsxXSAmIDB4ZikgPDwgMikgfCAoaW5bMl0gPj4gNiksCi0gICAgICAgICAgICAgKHVpbnQ4X3QpKGluWzJdICYgMHgzZikpOwotICAgIGluICs9IDM7Ci0gIH0KLQotICAvKiBlbmNvZGUgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICBzd2l0Y2ggKHRhaWxfY2FzZSkgewotICAgIGNhc2UgMDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGVuY19hZGQyKCZvdXQsIGluWzBdID4+IDIsICh1aW50OF90KSgoaW5bMF0gJiAweDMpIDw8IDQpKTsKLSAgICAgIGluICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBlbmNfYWRkMigmb3V0LCBpblswXSA+PiAyLAotICAgICAgICAgICAgICAgKHVpbnQ4X3QpKChpblswXSAmIDB4MykgPDwgNCkgfCAodWludDhfdCkoaW5bMV0gPj4gNCkpOwotICAgICAgZW5jX2FkZDEoJm91dCwgKHVpbnQ4X3QpKChpblsxXSAmIDB4ZikgPDwgMikpOwotICAgICAgaW4gKz0gMjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKG91dC50ZW1wX2xlbmd0aCkgewotICAgIC8qIE5COiB0aGUgZm9sbG93aW5nIGludGVnZXIgYXJpdGhtZXRpYyBvcGVyYXRpb24gbmVlZHMgdG8gYmUgaW4gaXRzCi0gICAgICogZXhwYW5kZWQgZm9ybSBkdWUgdG8gdGhlICJpbnRlZ3JhbCBwcm9tb3Rpb24iIHBlcmZvcm1lZCAoc2VlIHNlY3Rpb24KLSAgICAgKiAzLjIuMS4xIG9mIHRoZSBDODkgZHJhZnQgc3RhbmRhcmQpLiBBIGNhc3QgdG8gdGhlIHNtYWxsZXIgY29udGFpbmVyIHR5cGUKLSAgICAgKiBpcyB0aGVuIHJlcXVpcmVkIHRvIGF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5nICovCi0gICAgKm91dC5vdXQrKyA9ICh1aW50OF90KSgodWludDhfdCkob3V0LnRlbXAgPDwgKDh1IC0gb3V0LnRlbXBfbGVuZ3RoKSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKDB4ZmZ1ID4+IG91dC50ZW1wX2xlbmd0aCkpOwotICB9Ci0KLSAgR1BSX0FTU0VSVChvdXQub3V0IDw9IEdQUl9TTElDRV9FTkRfUFRSKG91dHB1dCkpOwotICBHUFJfU0xJQ0VfU0VUX0xFTkdUSChvdXRwdXQsIG91dC5vdXQgLSBzdGFydF9vdXQpOwotCi0gIEdQUl9BU1NFUlQoaW4gPT0gR1BSX1NMSUNFX0VORF9QVFIoaW5wdXQpKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiNmYyZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0JJTl9FTkNPREVSX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfQklOX0VOQ09ERVJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0KLS8qIGJhc2U2NCBlbmNvZGUgYSBzbGljZS4gUmV0dXJucyBhIG5ldyBzbGljZSwgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlCi0gICBpbnB1dCAqLwotZ3ByX3NsaWNlIGdycGNfY2h0dHAyX2Jhc2U2NF9lbmNvZGUoZ3ByX3NsaWNlIGlucHV0KTsKLQotLyogQ29tcHJlc3MgYSBzbGljZSB3aXRoIHRoZSBzdGF0aWMgaHVmZm1hbiBlbmNvZGVyIGRldGFpbGVkIGluIHRoZSBocGFjawotICAgc3RhbmRhcmQuIFJldHVybnMgYSBuZXcgc2xpY2UsIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBpbnB1dCAqLwotZ3ByX3NsaWNlIGdycGNfY2h0dHAyX2h1ZmZtYW5fY29tcHJlc3MoZ3ByX3NsaWNlIGlucHV0KTsKLQotLyogZXF1aXZhbGVudCB0bzoKLSAgIGdwcl9zbGljZSB4ID0gZ3JwY19jaHR0cDJfYmFzZTY0X2VuY29kZShpbnB1dCk7Ci0gICBncHJfc2xpY2UgeSA9IGdycGNfY2h0dHAyX2h1ZmZtYW5fY29tcHJlc3MoeCk7Ci0gICBncHJfc2xpY2VfdW5yZWYoeCk7Ci0gICByZXR1cm4geTsgKi8KLWdwcl9zbGljZSBncnBjX2NodHRwMl9iYXNlNjRfZW5jb2RlX2FuZF9odWZmbWFuX2NvbXByZXNzKGdwcl9zbGljZSBpbnB1dCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9CSU5fRU5DT0RFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmggYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGE2NjcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0KLS8qIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgZnJhbWUgaGFuZGxpbmcgaW4gdGhlIGNodHRwMiB0cmFuc3BvcnQgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19DSFRUUDJfUEFSU0VfT0ssCi0gIEdSUENfQ0hUVFAyX1NUUkVBTV9FUlJPUiwKLSAgR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUgotfSBncnBjX2NodHRwMl9wYXJzZV9lcnJvcjsKLQotLyogZGVmaW5lZCBpbiBpbnRlcm5hbC5oICovCi10eXBlZGVmIHN0cnVjdCBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZzsKLXR5cGVkZWYgc3RydWN0IGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nOwotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0ZSQU1FX0RBVEEgMAotI2RlZmluZSBHUlBDX0NIVFRQMl9GUkFNRV9IRUFERVIgMQotI2RlZmluZSBHUlBDX0NIVFRQMl9GUkFNRV9DT05USU5VQVRJT04gOQotI2RlZmluZSBHUlBDX0NIVFRQMl9GUkFNRV9SU1RfU1RSRUFNIDMKLSNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfU0VUVElOR1MgNAotI2RlZmluZSBHUlBDX0NIVFRQMl9GUkFNRV9QSU5HIDYKLSNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfR09BV0FZIDcKLSNkZWZpbmUgR1JQQ19DSFRUUDJfRlJBTUVfV0lORE9XX1VQREFURSA4Ci0KLSNkZWZpbmUgR1JQQ19DSFRUUDJfTUFYX1BBWUxPQURfTEVOR1RIICgoMSA8PCAxNCkgLSAxKQotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0RBVEFfRkxBR19FTkRfU1RSRUFNIDEKLSNkZWZpbmUgR1JQQ19DSFRUUDJfRkxBR19BQ0sgMQotI2RlZmluZSBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX0hFQURFUlMgNAotI2RlZmluZSBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfUEFEREVEIDgKLSNkZWZpbmUgR1JQQ19DSFRUUDJfRkxBR19IQVNfUFJJT1JJVFkgMHgyMAotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjNmQ0ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIgotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9pbml0KAotICAgIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyICpwYXJzZXIpIHsKLSAgcGFyc2VyLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0RBVEFfRkhfMDsKLSAgcGFyc2VyLT5wYXJzaW5nX2ZyYW1lID0gTlVMTDsKLSAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlcikgewotICBncnBjX2J5dGVfc3RyZWFtICpiczsKLSAgaWYgKHBhcnNlci0+cGFyc2luZ19mcmFtZSkgewotICAgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2ZpbmlzaGVkKGV4ZWNfY3R4LCBwYXJzZXItPnBhcnNpbmdfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSk7Ci0gIH0KLSAgd2hpbGUgKAotICAgICAgKGJzID0gZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWVfcG9wKCZwYXJzZXItPmluY29taW5nX2ZyYW1lcykpKSB7Ci0gICAgZ3JwY19ieXRlX3N0cmVhbV9kZXN0cm95KGV4ZWNfY3R4LCBicyk7Ci0gIH0KLX0KLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlciwgdWludDhfdCBmbGFncykgewotICBpZiAoZmxhZ3MgJiB+R1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9TVFJFQU0pIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgInVuc3VwcG9ydGVkIGRhdGEgZmxhZ3M6IDB4JTAyeCIsIGZsYWdzKTsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfU1RSRUFNX0VSUk9SOwotICB9Ci0KLSAgaWYgKGZsYWdzICYgR1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9TVFJFQU0pIHsKLSAgICBwYXJzZXItPmlzX2xhc3RfZnJhbWUgPSAxOwotICB9IGVsc2UgewotICAgIHBhcnNlci0+aXNfbGFzdF9mcmFtZSA9IDA7Ci0gIH0KLQotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWVfbWVyZ2UoCi0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgKmhlYWRfZHN0LAotICAgIGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlICp0YWlsX3NyYykgewotICBpZiAodGFpbF9zcmMtPmhlYWQgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChoZWFkX2RzdC0+aGVhZCA9PSBOVUxMKSB7Ci0gICAgKmhlYWRfZHN0ID0gKnRhaWxfc3JjOwotICAgIG1lbXNldCh0YWlsX3NyYywgMCwgc2l6ZW9mKCp0YWlsX3NyYykpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGhlYWRfZHN0LT50YWlsLT5uZXh0X21lc3NhZ2UgPSB0YWlsX3NyYy0+aGVhZDsKLSAgaGVhZF9kc3QtPnRhaWwgPSB0YWlsX3NyYy0+dGFpbDsKLSAgbWVtc2V0KHRhaWxfc3JjLCAwLCBzaXplb2YoKnRhaWxfc3JjKSk7Ci19Ci0KLWdycGNfYnl0ZV9zdHJlYW0gKmdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlX3BvcCgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqcSkgewotICBncnBjX2J5dGVfc3RyZWFtICpvdXQ7Ci0gIGlmIChxLT5oZWFkID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBvdXQgPSAmcS0+aGVhZC0+YmFzZTsKLSAgaWYgKHEtPmhlYWQgPT0gcS0+dGFpbCkgewotICAgIG1lbXNldChxLCAwLCBzaXplb2YoKnEpKTsKLSAgfSBlbHNlIHsKLSAgICBxLT5oZWFkID0gcS0+aGVhZC0+bmV4dF9tZXNzYWdlOwotICB9Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfZW5jb2RlX2RhdGEodWludDMyX3QgaWQsIGdwcl9zbGljZV9idWZmZXIgKmluYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9ieXRlcywgaW50IGlzX2VvZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqb3V0YnVmKSB7Ci0gIGdwcl9zbGljZSBoZHI7Ci0gIHVpbnQ4X3QgKnA7Ci0KLSAgaGRyID0gZ3ByX3NsaWNlX21hbGxvYyg5KTsKLSAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaGRyKTsKLSAgR1BSX0FTU0VSVCh3cml0ZV9ieXRlcyA8ICgxIDw8IDI0KSk7Ci0gICpwKysgPSAodWludDhfdCkod3JpdGVfYnl0ZXMgPj4gMTYpOwotICAqcCsrID0gKHVpbnQ4X3QpKHdyaXRlX2J5dGVzID4+IDgpOwotICAqcCsrID0gKHVpbnQ4X3QpKHdyaXRlX2J5dGVzKTsKLSAgKnArKyA9IEdSUENfQ0hUVFAyX0ZSQU1FX0RBVEE7Ci0gICpwKysgPSBpc19lb2YgPyBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSA6IDA7Ci0gICpwKysgPSAodWludDhfdCkoaWQgPj4gMjQpOwotICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDE2KTsKLSAgKnArKyA9ICh1aW50OF90KShpZCA+PiA4KTsKLSAgKnArKyA9ICh1aW50OF90KShpZCk7Ci0gIGdwcl9zbGljZV9idWZmZXJfYWRkKG91dGJ1ZiwgaGRyKTsKLQotICBncHJfc2xpY2VfYnVmZmVyX21vdmVfZmlyc3QoaW5idWYsIHdyaXRlX2J5dGVzLCBvdXRidWYpOwotfQotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9wYXJzZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpIHsKLSAgdWludDhfdCAqY29uc3QgYmVnID0gR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSk7Ci0gIHVpbnQ4X3QgKmNvbnN0IGVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKHNsaWNlKTsKLSAgdWludDhfdCAqY3VyID0gYmVnOwotICBncnBjX2NodHRwMl9kYXRhX3BhcnNlciAqcCA9IHBhcnNlcjsKLSAgdWludDMyX3QgbWVzc2FnZV9mbGFnczsKLSAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKmluY29taW5nX2J5dGVfc3RyZWFtOwotCi0gIGlmIChpc19sYXN0ICYmIHAtPmlzX2xhc3RfZnJhbWUpIHsKLSAgICBzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfY2xvc2UgPSAxOwotICB9Ci0KLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gIH0KLQotICBzd2l0Y2ggKHAtPnN0YXRlKSB7Ci0gIGZoXzA6Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9EQVRBX0ZIXzA6Ci0gICAgICBwLT5mcmFtZV90eXBlID0gKmN1cjsKLSAgICAgIHN3aXRjaCAocC0+ZnJhbWVfdHlwZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgcC0+aXNfZnJhbWVfY29tcHJlc3NlZCA9IDA7IC8qIEdQUl9GQUxTRSAqLwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgcC0+aXNfZnJhbWVfY29tcHJlc3NlZCA9IDE7IC8qIEdQUl9UUlVFICovCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJCYWQgR1JQQyBmcmFtZSB0eXBlIDB4JTAyeCIsIHAtPmZyYW1lX3R5cGUpOwotICAgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9TVFJFQU1fRVJST1I7Ci0gICAgICB9Ci0gICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GSF8xOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfQ0hUVFAyX0RBVEFfRkhfMToKLSAgICAgIHAtPmZyYW1lX3NpemUgPSAoKHVpbnQzMl90KSpjdXIpIDw8IDI0OwotICAgICAgaWYgKCsrY3VyID09IGVuZCkgewotICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0RBVEFfRkhfMjsKLSAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICAgICAgfQotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0NIVFRQMl9EQVRBX0ZIXzI6Ci0gICAgICBwLT5mcmFtZV9zaXplIHw9ICgodWludDMyX3QpKmN1cikgPDwgMTY7Ci0gICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GSF8zOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfQ0hUVFAyX0RBVEFfRkhfMzoKLSAgICAgIHAtPmZyYW1lX3NpemUgfD0gKCh1aW50MzJfdCkqY3VyKSA8PCA4OwotICAgICAgaWYgKCsrY3VyID09IGVuZCkgewotICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0RBVEFfRkhfNDsKLSAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICAgICAgfQotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0NIVFRQMl9EQVRBX0ZIXzQ6Ci0gICAgICBwLT5mcmFtZV9zaXplIHw9ICgodWludDMyX3QpKmN1cik7Ci0gICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0RBVEFfRlJBTUU7Ci0gICAgICArK2N1cjsKLSAgICAgIG1lc3NhZ2VfZmxhZ3MgPSAwOwotICAgICAgaWYgKHAtPmlzX2ZyYW1lX2NvbXByZXNzZWQpIHsKLSAgICAgICAgbWVzc2FnZV9mbGFncyB8PSBHUlBDX1dSSVRFX0lOVEVSTkFMX0NPTVBSRVNTOwotICAgICAgfQotICAgICAgcC0+cGFyc2luZ19mcmFtZSA9IGluY29taW5nX2J5dGVfc3RyZWFtID0KLSAgICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9jcmVhdGUoCi0gICAgICAgICAgICAgIGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgc3RyZWFtX3BhcnNpbmcsIHAtPmZyYW1lX3NpemUsCi0gICAgICAgICAgICAgIG1lc3NhZ2VfZmxhZ3MsICZwLT5pbmNvbWluZ19mcmFtZXMpOwotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0NIVFRQMl9EQVRBX0ZSQU1FOgotICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfcGFyc2luZ19zZWVuX3N0cmVhbSh0cmFuc3BvcnRfcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fcGFyc2luZyk7Ci0gICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLSAgICAgIH0KLSAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wYXJzaW5nKTsKLSAgICAgIGlmICgodWludDMyX3QpKGVuZCAtIGN1cikgPT0gcC0+ZnJhbWVfc2l6ZSkgewotICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbV9wdXNoKAotICAgICAgICAgICAgZXhlY19jdHgsIHAtPnBhcnNpbmdfZnJhbWUsCi0gICAgICAgICAgICBncHJfc2xpY2Vfc3ViKHNsaWNlLCAoc2l6ZV90KShjdXIgLSBiZWcpLCAoc2l6ZV90KShlbmQgLSBiZWcpKSk7Ci0gICAgICAgIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2ZpbmlzaGVkKGV4ZWNfY3R4LCBwLT5wYXJzaW5nX2ZyYW1lLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgcC0+cGFyc2luZ19mcmFtZSA9IE5VTEw7Ci0gICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfREFUQV9GSF8wOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9IGVsc2UgaWYgKCh1aW50MzJfdCkoZW5kIC0gY3VyKSA+IHAtPmZyYW1lX3NpemUpIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fcHVzaCgKLSAgICAgICAgICAgIGV4ZWNfY3R4LCBwLT5wYXJzaW5nX2ZyYW1lLAotICAgICAgICAgICAgZ3ByX3NsaWNlX3N1YihzbGljZSwgKHNpemVfdCkoY3VyIC0gYmVnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkoY3VyICsgcC0+ZnJhbWVfc2l6ZSAtIGJlZykpKTsKLSAgICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fZmluaXNoZWQoZXhlY19jdHgsIHAtPnBhcnNpbmdfZnJhbWUsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotICAgICAgICBwLT5wYXJzaW5nX2ZyYW1lID0gTlVMTDsKLSAgICAgICAgY3VyICs9IHAtPmZyYW1lX3NpemU7Ci0gICAgICAgIGdvdG8gZmhfMDsgLyogbG9vcCAqLwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fcHVzaCgKLSAgICAgICAgICAgIGV4ZWNfY3R4LCBwLT5wYXJzaW5nX2ZyYW1lLAotICAgICAgICAgICAgZ3ByX3NsaWNlX3N1YihzbGljZSwgKHNpemVfdCkoY3VyIC0gYmVnKSwgKHNpemVfdCkoZW5kIC0gYmVnKSkpOwotICAgICAgICBHUFJfQVNTRVJUKChzaXplX3QpKGVuZCAtIGN1cikgPD0gcC0+ZnJhbWVfc2l6ZSk7Ci0gICAgICAgIHAtPmZyYW1lX3NpemUgLT0gKHVpbnQzMl90KShlbmQgLSBjdXIpOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gIH0KLQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUik7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJhYTYwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfREFUQV9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX0RBVEFfSAotCi0vKiBQYXJzZXIgZm9yIEdSUEMgc3RyZWFtcyBlbWJlZGRlZCBpbiBEQVRBIGZyYW1lcyAqLwotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotCi10eXBlZGVmIGVudW0gewotICBHUlBDX0NIVFRQMl9EQVRBX0ZIXzAsCi0gIEdSUENfQ0hUVFAyX0RBVEFfRkhfMSwKLSAgR1JQQ19DSFRUUDJfREFUQV9GSF8yLAotICBHUlBDX0NIVFRQMl9EQVRBX0ZIXzMsCi0gIEdSUENfQ0hUVFAyX0RBVEFfRkhfNCwKLSAgR1JQQ19DSFRUUDJfREFUQV9GUkFNRQotfSBncnBjX2NodHRwMl9zdHJlYW1fc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtCi0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW07Ci0KLXR5cGVkZWYgc3RydWN0IGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlIHsKLSAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKmhlYWQ7Ci0gIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICp0YWlsOwotfSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NodHRwMl9zdHJlYW1fc3RhdGUgc3RhdGU7Ci0gIHVpbnQ4X3QgaXNfbGFzdF9mcmFtZTsKLSAgdWludDhfdCBmcmFtZV90eXBlOwotICB1aW50MzJfdCBmcmFtZV9zaXplOwotCi0gIGludCBpc19mcmFtZV9jb21wcmVzc2VkOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSBpbmNvbWluZ19mcmFtZXM7Ci0gIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpwYXJzaW5nX2ZyYW1lOwotfSBncnBjX2NodHRwMl9kYXRhX3BhcnNlcjsKLQotdm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9tZXJnZSgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqaGVhZF9kc3QsCi0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgKnRhaWxfc3JjKTsKLWdycGNfYnl0ZV9zdHJlYW0gKmdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlX3BvcCgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqcSk7Ci0KLS8qIGluaXRpYWxpemUgcGVyLXN0cmVhbSBzdGF0ZSBmb3IgZGF0YSBmcmFtZSBwYXJzaW5nICovCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9pbml0KAotICAgIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyICpwYXJzZXIpOwotCi12b2lkIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlcik7Ci0KLS8qIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgZGF0YSBmcmFtZSAqLwotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXIgKnBhcnNlciwgdWludDhfdCBmbGFncyk7Ci0KLS8qIGhhbmRsZSBhIHNsaWNlIG9mIGEgZGF0YSBmcmFtZSAtIGlzX2xhc3QgaW5kaWNhdGVzIHRoZSBsYXN0IHNsaWNlIG9mIGEKLSAgIGZyYW1lICovCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9kYXRhX3BhcnNlcl9wYXJzZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOwotCi12b2lkIGdycGNfY2h0dHAyX2VuY29kZV9kYXRhKHVpbnQzMl90IGlkLCBncHJfc2xpY2VfYnVmZmVyICppbmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfYnl0ZXMsIGludCBpc19lb2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKm91dGJ1Zik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE1MjVlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi12b2lkIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfaW5pdChncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyICpwKSB7Ci0gIHAtPmRlYnVnX2RhdGEgPSBOVUxMOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfZGVzdHJveShncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyICpwKSB7Ci0gIGdwcl9mcmVlKHAtPmRlYnVnX2RhdGEpOwotfQotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2JlZ2luX2ZyYW1lKAotICAgIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXIgKnAsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncykgewotICBpZiAobGVuZ3RoIDwgOCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiZ29hd2F5IGZyYW1lIHRvbyBzaG9ydCAoJWQgYnl0ZXMpIiwgbGVuZ3RoKTsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKLSAgfQotCi0gIGdwcl9mcmVlKHAtPmRlYnVnX2RhdGEpOwotICBwLT5kZWJ1Z19sZW5ndGggPSBsZW5ndGggLSA4OwotICBwLT5kZWJ1Z19kYXRhID0gZ3ByX21hbGxvYyhwLT5kZWJ1Z19sZW5ndGgpOwotICBwLT5kZWJ1Z19wb3MgPSAwOwotICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kwOwotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19Ci0KLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfcGFyc2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KSB7Ci0gIHVpbnQ4X3QgKmNvbnN0IGJlZyA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOwotICB1aW50OF90ICpjb25zdCBlbmQgPSBHUFJfU0xJQ0VfRU5EX1BUUihzbGljZSk7Ci0gIHVpbnQ4X3QgKmN1ciA9IGJlZzsKLSAgZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlciAqcCA9IHBhcnNlcjsKLQotICBzd2l0Y2ggKHAtPnN0YXRlKSB7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMDoKLSAgICAgIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfR09BV0FZX0xTSTA7Ci0gICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLSAgICAgIH0KLSAgICAgIHAtPmxhc3Rfc3RyZWFtX2lkID0gKCh1aW50MzJfdCkqY3VyKSA8PCAyNDsKLSAgICAgICsrY3VyOwotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMToKLSAgICAgIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfR09BV0FZX0xTSTE7Ci0gICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLSAgICAgIH0KLSAgICAgIHAtPmxhc3Rfc3RyZWFtX2lkIHw9ICgodWludDMyX3QpKmN1cikgPDwgMTY7Ci0gICAgICArK2N1cjsKLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTI6Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kyOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gICAgICBwLT5sYXN0X3N0cmVhbV9pZCB8PSAoKHVpbnQzMl90KSpjdXIpIDw8IDg7Ci0gICAgICArK2N1cjsKLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTM6Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kzOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gICAgICBwLT5sYXN0X3N0cmVhbV9pZCB8PSAoKHVpbnQzMl90KSpjdXIpOwotICAgICAgKytjdXI7Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIwOgotICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgcC0+c3RhdGUgPSBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMDsKLSAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICAgICAgfQotICAgICAgcC0+ZXJyb3JfY29kZSA9ICgodWludDMyX3QpKmN1cikgPDwgMjQ7Ci0gICAgICArK2N1cjsKLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0VSUjE6Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIxOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gICAgICBwLT5lcnJvcl9jb2RlIHw9ICgodWludDMyX3QpKmN1cikgPDwgMTY7Ci0gICAgICArK2N1cjsKLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19DSFRUUDJfR09BV0FZX0VSUjI6Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBwLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIyOwotICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICB9Ci0gICAgICBwLT5lcnJvcl9jb2RlIHw9ICgodWludDMyX3QpKmN1cikgPDwgODsKLSAgICAgICsrY3VyOwotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMzoKLSAgICAgIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfR09BV0FZX0VSUjM7Ci0gICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLSAgICAgIH0KLSAgICAgIHAtPmVycm9yX2NvZGUgfD0gKCh1aW50MzJfdCkqY3VyKTsKLSAgICAgICsrY3VyOwotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0NIVFRQMl9HT0FXQVlfREVCVUc6Ci0gICAgICBtZW1jcHkocC0+ZGVidWdfZGF0YSArIHAtPmRlYnVnX3BvcywgY3VyLCAoc2l6ZV90KShlbmQgLSBjdXIpKTsKLSAgICAgIEdQUl9BU1NFUlQoKHNpemVfdCkoZW5kIC0gY3VyKSA8IFVJTlQzMl9NQVggLSBwLT5kZWJ1Z19wb3MpOwotICAgICAgcC0+ZGVidWdfcG9zICs9ICh1aW50MzJfdCkoZW5kIC0gY3VyKTsKLSAgICAgIHAtPnN0YXRlID0gR1JQQ19DSFRUUDJfR09BV0FZX0RFQlVHOwotICAgICAgaWYgKGlzX2xhc3QpIHsKLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmdvYXdheV9yZWNlaXZlZCA9IDE7Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfbGFzdF9zdHJlYW1faW5kZXggPSBwLT5sYXN0X3N0cmVhbV9pZDsKLSAgICAgICAgZ3ByX3NsaWNlX3VucmVmKHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfdGV4dCk7Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfZXJyb3IgPSAoZ3JwY19zdGF0dXNfY29kZSlwLT5lcnJvcl9jb2RlOwotICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X3RleHQgPQotICAgICAgICAgICAgZ3ByX3NsaWNlX25ldyhwLT5kZWJ1Z19kYXRhLCBwLT5kZWJ1Z19sZW5ndGgsIGdwcl9mcmVlKTsKLSAgICAgICAgcC0+ZGVidWdfZGF0YSA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gIH0KLSAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1IpOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2dvYXdheV9hcHBlbmQodWludDMyX3QgbGFzdF9zdHJlYW1faWQsIHVpbnQzMl90IGVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIGRlYnVnX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlciAqc2xpY2VfYnVmZmVyKSB7Ci0gIGdwcl9zbGljZSBoZWFkZXIgPSBncHJfc2xpY2VfbWFsbG9jKDkgKyA0ICsgNCk7Ci0gIHVpbnQ4X3QgKnAgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKGhlYWRlcik7Ci0gIHVpbnQzMl90IGZyYW1lX2xlbmd0aDsKLSAgR1BSX0FTU0VSVChHUFJfU0xJQ0VfTEVOR1RIKGRlYnVnX2RhdGEpIDwgVUlOVDMyX01BWCAtIDQgLSA0KTsKLSAgZnJhbWVfbGVuZ3RoID0gNCArIDQgKyAodWludDMyX3QpR1BSX1NMSUNFX0xFTkdUSChkZWJ1Z19kYXRhKTsKLQotICAvKiBmcmFtZSBoZWFkZXI6IGxlbmd0aCAqLwotICAqcCsrID0gKHVpbnQ4X3QpKGZyYW1lX2xlbmd0aCA+PiAxNik7Ci0gICpwKysgPSAodWludDhfdCkoZnJhbWVfbGVuZ3RoID4+IDgpOwotICAqcCsrID0gKHVpbnQ4X3QpKGZyYW1lX2xlbmd0aCk7Ci0gIC8qIGZyYW1lIGhlYWRlcjogdHlwZSAqLwotICAqcCsrID0gR1JQQ19DSFRUUDJfRlJBTUVfR09BV0FZOwotICAvKiBmcmFtZSBoZWFkZXI6IGZsYWdzICovCi0gICpwKysgPSAwOwotICAvKiBmcmFtZSBoZWFkZXI6IHN0cmVhbSBpZCAqLwotICAqcCsrID0gMDsKLSAgKnArKyA9IDA7Ci0gICpwKysgPSAwOwotICAqcCsrID0gMDsKLSAgLyogcGF5bG9hZDogbGFzdCBzdHJlYW0gaWQgKi8KLSAgKnArKyA9ICh1aW50OF90KShsYXN0X3N0cmVhbV9pZCA+PiAyNCk7Ci0gICpwKysgPSAodWludDhfdCkobGFzdF9zdHJlYW1faWQgPj4gMTYpOwotICAqcCsrID0gKHVpbnQ4X3QpKGxhc3Rfc3RyZWFtX2lkID4+IDgpOwotICAqcCsrID0gKHVpbnQ4X3QpKGxhc3Rfc3RyZWFtX2lkKTsKLSAgLyogcGF5bG9hZDogZXJyb3IgY29kZSAqLwotICAqcCsrID0gKHVpbnQ4X3QpKGVycm9yX2NvZGUgPj4gMjQpOwotICAqcCsrID0gKHVpbnQ4X3QpKGVycm9yX2NvZGUgPj4gMTYpOwotICAqcCsrID0gKHVpbnQ4X3QpKGVycm9yX2NvZGUgPj4gOCk7Ci0gICpwKysgPSAodWludDhfdCkoZXJyb3JfY29kZSk7Ci0gIEdQUl9BU1NFUlQocCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihoZWFkZXIpKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoc2xpY2VfYnVmZmVyLCBoZWFkZXIpOwotICBncHJfc2xpY2VfYnVmZmVyX2FkZChzbGljZV9idWZmZXIsIGRlYnVnX2RhdGEpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ODBlNDcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfR09BV0FZX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfR09BV0FZX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlX2J1ZmZlci5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotCi10eXBlZGVmIGVudW0gewotICBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMCwKLSAgR1JQQ19DSFRUUDJfR09BV0FZX0xTSTEsCi0gIEdSUENfQ0hUVFAyX0dPQVdBWV9MU0kyLAotICBHUlBDX0NIVFRQMl9HT0FXQVlfTFNJMywKLSAgR1JQQ19DSFRUUDJfR09BV0FZX0VSUjAsCi0gIEdSUENfQ0hUVFAyX0dPQVdBWV9FUlIxLAotICBHUlBDX0NIVFRQMl9HT0FXQVlfRVJSMiwKLSAgR1JQQ19DSFRUUDJfR09BV0FZX0VSUjMsCi0gIEdSUENfQ0hUVFAyX0dPQVdBWV9ERUJVRwotfSBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2Vfc3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlX3N0YXRlIHN0YXRlOwotICB1aW50MzJfdCBsYXN0X3N0cmVhbV9pZDsKLSAgdWludDMyX3QgZXJyb3JfY29kZTsKLSAgY2hhciAqZGVidWdfZGF0YTsKLSAgdWludDMyX3QgZGVidWdfbGVuZ3RoOwotICB1aW50MzJfdCBkZWJ1Z19wb3M7Ci19IGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXI7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlcl9pbml0KGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXIgKnApOwotdm9pZCBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2Rlc3Ryb3koZ3JwY19jaHR0cDJfZ29hd2F5X3BhcnNlciAqcCk7Ci1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2JlZ2luX2ZyYW1lKAotICAgIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXIgKnBhcnNlciwgdWludDMyX3QgbGVuZ3RoLCB1aW50OF90IGZsYWdzKTsKLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfcGFyc2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KTsKLQotdm9pZCBncnBjX2NodHRwMl9nb2F3YXlfYXBwZW5kKHVpbnQzMl90IGxhc3Rfc3RyZWFtX2lkLCB1aW50MzJfdCBlcnJvcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBkZWJ1Z19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKnNsaWNlX2J1ZmZlcik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9HT0FXQVlfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYjUyMi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLWdwcl9zbGljZSBncnBjX2NodHRwMl9waW5nX2NyZWF0ZSh1aW50OF90IGFjaywgdWludDhfdCAqb3BhcXVlXzhieXRlcykgewotICBncHJfc2xpY2Ugc2xpY2UgPSBncHJfc2xpY2VfbWFsbG9jKDkgKyA4KTsKLSAgdWludDhfdCAqcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOwotCi0gICpwKysgPSAwOwotICAqcCsrID0gMDsKLSAgKnArKyA9IDg7Ci0gICpwKysgPSBHUlBDX0NIVFRQMl9GUkFNRV9QSU5HOwotICAqcCsrID0gYWNrID8gMSA6IDA7Ci0gICpwKysgPSAwOwotICAqcCsrID0gMDsKLSAgKnArKyA9IDA7Ci0gICpwKysgPSAwOwotICBtZW1jcHkocCwgb3BhcXVlXzhieXRlcywgOCk7Ci0KLSAgcmV0dXJuIHNsaWNlOwotfQotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9waW5nX3BhcnNlcl9iZWdpbl9mcmFtZSgKLSAgICBncnBjX2NodHRwMl9waW5nX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MpIHsKLSAgaWYgKGZsYWdzICYgMHhmZSB8fCBsZW5ndGggIT0gOCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCBwaW5nOiBsZW5ndGg9JWQsIGZsYWdzPSUwMngiLCBsZW5ndGgsIGZsYWdzKTsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKLSAgfQotICBwYXJzZXItPmJ5dGUgPSAwOwotICBwYXJzZXItPmlzX2FjayA9IGZsYWdzOwotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19Ci0KLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyX3BhcnNlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgewotICB1aW50OF90ICpjb25zdCBiZWcgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKLSAgdWludDhfdCAqY29uc3QgZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpOwotICB1aW50OF90ICpjdXIgPSBiZWc7Ci0gIGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyICpwID0gcGFyc2VyOwotCi0gIHdoaWxlIChwLT5ieXRlICE9IDggJiYgY3VyICE9IGVuZCkgewotICAgIHAtPm9wYXF1ZV84Ynl0ZXNbcC0+Ynl0ZV0gPSAqY3VyOwotICAgIGN1cisrOwotICAgIHAtPmJ5dGUrKzsKLSAgfQotCi0gIGlmIChwLT5ieXRlID09IDgpIHsKLSAgICBHUFJfQVNTRVJUKGlzX2xhc3QpOwotICAgIGlmIChwLT5pc19hY2spIHsKLSAgICAgIGdycGNfY2h0dHAyX2Fja19waW5nKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgcC0+b3BhcXVlXzhieXRlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZ0cmFuc3BvcnRfcGFyc2luZy0+cWJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3BpbmdfY3JlYXRlKDEsIHAtPm9wYXF1ZV84Ynl0ZXMpKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEyY2Q3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9QSU5HX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfUElOR19ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWUuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IGJ5dGU7Ci0gIHVpbnQ4X3QgaXNfYWNrOwotICB1aW50OF90IG9wYXF1ZV84Ynl0ZXNbOF07Ci19IGdycGNfY2h0dHAyX3BpbmdfcGFyc2VyOwotCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfcGluZ19jcmVhdGUodWludDhfdCBhY2ssIHVpbnQ4X3QgKm9wYXF1ZV84Ynl0ZXMpOwotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9waW5nX3BhcnNlcl9iZWdpbl9mcmFtZSgKLSAgICBncnBjX2NodHRwMl9waW5nX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MpOwotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfcGluZ19wYXJzZXJfcGFyc2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX1BJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0NTI5ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUodWludDMyX3QgaWQsIHVpbnQzMl90IGNvZGUpIHsKLSAgZ3ByX3NsaWNlIHNsaWNlID0gZ3ByX3NsaWNlX21hbGxvYygxMyk7Ci0gIHVpbnQ4X3QgKnAgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKLQotICAqcCsrID0gMDsKLSAgKnArKyA9IDA7Ci0gICpwKysgPSA0OwotICAqcCsrID0gR1JQQ19DSFRUUDJfRlJBTUVfUlNUX1NUUkVBTTsKLSAgKnArKyA9IDA7Ci0gICpwKysgPSAodWludDhfdCkoaWQgPj4gMjQpOwotICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDE2KTsKLSAgKnArKyA9ICh1aW50OF90KShpZCA+PiA4KTsKLSAgKnArKyA9ICh1aW50OF90KShpZCk7Ci0gICpwKysgPSAodWludDhfdCkoY29kZSA+PiAyNCk7Ci0gICpwKysgPSAodWludDhfdCkoY29kZSA+PiAxNik7Ci0gICpwKysgPSAodWludDhfdCkoY29kZSA+PiA4KTsKLSAgKnArKyA9ICh1aW50OF90KShjb2RlKTsKLQotICByZXR1cm4gc2xpY2U7Ci19Ci0KLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fcGFyc2VyX2JlZ2luX2ZyYW1lKAotICAgIGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fcGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncykgewotICBpZiAobGVuZ3RoICE9IDQpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgImludmFsaWQgcnN0X3N0cmVhbTogbGVuZ3RoPSVkLCBmbGFncz0lMDJ4IiwgbGVuZ3RoLAotICAgICAgICAgICAgZmxhZ3MpOwotICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOwotICB9Ci0gIHBhcnNlci0+Ynl0ZSA9IDA7Ci0gIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLX0KLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXJfcGFyc2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KSB7Ci0gIHVpbnQ4X3QgKmNvbnN0IGJlZyA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc2xpY2UpOwotICB1aW50OF90ICpjb25zdCBlbmQgPSBHUFJfU0xJQ0VfRU5EX1BUUihzbGljZSk7Ci0gIHVpbnQ4X3QgKmN1ciA9IGJlZzsKLSAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXIgKnAgPSBwYXJzZXI7Ci0KLSAgd2hpbGUgKHAtPmJ5dGUgIT0gNCAmJiBjdXIgIT0gZW5kKSB7Ci0gICAgcC0+cmVhc29uX2J5dGVzW3AtPmJ5dGVdID0gKmN1cjsKLSAgICBjdXIrKzsKLSAgICBwLT5ieXRlKys7Ci0gIH0KLQotICBpZiAocC0+Ynl0ZSA9PSA0KSB7Ci0gICAgR1BSX0FTU0VSVChpc19sYXN0KTsKLSAgICBzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfY2xvc2UgPSAxOwotICAgIHN0cmVhbV9wYXJzaW5nLT5zYXdfcnN0X3N0cmVhbSA9IDE7Ci0gICAgc3RyZWFtX3BhcnNpbmctPnJzdF9zdHJlYW1fcmVhc29uID0gKCgodWludDMyX3QpcC0+cmVhc29uX2J5dGVzWzBdKSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KXAtPnJlYXNvbl9ieXRlc1sxXSkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdClwLT5yZWFzb25fYnl0ZXNbMl0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdClwLT5yZWFzb25fYnl0ZXNbM10pKTsKLSAgfQotCi0gIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjVjNWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX1JTVF9TVFJFQU1fSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9SU1RfU1RSRUFNX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYnl0ZTsKLSAgdWludDhfdCByZWFzb25fYnl0ZXNbNF07Ci19IGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fcGFyc2VyOwotCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUodWludDMyX3Qgc3RyZWFtX2lkLCB1aW50MzJfdCBjb2RlKTsKLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXIgKnBhcnNlciwgdWludDMyX3QgbGVuZ3RoLCB1aW50OF90IGZsYWdzKTsKLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fcGFyc2VyX3BhcnNlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9SU1RfU1RSRUFNX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0OWRkNC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvZGVidWcvdHJhY2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgotCi0jZGVmaW5lIE1BWF9NQVhfSEVBREVSX0xJU1RfU0laRSAoMTAyNCAqIDEwMjQgKiAxMDI0KQotCi0vKiBIVFRQLzIgbWFuZGF0ZWQgaW5pdGlhbCBjb25uZWN0aW9uIHNldHRpbmdzICovCi1jb25zdCBncnBjX2NodHRwMl9zZXR0aW5nX3BhcmFtZXRlcnMKLSAgICBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJhbWV0ZXJzW0dSUENfQ0hUVFAyX05VTV9TRVRUSU5HU10gPSB7Ci0gICAgICAgIHtOVUxMLCAwLCAwLCAwLCBHUlBDX0NIVFRQMl9ESVNDT05ORUNUX09OX0lOVkFMSURfVkFMVUUsCi0gICAgICAgICBHUlBDX0NIVFRQMl9QUk9UT0NPTF9FUlJPUn0sCi0gICAgICAgIHsiSEVBREVSX1RBQkxFX1NJWkUiLCA0MDk2LCAwLCAweGZmZmZmZmZmLAotICAgICAgICAgR1JQQ19DSFRUUDJfQ0xBTVBfSU5WQUxJRF9WQUxVRSwgR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1J9LAotICAgICAgICB7IkVOQUJMRV9QVVNIIiwgMSwgMCwgMSwgR1JQQ19DSFRUUDJfRElTQ09OTkVDVF9PTl9JTlZBTElEX1ZBTFVFLAotICAgICAgICAgR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1J9LAotICAgICAgICB7Ik1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCAweGZmZmZmZmZmdSwgMCwgMHhmZmZmZmZmZnUsCi0gICAgICAgICBHUlBDX0NIVFRQMl9ESVNDT05ORUNUX09OX0lOVkFMSURfVkFMVUUsIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SfSwKLSAgICAgICAgeyJJTklUSUFMX1dJTkRPV19TSVpFIiwgNjU1MzUsIDAsIDB4N2ZmZmZmZmZ1LAotICAgICAgICAgR1JQQ19DSFRUUDJfRElTQ09OTkVDVF9PTl9JTlZBTElEX1ZBTFVFLAotICAgICAgICAgR1JQQ19DSFRUUDJfRkxPV19DT05UUk9MX0VSUk9SfSwKLSAgICAgICAgeyJNQVhfRlJBTUVfU0laRSIsIDE2Mzg0LCAxNjM4NCwgMTY3NzcyMTUsCi0gICAgICAgICBHUlBDX0NIVFRQMl9ESVNDT05ORUNUX09OX0lOVkFMSURfVkFMVUUsIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SfSwKLSAgICAgICAgeyJNQVhfSEVBREVSX0xJU1RfU0laRSIsIE1BWF9NQVhfSEVBREVSX0xJU1RfU0laRSwgMCwKLSAgICAgICAgIE1BWF9NQVhfSEVBREVSX0xJU1RfU0laRSwgR1JQQ19DSFRUUDJfQ0xBTVBfSU5WQUxJRF9WQUxVRSwKLSAgICAgICAgIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SfSwKLX07Ci0KLXN0YXRpYyB1aW50OF90ICpmaWxsX2hlYWRlcih1aW50OF90ICpvdXQsIHVpbnQzMl90IGxlbmd0aCwgdWludDhfdCBmbGFncykgewotICAqb3V0KysgPSAodWludDhfdCkobGVuZ3RoID4+IDE2KTsKLSAgKm91dCsrID0gKHVpbnQ4X3QpKGxlbmd0aCA+PiA4KTsKLSAgKm91dCsrID0gKHVpbnQ4X3QpKGxlbmd0aCk7Ci0gICpvdXQrKyA9IEdSUENfQ0hUVFAyX0ZSQU1FX1NFVFRJTkdTOwotICAqb3V0KysgPSBmbGFnczsKLSAgKm91dCsrID0gMDsKLSAgKm91dCsrID0gMDsKLSAgKm91dCsrID0gMDsKLSAgKm91dCsrID0gMDsKLSAgcmV0dXJuIG91dDsKLX0KLQotZ3ByX3NsaWNlIGdycGNfY2h0dHAyX3NldHRpbmdzX2NyZWF0ZSh1aW50MzJfdCAqb2xkLCBjb25zdCB1aW50MzJfdCAqbmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JjZV9tYXNrLCBzaXplX3QgY291bnQpIHsKLSAgc2l6ZV90IGk7Ci0gIHVpbnQzMl90IG4gPSAwOwotICBncHJfc2xpY2Ugb3V0cHV0OwotICB1aW50OF90ICpwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgbiArPSAobmV3W2ldICE9IG9sZFtpXSB8fCAoZm9yY2VfbWFzayAmICgxdSA8PCBpKSkgIT0gMCk7Ci0gIH0KLQotICBvdXRwdXQgPSBncHJfc2xpY2VfbWFsbG9jKDkgKyA2ICogbik7Ci0gIHAgPSBmaWxsX2hlYWRlcihHUFJfU0xJQ0VfU1RBUlRfUFRSKG91dHB1dCksIDYgKiBuLCAwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIGlmIChuZXdbaV0gIT0gb2xkW2ldIHx8IChmb3JjZV9tYXNrICYgKDF1IDw8IGkpKSAhPSAwKSB7Ci0gICAgICBHUFJfQVNTRVJUKGkpOwotICAgICAgKnArKyA9ICh1aW50OF90KShpID4+IDgpOwotICAgICAgKnArKyA9ICh1aW50OF90KShpKTsKLSAgICAgICpwKysgPSAodWludDhfdCkobmV3W2ldID4+IDI0KTsKLSAgICAgICpwKysgPSAodWludDhfdCkobmV3W2ldID4+IDE2KTsKLSAgICAgICpwKysgPSAodWludDhfdCkobmV3W2ldID4+IDgpOwotICAgICAgKnArKyA9ICh1aW50OF90KShuZXdbaV0pOwotICAgICAgb2xkW2ldID0gbmV3W2ldOwotICAgIH0KLSAgfQotCi0gIEdQUl9BU1NFUlQocCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihvdXRwdXQpKTsKLQotICByZXR1cm4gb3V0cHV0OwotfQotCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfc2V0dGluZ3NfYWNrX2NyZWF0ZSh2b2lkKSB7Ci0gIGdwcl9zbGljZSBvdXRwdXQgPSBncHJfc2xpY2VfbWFsbG9jKDkpOwotICBmaWxsX2hlYWRlcihHUFJfU0xJQ0VfU1RBUlRfUFRSKG91dHB1dCksIDAsIEdSUENfQ0hUVFAyX0ZMQUdfQUNLKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyX2JlZ2luX2ZyYW1lKAotICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MsCi0gICAgdWludDMyX3QgKnNldHRpbmdzKSB7Ci0gIHBhcnNlci0+dGFyZ2V0X3NldHRpbmdzID0gc2V0dGluZ3M7Ci0gIG1lbWNweShwYXJzZXItPmluY29taW5nX3NldHRpbmdzLCBzZXR0aW5ncywKLSAgICAgICAgIEdSUENfQ0hUVFAyX05VTV9TRVRUSU5HUyAqIHNpemVvZih1aW50MzJfdCkpOwotICBwYXJzZXItPmlzX2FjayA9IDA7Ci0gIHBhcnNlci0+c3RhdGUgPSBHUlBDX0NIVFRQMl9TUFNfSUQwOwotICBpZiAoZmxhZ3MgPT0gR1JQQ19DSFRUUDJfRkxBR19BQ0spIHsKLSAgICBwYXJzZXItPmlzX2FjayA9IDE7Ci0gICAgaWYgKGxlbmd0aCAhPSAwKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIm5vbi1lbXB0eSBzZXR0aW5ncyBhY2sgZnJhbWUgcmVjZWl2ZWQiKTsKLSAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gIH0gZWxzZSBpZiAoZmxhZ3MgIT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCBmbGFncyBvbiBzZXR0aW5ncyBmcmFtZSIpOwotICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOwotICB9IGVsc2UgaWYgKGxlbmd0aCAlIDYgIT0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAic2V0dGluZ3MgZnJhbWVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXggYnl0ZXMiKTsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gIH0KLX0KLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyX3BhcnNlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpIHsKLSAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyICpwYXJzZXIgPSBwOwotICBjb25zdCB1aW50OF90ICpjdXIgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKLSAgY29uc3QgdWludDhfdCAqZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpOwotCi0gIGlmIChwYXJzZXItPmlzX2FjaykgewotICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLSAgfQotCi0gIGZvciAoOzspIHsKLSAgICBzd2l0Y2ggKHBhcnNlci0+c3RhdGUpIHsKLSAgICAgIGNhc2UgR1JQQ19DSFRUUDJfU1BTX0lEMDoKLSAgICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfU1BTX0lEMDsKLSAgICAgICAgICBpZiAoaXNfbGFzdCkgewotICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzX3VwZGF0ZWQgPSAxOwotICAgICAgICAgICAgbWVtY3B5KHBhcnNlci0+dGFyZ2V0X3NldHRpbmdzLCBwYXJzZXItPmluY29taW5nX3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX05VTV9TRVRUSU5HUyAqIHNpemVvZih1aW50MzJfdCkpOwotICAgICAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF9wYXJzaW5nLT5xYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfYWNrX2NyZWF0ZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICAgICAgICB9Ci0gICAgICAgIHBhcnNlci0+aWQgPSAodWludDE2X3QpKCgodWludDE2X3QpKmN1cikgPDwgOCk7Ci0gICAgICAgIGN1cisrOwotICAgICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICAgIGNhc2UgR1JQQ19DSFRUUDJfU1BTX0lEMToKLSAgICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfU1BTX0lEMTsKLSAgICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VyLT5pZCA9ICh1aW50MTZfdCkocGFyc2VyLT5pZCB8ICgqY3VyKSk7Ci0gICAgICAgIGN1cisrOwotICAgICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICAgIGNhc2UgR1JQQ19DSFRUUDJfU1BTX1ZBTDA6Ci0gICAgICAgIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgICAgICAgcGFyc2VyLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX1NQU19WQUwwOwotICAgICAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLSAgICAgICAgfQotICAgICAgICBwYXJzZXItPnZhbHVlID0gKCh1aW50MzJfdCkqY3VyKSA8PCAyNDsKLSAgICAgICAgY3VyKys7Ci0gICAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgICAgY2FzZSBHUlBDX0NIVFRQMl9TUFNfVkFMMToKLSAgICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfU1BTX1ZBTDE7Ci0gICAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICAgICAgICB9Ci0gICAgICAgIHBhcnNlci0+dmFsdWUgfD0gKCh1aW50MzJfdCkqY3VyKSA8PCAxNjsKLSAgICAgICAgY3VyKys7Ci0gICAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgICAgY2FzZSBHUlBDX0NIVFRQMl9TUFNfVkFMMjoKLSAgICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgICBwYXJzZXItPnN0YXRlID0gR1JQQ19DSFRUUDJfU1BTX1ZBTDI7Ci0gICAgICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICAgICAgICB9Ci0gICAgICAgIHBhcnNlci0+dmFsdWUgfD0gKCh1aW50MzJfdCkqY3VyKSA8PCA4OwotICAgICAgICBjdXIrKzsKLSAgICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgICBjYXNlIEdSUENfQ0hUVFAyX1NQU19WQUwzOgotICAgICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICAgIHBhcnNlci0+c3RhdGUgPSBHUlBDX0NIVFRQMl9TUFNfVkFMMzsKLSAgICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGFyc2VyLT5zdGF0ZSA9IEdSUENfQ0hUVFAyX1NQU19JRDA7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VyLT52YWx1ZSB8PSAqY3VyOwotICAgICAgICBjdXIrKzsKLQotICAgICAgICBpZiAocGFyc2VyLT5pZCA+IDAgJiYgcGFyc2VyLT5pZCA8IEdSUENfQ0hUVFAyX05VTV9TRVRUSU5HUykgewotICAgICAgICAgIGNvbnN0IGdycGNfY2h0dHAyX3NldHRpbmdfcGFyYW1ldGVycyAqc3AgPQotICAgICAgICAgICAgICAmZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyYW1ldGVyc1twYXJzZXItPmlkXTsKLSAgICAgICAgICBpZiAocGFyc2VyLT52YWx1ZSA8IHNwLT5taW5fdmFsdWUgfHwgcGFyc2VyLT52YWx1ZSA+IHNwLT5tYXhfdmFsdWUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3AtPmludmFsaWRfdmFsdWVfYmVoYXZpb3IpIHsKLSAgICAgICAgICAgICAgY2FzZSBHUlBDX0NIVFRQMl9DTEFNUF9JTlZBTElEX1ZBTFVFOgotICAgICAgICAgICAgICAgIHBhcnNlci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICBHUFJfQ0xBTVAocGFyc2VyLT52YWx1ZSwgc3AtPm1pbl92YWx1ZSwgc3AtPm1heF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgR1JQQ19DSFRUUDJfRElTQ09OTkVDVF9PTl9JTlZBTElEX1ZBTFVFOgotICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX2dvYXdheV9hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5sYXN0X2luY29taW5nX3N0cmVhbV9pZCwgc3AtPmVycm9yX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2VfZnJvbV9zdGF0aWNfc3RyaW5nKCJIVFRQMiBzZXR0aW5ncyBlcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPnFidWYpOwotICAgICAgICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCB2YWx1ZSAldSBwYXNzZWQgZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+dmFsdWUsIHNwLT5uYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHBhcnNlci0+aWQgPT0gR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRSAmJgotICAgICAgICAgICAgICBwYXJzZXItPmluY29taW5nX3NldHRpbmdzW3BhcnNlci0+aWRdICE9IHBhcnNlci0+dmFsdWUpIHsKLSAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbml0aWFsX3dpbmRvd191cGRhdGUgPQotICAgICAgICAgICAgICAgIChpbnQ2NF90KXBhcnNlci0+dmFsdWUgLSBwYXJzZXItPmluY29taW5nX3NldHRpbmdzW3BhcnNlci0+aWRdOwotICAgICAgICAgICAgaWYgKGdycGNfaHR0cF90cmFjZSkgewotICAgICAgICAgICAgICBncHJfbG9nKEdQUl9ERUJVRywgImFkZGluZyAlZCBmb3IgaW5pdGlhbF93aW5kb3cgY2hhbmdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAoaW50KXRyYW5zcG9ydF9wYXJzaW5nLT5pbml0aWFsX3dpbmRvd191cGRhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwYXJzZXItPmluY29taW5nX3NldHRpbmdzW3BhcnNlci0+aWRdID0gcGFyc2VyLT52YWx1ZTsKLSAgICAgICAgICBpZiAoZ3JwY19odHRwX3RyYWNlKSB7Ci0gICAgICAgICAgICBncHJfbG9nKEdQUl9ERUJVRywgIkNIVFRQMjolczogZ290IHNldHRpbmcgJWQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pc19jbGllbnQgPyAiQ0xJIiA6ICJTVlIiLCBwYXJzZXItPmlkLAotICAgICAgICAgICAgICAgICAgICBwYXJzZXItPnZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDSFRUUDI6IElnbm9yaW5nIHVua25vd24gc2V0dGluZyAlZCAodmFsdWUgJWQpIiwKLSAgICAgICAgICAgICAgICAgIHBhcnNlci0+aWQsIHBhcnNlci0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRiZmY5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX1NFVFRJTkdTX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfU0VUVElOR1NfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWUuaCIKLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19DSFRUUDJfU1BTX0lEMCwKLSAgR1JQQ19DSFRUUDJfU1BTX0lEMSwKLSAgR1JQQ19DSFRUUDJfU1BTX1ZBTDAsCi0gIEdSUENfQ0hUVFAyX1NQU19WQUwxLAotICBHUlBDX0NIVFRQMl9TUFNfVkFMMiwKLSAgR1JQQ19DSFRUUDJfU1BTX1ZBTDMKLX0gZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2Vfc3RhdGU7Ci0KLS8qIFRoZSB0aGluZ3MgSFRUUC8yIGRlZmluZXMgYXMgY29ubmVjdGlvbiBsZXZlbCBzZXR0aW5ncyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19DSFRUUDJfU0VUVElOR1NfSEVBREVSX1RBQkxFX1NJWkUgPSAxLAotICBHUlBDX0NIVFRQMl9TRVRUSU5HU19FTkFCTEVfUFVTSCA9IDIsCi0gIEdSUENfQ0hUVFAyX1NFVFRJTkdTX01BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSAzLAotICBHUlBDX0NIVFRQMl9TRVRUSU5HU19JTklUSUFMX1dJTkRPV19TSVpFID0gNCwKLSAgR1JQQ19DSFRUUDJfU0VUVElOR1NfTUFYX0ZSQU1FX1NJWkUgPSA1LAotICBHUlBDX0NIVFRQMl9TRVRUSU5HU19NQVhfSEVBREVSX0xJU1RfU0laRSA9IDYsCi0gIEdSUENfQ0hUVFAyX05VTV9TRVRUSU5HUwotfSBncnBjX2NodHRwMl9zZXR0aW5nX2lkOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcnNlX3N0YXRlIHN0YXRlOwotICB1aW50MzJfdCAqdGFyZ2V0X3NldHRpbmdzOwotICB1aW50OF90IGlzX2FjazsKLSAgdWludDE2X3QgaWQ7Ci0gIHVpbnQzMl90IHZhbHVlOwotICB1aW50MzJfdCBpbmNvbWluZ19zZXR0aW5nc1tHUlBDX0NIVFRQMl9OVU1fU0VUVElOR1NdOwotfSBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXI7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEdSUENfQ0hUVFAyX0NMQU1QX0lOVkFMSURfVkFMVUUsCi0gIEdSUENfQ0hUVFAyX0RJU0NPTk5FQ1RfT05fSU5WQUxJRF9WQUxVRQotfSBncnBjX2NodHRwMl9pbnZhbGlkX3ZhbHVlX2JlaGF2aW9yOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVpbnQzMl90IGRlZmF1bHRfdmFsdWU7Ci0gIHVpbnQzMl90IG1pbl92YWx1ZTsKLSAgdWludDMyX3QgbWF4X3ZhbHVlOwotICBncnBjX2NodHRwMl9pbnZhbGlkX3ZhbHVlX2JlaGF2aW9yIGludmFsaWRfdmFsdWVfYmVoYXZpb3I7Ci0gIHVpbnQzMl90IGVycm9yX3ZhbHVlOwotfSBncnBjX2NodHRwMl9zZXR0aW5nX3BhcmFtZXRlcnM7Ci0KLS8qIEhUVFAvMiBtYW5kYXRlZCBjb25uZWN0aW9uIHNldHRpbmcgcGFyYW1ldGVycyAqLwotZXh0ZXJuIGNvbnN0IGdycGNfY2h0dHAyX3NldHRpbmdfcGFyYW1ldGVycwotICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcmFtZXRlcnNbR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTXTsKLQotLyogQ3JlYXRlIGEgc2V0dGluZ3MgZnJhbWUgYnkgZGlmZmluZyBvbGQgJiBuZXcsIGFuZCB1cGRhdGluZyBvbGQgdG8gYmUgbmV3ICovCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfc2V0dGluZ3NfY3JlYXRlKHVpbnQzMl90ICpvbGQsIGNvbnN0IHVpbnQzMl90ICpuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcmNlX21hc2ssIHNpemVfdCBjb3VudCk7Ci0vKiBDcmVhdGUgYW4gYWNrIHNldHRpbmdzIGZyYW1lICovCi1ncHJfc2xpY2UgZ3JwY19jaHR0cDJfc2V0dGluZ3NfYWNrX2NyZWF0ZSh2b2lkKTsKLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyc2VyX2JlZ2luX2ZyYW1lKAotICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MsCi0gICAgdWludDMyX3QgKnNldHRpbmdzKTsKLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcnNlcl9wYXJzZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcGFyc2VyLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfRlJBTUVfU0VUVElOR1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkOWJhYy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotZ3ByX3NsaWNlIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfY3JlYXRlKHVpbnQzMl90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpbmRvd191cGRhdGUpIHsKLSAgZ3ByX3NsaWNlIHNsaWNlID0gZ3ByX3NsaWNlX21hbGxvYygxMyk7Ci0gIHVpbnQ4X3QgKnAgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKLQotICBHUFJfQVNTRVJUKHdpbmRvd191cGRhdGUpOwotCi0gICpwKysgPSAwOwotICAqcCsrID0gMDsKLSAgKnArKyA9IDQ7Ci0gICpwKysgPSBHUlBDX0NIVFRQMl9GUkFNRV9XSU5ET1dfVVBEQVRFOwotICAqcCsrID0gMDsKLSAgKnArKyA9ICh1aW50OF90KShpZCA+PiAyNCk7Ci0gICpwKysgPSAodWludDhfdCkoaWQgPj4gMTYpOwotICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDgpOwotICAqcCsrID0gKHVpbnQ4X3QpKGlkKTsKLSAgKnArKyA9ICh1aW50OF90KSh3aW5kb3dfdXBkYXRlID4+IDI0KTsKLSAgKnArKyA9ICh1aW50OF90KSh3aW5kb3dfdXBkYXRlID4+IDE2KTsKLSAgKnArKyA9ICh1aW50OF90KSh3aW5kb3dfdXBkYXRlID4+IDgpOwotICAqcCsrID0gKHVpbnQ4X3QpKHdpbmRvd191cGRhdGUpOwotCi0gIHJldHVybiBzbGljZTsKLX0KLQotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXIgKnBhcnNlciwgdWludDMyX3QgbGVuZ3RoLCB1aW50OF90IGZsYWdzKSB7Ci0gIGlmIChmbGFncyB8fCBsZW5ndGggIT0gNCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaW52YWxpZCB3aW5kb3cgdXBkYXRlOiBsZW5ndGg9JWQsIGZsYWdzPSUwMngiLCBsZW5ndGgsCi0gICAgICAgICAgICBmbGFncyk7Ci0gICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7Ci0gIH0KLSAgcGFyc2VyLT5ieXRlID0gMDsKLSAgcGFyc2VyLT5hbW91bnQgPSAwOwotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19Ci0KLWdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfcGFyc2VyX3BhcnNlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgewotICB1aW50OF90ICpjb25zdCBiZWcgPSBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKTsKLSAgdWludDhfdCAqY29uc3QgZW5kID0gR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpOwotICB1aW50OF90ICpjdXIgPSBiZWc7Ci0gIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfcGFyc2VyICpwID0gcGFyc2VyOwotCi0gIHdoaWxlIChwLT5ieXRlICE9IDQgJiYgY3VyICE9IGVuZCkgewotICAgIHAtPmFtb3VudCB8PSAoKHVpbnQzMl90KSpjdXIpIDw8ICg4ICogKDMgLSBwLT5ieXRlKSk7Ci0gICAgY3VyKys7Ci0gICAgcC0+Ynl0ZSsrOwotICB9Ci0KLSAgaWYgKHAtPmJ5dGUgPT0gNCkgewotICAgIHVpbnQzMl90IHJlY2VpdmVkX3VwZGF0ZSA9IHAtPmFtb3VudDsKLSAgICBpZiAocmVjZWl2ZWRfdXBkYXRlID09IDAgfHwgKHJlY2VpdmVkX3VwZGF0ZSAmIDB4ODAwMDAwMDB1KSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJpbnZhbGlkIHdpbmRvdyB1cGRhdGUgYnl0ZXM6ICVkIiwgcC0+YW1vdW50KTsKLSAgICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOwotICAgIH0KLSAgICBHUFJfQVNTRVJUKGlzX2xhc3QpOwotCi0gICAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgIT0gMCkgewotICAgICAgaWYgKHN0cmVhbV9wYXJzaW5nICE9IE5VTEwpIHsKLSAgICAgICAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfU1RSRUFNKCJwYXJzZSIsIHRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmcsIG91dGdvaW5nX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkX3VwZGF0ZSk7Ci0gICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmcpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9UUkFOU1BPUlQoInBhcnNlIiwgdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfd2luZG93LCByZWNlaXZlZF91cGRhdGUpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBHUlBDX0NIVFRQMl9QQVJTRV9PSzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2NhM2MuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX1dJTkRPV19VUERBVEVfSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9GUkFNRV9XSU5ET1dfVVBEQVRFX0gKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYnl0ZTsKLSAgdWludDhfdCBpc19jb25uZWN0aW9uX3VwZGF0ZTsKLSAgdWludDMyX3QgYW1vdW50OwotfSBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlcjsKLQotZ3ByX3NsaWNlIGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfY3JlYXRlKHVpbnQzMl90IGlkLCB1aW50MzJfdCB3aW5kb3dfZGVsdGEpOwotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlcl9iZWdpbl9mcmFtZSgKLSAgICBncnBjX2NodHRwMl93aW5kb3dfdXBkYXRlX3BhcnNlciAqcGFyc2VyLCB1aW50MzJfdCBsZW5ndGgsIHVpbnQ4X3QgZmxhZ3MpOwotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXJfcGFyc2UoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlciwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCBncHJfc2xpY2Ugc2xpY2UsIGludCBpc19sYXN0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0ZSQU1FX1dJTkRPV19VUERBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwZjU3NC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogVGhpcyBpcyBoZXJlIGZvciBncnBjX2lzX2JpbmFyeV9oZWFkZXIKLSAqIFRPRE8obXVyZ2F0cm9pZDk5KTogUmVtb3ZlIHRoaXMKLSAqLwotI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCi0KLSNkZWZpbmUgSEFTSF9GUkFHTUVOVF8xKHgpICgoeCkmMjU1KQotI2RlZmluZSBIQVNIX0ZSQUdNRU5UXzIoeCkgKCh4ID4+IDgpICYgMjU1KQotI2RlZmluZSBIQVNIX0ZSQUdNRU5UXzMoeCkgKCh4ID4+IDE2KSAmIDI1NSkKLSNkZWZpbmUgSEFTSF9GUkFHTUVOVF80KHgpICgoeCA+PiAyNCkgJiAyNTUpCi0KLS8qIGlmIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGlzIGl0ZW0gYmVpbmcgc2VlbiBhZ2FpbiBpcyA8IDEveCB0aGVuIGRvbid0IGFkZAotICAgaXQgdG8gdGhlIHRhYmxlICovCi0jZGVmaW5lIE9ORV9PTl9BRERfUFJPQkFCSUxJVFkgMTI4Ci0vKiBkb24ndCBjb25zaWRlciBhZGRpbmcgYW55dGhpbmcgYmlnZ2VyIHRoYW4gdGhpcyB0byB0aGUgaHBhY2sgdGFibGUgKi8KLSNkZWZpbmUgTUFYX0RFQ09ERVJfU1BBQ0VfVVNBR0UgNTEyCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGlzX2ZpcnN0X2ZyYW1lOwotICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gJ291dHB1dCcgd2hlbiB3ZSBzdGFydGVkIHRoZSBmcmFtZSAtIHVzZWQgdG8gY2FsY3VsYXRlCi0gICAgIGZyYW1lIGxlbmd0aCAqLwotICBzaXplX3Qgb3V0cHV0X2xlbmd0aF9hdF9zdGFydF9vZl9mcmFtZTsKLSAgLyogaW5kZXggKGluIG91dHB1dCkgb2YgdGhlIGhlYWRlciBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KLSAgc2l6ZV90IGhlYWRlcl9pZHg7Ci0gIC8qIGhhdmUgd2Ugc2VlbiBhIHJlZ3VsYXIgKG5vbi1jb2xvbi1wcmVmaXhlZCkgaGVhZGVyIHlldD8gKi8KLSAgdWludDhfdCBzZWVuX3JlZ3VsYXJfaGVhZGVyOwotICAvKiBvdXRwdXQgc3RyZWFtIGlkICovCi0gIHVpbnQzMl90IHN0cmVhbV9pZDsKLSAgZ3ByX3NsaWNlX2J1ZmZlciAqb3V0cHV0OwotfSBmcmFtZXJfc3RhdGU7Ci0KLS8qIGZpbGxzIHAgKHdoaWNoIGlzIGV4cGVjdGVkIHRvIGJlIDkgYnl0ZXMgbG9uZykgd2l0aCBhIGRhdGEgZnJhbWUgaGVhZGVyICovCi1zdGF0aWMgdm9pZCBmaWxsX2hlYWRlcih1aW50OF90ICpwLCB1aW50OF90IHR5cGUsIHVpbnQzMl90IGlkLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmbGFncykgewotICBHUFJfQVNTRVJUKGxlbiA8IDE2Nzc3MzE2KTsKLSAgKnArKyA9ICh1aW50OF90KShsZW4gPj4gMTYpOwotICAqcCsrID0gKHVpbnQ4X3QpKGxlbiA+PiA4KTsKLSAgKnArKyA9ICh1aW50OF90KShsZW4pOwotICAqcCsrID0gdHlwZTsKLSAgKnArKyA9IGZsYWdzOwotICAqcCsrID0gKHVpbnQ4X3QpKGlkID4+IDI0KTsKLSAgKnArKyA9ICh1aW50OF90KShpZCA+PiAxNik7Ci0gICpwKysgPSAodWludDhfdCkoaWQgPj4gOCk7Ci0gICpwKysgPSAodWludDhfdCkoaWQpOwotfQotCi0vKiBmaW5pc2ggYSBmcmFtZSAtIGZpbGwgaW4gdGhlIHByZXZpb3VzbHkgcmVzZXJ2ZWQgaGVhZGVyICovCi1zdGF0aWMgdm9pZCBmaW5pc2hfZnJhbWUoZnJhbWVyX3N0YXRlICpzdCwgaW50IGlzX2hlYWRlcl9ib3VuZGFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGFzdF9pbl9zdHJlYW0pIHsKLSAgdWludDhfdCB0eXBlID0gMHhmZjsKLSAgdHlwZSA9IHN0LT5pc19maXJzdF9mcmFtZSA/IEdSUENfQ0hUVFAyX0ZSQU1FX0hFQURFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR1JQQ19DSFRUUDJfRlJBTUVfQ09OVElOVUFUSU9OOwotICBmaWxsX2hlYWRlcigKLSAgICAgIEdQUl9TTElDRV9TVEFSVF9QVFIoc3QtPm91dHB1dC0+c2xpY2VzW3N0LT5oZWFkZXJfaWR4XSksIHR5cGUsCi0gICAgICBzdC0+c3RyZWFtX2lkLCBzdC0+b3V0cHV0LT5sZW5ndGggLSBzdC0+b3V0cHV0X2xlbmd0aF9hdF9zdGFydF9vZl9mcmFtZSwKLSAgICAgICh1aW50OF90KSgoaXNfbGFzdF9pbl9zdHJlYW0gPyBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX1NUUkVBTSA6IDApIHwKLSAgICAgICAgICAgICAgICAoaXNfaGVhZGVyX2JvdW5kYXJ5ID8gR1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9IRUFERVJTIDogMCkpKTsKLSAgc3QtPmlzX2ZpcnN0X2ZyYW1lID0gMDsKLX0KLQotLyogYmVnaW4gYSBuZXcgZnJhbWU6IHJlc2VydmUgb2ZmIGhlYWRlciBzcGFjZSwgcmVtZW1iZXIgaG93IG1hbnkgYnl0ZXMgd2UnZAotICAgb3V0cHV0IGJlZm9yZSBiZWdpbm5pbmcgKi8KLXN0YXRpYyB2b2lkIGJlZ2luX2ZyYW1lKGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgc3QtPmhlYWRlcl9pZHggPQotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGRfaW5kZXhlZChzdC0+b3V0cHV0LCBncHJfc2xpY2VfbWFsbG9jKDkpKTsKLSAgc3QtPm91dHB1dF9sZW5ndGhfYXRfc3RhcnRfb2ZfZnJhbWUgPSBzdC0+b3V0cHV0LT5sZW5ndGg7Ci19Ci0KLS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBjdXJyZW50IGZyYW1lIGlzIG9mIHRoZSB0eXBlIGRlc2lyZWQsIGFuZCBoYXMgc3VmZmljaWVudAotICAgc3BhY2UgdG8gYWRkIGF0IGxlYXN0IGFib3V0X3RvX2FkZCBieXRlcyAtLSBmaW5pc2hlcyB0aGUgY3VycmVudCBmcmFtZSBpZgotICAgbmVlZGVkICovCi1zdGF0aWMgdm9pZCBlbnN1cmVfc3BhY2UoZnJhbWVyX3N0YXRlICpzdCwgc2l6ZV90IG5lZWRfYnl0ZXMpIHsKLSAgaWYgKHN0LT5vdXRwdXQtPmxlbmd0aCAtIHN0LT5vdXRwdXRfbGVuZ3RoX2F0X3N0YXJ0X29mX2ZyYW1lICsgbmVlZF9ieXRlcyA8PQotICAgICAgR1JQQ19DSFRUUDJfTUFYX1BBWUxPQURfTEVOR1RIKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZpbmlzaF9mcmFtZShzdCwgMCwgMCk7Ci0gIGJlZ2luX2ZyYW1lKHN0KTsKLX0KLQotLyogaW5jcmVtZW50IGEgZmlsdGVyIGNvdW50LCBoYWx2ZSBhbGwgY291bnRzIGlmIG9uZSBlbGVtZW50IHJlYWNoZXMgbWF4ICovCi1zdGF0aWMgdm9pZCBpbmNfZmlsdGVyKHVpbnQ4X3QgaWR4LCB1aW50MzJfdCAqc3VtLCB1aW50OF90ICplbGVtcykgewotICBlbGVtc1tpZHhdKys7Ci0gIGlmIChlbGVtc1tpZHhdIDwgMjU1KSB7Ci0gICAgKCpzdW0pKys7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGk7Ci0gICAgKnN1bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IEdSUENfQ0hUVFAyX0hQQUNLQ19OVU1fRklMVEVSUzsgaSsrKSB7Ci0gICAgICBlbGVtc1tpXSAvPSAyOwotICAgICAgKCpzdW0pICs9IGVsZW1zW2ldOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBhZGRfaGVhZGVyX2RhdGEoZnJhbWVyX3N0YXRlICpzdCwgZ3ByX3NsaWNlIHNsaWNlKSB7Ci0gIHNpemVfdCBsZW4gPSBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKTsKLSAgc2l6ZV90IHJlbWFpbmluZzsKLSAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gIHJlbWFpbmluZyA9IEdSUENfQ0hUVFAyX01BWF9QQVlMT0FEX0xFTkdUSCArCi0gICAgICAgICAgICAgIHN0LT5vdXRwdXRfbGVuZ3RoX2F0X3N0YXJ0X29mX2ZyYW1lIC0gc3QtPm91dHB1dC0+bGVuZ3RoOwotICBpZiAobGVuIDw9IHJlbWFpbmluZykgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKHN0LT5vdXRwdXQsIHNsaWNlKTsKLSAgfSBlbHNlIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX2FkZChzdC0+b3V0cHV0LCBncHJfc2xpY2Vfc3BsaXRfaGVhZCgmc2xpY2UsIHJlbWFpbmluZykpOwotICAgIGZpbmlzaF9mcmFtZShzdCwgMCwgMCk7Ci0gICAgYmVnaW5fZnJhbWUoc3QpOwotICAgIGFkZF9oZWFkZXJfZGF0YShzdCwgc2xpY2UpOwotICB9Ci19Ci0KLXN0YXRpYyB1aW50OF90ICphZGRfdGlueV9oZWFkZXJfZGF0YShmcmFtZXJfc3RhdGUgKnN0LCBzaXplX3QgbGVuKSB7Ci0gIGVuc3VyZV9zcGFjZShzdCwgbGVuKTsKLSAgcmV0dXJuIGdwcl9zbGljZV9idWZmZXJfdGlueV9hZGQoc3QtPm91dHB1dCwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgZXZpY3RfZW50cnkoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYykgewotICBjLT50YWlsX3JlbW90ZV9pbmRleCsrOwotICBHUFJfQVNTRVJUKGMtPnRhaWxfcmVtb3RlX2luZGV4ID4gMCk7Ci0gIEdQUl9BU1NFUlQoYy0+dGFibGVfc2l6ZSA+PQotICAgICAgICAgICAgIGMtPnRhYmxlX2VsZW1fc2l6ZVtjLT50YWlsX3JlbW90ZV9pbmRleCAlIGMtPmNhcF90YWJsZV9lbGVtc10pOwotICBHUFJfQVNTRVJUKGMtPnRhYmxlX2VsZW1zID4gMCk7Ci0gIGMtPnRhYmxlX3NpemUgPQotICAgICAgKHVpbnQxNl90KShjLT50YWJsZV9zaXplIC0KLSAgICAgICAgICAgICAgICAgYy0+dGFibGVfZWxlbV9zaXplW2MtPnRhaWxfcmVtb3RlX2luZGV4ICUgYy0+Y2FwX3RhYmxlX2VsZW1zXSk7Ci0gIGMtPnRhYmxlX2VsZW1zLS07Ci19Ci0KLS8qIGFkZCBhbiBlbGVtZW50IHRvIHRoZSBkZWNvZGVyIHRhYmxlICovCi1zdGF0aWMgdm9pZCBhZGRfZWxlbShncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCBncnBjX21kZWxlbSAqZWxlbSkgewotICB1aW50MzJfdCBrZXlfaGFzaCA9IGVsZW0tPmtleS0+aGFzaDsKLSAgdWludDMyX3QgZWxlbV9oYXNoID0gR1JQQ19NRFNUUl9LVl9IQVNIKGtleV9oYXNoLCBlbGVtLT52YWx1ZS0+aGFzaCk7Ci0gIHVpbnQzMl90IG5ld19pbmRleCA9IGMtPnRhaWxfcmVtb3RlX2luZGV4ICsgYy0+dGFibGVfZWxlbXMgKyAxOwotICBzaXplX3QgZWxlbV9zaXplID0gMzIgKyBHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpICsKLSAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoZWxlbS0+dmFsdWUtPnNsaWNlKTsKLQotICBHUFJfQVNTRVJUKGVsZW1fc2l6ZSA8IDY1NTM2KTsKLQotICBpZiAoZWxlbV9zaXplID4gYy0+bWF4X3RhYmxlX3NpemUpIHsKLSAgICB3aGlsZSAoYy0+dGFibGVfc2l6ZSA+IDApIHsKLSAgICAgIGV2aWN0X2VudHJ5KGMpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBSZXNlcnZlIHNwYWNlIGZvciB0aGlzIGVsZW1lbnQgaW4gdGhlIHJlbW90ZSB0YWJsZTogaWYgdGhpcyBvdmVyZmxvd3MKLSAgICAgdGhlIGN1cnJlbnQgdGFibGUsIGRyb3AgZWxlbWVudHMgdW50aWwgaXQgZml0cywgbWF0Y2hpbmcgdGhlIGRlY29tcHJlc3NvcgotICAgICBhbGdvcml0aG0gKi8KLSAgd2hpbGUgKGMtPnRhYmxlX3NpemUgKyBlbGVtX3NpemUgPiBjLT5tYXhfdGFibGVfc2l6ZSkgewotICAgIGV2aWN0X2VudHJ5KGMpOwotICB9Ci0gIEdQUl9BU1NFUlQoYy0+dGFibGVfZWxlbXMgPCBjLT5tYXhfdGFibGVfc2l6ZSk7Ci0gIGMtPnRhYmxlX2VsZW1fc2l6ZVtuZXdfaW5kZXggJSBjLT5jYXBfdGFibGVfZWxlbXNdID0gKHVpbnQxNl90KWVsZW1fc2l6ZTsKLSAgYy0+dGFibGVfc2l6ZSA9ICh1aW50MTZfdCkoYy0+dGFibGVfc2l6ZSArIGVsZW1fc2l6ZSk7Ci0gIGMtPnRhYmxlX2VsZW1zKys7Ci0KLSAgLyogU3RvcmUgdGhpcyBlbGVtZW50IGludG8ge2VudHJpZXMsaW5kaWNlc31fZWxlbSAqLwotICBpZiAoYy0+ZW50cmllc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzIoZWxlbV9oYXNoKV0gPT0gZWxlbSkgewotICAgIC8qIGFscmVhZHkgdGhlcmU6IHVwZGF0ZSB3aXRoIG5ldyBpbmRleCAqLwotICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldID0gbmV3X2luZGV4OwotICB9IGVsc2UgaWYgKGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID09IGVsZW0pIHsKLSAgICAvKiBhbHJlYWR5IHRoZXJlIChjdWNrb28pOiB1cGRhdGUgd2l0aCBuZXcgaW5kZXggKi8KLSAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSA9IG5ld19pbmRleDsKLSAgfSBlbHNlIGlmIChjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9PSBOVUxMKSB7Ci0gICAgLyogbm90IHRoZXJlLCBidXQgYSBmcmVlIGVsZW1lbnQ6IGFkZCAqLwotICAgIGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldID0gR1JQQ19NREVMRU1fUkVGKGVsZW0pOwotICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldID0gbmV3X2luZGV4OwotICB9IGVsc2UgaWYgKGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID09IE5VTEwpIHsKLSAgICAvKiBub3QgdGhlcmUgKGN1Y2tvbyksIGJ1dCBhIGZyZWUgZWxlbWVudDogYWRkICovCi0gICAgYy0+ZW50cmllc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzMoZWxlbV9oYXNoKV0gPSBHUlBDX01ERUxFTV9SRUYoZWxlbSk7Ci0gICAgYy0+aW5kaWNlc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzMoZWxlbV9oYXNoKV0gPSBuZXdfaW5kZXg7Ci0gIH0gZWxzZSBpZiAoYy0+aW5kaWNlc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzIoZWxlbV9oYXNoKV0gPAotICAgICAgICAgICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldKSB7Ci0gICAgLyogbm90IHRoZXJlOiByZXBsYWNlIG9sZGVzdCAqLwotICAgIEdSUENfTURFTEVNX1VOUkVGKGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldKTsKLSAgICBjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9IEdSUENfTURFTEVNX1JFRihlbGVtKTsKLSAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9IG5ld19pbmRleDsKLSAgfSBlbHNlIHsKLSAgICAvKiBub3QgdGhlcmU6IHJlcGxhY2Ugb2xkZXN0ICovCi0gICAgR1JQQ19NREVMRU1fVU5SRUYoYy0+ZW50cmllc19lbGVtc1tIQVNIX0ZSQUdNRU5UXzMoZWxlbV9oYXNoKV0pOwotICAgIGMtPmVudHJpZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID0gR1JQQ19NREVMRU1fUkVGKGVsZW0pOwotICAgIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8zKGVsZW1faGFzaCldID0gbmV3X2luZGV4OwotICB9Ci0KLSAgLyogZG8gZXhhY3RseSB0aGUgc2FtZSBmb3IgdGhlIGtleSAoc28gd2UgY2FuIGZpbmQgYnkgdGhhdCBhZ2FpbiB0b28pICovCi0KLSAgaWYgKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzIoa2V5X2hhc2gpXSA9PSBlbGVtLT5rZXkpIHsKLSAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8yKGtleV9oYXNoKV0gPSBuZXdfaW5kZXg7Ci0gIH0gZWxzZSBpZiAoYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMyhrZXlfaGFzaCldID09IGVsZW0tPmtleSkgewotICAgIGMtPmluZGljZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9IG5ld19pbmRleDsKLSAgfSBlbHNlIGlmIChjLT5lbnRyaWVzX2tleXNbSEFTSF9GUkFHTUVOVF8yKGtleV9oYXNoKV0gPT0gTlVMTCkgewotICAgIGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzIoa2V5X2hhc2gpXSA9IEdSUENfTURTVFJfUkVGKGVsZW0tPmtleSk7Ci0gICAgYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldID0gbmV3X2luZGV4OwotICB9IGVsc2UgaWYgKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9PSBOVUxMKSB7Ci0gICAgYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMyhrZXlfaGFzaCldID0gR1JQQ19NRFNUUl9SRUYoZWxlbS0+a2V5KTsKLSAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8zKGtleV9oYXNoKV0gPSBuZXdfaW5kZXg7Ci0gIH0gZWxzZSBpZiAoYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldIDwKLSAgICAgICAgICAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8zKGtleV9oYXNoKV0pIHsKLSAgICBHUlBDX01EU1RSX1VOUkVGKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzIoa2V5X2hhc2gpXSk7Ci0gICAgYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldID0gR1JQQ19NRFNUUl9SRUYoZWxlbS0+a2V5KTsKLSAgICBjLT5pbmRpY2VzX2tleXNbSEFTSF9GUkFHTUVOVF8yKGtleV9oYXNoKV0gPSBuZXdfaW5kZXg7Ci0gIH0gZWxzZSB7Ci0gICAgR1JQQ19NRFNUUl9VTlJFRihjLT5lbnRyaWVzX2tleXNbSEFTSF9GUkFHTUVOVF8zKGtleV9oYXNoKV0pOwotICAgIGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9IEdSUENfTURTVFJfUkVGKGVsZW0tPmtleSk7Ci0gICAgYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMyhrZXlfaGFzaCldID0gbmV3X2luZGV4OwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGVtaXRfaW5kZXhlZChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBlbGVtX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgdWludDMyX3QgbGVuID0gR1JQQ19DSFRUUDJfVkFSSU5UX0xFTkdUSChlbGVtX2luZGV4LCAxKTsKLSAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGVsZW1faW5kZXgsIDEsIDB4ODAsIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLX0KLQotc3RhdGljIGdwcl9zbGljZSBnZXRfd2lyZV92YWx1ZShncnBjX21kZWxlbSAqZWxlbSwgdWludDhfdCAqaHVmZm1hbl9wcmVmaXgpIHsKLSAgaWYgKGdycGNfaXNfYmluYXJ5X2hlYWRlcigoY29uc3QgY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoZWxlbS0+a2V5LT5zbGljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChlbGVtLT5rZXktPnNsaWNlKSkpIHsKLSAgICAqaHVmZm1hbl9wcmVmaXggPSAweDgwOwotICAgIHJldHVybiBncnBjX21kc3RyX2FzX2Jhc2U2NF9lbmNvZGVkX2FuZF9odWZmbWFuX2NvbXByZXNzZWQoZWxlbS0+dmFsdWUpOwotICB9Ci0gIC8qIFRPRE8oY3RpbGxlcik6IG9wcG9ydHVuaXN0aWNhbGx5IGNvbXByZXNzIG5vbi1iaW5hcnkgaGVhZGVycyAqLwotICAqaHVmZm1hbl9wcmVmaXggPSAweDAwOwotICByZXR1cm4gZWxlbS0+dmFsdWUtPnNsaWNlOwotfQotCi1zdGF0aWMgdm9pZCBlbWl0X2xpdGhkcl9pbmNpZHgoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrZXlfaW5kZXgsIGdycGNfbWRlbGVtICplbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgdWludDMyX3QgbGVuX3BmeCA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgoa2V5X2luZGV4LCAyKTsKLSAgdWludDhfdCBodWZmbWFuX3ByZWZpeDsKLSAgZ3ByX3NsaWNlIHZhbHVlX3NsaWNlID0gZ2V0X3dpcmVfdmFsdWUoZWxlbSwgJmh1ZmZtYW5fcHJlZml4KTsKLSAgc2l6ZV90IGxlbl92YWwgPSBHUFJfU0xJQ0VfTEVOR1RIKHZhbHVlX3NsaWNlKTsKLSAgdWludDMyX3QgbGVuX3ZhbF9sZW47Ci0gIEdQUl9BU1NFUlQobGVuX3ZhbCA8PSBVSU5UMzJfTUFYKTsKLSAgbGVuX3ZhbF9sZW4gPSBHUlBDX0NIVFRQMl9WQVJJTlRfTEVOR1RIKCh1aW50MzJfdClsZW5fdmFsLCAxKTsKLSAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGtleV9pbmRleCwgMiwgMHg0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fcGZ4KSwgbGVuX3BmeCk7Ci0gIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVCgodWludDMyX3QpbGVuX3ZhbCwgMSwgaHVmZm1hbl9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX3ZhbF9sZW4pLCBsZW5fdmFsX2xlbik7Ci0gIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZih2YWx1ZV9zbGljZSkpOwotfQotCi1zdGF0aWMgdm9pZCBlbWl0X2xpdGhkcl9ub2lkeChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5X2luZGV4LCBncnBjX21kZWxlbSAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgdWludDMyX3QgbGVuX3BmeCA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgoa2V5X2luZGV4LCA0KTsKLSAgdWludDhfdCBodWZmbWFuX3ByZWZpeDsKLSAgZ3ByX3NsaWNlIHZhbHVlX3NsaWNlID0gZ2V0X3dpcmVfdmFsdWUoZWxlbSwgJmh1ZmZtYW5fcHJlZml4KTsKLSAgc2l6ZV90IGxlbl92YWwgPSBHUFJfU0xJQ0VfTEVOR1RIKHZhbHVlX3NsaWNlKTsKLSAgdWludDMyX3QgbGVuX3ZhbF9sZW47Ci0gIEdQUl9BU1NFUlQobGVuX3ZhbCA8PSBVSU5UMzJfTUFYKTsKLSAgbGVuX3ZhbF9sZW4gPSBHUlBDX0NIVFRQMl9WQVJJTlRfTEVOR1RIKCh1aW50MzJfdClsZW5fdmFsLCAxKTsKLSAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGtleV9pbmRleCwgNCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fcGZ4KSwgbGVuX3BmeCk7Ci0gIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVCgodWludDMyX3QpbGVuX3ZhbCwgMSwgaHVmZm1hbl9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX3ZhbF9sZW4pLCBsZW5fdmFsX2xlbik7Ci0gIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZih2YWx1ZV9zbGljZSkpOwotfQotCi1zdGF0aWMgdm9pZCBlbWl0X2xpdGhkcl9pbmNpZHhfdihncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW0sIGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgdWludDMyX3QgbGVuX2tleSA9ICh1aW50MzJfdClHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpOwotICB1aW50OF90IGh1ZmZtYW5fcHJlZml4OwotICBncHJfc2xpY2UgdmFsdWVfc2xpY2UgPSBnZXRfd2lyZV92YWx1ZShlbGVtLCAmaHVmZm1hbl9wcmVmaXgpOwotICB1aW50MzJfdCBsZW5fdmFsID0gKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpOwotICB1aW50MzJfdCBsZW5fa2V5X2xlbiA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgobGVuX2tleSwgMSk7Ci0gIHVpbnQzMl90IGxlbl92YWxfbGVuID0gR1JQQ19DSFRUUDJfVkFSSU5UX0xFTkdUSChsZW5fdmFsLCAxKTsKLSAgR1BSX0FTU0VSVChsZW5fa2V5IDw9IFVJTlQzMl9NQVgpOwotICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpIDw9IFVJTlQzMl9NQVgpOwotICAqYWRkX3RpbnlfaGVhZGVyX2RhdGEoc3QsIDEpID0gMHg0MDsKLSAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGxlbl9rZXksIDEsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX2tleV9sZW4pLCBsZW5fa2V5X2xlbik7Ci0gIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZihlbGVtLT5rZXktPnNsaWNlKSk7Ci0gIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVChsZW5fdmFsLCAxLCBodWZmbWFuX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fdmFsX2xlbiksIGxlbl92YWxfbGVuKTsKLSAgYWRkX2hlYWRlcl9kYXRhKHN0LCBncHJfc2xpY2VfcmVmKHZhbHVlX3NsaWNlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtaXRfbGl0aGRyX25vaWR4X3YoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW0sIGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgdWludDMyX3QgbGVuX2tleSA9ICh1aW50MzJfdClHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPmtleS0+c2xpY2UpOwotICB1aW50OF90IGh1ZmZtYW5fcHJlZml4OwotICBncHJfc2xpY2UgdmFsdWVfc2xpY2UgPSBnZXRfd2lyZV92YWx1ZShlbGVtLCAmaHVmZm1hbl9wcmVmaXgpOwotICB1aW50MzJfdCBsZW5fdmFsID0gKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpOwotICB1aW50MzJfdCBsZW5fa2V5X2xlbiA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgobGVuX2tleSwgMSk7Ci0gIHVpbnQzMl90IGxlbl92YWxfbGVuID0gR1JQQ19DSFRUUDJfVkFSSU5UX0xFTkdUSChsZW5fdmFsLCAxKTsKLSAgR1BSX0FTU0VSVChsZW5fa2V5IDw9IFVJTlQzMl9NQVgpOwotICBHUFJfQVNTRVJUKEdQUl9TTElDRV9MRU5HVEgodmFsdWVfc2xpY2UpIDw9IFVJTlQzMl9NQVgpOwotICAqYWRkX3RpbnlfaGVhZGVyX2RhdGEoc3QsIDEpID0gMHgwMDsKLSAgR1JQQ19DSFRUUDJfV1JJVEVfVkFSSU5UKGxlbl9rZXksIDEsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuX2tleV9sZW4pLCBsZW5fa2V5X2xlbik7Ci0gIGFkZF9oZWFkZXJfZGF0YShzdCwgZ3ByX3NsaWNlX3JlZihlbGVtLT5rZXktPnNsaWNlKSk7Ci0gIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVChsZW5fdmFsLCAxLCBodWZmbWFuX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90aW55X2hlYWRlcl9kYXRhKHN0LCBsZW5fdmFsX2xlbiksIGxlbl92YWxfbGVuKTsKLSAgYWRkX2hlYWRlcl9kYXRhKHN0LCBncHJfc2xpY2VfcmVmKHZhbHVlX3NsaWNlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtaXRfYWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJfc3RhdGUgKnN0KSB7Ci0gIHVpbnQzMl90IGxlbiA9IEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgoYy0+bWF4X3RhYmxlX3NpemUsIDMpOwotICBHUlBDX0NIVFRQMl9XUklURV9WQVJJTlQoYy0+bWF4X3RhYmxlX3NpemUsIDMsIDB4MjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfdGlueV9oZWFkZXJfZGF0YShzdCwgbGVuKSwgbGVuKTsKLSAgYy0+YWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlID0gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90IGR5bmlkeChncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBlbGVtX2luZGV4KSB7Ci0gIHJldHVybiAxICsgR1JQQ19DSFRUUDJfTEFTVF9TVEFUSUNfRU5UUlkgKyBjLT50YWlsX3JlbW90ZV9pbmRleCArCi0gICAgICAgICBjLT50YWJsZV9lbGVtcyAtIGVsZW1faW5kZXg7Ci19Ci0KLS8qIGVuY29kZSBhbiBtZGVsZW0gKi8KLXN0YXRpYyB2b2lkIGhwYWNrX2VuYyhncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCBncnBjX21kZWxlbSAqZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJfc3RhdGUgKnN0KSB7Ci0gIHVpbnQzMl90IGtleV9oYXNoID0gZWxlbS0+a2V5LT5oYXNoOwotICB1aW50MzJfdCBlbGVtX2hhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0goa2V5X2hhc2gsIGVsZW0tPnZhbHVlLT5oYXNoKTsKLSAgc2l6ZV90IGRlY29kZXJfc3BhY2VfdXNhZ2U7Ci0gIHVpbnQzMl90IGluZGljZXNfa2V5OwotICBpbnQgc2hvdWxkX2FkZF9lbGVtOwotCi0gIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSChlbGVtLT5rZXktPnNsaWNlKSA+IDApOwotICBpZiAoR1BSX1NMSUNFX1NUQVJUX1BUUihlbGVtLT5rZXktPnNsaWNlKVswXSAhPSAnOicpIHsgLyogcmVndWxhciBoZWFkZXIgKi8KLSAgICBzdC0+c2Vlbl9yZWd1bGFyX2hlYWRlciA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgR1BSX0FTU0VSVCgKLSAgICAgICAgc3QtPnNlZW5fcmVndWxhcl9oZWFkZXIgPT0gMCAmJgotICAgICAgICAiUmVzZXJ2ZWQgaGVhZGVyIChjb2xvbi1wcmVmaXhlZCkgaGFwcGVuaW5nIGFmdGVyIHJlZ3VsYXIgb25lcy4iKTsKLSAgfQotCi0gIGluY19maWx0ZXIoSEFTSF9GUkFHTUVOVF8xKGVsZW1faGFzaCksICZjLT5maWx0ZXJfZWxlbXNfc3VtLCBjLT5maWx0ZXJfZWxlbXMpOwotCi0gIC8qIGlzIHRoaXMgZWxlbSBjdXJyZW50bHkgaW4gdGhlIGRlY29kZXJzIHRhYmxlPyAqLwotCi0gIGlmIChjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA9PSBlbGVtICYmCi0gICAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMihlbGVtX2hhc2gpXSA+IGMtPnRhaWxfcmVtb3RlX2luZGV4KSB7Ci0gICAgLyogSElUOiBjb21wbGV0ZSBlbGVtZW50IChmaXJzdCBjdWNrb28gaGFzaCkgKi8KLSAgICBlbWl0X2luZGV4ZWQoYywgZHluaWR4KGMsIGMtPmluZGljZXNfZWxlbXNbSEFTSF9GUkFHTUVOVF8yKGVsZW1faGFzaCldKSwKLSAgICAgICAgICAgICAgICAgc3QpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChjLT5lbnRyaWVzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSA9PSBlbGVtICYmCi0gICAgICBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSA+IGMtPnRhaWxfcmVtb3RlX2luZGV4KSB7Ci0gICAgLyogSElUOiBjb21wbGV0ZSBlbGVtZW50IChzZWNvbmQgY3Vja29vIGhhc2gpICovCi0gICAgZW1pdF9pbmRleGVkKGMsIGR5bmlkeChjLCBjLT5pbmRpY2VzX2VsZW1zW0hBU0hfRlJBR01FTlRfMyhlbGVtX2hhc2gpXSksCi0gICAgICAgICAgICAgICAgIHN0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBzaG91bGQgdGhpcyBlbGVtIGJlIGluIHRoZSB0YWJsZT8gKi8KLSAgZGVjb2Rlcl9zcGFjZV91c2FnZSA9IDMyICsgR1BSX1NMSUNFX0xFTkdUSChlbGVtLT5rZXktPnNsaWNlKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKGVsZW0tPnZhbHVlLT5zbGljZSk7Ci0gIHNob3VsZF9hZGRfZWxlbSA9IGRlY29kZXJfc3BhY2VfdXNhZ2UgPCBNQVhfREVDT0RFUl9TUEFDRV9VU0FHRSAmJgotICAgICAgICAgICAgICAgICAgICBjLT5maWx0ZXJfZWxlbXNbSEFTSF9GUkFHTUVOVF8xKGVsZW1faGFzaCldID49Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5maWx0ZXJfZWxlbXNfc3VtIC8gT05FX09OX0FERF9QUk9CQUJJTElUWTsKLQotICAvKiBubyBoaXRzIGZvciB0aGUgZWxlbS4uLiBtYXliZSB0aGVyZSdzIGEga2V5PyAqLwotCi0gIGluZGljZXNfa2V5ID0gYy0+aW5kaWNlc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldOwotICBpZiAoYy0+ZW50cmllc19rZXlzW0hBU0hfRlJBR01FTlRfMihrZXlfaGFzaCldID09IGVsZW0tPmtleSAmJgotICAgICAgaW5kaWNlc19rZXkgPiBjLT50YWlsX3JlbW90ZV9pbmRleCkgewotICAgIC8qIEhJVDoga2V5IChmaXJzdCBjdWNrb28gaGFzaCkgKi8KLSAgICBpZiAoc2hvdWxkX2FkZF9lbGVtKSB7Ci0gICAgICBlbWl0X2xpdGhkcl9pbmNpZHgoYywgZHluaWR4KGMsIGluZGljZXNfa2V5KSwgZWxlbSwgc3QpOwotICAgICAgYWRkX2VsZW0oYywgZWxlbSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVtaXRfbGl0aGRyX25vaWR4KGMsIGR5bmlkeChjLCBpbmRpY2VzX2tleSksIGVsZW0sIHN0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgR1BSX1VOUkVBQ0hBQkxFX0NPREUocmV0dXJuICk7Ci0gIH0KLQotICBpbmRpY2VzX2tleSA9IGMtPmluZGljZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXTsKLSAgaWYgKGMtPmVudHJpZXNfa2V5c1tIQVNIX0ZSQUdNRU5UXzMoa2V5X2hhc2gpXSA9PSBlbGVtLT5rZXkgJiYKLSAgICAgIGluZGljZXNfa2V5ID4gYy0+dGFpbF9yZW1vdGVfaW5kZXgpIHsKLSAgICAvKiBISVQ6IGtleSAoZmlyc3QgY3Vja29vIGhhc2gpICovCi0gICAgaWYgKHNob3VsZF9hZGRfZWxlbSkgewotICAgICAgZW1pdF9saXRoZHJfaW5jaWR4KGMsIGR5bmlkeChjLCBpbmRpY2VzX2tleSksIGVsZW0sIHN0KTsKLSAgICAgIGFkZF9lbGVtKGMsIGVsZW0pOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbWl0X2xpdGhkcl9ub2lkeChjLCBkeW5pZHgoYywgaW5kaWNlc19rZXkpLCBlbGVtLCBzdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiApOwotICB9Ci0KLSAgLyogbm8gZWxlbSwga2V5IGluIHRoZSB0YWJsZS4uLiBmYWxsIGJhY2sgdG8gbGl0ZXJhbCBlbWlzc2lvbiAqLwotCi0gIGlmIChzaG91bGRfYWRkX2VsZW0pIHsKLSAgICBlbWl0X2xpdGhkcl9pbmNpZHhfdihjLCBlbGVtLCBzdCk7Ci0gICAgYWRkX2VsZW0oYywgZWxlbSk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgewotICAgIGVtaXRfbGl0aGRyX25vaWR4X3YoYywgZWxlbSwgc3QpOwotICAgIHJldHVybjsKLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKLX0KLQotI2RlZmluZSBTVFJMRU5fTElUKHgpIChzaXplb2YoeCkgLSAxKQotI2RlZmluZSBUSU1FT1VUX0tFWSAiZ3JwYy10aW1lb3V0IgotCi1zdGF0aWMgdm9pZCBkZWFkbGluZV9lbmMoZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYywgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcl9zdGF0ZSAqc3QpIHsKLSAgY2hhciB0aW1lb3V0X3N0cltHUlBDX0NIVFRQMl9USU1FT1VUX0VOQ09ERV9NSU5fQlVGU0laRV07Ci0gIGdycGNfbWRlbGVtICptZGVsZW07Ci0gIGdycGNfY2h0dHAyX2VuY29kZV90aW1lb3V0KAotICAgICAgZ3ByX3RpbWVfc3ViKGRlYWRsaW5lLCBncHJfbm93KGRlYWRsaW5lLmNsb2NrX3R5cGUpKSwgdGltZW91dF9zdHIpOwotICBtZGVsZW0gPSBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCi0gICAgICBHUlBDX01EU1RSX0dSUENfVElNRU9VVCwgZ3JwY19tZHN0cl9mcm9tX3N0cmluZyh0aW1lb3V0X3N0cikpOwotICBocGFja19lbmMoYywgbWRlbGVtLCBzdCk7Ci0gIEdSUENfTURFTEVNX1VOUkVGKG1kZWxlbSk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBlbGVtc19mb3JfYnl0ZXModWludDMyX3QgYnl0ZXMpIHsgcmV0dXJuIChieXRlcyArIDMxKSAvIDMyOyB9Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9pbml0KGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMpIHsKLSAgbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOwotICBjLT5tYXhfdGFibGVfc2l6ZSA9IEdSUENfQ0hUVFAyX0hQQUNLQ19JTklUSUFMX1RBQkxFX1NJWkU7Ci0gIGMtPmNhcF90YWJsZV9lbGVtcyA9IGVsZW1zX2Zvcl9ieXRlcyhjLT5tYXhfdGFibGVfc2l6ZSk7Ci0gIGMtPm1heF90YWJsZV9lbGVtcyA9IGMtPmNhcF90YWJsZV9lbGVtczsKLSAgYy0+bWF4X3VzYWJsZV9zaXplID0gR1JQQ19DSFRUUDJfSFBBQ0tDX0lOSVRJQUxfVEFCTEVfU0laRTsKLSAgYy0+dGFibGVfZWxlbV9zaXplID0KLSAgICAgIGdwcl9tYWxsb2Moc2l6ZW9mKCpjLT50YWJsZV9lbGVtX3NpemUpICogYy0+Y2FwX3RhYmxlX2VsZW1zKTsKLSAgbWVtc2V0KGMtPnRhYmxlX2VsZW1fc2l6ZSwgMCwKLSAgICAgICAgIHNpemVvZigqYy0+dGFibGVfZWxlbV9zaXplKSAqIGMtPmNhcF90YWJsZV9lbGVtcyk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9kZXN0cm95KGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBHUlBDX0NIVFRQMl9IUEFDS0NfTlVNX1ZBTFVFUzsgaSsrKSB7Ci0gICAgaWYgKGMtPmVudHJpZXNfa2V5c1tpXSkgR1JQQ19NRFNUUl9VTlJFRihjLT5lbnRyaWVzX2tleXNbaV0pOwotICAgIGlmIChjLT5lbnRyaWVzX2VsZW1zW2ldKSBHUlBDX01ERUxFTV9VTlJFRihjLT5lbnRyaWVzX2VsZW1zW2ldKTsKLSAgfQotICBncHJfZnJlZShjLT50YWJsZV9lbGVtX3NpemUpOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF91c2FibGVfc2l6ZSgKLSAgICBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yICpjLCB1aW50MzJfdCBtYXhfdGFibGVfc2l6ZSkgewotICBjLT5tYXhfdXNhYmxlX3NpemUgPSBtYXhfdGFibGVfc2l6ZTsKLSAgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9zZXRfbWF4X3RhYmxlX3NpemUoCi0gICAgICBjLCBHUFJfTUlOKGMtPm1heF90YWJsZV9zaXplLCBtYXhfdGFibGVfc2l6ZSkpOwotfQotCi1zdGF0aWMgdm9pZCByZWJ1aWxkX2VsZW1zKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IG5ld19jYXApIHsKLSAgdWludDE2X3QgKnRhYmxlX2VsZW1fc2l6ZSA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp0YWJsZV9lbGVtX3NpemUpICogbmV3X2NhcCk7Ci0gIHVpbnQzMl90IGk7Ci0KLSAgbWVtc2V0KHRhYmxlX2VsZW1fc2l6ZSwgMCwgc2l6ZW9mKCp0YWJsZV9lbGVtX3NpemUpICogbmV3X2NhcCk7Ci0gIEdQUl9BU1NFUlQoYy0+dGFibGVfZWxlbXMgPD0gbmV3X2NhcCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGMtPnRhYmxlX2VsZW1zOyBpKyspIHsKLSAgICB1aW50MzJfdCBvZnMgPSBjLT50YWlsX3JlbW90ZV9pbmRleCArIGkgKyAxOwotICAgIHRhYmxlX2VsZW1fc2l6ZVtvZnMgJSBuZXdfY2FwXSA9Ci0gICAgICAgIGMtPnRhYmxlX2VsZW1fc2l6ZVtvZnMgJSBjLT5jYXBfdGFibGVfZWxlbXNdOwotICB9Ci0KLSAgYy0+Y2FwX3RhYmxlX2VsZW1zID0gbmV3X2NhcDsKLSAgZ3ByX2ZyZWUoYy0+dGFibGVfZWxlbV9zaXplKTsKLSAgYy0+dGFibGVfZWxlbV9zaXplID0gdGFibGVfZWxlbV9zaXplOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF90YWJsZV9zaXplKAotICAgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IG1heF90YWJsZV9zaXplKSB7Ci0gIG1heF90YWJsZV9zaXplID0gR1BSX01JTihtYXhfdGFibGVfc2l6ZSwgYy0+bWF4X3VzYWJsZV9zaXplKTsKLSAgaWYgKG1heF90YWJsZV9zaXplID09IGMtPm1heF90YWJsZV9zaXplKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHdoaWxlIChjLT50YWJsZV9zaXplID4gMCAmJiBjLT50YWJsZV9zaXplID4gbWF4X3RhYmxlX3NpemUpIHsKLSAgICBldmljdF9lbnRyeShjKTsKLSAgfQotICBjLT5tYXhfdGFibGVfc2l6ZSA9IG1heF90YWJsZV9zaXplOwotICBjLT5tYXhfdGFibGVfZWxlbXMgPSBlbGVtc19mb3JfYnl0ZXMobWF4X3RhYmxlX3NpemUpOwotICBpZiAoYy0+bWF4X3RhYmxlX2VsZW1zID4gYy0+Y2FwX3RhYmxlX2VsZW1zKSB7Ci0gICAgcmVidWlsZF9lbGVtcyhjLCBHUFJfTUFYKGMtPm1heF90YWJsZV9lbGVtcywgMiAqIGMtPmNhcF90YWJsZV9lbGVtcykpOwotICB9IGVsc2UgaWYgKGMtPm1heF90YWJsZV9lbGVtcyA8IGMtPmNhcF90YWJsZV9lbGVtcyAvIDMpIHsKLSAgICB1aW50MzJfdCBuZXdfY2FwID0gR1BSX01BWChjLT5tYXhfdGFibGVfZWxlbXMsIDE2KTsKLSAgICBpZiAobmV3X2NhcCAhPSBjLT5jYXBfdGFibGVfZWxlbXMpIHsKLSAgICAgIHJlYnVpbGRfZWxlbXMoYywgbmV3X2NhcCk7Ci0gICAgfQotICB9Ci0gIGMtPmFkdmVydGlzZV90YWJsZV9zaXplX2NoYW5nZSA9IDE7Ci0gIGdwcl9sb2coR1BSX0RFQlVHLCAic2V0IG1heCB0YWJsZSBzaXplIGZyb20gZW5jb2RlciB0byAlZCIsIG1heF90YWJsZV9zaXplKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9lbmNvZGVfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1ldGFkYXRhLCBpbnQgaXNfZW9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKm91dGJ1ZikgewotICBmcmFtZXJfc3RhdGUgc3Q7Ci0gIGdycGNfbGlua2VkX21kZWxlbSAqbDsKLSAgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lOwotCi0gIEdQUl9BU1NFUlQoc3RyZWFtX2lkICE9IDApOwotCi0gIHN0LnNlZW5fcmVndWxhcl9oZWFkZXIgPSAwOwotICBzdC5zdHJlYW1faWQgPSBzdHJlYW1faWQ7Ci0gIHN0Lm91dHB1dCA9IG91dGJ1ZjsKLSAgc3QuaXNfZmlyc3RfZnJhbWUgPSAxOwotCi0gIC8qIEVuY29kZSBhIG1ldGFkYXRhIGJhdGNoOyBzdG9yZSB0aGUgcmV0dXJuZWQgdmFsdWVzLCByZXByZXNlbnRpbmcKLSAgICAgYSBtZXRhZGF0YSBlbGVtZW50IHRoYXQgbmVlZHMgdG8gYmUgdW5yZWZmZWQgYmFjayBpbnRvIHRoZSBtZXRhZGF0YQotICAgICBzbG90LiBUSElTIE1BWSBOT1QgQkUgVEhFIFNBTUUgRUxFTUVOVCAoaWYgYSBkZWNvZGVyIHRhYmxlIHNsb3QgZ290Ci0gICAgIHVwZGF0ZWQpLiBBZnRlciB0aGlzIGxvb3AsIHdlJ2xsIGRvIGEgYmF0Y2ggdW5yZWYgb2YgZWxlbWVudHMuICovCi0gIGJlZ2luX2ZyYW1lKCZzdCk7Ci0gIGlmIChjLT5hZHZlcnRpc2VfdGFibGVfc2l6ZV9jaGFuZ2UgIT0gMCkgewotICAgIGVtaXRfYWR2ZXJ0aXNlX3RhYmxlX3NpemVfY2hhbmdlKGMsICZzdCk7Ci0gIH0KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaF9hc3NlcnRfb2sobWV0YWRhdGEpOwotICBmb3IgKGwgPSBtZXRhZGF0YS0+bGlzdC5oZWFkOyBsOyBsID0gbC0+bmV4dCkgewotICAgIGhwYWNrX2VuYyhjLCBsLT5tZCwgJnN0KTsKLSAgfQotICBkZWFkbGluZSA9IG1ldGFkYXRhLT5kZWFkbGluZTsKLSAgaWYgKGdwcl90aW1lX2NtcChkZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUoZGVhZGxpbmUuY2xvY2tfdHlwZSkpICE9IDApIHsKLSAgICBkZWFkbGluZV9lbmMoYywgZGVhZGxpbmUsICZzdCk7Ci0gIH0KLQotICBmaW5pc2hfZnJhbWUoJnN0LCAxLCBpc19lb2YpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmggYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4NmViNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfSFBBQ0tfRU5DT0RFUl9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0hQQUNLX0VOQ09ERVJfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIgotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0hQQUNLQ19OVU1fRklMVEVSUyAyNTYKLSNkZWZpbmUgR1JQQ19DSFRUUDJfSFBBQ0tDX05VTV9WQUxVRVMgMjU2Ci0vKiBpbml0aWFsIHRhYmxlIHNpemUsIHBlciBzcGVjICovCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0hQQUNLQ19JTklUSUFMX1RBQkxFX1NJWkUgNDA5NgotLyogbWF4aW11bSB0YWJsZSBzaXplIHdlJ2xsIGFjdHVhbGx5IHVzZSAqLwotI2RlZmluZSBHUlBDX0NIVFRQMl9IUEFDS0NfTUFYX1RBQkxFX1NJWkUgKDEwMjQgKiAxMDI0KQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IGZpbHRlcl9lbGVtc19zdW07Ci0gIHVpbnQzMl90IG1heF90YWJsZV9zaXplOwotICB1aW50MzJfdCBtYXhfdGFibGVfZWxlbXM7Ci0gIHVpbnQzMl90IGNhcF90YWJsZV9lbGVtczsKLSAgLyoqIGlmIG5vbi16ZXJvLCBhZHZlcnRpc2UgdG8gdGhlIGRlY29kZXIgdGhhdCB3ZSdsbCBzdGFydCB1c2luZyBhIHRhYmxlCi0gICAgICBvZiB0aGlzIHNpemUgKi8KLSAgdWludDhfdCBhZHZlcnRpc2VfdGFibGVfc2l6ZV9jaGFuZ2U7Ci0gIC8qKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB3ZSdsbCB1c2UgZm9yIHRoZSBkZWNvZGUgdGFibGUgKHRvIGd1YXJkIGFnYWluc3QKLSAgICAgIHBlZXJzIG9vbWluZyB1cyBieSBzZXR0aW5nIGRlY29kZSB0YWJsZSBzaXplIGhpZ2gpICovCi0gIHVpbnQzMl90IG1heF91c2FibGVfc2l6ZTsKLSAgLyogb25lIGJlZm9yZSB0aGUgbG93ZXN0IHVzYWJsZSB0YWJsZSBpbmRleCAqLwotICB1aW50MzJfdCB0YWlsX3JlbW90ZV9pbmRleDsKLSAgdWludDMyX3QgdGFibGVfc2l6ZTsKLSAgdWludDMyX3QgdGFibGVfZWxlbXM7Ci0KLSAgLyogZmlsdGVyIHRhYmxlcyBmb3IgZWxlbXM6IHRoaXMgdGFibGVzIHByb3ZpZGVzIGFuIGFwcHJveGltYXRlCi0gICAgIHBvcHVsYXJpdHkgY291bnQgZm9yIHBhcnRpY3VsYXIgaGFzaGVzLCBhbmQgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLSAgICAgYSBuZXcgbGl0ZXJhbCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGNvbXByZXNzaW9uIHRhYmxlIG9yIG5vdC4KLSAgICAgVGhleSB0cmFjayBhIHNpbmdsZSBpbnRlZ2VyIHRoYXQgY291bnRzIGhvdyBvZnRlbiBhIHBhcnRpY3VsYXIgdmFsdWUgaGFzCi0gICAgIGJlZW4gc2Vlbi4gV2hlbiB0aGF0IGNvdW50IHJlYWNoZXMgbWF4ICgyNTUpLCBhbGwgdmFsdWVzIGFyZSBoYWx2ZWQuICovCi0gIHVpbnQ4X3QgZmlsdGVyX2VsZW1zW0dSUENfQ0hUVFAyX0hQQUNLQ19OVU1fRklMVEVSU107Ci0KLSAgLyogZW50cnkgdGFibGVzIGZvciBrZXlzICYgZWxlbXM6IHRoZXNlIHRhYmxlcyB0cmFjayB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4KLSAgICAgc2VlbiBhbmQgKm1heSogYmUgaW4gdGhlIGRlY29tcHJlc3NvciB0YWJsZSAqLwotICBncnBjX21kc3RyICplbnRyaWVzX2tleXNbR1JQQ19DSFRUUDJfSFBBQ0tDX05VTV9WQUxVRVNdOwotICBncnBjX21kZWxlbSAqZW50cmllc19lbGVtc1tHUlBDX0NIVFRQMl9IUEFDS0NfTlVNX1ZBTFVFU107Ci0gIHVpbnQzMl90IGluZGljZXNfa2V5c1tHUlBDX0NIVFRQMl9IUEFDS0NfTlVNX1ZBTFVFU107Ci0gIHVpbnQzMl90IGluZGljZXNfZWxlbXNbR1JQQ19DSFRUUDJfSFBBQ0tDX05VTV9WQUxVRVNdOwotCi0gIHVpbnQxNl90ICp0YWJsZV9lbGVtX3NpemU7Ci19IGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3I7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9pbml0KGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMpOwotdm9pZCBncnBjX2NodHRwMl9ocGFja19jb21wcmVzc29yX2Rlc3Ryb3koZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciAqYyk7Ci12b2lkIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF90YWJsZV9zaXplKAotICAgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IG1heF90YWJsZV9zaXplKTsKLXZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9zZXRfbWF4X3VzYWJsZV9zaXplKAotICAgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IG1heF90YWJsZV9zaXplKTsKLQotdm9pZCBncnBjX2NodHRwMl9lbmNvZGVfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3IgKmMsIHVpbnQzMl90IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKm1ldGFkYXRhLCBpbnQgaXNfZW9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9idWZmZXIgKm91dGJ1Zik7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9IUEFDS19FTkNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmUzNjkyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ5ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBUaGlzIGlzIGhlcmUgZm9yIGdycGNfaXNfYmluYXJ5X2hlYWRlcgotICogVE9ETyhtdXJnYXRyb2lkOTkpOiBSZW1vdmUgdGhpcwotICovCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgiCi0KLXR5cGVkZWYgZW51bSB7Ci0gIE5PVF9CSU5BUlksCi0gIEI2NF9CWVRFMCwKLSAgQjY0X0JZVEUxLAotICBCNjRfQllURTIsCi0gIEI2NF9CWVRFMwotfSBiaW5hcnlfc3RhdGU7Ci0KLS8qIEhvdyBwYXJzaW5nIHdvcmtzOgotCi0gICBUaGUgcGFyc2VyIG9iamVjdCBrZWVwcyB0cmFjayBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUKLSAgIGN1cnJlbnQgcGFyc2Ugc3RhdGUuCi0KLSAgIEVhY2ggdGltZSBuZXcgYnl0ZXMgYXJlIHByZXNlbnRlZCwgd2UgY2FsbCBpbnRvIHRoZSBjdXJyZW50IHN0YXRlLCB3aGljaAotICAgcmVjdXJzaXZlbHkgcGFyc2VzIHVudGlsIGFsbCBieXRlcyBpbiB0aGUgZ2l2ZW4gY2h1bmsgYXJlIGV4aGF1c3RlZC4KLQotICAgVGhlIHBhcnNlIHN0YXRlIHRoYXQgdGVybWluYXRlcyB0aGVuIHNhdmVzIGl0cyBmdW5jdGlvbiBwb2ludGVyIHRvIGJlIHRoZQotICAgY3VycmVudCBzdGF0ZSBzbyB0aGF0IGl0IGNhbiByZXN1bWUgd2hlbiBtb3JlIGJ5dGVzIGFyZSBhdmFpbGFibGUuCi0KLSAgIEl0J3MgZXhwZWN0ZWQgdGhhdCBtb3N0IG9wdGltaXppbmcgY29tcGlsZXJzIHdpbGwgdHVybiB0aGlzIGNvZGUgaW50bwotICAgYSBzZXQgb2YgaW5kaXJlY3QganVtcHMsIGFuZCBzbyBub3Qgd2FzdGUgc3RhY2sgc3BhY2UuICovCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBwYXJzaW5nIHN0YXRlcyAqLwotc3RhdGljIGludCBwYXJzZV9iZWdpbihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfZXJyb3IoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX2lsbGVnYWxfb3AoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKLQotc3RhdGljIGludCBwYXJzZV9zdHJpbmdfcHJlZml4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX2tleV9zdHJpbmcoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXkoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2xpdGVyYWxfa2V5KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOwotCi1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlMChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlMShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlMihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlMyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlNChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlNXVwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOwotCi1zdGF0aWMgaW50IHBhcnNlX2luZGV4ZWRfZmllbGQoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfaW5kZXhlZF9maWVsZF94KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX2luY2lkeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfaW5jaWR4X3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpOwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfaW5jaWR4X3YoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpOwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9ub3RpZHhfeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9ub3RpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci1zdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9udnJpZHgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX252cmlkeF94KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX252cmlkeF92KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfbWF4X3RibF9zaXplKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKTsKLXN0YXRpYyBpbnQgcGFyc2VfbWF4X3RibF9zaXplX3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci0KLS8qIHdlIHRyYW5zbGF0ZSB0aGUgZmlyc3QgYnl0ZSBvZiBhIGhwYWNrIGZpZWxkIGludG8gb25lIG9mIHRoZXNlIGRlY29kaW5nCi0gICBjYXNlcywgdGhlbiB1c2UgYSBsb29rdXAgdGFibGUgdG8ganVtcCBkaXJlY3RseSB0byB0aGUgYXBwcm9wcmlhdGUgcGFyc2VyLgotCi0gICBfWCA9PiB0aGUgaW50ZWdlciBpbmRleCBpcyBhbGwgb25lcywgbWVhbmluZyB3ZSBuZWVkIHRvIGRvIHZhcmludCBkZWNvZGluZwotICAgX1YgPT4gdGhlIGludGVnZXIgaW5kZXggaXMgYWxsIHplcm9zLCBtZWFuaW5nIHdlIG5lZWQgdG8gZGVjb2RlIGFuIGFkZGl0aW9uYWwKLSAgICAgICAgIHN0cmluZyB2YWx1ZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgSU5ERVhFRF9GSUVMRCwKLSAgSU5ERVhFRF9GSUVMRF9YLAotICBMSVRIRFJfSU5DSURYLAotICBMSVRIRFJfSU5DSURYX1gsCi0gIExJVEhEUl9JTkNJRFhfViwKLSAgTElUSERSX05PVElEWCwKLSAgTElUSERSX05PVElEWF9YLAotICBMSVRIRFJfTk9USURYX1YsCi0gIExJVEhEUl9OVlJJRFgsCi0gIExJVEhEUl9OVlJJRFhfWCwKLSAgTElUSERSX05WUklEWF9WLAotICBNQVhfVEJMX1NJWkUsCi0gIE1BWF9UQkxfU0laRV9YLAotICBJTExFR0FMCi19IGZpcnN0X2J5dGVfdHlwZTsKLQotLyoganVtcCB0YWJsZSBvZiBwYXJzZSBzdGF0ZSBmdW5jdGlvbnMgLS0gb3JkZXIgbXVzdCBtYXRjaCBmaXJzdF9ieXRlX3R5cGUKLSAgIGFib3ZlICovCi1zdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGZpcnN0X2J5dGVfYWN0aW9uW10gPSB7Ci0gICAgcGFyc2VfaW5kZXhlZF9maWVsZCwgICBwYXJzZV9pbmRleGVkX2ZpZWxkX3gsIHBhcnNlX2xpdGhkcl9pbmNpZHgsCi0gICAgcGFyc2VfbGl0aGRyX2luY2lkeF94LCBwYXJzZV9saXRoZHJfaW5jaWR4X3YsIHBhcnNlX2xpdGhkcl9ub3RpZHgsCi0gICAgcGFyc2VfbGl0aGRyX25vdGlkeF94LCBwYXJzZV9saXRoZHJfbm90aWR4X3YsIHBhcnNlX2xpdGhkcl9udnJpZHgsCi0gICAgcGFyc2VfbGl0aGRyX252cmlkeF94LCBwYXJzZV9saXRoZHJfbnZyaWR4X3YsIHBhcnNlX21heF90Ymxfc2l6ZSwKLSAgICBwYXJzZV9tYXhfdGJsX3NpemVfeCwgIHBhcnNlX2lsbGVnYWxfb3B9OwotCi0vKiBpbmRleGVzIHRoZSBmaXJzdCBieXRlIHRvIGEgcGFyc2Ugc3RhdGUgZnVuY3Rpb24gLSBnZW5lcmF0ZWQgYnkKLSAgIGdlbl9ocGFja190YWJsZXMuYyAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmlyc3RfYnl0ZV9sdXRbMjU2XSA9IHsKLSAgICBMSVRIRFJfTk9USURYX1YsIExJVEhEUl9OT1RJRFgsIExJVEhEUl9OT1RJRFgsIExJVEhEUl9OT1RJRFgsCi0gICAgTElUSERSX05PVElEWCwgICBMSVRIRFJfTk9USURYLCBMSVRIRFJfTk9USURYLCBMSVRIRFJfTk9USURYLAotICAgIExJVEhEUl9OT1RJRFgsICAgTElUSERSX05PVElEWCwgTElUSERSX05PVElEWCwgTElUSERSX05PVElEWCwKLSAgICBMSVRIRFJfTk9USURYLCAgIExJVEhEUl9OT1RJRFgsIExJVEhEUl9OT1RJRFgsIExJVEhEUl9OT1RJRFhfWCwKLSAgICBMSVRIRFJfTlZSSURYX1YsIExJVEhEUl9OVlJJRFgsIExJVEhEUl9OVlJJRFgsIExJVEhEUl9OVlJJRFgsCi0gICAgTElUSERSX05WUklEWCwgICBMSVRIRFJfTlZSSURYLCBMSVRIRFJfTlZSSURYLCBMSVRIRFJfTlZSSURYLAotICAgIExJVEhEUl9OVlJJRFgsICAgTElUSERSX05WUklEWCwgTElUSERSX05WUklEWCwgTElUSERSX05WUklEWCwKLSAgICBMSVRIRFJfTlZSSURYLCAgIExJVEhEUl9OVlJJRFgsIExJVEhEUl9OVlJJRFgsIExJVEhEUl9OVlJJRFhfWCwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwKLSAgICBNQVhfVEJMX1NJWkUsICAgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRSwgIE1BWF9UQkxfU0laRV9YLAotICAgIExJVEhEUl9JTkNJRFhfViwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKLSAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCi0gICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAotICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKLSAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCi0gICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAotICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKLSAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCi0gICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAotICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKLSAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCi0gICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAotICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwKLSAgICBMSVRIRFJfSU5DSURYLCAgIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsIExJVEhEUl9JTkNJRFgsCi0gICAgTElUSERSX0lOQ0lEWCwgICBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLCBMSVRIRFJfSU5DSURYLAotICAgIExJVEhEUl9JTkNJRFgsICAgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWCwgTElUSERSX0lOQ0lEWF9YLAotICAgIElMTEVHQUwsICAgICAgICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsCi0gICAgSU5ERVhFRF9GSUVMRCwgICBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELCBJTkRFWEVEX0ZJRUxELAotICAgIElOREVYRURfRklFTEQsICAgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwgSU5ERVhFRF9GSUVMRCwKLSAgICBJTkRFWEVEX0ZJRUxELCAgIElOREVYRURfRklFTEQsIElOREVYRURfRklFTEQsIElOREVYRURfRklFTERfWCwKLX07Ci0KLS8qIHN0YXRlIHRhYmxlIGZvciBodWZmbWFuIGRlY29kaW5nOiBnaXZlbiBhIHN0YXRlLCBnaXZlcyBhbiBpbmRleC8xNiBpbnRvCi0gICBuZXh0X3N1Yl90YmwuIFRha2luZyB0aGF0IGluZGV4IGFuZCBhZGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBuaWJibGUgYmVpbmcKLSAgIGNvbnNpZGVyZWQgcmV0dXJucyB0aGUgbmV4dCBzdGF0ZS4KLQotICAgZ2VuZXJhdGVkIGJ5IGdlbl9ocGFja190YWJsZXMuYyAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgbmV4dF90YmxbMjU2XSA9IHsKLSAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDEsICAyLCA1LCAgNiwgIDEsIDcsICA4LCAgMSwgIDMsICAzLCAgOSwgIDEwLCAxMSwgMSwgIDEsCi0gICAgMSwgIDEyLCAxLCAgMiwgIDEzLCAxLCAgMSwgMSwgIDEsICAxLCAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLAotICAgIDE0LCAxLCAgMTUsIDE2LCAxLCAgMTcsIDEsIDE1LCAyLCAgNywgMywgIDE4LCAxOSwgMSwgIDEsICAxLCAgMSwgIDIwLCAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAgMTUsIDIsIDIsICA3LCAgMjEsIDEsICAyMiwgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMTUsIDIsICAyLCAgMiwgMiwgIDIsICAyLCAyMywgMjQsIDI1LCAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLAotICAgIDI2LCAzLCAgMywgIDI3LCAxMCwgMjgsIDEsIDEsICAxLCAgMSwgMSwgIDEsICAyLCAgMywgIDI5LCAxMCwgMzAsIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAgMSwgIDEsIDEsICAzMSwgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsCi0gICAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgMzIsIDEsICAxLCAxNSwgMzMsIDEsICAzNCwgMzUsIDksICAzNiwgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDEsICAzNywgMSwgIDEsIDEsICAxLCAgMSwgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyNiwgOSwKLSAgICAzOCwgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAgMTUsIDIsIDIsICAyLCAgMiwgIDI2LCAzLCAgMywgIDM5LCAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgMSwgIDIsICAyLCAyLCAgMiwgIDIsICAyLCAgNywgIDMsICAzLCAgMywgIDQwLCAyLAotICAgIDQxLCAxLCAgMSwgIDEsICA0MiwgNDMsIDEsIDEsICA0NCwgMSwgMSwgIDEsICAxLCAgMTUsIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKLSAgICAzLCAgMywgIDMsICA0NSwgNDYsIDEsICAxLCAyLCAgMiwgIDIsIDM1LCAzLCAgMywgIDE4LCA0NywgMiwKLX07Ci0KLS8qIG5leHQgc3RhdGUsIGJhc2VkIHVwb24gY3VycmVudCBzdGF0ZSBhbmQgdGhlIGN1cnJlbnQgbmliYmxlOiBzZWUgYWJvdmUuCi0gICBnZW5lcmF0ZWQgYnkgZ2VuX2hwYWNrX3RhYmxlcy5jICovCi1zdGF0aWMgY29uc3QgaW50MTZfdCBuZXh0X3N1Yl90YmxbNDggKiAxNl0gPSB7Ci0gICAgMSwgICAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywKLSAgICAyMTgsIDIsICAgNiwgICAxMCwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAyLCAgIDYsICAgMTAsICAxMywgIDE0LCAgMTUsCi0gICAgMTYsICAxNywgIDMsICAgNywgICAxMSwgIDI0LCAgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsICAyNCwgIDMsCi0gICAgNywgICAxMSwgIDI0LCAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsCi0gICAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDUsCi0gICAgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgOSwgICAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwKLSAgICAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDMsICAgNywgICAxMSwgIDI0LCAgMywgICA3LCAgIDExLCAgMjQsCi0gICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMiwgIDEzMiwgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsCi0gICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE4LCAgMTksICAyMCwgIDIxLCAgNCwgICA4LCAgIDQsCi0gICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAyMiwgIDIzLCAgOTEsICAyNSwgIDI2LAotICAgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICAzLAotICAgIDcsICAgMTEsICAyNCwgIDMsICAgNywgICAxMSwgIDI0LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDQxLCAgNDIsICA0MywKLSAgICAyLCAgIDYsICAgMTAsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsCi0gICAgMjQsICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsCi0gICAgNDQsICA0NSwgIDIsICAgNiwgICAxMCwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLAotICAgIDUxLCAgNTIsICA1NywgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgNTMsICA1NCwgIDU1LCAgNTYsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywKLSAgICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzQsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA3MywgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLCAgODIsCi0gICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDMsICAgNywgICAxMSwgIDI0LCAgMywgICA3LCAgIDExLAotICAgIDI0LCAgMywgICA3LCAgIDExLCAgMjQsICAwLCAgIDAsICAgMCwgICAwLCAgIDMsICAgNywgICAxMSwgIDI0LCAgMywgICA3LAotICAgIDExLCAgMjQsICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDkyLCAgMCwgICAwLCAgIDAsICAgOTMsICA5NCwKLSAgICA5NSwgIDk2LCAgOTcsICA5OCwgIDk5LCAgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMywgICA3LCAgIDExLCAgMjQsCi0gICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsCi0gICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDQsCi0gICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsCi0gICAgMCwgICAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKLSAgICAxMzEsIDIsICAgNiwgICAxMCwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwKLSAgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMTQ4LAotICAgIDE0OSwgMTUwLCAxNTEsIDMsICAgNywgICAxMSwgIDI0LCAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAxNTIsIDE1MywgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsICAyNCwgIDMsICAgNywgICAxMSwKLSAgICAyNCwgIDE1NCwgMTU1LCAxNTYsIDE2NCwgMywgICA3LCAgIDExLCAgMjQsICAzLCAgIDcsICAgMTEsICAyNCwgIDMsICAgNywKLSAgICAxMSwgIDI0LCAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxNTcsIDE1OCwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLAotICAgIDE3MywgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsCi0gICAgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsCi0gICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDE5NywgMTk4LCA0LCAgIDgsICAgNCwgICA4LCAgIDQsCi0gICAgOCwgICA0LCAgIDgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMjE5LCAyMjAsIDMsICAgNywgICAxMSwgIDI0LAotICAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAyMjEsIDIyMiwgMjIzLCAyMjQsIDMsICAgNywgICAxMSwKLSAgICAyNCwgIDMsICAgNywgICAxMSwgIDI0LCAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgMjI1LCAyMjgsIDQsICAgOCwKLSAgICA0LCAgIDgsICAgNCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAyMjYsIDIyNywgMjI5LAotICAgIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsCi0gICAgNCwgICA4LCAgIDQsICAgOCwgICA0LCAgIDgsICAgNCwgICA4LCAgIDQsICAgOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwKLSAgICAyNTMsIDI1NCwgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMjU1LAotfTsKLQotLyogZW1pc3Npb24gdGFibGU6IGluZGV4ZWQgbGlrZSBuZXh0X3RibCwgdWx0aW1hdGVseSBnaXZlcyB0aGUgYnl0ZSB0byBiZQotICAgZW1pdHRlZCwgb3IgLTEgZm9yIG5vIGJ5dGUsIG9yIDI1NiBmb3IgZW5kIG9mIHN0cmVhbQotCi0gICBnZW5lcmF0ZWQgYnkgZ2VuX2hwYWNrX3RhYmxlcy5jICovCi1zdGF0aWMgY29uc3QgdWludDE2X3QgZW1pdF90YmxbMjU2XSA9IHsKLSAgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgMCwgICA4LCAgIDksICAgMTAsICAxMSwgIDEyLCAgMTMsCi0gICAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMCwgICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LAotICAgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwKLSAgICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICAwLCAgIDU1LCAgNTYsCi0gICAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDAsCi0gICAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LAotICAgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk4LCAgOTksICAxMDAsCi0gICAgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwKLSAgICAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAotICAgIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsCi0gICAgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksIDAsCi0gICAgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwKLSAgICAwLCAgIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LAotICAgIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsCi0gICAgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwKLSAgICAyMTksIDIyMCwgMjIxLCAwLCAgIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLAotICAgIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsCi0gICAgMjQ4LAotfTsKLQotLyogZ2VuZXJhdGVkIGJ5IGdlbl9ocGFja190YWJsZXMuYyAqLwotc3RhdGljIGNvbnN0IGludDE2X3QgZW1pdF9zdWJfdGJsWzI0OSAqIDE2XSA9IHsKLSAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCi0gICAgLTEsICA0OCwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDgsICA0OCwgIDQ4LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAotICAgIDQ5LCAgNDksICA0OCwgIDQ4LCAgNDgsICA0OCwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNTAsICA1MCwgIDUwLCAgNTAsICA5NywKLSAgICA5NywgIDk3LCAgOTcsICA0OCwgIDQ4LCAgNDksICA0OSwgIDUwLCAgNTAsICA5NywgIDk3LCAgOTksICA5OSwgIDEwMSwgMTAxLAotICAgIDEwNSwgMTA1LCAxMTEsIDExMSwgNDgsICA0OSwgIDUwLCAgOTcsICA5OSwgIDEwMSwgMTA1LCAxMTEsIDExNSwgMTE2LCAtMSwKLSAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgMzIsICAzMiwgIDMyLCAgMzIsICAzMiwgIDMyLCAgMzIsICAzMiwgIDM3LCAgMzcsCi0gICAgMzcsICAzNywgIDM3LCAgMzcsICAzNywgIDM3LCAgOTksICA5OSwgIDk5LCAgOTksICAxMDEsIDEwMSwgMTAxLCAxMDEsIDEwNSwKLSAgICAxMDUsIDEwNSwgMTA1LCAxMTEsIDExMSwgMTExLCAxMTEsIDExNSwgMTE1LCAxMTYsIDExNiwgMzIsICAzNywgIDQ1LCAgNDYsCi0gICAgNDcsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDYxLCAgNjEsICA2MSwgIDYxLCAgNjEsICA2MSwgIDYxLAotICAgIDYxLCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDY1LCAgNjUsICA2NSwgIDExNSwgMTE1LCAxMTUsIDExNSwgMTE2LCAxMTYsCi0gICAgMTE2LCAxMTYsIDMyLCAgMzIsICAzNywgIDM3LCAgNDUsICA0NSwgIDQ2LCAgNDYsICA2MSwgIDY1LCAgOTUsICA5OCwgIDEwMCwKLSAgICAxMDIsIDEwMywgMTA0LCAxMDgsIDEwOSwgMTEwLCAxMTIsIDExNCwgMTE3LCAtMSwgIC0xLCAgNTgsICA1OCwgIDU4LCAgNTgsCi0gICAgNTgsICA1OCwgIDU4LCAgNTgsICA2NiwgIDY2LCAgNjYsICA2NiwgIDY2LCAgNjYsICA2NiwgIDY2LCAgNDcsICA0NywgIDUxLAotICAgIDUxLCAgNTIsICA1MiwgIDUzLCAgNTMsICA1NCwgIDU0LCAgNTUsICA1NSwgIDU2LCAgNTYsICA1NywgIDU3LCAgNjEsICA2MSwKLSAgICA2NSwgIDY1LCAgOTUsICA5NSwgIDk4LCAgOTgsICAxMDAsIDEwMCwgMTAyLCAxMDIsIDEwMywgMTAzLCAxMDQsIDEwNCwgMTA4LAotICAgIDEwOCwgMTA5LCAxMDksIDExMCwgMTEwLCAxMTIsIDExMiwgMTE0LCAxMTQsIDExNywgMTE3LCA1OCwgIDY2LCAgNjcsICA2OCwKLSAgICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsCi0gICAgODQsICA4NSwgIDg2LCAgODcsICA4OSwgIDEwNiwgMTA3LCAxMTMsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAtMSwgIC0xLAotICAgIC0xLCAgLTEsICAzOCwgIDM4LCAgMzgsICAzOCwgIDM4LCAgMzgsICAzOCwgIDM4LCAgNDIsICA0MiwgIDQyLCAgNDIsICA0MiwKLSAgICA0MiwgIDQyLCAgNDIsICA0NCwgIDQ0LCAgNDQsICA0NCwgIDQ0LCAgNDQsICA0NCwgIDQ0LCAgNTksICA1OSwgIDU5LCAgNTksCi0gICAgNTksICA1OSwgIDU5LCAgNTksICA4OCwgIDg4LCAgODgsICA4OCwgIDg4LCAgODgsICA4OCwgIDg4LCAgOTAsICA5MCwgIDkwLAotICAgIDkwLCAgOTAsICA5MCwgIDkwLCAgOTAsICAzMywgIDMzLCAgMzQsICAzNCwgIDQwLCAgNDAsICA0MSwgIDQxLCAgNjMsICA2MywKLSAgICAzOSwgIDQzLCAgMTI0LCAtMSwgIC0xLCAgLTEsICAzNSwgIDM1LCAgMzUsICAzNSwgIDM1LCAgMzUsICAzNSwgIDM1LCAgNjIsCi0gICAgNjIsICA2MiwgIDYyLCAgNjIsICA2MiwgIDYyLCAgNjIsICAwLCAgIDAsICAgMCwgICAwLCAgIDM2LCAgMzYsICAzNiwgIDM2LAotICAgIDY0LCAgNjQsICA2NCwgIDY0LCAgOTEsICA5MSwgIDkxLCAgOTEsICA2OSwgIDY5LCAgNjksICA2OSwgIDY5LCAgNjksICA2OSwKLSAgICA2OSwgIDcwLCAgNzAsICA3MCwgIDcwLCAgNzAsICA3MCwgIDcwLCAgNzAsICA3MSwgIDcxLCAgNzEsICA3MSwgIDcxLCAgNzEsCi0gICAgNzEsICA3MSwgIDcyLCAgNzIsICA3MiwgIDcyLCAgNzIsICA3MiwgIDcyLCAgNzIsICA3MywgIDczLCAgNzMsICA3MywgIDczLAotICAgIDczLCAgNzMsICA3MywgIDc0LCAgNzQsICA3NCwgIDc0LCAgNzQsICA3NCwgIDc0LCAgNzQsICA3NSwgIDc1LCAgNzUsICA3NSwKLSAgICA3NSwgIDc1LCAgNzUsICA3NSwgIDc2LCAgNzYsICA3NiwgIDc2LCAgNzYsICA3NiwgIDc2LCAgNzYsICA3NywgIDc3LCAgNzcsCi0gICAgNzcsICA3NywgIDc3LCAgNzcsICA3NywgIDc4LCAgNzgsICA3OCwgIDc4LCAgNzgsICA3OCwgIDc4LCAgNzgsICA3OSwgIDc5LAotICAgIDc5LCAgNzksICA3OSwgIDc5LCAgNzksICA3OSwgIDgwLCAgODAsICA4MCwgIDgwLCAgODAsICA4MCwgIDgwLCAgODAsICA4MSwKLSAgICA4MSwgIDgxLCAgODEsICA4MSwgIDgxLCAgODEsICA4MSwgIDgyLCAgODIsICA4MiwgIDgyLCAgODIsICA4MiwgIDgyLCAgODIsCi0gICAgODMsICA4MywgIDgzLCAgODMsICA4MywgIDgzLCAgODMsICA4MywgIDg0LCAgODQsICA4NCwgIDg0LCAgODQsICA4NCwgIDg0LAotICAgIDg0LCAgODUsICA4NSwgIDg1LCAgODUsICA4NSwgIDg1LCAgODUsICA4NSwgIDg2LCAgODYsICA4NiwgIDg2LCAgODYsICA4NiwKLSAgICA4NiwgIDg2LCAgODcsICA4NywgIDg3LCAgODcsICA4NywgIDg3LCAgODcsICA4NywgIDg5LCAgODksICA4OSwgIDg5LCAgODksCi0gICAgODksICA4OSwgIDg5LCAgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNywgMTA3LCAxMDcsIDEwNywKLSAgICAxMDcsIDEwNywgMTA3LCAxMDcsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTgsIDExOCwgMTE4LAotICAgIDExOCwgMTE4LCAxMTgsIDExOCwgMTE4LCAxMTksIDExOSwgMTE5LCAxMTksIDExOSwgMTE5LCAxMTksIDExOSwgMTIwLCAxMjAsCi0gICAgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIxLCAxMjEsIDEyMSwgMTIxLCAxMjEsIDEyMSwgMTIxLCAxMjEsIDEyMiwKLSAgICAxMjIsIDEyMiwgMTIyLCAxMjIsIDEyMiwgMTIyLCAxMjIsIDM4LCAgMzgsICAzOCwgIDM4LCAgNDIsICA0MiwgIDQyLCAgNDIsCi0gICAgNDQsICA0NCwgIDQ0LCAgNDQsICA1OSwgIDU5LCAgNTksICA1OSwgIDg4LCAgODgsICA4OCwgIDg4LCAgOTAsICA5MCwgIDkwLAotICAgIDkwLCAgMzMsICAzNCwgIDQwLCAgNDEsICA2MywgIC0xLCAgLTEsICAtMSwgIDM5LCAgMzksICAzOSwgIDM5LCAgMzksICAzOSwKLSAgICAzOSwgIDM5LCAgNDMsICA0MywgIDQzLCAgNDMsICA0MywgIDQzLCAgNDMsICA0MywgIDEyNCwgMTI0LCAxMjQsIDEyNCwgMTI0LAotICAgIDEyNCwgMTI0LCAxMjQsIDM1LCAgMzUsICAzNSwgIDM1LCAgNjIsICA2MiwgIDYyLCAgNjIsICAwLCAgIDAsICAgMzYsICAzNiwKLSAgICA2NCwgIDY0LCAgOTEsICA5MSwgIDkzLCAgOTMsICAxMjYsIDEyNiwgOTQsICAxMjUsIC0xLCAgLTEsICA2MCwgIDYwLCAgNjAsCi0gICAgNjAsICA2MCwgIDYwLCAgNjAsICA2MCwgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYsICA5NiwgIDk2LCAgOTYsICAxMjMsIDEyMywKLSAgICAxMjMsIDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgOTIsCi0gICAgOTIsICA5MiwgIDkyLCAgOTIsICA5MiwgIDkyLCAgOTIsICAxOTUsIDE5NSwgMTk1LCAxOTUsIDE5NSwgMTk1LCAxOTUsIDE5NSwKLSAgICAyMDgsIDIwOCwgMjA4LCAyMDgsIDIwOCwgMjA4LCAyMDgsIDIwOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMzAsIDEzMCwgMTMwLAotICAgIDEzMCwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxNjIsIDE2MiwgMTYyLCAxNjIsIDE4NCwgMTg0LCAxODQsIDE4NCwgMTk0LCAxOTQsCi0gICAgMTk0LCAxOTQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI2LCAyMjYsIDIyNiwgMjI2LCAxNTMsIDE1MywgMTYxLCAxNjEsIDE2NywKLSAgICAxNjcsIDE3MiwgMTcyLCAxNzYsIDE3NiwgMTc3LCAxNzcsIDE3OSwgMTc5LCAyMDksIDIwOSwgMjE2LCAyMTYsIDIxNywgMjE3LAotICAgIDIyNywgMjI3LCAyMjksIDIyOSwgMjMwLCAyMzAsIDEyOSwgMTMyLCAxMzMsIDEzNCwgMTM2LCAxNDYsIDE1NCwgMTU2LCAxNjAsCi0gICAgMTYzLCAxNjQsIDE2OSwgMTcwLCAxNzMsIDE3OCwgMTgxLCAxODUsIDE4NiwgMTg3LCAxODksIDE5MCwgMTk2LCAxOTgsIDIyOCwKLSAgICAyMzIsIDIzMywgLTEsICAtMSwgIC0xLCAgLTEsICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMTM1LAotICAgIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzcsCi0gICAgMTM4LCAxMzgsIDEzOCwgMTM4LCAxMzgsIDEzOCwgMTM4LCAxMzgsIDEzOSwgMTM5LCAxMzksIDEzOSwgMTM5LCAxMzksIDEzOSwKLSAgICAxMzksIDE0MCwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxNDEsIDE0MSwgMTQxLCAxNDEsIDE0MSwgMTQxLAotICAgIDE0MSwgMTQxLCAxNDMsIDE0MywgMTQzLCAxNDMsIDE0MywgMTQzLCAxNDMsIDE0MywgMTQ3LCAxNDcsIDE0NywgMTQ3LCAxNDcsCi0gICAgMTQ3LCAxNDcsIDE0NywgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTQ5LCAxNDksIDE1MCwgMTUwLCAxNTAsIDE1MCwKLSAgICAxNTAsIDE1MCwgMTUwLCAxNTAsIDE1MSwgMTUxLCAxNTEsIDE1MSwgMTUxLCAxNTEsIDE1MSwgMTUxLCAxNTIsIDE1MiwgMTUyLAotICAgIDE1MiwgMTUyLCAxNTIsIDE1MiwgMTUyLCAxNTUsIDE1NSwgMTU1LCAxNTUsIDE1NSwgMTU1LCAxNTUsIDE1NSwgMTU3LCAxNTcsCi0gICAgMTU3LCAxNTcsIDE1NywgMTU3LCAxNTcsIDE1NywgMTU4LCAxNTgsIDE1OCwgMTU4LCAxNTgsIDE1OCwgMTU4LCAxNTgsIDE2NSwKLSAgICAxNjUsIDE2NSwgMTY1LCAxNjUsIDE2NSwgMTY1LCAxNjUsIDE2NiwgMTY2LCAxNjYsIDE2NiwgMTY2LCAxNjYsIDE2NiwgMTY2LAotICAgIDE2OCwgMTY4LCAxNjgsIDE2OCwgMTY4LCAxNjgsIDE2OCwgMTY4LCAxNzQsIDE3NCwgMTc0LCAxNzQsIDE3NCwgMTc0LCAxNzQsCi0gICAgMTc0LCAxNzUsIDE3NSwgMTc1LCAxNzUsIDE3NSwgMTc1LCAxNzUsIDE3NSwgMTgwLCAxODAsIDE4MCwgMTgwLCAxODAsIDE4MCwKLSAgICAxODAsIDE4MCwgMTgyLCAxODIsIDE4MiwgMTgyLCAxODIsIDE4MiwgMTgyLCAxODIsIDE4MywgMTgzLCAxODMsIDE4MywgMTgzLAotICAgIDE4MywgMTgzLCAxODMsIDE4OCwgMTg4LCAxODgsIDE4OCwgMTg4LCAxODgsIDE4OCwgMTg4LCAxOTEsIDE5MSwgMTkxLCAxOTEsCi0gICAgMTkxLCAxOTEsIDE5MSwgMTkxLCAxOTcsIDE5NywgMTk3LCAxOTcsIDE5NywgMTk3LCAxOTcsIDE5NywgMjMxLCAyMzEsIDIzMSwKLSAgICAyMzEsIDIzMSwgMjMxLCAyMzEsIDIzMSwgMjM5LCAyMzksIDIzOSwgMjM5LCAyMzksIDIzOSwgMjM5LCAyMzksIDksICAgOSwKLSAgICA5LCAgIDksICAgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDQsIDE0NCwgMTQ0LCAxNDQsIDE0NSwgMTQ1LCAxNDUsIDE0NSwgMTQ4LAotICAgIDE0OCwgMTQ4LCAxNDgsIDE1OSwgMTU5LCAxNTksIDE1OSwgMTcxLCAxNzEsIDE3MSwgMTcxLCAyMDYsIDIwNiwgMjA2LCAyMDYsCi0gICAgMjE1LCAyMTUsIDIxNSwgMjE1LCAyMjUsIDIyNSwgMjI1LCAyMjUsIDIzNiwgMjM2LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzNywKLSAgICAyMzcsIDE5OSwgMTk5LCAyMDcsIDIwNywgMjM0LCAyMzQsIDIzNSwgMjM1LCAxOTIsIDE5MywgMjAwLCAyMDEsIDIwMiwgMjA1LAotICAgIDIxMCwgMjEzLCAyMTgsIDIxOSwgMjM4LCAyNDAsIDI0MiwgMjQzLCAyNTUsIC0xLCAgMjAzLCAyMDMsIDIwMywgMjAzLCAyMDMsCi0gICAgMjAzLCAyMDMsIDIwMywgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIxMSwgMjExLCAyMTEsIDIxMSwKLSAgICAyMTEsIDIxMSwgMjExLCAyMTEsIDIxMiwgMjEyLCAyMTIsIDIxMiwgMjEyLCAyMTIsIDIxMiwgMjEyLCAyMTQsIDIxNCwgMjE0LAotICAgIDIxNCwgMjE0LCAyMTQsIDIxNCwgMjE0LCAyMjEsIDIyMSwgMjIxLCAyMjEsIDIyMSwgMjIxLCAyMjEsIDIyMSwgMjIyLCAyMjIsCi0gICAgMjIyLCAyMjIsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMjIzLCAyMjMsIDIyMywgMjIzLCAyMjMsIDIyMywgMjIzLCAyMjMsIDI0MSwKLSAgICAyNDEsIDI0MSwgMjQxLCAyNDEsIDI0MSwgMjQxLCAyNDEsIDI0NCwgMjQ0LCAyNDQsIDI0NCwgMjQ0LCAyNDQsIDI0NCwgMjQ0LAotICAgIDI0NSwgMjQ1LCAyNDUsIDI0NSwgMjQ1LCAyNDUsIDI0NSwgMjQ1LCAyNDYsIDI0NiwgMjQ2LCAyNDYsIDI0NiwgMjQ2LCAyNDYsCi0gICAgMjQ2LCAyNDcsIDI0NywgMjQ3LCAyNDcsIDI0NywgMjQ3LCAyNDcsIDI0NywgMjQ4LCAyNDgsIDI0OCwgMjQ4LCAyNDgsIDI0OCwKLSAgICAyNDgsIDI0OCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDI1MSwgMjUxLCAyNTEsIDI1MSwgMjUxLAotICAgIDI1MSwgMjUxLCAyNTEsIDI1MiwgMjUyLCAyNTIsIDI1MiwgMjUyLCAyNTIsIDI1MiwgMjUyLCAyNTMsIDI1MywgMjUzLCAyNTMsCi0gICAgMjUzLCAyNTMsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMiwgICAyLCAgIDIsCi0gICAgMiwgICAzLCAgIDMsICAgMywgICAzLCAgIDQsICAgNCwgICA0LCAgIDQsICAgNSwgICA1LCAgIDUsICAgNSwgICA2LCAgIDYsCi0gICAgNiwgICA2LCAgIDcsICAgNywgICA3LCAgIDcsICAgOCwgICA4LCAgIDgsICAgOCwgICAxMSwgIDExLCAgMTEsICAxMSwgIDEyLAotICAgIDEyLCAgMTIsICAxMiwgIDE0LCAgMTQsICAxNCwgIDE0LCAgMTUsICAxNSwgIDE1LCAgMTUsICAxNiwgIDE2LCAgMTYsICAxNiwKLSAgICAxNywgIDE3LCAgMTcsICAxNywgIDE4LCAgMTgsICAxOCwgIDE4LCAgMTksICAxOSwgIDE5LCAgMTksICAyMCwgIDIwLCAgMjAsCi0gICAgMjAsICAyMSwgIDIxLCAgMjEsICAyMSwgIDIzLCAgMjMsICAyMywgIDIzLCAgMjQsICAyNCwgIDI0LCAgMjQsICAyNSwgIDI1LAotICAgIDI1LCAgMjUsICAyNiwgIDI2LCAgMjYsICAyNiwgIDI3LCAgMjcsICAyNywgIDI3LCAgMjgsICAyOCwgIDI4LCAgMjgsICAyOSwKLSAgICAyOSwgIDI5LCAgMjksICAzMCwgIDMwLCAgMzAsICAzMCwgIDMxLCAgMzEsICAzMSwgIDMxLCAgMTI3LCAxMjcsIDEyNywgMTI3LAotICAgIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjQ5LCAyNDksIDI0OSwgMjQ5LCAxMCwgIDEzLCAgMjIsICAyNTYsIDkzLCAgOTMsICA5MywKLSAgICA5MywgIDEyNiwgMTI2LCAxMjYsIDEyNiwgOTQsICA5NCwgIDEyNSwgMTI1LCA2MCwgIDk2LCAgMTIzLCAtMSwgIDkyLCAgMTk1LAotICAgIDIwOCwgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAxMjgsCi0gICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMCwKLSAgICAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTYyLCAxNjIsIDE2MiwgMTYyLCAxNjIsIDE2MiwgMTYyLAotICAgIDE2MiwgMTg0LCAxODQsIDE4NCwgMTg0LCAxODQsIDE4NCwgMTg0LCAxODQsIDE5NCwgMTk0LCAxOTQsIDE5NCwgMTk0LCAxOTQsCi0gICAgMTk0LCAxOTQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjYsIDIyNiwgMjI2LCAyMjYsIDIyNiwKLSAgICAyMjYsIDIyNiwgMjI2LCAxNTMsIDE1MywgMTUzLCAxNTMsIDE2MSwgMTYxLCAxNjEsIDE2MSwgMTY3LCAxNjcsIDE2NywgMTY3LAotICAgIDE3MiwgMTcyLCAxNzIsIDE3MiwgMTc2LCAxNzYsIDE3NiwgMTc2LCAxNzcsIDE3NywgMTc3LCAxNzcsIDE3OSwgMTc5LCAxNzksCi0gICAgMTc5LCAyMDksIDIwOSwgMjA5LCAyMDksIDIxNiwgMjE2LCAyMTYsIDIxNiwgMjE3LCAyMTcsIDIxNywgMjE3LCAyMjcsIDIyNywKLSAgICAyMjcsIDIyNywgMjI5LCAyMjksIDIyOSwgMjI5LCAyMzAsIDIzMCwgMjMwLCAyMzAsIDEyOSwgMTI5LCAxMzIsIDEzMiwgMTMzLAotICAgIDEzMywgMTM0LCAxMzQsIDEzNiwgMTM2LCAxNDYsIDE0NiwgMTU0LCAxNTQsIDE1NiwgMTU2LCAxNjAsIDE2MCwgMTYzLCAxNjMsCi0gICAgMTY0LCAxNjQsIDE2OSwgMTY5LCAxNzAsIDE3MCwgMTczLCAxNzMsIDE3OCwgMTc4LCAxODEsIDE4MSwgMTg1LCAxODUsIDE4NiwKLSAgICAxODYsIDE4NywgMTg3LCAxODksIDE4OSwgMTkwLCAxOTAsIDE5NiwgMTk2LCAxOTgsIDE5OCwgMjI4LCAyMjgsIDIzMiwgMjMyLAotICAgIDIzMywgMjMzLCAxLCAgIDEzNSwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MywgMTQ3LCAxNDksIDE1MCwgMTUxLCAxNTIsCi0gICAgMTU1LCAxNTcsIDE1OCwgMTY1LCAxNjYsIDE2OCwgMTc0LCAxNzUsIDE4MCwgMTgyLCAxODMsIDE4OCwgMTkxLCAxOTcsIDIzMSwKLSAgICAyMzksIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICA5LCAgIDksICAgOSwKLSAgICA5LCAgIDksICAgOSwgICA5LCAgIDksICAgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0NCwgMTQ0LAotICAgIDE0NCwgMTQ0LCAxNDQsIDE0NCwgMTQ0LCAxNDQsIDE0NSwgMTQ1LCAxNDUsIDE0NSwgMTQ1LCAxNDUsIDE0NSwgMTQ1LCAxNDgsCi0gICAgMTQ4LCAxNDgsIDE0OCwgMTQ4LCAxNDgsIDE0OCwgMTQ4LCAxNTksIDE1OSwgMTU5LCAxNTksIDE1OSwgMTU5LCAxNTksIDE1OSwKLSAgICAxNzEsIDE3MSwgMTcxLCAxNzEsIDE3MSwgMTcxLCAxNzEsIDE3MSwgMjA2LCAyMDYsIDIwNiwgMjA2LCAyMDYsIDIwNiwgMjA2LAotICAgIDIwNiwgMjE1LCAyMTUsIDIxNSwgMjE1LCAyMTUsIDIxNSwgMjE1LCAyMTUsIDIyNSwgMjI1LCAyMjUsIDIyNSwgMjI1LCAyMjUsCi0gICAgMjI1LCAyMjUsIDIzNiwgMjM2LCAyMzYsIDIzNiwgMjM2LCAyMzYsIDIzNiwgMjM2LCAyMzcsIDIzNywgMjM3LCAyMzcsIDIzNywKLSAgICAyMzcsIDIzNywgMjM3LCAxOTksIDE5OSwgMTk5LCAxOTksIDIwNywgMjA3LCAyMDcsIDIwNywgMjM0LCAyMzQsIDIzNCwgMjM0LAotICAgIDIzNSwgMjM1LCAyMzUsIDIzNSwgMTkyLCAxOTIsIDE5MywgMTkzLCAyMDAsIDIwMCwgMjAxLCAyMDEsIDIwMiwgMjAyLCAyMDUsCi0gICAgMjA1LCAyMTAsIDIxMCwgMjEzLCAyMTMsIDIxOCwgMjE4LCAyMTksIDIxOSwgMjM4LCAyMzgsIDI0MCwgMjQwLCAyNDIsIDI0MiwKLSAgICAyNDMsIDI0MywgMjU1LCAyNTUsIDIwMywgMjA0LCAyMTEsIDIxMiwgMjE0LCAyMjEsIDIyMiwgMjIzLCAyNDEsIDI0NCwgMjQ1LAotICAgIDI0NiwgMjQ3LCAyNDgsIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKLSAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwKLSAgICAyLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICA0LCAgIDQsICAgNCwgICA0LCAgIDQsICAgNCwKLSAgICA0LCAgIDQsICAgNSwgICA1LCAgIDUsICAgNSwgICA1LCAgIDUsICAgNSwgICA1LCAgIDYsICAgNiwgICA2LCAgIDYsICAgNiwKLSAgICA2LCAgIDYsICAgNiwgICA3LCAgIDcsICAgNywgICA3LCAgIDcsICAgNywgICA3LCAgIDcsICAgOCwgICA4LCAgIDgsICAgOCwKLSAgICA4LCAgIDgsICAgOCwgICA4LCAgIDExLCAgMTEsICAxMSwgIDExLCAgMTEsICAxMSwgIDExLCAgMTEsICAxMiwgIDEyLCAgMTIsCi0gICAgMTIsICAxMiwgIDEyLCAgMTIsICAxMiwgIDE0LCAgMTQsICAxNCwgIDE0LCAgMTQsICAxNCwgIDE0LCAgMTQsICAxNSwgIDE1LAotICAgIDE1LCAgMTUsICAxNSwgIDE1LCAgMTUsICAxNSwgIDE2LCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNiwgIDE2LCAgMTYsICAxNywKLSAgICAxNywgIDE3LCAgMTcsICAxNywgIDE3LCAgMTcsICAxNywgIDE4LCAgMTgsICAxOCwgIDE4LCAgMTgsICAxOCwgIDE4LCAgMTgsCi0gICAgMTksICAxOSwgIDE5LCAgMTksICAxOSwgIDE5LCAgMTksICAxOSwgIDIwLCAgMjAsICAyMCwgIDIwLCAgMjAsICAyMCwgIDIwLAotICAgIDIwLCAgMjEsICAyMSwgIDIxLCAgMjEsICAyMSwgIDIxLCAgMjEsICAyMSwgIDIzLCAgMjMsICAyMywgIDIzLCAgMjMsICAyMywKLSAgICAyMywgIDIzLCAgMjQsICAyNCwgIDI0LCAgMjQsICAyNCwgIDI0LCAgMjQsICAyNCwgIDI1LCAgMjUsICAyNSwgIDI1LCAgMjUsCi0gICAgMjUsICAyNSwgIDI1LCAgMjYsICAyNiwgIDI2LCAgMjYsICAyNiwgIDI2LCAgMjYsICAyNiwgIDI3LCAgMjcsICAyNywgIDI3LAotICAgIDI3LCAgMjcsICAyNywgIDI3LCAgMjgsICAyOCwgIDI4LCAgMjgsICAyOCwgIDI4LCAgMjgsICAyOCwgIDI5LCAgMjksICAyOSwKLSAgICAyOSwgIDI5LCAgMjksICAyOSwgIDI5LCAgMzAsICAzMCwgIDMwLCAgMzAsICAzMCwgIDMwLCAgMzAsICAzMCwgIDMxLCAgMzEsCi0gICAgMzEsICAzMSwgIDMxLCAgMzEsICAzMSwgIDMxLCAgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEyNywgMTI3LCAxMjcsIDIyMCwKLSAgICAyMjAsIDIyMCwgMjIwLCAyMjAsIDIyMCwgMjIwLCAyMjAsIDI0OSwgMjQ5LCAyNDksIDI0OSwgMjQ5LCAyNDksIDI0OSwgMjQ5LAotICAgIDEwLCAgMTAsICAxMywgIDEzLCAgMjIsICAyMiwgIDI1NiwgMjU2LCA2NywgIDY3LCAgNjcsICA2NywgIDY3LCAgNjcsICA2NywKLSAgICA2NywgIDY4LCAgNjgsICA2OCwgIDY4LCAgNjgsICA2OCwgIDY4LCAgNjgsICA5NSwgIDk1LCAgOTUsICA5NSwgIDk1LCAgOTUsCi0gICAgOTUsICA5NSwgIDk4LCAgOTgsICA5OCwgIDk4LCAgOTgsICA5OCwgIDk4LCAgOTgsICAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwKLSAgICAxMDAsIDEwMCwgMTAwLCAxMDIsIDEwMiwgMTAyLCAxMDIsIDEwMiwgMTAyLCAxMDIsIDEwMiwgMTAzLCAxMDMsIDEwMywgMTAzLAotICAgIDEwMywgMTAzLCAxMDMsIDEwMywgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDQsIDEwOCwgMTA4LCAxMDgsCi0gICAgMTA4LCAxMDgsIDEwOCwgMTA4LCAxMDgsIDEwOSwgMTA5LCAxMDksIDEwOSwgMTA5LCAxMDksIDEwOSwgMTA5LCAxMTAsIDExMCwKLSAgICAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExMiwgMTE0LAotICAgIDExNCwgMTE0LCAxMTQsIDExNCwgMTE0LCAxMTQsIDExNCwgMTE3LCAxMTcsIDExNywgMTE3LCAxMTcsIDExNywgMTE3LCAxMTcsCi0gICAgNTgsICA1OCwgIDU4LCAgNTgsICA2NiwgIDY2LCAgNjYsICA2NiwgIDY3LCAgNjcsICA2NywgIDY3LCAgNjgsICA2OCwgIDY4LAotICAgIDY4LCAgNjksICA2OSwgIDY5LCAgNjksICA3MCwgIDcwLCAgNzAsICA3MCwgIDcxLCAgNzEsICA3MSwgIDcxLCAgNzIsICA3MiwKLSAgICA3MiwgIDcyLCAgNzMsICA3MywgIDczLCAgNzMsICA3NCwgIDc0LCAgNzQsICA3NCwgIDc1LCAgNzUsICA3NSwgIDc1LCAgNzYsCi0gICAgNzYsICA3NiwgIDc2LCAgNzcsICA3NywgIDc3LCAgNzcsICA3OCwgIDc4LCAgNzgsICA3OCwgIDc5LCAgNzksICA3OSwgIDc5LAotICAgIDgwLCAgODAsICA4MCwgIDgwLCAgODEsICA4MSwgIDgxLCAgODEsICA4MiwgIDgyLCAgODIsICA4MiwgIDgzLCAgODMsICA4MywKLSAgICA4MywgIDg0LCAgODQsICA4NCwgIDg0LCAgODUsICA4NSwgIDg1LCAgODUsICA4NiwgIDg2LCAgODYsICA4NiwgIDg3LCAgODcsCi0gICAgODcsICA4NywgIDg5LCAgODksICA4OSwgIDg5LCAgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDcsIDEwNywgMTA3LCAxMDcsIDExMywKLSAgICAxMTMsIDExMywgMTEzLCAxMTgsIDExOCwgMTE4LCAxMTgsIDExOSwgMTE5LCAxMTksIDExOSwgMTIwLCAxMjAsIDEyMCwgMTIwLAotICAgIDEyMSwgMTIxLCAxMjEsIDEyMSwgMTIyLCAxMjIsIDEyMiwgMTIyLCAzOCwgIDM4LCAgNDIsICA0MiwgIDQ0LCAgNDQsICA1OSwKLSAgICA1OSwgIDg4LCAgODgsICA5MCwgIDkwLCAgLTEsICAtMSwgIC0xLCAgLTEsICAzMywgIDMzLCAgMzMsICAzMywgIDMzLCAgMzMsCi0gICAgMzMsICAzMywgIDM0LCAgMzQsICAzNCwgIDM0LCAgMzQsICAzNCwgIDM0LCAgMzQsICA0MCwgIDQwLCAgNDAsICA0MCwgIDQwLAotICAgIDQwLCAgNDAsICA0MCwgIDQxLCAgNDEsICA0MSwgIDQxLCAgNDEsICA0MSwgIDQxLCAgNDEsICA2MywgIDYzLCAgNjMsICA2MywKLSAgICA2MywgIDYzLCAgNjMsICA2MywgIDM5LCAgMzksICAzOSwgIDM5LCAgNDMsICA0MywgIDQzLCAgNDMsICAxMjQsIDEyNCwgMTI0LAotICAgIDEyNCwgMzUsICAzNSwgIDYyLCAgNjIsICAwLCAgIDM2LCAgNjQsICA5MSwgIDkzLCAgMTI2LCAtMSwgIC0xLCAgOTQsICA5NCwKLSAgICA5NCwgIDk0LCAgOTQsICA5NCwgIDk0LCAgOTQsICAxMjUsIDEyNSwgMTI1LCAxMjUsIDEyNSwgMTI1LCAxMjUsIDEyNSwgNjAsCi0gICAgNjAsICA2MCwgIDYwLCAgOTYsICA5NiwgIDk2LCAgOTYsICAxMjMsIDEyMywgMTIzLCAxMjMsIC0xLCAgLTEsICAtMSwgIC0xLAotICAgIDkyLCAgOTIsICA5MiwgIDkyLCAgMTk1LCAxOTUsIDE5NSwgMTk1LCAyMDgsIDIwOCwgMjA4LCAyMDgsIDEyOCwgMTI4LCAxMzAsCi0gICAgMTMwLCAxMzEsIDEzMSwgMTYyLCAxNjIsIDE4NCwgMTg0LCAxOTQsIDE5NCwgMjI0LCAyMjQsIDIyNiwgMjI2LCAxNTMsIDE2MSwKLSAgICAxNjcsIDE3MiwgMTc2LCAxNzcsIDE3OSwgMjA5LCAyMTYsIDIxNywgMjI3LCAyMjksIDIzMCwgLTEsICAtMSwgIC0xLCAgLTEsCi0gICAgLTEsICAtMSwgIC0xLCAgMTI5LCAxMjksIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI5LCAxMjksIDEzMiwgMTMyLCAxMzIsIDEzMiwKLSAgICAxMzIsIDEzMiwgMTMyLCAxMzIsIDEzMywgMTMzLCAxMzMsIDEzMywgMTMzLCAxMzMsIDEzMywgMTMzLCAxMzQsIDEzNCwgMTM0LAotICAgIDEzNCwgMTM0LCAxMzQsIDEzNCwgMTM0LCAxMzYsIDEzNiwgMTM2LCAxMzYsIDEzNiwgMTM2LCAxMzYsIDEzNiwgMTQ2LCAxNDYsCi0gICAgMTQ2LCAxNDYsIDE0NiwgMTQ2LCAxNDYsIDE0NiwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU0LCAxNTQsIDE1NiwKLSAgICAxNTYsIDE1NiwgMTU2LCAxNTYsIDE1NiwgMTU2LCAxNTYsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLAotICAgIDE2MywgMTYzLCAxNjMsIDE2MywgMTYzLCAxNjMsIDE2MywgMTYzLCAxNjQsIDE2NCwgMTY0LCAxNjQsIDE2NCwgMTY0LCAxNjQsCi0gICAgMTY0LCAxNjksIDE2OSwgMTY5LCAxNjksIDE2OSwgMTY5LCAxNjksIDE2OSwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwKLSAgICAxNzAsIDE3MCwgMTczLCAxNzMsIDE3MywgMTczLCAxNzMsIDE3MywgMTczLCAxNzMsIDE3OCwgMTc4LCAxNzgsIDE3OCwgMTc4LAotICAgIDE3OCwgMTc4LCAxNzgsIDE4MSwgMTgxLCAxODEsIDE4MSwgMTgxLCAxODEsIDE4MSwgMTgxLCAxODUsIDE4NSwgMTg1LCAxODUsCi0gICAgMTg1LCAxODUsIDE4NSwgMTg1LCAxODYsIDE4NiwgMTg2LCAxODYsIDE4NiwgMTg2LCAxODYsIDE4NiwgMTg3LCAxODcsIDE4NywKLSAgICAxODcsIDE4NywgMTg3LCAxODcsIDE4NywgMTg5LCAxODksIDE4OSwgMTg5LCAxODksIDE4OSwgMTg5LCAxODksIDE5MCwgMTkwLAotICAgIDE5MCwgMTkwLCAxOTAsIDE5MCwgMTkwLCAxOTAsIDE5NiwgMTk2LCAxOTYsIDE5NiwgMTk2LCAxOTYsIDE5NiwgMTk2LCAxOTgsCi0gICAgMTk4LCAxOTgsIDE5OCwgMTk4LCAxOTgsIDE5OCwgMTk4LCAyMjgsIDIyOCwgMjI4LCAyMjgsIDIyOCwgMjI4LCAyMjgsIDIyOCwKLSAgICAyMzIsIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMyLCAyMzIsIDIzMiwgMjMzLCAyMzMsIDIzMywgMjMzLCAyMzMsIDIzMywgMjMzLAotICAgIDIzMywgMSwgICAxLCAgIDEsICAgMSwgICAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNywgMTM3LCAxMzcsIDEzNywgMTM4LCAxMzgsCi0gICAgMTM4LCAxMzgsIDEzOSwgMTM5LCAxMzksIDEzOSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxNDEsIDE0MSwgMTQxLCAxNDEsIDE0MywKLSAgICAxNDMsIDE0MywgMTQzLCAxNDcsIDE0NywgMTQ3LCAxNDcsIDE0OSwgMTQ5LCAxNDksIDE0OSwgMTUwLCAxNTAsIDE1MCwgMTUwLAotICAgIDE1MSwgMTUxLCAxNTEsIDE1MSwgMTUyLCAxNTIsIDE1MiwgMTUyLCAxNTUsIDE1NSwgMTU1LCAxNTUsIDE1NywgMTU3LCAxNTcsCi0gICAgMTU3LCAxNTgsIDE1OCwgMTU4LCAxNTgsIDE2NSwgMTY1LCAxNjUsIDE2NSwgMTY2LCAxNjYsIDE2NiwgMTY2LCAxNjgsIDE2OCwKLSAgICAxNjgsIDE2OCwgMTc0LCAxNzQsIDE3NCwgMTc0LCAxNzUsIDE3NSwgMTc1LCAxNzUsIDE4MCwgMTgwLCAxODAsIDE4MCwgMTgyLAotICAgIDE4MiwgMTgyLCAxODIsIDE4MywgMTgzLCAxODMsIDE4MywgMTg4LCAxODgsIDE4OCwgMTg4LCAxOTEsIDE5MSwgMTkxLCAxOTEsCi0gICAgMTk3LCAxOTcsIDE5NywgMTk3LCAyMzEsIDIzMSwgMjMxLCAyMzEsIDIzOSwgMjM5LCAyMzksIDIzOSwgOSwgICA5LCAgIDE0MiwKLSAgICAxNDIsIDE0NCwgMTQ0LCAxNDUsIDE0NSwgMTQ4LCAxNDgsIDE1OSwgMTU5LCAxNzEsIDE3MSwgMjA2LCAyMDYsIDIxNSwgMjE1LAotICAgIDIyNSwgMjI1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDE5OSwgMjA3LCAyMzQsIDIzNSwgMTkyLCAxOTIsIDE5MiwgMTkyLCAxOTIsCi0gICAgMTkyLCAxOTIsIDE5MiwgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDIwMCwgMjAwLCAyMDAsIDIwMCwKLSAgICAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMSwgMjAxLCAyMDEsIDIwMSwgMjAxLCAyMDEsIDIwMSwgMjAxLCAyMDIsIDIwMiwgMjAyLAotICAgIDIwMiwgMjAyLCAyMDIsIDIwMiwgMjAyLCAyMDUsIDIwNSwgMjA1LCAyMDUsIDIwNSwgMjA1LCAyMDUsIDIwNSwgMjEwLCAyMTAsCi0gICAgMjEwLCAyMTAsIDIxMCwgMjEwLCAyMTAsIDIxMCwgMjEzLCAyMTMsIDIxMywgMjEzLCAyMTMsIDIxMywgMjEzLCAyMTMsIDIxOCwKLSAgICAyMTgsIDIxOCwgMjE4LCAyMTgsIDIxOCwgMjE4LCAyMTgsIDIxOSwgMjE5LCAyMTksIDIxOSwgMjE5LCAyMTksIDIxOSwgMjE5LAotICAgIDIzOCwgMjM4LCAyMzgsIDIzOCwgMjM4LCAyMzgsIDIzOCwgMjM4LCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsCi0gICAgMjQwLCAyNDIsIDI0MiwgMjQyLCAyNDIsIDI0MiwgMjQyLCAyNDIsIDI0MiwgMjQzLCAyNDMsIDI0MywgMjQzLCAyNDMsIDI0MywKLSAgICAyNDMsIDI0MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDIwMywgMjAzLCAyMDMsIDIwMywgMjA0LAotICAgIDIwNCwgMjA0LCAyMDQsIDIxMSwgMjExLCAyMTEsIDIxMSwgMjEyLCAyMTIsIDIxMiwgMjEyLCAyMTQsIDIxNCwgMjE0LCAyMTQsCi0gICAgMjIxLCAyMjEsIDIyMSwgMjIxLCAyMjIsIDIyMiwgMjIyLCAyMjIsIDIyMywgMjIzLCAyMjMsIDIyMywgMjQxLCAyNDEsIDI0MSwKLSAgICAyNDEsIDI0NCwgMjQ0LCAyNDQsIDI0NCwgMjQ1LCAyNDUsIDI0NSwgMjQ1LCAyNDYsIDI0NiwgMjQ2LCAyNDYsIDI0NywgMjQ3LAotICAgIDI0NywgMjQ3LCAyNDgsIDI0OCwgMjQ4LCAyNDgsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUxLCAyNTEsIDI1MSwgMjUxLCAyNTIsCi0gICAgMjUyLCAyNTIsIDI1MiwgMjUzLCAyNTMsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU0LCAyNTQsIDIsICAgMiwgICAzLCAgIDMsCi0gICAgNCwgICA0LCAgIDUsICAgNSwgICA2LCAgIDYsICAgNywgICA3LCAgIDgsICAgOCwgICAxMSwgIDExLCAgMTIsICAxMiwgIDE0LAotICAgIDE0LCAgMTUsICAxNSwgIDE2LCAgMTYsICAxNywgIDE3LCAgMTgsICAxOCwgIDE5LCAgMTksICAyMCwgIDIwLCAgMjEsICAyMSwKLSAgICAyMywgIDIzLCAgMjQsICAyNCwgIDI1LCAgMjUsICAyNiwgIDI2LCAgMjcsICAyNywgIDI4LCAgMjgsICAyOSwgIDI5LCAgMzAsCi0gICAgMzAsICAzMSwgIDMxLCAgMTI3LCAxMjcsIDIyMCwgMjIwLCAyNDksIDI0OSwgLTEsICAtMSwgIDEwLCAgMTAsICAxMCwgIDEwLAotICAgIDEwLCAgMTAsICAxMCwgIDEwLCAgMTMsICAxMywgIDEzLCAgMTMsICAxMywgIDEzLCAgMTMsICAxMywgIDIyLCAgMjIsICAyMiwKLSAgICAyMiwgIDIyLCAgMjIsICAyMiwgIDIyLCAgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDQ1LCAgNDUsCi0gICAgNDUsICA0NSwgIDQ1LCAgNDUsICA0NSwgIDQ1LCAgNDYsICA0NiwgIDQ2LCAgNDYsICA0NiwgIDQ2LCAgNDYsICA0NiwgIDQ3LAotICAgIDQ3LCAgNDcsICA0NywgIDQ3LCAgNDcsICA0NywgIDQ3LCAgNTEsICA1MSwgIDUxLCAgNTEsICA1MSwgIDUxLCAgNTEsICA1MSwKLSAgICA1MiwgIDUyLCAgNTIsICA1MiwgIDUyLCAgNTIsICA1MiwgIDUyLCAgNTMsICA1MywgIDUzLCAgNTMsICA1MywgIDUzLCAgNTMsCi0gICAgNTMsICA1NCwgIDU0LCAgNTQsICA1NCwgIDU0LCAgNTQsICA1NCwgIDU0LCAgNTUsICA1NSwgIDU1LCAgNTUsICA1NSwgIDU1LAotICAgIDU1LCAgNTUsICA1NiwgIDU2LCAgNTYsICA1NiwgIDU2LCAgNTYsICA1NiwgIDU2LCAgNTcsICA1NywgIDU3LCAgNTcsICA1NywKLSAgICA1NywgIDU3LCAgNTcsICA1MCwgIDUwLCAgNTAsICA1MCwgIDUwLCAgNTAsICA1MCwgIDUwLCAgOTcsICA5NywgIDk3LCAgOTcsCi0gICAgOTcsICA5NywgIDk3LCAgOTcsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgMTAxLCAxMDEsIDEwMSwKLSAgICAxMDEsIDEwMSwgMTAxLCAxMDEsIDEwMSwgMTA1LCAxMDUsIDEwNSwgMTA1LCAxMDUsIDEwNSwgMTA1LCAxMDUsIDExMSwgMTExLAotICAgIDExMSwgMTExLCAxMTEsIDExMSwgMTExLCAxMTEsIDExNSwgMTE1LCAxMTUsIDExNSwgMTE1LCAxMTUsIDExNSwgMTE1LCAxMTYsCi0gICAgMTE2LCAxMTYsIDExNiwgMTE2LCAxMTYsIDExNiwgMTE2LCAzMiwgIDMyLCAgMzIsICAzMiwgIDM3LCAgMzcsICAzNywgIDM3LAotICAgIDQ1LCAgNDUsICA0NSwgIDQ1LCAgNDYsICA0NiwgIDQ2LCAgNDYsICA0NywgIDQ3LCAgNDcsICA0NywgIDUxLCAgNTEsICA1MSwKLSAgICA1MSwgIDUyLCAgNTIsICA1MiwgIDUyLCAgNTMsICA1MywgIDUzLCAgNTMsICA1NCwgIDU0LCAgNTQsICA1NCwgIDU1LCAgNTUsCi0gICAgNTUsICA1NSwgIDU2LCAgNTYsICA1NiwgIDU2LCAgNTcsICA1NywgIDU3LCAgNTcsICA2MSwgIDYxLCAgNjEsICA2MSwgIDY1LAotICAgIDY1LCAgNjUsICA2NSwgIDk1LCAgOTUsICA5NSwgIDk1LCAgOTgsICA5OCwgIDk4LCAgOTgsICAxMDAsIDEwMCwgMTAwLCAxMDAsCi0gICAgMTAyLCAxMDIsIDEwMiwgMTAyLCAxMDMsIDEwMywgMTAzLCAxMDMsIDEwNCwgMTA0LCAxMDQsIDEwNCwgMTA4LCAxMDgsIDEwOCwKLSAgICAxMDgsIDEwOSwgMTA5LCAxMDksIDEwOSwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTIsIDExMiwgMTEyLCAxMTIsIDExNCwgMTE0LAotICAgIDExNCwgMTE0LCAxMTcsIDExNywgMTE3LCAxMTcsIDU4LCAgNTgsICA2NiwgIDY2LCAgNjcsICA2NywgIDY4LCAgNjgsICA2OSwKLSAgICA2OSwgIDcwLCAgNzAsICA3MSwgIDcxLCAgNzIsICA3MiwgIDczLCAgNzMsICA3NCwgIDc0LCAgNzUsICA3NSwgIDc2LCAgNzYsCi0gICAgNzcsICA3NywgIDc4LCAgNzgsICA3OSwgIDc5LCAgODAsICA4MCwgIDgxLCAgODEsICA4MiwgIDgyLCAgODMsICA4MywgIDg0LAotICAgIDg0LCAgODUsICA4NSwgIDg2LCAgODYsICA4NywgIDg3LCAgODksICA4OSwgIDEwNiwgMTA2LCAxMDcsIDEwNywgMTEzLCAxMTMsCi0gICAgMTE4LCAxMTgsIDExOSwgMTE5LCAxMjAsIDEyMCwgMTIxLCAxMjEsIDEyMiwgMTIyLCAzOCwgIDQyLCAgNDQsICA1OSwgIDg4LAotICAgIDkwLCAgLTEsICAtMSwgIDMzLCAgMzMsICAzMywgIDMzLCAgMzQsICAzNCwgIDM0LCAgMzQsICA0MCwgIDQwLCAgNDAsICA0MCwKLSAgICA0MSwgIDQxLCAgNDEsICA0MSwgIDYzLCAgNjMsICA2MywgIDYzLCAgMzksICAzOSwgIDQzLCAgNDMsICAxMjQsIDEyNCwgMzUsCi0gICAgNjIsICAtMSwgIC0xLCAgLTEsICAtMSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAzNiwgIDM2LAotICAgIDM2LCAgMzYsICAzNiwgIDM2LCAgMzYsICAzNiwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA5MSwKLSAgICA5MSwgIDkxLCAgOTEsICA5MSwgIDkxLCAgOTEsICA5MSwgIDkzLCAgOTMsICA5MywgIDkzLCAgOTMsICA5MywgIDkzLCAgOTMsCi0gICAgMTI2LCAxMjYsIDEyNiwgMTI2LCAxMjYsIDEyNiwgMTI2LCAxMjYsIDk0LCAgOTQsICA5NCwgIDk0LCAgMTI1LCAxMjUsIDEyNSwKLSAgICAxMjUsIDYwLCAgNjAsICA5NiwgIDk2LCAgMTIzLCAxMjMsIC0xLCAgLTEsICA5MiwgIDkyLCAgMTk1LCAxOTUsIDIwOCwgMjA4LAotICAgIDEyOCwgMTMwLCAxMzEsIDE2MiwgMTg0LCAxOTQsIDIyNCwgMjI2LCAtMSwgIC0xLCAgMTUzLCAxNTMsIDE1MywgMTUzLCAxNTMsCi0gICAgMTUzLCAxNTMsIDE1MywgMTYxLCAxNjEsIDE2MSwgMTYxLCAxNjEsIDE2MSwgMTYxLCAxNjEsIDE2NywgMTY3LCAxNjcsIDE2NywKLSAgICAxNjcsIDE2NywgMTY3LCAxNjcsIDE3MiwgMTcyLCAxNzIsIDE3MiwgMTcyLCAxNzIsIDE3MiwgMTcyLCAxNzYsIDE3NiwgMTc2LAotICAgIDE3NiwgMTc2LCAxNzYsIDE3NiwgMTc2LCAxNzcsIDE3NywgMTc3LCAxNzcsIDE3NywgMTc3LCAxNzcsIDE3NywgMTc5LCAxNzksCi0gICAgMTc5LCAxNzksIDE3OSwgMTc5LCAxNzksIDE3OSwgMjA5LCAyMDksIDIwOSwgMjA5LCAyMDksIDIwOSwgMjA5LCAyMDksIDIxNiwKLSAgICAyMTYsIDIxNiwgMjE2LCAyMTYsIDIxNiwgMjE2LCAyMTYsIDIxNywgMjE3LCAyMTcsIDIxNywgMjE3LCAyMTcsIDIxNywgMjE3LAotICAgIDIyNywgMjI3LCAyMjcsIDIyNywgMjI3LCAyMjcsIDIyNywgMjI3LCAyMjksIDIyOSwgMjI5LCAyMjksIDIyOSwgMjI5LCAyMjksCi0gICAgMjI5LCAyMzAsIDIzMCwgMjMwLCAyMzAsIDIzMCwgMjMwLCAyMzAsIDIzMCwgMTI5LCAxMjksIDEyOSwgMTI5LCAxMzIsIDEzMiwKLSAgICAxMzIsIDEzMiwgMTMzLCAxMzMsIDEzMywgMTMzLCAxMzQsIDEzNCwgMTM0LCAxMzQsIDEzNiwgMTM2LCAxMzYsIDEzNiwgMTQ2LAotICAgIDE0NiwgMTQ2LCAxNDYsIDE1NCwgMTU0LCAxNTQsIDE1NCwgMTU2LCAxNTYsIDE1NiwgMTU2LCAxNjAsIDE2MCwgMTYwLCAxNjAsCi0gICAgMTYzLCAxNjMsIDE2MywgMTYzLCAxNjQsIDE2NCwgMTY0LCAxNjQsIDE2OSwgMTY5LCAxNjksIDE2OSwgMTcwLCAxNzAsIDE3MCwKLSAgICAxNzAsIDE3MywgMTczLCAxNzMsIDE3MywgMTc4LCAxNzgsIDE3OCwgMTc4LCAxODEsIDE4MSwgMTgxLCAxODEsIDE4NSwgMTg1LAotICAgIDE4NSwgMTg1LCAxODYsIDE4NiwgMTg2LCAxODYsIDE4NywgMTg3LCAxODcsIDE4NywgMTg5LCAxODksIDE4OSwgMTg5LCAxOTAsCi0gICAgMTkwLCAxOTAsIDE5MCwgMTk2LCAxOTYsIDE5NiwgMTk2LCAxOTgsIDE5OCwgMTk4LCAxOTgsIDIyOCwgMjI4LCAyMjgsIDIyOCwKLSAgICAyMzIsIDIzMiwgMjMyLCAyMzIsIDIzMywgMjMzLCAyMzMsIDIzMywgMSwgICAxLCAgIDEzNSwgMTM1LCAxMzcsIDEzNywgMTM4LAotICAgIDEzOCwgMTM5LCAxMzksIDE0MCwgMTQwLCAxNDEsIDE0MSwgMTQzLCAxNDMsIDE0NywgMTQ3LCAxNDksIDE0OSwgMTUwLCAxNTAsCi0gICAgMTUxLCAxNTEsIDE1MiwgMTUyLCAxNTUsIDE1NSwgMTU3LCAxNTcsIDE1OCwgMTU4LCAxNjUsIDE2NSwgMTY2LCAxNjYsIDE2OCwKLSAgICAxNjgsIDE3NCwgMTc0LCAxNzUsIDE3NSwgMTgwLCAxODAsIDE4MiwgMTgyLCAxODMsIDE4MywgMTg4LCAxODgsIDE5MSwgMTkxLAotICAgIDE5NywgMTk3LCAyMzEsIDIzMSwgMjM5LCAyMzksIDksICAgMTQyLCAxNDQsIDE0NSwgMTQ4LCAxNTksIDE3MSwgMjA2LCAyMTUsCi0gICAgMjI1LCAyMzYsIDIzNywgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAxOTksIDE5OSwKLSAgICAxOTksIDE5OSwgMTk5LCAxOTksIDE5OSwgMTk5LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjM0LAotICAgIDIzNCwgMjM0LCAyMzQsIDIzNCwgMjM0LCAyMzQsIDIzNCwgMjM1LCAyMzUsIDIzNSwgMjM1LCAyMzUsIDIzNSwgMjM1LCAyMzUsCi0gICAgMTkyLCAxOTIsIDE5MiwgMTkyLCAxOTMsIDE5MywgMTkzLCAxOTMsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMjAxLCAyMDEsIDIwMSwKLSAgICAyMDEsIDIwMiwgMjAyLCAyMDIsIDIwMiwgMjA1LCAyMDUsIDIwNSwgMjA1LCAyMTAsIDIxMCwgMjEwLCAyMTAsIDIxMywgMjEzLAotICAgIDIxMywgMjEzLCAyMTgsIDIxOCwgMjE4LCAyMTgsIDIxOSwgMjE5LCAyMTksIDIxOSwgMjM4LCAyMzgsIDIzOCwgMjM4LCAyNDAsCi0gICAgMjQwLCAyNDAsIDI0MCwgMjQyLCAyNDIsIDI0MiwgMjQyLCAyNDMsIDI0MywgMjQzLCAyNDMsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyMDMsIDIwMywgMjA0LCAyMDQsIDIxMSwgMjExLCAyMTIsIDIxMiwgMjE0LCAyMTQsIDIyMSwgMjIxLCAyMjIsIDIyMiwgMjIzLAotICAgIDIyMywgMjQxLCAyNDEsIDI0NCwgMjQ0LCAyNDUsIDI0NSwgMjQ2LCAyNDYsIDI0NywgMjQ3LCAyNDgsIDI0OCwgMjUwLCAyNTAsCi0gICAgMjUxLCAyNTEsIDI1MiwgMjUyLCAyNTMsIDI1MywgMjU0LCAyNTQsIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsCi0gICAgMTEsICAxMiwgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LAotICAgIDI4LCAgMjksICAzMCwgIDMxLCAgMTI3LCAyMjAsIDI0OSwgLTEsICAxMCwgIDEwLCAgMTAsICAxMCwgIDEzLCAgMTMsICAxMywKLSAgICAxMywgIDIyLCAgMjIsICAyMiwgIDIyLCAgMjU2LCAyNTYsIDI1NiwgMjU2LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW52ZXJzZV9iYXNlNjRbMjU2XSA9IHsKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCA2MiwgIDI1NSwKLSAgICAyNTUsIDI1NSwgNjMsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDI1NSwgMjU1LAotICAgIDI1NSwgNjQsICAyNTUsIDI1NSwgMjU1LCAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LAotICAgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwKLSAgICAyNSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsCi0gICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LAotICAgIDQ5LCAgNTAsICA1MSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwKLX07Ci0KLS8qIGVtaXNzaW9uIGhlbHBlcnMgKi8KLXN0YXRpYyBpbnQgb25faGRyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgZ3JwY19tZGVsZW0gKm1kLAotICAgICAgICAgICAgICAgICAgaW50IGFkZF90b190YWJsZSkgewotICBpZiAoYWRkX3RvX3RhYmxlKSB7Ci0gICAgaWYgKCFncnBjX2NodHRwMl9ocHRibF9hZGQoJnAtPnRhYmxlLCBtZCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICBwLT5vbl9oZWFkZXIocC0+b25faGVhZGVyX3VzZXJfZGF0YSwgbWQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGdycGNfbWRzdHIgKnRha2Vfc3RyaW5nKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RyaW5nICpzdHIpIHsKLSAgZ3JwY19tZHN0ciAqcyA9IGdycGNfbWRzdHJfZnJvbV9idWZmZXIoKHVpbnQ4X3QgKilzdHItPnN0ciwgc3RyLT5sZW5ndGgpOwotICBzdHItPmxlbmd0aCA9IDA7Ci0gIHJldHVybiBzOwotfQotCi0vKiBqdW1wIHRvIHRoZSBuZXh0IHN0YXRlICovCi1zdGF0aWMgaW50IHBhcnNlX25leHQoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIHAtPnN0YXRlID0gKnAtPm5leHRfc3RhdGUrKzsKLSAgcmV0dXJuIHAtPnN0YXRlKHAsIGN1ciwgZW5kKTsKLX0KLQotLyogYmVnaW4gcGFyc2luZyBhIGhlYWRlcjogYWxsIGZ1bmN0aW9uYWxpdHkgaXMgZW5jb2RlZCBpbnRvIGxvb2t1cCB0YWJsZXMKLSAgIGFib3ZlICovCi1zdGF0aWMgaW50IHBhcnNlX2JlZ2luKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICBwLT5zdGF0ZSA9IHBhcnNlX2JlZ2luOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcmV0dXJuIGZpcnN0X2J5dGVfYWN0aW9uW2ZpcnN0X2J5dGVfbHV0WypjdXJdXShwLCBjdXIsIGVuZCk7Ci19Ci0KLS8qIHN0cmVhbSBkZXBlbmRlbmN5IGFuZCBwcmlvcml0aXphdGlvbiBkYXRhOiB3ZSBqdXN0IHNraXAgaXQgKi8KLXN0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3dlaWdodChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICBwLT5zdGF0ZSA9IHBhcnNlX3N0cmVhbV93ZWlnaHQ7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICByZXR1cm4gcC0+YWZ0ZXJfcHJpb3JpdGl6YXRpb24ocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotc3RhdGljIGludCBwYXJzZV9zdHJlYW1fZGVwMyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJlYW1fZGVwMzsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHJldHVybiBwYXJzZV9zdHJlYW1fd2VpZ2h0KHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX2RlcDIoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBpZiAoY3VyID09IGVuZCkgewotICAgIHAtPnN0YXRlID0gcGFyc2Vfc3RyZWFtX2RlcDI7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICByZXR1cm4gcGFyc2Vfc3RyZWFtX2RlcDMocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotc3RhdGljIGludCBwYXJzZV9zdHJlYW1fZGVwMShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJlYW1fZGVwMTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHJldHVybiBwYXJzZV9zdHJlYW1fZGVwMihwLCBjdXIgKyAxLCBlbmQpOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX3N0cmVhbV9kZXAwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICBwLT5zdGF0ZSA9IHBhcnNlX3N0cmVhbV9kZXAwOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcmV0dXJuIHBhcnNlX3N0cmVhbV9kZXAxKHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLS8qIGVtaXQgYW4gaW5kZXhlZCBmaWVsZDsgZm9yIG5vdyBqdXN0IGxvZ3MgaXQgdG8gY29uc29sZTsganVtcHMgdG8KLSAgIGJlZ2luIHRoZSBuZXh0IGZpZWxkIG9uIGNvbXBsZXRpb24gKi8KLXN0YXRpYyBpbnQgZmluaXNoX2luZGV4ZWRfZmllbGQoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBncnBjX21kZWxlbSAqbWQgPSBncnBjX2NodHRwMl9ocHRibF9sb29rdXAoJnAtPnRhYmxlLCBwLT5pbmRleCk7Ci0gIGlmIChtZCA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIEhQQUNLIGluZGV4IHJlY2VpdmVkOiAlZCIsIHAtPmluZGV4KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBHUlBDX01ERUxFTV9SRUYobWQpOwotICByZXR1cm4gb25faGRyKHAsIG1kLCAwKSAmJiBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGFuIGluZGV4ZWQgZmllbGQgd2l0aCBpbmRleCA8IDEyNyAqLwotc3RhdGljIGludCBwYXJzZV9pbmRleGVkX2ZpZWxkKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKLSAgcC0+aW5kZXggPSAoKmN1cikgJiAweDdmOwotICByZXR1cm4gZmluaXNoX2luZGV4ZWRfZmllbGQocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotLyogcGFyc2UgYW4gaW5kZXhlZCBmaWVsZCB3aXRoIGluZGV4ID49IDEyNyAqLwotc3RhdGljIGludCBwYXJzZV9pbmRleGVkX2ZpZWxkX3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0gewotICAgICAgZmluaXNoX2luZGV4ZWRfZmllbGR9OwotICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKLSAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOwotICBwLT5pbmRleCA9IDB4N2Y7Ci0gIHAtPnBhcnNpbmcudmFsdWUgPSAmcC0+aW5kZXg7Ci0gIHJldHVybiBwYXJzZV92YWx1ZTAocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotLyogZmluaXNoIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aCBpbmNyZW1lbnRhbCBpbmRleGluZzoganVzdCBsb2csIGFuZCBqdW1wIHRvICcKLSAgIGJlZ2luICovCi1zdGF0aWMgaW50IGZpbmlzaF9saXRoZHJfaW5jaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgZ3JwY19tZGVsZW0gKm1kID0gZ3JwY19jaHR0cDJfaHB0YmxfbG9va3VwKCZwLT50YWJsZSwgcC0+aW5kZXgpOwotICBHUFJfQVNTRVJUKG1kICE9IE5VTEwpOyAvKiBoYW5kbGVkIGluIHN0cmluZyBwYXJzaW5nICovCi0gIHJldHVybiBvbl9oZHIocCwgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfUkVGKG1kLT5rZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlX3N0cmluZyhwLCAmcC0+dmFsdWUpKSwKLSAgICAgICAgICAgICAgICAxKSAmJgotICAgICAgICAgcGFyc2VfYmVnaW4ocCwgY3VyLCBlbmQpOwotfQotCi0vKiBmaW5pc2ggYSBsaXRlcmFsIGhlYWRlciB3aXRoIGluY3JlbWVudGFsIGluZGV4aW5nIHdpdGggbm8gaW5kZXggKi8KLXN0YXRpYyBpbnQgZmluaXNoX2xpdGhkcl9pbmNpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgcmV0dXJuIG9uX2hkcihwLCBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3ModGFrZV9zdHJpbmcocCwgJnAtPmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vfc3RyaW5nKHAsICZwLT52YWx1ZSkpLAotICAgICAgICAgICAgICAgIDEpICYmCi0gICAgICAgICBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPCA2MyAqLwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfaW5jaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7Ci0gICAgICBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9pbmRleGVkX2tleSwgZmluaXNoX2xpdGhkcl9pbmNpZHh9OwotICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKLSAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOwotICBwLT5pbmRleCA9ICgqY3VyKSAmIDB4M2Y7Ci0gIHJldHVybiBwYXJzZV9zdHJpbmdfcHJlZml4KHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPj0gNjMgKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX2luY2lkeF94KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIHN0YXRpYyBjb25zdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUgYW5kX3RoZW5bXSA9IHsKLSAgICAgIHBhcnNlX3N0cmluZ19wcmVmaXgsIHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2luZGV4ZWRfa2V5LAotICAgICAgZmluaXNoX2xpdGhkcl9pbmNpZHh9OwotICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKLSAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOwotICBwLT5pbmRleCA9IDB4M2Y7Ci0gIHAtPnBhcnNpbmcudmFsdWUgPSAmcC0+aW5kZXg7Ci0gIHJldHVybiBwYXJzZV92YWx1ZTAocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotLyogcGFyc2UgYSBsaXRlcmFsIGhlYWRlciB3aXRoIGluY3JlbWVudGFsIGluZGV4aW5nOyBpbmRleCA9IDAgKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX2luY2lkeF92KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1ciwgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIHN0YXRpYyBjb25zdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUgYW5kX3RoZW5bXSA9IHsKLSAgICAgIHBhcnNlX2tleV9zdHJpbmcsIHBhcnNlX3N0cmluZ19wcmVmaXgsCi0gICAgICBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9saXRlcmFsX2tleSwgZmluaXNoX2xpdGhkcl9pbmNpZHhfdn07Ci0gIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAwOwotICBwLT5uZXh0X3N0YXRlID0gYW5kX3RoZW47Ci0gIHJldHVybiBwYXJzZV9zdHJpbmdfcHJlZml4KHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLS8qIGZpbmlzaCBhIGxpdGVyYWwgaGVhZGVyIHdpdGhvdXQgaW5jcmVtZW50YWwgaW5kZXhpbmcgKi8KLXN0YXRpYyBpbnQgZmluaXNoX2xpdGhkcl9ub3RpZHgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBncnBjX21kZWxlbSAqbWQgPSBncnBjX2NodHRwMl9ocHRibF9sb29rdXAoJnAtPnRhYmxlLCBwLT5pbmRleCk7Ci0gIEdQUl9BU1NFUlQobWQgIT0gTlVMTCk7IC8qIGhhbmRsZWQgaW4gc3RyaW5nIHBhcnNpbmcgKi8KLSAgcmV0dXJuIG9uX2hkcihwLCBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoR1JQQ19NRFNUUl9SRUYobWQtPmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vfc3RyaW5nKHAsICZwLT52YWx1ZSkpLAotICAgICAgICAgICAgICAgIDApICYmCi0gICAgICAgICBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Ci19Ci0KLS8qIGZpbmlzaCBhIGxpdGVyYWwgaGVhZGVyIHdpdGhvdXQgaW5jcmVtZW50YWwgaW5kZXhpbmcgd2l0aCBpbmRleCA9IDAgKi8KLXN0YXRpYyBpbnQgZmluaXNoX2xpdGhkcl9ub3RpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgcmV0dXJuIG9uX2hkcihwLCBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3ModGFrZV9zdHJpbmcocCwgJnAtPmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vfc3RyaW5nKHAsICZwLT52YWx1ZSkpLAotICAgICAgICAgICAgICAgIDApICYmCi0gICAgICAgICBwYXJzZV9iZWdpbihwLCBjdXIsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aG91dCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPCAxNSAqLwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7Ci0gICAgICBwYXJzZV92YWx1ZV9zdHJpbmdfd2l0aF9pbmRleGVkX2tleSwgZmluaXNoX2xpdGhkcl9ub3RpZHh9OwotICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKLSAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOwotICBwLT5pbmRleCA9ICgqY3VyKSAmIDB4ZjsKLSAgcmV0dXJuIHBhcnNlX3N0cmluZ19wcmVmaXgocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotLyogcGFyc2UgYSBsaXRlcmFsIGhlYWRlciB3aXRob3V0IGluY3JlbWVudGFsIGluZGV4aW5nOyBpbmRleCA+PSAxNSAqLwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4X3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0gewotICAgICAgcGFyc2Vfc3RyaW5nX3ByZWZpeCwgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXksCi0gICAgICBmaW5pc2hfbGl0aGRyX25vdGlkeH07Ci0gIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAwOwotICBwLT5uZXh0X3N0YXRlID0gYW5kX3RoZW47Ci0gIHAtPmluZGV4ID0gMHhmOwotICBwLT5wYXJzaW5nLnZhbHVlID0gJnAtPmluZGV4OwotICByZXR1cm4gcGFyc2VfdmFsdWUwKHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgd2l0aG91dCBpbmNyZW1lbnRhbCBpbmRleGluZzsgaW5kZXggPT0gMCAqLwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfbm90aWR4X3YoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0gewotICAgICAgcGFyc2Vfa2V5X3N0cmluZywgcGFyc2Vfc3RyaW5nX3ByZWZpeCwKLSAgICAgIHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2xpdGVyYWxfa2V5LCBmaW5pc2hfbGl0aGRyX25vdGlkeF92fTsKLSAgcC0+ZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZCA9IDA7Ci0gIHAtPm5leHRfc3RhdGUgPSBhbmRfdGhlbjsKLSAgcmV0dXJuIHBhcnNlX3N0cmluZ19wcmVmaXgocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotLyogZmluaXNoIGEgbGl0ZXJhbCBoZWFkZXIgdGhhdCBpcyBuZXZlciBpbmRleGVkICovCi1zdGF0aWMgaW50IGZpbmlzaF9saXRoZHJfbnZyaWR4KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgZ3JwY19tZGVsZW0gKm1kID0gZ3JwY19jaHR0cDJfaHB0YmxfbG9va3VwKCZwLT50YWJsZSwgcC0+aW5kZXgpOwotICBHUFJfQVNTRVJUKG1kICE9IE5VTEwpOyAvKiBoYW5kbGVkIGluIHN0cmluZyBwYXJzaW5nICovCi0gIHJldHVybiBvbl9oZHIocCwgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKEdSUENfTURTVFJfUkVGKG1kLT5rZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlX3N0cmluZyhwLCAmcC0+dmFsdWUpKSwKLSAgICAgICAgICAgICAgICAwKSAmJgotICAgICAgICAgcGFyc2VfYmVnaW4ocCwgY3VyLCBlbmQpOwotfQotCi0vKiBmaW5pc2ggYSBsaXRlcmFsIGhlYWRlciB0aGF0IGlzIG5ldmVyIGluZGV4ZWQgd2l0aCBhbiBleHRyYSB2YWx1ZSAqLwotc3RhdGljIGludCBmaW5pc2hfbGl0aGRyX252cmlkeF92KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICByZXR1cm4gb25faGRyKHAsIGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyh0YWtlX3N0cmluZyhwLCAmcC0+a2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZV9zdHJpbmcocCwgJnAtPnZhbHVlKSksCi0gICAgICAgICAgICAgICAgMCkgJiYKLSAgICAgICAgIHBhcnNlX2JlZ2luKHAsIGN1ciwgZW5kKTsKLX0KLQotLyogcGFyc2UgYSBsaXRlcmFsIGhlYWRlciB0aGF0IGlzIG5ldmVyIGluZGV4ZWQ7IGluZGV4IDwgMTUgKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGl0aGRyX252cmlkeChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0gewotICAgICAgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXksIGZpbmlzaF9saXRoZHJfbnZyaWR4fTsKLSAgcC0+ZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZCA9IDA7Ci0gIHAtPm5leHRfc3RhdGUgPSBhbmRfdGhlbjsKLSAgcC0+aW5kZXggPSAoKmN1cikgJiAweGY7Ci0gIHJldHVybiBwYXJzZV9zdHJpbmdfcHJlZml4KHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgdGhhdCBpcyBuZXZlciBpbmRleGVkOyBpbmRleCA+PSAxNSAqLwotc3RhdGljIGludCBwYXJzZV9saXRoZHJfbnZyaWR4X3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLCBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgc3RhdGljIGNvbnN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSBhbmRfdGhlbltdID0gewotICAgICAgcGFyc2Vfc3RyaW5nX3ByZWZpeCwgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXksCi0gICAgICBmaW5pc2hfbGl0aGRyX252cmlkeH07Ci0gIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPSAwOwotICBwLT5uZXh0X3N0YXRlID0gYW5kX3RoZW47Ci0gIHAtPmluZGV4ID0gMHhmOwotICBwLT5wYXJzaW5nLnZhbHVlID0gJnAtPmluZGV4OwotICByZXR1cm4gcGFyc2VfdmFsdWUwKHAsIGN1ciArIDEsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGEgbGl0ZXJhbCBoZWFkZXIgdGhhdCBpcyBuZXZlciBpbmRleGVkOyBpbmRleCA9PSAwICovCi1zdGF0aWMgaW50IHBhcnNlX2xpdGhkcl9udnJpZHhfdihncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7Ci0gICAgICBwYXJzZV9rZXlfc3RyaW5nLCBwYXJzZV9zdHJpbmdfcHJlZml4LAotICAgICAgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfbGl0ZXJhbF9rZXksIGZpbmlzaF9saXRoZHJfbnZyaWR4X3Z9OwotICBwLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMDsKLSAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOwotICByZXR1cm4gcGFyc2Vfc3RyaW5nX3ByZWZpeChwLCBjdXIgKyAxLCBlbmQpOwotfQotCi0vKiBmaW5pc2ggcGFyc2luZyBhIG1heCB0YWJsZSBzaXplIGNoYW5nZSAqLwotc3RhdGljIGludCBmaW5pc2hfbWF4X3RibF9zaXplKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBncHJfbG9nKEdQUl9JTkZPLCAiTUFYIFRBQkxFIFNJWkU6ICVkIiwgcC0+aW5kZXgpOwotICByZXR1cm4gZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X2N1cnJlbnRfdGFibGVfc2l6ZSgmcC0+dGFibGUsIHAtPmluZGV4KSAmJgotICAgICAgICAgcGFyc2VfYmVnaW4ocCwgY3VyLCBlbmQpOwotfQotCi0vKiBwYXJzZSBhIG1heCB0YWJsZSBzaXplIGNoYW5nZSwgbWF4IHNpemUgPCAxNSAqLwotc3RhdGljIGludCBwYXJzZV9tYXhfdGJsX3NpemUoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgaWYgKHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQtLTsKLSAgcC0+aW5kZXggPSAoKmN1cikgJiAweDFmOwotICByZXR1cm4gZmluaXNoX21heF90Ymxfc2l6ZShwLCBjdXIgKyAxLCBlbmQpOwotfQotCi0vKiBwYXJzZSBhIG1heCB0YWJsZSBzaXplIGNoYW5nZSwgbWF4IHNpemUgPj0gMTUgKi8KLXN0YXRpYyBpbnQgcGFyc2VfbWF4X3RibF9zaXplX3goZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBzdGF0aWMgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFuZF90aGVuW10gPSB7Ci0gICAgICBmaW5pc2hfbWF4X3RibF9zaXplfTsKLSAgaWYgKHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHAtPmR5bmFtaWNfdGFibGVfdXBkYXRlX2FsbG93ZWQtLTsKLSAgcC0+bmV4dF9zdGF0ZSA9IGFuZF90aGVuOwotICBwLT5pbmRleCA9IDB4MWY7Ci0gIHAtPnBhcnNpbmcudmFsdWUgPSAmcC0+aW5kZXg7Ci0gIHJldHVybiBwYXJzZV92YWx1ZTAocCwgY3VyICsgMSwgZW5kKTsKLX0KLQotLyogYSBwYXJzZSBlcnJvcjogamFtIHRoZSBwYXJzZSBzdGF0ZSBpbnRvIHBhcnNlX2Vycm9yLCBhbmQgcmV0dXJuIGVycm9yICovCi1zdGF0aWMgaW50IHBhcnNlX2Vycm9yKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgcC0+c3RhdGUgPSBwYXJzZV9lcnJvcjsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2VfaWxsZWdhbF9vcChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgR1BSX0FTU0VSVChjdXIgIT0gZW5kKTsKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICJJbGxlZ2FsIGhwYWNrIG9wIGNvZGUgJWQiLCAqY3VyKTsKLSAgcmV0dXJuIHBhcnNlX2Vycm9yKHAsIGN1ciwgZW5kKTsKLX0KLQotLyogcGFyc2UgdGhlIDFzdCBieXRlIG9mIGEgdmFyaW50IGludG8gcC0+cGFyc2luZy52YWx1ZQotICAgbm8gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KLXN0YXRpYyBpbnQgcGFyc2VfdmFsdWUwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgcC0+c3RhdGUgPSBwYXJzZV92YWx1ZTA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAqcC0+cGFyc2luZy52YWx1ZSArPSAoKmN1cikgJiAweDdmOwotCi0gIGlmICgoKmN1cikgJiAweDgwKSB7Ci0gICAgcmV0dXJuIHBhcnNlX3ZhbHVlMShwLCBjdXIgKyAxLCBlbmQpOwotICB9IGVsc2UgewotICAgIHJldHVybiBwYXJzZV9uZXh0KHAsIGN1ciArIDEsIGVuZCk7Ci0gIH0KLX0KLQotLyogcGFyc2UgdGhlIDJuZCBieXRlIG9mIGEgdmFyaW50IGludG8gcC0+cGFyc2luZy52YWx1ZQotICAgbm8gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KLXN0YXRpYyBpbnQgcGFyc2VfdmFsdWUxKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgcC0+c3RhdGUgPSBwYXJzZV92YWx1ZTE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAqcC0+cGFyc2luZy52YWx1ZSArPSAoKCh1aW50MzJfdCkqY3VyKSAmIDB4N2YpIDw8IDc7Ci0KLSAgaWYgKCgqY3VyKSAmIDB4ODApIHsKLSAgICByZXR1cm4gcGFyc2VfdmFsdWUyKHAsIGN1ciArIDEsIGVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKLSAgfQotfQotCi0vKiBwYXJzZSB0aGUgM3JkIGJ5dGUgb2YgYSB2YXJpbnQgaW50byBwLT5wYXJzaW5nLnZhbHVlCi0gICBubyBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLwotc3RhdGljIGludCBwYXJzZV92YWx1ZTIoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICBwLT5zdGF0ZSA9IHBhcnNlX3ZhbHVlMjsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gICpwLT5wYXJzaW5nLnZhbHVlICs9ICgoKHVpbnQzMl90KSpjdXIpICYgMHg3ZikgPDwgMTQ7Ci0KLSAgaWYgKCgqY3VyKSAmIDB4ODApIHsKLSAgICByZXR1cm4gcGFyc2VfdmFsdWUzKHAsIGN1ciArIDEsIGVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKLSAgfQotfQotCi0vKiBwYXJzZSB0aGUgNHRoIGJ5dGUgb2YgYSB2YXJpbnQgaW50byBwLT5wYXJzaW5nLnZhbHVlCi0gICBubyBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLwotc3RhdGljIGludCBwYXJzZV92YWx1ZTMoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICBwLT5zdGF0ZSA9IHBhcnNlX3ZhbHVlMzsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gICpwLT5wYXJzaW5nLnZhbHVlICs9ICgoKHVpbnQzMl90KSpjdXIpICYgMHg3ZikgPDwgMjE7Ci0KLSAgaWYgKCgqY3VyKSAmIDB4ODApIHsKLSAgICByZXR1cm4gcGFyc2VfdmFsdWU0KHAsIGN1ciArIDEsIGVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKLSAgfQotfQotCi0vKiBwYXJzZSB0aGUgNXRoIGJ5dGUgb2YgYSB2YXJpbnQgaW50byBwLT5wYXJzaW5nLnZhbHVlCi0gICBkZXBlbmRpbmcgb24gdGhlIGJ5dGUsIHdlIG1heSBvdmVyZmxvdywgYW5kIGNhcmUgbXVzdCBiZSB0YWtlbiAqLwotc3RhdGljIGludCBwYXJzZV92YWx1ZTQoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgdWludDhfdCBjOwotICB1aW50MzJfdCBjdXJfdmFsdWU7Ci0gIHVpbnQzMl90IGFkZF92YWx1ZTsKLQotICBpZiAoY3VyID09IGVuZCkgewotICAgIHAtPnN0YXRlID0gcGFyc2VfdmFsdWU0OwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgYyA9ICgqY3VyKSAmIDB4N2Y7Ci0gIGlmIChjID4gMHhmKSB7Ci0gICAgZ290byBlcnJvcjsKLSAgfQotCi0gIGN1cl92YWx1ZSA9ICpwLT5wYXJzaW5nLnZhbHVlOwotICBhZGRfdmFsdWUgPSAoKHVpbnQzMl90KWMpIDw8IDI4OwotICBpZiAoYWRkX3ZhbHVlID4gMHhmZmZmZmZmZnUgLSBjdXJfdmFsdWUpIHsKLSAgICBnb3RvIGVycm9yOwotICB9Ci0KLSAgKnAtPnBhcnNpbmcudmFsdWUgPSBjdXJfdmFsdWUgKyBhZGRfdmFsdWU7Ci0KLSAgaWYgKCgqY3VyKSAmIDB4ODApIHsKLSAgICByZXR1cm4gcGFyc2VfdmFsdWU1dXAocCwgY3VyICsgMSwgZW5kKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcGFyc2VfbmV4dChwLCBjdXIgKyAxLCBlbmQpOwotICB9Ci0KLWVycm9yOgotICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAiaW50ZWdlciBvdmVyZmxvdyBpbiBocGFjayBpbnRlZ2VyIGRlY29kaW5nOiBoYXZlIDB4JTA4eCwgIgotICAgICAgICAgICJnb3QgYnl0ZSAweCUwMnggb24gYnl0ZSA1IiwKLSAgICAgICAgICAqcC0+cGFyc2luZy52YWx1ZSwgKmN1cik7Ci0gIHJldHVybiBwYXJzZV9lcnJvcihwLCBjdXIsIGVuZCk7Ci19Ci0KLS8qIHBhcnNlIGFueSB0cmFpbGluZyBieXRlcyBpbiBhIHZhcmludDogaXQncyBwb3NzaWJsZSB0byBhcHBlbmQgYW4gYXJiaXRyYXJ5Ci0gICBudW1iZXIgb2YgMHg4MCdzIGFuZCBub3QgYWZmZWN0IHRoZSB2YWx1ZSAtIGEgemVybyB3aWxsIHRlcm1pbmF0ZSAtIGFuZAotICAgYW55dGhpbmcgZWxzZSB3aWxsIG92ZXJmbG93ICovCi1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlNXVwKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgd2hpbGUgKGN1ciAhPSBlbmQgJiYgKmN1ciA9PSAweDgwKSB7Ci0gICAgKytjdXI7Ci0gIH0KLQotICBpZiAoY3VyID09IGVuZCkgewotICAgIHAtPnN0YXRlID0gcGFyc2VfdmFsdWU1dXA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBpZiAoKmN1ciA9PSAwKSB7Ci0gICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKLSAgfQotCi0gIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICJpbnRlZ2VyIG92ZXJmbG93IGluIGhwYWNrIGludGVnZXIgZGVjb2Rpbmc6IGhhdmUgMHglMDh4LCAiCi0gICAgICAgICAgImdvdCBieXRlIDB4JTAyeCBzb21ldGltZSBhZnRlciBieXRlIDUiLAotICAgICAgICAgICpwLT5wYXJzaW5nLnZhbHVlLCAqY3VyKTsKLSAgcmV0dXJuIHBhcnNlX2Vycm9yKHAsIGN1ciwgZW5kKTsKLX0KLQotLyogcGFyc2UgYSBzdHJpbmcgcHJlZml4ICovCi1zdGF0aWMgaW50IHBhcnNlX3N0cmluZ19wcmVmaXgoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJpbmdfcHJlZml4OwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcC0+c3RybGVuID0gKCpjdXIpICYgMHg3ZjsKLSAgcC0+aHVmZiA9ICgqY3VyKSA+PiA3OwotICBpZiAocC0+c3RybGVuID09IDB4N2YpIHsKLSAgICBwLT5wYXJzaW5nLnZhbHVlID0gJnAtPnN0cmxlbjsKLSAgICByZXR1cm4gcGFyc2VfdmFsdWUwKHAsIGN1ciArIDEsIGVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBhcnNlX25leHQocCwgY3VyICsgMSwgZW5kKTsKLSAgfQotfQotCi0vKiBhcHBlbmQgc29tZSBieXRlcyB0byBhIHN0cmluZyAqLwotc3RhdGljIHZvaWQgYXBwZW5kX2J5dGVzKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIGlmIChsZW5ndGggKyBzdHItPmxlbmd0aCA+IHN0ci0+Y2FwYWNpdHkpIHsKLSAgICBHUFJfQVNTRVJUKHN0ci0+bGVuZ3RoICsgbGVuZ3RoIDw9IFVJTlQzMl9NQVgpOwotICAgIHN0ci0+Y2FwYWNpdHkgPSAodWludDMyX3QpKHN0ci0+bGVuZ3RoICsgbGVuZ3RoKTsKLSAgICBzdHItPnN0ciA9IGdwcl9yZWFsbG9jKHN0ci0+c3RyLCBzdHItPmNhcGFjaXR5KTsKLSAgfQotICBtZW1jcHkoc3RyLT5zdHIgKyBzdHItPmxlbmd0aCwgZGF0YSwgbGVuZ3RoKTsKLSAgR1BSX0FTU0VSVChsZW5ndGggPD0gVUlOVDMyX01BWCAtIHN0ci0+bGVuZ3RoKTsKLSAgc3RyLT5sZW5ndGggKz0gKHVpbnQzMl90KWxlbmd0aDsKLX0KLQotc3RhdGljIGludCBhcHBlbmRfc3RyaW5nKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RyaW5nICpzdHIgPSBwLT5wYXJzaW5nLnN0cjsKLSAgdWludDMyX3QgYml0czsKLSAgdWludDhfdCBkZWNvZGVkWzNdOwotICBzd2l0Y2ggKChiaW5hcnlfc3RhdGUpcC0+YmluYXJ5KSB7Ci0gICAgY2FzZSBOT1RfQklOQVJZOgotICAgICAgYXBwZW5kX2J5dGVzKHN0ciwgY3VyLCAoc2l6ZV90KShlbmQgLSBjdXIpKTsKLSAgICAgIHJldHVybiAxOwotICAgIGI2NF9ieXRlMDoKLSAgICBjYXNlIEI2NF9CWVRFMDoKLSAgICAgIGlmIChjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHAtPmJpbmFyeSA9IEI2NF9CWVRFMDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICBiaXRzID0gaW52ZXJzZV9iYXNlNjRbKmN1cl07Ci0gICAgICArK2N1cjsKLSAgICAgIGlmIChiaXRzID09IDI1NSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICBlbHNlIGlmIChiaXRzID09IDY0KQotICAgICAgICBnb3RvIGI2NF9ieXRlMDsKLSAgICAgIHAtPmJhc2U2NF9idWZmZXIgPSBiaXRzIDw8IDE4OwotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgYjY0X2J5dGUxOgotICAgIGNhc2UgQjY0X0JZVEUxOgotICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgcC0+YmluYXJ5ID0gQjY0X0JZVEUxOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAgIGJpdHMgPSBpbnZlcnNlX2Jhc2U2NFsqY3VyXTsKLSAgICAgICsrY3VyOwotICAgICAgaWYgKGJpdHMgPT0gMjU1KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGVsc2UgaWYgKGJpdHMgPT0gNjQpCi0gICAgICAgIGdvdG8gYjY0X2J5dGUxOwotICAgICAgcC0+YmFzZTY0X2J1ZmZlciB8PSBiaXRzIDw8IDEyOwotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgYjY0X2J5dGUyOgotICAgIGNhc2UgQjY0X0JZVEUyOgotICAgICAgaWYgKGN1ciA9PSBlbmQpIHsKLSAgICAgICAgcC0+YmluYXJ5ID0gQjY0X0JZVEUyOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAgIGJpdHMgPSBpbnZlcnNlX2Jhc2U2NFsqY3VyXTsKLSAgICAgICsrY3VyOwotICAgICAgaWYgKGJpdHMgPT0gMjU1KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGVsc2UgaWYgKGJpdHMgPT0gNjQpCi0gICAgICAgIGdvdG8gYjY0X2J5dGUyOwotICAgICAgcC0+YmFzZTY0X2J1ZmZlciB8PSBiaXRzIDw8IDY7Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBiNjRfYnl0ZTM6Ci0gICAgY2FzZSBCNjRfQllURTM6Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICBwLT5iaW5hcnkgPSBCNjRfQllURTM7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgYml0cyA9IGludmVyc2VfYmFzZTY0WypjdXJdOwotICAgICAgKytjdXI7Ci0gICAgICBpZiAoYml0cyA9PSAyNTUpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgZWxzZSBpZiAoYml0cyA9PSA2NCkKLSAgICAgICAgZ290byBiNjRfYnl0ZTM7Ci0gICAgICBwLT5iYXNlNjRfYnVmZmVyIHw9IGJpdHM7Ci0gICAgICBiaXRzID0gcC0+YmFzZTY0X2J1ZmZlcjsKLSAgICAgIGRlY29kZWRbMF0gPSAodWludDhfdCkoYml0cyA+PiAxNik7Ci0gICAgICBkZWNvZGVkWzFdID0gKHVpbnQ4X3QpKGJpdHMgPj4gOCk7Ci0gICAgICBkZWNvZGVkWzJdID0gKHVpbnQ4X3QpKGJpdHMpOwotICAgICAgYXBwZW5kX2J5dGVzKHN0ciwgZGVjb2RlZCwgMyk7Ci0gICAgICBnb3RvIGI2NF9ieXRlMDsKLSAgfQotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMSk7Ci19Ci0KLS8qIGFwcGVuZCBhIG51bGwgdGVybWluYXRvciB0byBhIHN0cmluZyAqLwotc3RhdGljIGludCBmaW5pc2hfc3RyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCkgewotICB1aW50OF90IHRlcm1pbmF0b3IgPSAwOwotICB1aW50OF90IGRlY29kZWRbMl07Ci0gIHVpbnQzMl90IGJpdHM7Ci0gIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0ciA9IHAtPnBhcnNpbmcuc3RyOwotICBzd2l0Y2ggKChiaW5hcnlfc3RhdGUpcC0+YmluYXJ5KSB7Ci0gICAgY2FzZSBOT1RfQklOQVJZOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCNjRfQllURTA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEI2NF9CWVRFMToKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiaWxsZWdhbCBiYXNlNjQgZW5jb2RpbmciKTsKLSAgICAgIHJldHVybiAwOyAvKiBpbGxlZ2FsIGVuY29kaW5nICovCi0gICAgY2FzZSBCNjRfQllURTI6Ci0gICAgICBiaXRzID0gcC0+YmFzZTY0X2J1ZmZlcjsKLSAgICAgIGlmIChiaXRzICYgMHhmZmZmKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAidHJhaWxpbmcgYml0cyBpbiBiYXNlNjQgZW5jb2Rpbmc6IDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgYml0cyAmIDB4ZmZmZik7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgZGVjb2RlZFswXSA9ICh1aW50OF90KShiaXRzID4+IDE2KTsKLSAgICAgIGFwcGVuZF9ieXRlcyhzdHIsIGRlY29kZWQsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCNjRfQllURTM6Ci0gICAgICBiaXRzID0gcC0+YmFzZTY0X2J1ZmZlcjsKLSAgICAgIGlmIChiaXRzICYgMHhmZikgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgInRyYWlsaW5nIGJpdHMgaW4gYmFzZTY0IGVuY29kaW5nOiAweCUwMngiLAotICAgICAgICAgICAgICAgIGJpdHMgJiAweGZmKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBkZWNvZGVkWzBdID0gKHVpbnQ4X3QpKGJpdHMgPj4gMTYpOwotICAgICAgZGVjb2RlZFsxXSA9ICh1aW50OF90KShiaXRzID4+IDgpOwotICAgICAgYXBwZW5kX2J5dGVzKHN0ciwgZGVjb2RlZCwgMik7Ci0gICAgICBicmVhazsKLSAgfQotICBhcHBlbmRfYnl0ZXMoc3RyLCAmdGVybWluYXRvciwgMSk7Ci0gIHAtPnBhcnNpbmcuc3RyLT5sZW5ndGgtLTsgLyogZG9uJ3QgYWN0dWFsbHkgY291bnQgdGhlIG51bGwgdGVybWluYXRvciAqLwotICByZXR1cm4gMTsKLX0KLQotLyogZGVjb2RlIGEgbmliYmxlIGZyb20gYSBodWZmbWFuIGVuY29kZWQgc3RyZWFtICovCi1zdGF0aWMgaW50IGh1ZmZfbmliYmxlKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgdWludDhfdCBuaWJibGUpIHsKLSAgaW50MTZfdCBlbWl0ID0gZW1pdF9zdWJfdGJsWzE2ICogZW1pdF90YmxbcC0+aHVmZl9zdGF0ZV0gKyBuaWJibGVdOwotICBpbnQxNl90IG5leHQgPSBuZXh0X3N1Yl90YmxbMTYgKiBuZXh0X3RibFtwLT5odWZmX3N0YXRlXSArIG5pYmJsZV07Ci0gIGlmIChlbWl0ICE9IC0xKSB7Ci0gICAgaWYgKGVtaXQgPj0gMCAmJiBlbWl0IDwgMjU2KSB7Ci0gICAgICB1aW50OF90IGMgPSAodWludDhfdCllbWl0OwotICAgICAgaWYgKCFhcHBlbmRfc3RyaW5nKHAsICZjLCAoJmMpICsgMSkpIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQoZW1pdCA9PSAyNTYpOwotICAgIH0KLSAgfQotICBwLT5odWZmX3N0YXRlID0gbmV4dDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIGRlY29kZSBmdWxsIGJ5dGVzIGZyb20gYSBodWZmbWFuIGVuY29kZWQgc3RyZWFtICovCi1zdGF0aWMgaW50IGFkZF9odWZmX2J5dGVzKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgZm9yICg7IGN1ciAhPSBlbmQ7ICsrY3VyKSB7Ci0gICAgaWYgKCFodWZmX25pYmJsZShwLCAqY3VyID4+IDQpIHx8ICFodWZmX25pYmJsZShwLCAqY3VyICYgMHhmKSkgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIGRlY29kZSBzb21lIHN0cmluZyBieXRlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBkZWNvZGluZyBtb2RlCi0gICAoaHVmZm1hbiBvciBub3QpICovCi1zdGF0aWMgaW50IGFkZF9zdHJfYnl0ZXMoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLCBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIGlmIChwLT5odWZmKSB7Ci0gICAgcmV0dXJuIGFkZF9odWZmX2J5dGVzKHAsIGN1ciwgZW5kKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gYXBwZW5kX3N0cmluZyhwLCBjdXIsIGVuZCk7Ci0gIH0KLX0KLQotLyogcGFyc2UgYSBzdHJpbmcgLSB0cmllcyB0byBkbyBsYXJnZSBjaHVua3MgYXQgYSB0aW1lICovCi1zdGF0aWMgaW50IHBhcnNlX3N0cmluZyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICBzaXplX3QgcmVtYWluaW5nID0gcC0+c3RybGVuIC0gcC0+c3RyZ290OwotICBzaXplX3QgZ2l2ZW4gPSAoc2l6ZV90KShlbmQgLSBjdXIpOwotICBpZiAocmVtYWluaW5nIDw9IGdpdmVuKSB7Ci0gICAgcmV0dXJuIGFkZF9zdHJfYnl0ZXMocCwgY3VyLCBjdXIgKyByZW1haW5pbmcpICYmIGZpbmlzaF9zdHIocCkgJiYKLSAgICAgICAgICAgcGFyc2VfbmV4dChwLCBjdXIgKyByZW1haW5pbmcsIGVuZCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFhZGRfc3RyX2J5dGVzKHAsIGN1ciwgY3VyICsgZ2l2ZW4pKSByZXR1cm4gMDsKLSAgICBHUFJfQVNTRVJUKGdpdmVuIDw9IFVJTlQzMl9NQVggLSBwLT5zdHJnb3QpOwotICAgIHAtPnN0cmdvdCArPSAodWludDMyX3QpZ2l2ZW47Ci0gICAgcC0+c3RhdGUgPSBwYXJzZV9zdHJpbmc7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLX0KLQotLyogYmVnaW4gcGFyc2luZyBhIHN0cmluZyAtIHBlcmZvcm1zIHNldHVwLCBjYWxscyBwYXJzZV9zdHJpbmcgKi8KLXN0YXRpYyBpbnQgYmVnaW5fcGFyc2Vfc3RyaW5nKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kLCB1aW50OF90IGJpbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgKnN0cikgewotICBwLT5zdHJnb3QgPSAwOwotICBzdHItPmxlbmd0aCA9IDA7Ci0gIHAtPnBhcnNpbmcuc3RyID0gc3RyOwotICBwLT5odWZmX3N0YXRlID0gMDsKLSAgcC0+YmluYXJ5ID0gYmluYXJ5OwotICByZXR1cm4gcGFyc2Vfc3RyaW5nKHAsIGN1ciwgZW5kKTsKLX0KLQotLyogcGFyc2UgdGhlIGtleSBzdHJpbmcgKi8KLXN0YXRpYyBpbnQgcGFyc2Vfa2V5X3N0cmluZyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgcmV0dXJuIGJlZ2luX3BhcnNlX3N0cmluZyhwLCBjdXIsIGVuZCwgTk9UX0JJTkFSWSwgJnAtPmtleSk7Ci19Ci0KLS8qIGNoZWNrIGlmIGEga2V5IHJlcHJlc2VudHMgYSBiaW5hcnkgaGVhZGVyIG9yIG5vdCAqLwotdHlwZWRlZiBlbnVtIHsgQklOQVJZX0hFQURFUiwgUExBSU5URVhUX0hFQURFUiwgRVJST1JfSEVBREVSIH0gaXNfYmluYXJ5X2hlYWRlcjsKLQotc3RhdGljIGlzX2JpbmFyeV9oZWFkZXIgaXNfYmluYXJ5X2xpdGVyYWxfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCkgewotICByZXR1cm4gZ3JwY19pc19iaW5hcnlfaGVhZGVyKHAtPmtleS5zdHIsIHAtPmtleS5sZW5ndGgpID8gQklOQVJZX0hFQURFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUExBSU5URVhUX0hFQURFUjsKLX0KLQotc3RhdGljIGlzX2JpbmFyeV9oZWFkZXIgaXNfYmluYXJ5X2luZGV4ZWRfaGVhZGVyKGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCkgewotICBncnBjX21kZWxlbSAqZWxlbSA9IGdycGNfY2h0dHAyX2hwdGJsX2xvb2t1cCgmcC0+dGFibGUsIHAtPmluZGV4KTsKLSAgaWYgKCFlbGVtKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIEhQQUNLIGluZGV4IHJlY2VpdmVkOiAlZCIsIHAtPmluZGV4KTsKLSAgICByZXR1cm4gRVJST1JfSEVBREVSOwotICB9Ci0gIHJldHVybiBncnBjX2lzX2JpbmFyeV9oZWFkZXIoCi0gICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKGVsZW0tPmtleS0+c2xpY2UpLAotICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoZWxlbS0+a2V5LT5zbGljZSkpCi0gICAgICAgICAgICAgPyBCSU5BUllfSEVBREVSCi0gICAgICAgICAgICAgOiBQTEFJTlRFWFRfSEVBREVSOwotfQotCi0vKiBwYXJzZSB0aGUgdmFsdWUgc3RyaW5nICovCi1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlX3N0cmluZyhncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsIGNvbnN0IHVpbnQ4X3QgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCwgaXNfYmluYXJ5X2hlYWRlciB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgQklOQVJZX0hFQURFUjoKLSAgICAgIHJldHVybiBiZWdpbl9wYXJzZV9zdHJpbmcocCwgY3VyLCBlbmQsIEI2NF9CWVRFMCwgJnAtPnZhbHVlKTsKLSAgICBjYXNlIFBMQUlOVEVYVF9IRUFERVI6Ci0gICAgICByZXR1cm4gYmVnaW5fcGFyc2Vfc3RyaW5nKHAsIGN1ciwgZW5kLCBOT1RfQklOQVJZLCAmcC0+dmFsdWUpOwotICAgIGNhc2UgRVJST1JfSEVBREVSOgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyogQWRkIGNvZGUgdG8gcHJldmVudCByZXR1cm4gd2l0aG91dCB2YWx1ZSBlcnJvciAqLwotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gMCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2VfdmFsdWVfc3RyaW5nX3dpdGhfaW5kZXhlZF9rZXkoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCkgewotICByZXR1cm4gcGFyc2VfdmFsdWVfc3RyaW5nKHAsIGN1ciwgZW5kLCBpc19iaW5hcnlfaW5kZXhlZF9oZWFkZXIocCkpOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX3ZhbHVlX3N0cmluZ193aXRoX2xpdGVyYWxfa2V5KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpIHsKLSAgcmV0dXJuIHBhcnNlX3ZhbHVlX3N0cmluZyhwLCBjdXIsIGVuZCwgaXNfYmluYXJ5X2xpdGVyYWxfaGVhZGVyKHApKTsKLX0KLQotLyogUFVCTElDIElOVEVSRkFDRSAqLwotCi1zdGF0aWMgdm9pZCBvbl9oZWFkZXJfbm90X3NldCh2b2lkICp1c2VyX2RhdGEsIGdycGNfbWRlbGVtICptZCkgewotICBHUFJfVU5SRUFDSEFCTEVfQ09ERShyZXR1cm4gKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfaW5pdChncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnApIHsKLSAgcC0+b25faGVhZGVyID0gb25faGVhZGVyX25vdF9zZXQ7Ci0gIHAtPm9uX2hlYWRlcl91c2VyX2RhdGEgPSBOVUxMOwotICBwLT5zdGF0ZSA9IHBhcnNlX2JlZ2luOwotICBwLT5rZXkuc3RyID0gTlVMTDsKLSAgcC0+a2V5LmNhcGFjaXR5ID0gMDsKLSAgcC0+a2V5Lmxlbmd0aCA9IDA7Ci0gIHAtPnZhbHVlLnN0ciA9IE5VTEw7Ci0gIHAtPnZhbHVlLmNhcGFjaXR5ID0gMDsKLSAgcC0+dmFsdWUubGVuZ3RoID0gMDsKLSAgcC0+ZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZCA9IDI7Ci0gIGdycGNfY2h0dHAyX2hwdGJsX2luaXQoJnAtPnRhYmxlKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc2V0X2hhc19wcmlvcml0eShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnApIHsKLSAgcC0+YWZ0ZXJfcHJpb3JpdGl6YXRpb24gPSBwLT5zdGF0ZTsKLSAgcC0+c3RhdGUgPSBwYXJzZV9zdHJlYW1fZGVwMDsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfZGVzdHJveShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnApIHsKLSAgZ3JwY19jaHR0cDJfaHB0YmxfZGVzdHJveSgmcC0+dGFibGUpOwotICBncHJfZnJlZShwLT5rZXkuc3RyKTsKLSAgZ3ByX2ZyZWUocC0+dmFsdWUuc3RyKTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9wYXJzZShncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJlZywgY29uc3QgdWludDhfdCAqZW5kKSB7Ci0gIC8qIFRPRE8oY3RpbGxlcik6IGxpbWl0IHRoZSBkaXN0YW5jZSBvZiBlbmQgZnJvbSBiZWcsIGFuZCBwZXJmb3JtIG11bHRpcGxlCi0gICAgIHN0ZXBzIGluIHRoZSBldmVudCBvZiBhIGxhcmdlIGNodW5rIG9mIGRhdGEgdG8gbGltaXQKLSAgICAgc3RhY2sgc3BhY2UgdXNhZ2Ugd2hlbiBubyB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIGlzCi0gICAgIGF2YWlsYWJsZSAqLwotICByZXR1cm4gcC0+c3RhdGUocCwgYmVnLCBlbmQpOwotfQotCi1ncnBjX2NodHRwMl9wYXJzZV9lcnJvciBncnBjX2NodHRwMl9oZWFkZXJfcGFyc2VyX3BhcnNlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpocGFja19wYXJzZXIsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgewotICBncnBjX2NodHRwMl9ocGFja19wYXJzZXIgKnBhcnNlciA9IGhwYWNrX3BhcnNlcjsKLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UiLCAwKTsKLSAgaWYgKCFncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UocGFyc2VyLCBHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0VORF9QVFIoc2xpY2UpKSkgewotICAgIEdQUl9USU1FUl9FTkQoImdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9wYXJzZSIsIDApOwotICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOwotICB9Ci0gIGlmIChpc19sYXN0KSB7Ci0gICAgaWYgKHBhcnNlci0+aXNfYm91bmRhcnkgJiYgcGFyc2VyLT5zdGF0ZSAhPSBwYXJzZV9iZWdpbikgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgICAgICJlbmQgb2YgaGVhZGVyIGZyYW1lIG5vdCBhbGlnbmVkIHdpdGggYSBocGFjayByZWNvcmQgYm91bmRhcnkiKTsKLSAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9wYXJzZSIsIDApOwotICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0NPTk5FQ1RJT05fRVJST1I7Ci0gICAgfQotICAgIC8qIG5lZWQgdG8gY2hlY2sgZm9yIG51bGwgc3RyZWFtOiB0aGlzIGNhbiBvY2N1ciBpZiB3ZSByZWNlaXZlIGFuIGludmFsaWQKLSAgICAgICBzdHJlYW0gaWQgb24gYSBoZWFkZXIgKi8KLSAgICBpZiAoc3RyZWFtX3BhcnNpbmcgIT0gTlVMTCkgewotICAgICAgaWYgKHBhcnNlci0+aXNfYm91bmRhcnkpIHsKLSAgICAgICAgc3RyZWFtX3BhcnNpbmcKLSAgICAgICAgICAgIC0+Z290X21ldGFkYXRhX29uX3BhcnNlW3N0cmVhbV9wYXJzaW5nLT5oZWFkZXJfZnJhbWVzX3JlY2VpdmVkXSA9IDE7Ci0gICAgICAgIHN0cmVhbV9wYXJzaW5nLT5oZWFkZXJfZnJhbWVzX3JlY2VpdmVkKys7Ci0gICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmcpOwotICAgICAgfQotICAgICAgaWYgKHBhcnNlci0+aXNfZW9mKSB7Ci0gICAgICAgIHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9jbG9zZSA9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIHBhcnNlci0+b25faGVhZGVyID0gb25faGVhZGVyX25vdF9zZXQ7Ci0gICAgcGFyc2VyLT5vbl9oZWFkZXJfdXNlcl9kYXRhID0gTlVMTDsKLSAgICBwYXJzZXItPmlzX2JvdW5kYXJ5ID0gMHhkZTsKLSAgICBwYXJzZXItPmlzX2VvZiA9IDB4ZGU7Ci0gICAgcGFyc2VyLT5keW5hbWljX3RhYmxlX3VwZGF0ZV9hbGxvd2VkID0gMjsKLSAgfQotICBHUFJfVElNRVJfRU5EKCJncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UiLCAwKTsKLSAgcmV0dXJuIEdSUENfQ0hUVFAyX1BBUlNFX09LOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNmQxMzYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0hQQUNLX1BBUlNFUl9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0hQQUNLX1BBUlNFUl9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9wb3J0X3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgotCi10eXBlZGVmIHN0cnVjdCBncnBjX2NodHRwMl9ocGFja19wYXJzZXIgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyOwotCi10eXBlZGVmIGludCAoKmdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdGF0ZSkoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICplbmQpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKnN0cjsKLSAgdWludDMyX3QgbGVuZ3RoOwotICB1aW50MzJfdCBjYXBhY2l0eTsKLX0gZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0cmluZzsKLQotc3RydWN0IGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciB7Ci0gIC8qIHVzZXIgc3BlY2lmaWVkIGNhbGxiYWNrIGZvciBlYWNoIGhlYWRlciBvdXRwdXQgKi8KLSAgdm9pZCAoKm9uX2hlYWRlcikodm9pZCAqdXNlcl9kYXRhLCBncnBjX21kZWxlbSAqbWQpOwotICB2b2lkICpvbl9oZWFkZXJfdXNlcl9kYXRhOwotCi0gIC8qIGN1cnJlbnQgcGFyc2Ugc3RhdGUgLSBvciBhIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBpdCAqLwotICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RhdGUgc3RhdGU7Ci0gIC8qIGZ1dHVyZSBzdGF0ZXMgZGVwZW5kZW50IG9uIHRoZSBvcGVuaW5nIG9wIGNvZGUgKi8KLSAgY29uc3QgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlICpuZXh0X3N0YXRlOwotICAvKiB3aGF0IHRvIGRvIGFmdGVyIHNraXBwaW5nIHByaW9yaXRpemF0aW9uIGRhdGEgKi8KLSAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0YXRlIGFmdGVyX3ByaW9yaXRpemF0aW9uOwotICAvKiB0aGUgdmFsdWUgd2UncmUgY3VycmVudGx5IHBhcnNpbmcgKi8KLSAgdW5pb24gewotICAgIHVpbnQzMl90ICp2YWx1ZTsKLSAgICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc3RyaW5nICpzdHI7Ci0gIH0gcGFyc2luZzsKLSAgLyogc3RyaW5nIHBhcmFtZXRlcnMgZm9yIGVhY2ggY2h1bmsgKi8KLSAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3N0cmluZyBrZXk7Ci0gIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9zdHJpbmcgdmFsdWU7Ci0gIC8qIHBhcnNlZCBpbmRleCAqLwotICB1aW50MzJfdCBpbmRleDsKLSAgLyogbGVuZ3RoIG9mIHNvdXJjZSBieXRlcyBmb3IgdGhlIGN1cnJlbnRseSBwYXJzaW5nIHN0cmluZyAqLwotICB1aW50MzJfdCBzdHJsZW47Ci0gIC8qIG51bWJlciBvZiBzb3VyY2UgYnl0ZXMgcmVhZCBmb3IgdGhlIGN1cnJlbnRseSBwYXJzaW5nIHN0cmluZyAqLwotICB1aW50MzJfdCBzdHJnb3Q7Ci0gIC8qIGh1ZmZtYW4gZGVjb2Rpbmcgc3RhdGUgKi8KLSAgaW50MTZfdCBodWZmX3N0YXRlOwotICAvKiBpcyB0aGUgc3RyaW5nIGJlaW5nIGRlY29kZWQgYmluYXJ5PyAqLwotICB1aW50OF90IGJpbmFyeTsKLSAgLyogaXMgdGhlIGN1cnJlbnQgc3RyaW5nIGh1ZmZtYW4gZW5jb2RlZD8gKi8KLSAgdWludDhfdCBodWZmOwotICAvKiBpcyBhIGR5bmFtaWMgdGFibGUgdXBkYXRlIGFsbG93ZWQ/ICovCi0gIHVpbnQ4X3QgZHluYW1pY190YWJsZV91cGRhdGVfYWxsb3dlZDsKLSAgLyogc2V0IGJ5IGhpZ2hlciBsYXllcnMsIHVzZWQgYnkgZ3JwY19jaHR0cDJfaGVhZGVyX3BhcnNlcl9wYXJzZSB0byBzaWduYWwKLSAgICAgaXQgc2hvdWxkIGFwcGVuZCBhIG1ldGFkYXRhIGJvdW5kYXJ5IGF0IHRoZSBlbmQgb2YgZnJhbWUgKi8KLSAgdWludDhfdCBpc19ib3VuZGFyeTsKLSAgdWludDhfdCBpc19lb2Y7Ci0gIHVpbnQzMl90IGJhc2U2NF9idWZmZXI7Ci0KLSAgLyogaHBhY2sgdGFibGUgKi8KLSAgZ3JwY19jaHR0cDJfaHB0YmwgdGFibGU7Ci19OwotCi12b2lkIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9pbml0KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCk7Ci12b2lkIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9kZXN0cm95KGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciAqcCk7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3NldF9oYXNfcHJpb3JpdHkoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwKTsKLQotLyogcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IgKi8KLWludCBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfcGFyc2UoZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiZWcsIGNvbnN0IHVpbnQ4X3QgKmVuZCk7Ci0KLS8qIHdyYXBzIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9wYXJzZSB0byBwcm92aWRlIGEgZnJhbWUgbGV2ZWwgcGFyc2VyIGZvcgotICAgdGhlIHRyYW5zcG9ydCAqLwotZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgZ3JwY19jaHR0cDJfaGVhZGVyX3BhcnNlcl9wYXJzZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqaHBhY2tfcGFyc2VyLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfSFBBQ0tfUEFSU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjZTNiOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKLQotc3RhdGljIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKmtleTsKLSAgY29uc3QgY2hhciAqdmFsdWU7Ci19IHN0YXRpY190YWJsZVtdID0gewotICAgIC8qIDA6ICovCi0gICAge05VTEwsIE5VTEx9LAotICAgIC8qIDE6ICovCi0gICAgeyI6YXV0aG9yaXR5IiwgIiJ9LAotICAgIC8qIDI6ICovCi0gICAgeyI6bWV0aG9kIiwgIkdFVCJ9LAotICAgIC8qIDM6ICovCi0gICAgeyI6bWV0aG9kIiwgIlBPU1QifSwKLSAgICAvKiA0OiAqLwotICAgIHsiOnBhdGgiLCAiLyJ9LAotICAgIC8qIDU6ICovCi0gICAgeyI6cGF0aCIsICIvaW5kZXguaHRtbCJ9LAotICAgIC8qIDY6ICovCi0gICAgeyI6c2NoZW1lIiwgImh0dHAifSwKLSAgICAvKiA3OiAqLwotICAgIHsiOnNjaGVtZSIsICJodHRwcyJ9LAotICAgIC8qIDg6ICovCi0gICAgeyI6c3RhdHVzIiwgIjIwMCJ9LAotICAgIC8qIDk6ICovCi0gICAgeyI6c3RhdHVzIiwgIjIwNCJ9LAotICAgIC8qIDEwOiAqLwotICAgIHsiOnN0YXR1cyIsICIyMDYifSwKLSAgICAvKiAxMTogKi8KLSAgICB7IjpzdGF0dXMiLCAiMzA0In0sCi0gICAgLyogMTI6ICovCi0gICAgeyI6c3RhdHVzIiwgIjQwMCJ9LAotICAgIC8qIDEzOiAqLwotICAgIHsiOnN0YXR1cyIsICI0MDQifSwKLSAgICAvKiAxNDogKi8KLSAgICB7IjpzdGF0dXMiLCAiNTAwIn0sCi0gICAgLyogMTU6ICovCi0gICAgeyJhY2NlcHQtY2hhcnNldCIsICIifSwKLSAgICAvKiAxNjogKi8KLSAgICB7ImFjY2VwdC1lbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIn0sCi0gICAgLyogMTc6ICovCi0gICAgeyJhY2NlcHQtbGFuZ3VhZ2UiLCAiIn0sCi0gICAgLyogMTg6ICovCi0gICAgeyJhY2NlcHQtcmFuZ2VzIiwgIiJ9LAotICAgIC8qIDE5OiAqLwotICAgIHsiYWNjZXB0IiwgIiJ9LAotICAgIC8qIDIwOiAqLwotICAgIHsiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luIiwgIiJ9LAotICAgIC8qIDIxOiAqLwotICAgIHsiYWdlIiwgIiJ9LAotICAgIC8qIDIyOiAqLwotICAgIHsiYWxsb3ciLCAiIn0sCi0gICAgLyogMjM6ICovCi0gICAgeyJhdXRob3JpemF0aW9uIiwgIiJ9LAotICAgIC8qIDI0OiAqLwotICAgIHsiY2FjaGUtY29udHJvbCIsICIifSwKLSAgICAvKiAyNTogKi8KLSAgICB7ImNvbnRlbnQtZGlzcG9zaXRpb24iLCAiIn0sCi0gICAgLyogMjY6ICovCi0gICAgeyJjb250ZW50LWVuY29kaW5nIiwgIiJ9LAotICAgIC8qIDI3OiAqLwotICAgIHsiY29udGVudC1sYW5ndWFnZSIsICIifSwKLSAgICAvKiAyODogKi8KLSAgICB7ImNvbnRlbnQtbGVuZ3RoIiwgIiJ9LAotICAgIC8qIDI5OiAqLwotICAgIHsiY29udGVudC1sb2NhdGlvbiIsICIifSwKLSAgICAvKiAzMDogKi8KLSAgICB7ImNvbnRlbnQtcmFuZ2UiLCAiIn0sCi0gICAgLyogMzE6ICovCi0gICAgeyJjb250ZW50LXR5cGUiLCAiIn0sCi0gICAgLyogMzI6ICovCi0gICAgeyJjb29raWUiLCAiIn0sCi0gICAgLyogMzM6ICovCi0gICAgeyJkYXRlIiwgIiJ9LAotICAgIC8qIDM0OiAqLwotICAgIHsiZXRhZyIsICIifSwKLSAgICAvKiAzNTogKi8KLSAgICB7ImV4cGVjdCIsICIifSwKLSAgICAvKiAzNjogKi8KLSAgICB7ImV4cGlyZXMiLCAiIn0sCi0gICAgLyogMzc6ICovCi0gICAgeyJmcm9tIiwgIiJ9LAotICAgIC8qIDM4OiAqLwotICAgIHsiaG9zdCIsICIifSwKLSAgICAvKiAzOTogKi8KLSAgICB7ImlmLW1hdGNoIiwgIiJ9LAotICAgIC8qIDQwOiAqLwotICAgIHsiaWYtbW9kaWZpZWQtc2luY2UiLCAiIn0sCi0gICAgLyogNDE6ICovCi0gICAgeyJpZi1ub25lLW1hdGNoIiwgIiJ9LAotICAgIC8qIDQyOiAqLwotICAgIHsiaWYtcmFuZ2UiLCAiIn0sCi0gICAgLyogNDM6ICovCi0gICAgeyJpZi11bm1vZGlmaWVkLXNpbmNlIiwgIiJ9LAotICAgIC8qIDQ0OiAqLwotICAgIHsibGFzdC1tb2RpZmllZCIsICIifSwKLSAgICAvKiA0NTogKi8KLSAgICB7ImxpbmsiLCAiIn0sCi0gICAgLyogNDY6ICovCi0gICAgeyJsb2NhdGlvbiIsICIifSwKLSAgICAvKiA0NzogKi8KLSAgICB7Im1heC1mb3J3YXJkcyIsICIifSwKLSAgICAvKiA0ODogKi8KLSAgICB7InByb3h5LWF1dGhlbnRpY2F0ZSIsICIifSwKLSAgICAvKiA0OTogKi8KLSAgICB7InByb3h5LWF1dGhvcml6YXRpb24iLCAiIn0sCi0gICAgLyogNTA6ICovCi0gICAgeyJyYW5nZSIsICIifSwKLSAgICAvKiA1MTogKi8KLSAgICB7InJlZmVyZXIiLCAiIn0sCi0gICAgLyogNTI6ICovCi0gICAgeyJyZWZyZXNoIiwgIiJ9LAotICAgIC8qIDUzOiAqLwotICAgIHsicmV0cnktYWZ0ZXIiLCAiIn0sCi0gICAgLyogNTQ6ICovCi0gICAgeyJzZXJ2ZXIiLCAiIn0sCi0gICAgLyogNTU6ICovCi0gICAgeyJzZXQtY29va2llIiwgIiJ9LAotICAgIC8qIDU2OiAqLwotICAgIHsic3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eSIsICIifSwKLSAgICAvKiA1NzogKi8KLSAgICB7InRyYW5zZmVyLWVuY29kaW5nIiwgIiJ9LAotICAgIC8qIDU4OiAqLwotICAgIHsidXNlci1hZ2VudCIsICIifSwKLSAgICAvKiA1OTogKi8KLSAgICB7InZhcnkiLCAiIn0sCi0gICAgLyogNjA6ICovCi0gICAgeyJ2aWEiLCAiIn0sCi0gICAgLyogNjE6ICovCi0gICAgeyJ3d3ctYXV0aGVudGljYXRlIiwgIiJ9LAotfTsKLQotc3RhdGljIHVpbnQzMl90IGVudHJpZXNfZm9yX2J5dGVzKHVpbnQzMl90IGJ5dGVzKSB7Ci0gIHJldHVybiAoYnl0ZXMgKyBHUlBDX0NIVFRQMl9IUEFDS19FTlRSWV9PVkVSSEVBRCAtIDEpIC8KLSAgICAgICAgIEdSUENfQ0hUVFAyX0hQQUNLX0VOVFJZX09WRVJIRUFEOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2hwdGJsX2luaXQoZ3JwY19jaHR0cDJfaHB0YmwgKnRibCkgewotICBzaXplX3QgaTsKLQotICBtZW1zZXQodGJsLCAwLCBzaXplb2YoKnRibCkpOwotICB0YmwtPmN1cnJlbnRfdGFibGVfYnl0ZXMgPSB0YmwtPm1heF9ieXRlcyA9Ci0gICAgICBHUlBDX0NIVFRQMl9JTklUSUFMX0hQQUNLX1RBQkxFX1NJWkU7Ci0gIHRibC0+bWF4X2VudHJpZXMgPSB0YmwtPmNhcF9lbnRyaWVzID0KLSAgICAgIGVudHJpZXNfZm9yX2J5dGVzKHRibC0+Y3VycmVudF90YWJsZV9ieXRlcyk7Ci0gIHRibC0+ZW50cyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCp0YmwtPmVudHMpICogdGJsLT5jYXBfZW50cmllcyk7Ci0gIG1lbXNldCh0YmwtPmVudHMsIDAsIHNpemVvZigqdGJsLT5lbnRzKSAqIHRibC0+Y2FwX2VudHJpZXMpOwotICBmb3IgKGkgPSAxOyBpIDw9IEdSUENfQ0hUVFAyX0xBU1RfU1RBVElDX0VOVFJZOyBpKyspIHsKLSAgICB0YmwtPnN0YXRpY19lbnRzW2kgLSAxXSA9Ci0gICAgICAgIGdycGNfbWRlbGVtX2Zyb21fc3RyaW5ncyhzdGF0aWNfdGFibGVbaV0ua2V5LCBzdGF0aWNfdGFibGVbaV0udmFsdWUpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaHB0YmxfZGVzdHJveShncnBjX2NodHRwMl9ocHRibCAqdGJsKSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19DSFRUUDJfTEFTVF9TVEFUSUNfRU5UUlk7IGkrKykgewotICAgIEdSUENfTURFTEVNX1VOUkVGKHRibC0+c3RhdGljX2VudHNbaV0pOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCB0YmwtPm51bV9lbnRzOyBpKyspIHsKLSAgICBHUlBDX01ERUxFTV9VTlJFRih0YmwtPmVudHNbKHRibC0+Zmlyc3RfZW50ICsgaSkgJSB0YmwtPmNhcF9lbnRyaWVzXSk7Ci0gIH0KLSAgZ3ByX2ZyZWUodGJsLT5lbnRzKTsKLX0KLQotZ3JwY19tZGVsZW0gKmdycGNfY2h0dHAyX2hwdGJsX2xvb2t1cChjb25zdCBncnBjX2NodHRwMl9ocHRibCAqdGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YmxfaW5kZXgpIHsKLSAgLyogU3RhdGljIHRhYmxlIGNvbWVzIGZpcnN0LCBqdXN0IHJldHVybiBhbiBlbnRyeSBmcm9tIGl0ICovCi0gIGlmICh0YmxfaW5kZXggPD0gR1JQQ19DSFRUUDJfTEFTVF9TVEFUSUNfRU5UUlkpIHsKLSAgICByZXR1cm4gdGJsLT5zdGF0aWNfZW50c1t0YmxfaW5kZXggLSAxXTsKLSAgfQotICAvKiBPdGhlcndpc2UsIGZpbmQgdGhlIHZhbHVlIGluIHRoZSBsaXN0IG9mIHZhbGlkIGVudHJpZXMgKi8KLSAgdGJsX2luZGV4IC09IChHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWSArIDEpOwotICBpZiAodGJsX2luZGV4IDwgdGJsLT5udW1fZW50cykgewotICAgIHVpbnQzMl90IG9mZnNldCA9Ci0gICAgICAgICh0YmwtPm51bV9lbnRzIC0gMXUgLSB0YmxfaW5kZXggKyB0YmwtPmZpcnN0X2VudCkgJSB0YmwtPmNhcF9lbnRyaWVzOwotICAgIHJldHVybiB0YmwtPmVudHNbb2Zmc2V0XTsKLSAgfQotICAvKiBJbnZhbGlkIGVudHJ5OiByZXR1cm4gZXJyb3IgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEV2aWN0IG9uZSBlbGVtZW50IGZyb20gdGhlIHRhYmxlICovCi1zdGF0aWMgdm9pZCBldmljdDEoZ3JwY19jaHR0cDJfaHB0YmwgKnRibCkgewotICBncnBjX21kZWxlbSAqZmlyc3RfZW50ID0gdGJsLT5lbnRzW3RibC0+Zmlyc3RfZW50XTsKLSAgc2l6ZV90IGVsZW1fYnl0ZXMgPSBHUFJfU0xJQ0VfTEVOR1RIKGZpcnN0X2VudC0+a2V5LT5zbGljZSkgKwotICAgICAgICAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoZmlyc3RfZW50LT52YWx1ZS0+c2xpY2UpICsKLSAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9IUEFDS19FTlRSWV9PVkVSSEVBRDsKLSAgR1BSX0FTU0VSVChlbGVtX2J5dGVzIDw9IHRibC0+bWVtX3VzZWQpOwotICB0YmwtPm1lbV91c2VkIC09ICh1aW50MzJfdCllbGVtX2J5dGVzOwotICB0YmwtPmZpcnN0X2VudCA9ICgodGJsLT5maXJzdF9lbnQgKyAxKSAlIHRibC0+Y2FwX2VudHJpZXMpOwotICB0YmwtPm51bV9lbnRzLS07Ci0gIEdSUENfTURFTEVNX1VOUkVGKGZpcnN0X2VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYnVpbGRfZW50cyhncnBjX2NodHRwMl9ocHRibCAqdGJsLCB1aW50MzJfdCBuZXdfY2FwKSB7Ci0gIGdycGNfbWRlbGVtICoqZW50cyA9IGdwcl9tYWxsb2Moc2l6ZW9mKCplbnRzKSAqIG5ld19jYXApOwotICB1aW50MzJfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0YmwtPm51bV9lbnRzOyBpKyspIHsKLSAgICBlbnRzW2ldID0gdGJsLT5lbnRzWyh0YmwtPmZpcnN0X2VudCArIGkpICUgdGJsLT5jYXBfZW50cmllc107Ci0gIH0KLSAgZ3ByX2ZyZWUodGJsLT5lbnRzKTsKLSAgdGJsLT5lbnRzID0gZW50czsKLSAgdGJsLT5jYXBfZW50cmllcyA9IG5ld19jYXA7Ci0gIHRibC0+Zmlyc3RfZW50ID0gMDsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9ocHRibF9zZXRfbWF4X2J5dGVzKGdycGNfY2h0dHAyX2hwdGJsICp0YmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2J5dGVzKSB7Ci0gIGlmICh0YmwtPm1heF9ieXRlcyA9PSBtYXhfYnl0ZXMpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgZ3ByX2xvZyhHUFJfREVCVUcsICJVcGRhdGUgaHBhY2sgcGFyc2VyIG1heCBzaXplIHRvICVkIiwgbWF4X2J5dGVzKTsKLSAgd2hpbGUgKHRibC0+bWVtX3VzZWQgPiBtYXhfYnl0ZXMpIHsKLSAgICBldmljdDEodGJsKTsKLSAgfQotICB0YmwtPm1heF9ieXRlcyA9IG1heF9ieXRlczsKLX0KLQotaW50IGdycGNfY2h0dHAyX2hwdGJsX3NldF9jdXJyZW50X3RhYmxlX3NpemUoZ3JwY19jaHR0cDJfaHB0YmwgKnRibCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzKSB7Ci0gIGlmICh0YmwtPmN1cnJlbnRfdGFibGVfYnl0ZXMgPT0gYnl0ZXMpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAoYnl0ZXMgPiB0YmwtPm1heF9ieXRlcykgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgIkF0dGVtcHQgdG8gbWFrZSBocGFjayB0YWJsZSAlZCBieXRlcyB3aGVuIG1heCBpcyAlZCBieXRlcyIsIGJ5dGVzLAotICAgICAgICAgICAgdGJsLT5tYXhfYnl0ZXMpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGdwcl9sb2coR1BSX0RFQlVHLCAiVXBkYXRlIGhwYWNrIHBhcnNlciB0YWJsZSBzaXplIHRvICVkIiwgYnl0ZXMpOwotICB3aGlsZSAodGJsLT5tZW1fdXNlZCA+IGJ5dGVzKSB7Ci0gICAgZXZpY3QxKHRibCk7Ci0gIH0KLSAgdGJsLT5jdXJyZW50X3RhYmxlX2J5dGVzID0gYnl0ZXM7Ci0gIHRibC0+bWF4X2VudHJpZXMgPSBlbnRyaWVzX2Zvcl9ieXRlcyhieXRlcyk7Ci0gIGlmICh0YmwtPm1heF9lbnRyaWVzID4gdGJsLT5jYXBfZW50cmllcykgewotICAgIHJlYnVpbGRfZW50cyh0YmwsIEdQUl9NQVgodGJsLT5tYXhfZW50cmllcywgMiAqIHRibC0+Y2FwX2VudHJpZXMpKTsKLSAgfSBlbHNlIGlmICh0YmwtPm1heF9lbnRyaWVzIDwgdGJsLT5jYXBfZW50cmllcyAvIDMpIHsKLSAgICB1aW50MzJfdCBuZXdfY2FwID0gR1BSX01BWCh0YmwtPm1heF9lbnRyaWVzLCAxNnUpOwotICAgIGlmIChuZXdfY2FwICE9IHRibC0+Y2FwX2VudHJpZXMpIHsKLSAgICAgIHJlYnVpbGRfZW50cyh0YmwsIG5ld19jYXApOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2hwdGJsX2FkZChncnBjX2NodHRwMl9ocHRibCAqdGJsLCBncnBjX21kZWxlbSAqbWQpIHsKLSAgLyogZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIG9mIGJ1ZmZlciB0aGlzIGVudHJ5IHJlcHJlc2VudHMgKi8KLSAgc2l6ZV90IGVsZW1fYnl0ZXMgPSBHUFJfU0xJQ0VfTEVOR1RIKG1kLT5rZXktPnNsaWNlKSArCi0gICAgICAgICAgICAgICAgICAgICAgR1BSX1NMSUNFX0xFTkdUSChtZC0+dmFsdWUtPnNsaWNlKSArCi0gICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfSFBBQ0tfRU5UUllfT1ZFUkhFQUQ7Ci0KLSAgaWYgKHRibC0+Y3VycmVudF90YWJsZV9ieXRlcyA+IHRibC0+bWF4X2J5dGVzKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgICAiSFBBQ0sgbWF4IHRhYmxlIHNpemUgcmVkdWNlZCB0byAlZCBidXQgbm90IHJlZmxlY3RlZCBieSBocGFjayAiCi0gICAgICAgICAgICAic3RyZWFtIChzdGlsbCBhdCAlZCkiLAotICAgICAgICAgICAgdGJsLT5tYXhfYnl0ZXMsIHRibC0+Y3VycmVudF90YWJsZV9ieXRlcyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiB3ZSBjYW4ndCBhZGQgZWxlbWVudHMgYmlnZ2VyIHRoYW4gdGhlIG1heCB0YWJsZSBzaXplICovCi0gIGlmIChlbGVtX2J5dGVzID4gdGJsLT5jdXJyZW50X3RhYmxlX2J5dGVzKSB7Ci0gICAgLyogSFBBQ0sgZHJhZnQgMTAgc2VjdGlvbiA0LjQgc3RhdGVzOgotICAgICAqIElmIHRoZSBzaXplIG9mIHRoZSBuZXcgZW50cnkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtYXhpbXVtCi0gICAgICogc2l6ZSwgdGhhdCBlbnRyeSBpcyBhZGRlZCB0byB0aGUgdGFibGUuICBJdCBpcyBub3QgYW4gZXJyb3IgdG8KLSAgICAgKiBhdHRlbXB0IHRvIGFkZCBhbiBlbnRyeSB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHNpemU7IGFuCi0gICAgICogYXR0ZW1wdCB0byBhZGQgYW4gZW50cnkgbGFyZ2VyIHRoYW4gdGhlIGVudGlyZSB0YWJsZSBjYXVzZXMKLSAgICAgKiB0aGUgdGFibGUKLSAgICAgKiB0byBiZSBlbXB0aWVkIG9mIGFsbCBleGlzdGluZyBlbnRyaWVzLCBhbmQgcmVzdWx0cyBpbiBhbgotICAgICAqIGVtcHR5IHRhYmxlLgotICAgICAqLwotICAgIHdoaWxlICh0YmwtPm51bV9lbnRzKSB7Ci0gICAgICBldmljdDEodGJsKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBldmljdCBlbnRyaWVzIHRvIGVuc3VyZSBubyBvdmVyZmxvdyAqLwotICB3aGlsZSAoZWxlbV9ieXRlcyA+IChzaXplX3QpdGJsLT5jdXJyZW50X3RhYmxlX2J5dGVzIC0gdGJsLT5tZW1fdXNlZCkgewotICAgIGV2aWN0MSh0YmwpOwotICB9Ci0KLSAgLyogY29weSB0aGUgZmluYWxpemVkIGVudHJ5IGluICovCi0gIHRibC0+ZW50c1sodGJsLT5maXJzdF9lbnQgKyB0YmwtPm51bV9lbnRzKSAlIHRibC0+Y2FwX2VudHJpZXNdID0KLSAgICAgIEdSUENfTURFTEVNX1JFRihtZCk7Ci0KLSAgLyogdXBkYXRlIGFjY291bnRpbmcgdmFsdWVzICovCi0gIHRibC0+bnVtX2VudHMrKzsKLSAgdGJsLT5tZW1fdXNlZCArPSAodWludDMyX3QpZWxlbV9ieXRlczsKLSAgcmV0dXJuIDE7Ci19Ci0KLWdycGNfY2h0dHAyX2hwdGJsX2ZpbmRfcmVzdWx0IGdycGNfY2h0dHAyX2hwdGJsX2ZpbmQoCi0gICAgY29uc3QgZ3JwY19jaHR0cDJfaHB0YmwgKnRibCwgZ3JwY19tZGVsZW0gKm1kKSB7Ci0gIGdycGNfY2h0dHAyX2hwdGJsX2ZpbmRfcmVzdWx0IHIgPSB7MCwgMH07Ci0gIHVpbnQzMl90IGk7Ci0KLSAgLyogU2VlIGlmIHRoZSBzdHJpbmcgaXMgaW4gdGhlIHN0YXRpYyB0YWJsZSAqLwotICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19DSFRUUDJfTEFTVF9TVEFUSUNfRU5UUlk7IGkrKykgewotICAgIGdycGNfbWRlbGVtICplbnQgPSB0YmwtPnN0YXRpY19lbnRzW2ldOwotICAgIGlmIChtZC0+a2V5ICE9IGVudC0+a2V5KSBjb250aW51ZTsKLSAgICByLmluZGV4ID0gaSArIDF1OwotICAgIHIuaGFzX3ZhbHVlID0gbWQtPnZhbHVlID09IGVudC0+dmFsdWU7Ci0gICAgaWYgKHIuaGFzX3ZhbHVlKSByZXR1cm4gcjsKLSAgfQotCi0gIC8qIFNjYW4gdGhlIGR5bmFtaWMgdGFibGUgKi8KLSAgZm9yIChpID0gMDsgaSA8IHRibC0+bnVtX2VudHM7IGkrKykgewotICAgIHVpbnQzMl90IGlkeCA9Ci0gICAgICAgICh1aW50MzJfdCkodGJsLT5udW1fZW50cyAtIGkgKyBHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWSk7Ci0gICAgZ3JwY19tZGVsZW0gKmVudCA9IHRibC0+ZW50c1sodGJsLT5maXJzdF9lbnQgKyBpKSAlIHRibC0+Y2FwX2VudHJpZXNdOwotICAgIGlmIChtZC0+a2V5ICE9IGVudC0+a2V5KSBjb250aW51ZTsKLSAgICByLmluZGV4ID0gaWR4OwotICAgIHIuaGFzX3ZhbHVlID0gbWQtPnZhbHVlID09IGVudC0+dmFsdWU7Ci0gICAgaWYgKHIuaGFzX3ZhbHVlKSByZXR1cm4gcjsKLSAgfQotCi0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg0Y2EzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0hQQUNLX1RBQkxFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfSFBBQ0tfVEFCTEVfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCIKLQotLyogSFBBQ0sgaGVhZGVyIHRhYmxlICovCi0KLS8qIGxhc3QgaW5kZXggaW4gdGhlIHN0YXRpYyB0YWJsZSAqLwotI2RlZmluZSBHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWSA2MQotCi0vKiBJbml0aWFsIHRhYmxlIHNpemUgYXMgcGVyIHRoZSBzcGVjICovCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0lOSVRJQUxfSFBBQ0tfVEFCTEVfU0laRSA0MDk2Ci0vKiBNYXhpbXVtIHRhYmxlIHNpemUgdGhhdCB3ZSdsbCB1c2UgKi8KLSNkZWZpbmUgR1JQQ19DSFRUUDJfTUFYX0hQQUNLX1RBQkxFX1NJWkUgR1JQQ19DSFRUUDJfSU5JVElBTF9IUEFDS19UQUJMRV9TSVpFCi0vKiBQZXIgZW50cnkgb3ZlcmhlYWQgYnl0ZXMgYXMgcGVyIHRoZSBzcGVjICovCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0hQQUNLX0VOVFJZX09WRVJIRUFEIDMyCi0jaWYgMAotLyogTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB3ZSBjb3VsZCBwb3NzaWJseSBmaXQgaW4gdGhlIHRhYmxlLCBnaXZlbiBkZWZpbmVkCi0gICBvdmVyaGVhZHMgKi8KLSNkZWZpbmUgR1JQQ19DSFRUUDJfTUFYX1RBQkxFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoR1JQQ19DSFRUUDJfTUFYX0hQQUNLX1RBQkxFX1NJWkUgKyBHUlBDX0NIVFRQMl9IUEFDS19FTlRSWV9PVkVSSEVBRCAtIDEpIC8gXAotICAgR1JQQ19DSFRUUDJfSFBBQ0tfRU5UUllfT1ZFUkhFQUQpCi0jZW5kaWYKLQotLyogaHBhY2sgZGVjb2RlciB0YWJsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiB0aGUgZmlyc3QgdXNlZCBlbnRyeSBpbiBlbnRzICovCi0gIHVpbnQzMl90IGZpcnN0X2VudDsKLSAgLyogaG93IG1hbnkgZW50cmllcyBhcmUgaW4gdGhlIHRhYmxlICovCi0gIHVpbnQzMl90IG51bV9lbnRzOwotICAvKiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSB0YWJsZSwgYWNjb3JkaW5nIHRvIHRoZSBocGFjayBhbGdvcml0aG0gKi8KLSAgdWludDMyX3QgbWVtX3VzZWQ7Ci0gIC8qIHRoZSBtYXggbWVtb3J5IGFsbG93ZWQgdG8gYmUgdXNlZCBieSB0aGUgdGFibGUsIGFjY29yZGluZyB0byB0aGUgaHBhY2sKLSAgICAgYWxnb3JpdGhtICovCi0gIHVpbnQzMl90IG1heF9ieXRlczsKLSAgLyogdGhlIGN1cnJlbnRseSBhZ3JlZWQgc2l6ZSBvZiB0aGUgdGFibGUsIGFjY29yZGluZyB0byB0aGUgaHBhY2sgYWxnb3JpdGhtICovCi0gIHVpbnQzMl90IGN1cnJlbnRfdGFibGVfYnl0ZXM7Ci0gIC8qIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgd2UgY291bGQgcG9zc2libHkgZml0IGluIHRoZSB0YWJsZSwgZ2l2ZW4gZGVmaW5lZAotICAgICBvdmVyaGVhZHMgKi8KLSAgdWludDMyX3QgbWF4X2VudHJpZXM7Ci0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBpbiBlbnRzICovCi0gIHVpbnQzMl90IGNhcF9lbnRyaWVzOwotICAvKiBhIGNpcmN1bGFyIGJ1ZmZlciBvZiBoZWFkZXJzIC0gdGhpcyBpcyBzdG9yZWQgaW4gdGhlIG9wcG9zaXRlIG9yZGVyIHRvCi0gICAgIHdoYXQgaHBhY2sgc3BlY2lmaWVzLCBpbiBvcmRlciB0byBzaW1wbGlmeSB0YWJsZSBtYW5hZ2VtZW50IGEgbGl0dGxlLi4uCi0gICAgIG1lYW5pbmcgbG9va3VwcyBuZWVkIHRvIFNVQlRSQUNUIGZyb20gdGhlIGVuZCBwb3NpdGlvbiAqLwotICBncnBjX21kZWxlbSAqKmVudHM7Ci0gIGdycGNfbWRlbGVtICpzdGF0aWNfZW50c1tHUlBDX0NIVFRQMl9MQVNUX1NUQVRJQ19FTlRSWV07Ci19IGdycGNfY2h0dHAyX2hwdGJsOwotCi0vKiBpbml0aWFsaXplIGEgaHBhY2sgdGFibGUgKi8KLXZvaWQgZ3JwY19jaHR0cDJfaHB0YmxfaW5pdChncnBjX2NodHRwMl9ocHRibCAqdGJsKTsKLXZvaWQgZ3JwY19jaHR0cDJfaHB0YmxfZGVzdHJveShncnBjX2NodHRwMl9ocHRibCAqdGJsKTsKLXZvaWQgZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X21heF9ieXRlcyhncnBjX2NodHRwMl9ocHRibCAqdGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heF9ieXRlcyk7Ci1pbnQgZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X2N1cnJlbnRfdGFibGVfc2l6ZShncnBjX2NodHRwMl9ocHRibCAqdGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXMpOwotCi0vKiBsb29rdXAgYSB0YWJsZSBlbnRyeSBiYXNlZCBvbiBpdHMgaHBhY2sgaW5kZXggKi8KLWdycGNfbWRlbGVtICpncnBjX2NodHRwMl9ocHRibF9sb29rdXAoY29uc3QgZ3JwY19jaHR0cDJfaHB0YmwgKnRibCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpOwotLyogYWRkIGEgdGFibGUgZW50cnkgdG8gdGhlIGluZGV4ICovCi1pbnQgZ3JwY19jaHR0cDJfaHB0YmxfYWRkKGdycGNfY2h0dHAyX2hwdGJsICp0YmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRlbGVtICptZCkgR1JQQ19NVVNUX1VTRV9SRVNVTFQ7Ci0vKiBGaW5kIGEga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIHRhYmxlLi4uIHJldHVybnMgdGhlIGluZGV4IGluIHRoZSB0YWJsZSBvZiB0aGUKLSAgIG1vc3Qgc2ltaWxhciBlbnRyeSwgb3IgMCBpZiB0aGUgdmFsdWUgd2FzIG5vdCBmb3VuZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCBpbmRleDsKLSAgaW50IGhhc192YWx1ZTsKLX0gZ3JwY19jaHR0cDJfaHB0YmxfZmluZF9yZXN1bHQ7Ci1ncnBjX2NodHRwMl9ocHRibF9maW5kX3Jlc3VsdCBncnBjX2NodHRwMl9ocHRibF9maW5kKAotICAgIGNvbnN0IGdycGNfY2h0dHAyX2hwdGJsICp0YmwsIGdycGNfbWRlbGVtICptZCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9IUEFDS19UQUJMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MGRmMy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9IVFRQMl9FUlJPUlNfSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9IVFRQMl9FUlJPUlNfSAotCi0vKiBlcnJvciBjb2RlcyBmb3IgUlNUX1NUUkVBTSBmcm9tIGh0dHAyIGRyYWZ0IDE0IHNlY3Rpb24gNyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19DSFRUUDJfTk9fRVJST1IgPSAweDAsCi0gIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SID0gMHgxLAotICBHUlBDX0NIVFRQMl9JTlRFUk5BTF9FUlJPUiA9IDB4MiwKLSAgR1JQQ19DSFRUUDJfRkxPV19DT05UUk9MX0VSUk9SID0gMHgzLAotICBHUlBDX0NIVFRQMl9TRVRUSU5HU19USU1FT1VUID0gMHg0LAotICBHUlBDX0NIVFRQMl9TVFJFQU1fQ0xPU0VEID0gMHg1LAotICBHUlBDX0NIVFRQMl9GUkFNRV9TSVpFX0VSUk9SID0gMHg2LAotICBHUlBDX0NIVFRQMl9SRUZVU0VEX1NUUkVBTSA9IDB4NywKLSAgR1JQQ19DSFRUUDJfQ0FOQ0VMID0gMHg4LAotICBHUlBDX0NIVFRQMl9DT01QUkVTU0lPTl9FUlJPUiA9IDB4OSwKLSAgR1JQQ19DSFRUUDJfQ09OTkVDVF9FUlJPUiA9IDB4YSwKLSAgR1JQQ19DSFRUUDJfRU5IQU5DRV9ZT1VSX0NBTE0gPSAweGIsCi0gIEdSUENfQ0hUVFAyX0lOQURFUVVBVEVfU0VDVVJJVFkgPSAweGMsCi0gIC8qIGZvcmNlIHVzZSBvZiBhIGRlZmF1bHQgY2xhdXNlICovCi0gIEdSUENfQ0hUVFAyX19FUlJPUl9ET19OT1RfVVNFID0gLTEKLX0gZ3JwY19jaHR0cDJfZXJyb3JfY29kZTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0hUVFAyX0VSUk9SU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzg1ZDMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgiCi0KLS8qIENvbnN0YW50cyBwdWxsZWQgZnJvbSB0aGUgSFBBQ0sgc3BlYywgYW5kIGNvbnZlcnRlZCB0byBDIHVzaW5nIHRoZSB2aW0KLSAgIGNvbW1hbmQ6Ci0gICA6JXMvLiogICBcKFswLTlhLWZdXCtcKSAgXFsgKlwoWzAtOV1cK1wpXF0vezB4XDEsIFwyfSwvZyAqLwotY29uc3QgZ3JwY19jaHR0cDJfaHVmZnN5bSBncnBjX2NodHRwMl9odWZmc3ltc1tHUlBDX0NIVFRQMl9OVU1fSFVGRlNZTVNdID0gewotICAgIHsweDFmZjgsIDEzfSwgICAgIHsweDdmZmZkOCwgMjN9LCAgIHsweGZmZmZmZTIsIDI4fSwgIHsweGZmZmZmZTMsIDI4fSwKLSAgICB7MHhmZmZmZmU0LCAyOH0sICB7MHhmZmZmZmU1LCAyOH0sICB7MHhmZmZmZmU2LCAyOH0sICB7MHhmZmZmZmU3LCAyOH0sCi0gICAgezB4ZmZmZmZlOCwgMjh9LCAgezB4ZmZmZmVhLCAyNH0sICAgezB4M2ZmZmZmZmMsIDMwfSwgezB4ZmZmZmZlOSwgMjh9LAotICAgIHsweGZmZmZmZWEsIDI4fSwgIHsweDNmZmZmZmZkLCAzMH0sIHsweGZmZmZmZWIsIDI4fSwgIHsweGZmZmZmZWMsIDI4fSwKLSAgICB7MHhmZmZmZmVkLCAyOH0sICB7MHhmZmZmZmVlLCAyOH0sICB7MHhmZmZmZmVmLCAyOH0sICB7MHhmZmZmZmYwLCAyOH0sCi0gICAgezB4ZmZmZmZmMSwgMjh9LCAgezB4ZmZmZmZmMiwgMjh9LCAgezB4M2ZmZmZmZmUsIDMwfSwgezB4ZmZmZmZmMywgMjh9LAotICAgIHsweGZmZmZmZjQsIDI4fSwgIHsweGZmZmZmZjUsIDI4fSwgIHsweGZmZmZmZjYsIDI4fSwgIHsweGZmZmZmZjcsIDI4fSwKLSAgICB7MHhmZmZmZmY4LCAyOH0sICB7MHhmZmZmZmY5LCAyOH0sICB7MHhmZmZmZmZhLCAyOH0sICB7MHhmZmZmZmZiLCAyOH0sCi0gICAgezB4MTQsIDZ9LCAgICAgICAgezB4M2Y4LCAxMH0sICAgICAgezB4M2Y5LCAxMH0sICAgICAgezB4ZmZhLCAxMn0sCi0gICAgezB4MWZmOSwgMTN9LCAgICAgezB4MTUsIDZ9LCAgICAgICAgezB4ZjgsIDh9LCAgICAgICAgezB4N2ZhLCAxMX0sCi0gICAgezB4M2ZhLCAxMH0sICAgICAgezB4M2ZiLCAxMH0sICAgICAgezB4ZjksIDh9LCAgICAgICAgezB4N2ZiLCAxMX0sCi0gICAgezB4ZmEsIDh9LCAgICAgICAgezB4MTYsIDZ9LCAgICAgICAgezB4MTcsIDZ9LCAgICAgICAgezB4MTgsIDZ9LAotICAgIHsweDAsIDV9LCAgICAgICAgIHsweDEsIDV9LCAgICAgICAgIHsweDIsIDV9LCAgICAgICAgIHsweDE5LCA2fSwKLSAgICB7MHgxYSwgNn0sICAgICAgICB7MHgxYiwgNn0sICAgICAgICB7MHgxYywgNn0sICAgICAgICB7MHgxZCwgNn0sCi0gICAgezB4MWUsIDZ9LCAgICAgICAgezB4MWYsIDZ9LCAgICAgICAgezB4NWMsIDd9LCAgICAgICAgezB4ZmIsIDh9LAotICAgIHsweDdmZmMsIDE1fSwgICAgIHsweDIwLCA2fSwgICAgICAgIHsweGZmYiwgMTJ9LCAgICAgIHsweDNmYywgMTB9LAotICAgIHsweDFmZmEsIDEzfSwgICAgIHsweDIxLCA2fSwgICAgICAgIHsweDVkLCA3fSwgICAgICAgIHsweDVlLCA3fSwKLSAgICB7MHg1ZiwgN30sICAgICAgICB7MHg2MCwgN30sICAgICAgICB7MHg2MSwgN30sICAgICAgICB7MHg2MiwgN30sCi0gICAgezB4NjMsIDd9LCAgICAgICAgezB4NjQsIDd9LCAgICAgICAgezB4NjUsIDd9LCAgICAgICAgezB4NjYsIDd9LAotICAgIHsweDY3LCA3fSwgICAgICAgIHsweDY4LCA3fSwgICAgICAgIHsweDY5LCA3fSwgICAgICAgIHsweDZhLCA3fSwKLSAgICB7MHg2YiwgN30sICAgICAgICB7MHg2YywgN30sICAgICAgICB7MHg2ZCwgN30sICAgICAgICB7MHg2ZSwgN30sCi0gICAgezB4NmYsIDd9LCAgICAgICAgezB4NzAsIDd9LCAgICAgICAgezB4NzEsIDd9LCAgICAgICAgezB4NzIsIDd9LAotICAgIHsweGZjLCA4fSwgICAgICAgIHsweDczLCA3fSwgICAgICAgIHsweGZkLCA4fSwgICAgICAgIHsweDFmZmIsIDEzfSwKLSAgICB7MHg3ZmZmMCwgMTl9LCAgICB7MHgxZmZjLCAxM30sICAgICB7MHgzZmZjLCAxNH0sICAgICB7MHgyMiwgNn0sCi0gICAgezB4N2ZmZCwgMTV9LCAgICAgezB4MywgNX0sICAgICAgICAgezB4MjMsIDZ9LCAgICAgICAgezB4NCwgNX0sCi0gICAgezB4MjQsIDZ9LCAgICAgICAgezB4NSwgNX0sICAgICAgICAgezB4MjUsIDZ9LCAgICAgICAgezB4MjYsIDZ9LAotICAgIHsweDI3LCA2fSwgICAgICAgIHsweDYsIDV9LCAgICAgICAgIHsweDc0LCA3fSwgICAgICAgIHsweDc1LCA3fSwKLSAgICB7MHgyOCwgNn0sICAgICAgICB7MHgyOSwgNn0sICAgICAgICB7MHgyYSwgNn0sICAgICAgICB7MHg3LCA1fSwKLSAgICB7MHgyYiwgNn0sICAgICAgICB7MHg3NiwgN30sICAgICAgICB7MHgyYywgNn0sICAgICAgICB7MHg4LCA1fSwKLSAgICB7MHg5LCA1fSwgICAgICAgICB7MHgyZCwgNn0sICAgICAgICB7MHg3NywgN30sICAgICAgICB7MHg3OCwgN30sCi0gICAgezB4NzksIDd9LCAgICAgICAgezB4N2EsIDd9LCAgICAgICAgezB4N2IsIDd9LCAgICAgICAgezB4N2ZmZSwgMTV9LAotICAgIHsweDdmYywgMTF9LCAgICAgIHsweDNmZmQsIDE0fSwgICAgIHsweDFmZmQsIDEzfSwgICAgIHsweGZmZmZmZmMsIDI4fSwKLSAgICB7MHhmZmZlNiwgMjB9LCAgICB7MHgzZmZmZDIsIDIyfSwgICB7MHhmZmZlNywgMjB9LCAgICB7MHhmZmZlOCwgMjB9LAotICAgIHsweDNmZmZkMywgMjJ9LCAgIHsweDNmZmZkNCwgMjJ9LCAgIHsweDNmZmZkNSwgMjJ9LCAgIHsweDdmZmZkOSwgMjN9LAotICAgIHsweDNmZmZkNiwgMjJ9LCAgIHsweDdmZmZkYSwgMjN9LCAgIHsweDdmZmZkYiwgMjN9LCAgIHsweDdmZmZkYywgMjN9LAotICAgIHsweDdmZmZkZCwgMjN9LCAgIHsweDdmZmZkZSwgMjN9LCAgIHsweGZmZmZlYiwgMjR9LCAgIHsweDdmZmZkZiwgMjN9LAotICAgIHsweGZmZmZlYywgMjR9LCAgIHsweGZmZmZlZCwgMjR9LCAgIHsweDNmZmZkNywgMjJ9LCAgIHsweDdmZmZlMCwgMjN9LAotICAgIHsweGZmZmZlZSwgMjR9LCAgIHsweDdmZmZlMSwgMjN9LCAgIHsweDdmZmZlMiwgMjN9LCAgIHsweDdmZmZlMywgMjN9LAotICAgIHsweDdmZmZlNCwgMjN9LCAgIHsweDFmZmZkYywgMjF9LCAgIHsweDNmZmZkOCwgMjJ9LCAgIHsweDdmZmZlNSwgMjN9LAotICAgIHsweDNmZmZkOSwgMjJ9LCAgIHsweDdmZmZlNiwgMjN9LCAgIHsweDdmZmZlNywgMjN9LCAgIHsweGZmZmZlZiwgMjR9LAotICAgIHsweDNmZmZkYSwgMjJ9LCAgIHsweDFmZmZkZCwgMjF9LCAgIHsweGZmZmU5LCAyMH0sICAgIHsweDNmZmZkYiwgMjJ9LAotICAgIHsweDNmZmZkYywgMjJ9LCAgIHsweDdmZmZlOCwgMjN9LCAgIHsweDdmZmZlOSwgMjN9LCAgIHsweDFmZmZkZSwgMjF9LAotICAgIHsweDdmZmZlYSwgMjN9LCAgIHsweDNmZmZkZCwgMjJ9LCAgIHsweDNmZmZkZSwgMjJ9LCAgIHsweGZmZmZmMCwgMjR9LAotICAgIHsweDFmZmZkZiwgMjF9LCAgIHsweDNmZmZkZiwgMjJ9LCAgIHsweDdmZmZlYiwgMjN9LCAgIHsweDdmZmZlYywgMjN9LAotICAgIHsweDFmZmZlMCwgMjF9LCAgIHsweDFmZmZlMSwgMjF9LCAgIHsweDNmZmZlMCwgMjJ9LCAgIHsweDFmZmZlMiwgMjF9LAotICAgIHsweDdmZmZlZCwgMjN9LCAgIHsweDNmZmZlMSwgMjJ9LCAgIHsweDdmZmZlZSwgMjN9LCAgIHsweDdmZmZlZiwgMjN9LAotICAgIHsweGZmZmVhLCAyMH0sICAgIHsweDNmZmZlMiwgMjJ9LCAgIHsweDNmZmZlMywgMjJ9LCAgIHsweDNmZmZlNCwgMjJ9LAotICAgIHsweDdmZmZmMCwgMjN9LCAgIHsweDNmZmZlNSwgMjJ9LCAgIHsweDNmZmZlNiwgMjJ9LCAgIHsweDdmZmZmMSwgMjN9LAotICAgIHsweDNmZmZmZTAsIDI2fSwgIHsweDNmZmZmZTEsIDI2fSwgIHsweGZmZmViLCAyMH0sICAgIHsweDdmZmYxLCAxOX0sCi0gICAgezB4M2ZmZmU3LCAyMn0sICAgezB4N2ZmZmYyLCAyM30sICAgezB4M2ZmZmU4LCAyMn0sICAgezB4MWZmZmZlYywgMjV9LAotICAgIHsweDNmZmZmZTIsIDI2fSwgIHsweDNmZmZmZTMsIDI2fSwgIHsweDNmZmZmZTQsIDI2fSwgIHsweDdmZmZmZGUsIDI3fSwKLSAgICB7MHg3ZmZmZmRmLCAyN30sICB7MHgzZmZmZmU1LCAyNn0sICB7MHhmZmZmZjEsIDI0fSwgICB7MHgxZmZmZmVkLCAyNX0sCi0gICAgezB4N2ZmZjIsIDE5fSwgICAgezB4MWZmZmUzLCAyMX0sICAgezB4M2ZmZmZlNiwgMjZ9LCAgezB4N2ZmZmZlMCwgMjd9LAotICAgIHsweDdmZmZmZTEsIDI3fSwgIHsweDNmZmZmZTcsIDI2fSwgIHsweDdmZmZmZTIsIDI3fSwgIHsweGZmZmZmMiwgMjR9LAotICAgIHsweDFmZmZlNCwgMjF9LCAgIHsweDFmZmZlNSwgMjF9LCAgIHsweDNmZmZmZTgsIDI2fSwgIHsweDNmZmZmZTksIDI2fSwKLSAgICB7MHhmZmZmZmZkLCAyOH0sICB7MHg3ZmZmZmUzLCAyN30sICB7MHg3ZmZmZmU0LCAyN30sICB7MHg3ZmZmZmU1LCAyN30sCi0gICAgezB4ZmZmZWMsIDIwfSwgICAgezB4ZmZmZmYzLCAyNH0sICAgezB4ZmZmZWQsIDIwfSwgICAgezB4MWZmZmU2LCAyMX0sCi0gICAgezB4M2ZmZmU5LCAyMn0sICAgezB4MWZmZmU3LCAyMX0sICAgezB4MWZmZmU4LCAyMX0sICAgezB4N2ZmZmYzLCAyM30sCi0gICAgezB4M2ZmZmVhLCAyMn0sICAgezB4M2ZmZmViLCAyMn0sICAgezB4MWZmZmZlZSwgMjV9LCAgezB4MWZmZmZlZiwgMjV9LAotICAgIHsweGZmZmZmNCwgMjR9LCAgIHsweGZmZmZmNSwgMjR9LCAgIHsweDNmZmZmZWEsIDI2fSwgIHsweDdmZmZmNCwgMjN9LAotICAgIHsweDNmZmZmZWIsIDI2fSwgIHsweDdmZmZmZTYsIDI3fSwgIHsweDNmZmZmZWMsIDI2fSwgIHsweDNmZmZmZWQsIDI2fSwKLSAgICB7MHg3ZmZmZmU3LCAyN30sICB7MHg3ZmZmZmU4LCAyN30sICB7MHg3ZmZmZmU5LCAyN30sICB7MHg3ZmZmZmVhLCAyN30sCi0gICAgezB4N2ZmZmZlYiwgMjd9LCAgezB4ZmZmZmZmZSwgMjh9LCAgezB4N2ZmZmZlYywgMjd9LCAgezB4N2ZmZmZlZCwgMjd9LAotICAgIHsweDdmZmZmZWUsIDI3fSwgIHsweDdmZmZmZWYsIDI3fSwgIHsweDdmZmZmZjAsIDI3fSwgIHsweDNmZmZmZWUsIDI2fSwKLSAgICB7MHgzZmZmZmZmZiwgMzB9LAotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0ZjA5ZC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0hVRkZTWU1TX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfSFVGRlNZTVNfSAotCi0vKiBIUEFDSyBzdGF0aWMgaHVmZm1hbiB0YWJsZSAqLwotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX05VTV9IVUZGU1lNUyAyNTcKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBiaXRzOwotICB1bnNpZ25lZCBsZW5ndGg7Ci19IGdycGNfY2h0dHAyX2h1ZmZzeW07Ci0KLWV4dGVybiBjb25zdCBncnBjX2NodHRwMl9odWZmc3ltIGdycGNfY2h0dHAyX2h1ZmZzeW1zW0dSUENfQ0hUVFAyX05VTV9IVUZGU1lNU107Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9IVUZGU1lNU19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWJjMmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLQotdm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlcikgewotICBidWZmZXItPmRlYWRsaW5lID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlcikgewotICBzaXplX3QgaTsKLSAgaWYgKCFidWZmZXItPnB1Ymxpc2hlZCkgewotICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXItPmNvdW50OyBpKyspIHsKLSAgICAgIEdSUENfTURFTEVNX1VOUkVGKGJ1ZmZlci0+ZWxlbXNbaV0ubWQpOwotICAgIH0KLSAgfQotICBncHJfZnJlZShidWZmZXItPmVsZW1zKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfYWRkKAotICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciAqYnVmZmVyLCBncnBjX21kZWxlbSAqZWxlbSkgewotICBHUFJfQVNTRVJUKCFidWZmZXItPnB1Ymxpc2hlZCk7Ci0gIGlmIChidWZmZXItPmNhcGFjaXR5ID09IGJ1ZmZlci0+Y291bnQpIHsKLSAgICBidWZmZXItPmNhcGFjaXR5ID0gR1BSX01BWCg4LCAyICogYnVmZmVyLT5jYXBhY2l0eSk7Ci0gICAgYnVmZmVyLT5lbGVtcyA9Ci0gICAgICAgIGdwcl9yZWFsbG9jKGJ1ZmZlci0+ZWxlbXMsIHNpemVvZigqYnVmZmVyLT5lbGVtcykgKiBidWZmZXItPmNhcGFjaXR5KTsKLSAgfQotICBidWZmZXItPmVsZW1zW2J1ZmZlci0+Y291bnQrK10ubWQgPSBlbGVtOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9zZXRfZGVhZGxpbmUoCi0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIsIGdwcl90aW1lc3BlYyBkZWFkbGluZSkgewotICBHUFJfQVNTRVJUKCFidWZmZXItPnB1Ymxpc2hlZCk7Ci0gIGJ1ZmZlci0+ZGVhZGxpbmUgPSBkZWFkbGluZTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfcHVibGlzaCgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlciwgZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpIHsKLSAgR1BSX0FTU0VSVCghYnVmZmVyLT5wdWJsaXNoZWQpOwotICBidWZmZXItPnB1Ymxpc2hlZCA9IDE7Ci0gIGlmIChidWZmZXItPmNvdW50ID4gMCkgewotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDE7IGkgPCBidWZmZXItPmNvdW50OyBpKyspIHsKLSAgICAgIGJ1ZmZlci0+ZWxlbXNbaV0ucHJldiA9ICZidWZmZXItPmVsZW1zW2kgLSAxXTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlci0+Y291bnQgLSAxOyBpKyspIHsKLSAgICAgIGJ1ZmZlci0+ZWxlbXNbaV0ubmV4dCA9ICZidWZmZXItPmVsZW1zW2kgKyAxXTsKLSAgICB9Ci0gICAgYnVmZmVyLT5lbGVtc1swXS5wcmV2ID0gTlVMTDsKLSAgICBidWZmZXItPmVsZW1zW2J1ZmZlci0+Y291bnQgLSAxXS5uZXh0ID0gTlVMTDsKLSAgICBiYXRjaC0+bGlzdC5oZWFkID0gJmJ1ZmZlci0+ZWxlbXNbMF07Ci0gICAgYmF0Y2gtPmxpc3QudGFpbCA9ICZidWZmZXItPmVsZW1zW2J1ZmZlci0+Y291bnQgLSAxXTsKLSAgfSBlbHNlIHsKLSAgICBiYXRjaC0+bGlzdC5oZWFkID0gYmF0Y2gtPmxpc3QudGFpbCA9IE5VTEw7Ci0gIH0KLSAgYmF0Y2gtPmRlYWRsaW5lID0gYnVmZmVyLT5kZWFkbGluZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0NTRmMy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0lOQ09NSU5HX01FVEFEQVRBX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfSU5DT01JTkdfTUVUQURBVEFfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGdycGNfbGlua2VkX21kZWxlbSAqZWxlbXM7Ci0gIHNpemVfdCBjb3VudDsKLSAgc2l6ZV90IGNhcGFjaXR5OwotICBncHJfdGltZXNwZWMgZGVhZGxpbmU7Ci0gIGludCBwdWJsaXNoZWQ7Ci19IGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcjsKLQotLyoqIGFzc3VtZXMgZXZlcnl0aGluZyBpbml0aWFsbHkgemVyb2VkICovCi12b2lkIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9pbml0KAotICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciAqYnVmZmVyKTsKLXZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2Rlc3Ryb3koCi0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIpOwotdm9pZCBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfcHVibGlzaCgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlciwgZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpOwotCi12b2lkIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9hZGQoCi0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyICpidWZmZXIsIGdycGNfbWRlbGVtICplbGVtKTsKLXZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3NldF9kZWFkbGluZSgKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgKmJ1ZmZlciwgZ3ByX3RpbWVzcGVjIGRlYWRsaW5lKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0lOQ09NSU5HX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5MGNiMy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ODAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9JTlRFUk5BTF9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX0lOVEVSTkFMX0gKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaHR0cDJfdHJhbnNwb3J0IGdycGNfY2h0dHAyX3RyYW5zcG9ydDsKLXR5cGVkZWYgc3RydWN0IGdycGNfY2h0dHAyX3N0cmVhbSBncnBjX2NodHRwMl9zdHJlYW07Ci0KLS8qIHN0cmVhbXMgYXJlIGtlcHQgaW4gdmFyaW91cyBsaW5rZWQgbGlzdHMgZGVwZW5kaW5nIG9uIHdoYXQgdGhpbmdzIG5lZWQgdG8KLSAgIGhhcHBlbiB0byB0aGVtLi4uIHRoaXMgZW51bSBsYWJlbHMgZWFjaCBsaXN0ICovCi10eXBlZGVmIGVudW0gewotICBHUlBDX0NIVFRQMl9MSVNUX0FMTF9TVFJFQU1TLAotICBHUlBDX0NIVFRQMl9MSVNUX0NIRUNLX1JFQURfT1BTLAotICBHUlBDX0NIVFRQMl9MSVNUX1VOQU5OT1VOQ0VEX0lOQ09NSU5HX1dJTkRPV19BVkFJTEFCTEUsCi0gIEdSUENfQ0hUVFAyX0xJU1RfV1JJVEFCTEUsCi0gIEdSUENfQ0hUVFAyX0xJU1RfV1JJVElORywKLSAgR1JQQ19DSFRUUDJfTElTVF9XUklUVEVOLAotICBHUlBDX0NIVFRQMl9MSVNUX1BBUlNJTkdfU0VFTiwKLSAgR1JQQ19DSFRUUDJfTElTVF9DTE9TRURfV0FJVElOR19GT1JfUEFSU0lORywKLSAgR1JQQ19DSFRUUDJfTElTVF9DTE9TRURfV0FJVElOR19GT1JfV1JJVElORywKLSAgR1JQQ19DSFRUUDJfTElTVF9TVEFMTEVEX0JZX1RSQU5TUE9SVCwKLSAgLyogc3RyZWFtcyB3YWl0aW5nIGZvciB0aGUgb3V0Z29pbmcgd2luZG93IGluIHRoZSB3cml0aW5nIHBhdGgsIHRoZXkgd2lsbCBiZQotICAgKiBtZXJnZWQgdG8gdGhlIHN0YWxsZWQgbGlzdCBvciB3cml0YWJsZSBsaXN0IHVuZGVyIHRyYW5zcG9ydCBsb2NrLiAqLwotICBHUlBDX0NIVFRQMl9MSVNUX1dSSVRJTkdfU1RBTExFRF9CWV9UUkFOU1BPUlQsCi0gIC8qKiBzdHJlYW1zIHRoYXQgYXJlIHdhaXRpbmcgdG8gc3RhcnQgYmVjYXVzZSB0aGVyZSBhcmUgdG9vIG1hbnkgY29uY3VycmVudAotICAgICAgc3RyZWFtcyBvbiB0aGUgY29ubmVjdGlvbiAqLwotICBHUlBDX0NIVFRQMl9MSVNUX1dBSVRJTkdfRk9SX0NPTkNVUlJFTkNZLAotICBTVFJFQU1fTElTVF9DT1VOVCAvKiBtdXN0IGJlIGxhc3QgKi8KLX0gZ3JwY19jaHR0cDJfc3RyZWFtX2xpc3RfaWQ7Ci0KLS8qIGRlZnJhbWVyIHN0YXRlIGZvciB0aGUgb3ZlcmFsbCBodHRwMiBzdHJlYW0gb2YgYnl0ZXMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIHByZWZpeDogb25lIGVudHJ5IHBlciBodHRwMiBjb25uZWN0aW9uIHByZWZpeCBieXRlICovCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMCA9IDAsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMSwKLSAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yLAotICBHUlBDX0RUU19DTElFTlRfUFJFRklYXzMsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfNCwKLSAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF81LAotICBHUlBDX0RUU19DTElFTlRfUFJFRklYXzYsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfNywKLSAgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF84LAotICBHUlBDX0RUU19DTElFTlRfUFJFRklYXzksCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTAsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTEsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTIsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTMsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTQsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTUsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTYsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTcsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTgsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTksCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjAsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjEsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjIsCi0gIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjMsCi0gIC8qIGZyYW1lIGhlYWRlciBieXRlIDAuLi4gKi8KLSAgLyogbXVzdCBmb2xsb3cgZnJvbSB0aGUgcHJlZml4IHN0YXRlcyAqLwotICBHUlBDX0RUU19GSF8wLAotICBHUlBDX0RUU19GSF8xLAotICBHUlBDX0RUU19GSF8yLAotICBHUlBDX0RUU19GSF8zLAotICBHUlBDX0RUU19GSF80LAotICBHUlBDX0RUU19GSF81LAotICBHUlBDX0RUU19GSF82LAotICBHUlBDX0RUU19GSF83LAotICAvKiAuLi4gZnJhbWUgaGVhZGVyIGJ5dGUgOCAqLwotICBHUlBDX0RUU19GSF84LAotICAvKiBpbnNpZGUgYSBodHRwMiBmcmFtZSAqLwotICBHUlBDX0RUU19GUkFNRQotfSBncnBjX2NodHRwMl9kZWZyYW1lX3RyYW5zcG9ydF9zdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncnBjX2NodHRwMl9zdHJlYW0gKmhlYWQ7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqdGFpbDsKLX0gZ3JwY19jaHR0cDJfc3RyZWFtX2xpc3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpuZXh0OwotICBncnBjX2NodHRwMl9zdHJlYW0gKnByZXY7Ci19IGdycGNfY2h0dHAyX3N0cmVhbV9saW5rOwotCi0vKiBXZSBrZWVwIHNldmVyYWwgc2V0cyBvZiBjb25uZWN0aW9uIHdpZGUgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgLyogVGhlIHNldHRpbmdzIG91ciBwZWVyIGhhcyBhc2tlZCBmb3IgKGFuZCB3ZSBoYXZlIGFja2VkKSAqLwotICBHUlBDX1BFRVJfU0VUVElOR1MgPSAwLAotICAvKiBUaGUgc2V0dGluZ3Mgd2UnZCBsaWtlIHRvIGhhdmUgKi8KLSAgR1JQQ19MT0NBTF9TRVRUSU5HUywKLSAgLyogVGhlIHNldHRpbmdzIHdlJ3ZlIHB1Ymxpc2hlZCB0byBvdXIgcGVlciAqLwotICBHUlBDX1NFTlRfU0VUVElOR1MsCi0gIC8qIFRoZSBzZXR0aW5ncyB0aGUgcGVlciBoYXMgYWNrZWQgKi8KLSAgR1JQQ19BQ0tFRF9TRVRUSU5HUywKLSAgR1JQQ19OVU1fU0VUVElOR19TRVRTCi19IGdycGNfY2h0dHAyX3NldHRpbmdfc2V0OwotCi0vKiBPdXRzdGFuZGluZyBwaW5nIHJlcXVlc3QgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jaHR0cDJfb3V0c3RhbmRpbmdfcGluZyB7Ci0gIHVpbnQ4X3QgaWRbOF07Ci0gIGdycGNfY2xvc3VyZSAqb25fcmVjdjsKLSAgc3RydWN0IGdycGNfY2h0dHAyX291dHN0YW5kaW5nX3BpbmcgKm5leHQ7Ci0gIHN0cnVjdCBncnBjX2NodHRwMl9vdXRzdGFuZGluZ19waW5nICpwcmV2OwotfSBncnBjX2NodHRwMl9vdXRzdGFuZGluZ19waW5nOwotCi0vKiBmb3J3YXJkIGRlY2xhcmVkIGluIGZyYW1lX2RhdGEuaCAqLwotc3RydWN0IGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtIHsKLSAgZ3JwY19ieXRlX3N0cmVhbSBiYXNlOwotICBncHJfcmVmY291bnQgcmVmczsKLSAgc3RydWN0IGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpuZXh0X21lc3NhZ2U7Ci0gIGludCBmYWlsZWQ7Ci0KLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOwotICBpbnQgaXNfdGFpbDsKLSAgZ3ByX3NsaWNlX2J1ZmZlciBzbGljZXM7Ci0gIGdycGNfY2xvc3VyZSAqb25fbmV4dDsKLSAgZ3ByX3NsaWNlICpuZXh0OwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogZGF0YSB0byB3cml0ZSBuZXh0IHdyaXRlICovCi0gIGdwcl9zbGljZV9idWZmZXIgcWJ1ZjsKLQotICAvKiogd2luZG93IGF2YWlsYWJsZSBmb3IgdXMgdG8gc2VuZCB0byBwZWVyICovCi0gIGludDY0X3Qgb3V0Z29pbmdfd2luZG93OwotICAvKiogd2luZG93IGF2YWlsYWJsZSB0byBhbm5vdW5jZSB0byBwZWVyICovCi0gIGludDY0X3QgYW5ub3VuY2VfaW5jb21pbmdfd2luZG93OwotICAvKiogaG93IG11Y2ggd2luZG93IHdvdWxkIHdlIGxpa2UgdG8gaGF2ZSBmb3IgaW5jb21pbmdfd2luZG93ICovCi0gIHVpbnQzMl90IGNvbm5lY3Rpb25fd2luZG93X3RhcmdldDsKLQotICAvKiogaGF2ZSB3ZSBzZWVuIGEgZ29hd2F5ICovCi0gIHVpbnQ4X3Qgc2Vlbl9nb2F3YXk7Ci0gIC8qKiBoYXZlIHdlIHNlbnQgYSBnb2F3YXkgKi8KLSAgdWludDhfdCBzZW50X2dvYXdheTsKLQotICAvKiogaXMgdGhpcyB0cmFuc3BvcnQgYSBjbGllbnQ/ICovCi0gIHVpbnQ4X3QgaXNfY2xpZW50OwotICAvKiogYXJlIHRoZSBsb2NhbCBzZXR0aW5ncyBkaXJ0eSBhbmQgbmVlZCB0byBiZSBzZW50PyAqLwotICB1aW50OF90IGRpcnRpZWRfbG9jYWxfc2V0dGluZ3M7Ci0gIC8qKiBoYXZlIGxvY2FsIHNldHRpbmdzIGJlZW4gc2VudD8gKi8KLSAgdWludDhfdCBzZW50X2xvY2FsX3NldHRpbmdzOwotICAvKiogYml0bWFzayBvZiBzZXR0aW5nIGluZGV4ZXMgdG8gc2VuZCBvdXQgKi8KLSAgdWludDMyX3QgZm9yY2Vfc2VuZF9zZXR0aW5nczsKLSAgLyoqIHNldHRpbmdzIHZhbHVlcyAqLwotICB1aW50MzJfdCBzZXR0aW5nc1tHUlBDX05VTV9TRVRUSU5HX1NFVFNdW0dSUENfQ0hUVFAyX05VTV9TRVRUSU5HU107Ci0KLSAgLyoqIHdoYXQgaXMgdGhlIG5leHQgc3RyZWFtIGlkIHRvIGJlIGFsbG9jYXRlZCBieSB0aGlzIHBlZXI/Ci0gICAgICBjb3BpZWQgdG8gbmV4dF9zdHJlYW1faWQgaW4gcGFyc2luZyB3aGVuIHBhcnNpbmcgY29tbWVuY2VzICovCi0gIHVpbnQzMl90IG5leHRfc3RyZWFtX2lkOwotCi0gIC8qKiBob3cgZmFyIHRvIGxvb2thaGVhZCBpbiBhIHN0cmVhbT8gKi8KLSAgdWludDMyX3Qgc3RyZWFtX2xvb2thaGVhZDsKLQotICAvKiogbGFzdCByZWNlaXZlZCBzdHJlYW0gaWQgKi8KLSAgdWludDMyX3QgbGFzdF9pbmNvbWluZ19zdHJlYW1faWQ7Ci0KLSAgLyoqIHBpbmdzIGF3YWl0aW5nIHJlc3BvbnNlcyAqLwotICBncnBjX2NodHRwMl9vdXRzdGFuZGluZ19waW5nIHBpbmdzOwotICAvKiogbmV4dCBwYXlsb2FkIGZvciBhbiBvdXRnb2luZyBwaW5nICovCi0gIHVpbnQ2NF90IHBpbmdfY291bnRlcjsKLQotICAvKiogY29uY3VycmVudCBzdHJlYW0gY291bnQ6IHVwZGF0ZWQgd2hlbiBub3QgcGFyc2luZywKLSAgICAgIHNvIHRoaXMgaXMgYSBzdHJpY3Qgb3Zlci1lc3RpbWF0aW9uIG9uIHRoZSBjbGllbnQgKi8KLSAgdWludDMyX3QgY29uY3VycmVudF9zdHJlYW1fY291bnQ7Ci19IGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyoqIGRhdGEgdG8gd3JpdGUgbm93ICovCi0gIGdwcl9zbGljZV9idWZmZXIgb3V0YnVmOwotICAvKiogaHBhY2sgZW5jb2RpbmcgKi8KLSAgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3NvciBocGFja19jb21wcmVzc29yOwotICBpbnQ2NF90IG91dGdvaW5nX3dpbmRvdzsKLSAgLyoqIGlzIHRoaXMgYSBjbGllbnQ/ICovCi0gIHVpbnQ4X3QgaXNfY2xpZW50OwotICAvKiogY2FsbGJhY2sgZm9yIHdoZW4gd3JpdGluZyBpcyBkb25lICovCi0gIGdycGNfY2xvc3VyZSBkb25lX2NiOwotfSBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZzsKLQotc3RydWN0IGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nIHsKLSAgLyoqIGlzIHRoaXMgdHJhbnNwb3J0IGEgY2xpZW50PyAoYm9vbGVhbikgKi8KLSAgdWludDhfdCBpc19jbGllbnQ7Ci0KLSAgLyoqIHdlcmUgc2V0dGluZ3MgdXBkYXRlZD8gKi8KLSAgdWludDhfdCBzZXR0aW5nc191cGRhdGVkOwotICAvKiogd2FzIGEgc2V0dGluZ3MgYWNrIHJlY2VpdmVkPyAqLwotICB1aW50OF90IHNldHRpbmdzX2Fja19yZWNlaXZlZDsKLSAgLyoqIHdhcyBhIGdvYXdheSBmcmFtZSByZWNlaXZlZD8gKi8KLSAgdWludDhfdCBnb2F3YXlfcmVjZWl2ZWQ7Ci0KLSAgLyoqIHRoZSBsYXN0IHNlbnQgbWF4X3RhYmxlX3NpemUgc2V0dGluZyAqLwotICB1aW50MzJfdCBsYXN0X3NlbnRfbWF4X3RhYmxlX3NpemU7Ci0KLSAgLyoqIGluaXRpYWwgd2luZG93IGNoYW5nZSAqLwotICBpbnQ2NF90IGluaXRpYWxfd2luZG93X3VwZGF0ZTsKLQotICAvKiogZGF0YSB0byB3cml0ZSBsYXRlciAtIGFmdGVyIHBhcnNpbmcgKi8KLSAgZ3ByX3NsaWNlX2J1ZmZlciBxYnVmOwotICAvKiogcGFyc2VyIGZvciBoZWFkZXJzICovCi0gIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlciBocGFja19wYXJzZXI7Ci0gIC8qKiBzaW1wbGUgb25lIHNob3QgcGFyc2VycyAqLwotICB1bmlvbiB7Ci0gICAgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9wYXJzZXIgd2luZG93X3VwZGF0ZTsKLSAgICBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXIgc2V0dGluZ3M7Ci0gICAgZ3JwY19jaHR0cDJfcGluZ19wYXJzZXIgcGluZzsKLSAgICBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX3BhcnNlciByc3Rfc3RyZWFtOwotICB9IHNpbXBsZTsKLSAgLyoqIHBhcnNlciBmb3IgZ29hd2F5IGZyYW1lcyAqLwotICBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyIGdvYXdheV9wYXJzZXI7Ci0KLSAgLyoqIHdpbmRvdyBhdmFpbGFibGUgZm9yIHBlZXIgdG8gc2VuZCB0byB1cyAqLwotICBpbnQ2NF90IGluY29taW5nX3dpbmRvdzsKLQotICAvKiogbmV4dCBzdHJlYW0gaWQgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9mIGJlZ2lubmluZyBwYXJzaW5nICovCi0gIHVpbnQzMl90IG5leHRfc3RyZWFtX2lkOwotICB1aW50MzJfdCBsYXN0X2luY29taW5nX3N0cmVhbV9pZDsKLQotICAvKiBkZWZyYW1pbmcgKi8KLSAgZ3JwY19jaHR0cDJfZGVmcmFtZV90cmFuc3BvcnRfc3RhdGUgZGVmcmFtZV9zdGF0ZTsKLSAgdWludDhfdCBpbmNvbWluZ19mcmFtZV90eXBlOwotICB1aW50OF90IGluY29taW5nX2ZyYW1lX2ZsYWdzOwotICB1aW50OF90IGhlYWRlcl9lb2Y7Ci0gIHVpbnQzMl90IGV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkOwotICB1aW50MzJfdCBpbmNvbWluZ19mcmFtZV9zaXplOwotICB1aW50MzJfdCBpbmNvbWluZ19zdHJlYW1faWQ7Ci0KLSAgLyogYWN0aXZlIHBhcnNlciAqLwotICB2b2lkICpwYXJzZXJfZGF0YTsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKmluY29taW5nX3N0cmVhbTsKLSAgZ3JwY19jaHR0cDJfcGFyc2VfZXJyb3IgKCpwYXJzZXIpKAotICAgICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKnBhcnNlcl91c2VyX2RhdGEsCi0gICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcsIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpOwotCi0gIC8qIHJlY2VpdmVkIHNldHRpbmdzICovCi0gIHVpbnQzMl90IHNldHRpbmdzW0dSUENfQ0hUVFAyX05VTV9TRVRUSU5HU107Ci0KLSAgLyogZ29hd2F5IGRhdGEgKi8KLSAgZ3JwY19zdGF0dXNfY29kZSBnb2F3YXlfZXJyb3I7Ci0gIHVpbnQzMl90IGdvYXdheV9sYXN0X3N0cmVhbV9pbmRleDsKLSAgZ3ByX3NsaWNlIGdvYXdheV90ZXh0OwotCi0gIGludDY0X3Qgb3V0Z29pbmdfd2luZG93OwotfTsKLQotc3RydWN0IGdycGNfY2h0dHAyX3RyYW5zcG9ydCB7Ci0gIGdycGNfdHJhbnNwb3J0IGJhc2U7IC8qIG11c3QgYmUgZmlyc3QgKi8KLSAgZ3JwY19lbmRwb2ludCAqZXA7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotICBjaGFyICpwZWVyX3N0cmluZzsKLQotICAvKiogd2hlbiB0aGlzIGRyb3BzIHRvIHplcm8gaXQncyBzYWZlIHRvIHNodXRkb3duIHRoZSBlbmRwb2ludCAqLwotICBncHJfcmVmY291bnQgc2h1dGRvd25fZXBfcmVmczsKLQotICBncHJfbXUgbXU7Ci0KLSAgLyoqIGlzIHRoZSB0cmFuc3BvcnQgZGVzdHJveWluZyBpdHNlbGY/ICovCi0gIHVpbnQ4X3QgZGVzdHJveWluZzsKLSAgLyoqIGhhcyB0aGUgdXBwZXIgbGF5ZXIgY2xvc2VkIHRoZSB0cmFuc3BvcnQ/ICovCi0gIHVpbnQ4X3QgY2xvc2VkOwotCi0gIC8qKiBpcyBhIHRocmVhZCBjdXJyZW50bHkgd3JpdGluZyAqLwotICB1aW50OF90IHdyaXRpbmdfYWN0aXZlOwotICAvKiogaXMgYSB0aHJlYWQgY3VycmVudGx5IHBhcnNpbmcgKi8KLSAgdWludDhfdCBwYXJzaW5nX2FjdGl2ZTsKLQotICAvKiogaXMgdGhlcmUgYSByZWFkIHJlcXVlc3QgdG8gdGhlIGVuZHBvaW50IG91dHN0YW5kaW5nPyAqLwotICB1aW50OF90IGVuZHBvaW50X3JlYWRpbmc7Ci0KLSAgLyoqIHZhcmlvdXMgbGlzdHMgb2Ygc3RyZWFtcyAqLwotICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdCBsaXN0c1tTVFJFQU1fTElTVF9DT1VOVF07Ci0KLSAgLyoqIGdsb2JhbCBzdGF0ZSBmb3IgcmVhZGluZy93cml0aW5nICovCi0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgZ2xvYmFsOwotICAvKiogc3RhdGUgb25seSBhY2Nlc3NpYmxlIGJ5IHRoZSBjaGFpbiBvZiBleGVjdXRpb24gdGhhdAotICAgICAgc2V0IHdyaXRpbmdfYWN0aXZlPTEgKi8KLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgd3JpdGluZzsKLSAgLyoqIHN0YXRlIG9ubHkgYWNjZXNzaWJsZSBieSB0aGUgY2hhaW4gb2YgZXhlY3V0aW9uIHRoYXQKLSAgICAgIHNldCBwYXJzaW5nX2FjdGl2ZT0xICovCi0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nIHBhcnNpbmc7Ci0KLSAgLyoqIG1hcHMgc3RyZWFtIGlkIHRvIGdycGNfY2h0dHAyX3N0cmVhbSBvYmplY3RzOwotICAgICAgb3duZWQgYnkgdGhlIHBhcnNpbmcgdGhyZWFkIHdoZW4gcGFyc2luZyAqLwotICBncnBjX2NodHRwMl9zdHJlYW1fbWFwIHBhcnNpbmdfc3RyZWFtX21hcDsKLQotICAvKiogc3RyZWFtcyBjcmVhdGVkIGJ5IHRoZSBjbGllbnQgKHBvc3NpYmx5IGR1cmluZyBwYXJzaW5nKTsKLSAgICAgIG1lcmdlZCB3aXRoIHBhcnNpbmdfc3RyZWFtX21hcCBkdXJpbmcgdW5sb2NrIHdoZW4gbm8KLSAgICAgIHBhcnNpbmcgaXMgb2NjdXJyaW5nICovCi0gIGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgbmV3X3N0cmVhbV9tYXA7Ci0KLSAgLyoqIGNsb3N1cmUgdG8gZXhlY3V0ZSB3cml0aW5nICovCi0gIGdycGNfY2xvc3VyZSB3cml0aW5nX2FjdGlvbjsKLSAgLyoqIGNsb3N1cmUgdG8gZmluaXNoIHJlYWRpbmcgZnJvbSB0aGUgZW5kcG9pbnQgKi8KLSAgZ3JwY19jbG9zdXJlIHJlY3ZfZGF0YTsKLQotICAvKiogaW5jb21pbmcgcmVhZCBieXRlcyAqLwotICBncHJfc2xpY2VfYnVmZmVyIHJlYWRfYnVmZmVyOwotCi0gIC8qKiBhZGRyZXNzIHRvIHBsYWNlIGEgbmV3bHkgYWNjZXB0ZWQgc3RyZWFtIC0gc2V0IGFuZCB1bnNldCBieQotICAgICAgZ3JwY19jaHR0cDJfcGFyc2luZ19hY2NlcHRfc3RyZWFtOyB1c2VkIGJ5IGluaXRfc3RyZWFtIHRvCi0gICAgICBwdWJsaXNoIHRoZSBhY2NlcHRlZCBzZXJ2ZXIgc3RyZWFtICovCi0gIGdycGNfY2h0dHAyX3N0cmVhbSAqKmFjY2VwdGluZ19zdHJlYW07Ci0KLSAgc3RydWN0IHsKLSAgICAvKiBhY2NlcHQgc3RyZWFtIGNhbGxiYWNrICovCi0gICAgdm9pZCAoKmFjY2VwdF9zdHJlYW0pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKTsKLSAgICB2b2lkICphY2NlcHRfc3RyZWFtX3VzZXJfZGF0YTsKLQotICAgIC8qKiBjb25uZWN0aXZpdHkgdHJhY2tpbmcgKi8KLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyIHN0YXRlX3RyYWNrZXI7Ci0gIH0gY2hhbm5lbF9jYWxsYmFjazsKLQotICAvKiogVHJhbnNwb3J0IG9wIHRvIGJlIGFwcGxpZWQgcG9zdC1wYXJzaW5nICovCi0gIGdycGNfdHJhbnNwb3J0X29wICpwb3N0X3BhcnNpbmdfb3A7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBIVFRQMiBzdHJlYW0gaWQgZm9yIHRoaXMgc3RyZWFtLCBvciB6ZXJvIGlmIG9uZSBoYXMgbm90IGJlZW4gYXNzaWduZWQgKi8KLSAgdWludDMyX3QgaWQ7Ci0KLSAgLyoqIHdpbmRvdyBhdmFpbGFibGUgZm9yIHVzIHRvIHNlbmQgdG8gcGVlciAqLwotICBpbnQ2NF90IG91dGdvaW5nX3dpbmRvdzsKLSAgLyoqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHVwcGVyIGxheWVycyBoYXZlIG9mZmVyZWQgdG8gcmVjZWl2ZS4KLSAgICAgIEFzIHRoZSB1cHBlciBsYXllciBvZmZlcnMgbW9yZSBieXRlcywgdGhpcyB2YWx1ZSBpbmNyZWFzZXMuCi0gICAgICBBcyBieXRlcyBhcmUgcmVhZCwgdGhpcyB2YWx1ZSBkZWNyZWFzZXMuICovCi0gIHVpbnQzMl90IG1heF9yZWN2X2J5dGVzOwotICAvKiogVGhlIG51bWJlciBvZiBieXRlcyB0aGUgdXBwZXIgbGF5ZXIgaGFzIG9mZmVyZWQgdG8gcmVhZCBidXQgd2UgaGF2ZQotICAgICAgbm90IHlldCBhbm5vdW5jZWQgdG8gSFRUUDIgZmxvdyBjb250cm9sLgotICAgICAgQXMgdGhlIHVwcGVyIGxheWVycyBvZmZlciB0byByZWFkIG1vcmUgYnl0ZXMsIHRoaXMgdmFsdWUgaW5jcmVhc2VzLgotICAgICAgQXMgd2UgYWR2ZXJ0aXNlIGluY29taW5nIGZsb3cgY29udHJvbCB3aW5kb3csIHRoaXMgdmFsdWUgZGVjcmVhc2VzLiAqLwotICB1aW50MzJfdCB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3BhcnNlOwotICB1aW50MzJfdCB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3dyaXRpbmc7Ci0gIC8qKiB0aGluZ3MgdGhlIHVwcGVyIGxheWVycyB3b3VsZCBsaWtlIHRvIHNlbmQgKi8KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqc2VuZF9pbml0aWFsX21ldGFkYXRhOwotICBncnBjX2Nsb3N1cmUgKnNlbmRfaW5pdGlhbF9tZXRhZGF0YV9maW5pc2hlZDsKLSAgZ3JwY19ieXRlX3N0cmVhbSAqc2VuZF9tZXNzYWdlOwotICBncnBjX2Nsb3N1cmUgKnNlbmRfbWVzc2FnZV9maW5pc2hlZDsKLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqc2VuZF90cmFpbGluZ19tZXRhZGF0YTsKLSAgZ3JwY19jbG9zdXJlICpzZW5kX3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkOwotCi0gIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLSAgZ3JwY19jbG9zdXJlICpyZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7Ci0gIGdycGNfYnl0ZV9zdHJlYW0gKipyZWN2X21lc3NhZ2U7Ci0gIGdycGNfY2xvc3VyZSAqcmVjdl9tZXNzYWdlX3JlYWR5OwotICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X3RyYWlsaW5nX21ldGFkYXRhOwotICBncnBjX2Nsb3N1cmUgKnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQ7Ci0KLSAgLyoqIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RzIHdyaXRlcyBiZSBjbG9zZWQsIHRoZSB3cml0ZV9jbG9zZWQgaXMKLSAgICAgICdxdWV1ZWQnOyB3aGVuIHRoZSBjbG9zZSBpcyBmbG93IGNvbnRyb2xsZWQgaW50byB0aGUgc2VuZCBwYXRoLCB3ZSBhcmUKLSAgICAgICdzZW5kaW5nJyBpdDsgd2hlbiB0aGUgd3JpdGUgaGFzIGJlZW4gcGVyZm9ybWVkIGl0IGlzICdzZW50JyAqLwotICB1aW50OF90IHdyaXRlX2Nsb3NlZDsKLSAgLyoqIGlzIHRoaXMgc3RyZWFtIHJlYWRpbmcgaGFsZi1jbG9zZWQgKGJvb2xlYW4pICovCi0gIHVpbnQ4X3QgcmVhZF9jbG9zZWQ7Ci0gIC8qKiBpcyB0aGlzIHN0cmVhbSBpbiB0aGUgc3RyZWFtIG1hcD8gKGJvb2xlYW4pICovCi0gIHVpbnQ4X3QgaW5fc3RyZWFtX21hcDsKLSAgLyoqIGhhcyB0aGlzIHN0cmVhbSBzZWVuIGFuIGVycm9yPyBpZiAxLCB0aGVuIHBlbmRpbmcgaW5jb21pbmcgZnJhbWVzCi0gICAgICBjYW4gYmUgdGhyb3duIGF3YXkgKi8KLSAgdWludDhfdCBzZWVuX2Vycm9yOwotCi0gIHVpbnQ4X3QgcHVibGlzaGVkX2luaXRpYWxfbWV0YWRhdGE7Ci0gIHVpbnQ4X3QgcHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhOwotICB1aW50OF90IGZha2VkX3RyYWlsaW5nX21ldGFkYXRhOwotCi0gIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlciByZWNlaXZlZF9pbml0aWFsX21ldGFkYXRhOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgcmVjZWl2ZWRfdHJhaWxpbmdfbWV0YWRhdGE7Ci0KLSAgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgaW5jb21pbmdfZnJhbWVzOwotfSBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qKiBIVFRQMiBzdHJlYW0gaWQgZm9yIHRoaXMgc3RyZWFtLCBvciB6ZXJvIGlmIG9uZSBoYXMgbm90IGJlZW4gYXNzaWduZWQgKi8KLSAgdWludDMyX3QgaWQ7Ci0gIHVpbnQ4X3QgZmV0Y2hpbmc7Ci0gIGJvb2wgc2VudF9pbml0aWFsX21ldGFkYXRhOwotICB1aW50OF90IHNlbnRfbWVzc2FnZTsKLSAgdWludDhfdCBzZW50X3RyYWlsaW5nX21ldGFkYXRhOwotICB1aW50OF90IHJlYWRfY2xvc2VkOwotICAvKiogc2VuZCB0aGlzIGluaXRpYWwgbWV0YWRhdGEgKi8KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqc2VuZF9pbml0aWFsX21ldGFkYXRhOwotICBncnBjX2J5dGVfc3RyZWFtICpzZW5kX21lc3NhZ2U7Ci0gIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNlbmRfdHJhaWxpbmdfbWV0YWRhdGE7Ci0gIGludDY0X3Qgb3V0Z29pbmdfd2luZG93OwotICAvKiogaG93IG11Y2ggd2luZG93IHNob3VsZCB3ZSBhbm5vdW5jZT8gKi8KLSAgdWludDMyX3QgYW5ub3VuY2Vfd2luZG93OwotICBncHJfc2xpY2VfYnVmZmVyIGZsb3dfY29udHJvbGxlZF9idWZmZXI7Ci0gIGdwcl9zbGljZSBmZXRjaGluZ19zbGljZTsKLSAgc2l6ZV90IHN0cmVhbV9mZXRjaGVkOwotICBncnBjX2Nsb3N1cmUgZmluaXNoZWRfZmV0Y2g7Ci19IGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nOwotCi1zdHJ1Y3QgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgewotICAvKiogSFRUUDIgc3RyZWFtIGlkIGZvciB0aGlzIHN0cmVhbSwgb3IgemVybyBpZiBvbmUgaGFzIG5vdCBiZWVuIGFzc2lnbmVkICovCi0gIHVpbnQzMl90IGlkOwotICAvKiogaGFzIHRoaXMgc3RyZWFtIHJlY2VpdmVkIGEgY2xvc2UgKi8KLSAgdWludDhfdCByZWNlaXZlZF9jbG9zZTsKLSAgLyoqIHNhdyBhIHJzdF9zdHJlYW0gKi8KLSAgdWludDhfdCBzYXdfcnN0X3N0cmVhbTsKLSAgLyoqIGhvdyBtYW55IGhlYWRlciBmcmFtZXMgaGF2ZSB3ZSByZWNlaXZlZD8gKi8KLSAgdWludDhfdCBoZWFkZXJfZnJhbWVzX3JlY2VpdmVkOwotICAvKiogd2hpY2ggbWV0YWRhdGEgZGlkIHdlIGdldCAob24gdGhpcyBwYXJzZSkgKi8KLSAgdWludDhfdCBnb3RfbWV0YWRhdGFfb25fcGFyc2VbMl07Ci0gIC8qKiBzaG91bGQgd2UgcmFpc2UgdGhlIHNlZW5fZXJyb3IgZmxhZyBpbiB0cmFuc3BvcnRfZ2xvYmFsICovCi0gIHVpbnQ4X3Qgc2Vlbl9lcnJvcjsKLSAgLyoqIHdpbmRvdyBhdmFpbGFibGUgZm9yIHBlZXIgdG8gc2VuZCB0byB1cyAqLwotICBpbnQ2NF90IGluY29taW5nX3dpbmRvdzsKLSAgLyoqIHBhcnNpbmcgc3RhdGUgZm9yIGRhdGEgZnJhbWVzICovCi0gIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyIGRhdGFfcGFyc2VyOwotICAvKiogcmVhc29uIGdpdmUgdG8gcnN0X3N0cmVhbSAqLwotICB1aW50MzJfdCByc3Rfc3RyZWFtX3JlYXNvbjsKLSAgLyoqIGFtb3VudCBvZiB3aW5kb3cgZ2l2ZW4gKi8KLSAgaW50NjRfdCBvdXRnb2luZ193aW5kb3c7Ci0gIC8qKiBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgLSByZXNldCBhdCBlbmQgb2YgcGFyc2UgdGhyZWFkIGV4ZWN1dGlvbiAqLwotICBpbnQ2NF90IHJlY2VpdmVkX2J5dGVzOwotCi0gIC8qKiBpbmNvbWluZyBtZXRhZGF0YSAqLwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIgbWV0YWRhdGFfYnVmZmVyWzJdOwotfTsKLQotc3RydWN0IGdycGNfY2h0dHAyX3N0cmVhbSB7Ci0gIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudDsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCBnbG9iYWw7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nIHdyaXRpbmc7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nIHBhcnNpbmc7Ci0KLSAgZ3JwY19jaHR0cDJfc3RyZWFtX2xpbmsgbGlua3NbU1RSRUFNX0xJU1RfQ09VTlRdOwotICB1aW50OF90IGluY2x1ZGVkW1NUUkVBTV9MSVNUX0NPVU5UXTsKLX07Ci0KLS8qKiBUcmFuc3BvcnQgd3JpdGluZyBjYWxsIGZsb3c6Ci0gICAgY2h0dHAyX3RyYW5zcG9ydC5jIGNhbGxzIGdycGNfY2h0dHAyX3VubG9ja2luZ19jaGVja193cml0ZXMgdG8gc2VlIGlmIHdyaXRlcwotICAgYXJlIHJlcXVpcmVkOwotICAgIGlmIHRoZXkgYXJlLCBjaHR0cDJfdHJhbnNwb3J0LmMgY2FsbHMgZ3JwY19jaHR0cDJfcGVyZm9ybV93cml0ZXMgdG8gZG8gdGhlCi0gICB3cml0ZXMuCi0gICAgT25jZSB3cml0ZXMgaGF2ZSBiZWVuIGNvbXBsZXRlZCAobWVhbmluZyBhbm90aGVyIHdyaXRlIGNvdWxkIHBvdGVudGlhbGx5IGJlCi0gICBzdGFydGVkKSwKLSAgICBncnBjX2NodHRwMl90ZXJtaW5hdGVfd3JpdGluZyBpcyBjYWxsZWQuIFRoaXMgd2lsbCBjYWxsCi0gICBncnBjX2NodHRwMl9jbGVhbnVwX3dyaXRpbmcsIGF0IHdoaWNoCi0gICAgcG9pbnQgdGhlIHdyaXRlIHBoYXNlIGlzIGNvbXBsZXRlLiAqLwotCi0vKiogU29tZW9uZSBpcyB1bmxvY2tpbmcgdGhlIHRyYW5zcG9ydCBtdXRleDogY2hlY2sgdG8gc2VlIGlmIHdyaXRlcwotICAgIGFyZSByZXF1aXJlZCwgYW5kIHNjaGVkdWxlIHRoZW0gaWYgc28gKi8KLWludCBncnBjX2NodHRwMl91bmxvY2tpbmdfY2hlY2tfd3JpdGVzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKndyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcGFyc2luZyk7Ci12b2lkIGdycGNfY2h0dHAyX3BlcmZvcm1fd3JpdGVzKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgZ3JwY19lbmRwb2ludCAqZW5kcG9pbnQpOwotdm9pZCBncnBjX2NodHRwMl90ZXJtaW5hdGVfd3JpdGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdHJhbnNwb3J0X3dyaXRpbmcsIGJvb2wgc3VjY2Vzcyk7Ci12b2lkIGdycGNfY2h0dHAyX2NsZWFudXBfd3JpdGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKmdsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp3cml0aW5nKTsKLQotdm9pZCBncnBjX2NodHRwMl9wcmVwYXJlX3RvX3JlYWQoZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnBhcnNpbmcpOwotLyoqIFByb2Nlc3Mgb25lIHNsaWNlIG9mIGluY29taW5nIGRhdGE7IHJldHVybiAxIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsCi0gICAgdmlhYmxlIGFmdGVyIHJlYWRpbmcsIG9yIDAgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHRvcm4gZG93biAqLwotaW50IGdycGNfY2h0dHAyX3BlcmZvcm1fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Ugc2xpY2UpOwotdm9pZCBncnBjX2NodHRwMl9wdWJsaXNoX3JlYWRzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKmdsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqcGFyc2luZyk7Ci0KLWJvb2wgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdGFibGVfc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Ci0vKiogR2V0IGEgd3JpdGFibGUgc3RyZWFtCi0gICAgcmV0dXJucyBub24temVybyBpZiB0aGVyZSB3YXMgYSBzdHJlYW0gYXZhaWxhYmxlICovCi1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdGFibGVfc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICoqc3RyZWFtX3dyaXRpbmcpOwotYm9vbCBncnBjX2NodHRwMl9saXN0X3JlbW92ZV93cml0YWJsZV9zdHJlYW0oCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSBHUlBDX01VU1RfVVNFX1JFU1VMVDsKLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF93cml0aW5nX3N0cmVhbSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKnN0cmVhbV93cml0aW5nKTsKLWludCBncnBjX2NodHRwMl9saXN0X2hhdmVfd3JpdGluZ19zdHJlYW1zKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZyk7Ci1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdGluZ19zdHJlYW0oCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICoqc3RyZWFtX3dyaXRpbmcpOwotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXR0ZW5fc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpOwotaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3dyaXR0ZW5fc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICoqc3RyZWFtX3dyaXRpbmcpOwotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0oCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZyk7Ci1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3BfcGFyc2luZ19zZWVuX3N0cmVhbSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqKnN0cmVhbV9wYXJzaW5nKTsKLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF93YWl0aW5nX2Zvcl9jb25jdXJyZW5jeSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpOwotaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3dhaXRpbmdfZm9yX2NvbmN1cnJlbmN5KAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpOwotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX2NoZWNrX3JlYWRfb3BzKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Ci1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3BfY2hlY2tfcmVhZF9vcHMoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCk7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdGluZ19zdGFsbGVkX2J5X3RyYW5zcG9ydCgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKnN0cmVhbV93cml0aW5nKTsKLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9mbHVzaF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgYm9vbCBpc193aW5kb3dfYXZhaWxhYmxlKTsKLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF9zdGFsbGVkX2J5X3RyYW5zcG9ydCgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKnN0cmVhbV93cml0aW5nKTsKLWludCBncnBjX2NodHRwMl9saXN0X3BvcF9zdGFsbGVkX2J5X3RyYW5zcG9ydCgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsKTsKLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9yZW1vdmVfc3RhbGxlZF9ieV90cmFuc3BvcnQoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF91bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfYXZhaWxhYmxlKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Ci12b2lkIGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3VuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19hdmFpbGFibGUoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKLWludCBncnBjX2NodHRwMl9saXN0X3BvcF91bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfYXZhaWxhYmxlKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICoqc3RyZWFtX3BhcnNpbmcpOwotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX2Nsb3NlZF93YWl0aW5nX2Zvcl9wYXJzaW5nKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Ci1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3BfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCk7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2xvc2VkX3dhaXRpbmdfZm9yX3dyaXRpbmcoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKLWludCBncnBjX2NodHRwMl9saXN0X3BvcF9jbG9zZWRfd2FpdGluZ19mb3Jfd3JpdGluZygKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsKTsKLQotZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKmdycGNfY2h0dHAyX3BhcnNpbmdfbG9va3VwX3N0cmVhbSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsIHVpbnQzMl90IGlkKTsKLWdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpncnBjX2NodHRwMl9wYXJzaW5nX2FjY2VwdF9zdHJlYW0oCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICB1aW50MzJfdCBpZCk7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfYWRkX2luY29taW5nX2dvYXdheSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICB1aW50MzJfdCBnb2F3YXlfZXJyb3IsIGdwcl9zbGljZSBnb2F3YXlfdGV4dCk7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfcmVnaXN0ZXJfc3RyZWFtKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbSAqcyk7Ci0vKiByZXR1cm5zIDEgaWYgdGhpcyBpcyB0aGUgbGFzdCBzdHJlYW0sIDAgb3RoZXJ3aXNlICovCi1pbnQgZ3JwY19jaHR0cDJfdW5yZWdpc3Rlcl9zdHJlYW0oZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbSAqcykgR1JQQ19NVVNUX1VTRV9SRVNVTFQ7Ci1pbnQgZ3JwY19jaHR0cDJfaGFzX3N0cmVhbXMoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KTsKLXZvaWQgZ3JwY19jaHR0cDJfZm9yX2FsbF9zdHJlYW1zKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICB2b2lkICgqY2IpKGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpKTsKLQotdm9pZCBncnBjX2NodHRwMl9wYXJzaW5nX2JlY29tZV9za2lwX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKLQotdm9pZCBncnBjX2NodHRwMl9jb21wbGV0ZV9jbG9zdXJlX3N0ZXAoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKipwY2xvc3VyZSwgaW50IHN1Y2Nlc3MpOwotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0NMSUVOVF9DT05ORUNUX1NUUklORyAiUFJJICogSFRUUC8yLjBcclxuXHJcblNNXHJcblxyXG4iCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0NMSUVOVF9DT05ORUNUX1NUUkxFTiBcCi0gIChzaXplb2YoR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSSU5HKSAtIDEpCi0KLWV4dGVybiBpbnQgZ3JwY19odHRwX3RyYWNlOwotZXh0ZXJuIGludCBncnBjX2Zsb3djdGxfdHJhY2U7Ci0KLSNkZWZpbmUgR1JQQ19DSFRUUDJfSUZfVFJBQ0lORyhzdG10KSBcCi0gIGlmICghKGdycGNfaHR0cF90cmFjZSkpICAgICAgICAgICAgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0bXQKLQotdHlwZWRlZiBlbnVtIHsKLSAgR1JQQ19DSFRUUDJfRkxPV0NUTF9NT1ZFLAotICBHUlBDX0NIVFRQMl9GTE9XQ1RMX0NSRURJVCwKLSAgR1JQQ19DSFRUUDJfRkxPV0NUTF9ERUJJVAotfSBncnBjX2NodHRwMl9mbG93Y3RsX29wOwotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0ZMT1dfTU9WRV9DT01NT04ocGhhc2UsIHRyYW5zcG9ydCwgaWQxLCBpZDIsIGRzdF9jb250ZXh0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3Zhciwgc3JjX2NvbnRleHQsIHNyY192YXIpICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXNzZXJ0KGlkMSA9PSBpZDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGdycGNfZmxvd2N0bF90cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBncnBjX2NodHRwMl9mbG93Y3RsX3RyYWNlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBwaGFzZSwgR1JQQ19DSFRUUDJfRkxPV0NUTF9NT1ZFLCAjZHN0X2NvbnRleHQsICBcCi0gICAgICAgICAgI2RzdF92YXIsICNzcmNfY29udGV4dCwgI3NyY192YXIsIHRyYW5zcG9ydC0+aXNfY2xpZW50LCBpZDEsICAgICAgICBcCi0gICAgICAgICAgZHN0X2NvbnRleHQtPmRzdF92YXIsIHNyY19jb250ZXh0LT5zcmNfdmFyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZHN0X2NvbnRleHQtPmRzdF92YXIgKz0gc3JjX2NvbnRleHQtPnNyY192YXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3JjX2NvbnRleHQtPnNyY192YXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19NT1ZFX1NUUkVBTShwaGFzZSwgdHJhbnNwb3J0LCBkc3RfY29udGV4dCwgZHN0X3ZhciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb250ZXh0LCBzcmNfdmFyKSAgICAgICAgICAgICAgICAgICBcCi0gIEdSUENfQ0hUVFAyX0ZMT1dfTU9WRV9DT01NT04ocGhhc2UsIHRyYW5zcG9ydCwgZHN0X2NvbnRleHQtPmlkLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29udGV4dC0+aWQsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb250ZXh0LCBzcmNfdmFyKQotI2RlZmluZSBHUlBDX0NIVFRQMl9GTE9XX01PVkVfVFJBTlNQT1JUKHBoYXNlLCBkc3RfY29udGV4dCwgZHN0X3ZhciwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29udGV4dCwgc3JjX3ZhcikgICAgICAgICAgICAgICAgICBcCi0gIEdSUENfQ0hUVFAyX0ZMT1dfTU9WRV9DT01NT04ocGhhc2UsIGRzdF9jb250ZXh0LCAwLCAwLCBkc3RfY29udGV4dCwgZHN0X3ZhciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb250ZXh0LCBzcmNfdmFyKQotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX0NPTU1PTihwaGFzZSwgdHJhbnNwb3J0LCBpZCwgZHN0X2NvbnRleHQsICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ZhciwgYW1vdW50KSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGdycGNfZmxvd2N0bF90cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZ3JwY19jaHR0cDJfZmxvd2N0bF90cmFjZShfX0ZJTEVfXywgX19MSU5FX18sIHBoYXNlLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfRkxPV0NUTF9DUkVESVQsICNkc3RfY29udGV4dCwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkc3RfdmFyLCBOVUxMLCAjYW1vdW50LCB0cmFuc3BvcnQtPmlzX2NsaWVudCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZHN0X2NvbnRleHQtPmRzdF92YXIsIGFtb3VudCk7ICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZHN0X2NvbnRleHQtPmRzdF92YXIgKz0gYW1vdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTShwaGFzZSwgdHJhbnNwb3J0LCBkc3RfY29udGV4dCwgZHN0X3ZhciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfQ09NTU9OKHBoYXNlLCB0cmFuc3BvcnQsIGRzdF9jb250ZXh0LT5pZCwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfY29udGV4dCwgZHN0X3ZhciwgYW1vdW50KQotI2RlZmluZSBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9UUkFOU1BPUlQocGhhc2UsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCBhbW91bnQpIFwKLSAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfQ09NTU9OKHBoYXNlLCBkc3RfY29udGV4dCwgMCwgZHN0X2NvbnRleHQsIGRzdF92YXIsICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQpCi0KLSNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9DT01NT04ocGhhc2UsIHRyYW5zcG9ydCwgaWQsIGRzdF9jb250ZXh0LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF92YXIsIGFtb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoZ3JwY19mbG93Y3RsX3RyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBncnBjX2NodHRwMl9mbG93Y3RsX3RyYWNlKF9fRklMRV9fLCBfX0xJTkVfXywgcGhhc2UsICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9GTE9XQ1RMX0RFQklULCAjZHN0X2NvbnRleHQsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RzdF92YXIsIE5VTEwsICNhbW91bnQsIHRyYW5zcG9ydC0+aXNfY2xpZW50LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkc3RfY29udGV4dC0+ZHN0X3ZhciwgYW1vdW50KTsgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkc3RfY29udGV4dC0+ZHN0X3ZhciAtPSBhbW91bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9TVFJFQU0ocGhhc2UsIHRyYW5zcG9ydCwgZHN0X2NvbnRleHQsIGRzdF92YXIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9DT01NT04ocGhhc2UsIHRyYW5zcG9ydCwgZHN0X2NvbnRleHQtPmlkLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2NvbnRleHQsIGRzdF92YXIsIGFtb3VudCkKLSNkZWZpbmUgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9UUkFOU1BPUlQocGhhc2UsIGRzdF9jb250ZXh0LCBkc3RfdmFyLCBhbW91bnQpIFwKLSAgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9DT01NT04ocGhhc2UsIGRzdF9jb250ZXh0LCAwLCBkc3RfY29udGV4dCwgZHN0X3ZhciwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50KQotCi12b2lkIGdycGNfY2h0dHAyX2Zsb3djdGxfdHJhY2UoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKnBoYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX2Zsb3djdGxfb3Agb3AsIGNvbnN0IGNoYXIgKmNvbnRleHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcjEsIGNvbnN0IGNoYXIgKmNvbnRleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcjIsIGludCBpc19jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLCBpbnQ2NF90IHZhbDEsIGludDY0X3QgdmFsMik7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfZmFrZV9zdGF0dXMoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMsIGdwcl9zbGljZSAqZGV0YWlscyk7Ci12b2lkIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZCgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLCBpbnQgY2xvc2VfcmVhZHMsCi0gICAgaW50IGNsb3NlX3dyaXRlcyk7Ci12b2lkIGdycGNfY2h0dHAyX3N0YXJ0X3dyaXRpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCk7Ci0KLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKHN0cmVhbV9nbG9iYWwsIHJlYXNvbikgXAotICBncnBjX2NodHRwMl9zdHJlYW1fcmVmKHN0cmVhbV9nbG9iYWwsIHJlYXNvbikKLSNkZWZpbmUgR1JQQ19DSFRUUDJfU1RSRUFNX1VOUkVGKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCByZWFzb24pIFwKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3VucmVmKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCByZWFzb24pCi12b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9yZWYoZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKLSNlbHNlCi0jZGVmaW5lIEdSUENfQ0hUVFAyX1NUUkVBTV9SRUYoc3RyZWFtX2dsb2JhbCwgcmVhc29uKSBcCi0gIGdycGNfY2h0dHAyX3N0cmVhbV9yZWYoc3RyZWFtX2dsb2JhbCkKLSNkZWZpbmUgR1JQQ19DSFRUUDJfU1RSRUFNX1VOUkVGKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCByZWFzb24pIFwKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3VucmVmKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsKQotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fcmVmKGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpOwotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKTsKLSNlbmRpZgotCi1ncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fY3JlYXRlKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nLCB1aW50MzJfdCBmcmFtZV9zaXplLAotICAgIHVpbnQzMl90IGZsYWdzLCBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZSAqYWRkX3RvX3F1ZXVlKTsKLXZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fcHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIHNsaWNlKTsKLXZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fZmluaXNoZWQoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpicywgaW50IHN1Y2Nlc3MsCi0gICAgaW50IGZyb21fcGFyc2luZ190aHJlYWQpOwotCi12b2lkIGdycGNfY2h0dHAyX2Fja19waW5nKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqb3BhcXVlXzhieXRlcyk7Ci0KLS8qKiBhZGQgYSByZWYgdG8gdGhlIHN0cmVhbSBhbmQgYWRkIGl0IHRvIHRoZSB3cml0YWJsZSBsaXN0OwotICAgIHJlZiB3aWxsIGJlIGRyb3BwZWQgaW4gd3JpdGluZy5jICovCi12b2lkIGdycGNfY2h0dHAyX2JlY29tZV93cml0YWJsZShncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvcGFyc2luZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTE2ZjM5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvcGFyc2luZy5jCisrKyAvZGV2L251bGwKQEAgLTEsODY2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCi0KLXN0YXRpYyBpbnQgaW5pdF9mcmFtZV9wYXJzZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZyk7Ci1zdGF0aWMgaW50IGluaXRfaGVhZGVyX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGludCBpc19jb250aW51YXRpb24pOwotc3RhdGljIGludCBpbml0X2RhdGFfZnJhbWVfcGFyc2VyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpOwotc3RhdGljIGludCBpbml0X3JzdF9zdHJlYW1fcGFyc2VyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpOwotc3RhdGljIGludCBpbml0X3NldHRpbmdzX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKLXN0YXRpYyBpbnQgaW5pdF93aW5kb3dfdXBkYXRlX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKTsKLXN0YXRpYyBpbnQgaW5pdF9waW5nX3BhcnNlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpOwotc3RhdGljIGludCBpbml0X2dvYXdheV9wYXJzZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpOwotc3RhdGljIGludCBpbml0X3NraXBfZnJhbWVfcGFyc2VyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgaW50IGlzX2hlYWRlcik7Ci0KLXN0YXRpYyBpbnQgcGFyc2VfZnJhbWVfc2xpY2UoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCk7Ci0KLXZvaWQgZ3JwY19jaHR0cDJfcHJlcGFyZV90b19yZWFkKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZzsKLQotICBHUFJfVElNRVJfQkVHSU4oImdycGNfY2h0dHAyX3ByZXBhcmVfdG9fcmVhZCIsIDApOwotCi0gIHRyYW5zcG9ydF9wYXJzaW5nLT5uZXh0X3N0cmVhbV9pZCA9IHRyYW5zcG9ydF9nbG9iYWwtPm5leHRfc3RyZWFtX2lkOwotICB0cmFuc3BvcnRfcGFyc2luZy0+bGFzdF9zZW50X21heF90YWJsZV9zaXplID0KLSAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfU0VOVF9TRVRUSU5HU10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0dSUENfQ0hUVFAyX1NFVFRJTkdTX0hFQURFUl9UQUJMRV9TSVpFXTsKLQotICAvKiB1cGRhdGUgdGhlIHBhcnNpbmcgdmlldyBvZiBpbmNvbWluZyB3aW5kb3cgKi8KLSAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX3VuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19hdmFpbGFibGUoCi0gICAgICB0cmFuc3BvcnRfZ2xvYmFsLCB0cmFuc3BvcnRfcGFyc2luZywgJnN0cmVhbV9nbG9iYWwsICZzdHJlYW1fcGFyc2luZykpIHsKLSAgICBHUlBDX0NIVFRQMl9GTE9XX01PVkVfU1RSRUFNKCJwYXJzZSIsIHRyYW5zcG9ydF9wYXJzaW5nLCBzdHJlYW1fcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nX3dpbmRvdywgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19mb3JfcGFyc2UpOwotICB9Ci0KLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jaHR0cDJfcHJlcGFyZV90b19yZWFkIiwgMCk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfcHVibGlzaF9yZWFkcygKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nOwotICBpbnQgd2FzX3plcm87Ci0gIGludCBpc196ZXJvOwotCi0gIC8qIHRyYW5zcG9ydF9wYXJzaW5nLT5sYXN0X2luY29taW5nX3N0cmVhbV9pZCBpcyB1c2VkIGFzCi0gICAgIGxhc3QtZ3JwY19jaHR0cDJfc3RyZWFtLWlkIHdoZW4KLSAgICAgc2VuZGluZyBHT0FXQVkgZnJhbWUuCi0gICAgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtaHR0cDItMTcjc2VjdGlvbi02LjgKLSAgICAgc2F5cyB0aGF0IGxhc3QtZ3JwY19jaHR0cDJfc3RyZWFtLWlkIGlzIHBlZXItaW5pdGlhdGVkIGdycGNfY2h0dHAyX3N0cmVhbQotICAgICBJRC4gIFNvLAotICAgICBzaW5jZSB3ZSBkb24ndCBoYXZlIHNlcnZlciBwdXNoZWQgc3RyZWFtcywgY2xpZW50IHNob3VsZCBzZW5kCi0gICAgIEdPQVdBWSBsYXN0LWdycGNfY2h0dHAyX3N0cmVhbS1pZD0wIGluIHRoaXMgY2FzZS4gKi8KLSAgaWYgKCF0cmFuc3BvcnRfcGFyc2luZy0+aXNfY2xpZW50KSB7Ci0gICAgdHJhbnNwb3J0X2dsb2JhbC0+bGFzdF9pbmNvbWluZ19zdHJlYW1faWQgPQotICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkOwotICB9Ci0KLSAgLyogdXBkYXRlIGdsb2JhbCBzZXR0aW5ncyAqLwotICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzX3VwZGF0ZWQpIHsKLSAgICBtZW1jcHkodHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19QRUVSX1NFVFRJTkdTXSwKLSAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzLCBzaXplb2YodHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzKSk7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzX3VwZGF0ZWQgPSAwOwotICB9Ci0KLSAgLyogdXBkYXRlIHNldHRpbmdzIGJhc2VkIG9uIGFjayBpZiByZWNlaXZlZCAqLwotICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzX2Fja19yZWNlaXZlZCkgewotICAgIG1lbWNweSh0cmFuc3BvcnRfZ2xvYmFsLT5zZXR0aW5nc1tHUlBDX0FDS0VEX1NFVFRJTkdTXSwKLSAgICAgICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19TRU5UX1NFVFRJTkdTXSwKLSAgICAgICAgICAgR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzX2Fja19yZWNlaXZlZCA9IDA7Ci0gICAgdHJhbnNwb3J0X2dsb2JhbC0+c2VudF9sb2NhbF9zZXR0aW5ncyA9IDA7Ci0gIH0KLQotICAvKiBtb3ZlIGdvYXdheSB0byB0aGUgZ2xvYmFsIHN0YXRlIGlmIHdlIHJlY2VpdmVkIG9uZSAoaXQgd2lsbCBiZQotICAgICBwdWJsaXNoZWQgbGF0ZXIgKi8KLSAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfcmVjZWl2ZWQpIHsKLSAgICBncnBjX2NodHRwMl9hZGRfaW5jb21pbmdfZ29hd2F5KGV4ZWNfY3R4LCB0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+Z29hd2F5X3RleHQpOwotICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfdGV4dCA9IGdwcl9lbXB0eV9zbGljZSgpOwotICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5nb2F3YXlfcmVjZWl2ZWQgPSAwOwotICB9Ci0KLSAgLyogcHJvcGFnYXRlIGZsb3cgY29udHJvbCB0b2tlbnMgdG8gZ2xvYmFsIHN0YXRlICovCi0gIHdhc196ZXJvID0gdHJhbnNwb3J0X2dsb2JhbC0+b3V0Z29pbmdfd2luZG93IDw9IDA7Ci0gIEdSUENfQ0hUVFAyX0ZMT1dfTU9WRV9UUkFOU1BPUlQoInBhcnNlZCIsIHRyYW5zcG9ydF9nbG9iYWwsIG91dGdvaW5nX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZywgb3V0Z29pbmdfd2luZG93KTsKLSAgaXNfemVybyA9IHRyYW5zcG9ydF9nbG9iYWwtPm91dGdvaW5nX3dpbmRvdyA8PSAwOwotICBpZiAod2FzX3plcm8gJiYgIWlzX3plcm8pIHsKLSAgICB3aGlsZSAoZ3JwY19jaHR0cDJfbGlzdF9wb3Bfc3RhbGxlZF9ieV90cmFuc3BvcnQodHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9nbG9iYWwpKSB7Ci0gICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ193aW5kb3cgPAotICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+Y29ubmVjdGlvbl93aW5kb3dfdGFyZ2V0ICogMyAvIDQpIHsKLSAgICBpbnQ2NF90IGFubm91bmNlX2J5dGVzID0gdHJhbnNwb3J0X2dsb2JhbC0+Y29ubmVjdGlvbl93aW5kb3dfdGFyZ2V0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3dpbmRvdzsKLSAgICBHUlBDX0NIVFRQMl9GTE9XX0NSRURJVF9UUkFOU1BPUlQoInBhcnNlZCIsIHRyYW5zcG9ydF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlX2luY29taW5nX3dpbmRvdywgYW5ub3VuY2VfYnl0ZXMpOwotICAgIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1RSQU5TUE9SVCgicGFyc2VkIiwgdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nX3dpbmRvdywgYW5ub3VuY2VfYnl0ZXMpOwotICB9Ci0KLSAgLyogZm9yIGVhY2ggc3RyZWFtIHRoYXQgc2F3IGFuIHVwZGF0ZSwgZml4dXAgZ2xvYmFsIHN0YXRlICovCi0gIHdoaWxlIChncnBjX2NodHRwMl9saXN0X3BvcF9wYXJzaW5nX3NlZW5fc3RyZWFtKAotICAgICAgdHJhbnNwb3J0X2dsb2JhbCwgdHJhbnNwb3J0X3BhcnNpbmcsICZzdHJlYW1fZ2xvYmFsLCAmc3RyZWFtX3BhcnNpbmcpKSB7Ci0gICAgaWYgKHN0cmVhbV9wYXJzaW5nLT5zZWVuX2Vycm9yKSB7Ci0gICAgICBzdHJlYW1fZ2xvYmFsLT5zZWVuX2Vycm9yID0gMTsKLSAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX2NoZWNrX3JlYWRfb3BzKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSBvdXRnb2luZyBmbG93IGNvbnRyb2wgd2luZG93ICovCi0gICAgd2FzX3plcm8gPSBzdHJlYW1fZ2xvYmFsLT5vdXRnb2luZ193aW5kb3cgPD0gMDsKLSAgICBHUlBDX0NIVFRQMl9GTE9XX01PVkVfU1RSRUFNKCJwYXJzZWQiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfd2luZG93LCBzdHJlYW1fcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nX3dpbmRvdyk7Ci0gICAgaXNfemVybyA9IHN0cmVhbV9nbG9iYWwtPm91dGdvaW5nX3dpbmRvdyA8PSAwOwotICAgIGlmICh3YXNfemVybyAmJiAhaXNfemVybykgewotICAgICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOwotICAgIH0KLQotICAgIHN0cmVhbV9nbG9iYWwtPm1heF9yZWN2X2J5dGVzIC09ICh1aW50MzJfdClHUFJfTUlOKAotICAgICAgICBzdHJlYW1fZ2xvYmFsLT5tYXhfcmVjdl9ieXRlcywgc3RyZWFtX3BhcnNpbmctPnJlY2VpdmVkX2J5dGVzKTsKLSAgICBzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfYnl0ZXMgPSAwOwotCi0gICAgLyogcHVibGlzaCBpbmNvbWluZyBzdHJlYW0gb3BzICovCi0gICAgaWYgKHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy50YWlsICE9IE5VTEwpIHsKLSAgICAgIHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy50YWlsLT5pc190YWlsID0gMDsKLSAgICB9Ci0gICAgaWYgKHN0cmVhbV9wYXJzaW5nLT5kYXRhX3BhcnNlci5pbmNvbWluZ19mcmFtZXMuaGVhZCAhPSBOVUxMKSB7Ci0gICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgICB9Ci0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWVfbWVyZ2UoCi0gICAgICAgICZzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMsCi0gICAgICAgICZzdHJlYW1fcGFyc2luZy0+ZGF0YV9wYXJzZXIuaW5jb21pbmdfZnJhbWVzKTsKLSAgICBpZiAoc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzLnRhaWwgIT0gTlVMTCkgewotICAgICAgc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzLnRhaWwtPmlzX3RhaWwgPSAxOwotICAgIH0KLQotICAgIGlmICghc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX2luaXRpYWxfbWV0YWRhdGEgJiYKLSAgICAgICAgc3RyZWFtX3BhcnNpbmctPmdvdF9tZXRhZGF0YV9vbl9wYXJzZVswXSkgewotICAgICAgc3RyZWFtX3BhcnNpbmctPmdvdF9tZXRhZGF0YV9vbl9wYXJzZVswXSA9IDA7Ci0gICAgICBzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfaW5pdGlhbF9tZXRhZGF0YSA9IDE7Ci0gICAgICBHUFJfU1dBUChncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXIsCi0gICAgICAgICAgICAgICBzdHJlYW1fcGFyc2luZy0+bWV0YWRhdGFfYnVmZmVyWzBdLAotICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbC0+cmVjZWl2ZWRfaW5pdGlhbF9tZXRhZGF0YSk7Ci0gICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfdHJhaWxpbmdfbWV0YWRhdGEgJiYKLSAgICAgICAgc3RyZWFtX3BhcnNpbmctPmdvdF9tZXRhZGF0YV9vbl9wYXJzZVsxXSkgewotICAgICAgc3RyZWFtX3BhcnNpbmctPmdvdF9tZXRhZGF0YV9vbl9wYXJzZVsxXSA9IDA7Ci0gICAgICBzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfdHJhaWxpbmdfbWV0YWRhdGEgPSAxOwotICAgICAgR1BSX1NXQVAoZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyLAotICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmctPm1ldGFkYXRhX2J1ZmZlclsxXSwKLSAgICAgICAgICAgICAgIHN0cmVhbV9nbG9iYWwtPnJlY2VpdmVkX3RyYWlsaW5nX21ldGFkYXRhKTsKLSAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX2NoZWNrX3JlYWRfb3BzKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOwotICAgIH0KLQotICAgIGlmIChzdHJlYW1fcGFyc2luZy0+c2F3X3JzdF9zdHJlYW0pIHsKLSAgICAgIGlmIChzdHJlYW1fcGFyc2luZy0+cnN0X3N0cmVhbV9yZWFzb24gIT0gR1JQQ19DSFRUUDJfTk9fRVJST1IpIHsKLSAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXNfY29kZSA9IGdycGNfY2h0dHAyX2h0dHAyX2Vycm9yX3RvX2dycGNfc3RhdHVzKAotICAgICAgICAgICAgKGdycGNfY2h0dHAyX2Vycm9yX2NvZGUpc3RyZWFtX3BhcnNpbmctPnJzdF9zdHJlYW1fcmVhc29uKTsKLSAgICAgICAgY2hhciAqc3RhdHVzX2RldGFpbHM7Ci0gICAgICAgIGdwcl9zbGljZSBzbGljZV9kZXRhaWxzOwotICAgICAgICBncHJfYXNwcmludGYoJnN0YXR1c19kZXRhaWxzLCAiUmVjZWl2ZWQgUlNUX1NUUkVBTSBlcnI9JWQiLAotICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhcnNpbmctPnJzdF9zdHJlYW1fcmVhc29uKTsKLSAgICAgICAgc2xpY2VfZGV0YWlscyA9IGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcoc3RhdHVzX2RldGFpbHMpOwotICAgICAgICBncHJfZnJlZShzdGF0dXNfZGV0YWlscyk7Ci0gICAgICAgIGdycGNfY2h0dHAyX2Zha2Vfc3RhdHVzKGV4ZWNfY3R4LCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfY29kZSwgJnNsaWNlX2RldGFpbHMpOwotICAgICAgfQotICAgICAgZ3JwY19jaHR0cDJfbWFya19zdHJlYW1fY2xvc2VkKGV4ZWNfY3R4LCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEpOwotICAgIH0KLQotICAgIGlmIChzdHJlYW1fcGFyc2luZy0+cmVjZWl2ZWRfY2xvc2UpIHsKLSAgICAgIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKTsKLSAgICB9Ci0gIH0KLX0KLQotaW50IGdycGNfY2h0dHAyX3BlcmZvcm1fcmVhZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Ugc2xpY2UpIHsKLSAgdWludDhfdCAqYmVnID0gR1BSX1NMSUNFX1NUQVJUX1BUUihzbGljZSk7Ci0gIHVpbnQ4X3QgKmVuZCA9IEdQUl9TTElDRV9FTkRfUFRSKHNsaWNlKTsKLSAgdWludDhfdCAqY3VyID0gYmVnOwotCi0gIGlmIChjdXIgPT0gZW5kKSByZXR1cm4gMTsKLQotICBzd2l0Y2ggKHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlKSB7Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzA6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzE6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzI6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzM6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzQ6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzU6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzY6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzc6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzg6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzk6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzEwOgotICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xMToKLSAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTI6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzEzOgotICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNDoKLSAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTU6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzE2OgotICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8xNzoKLSAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMTg6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzE5OgotICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMDoKLSAgICBjYXNlIEdSUENfRFRTX0NMSUVOVF9QUkVGSVhfMjE6Ci0gICAgY2FzZSBHUlBDX0RUU19DTElFTlRfUFJFRklYXzIyOgotICAgIGNhc2UgR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8yMzoKLSAgICAgIHdoaWxlIChjdXIgIT0gZW5kICYmIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlICE9IEdSUENfRFRTX0ZIXzApIHsKLSAgICAgICAgaWYgKCpjdXIgIT0gR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSSU5HW3RyYW5zcG9ydF9wYXJzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5kZWZyYW1lX3N0YXRlXSkgewotICAgICAgICAgIGdwcl9sb2coR1BSX0lORk8sCi0gICAgICAgICAgICAgICAgICAiQ29ubmVjdCBzdHJpbmcgbWlzbWF0Y2g6IGV4cGVjdGVkICclYycgKCVkKSBnb3QgJyVjJyAoJWQpICIKLSAgICAgICAgICAgICAgICAgICJhdCBieXRlICVkIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0NMSUVOVF9DT05ORUNUX1NUUklOR1t0cmFuc3BvcnRfcGFyc2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmRlZnJhbWVfc3RhdGVdLAotICAgICAgICAgICAgICAgICAgKGludCkodWludDhfdClHUlBDX0NIVFRQMl9DTElFTlRfQ09OTkVDVF9TVFJJTkcKLSAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGVdLAotICAgICAgICAgICAgICAgICAgKmN1ciwgKGludCkqY3VyLCB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgKytjdXI7Ci0gICAgICAgICsrdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGU7Ci0gICAgICB9Ci0gICAgICBpZiAoY3VyID09IGVuZCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGR0c19maF8wOgotICAgIGNhc2UgR1JQQ19EVFNfRkhfMDoKLSAgICAgIEdQUl9BU1NFUlQoY3VyIDwgZW5kKTsKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplID0gKCh1aW50MzJfdCkqY3VyKSA8PCAxNjsKLSAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGUgPSBHUlBDX0RUU19GSF8xOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19EVFNfRkhfMToKLSAgICAgIEdQUl9BU1NFUlQoY3VyIDwgZW5kKTsKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplIHw9ICgodWludDMyX3QpKmN1cikgPDwgODsKLSAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGUgPSBHUlBDX0RUU19GSF8yOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19EVFNfRkhfMjoKLSAgICAgIEdQUl9BU1NFUlQoY3VyIDwgZW5kKTsKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplIHw9ICpjdXI7Ci0gICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfMzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfRFRTX0ZIXzM6Ci0gICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7Ci0gICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfdHlwZSA9ICpjdXI7Ci0gICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfNDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfRFRTX0ZIXzQ6Ci0gICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7Ci0gICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MgPSAqY3VyOwotICAgICAgaWYgKCsrY3VyID09IGVuZCkgewotICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZGVmcmFtZV9zdGF0ZSA9IEdSUENfRFRTX0ZIXzU7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBHUlBDX0RUU19GSF81OgotICAgICAgR1BSX0FTU0VSVChjdXIgPCBlbmQpOwotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCA9ICgoKHVpbnQzMl90KSpjdXIpICYgMHg3ZikgPDwgMjQ7Ci0gICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfNjsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfRFRTX0ZIXzY6Ci0gICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7Ci0gICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkIHw9ICgodWludDMyX3QpKmN1cikgPDwgMTY7Ci0gICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfNzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfRFRTX0ZIXzc6Ci0gICAgICBHUFJfQVNTRVJUKGN1ciA8IGVuZCk7Ci0gICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkIHw9ICgodWludDMyX3QpKmN1cikgPDwgODsKLSAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGUgPSBHUlBDX0RUU19GSF84OwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgR1JQQ19EVFNfRkhfODoKLSAgICAgIEdQUl9BU1NFUlQoY3VyIDwgZW5kKTsKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgfD0gKCh1aW50MzJfdCkqY3VyKTsKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRlJBTUU7Ci0gICAgICBpZiAoIWluaXRfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZykpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCkgewotICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+bGFzdF9pbmNvbWluZ19zdHJlYW1faWQgPQotICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZDsKLSAgICAgIH0KLSAgICAgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIGlmICghcGFyc2VfZnJhbWVfc2xpY2UoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCBncHJfZW1wdHlfc2xpY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPSBOVUxMOwotICAgICAgICBpZiAoKytjdXIgPT0gZW5kKSB7Ci0gICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmRlZnJhbWVfc3RhdGUgPSBHUlBDX0RUU19GSF8wOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGdvdG8gZHRzX2ZoXzA7IC8qIGxvb3AgKi8KLSAgICAgIH0KLSAgICAgIGlmICgrK2N1ciA9PSBlbmQpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgLyogZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIEdSUENfRFRTX0ZSQU1FOgotICAgICAgR1BSX0FTU0VSVChjdXIgPCBlbmQpOwotICAgICAgaWYgKCh1aW50MzJfdCkoZW5kIC0gY3VyKSA9PSB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSkgewotICAgICAgICBpZiAoIXBhcnNlX2ZyYW1lX3NsaWNlKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2Vfc3ViX25vX3JlZihzbGljZSwgKHNpemVfdCkoY3VyIC0gYmVnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KShlbmQgLSBiZWcpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5kZWZyYW1lX3N0YXRlID0gR1JQQ19EVFNfRkhfMDsKLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfSBlbHNlIGlmICgodWludDMyX3QpKGVuZCAtIGN1cikgPgotICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSkgewotICAgICAgICBzaXplX3QgY3VyX29mZnNldCA9IChzaXplX3QpKGN1ciAtIGJlZyk7Ci0gICAgICAgIGlmICghcGFyc2VfZnJhbWVfc2xpY2UoCi0gICAgICAgICAgICAgICAgZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgICAgICAgICAgIGdwcl9zbGljZV9zdWJfbm9fcmVmKAotICAgICAgICAgICAgICAgICAgICBzbGljZSwgY3VyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY3VyX29mZnNldCArIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplKSwKLSAgICAgICAgICAgICAgICAxKSkgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGN1ciArPSB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZTsKLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbSA9IE5VTEw7Ci0gICAgICAgIGdvdG8gZHRzX2ZoXzA7IC8qIGxvb3AgKi8KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghcGFyc2VfZnJhbWVfc2xpY2UoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZV9zdWJfbm9fcmVmKHNsaWNlLCAoc2l6ZV90KShjdXIgLSBiZWcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKGVuZCAtIGJlZykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSB7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUgLT0gKHVpbnQzMl90KShlbmQgLSBjdXIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICAgIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKLSAgfQotCi0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKLX0KLQotc3RhdGljIGludCBpbml0X2ZyYW1lX3BhcnNlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7Ci0gIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+ZXhwZWN0X2NvbnRpbnVhdGlvbl9zdHJlYW1faWQgIT0gMCkgewotICAgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfdHlwZSAhPQotICAgICAgICBHUlBDX0NIVFRQMl9GUkFNRV9DT05USU5VQVRJT04pIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiRXhwZWN0ZWQgQ09OVElOVUFUSU9OIGZyYW1lLCBnb3QgZnJhbWUgdHlwZSAlMDJ4IiwKLSAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3R5cGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh0cmFuc3BvcnRfcGFyc2luZy0+ZXhwZWN0X2NvbnRpbnVhdGlvbl9zdHJlYW1faWQgIT0KLSAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgICAgICJFeHBlY3RlZCBDT05USU5VQVRJT04gZnJhbWUgZm9yIGdycGNfY2h0dHAyX3N0cmVhbSAlMDh4LCBnb3QgIgotICAgICAgICAgICAgICAiZ3JwY19jaHR0cDJfc3RyZWFtICUwOHgiLAotICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZXhwZWN0X2NvbnRpbnVhdGlvbl9zdHJlYW1faWQsCi0gICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBpbml0X2hlYWRlcl9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAxKTsKLSAgfQotICBzd2l0Y2ggKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV90eXBlKSB7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9GUkFNRV9EQVRBOgotICAgICAgcmV0dXJuIGluaXRfZGF0YV9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX0ZSQU1FX0hFQURFUjoKLSAgICAgIHJldHVybiBpbml0X2hlYWRlcl9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAwKTsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX0ZSQU1FX0NPTlRJTlVBVElPTjoKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiVW5leHBlY3RlZCBDT05USU5VQVRJT04gZnJhbWUiKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfRlJBTUVfUlNUX1NUUkVBTToKLSAgICAgIHJldHVybiBpbml0X3JzdF9zdHJlYW1fcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZyk7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9GUkFNRV9TRVRUSU5HUzoKLSAgICAgIHJldHVybiBpbml0X3NldHRpbmdzX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcpOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfRlJBTUVfV0lORE9XX1VQREFURToKLSAgICAgIHJldHVybiBpbml0X3dpbmRvd191cGRhdGVfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZyk7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9GUkFNRV9QSU5HOgotICAgICAgcmV0dXJuIGluaXRfcGluZ19wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX0ZSQU1FX0dPQVdBWToKLSAgICAgIHJldHVybiBpbml0X2dvYXdheV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgICBkZWZhdWx0OgotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJVbmtub3duIGZyYW1lIHR5cGUgJTAyeCIsCi0gICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV90eXBlKTsKLSAgICAgIHJldHVybiBpbml0X3NraXBfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMCk7Ci0gIH0KLX0KLQotc3RhdGljIGdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIHNraXBfcGFyc2VyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpwYXJzZXIsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgZ3ByX3NsaWNlIHNsaWNlLCBpbnQgaXNfbGFzdCkgewotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIHNraXBfaGVhZGVyKHZvaWQgKnRwLCBncnBjX21kZWxlbSAqbWQpIHsgR1JQQ19NREVMRU1fVU5SRUYobWQpOyB9Ci0KLXN0YXRpYyBpbnQgaW5pdF9za2lwX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGludCBpc19oZWFkZXIpIHsKLSAgaWYgKGlzX2hlYWRlcikgewotICAgIHVpbnQ4X3QgaXNfZW9oID0gdHJhbnNwb3J0X3BhcnNpbmctPmV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkICE9IDA7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9IGdycGNfY2h0dHAyX2hlYWRlcl9wYXJzZXJfcGFyc2U7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcl9kYXRhID0gJnRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXI7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlci5vbl9oZWFkZXIgPSBza2lwX2hlYWRlcjsKLSAgICB0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLm9uX2hlYWRlcl91c2VyX2RhdGEgPSBOVUxMOwotICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIuaXNfYm91bmRhcnkgPSBpc19lb2g7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlci5pc19lb2YgPQotICAgICAgICAodWludDhfdCkoaXNfZW9oID8gdHJhbnNwb3J0X3BhcnNpbmctPmhlYWRlcl9lb2YgOiAwKTsKLSAgfSBlbHNlIHsKLSAgICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyID0gc2tpcF9wYXJzZXI7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfcGFyc2luZ19iZWNvbWVfc2tpcF9wYXJzZXIoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZykgewotICBpbml0X3NraXBfZnJhbWVfcGFyc2VyKAotICAgICAgZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9PSBncnBjX2NodHRwMl9oZWFkZXJfcGFyc2VyX3BhcnNlKTsKLX0KLQotc3RhdGljIGdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIHVwZGF0ZV9pbmNvbWluZ193aW5kb3coCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcpIHsKLSAgdWludDMyX3QgaW5jb21pbmdfZnJhbWVfc2l6ZSA9IHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplOwotICBpZiAoaW5jb21pbmdfZnJhbWVfc2l6ZSA+IHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ193aW5kb3cpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgImZyYW1lIG9mIHNpemUgJWQgb3ZlcmZsb3dzIGluY29taW5nIHdpbmRvdyBvZiAlZCIsCi0gICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ193aW5kb3cpOwotICAgIHJldHVybiBHUlBDX0NIVFRQMl9DT05ORUNUSU9OX0VSUk9SOwotICB9Ci0KLSAgaWYgKGluY29taW5nX2ZyYW1lX3NpemUgPiBzdHJlYW1fcGFyc2luZy0+aW5jb21pbmdfd2luZG93KSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJmcmFtZSBvZiBzaXplICVkIG92ZXJmbG93cyBpbmNvbWluZyB3aW5kb3cgb2YgJWQiLAotICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUsCi0gICAgICAgICAgICBzdHJlYW1fcGFyc2luZy0+aW5jb21pbmdfd2luZG93KTsKLSAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjsKLSAgfQotCi0gIEdSUENfQ0hUVFAyX0ZMT1dfREVCSVRfVFJBTlNQT1JUKCJwYXJzZSIsIHRyYW5zcG9ydF9wYXJzaW5nLCBpbmNvbWluZ193aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nX2ZyYW1lX3NpemUpOwotICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1NUUkVBTSgicGFyc2UiLCB0cmFuc3BvcnRfcGFyc2luZywgc3RyZWFtX3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nX3dpbmRvdywgaW5jb21pbmdfZnJhbWVfc2l6ZSk7Ci0gIHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9ieXRlcyArPSBpbmNvbWluZ19mcmFtZV9zaXplOwotCi0gIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsIHN0cmVhbV9wYXJzaW5nKTsKLQotICByZXR1cm4gR1JQQ19DSFRUUDJfUEFSU0VfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9kYXRhX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZyA9Ci0gICAgICBncnBjX2NodHRwMl9wYXJzaW5nX2xvb2t1cF9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCk7Ci0gIGdycGNfY2h0dHAyX3BhcnNlX2Vycm9yIGVyciA9IEdSUENfQ0hUVFAyX1BBUlNFX09LOwotICBpZiAoIXN0cmVhbV9wYXJzaW5nIHx8IHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9jbG9zZSkKLSAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDApOwotICBpZiAoZXJyID09IEdSUENfQ0hUVFAyX1BBUlNFX09LKSB7Ci0gICAgZXJyID0gdXBkYXRlX2luY29taW5nX3dpbmRvdyhleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIHN0cmVhbV9wYXJzaW5nKTsKLSAgfQotICBpZiAoZXJyID09IEdSUENfQ0hUVFAyX1BBUlNFX09LKSB7Ci0gICAgZXJyID0gZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgICAgICZzdHJlYW1fcGFyc2luZy0+ZGF0YV9wYXJzZXIsIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncyk7Ci0gIH0KLSAgc3dpdGNoIChlcnIpIHsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX1BBUlNFX09LOgotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbSA9IHN0cmVhbV9wYXJzaW5nOwotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9IGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX3BhcnNlOwotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcl9kYXRhID0gJnN0cmVhbV9wYXJzaW5nLT5kYXRhX3BhcnNlcjsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfU1RSRUFNX0VSUk9SOgotICAgICAgc3RyZWFtX3BhcnNpbmctPnJlY2VpdmVkX2Nsb3NlID0gMTsKLSAgICAgIHN0cmVhbV9wYXJzaW5nLT5zYXdfcnN0X3N0cmVhbSA9IDE7Ci0gICAgICBzdHJlYW1fcGFyc2luZy0+cnN0X3N0cmVhbV9yZWFzb24gPSBHUlBDX0NIVFRQMl9QUk9UT0NPTF9FUlJPUjsKLSAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAotICAgICAgICAgICZ0cmFuc3BvcnRfcGFyc2luZy0+cWJ1ZiwKLSAgICAgICAgICBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX2NyZWF0ZSh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX1BST1RPQ09MX0VSUk9SKSk7Ci0gICAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDApOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjoKLSAgICAgIHJldHVybiAwOwotICB9Ci0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV90aW1lb3V0KHZvaWQgKnApIHsgZ3ByX2ZyZWUocCk7IH0KLQotc3RhdGljIHZvaWQgb25faW5pdGlhbF9oZWFkZXIodm9pZCAqdHAsIGdycGNfbWRlbGVtICptZCkgewotICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcgPSB0cDsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nID0KLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW07Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJvbl9pbml0aWFsX2hlYWRlciIsIDApOwotCi0gIEdQUl9BU1NFUlQoc3RyZWFtX3BhcnNpbmcpOwotCi0gIEdSUENfQ0hUVFAyX0lGX1RSQUNJTkcoZ3ByX2xvZygKLSAgICAgIEdQUl9JTkZPLCAiSFRUUDolZDpIRFI6JXM6ICVzOiAlcyIsIHN0cmVhbV9wYXJzaW5nLT5pZCwKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pc19jbGllbnQgPyAiQ0xJIiA6ICJTVlIiLAotICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+a2V5KSwgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpKSk7Ci0KLSAgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9HUlBDX1NUQVRVUyAmJiBtZCAhPSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18wKSB7Ci0gICAgLyogVE9ETyhjdGlsbGVyKTogY2hlY2sgZm9yIGEgc3RhdHVzIGxpa2UgIiAwIiAqLwotICAgIHN0cmVhbV9wYXJzaW5nLT5zZWVuX2Vycm9yID0gMTsKLSAgfQotCi0gIGlmIChtZC0+a2V5ID09IEdSUENfTURTVFJfR1JQQ19USU1FT1VUKSB7Ci0gICAgZ3ByX3RpbWVzcGVjICpjYWNoZWRfdGltZW91dCA9IGdycGNfbWRlbGVtX2dldF91c2VyX2RhdGEobWQsIGZyZWVfdGltZW91dCk7Ci0gICAgaWYgKCFjYWNoZWRfdGltZW91dCkgewotICAgICAgLyogbm90IGFscmVhZHkgcGFyc2VkOiBwYXJzZSBpdCBub3csIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGF3YXkgKi8KLSAgICAgIGNhY2hlZF90aW1lb3V0ID0gZ3ByX21hbGxvYyhzaXplb2YoZ3ByX3RpbWVzcGVjKSk7Ci0gICAgICBpZiAoIWdycGNfY2h0dHAyX2RlY29kZV90aW1lb3V0KGdycGNfbWRzdHJfYXNfY19zdHJpbmcobWQtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkX3RpbWVvdXQpKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSWdub3JpbmcgYmFkIHRpbWVvdXQgdmFsdWUgJyVzJyIsCi0gICAgICAgICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpKTsKLSAgICAgICAgKmNhY2hlZF90aW1lb3V0ID0gZ3ByX2luZl9mdXR1cmUoR1BSX1RJTUVTUEFOKTsKLSAgICAgIH0KLSAgICAgIGdycGNfbWRlbGVtX3NldF91c2VyX2RhdGEobWQsIGZyZWVfdGltZW91dCwgY2FjaGVkX3RpbWVvdXQpOwotICAgIH0KLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfc2V0X2RlYWRsaW5lKAotICAgICAgICAmc3RyZWFtX3BhcnNpbmctPm1ldGFkYXRhX2J1ZmZlclswXSwKLSAgICAgICAgZ3ByX3RpbWVfYWRkKGdwcl9ub3coR1BSX0NMT0NLX01PTk9UT05JQyksICpjYWNoZWRfdGltZW91dCkpOwotICAgIEdSUENfTURFTEVNX1VOUkVGKG1kKTsKLSAgfSBlbHNlIHsKLSAgICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfYWRkKAotICAgICAgICAmc3RyZWFtX3BhcnNpbmctPm1ldGFkYXRhX2J1ZmZlclswXSwgbWQpOwotICB9Ci0KLSAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfcGFyc2luZ19zZWVuX3N0cmVhbSh0cmFuc3BvcnRfcGFyc2luZywgc3RyZWFtX3BhcnNpbmcpOwotCi0gIEdQUl9USU1FUl9FTkQoIm9uX2luaXRpYWxfaGVhZGVyIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9uX3RyYWlsaW5nX2hlYWRlcih2b2lkICp0cCwgZ3JwY19tZGVsZW0gKm1kKSB7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZyA9IHRwOwotICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcgPQotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbTsKLQotICBHUFJfVElNRVJfQkVHSU4oIm9uX3RyYWlsaW5nX2hlYWRlciIsIDApOwotCi0gIEdQUl9BU1NFUlQoc3RyZWFtX3BhcnNpbmcpOwotCi0gIEdSUENfQ0hUVFAyX0lGX1RSQUNJTkcoZ3ByX2xvZygKLSAgICAgIEdQUl9JTkZPLCAiSFRUUDolZDpUUkw6JXM6ICVzOiAlcyIsIHN0cmVhbV9wYXJzaW5nLT5pZCwKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pc19jbGllbnQgPyAiQ0xJIiA6ICJTVlIiLAotICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+a2V5KSwgZ3JwY19tZHN0cl9hc19jX3N0cmluZyhtZC0+dmFsdWUpKSk7Ci0KLSAgaWYgKG1kLT5rZXkgPT0gR1JQQ19NRFNUUl9HUlBDX1NUQVRVUyAmJiBtZCAhPSBHUlBDX01ERUxFTV9HUlBDX1NUQVRVU18wKSB7Ci0gICAgLyogVE9ETyhjdGlsbGVyKTogY2hlY2sgZm9yIGEgc3RhdHVzIGxpa2UgIiAwIiAqLwotICAgIHN0cmVhbV9wYXJzaW5nLT5zZWVuX2Vycm9yID0gMTsKLSAgfQotCi0gIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9hZGQoJnN0cmVhbV9wYXJzaW5nLT5tZXRhZGF0YV9idWZmZXJbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQpOwotCi0gIGdycGNfY2h0dHAyX2xpc3RfYWRkX3BhcnNpbmdfc2Vlbl9zdHJlYW0odHJhbnNwb3J0X3BhcnNpbmcsIHN0cmVhbV9wYXJzaW5nKTsKLQotICBHUFJfVElNRVJfRU5EKCJvbl90cmFpbGluZ19oZWFkZXIiLCAwKTsKLX0KLQotc3RhdGljIGludCBpbml0X2hlYWRlcl9mcmFtZV9wYXJzZXIoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBpbnQgaXNfY29udGludWF0aW9uKSB7Ci0gIHVpbnQ4X3QgaXNfZW9oID0gKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncyAmCi0gICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0RBVEFfRkxBR19FTkRfSEVBREVSUykgIT0gMDsKLSAgaW50IHZpYV9hY2NlcHQgPSAwOwotICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmc7Ci0KLSAgLyogVE9ETyhjdGlsbGVyKTogd2hlbiB0byBpbmNyZW1lbnQgaGVhZGVyX2ZyYW1lc19yZWNlaXZlZD8gKi8KLQotICBpZiAoaXNfZW9oKSB7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPmV4cGVjdF9jb250aW51YXRpb25fc3RyZWFtX2lkID0gMDsKLSAgfSBlbHNlIHsKLSAgICB0cmFuc3BvcnRfcGFyc2luZy0+ZXhwZWN0X2NvbnRpbnVhdGlvbl9zdHJlYW1faWQgPQotICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkOwotICB9Ci0KLSAgaWYgKCFpc19jb250aW51YXRpb24pIHsKLSAgICB0cmFuc3BvcnRfcGFyc2luZy0+aGVhZGVyX2VvZiA9ICh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0RBVEFfRkxBR19FTkRfU1RSRUFNKSAhPSAwOwotICB9Ci0KLSAgLyogY291bGQgYmUgYSBuZXcgZ3JwY19jaHR0cDJfc3RyZWFtIG9yIGFuIGV4aXN0aW5nIGdycGNfY2h0dHAyX3N0cmVhbSAqLwotICBzdHJlYW1fcGFyc2luZyA9IGdycGNfY2h0dHAyX3BhcnNpbmdfbG9va3VwX3N0cmVhbSgKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLCB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKTsKLSAgaWYgKHN0cmVhbV9wYXJzaW5nID09IE5VTEwpIHsKLSAgICBpZiAoaXNfY29udGludWF0aW9uKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICAgImdycGNfY2h0dHAyX3N0cmVhbSBkaXNiYW5kZWQgYmVmb3JlIENPTlRJTlVBVElPTiByZWNlaXZlZCIpOwotICAgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAxKTsKLSAgICB9Ci0gICAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pc19jbGllbnQpIHsKLSAgICAgIGlmICgodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCAmIDEpICYmCi0gICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCA8Ci0gICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5uZXh0X3N0cmVhbV9pZCkgewotICAgICAgICAvKiB0aGlzIGlzIGFuIG9sZCAocHJvYmFibHkgY2FuY2VsbGVkKSBncnBjX2NodHRwMl9zdHJlYW0gKi8KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgICAgICJpZ25vcmluZyBuZXcgZ3JwY19jaHR0cDJfc3RyZWFtIGNyZWF0aW9uIG9uIGNsaWVudCIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGluaXRfc2tpcF9mcmFtZV9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nLCAxKTsKLSAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5sYXN0X2luY29taW5nX3N0cmVhbV9pZCA+Ci0gICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICAgImlnbm9yaW5nIG91dCBvZiBvcmRlciBuZXcgZ3JwY19jaHR0cDJfc3RyZWFtIHJlcXVlc3Qgb24gc2VydmVyOyAiCi0gICAgICAgICAgICAgICJsYXN0IGdycGNfY2h0dHAyX3N0cmVhbSAiCi0gICAgICAgICAgICAgICJpZD0lZCwgbmV3IGdycGNfY2h0dHAyX3N0cmVhbSBpZD0lZCIsCi0gICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5sYXN0X2luY29taW5nX3N0cmVhbV9pZCwKLSAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCk7Ci0gICAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDEpOwotICAgIH0gZWxzZSBpZiAoKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQgJiAxKSA9PSAwKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICAgImlnbm9yaW5nIGdycGNfY2h0dHAyX3N0cmVhbSB3aXRoIG5vbi1jbGllbnQgZ2VuZXJhdGVkIGluZGV4ICVkIiwKLSAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCk7Ci0gICAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDEpOwotICAgIH0KLSAgICBzdHJlYW1fcGFyc2luZyA9IHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPQotICAgICAgICBncnBjX2NodHRwMl9wYXJzaW5nX2FjY2VwdF9zdHJlYW0oCi0gICAgICAgICAgICBleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOwotICAgIGlmIChzdHJlYW1fcGFyc2luZyA9PSBOVUxMKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgImdycGNfY2h0dHAyX3N0cmVhbSBub3QgYWNjZXB0ZWQiKTsKLSAgICAgIHJldHVybiBpbml0X3NraXBfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMSk7Ci0gICAgfQotICAgIHZpYV9hY2NlcHQgPSAxOwotICB9IGVsc2UgewotICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPSBzdHJlYW1fcGFyc2luZzsKLSAgfQotICBHUFJfQVNTRVJUKHN0cmVhbV9wYXJzaW5nICE9IE5VTEwgJiYgKHZpYV9hY2NlcHQgPT0gMCB8fCB2aWFfYWNjZXB0ID09IDEpKTsKLSAgaWYgKHN0cmVhbV9wYXJzaW5nLT5yZWNlaXZlZF9jbG9zZSkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAic2tpcHBpbmcgYWxyZWFkeSBjbG9zZWQgZ3JwY19jaHR0cDJfc3RyZWFtIGhlYWRlciIpOwotICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0gPSBOVUxMOwotICAgIHJldHVybiBpbml0X3NraXBfZnJhbWVfcGFyc2VyKGV4ZWNfY3R4LCB0cmFuc3BvcnRfcGFyc2luZywgMSk7Ci0gIH0KLSAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9IGdycGNfY2h0dHAyX2hlYWRlcl9wYXJzZXJfcGFyc2U7Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSA9ICZ0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyOwotICBzd2l0Y2ggKHN0cmVhbV9wYXJzaW5nLT5oZWFkZXJfZnJhbWVzX3JlY2VpdmVkKSB7Ci0gICAgY2FzZSAwOgotICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlci5vbl9oZWFkZXIgPSBvbl9pbml0aWFsX2hlYWRlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIub25faGVhZGVyID0gb25fdHJhaWxpbmdfaGVhZGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJ0b28gbWFueSBoZWFkZXIgZnJhbWVzIHJlY2VpdmVkIik7Ci0gICAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDEpOwotICB9Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIub25faGVhZGVyX3VzZXJfZGF0YSA9IHRyYW5zcG9ydF9wYXJzaW5nOwotICB0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLmlzX2JvdW5kYXJ5ID0gaXNfZW9oOwotICB0cmFuc3BvcnRfcGFyc2luZy0+aHBhY2tfcGFyc2VyLmlzX2VvZiA9Ci0gICAgICAodWludDhfdCkoaXNfZW9oID8gdHJhbnNwb3J0X3BhcnNpbmctPmhlYWRlcl9lb2YgOiAwKTsKLSAgaWYgKCFpc19jb250aW51YXRpb24gJiYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9GTEFHX0hBU19QUklPUklUWSkpIHsKLSAgICBncnBjX2NodHRwMl9ocGFja19wYXJzZXJfc2V0X2hhc19wcmlvcml0eSgmdHJhbnNwb3J0X3BhcnNpbmctPmhwYWNrX3BhcnNlcik7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF93aW5kb3dfdXBkYXRlX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7Ci0gIGludCBvayA9IEdSUENfQ0hUVFAyX1BBUlNFX09LID09IGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfcGFyc2VyX2JlZ2luX2ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9ydF9wYXJzaW5nLT5zaW1wbGUud2luZG93X3VwZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX2ZsYWdzKTsKLSAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpIHsKLSAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtID0gZ3JwY19jaHR0cDJfcGFyc2luZ19sb29rdXBfc3RyZWFtKAotICAgICAgICB0cmFuc3BvcnRfcGFyc2luZywgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCk7Ci0gIH0KLSAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlciA9IGdycGNfY2h0dHAyX3dpbmRvd191cGRhdGVfcGFyc2VyX3BhcnNlOwotICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyX2RhdGEgPSAmdHJhbnNwb3J0X3BhcnNpbmctPnNpbXBsZS53aW5kb3dfdXBkYXRlOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9waW5nX3BhcnNlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpIHsKLSAgaW50IG9rID0gR1JQQ19DSFRUUDJfUEFSU0VfT0sgPT0gZ3JwY19jaHR0cDJfcGluZ19wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPnNpbXBsZS5waW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MpOwotICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyID0gZ3JwY19jaHR0cDJfcGluZ19wYXJzZXJfcGFyc2U7Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSA9ICZ0cmFuc3BvcnRfcGFyc2luZy0+c2ltcGxlLnBpbmc7Ci0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBpbml0X3JzdF9zdHJlYW1fcGFyc2VyKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcpIHsKLSAgaW50IG9rID0gR1JQQ19DSFRUUDJfUEFSU0VfT0sgPT0gZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPnNpbXBsZS5yc3Rfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfZmxhZ3MpOwotICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtID0gZ3JwY19jaHR0cDJfcGFyc2luZ19sb29rdXBfc3RyZWFtKAotICAgICAgdHJhbnNwb3J0X3BhcnNpbmcsIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOwotICBpZiAoIXRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW0pIHsKLSAgICByZXR1cm4gaW5pdF9za2lwX2ZyYW1lX3BhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsIDApOwotICB9Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX3BhcnNlcl9wYXJzZTsKLSAgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcl9kYXRhID0gJnRyYW5zcG9ydF9wYXJzaW5nLT5zaW1wbGUucnN0X3N0cmVhbTsKLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgaW50IGluaXRfZ29hd2F5X3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7Ci0gIGludCBvayA9IEdSUENfQ0hUVFAyX1BBUlNFX09LID09IGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPmdvYXdheV9wYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncyk7Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX3BhcnNlOwotICB0cmFuc3BvcnRfcGFyc2luZy0+cGFyc2VyX2RhdGEgPSAmdHJhbnNwb3J0X3BhcnNpbmctPmdvYXdheV9wYXJzZXI7Ci0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBpbml0X3NldHRpbmdzX2ZyYW1lX3BhcnNlcigKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nKSB7Ci0gIGludCBvazsKLQotICBpZiAodHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX3N0cmVhbV9pZCAhPSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJzZXR0aW5ncyBmcmFtZSByZWNlaXZlZCBmb3IgZ3JwY19jaHR0cDJfc3RyZWFtICVkIiwKLSAgICAgICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW1faWQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgb2sgPSBHUlBDX0NIVFRQMl9QQVJTRV9PSyA9PSBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXJfYmVnaW5fZnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnRfcGFyc2luZy0+c2ltcGxlLnNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmctPmluY29taW5nX2ZyYW1lX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRfcGFyc2luZy0+c2V0dGluZ3MpOwotICBpZiAoIW9rKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19mcmFtZV9mbGFncyAmIEdSUENfQ0hUVFAyX0ZMQUdfQUNLKSB7Ci0gICAgdHJhbnNwb3J0X3BhcnNpbmctPnNldHRpbmdzX2Fja19yZWNlaXZlZCA9IDE7Ci0gICAgZ3JwY19jaHR0cDJfaHB0Ymxfc2V0X21heF9ieXRlcygKLSAgICAgICAgJnRyYW5zcG9ydF9wYXJzaW5nLT5ocGFja19wYXJzZXIudGFibGUsCi0gICAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5sYXN0X3NlbnRfbWF4X3RhYmxlX3NpemUpOwotICB9Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXIgPSBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJzZXJfcGFyc2U7Ci0gIHRyYW5zcG9ydF9wYXJzaW5nLT5wYXJzZXJfZGF0YSA9ICZ0cmFuc3BvcnRfcGFyc2luZy0+c2ltcGxlLnNldHRpbmdzOwotICByZXR1cm4gb2s7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IGlzX3dpbmRvd191cGRhdGVfbGVnYWwoaW50NjRfdCB3aW5kb3dfdXBkYXRlLCBpbnQ2NF90IHdpbmRvdykgewotICByZXR1cm4gd2luZG93ICsgd2luZG93X3VwZGF0ZSA8IE1BWF9XSU5ET1c7Ci19Ci0qLwotCi1zdGF0aWMgaW50IHBhcnNlX2ZyYW1lX3NsaWNlKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBzbGljZSwgaW50IGlzX2xhc3QpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nID0KLSAgICAgIHRyYW5zcG9ydF9wYXJzaW5nLT5pbmNvbWluZ19zdHJlYW07Ci0gIHN3aXRjaCAodHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcihleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmctPnBhcnNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X3BhcnNpbmcsIHN0cmVhbV9wYXJzaW5nLCBzbGljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xhc3QpKSB7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9QQVJTRV9PSzoKLSAgICAgIGlmIChzdHJlYW1fcGFyc2luZykgewotICAgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKHRyYW5zcG9ydF9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9wYXJzaW5nKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfU1RSRUFNX0VSUk9SOgotICAgICAgZ3JwY19jaHR0cDJfcGFyc2luZ19iZWNvbWVfc2tpcF9wYXJzZXIoZXhlY19jdHgsIHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgICAgIGlmIChzdHJlYW1fcGFyc2luZykgewotICAgICAgICBzdHJlYW1fcGFyc2luZy0+c2F3X3JzdF9zdHJlYW0gPSAxOwotICAgICAgICBzdHJlYW1fcGFyc2luZy0+cnN0X3N0cmVhbV9yZWFzb24gPSBHUlBDX0NIVFRQMl9QUk9UT0NPTF9FUlJPUjsKLSAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoCi0gICAgICAgICAgICAmdHJhbnNwb3J0X3BhcnNpbmctPnFidWYsCi0gICAgICAgICAgICBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX2NyZWF0ZSh0cmFuc3BvcnRfcGFyc2luZy0+aW5jb21pbmdfc3RyZWFtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfUFJPVE9DT0xfRVJST1IpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfQ09OTkVDVElPTl9FUlJPUjoKLSAgICAgIHJldHVybiAwOwotICB9Ci0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAwKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMTRiMC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgiCi0KLWludCBncnBjX2NodHRwMl9ncnBjX3N0YXR1c190b19odHRwMl9lcnJvcihncnBjX3N0YXR1c19jb2RlIHN0YXR1cykgewotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2UgR1JQQ19TVEFUVVNfT0s6Ci0gICAgICByZXR1cm4gR1JQQ19DSFRUUDJfTk9fRVJST1I7Ci0gICAgY2FzZSBHUlBDX1NUQVRVU19DQU5DRUxMRUQ6Ci0gICAgICByZXR1cm4gR1JQQ19DSFRUUDJfQ0FOQ0VMOwotICAgIGNhc2UgR1JQQ19TVEFUVVNfUkVTT1VSQ0VfRVhIQVVTVEVEOgotICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX0VOSEFOQ0VfWU9VUl9DQUxNOwotICAgIGNhc2UgR1JQQ19TVEFUVVNfUEVSTUlTU0lPTl9ERU5JRUQ6Ci0gICAgICByZXR1cm4gR1JQQ19DSFRUUDJfSU5BREVRVUFURV9TRUNVUklUWTsKLSAgICBjYXNlIEdSUENfU1RBVFVTX1VOQVZBSUxBQkxFOgotICAgICAgcmV0dXJuIEdSUENfQ0hUVFAyX1JFRlVTRURfU1RSRUFNOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gR1JQQ19DSFRUUDJfSU5URVJOQUxfRVJST1I7Ci0gIH0KLX0KLQotZ3JwY19zdGF0dXNfY29kZSBncnBjX2NodHRwMl9odHRwMl9lcnJvcl90b19ncnBjX3N0YXR1cygKLSAgICBncnBjX2NodHRwMl9lcnJvcl9jb2RlIGVycm9yKSB7Ci0gIHN3aXRjaCAoZXJyb3IpIHsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX05PX0VSUk9SOgotICAgICAgLyogc2hvdWxkIG5ldmVyIGJlIHJlY2VpdmVkICovCi0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfSU5URVJOQUw7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9DQU5DRUw6Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfQ0FOQ0VMTEVEOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfRU5IQU5DRV9ZT1VSX0NBTE06Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfUkVTT1VSQ0VfRVhIQVVTVEVEOwotICAgIGNhc2UgR1JQQ19DSFRUUDJfSU5BREVRVUFURV9TRUNVUklUWToKLSAgICAgIHJldHVybiBHUlBDX1NUQVRVU19QRVJNSVNTSU9OX0RFTklFRDsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX1JFRlVTRURfU1RSRUFNOgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1VOQVZBSUxBQkxFOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfSU5URVJOQUw7Ci0gIH0KLX0KLQotZ3JwY19zdGF0dXNfY29kZSBncnBjX2NodHRwMl9odHRwMl9zdGF0dXNfdG9fZ3JwY19zdGF0dXMoaW50IHN0YXR1cykgewotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIC8qIHRoZXNlIEhUVFAyIHN0YXR1cyBjb2RlcyBhcmUgY2FsbGVkIG91dCBleHBsaWNpdGx5IGluIHN0YXR1cy5wcm90byAqLwotICAgIGNhc2UgMjAwOgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX09LOwotICAgIGNhc2UgNDAwOgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0lOVkFMSURfQVJHVU1FTlQ7Ci0gICAgY2FzZSA0MDE6Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfVU5BVVRIRU5USUNBVEVEOwotICAgIGNhc2UgNDAzOgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1BFUk1JU1NJT05fREVOSUVEOwotICAgIGNhc2UgNDA0OgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX05PVF9GT1VORDsKLSAgICBjYXNlIDQwOToKLSAgICAgIHJldHVybiBHUlBDX1NUQVRVU19BQk9SVEVEOwotICAgIGNhc2UgNDEyOgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0ZBSUxFRF9QUkVDT05ESVRJT047Ci0gICAgY2FzZSA0Mjk6Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfUkVTT1VSQ0VfRVhIQVVTVEVEOwotICAgIGNhc2UgNDk5OgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX0NBTkNFTExFRDsKLSAgICBjYXNlIDUwMDoKLSAgICAgIHJldHVybiBHUlBDX1NUQVRVU19VTktOT1dOOwotICAgIGNhc2UgNTAxOgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1VOSU1QTEVNRU5URUQ7Ci0gICAgY2FzZSA1MDM6Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfVU5BVkFJTEFCTEU7Ci0gICAgY2FzZSA1MDQ6Ci0gICAgICByZXR1cm4gR1JQQ19TVEFUVVNfREVBRExJTkVfRVhDRUVERUQ7Ci0gICAgLyogZXZlcnl0aGluZyBlbHNlIGlzIHVua25vd24gKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEdSUENfU1RBVFVTX1VOS05PV047Ci0gIH0KLX0KLQotaW50IGdycGNfY2h0dHAyX2dycGNfc3RhdHVzX3RvX2h0dHAyX3N0YXR1cyhncnBjX3N0YXR1c19jb2RlIHN0YXR1cykgewotICByZXR1cm4gMjAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUwNjZiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfU1RBVFVTX0NPTlZFUlNJT05fSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9TVEFUVVNfQ09OVkVSU0lPTl9ICi0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIgotCi0vKiBDb252ZXJzaW9uIG9mIGdycGMgc3RhdHVzIGNvZGVzIHRvIGh0dHAyIGVycm9yIGNvZGVzIChmb3IgUlNUX1NUUkVBTSkgKi8KLWdycGNfY2h0dHAyX2Vycm9yX2NvZGUgZ3JwY19jaHR0cDJfZ3JwY19zdGF0dXNfdG9faHR0cDJfZXJyb3IoCi0gICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpOwotZ3JwY19zdGF0dXNfY29kZSBncnBjX2NodHRwMl9odHRwMl9lcnJvcl90b19ncnBjX3N0YXR1cygKLSAgICBncnBjX2NodHRwMl9lcnJvcl9jb2RlIGVycm9yKTsKLQotLyogQ29udmVyc2lvbiBvZiBIVFRQIHN0YXR1cyBjb2RlcyAoOnN0YXR1cykgdG8gZ3JwYyBzdGF0dXMgY29kZXMgKi8KLWdycGNfc3RhdHVzX2NvZGUgZ3JwY19jaHR0cDJfaHR0cDJfc3RhdHVzX3RvX2dycGNfc3RhdHVzKGludCBzdGF0dXMpOwotaW50IGdycGNfY2h0dHAyX2dycGNfc3RhdHVzX3RvX2h0dHAyX3N0YXR1cyhncnBjX3N0YXR1c19jb2RlIHN0YXR1cyk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9TVEFUVVNfQ09OVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbGlzdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmZTczNS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLSNkZWZpbmUgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0Zyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpKSkKLQotI2RlZmluZSBTVFJFQU1fRlJPTV9HTE9CQUwoc2cpIFwKLSAgKChncnBjX2NodHRwMl9zdHJlYW0gKikoKGNoYXIgKikoc2cpLW9mZnNldG9mKGdycGNfY2h0dHAyX3N0cmVhbSwgZ2xvYmFsKSkpCi0KLSNkZWZpbmUgVFJBTlNQT1JUX0ZST01fV1JJVElORyh0dykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0dyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nKSkpCi0KLSNkZWZpbmUgU1RSRUFNX0ZST01fV1JJVElORyhzdykgXAotICAoKGdycGNfY2h0dHAyX3N0cmVhbSAqKSgoY2hhciAqKShzdyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfc3RyZWFtLCB3cml0aW5nKSkpCi0KLSNkZWZpbmUgVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0cCktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nKSkpCi0KLSNkZWZpbmUgU1RSRUFNX0ZST01fUEFSU0lORyhzcCkgXAotICAoKGdycGNfY2h0dHAyX3N0cmVhbSAqKSgoY2hhciAqKShzcCktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfc3RyZWFtLCBwYXJzaW5nKSkpCi0KLS8qIGNvcmUgbGlzdCBtYW5hZ2VtZW50ICovCi0KLXN0YXRpYyBpbnQgc3RyZWFtX2xpc3RfZW1wdHkoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZCBpZCkgewotICByZXR1cm4gdC0+bGlzdHNbaWRdLmhlYWQgPT0gTlVMTDsKLX0KLQotc3RhdGljIGludCBzdHJlYW1fbGlzdF9wb3AoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICoqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2xpc3RfaWQgaWQpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzID0gdC0+bGlzdHNbaWRdLmhlYWQ7Ci0gIGlmIChzKSB7Ci0gICAgZ3JwY19jaHR0cDJfc3RyZWFtICpuZXdfaGVhZCA9IHMtPmxpbmtzW2lkXS5uZXh0OwotICAgIEdQUl9BU1NFUlQocy0+aW5jbHVkZWRbaWRdKTsKLSAgICBpZiAobmV3X2hlYWQpIHsKLSAgICAgIHQtPmxpc3RzW2lkXS5oZWFkID0gbmV3X2hlYWQ7Ci0gICAgICBuZXdfaGVhZC0+bGlua3NbaWRdLnByZXYgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICB0LT5saXN0c1tpZF0uaGVhZCA9IE5VTEw7Ci0gICAgICB0LT5saXN0c1tpZF0udGFpbCA9IE5VTEw7Ci0gICAgfQotICAgIHMtPmluY2x1ZGVkW2lkXSA9IDA7Ci0gIH0KLSAgKnN0cmVhbSA9IHM7Ci0gIHJldHVybiBzICE9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0cmVhbV9saXN0X3JlbW92ZShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsIGdycGNfY2h0dHAyX3N0cmVhbSAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZCBpZCkgewotICBHUFJfQVNTRVJUKHMtPmluY2x1ZGVkW2lkXSk7Ci0gIHMtPmluY2x1ZGVkW2lkXSA9IDA7Ci0gIGlmIChzLT5saW5rc1tpZF0ucHJldikgewotICAgIHMtPmxpbmtzW2lkXS5wcmV2LT5saW5rc1tpZF0ubmV4dCA9IHMtPmxpbmtzW2lkXS5uZXh0OwotICB9IGVsc2UgewotICAgIEdQUl9BU1NFUlQodC0+bGlzdHNbaWRdLmhlYWQgPT0gcyk7Ci0gICAgdC0+bGlzdHNbaWRdLmhlYWQgPSBzLT5saW5rc1tpZF0ubmV4dDsKLSAgfQotICBpZiAocy0+bGlua3NbaWRdLm5leHQpIHsKLSAgICBzLT5saW5rc1tpZF0ubmV4dC0+bGlua3NbaWRdLnByZXYgPSBzLT5saW5rc1tpZF0ucHJldjsKLSAgfSBlbHNlIHsKLSAgICB0LT5saXN0c1tpZF0udGFpbCA9IHMtPmxpbmtzW2lkXS5wcmV2OwotICB9Ci19Ci0KLXN0YXRpYyBib29sIHN0cmVhbV9saXN0X21heWJlX3JlbW92ZShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9saXN0X2lkIGlkKSB7Ci0gIGlmIChzLT5pbmNsdWRlZFtpZF0pIHsKLSAgICBzdHJlYW1fbGlzdF9yZW1vdmUodCwgcywgaWQpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzdHJlYW1fbGlzdF9hZGRfdGFpbChncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW0gKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fbGlzdF9pZCBpZCkgewotICBncnBjX2NodHRwMl9zdHJlYW0gKm9sZF90YWlsOwotICBHUFJfQVNTRVJUKCFzLT5pbmNsdWRlZFtpZF0pOwotICBvbGRfdGFpbCA9IHQtPmxpc3RzW2lkXS50YWlsOwotICBzLT5saW5rc1tpZF0ubmV4dCA9IE5VTEw7Ci0gIHMtPmxpbmtzW2lkXS5wcmV2ID0gb2xkX3RhaWw7Ci0gIGlmIChvbGRfdGFpbCkgewotICAgIG9sZF90YWlsLT5saW5rc1tpZF0ubmV4dCA9IHM7Ci0gIH0gZWxzZSB7Ci0gICAgdC0+bGlzdHNbaWRdLmhlYWQgPSBzOwotICB9Ci0gIHQtPmxpc3RzW2lkXS50YWlsID0gczsKLSAgcy0+aW5jbHVkZWRbaWRdID0gMTsKLX0KLQotc3RhdGljIGJvb2wgc3RyZWFtX2xpc3RfYWRkKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwgZ3JwY19jaHR0cDJfc3RyZWFtICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9saXN0X2lkIGlkKSB7Ci0gIGlmIChzLT5pbmNsdWRlZFtpZF0pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RyZWFtX2xpc3RfYWRkX3RhaWwodCwgcywgaWQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogd3JhcHBlcnMgZm9yIHNwZWNpYWxpemF0aW9ucyAqLwotCi1ib29sIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRhYmxlX3N0cmVhbSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKLSAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5pZCAhPSAwKTsKLSAgcmV0dXJuIHN0cmVhbV9saXN0X2FkZChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVEFCTEUpOwotfQotCi1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd3JpdGFibGVfc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICoqc3RyZWFtX3dyaXRpbmcpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07Ci0gIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUQUJMRSk7Ci0gIGlmIChyICE9IDApIHsKLSAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKLSAgICAqc3RyZWFtX3dyaXRpbmcgPSAmc3RyZWFtLT53cml0aW5nOwotICB9Ci0gIHJldHVybiByOwotfQotCi1ib29sIGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3dyaXRhYmxlX3N0cmVhbSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKLSAgcmV0dXJuIHN0cmVhbV9saXN0X21heWJlX3JlbW92ZShUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVEFCTEUpOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpIHsKLSAgR1BSX0FTU0VSVChzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTV9GUk9NX1dSSVRJTkcoc3RyZWFtX3dyaXRpbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1dSSVRJTkcpKTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2xpc3RfaGF2ZV93cml0aW5nX3N0cmVhbXMoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nKSB7Ci0gIHJldHVybiAhc3RyZWFtX2xpc3RfZW1wdHkoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUSU5HKTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3dyaXRpbmdfc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqKnN0cmVhbV93cml0aW5nKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOwotICBpbnQgciA9IHN0cmVhbV9saXN0X3BvcChUUkFOU1BPUlRfRlJPTV9XUklUSU5HKHRyYW5zcG9ydF93cml0aW5nKSwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUSU5HKTsKLSAgaWYgKHIgIT0gMCkgewotICAgICpzdHJlYW1fd3JpdGluZyA9ICZzdHJlYW0tPndyaXRpbmc7Ci0gIH0KLSAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdHRlbl9zdHJlYW0oCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZykgewotICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCi0gICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9XUklUSU5HKHN0cmVhbV93cml0aW5nKSwKLSAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVFRFTik7Ci19Ci0KLWludCBncnBjX2NodHRwMl9saXN0X3BvcF93cml0dGVuX3N0cmVhbSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqKnN0cmVhbV93cml0aW5nKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOwotICBpbnQgciA9IHN0cmVhbV9saXN0X3BvcChUUkFOU1BPUlRfRlJPTV9XUklUSU5HKHRyYW5zcG9ydF93cml0aW5nKSwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XUklUVEVOKTsKLSAgaWYgKHIgIT0gMCkgewotICAgICpzdHJlYW1fZ2xvYmFsID0gJnN0cmVhbS0+Z2xvYmFsOwotICAgICpzdHJlYW1fd3JpdGluZyA9ICZzdHJlYW0tPndyaXRpbmc7Ci0gIH0KLSAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKLSAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5pZCAhPSAwKTsKLSAgc3RyZWFtX2xpc3RfYWRkKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwKLSAgICAgICAgICAgICAgICAgIFNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKSwKLSAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfVU5BTk5PVU5DRURfSU5DT01JTkdfV0lORE9XX0FWQUlMQUJMRSk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9yZW1vdmVfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKLSAgc3RyZWFtX2xpc3RfbWF5YmVfcmVtb3ZlKAotICAgICAgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLAotICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAotICAgICAgR1JQQ19DSFRUUDJfTElTVF9VTkFOTk9VTkNFRF9JTkNPTUlOR19XSU5ET1dfQVZBSUxBQkxFKTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX3VuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19hdmFpbGFibGUoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfcGFyc2luZyAqdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKipzdHJlYW1fcGFyc2luZykgewotICBncnBjX2NodHRwMl9zdHJlYW0gKnN0cmVhbTsKLSAgaW50IHIgPQotICAgICAgc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1VOQU5OT1VOQ0VEX0lOQ09NSU5HX1dJTkRPV19BVkFJTEFCTEUpOwotICBpZiAociAhPSAwKSB7Ci0gICAgKnN0cmVhbV9nbG9iYWwgPSAmc3RyZWFtLT5nbG9iYWw7Ci0gICAgKnN0cmVhbV9wYXJzaW5nID0gJnN0cmVhbS0+cGFyc2luZzsKLSAgfQotICByZXR1cm4gcjsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF9wYXJzaW5nX3NlZW5fc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqc3RyZWFtX3BhcnNpbmcpIHsKLSAgc3RyZWFtX2xpc3RfYWRkKFRSQU5TUE9SVF9GUk9NX1BBUlNJTkcodHJhbnNwb3J0X3BhcnNpbmcpLAotICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fUEFSU0lORyhzdHJlYW1fcGFyc2luZyksCi0gICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1BBUlNJTkdfU0VFTik7Ci19Ci0KLWludCBncnBjX2NodHRwMl9saXN0X3BvcF9wYXJzaW5nX3NlZW5fc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICoqc3RyZWFtX3BhcnNpbmcpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07Ci0gIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX1BBUlNJTkcodHJhbnNwb3J0X3BhcnNpbmcpLCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1BBUlNJTkdfU0VFTik7Ci0gIGlmIChyICE9IDApIHsKLSAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKLSAgICAqc3RyZWFtX3BhcnNpbmcgPSAmc3RyZWFtLT5wYXJzaW5nOwotICB9Ci0gIHJldHVybiByOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dhaXRpbmdfZm9yX2NvbmN1cnJlbmN5KAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgewotICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLAotICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAotICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9XQUlUSU5HX0ZPUl9DT05DVVJSRU5DWSk7Ci19Ci0KLWludCBncnBjX2NodHRwMl9saXN0X3BvcF93YWl0aW5nX2Zvcl9jb25jdXJyZW5jeSgKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKipzdHJlYW1fZ2xvYmFsKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOwotICBpbnQgciA9IHN0cmVhbV9saXN0X3BvcChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV0FJVElOR19GT1JfQ09OQ1VSUkVOQ1kpOwotICBpZiAociAhPSAwKSB7Ci0gICAgKnN0cmVhbV9nbG9iYWwgPSAmc3RyZWFtLT5nbG9iYWw7Ci0gIH0KLSAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHMoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSB7Ci0gIHN0cmVhbV9saXN0X2FkZChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9HTE9CQUwoc3RyZWFtX2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX0NIRUNLX1JFQURfT1BTKTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX2NoZWNrX3JlYWRfb3BzKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07Ci0gIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9DSEVDS19SRUFEX09QUyk7Ci0gIGlmIChyICE9IDApIHsKLSAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKLSAgfQotICByZXR1cm4gcjsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmcpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW0gPSBTVFJFQU1fRlJPTV9XUklUSU5HKHN0cmVhbV93cml0aW5nKTsKLSAgaWYgKCFzdHJlYW0tPmluY2x1ZGVkW0dSUENfQ0hUVFAyX0xJU1RfV1JJVElOR19TVEFMTEVEX0JZX1RSQU5TUE9SVF0pIHsKLSAgICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKCZzdHJlYW0tPmdsb2JhbCwgImNodHRwMl93cml0aW5nX3N0YWxsZWQiKTsKLSAgfQotICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfV1JJVElOR19TVEFMTEVEX0JZX1RSQU5TUE9SVCk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9mbHVzaF93cml0aW5nX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgYm9vbCBpc193aW5kb3dfYXZhaWxhYmxlKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqc3RyZWFtOwotICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRSQU5TUE9SVF9GUk9NX1dSSVRJTkcodHJhbnNwb3J0X3dyaXRpbmcpOwotICB3aGlsZSAoc3RyZWFtX2xpc3RfcG9wKHRyYW5zcG9ydCwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1dSSVRJTkdfU1RBTExFRF9CWV9UUkFOU1BPUlQpKSB7Ci0gICAgaWYgKGlzX3dpbmRvd19hdmFpbGFibGUpIHsKLSAgICAgIGdycGNfY2h0dHAyX2JlY29tZV93cml0YWJsZSgmdHJhbnNwb3J0LT5nbG9iYWwsICZzdHJlYW0tPmdsb2JhbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3N0YWxsZWRfYnlfdHJhbnNwb3J0KHRyYW5zcG9ydF93cml0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbS0+d3JpdGluZyk7Ci0gICAgfQotICAgIEdSUENfQ0hUVFAyX1NUUkVBTV9VTlJFRihleGVjX2N0eCwgJnN0cmVhbS0+Z2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2h0dHAyX3dyaXRpbmdfc3RhbGxlZCIpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfc3RhbGxlZF9ieV90cmFuc3BvcnQoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV93cml0aW5nICpzdHJlYW1fd3JpdGluZykgewotICBzdHJlYW1fbGlzdF9hZGQoVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyksCi0gICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9XUklUSU5HKHN0cmVhbV93cml0aW5nKSwKLSAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfU1RBTExFRF9CWV9UUkFOU1BPUlQpOwotfQotCi1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfc3RhbGxlZF9ieV90cmFuc3BvcnQoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCkgewotICBncnBjX2NodHRwMl9zdHJlYW0gKnN0cmVhbTsKLSAgaW50IHIgPSBzdHJlYW1fbGlzdF9wb3AoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX1NUQUxMRURfQllfVFJBTlNQT1JUKTsKLSAgaWYgKHIgIT0gMCkgewotICAgICpzdHJlYW1fZ2xvYmFsID0gJnN0cmVhbS0+Z2xvYmFsOwotICB9Ci0gIHJldHVybiByOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3N0YWxsZWRfYnlfdHJhbnNwb3J0KAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgewotICBzdHJlYW1fbGlzdF9tYXliZV9yZW1vdmUoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9TVEFMTEVEX0JZX1RSQU5TUE9SVCk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSB7Ci0gIHN0cmVhbV9saXN0X2FkZChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICBTVFJFQU1fRlJPTV9HTE9CQUwoc3RyZWFtX2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX0NMT1NFRF9XQUlUSU5HX0ZPUl9QQVJTSU5HKTsKLX0KLQotaW50IGdycGNfY2h0dHAyX2xpc3RfcG9wX2Nsb3NlZF93YWl0aW5nX2Zvcl9wYXJzaW5nKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqKnN0cmVhbV9nbG9iYWwpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzdHJlYW07Ci0gIGludCByID0gc3RyZWFtX2xpc3RfcG9wKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSFRUUDJfTElTVF9DTE9TRURfV0FJVElOR19GT1JfUEFSU0lORyk7Ci0gIGlmIChyICE9IDApIHsKLSAgICAqc3RyZWFtX2dsb2JhbCA9ICZzdHJlYW0tPmdsb2JhbDsKLSAgfQotICByZXR1cm4gcjsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9saXN0X2FkZF9jbG9zZWRfd2FpdGluZ19mb3Jfd3JpdGluZygKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKLSAgc3RyZWFtX2xpc3RfYWRkKFRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKSwKLSAgICAgICAgICAgICAgICAgIFNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKSwKLSAgICAgICAgICAgICAgICAgIEdSUENfQ0hUVFAyX0xJU1RfQ0xPU0VEX1dBSVRJTkdfRk9SX1dSSVRJTkcpOwotfQotCi1pbnQgZ3JwY19jaHR0cDJfbGlzdF9wb3BfY2xvc2VkX3dhaXRpbmdfZm9yX3dyaXRpbmcoCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICoqc3RyZWFtX2dsb2JhbCkgewotICBncnBjX2NodHRwMl9zdHJlYW0gKnN0cmVhbTsKLSAgaW50IHIgPSBzdHJlYW1fbGlzdF9wb3AoVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHUlBDX0NIVFRQMl9MSVNUX0NMT1NFRF9XQUlUSU5HX0ZPUl9XUklUSU5HKTsKLSAgaWYgKHIgIT0gMCkgewotICAgICpzdHJlYW1fZ2xvYmFsID0gJnN0cmVhbS0+Z2xvYmFsOwotICB9Ci0gIHJldHVybiByOwotfQotCi12b2lkIGdycGNfY2h0dHAyX3JlZ2lzdGVyX3N0cmVhbShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW0gKnMpIHsKLSAgc3RyZWFtX2xpc3RfYWRkX3RhaWwodCwgcywgR1JQQ19DSFRUUDJfTElTVF9BTExfU1RSRUFNUyk7Ci19Ci0KLWludCBncnBjX2NodHRwMl91bnJlZ2lzdGVyX3N0cmVhbShncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtICpzKSB7Ci0gIHN0cmVhbV9saXN0X21heWJlX3JlbW92ZSh0LCBzLCBHUlBDX0NIVFRQMl9MSVNUX0FMTF9TVFJFQU1TKTsKLSAgcmV0dXJuIHN0cmVhbV9saXN0X2VtcHR5KHQsIEdSUENfQ0hUVFAyX0xJU1RfQUxMX1NUUkVBTVMpOwotfQotCi1pbnQgZ3JwY19jaHR0cDJfaGFzX3N0cmVhbXMoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7Ci0gIHJldHVybiAhc3RyZWFtX2xpc3RfZW1wdHkodCwgR1JQQ19DSFRUUDJfTElTVF9BTExfU1RSRUFNUyk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfZm9yX2FsbF9zdHJlYW1zKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICB2b2lkICgqY2IpKGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqczsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpOwotICBmb3IgKHMgPSB0LT5saXN0c1tHUlBDX0NIVFRQMl9MSVNUX0FMTF9TVFJFQU1TXS5oZWFkOyBzICE9IE5VTEw7Ci0gICAgICAgcyA9IHMtPmxpbmtzW0dSUENfQ0hUVFAyX0xJU1RfQUxMX1NUUkVBTVNdLm5leHQpIHsKLSAgICBjYih0cmFuc3BvcnRfZ2xvYmFsLCB1c2VyX2RhdGEsICZzLT5nbG9iYWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVhMTZmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLXZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9pbml0KGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0aWFsX2NhcGFjaXR5KSB7Ci0gIEdQUl9BU1NFUlQoaW5pdGlhbF9jYXBhY2l0eSA+IDEpOwotICBtYXAtPmtleXMgPSBncHJfbWFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBpbml0aWFsX2NhcGFjaXR5KTsKLSAgbWFwLT52YWx1ZXMgPSBncHJfbWFsbG9jKHNpemVvZih2b2lkICopICogaW5pdGlhbF9jYXBhY2l0eSk7Ci0gIG1hcC0+Y291bnQgPSAwOwotICBtYXAtPmZyZWUgPSAwOwotICBtYXAtPmNhcGFjaXR5ID0gaW5pdGlhbF9jYXBhY2l0eTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2Rlc3Ryb3koZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwKSB7Ci0gIGdwcl9mcmVlKG1hcC0+a2V5cyk7Ci0gIGdwcl9mcmVlKG1hcC0+dmFsdWVzKTsKLX0KLQotc3RhdGljIHNpemVfdCBjb21wYWN0KHVpbnQzMl90ICprZXlzLCB2b2lkICoqdmFsdWVzLCBzaXplX3QgY291bnQpIHsKLSAgc2l6ZV90IGksIG91dDsKLQotICBmb3IgKGkgPSAwLCBvdXQgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIGlmICh2YWx1ZXNbaV0pIHsKLSAgICAgIGtleXNbb3V0XSA9IGtleXNbaV07Ci0gICAgICB2YWx1ZXNbb3V0XSA9IHZhbHVlc1tpXTsKLSAgICAgIG91dCsrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBvdXQ7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9hZGQoZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwLCB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKSB7Ci0gIHNpemVfdCBjb3VudCA9IG1hcC0+Y291bnQ7Ci0gIHNpemVfdCBjYXBhY2l0eSA9IG1hcC0+Y2FwYWNpdHk7Ci0gIHVpbnQzMl90ICprZXlzID0gbWFwLT5rZXlzOwotICB2b2lkICoqdmFsdWVzID0gbWFwLT52YWx1ZXM7Ci0KLSAgR1BSX0FTU0VSVChjb3VudCA9PSAwIHx8IGtleXNbY291bnQgLSAxXSA8IGtleSk7Ci0gIEdQUl9BU1NFUlQodmFsdWUpOwotCi0gIGlmIChjb3VudCA9PSBjYXBhY2l0eSkgewotICAgIGlmIChtYXAtPmZyZWUgPiBjYXBhY2l0eSAvIDQpIHsKLSAgICAgIGNvdW50ID0gY29tcGFjdChrZXlzLCB2YWx1ZXMsIGNvdW50KTsKLSAgICAgIG1hcC0+ZnJlZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHJlc2l6ZSB3aGVuIGxlc3MgdGhhbiAyNSUgb2YgdGhlIHRhYmxlIGlzIGZyZWUsIGJlY2F1c2UgY29tcGFjdGlvbgotICAgICAgICAgd29uJ3QgaGVscCBtdWNoICovCi0gICAgICBtYXAtPmNhcGFjaXR5ID0gY2FwYWNpdHkgPSAzICogY2FwYWNpdHkgLyAyOwotICAgICAgbWFwLT5rZXlzID0ga2V5cyA9IGdwcl9yZWFsbG9jKGtleXMsIGNhcGFjaXR5ICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICBtYXAtPnZhbHVlcyA9IHZhbHVlcyA9IGdwcl9yZWFsbG9jKHZhbHVlcywgY2FwYWNpdHkgKiBzaXplb2Yodm9pZCAqKSk7Ci0gICAgfQotICB9Ci0KLSAga2V5c1tjb3VudF0gPSBrZXk7Ci0gIHZhbHVlc1tjb3VudF0gPSB2YWx1ZTsKLSAgbWFwLT5jb3VudCA9IGNvdW50ICsgMTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX21vdmVfaW50byhncnBjX2NodHRwMl9zdHJlYW1fbWFwICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKmRzdCkgewotICAvKiBpZiBzcmMgaXMgZW1wdHkgd2UgZG9udCBuZWVkIHRvIGRvIGFueXRoaW5nICovCi0gIGlmIChzcmMtPmNvdW50ID09IHNyYy0+ZnJlZSkgewotICAgIHJldHVybjsKLSAgfQotICAvKiBpZiBkc3QgaXMgZW1wdHkgd2Ugc2ltcGx5IG5lZWQgdG8gc3dhcCAqLwotICBpZiAoZHN0LT5jb3VudCA9PSBkc3QtPmZyZWUpIHsKLSAgICBHUFJfU1dBUChncnBjX2NodHRwMl9zdHJlYW1fbWFwLCAqc3JjLCAqZHN0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLyogdGhlIGZpcnN0IGVsZW1lbnQgb2Ygc3JjIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IG9mIGRzdC4uLgotICAgKiBob3dldmVyIHRoZSBtYXBzIG1heSBuZWVkIGNvbXBhY3RpbmcgZm9yIHRoaXMgcHJvcGVydHkgdG8gaG9sZCAqLwotICBpZiAoc3JjLT5rZXlzWzBdIDw9IGRzdC0+a2V5c1tkc3QtPmNvdW50IC0gMV0pIHsKLSAgICBzcmMtPmNvdW50ID0gY29tcGFjdChzcmMtPmtleXMsIHNyYy0+dmFsdWVzLCBzcmMtPmNvdW50KTsKLSAgICBzcmMtPmZyZWUgPSAwOwotICAgIGRzdC0+Y291bnQgPSBjb21wYWN0KGRzdC0+a2V5cywgZHN0LT52YWx1ZXMsIGRzdC0+Y291bnQpOwotICAgIGRzdC0+ZnJlZSA9IDA7Ci0gIH0KLSAgR1BSX0FTU0VSVChzcmMtPmtleXNbMF0gPiBkc3QtPmtleXNbZHN0LT5jb3VudCAtIDFdKTsKLSAgLyogaWYgZHN0IGRvZXNuJ3QgaGF2ZSBjYXBhY2l0eSwgcmVzaXplICovCi0gIGlmIChkc3QtPmNvdW50ICsgc3JjLT5jb3VudCA+IGRzdC0+Y2FwYWNpdHkpIHsKLSAgICBkc3QtPmNhcGFjaXR5ID0gR1BSX01BWChkc3QtPmNhcGFjaXR5ICogMyAvIDIsIGRzdC0+Y291bnQgKyBzcmMtPmNvdW50KTsKLSAgICBkc3QtPmtleXMgPSBncHJfcmVhbGxvYyhkc3QtPmtleXMsIGRzdC0+Y2FwYWNpdHkgKiBzaXplb2YodWludDMyX3QpKTsKLSAgICBkc3QtPnZhbHVlcyA9IGdwcl9yZWFsbG9jKGRzdC0+dmFsdWVzLCBkc3QtPmNhcGFjaXR5ICogc2l6ZW9mKHZvaWQgKikpOwotICB9Ci0gIG1lbWNweShkc3QtPmtleXMgKyBkc3QtPmNvdW50LCBzcmMtPmtleXMsIHNyYy0+Y291bnQgKiBzaXplb2YodWludDMyX3QpKTsKLSAgbWVtY3B5KGRzdC0+dmFsdWVzICsgZHN0LT5jb3VudCwgc3JjLT52YWx1ZXMsIHNyYy0+Y291bnQgKiBzaXplb2Yodm9pZCAqKSk7Ci0gIGRzdC0+Y291bnQgKz0gc3JjLT5jb3VudDsKLSAgZHN0LT5mcmVlICs9IHNyYy0+ZnJlZTsKLSAgc3JjLT5jb3VudCA9IDA7Ci0gIHNyYy0+ZnJlZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkICoqZmluZChncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSkgewotICBzaXplX3QgbWluX2lkeCA9IDA7Ci0gIHNpemVfdCBtYXhfaWR4ID0gbWFwLT5jb3VudDsKLSAgc2l6ZV90IG1pZF9pZHg7Ci0gIHVpbnQzMl90ICprZXlzID0gbWFwLT5rZXlzOwotICB2b2lkICoqdmFsdWVzID0gbWFwLT52YWx1ZXM7Ci0gIHVpbnQzMl90IG1pZF9rZXk7Ci0KLSAgaWYgKG1heF9pZHggPT0gMCkgcmV0dXJuIE5VTEw7Ci0KLSAgd2hpbGUgKG1pbl9pZHggPCBtYXhfaWR4KSB7Ci0gICAgLyogZmluZCB0aGUgbWlkcG9pbnQsIGF2b2lkaW5nIG92ZXJmbG93ICovCi0gICAgbWlkX2lkeCA9IG1pbl9pZHggKyAoKG1heF9pZHggLSBtaW5faWR4KSAvIDIpOwotICAgIG1pZF9rZXkgPSBrZXlzW21pZF9pZHhdOwotCi0gICAgaWYgKG1pZF9rZXkgPCBrZXkpIHsKLSAgICAgIG1pbl9pZHggPSBtaWRfaWR4ICsgMTsKLSAgICB9IGVsc2UgaWYgKG1pZF9rZXkgPiBrZXkpIHsKLSAgICAgIG1heF9pZHggPSBtaWRfaWR4OwotICAgIH0gZWxzZSAvKiBtaWRfa2V5ID09IGtleSAqLwotICAgIHsKLSAgICAgIHJldHVybiAmdmFsdWVzW21pZF9pZHhdOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi12b2lkICpncnBjX2NodHRwMl9zdHJlYW1fbWFwX2RlbGV0ZShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSkgewotICB2b2lkICoqcHZhbHVlID0gZmluZChtYXAsIGtleSk7Ci0gIHZvaWQgKm91dCA9IE5VTEw7Ci0gIGlmIChwdmFsdWUgIT0gTlVMTCkgewotICAgIG91dCA9ICpwdmFsdWU7Ci0gICAgKnB2YWx1ZSA9IE5VTEw7Ci0gICAgbWFwLT5mcmVlICs9IChvdXQgIT0gTlVMTCk7Ci0gICAgLyogcmVjb2duaXplIGNvbXBsZXRlIGVtcHR5bmVzcyBhbmQgZW5zdXJlIHdlIGNhbiBza2lwCi0gICAgICogZGVmcmFnbWVudGF0aW9uIGxhdGVyICovCi0gICAgaWYgKG1hcC0+ZnJlZSA9PSBtYXAtPmNvdW50KSB7Ci0gICAgICBtYXAtPmZyZWUgPSBtYXAtPmNvdW50ID0gMDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG91dDsKLX0KLQotdm9pZCAqZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9maW5kKGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKm1hcCwgdWludDMyX3Qga2V5KSB7Ci0gIHZvaWQgKipwdmFsdWUgPSBmaW5kKG1hcCwga2V5KTsKLSAgcmV0dXJuIHB2YWx1ZSAhPSBOVUxMID8gKnB2YWx1ZSA6IE5VTEw7Ci19Ci0KLXNpemVfdCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX3NpemUoZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwKSB7Ci0gIHJldHVybiBtYXAtPmNvdW50IC0gbWFwLT5mcmVlOwotfQotCi12b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZm9yX2VhY2goZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmKSh2b2lkICp1c2VyX2RhdGEsIHVpbnQzMl90IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBzaXplX3QgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5jb3VudDsgaSsrKSB7Ci0gICAgaWYgKG1hcC0+dmFsdWVzW2ldKSB7Ci0gICAgICBmKHVzZXJfZGF0YSwgbWFwLT5rZXlzW2ldLCBtYXAtPnZhbHVlc1tpXSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdhNThhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9TVFJFQU1fTUFQX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfU1RSRUFNX01BUF9ICi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIERhdGEgc3RydWN0dXJlIHRvIG1hcCBhIHVpbnQzMl90IHRvIGEgZGF0YSBvYmplY3QgKHJlcHJlc2VudGVkIGJ5IGEgdm9pZCopCi0KLSAgIFJlcHJlc2VudGVkIGFzIGEgc29ydGVkIGFycmF5IG9mIGtleXMsIGFuZCBhIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgdmFsdWVzLgotICAgTG9va3VwcyBhcmUgcGVyZm9ybWVkIHdpdGggYmluYXJ5IHNlYXJjaC4KLSAgIEFkZHMgYXJlIHJlc3RyaWN0ZWQgdG8gc3RyaWN0bHkgaGlnaGVyIGtleXMgdGhhbiBwcmV2aW91c2x5IHNlZW4gKHRoaXMgaXMKLSAgIGd1YXJhbnRlZWQgYnkgaHR0cDIpLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCAqa2V5czsKLSAgdm9pZCAqKnZhbHVlczsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgZnJlZTsKLSAgc2l6ZV90IGNhcGFjaXR5OwotfSBncnBjX2NodHRwMl9zdHJlYW1fbWFwOwotCi12b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfaW5pdChncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdGlhbF9jYXBhY2l0eSk7Ci12b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVzdHJveShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXApOwotCi0vKiBBZGQgYSBuZXcga2V5OiBnaXZlbiBodHRwMiBzZW1hbnRpY3MsIG5ldyBrZXlzIG11c3QgYWx3YXlzIGJlIGdyZWF0ZXIgdGhhbgotICAgZXhpc3Rpbmcga2V5cyAtIHRoaXMgaXMgYXNzZXJ0ZWQgKi8KLXZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9hZGQoZ3JwY19jaHR0cDJfc3RyZWFtX21hcCAqbWFwLCB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKTsKLQotLyogRGVsZXRlIGFuIGV4aXN0aW5nIGtleSAtIHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBrZXkgaWYgaXQgZXhpc3RlZCwKLSAgIG9yIE5VTEwgb3RoZXJ3aXNlICovCi12b2lkICpncnBjX2NodHRwMl9zdHJlYW1fbWFwX2RlbGV0ZShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSk7Ci0KLS8qIE1vdmUgYWxsIGVsZW1lbnRzIG9mIHNyYyBpbnRvIGRzdCAqLwotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX21vdmVfaW50byhncnBjX2NodHRwMl9zdHJlYW1fbWFwICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKmRzdCk7Ci0KLS8qIFJldHVybiBhbiBleGlzdGluZyBrZXksIG9yIE5VTEwgaWYgaXQgZG9lcyBub3QgZXhpc3QgKi8KLXZvaWQgKmdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZmluZChncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXAsIHVpbnQzMl90IGtleSk7Ci0KLS8qIEhvdyBtYW55IChwb3B1bGF0ZWQpIGVudHJpZXMgYXJlIGluIHRoZSBzdHJlYW0gbWFwPyAqLwotc2l6ZV90IGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfc2l6ZShncnBjX2NodHRwMl9zdHJlYW1fbWFwICptYXApOwotCi0vKiBDYWxsYmFjayBvbiBlYWNoIHN0cmVhbSAqLwotdm9pZCBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2Zvcl9lYWNoKGdycGNfY2h0dHAyX3N0cmVhbV9tYXAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqdXNlcl9kYXRhLCB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfU1RSRUFNX01BUF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDgwMmUwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0KLXN0YXRpYyBpbnQ2NF90IHJvdW5kX3VwKGludDY0X3QgeCwgaW50NjRfdCBkaXZpc29yKSB7Ci0gIHJldHVybiAoeCAvIGRpdmlzb3IgKyAoeCAlIGRpdmlzb3IgIT0gMCkpICogZGl2aXNvcjsKLX0KLQotLyogcm91bmQgYW4gaW50ZWdlciB1cCB0byB0aGUgbmV4dCB2YWx1ZSB3aXRoIHRocmVlIHNpZ25pZmljYW50IGZpZ3VyZXMgKi8KLXN0YXRpYyBpbnQ2NF90IHJvdW5kX3VwX3RvX3RocmVlX3NpZ19maWdzKGludDY0X3QgeCkgewotICBpZiAoeCA8IDEwMDApIHJldHVybiB4OwotICBpZiAoeCA8IDEwMDAwKSByZXR1cm4gcm91bmRfdXAoeCwgMTApOwotICBpZiAoeCA8IDEwMDAwMCkgcmV0dXJuIHJvdW5kX3VwKHgsIDEwMCk7Ci0gIGlmICh4IDwgMTAwMDAwMCkgcmV0dXJuIHJvdW5kX3VwKHgsIDEwMDApOwotICBpZiAoeCA8IDEwMDAwMDAwKSByZXR1cm4gcm91bmRfdXAoeCwgMTAwMDApOwotICBpZiAoeCA8IDEwMDAwMDAwMCkgcmV0dXJuIHJvdW5kX3VwKHgsIDEwMDAwMCk7Ci0gIGlmICh4IDwgMTAwMDAwMDAwMCkgcmV0dXJuIHJvdW5kX3VwKHgsIDEwMDAwMDApOwotICByZXR1cm4gcm91bmRfdXAoeCwgMTAwMDAwMDApOwotfQotCi0vKiBlbmNvZGUgb3VyIG1pbmltdW0gdmlhYmxlIHRpbWVvdXQgdmFsdWUgKi8KLXN0YXRpYyB2b2lkIGVuY190aW55KGNoYXIgKmJ1ZmZlcikgeyBtZW1jcHkoYnVmZmVyLCAiMW4iLCAzKTsgfQotCi1zdGF0aWMgdm9pZCBlbmNfZXh0KGNoYXIgKmJ1ZmZlciwgaW50NjRfdCB2YWx1ZSwgY2hhciBleHQpIHsKLSAgaW50IG4gPSBpbnQ2NF90dG9hKHZhbHVlLCBidWZmZXIpOwotICBidWZmZXJbbl0gPSBleHQ7Ci0gIGJ1ZmZlcltuICsgMV0gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBlbmNfc2Vjb25kcyhjaGFyICpidWZmZXIsIGludDY0X3Qgc2VjKSB7Ci0gIGlmIChzZWMgJSAzNjAwID09IDApIHsKLSAgICBlbmNfZXh0KGJ1ZmZlciwgc2VjIC8gMzYwMCwgJ0gnKTsKLSAgfSBlbHNlIGlmIChzZWMgJSA2MCA9PSAwKSB7Ci0gICAgZW5jX2V4dChidWZmZXIsIHNlYyAvIDYwLCAnTScpOwotICB9IGVsc2UgewotICAgIGVuY19leHQoYnVmZmVyLCBzZWMsICdTJyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZW5jX25hbm9zKGNoYXIgKmJ1ZmZlciwgaW50NjRfdCB4KSB7Ci0gIHggPSByb3VuZF91cF90b190aHJlZV9zaWdfZmlncyh4KTsKLSAgaWYgKHggPCAxMDAwMDApIHsKLSAgICBpZiAoeCAlIDEwMDAgPT0gMCkgewotICAgICAgZW5jX2V4dChidWZmZXIsIHggLyAxMDAwLCAndScpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbmNfZXh0KGJ1ZmZlciwgeCwgJ24nKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoeCA8IDEwMDAwMDAwMCkgewotICAgIGlmICh4ICUgMTAwMDAwMCA9PSAwKSB7Ci0gICAgICBlbmNfZXh0KGJ1ZmZlciwgeCAvIDEwMDAwMDAsICdtJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVuY19leHQoYnVmZmVyLCB4IC8gMTAwMCwgJ3UnKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoeCA8IDEwMDAwMDAwMDApIHsKLSAgICBlbmNfZXh0KGJ1ZmZlciwgeCAvIDEwMDAwMDAsICdtJyk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogbm90ZSB0aGF0IHRoaXMgaXMgb25seSBldmVyIGNhbGxlZCB3aXRoIHRpbWVzIG9mIGxlc3MgdGhhbiBvbmUgc2Vjb25kLAotICAgICAgIHNvIGlmIHdlIHJlYWNoIGhlcmUgdGhlIHRpbWUgbXVzdCBoYXZlIGJlZW4gcm91bmRlZCB1cCB0byBhIHdob2xlIHNlY29uZAotICAgICAgIChhbmQgbm8gbW9yZSkgKi8KLSAgICBtZW1jcHkoYnVmZmVyLCAiMVMiLCAzKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBlbmNfbWljcm9zKGNoYXIgKmJ1ZmZlciwgaW50NjRfdCB4KSB7Ci0gIHggPSByb3VuZF91cF90b190aHJlZV9zaWdfZmlncyh4KTsKLSAgaWYgKHggPCAxMDAwMDApIHsKLSAgICBpZiAoeCAlIDEwMDAgPT0gMCkgewotICAgICAgZW5jX2V4dChidWZmZXIsIHggLyAxMDAwLCAnbScpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbmNfZXh0KGJ1ZmZlciwgeCwgJ3UnKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoeCA8IDEwMDAwMDAwMCkgewotICAgIGlmICh4ICUgMTAwMDAwMCA9PSAwKSB7Ci0gICAgICBlbmNfZXh0KGJ1ZmZlciwgeCAvIDEwMDAwMDAsICdTJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVuY19leHQoYnVmZmVyLCB4IC8gMTAwMCwgJ20nKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZW5jX2V4dChidWZmZXIsIHggLyAxMDAwMDAwLCAnUycpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfZW5jb2RlX3RpbWVvdXQoZ3ByX3RpbWVzcGVjIHRpbWVvdXQsIGNoYXIgKmJ1ZmZlcikgewotICBpZiAodGltZW91dC50dl9zZWMgPCAwKSB7Ci0gICAgZW5jX3RpbnkoYnVmZmVyKTsKLSAgfSBlbHNlIGlmICh0aW1lb3V0LnR2X3NlYyA9PSAwKSB7Ci0gICAgZW5jX25hbm9zKGJ1ZmZlciwgdGltZW91dC50dl9uc2VjKTsKLSAgfSBlbHNlIGlmICh0aW1lb3V0LnR2X3NlYyA8IDEwMDAgJiYgdGltZW91dC50dl9uc2VjICE9IDApIHsKLSAgICBlbmNfbWljcm9zKGJ1ZmZlciwKLSAgICAgICAgICAgICAgIChpbnQ2NF90KSh0aW1lb3V0LnR2X3NlYyAqIDEwMDAwMDApICsKLSAgICAgICAgICAgICAgICAgICAodGltZW91dC50dl9uc2VjIC8gMTAwMCArICh0aW1lb3V0LnR2X25zZWMgJSAxMDAwICE9IDApKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZW5jX3NlY29uZHMoYnVmZmVyLCB0aW1lb3V0LnR2X3NlYyArICh0aW1lb3V0LnR2X25zZWMgIT0gMCkpOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgaXNfYWxsX3doaXRlc3BhY2UoY29uc3QgY2hhciAqcCkgewotICB3aGlsZSAoKnAgPT0gJyAnKSBwKys7Ci0gIHJldHVybiAqcCA9PSAwOwotfQotCi1pbnQgZ3JwY19jaHR0cDJfZGVjb2RlX3RpbWVvdXQoY29uc3QgY2hhciAqYnVmZmVyLCBncHJfdGltZXNwZWMgKnRpbWVvdXQpIHsKLSAgaW50MzJfdCB4ID0gMDsKLSAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYnVmZmVyOwotICBpbnQgaGF2ZV9kaWdpdCA9IDA7Ci0gIC8qIHNraXAgd2hpdGVzcGFjZSAqLwotICBmb3IgKDsgKnAgPT0gJyAnOyBwKyspCi0gICAgOwotICAvKiBkZWNvZGUgbnVtZXJpYyBwYXJ0ICovCi0gIGZvciAoOyAqcCA+PSAnMCcgJiYgKnAgPD0gJzknOyBwKyspIHsKLSAgICBpbnQzMl90IGRpZ2l0ID0gKGludDMyX3QpKCpwIC0gKHVpbnQ4X3QpJzAnKTsKLSAgICBoYXZlX2RpZ2l0ID0gMTsKLSAgICAvKiBzcGVjIGFsbG93cyBtYXguIDggZGlnaXRzLCBidXQgd2UgYWxsb3cgdmFsdWVzIHVwIHRvIDEsMDAwLDAwMCwwMDAgKi8KLSAgICBpZiAoeCA+PSAoMTAwICogMTAwMCAqIDEwMDApKSB7Ci0gICAgICBpZiAoeCAhPSAoMTAwICogMTAwMCAqIDEwMDApIHx8IGRpZ2l0ICE9IDApIHsKLSAgICAgICAgKnRpbWVvdXQgPSBncHJfaW5mX2Z1dHVyZShHUFJfVElNRVNQQU4pOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgeCA9IHggKiAxMCArIGRpZ2l0OwotICB9Ci0gIGlmICghaGF2ZV9kaWdpdCkgcmV0dXJuIDA7Ci0gIC8qIHNraXAgd2hpdGVzcGFjZSAqLwotICBmb3IgKDsgKnAgPT0gJyAnOyBwKyspCi0gICAgOwotICAvKiBkZWNvZGUgdW5pdCBzcGVjaWZpZXIgKi8KLSAgc3dpdGNoICgqcCkgewotICAgIGNhc2UgJ24nOgotICAgICAgKnRpbWVvdXQgPSBncHJfdGltZV9mcm9tX25hbm9zKHgsIEdQUl9USU1FU1BBTik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd1JzoKLSAgICAgICp0aW1lb3V0ID0gZ3ByX3RpbWVfZnJvbV9taWNyb3MoeCwgR1BSX1RJTUVTUEFOKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ20nOgotICAgICAgKnRpbWVvdXQgPSBncHJfdGltZV9mcm9tX21pbGxpcyh4LCBHUFJfVElNRVNQQU4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0gICAgICAqdGltZW91dCA9IGdwcl90aW1lX2Zyb21fc2Vjb25kcyh4LCBHUFJfVElNRVNQQU4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTSc6Ci0gICAgICAqdGltZW91dCA9IGdwcl90aW1lX2Zyb21fbWludXRlcyh4LCBHUFJfVElNRVNQQU4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnSCc6Ci0gICAgICAqdGltZW91dCA9IGdwcl90aW1lX2Zyb21faG91cnMoeCwgR1BSX1RJTUVTUEFOKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotICBwKys7Ci0gIHJldHVybiBpc19hbGxfd2hpdGVzcGFjZSgoY29uc3QgY2hhciAqKXApOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmggYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlMjUyMi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfVElNRU9VVF9FTkNPRElOR19ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX1RJTUVPVVRfRU5DT0RJTkdfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX1RJTUVPVVRfRU5DT0RFX01JTl9CVUZTSVpFIChHUFJfTFRPQV9NSU5fQlVGU0laRSArIDEpCi0KLS8qIEVuY29kZS9kZWNvZGUgdGltZW91dHMgdG8gdGhlIEdSUEMgb3ZlciBIVFRQMiBmb3JtYXQ7Ci0gICBlbmNvZGluZyBtYXkgcm91bmQgdXAgYXJiaXRyYXJpbHkgKi8KLXZvaWQgZ3JwY19jaHR0cDJfZW5jb2RlX3RpbWVvdXQoZ3ByX3RpbWVzcGVjIHRpbWVvdXQsIGNoYXIgKmJ1ZmZlcik7Ci1pbnQgZ3JwY19jaHR0cDJfZGVjb2RlX3RpbWVvdXQoY29uc3QgY2hhciAqYnVmZmVyLCBncHJfdGltZXNwZWMgKnRpbWVvdXQpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RSQU5TUE9SVF9DSFRUUDJfVElNRU9VVF9FTkNPRElOR19IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjMjM1ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oIgotCi11aW50MzJfdCBncnBjX2NodHRwMl9ocGFja192YXJpbnRfbGVuZ3RoKHVpbnQzMl90IHRhaWxfdmFsdWUpIHsKLSAgaWYgKHRhaWxfdmFsdWUgPCAoMSA8PCA3KSkgewotICAgIHJldHVybiAyOwotICB9IGVsc2UgaWYgKHRhaWxfdmFsdWUgPCAoMSA8PCAxNCkpIHsKLSAgICByZXR1cm4gMzsKLSAgfSBlbHNlIGlmICh0YWlsX3ZhbHVlIDwgKDEgPDwgMjEpKSB7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0gZWxzZSBpZiAodGFpbF92YWx1ZSA8ICgxIDw8IDI4KSkgewotICAgIHJldHVybiA1OwotICB9IGVsc2UgewotICAgIHJldHVybiA2OwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaHBhY2tfd3JpdGVfdmFyaW50X3RhaWwodWludDMyX3QgdGFpbF92YWx1ZSwgdWludDhfdCogdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWlsX2xlbmd0aCkgewotICBzd2l0Y2ggKHRhaWxfbGVuZ3RoKSB7Ci0gICAgY2FzZSA1OgotICAgICAgdGFyZ2V0WzRdID0gKHVpbnQ4X3QpKCh0YWlsX3ZhbHVlID4+IDI4KSB8IDB4ODApOwotICAgIGNhc2UgNDoKLSAgICAgIHRhcmdldFszXSA9ICh1aW50OF90KSgodGFpbF92YWx1ZSA+PiAyMSkgfCAweDgwKTsKLSAgICBjYXNlIDM6Ci0gICAgICB0YXJnZXRbMl0gPSAodWludDhfdCkoKHRhaWxfdmFsdWUgPj4gMTQpIHwgMHg4MCk7Ci0gICAgY2FzZSAyOgotICAgICAgdGFyZ2V0WzFdID0gKHVpbnQ4X3QpKCh0YWlsX3ZhbHVlID4+IDcpIHwgMHg4MCk7Ci0gICAgY2FzZSAxOgotICAgICAgdGFyZ2V0WzBdID0gKHVpbnQ4X3QpKCh0YWlsX3ZhbHVlKSB8IDB4ODApOwotICB9Ci0gIHRhcmdldFt0YWlsX2xlbmd0aCAtIDFdICY9IDB4N2Y7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiOWQyMi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9WQVJJTlRfSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9WQVJJTlRfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3BvcnRfcGxhdGZvcm0uaD4KLQotLyogSGVscGVycyBmb3IgaHBhY2sgdmFyaW50IGVuY29kaW5nICovCi0KLS8qIGxlbmd0aCBvZiBhIHZhbHVlIHRoYXQgbmVlZHMgdmFyaW50IHRhaWwgZW5jb2RpbmcgKGl0J3MgYmlnZ2VyIHRoYW4gY2FuIGJlCi0gICBiaXRwYWNrZWQgaW50byB0aGUgb3Bjb2RlIGJ5dGUpIC0gcmV0dXJuZWQgdmFsdWUgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUKLSAgIG9wY29kZSBieXRlICovCi11aW50MzJfdCBncnBjX2NodHRwMl9ocGFja192YXJpbnRfbGVuZ3RoKHVpbnQzMl90IHRhaWxfdmFsdWUpOwotCi12b2lkIGdycGNfY2h0dHAyX2hwYWNrX3dyaXRlX3ZhcmludF90YWlsKHVpbnQzMl90IHRhaWxfdmFsdWUsIHVpbnQ4X3QqIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFpbF9sZW5ndGgpOwotCi0vKiBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIGJpdHBhY2tlZCB3aXRoIHRoZSBvcGNvZGUgaWYgdGhlIG9wY29kZSBoYXMgYQotICAgcHJlZml4Ci0gICBvZiBsZW5ndGggcHJlZml4X2JpdHMgKi8KLSNkZWZpbmUgR1JQQ19DSFRUUDJfTUFYX0lOX1BSRUZJWChwcmVmaXhfYml0cykgXAotICAoKHVpbnQzMl90KSgoMSA8PCAoOCAtIChwcmVmaXhfYml0cykpKSAtIDEpKQotCi0vKiBsZW5ndGggcmVxdWlyZWQgdG8gYml0cGFjayBhIHZhbHVlICovCi0jZGVmaW5lIEdSUENfQ0hUVFAyX1ZBUklOVF9MRU5HVEgobiwgcHJlZml4X2JpdHMpIFwKLSAgKChuKSA8IEdSUENfQ0hUVFAyX01BWF9JTl9QUkVGSVgocHJlZml4X2JpdHMpICAgXAotICAgICAgID8gMXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiBncnBjX2NodHRwMl9ocGFja192YXJpbnRfbGVuZ3RoKCAgICAgICAgIFwKLSAgICAgICAgICAgICAobiktR1JQQ19DSFRUUDJfTUFYX0lOX1BSRUZJWChwcmVmaXhfYml0cykpKQotCi0jZGVmaW5lIEdSUENfQ0hUVFAyX1dSSVRFX1ZBUklOVChuLCBwcmVmaXhfYml0cywgcHJlZml4X29yLCB0YXJnZXQsIGxlbmd0aCkgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDhfdCogdGd0ID0gdGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChsZW5ndGgpID09IDF1KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAodGd0KVswXSA9ICh1aW50OF90KSgocHJlZml4X29yKSB8IChuKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAodGd0KVswXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHByZWZpeF9vcikgfCAodWludDhfdClHUlBDX0NIVFRQMl9NQVhfSU5fUFJFRklYKHByZWZpeF9iaXRzKTsgICAgICBcCi0gICAgICBncnBjX2NodHRwMl9ocGFja193cml0ZV92YXJpbnRfdGFpbCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKG4pLUdSUENfQ0hUVFAyX01BWF9JTl9QUkVGSVgocHJlZml4X2JpdHMpLCAodGd0KSArIDEsIChsZW5ndGgpLTEpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9WQVJJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi93cml0aW5nLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3NzI1Yy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaCIKLQotc3RhdGljIHZvaWQgZmluYWxpemVfb3V0YnVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZyk7Ci0KLWludCBncnBjX2NodHRwMl91bmxvY2tpbmdfY2hlY2tfd3JpdGVzKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZywgaW50IGlzX3BhcnNpbmcpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKnN0cmVhbV93cml0aW5nOwotCi0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19jaHR0cDJfdW5sb2NraW5nX2NoZWNrX3dyaXRlcyIsIDApOwotCi0gIC8qIHNpbXBsZSB3cml0ZXMgYXJlIHF1ZXVlZCB0byBxYnVmLCBhbmQgZmx1c2hlZCBoZXJlICovCi0gIGdwcl9zbGljZV9idWZmZXJfc3dhcCgmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwgJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYpOwotICBHUFJfQVNTRVJUKHRyYW5zcG9ydF9nbG9iYWwtPnFidWYuY291bnQgPT0gMCk7Ci0KLSAgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9zZXRfbWF4X3RhYmxlX3NpemUoCi0gICAgICAmdHJhbnNwb3J0X3dyaXRpbmctPmhwYWNrX2NvbXByZXNzb3IsCi0gICAgICB0cmFuc3BvcnRfZ2xvYmFsLT5zZXR0aW5nc1tHUlBDX1BFRVJfU0VUVElOR1NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHUlBDX0NIVFRQMl9TRVRUSU5HU19IRUFERVJfVEFCTEVfU0laRV0pOwotCi0gIGlmICh0cmFuc3BvcnRfZ2xvYmFsLT5kaXJ0aWVkX2xvY2FsX3NldHRpbmdzICYmCi0gICAgICAhdHJhbnNwb3J0X2dsb2JhbC0+c2VudF9sb2NhbF9zZXR0aW5ncyAmJiAhaXNfcGFyc2luZykgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAotICAgICAgICAmdHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1ZiwKLSAgICAgICAgZ3JwY19jaHR0cDJfc2V0dGluZ3NfY3JlYXRlKAotICAgICAgICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19TRU5UX1NFVFRJTkdTXSwKLSAgICAgICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfTE9DQUxfU0VUVElOR1NdLAotICAgICAgICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+Zm9yY2Vfc2VuZF9zZXR0aW5ncywgR1JQQ19DSFRUUDJfTlVNX1NFVFRJTkdTKSk7Ci0gICAgdHJhbnNwb3J0X2dsb2JhbC0+Zm9yY2Vfc2VuZF9zZXR0aW5ncyA9IDA7Ci0gICAgdHJhbnNwb3J0X2dsb2JhbC0+ZGlydGllZF9sb2NhbF9zZXR0aW5ncyA9IDA7Ci0gICAgdHJhbnNwb3J0X2dsb2JhbC0+c2VudF9sb2NhbF9zZXR0aW5ncyA9IDE7Ci0gIH0KLQotICBHUlBDX0NIVFRQMl9GTE9XX01PVkVfVFJBTlNQT1JUKCJ3cml0ZSIsIHRyYW5zcG9ydF93cml0aW5nLCBvdXRnb2luZ193aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0X2dsb2JhbCwgb3V0Z29pbmdfd2luZG93KTsKLSAgYm9vbCBpc193aW5kb3dfYXZhaWxhYmxlID0gdHJhbnNwb3J0X3dyaXRpbmctPm91dGdvaW5nX3dpbmRvdyA+IDA7Ci0gIGdycGNfY2h0dHAyX2xpc3RfZmx1c2hfd3JpdGluZ19zdGFsbGVkX2J5X3RyYW5zcG9ydCgKLSAgICAgIGV4ZWNfY3R4LCB0cmFuc3BvcnRfd3JpdGluZywgaXNfd2luZG93X2F2YWlsYWJsZSk7Ci0KLSAgLyogZm9yIGVhY2ggZ3JwY19jaHR0cDJfc3RyZWFtIHRoYXQncyBiZWNvbWUgd3JpdGFibGUsIGZyYW1lIGl0J3MgZGF0YQotICAgICAoYWNjb3JkaW5nIHRvIGF2YWlsYWJsZSB3aW5kb3cgc2l6ZXMpIGFuZCBhZGQgdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX3dyaXRhYmxlX3N0cmVhbSgKLSAgICAgIHRyYW5zcG9ydF9nbG9iYWwsIHRyYW5zcG9ydF93cml0aW5nLCAmc3RyZWFtX2dsb2JhbCwgJnN0cmVhbV93cml0aW5nKSkgewotICAgIGJvb2wgc2VudF9pbml0aWFsX21ldGFkYXRhID0gc3RyZWFtX3dyaXRpbmctPnNlbnRfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBib29sIGJlY29tZV93cml0YWJsZSA9IGZhbHNlOwotCi0gICAgc3RyZWFtX3dyaXRpbmctPmlkID0gc3RyZWFtX2dsb2JhbC0+aWQ7Ci0gICAgc3RyZWFtX3dyaXRpbmctPnJlYWRfY2xvc2VkID0gc3RyZWFtX2dsb2JhbC0+cmVhZF9jbG9zZWQ7Ci0KLSAgICBHUlBDX0NIVFRQMl9GTE9XX01PVkVfU1RSRUFNKCJ3cml0ZSIsIHRyYW5zcG9ydF93cml0aW5nLCBzdHJlYW1fd3JpdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nX3dpbmRvdywgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nX3dpbmRvdyk7Ci0KLSAgICBpZiAoIXNlbnRfaW5pdGlhbF9tZXRhZGF0YSAmJiBzdHJlYW1fZ2xvYmFsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEpIHsKLSAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgPQotICAgICAgICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSA9IE5VTEw7Ci0gICAgICBiZWNvbWVfd3JpdGFibGUgPSB0cnVlOwotICAgICAgc2VudF9pbml0aWFsX21ldGFkYXRhID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHNlbnRfaW5pdGlhbF9tZXRhZGF0YSkgewotICAgICAgaWYgKHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZSAhPSBOVUxMKSB7Ci0gICAgICAgIGdwcl9zbGljZSBoZHIgPSBncHJfc2xpY2VfbWFsbG9jKDUpOwotICAgICAgICB1aW50OF90ICpwID0gR1BSX1NMSUNFX1NUQVJUX1BUUihoZHIpOwotICAgICAgICB1aW50MzJfdCBsZW4gPSBzdHJlYW1fZ2xvYmFsLT5zZW5kX21lc3NhZ2UtPmxlbmd0aDsKLSAgICAgICAgR1BSX0FTU0VSVChzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlID09IE5VTEwpOwotICAgICAgICBwWzBdID0gKHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZS0+ZmxhZ3MgJgotICAgICAgICAgICAgICAgIEdSUENfV1JJVEVfSU5URVJOQUxfQ09NUFJFU1MpICE9IDA7Ci0gICAgICAgIHBbMV0gPSAodWludDhfdCkobGVuID4+IDI0KTsKLSAgICAgICAgcFsyXSA9ICh1aW50OF90KShsZW4gPj4gMTYpOwotICAgICAgICBwWzNdID0gKHVpbnQ4X3QpKGxlbiA+PiA4KTsKLSAgICAgICAgcFs0XSA9ICh1aW50OF90KShsZW4pOwotICAgICAgICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIsIGhkcik7Ci0gICAgICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5zZW5kX21lc3NhZ2UtPmxlbmd0aCA+IDApIHsKLSAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlID0gc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV93cml0aW5nLT5zdHJlYW1fZmV0Y2hlZCA9IDA7Ci0gICAgICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZSA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBpZiAoKHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgIT0gTlVMTCB8fAotICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlci5sZW5ndGggPiAwKSAmJgotICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5vdXRnb2luZ193aW5kb3cgPiAwKSB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRfd3JpdGluZy0+b3V0Z29pbmdfd2luZG93ID4gMCkgewotICAgICAgICAgIGJlY29tZV93cml0YWJsZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfc3RhbGxlZF9ieV90cmFuc3BvcnQodHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc3RyZWFtX2dsb2JhbC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSkgewotICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSA9Ci0gICAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhOwotICAgICAgICBzdHJlYW1fZ2xvYmFsLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhID0gTlVMTDsKLSAgICAgICAgYmVjb21lX3dyaXRhYmxlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXN0cmVhbV9nbG9iYWwtPnJlYWRfY2xvc2VkICYmCi0gICAgICAgIHN0cmVhbV9nbG9iYWwtPnVuYW5ub3VuY2VkX2luY29taW5nX3dpbmRvd19mb3Jfd3JpdGluZyA+IDEwMjQpIHsKLSAgICAgIEdSUENfQ0hUVFAyX0ZMT1dfTU9WRV9TVFJFQU0oIndyaXRlIiwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX3dyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlX3dpbmRvdywgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2Zvcl93cml0aW5nKTsKLSAgICAgIGJlY29tZV93cml0YWJsZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGJlY29tZV93cml0YWJsZSkgewotICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdGluZ19zdHJlYW0odHJhbnNwb3J0X3dyaXRpbmcsIHN0cmVhbV93cml0aW5nKTsKLSAgICB9IGVsc2UgewotICAgICAgR1JQQ19DSFRUUDJfU1RSRUFNX1VOUkVGKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCAiY2h0dHAyX3dyaXRpbmciKTsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiB0aGUgZ3JwY19jaHR0cDJfdHJhbnNwb3J0IGlzIHJlYWR5IHRvIHNlbmQgYSB3aW5kb3cgdXBkYXRlLCBkbyBzbyBoZXJlCi0gICAgIGFsc287IDMvNCBpcyBhIG1hZ2ljIG51bWJlciB0aGF0IHdpbGwgbGlrZWx5IGdldCB0dW5lZCBzb29uICovCi0gIGlmICh0cmFuc3BvcnRfZ2xvYmFsLT5hbm5vdW5jZV9pbmNvbWluZ193aW5kb3cgPiAwKSB7Ci0gICAgdWludDMyX3QgYW5ub3VuY2VkID0gKHVpbnQzMl90KUdQUl9NSU4oCi0gICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPmFubm91bmNlX2luY29taW5nX3dpbmRvdywgVUlOVDMyX01BWCk7Ci0gICAgR1JQQ19DSFRUUDJfRkxPV19ERUJJVF9UUkFOU1BPUlQoIndyaXRlIiwgdHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZV9pbmNvbWluZ193aW5kb3csIGFubm91bmNlZCk7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9jcmVhdGUoMCwgYW5ub3VuY2VkKSk7Ci0gIH0KLQotICBHUFJfVElNRVJfRU5EKCJncnBjX2NodHRwMl91bmxvY2tpbmdfY2hlY2tfd3JpdGVzIiwgMCk7Ci0KLSAgcmV0dXJuIHRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYuY291bnQgPiAwIHx8Ci0gICAgICAgICBncnBjX2NodHRwMl9saXN0X2hhdmVfd3JpdGluZ19zdHJlYW1zKHRyYW5zcG9ydF93cml0aW5nKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9wZXJmb3JtX3dyaXRlcygKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3dyaXRpbmcgKnRyYW5zcG9ydF93cml0aW5nLAotICAgIGdycGNfZW5kcG9pbnQgKmVuZHBvaW50KSB7Ci0gIEdQUl9BU1NFUlQodHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1Zi5jb3VudCA+IDAgfHwKLSAgICAgICAgICAgICBncnBjX2NodHRwMl9saXN0X2hhdmVfd3JpdGluZ19zdHJlYW1zKHRyYW5zcG9ydF93cml0aW5nKSk7Ci0KLSAgZmluYWxpemVfb3V0YnVmKGV4ZWNfY3R4LCB0cmFuc3BvcnRfd3JpdGluZyk7Ci0KLSAgR1BSX0FTU0VSVChlbmRwb2ludCk7Ci0KLSAgaWYgKHRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYuY291bnQgPiAwKSB7Ci0gICAgZ3JwY19lbmRwb2ludF93cml0ZShleGVjX2N0eCwgZW5kcG9pbnQsICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9ydF93cml0aW5nLT5kb25lX2NiKTsKLSAgfSBlbHNlIHsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZ0cmFuc3BvcnRfd3JpdGluZy0+ZG9uZV9jYiwgdHJ1ZSwgTlVMTCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZmluYWxpemVfb3V0YnVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZykgewotICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmc7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJmaW5hbGl6ZV9vdXRidWYiLCAwKTsKLQotICB3aGlsZSAoCi0gICAgICBncnBjX2NodHRwMl9saXN0X3BvcF93cml0aW5nX3N0cmVhbSh0cmFuc3BvcnRfd3JpdGluZywgJnN0cmVhbV93cml0aW5nKSkgewotICAgIHVpbnQzMl90IG1heF9vdXRnb2luZyA9Ci0gICAgICAgICh1aW50MzJfdClHUFJfTUlOKEdSUENfQ0hUVFAyX01BWF9QQVlMT0FEX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1BSX01JTihzdHJlYW1fd3JpdGluZy0+b3V0Z29pbmdfd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydF93cml0aW5nLT5vdXRnb2luZ193aW5kb3cpKTsKLSAgICAvKiBzZW5kIGluaXRpYWwgbWV0YWRhdGEgaWYgaXQncyBhdmFpbGFibGUgKi8KLSAgICBpZiAoc3RyZWFtX3dyaXRpbmctPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICBncnBjX2NodHRwMl9lbmNvZGVfaGVhZGVyKAotICAgICAgICAgICZ0cmFuc3BvcnRfd3JpdGluZy0+aHBhY2tfY29tcHJlc3Nvciwgc3RyZWFtX3dyaXRpbmctPmlkLAotICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEsIDAsICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmKTsKLSAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgPSBOVUxMOwotICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbnRfaW5pdGlhbF9tZXRhZGF0YSA9IDE7Ci0gICAgfQotICAgIC8qIHNlbmQgYW55IHdpbmRvdyB1cGRhdGVzICovCi0gICAgaWYgKHN0cmVhbV93cml0aW5nLT5hbm5vdW5jZV93aW5kb3cgPiAwICYmCi0gICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX2luaXRpYWxfbWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgdWludDMyX3QgYW5ub3VuY2UgPSBzdHJlYW1fd3JpdGluZy0+YW5ub3VuY2Vfd2luZG93OwotICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoCi0gICAgICAgICAgJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYsCi0gICAgICAgICAgZ3JwY19jaHR0cDJfd2luZG93X3VwZGF0ZV9jcmVhdGUoc3RyZWFtX3dyaXRpbmctPmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5hbm5vdW5jZV93aW5kb3cpKTsKLSAgICAgIEdSUENfQ0hUVFAyX0ZMT1dfREVCSVRfU1RSRUFNKCJ3cml0ZSIsIHRyYW5zcG9ydF93cml0aW5nLCBzdHJlYW1fd3JpdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlX3dpbmRvdywgYW5ub3VuY2UpOwotICAgICAgc3RyZWFtX3dyaXRpbmctPmFubm91bmNlX3dpbmRvdyA9IDA7Ci0gICAgfQotICAgIC8qIGZldGNoIGFueSBib2R5IGJ5dGVzICovCi0gICAgd2hpbGUgKCFzdHJlYW1fd3JpdGluZy0+ZmV0Y2hpbmcgJiYgc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSAmJgotICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlci5sZW5ndGggPCBtYXhfb3V0Z29pbmcgJiYKLSAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnN0cmVhbV9mZXRjaGVkIDwKLSAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UtPmxlbmd0aCkgewotICAgICAgaWYgKGdycGNfYnl0ZV9zdHJlYW1fbmV4dChleGVjX2N0eCwgc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV93cml0aW5nLT5mZXRjaGluZ19zbGljZSwgbWF4X291dGdvaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX3dyaXRpbmctPmZpbmlzaGVkX2ZldGNoKSkgewotICAgICAgICBzdHJlYW1fd3JpdGluZy0+c3RyZWFtX2ZldGNoZWQgKz0KLSAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgoc3RyZWFtX3dyaXRpbmctPmZldGNoaW5nX3NsaWNlKTsKLSAgICAgICAgaWYgKHN0cmVhbV93cml0aW5nLT5zdHJlYW1fZmV0Y2hlZCA9PQotICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZS0+bGVuZ3RoKSB7Ci0gICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+ZmV0Y2hpbmdfc2xpY2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyZWFtX3dyaXRpbmctPmZldGNoaW5nID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogc2VuZCBhbnkgYm9keSBieXRlcyAqLwotICAgIGlmIChzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlci5sZW5ndGggPiAwKSB7Ci0gICAgICBpZiAobWF4X291dGdvaW5nID4gMCkgewotICAgICAgICB1aW50MzJfdCBzZW5kX2J5dGVzID0gKHVpbnQzMl90KUdQUl9NSU4oCi0gICAgICAgICAgICBtYXhfb3V0Z29pbmcsIHN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICAgIGludCBpc19sYXN0X2RhdGFfZnJhbWUgPQotICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9PSBOVUxMICYmCi0gICAgICAgICAgICBzZW5kX2J5dGVzID09IHN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLmxlbmd0aDsKLSAgICAgICAgaW50IGlzX2xhc3RfZnJhbWUgPSBpc19sYXN0X2RhdGFfZnJhbWUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9pc19lbXB0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEpOwotICAgICAgICBncnBjX2NodHRwMl9lbmNvZGVfZGF0YSgKLSAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5pZCwgJnN0cmVhbV93cml0aW5nLT5mbG93X2NvbnRyb2xsZWRfYnVmZmVyLAotICAgICAgICAgICAgc2VuZF9ieXRlcywgaXNfbGFzdF9mcmFtZSwgJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYpOwotICAgICAgICBHUlBDX0NIVFRQMl9GTE9XX0RFQklUX1NUUkVBTSgid3JpdGUiLCB0cmFuc3BvcnRfd3JpdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmcsIG91dGdvaW5nX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9ieXRlcyk7Ci0gICAgICAgIEdSUENfQ0hUVFAyX0ZMT1dfREVCSVRfVFJBTlNQT1JUKCJ3cml0ZSIsIHRyYW5zcG9ydF93cml0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRnb2luZ193aW5kb3csIHNlbmRfYnl0ZXMpOwotICAgICAgICBpZiAoaXNfbGFzdF9mcmFtZSkgewotICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhID0gTlVMTDsKLSAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VudF90cmFpbGluZ19tZXRhZGF0YSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzX2xhc3RfZGF0YV9mcmFtZSkgewotICAgICAgICAgIEdQUl9BU1NFUlQoc3RyZWFtX3dyaXRpbmctPnNlbmRfbWVzc2FnZSA9PSBOVUxMKTsKLSAgICAgICAgICBzdHJlYW1fd3JpdGluZy0+c2VudF9tZXNzYWdlID0gMTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfd3JpdGluZy0+b3V0Z29pbmdfd2luZG93ID09IDApIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdGluZ19zdGFsbGVkX2J5X3RyYW5zcG9ydCh0cmFuc3BvcnRfd3JpdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fd3JpdGluZyk7Ci0gICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXR0ZW5fc3RyZWFtKHRyYW5zcG9ydF93cml0aW5nLCBzdHJlYW1fd3JpdGluZyk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIHNlbmQgdHJhaWxpbmcgbWV0YWRhdGEgaWYgaXQncyBhdmFpbGFibGUgYW5kIHdlJ3JlIHJlYWR5IGZvciBpdCAqLwotICAgIGlmIChzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlID09IE5VTEwgJiYKLSAgICAgICAgc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIubGVuZ3RoID09IDAgJiYKLSAgICAgICAgc3RyZWFtX3dyaXRpbmctPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgIT0gTlVMTCkgewotICAgICAgaWYgKGdycGNfbWV0YWRhdGFfYmF0Y2hfaXNfZW1wdHkoCi0gICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhKSkgewotICAgICAgICBncnBjX2NodHRwMl9lbmNvZGVfZGF0YShzdHJlYW1fd3JpdGluZy0+aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1fd3JpdGluZy0+Zmxvd19jb250cm9sbGVkX2J1ZmZlciwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9ydF93cml0aW5nLT5vdXRidWYpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfZW5jb2RlX2hlYWRlcigmdHJhbnNwb3J0X3dyaXRpbmctPmhwYWNrX2NvbXByZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmctPmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmKTsKLSAgICAgIH0KLSAgICAgIGlmICghdHJhbnNwb3J0X3dyaXRpbmctPmlzX2NsaWVudCAmJiAhc3RyZWFtX3dyaXRpbmctPnJlYWRfY2xvc2VkKSB7Ci0gICAgICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZ0cmFuc3BvcnRfd3JpdGluZy0+b3V0YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9yc3Rfc3RyZWFtX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV93cml0aW5nLT5pZCwgR1JQQ19DSFRUUDJfTk9fRVJST1IpKTsKLSAgICAgIH0KLSAgICAgIHN0cmVhbV93cml0aW5nLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhID0gTlVMTDsKLSAgICAgIHN0cmVhbV93cml0aW5nLT5zZW50X3RyYWlsaW5nX21ldGFkYXRhID0gMTsKLSAgICB9Ci0gICAgLyogaWYgdGhlcmUncyBtb3JlIHRvIHdyaXRlLCB0aGVuIGxvb3AsIG90aGVyd2lzZSBwcmVwYXJlIHRvIGZpbmlzaCB0aGUKLSAgICAgKiB3cml0ZSAqLwotICAgIGlmICgoc3RyZWFtX3dyaXRpbmctPmZsb3dfY29udHJvbGxlZF9idWZmZXIubGVuZ3RoID4gMCB8fAotICAgICAgICAgKHN0cmVhbV93cml0aW5nLT5zZW5kX21lc3NhZ2UgJiYgIXN0cmVhbV93cml0aW5nLT5mZXRjaGluZykpICYmCi0gICAgICAgIHN0cmVhbV93cml0aW5nLT5vdXRnb2luZ193aW5kb3cgPiAwKSB7Ci0gICAgICBpZiAodHJhbnNwb3J0X3dyaXRpbmctPm91dGdvaW5nX3dpbmRvdyA+IDApIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd3JpdGluZ19zdHJlYW0odHJhbnNwb3J0X3dyaXRpbmcsIHN0cmVhbV93cml0aW5nKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdycGNfY2h0dHAyX2xpc3RfYWRkX3dyaXRpbmdfc3RhbGxlZF9ieV90cmFuc3BvcnQodHJhbnNwb3J0X3dyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3dyaXRpbmcpOwotICAgICAgICBncnBjX2NodHRwMl9saXN0X2FkZF93cml0dGVuX3N0cmVhbSh0cmFuc3BvcnRfd3JpdGluZywgc3RyZWFtX3dyaXRpbmcpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX2NodHRwMl9saXN0X2FkZF93cml0dGVuX3N0cmVhbSh0cmFuc3BvcnRfd3JpdGluZywgc3RyZWFtX3dyaXRpbmcpOwotICAgIH0KLSAgfQotCi0gIEdQUl9USU1FUl9FTkQoImZpbmFsaXplX291dGJ1ZiIsIDApOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2NsZWFudXBfd3JpdGluZygKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfd3JpdGluZyAqdHJhbnNwb3J0X3dyaXRpbmcpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX3dyaXRpbmcgKnN0cmVhbV93cml0aW5nOwotICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsOwotCi0gIHdoaWxlIChncnBjX2NodHRwMl9saXN0X3BvcF93cml0dGVuX3N0cmVhbSgKLSAgICAgIHRyYW5zcG9ydF9nbG9iYWwsIHRyYW5zcG9ydF93cml0aW5nLCAmc3RyZWFtX2dsb2JhbCwgJnN0cmVhbV93cml0aW5nKSkgewotICAgIGlmIChzdHJlYW1fd3JpdGluZy0+c2VudF9pbml0aWFsX21ldGFkYXRhKSB7Ci0gICAgICBncnBjX2NodHRwMl9jb21wbGV0ZV9jbG9zdXJlX3N0ZXAoCi0gICAgICAgICAgZXhlY19jdHgsICZzdHJlYW1fZ2xvYmFsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGFfZmluaXNoZWQsIDEpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtX3dyaXRpbmctPnNlbnRfbWVzc2FnZSkgewotICAgICAgR1BSX0FTU0VSVChzdHJlYW1fd3JpdGluZy0+c2VuZF9tZXNzYWdlID09IE5VTEwpOwotICAgICAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKAotICAgICAgICAgIGV4ZWNfY3R4LCAmc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlX2ZpbmlzaGVkLCAxKTsKLSAgICAgIHN0cmVhbV93cml0aW5nLT5zZW50X21lc3NhZ2UgPSAwOwotICAgIH0KLSAgICBpZiAoc3RyZWFtX3dyaXRpbmctPnNlbnRfdHJhaWxpbmdfbWV0YWRhdGEpIHsKLSAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKLSAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQsIDEpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtX3dyaXRpbmctPnNlbnRfdHJhaWxpbmdfbWV0YWRhdGEpIHsKLSAgICAgIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdHJhbnNwb3J0X2dsb2JhbC0+aXNfY2xpZW50LCAxKTsKLSAgICB9Ci0gICAgR1JQQ19DSFRUUDJfU1RSRUFNX1VOUkVGKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCAiY2h0dHAyX3dyaXRpbmciKTsKLSAgfQotICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZigmdHJhbnNwb3J0X3dyaXRpbmctPm91dGJ1Zik7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1YmYzMS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIgotCi0jZGVmaW5lIERFRkFVTFRfV0lORE9XIDY1NTM1Ci0jZGVmaW5lIERFRkFVTFRfQ09OTkVDVElPTl9XSU5ET1dfVEFSR0VUICgxMDI0ICogMTAyNCkKLSNkZWZpbmUgTUFYX1dJTkRPVyAweDdmZmZmZmZmdQotCi0jZGVmaW5lIE1BWF9DTElFTlRfU1RSRUFNX0lEIDB4N2ZmZmZmZmZ1Ci0KLWludCBncnBjX2h0dHBfdHJhY2UgPSAwOwotaW50IGdycGNfZmxvd2N0bF90cmFjZSA9IDA7Ci0KLSNkZWZpbmUgVFJBTlNQT1JUX0ZST01fV1JJVElORyh0dykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0dyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nKSkpCi0KLSNkZWZpbmUgVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0dykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0dyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nKSkpCi0KLSNkZWZpbmUgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKSgoY2hhciAqKSh0Zyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfdHJhbnNwb3J0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpKSkKLQotI2RlZmluZSBTVFJFQU1fRlJPTV9HTE9CQUwoc2cpIFwKLSAgKChncnBjX2NodHRwMl9zdHJlYW0gKikoKGNoYXIgKikoc2cpLW9mZnNldG9mKGdycGNfY2h0dHAyX3N0cmVhbSwgZ2xvYmFsKSkpCi0KLSNkZWZpbmUgU1RSRUFNX0ZST01fUEFSU0lORyhzZykgXAotICAoKGdycGNfY2h0dHAyX3N0cmVhbSAqKSgoY2hhciAqKShzZyktb2Zmc2V0b2YoZ3JwY19jaHR0cDJfc3RyZWFtLCBwYXJzaW5nKSkpCi0KLXN0YXRpYyBjb25zdCBncnBjX3RyYW5zcG9ydF92dGFibGUgdnRhYmxlOwotCi1zdGF0aWMgdm9pZCBsb2NrKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCk7Ci1zdGF0aWMgdm9pZCB1bmxvY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCk7Ci0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHZhcmlvdXMgY2FsbGJhY2tzIHRoYXQgd2UnbGwgYnVpbGQgY2xvc3VyZXMgYXJvdW5kICovCi1zdGF0aWMgdm9pZCB3cml0aW5nX2FjdGlvbihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW9tZ3Jfc3VjY2Vzc19pZ25vcmVkKTsKLQotLyoqIFNldCBhIHRyYW5zcG9ydCBsZXZlbCBzZXR0aW5nLCBhbmQgcHVzaCBpdCB0byBvdXIgcGVlciAqLwotc3RhdGljIHZvaWQgcHVzaF9zZXR0aW5nKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwgZ3JwY19jaHR0cDJfc2V0dGluZ19pZCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7Ci0KLS8qKiBFbmRwb2ludCBjYWxsYmFjayB0byBwcm9jZXNzIGluY29taW5nIGRhdGEgKi8KLXN0YXRpYyB2b2lkIHJlY3ZfZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdHAsIGJvb2wgc3VjY2Vzcyk7Ci0KLS8qKiBTdGFydCBkaXNjb25uZWN0aW9uIGNoYWluICovCi1zdGF0aWMgdm9pZCBkcm9wX2Nvbm5lY3Rpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCk7Ci0KLS8qKiBQZXJmb3JtIGEgdHJhbnNwb3J0X29wICovCi1zdGF0aWMgdm9pZCBwZXJmb3JtX3N0cmVhbV9vcF9sb2NrZWQoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7Ci0KLS8qKiBDYW5jZWwgYSBzdHJlYW06IGNvbWluZyBmcm9tIHRoZSB0cmFuc3BvcnQgQVBJICovCi1zdGF0aWMgdm9pZCBjYW5jZWxfZnJvbV9hcGkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzKTsKLQotc3RhdGljIHZvaWQgY2xvc2VfZnJvbV9hcGkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RhdHVzX2NvZGUgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpvcHRpb25hbF9tZXNzYWdlKTsKLQotLyoqIEFkZCBlbmRwb2ludCBmcm9tIHRoaXMgdHJhbnNwb3J0IHRvIHBvbGxzZXQgKi8KLXN0YXRpYyB2b2lkIGFkZF90b19wb2xsc2V0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKLXN0YXRpYyB2b2lkIGFkZF90b19wb2xsc2V0X3NldF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0X3NldCAqcG9sbHNldF9zZXQpOwotCi0vKiogU3RhcnQgbmV3IHN0cmVhbXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBpZiB3ZSBjYW4gKi8KLXN0YXRpYyB2b2lkIG1heWJlX3N0YXJ0X3NvbWVfc3RyZWFtcygKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCk7Ci0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGUsIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX3JlYWRfb3BzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCk7Ci0KLXN0YXRpYyB2b2lkIGluY29taW5nX2J5dGVfc3RyZWFtX3VwZGF0ZV9mbG93X2NvbnRyb2woCi0gICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLCBzaXplX3QgbWF4X3NpemVfaGludCwKLSAgICBzaXplX3QgaGF2ZV9hbHJlYWR5KTsKLQotc3RhdGljIHZvaWQgZmFpbF9wZW5kaW5nX3dyaXRlcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDT05TVFJVQ1RJT04vREVTVFJVQ1RJT04vUkVGQ09VTlRJTkcKLSAqLwotCi1zdGF0aWMgdm9pZCBkZXN0cnVjdF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7Ci0gIHNpemVfdCBpOwotCi0gIGdwcl9tdV9sb2NrKCZ0LT5tdSk7Ci0KLSAgR1BSX0FTU0VSVCh0LT5lcCA9PSBOVUxMKTsKLQotICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnQtPmdsb2JhbC5xYnVmKTsKLQotICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJnQtPndyaXRpbmcub3V0YnVmKTsKLSAgZ3JwY19jaHR0cDJfaHBhY2tfY29tcHJlc3Nvcl9kZXN0cm95KCZ0LT53cml0aW5nLmhwYWNrX2NvbXByZXNzb3IpOwotCi0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmdC0+cGFyc2luZy5xYnVmKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9kZXN0cm95KCZ0LT5yZWFkX2J1ZmZlcik7Ci0gIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9kZXN0cm95KCZ0LT5wYXJzaW5nLmhwYWNrX3BhcnNlcik7Ci0gIGdycGNfY2h0dHAyX2dvYXdheV9wYXJzZXJfZGVzdHJveSgmdC0+cGFyc2luZy5nb2F3YXlfcGFyc2VyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU1RSRUFNX0xJU1RfQ09VTlQ7IGkrKykgewotICAgIEdQUl9BU1NFUlQodC0+bGlzdHNbaV0uaGVhZCA9PSBOVUxMKTsKLSAgICBHUFJfQVNTRVJUKHQtPmxpc3RzW2ldLnRhaWwgPT0gTlVMTCk7Ci0gIH0KLQotICBHUFJfQVNTRVJUKGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfc2l6ZSgmdC0+cGFyc2luZ19zdHJlYW1fbWFwKSA9PSAwKTsKLSAgR1BSX0FTU0VSVChncnBjX2NodHRwMl9zdHJlYW1fbWFwX3NpemUoJnQtPm5ld19zdHJlYW1fbWFwKSA9PSAwKTsKLQotICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2Rlc3Ryb3koJnQtPnBhcnNpbmdfc3RyZWFtX21hcCk7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVzdHJveSgmdC0+bmV3X3N0cmVhbV9tYXApOwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9kZXN0cm95KGV4ZWNfY3R4LCAmdC0+Y2hhbm5lbF9jYWxsYmFjay5zdGF0ZV90cmFja2VyKTsKLQotICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7Ci0gIGdwcl9tdV9kZXN0cm95KCZ0LT5tdSk7Ci0KLSAgLyogY2FsbGJhY2sgcmVtYWluaW5nIHBpbmdzOiB0aGV5J3JlIG5vdCBhbGxvd2VkIHRvIGNhbGwgaW50byB0aGUgdHJhbnNwb3QsCi0gICAgIGFuZCBtYXliZSB0aGV5IGhvbGQgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBiZSBmcmVlZCAqLwotICB3aGlsZSAodC0+Z2xvYmFsLnBpbmdzLm5leHQgIT0gJnQtPmdsb2JhbC5waW5ncykgewotICAgIGdycGNfY2h0dHAyX291dHN0YW5kaW5nX3BpbmcgKnBpbmcgPSB0LT5nbG9iYWwucGluZ3MubmV4dDsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHBpbmctPm9uX3JlY3YsIGZhbHNlLCBOVUxMKTsKLSAgICBwaW5nLT5uZXh0LT5wcmV2ID0gcGluZy0+cHJldjsKLSAgICBwaW5nLT5wcmV2LT5uZXh0ID0gcGluZy0+bmV4dDsKLSAgICBncHJfZnJlZShwaW5nKTsKLSAgfQotCi0gIGdwcl9mcmVlKHQtPnBlZXJfc3RyaW5nKTsKLSAgZ3ByX2ZyZWUodCk7Ci19Ci0KLSNpZmRlZiBSRUZDT1VOVElOR19ERUJVRwotI2RlZmluZSBSRUZfVFJBTlNQT1JUKHQsIHIpIHJlZl90cmFuc3BvcnQodCwgciwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBVTlJFRl9UUkFOU1BPUlQoY2wsIHQsIHIpIHVucmVmX3RyYW5zcG9ydChjbCwgdCwgciwgX19GSUxFX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgdW5yZWZfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgewotICBncHJfbG9nKEdQUl9ERUJVRywgImNodHRwMjp1bnJlZjolcCAlZC0+JWQgJXMgWyVzOiVkXSIsIHQsIHQtPnJlZnMuY291bnQsCi0gICAgICAgICAgdC0+cmVmcy5jb3VudCAtIDEsIHJlYXNvbiwgZmlsZSwgbGluZSk7Ci0gIGlmICghZ3ByX3VucmVmKCZ0LT5yZWZzKSkgcmV0dXJuOwotICBkZXN0cnVjdF90cmFuc3BvcnQoZXhlY19jdHgsIHQpOwotfQotCi1zdGF0aWMgdm9pZCByZWZfdHJhbnNwb3J0KGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwgY29uc3QgY2hhciAqcmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkgewotICBncHJfbG9nKEdQUl9ERUJVRywgImNodHRwMjogIHJlZjolcCAlZC0+JWQgJXMgWyVzOiVkXSIsIHQsIHQtPnJlZnMuY291bnQsCi0gICAgICAgICAgdC0+cmVmcy5jb3VudCArIDEsIHJlYXNvbiwgZmlsZSwgbGluZSk7Ci0gIGdwcl9yZWYoJnQtPnJlZnMpOwotfQotI2Vsc2UKLSNkZWZpbmUgUkVGX1RSQU5TUE9SVCh0LCByKSByZWZfdHJhbnNwb3J0KHQpCi0jZGVmaW5lIFVOUkVGX1RSQU5TUE9SVChjbCwgdCwgcikgdW5yZWZfdHJhbnNwb3J0KGNsLCB0KQotc3RhdGljIHZvaWQgdW5yZWZfdHJhbnNwb3J0KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsKLSAgaWYgKCFncHJfdW5yZWYoJnQtPnJlZnMpKSByZXR1cm47Ci0gIGRlc3RydWN0X3RyYW5zcG9ydChleGVjX2N0eCwgdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZl90cmFuc3BvcnQoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7IGdwcl9yZWYoJnQtPnJlZnMpOyB9Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF90cmFuc3BvcnQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdycGNfY2hhbm5lbF9hcmdzICpjaGFubmVsX2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2VuZHBvaW50ICplcCwgdWludDhfdCBpc19jbGllbnQpIHsKLSAgc2l6ZV90IGk7Ci0gIGludCBqOwotCi0gIEdQUl9BU1NFUlQoc3RybGVuKEdSUENfQ0hUVFAyX0NMSUVOVF9DT05ORUNUX1NUUklORykgPT0KLSAgICAgICAgICAgICBHUlBDX0NIVFRQMl9DTElFTlRfQ09OTkVDVF9TVFJMRU4pOwotCi0gIG1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKLQotICB0LT5iYXNlLnZ0YWJsZSA9ICZ2dGFibGU7Ci0gIHQtPmVwID0gZXA7Ci0gIC8qIG9uZSByZWYgaXMgZm9yIGRlc3Ryb3ksIHRoZSBvdGhlciBmb3Igd2hlbiBlcCBiZWNvbWVzIE5VTEwgKi8KLSAgZ3ByX3JlZl9pbml0KCZ0LT5yZWZzLCAyKTsKLSAgLyogcmVmIGlzIGRyb3BwZWQgYXQgdHJhbnNwb3J0IGNsb3NlKCkgKi8KLSAgZ3ByX3JlZl9pbml0KCZ0LT5zaHV0ZG93bl9lcF9yZWZzLCAxKTsKLSAgZ3ByX211X2luaXQoJnQtPm11KTsKLSAgdC0+cGVlcl9zdHJpbmcgPSBncnBjX2VuZHBvaW50X2dldF9wZWVyKGVwKTsKLSAgdC0+ZW5kcG9pbnRfcmVhZGluZyA9IDE7Ci0gIHQtPmdsb2JhbC5uZXh0X3N0cmVhbV9pZCA9IGlzX2NsaWVudCA/IDEgOiAyOwotICB0LT5nbG9iYWwuaXNfY2xpZW50ID0gaXNfY2xpZW50OwotICB0LT53cml0aW5nLm91dGdvaW5nX3dpbmRvdyA9IERFRkFVTFRfV0lORE9XOwotICB0LT5wYXJzaW5nLmluY29taW5nX3dpbmRvdyA9IERFRkFVTFRfV0lORE9XOwotICB0LT5nbG9iYWwuc3RyZWFtX2xvb2thaGVhZCA9IERFRkFVTFRfV0lORE9XOwotICB0LT5nbG9iYWwuY29ubmVjdGlvbl93aW5kb3dfdGFyZ2V0ID0gREVGQVVMVF9DT05ORUNUSU9OX1dJTkRPV19UQVJHRVQ7Ci0gIHQtPmdsb2JhbC5waW5nX2NvdW50ZXIgPSAxOwotICB0LT5nbG9iYWwucGluZ3MubmV4dCA9IHQtPmdsb2JhbC5waW5ncy5wcmV2ID0gJnQtPmdsb2JhbC5waW5nczsKLSAgdC0+cGFyc2luZy5pc19jbGllbnQgPSBpc19jbGllbnQ7Ci0gIHQtPnBhcnNpbmcuZGVmcmFtZV9zdGF0ZSA9Ci0gICAgICBpc19jbGllbnQgPyBHUlBDX0RUU19GSF8wIDogR1JQQ19EVFNfQ0xJRU5UX1BSRUZJWF8wOwotICB0LT53cml0aW5nLmlzX2NsaWVudCA9IGlzX2NsaWVudDsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfaW5pdCgKLSAgICAgICZ0LT5jaGFubmVsX2NhbGxiYWNrLnN0YXRlX3RyYWNrZXIsIEdSUENfQ0hBTk5FTF9SRUFEWSwKLSAgICAgIGlzX2NsaWVudCA/ICJjbGllbnRfdHJhbnNwb3J0IiA6ICJzZXJ2ZXJfdHJhbnNwb3J0Iik7Ci0KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT5nbG9iYWwucWJ1Zik7Ci0KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT53cml0aW5nLm91dGJ1Zik7Ci0gIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3JfaW5pdCgmdC0+d3JpdGluZy5ocGFja19jb21wcmVzc29yKTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnQtPndyaXRpbmdfYWN0aW9uLCB3cml0aW5nX2FjdGlvbiwgdCk7Ci0KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT5wYXJzaW5nLnFidWYpOwotICBncnBjX2NodHRwMl9nb2F3YXlfcGFyc2VyX2luaXQoJnQtPnBhcnNpbmcuZ29hd2F5X3BhcnNlcik7Ci0gIGdycGNfY2h0dHAyX2hwYWNrX3BhcnNlcl9pbml0KCZ0LT5wYXJzaW5nLmhwYWNrX3BhcnNlcik7Ci0KLSAgZ3JwY19jbG9zdXJlX2luaXQoJnQtPndyaXRpbmcuZG9uZV9jYiwgZ3JwY19jaHR0cDJfdGVybWluYXRlX3dyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICZ0LT53cml0aW5nKTsKLSAgZ3JwY19jbG9zdXJlX2luaXQoJnQtPnJlY3ZfZGF0YSwgcmVjdl9kYXRhLCB0KTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZ0LT5yZWFkX2J1ZmZlcik7Ci0KLSAgaWYgKGlzX2NsaWVudCkgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAotICAgICAgICAmdC0+Z2xvYmFsLnFidWYsCi0gICAgICAgIGdwcl9zbGljZV9mcm9tX2NvcGllZF9zdHJpbmcoR1JQQ19DSFRUUDJfQ0xJRU5UX0NPTk5FQ1RfU1RSSU5HKSk7Ci0gIH0KLSAgLyogOCBpcyBhIHJhbmRvbSBzdGFiIGluIHRoZSBkYXJrIGFzIHRvIGEgZ29vZCBpbml0aWFsIHNpemU6IGl0J3Mgc21hbGwgZW5vdWdoCi0gICAgIHRoYXQgaXQgc2hvdWxkbid0IHdhc3RlIG1lbW9yeSBmb3IgaW5mcmVxdWVudGx5IHVzZWQgY29ubmVjdGlvbnMsIHlldAotICAgICBsYXJnZSBlbm91Z2ggdGhhdCB0aGUgZXhwb25lbnRpYWwgZ3Jvd3RoIHNob3VsZCBoYXBwZW4gbmljZWx5IHdoZW4gaXQncwotICAgICBuZWVkZWQuCi0gICAgIFRPRE8oY3RpbGxlcik6IHR1bmUgdGhpcyAqLwotICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2luaXQoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCwgOCk7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfaW5pdCgmdC0+bmV3X3N0cmVhbV9tYXAsIDgpOwotCi0gIC8qIGNvcHkgaW4gaW5pdGlhbCBzZXR0aW5ncyB0byBhbGwgc2V0dGluZyBzZXRzICovCi0gIGZvciAoaSA9IDA7IGkgPCBHUlBDX0NIVFRQMl9OVU1fU0VUVElOR1M7IGkrKykgewotICAgIHQtPnBhcnNpbmcuc2V0dGluZ3NbaV0gPSBncnBjX2NodHRwMl9zZXR0aW5nc19wYXJhbWV0ZXJzW2ldLmRlZmF1bHRfdmFsdWU7Ci0gICAgZm9yIChqID0gMDsgaiA8IEdSUENfTlVNX1NFVFRJTkdfU0VUUzsgaisrKSB7Ci0gICAgICB0LT5nbG9iYWwuc2V0dGluZ3Nbal1baV0gPQotICAgICAgICAgIGdycGNfY2h0dHAyX3NldHRpbmdzX3BhcmFtZXRlcnNbaV0uZGVmYXVsdF92YWx1ZTsKLSAgICB9Ci0gIH0KLSAgdC0+Z2xvYmFsLmRpcnRpZWRfbG9jYWxfc2V0dGluZ3MgPSAxOwotICAvKiBIYWNrOiBpdCdzIGNvbW1vbiBmb3IgaW1wbGVtZW50YXRpb25zIHRvIGFzc3VtZSA2NTUzNiBieXRlcyBpbml0aWFsIHNlbmQKLSAgICAgd2luZG93IC0tIHRoaXMgc2hvdWxkIGJ5IHJpZ2h0cyBiZSAwICovCi0gIHQtPmdsb2JhbC5mb3JjZV9zZW5kX3NldHRpbmdzID0gMSA8PCBHUlBDX0NIVFRQMl9TRVRUSU5HU19JTklUSUFMX1dJTkRPV19TSVpFOwotICB0LT5nbG9iYWwuc2VudF9sb2NhbF9zZXR0aW5ncyA9IDA7Ci0KLSAgLyogY29uZmlndXJlIGh0dHAyIHRoZSB3YXkgd2UgbGlrZSBpdCAqLwotICBpZiAoaXNfY2xpZW50KSB7Ci0gICAgcHVzaF9zZXR0aW5nKHQsIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0VOQUJMRV9QVVNILCAwKTsKLSAgICBwdXNoX3NldHRpbmcodCwgR1JQQ19DSFRUUDJfU0VUVElOR1NfTUFYX0NPTkNVUlJFTlRfU1RSRUFNUywgMCk7Ci0gIH0KLSAgcHVzaF9zZXR0aW5nKHQsIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0lOSVRJQUxfV0lORE9XX1NJWkUsIERFRkFVTFRfV0lORE9XKTsKLQotICBpZiAoY2hhbm5lbF9hcmdzKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxfYXJncy0+bnVtX2FyZ3M7IGkrKykgewotICAgICAgaWYgKDAgPT0KLSAgICAgICAgICBzdHJjbXAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLmtleSwgR1JQQ19BUkdfTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykpIHsKLSAgICAgICAgaWYgKGlzX2NsaWVudCkgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IGlzIGlnbm9yZWQgb24gdGhlIGNsaWVudCIsCi0gICAgICAgICAgICAgICAgICBHUlBDX0FSR19NQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKTsKLSAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsX2FyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19JTlRFR0VSKSB7Ci0gICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlczogbXVzdCBiZSBhbiBpbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQVJHX01BWF9DT05DVVJSRU5UX1NUUkVBTVMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1c2hfc2V0dGluZyh0LCBHUlBDX0NIVFRQMl9TRVRUSU5HU19NQVhfQ09OQ1VSUkVOVF9TVFJFQU1TLAotICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNoYW5uZWxfYXJncy0+YXJnc1tpXS5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX0lOSVRJQUxfU0VRVUVOQ0VfTlVNQkVSKSkgewotICAgICAgICBpZiAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfSU5URUdFUikgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IG11c3QgYmUgYW4gaW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICBHUlBDX0FSR19IVFRQMl9JTklUSUFMX1NFUVVFTkNFX05VTUJFUik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHQtPmdsb2JhbC5uZXh0X3N0cmVhbV9pZCAmIDEpICE9Ci0gICAgICAgICAgICAgICAgICAgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyICYgMSkpIHsKLSAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBsb3cgYml0IG11c3QgYmUgJWQgb24gJXMiLAotICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfSU5JVElBTF9TRVFVRU5DRV9OVU1CRVIsCi0gICAgICAgICAgICAgICAgICB0LT5nbG9iYWwubmV4dF9zdHJlYW1faWQgJiAxLAotICAgICAgICAgICAgICAgICAgaXNfY2xpZW50ID8gImNsaWVudCIgOiAic2VydmVyIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdC0+Z2xvYmFsLm5leHRfc3RyZWFtX2lkID0KLSAgICAgICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNoYW5uZWxfYXJncy0+YXJnc1tpXS5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX1NUUkVBTV9MT09LQUhFQURfQllURVMpKSB7Ci0gICAgICAgIGlmIChjaGFubmVsX2FyZ3MtPmFyZ3NbaV0udHlwZSAhPSBHUlBDX0FSR19JTlRFR0VSKSB7Ci0gICAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICIlczogbXVzdCBiZSBhbiBpbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX1NUUkVBTV9MT09LQUhFQURfQllURVMpOwotICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyIDw9IDUpIHsKLSAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBtdXN0IGJlIGF0IGxlYXN0IDUiLAotICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfU1RSRUFNX0xPT0tBSEVBRF9CWVRFUyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdC0+Z2xvYmFsLnN0cmVhbV9sb29rYWhlYWQgPQotICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfSFBBQ0tfVEFCTEVfU0laRV9ERUNPREVSKSkgewotICAgICAgICBpZiAoY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnR5cGUgIT0gR1JQQ19BUkdfSU5URUdFUikgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IG11c3QgYmUgYW4gaW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICBHUlBDX0FSR19IVFRQMl9IUEFDS19UQUJMRV9TSVpFX0RFQ09ERVIpOwotICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyIDwgMCkgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXM6IG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwKLSAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX0hQQUNLX1RBQkxFX1NJWkVfREVDT0RFUik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHVzaF9zZXR0aW5nKHQsIEdSUENfQ0hUVFAyX1NFVFRJTkdTX0hFQURFUl9UQUJMRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbF9hcmdzLT5hcmdzW2ldLnZhbHVlLmludGVnZXIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKGNoYW5uZWxfYXJncy0+YXJnc1tpXS5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSUENfQVJHX0hUVFAyX0hQQUNLX1RBQkxFX1NJWkVfRU5DT0RFUikpIHsKLSAgICAgICAgaWYgKGNoYW5uZWxfYXJncy0+YXJnc1tpXS50eXBlICE9IEdSUENfQVJHX0lOVEVHRVIpIHsKLSAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBtdXN0IGJlIGFuIGludGVnZXIiLAotICAgICAgICAgICAgICAgICAgR1JQQ19BUkdfSFRUUDJfSFBBQ0tfVEFCTEVfU0laRV9FTkNPREVSKTsKLSAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsX2FyZ3MtPmFyZ3NbaV0udmFsdWUuaW50ZWdlciA8IDApIHsKLSAgICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzOiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsCi0gICAgICAgICAgICAgICAgICBHUlBDX0FSR19IVFRQMl9IUEFDS19UQUJMRV9TSVpFX0VOQ09ERVIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdycGNfY2h0dHAyX2hwYWNrX2NvbXByZXNzb3Jfc2V0X21heF91c2FibGVfc2l6ZSgKLSAgICAgICAgICAgICAgJnQtPndyaXRpbmcuaHBhY2tfY29tcHJlc3NvciwKLSAgICAgICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxfYXJncy0+YXJnc1tpXS52YWx1ZS5pbnRlZ2VyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X3RyYW5zcG9ydChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKmd0KSB7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IChncnBjX2NodHRwMl90cmFuc3BvcnQgKilndDsKLQotICBsb2NrKHQpOwotICB0LT5kZXN0cm95aW5nID0gMTsKLSAgZHJvcF9jb25uZWN0aW9uKGV4ZWNfY3R4LCB0KTsKLSAgdW5sb2NrKGV4ZWNfY3R4LCB0KTsKLQotICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJkZXN0cm95Iik7Ci19Ci0KLS8qKiBibG9jayBncnBjX2VuZHBvaW50X3NodXRkb3duIGJlaW5nIGNhbGxlZCB1bnRpbCBhIHBhaXJlZAotICAgIGFsbG93X2VuZHBvaW50X3NodXRkb3duIGlzIG1hZGUgKi8KLXN0YXRpYyB2b2lkIHByZXZlbnRfZW5kcG9pbnRfc2h1dGRvd24oZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7Ci0gIEdQUl9BU1NFUlQodC0+ZXApOwotICBncHJfcmVmKCZ0LT5zaHV0ZG93bl9lcF9yZWZzKTsKLX0KLQotc3RhdGljIHZvaWQgYWxsb3dfZW5kcG9pbnRfc2h1dGRvd25fbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgewotICBpZiAoZ3ByX3VucmVmKCZ0LT5zaHV0ZG93bl9lcF9yZWZzKSkgewotICAgIGlmICh0LT5lcCkgewotICAgICAgZ3JwY19lbmRwb2ludF9zaHV0ZG93bihleGVjX2N0eCwgdC0+ZXApOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBhbGxvd19lbmRwb2ludF9zaHV0ZG93bl91bmxvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgewotICBpZiAoZ3ByX3VucmVmKCZ0LT5zaHV0ZG93bl9lcF9yZWZzKSkgewotICAgIGdwcl9tdV9sb2NrKCZ0LT5tdSk7Ci0gICAgaWYgKHQtPmVwKSB7Ci0gICAgICBncnBjX2VuZHBvaW50X3NodXRkb3duKGV4ZWNfY3R4LCB0LT5lcCk7Ci0gICAgfQotICAgIGdwcl9tdV91bmxvY2soJnQtPm11KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2VuZHBvaW50KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsKLSAgZ3JwY19lbmRwb2ludF9kZXN0cm95KGV4ZWNfY3R4LCB0LT5lcCk7Ci0gIHQtPmVwID0gTlVMTDsKLSAgLyogc2FmZSBiZWNhdXNlIHdlJ2xsIHN0aWxsIGhhdmUgdGhlIHJlZiBmb3Igd3JpdGUgKi8KLSAgVU5SRUZfVFJBTlNQT1JUKGV4ZWNfY3R4LCB0LCAiZGlzY29ubmVjdCIpOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV90cmFuc3BvcnRfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsKLSAgaWYgKCF0LT5jbG9zZWQpIHsKLSAgICB0LT5jbG9zZWQgPSAxOwotICAgIGNvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZXhlY19jdHgsICZ0LT5nbG9iYWwsIEdSUENfQ0hBTk5FTF9GQVRBTF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsb3NlX3RyYW5zcG9ydCIpOwotICAgIGlmICh0LT5lcCkgewotICAgICAgYWxsb3dfZW5kcG9pbnRfc2h1dGRvd25fbG9ja2VkKGV4ZWNfY3R4LCB0KTsKLSAgICB9Ci0KLSAgICAvKiBmbHVzaCB3cml0YWJsZSBzdHJlYW0gbGlzdCB0byBhdm9pZCBkYW5nbGluZyByZWZlcmVuY2VzICovCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fd3JpdGluZyAqc3RyZWFtX3dyaXRpbmc7Ci0gICAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX3dyaXRhYmxlX3N0cmVhbSgKLSAgICAgICAgJnQtPmdsb2JhbCwgJnQtPndyaXRpbmcsICZzdHJlYW1fZ2xvYmFsLCAmc3RyZWFtX3dyaXRpbmcpKSB7Ci0gICAgICBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsICJjaHR0cDJfd3JpdGluZyIpOwotICAgIH0KLSAgfQotfQotCi0jaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKLXZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX3JlZihncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBncnBjX3N0cmVhbV9yZWYoU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLT5yZWZjb3VudCwgcmVhc29uKTsKLX0KLXZvaWQgZ3JwY19jaHR0cDJfc3RyZWFtX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBncnBjX3N0cmVhbV91bnJlZihleGVjX2N0eCwgU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLT5yZWZjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgcmVhc29uKTsKLX0KLSNlbHNlCi12b2lkIGdycGNfY2h0dHAyX3N0cmVhbV9yZWYoZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgewotICBncnBjX3N0cmVhbV9yZWYoU1RSRUFNX0ZST01fR0xPQkFMKHN0cmVhbV9nbG9iYWwpLT5yZWZjb3VudCk7Ci19Ci12b2lkIGdycGNfY2h0dHAyX3N0cmVhbV91bnJlZihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwpIHsKLSAgZ3JwY19zdHJlYW1fdW5yZWYoZXhlY19jdHgsIFNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKS0+cmVmY291bnQpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaW5pdF9zdHJlYW0oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICpndCwKLSAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW0gKmdzLCBncnBjX3N0cmVhbV9yZWZjb3VudCAqcmVmY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKSB7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IChncnBjX2NodHRwMl90cmFuc3BvcnQgKilndDsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzID0gKGdycGNfY2h0dHAyX3N0cmVhbSAqKWdzOwotCi0gIG1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKLQotICBzLT5yZWZjb3VudCA9IHJlZmNvdW50OwotICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKCZzLT5nbG9iYWwsICJjaHR0cDIiKTsKLQotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMF0pOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMV0pOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfaW5pdCgKLSAgICAgICZzLT5nbG9iYWwucmVjZWl2ZWRfaW5pdGlhbF9tZXRhZGF0YSk7Ci0gIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9pbml0KAotICAgICAgJnMtPmdsb2JhbC5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSk7Ci0gIGdycGNfY2h0dHAyX2RhdGFfcGFyc2VyX2luaXQoJnMtPnBhcnNpbmcuZGF0YV9wYXJzZXIpOwotICBncHJfc2xpY2VfYnVmZmVyX2luaXQoJnMtPndyaXRpbmcuZmxvd19jb250cm9sbGVkX2J1ZmZlcik7Ci0KLSAgUkVGX1RSQU5TUE9SVCh0LCAic3RyZWFtIik7Ci0KLSAgbG9jayh0KTsKLSAgZ3JwY19jaHR0cDJfcmVnaXN0ZXJfc3RyZWFtKHQsIHMpOwotICBpZiAoc2VydmVyX2RhdGEpIHsKLSAgICBHUFJfQVNTRVJUKHQtPnBhcnNpbmdfYWN0aXZlKTsKLSAgICBzLT5nbG9iYWwuaWQgPSAodWludDMyX3QpKHVpbnRwdHJfdClzZXJ2ZXJfZGF0YTsKLSAgICBzLT5wYXJzaW5nLmlkID0gcy0+Z2xvYmFsLmlkOwotICAgIHMtPmdsb2JhbC5vdXRnb2luZ193aW5kb3cgPQotICAgICAgICB0LT5nbG9iYWwuc2V0dGluZ3NbR1JQQ19QRUVSX1NFVFRJTkdTXQotICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRV07Ci0gICAgcy0+cGFyc2luZy5pbmNvbWluZ193aW5kb3cgPSBzLT5nbG9iYWwubWF4X3JlY3ZfYnl0ZXMgPQotICAgICAgICB0LT5nbG9iYWwuc2V0dGluZ3NbR1JQQ19TRU5UX1NFVFRJTkdTXQotICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRV07Ci0gICAgKnQtPmFjY2VwdGluZ19zdHJlYW0gPSBzOwotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfYWRkKCZ0LT5wYXJzaW5nX3N0cmVhbV9tYXAsIHMtPmdsb2JhbC5pZCwgcyk7Ci0gICAgcy0+Z2xvYmFsLmluX3N0cmVhbV9tYXAgPSAxOwotICB9Ci0gIHVubG9jayhleGVjX2N0eCwgdCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqZ3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqZ3MpIHsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OwotICBncnBjX2NodHRwMl9zdHJlYW0gKnMgPSAoZ3JwY19jaHR0cDJfc3RyZWFtICopZ3M7Ci0gIGludCBpOwotICBncnBjX2J5dGVfc3RyZWFtICpiczsKLQotICBHUFJfVElNRVJfQkVHSU4oImRlc3Ryb3lfc3RyZWFtIiwgMCk7Ci0KLSAgZ3ByX211X2xvY2soJnQtPm11KTsKLQotICBHUFJfQVNTRVJUKChzLT5nbG9iYWwud3JpdGVfY2xvc2VkICYmIHMtPmdsb2JhbC5yZWFkX2Nsb3NlZCkgfHwKLSAgICAgICAgICAgICBzLT5nbG9iYWwuaWQgPT0gMCk7Ci0gIEdQUl9BU1NFUlQoIXMtPmdsb2JhbC5pbl9zdHJlYW1fbWFwKTsKLSAgaWYgKGdycGNfY2h0dHAyX3VucmVnaXN0ZXJfc3RyZWFtKHQsIHMpICYmIHQtPmdsb2JhbC5zZW50X2dvYXdheSkgewotICAgIGNsb3NlX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIHQpOwotICB9Ci0gIGlmICghdC0+cGFyc2luZ19hY3RpdmUgJiYgcy0+Z2xvYmFsLmlkKSB7Ci0gICAgR1BSX0FTU0VSVChncnBjX2NodHRwMl9zdHJlYW1fbWFwX2ZpbmQoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5nbG9iYWwuaWQpID09IE5VTEwpOwotICB9Ci0KLSAgZ3JwY19jaHR0cDJfbGlzdF9yZW1vdmVfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSgmdC0+Z2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5nbG9iYWwpOwotICBncnBjX2NodHRwMl9saXN0X3JlbW92ZV9zdGFsbGVkX2J5X3RyYW5zcG9ydCgmdC0+Z2xvYmFsLCAmcy0+Z2xvYmFsKTsKLQotICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFNUUkVBTV9MSVNUX0NPVU5UOyBpKyspIHsKLSAgICBpZiAocy0+aW5jbHVkZWRbaV0pIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiJXMgc3RyZWFtICVkIHN0aWxsIGluY2x1ZGVkIGluIGxpc3QgJWQiLAotICAgICAgICAgICAgICB0LT5nbG9iYWwuaXNfY2xpZW50ID8gImNsaWVudCIgOiAic2VydmVyIiwgcy0+Z2xvYmFsLmlkLCBpKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICB9Ci0KLSAgd2hpbGUgKAotICAgICAgKGJzID0gZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWVfcG9wKCZzLT5nbG9iYWwuaW5jb21pbmdfZnJhbWVzKSkpIHsKLSAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGJzKTsKLSAgfQotCi0gIEdQUl9BU1NFUlQocy0+Z2xvYmFsLnNlbmRfaW5pdGlhbF9tZXRhZGF0YV9maW5pc2hlZCA9PSBOVUxMKTsKLSAgR1BSX0FTU0VSVChzLT5nbG9iYWwuc2VuZF9tZXNzYWdlX2ZpbmlzaGVkID09IE5VTEwpOwotICBHUFJfQVNTRVJUKHMtPmdsb2JhbC5zZW5kX3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkID09IE5VTEwpOwotICBHUFJfQVNTRVJUKHMtPmdsb2JhbC5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgPT0gTlVMTCk7Ci0gIEdQUl9BU1NFUlQocy0+Z2xvYmFsLnJlY3ZfbWVzc2FnZV9yZWFkeSA9PSBOVUxMKTsKLSAgR1BSX0FTU0VSVChzLT5nbG9iYWwucmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCA9PSBOVUxMKTsKLSAgZ3JwY19jaHR0cDJfZGF0YV9wYXJzZXJfZGVzdHJveShleGVjX2N0eCwgJnMtPnBhcnNpbmcuZGF0YV9wYXJzZXIpOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMF0pOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgmcy0+cGFyc2luZy5tZXRhZGF0YV9idWZmZXJbMV0pOwotICBncnBjX2NodHRwMl9pbmNvbWluZ19tZXRhZGF0YV9idWZmZXJfZGVzdHJveSgKLSAgICAgICZzLT5nbG9iYWwucmVjZWl2ZWRfaW5pdGlhbF9tZXRhZGF0YSk7Ci0gIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9kZXN0cm95KAotICAgICAgJnMtPmdsb2JhbC5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSk7Ci0gIGdwcl9zbGljZV9idWZmZXJfZGVzdHJveSgmcy0+d3JpdGluZy5mbG93X2NvbnRyb2xsZWRfYnVmZmVyKTsKLQotICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJzdHJlYW0iKTsKLQotICBHUFJfVElNRVJfRU5EKCJkZXN0cm95X3N0cmVhbSIsIDApOwotfQotCi1ncnBjX2NodHRwMl9zdHJlYW1fcGFyc2luZyAqZ3JwY19jaHR0cDJfcGFyc2luZ19sb29rdXBfc3RyZWFtKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywgdWludDMyX3QgaWQpIHsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0cmFuc3BvcnRfcGFyc2luZyk7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqcyA9Ci0gICAgICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2ZpbmQoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCwgaWQpOwotICByZXR1cm4gcyA/ICZzLT5wYXJzaW5nIDogTlVMTDsKLX0KLQotZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKmdycGNfY2h0dHAyX3BhcnNpbmdfYWNjZXB0X3N0cmVhbSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIHVpbnQzMl90IGlkKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqYWNjZXB0aW5nOwotICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQgPSBUUkFOU1BPUlRfRlJPTV9QQVJTSU5HKHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgR1BSX0FTU0VSVCh0LT5hY2NlcHRpbmdfc3RyZWFtID09IE5VTEwpOwotICB0LT5hY2NlcHRpbmdfc3RyZWFtID0gJmFjY2VwdGluZzsKLSAgdC0+Y2hhbm5lbF9jYWxsYmFjay5hY2NlcHRfc3RyZWFtKGV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+Y2hhbm5lbF9jYWxsYmFjay5hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0LT5iYXNlLCAodm9pZCAqKSh1aW50cHRyX3QpaWQpOwotICB0LT5hY2NlcHRpbmdfc3RyZWFtID0gTlVMTDsKLSAgcmV0dXJuICZhY2NlcHRpbmctPnBhcnNpbmc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMT0NLIE1BTkFHRU1FTlQKLSAqLwotCi0vKiBXZSB0YWtlIGEgZ3JwY19jaHR0cDJfdHJhbnNwb3J0LWdsb2JhbCBsb2NrIGluIHJlc3BvbnNlIHRvIGNhbGxzIGNvbWluZyBpbgotICAgZnJvbSBhYm92ZSwKLSAgIGFuZCBpbiByZXNwb25zZSB0byBkYXRhIGJlaW5nIHJlY2VpdmVkIGZyb20gYmVsb3cuIE5ldyBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgIGlzIGFsd2F5cyBxdWV1ZWQsIGFzIGFyZSBjYWxsYmFja3MgdG8gcHJvY2VzcyBkYXRhLiBEdXJpbmcgdW5sb2NrKCkgd2UKLSAgIGNoZWNrIG91ciB0b2RvIGxpc3RzIGFuZCBpbml0aWF0ZSBjYWxsYmFja3MgYW5kIGZsdXNoIHdyaXRlcy4gKi8KLQotc3RhdGljIHZvaWQgbG9jayhncnBjX2NodHRwMl90cmFuc3BvcnQgKnQpIHsgZ3ByX211X2xvY2soJnQtPm11KTsgfQotCi1zdGF0aWMgdm9pZCB1bmxvY2soZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgewotICBHUFJfVElNRVJfQkVHSU4oInVubG9jayIsIDApOwotICBpZiAoIXQtPndyaXRpbmdfYWN0aXZlICYmICF0LT5jbG9zZWQgJiYKLSAgICAgIGdycGNfY2h0dHAyX3VubG9ja2luZ19jaGVja193cml0ZXMoZXhlY19jdHgsICZ0LT5nbG9iYWwsICZ0LT53cml0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5wYXJzaW5nX2FjdGl2ZSkpIHsKLSAgICB0LT53cml0aW5nX2FjdGl2ZSA9IDE7Ci0gICAgUkVGX1RSQU5TUE9SVCh0LCAid3JpdGluZyIpOwotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgJnQtPndyaXRpbmdfYWN0aW9uLCB0cnVlLCBOVUxMKTsKLSAgICBwcmV2ZW50X2VuZHBvaW50X3NodXRkb3duKHQpOwotICB9Ci0gIGNoZWNrX3JlYWRfb3BzKGV4ZWNfY3R4LCAmdC0+Z2xvYmFsKTsKLQotICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7Ci0gIEdQUl9USU1FUl9FTkQoInVubG9jayIsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogT1VUUFVUIFBST0NFU1NJTkcKLSAqLwotCi12b2lkIGdycGNfY2h0dHAyX2JlY29tZV93cml0YWJsZShncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgewotICBpZiAoIVRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKS0+Y2xvc2VkICYmCi0gICAgICBncnBjX2NodHRwMl9saXN0X2FkZF93cml0YWJsZV9zdHJlYW0odHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCkpIHsKLSAgICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKHN0cmVhbV9nbG9iYWwsICJjaHR0cDJfd3JpdGluZyIpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHB1c2hfc2V0dGluZyhncnBjX2NodHRwMl90cmFuc3BvcnQgKnQsIGdycGNfY2h0dHAyX3NldHRpbmdfaWQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpIHsKLSAgY29uc3QgZ3JwY19jaHR0cDJfc2V0dGluZ19wYXJhbWV0ZXJzICpzcCA9Ci0gICAgICAmZ3JwY19jaHR0cDJfc2V0dGluZ3NfcGFyYW1ldGVyc1tpZF07Ci0gIHVpbnQzMl90IHVzZV92YWx1ZSA9IEdQUl9DTEFNUCh2YWx1ZSwgc3AtPm1pbl92YWx1ZSwgc3AtPm1heF92YWx1ZSk7Ci0gIGlmICh1c2VfdmFsdWUgIT0gdmFsdWUpIHsKLSAgICBncHJfbG9nKEdQUl9JTkZPLCAiUmVxdWVzdGVkIHBhcmFtZXRlciAlcyBjbGFtcGVkIGZyb20gJWQgdG8gJWQiLCBzcC0+bmFtZSwKLSAgICAgICAgICAgIHZhbHVlLCB1c2VfdmFsdWUpOwotICB9Ci0gIGlmICh1c2VfdmFsdWUgIT0gdC0+Z2xvYmFsLnNldHRpbmdzW0dSUENfTE9DQUxfU0VUVElOR1NdW2lkXSkgewotICAgIHQtPmdsb2JhbC5zZXR0aW5nc1tHUlBDX0xPQ0FMX1NFVFRJTkdTXVtpZF0gPSB1c2VfdmFsdWU7Ci0gICAgdC0+Z2xvYmFsLmRpcnRpZWRfbG9jYWxfc2V0dGluZ3MgPSAxOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfdGVybWluYXRlX3dyaXRpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRyYW5zcG9ydF93cml0aW5nX3B0ciwgYm9vbCBzdWNjZXNzKSB7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydF93cml0aW5nICp0cmFuc3BvcnRfd3JpdGluZyA9IHRyYW5zcG9ydF93cml0aW5nX3B0cjsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gVFJBTlNQT1JUX0ZST01fV1JJVElORyh0cmFuc3BvcnRfd3JpdGluZyk7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX2NodHRwMl90ZXJtaW5hdGVfd3JpdGluZyIsIDApOwotCi0gIGxvY2sodCk7Ci0KLSAgYWxsb3dfZW5kcG9pbnRfc2h1dGRvd25fbG9ja2VkKGV4ZWNfY3R4LCB0KTsKLQotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBkcm9wX2Nvbm5lY3Rpb24oZXhlY19jdHgsIHQpOwotICB9Ci0KLSAgZ3JwY19jaHR0cDJfY2xlYW51cF93cml0aW5nKGV4ZWNfY3R4LCAmdC0+Z2xvYmFsLCAmdC0+d3JpdGluZyk7Ci0KLSAgd2hpbGUgKGdycGNfY2h0dHAyX2xpc3RfcG9wX2Nsb3NlZF93YWl0aW5nX2Zvcl93cml0aW5nKCZ0LT5nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbCkpIHsKLSAgICBmYWlsX3BlbmRpbmdfd3JpdGVzKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsKTsKLSAgICBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsICJmaW5pc2hfd3JpdGVzIik7Ci0gIH0KLQotICAvKiBsZWF2ZSB0aGUgd3JpdGluZyBmbGFnIHVwIG9uIHNodXRkb3duIHRvIHByZXZlbnQgZnVydGhlciB3cml0ZXMgaW4gdW5sb2NrKCkKLSAgICAgZnJvbSBzdGFydGluZyAqLwotICB0LT53cml0aW5nX2FjdGl2ZSA9IDA7Ci0gIGlmICh0LT5lcCAmJiAhdC0+ZW5kcG9pbnRfcmVhZGluZykgewotICAgIGRlc3Ryb3lfZW5kcG9pbnQoZXhlY19jdHgsIHQpOwotICB9Ci0KLSAgdW5sb2NrKGV4ZWNfY3R4LCB0KTsKLQotICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJ3cml0aW5nIik7Ci0KLSAgR1BSX1RJTUVSX0VORCgiZ3JwY19jaHR0cDJfdGVybWluYXRlX3dyaXRpbmciLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGluZ19hY3Rpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIHZvaWQgKmd0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpb21ncl9zdWNjZXNzX2lnbm9yZWQpIHsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gZ3Q7Ci0gIEdQUl9USU1FUl9CRUdJTigid3JpdGluZ19hY3Rpb24iLCAwKTsKLSAgZ3JwY19jaHR0cDJfcGVyZm9ybV93cml0ZXMoZXhlY19jdHgsICZ0LT53cml0aW5nLCB0LT5lcCk7Ci0gIEdQUl9USU1FUl9FTkQoIndyaXRpbmdfYWN0aW9uIiwgMCk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfYWRkX2luY29taW5nX2dvYXdheSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICB1aW50MzJfdCBnb2F3YXlfZXJyb3IsIGdwcl9zbGljZSBnb2F3YXlfdGV4dCkgewotICBjaGFyICptc2cgPSBncHJfZHVtcF9zbGljZShnb2F3YXlfdGV4dCwgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpOwotICBncHJfbG9nKEdQUl9ERUJVRywgImdvdCBnb2F3YXkgWyVkXTogJXMiLCBnb2F3YXlfZXJyb3IsIG1zZyk7Ci0gIGdwcl9mcmVlKG1zZyk7Ci0gIGdwcl9zbGljZV91bnJlZihnb2F3YXlfdGV4dCk7Ci0gIHRyYW5zcG9ydF9nbG9iYWwtPnNlZW5fZ29hd2F5ID0gMTsKLSAgY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImdvdF9nb2F3YXkiKTsKLX0KLQotc3RhdGljIHZvaWQgbWF5YmVfc3RhcnRfc29tZV9zdHJlYW1zKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsKSB7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7Ci0gIHVpbnQzMl90IHN0cmVhbV9pbmNvbWluZ193aW5kb3c7Ci0gIC8qIHN0YXJ0IHN0cmVhbXMgd2hlcmUgd2UgaGF2ZSBmcmVlIGdycGNfY2h0dHAyX3N0cmVhbSBpZHMgYW5kIGZyZWUKLSAgICogY29uY3VycmVuY3kgKi8KLSAgd2hpbGUgKHRyYW5zcG9ydF9nbG9iYWwtPm5leHRfc3RyZWFtX2lkIDw9IE1BWF9DTElFTlRfU1RSRUFNX0lEICYmCi0gICAgICAgICB0cmFuc3BvcnRfZ2xvYmFsLT5jb25jdXJyZW50X3N0cmVhbV9jb3VudCA8Ci0gICAgICAgICAgICAgdHJhbnNwb3J0X2dsb2JhbAotICAgICAgICAgICAgICAgICAtPnNldHRpbmdzW0dSUENfUEVFUl9TRVRUSU5HU10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHUlBDX0NIVFRQMl9TRVRUSU5HU19NQVhfQ09OQ1VSUkVOVF9TVFJFQU1TXSAmJgotICAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9wb3Bfd2FpdGluZ19mb3JfY29uY3VycmVuY3kodHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1fZ2xvYmFsKSkgewotICAgIC8qIHNhZmUgc2luY2Ugd2UgY2FuJ3QgKGxlZ2FsbHkpIGJlIHBhcnNpbmcgdGhpcyBzdHJlYW0geWV0ICovCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX3BhcnNpbmcgKnN0cmVhbV9wYXJzaW5nID0KLSAgICAgICAgJlNUUkVBTV9GUk9NX0dMT0JBTChzdHJlYW1fZ2xvYmFsKS0+cGFyc2luZzsKLSAgICBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKGdwcl9sb2coCi0gICAgICAgIEdQUl9ERUJVRywgIkhUVFA6JXM6IEFsbG9jYXRpbmcgbmV3IGdycGNfY2h0dHAyX3N0cmVhbSAlcCB0byBpZCAlZCIsCi0gICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPmlzX2NsaWVudCA/ICJDTEkiIDogIlNWUiIsIHN0cmVhbV9nbG9iYWwsCi0gICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPm5leHRfc3RyZWFtX2lkKSk7Ci0KLSAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPmlkID09IDApOwotICAgIHN0cmVhbV9nbG9iYWwtPmlkID0gc3RyZWFtX3BhcnNpbmctPmlkID0gdHJhbnNwb3J0X2dsb2JhbC0+bmV4dF9zdHJlYW1faWQ7Ci0gICAgdHJhbnNwb3J0X2dsb2JhbC0+bmV4dF9zdHJlYW1faWQgKz0gMjsKLQotICAgIGlmICh0cmFuc3BvcnRfZ2xvYmFsLT5uZXh0X3N0cmVhbV9pZCA+PSBNQVhfQ0xJRU5UX1NUUkVBTV9JRCkgewotICAgICAgY29ubmVjdGl2aXR5X3N0YXRlX3NldChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JQQ19DSEFOTkVMX1RSQU5TSUVOVF9GQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9fbW9yZV9zdHJlYW1faWRzIik7Ci0gICAgfQotCi0gICAgc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93ID0KLSAgICAgICAgdHJhbnNwb3J0X2dsb2JhbC0+c2V0dGluZ3NbR1JQQ19QRUVSX1NFVFRJTkdTXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtHUlBDX0NIVFRQMl9TRVRUSU5HU19JTklUSUFMX1dJTkRPV19TSVpFXTsKLSAgICBzdHJlYW1fcGFyc2luZy0+aW5jb21pbmdfd2luZG93ID0gc3RyZWFtX2luY29taW5nX3dpbmRvdyA9Ci0gICAgICAgIHRyYW5zcG9ydF9nbG9iYWwtPnNldHRpbmdzW0dSUENfU0VOVF9TRVRUSU5HU10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbR1JQQ19DSFRUUDJfU0VUVElOR1NfSU5JVElBTF9XSU5ET1dfU0laRV07Ci0gICAgc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXMgPQotICAgICAgICBHUFJfTUFYKHN0cmVhbV9pbmNvbWluZ193aW5kb3csIHN0cmVhbV9nbG9iYWwtPm1heF9yZWN2X2J5dGVzKTsKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX2FkZCgKLSAgICAgICAgJlRSQU5TUE9SVF9GUk9NX0dMT0JBTCh0cmFuc3BvcnRfZ2xvYmFsKS0+bmV3X3N0cmVhbV9tYXAsCi0gICAgICAgIHN0cmVhbV9nbG9iYWwtPmlkLCBTVFJFQU1fRlJPTV9HTE9CQUwoc3RyZWFtX2dsb2JhbCkpOwotICAgIHN0cmVhbV9nbG9iYWwtPmluX3N0cmVhbV9tYXAgPSAxOwotICAgIHRyYW5zcG9ydF9nbG9iYWwtPmNvbmN1cnJlbnRfc3RyZWFtX2NvdW50Kys7Ci0gICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOwotICB9Ci0gIC8qIGNhbmNlbCBvdXQgc3RyZWFtcyB0aGF0IHdpbGwgbmV2ZXIgYmUgc3RhcnRlZCAqLwotICB3aGlsZSAodHJhbnNwb3J0X2dsb2JhbC0+bmV4dF9zdHJlYW1faWQgPj0gTUFYX0NMSUVOVF9TVFJFQU1fSUQgJiYKLSAgICAgICAgIGdycGNfY2h0dHAyX2xpc3RfcG9wX3dhaXRpbmdfZm9yX2NvbmN1cnJlbmN5KHRyYW5zcG9ydF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbCkpIHsKLSAgICBjYW5jZWxfZnJvbV9hcGkoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgIEdSUENfU1RBVFVTX1VOQVZBSUxBQkxFKTsKLSAgfQotfQotCi1zdGF0aWMgZ3JwY19jbG9zdXJlICphZGRfY2xvc3VyZV9iYXJyaWVyKGdycGNfY2xvc3VyZSAqY2xvc3VyZSkgewotICBjbG9zdXJlLT5maW5hbF9kYXRhICs9IDI7Ci0gIHJldHVybiBjbG9zdXJlOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2xvc3VyZSAqKnBjbG9zdXJlLCBpbnQgc3VjY2VzcykgewotICBncnBjX2Nsb3N1cmUgKmNsb3N1cmUgPSAqcGNsb3N1cmU7Ci0gIGlmIChjbG9zdXJlID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgY2xvc3VyZS0+ZmluYWxfZGF0YSAtPSAyOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBjbG9zdXJlLT5maW5hbF9kYXRhIHw9IDE7Ci0gIH0KLSAgaWYgKGNsb3N1cmUtPmZpbmFsX2RhdGEgPCAyKSB7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBjbG9zdXJlLCBjbG9zdXJlLT5maW5hbF9kYXRhID09IDAsIE5VTEwpOwotICB9Ci0gICpwY2xvc3VyZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgY29udGFpbnNfbm9uX29rX3N0YXR1cygKLSAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKSB7Ci0gIGdycGNfbGlua2VkX21kZWxlbSAqbDsKLSAgZm9yIChsID0gYmF0Y2gtPmxpc3QuaGVhZDsgbDsgbCA9IGwtPm5leHQpIHsKLSAgICBpZiAobC0+bWQtPmtleSA9PSBHUlBDX01EU1RSX0dSUENfU1RBVFVTICYmCi0gICAgICAgIGwtPm1kICE9IEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzApIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZG9fbm90aGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqYXJnLCBib29sIHN1Y2Nlc3MpIHt9Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1fc3RyZWFtX29wX2xvY2tlZCgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIGdycGNfY2xvc3VyZSAqb25fY29tcGxldGU7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJwZXJmb3JtX3N0cmVhbV9vcF9sb2NrZWQiLCAwKTsKLQotICBvbl9jb21wbGV0ZSA9IG9wLT5vbl9jb21wbGV0ZTsKLSAgaWYgKG9uX2NvbXBsZXRlID09IE5VTEwpIHsKLSAgICBvbl9jb21wbGV0ZSA9IGdycGNfY2xvc3VyZV9jcmVhdGUoZG9fbm90aGluZywgTlVMTCk7Ci0gIH0KLSAgLyogdXNlIGZpbmFsX2RhdGEgYXMgYSBiYXJyaWVyIHVudGlsIGVucXVldWUgdGltZTsgdGhlIGluaXRhbCBjb3VudGVyIGlzCi0gICAgIGRyb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uICovCi0gIG9uX2NvbXBsZXRlLT5maW5hbF9kYXRhID0gMjsKLQotICBpZiAob3AtPmNhbmNlbF93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgewotICAgIGNhbmNlbF9mcm9tX2FwaShleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgb3AtPmNhbmNlbF93aXRoX3N0YXR1cyk7Ci0gIH0KLQotICBpZiAob3AtPmNsb3NlX3dpdGhfc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7Ci0gICAgY2xvc2VfZnJvbV9hcGkoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgb3AtPmNsb3NlX3dpdGhfc3RhdHVzLCBvcC0+b3B0aW9uYWxfY2xvc2VfbWVzc2FnZSk7Ci0gIH0KLQotICBpZiAob3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5zZW5kX2luaXRpYWxfbWV0YWRhdGFfZmluaXNoZWQgPT0gTlVMTCk7Ci0gICAgc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhX2ZpbmlzaGVkID0KLSAgICAgICAgYWRkX2Nsb3N1cmVfYmFycmllcihvbl9jb21wbGV0ZSk7Ci0gICAgc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhID0gb3AtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBpZiAoY29udGFpbnNfbm9uX29rX3N0YXR1cyh0cmFuc3BvcnRfZ2xvYmFsLCBvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKSkgewotICAgICAgc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciA9IDE7Ci0gICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKLSAgICAgIGlmICh0cmFuc3BvcnRfZ2xvYmFsLT5pc19jbGllbnQpIHsKLSAgICAgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5pZCA9PSAwKTsKLSAgICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfd2FpdGluZ19mb3JfY29uY3VycmVuY3kodHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbCk7Ci0gICAgICAgIG1heWJlX3N0YXJ0X3NvbWVfc3RyZWFtcyhleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPmlkICE9IDApOwotICAgICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKLSAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfaW5pdGlhbF9tZXRhZGF0YV9maW5pc2hlZCwgMCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9wLT5zZW5kX21lc3NhZ2UgIT0gTlVMTCkgewotICAgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlX2ZpbmlzaGVkID09IE5VTEwpOwotICAgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+c2VuZF9tZXNzYWdlID09IE5VTEwpOwotICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCA9IGFkZF9jbG9zdXJlX2JhcnJpZXIob25fY29tcGxldGUpOwotICAgIGlmIChzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKLSAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKLSAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZSA9IG9wLT5zZW5kX21lc3NhZ2U7Ci0gICAgICBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgewotICAgICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9wLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQgPT0gTlVMTCk7Ci0gICAgc3RyZWFtX2dsb2JhbC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCA9Ci0gICAgICAgIGFkZF9jbG9zdXJlX2JhcnJpZXIob25fY29tcGxldGUpOwotICAgIHN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEgPSBvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YTsKLSAgICBpZiAoY29udGFpbnNfbm9uX29rX3N0YXR1cyh0cmFuc3BvcnRfZ2xvYmFsLCBvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSkpIHsKLSAgICAgIHN0cmVhbV9nbG9iYWwtPnNlZW5fZXJyb3IgPSAxOwotICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gICAgfQotICAgIGlmIChzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKLSAgICAgIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKLSAgICAgICAgICBleGVjX2N0eCwgJnN0cmVhbV9nbG9iYWwtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQsCi0gICAgICAgICAgZ3JwY19tZXRhZGF0YV9iYXRjaF9pc19lbXB0eShvcC0+c2VuZF90cmFpbGluZ19tZXRhZGF0YSkpOwotICAgIH0gZWxzZSBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgewotICAgICAgLyogVE9ETyhjdGlsbGVyKTogY2hlY2sgaWYgdGhlcmUncyBmbG93IGNvbnRyb2wgZm9yIGFueSBvdXRzdGFuZGluZwotICAgICAgICAgYnl0ZXMgYmVmb3JlIGdvaW5nIHdyaXRhYmxlICovCi0gICAgICBncnBjX2NodHRwMl9iZWNvbWVfd3JpdGFibGUodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgewotICAgIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5ID09IE5VTEwpOwotICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9Ci0gICAgICAgIG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7Ci0gICAgc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhID0gb3AtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YTsKLSAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgfQotCi0gIGlmIChvcC0+cmVjdl9tZXNzYWdlICE9IE5VTEwpIHsKLSAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZV9yZWFkeSA9PSBOVUxMKTsKLSAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2VfcmVhZHkgPSBvcC0+cmVjdl9tZXNzYWdlX3JlYWR5OwotICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZSA9IG9wLT5yZWN2X21lc3NhZ2U7Ci0gICAgaWYgKHN0cmVhbV9nbG9iYWwtPmlkICE9IDAgJiYKLSAgICAgICAgKHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy5oZWFkID09IE5VTEwgfHwKLSAgICAgICAgIHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy5oZWFkLT5pc190YWlsKSkgewotICAgICAgaW5jb21pbmdfYnl0ZV9zdHJlYW1fdXBkYXRlX2Zsb3dfY29udHJvbCgKLSAgICAgICAgICB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLCB0cmFuc3BvcnRfZ2xvYmFsLT5zdHJlYW1fbG9va2FoZWFkLAotICAgICAgICAgIDApOwotICAgIH0KLSAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgfQotCi0gIGlmIChvcC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkID09IE5VTEwpOwotICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGFfZmluaXNoZWQgPQotICAgICAgICBhZGRfY2xvc3VyZV9iYXJyaWVyKG9uX2NvbXBsZXRlKTsKLSAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhID0gb3AtPnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGE7Ci0gICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gIH0KLQotICBncnBjX2NodHRwMl9jb21wbGV0ZV9jbG9zdXJlX3N0ZXAoZXhlY19jdHgsICZvbl9jb21wbGV0ZSwgMSk7Ci0KLSAgR1BSX1RJTUVSX0VORCgicGVyZm9ybV9zdHJlYW1fb3BfbG9ja2VkIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1fc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqZ3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqZ3MsIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OwotICBncnBjX2NodHRwMl9zdHJlYW0gKnMgPSAoZ3JwY19jaHR0cDJfc3RyZWFtICopZ3M7Ci0KLSAgbG9jayh0KTsKLSAgcGVyZm9ybV9zdHJlYW1fb3BfbG9ja2VkKGV4ZWNfY3R4LCAmdC0+Z2xvYmFsLCAmcy0+Z2xvYmFsLCBvcCk7Ci0gIHVubG9jayhleGVjX2N0eCwgdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfcGluZ19sb2NrZWQoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LCBncnBjX2Nsb3N1cmUgKm9uX3JlY3YpIHsKLSAgZ3JwY19jaHR0cDJfb3V0c3RhbmRpbmdfcGluZyAqcCA9IGdwcl9tYWxsb2Moc2l6ZW9mKCpwKSk7Ci0gIHAtPm5leHQgPSAmdC0+Z2xvYmFsLnBpbmdzOwotICBwLT5wcmV2ID0gcC0+bmV4dC0+cHJldjsKLSAgcC0+cHJldi0+bmV4dCA9IHAtPm5leHQtPnByZXYgPSBwOwotICBwLT5pZFswXSA9ICh1aW50OF90KSgodC0+Z2xvYmFsLnBpbmdfY291bnRlciA+PiA1NikgJiAweGZmKTsKLSAgcC0+aWRbMV0gPSAodWludDhfdCkoKHQtPmdsb2JhbC5waW5nX2NvdW50ZXIgPj4gNDgpICYgMHhmZik7Ci0gIHAtPmlkWzJdID0gKHVpbnQ4X3QpKCh0LT5nbG9iYWwucGluZ19jb3VudGVyID4+IDQwKSAmIDB4ZmYpOwotICBwLT5pZFszXSA9ICh1aW50OF90KSgodC0+Z2xvYmFsLnBpbmdfY291bnRlciA+PiAzMikgJiAweGZmKTsKLSAgcC0+aWRbNF0gPSAodWludDhfdCkoKHQtPmdsb2JhbC5waW5nX2NvdW50ZXIgPj4gMjQpICYgMHhmZik7Ci0gIHAtPmlkWzVdID0gKHVpbnQ4X3QpKCh0LT5nbG9iYWwucGluZ19jb3VudGVyID4+IDE2KSAmIDB4ZmYpOwotICBwLT5pZFs2XSA9ICh1aW50OF90KSgodC0+Z2xvYmFsLnBpbmdfY291bnRlciA+PiA4KSAmIDB4ZmYpOwotICBwLT5pZFs3XSA9ICh1aW50OF90KSh0LT5nbG9iYWwucGluZ19jb3VudGVyICYgMHhmZik7Ci0gIHAtPm9uX3JlY3YgPSBvbl9yZWN2OwotICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmdC0+Z2xvYmFsLnFidWYsIGdycGNfY2h0dHAyX3BpbmdfY3JlYXRlKDAsIHAtPmlkKSk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfYWNrX3BpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9wYXJzaW5nICp0cmFuc3BvcnRfcGFyc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqb3BhcXVlXzhieXRlcykgewotICBncnBjX2NodHRwMl9vdXRzdGFuZGluZ19waW5nICpwaW5nOwotICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQgPSBUUkFOU1BPUlRfRlJPTV9QQVJTSU5HKHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCA9ICZ0LT5nbG9iYWw7Ci0gIGxvY2sodCk7Ci0gIGZvciAocGluZyA9IHRyYW5zcG9ydF9nbG9iYWwtPnBpbmdzLm5leHQ7IHBpbmcgIT0gJnRyYW5zcG9ydF9nbG9iYWwtPnBpbmdzOwotICAgICAgIHBpbmcgPSBwaW5nLT5uZXh0KSB7Ci0gICAgaWYgKDAgPT0gbWVtY21wKG9wYXF1ZV84Ynl0ZXMsIHBpbmctPmlkLCA4KSkgewotICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBwaW5nLT5vbl9yZWN2LCB0cnVlLCBOVUxMKTsKLSAgICAgIHBpbmctPm5leHQtPnByZXYgPSBwaW5nLT5wcmV2OwotICAgICAgcGluZy0+cHJldi0+bmV4dCA9IHBpbmctPm5leHQ7Ci0gICAgICBncHJfZnJlZShwaW5nKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICB1bmxvY2soZXhlY19jdHgsIHQpOwotfQotCi1zdGF0aWMgdm9pZCBwZXJmb3JtX3RyYW5zcG9ydF9vcF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCkgewotICBib29sIGNsb3NlX3RyYW5zcG9ydCA9IGZhbHNlOwotCi0gIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb3AtPm9uX2NvbnN1bWVkLCB0cnVlLCBOVUxMKTsKLQotICBpZiAob3AtPm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2UgIT0gTlVMTCkgewotICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25vdGlmeV9vbl9zdGF0ZV9jaGFuZ2UoCi0gICAgICAgIGV4ZWNfY3R4LCAmdC0+Y2hhbm5lbF9jYWxsYmFjay5zdGF0ZV90cmFja2VyLCBvcC0+Y29ubmVjdGl2aXR5X3N0YXRlLAotICAgICAgICBvcC0+b25fY29ubmVjdGl2aXR5X3N0YXRlX2NoYW5nZSk7Ci0gIH0KLQotICBpZiAob3AtPnNlbmRfZ29hd2F5KSB7Ci0gICAgdC0+Z2xvYmFsLnNlbnRfZ29hd2F5ID0gMTsKLSAgICBncnBjX2NodHRwMl9nb2F3YXlfYXBwZW5kKAotICAgICAgICB0LT5nbG9iYWwubGFzdF9pbmNvbWluZ19zdHJlYW1faWQsCi0gICAgICAgICh1aW50MzJfdClncnBjX2NodHRwMl9ncnBjX3N0YXR1c190b19odHRwMl9lcnJvcihvcC0+Z29hd2F5X3N0YXR1cyksCi0gICAgICAgIGdwcl9zbGljZV9yZWYoKm9wLT5nb2F3YXlfbWVzc2FnZSksICZ0LT5nbG9iYWwucWJ1Zik7Ci0gICAgY2xvc2VfdHJhbnNwb3J0ID0gIWdycGNfY2h0dHAyX2hhc19zdHJlYW1zKHQpOwotICB9Ci0KLSAgaWYgKG9wLT5zZXRfYWNjZXB0X3N0cmVhbSkgewotICAgIHQtPmNoYW5uZWxfY2FsbGJhY2suYWNjZXB0X3N0cmVhbSA9IG9wLT5zZXRfYWNjZXB0X3N0cmVhbV9mbjsKLSAgICB0LT5jaGFubmVsX2NhbGxiYWNrLmFjY2VwdF9zdHJlYW1fdXNlcl9kYXRhID0KLSAgICAgICAgb3AtPnNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YTsKLSAgfQotCi0gIGlmIChvcC0+YmluZF9wb2xsc2V0KSB7Ci0gICAgYWRkX3RvX3BvbGxzZXRfbG9ja2VkKGV4ZWNfY3R4LCB0LCBvcC0+YmluZF9wb2xsc2V0KTsKLSAgfQotCi0gIGlmIChvcC0+YmluZF9wb2xsc2V0X3NldCkgewotICAgIGFkZF90b19wb2xsc2V0X3NldF9sb2NrZWQoZXhlY19jdHgsIHQsIG9wLT5iaW5kX3BvbGxzZXRfc2V0KTsKLSAgfQotCi0gIGlmIChvcC0+c2VuZF9waW5nKSB7Ci0gICAgc2VuZF9waW5nX2xvY2tlZCh0LCBvcC0+c2VuZF9waW5nKTsKLSAgfQotCi0gIGlmIChvcC0+ZGlzY29ubmVjdCkgewotICAgIGNsb3NlX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIHQpOwotICB9Ci0KLSAgaWYgKGNsb3NlX3RyYW5zcG9ydCkgewotICAgIGNsb3NlX3RyYW5zcG9ydF9sb2NrZWQoZXhlY19jdHgsIHQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1fdHJhbnNwb3J0X29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqZ3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3ApIHsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OwotCi0gIGxvY2sodCk7Ci0KLSAgLyogSWYgdGhlcmUncyBhIHNldF9hY2NlcHRfc3RyZWFtIGVuc3VyZSB0aGF0IHdlJ3JlIG5vdCBwYXJzaW5nCi0gICAgIHRvIGF2b2lkIGNoYW5naW5nIHRoaW5ncyBvdXQgZnJvbSB1bmRlcm5lYXRoICovCi0gIGlmICh0LT5wYXJzaW5nX2FjdGl2ZSAmJiBvcC0+c2V0X2FjY2VwdF9zdHJlYW0pIHsKLSAgICBHUFJfQVNTRVJUKHQtPnBvc3RfcGFyc2luZ19vcCA9PSBOVUxMKTsKLSAgICB0LT5wb3N0X3BhcnNpbmdfb3AgPSBncHJfbWFsbG9jKHNpemVvZigqb3ApKTsKLSAgICBtZW1jcHkodC0+cG9zdF9wYXJzaW5nX29wLCBvcCwgc2l6ZW9mKCpvcCkpOwotICB9IGVsc2UgewotICAgIHBlcmZvcm1fdHJhbnNwb3J0X29wX2xvY2tlZChleGVjX2N0eCwgdCwgb3ApOwotICB9Ci0KLSAgdW5sb2NrKGV4ZWNfY3R4LCB0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElOUFVUIFBST0NFU1NJTkcKLSAqLwotCi1zdGF0aWMgdm9pZCBjaGVja19yZWFkX29wcyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwpIHsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbDsKLSAgZ3JwY19ieXRlX3N0cmVhbSAqYnM7Ci0gIHdoaWxlICgKLSAgICAgIGdycGNfY2h0dHAyX2xpc3RfcG9wX2NoZWNrX3JlYWRfb3BzKHRyYW5zcG9ydF9nbG9iYWwsICZzdHJlYW1fZ2xvYmFsKSkgewotICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHkgIT0gTlVMTCAmJgotICAgICAgICBzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfaW5pdGlhbF9tZXRhZGF0YSkgewotICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3B1Ymxpc2goCi0gICAgICAgICAgJnN0cmVhbV9nbG9iYWwtPnJlY2VpdmVkX2luaXRpYWxfbWV0YWRhdGEsCi0gICAgICAgICAgc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhKTsKLSAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZSgKLSAgICAgICAgICBleGVjX2N0eCwgc3RyZWFtX2dsb2JhbC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5LCB0cnVlLCBOVUxMKTsKLSAgICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfaW5pdGlhbF9tZXRhZGF0YV9yZWFkeSA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2VfcmVhZHkgIT0gTlVMTCkgewotICAgICAgd2hpbGUgKHN0cmVhbV9nbG9iYWwtPnNlZW5fZXJyb3IgJiYKLSAgICAgICAgICAgICAoYnMgPSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9wb3AoCi0gICAgICAgICAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzKSkgIT0gTlVMTCkgewotICAgICAgICBncnBjX2J5dGVfc3RyZWFtX2Rlc3Ryb3koZXhlY19jdHgsIGJzKTsKLSAgICAgIH0KLSAgICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMuaGVhZCAhPSBOVUxMKSB7Ci0gICAgICAgICpzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2UgPSBncnBjX2NodHRwMl9pbmNvbWluZ19mcmFtZV9xdWV1ZV9wb3AoCi0gICAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+aW5jb21pbmdfZnJhbWVzKTsKLSAgICAgICAgR1BSX0FTU0VSVCgqc3RyZWFtX2dsb2JhbC0+cmVjdl9tZXNzYWdlICE9IE5VTEwpOwotICAgICAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZV9yZWFkeSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X21lc3NhZ2VfcmVhZHkgPSBOVUxMOwotICAgICAgfSBlbHNlIGlmIChzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfdHJhaWxpbmdfbWV0YWRhdGEpIHsKLSAgICAgICAgKnN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZSA9IE5VTEw7Ci0gICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgc3RyZWFtX2dsb2JhbC0+cmVjdl9tZXNzYWdlX3JlYWR5LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIHN0cmVhbV9nbG9iYWwtPnJlY3ZfbWVzc2FnZV9yZWFkeSA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkICE9IE5VTEwgJiYKLSAgICAgICAgc3RyZWFtX2dsb2JhbC0+cmVhZF9jbG9zZWQgJiYgc3RyZWFtX2dsb2JhbC0+d3JpdGVfY2xvc2VkKSB7Ci0gICAgICB3aGlsZSAoc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciAmJgotICAgICAgICAgICAgIChicyA9IGdycGNfY2h0dHAyX2luY29taW5nX2ZyYW1lX3F1ZXVlX3BvcCgKLSAgICAgICAgICAgICAgICAgICZzdHJlYW1fZ2xvYmFsLT5pbmNvbWluZ19mcmFtZXMpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGdycGNfYnl0ZV9zdHJlYW1fZGVzdHJveShleGVjX2N0eCwgYnMpOwotICAgICAgfQotICAgICAgaWYgKHN0cmVhbV9nbG9iYWwtPmluY29taW5nX2ZyYW1lcy5oZWFkID09IE5VTEwpIHsKLSAgICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX3B1Ymxpc2goCi0gICAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+cmVjZWl2ZWRfdHJhaWxpbmdfbWV0YWRhdGEsCi0gICAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhKTsKLSAgICAgICAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKAotICAgICAgICAgICAgZXhlY19jdHgsICZzdHJlYW1fZ2xvYmFsLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkLCAxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX3N0cmVhbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCkgewotICBzaXplX3QgbmV3X3N0cmVhbV9jb3VudDsKLSAgZ3JwY19jaHR0cDJfc3RyZWFtICpzID0KLSAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVsZXRlKCZ0LT5wYXJzaW5nX3N0cmVhbV9tYXAsIGlkKTsKLSAgaWYgKCFzKSB7Ci0gICAgcyA9IGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfZGVsZXRlKCZ0LT5uZXdfc3RyZWFtX21hcCwgaWQpOwotICB9Ci0gIEdQUl9BU1NFUlQocyk7Ci0gIHMtPmdsb2JhbC5pbl9zdHJlYW1fbWFwID0gMDsKLSAgaWYgKHQtPnBhcnNpbmcuaW5jb21pbmdfc3RyZWFtID09ICZzLT5wYXJzaW5nKSB7Ci0gICAgdC0+cGFyc2luZy5pbmNvbWluZ19zdHJlYW0gPSBOVUxMOwotICAgIGdycGNfY2h0dHAyX3BhcnNpbmdfYmVjb21lX3NraXBfcGFyc2VyKGV4ZWNfY3R4LCAmdC0+cGFyc2luZyk7Ci0gIH0KLSAgaWYgKHMtPnBhcnNpbmcuZGF0YV9wYXJzZXIucGFyc2luZ19mcmFtZSAhPSBOVUxMKSB7Ci0gICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fZmluaXNoZWQoCi0gICAgICAgIGV4ZWNfY3R4LCBzLT5wYXJzaW5nLmRhdGFfcGFyc2VyLnBhcnNpbmdfZnJhbWUsIDAsIDApOwotICAgIHMtPnBhcnNpbmcuZGF0YV9wYXJzZXIucGFyc2luZ19mcmFtZSA9IE5VTEw7Ci0gIH0KLQotICBpZiAoZ3JwY19jaHR0cDJfdW5yZWdpc3Rlcl9zdHJlYW0odCwgcykgJiYgdC0+Z2xvYmFsLnNlbnRfZ29hd2F5KSB7Ci0gICAgY2xvc2VfdHJhbnNwb3J0X2xvY2tlZChleGVjX2N0eCwgdCk7Ci0gIH0KLSAgaWYgKGdycGNfY2h0dHAyX2xpc3RfcmVtb3ZlX3dyaXRhYmxlX3N0cmVhbSgmdC0+Z2xvYmFsLCAmcy0+Z2xvYmFsKSkgewotICAgIEdSUENfQ0hUVFAyX1NUUkVBTV9VTlJFRihleGVjX2N0eCwgJnMtPmdsb2JhbCwgImNodHRwMl93cml0aW5nIik7Ci0gIH0KLQotICBuZXdfc3RyZWFtX2NvdW50ID0gZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9zaXplKCZ0LT5wYXJzaW5nX3N0cmVhbV9tYXApICsKLSAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfc2l6ZSgmdC0+bmV3X3N0cmVhbV9tYXApOwotICBHUFJfQVNTRVJUKG5ld19zdHJlYW1fY291bnQgPD0gVUlOVDMyX01BWCk7Ci0gIGlmIChuZXdfc3RyZWFtX2NvdW50ICE9IHQtPmdsb2JhbC5jb25jdXJyZW50X3N0cmVhbV9jb3VudCkgewotICAgIHQtPmdsb2JhbC5jb25jdXJyZW50X3N0cmVhbV9jb3VudCA9ICh1aW50MzJfdCluZXdfc3RyZWFtX2NvdW50OwotICAgIG1heWJlX3N0YXJ0X3NvbWVfc3RyZWFtcyhleGVjX2N0eCwgJnQtPmdsb2JhbCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY2FuY2VsX2Zyb21fYXBpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cykgewotICBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKAotICAgICAgICAmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwKLSAgICAgICAgZ3JwY19jaHR0cDJfcnN0X3N0cmVhbV9jcmVhdGUoCi0gICAgICAgICAgICBzdHJlYW1fZ2xvYmFsLT5pZCwKLSAgICAgICAgICAgICh1aW50MzJfdClncnBjX2NodHRwMl9ncnBjX3N0YXR1c190b19odHRwMl9lcnJvcihzdGF0dXMpKSk7Ci0gIH0KLSAgZ3JwY19jaHR0cDJfZmFrZV9zdGF0dXMoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2Zha2Vfc3RhdHVzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywgZ3ByX3NsaWNlICpzbGljZSkgewotICBpZiAoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKSB7Ci0gICAgc3RyZWFtX2dsb2JhbC0+c2Vlbl9lcnJvciA9IDE7Ci0gICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2hlY2tfcmVhZF9vcHModHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCk7Ci0gIH0KLSAgLyogc3RyZWFtX2dsb2JhbC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCBnaXZlcyB1cyBhCi0gICAgIGxhc3QgY2hhbmNlIHJlcGxhY2VtZW50OiB3ZSd2ZSByZWNlaXZlZCB0cmFpbGluZyBtZXRhZGF0YSwKLSAgICAgYnV0IHNvbWV0aGluZyBtb3JlIGltcG9ydGFudCBoYXMgYmVjb21lIGF2YWlsYWJsZSB0byBzaWduYWwKLSAgICAgdG8gdGhlIHVwcGVyIGxheWVycyAtIGRyb3Agd2hhdCB3ZSd2ZSBnb3QsIGFuZCB0aGVuIHB1Ymxpc2gKLSAgICAgd2hhdCB3ZSB3YW50IC0gd2hpY2ggaXMgc2FmZSBiZWNhdXNlIHdlIGhhdmVuJ3QgdG9sZCBhbnlvbmUKLSAgICAgYWJvdXQgdGhlIG1ldGFkYXRhIHlldCAqLwotICBpZiAoIXN0cmVhbV9nbG9iYWwtPnB1Ymxpc2hlZF90cmFpbGluZ19tZXRhZGF0YSB8fAotICAgICAgc3RyZWFtX2dsb2JhbC0+cmVjdl90cmFpbGluZ19tZXRhZGF0YV9maW5pc2hlZCAhPSBOVUxMKSB7Ci0gICAgY2hhciBzdGF0dXNfc3RyaW5nW0dQUl9MVE9BX01JTl9CVUZTSVpFXTsKLSAgICBncHJfbHRvYShzdGF0dXMsIHN0YXR1c19zdHJpbmcpOwotICAgIGdycGNfY2h0dHAyX2luY29taW5nX21ldGFkYXRhX2J1ZmZlcl9hZGQoCi0gICAgICAgICZzdHJlYW1fZ2xvYmFsLT5yZWNlaXZlZF90cmFpbGluZ19tZXRhZGF0YSwKLSAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKAotICAgICAgICAgICAgR1JQQ19NRFNUUl9HUlBDX1NUQVRVUywgZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhzdGF0dXNfc3RyaW5nKSkpOwotICAgIGlmIChzbGljZSkgewotICAgICAgZ3JwY19jaHR0cDJfaW5jb21pbmdfbWV0YWRhdGFfYnVmZmVyX2FkZCgKLSAgICAgICAgICAmc3RyZWFtX2dsb2JhbC0+cmVjZWl2ZWRfdHJhaWxpbmdfbWV0YWRhdGEsCi0gICAgICAgICAgZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKAotICAgICAgICAgICAgICBHUlBDX01EU1RSX0dSUENfTUVTU0FHRSwKLSAgICAgICAgICAgICAgZ3JwY19tZHN0cl9mcm9tX3NsaWNlKGdwcl9zbGljZV9yZWYoKnNsaWNlKSkpKTsKLSAgICB9Ci0gICAgc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhID0gMTsKLSAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgfQotICBpZiAoc2xpY2UpIHsKLSAgICBncHJfc2xpY2VfdW5yZWYoKnNsaWNlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBmYWlsX3BlbmRpbmdfd3JpdGVzKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9zdHJlYW1fZ2xvYmFsICpzdHJlYW1fZ2xvYmFsKSB7Ci0gIGdycGNfY2h0dHAyX2NvbXBsZXRlX2Nsb3N1cmVfc3RlcCgKLSAgICAgIGV4ZWNfY3R4LCAmc3RyZWFtX2dsb2JhbC0+c2VuZF9pbml0aWFsX21ldGFkYXRhX2ZpbmlzaGVkLCAwKTsKLSAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKAotICAgICAgZXhlY19jdHgsICZzdHJlYW1fZ2xvYmFsLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhX2ZpbmlzaGVkLCAwKTsKLSAgZ3JwY19jaHR0cDJfY29tcGxldGVfY2xvc3VyZV9zdGVwKGV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9nbG9iYWwtPnNlbmRfbWVzc2FnZV9maW5pc2hlZCwgMCk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfbWFya19zdHJlYW1fY2xvc2VkKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwsIGludCBjbG9zZV9yZWFkcywKLSAgICBpbnQgY2xvc2Vfd3JpdGVzKSB7Ci0gIGlmIChzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCAmJiBzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKLSAgICAvKiBhbHJlYWR5IGNsb3NlZCAqLwotICAgIHJldHVybjsKLSAgfQotICBncnBjX2NodHRwMl9saXN0X2FkZF9jaGVja19yZWFkX29wcyh0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsKTsKLSAgaWYgKGNsb3NlX3JlYWRzICYmICFzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCkgewotICAgIHN0cmVhbV9nbG9iYWwtPnJlYWRfY2xvc2VkID0gMTsKLSAgICBzdHJlYW1fZ2xvYmFsLT5wdWJsaXNoZWRfaW5pdGlhbF9tZXRhZGF0YSA9IDE7Ci0gICAgc3RyZWFtX2dsb2JhbC0+cHVibGlzaGVkX3RyYWlsaW5nX21ldGFkYXRhID0gMTsKLSAgfQotICBpZiAoY2xvc2Vfd3JpdGVzICYmICFzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpIHsKLSAgICBzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQgPSAxOwotICAgIGlmIChUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCktPndyaXRpbmdfYWN0aXZlKSB7Ci0gICAgICBHUlBDX0NIVFRQMl9TVFJFQU1fUkVGKHN0cmVhbV9nbG9iYWwsICJmaW5pc2hfd3JpdGVzIik7Ci0gICAgICBncnBjX2NodHRwMl9saXN0X2FkZF9jbG9zZWRfd2FpdGluZ19mb3Jfd3JpdGluZyh0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZhaWxfcGVuZGluZ193cml0ZXMoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwpOwotICAgIH0KLSAgfQotICBpZiAoc3RyZWFtX2dsb2JhbC0+cmVhZF9jbG9zZWQgJiYgc3RyZWFtX2dsb2JhbC0+d3JpdGVfY2xvc2VkKSB7Ci0gICAgaWYgKHN0cmVhbV9nbG9iYWwtPmlkICE9IDAgJiYKLSAgICAgICAgVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLT5wYXJzaW5nX2FjdGl2ZSkgewotICAgICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcodHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9nbG9iYWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCkgewotICAgICAgICByZW1vdmVfc3RyZWFtKGV4ZWNfY3R4LCBUUkFOU1BPUlRfRlJPTV9HTE9CQUwodHJhbnNwb3J0X2dsb2JhbCksCi0gICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbC0+aWQpOwotICAgICAgfQotICAgICAgR1JQQ19DSFRUUDJfU1RSRUFNX1VOUkVGKGV4ZWNfY3R4LCBzdHJlYW1fZ2xvYmFsLCAiY2h0dHAyIik7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlX2Zyb21fYXBpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqb3B0aW9uYWxfbWVzc2FnZSkgewotICBncHJfc2xpY2UgaGRyOwotICBncHJfc2xpY2Ugc3RhdHVzX2hkcjsKLSAgZ3ByX3NsaWNlIG1lc3NhZ2VfcGZ4OwotICB1aW50OF90ICpwOwotICB1aW50MzJfdCBsZW4gPSAwOwotCi0gIEdQUl9BU1NFUlQoc3RhdHVzID49IDAgJiYgKGludClzdGF0dXMgPCAxMDApOwotCi0gIEdQUl9BU1NFUlQoc3RyZWFtX2dsb2JhbC0+aWQgIT0gMCk7Ci0KLSAgLyogSGFuZCByb2xsIGEgaGVhZGVyIGJsb2NrLgotICAgICBUaGlzIGlzIHVubmVjZXNzYXJpbHkgdWdseSAtIGF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIGZpbmQgYSBtb3JlIGVsZWdhbnQKLSAgICAgc29sdXRpb24uCi0gICAgIEl0J3MgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBvdXIgc2VuZCBtYWNoaW5lcnkgd291bGQgYmUgZGVhZCBieSB0aGUKLSAgICAgdGltZSB3ZSBnb3QgYXJvdW5kIHRvIHNlbmRpbmcgdGhpcywgc28gaW5zdGVhZCB3ZSBpZ25vcmUgSFBBQ0sgY29tcHJlc3Npb24KLSAgICAgYW5kIGp1c3Qgd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBieXRlcyBvbnRvIHRoZSB3aXJlLiAqLwotICBzdGF0dXNfaGRyID0gZ3ByX3NsaWNlX21hbGxvYygxNSArIChzdGF0dXMgPj0gMTApKTsKLSAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoc3RhdHVzX2hkcik7Ci0gICpwKysgPSAweDQwOyAvKiBsaXRlcmFsIGhlYWRlciAqLwotICAqcCsrID0gMTE7ICAgLyogbGVuKGdycGMtc3RhdHVzKSAqLwotICAqcCsrID0gJ2cnOwotICAqcCsrID0gJ3InOwotICAqcCsrID0gJ3AnOwotICAqcCsrID0gJ2MnOwotICAqcCsrID0gJy0nOwotICAqcCsrID0gJ3MnOwotICAqcCsrID0gJ3QnOwotICAqcCsrID0gJ2EnOwotICAqcCsrID0gJ3QnOwotICAqcCsrID0gJ3UnOwotICAqcCsrID0gJ3MnOwotICBpZiAoc3RhdHVzIDwgMTApIHsKLSAgICAqcCsrID0gMTsKLSAgICAqcCsrID0gKHVpbnQ4X3QpKCcwJyArIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgKnArKyA9IDI7Ci0gICAgKnArKyA9ICh1aW50OF90KSgnMCcgKyAoc3RhdHVzIC8gMTApKTsKLSAgICAqcCsrID0gKHVpbnQ4X3QpKCcwJyArIChzdGF0dXMgJSAxMCkpOwotICB9Ci0gIEdQUl9BU1NFUlQocCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihzdGF0dXNfaGRyKSk7Ci0gIGxlbiArPSAodWludDMyX3QpR1BSX1NMSUNFX0xFTkdUSChzdGF0dXNfaGRyKTsKLQotICBpZiAob3B0aW9uYWxfbWVzc2FnZSkgewotICAgIEdQUl9BU1NFUlQoR1BSX1NMSUNFX0xFTkdUSCgqb3B0aW9uYWxfbWVzc2FnZSkgPCAxMjcpOwotICAgIG1lc3NhZ2VfcGZ4ID0gZ3ByX3NsaWNlX21hbGxvYygxNSk7Ci0gICAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIobWVzc2FnZV9wZngpOwotICAgICpwKysgPSAweDQwOwotICAgICpwKysgPSAxMjsgLyogbGVuKGdycGMtbWVzc2FnZSkgKi8KLSAgICAqcCsrID0gJ2cnOwotICAgICpwKysgPSAncic7Ci0gICAgKnArKyA9ICdwJzsKLSAgICAqcCsrID0gJ2MnOwotICAgICpwKysgPSAnLSc7Ci0gICAgKnArKyA9ICdtJzsKLSAgICAqcCsrID0gJ2UnOwotICAgICpwKysgPSAncyc7Ci0gICAgKnArKyA9ICdzJzsKLSAgICAqcCsrID0gJ2EnOwotICAgICpwKysgPSAnZyc7Ci0gICAgKnArKyA9ICdlJzsKLSAgICAqcCsrID0gKHVpbnQ4X3QpR1BSX1NMSUNFX0xFTkdUSCgqb3B0aW9uYWxfbWVzc2FnZSk7Ci0gICAgR1BSX0FTU0VSVChwID09IEdQUl9TTElDRV9FTkRfUFRSKG1lc3NhZ2VfcGZ4KSk7Ci0gICAgbGVuICs9ICh1aW50MzJfdClHUFJfU0xJQ0VfTEVOR1RIKG1lc3NhZ2VfcGZ4KTsKLSAgICBsZW4gKz0gKHVpbnQzMl90KUdQUl9TTElDRV9MRU5HVEgoKm9wdGlvbmFsX21lc3NhZ2UpOwotICB9Ci0KLSAgaGRyID0gZ3ByX3NsaWNlX21hbGxvYyg5KTsKLSAgcCA9IEdQUl9TTElDRV9TVEFSVF9QVFIoaGRyKTsKLSAgKnArKyA9ICh1aW50OF90KShsZW4gPj4gMTYpOwotICAqcCsrID0gKHVpbnQ4X3QpKGxlbiA+PiA4KTsKLSAgKnArKyA9ICh1aW50OF90KShsZW4pOwotICAqcCsrID0gR1JQQ19DSFRUUDJfRlJBTUVfSEVBREVSOwotICAqcCsrID0gR1JQQ19DSFRUUDJfREFUQV9GTEFHX0VORF9TVFJFQU0gfCBHUlBDX0NIVFRQMl9EQVRBX0ZMQUdfRU5EX0hFQURFUlM7Ci0gICpwKysgPSAodWludDhfdCkoc3RyZWFtX2dsb2JhbC0+aWQgPj4gMjQpOwotICAqcCsrID0gKHVpbnQ4X3QpKHN0cmVhbV9nbG9iYWwtPmlkID4+IDE2KTsKLSAgKnArKyA9ICh1aW50OF90KShzdHJlYW1fZ2xvYmFsLT5pZCA+PiA4KTsKLSAgKnArKyA9ICh1aW50OF90KShzdHJlYW1fZ2xvYmFsLT5pZCk7Ci0gIEdQUl9BU1NFUlQocCA9PSBHUFJfU0xJQ0VfRU5EX1BUUihoZHIpKTsKLQotICBncHJfc2xpY2VfYnVmZmVyX2FkZCgmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwgaGRyKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF9nbG9iYWwtPnFidWYsIHN0YXR1c19oZHIpOwotICBpZiAob3B0aW9uYWxfbWVzc2FnZSkgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZ0cmFuc3BvcnRfZ2xvYmFsLT5xYnVmLCBtZXNzYWdlX3BmeCk7Ci0gICAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoJnRyYW5zcG9ydF9nbG9iYWwtPnFidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlX3JlZigqb3B0aW9uYWxfbWVzc2FnZSkpOwotICB9Ci0KLSAgZ3ByX3NsaWNlX2J1ZmZlcl9hZGQoCi0gICAgICAmdHJhbnNwb3J0X2dsb2JhbC0+cWJ1ZiwKLSAgICAgIGdycGNfY2h0dHAyX3JzdF9zdHJlYW1fY3JlYXRlKHN0cmVhbV9nbG9iYWwtPmlkLCBHUlBDX0NIVFRQMl9OT19FUlJPUikpOwotCi0gIGlmIChvcHRpb25hbF9tZXNzYWdlKSB7Ci0gICAgZ3ByX3NsaWNlX3JlZigqb3B0aW9uYWxfbWVzc2FnZSk7Ci0gIH0KLSAgZ3JwY19jaHR0cDJfZmFrZV9zdGF0dXMoZXhlY19jdHgsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbWVzc2FnZSk7Ci0gIGdycGNfY2h0dHAyX21hcmtfc3RyZWFtX2Nsb3NlZChleGVjX2N0eCwgdHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotfQotCi1zdGF0aWMgdm9pZCBjYW5jZWxfc3RyZWFtX2NiKGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCkgewotICBjYW5jZWxfZnJvbV9hcGkodXNlcl9kYXRhLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgR1JQQ19TVEFUVVNfVU5BVkFJTEFCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfYWxsX3RoZV9jYWxscyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgewotICBncnBjX2NodHRwMl9mb3JfYWxsX3N0cmVhbXMoJnQtPmdsb2JhbCwgZXhlY19jdHgsIGNhbmNlbF9zdHJlYW1fY2IpOwotfQotCi1zdGF0aWMgdm9pZCBkcm9wX2Nvbm5lY3Rpb24oZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCkgewotICBjbG9zZV90cmFuc3BvcnRfbG9ja2VkKGV4ZWNfY3R4LCB0KTsKLSAgZW5kX2FsbF90aGVfY2FsbHMoZXhlY19jdHgsIHQpOwotfQotCi0vKiogdXBkYXRlIHdpbmRvdyBmcm9tIGEgc2V0dGluZ3MgY2hhbmdlICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfZ2xvYmFsX3dpbmRvdyh2b2lkICphcmdzLCB1aW50MzJfdCBpZCwgdm9pZCAqc3RyZWFtKSB7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IGFyZ3M7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbSAqcyA9IHN0cmVhbTsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCA9ICZ0LT5nbG9iYWw7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwgPSAmcy0+Z2xvYmFsOwotICBpbnQgd2FzX3plcm87Ci0gIGludCBpc196ZXJvOwotICBpbnQ2NF90IGluaXRpYWxfd2luZG93X3VwZGF0ZSA9IHQtPnBhcnNpbmcuaW5pdGlhbF93aW5kb3dfdXBkYXRlOwotCi0gIHdhc196ZXJvID0gc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93IDw9IDA7Ci0gIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTSgic2V0dGluZ3MiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfd2luZG93LCBpbml0aWFsX3dpbmRvd191cGRhdGUpOwotICBpc196ZXJvID0gc3RyZWFtX2dsb2JhbC0+b3V0Z29pbmdfd2luZG93IDw9IDA7Ci0KLSAgaWYgKHdhc196ZXJvICYmICFpc196ZXJvKSB7Ci0gICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZXJyb3JfbG9ja2VkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0KSB7Ci0gIHQtPmVuZHBvaW50X3JlYWRpbmcgPSAwOwotICBpZiAoIXQtPndyaXRpbmdfYWN0aXZlICYmIHQtPmVwKSB7Ci0gICAgZGVzdHJveV9lbmRwb2ludChleGVjX2N0eCwgdCk7Ci0gIH0KLX0KLQotLyogdGNwIHJlYWQgY2FsbGJhY2sgKi8KLXN0YXRpYyB2b2lkIHJlY3ZfZGF0YShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqdHAsIGJvb2wgc3VjY2VzcykgewotICBzaXplX3QgaTsKLSAgaW50IGtlZXBfcmVhZGluZyA9IDA7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IHRwOwotICBncnBjX2NodHRwMl90cmFuc3BvcnRfZ2xvYmFsICp0cmFuc3BvcnRfZ2xvYmFsID0gJnQtPmdsb2JhbDsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nID0gJnQtPnBhcnNpbmc7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWw7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJyZWN2X2RhdGEiLCAwKTsKLQotICBsb2NrKHQpOwotICBpID0gMDsKLSAgR1BSX0FTU0VSVCghdC0+cGFyc2luZ19hY3RpdmUpOwotICBpZiAoIXQtPmNsb3NlZCkgewotICAgIHQtPnBhcnNpbmdfYWN0aXZlID0gMTsKLSAgICAvKiBtZXJnZSBzdHJlYW0gbGlzdHMgKi8KLSAgICBncnBjX2NodHRwMl9zdHJlYW1fbWFwX21vdmVfaW50bygmdC0+bmV3X3N0cmVhbV9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQtPnBhcnNpbmdfc3RyZWFtX21hcCk7Ci0gICAgZ3JwY19jaHR0cDJfcHJlcGFyZV90b19yZWFkKHRyYW5zcG9ydF9nbG9iYWwsIHRyYW5zcG9ydF9wYXJzaW5nKTsKLSAgICBncHJfbXVfdW5sb2NrKCZ0LT5tdSk7Ci0gICAgR1BSX1RJTUVSX0JFR0lOKCJyZWN2X2RhdGEucGFyc2UiLCAwKTsKLSAgICBmb3IgKDsgaSA8IHQtPnJlYWRfYnVmZmVyLmNvdW50ICYmCi0gICAgICAgICAgIGdycGNfY2h0dHAyX3BlcmZvcm1fcmVhZChleGVjX2N0eCwgdHJhbnNwb3J0X3BhcnNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5yZWFkX2J1ZmZlci5zbGljZXNbaV0pOwotICAgICAgICAgaSsrKQotICAgICAgOwotICAgIEdQUl9USU1FUl9FTkQoInJlY3ZfZGF0YS5wYXJzZSIsIDApOwotICAgIGdwcl9tdV9sb2NrKCZ0LT5tdSk7Ci0gICAgLyogY29weSBwYXJzaW5nIHFidWYgdG8gZ2xvYmFsIHFidWYgKi8KLSAgICBncHJfc2xpY2VfYnVmZmVyX21vdmVfaW50bygmdC0+cGFyc2luZy5xYnVmLCAmdC0+Z2xvYmFsLnFidWYpOwotICAgIGlmIChpICE9IHQtPnJlYWRfYnVmZmVyLmNvdW50KSB7Ci0gICAgICB1bmxvY2soZXhlY19jdHgsIHQpOwotICAgICAgbG9jayh0KTsKLSAgICAgIGRyb3BfY29ubmVjdGlvbihleGVjX2N0eCwgdCk7Ci0gICAgfQotICAgIC8qIG1lcmdlIHN0cmVhbSBsaXN0cyAqLwotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9tYXBfbW92ZV9pbnRvKCZ0LT5uZXdfc3RyZWFtX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdC0+cGFyc2luZ19zdHJlYW1fbWFwKTsKLSAgICB0cmFuc3BvcnRfZ2xvYmFsLT5jb25jdXJyZW50X3N0cmVhbV9jb3VudCA9Ci0gICAgICAgICh1aW50MzJfdClncnBjX2NodHRwMl9zdHJlYW1fbWFwX3NpemUoJnQtPnBhcnNpbmdfc3RyZWFtX21hcCk7Ci0gICAgaWYgKHRyYW5zcG9ydF9wYXJzaW5nLT5pbml0aWFsX3dpbmRvd191cGRhdGUgIT0gMCkgewotICAgICAgZ3JwY19jaHR0cDJfc3RyZWFtX21hcF9mb3JfZWFjaCgmdC0+cGFyc2luZ19zdHJlYW1fbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfZ2xvYmFsX3dpbmRvdywgdCk7Ci0gICAgICB0cmFuc3BvcnRfcGFyc2luZy0+aW5pdGlhbF93aW5kb3dfdXBkYXRlID0gMDsKLSAgICB9Ci0gICAgLyogaGFuZGxlIGhpZ2hlciBsZXZlbCB0aGluZ3MgKi8KLSAgICBncnBjX2NodHRwMl9wdWJsaXNoX3JlYWRzKGV4ZWNfY3R4LCB0cmFuc3BvcnRfZ2xvYmFsLCB0cmFuc3BvcnRfcGFyc2luZyk7Ci0gICAgdC0+cGFyc2luZ19hY3RpdmUgPSAwOwotICAgIC8qIGhhbmRsZSBkZWxheWVkIHRyYW5zcG9ydCBvcHMgKGlmIHRoZXJlIGlzIG9uZSkgKi8KLSAgICBpZiAodC0+cG9zdF9wYXJzaW5nX29wKSB7Ci0gICAgICBncnBjX3RyYW5zcG9ydF9vcCAqb3AgPSB0LT5wb3N0X3BhcnNpbmdfb3A7Ci0gICAgICB0LT5wb3N0X3BhcnNpbmdfb3AgPSBOVUxMOwotICAgICAgcGVyZm9ybV90cmFuc3BvcnRfb3BfbG9ja2VkKGV4ZWNfY3R4LCB0LCBvcCk7Ci0gICAgICBncHJfZnJlZShvcCk7Ci0gICAgfQotICAgIC8qIGlmIGEgc3RyZWFtIGlzIGluIHRoZSBzdHJlYW0gbWFwLCBhbmQgZ2V0cyBjYW5jZWxsZWQsIHdlIG5lZWQgdG8gZW5zdXJlCi0gICAgICogd2UgYXJlIG5vdCBwYXJzaW5nIGJlZm9yZSBjb250aW51aW5nIHRoZSBjYW5jZWxsYXRpb24gdG8ga2VlcCB0aGluZ3MgaW4KLSAgICAgKiBhIHNhbmUgc3RhdGUgKi8KLSAgICB3aGlsZSAoZ3JwY19jaHR0cDJfbGlzdF9wb3BfY2xvc2VkX3dhaXRpbmdfZm9yX3BhcnNpbmcodHJhbnNwb3J0X2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9nbG9iYWwpKSB7Ci0gICAgICBHUFJfQVNTRVJUKHN0cmVhbV9nbG9iYWwtPmluX3N0cmVhbV9tYXApOwotICAgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT53cml0ZV9jbG9zZWQpOwotICAgICAgR1BSX0FTU0VSVChzdHJlYW1fZ2xvYmFsLT5yZWFkX2Nsb3NlZCk7Ci0gICAgICByZW1vdmVfc3RyZWFtKGV4ZWNfY3R4LCB0LCBzdHJlYW1fZ2xvYmFsLT5pZCk7Ci0gICAgICBHUlBDX0NIVFRQMl9TVFJFQU1fVU5SRUYoZXhlY19jdHgsIHN0cmVhbV9nbG9iYWwsICJjaHR0cDIiKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFzdWNjZXNzIHx8IGkgIT0gdC0+cmVhZF9idWZmZXIuY291bnQgfHwgdC0+Y2xvc2VkKSB7Ci0gICAgZHJvcF9jb25uZWN0aW9uKGV4ZWNfY3R4LCB0KTsKLSAgICByZWFkX2Vycm9yX2xvY2tlZChleGVjX2N0eCwgdCk7Ci0gIH0gZWxzZSBpZiAoIXQtPmNsb3NlZCkgewotICAgIGtlZXBfcmVhZGluZyA9IDE7Ci0gICAgUkVGX1RSQU5TUE9SVCh0LCAia2VlcF9yZWFkaW5nIik7Ci0gICAgcHJldmVudF9lbmRwb2ludF9zaHV0ZG93bih0KTsKLSAgfQotICBncHJfc2xpY2VfYnVmZmVyX3Jlc2V0X2FuZF91bnJlZigmdC0+cmVhZF9idWZmZXIpOwotICB1bmxvY2soZXhlY19jdHgsIHQpOwotCi0gIGlmIChrZWVwX3JlYWRpbmcpIHsKLSAgICBncnBjX2VuZHBvaW50X3JlYWQoZXhlY19jdHgsIHQtPmVwLCAmdC0+cmVhZF9idWZmZXIsICZ0LT5yZWN2X2RhdGEpOwotICAgIGFsbG93X2VuZHBvaW50X3NodXRkb3duX3VubG9ja2VkKGV4ZWNfY3R4LCB0KTsKLSAgICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJrZWVwX3JlYWRpbmciKTsKLSAgfSBlbHNlIHsKLSAgICBVTlJFRl9UUkFOU1BPUlQoZXhlY19jdHgsIHQsICJyZWN2X2RhdGEiKTsKLSAgfQotCi0gIEdQUl9USU1FUl9FTkQoInJlY3ZfZGF0YSIsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ0FMTEJBQ0sgTE9PUAotICovCi0KLXN0YXRpYyB2b2lkIGNvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoCi0gICAgZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGUsIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBHUlBDX0NIVFRQMl9JRl9UUkFDSU5HKAotICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJzZXQgY29ubmVjdGl2aXR5X3N0YXRlPSVkIiwgc3RhdGUpKTsKLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfc2V0KAotICAgICAgZXhlY19jdHgsCi0gICAgICAmVFJBTlNQT1JUX0ZST01fR0xPQkFMKHRyYW5zcG9ydF9nbG9iYWwpLT5jaGFubmVsX2NhbGxiYWNrLnN0YXRlX3RyYWNrZXIsCi0gICAgICBzdGF0ZSwgcmVhc29uKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFBPTExTRVQgU1RVRkYKLSAqLwotCi1zdGF0aWMgdm9pZCBhZGRfdG9fcG9sbHNldF9sb2NrZWQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfcG9sbHNldCAqcG9sbHNldCkgewotICBpZiAodC0+ZXApIHsKLSAgICBncnBjX2VuZHBvaW50X2FkZF90b19wb2xsc2V0KGV4ZWNfY3R4LCB0LT5lcCwgcG9sbHNldCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgYWRkX3RvX3BvbGxzZXRfc2V0X2xvY2tlZChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3BvbGxzZXRfc2V0ICpwb2xsc2V0X3NldCkgewotICBpZiAodC0+ZXApIHsKLSAgICBncnBjX2VuZHBvaW50X2FkZF90b19wb2xsc2V0X3NldChleGVjX2N0eCwgdC0+ZXAsIHBvbGxzZXRfc2V0KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKmd0LAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW0gKmdzLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQpIHsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICp0ID0gKGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqKWd0OwotICBsb2NrKHQpOwotICBhZGRfdG9fcG9sbHNldF9sb2NrZWQoZXhlY19jdHgsIHQsIHBvbGxzZXQpOwotICB1bmxvY2soZXhlY19jdHgsIHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQllURSBTVFJFQU0KLSAqLwotCi1zdGF0aWMgdm9pZCBpbmNvbWluZ19ieXRlX3N0cmVhbV91cGRhdGVfZmxvd19jb250cm9sKAotICAgIGdycGNfY2h0dHAyX3RyYW5zcG9ydF9nbG9iYWwgKnRyYW5zcG9ydF9nbG9iYWwsCi0gICAgZ3JwY19jaHR0cDJfc3RyZWFtX2dsb2JhbCAqc3RyZWFtX2dsb2JhbCwgc2l6ZV90IG1heF9zaXplX2hpbnQsCi0gICAgc2l6ZV90IGhhdmVfYWxyZWFkeSkgewotICB1aW50MzJfdCBtYXhfcmVjdl9ieXRlczsKLQotICAvKiBjbGFtcCBtYXggcmVjdiBoaW50IHRvIGFuIGFsbG93YWJsZSBzaXplICovCi0gIGlmIChtYXhfc2l6ZV9oaW50ID49IFVJTlQzMl9NQVggLSB0cmFuc3BvcnRfZ2xvYmFsLT5zdHJlYW1fbG9va2FoZWFkKSB7Ci0gICAgbWF4X3JlY3ZfYnl0ZXMgPSBVSU5UMzJfTUFYIC0gdHJhbnNwb3J0X2dsb2JhbC0+c3RyZWFtX2xvb2thaGVhZDsKLSAgfSBlbHNlIHsKLSAgICBtYXhfcmVjdl9ieXRlcyA9ICh1aW50MzJfdCltYXhfc2l6ZV9oaW50OwotICB9Ci0KLSAgLyogYWNjb3VudCBmb3IgYnl0ZXMgYWxyZWFkeSByZWNlaXZlZCBidXQgdW5rbm93biB0byBoaWdoZXIgbGF5ZXJzICovCi0gIGlmIChtYXhfcmVjdl9ieXRlcyA+PSBoYXZlX2FscmVhZHkpIHsKLSAgICBtYXhfcmVjdl9ieXRlcyAtPSAodWludDMyX3QpaGF2ZV9hbHJlYWR5OwotICB9IGVsc2UgewotICAgIG1heF9yZWN2X2J5dGVzID0gMDsKLSAgfQotCi0gIC8qIGFkZCBzb21lIHNtYWxsIGxvb2thaGVhZCB0byBrZWVwIHBpcGVsaW5lcyBmbG93aW5nICovCi0gIEdQUl9BU1NFUlQobWF4X3JlY3ZfYnl0ZXMgPD0gVUlOVDMyX01BWCAtIHRyYW5zcG9ydF9nbG9iYWwtPnN0cmVhbV9sb29rYWhlYWQpOwotICBtYXhfcmVjdl9ieXRlcyArPSB0cmFuc3BvcnRfZ2xvYmFsLT5zdHJlYW1fbG9va2FoZWFkOwotICBpZiAoc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXMgPCBtYXhfcmVjdl9ieXRlcykgewotICAgIHVpbnQzMl90IGFkZF9tYXhfcmVjdl9ieXRlcyA9Ci0gICAgICAgIG1heF9yZWN2X2J5dGVzIC0gc3RyZWFtX2dsb2JhbC0+bWF4X3JlY3ZfYnl0ZXM7Ci0gICAgR1JQQ19DSFRUUDJfRkxPV19DUkVESVRfU1RSRUFNKCJvcCIsIHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9yZWN2X2J5dGVzLCBhZGRfbWF4X3JlY3ZfYnl0ZXMpOwotICAgIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTSgib3AiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3BhcnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbWF4X3JlY3ZfYnl0ZXMpOwotICAgIEdSUENfQ0hUVFAyX0ZMT1dfQ1JFRElUX1NUUkVBTSgib3AiLCB0cmFuc3BvcnRfZ2xvYmFsLCBzdHJlYW1fZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFubm91bmNlZF9pbmNvbWluZ193aW5kb3dfZm9yX3dyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tYXhfcmVjdl9ieXRlcyk7Ci0gICAgZ3JwY19jaHR0cDJfbGlzdF9hZGRfdW5hbm5vdW5jZWRfaW5jb21pbmdfd2luZG93X2F2YWlsYWJsZSh0cmFuc3BvcnRfZ2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2dsb2JhbCk7Ci0gICAgZ3JwY19jaHR0cDJfYmVjb21lX3dyaXRhYmxlKHRyYW5zcG9ydF9nbG9iYWwsIHN0cmVhbV9nbG9iYWwpOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgaW5jb21pbmdfYnl0ZV9zdHJlYW1fbmV4dChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKnNsaWNlLCBzaXplX3QgbWF4X3NpemVfaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlKSB7Ci0gIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpicyA9Ci0gICAgICAoZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKilieXRlX3N0cmVhbTsKLSAgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X2dsb2JhbCAqdHJhbnNwb3J0X2dsb2JhbCA9ICZicy0+dHJhbnNwb3J0LT5nbG9iYWw7Ci0gIGdycGNfY2h0dHAyX3N0cmVhbV9nbG9iYWwgKnN0cmVhbV9nbG9iYWwgPSAmYnMtPnN0cmVhbS0+Z2xvYmFsOwotCi0gIGxvY2soYnMtPnRyYW5zcG9ydCk7Ci0gIGlmIChicy0+aXNfdGFpbCkgewotICAgIGluY29taW5nX2J5dGVfc3RyZWFtX3VwZGF0ZV9mbG93X2NvbnRyb2wodHJhbnNwb3J0X2dsb2JhbCwgc3RyZWFtX2dsb2JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplX2hpbnQsIGJzLT5zbGljZXMubGVuZ3RoKTsKLSAgfQotICBpZiAoYnMtPnNsaWNlcy5jb3VudCA+IDApIHsKLSAgICAqc2xpY2UgPSBncHJfc2xpY2VfYnVmZmVyX3Rha2VfZmlyc3QoJmJzLT5zbGljZXMpOwotICAgIHVubG9jayhleGVjX2N0eCwgYnMtPnRyYW5zcG9ydCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSBpZiAoYnMtPmZhaWxlZCkgewotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb25fY29tcGxldGUsIGZhbHNlLCBOVUxMKTsKLSAgICB1bmxvY2soZXhlY19jdHgsIGJzLT50cmFuc3BvcnQpOwotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIGJzLT5vbl9uZXh0ID0gb25fY29tcGxldGU7Ci0gICAgYnMtPm5leHQgPSBzbGljZTsKLSAgICB1bmxvY2soZXhlY19jdHgsIGJzLT50cmFuc3BvcnQpOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGluY29taW5nX2J5dGVfc3RyZWFtX3VucmVmKGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtICpicykgewotICBpZiAoZ3ByX3VucmVmKCZicy0+cmVmcykpIHsKLSAgICBncHJfc2xpY2VfYnVmZmVyX2Rlc3Ryb3koJmJzLT5zbGljZXMpOwotICAgIGdwcl9mcmVlKGJzKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBpbmNvbWluZ19ieXRlX3N0cmVhbV9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2J5dGVfc3RyZWFtICpieXRlX3N0cmVhbSkgewotICBpbmNvbWluZ19ieXRlX3N0cmVhbV91bnJlZigoZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKilieXRlX3N0cmVhbSk7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW1fcHVzaChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlIHNsaWNlKSB7Ci0gIGdwcl9tdV9sb2NrKCZicy0+dHJhbnNwb3J0LT5tdSk7Ci0gIGlmIChicy0+b25fbmV4dCAhPSBOVUxMKSB7Ci0gICAgKmJzLT5uZXh0ID0gc2xpY2U7Ci0gICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBicy0+b25fbmV4dCwgdHJ1ZSwgTlVMTCk7Ci0gICAgYnMtPm9uX25leHQgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGdwcl9zbGljZV9idWZmZXJfYWRkKCZicy0+c2xpY2VzLCBzbGljZSk7Ci0gIH0KLSAgZ3ByX211X3VubG9jaygmYnMtPnRyYW5zcG9ydC0+bXUpOwotfQotCi12b2lkIGdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2ZpbmlzaGVkKAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqYnMsIGludCBzdWNjZXNzLAotICAgIGludCBmcm9tX3BhcnNpbmdfdGhyZWFkKSB7Ci0gIGlmICghc3VjY2VzcykgewotICAgIGlmIChmcm9tX3BhcnNpbmdfdGhyZWFkKSB7Ci0gICAgICBncHJfbXVfbG9jaygmYnMtPnRyYW5zcG9ydC0+bXUpOwotICAgIH0KLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIGJzLT5vbl9uZXh0LCBmYWxzZSwgTlVMTCk7Ci0gICAgYnMtPm9uX25leHQgPSBOVUxMOwotICAgIGJzLT5mYWlsZWQgPSAxOwotICAgIGlmIChmcm9tX3BhcnNpbmdfdGhyZWFkKSB7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZicy0+dHJhbnNwb3J0LT5tdSk7Ci0gICAgfQotICB9IGVsc2UgewotI2lmbmRlZiBOREVCVUcKLSAgICBpZiAoZnJvbV9wYXJzaW5nX3RocmVhZCkgewotICAgICAgZ3ByX211X2xvY2soJmJzLT50cmFuc3BvcnQtPm11KTsKLSAgICB9Ci0gICAgR1BSX0FTU0VSVChicy0+b25fbmV4dCA9PSBOVUxMKTsKLSAgICBpZiAoZnJvbV9wYXJzaW5nX3RocmVhZCkgewotICAgICAgZ3ByX211X3VubG9jaygmYnMtPnRyYW5zcG9ydC0+bXUpOwotICAgIH0KLSNlbmRpZgotICB9Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtX3VucmVmKGJzKTsKLX0KLQotZ3JwY19jaHR0cDJfaW5jb21pbmdfYnl0ZV9zdHJlYW0gKmdycGNfY2h0dHAyX2luY29taW5nX2J5dGVfc3RyZWFtX2NyZWF0ZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3BhcnNpbmcgKnRyYW5zcG9ydF9wYXJzaW5nLAotICAgIGdycGNfY2h0dHAyX3N0cmVhbV9wYXJzaW5nICpzdHJlYW1fcGFyc2luZywgdWludDMyX3QgZnJhbWVfc2l6ZSwKLSAgICB1aW50MzJfdCBmbGFncywgZ3JwY19jaHR0cDJfaW5jb21pbmdfZnJhbWVfcXVldWUgKmFkZF90b19xdWV1ZSkgewotICBncnBjX2NodHRwMl9pbmNvbWluZ19ieXRlX3N0cmVhbSAqaW5jb21pbmdfYnl0ZV9zdHJlYW0gPQotICAgICAgZ3ByX21hbGxvYyhzaXplb2YoKmluY29taW5nX2J5dGVfc3RyZWFtKSk7Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtLT5iYXNlLmxlbmd0aCA9IGZyYW1lX3NpemU7Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtLT5iYXNlLmZsYWdzID0gZmxhZ3M7Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtLT5iYXNlLm5leHQgPSBpbmNvbWluZ19ieXRlX3N0cmVhbV9uZXh0OwotICBpbmNvbWluZ19ieXRlX3N0cmVhbS0+YmFzZS5kZXN0cm95ID0gaW5jb21pbmdfYnl0ZV9zdHJlYW1fZGVzdHJveTsKLSAgZ3ByX3JlZl9pbml0KCZpbmNvbWluZ19ieXRlX3N0cmVhbS0+cmVmcywgMik7Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtLT5uZXh0X21lc3NhZ2UgPSBOVUxMOwotICBpbmNvbWluZ19ieXRlX3N0cmVhbS0+dHJhbnNwb3J0ID0gVFJBTlNQT1JUX0ZST01fUEFSU0lORyh0cmFuc3BvcnRfcGFyc2luZyk7Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtLT5zdHJlYW0gPSBTVFJFQU1fRlJPTV9QQVJTSU5HKHN0cmVhbV9wYXJzaW5nKTsKLSAgZ3ByX3NsaWNlX2J1ZmZlcl9pbml0KCZpbmNvbWluZ19ieXRlX3N0cmVhbS0+c2xpY2VzKTsKLSAgaW5jb21pbmdfYnl0ZV9zdHJlYW0tPm9uX25leHQgPSBOVUxMOwotICBpbmNvbWluZ19ieXRlX3N0cmVhbS0+aXNfdGFpbCA9IDE7Ci0gIGluY29taW5nX2J5dGVfc3RyZWFtLT5mYWlsZWQgPSAwOwotICBpZiAoYWRkX3RvX3F1ZXVlLT5oZWFkID09IE5VTEwpIHsKLSAgICBhZGRfdG9fcXVldWUtPmhlYWQgPSBpbmNvbWluZ19ieXRlX3N0cmVhbTsKLSAgfSBlbHNlIHsKLSAgICBhZGRfdG9fcXVldWUtPnRhaWwtPmlzX3RhaWwgPSAwOwotICAgIGFkZF90b19xdWV1ZS0+dGFpbC0+bmV4dF9tZXNzYWdlID0gaW5jb21pbmdfYnl0ZV9zdHJlYW07Ci0gIH0KLSAgYWRkX3RvX3F1ZXVlLT50YWlsID0gaW5jb21pbmdfYnl0ZV9zdHJlYW07Ci0gIHJldHVybiBpbmNvbWluZ19ieXRlX3N0cmVhbTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRSQUNJTkcKLSAqLwotCi1zdGF0aWMgY2hhciAqZm9ybWF0X2Zsb3djdGxfY29udGV4dF92YXIoY29uc3QgY2hhciAqY29udGV4dCwgY29uc3QgY2hhciAqdmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsLCB1aW50MzJfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqc2NvcGUpIHsKLSAgY2hhciAqdW5kZXJzY29yZV9wb3M7Ci0gIGNoYXIgKnJlc3VsdDsKLSAgaWYgKGNvbnRleHQgPT0gTlVMTCkgewotICAgICpzY29wZSA9IE5VTEw7Ci0gICAgZ3ByX2FzcHJpbnRmKCZyZXN1bHQsICIlcyglbGxkKSIsIHZhciwgdmFsKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHVuZGVyc2NvcmVfcG9zID0gc3RyY2hyKGNvbnRleHQsICdfJyk7Ci0gICpzY29wZSA9IGdwcl9zdHJkdXAoY29udGV4dCk7Ci0gICgqc2NvcGUpW3VuZGVyc2NvcmVfcG9zIC0gY29udGV4dF0gPSAwOwotICBpZiAoaWQgIT0gMCkgewotICAgIGNoYXIgKnRtcCA9ICpzY29wZTsKLSAgICBncHJfYXNwcmludGYoc2NvcGUsICIlc1slZF0iLCB0bXAsIGlkKTsKLSAgICBncHJfZnJlZSh0bXApOwotICB9Ci0gIGdwcl9hc3ByaW50ZigmcmVzdWx0LCAiJXMuJXMoJWxsZCkiLCB1bmRlcnNjb3JlX3BvcyArIDEsIHZhciwgdmFsKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBzYW1lc3RyKGNoYXIgKmEsIGNoYXIgKmIpIHsKLSAgaWYgKGEgPT0gTlVMTCkgewotICAgIHJldHVybiBiID09IE5VTEw7Ci0gIH0KLSAgaWYgKGIgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAwID09IHN0cmNtcChhLCBiKTsKLX0KLQotdm9pZCBncnBjX2NodHRwMl9mbG93Y3RsX3RyYWNlKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpwaGFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2NodHRwMl9mbG93Y3RsX29wIG9wLCBjb25zdCBjaGFyICpjb250ZXh0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXIxLCBjb25zdCBjaGFyICpjb250ZXh0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXIyLCBpbnQgaXNfY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwgaW50NjRfdCB2YWwxLCBpbnQ2NF90IHZhbDIpIHsKLSAgY2hhciAqc2NvcGUxOwotICBjaGFyICpzY29wZTI7Ci0gIGNoYXIgKmxhYmVsMSA9Ci0gICAgICBmb3JtYXRfZmxvd2N0bF9jb250ZXh0X3Zhcihjb250ZXh0MSwgdmFyMSwgdmFsMSwgc3RyZWFtX2lkLCAmc2NvcGUxKTsKLSAgY2hhciAqbGFiZWwyID0KLSAgICAgIGZvcm1hdF9mbG93Y3RsX2NvbnRleHRfdmFyKGNvbnRleHQyLCB2YXIyLCB2YWwyLCBzdHJlYW1faWQsICZzY29wZTIpOwotICBjaGFyICpjbGlzdnIgPSBpc19jbGllbnQgPyAiY2xpZW50IiA6ICJzZXJ2ZXIiOwotICBjaGFyICpwcmVmaXg7Ci0KLSAgZ3ByX2FzcHJpbnRmKCZwcmVmaXgsICJGTE9XICUgOHM6ICVzICUgMTFzICIsIHBoYXNlLCBjbGlzdnIsIHNjb3BlMSk7Ci0KLSAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgR1JQQ19DSFRUUDJfRkxPV0NUTF9NT1ZFOgotICAgICAgR1BSX0FTU0VSVChzYW1lc3RyKHNjb3BlMSwgc2NvcGUyKSk7Ci0gICAgICBpZiAodmFsMiAhPSAwKSB7Ci0gICAgICAgIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKLSAgICAgICAgICAgICAgICAiJXNNT1ZFICAgJSA0MHMgPC0gJSA0MHMgZ2l2aW5nICVkIiwgcHJlZml4LCBsYWJlbDEsIGxhYmVsMiwKLSAgICAgICAgICAgICAgICB2YWwxICsgdmFsMik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdSUENfQ0hUVFAyX0ZMT1dDVExfQ1JFRElUOgotICAgICAgR1BSX0FTU0VSVCh2YWwyID49IDApOwotICAgICAgaWYgKHZhbDIgIT0gMCkgewotICAgICAgICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCi0gICAgICAgICAgICAgICAgIiVzQ1JFRElUICUgNDBzIGJ5ICUgNDBzIGdpdmluZyAlZCIsIHByZWZpeCwgbGFiZWwxLCBsYWJlbDIsCi0gICAgICAgICAgICAgICAgdmFsMSArIHZhbDIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUlBDX0NIVFRQMl9GTE9XQ1RMX0RFQklUOgotICAgICAgR1BSX0FTU0VSVCh2YWwyID49IDApOwotICAgICAgaWYgKHZhbDIgIT0gMCkgewotICAgICAgICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCi0gICAgICAgICAgICAgICAgIiVzREVCSVQgICUgNDBzIGJ5ICUgNDBzIGdpdmluZyAlZCIsIHByZWZpeCwgbGFiZWwxLCBsYWJlbDIsCi0gICAgICAgICAgICAgICAgdmFsMSAtIHZhbDIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBncHJfZnJlZShzY29wZTEpOwotICBncHJfZnJlZShzY29wZTIpOwotICBncHJfZnJlZShsYWJlbDEpOwotICBncHJfZnJlZShsYWJlbDIpOwotICBncHJfZnJlZShwcmVmaXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSU5URUdSQVRJT04gR0xVRQotICovCi0KLXN0YXRpYyBjaGFyICpjaHR0cDJfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICp0KSB7Ci0gIHJldHVybiBncHJfc3RyZHVwKCgoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICopdCktPnBlZXJfc3RyaW5nKTsKLX0KLQotc3RhdGljIGNvbnN0IGdycGNfdHJhbnNwb3J0X3Z0YWJsZSB2dGFibGUgPSB7c2l6ZW9mKGdycGNfY2h0dHAyX3N0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2h0dHAyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3BvbGxzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtX3N0cmVhbV9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1fdHJhbnNwb3J0X29wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3RyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodHRwMl9nZXRfcGVlcn07Ci0KLWdycGNfdHJhbnNwb3J0ICpncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqY2hhbm5lbF9hcmdzLAotICAgIGdycGNfZW5kcG9pbnQgKmVwLCBpbnQgaXNfY2xpZW50KSB7Ci0gIGdycGNfY2h0dHAyX3RyYW5zcG9ydCAqdCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGdycGNfY2h0dHAyX3RyYW5zcG9ydCkpOwotICBpbml0X3RyYW5zcG9ydChleGVjX2N0eCwgdCwgY2hhbm5lbF9hcmdzLCBlcCwgaXNfY2xpZW50ICE9IDApOwotICByZXR1cm4gJnQtPmJhc2U7Ci19Ci0KLXZvaWQgZ3JwY19jaHR0cDJfdHJhbnNwb3J0X3N0YXJ0X3JlYWRpbmcoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSAqc2xpY2VzLCBzaXplX3QgbnNsaWNlcykgewotICBncnBjX2NodHRwMl90cmFuc3BvcnQgKnQgPSAoZ3JwY19jaHR0cDJfdHJhbnNwb3J0ICopdHJhbnNwb3J0OwotICBSRUZfVFJBTlNQT1JUKHQsICJyZWN2X2RhdGEiKTsgLyogbWF0Y2hlcyB1bnJlZiBpbnNpZGUgcmVjdl9kYXRhICovCi0gIGdwcl9zbGljZV9idWZmZXJfYWRkbigmdC0+cmVhZF9idWZmZXIsIHNsaWNlcywgbnNsaWNlcyk7Ci0gIHJlY3ZfZGF0YShleGVjX2N0eCwgdCwgMSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2Y2YwZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX0NIVFRQMl9UUkFOU1BPUlRfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmgiCi0KLWV4dGVybiBpbnQgZ3JwY19odHRwX3RyYWNlOwotZXh0ZXJuIGludCBncnBjX2Zsb3djdGxfdHJhY2U7Ci0KLWdycGNfdHJhbnNwb3J0ICpncnBjX2NyZWF0ZV9jaHR0cDJfdHJhbnNwb3J0KAotICAgIGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBjb25zdCBncnBjX2NoYW5uZWxfYXJncyAqY2hhbm5lbF9hcmdzLAotICAgIGdycGNfZW5kcG9pbnQgKmVwLCBpbnQgaXNfY2xpZW50KTsKLQotdm9pZCBncnBjX2NodHRwMl90cmFuc3BvcnRfc3RhcnRfcmVhZGluZyhncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ByX3NsaWNlICpzbGljZXMsIHNpemVfdCBuc2xpY2VzKTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfQ0hUVFAyX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzY1YjkuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLQotaW50IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNlID0gMDsKLQotY29uc3QgY2hhciAqZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbmFtZShncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdGF0ZSkgewotICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgY2FzZSBHUlBDX0NIQU5ORUxfSURMRToKLSAgICAgIHJldHVybiAiSURMRSI7Ci0gICAgY2FzZSBHUlBDX0NIQU5ORUxfQ09OTkVDVElORzoKLSAgICAgIHJldHVybiAiQ09OTkVDVElORyI7Ci0gICAgY2FzZSBHUlBDX0NIQU5ORUxfUkVBRFk6Ci0gICAgICByZXR1cm4gIlJFQURZIjsKLSAgICBjYXNlIEdSUENfQ0hBTk5FTF9UUkFOU0lFTlRfRkFJTFVSRToKLSAgICAgIHJldHVybiAiVFJBTlNJRU5UX0ZBSUxVUkUiOwotICAgIGNhc2UgR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU6Ci0gICAgICByZXR1cm4gIkZBVEFMX0ZBSUxVUkUiOwotICB9Ci0gIEdQUl9VTlJFQUNIQUJMRV9DT0RFKHJldHVybiAiVU5LTk9XTiIpOwotfQotCi12b2lkIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2luaXQoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBpbml0X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgdHJhY2tlci0+Y3VycmVudF9zdGF0ZSA9IGluaXRfc3RhdGU7Ci0gIHRyYWNrZXItPndhdGNoZXJzID0gTlVMTDsKLSAgdHJhY2tlci0+bmFtZSA9IGdwcl9zdHJkdXAobmFtZSk7Ci19Ci0KLXZvaWQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfZGVzdHJveShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyKSB7Ci0gIGludCBzdWNjZXNzOwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV93YXRjaGVyICp3OwotICB3aGlsZSAoKHcgPSB0cmFja2VyLT53YXRjaGVycykpIHsKLSAgICB0cmFja2VyLT53YXRjaGVycyA9IHctPm5leHQ7Ci0KLSAgICBpZiAoR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUgIT0gKnctPmN1cnJlbnQpIHsKLSAgICAgICp3LT5jdXJyZW50ID0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkU7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgdy0+bm90aWZ5LCBzdWNjZXNzLCBOVUxMKTsKLSAgICBncHJfZnJlZSh3KTsKLSAgfQotICBncHJfZnJlZSh0cmFja2VyLT5uYW1lKTsKLX0KLQotZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfY2hlY2soCi0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlcikgewotICBpZiAoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2UpIHsKLSAgICBncHJfbG9nKEdQUl9ERUJVRywgIkNPTldBVENIOiAlcCAlczogZ2V0ICVzIiwgdHJhY2tlciwgdHJhY2tlci0+bmFtZSwKLSAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25hbWUodHJhY2tlci0+Y3VycmVudF9zdGF0ZSkpOwotICB9Ci0gIHJldHVybiB0cmFja2VyLT5jdXJyZW50X3N0YXRlOwotfQotCi1pbnQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlciwKLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqY3VycmVudCwgZ3JwY19jbG9zdXJlICpub3RpZnkpIHsKLSAgaWYgKGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNlKSB7Ci0gICAgaWYgKGN1cnJlbnQgPT0gTlVMTCkgewotICAgICAgZ3ByX2xvZyhHUFJfREVCVUcsICJDT05XQVRDSDogJXAgJXM6IHVuc3Vic2NyaWJlIG5vdGlmeT0lcCIsIHRyYWNrZXIsCi0gICAgICAgICAgICAgIHRyYWNrZXItPm5hbWUsIG5vdGlmeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiQ09OV0FUQ0g6ICVwICVzOiBmcm9tICVzIFtjdXI9JXNdIG5vdGlmeT0lcCIsIHRyYWNrZXIsCi0gICAgICAgICAgICAgIHRyYWNrZXItPm5hbWUsIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25hbWUoKmN1cnJlbnQpLAotICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9uYW1lKHRyYWNrZXItPmN1cnJlbnRfc3RhdGUpLCBub3RpZnkpOwotICAgIH0KLSAgfQotICBpZiAoY3VycmVudCA9PSBOVUxMKSB7Ci0gICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfd2F0Y2hlciAqdyA9IHRyYWNrZXItPndhdGNoZXJzOwotICAgIGlmICh3ICE9IE5VTEwgJiYgdy0+bm90aWZ5ID09IG5vdGlmeSkgewotICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBub3RpZnksIGZhbHNlLCBOVUxMKTsKLSAgICAgIHRyYWNrZXItPndhdGNoZXJzID0gdy0+bmV4dDsKLSAgICAgIGdwcl9mcmVlKHcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHdoaWxlICh3ICE9IE5VTEwpIHsKLSAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgKnJtX2NhbmRpZGF0ZSA9IHctPm5leHQ7Ci0gICAgICBpZiAocm1fY2FuZGlkYXRlICE9IE5VTEwgJiYgcm1fY2FuZGlkYXRlLT5ub3RpZnkgPT0gbm90aWZ5KSB7Ci0gICAgICAgIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgbm90aWZ5LCBmYWxzZSwgTlVMTCk7Ci0gICAgICAgIHctPm5leHQgPSB3LT5uZXh0LT5uZXh0OwotICAgICAgICBncHJfZnJlZShybV9jYW5kaWRhdGUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHcgPSB3LT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICBpZiAodHJhY2tlci0+Y3VycmVudF9zdGF0ZSAhPSAqY3VycmVudCkgewotICAgICAgKmN1cnJlbnQgPSB0cmFja2VyLT5jdXJyZW50X3N0YXRlOwotICAgICAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBub3RpZnksIHRydWUsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV93YXRjaGVyICp3ID0gZ3ByX21hbGxvYyhzaXplb2YoKncpKTsKLSAgICAgIHctPmN1cnJlbnQgPSBjdXJyZW50OwotICAgICAgdy0+bm90aWZ5ID0gbm90aWZ5OwotICAgICAgdy0+bmV4dCA9IHRyYWNrZXItPndhdGNoZXJzOwotICAgICAgdHJhY2tlci0+d2F0Y2hlcnMgPSB3OwotICAgIH0KLSAgICByZXR1cm4gdHJhY2tlci0+Y3VycmVudF9zdGF0ZSA9PSBHUlBDX0NIQU5ORUxfSURMRTsKLSAgfQotfQotCi12b2lkIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3NldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3RyYWNrZXIgKnRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV93YXRjaGVyICp3OwotICBpZiAoZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2UpIHsKLSAgICBncHJfbG9nKEdQUl9ERUJVRywgIlNFVDogJXAgJXM6ICVzIC0tPiAlcyBbJXNdIiwgdHJhY2tlciwgdHJhY2tlci0+bmFtZSwKLSAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX25hbWUodHJhY2tlci0+Y3VycmVudF9zdGF0ZSksCi0gICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9uYW1lKHN0YXRlKSwgcmVhc29uKTsKLSAgfQotICBpZiAodHJhY2tlci0+Y3VycmVudF9zdGF0ZSA9PSBzdGF0ZSkgewotICAgIHJldHVybjsKLSAgfQotICBHUFJfQVNTRVJUKHRyYWNrZXItPmN1cnJlbnRfc3RhdGUgIT0gR1JQQ19DSEFOTkVMX0ZBVEFMX0ZBSUxVUkUpOwotICB0cmFja2VyLT5jdXJyZW50X3N0YXRlID0gc3RhdGU7Ci0gIHdoaWxlICgodyA9IHRyYWNrZXItPndhdGNoZXJzKSAhPSBOVUxMKSB7Ci0gICAgKnctPmN1cnJlbnQgPSB0cmFja2VyLT5jdXJyZW50X3N0YXRlOwotICAgIHRyYWNrZXItPndhdGNoZXJzID0gdy0+bmV4dDsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIHctPm5vdGlmeSwgdHJ1ZSwgTlVMTCk7Ci0gICAgZ3ByX2ZyZWUodyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhM2NlOS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfQ09OTkVDVElWSVRZX1NUQVRFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9DT05ORUNUSVZJVFlfU1RBVEVfSAotCi0jaW5jbHVkZSA8Z3JwYy9ncnBjLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfd2F0Y2hlciB7Ci0gIC8qKiB3ZSBrZWVwIHdhdGNoZXJzIGluIGEgbGlua2VkIGxpc3QgKi8KLSAgc3RydWN0IGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX3dhdGNoZXIgKm5leHQ7Ci0gIC8qKiBjbG9zdXJlIHRvIG5vdGlmeSBvbiBjaGFuZ2UgKi8KLSAgZ3JwY19jbG9zdXJlICpub3RpZnk7Ci0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBhcyBiZWxpZXZlZCBieSB0aGUgd2F0Y2hlciAqLwotICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqY3VycmVudDsKLX0gZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfd2F0Y2hlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiogY3VycmVudCBjb25uZWN0aXZpdHkgc3RhdGUgKi8KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgY3VycmVudF9zdGF0ZTsKLSAgLyoqIGFsbCBvdXIgd2F0Y2hlcnMgKi8KLSAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfd2F0Y2hlciAqd2F0Y2hlcnM7Ci0gIC8qKiBhIG5hbWUgdG8gaGVscCBkZWJ1Z2dpbmcgKi8KLSAgY2hhciAqbmFtZTsKLX0gZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlcjsKLQotZXh0ZXJuIGludCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFjZTsKLQotY29uc3QgY2hhciAqZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbmFtZShncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBzdGF0ZSk7Ci0KLXZvaWQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfaW5pdChncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlIGluaXRfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlX2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlcik7Ci0KLS8qKiBTZXQgY29ubmVjdGl2aXR5IHN0YXRlOyBub3QgdGhyZWFkIHNhZmU7IGFjY2VzcyBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCBhbgotICogZXh0ZXJuYWwgbG9jayAqLwotdm9pZCBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9zZXQoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwotCi1ncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGVjaygKLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZV90cmFja2VyICp0cmFja2VyKTsKLQotLyoqIFJldHVybiAxIGlmIHRoZSBjaGFubmVsIHNob3VsZCBzdGFydCBjb25uZWN0aW5nLCAwIG90aGVyd2lzZS4KLSAgICBJZiBjdXJyZW50PT1OVUxMIGNhbmNlbCBub3RpZnkgaWYgaXQgaXMgYWxyZWFkeSBxdWV1ZWQgKHN1Y2Nlc3M9PTAgaW4gdGhhdAotICAgIGNhc2UpICovCi1pbnQgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfbm90aWZ5X29uX3N0YXRlX2NoYW5nZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY19jb25uZWN0aXZpdHlfc3RhdGVfdHJhY2tlciAqdHJhY2tlciwKLSAgICBncnBjX2Nvbm5lY3Rpdml0eV9zdGF0ZSAqY3VycmVudCwgZ3JwY19jbG9zdXJlICpub3RpZnkpOwotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RSQU5TUE9SVF9DT05ORUNUSVZJVFlfU1RBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkMjhmZS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDY5OCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvY29tcHJlc3Npb24uaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21ncl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L211cm11cl9oYXNoLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgotCi0vKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIG1kZWxlbSBhbmQgbWRzdHIgaW5zdGFuY2VzLgotICogU3RhdGljIGluc3RhbmNlcyBhcmUgZGVjbGFyZWQgaW4gc3RhdGljX21ldGFkYXRhLntoLGN9IGFuZAotICogYXJlIGluaXRpYWxpemVkIGJ5IGdycGNfbWRjdHhfZ2xvYmFsX2luaXQoKS4KLSAqIER5bmFtaWMgaW5zdGFuY2VzIGFyZSBzdG9yZWQgaW4gaGFzaCB0YWJsZXMgb24gZ3JwY19tZGN0eCwgYW5kIGFyZSBiYWNrZWQKLSAqIGJ5IGludGVybmFsX3N0cmluZyBhbmQgaW50ZXJuYWxfZWxlbWVudCBzdHJ1Y3R1cmVzLgotICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBoZXJlLWluIChpc19tZHN0cl9zdGF0aWMsIGlzX21kZWxlbV9zdGF0aWMpIGFyZQotICogdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gga2luZCBvZiBlbGVtZW50IGEgcG9pbnRlciByZWZlcnMgdG8uCi0gKi8KLQotI2RlZmluZSBJTklUSUFMX1NUUlRBQl9DQVBBQ0lUWSA0Ci0jZGVmaW5lIElOSVRJQUxfTURUQUJfQ0FQQUNJVFkgNAotCi0jaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRwotI2RlZmluZSBERUJVR19BUkdTICwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUKLSNkZWZpbmUgRldEX0RFQlVHX0FSR1MgLCBmaWxlLCBsaW5lCi0jZGVmaW5lIFJFRl9NRF9MT0NLRUQoc2hhcmQsIHMpIHJlZl9tZF9sb2NrZWQoKHNoYXJkKSwgKHMpLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZWxzZQotI2RlZmluZSBERUJVR19BUkdTCi0jZGVmaW5lIEZXRF9ERUJVR19BUkdTCi0jZGVmaW5lIFJFRl9NRF9MT0NLRUQoc2hhcmQsIHMpIHJlZl9tZF9sb2NrZWQoKHNoYXJkKSwgKHMpKQotI2VuZGlmCi0KLSNkZWZpbmUgVEFCTEVfSURYKGhhc2gsIGxvZzJfc2hhcmRzLCBjYXBhY2l0eSkgXAotICAoKChoYXNoKSA+PiAobG9nMl9zaGFyZHMpKSAlIChjYXBhY2l0eSkpCi0jZGVmaW5lIFNIQVJEX0lEWChoYXNoLCBsb2cyX3NoYXJkcykgKChoYXNoKSAmICgoMSA8PCAobG9nMl9zaGFyZHMpKSAtIDEpKQotCi10eXBlZGVmIHZvaWQgKCpkZXN0cm95X3VzZXJfZGF0YV9mdW5jKSh2b2lkICp1c2VyX2RhdGEpOwotCi0vKiBTaGFkb3cgc3RydWN0dXJlIGZvciBncnBjX21kc3RyIGZvciBub24tc3RhdGljIHZhbHVlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RyaW5nIHsKLSAgLyogbXVzdCBiZSBieXRlIGNvbXBhdGlibGUgd2l0aCBncnBjX21kc3RyICovCi0gIGdwcl9zbGljZSBzbGljZTsKLSAgdWludDMyX3QgaGFzaDsKLQotICAvKiBwcml2YXRlIG9ubHkgZGF0YSAqLwotICBncHJfYXRtIHJlZmNudDsKLQotICB1aW50OF90IGhhc19iYXNlNjRfYW5kX2h1ZmZtYW5fZW5jb2RlZDsKLSAgZ3ByX3NsaWNlX3JlZmNvdW50IHJlZmNvdW50OwotCi0gIGdwcl9zbGljZSBiYXNlNjRfYW5kX2h1ZmZtYW47Ci0KLSAgc3RydWN0IGludGVybmFsX3N0cmluZyAqYnVja2V0X25leHQ7Ci19IGludGVybmFsX3N0cmluZzsKLQotLyogU2hhZG93IHN0cnVjdHVyZSBmb3IgZ3JwY19tZGVsZW0gZm9yIG5vbi1zdGF0aWMgZWxlbWVudHMgKi8KLXR5cGVkZWYgc3RydWN0IGludGVybmFsX21ldGFkYXRhIHsKLSAgLyogbXVzdCBiZSBieXRlIGNvbXBhdGlibGUgd2l0aCBncnBjX21kZWxlbSAqLwotICBpbnRlcm5hbF9zdHJpbmcgKmtleTsKLSAgaW50ZXJuYWxfc3RyaW5nICp2YWx1ZTsKLQotICAvKiBwcml2YXRlIG9ubHkgZGF0YSAqLwotICBncHJfYXRtIHJlZmNudDsKLQotICBncHJfbXUgbXVfdXNlcl9kYXRhOwotICBncHJfYXRtIGRlc3Ryb3lfdXNlcl9kYXRhOwotICBncHJfYXRtIHVzZXJfZGF0YTsKLQotICBzdHJ1Y3QgaW50ZXJuYWxfbWV0YWRhdGEgKmJ1Y2tldF9uZXh0OwotfSBpbnRlcm5hbF9tZXRhZGF0YTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3RydGFiX3NoYXJkIHsKLSAgZ3ByX211IG11OwotICBpbnRlcm5hbF9zdHJpbmcgKipzdHJzOwotICBzaXplX3QgY291bnQ7Ci0gIHNpemVfdCBjYXBhY2l0eTsKLX0gc3RydGFiX3NoYXJkOwotCi10eXBlZGVmIHN0cnVjdCBtZHRhYl9zaGFyZCB7Ci0gIGdwcl9tdSBtdTsKLSAgaW50ZXJuYWxfbWV0YWRhdGEgKiplbGVtczsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgY2FwYWNpdHk7Ci0gIHNpemVfdCBmcmVlOwotfSBtZHRhYl9zaGFyZDsKLQotI2RlZmluZSBMT0cyX1NUUlRBQl9TSEFSRF9DT1VOVCA1Ci0jZGVmaW5lIExPRzJfTURUQUJfU0hBUkRfQ09VTlQgNAotI2RlZmluZSBTVFJUQUJfU0hBUkRfQ09VTlQgKChzaXplX3QpKDEgPDwgTE9HMl9TVFJUQUJfU0hBUkRfQ09VTlQpKQotI2RlZmluZSBNRFRBQl9TSEFSRF9DT1VOVCAoKHNpemVfdCkoMSA8PCBMT0cyX01EVEFCX1NIQVJEX0NPVU5UKSkKLQotLyogaGFzaCBzZWVkOiBkZWNpZGVkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgKi8KLXN0YXRpYyB1aW50MzJfdCBnX2hhc2hfc2VlZDsKLXN0YXRpYyBpbnQgZ19mb3JjZWRfaGFzaF9zZWVkID0gMDsKLQotLyogbGluZWFybHkgcHJvYmVkIGhhc2ggdGFibGVzIGZvciBzdGF0aWMgZWxlbWVudCBsb29rdXAgKi8KLXN0YXRpYyBncnBjX21kc3RyICpnX3N0YXRpY19zdHJ0YWJbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlQgKiAyXTsKLXN0YXRpYyBncnBjX21kZWxlbSAqZ19zdGF0aWNfbWR0YWJbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UICogMl07Ci1zdGF0aWMgc2l6ZV90IGdfc3RhdGljX3N0cnRhYl9tYXhwcm9iZTsKLXN0YXRpYyBzaXplX3QgZ19zdGF0aWNfbWR0YWJfbWF4cHJvYmU7Ci0KLXN0YXRpYyBzdHJ0YWJfc2hhcmQgZ19zdHJ0YWJfc2hhcmRbU1RSVEFCX1NIQVJEX0NPVU5UXTsKLXN0YXRpYyBtZHRhYl9zaGFyZCBnX21kdGFiX3NoYXJkW01EVEFCX1NIQVJEX0NPVU5UXTsKLQotc3RhdGljIHZvaWQgZ2NfbWR0YWIobWR0YWJfc2hhcmQgKnNoYXJkKTsKLQotdm9pZCBncnBjX3Rlc3Rfb25seV9zZXRfbWV0YWRhdGFfaGFzaF9zZWVkKHVpbnQzMl90IHNlZWQpIHsKLSAgZ19oYXNoX3NlZWQgPSBzZWVkOwotICBnX2ZvcmNlZF9oYXNoX3NlZWQgPSAxOwotfQotCi12b2lkIGdycGNfbWRjdHhfZ2xvYmFsX2luaXQodm9pZCkgewotICBzaXplX3QgaSwgajsKLSAgaWYgKCFnX2ZvcmNlZF9oYXNoX3NlZWQpIHsKLSAgICBnX2hhc2hfc2VlZCA9ICh1aW50MzJfdClncHJfbm93KEdQUl9DTE9DS19SRUFMVElNRSkudHZfbnNlYzsKLSAgfQotICBnX3N0YXRpY19zdHJ0YWJfbWF4cHJvYmUgPSAwOwotICBnX3N0YXRpY19tZHRhYl9tYXhwcm9iZSA9IDA7Ci0gIC8qIGJ1aWxkIHN0YXRpYyB0YWJsZXMgKi8KLSAgbWVtc2V0KGdfc3RhdGljX21kdGFiLCAwLCBzaXplb2YoZ19zdGF0aWNfbWR0YWIpKTsKLSAgbWVtc2V0KGdfc3RhdGljX3N0cnRhYiwgMCwgc2l6ZW9mKGdfc3RhdGljX3N0cnRhYikpOwotICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19TVEFUSUNfTURTVFJfQ09VTlQ7IGkrKykgewotICAgIGdycGNfbWRzdHIgKmVsZW0gPSAmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbaV07Ci0gICAgY29uc3QgY2hhciAqc3RyID0gZ3JwY19zdGF0aWNfbWV0YWRhdGFfc3RyaW5nc1tpXTsKLSAgICB1aW50MzJfdCBoYXNoID0gZ3ByX211cm11cl9oYXNoMyhzdHIsIHN0cmxlbihzdHIpLCBnX2hhc2hfc2VlZCk7Ci0gICAgKihncHJfc2xpY2UgKikmZWxlbS0+c2xpY2UgPSBncHJfc2xpY2VfZnJvbV9zdGF0aWNfc3RyaW5nKHN0cik7Ci0gICAgKih1aW50MzJfdCAqKSZlbGVtLT5oYXNoID0gaGFzaDsKLSAgICBmb3IgKGogPSAwOzsgaisrKSB7Ci0gICAgICBzaXplX3QgaWR4ID0gKGhhc2ggKyBqKSAlIEdQUl9BUlJBWV9TSVpFKGdfc3RhdGljX3N0cnRhYik7Ci0gICAgICBpZiAoZ19zdGF0aWNfc3RydGFiW2lkeF0gPT0gTlVMTCkgewotICAgICAgICBnX3N0YXRpY19zdHJ0YWJbaWR4XSA9ICZncnBjX3N0YXRpY19tZHN0cl90YWJsZVtpXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChqID4gZ19zdGF0aWNfc3RydGFiX21heHByb2JlKSB7Ci0gICAgICBnX3N0YXRpY19zdHJ0YWJfbWF4cHJvYmUgPSBqOwotICAgIH0KLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UOyBpKyspIHsKLSAgICBncnBjX21kZWxlbSAqZWxlbSA9ICZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbaV07Ci0gICAgZ3JwY19tZHN0ciAqa2V5ID0KLSAgICAgICAgJmdycGNfc3RhdGljX21kc3RyX3RhYmxlW2dycGNfc3RhdGljX21ldGFkYXRhX2VsZW1faW5kaWNlc1syICogaSArIDBdXTsKLSAgICBncnBjX21kc3RyICp2YWx1ZSA9Ci0gICAgICAgICZncnBjX3N0YXRpY19tZHN0cl90YWJsZVtncnBjX3N0YXRpY19tZXRhZGF0YV9lbGVtX2luZGljZXNbMiAqIGkgKyAxXV07Ci0gICAgdWludDMyX3QgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChrZXktPmhhc2gsIHZhbHVlLT5oYXNoKTsKLSAgICAqKGdycGNfbWRzdHIgKiopJmVsZW0tPmtleSA9IGtleTsKLSAgICAqKGdycGNfbWRzdHIgKiopJmVsZW0tPnZhbHVlID0gdmFsdWU7Ci0gICAgZm9yIChqID0gMDs7IGorKykgewotICAgICAgc2l6ZV90IGlkeCA9IChoYXNoICsgaikgJSBHUFJfQVJSQVlfU0laRShnX3N0YXRpY19tZHRhYik7Ci0gICAgICBpZiAoZ19zdGF0aWNfbWR0YWJbaWR4XSA9PSBOVUxMKSB7Ci0gICAgICAgIGdfc3RhdGljX21kdGFiW2lkeF0gPSBlbGVtOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGogPiBnX3N0YXRpY19tZHRhYl9tYXhwcm9iZSkgewotICAgICAgZ19zdGF0aWNfbWR0YWJfbWF4cHJvYmUgPSBqOwotICAgIH0KLSAgfQotICAvKiBpbml0aWFsaXplIHNoYXJkcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgU1RSVEFCX1NIQVJEX0NPVU5UOyBpKyspIHsKLSAgICBzdHJ0YWJfc2hhcmQgKnNoYXJkID0gJmdfc3RydGFiX3NoYXJkW2ldOwotICAgIGdwcl9tdV9pbml0KCZzaGFyZC0+bXUpOwotICAgIHNoYXJkLT5jb3VudCA9IDA7Ci0gICAgc2hhcmQtPmNhcGFjaXR5ID0gSU5JVElBTF9TVFJUQUJfQ0FQQUNJVFk7Ci0gICAgc2hhcmQtPnN0cnMgPSBncHJfbWFsbG9jKHNpemVvZigqc2hhcmQtPnN0cnMpICogc2hhcmQtPmNhcGFjaXR5KTsKLSAgICBtZW1zZXQoc2hhcmQtPnN0cnMsIDAsIHNpemVvZigqc2hhcmQtPnN0cnMpICogc2hhcmQtPmNhcGFjaXR5KTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgTURUQUJfU0hBUkRfQ09VTlQ7IGkrKykgewotICAgIG1kdGFiX3NoYXJkICpzaGFyZCA9ICZnX21kdGFiX3NoYXJkW2ldOwotICAgIGdwcl9tdV9pbml0KCZzaGFyZC0+bXUpOwotICAgIHNoYXJkLT5jb3VudCA9IDA7Ci0gICAgc2hhcmQtPmZyZWUgPSAwOwotICAgIHNoYXJkLT5jYXBhY2l0eSA9IElOSVRJQUxfTURUQUJfQ0FQQUNJVFk7Ci0gICAgc2hhcmQtPmVsZW1zID0gZ3ByX21hbGxvYyhzaXplb2YoKnNoYXJkLT5lbGVtcykgKiBzaGFyZC0+Y2FwYWNpdHkpOwotICAgIG1lbXNldChzaGFyZC0+ZWxlbXMsIDAsIHNpemVvZigqc2hhcmQtPmVsZW1zKSAqIHNoYXJkLT5jYXBhY2l0eSk7Ci0gIH0KLX0KLQotdm9pZCBncnBjX21kY3R4X2dsb2JhbF9zaHV0ZG93bih2b2lkKSB7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgTURUQUJfU0hBUkRfQ09VTlQ7IGkrKykgewotICAgIG1kdGFiX3NoYXJkICpzaGFyZCA9ICZnX21kdGFiX3NoYXJkW2ldOwotICAgIGdwcl9tdV9kZXN0cm95KCZzaGFyZC0+bXUpOwotICAgIGdjX21kdGFiKHNoYXJkKTsKLSAgICAvKiBUT0RPKGN0aWxsZXIpOiBHUFJfQVNTRVJUKHNoYXJkLT5jb3VudCA9PSAwKTsgKi8KLSAgICBpZiAoc2hhcmQtPmNvdW50ICE9IDApIHsKLSAgICAgIGdwcl9sb2coR1BSX0RFQlVHLCAiV0FSTklORzogJWQgbWV0YWRhdGEgZWxlbWVudHMgd2VyZSBsZWFrZWQiLAotICAgICAgICAgICAgICBzaGFyZC0+Y291bnQpOwotICAgICAgaWYgKGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3MoKSkgewotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgIH0KLSAgICBncHJfZnJlZShzaGFyZC0+ZWxlbXMpOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBTVFJUQUJfU0hBUkRfQ09VTlQ7IGkrKykgewotICAgIHN0cnRhYl9zaGFyZCAqc2hhcmQgPSAmZ19zdHJ0YWJfc2hhcmRbaV07Ci0gICAgZ3ByX211X2Rlc3Ryb3koJnNoYXJkLT5tdSk7Ci0gICAgLyogVE9ETyhjdGlsbGVyKTogR1BSX0FTU0VSVChzaGFyZC0+Y291bnQgPT0gMCk7ICovCi0gICAgaWYgKHNoYXJkLT5jb3VudCAhPSAwKSB7Ci0gICAgICBncHJfbG9nKEdQUl9ERUJVRywgIldBUk5JTkc6ICVkIG1ldGFkYXRhIHN0cmluZ3Mgd2VyZSBsZWFrZWQiLAotICAgICAgICAgICAgICBzaGFyZC0+Y291bnQpOwotICAgICAgaWYgKGdycGNfaW9tZ3JfYWJvcnRfb25fbGVha3MoKSkgewotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgIH0KLSAgICBncHJfZnJlZShzaGFyZC0+c3Rycyk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBpc19tZHN0cl9zdGF0aWMoZ3JwY19tZHN0ciAqcykgewotICByZXR1cm4gcyA+PSAmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMF0gJiYKLSAgICAgICAgIHMgPCAmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbR1JQQ19TVEFUSUNfTURTVFJfQ09VTlRdOwotfQotCi1zdGF0aWMgaW50IGlzX21kZWxlbV9zdGF0aWMoZ3JwY19tZGVsZW0gKmUpIHsKLSAgcmV0dXJuIGUgPj0gJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVswXSAmJgotICAgICAgICAgZSA8ICZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbR1JQQ19TVEFUSUNfTURFTEVNX0NPVU5UXTsKLX0KLQotc3RhdGljIHZvaWQgcmVmX21kX2xvY2tlZChtZHRhYl9zaGFyZCAqc2hhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX21ldGFkYXRhICptZCBERUJVR19BUkdTKSB7Ci0jaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRwotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCi0gICAgICAgICAgIkVMTSAgIFJFRjolcDolZC0+JWQ6ICclcycgPSAnJXMnIiwgbWQsCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpLAotICAgICAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+cmVmY250KSArIDEsCi0gICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZygoZ3JwY19tZHN0ciAqKW1kLT5rZXkpLAotICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcoKGdycGNfbWRzdHIgKiltZC0+dmFsdWUpKTsKLSNlbmRpZgotICBpZiAoMCA9PSBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZtZC0+cmVmY250LCAyKSkgewotICAgIHNoYXJkLT5mcmVlLS07Ci0gIH0gZWxzZSB7Ci0gICAgR1BSX0FTU0VSVCgxICE9IGdwcl9hdG1fbm9fYmFycmllcl9mZXRjaF9hZGQoJm1kLT5yZWZjbnQsIC0xKSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZ3Jvd19zdHJ0YWIoc3RydGFiX3NoYXJkICpzaGFyZCkgewotICBzaXplX3QgY2FwYWNpdHkgPSBzaGFyZC0+Y2FwYWNpdHkgKiAyOwotICBzaXplX3QgaTsKLSAgaW50ZXJuYWxfc3RyaW5nICoqc3RydGFiOwotICBpbnRlcm5hbF9zdHJpbmcgKnMsICpuZXh0OwotCi0gIEdQUl9USU1FUl9CRUdJTigiZ3Jvd19zdHJ0YWIiLCAwKTsKLQotICBzdHJ0YWIgPSBncHJfbWFsbG9jKHNpemVvZihpbnRlcm5hbF9zdHJpbmcgKikgKiBjYXBhY2l0eSk7Ci0gIG1lbXNldChzdHJ0YWIsIDAsIHNpemVvZihpbnRlcm5hbF9zdHJpbmcgKikgKiBjYXBhY2l0eSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNoYXJkLT5jYXBhY2l0eTsgaSsrKSB7Ci0gICAgZm9yIChzID0gc2hhcmQtPnN0cnNbaV07IHM7IHMgPSBuZXh0KSB7Ci0gICAgICBzaXplX3QgaWR4ID0gVEFCTEVfSURYKHMtPmhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5ULCBjYXBhY2l0eSk7Ci0gICAgICBuZXh0ID0gcy0+YnVja2V0X25leHQ7Ci0gICAgICBzLT5idWNrZXRfbmV4dCA9IHN0cnRhYltpZHhdOwotICAgICAgc3RydGFiW2lkeF0gPSBzOwotICAgIH0KLSAgfQotCi0gIGdwcl9mcmVlKHNoYXJkLT5zdHJzKTsKLSAgc2hhcmQtPnN0cnMgPSBzdHJ0YWI7Ci0gIHNoYXJkLT5jYXBhY2l0eSA9IGNhcGFjaXR5OwotCi0gIEdQUl9USU1FUl9FTkQoImdyb3dfc3RydGFiIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVybmFsX2Rlc3Ryb3lfc3RyaW5nKHN0cnRhYl9zaGFyZCAqc2hhcmQsIGludGVybmFsX3N0cmluZyAqaXMpIHsKLSAgaW50ZXJuYWxfc3RyaW5nICoqcHJldl9uZXh0OwotICBpbnRlcm5hbF9zdHJpbmcgKmN1cjsKLSAgR1BSX1RJTUVSX0JFR0lOKCJpbnRlcm5hbF9kZXN0cm95X3N0cmluZyIsIDApOwotICBpZiAoaXMtPmhhc19iYXNlNjRfYW5kX2h1ZmZtYW5fZW5jb2RlZCkgewotICAgIGdwcl9zbGljZV91bnJlZihpcy0+YmFzZTY0X2FuZF9odWZmbWFuKTsKLSAgfQotICBmb3IgKHByZXZfbmV4dCA9ICZzaGFyZC0+c3Ryc1tUQUJMRV9JRFgoaXMtPmhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmQtPmNhcGFjaXR5KV0sCi0gICAgICBjdXIgPSAqcHJldl9uZXh0OwotICAgICAgIGN1ciAhPSBpczsgcHJldl9uZXh0ID0gJmN1ci0+YnVja2V0X25leHQsIGN1ciA9IGN1ci0+YnVja2V0X25leHQpCi0gICAgOwotICAqcHJldl9uZXh0ID0gY3VyLT5idWNrZXRfbmV4dDsKLSAgc2hhcmQtPmNvdW50LS07Ci0gIGdwcl9mcmVlKGlzKTsKLSAgR1BSX1RJTUVSX0VORCgiaW50ZXJuYWxfZGVzdHJveV9zdHJpbmciLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2xpY2VfcmVmKHZvaWQgKnApIHsKLSAgaW50ZXJuYWxfc3RyaW5nICppcyA9Ci0gICAgICAoaW50ZXJuYWxfc3RyaW5nICopKChjaGFyICopcCAtIG9mZnNldG9mKGludGVybmFsX3N0cmluZywgcmVmY291bnQpKTsKLSAgR1JQQ19NRFNUUl9SRUYoKGdycGNfbWRzdHIgKikoaXMpKTsKLX0KLQotc3RhdGljIHZvaWQgc2xpY2VfdW5yZWYodm9pZCAqcCkgewotICBpbnRlcm5hbF9zdHJpbmcgKmlzID0KLSAgICAgIChpbnRlcm5hbF9zdHJpbmcgKikoKGNoYXIgKilwIC0gb2Zmc2V0b2YoaW50ZXJuYWxfc3RyaW5nLCByZWZjb3VudCkpOwotICBHUlBDX01EU1RSX1VOUkVGKChncnBjX21kc3RyICopKGlzKSk7Ci19Ci0KLWdycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKSB7Ci0gIHJldHVybiBncnBjX21kc3RyX2Zyb21fYnVmZmVyKChjb25zdCB1aW50OF90ICopc3RyLCBzdHJsZW4oc3RyKSk7Ci19Ci0KLWdycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9zbGljZShncHJfc2xpY2Ugc2xpY2UpIHsKLSAgZ3JwY19tZHN0ciAqcmVzdWx0ID0gZ3JwY19tZHN0cl9mcm9tX2J1ZmZlcihHUFJfU0xJQ0VfU1RBUlRfUFRSKHNsaWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFJfU0xJQ0VfTEVOR1RIKHNsaWNlKSk7Ci0gIGdwcl9zbGljZV91bnJlZihzbGljZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWdycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9idWZmZXIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHVpbnQzMl90IGhhc2ggPSBncHJfbXVybXVyX2hhc2gzKGJ1ZiwgbGVuZ3RoLCBnX2hhc2hfc2VlZCk7Ci0gIGludGVybmFsX3N0cmluZyAqczsKLSAgc3RydGFiX3NoYXJkICpzaGFyZCA9Ci0gICAgICAmZ19zdHJ0YWJfc2hhcmRbU0hBUkRfSURYKGhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5UKV07Ci0gIHNpemVfdCBpOwotICBzaXplX3QgaWR4OwotCi0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19tZHN0cl9mcm9tX2J1ZmZlciIsIDApOwotCi0gIC8qIHNlYXJjaCBmb3IgYSBzdGF0aWMgc3RyaW5nICovCi0gIGZvciAoaSA9IDA7IGkgPD0gZ19zdGF0aWNfc3RydGFiX21heHByb2JlOyBpKyspIHsKLSAgICBncnBjX21kc3RyICpzczsKLSAgICBpZHggPSAoaGFzaCArIGkpICUgR1BSX0FSUkFZX1NJWkUoZ19zdGF0aWNfc3RydGFiKTsKLSAgICBzcyA9IGdfc3RhdGljX3N0cnRhYltpZHhdOwotICAgIGlmIChzcyA9PSBOVUxMKSBicmVhazsKLSAgICBpZiAoc3MtPmhhc2ggPT0gaGFzaCAmJiBHUFJfU0xJQ0VfTEVOR1RIKHNzLT5zbGljZSkgPT0gbGVuZ3RoICYmCi0gICAgICAgIDAgPT0gbWVtY21wKGJ1ZiwgR1BSX1NMSUNFX1NUQVJUX1BUUihzcy0+c2xpY2UpLCBsZW5ndGgpKSB7Ci0gICAgICBHUFJfVElNRVJfRU5EKCJncnBjX21kc3RyX2Zyb21fYnVmZmVyIiwgMCk7Ci0gICAgICByZXR1cm4gc3M7Ci0gICAgfQotICB9Ci0KLSAgZ3ByX211X2xvY2soJnNoYXJkLT5tdSk7Ci0KLSAgLyogc2VhcmNoIGZvciBhbiBleGlzdGluZyBzdHJpbmcgKi8KLSAgaWR4ID0gVEFCTEVfSURYKGhhc2gsIExPRzJfU1RSVEFCX1NIQVJEX0NPVU5ULCBzaGFyZC0+Y2FwYWNpdHkpOwotICBmb3IgKHMgPSBzaGFyZC0+c3Ryc1tpZHhdOyBzOyBzID0gcy0+YnVja2V0X25leHQpIHsKLSAgICBpZiAocy0+aGFzaCA9PSBoYXNoICYmIEdQUl9TTElDRV9MRU5HVEgocy0+c2xpY2UpID09IGxlbmd0aCAmJgotICAgICAgICAwID09IG1lbWNtcChidWYsIEdQUl9TTElDRV9TVEFSVF9QVFIocy0+c2xpY2UpLCBsZW5ndGgpKSB7Ci0gICAgICBHUlBDX01EU1RSX1JFRigoZ3JwY19tZHN0ciAqKXMpOwotICAgICAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKLSAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfbWRzdHJfZnJvbV9idWZmZXIiLCAwKTsKLSAgICAgIHJldHVybiAoZ3JwY19tZHN0ciAqKXM7Ci0gICAgfQotICB9Ci0KLSAgLyogbm90IGZvdW5kOiBjcmVhdGUgYSBuZXcgc3RyaW5nICovCi0gIGlmIChsZW5ndGggKyAxIDwgR1BSX1NMSUNFX0lOTElORURfU0laRSkgewotICAgIC8qIHN0cmluZyBkYXRhIGdvZXMgZGlyZWN0bHkgaW50byB0aGUgc2xpY2UgKi8KLSAgICBzID0gZ3ByX21hbGxvYyhzaXplb2YoaW50ZXJuYWxfc3RyaW5nKSk7Ci0gICAgZ3ByX2F0bV9yZWxfc3RvcmUoJnMtPnJlZmNudCwgMik7Ci0gICAgcy0+c2xpY2UucmVmY291bnQgPSBOVUxMOwotICAgIG1lbWNweShzLT5zbGljZS5kYXRhLmlubGluZWQuYnl0ZXMsIGJ1ZiwgbGVuZ3RoKTsKLSAgICBzLT5zbGljZS5kYXRhLmlubGluZWQuYnl0ZXNbbGVuZ3RoXSA9IDA7Ci0gICAgcy0+c2xpY2UuZGF0YS5pbmxpbmVkLmxlbmd0aCA9ICh1aW50OF90KWxlbmd0aDsKLSAgfSBlbHNlIHsKLSAgICAvKiBzdHJpbmcgZGF0YSBnb2VzIGFmdGVyIHRoZSBpbnRlcm5hbF9zdHJpbmcgaGVhZGVyLCBhbmQgd2UgKzEgZm9yIG51bGwKLSAgICAgICB0ZXJtaW5hdG9yICovCi0gICAgcyA9IGdwcl9tYWxsb2Moc2l6ZW9mKGludGVybmFsX3N0cmluZykgKyBsZW5ndGggKyAxKTsKLSAgICBncHJfYXRtX3JlbF9zdG9yZSgmcy0+cmVmY250LCAyKTsKLSAgICBzLT5yZWZjb3VudC5yZWYgPSBzbGljZV9yZWY7Ci0gICAgcy0+cmVmY291bnQudW5yZWYgPSBzbGljZV91bnJlZjsKLSAgICBzLT5zbGljZS5yZWZjb3VudCA9ICZzLT5yZWZjb3VudDsKLSAgICBzLT5zbGljZS5kYXRhLnJlZmNvdW50ZWQuYnl0ZXMgPSAodWludDhfdCAqKShzICsgMSk7Ci0gICAgcy0+c2xpY2UuZGF0YS5yZWZjb3VudGVkLmxlbmd0aCA9IGxlbmd0aDsKLSAgICBtZW1jcHkocy0+c2xpY2UuZGF0YS5yZWZjb3VudGVkLmJ5dGVzLCBidWYsIGxlbmd0aCk7Ci0gICAgLyogYWRkIGEgbnVsbCB0ZXJtaW5hdG9yIGZvciBjaGVhcCBjIHN0cmluZyBjb252ZXJzaW9uIHdoZW4gZGVzaXJlZCAqLwotICAgIHMtPnNsaWNlLmRhdGEucmVmY291bnRlZC5ieXRlc1tsZW5ndGhdID0gMDsKLSAgfQotICBzLT5oYXNfYmFzZTY0X2FuZF9odWZmbWFuX2VuY29kZWQgPSAwOwotICBzLT5oYXNoID0gaGFzaDsKLSAgcy0+YnVja2V0X25leHQgPSBzaGFyZC0+c3Ryc1tpZHhdOwotICBzaGFyZC0+c3Ryc1tpZHhdID0gczsKLQotICBzaGFyZC0+Y291bnQrKzsKLQotICBpZiAoc2hhcmQtPmNvdW50ID4gc2hhcmQtPmNhcGFjaXR5ICogMikgewotICAgIGdyb3dfc3RydGFiKHNoYXJkKTsKLSAgfQotCi0gIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7Ci0gIEdQUl9USU1FUl9FTkQoImdycGNfbWRzdHJfZnJvbV9idWZmZXIiLCAwKTsKLQotICByZXR1cm4gKGdycGNfbWRzdHIgKilzOwotfQotCi1zdGF0aWMgdm9pZCBnY19tZHRhYihtZHRhYl9zaGFyZCAqc2hhcmQpIHsKLSAgc2l6ZV90IGk7Ci0gIGludGVybmFsX21ldGFkYXRhICoqcHJldl9uZXh0OwotICBpbnRlcm5hbF9tZXRhZGF0YSAqbWQsICpuZXh0OwotCi0gIEdQUl9USU1FUl9CRUdJTigiZ2NfbWR0YWIiLCAwKTsKLSAgZm9yIChpID0gMDsgaSA8IHNoYXJkLT5jYXBhY2l0eTsgaSsrKSB7Ci0gICAgcHJldl9uZXh0ID0gJnNoYXJkLT5lbGVtc1tpXTsKLSAgICBmb3IgKG1kID0gc2hhcmQtPmVsZW1zW2ldOyBtZDsgbWQgPSBuZXh0KSB7Ci0gICAgICB2b2lkICp1c2VyX2RhdGEgPSAodm9pZCAqKWdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+dXNlcl9kYXRhKTsKLSAgICAgIG5leHQgPSBtZC0+YnVja2V0X25leHQ7Ci0gICAgICBpZiAoZ3ByX2F0bV9hY3FfbG9hZCgmbWQtPnJlZmNudCkgPT0gMCkgewotICAgICAgICBHUlBDX01EU1RSX1VOUkVGKChncnBjX21kc3RyICopbWQtPmtleSk7Ci0gICAgICAgIEdSUENfTURTVFJfVU5SRUYoKGdycGNfbWRzdHIgKiltZC0+dmFsdWUpOwotICAgICAgICBpZiAobWQtPnVzZXJfZGF0YSkgewotICAgICAgICAgICgoZGVzdHJveV91c2VyX2RhdGFfZnVuYylncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgKLSAgICAgICAgICAgICAgJm1kLT5kZXN0cm95X3VzZXJfZGF0YSkpKHVzZXJfZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ3ByX2ZyZWUobWQpOwotICAgICAgICAqcHJldl9uZXh0ID0gbmV4dDsKLSAgICAgICAgc2hhcmQtPmZyZWUtLTsKLSAgICAgICAgc2hhcmQtPmNvdW50LS07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmV2X25leHQgPSAmbWQtPmJ1Y2tldF9uZXh0OwotICAgICAgfQotICAgIH0KLSAgfQotICBHUFJfVElNRVJfRU5EKCJnY19tZHRhYiIsIDApOwotfQotCi1zdGF0aWMgdm9pZCBncm93X21kdGFiKG1kdGFiX3NoYXJkICpzaGFyZCkgewotICBzaXplX3QgY2FwYWNpdHkgPSBzaGFyZC0+Y2FwYWNpdHkgKiAyOwotICBzaXplX3QgaTsKLSAgaW50ZXJuYWxfbWV0YWRhdGEgKiptZHRhYjsKLSAgaW50ZXJuYWxfbWV0YWRhdGEgKm1kLCAqbmV4dDsKLSAgdWludDMyX3QgaGFzaDsKLQotICBHUFJfVElNRVJfQkVHSU4oImdyb3dfbWR0YWIiLCAwKTsKLQotICBtZHRhYiA9IGdwcl9tYWxsb2Moc2l6ZW9mKGludGVybmFsX21ldGFkYXRhICopICogY2FwYWNpdHkpOwotICBtZW1zZXQobWR0YWIsIDAsIHNpemVvZihpbnRlcm5hbF9tZXRhZGF0YSAqKSAqIGNhcGFjaXR5KTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2hhcmQtPmNhcGFjaXR5OyBpKyspIHsKLSAgICBmb3IgKG1kID0gc2hhcmQtPmVsZW1zW2ldOyBtZDsgbWQgPSBuZXh0KSB7Ci0gICAgICBzaXplX3QgaWR4OwotICAgICAgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChtZC0+a2V5LT5oYXNoLCBtZC0+dmFsdWUtPmhhc2gpOwotICAgICAgbmV4dCA9IG1kLT5idWNrZXRfbmV4dDsKLSAgICAgIGlkeCA9IFRBQkxFX0lEWChoYXNoLCBMT0cyX01EVEFCX1NIQVJEX0NPVU5ULCBjYXBhY2l0eSk7Ci0gICAgICBtZC0+YnVja2V0X25leHQgPSBtZHRhYltpZHhdOwotICAgICAgbWR0YWJbaWR4XSA9IG1kOwotICAgIH0KLSAgfQotCi0gIGdwcl9mcmVlKHNoYXJkLT5lbGVtcyk7Ci0gIHNoYXJkLT5lbGVtcyA9IG1kdGFiOwotICBzaGFyZC0+Y2FwYWNpdHkgPSBjYXBhY2l0eTsKLQotICBHUFJfVElNRVJfRU5EKCJncm93X21kdGFiIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlaGFzaF9tZHRhYihtZHRhYl9zaGFyZCAqc2hhcmQpIHsKLSAgaWYgKHNoYXJkLT5mcmVlID4gc2hhcmQtPmNhcGFjaXR5IC8gNCkgewotICAgIGdjX21kdGFiKHNoYXJkKTsKLSAgfSBlbHNlIHsKLSAgICBncm93X21kdGFiKHNoYXJkKTsKLSAgfQotfQotCi1ncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKGdycGNfbWRzdHIgKm1rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRzdHIgKm12YWx1ZSkgewotICBpbnRlcm5hbF9zdHJpbmcgKmtleSA9IChpbnRlcm5hbF9zdHJpbmcgKilta2V5OwotICBpbnRlcm5hbF9zdHJpbmcgKnZhbHVlID0gKGludGVybmFsX3N0cmluZyAqKW12YWx1ZTsKLSAgdWludDMyX3QgaGFzaCA9IEdSUENfTURTVFJfS1ZfSEFTSChta2V5LT5oYXNoLCBtdmFsdWUtPmhhc2gpOwotICBpbnRlcm5hbF9tZXRhZGF0YSAqbWQ7Ci0gIG1kdGFiX3NoYXJkICpzaGFyZCA9ICZnX21kdGFiX3NoYXJkW1NIQVJEX0lEWChoYXNoLCBMT0cyX01EVEFCX1NIQVJEX0NPVU5UKV07Ci0gIHNpemVfdCBpOwotICBzaXplX3QgaWR4OwotCi0gIEdQUl9USU1FUl9CRUdJTigiZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzIiwgMCk7Ci0KLSAgaWYgKGlzX21kc3RyX3N0YXRpYyhta2V5KSAmJiBpc19tZHN0cl9zdGF0aWMobXZhbHVlKSkgewotICAgIGZvciAoaSA9IDA7IGkgPD0gZ19zdGF0aWNfbWR0YWJfbWF4cHJvYmU7IGkrKykgewotICAgICAgZ3JwY19tZGVsZW0gKnNtZDsKLSAgICAgIGlkeCA9IChoYXNoICsgaSkgJSBHUFJfQVJSQVlfU0laRShnX3N0YXRpY19tZHRhYik7Ci0gICAgICBzbWQgPSBnX3N0YXRpY19tZHRhYltpZHhdOwotICAgICAgaWYgKHNtZCA9PSBOVUxMKSBicmVhazsKLSAgICAgIGlmIChzbWQtPmtleSA9PSBta2V5ICYmIHNtZC0+dmFsdWUgPT0gbXZhbHVlKSB7Ci0gICAgICAgIEdQUl9USU1FUl9FTkQoImdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyIsIDApOwotICAgICAgICByZXR1cm4gc21kOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGdwcl9tdV9sb2NrKCZzaGFyZC0+bXUpOwotCi0gIGlkeCA9IFRBQkxFX0lEWChoYXNoLCBMT0cyX01EVEFCX1NIQVJEX0NPVU5ULCBzaGFyZC0+Y2FwYWNpdHkpOwotICAvKiBzZWFyY2ggZm9yIGFuIGV4aXN0aW5nIHBhaXIgKi8KLSAgZm9yIChtZCA9IHNoYXJkLT5lbGVtc1tpZHhdOyBtZDsgbWQgPSBtZC0+YnVja2V0X25leHQpIHsKLSAgICBpZiAobWQtPmtleSA9PSBrZXkgJiYgbWQtPnZhbHVlID09IHZhbHVlKSB7Ci0gICAgICBSRUZfTURfTE9DS0VEKHNoYXJkLCBtZCk7Ci0gICAgICBHUlBDX01EU1RSX1VOUkVGKChncnBjX21kc3RyICopa2V5KTsKLSAgICAgIEdSUENfTURTVFJfVU5SRUYoKGdycGNfbWRzdHIgKil2YWx1ZSk7Ci0gICAgICBncHJfbXVfdW5sb2NrKCZzaGFyZC0+bXUpOwotICAgICAgR1BSX1RJTUVSX0VORCgiZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzIiwgMCk7Ci0gICAgICByZXR1cm4gKGdycGNfbWRlbGVtICopbWQ7Ci0gICAgfQotICB9Ci0KLSAgLyogbm90IGZvdW5kOiBjcmVhdGUgYSBuZXcgcGFpciAqLwotICBtZCA9IGdwcl9tYWxsb2Moc2l6ZW9mKGludGVybmFsX21ldGFkYXRhKSk7Ci0gIGdwcl9hdG1fcmVsX3N0b3JlKCZtZC0+cmVmY250LCAyKTsKLSAgbWQtPmtleSA9IGtleTsKLSAgbWQtPnZhbHVlID0gdmFsdWU7Ci0gIG1kLT51c2VyX2RhdGEgPSAwOwotICBtZC0+ZGVzdHJveV91c2VyX2RhdGEgPSAwOwotICBtZC0+YnVja2V0X25leHQgPSBzaGFyZC0+ZWxlbXNbaWR4XTsKLSAgc2hhcmQtPmVsZW1zW2lkeF0gPSBtZDsKLSAgZ3ByX211X2luaXQoJm1kLT5tdV91c2VyX2RhdGEpOwotI2lmZGVmIEdSUENfTUVUQURBVEFfUkVGQ09VTlRfREVCVUcKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICJFTE0gICBORVc6JXA6JWQ6ICclcycgPSAnJXMnIiwgbWQsCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpLAotICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcoKGdycGNfbWRzdHIgKiltZC0+a2V5KSwKLSAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKChncnBjX21kc3RyICopbWQtPnZhbHVlKSk7Ci0jZW5kaWYKLSAgc2hhcmQtPmNvdW50Kys7Ci0KLSAgaWYgKHNoYXJkLT5jb3VudCA+IHNoYXJkLT5jYXBhY2l0eSAqIDIpIHsKLSAgICByZWhhc2hfbWR0YWIoc2hhcmQpOwotICB9Ci0KLSAgZ3ByX211X3VubG9jaygmc2hhcmQtPm11KTsKLQotICBHUFJfVElNRVJfRU5EKCJncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MiLCAwKTsKLQotICByZXR1cm4gKGdycGNfbWRlbGVtICopbWQ7Ci19Ci0KLWdycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3N0cmluZ3MoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgewotICByZXR1cm4gZ3JwY19tZGVsZW1fZnJvbV9tZXRhZGF0YV9zdHJpbmdzKGdycGNfbWRzdHJfZnJvbV9zdHJpbmcoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKHZhbHVlKSk7Ci19Ci0KLWdycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3NsaWNlcyhncHJfc2xpY2Uga2V5LCBncHJfc2xpY2UgdmFsdWUpIHsKLSAgcmV0dXJuIGdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyhncnBjX21kc3RyX2Zyb21fc2xpY2Uoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kc3RyX2Zyb21fc2xpY2UodmFsdWUpKTsKLX0KLQotZ3JwY19tZGVsZW0gKmdycGNfbWRlbGVtX2Zyb21fc3RyaW5nX2FuZF9idWZmZXIoY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFsdWVfbGVuZ3RoKSB7Ci0gIHJldHVybiBncnBjX21kZWxlbV9mcm9tX21ldGFkYXRhX3N0cmluZ3MoCi0gICAgICBncnBjX21kc3RyX2Zyb21fc3RyaW5nKGtleSksIGdycGNfbWRzdHJfZnJvbV9idWZmZXIodmFsdWUsIHZhbHVlX2xlbmd0aCkpOwotfQotCi1ncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fcmVmKGdycGNfbWRlbGVtICpnbWQgREVCVUdfQVJHUykgewotICBpbnRlcm5hbF9tZXRhZGF0YSAqbWQgPSAoaW50ZXJuYWxfbWV0YWRhdGEgKilnbWQ7Ci0gIGlmIChpc19tZGVsZW1fc3RhdGljKGdtZCkpIHJldHVybiBnbWQ7Ci0jaWZkZWYgR1JQQ19NRVRBREFUQV9SRUZDT1VOVF9ERUJVRwotICBncHJfbG9nKGZpbGUsIGxpbmUsIEdQUl9MT0dfU0VWRVJJVFlfREVCVUcsCi0gICAgICAgICAgIkVMTSAgIFJFRjolcDolZC0+JWQ6ICclcycgPSAnJXMnIiwgbWQsCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpLAotICAgICAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+cmVmY250KSArIDEsCi0gICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZygoZ3JwY19tZHN0ciAqKW1kLT5rZXkpLAotICAgICAgICAgIGdycGNfbWRzdHJfYXNfY19zdHJpbmcoKGdycGNfbWRzdHIgKiltZC0+dmFsdWUpKTsKLSNlbmRpZgotICAvKiB3ZSBjYW4gYXNzdW1lIHRoZSByZWYgY291bnQgaXMgPj0gMSBhcyB0aGUgYXBwbGljYXRpb24gaXMgY2FsbGluZwotICAgICB0aGlzIGZ1bmN0aW9uIC0gbWVhbmluZyB0aGF0IG5vIGFkanVzdG1lbnQgdG8gbWR0YWJfZnJlZSBpcyBuZWNlc3NhcnksCi0gICAgIHNpbXBsaWZ5aW5nIHRoZSBsb2dpYyBoZXJlIHRvIGJlIGp1c3QgYW4gYXRvbWljIGluY3JlbWVudCAqLwotICAvKiB1c2UgQyBhc3NlcnQgdG8gaGF2ZSB0aGlzIHJlbW92ZWQgaW4gb3B0IGJ1aWxkcyAqLwotICBhc3NlcnQoZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpID49IDIpOwotICBncHJfYXRtX25vX2JhcnJpZXJfZmV0Y2hfYWRkKCZtZC0+cmVmY250LCAxKTsKLSAgcmV0dXJuIGdtZDsKLX0KLQotdm9pZCBncnBjX21kZWxlbV91bnJlZihncnBjX21kZWxlbSAqZ21kIERFQlVHX0FSR1MpIHsKLSAgaW50ZXJuYWxfbWV0YWRhdGEgKm1kID0gKGludGVybmFsX21ldGFkYXRhICopZ21kOwotICBpZiAoIW1kKSByZXR1cm47Ci0gIGlmIChpc19tZGVsZW1fc3RhdGljKGdtZCkpIHJldHVybjsKLSNpZmRlZiBHUlBDX01FVEFEQVRBX1JFRkNPVU5UX0RFQlVHCi0gIGdwcl9sb2coZmlsZSwgbGluZSwgR1BSX0xPR19TRVZFUklUWV9ERUJVRywKLSAgICAgICAgICAiRUxNIFVOUkVGOiVwOiVkLT4lZDogJyVzJyA9ICclcyciLCBtZCwKLSAgICAgICAgICBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmbWQtPnJlZmNudCksCi0gICAgICAgICAgZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJm1kLT5yZWZjbnQpIC0gMSwKLSAgICAgICAgICBncnBjX21kc3RyX2FzX2Nfc3RyaW5nKChncnBjX21kc3RyICopbWQtPmtleSksCi0gICAgICAgICAgZ3JwY19tZHN0cl9hc19jX3N0cmluZygoZ3JwY19tZHN0ciAqKW1kLT52YWx1ZSkpOwotI2VuZGlmCi0gIGlmICgyID09IGdwcl9hdG1fZnVsbF9mZXRjaF9hZGQoJm1kLT5yZWZjbnQsIC0xKSkgewotICAgIHVpbnQzMl90IGhhc2ggPSBHUlBDX01EU1RSX0tWX0hBU0gobWQtPmtleS0+aGFzaCwgbWQtPnZhbHVlLT5oYXNoKTsKLSAgICBtZHRhYl9zaGFyZCAqc2hhcmQgPQotICAgICAgICAmZ19tZHRhYl9zaGFyZFtTSEFSRF9JRFgoaGFzaCwgTE9HMl9NRFRBQl9TSEFSRF9DT1VOVCldOwotICAgIEdQUl9USU1FUl9CRUdJTigiZ3JwY19tZGVsZW1fdW5yZWYudG9femVybyIsIDApOwotICAgIGdwcl9tdV9sb2NrKCZzaGFyZC0+bXUpOwotICAgIGlmICgxID09IGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZtZC0+cmVmY250KSkgewotICAgICAgc2hhcmQtPmZyZWUrKzsKLSAgICAgIGdwcl9hdG1fbm9fYmFycmllcl9zdG9yZSgmbWQtPnJlZmNudCwgMCk7Ci0gICAgfQotICAgIGdwcl9tdV91bmxvY2soJnNoYXJkLT5tdSk7Ci0gICAgR1BSX1RJTUVSX0VORCgiZ3JwY19tZGVsZW1fdW5yZWYudG9femVybyIsIDApOwotICB9Ci19Ci0KLWNvbnN0IGNoYXIgKmdycGNfbWRzdHJfYXNfY19zdHJpbmcoZ3JwY19tZHN0ciAqcykgewotICByZXR1cm4gKGNvbnN0IGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKHMtPnNsaWNlKTsKLX0KLQotZ3JwY19tZHN0ciAqZ3JwY19tZHN0cl9yZWYoZ3JwY19tZHN0ciAqZ3MgREVCVUdfQVJHUykgewotICBpbnRlcm5hbF9zdHJpbmcgKnMgPSAoaW50ZXJuYWxfc3RyaW5nICopZ3M7Ci0gIGlmIChpc19tZHN0cl9zdGF0aWMoZ3MpKSByZXR1cm4gZ3M7Ci0gIEdQUl9BU1NFUlQoZ3ByX2F0bV9mdWxsX2ZldGNoX2FkZCgmcy0+cmVmY250LCAxKSAhPSAwKTsKLSAgcmV0dXJuIGdzOwotfQotCi12b2lkIGdycGNfbWRzdHJfdW5yZWYoZ3JwY19tZHN0ciAqZ3MgREVCVUdfQVJHUykgewotICBpbnRlcm5hbF9zdHJpbmcgKnMgPSAoaW50ZXJuYWxfc3RyaW5nICopZ3M7Ci0gIGlmIChpc19tZHN0cl9zdGF0aWMoZ3MpKSByZXR1cm47Ci0gIGlmICgyID09IGdwcl9hdG1fZnVsbF9mZXRjaF9hZGQoJnMtPnJlZmNudCwgLTEpKSB7Ci0gICAgc3RydGFiX3NoYXJkICpzaGFyZCA9Ci0gICAgICAgICZnX3N0cnRhYl9zaGFyZFtTSEFSRF9JRFgocy0+aGFzaCwgTE9HMl9TVFJUQUJfU0hBUkRfQ09VTlQpXTsKLSAgICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKLSAgICBpZiAoMSA9PSBncHJfYXRtX25vX2JhcnJpZXJfbG9hZCgmcy0+cmVmY250KSkgewotICAgICAgaW50ZXJuYWxfZGVzdHJveV9zdHJpbmcoc2hhcmQsIHMpOwotICAgIH0KLSAgICBncHJfbXVfdW5sb2NrKCZzaGFyZC0+bXUpOwotICB9Ci19Ci0KLXZvaWQgKmdycGNfbWRlbGVtX2dldF91c2VyX2RhdGEoZ3JwY19tZGVsZW0gKm1kLCB2b2lkICgqZGVzdHJveV9mdW5jKSh2b2lkICopKSB7Ci0gIGludGVybmFsX21ldGFkYXRhICppbSA9IChpbnRlcm5hbF9tZXRhZGF0YSAqKW1kOwotICB2b2lkICpyZXN1bHQ7Ci0gIGlmIChpc19tZGVsZW1fc3RhdGljKG1kKSkgewotICAgIHJldHVybiAodm9pZCAqKWdycGNfc3RhdGljX21kZWxlbV91c2VyX2RhdGFbbWQgLSBncnBjX3N0YXRpY19tZGVsZW1fdGFibGVdOwotICB9Ci0gIGlmIChncHJfYXRtX2FjcV9sb2FkKCZpbS0+ZGVzdHJveV91c2VyX2RhdGEpID09IChncHJfYXRtKWRlc3Ryb3lfZnVuYykgewotICAgIHJldHVybiAodm9pZCAqKWdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZpbS0+dXNlcl9kYXRhKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIGdycGNfbWRlbGVtX3NldF91c2VyX2RhdGEoZ3JwY19tZGVsZW0gKm1kLCB2b2lkICgqZGVzdHJveV9mdW5jKSh2b2lkICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkgewotICBpbnRlcm5hbF9tZXRhZGF0YSAqaW0gPSAoaW50ZXJuYWxfbWV0YWRhdGEgKiltZDsKLSAgR1BSX0FTU0VSVCghaXNfbWRlbGVtX3N0YXRpYyhtZCkpOwotICBHUFJfQVNTRVJUKCh1c2VyX2RhdGEgPT0gTlVMTCkgPT0gKGRlc3Ryb3lfZnVuYyA9PSBOVUxMKSk7Ci0gIGdwcl9tdV9sb2NrKCZpbS0+bXVfdXNlcl9kYXRhKTsKLSAgaWYgKGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZpbS0+ZGVzdHJveV91c2VyX2RhdGEpKSB7Ci0gICAgLyogdXNlciBkYXRhIGNhbiBvbmx5IGJlIHNldCBvbmNlICovCi0gICAgZ3ByX211X3VubG9jaygmaW0tPm11X3VzZXJfZGF0YSk7Ci0gICAgaWYgKGRlc3Ryb3lfZnVuYyAhPSBOVUxMKSB7Ci0gICAgICBkZXN0cm95X2Z1bmModXNlcl9kYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGdwcl9hdG1fbm9fYmFycmllcl9zdG9yZSgmaW0tPnVzZXJfZGF0YSwgKGdwcl9hdG0pdXNlcl9kYXRhKTsKLSAgZ3ByX2F0bV9yZWxfc3RvcmUoJmltLT5kZXN0cm95X3VzZXJfZGF0YSwgKGdwcl9hdG0pZGVzdHJveV9mdW5jKTsKLSAgZ3ByX211X3VubG9jaygmaW0tPm11X3VzZXJfZGF0YSk7Ci19Ci0KLWdwcl9zbGljZSBncnBjX21kc3RyX2FzX2Jhc2U2NF9lbmNvZGVkX2FuZF9odWZmbWFuX2NvbXByZXNzZWQoZ3JwY19tZHN0ciAqZ3MpIHsKLSAgaW50ZXJuYWxfc3RyaW5nICpzID0gKGludGVybmFsX3N0cmluZyAqKWdzOwotICBncHJfc2xpY2Ugc2xpY2U7Ci0gIHN0cnRhYl9zaGFyZCAqc2hhcmQgPQotICAgICAgJmdfc3RydGFiX3NoYXJkW1NIQVJEX0lEWChzLT5oYXNoLCBMT0cyX1NUUlRBQl9TSEFSRF9DT1VOVCldOwotICBncHJfbXVfbG9jaygmc2hhcmQtPm11KTsKLSAgaWYgKCFzLT5oYXNfYmFzZTY0X2FuZF9odWZmbWFuX2VuY29kZWQpIHsKLSAgICBzLT5iYXNlNjRfYW5kX2h1ZmZtYW4gPQotICAgICAgICBncnBjX2NodHRwMl9iYXNlNjRfZW5jb2RlX2FuZF9odWZmbWFuX2NvbXByZXNzKHMtPnNsaWNlKTsKLSAgICBzLT5oYXNfYmFzZTY0X2FuZF9odWZmbWFuX2VuY29kZWQgPSAxOwotICB9Ci0gIHNsaWNlID0gcy0+YmFzZTY0X2FuZF9odWZmbWFuOwotICBncHJfbXVfdW5sb2NrKCZzaGFyZC0+bXUpOwotICByZXR1cm4gc2xpY2U7Ci19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIzOTc4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RSQU5TUE9SVF9NRVRBREFUQV9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfTUVUQURBVEFfSAotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotCi0vKiBUaGlzIGZpbGUgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHRyYWNraW5nIG1ldGFkYXRhIHRocm91Z2ggdGhlIGdycGMgc3RhY2suCi0gICBJdCdzIG5vdCBpbnRlbmRlZCBmb3IgY29uc3VtcHRpb24gb3V0c2lkZSBvZiB0aGUgbGlicmFyeS4KLQotICAgTWV0YWRhdGEgaXMgdHJhY2tlZCBpbiB0aGUgY29udGV4dCBvZiBhIGdycGNfbWRjdHguIEZvciB0aGUgdGltZSBiZWluZyB0aGVyZQotICAgaXMgb25lIG9mIHRoZXNlIHBlci1jaGFubmVsLCBhdm9pZGluZyBjcm9zcyBjaGFubmVsIGludGVyZmVyZW5jZSB3aXRoIG1lbW9yeQotICAgdXNlIGFuZCBsb2NrIGNvbnRlbnRpb24uCi0KLSAgIFRoZSBjb250ZXh0IHRyYWNrcyB1bmlxdWUgc3RyaW5ncyAoZ3JwY19tZHN0cikgYW5kIHBhaXJzIG9mIHN0cmluZ3MKLSAgIChncnBjX21kZWxlbSkuIEFueSBvZiB0aGVzZSBvYmplY3RzIGNhbiBiZSBjaGVja2VkIGZvciBlcXVhbGl0eSBieSBjb21wYXJpbmcKLSAgIHRoZWlyIHBvaW50ZXJzLiBUaGVzZSBvYmplY3RzIGFyZSByZWZlcmVuY2UgY291bnRlZC4KLQotICAgZ3JwY19tZGVsZW0gY2FuIGFkZGl0aW9uYWxseSBzdG9yZSBhIChub24tTlVMTCkgdXNlciBkYXRhIHBvaW50ZXIuIFRoaXMKLSAgIHBvaW50ZXIgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYWNoZSBzZW1hbnRpYyBtZWFuaW5nIG9mIGEgbWV0YWRhdGEKLSAgIGVsZW1lbnQuIEZvciBleGFtcGxlLCBhbiBPQXV0aCB0b2tlbiBtYXkgY2FjaGUgdGhlIGNyZWRlbnRpYWxzIGl0IHJlcHJlc2VudHMKLSAgIGFuZCB0aGUgdGltZSBhdCB3aGljaCBpdCBleHBpcmVzIGluIHRoZSBtZGVsZW0gdXNlciBkYXRhLgotCi0gICBDb21iaW5pbmcgdGhpcyBtZXRhZGF0YSBjYWNoZSBhbmQgdGhlIGhwYWNrIGNvbXByZXNzaW9uIHRhYmxlIGFsbG93cyB1cyB0bwotICAgc2ltcGx5IGxvb2t1cCBjb21wbGV0ZSBwcmVwYXJzZWQgb2JqZWN0cyBxdWlja2x5LCBpbmN1cnJpbmcgYSBmZXcgYXRvbWljCi0gICBvcHMgcGVyIG1ldGFkYXRhIGVsZW1lbnQgb24gdGhlIGZhc3QgcGF0aC4KLQotICAgZ3JwY19tZGVsZW0gaW5zdGFuY2VzIE1BWSBsaXZlIGxvbmdlciB0aGFuIHRoZWlyIHJlZmNvdW50IGltcGxpZXMsIGFuZCBhcmUKLSAgIGdhcmJhZ2UgY29sbGVjdGVkIHBlcmlvZGljYWxseSwgbWVhbmluZyBjYWNoZWQgZGF0YSBjYW4gZWFzaWx5IG91dGxpdmUgYQotICAgc2luZ2xlIHJlcXVlc3QuCi0KLSAgIFNUQVRJQyBNRVRBREFUQTogaW4gc3RhdGljX21ldGFkYXRhLmggd2UgZGVjbGFyZSBhIHNldCBvZiBzdGF0aWMgbWV0YWRhdGEuCi0gICBUaGVzZSBtZGVsZW1zIGFuZCBtZHN0cnMgYXJlIGF2YWlsYWJsZSB2aWEgcHJlLWRlY2xhcmVkIGNvZGUgZ2VuZXJhdGVkIG1hY3JvcwotICAgYW5kIGFyZSBhdmFpbGFibGUgdG8gY29kZSBhbnl3aGVyZSBiZXR3ZWVuIGdycGNfaW5pdCgpIGFuZCBncnBjX3NodXRkb3duKCkuCi0gICBUaGV5IGFyZSBub3QgcmVmY291bnRlZCwgYnV0IGNhbiBiZSBwYXNzZWQgdG8gX3JlZiBhbmQgX3VucmVmIGZ1bmN0aW9ucwotICAgZGVjbGFyZWQgaGVyZSAtIGluIHdoaWNoIGNhc2UgdGhvc2UgZnVuY3Rpb25zIGFyZSBlZmZlY3RpdmVseSBuby1vcHMuICovCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi10eXBlZGVmIHN0cnVjdCBncnBjX21kc3RyIGdycGNfbWRzdHI7Ci10eXBlZGVmIHN0cnVjdCBncnBjX21kZWxlbSBncnBjX21kZWxlbTsKLQotLyogaWYgY2hhbmdpbmcgdGhpcywgbWFrZSBpZGVudGljYWwgY2hhbmdlcyBpbiBpbnRlcm5hbF9zdHJpbmcgaW4gbWV0YWRhdGEuYyAqLwotc3RydWN0IGdycGNfbWRzdHIgewotICBjb25zdCBncHJfc2xpY2Ugc2xpY2U7Ci0gIGNvbnN0IHVpbnQzMl90IGhhc2g7Ci0gIC8qIHRoZXJlIGlzIGEgcHJpdmF0ZSBwYXJ0IHRvIHRoaXMgaW4gbWV0YWRhdGEuYyAqLwotfTsKLQotLyogaWYgY2hhbmdpbmcgdGhpcywgbWFrZSBpZGVudGljYWwgY2hhbmdlcyBpbiBpbnRlcm5hbF9tZXRhZGF0YSBpbgotICAgbWV0YWRhdGEuYyAqLwotc3RydWN0IGdycGNfbWRlbGVtIHsKLSAgZ3JwY19tZHN0ciAqY29uc3Qga2V5OwotICBncnBjX21kc3RyICpjb25zdCB2YWx1ZTsKLSAgLyogdGhlcmUgaXMgYSBwcml2YXRlIHBhcnQgdG8gdGhpcyBpbiBtZXRhZGF0YS5jICovCi19OwotCi12b2lkIGdycGNfdGVzdF9vbmx5X3NldF9tZXRhZGF0YV9oYXNoX3NlZWQodWludDMyX3Qgc2VlZCk7Ci0KLS8qIENvbnN0cnVjdG9ycyBmb3IgZ3JwY19tZHN0ciBpbnN0YW5jZXM7IHRha2UgYSB2YXJpZXR5IG9mIGRhdGEgdHlwZXMgdGhhdAotICAgY2xpZW50cyBtYXkgaGF2ZSBoYW5keSAqLwotZ3JwY19tZHN0ciAqZ3JwY19tZHN0cl9mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzdHIpOwotLyogVW5yZWZzIHRoZSBzbGljZS4gKi8KLWdycGNfbWRzdHIgKmdycGNfbWRzdHJfZnJvbV9zbGljZShncHJfc2xpY2Ugc2xpY2UpOwotZ3JwY19tZHN0ciAqZ3JwY19tZHN0cl9mcm9tX2J1ZmZlcihjb25zdCB1aW50OF90ICpzdHIsIHNpemVfdCBsZW5ndGgpOwotCi0vKiBSZXR1cm5zIGEgYm9ycm93ZWQgc2xpY2UgZnJvbSB0aGUgbWRzdHIgd2l0aCBpdHMgY29udGVudHMgYmFzZTY0IGVuY29kZWQKLSAgIGFuZCBodWZmbWFuIGNvbXByZXNzZWQgKi8KLWdwcl9zbGljZSBncnBjX21kc3RyX2FzX2Jhc2U2NF9lbmNvZGVkX2FuZF9odWZmbWFuX2NvbXByZXNzZWQoZ3JwY19tZHN0ciAqc3RyKTsKLQotLyogQ29uc3RydWN0b3JzIGZvciBncnBjX21kZWxlbSBpbnN0YW5jZXM7IHRha2UgYSB2YXJpZXR5IG9mIGRhdGEgdHlwZXMgdGhhdAotICAgY2xpZW50cyBtYXkgaGF2ZSBoYW5keSAqLwotZ3JwY19tZGVsZW0gKmdycGNfbWRlbGVtX2Zyb21fbWV0YWRhdGFfc3RyaW5ncyhncnBjX21kc3RyICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWRzdHIgKnZhbHVlKTsKLWdycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3N0cmluZ3MoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0vKiBVbnJlZnMgdGhlIHNsaWNlcy4gKi8KLWdycGNfbWRlbGVtICpncnBjX21kZWxlbV9mcm9tX3NsaWNlcyhncHJfc2xpY2Uga2V5LCBncHJfc2xpY2UgdmFsdWUpOwotZ3JwY19tZGVsZW0gKmdycGNfbWRlbGVtX2Zyb21fc3RyaW5nX2FuZF9idWZmZXIoY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFsdWVfbGVuZ3RoKTsKLQotLyogTXV0YXRvciBhbmQgYWNjZXNzb3IgZm9yIGdycGNfbWRlbGVtIHVzZXIgZGF0YS4gVGhlIGRlc3RydWN0b3IgZnVuY3Rpb24KLSAgIGlzIHVzZWQgYXMgYSB0eXBlIHRhZyBhbmQgaXMgY2hlY2tlZCBkdXJpbmcgdXNlcl9kYXRhIGZldGNoLiAqLwotdm9pZCAqZ3JwY19tZGVsZW1fZ2V0X3VzZXJfZGF0YShncnBjX21kZWxlbSAqbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCppZl9kZXN0cm95X2Z1bmMpKHZvaWQgKikpOwotdm9pZCBncnBjX21kZWxlbV9zZXRfdXNlcl9kYXRhKGdycGNfbWRlbGVtICptZCwgdm9pZCAoKmRlc3Ryb3lfZnVuYykodm9pZCAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOwotCi0vKiBSZWZlcmVuY2UgY291bnRpbmcgKi8KLSNpZmRlZiBHUlBDX01FVEFEQVRBX1JFRkNPVU5UX0RFQlVHCi0jZGVmaW5lIEdSUENfTURTVFJfUkVGKHMpIGdycGNfbWRzdHJfcmVmKChzKSwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBHUlBDX01EU1RSX1VOUkVGKHMpIGdycGNfbWRzdHJfdW5yZWYoKHMpLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIEdSUENfTURFTEVNX1JFRihzKSBncnBjX21kZWxlbV9yZWYoKHMpLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIEdSUENfTURFTEVNX1VOUkVGKHMpIGdycGNfbWRlbGVtX3VucmVmKChzKSwgX19GSUxFX18sIF9fTElORV9fKQotZ3JwY19tZHN0ciAqZ3JwY19tZHN0cl9yZWYoZ3JwY19tZHN0ciAqcywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwotdm9pZCBncnBjX21kc3RyX3VucmVmKGdycGNfbWRzdHIgKnMsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKLWdycGNfbWRlbGVtICpncnBjX21kZWxlbV9yZWYoZ3JwY19tZGVsZW0gKm1kLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Ci12b2lkIGdycGNfbWRlbGVtX3VucmVmKGdycGNfbWRlbGVtICptZCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwotI2Vsc2UKLSNkZWZpbmUgR1JQQ19NRFNUUl9SRUYocykgZ3JwY19tZHN0cl9yZWYoKHMpKQotI2RlZmluZSBHUlBDX01EU1RSX1VOUkVGKHMpIGdycGNfbWRzdHJfdW5yZWYoKHMpKQotI2RlZmluZSBHUlBDX01ERUxFTV9SRUYocykgZ3JwY19tZGVsZW1fcmVmKChzKSkKLSNkZWZpbmUgR1JQQ19NREVMRU1fVU5SRUYocykgZ3JwY19tZGVsZW1fdW5yZWYoKHMpKQotZ3JwY19tZHN0ciAqZ3JwY19tZHN0cl9yZWYoZ3JwY19tZHN0ciAqcyk7Ci12b2lkIGdycGNfbWRzdHJfdW5yZWYoZ3JwY19tZHN0ciAqcyk7Ci1ncnBjX21kZWxlbSAqZ3JwY19tZGVsZW1fcmVmKGdycGNfbWRlbGVtICptZCk7Ci12b2lkIGdycGNfbWRlbGVtX3VucmVmKGdycGNfbWRlbGVtICptZCk7Ci0jZW5kaWYKLQotLyogUmVjb3ZlciBhIGNoYXIqIGZyb20gYSBncnBjX21kc3RyLiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG51bGwgdGVybWluYXRlZC4KLSAgIERvZXMgbm90IHByb21pc2UgdGhhdCB0aGUgcmV0dXJuZWQgc3RyaW5nIGhhcyBubyBlbWJlZGRlZCBudWxscyBob3dldmVyLiAqLwotY29uc3QgY2hhciAqZ3JwY19tZHN0cl9hc19jX3N0cmluZyhncnBjX21kc3RyICpzKTsKLQotI2RlZmluZSBHUlBDX01EU1RSX0xFTkdUSChzKSAoR1BSX1NMSUNFX0xFTkdUSChzLT5zbGljZSkpCi0KLWludCBncnBjX21kc3RyX2lzX2xlZ2FsX2hlYWRlcihncnBjX21kc3RyICpzKTsKLWludCBncnBjX21kc3RyX2lzX2xlZ2FsX25vbmJpbl9oZWFkZXIoZ3JwY19tZHN0ciAqcyk7Ci1pbnQgZ3JwY19tZHN0cl9pc19iaW5fc3VmZml4ZWQoZ3JwY19tZHN0ciAqcyk7Ci0KLSNkZWZpbmUgR1JQQ19NRFNUUl9LVl9IQVNIKGtfaGFzaCwgdl9oYXNoKSAoR1BSX1JPVEwoKGtfaGFzaCksIDIpIF4gKHZfaGFzaCkpCi0KLXZvaWQgZ3JwY19tZGN0eF9nbG9iYWxfaW5pdCh2b2lkKTsKLXZvaWQgZ3JwY19tZGN0eF9nbG9iYWxfc2h1dGRvd24odm9pZCk7Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIGIvc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjY4NjIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgotCi1zdGF0aWMgdm9pZCBhc3NlcnRfdmFsaWRfbGlzdChncnBjX21kZWxlbV9saXN0ICpsaXN0KSB7Ci0jaWZuZGVmIE5ERUJVRwotICBncnBjX2xpbmtlZF9tZGVsZW0gKmw7Ci0KLSAgR1BSX0FTU0VSVCgobGlzdC0+aGVhZCA9PSBOVUxMKSA9PSAobGlzdC0+dGFpbCA9PSBOVUxMKSk7Ci0gIGlmICghbGlzdC0+aGVhZCkgcmV0dXJuOwotICBHUFJfQVNTRVJUKGxpc3QtPmhlYWQtPnByZXYgPT0gTlVMTCk7Ci0gIEdQUl9BU1NFUlQobGlzdC0+dGFpbC0+bmV4dCA9PSBOVUxMKTsKLSAgR1BSX0FTU0VSVCgobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSA9PSAobGlzdC0+aGVhZC0+bmV4dCA9PSBOVUxMKSk7Ci0KLSAgZm9yIChsID0gbGlzdC0+aGVhZDsgbDsgbCA9IGwtPm5leHQpIHsKLSAgICBHUFJfQVNTRVJUKGwtPm1kKTsKLSAgICBHUFJfQVNTRVJUKChsLT5wcmV2ID09IE5VTEwpID09IChsID09IGxpc3QtPmhlYWQpKTsKLSAgICBHUFJfQVNTRVJUKChsLT5uZXh0ID09IE5VTEwpID09IChsID09IGxpc3QtPnRhaWwpKTsKLSAgICBpZiAobC0+bmV4dCkgR1BSX0FTU0VSVChsLT5uZXh0LT5wcmV2ID09IGwpOwotICAgIGlmIChsLT5wcmV2KSBHUFJfQVNTRVJUKGwtPnByZXYtPm5leHQgPT0gbCk7Ci0gIH0KLSNlbmRpZiAvKiBOREVCVUcgKi8KLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9hc3NlcnRfb2soZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpIHsKLSAgYXNzZXJ0X3ZhbGlkX2xpc3QoJmJhdGNoLT5saXN0KTsKLX0KLSNlbmRpZiAvKiBOREVCVUcgKi8KLQotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2luaXQoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpIHsKLSAgYmF0Y2gtPmxpc3QuaGVhZCA9IGJhdGNoLT5saXN0LnRhaWwgPSBOVUxMOwotICBiYXRjaC0+ZGVhZGxpbmUgPSBncHJfaW5mX2Z1dHVyZShHUFJfQ0xPQ0tfUkVBTFRJTUUpOwotfQotCi12b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfZGVzdHJveShncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCkgewotICBncnBjX2xpbmtlZF9tZGVsZW0gKmw7Ci0gIGZvciAobCA9IGJhdGNoLT5saXN0LmhlYWQ7IGw7IGwgPSBsLT5uZXh0KSB7Ci0gICAgR1JQQ19NREVMRU1fVU5SRUYobC0+bWQpOwotICB9Ci19Ci0KLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfaGVhZChncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW1fdG9fYWRkKSB7Ci0gIEdQUl9BU1NFUlQoZWxlbV90b19hZGQpOwotICBzdG9yYWdlLT5tZCA9IGVsZW1fdG9fYWRkOwotICBncnBjX21ldGFkYXRhX2JhdGNoX2xpbmtfaGVhZChiYXRjaCwgc3RvcmFnZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpbmtfaGVhZChncnBjX21kZWxlbV9saXN0ICpsaXN0LCBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UpIHsKLSAgYXNzZXJ0X3ZhbGlkX2xpc3QobGlzdCk7Ci0gIEdQUl9BU1NFUlQoc3RvcmFnZS0+bWQpOwotICBzdG9yYWdlLT5wcmV2ID0gTlVMTDsKLSAgc3RvcmFnZS0+bmV4dCA9IGxpc3QtPmhlYWQ7Ci0gIGlmIChsaXN0LT5oZWFkICE9IE5VTEwpIHsKLSAgICBsaXN0LT5oZWFkLT5wcmV2ID0gc3RvcmFnZTsKLSAgfSBlbHNlIHsKLSAgICBsaXN0LT50YWlsID0gc3RvcmFnZTsKLSAgfQotICBsaXN0LT5oZWFkID0gc3RvcmFnZTsKLSAgYXNzZXJ0X3ZhbGlkX2xpc3QobGlzdCk7Ci19Ci0KLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9saW5rX2hlYWQoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSkgewotICBsaW5rX2hlYWQoJmJhdGNoLT5saXN0LCBzdG9yYWdlKTsKLX0KLQotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF90YWlsKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqZWxlbV90b19hZGQpIHsKLSAgR1BSX0FTU0VSVChlbGVtX3RvX2FkZCk7Ci0gIHN0b3JhZ2UtPm1kID0gZWxlbV90b19hZGQ7Ci0gIGdycGNfbWV0YWRhdGFfYmF0Y2hfbGlua190YWlsKGJhdGNoLCBzdG9yYWdlKTsKLX0KLQotc3RhdGljIHZvaWQgbGlua190YWlsKGdycGNfbWRlbGVtX2xpc3QgKmxpc3QsIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSkgewotICBhc3NlcnRfdmFsaWRfbGlzdChsaXN0KTsKLSAgR1BSX0FTU0VSVChzdG9yYWdlLT5tZCk7Ci0gIHN0b3JhZ2UtPnByZXYgPSBsaXN0LT50YWlsOwotICBzdG9yYWdlLT5uZXh0ID0gTlVMTDsKLSAgc3RvcmFnZS0+cmVzZXJ2ZWQgPSBOVUxMOwotICBpZiAobGlzdC0+dGFpbCAhPSBOVUxMKSB7Ci0gICAgbGlzdC0+dGFpbC0+bmV4dCA9IHN0b3JhZ2U7Ci0gIH0gZWxzZSB7Ci0gICAgbGlzdC0+aGVhZCA9IHN0b3JhZ2U7Ci0gIH0KLSAgbGlzdC0+dGFpbCA9IHN0b3JhZ2U7Ci0gIGFzc2VydF92YWxpZF9saXN0KGxpc3QpOwotfQotCi12b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfbGlua190YWlsKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UpIHsKLSAgbGlua190YWlsKCZiYXRjaC0+bGlzdCwgc3RvcmFnZSk7Ci19Ci0KLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9tb3ZlKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNyYykgewotICAqZHN0ID0gKnNyYzsKLSAgbWVtc2V0KHNyYywgMCwgc2l6ZW9mKGdycGNfbWV0YWRhdGFfYmF0Y2gpKTsKLX0KLQotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlcihncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKigqZmlsdGVyKSh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKLSAgZ3JwY19saW5rZWRfbWRlbGVtICpsOwotICBncnBjX2xpbmtlZF9tZGVsZW0gKm5leHQ7Ci0KLSAgR1BSX1RJTUVSX0JFR0lOKCJncnBjX21ldGFkYXRhX2JhdGNoX2ZpbHRlciIsIDApOwotCi0gIGFzc2VydF92YWxpZF9saXN0KCZiYXRjaC0+bGlzdCk7Ci0gIGZvciAobCA9IGJhdGNoLT5saXN0LmhlYWQ7IGw7IGwgPSBuZXh0KSB7Ci0gICAgZ3JwY19tZGVsZW0gKm9yaWcgPSBsLT5tZDsKLSAgICBncnBjX21kZWxlbSAqZmlsdCA9IGZpbHRlcih1c2VyX2RhdGEsIG9yaWcpOwotICAgIG5leHQgPSBsLT5uZXh0OwotICAgIGlmIChmaWx0ID09IE5VTEwpIHsKLSAgICAgIGlmIChsLT5wcmV2KSB7Ci0gICAgICAgIGwtPnByZXYtPm5leHQgPSBsLT5uZXh0OwotICAgICAgfQotICAgICAgaWYgKGwtPm5leHQpIHsKLSAgICAgICAgbC0+bmV4dC0+cHJldiA9IGwtPnByZXY7Ci0gICAgICB9Ci0gICAgICBpZiAoYmF0Y2gtPmxpc3QuaGVhZCA9PSBsKSB7Ci0gICAgICAgIGJhdGNoLT5saXN0LmhlYWQgPSBsLT5uZXh0OwotICAgICAgfQotICAgICAgaWYgKGJhdGNoLT5saXN0LnRhaWwgPT0gbCkgewotICAgICAgICBiYXRjaC0+bGlzdC50YWlsID0gbC0+cHJldjsKLSAgICAgIH0KLSAgICAgIGFzc2VydF92YWxpZF9saXN0KCZiYXRjaC0+bGlzdCk7Ci0gICAgICBHUlBDX01ERUxFTV9VTlJFRihsLT5tZCk7Ci0gICAgfSBlbHNlIGlmIChmaWx0ICE9IG9yaWcpIHsKLSAgICAgIEdSUENfTURFTEVNX1VOUkVGKG9yaWcpOwotICAgICAgbC0+bWQgPSBmaWx0OwotICAgIH0KLSAgfQotICBhc3NlcnRfdmFsaWRfbGlzdCgmYmF0Y2gtPmxpc3QpOwotCi0gIEdQUl9USU1FUl9FTkQoImdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyIiwgMCk7Ci19Ci0KLXN0YXRpYyBncnBjX21kZWxlbSAqbm9fbWV0YWRhdGFfZm9yX3lvdSh2b2lkICp1c2VyX2RhdGEsIGdycGNfbWRlbGVtICplbGVtKSB7Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfY2xlYXIoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpIHsKLSAgYmF0Y2gtPmRlYWRsaW5lID0gZ3ByX2luZl9mdXR1cmUoR1BSX0NMT0NLX1JFQUxUSU1FKTsKLSAgZ3JwY19tZXRhZGF0YV9iYXRjaF9maWx0ZXIoYmF0Y2gsIG5vX21ldGFkYXRhX2Zvcl95b3UsIE5VTEwpOwotfQotCi1pbnQgZ3JwY19tZXRhZGF0YV9iYXRjaF9pc19lbXB0eShncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCkgewotICByZXR1cm4gYmF0Y2gtPmxpc3QuaGVhZCA9PSBOVUxMICYmCi0gICAgICAgICBncHJfdGltZV9jbXAoZ3ByX2luZl9mdXR1cmUoYmF0Y2gtPmRlYWRsaW5lLmNsb2NrX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgIGJhdGNoLT5kZWFkbGluZSkgPT0gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzdiMjguLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX01FVEFEQVRBX0JBVENIX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RSQU5TUE9SVF9NRVRBREFUQV9CQVRDSF9ICi0KLSNpbmNsdWRlIDxncnBjL2dycGMuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmgiCi0KLXR5cGVkZWYgc3RydWN0IGdycGNfbGlua2VkX21kZWxlbSB7Ci0gIGdycGNfbWRlbGVtICptZDsKLSAgc3RydWN0IGdycGNfbGlua2VkX21kZWxlbSAqbmV4dDsKLSAgc3RydWN0IGdycGNfbGlua2VkX21kZWxlbSAqcHJldjsKLSAgdm9pZCAqcmVzZXJ2ZWQ7Ci19IGdycGNfbGlua2VkX21kZWxlbTsKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY19tZGVsZW1fbGlzdCB7Ci0gIGdycGNfbGlua2VkX21kZWxlbSAqaGVhZDsKLSAgZ3JwY19saW5rZWRfbWRlbGVtICp0YWlsOwotfSBncnBjX21kZWxlbV9saXN0OwotCi10eXBlZGVmIHN0cnVjdCBncnBjX21ldGFkYXRhX2JhdGNoIHsKLSAgLyoqIE1ldGFkYXRhIGVsZW1lbnRzIGluIHRoaXMgYmF0Y2ggKi8KLSAgZ3JwY19tZGVsZW1fbGlzdCBsaXN0OwotICAvKiogVXNlZCB0byBjYWxjdWxhdGUgZ3JwYy10aW1lb3V0IGF0IHRoZSBwb2ludCBvZiBzZW5kaW5nLAotICAgICAgb3IgZ3ByX2luZl9mdXR1cmUgaWYgdGhpcyBiYXRjaCBkb2VzIG5vdCBuZWVkIHRvIHNlbmQgYQotICAgICAgZ3JwYy10aW1lb3V0ICovCi0gIGdwcl90aW1lc3BlYyBkZWFkbGluZTsKLX0gZ3JwY19tZXRhZGF0YV9iYXRjaDsKLQotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2luaXQoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpOwotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2Rlc3Ryb3koZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gpOwotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2NsZWFyKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKTsKLWludCBncnBjX21ldGFkYXRhX2JhdGNoX2lzX2VtcHR5KGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoKTsKLQotLyoqIE1vdmVzIHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmcm9tIFxhIHNyYyB0byBcYSBkc3QuIFVwb24gcmV0dXJuLCBcYSBzcmMgaXMKLSAqIHplcm9lZC4gKi8KLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9tb3ZlKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNyYyk7Ci0KLS8qKiBBZGQgXGEgc3RvcmFnZSB0byB0aGUgYmVnaW5uaW5nIG9mIFxhIGJhdGNoLiBzdG9yYWdlLT5tZCBpcwotICAgIGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0gICAgXGEgc3RvcmFnZSBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IHN1cnZpdmUgZm9yIHRoZQotICAgIGxpZmV0aW1lIG9mIGJhdGNoLiBUaGlzIHVzdWFsbHkgbWVhbnMgaXQgc2hvdWxkIGJlIGFyb3VuZAotICAgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNhbGwuICovCi12b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfbGlua19oZWFkKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UpOwotLyoqIEFkZCBcYSBzdG9yYWdlIHRvIHRoZSBlbmQgb2YgXGEgYmF0Y2guIHN0b3JhZ2UtPm1kIGlzCi0gICAgYXNzdW1lZCB0byBiZSB2YWxpZC4KLSAgICBcYSBzdG9yYWdlIGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIG11c3Qgc3Vydml2ZSBmb3IgdGhlCi0gICAgbGlmZXRpbWUgb2YgYmF0Y2guIFRoaXMgdXN1YWxseSBtZWFucyBpdCBzaG91bGQgYmUgYXJvdW5kCi0gICAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY2FsbC4gKi8KLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9saW5rX3RhaWwoZ3JwY19tZXRhZGF0YV9iYXRjaCAqYmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSk7Ci0KLS8qKiBBZGQgXGEgZWxlbV90b19hZGQgYXMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gXGEgYmF0Y2gsIHVzaW5nCi0gICAgXGEgc3RvcmFnZSBhcyBiYWNraW5nIHN0b3JhZ2UgZm9yIHRoZSBsaW5rZWQgbGlzdCBlbGVtZW50LgotICAgIFxhIHN0b3JhZ2UgaXMgb3duZWQgYnkgdGhlIGNhbGxlciBhbmQgbXVzdCBzdXJ2aXZlIGZvciB0aGUKLSAgICBsaWZldGltZSBvZiBiYXRjaC4gVGhpcyB1c3VhbGx5IG1lYW5zIGl0IHNob3VsZCBiZSBhcm91bmQKLSAgICBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjYWxsLgotICAgIFRha2VzIG93bmVyc2hpcCBvZiBcYSBlbGVtX3RvX2FkZCAqLwotdm9pZCBncnBjX21ldGFkYXRhX2JhdGNoX2FkZF9oZWFkKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfbGlua2VkX21kZWxlbSAqc3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqZWxlbV90b19hZGQpOwotLyoqIEFkZCBcYSBlbGVtX3RvX2FkZCBhcyB0aGUgbGFzdCBlbGVtZW50IGluIFxhIGJhdGNoLCB1c2luZwotICAgIFxhIHN0b3JhZ2UgYXMgYmFja2luZyBzdG9yYWdlIGZvciB0aGUgbGlua2VkIGxpc3QgZWxlbWVudC4KLSAgICBcYSBzdG9yYWdlIGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIG11c3Qgc3Vydml2ZSBmb3IgdGhlCi0gICAgbGlmZXRpbWUgb2YgYmF0Y2guIFRoaXMgdXN1YWxseSBtZWFucyBpdCBzaG91bGQgYmUgYXJvdW5kCi0gICAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY2FsbC4KLSAgICBUYWtlcyBvd25lcnNoaXAgb2YgXGEgZWxlbV90b19hZGQgKi8KLXZvaWQgZ3JwY19tZXRhZGF0YV9iYXRjaF9hZGRfdGFpbChncnBjX21ldGFkYXRhX2JhdGNoICpiYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2xpbmtlZF9tZGVsZW0gKnN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19tZGVsZW0gKmVsZW1fdG9fYWRkKTsKLQotLyoqIEZvciBlYWNoIGVsZW1lbnQgaW4gXGEgYmF0Y2gsIGV4ZWN1dGUgXGEgZmlsdGVyLgotICAgIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBcYSBmaWx0ZXIgd2lsbCBiZSBzdWJzdGl0dXRlZCBmb3IgdGhlCi0gICAgZ3JwY19tZGVsZW0gcGFzc2VkIHRvIFxhIGZpbHRlci4gSWYgXGEgZmlsdGVyIHJldHVybnMgTlVMTCwKLSAgICB0aGUgZWxlbWVudCB3aWxsIGJlIG1vdmVkIHRvIHRoZSBnYXJiYWdlIGxpc3QuICovCi12b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfZmlsdGVyKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqKCpmaWx0ZXIpKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX21kZWxlbSAqZWxlbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIGdycGNfbWV0YWRhdGFfYmF0Y2hfYXNzZXJ0X29rKGdycGNfbWV0YWRhdGFfYmF0Y2ggKmNvbWQpOwotI2Vsc2UKLSNkZWZpbmUgZ3JwY19tZXRhZGF0YV9iYXRjaF9hc3NlcnRfb2soY29tZCkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfTUVUQURBVEFfQkFUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIGIvc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGJiYjg5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0vKgotICogV0FSTklORzogQXV0by1nZW5lcmF0ZWQgY29kZS4KLSAqCi0gKiBUbyBtYWtlIGNoYW5nZXMgdG8gdGhpcyBmaWxlLCBjaGFuZ2UKLSAqIHRvb2xzL2NvZGVnZW4vY29yZS9nZW5fc3RhdGljX21ldGFkYXRhLnB5LAotICogYW5kIHRoZW4gcmUtcnVuIGl0LgotICoKLSAqIFNlZSBtZXRhZGF0YS5oIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgaW50ZXJmYWNlIGhlcmUsIGFuZCBtZXRhZGF0YS5jIGZvcgotICogYW4KLSAqIGV4cGxhbmF0aW9uIG9mIHdoYXQncyBnb2luZyBvbi4KLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgotCi1ncnBjX21kc3RyIGdycGNfc3RhdGljX21kc3RyX3RhYmxlW0dSUENfU1RBVElDX01EU1RSX0NPVU5UXTsKLQotZ3JwY19tZGVsZW0gZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlW0dSUENfU1RBVElDX01ERUxFTV9DT1VOVF07Ci11aW50cHRyX3QgZ3JwY19zdGF0aWNfbWRlbGVtX3VzZXJfZGF0YVtHUlBDX1NUQVRJQ19NREVMRU1fQ09VTlRdID0gewotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgNCwgOCwgNiwgMiwgNCwgOCwgNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCi1jb25zdCB1aW50OF90IGdycGNfc3RhdGljX21ldGFkYXRhX2VsZW1faW5kaWNlc1tHUlBDX1NUQVRJQ19NREVMRU1fQ09VTlQgKiAyXSA9Ci0gICAgezExLCAzNSwgMTAsIDM1LCAxMiwgMzUsIDEyLCA0OSwgMTMsIDM1LCAxNCwgMzUsIDE1LCAzNSwgMTYsIDM1LCAxNywgMzUsCi0gICAgIDE5LCAzNSwgMjAsIDM1LCAyMSwgMzUsIDI0LCAzNSwgMjUsIDM1LCAyNiwgMzUsIDI3LCAzNSwgMjgsIDM1LCAyOSwgMzUsCi0gICAgIDMwLCAxOCwgMzAsIDM1LCAzMSwgMzUsIDMyLCAzNSwgMzYsIDM1LCAzNywgMzUsIDM4LCAzNSwgMzksIDM1LCA0MiwgMzMsCi0gICAgIDQyLCAzNCwgNDIsIDQ4LCA0MiwgNTMsIDQyLCA1NCwgNDIsIDU1LCA0MiwgNTYsIDQzLCAzMywgNDMsIDQ4LCA0MywgNTMsCi0gICAgIDQ2LCAwLCAgNDYsIDEsICA0NiwgMiwgIDUwLCAzNSwgNTcsIDM1LCA1OCwgMzUsIDU5LCAzNSwgNjAsIDM1LCA2MSwgMzUsCi0gICAgIDYyLCAzNSwgNjMsIDM1LCA2NCwgMzUsIDY1LCAzNSwgNjYsIDQwLCA2NiwgNjgsIDY3LCA3OCwgNjcsIDc5LCA2OSwgMzUsCi0gICAgIDcwLCAzNSwgNzEsIDM1LCA3MiwgMzUsIDczLCAzNSwgNzQsIDM1LCA3NSwgNDEsIDc1LCA1MSwgNzUsIDUyLCA3NiwgMzUsCi0gICAgIDc3LCAzNSwgODAsIDMsICA4MCwgNCwgIDgwLCA1LCAgODAsIDYsICA4MCwgNywgIDgwLCA4LCAgODAsIDksICA4MSwgMzUsCi0gICAgIDgyLCA4MywgODQsIDM1LCA4NSwgMzUsIDg2LCAzNSwgODcsIDM1LCA4OCwgMzV9OwotCi1jb25zdCBjaGFyICpjb25zdCBncnBjX3N0YXRpY19tZXRhZGF0YV9zdHJpbmdzW0dSUENfU1RBVElDX01EU1RSX0NPVU5UXSA9IHsKLSAgICAiMCIsCi0gICAgIjEiLAotICAgICIyIiwKLSAgICAiMjAwIiwKLSAgICAiMjA0IiwKLSAgICAiMjA2IiwKLSAgICAiMzA0IiwKLSAgICAiNDAwIiwKLSAgICAiNDA0IiwKLSAgICAiNTAwIiwKLSAgICAiYWNjZXB0IiwKLSAgICAiYWNjZXB0LWNoYXJzZXQiLAotICAgICJhY2NlcHQtZW5jb2RpbmciLAotICAgICJhY2NlcHQtbGFuZ3VhZ2UiLAotICAgICJhY2NlcHQtcmFuZ2VzIiwKLSAgICAiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luIiwKLSAgICAiYWdlIiwKLSAgICAiYWxsb3ciLAotICAgICJhcHBsaWNhdGlvbi9ncnBjIiwKLSAgICAiOmF1dGhvcml0eSIsCi0gICAgImF1dGhvcml6YXRpb24iLAotICAgICJjYWNoZS1jb250cm9sIiwKLSAgICAiY2Vuc3VzLWJpbiIsCi0gICAgImNlbnN1cy1iaW5hcnktYmluIiwKLSAgICAiY29udGVudC1kaXNwb3NpdGlvbiIsCi0gICAgImNvbnRlbnQtZW5jb2RpbmciLAotICAgICJjb250ZW50LWxhbmd1YWdlIiwKLSAgICAiY29udGVudC1sZW5ndGgiLAotICAgICJjb250ZW50LWxvY2F0aW9uIiwKLSAgICAiY29udGVudC1yYW5nZSIsCi0gICAgImNvbnRlbnQtdHlwZSIsCi0gICAgImNvb2tpZSIsCi0gICAgImRhdGUiLAotICAgICJkZWZsYXRlIiwKLSAgICAiZGVmbGF0ZSxnemlwIiwKLSAgICAiIiwKLSAgICAiZXRhZyIsCi0gICAgImV4cGVjdCIsCi0gICAgImV4cGlyZXMiLAotICAgICJmcm9tIiwKLSAgICAiR0VUIiwKLSAgICAiZ3JwYyIsCi0gICAgImdycGMtYWNjZXB0LWVuY29kaW5nIiwKLSAgICAiZ3JwYy1lbmNvZGluZyIsCi0gICAgImdycGMtaW50ZXJuYWwtZW5jb2RpbmctcmVxdWVzdCIsCi0gICAgImdycGMtbWVzc2FnZSIsCi0gICAgImdycGMtc3RhdHVzIiwKLSAgICAiZ3JwYy10aW1lb3V0IiwKLSAgICAiZ3ppcCIsCi0gICAgImd6aXAsIGRlZmxhdGUiLAotICAgICJob3N0IiwKLSAgICAiaHR0cCIsCi0gICAgImh0dHBzIiwKLSAgICAiaWRlbnRpdHkiLAotICAgICJpZGVudGl0eSxkZWZsYXRlIiwKLSAgICAiaWRlbnRpdHksZGVmbGF0ZSxnemlwIiwKLSAgICAiaWRlbnRpdHksZ3ppcCIsCi0gICAgImlmLW1hdGNoIiwKLSAgICAiaWYtbW9kaWZpZWQtc2luY2UiLAotICAgICJpZi1ub25lLW1hdGNoIiwKLSAgICAiaWYtcmFuZ2UiLAotICAgICJpZi11bm1vZGlmaWVkLXNpbmNlIiwKLSAgICAibGFzdC1tb2RpZmllZCIsCi0gICAgImxpbmsiLAotICAgICJsb2NhdGlvbiIsCi0gICAgIm1heC1mb3J3YXJkcyIsCi0gICAgIjptZXRob2QiLAotICAgICI6cGF0aCIsCi0gICAgIlBPU1QiLAotICAgICJwcm94eS1hdXRoZW50aWNhdGUiLAotICAgICJwcm94eS1hdXRob3JpemF0aW9uIiwKLSAgICAicmFuZ2UiLAotICAgICJyZWZlcmVyIiwKLSAgICAicmVmcmVzaCIsCi0gICAgInJldHJ5LWFmdGVyIiwKLSAgICAiOnNjaGVtZSIsCi0gICAgInNlcnZlciIsCi0gICAgInNldC1jb29raWUiLAotICAgICIvIiwKLSAgICAiL2luZGV4Lmh0bWwiLAotICAgICI6c3RhdHVzIiwKLSAgICAic3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eSIsCi0gICAgInRlIiwKLSAgICAidHJhaWxlcnMiLAotICAgICJ0cmFuc2Zlci1lbmNvZGluZyIsCi0gICAgInVzZXItYWdlbnQiLAotICAgICJ2YXJ5IiwKLSAgICAidmlhIiwKLSAgICAid3d3LWF1dGhlbnRpY2F0ZSJ9OwotCi1jb25zdCB1aW50OF90IGdycGNfc3RhdGljX2FjY2VwdF9lbmNvZGluZ19tZXRhZGF0YVs4XSA9IHswLCAgMjksIDI2LCAzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LCAzMiwgMjcsIDMxfTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0NDJmOC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyoKLSAqIFdBUk5JTkc6IEF1dG8tZ2VuZXJhdGVkIGNvZGUuCi0gKgotICogVG8gbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSwgY2hhbmdlCi0gKiB0b29scy9jb2RlZ2VuL2NvcmUvZ2VuX3N0YXRpY19tZXRhZGF0YS5weSwKLSAqIGFuZCB0aGVuIHJlLXJ1biBpdC4KLSAqCi0gKiBTZWUgbWV0YWRhdGEuaCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGludGVyZmFjZSBoZXJlLCBhbmQgbWV0YWRhdGEuYyBmb3IKLSAqIGFuCi0gKiBleHBsYW5hdGlvbiBvZiB3aGF0J3MgZ29pbmcgb24uCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX1NUQVRJQ19NRVRBREFUQV9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfU1RBVElDX01FVEFEQVRBX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIgotCi0jZGVmaW5lIEdSUENfU1RBVElDX01EU1RSX0NPVU5UIDg5Ci1leHRlcm4gZ3JwY19tZHN0ciBncnBjX3N0YXRpY19tZHN0cl90YWJsZVtHUlBDX1NUQVRJQ19NRFNUUl9DT1VOVF07Ci0vKiAiMCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl8wICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMF0pCi0vKiAiMSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl8xICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMV0pCi0vKiAiMiIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl8yICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMl0pCi0vKiAiMjAwIiAqLwotI2RlZmluZSBHUlBDX01EU1RSXzIwMCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzNdKQotLyogIjIwNCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl8yMDQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs0XSkKLS8qICIyMDYiICovCi0jZGVmaW5lIEdSUENfTURTVFJfMjA2ICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNV0pCi0vKiAiMzA0IiAqLwotI2RlZmluZSBHUlBDX01EU1RSXzMwNCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzZdKQotLyogIjQwMCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl80MDAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3XSkKLS8qICI0MDQiICovCi0jZGVmaW5lIEdSUENfTURTVFJfNDA0ICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbOF0pCi0vKiAiNTAwIiAqLwotI2RlZmluZSBHUlBDX01EU1RSXzUwMCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzldKQotLyogImFjY2VwdCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9BQ0NFUFQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsxMF0pCi0vKiAiYWNjZXB0LWNoYXJzZXQiICovCi0jZGVmaW5lIEdSUENfTURTVFJfQUNDRVBUX0NIQVJTRVQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsxMV0pCi0vKiAiYWNjZXB0LWVuY29kaW5nIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0FDQ0VQVF9FTkNPRElORyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzEyXSkKLS8qICJhY2NlcHQtbGFuZ3VhZ2UiICovCi0jZGVmaW5lIEdSUENfTURTVFJfQUNDRVBUX0xBTkdVQUdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTNdKQotLyogImFjY2VwdC1yYW5nZXMiICovCi0jZGVmaW5lIEdSUENfTURTVFJfQUNDRVBUX1JBTkdFUyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzE0XSkKLS8qICJhY2Nlc3MtY29udHJvbC1hbGxvdy1vcmlnaW4iICovCi0jZGVmaW5lIEdSUENfTURTVFJfQUNDRVNTX0NPTlRST0xfQUxMT1dfT1JJR0lOICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTVdKQotLyogImFnZSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9BR0UgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsxNl0pCi0vKiAiYWxsb3ciICovCi0jZGVmaW5lIEdSUENfTURTVFJfQUxMT1cgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsxN10pCi0vKiAiYXBwbGljYXRpb24vZ3JwYyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9BUFBMSUNBVElPTl9TTEFTSF9HUlBDICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMThdKQotLyogIjphdXRob3JpdHkiICovCi0jZGVmaW5lIEdSUENfTURTVFJfQVVUSE9SSVRZICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMTldKQotLyogImF1dGhvcml6YXRpb24iICovCi0jZGVmaW5lIEdSUENfTURTVFJfQVVUSE9SSVpBVElPTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzIwXSkKLS8qICJjYWNoZS1jb250cm9sIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0NBQ0hFX0NPTlRST0wgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsyMV0pCi0vKiAiY2Vuc3VzLWJpbiIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9DRU5TVVNfQklOICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjJdKQotLyogImNlbnN1cy1iaW5hcnktYmluIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0NFTlNVU19CSU5BUllfQklOICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjNdKQotLyogImNvbnRlbnQtZGlzcG9zaXRpb24iICovCi0jZGVmaW5lIEdSUENfTURTVFJfQ09OVEVOVF9ESVNQT1NJVElPTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzI0XSkKLS8qICJjb250ZW50LWVuY29kaW5nIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0NPTlRFTlRfRU5DT0RJTkcgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsyNV0pCi0vKiAiY29udGVudC1sYW5ndWFnZSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9DT05URU5UX0xBTkdVQUdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjZdKQotLyogImNvbnRlbnQtbGVuZ3RoIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0NPTlRFTlRfTEVOR1RIICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMjddKQotLyogImNvbnRlbnQtbG9jYXRpb24iICovCi0jZGVmaW5lIEdSUENfTURTVFJfQ09OVEVOVF9MT0NBVElPTiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzI4XSkKLS8qICJjb250ZW50LXJhbmdlIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0NPTlRFTlRfUkFOR0UgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVsyOV0pCi0vKiAiY29udGVudC10eXBlIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0NPTlRFTlRfVFlQRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzMwXSkKLS8qICJjb29raWUiICovCi0jZGVmaW5lIEdSUENfTURTVFJfQ09PS0lFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMzFdKQotLyogImRhdGUiICovCi0jZGVmaW5lIEdSUENfTURTVFJfREFURSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzMyXSkKLS8qICJkZWZsYXRlIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0RFRkxBVEUgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszM10pCi0vKiAiZGVmbGF0ZSxnemlwIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0RFRkxBVEVfQ09NTUFfR1pJUCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzM0XSkKLS8qICIiICovCi0jZGVmaW5lIEdSUENfTURTVFJfRU1QVFkgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszNV0pCi0vKiAiZXRhZyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9FVEFHICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMzZdKQotLyogImV4cGVjdCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9FWFBFQ1QgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVszN10pCi0vKiAiZXhwaXJlcyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9FWFBJUkVTICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbMzhdKQotLyogImZyb20iICovCi0jZGVmaW5lIEdSUENfTURTVFJfRlJPTSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzM5XSkKLS8qICJHRVQiICovCi0jZGVmaW5lIEdSUENfTURTVFJfR0VUICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDBdKQotLyogImdycGMiICovCi0jZGVmaW5lIEdSUENfTURTVFJfR1JQQyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQxXSkKLS8qICJncnBjLWFjY2VwdC1lbmNvZGluZyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9HUlBDX0FDQ0VQVF9FTkNPRElORyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQyXSkKLS8qICJncnBjLWVuY29kaW5nIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0dSUENfRU5DT0RJTkcgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs0M10pCi0vKiAiZ3JwYy1pbnRlcm5hbC1lbmNvZGluZy1yZXF1ZXN0IiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0dSUENfSU5URVJOQUxfRU5DT0RJTkdfUkVRVUVTVCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzQ0XSkKLS8qICJncnBjLW1lc3NhZ2UiICovCi0jZGVmaW5lIEdSUENfTURTVFJfR1JQQ19NRVNTQUdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDVdKQotLyogImdycGMtc3RhdHVzIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0dSUENfU1RBVFVTICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDZdKQotLyogImdycGMtdGltZW91dCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9HUlBDX1RJTUVPVVQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs0N10pCi0vKiAiZ3ppcCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9HWklQICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDhdKQotLyogImd6aXAsIGRlZmxhdGUiICovCi0jZGVmaW5lIEdSUENfTURTVFJfR1pJUF9DT01NQV9ERUZMQVRFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNDldKQotLyogImhvc3QiICovCi0jZGVmaW5lIEdSUENfTURTVFJfSE9TVCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzUwXSkKLS8qICJodHRwIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0hUVFAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1MV0pCi0vKiAiaHR0cHMiICovCi0jZGVmaW5lIEdSUENfTURTVFJfSFRUUFMgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1Ml0pCi0vKiAiaWRlbnRpdHkiICovCi0jZGVmaW5lIEdSUENfTURTVFJfSURFTlRJVFkgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1M10pCi0vKiAiaWRlbnRpdHksZGVmbGF0ZSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9JREVOVElUWV9DT01NQV9ERUZMQVRFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTRdKQotLyogImlkZW50aXR5LGRlZmxhdGUsZ3ppcCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9JREVOVElUWV9DT01NQV9ERUZMQVRFX0NPTU1BX0daSVAgXAotICAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzU1XSkKLS8qICJpZGVudGl0eSxnemlwIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0lERU5USVRZX0NPTU1BX0daSVAgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1Nl0pCi0vKiAiaWYtbWF0Y2giICovCi0jZGVmaW5lIEdSUENfTURTVFJfSUZfTUFUQ0ggKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1N10pCi0vKiAiaWYtbW9kaWZpZWQtc2luY2UiICovCi0jZGVmaW5lIEdSUENfTURTVFJfSUZfTU9ESUZJRURfU0lOQ0UgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs1OF0pCi0vKiAiaWYtbm9uZS1tYXRjaCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9JRl9OT05FX01BVENIICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNTldKQotLyogImlmLXJhbmdlIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0lGX1JBTkdFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjBdKQotLyogImlmLXVubW9kaWZpZWQtc2luY2UiICovCi0jZGVmaW5lIEdSUENfTURTVFJfSUZfVU5NT0RJRklFRF9TSU5DRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzYxXSkKLS8qICJsYXN0LW1vZGlmaWVkIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0xBU1RfTU9ESUZJRUQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2Ml0pCi0vKiAibGluayIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9MSU5LICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjNdKQotLyogImxvY2F0aW9uIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX0xPQ0FUSU9OICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNjRdKQotLyogIm1heC1mb3J3YXJkcyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9NQVhfRk9SV0FSRFMgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2NV0pCi0vKiAiOm1ldGhvZCIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9NRVRIT0QgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2Nl0pCi0vKiAiOnBhdGgiICovCi0jZGVmaW5lIEdSUENfTURTVFJfUEFUSCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzY3XSkKLS8qICJQT1NUIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1BPU1QgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs2OF0pCi0vKiAicHJveHktYXV0aGVudGljYXRlIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1BST1hZX0FVVEhFTlRJQ0FURSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzY5XSkKLS8qICJwcm94eS1hdXRob3JpemF0aW9uIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1BST1hZX0FVVEhPUklaQVRJT04gKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3MF0pCi0vKiAicmFuZ2UiICovCi0jZGVmaW5lIEdSUENfTURTVFJfUkFOR0UgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs3MV0pCi0vKiAicmVmZXJlciIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9SRUZFUkVSICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNzJdKQotLyogInJlZnJlc2giICovCi0jZGVmaW5lIEdSUENfTURTVFJfUkVGUkVTSCAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzczXSkKLS8qICJyZXRyeS1hZnRlciIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9SRVRSWV9BRlRFUiAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzc0XSkKLS8qICI6c2NoZW1lIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1NDSEVNRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzc1XSkKLS8qICJzZXJ2ZXIiICovCi0jZGVmaW5lIEdSUENfTURTVFJfU0VSVkVSICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNzZdKQotLyogInNldC1jb29raWUiICovCi0jZGVmaW5lIEdSUENfTURTVFJfU0VUX0NPT0tJRSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzc3XSkKLS8qICIvIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1NMQVNIICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNzhdKQotLyogIi9pbmRleC5odG1sIiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1NMQVNIX0lOREVYX0RPVF9IVE1MICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbNzldKQotLyogIjpzdGF0dXMiICovCi0jZGVmaW5lIEdSUENfTURTVFJfU1RBVFVTICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbODBdKQotLyogInN0cmljdC10cmFuc3BvcnQtc2VjdXJpdHkiICovCi0jZGVmaW5lIEdSUENfTURTVFJfU1RSSUNUX1RSQU5TUE9SVF9TRUNVUklUWSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzgxXSkKLS8qICJ0ZSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9URSAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzgyXSkKLS8qICJ0cmFpbGVycyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9UUkFJTEVSUyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzgzXSkKLS8qICJ0cmFuc2Zlci1lbmNvZGluZyIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9UUkFOU0ZFUl9FTkNPRElORyAoJmdycGNfc3RhdGljX21kc3RyX3RhYmxlWzg0XSkKLS8qICJ1c2VyLWFnZW50IiAqLwotI2RlZmluZSBHUlBDX01EU1RSX1VTRVJfQUdFTlQgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs4NV0pCi0vKiAidmFyeSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9WQVJZICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbODZdKQotLyogInZpYSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9WSUEgKCZncnBjX3N0YXRpY19tZHN0cl90YWJsZVs4N10pCi0vKiAid3d3LWF1dGhlbnRpY2F0ZSIgKi8KLSNkZWZpbmUgR1JQQ19NRFNUUl9XV1dfQVVUSEVOVElDQVRFICgmZ3JwY19zdGF0aWNfbWRzdHJfdGFibGVbODhdKQotCi0jZGVmaW5lIEdSUENfU1RBVElDX01ERUxFTV9DT1VOVCA3OAotZXh0ZXJuIGdycGNfbWRlbGVtIGdycGNfc3RhdGljX21kZWxlbV90YWJsZVtHUlBDX1NUQVRJQ19NREVMRU1fQ09VTlRdOwotZXh0ZXJuIHVpbnRwdHJfdCBncnBjX3N0YXRpY19tZGVsZW1fdXNlcl9kYXRhW0dSUENfU1RBVElDX01ERUxFTV9DT1VOVF07Ci0vKiAiYWNjZXB0LWNoYXJzZXQiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9BQ0NFUFRfQ0hBUlNFVF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVswXSkKLS8qICJhY2NlcHQiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9BQ0NFUFRfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMV0pCi0vKiAiYWNjZXB0LWVuY29kaW5nIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX0VOQ09ESU5HX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzJdKQotLyogImFjY2VwdC1lbmNvZGluZyI6ICJnemlwLCBkZWZsYXRlIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9BQ0NFUFRfRU5DT0RJTkdfR1pJUF9DT01NQV9ERUZMQVRFIFwKLSAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbM10pCi0vKiAiYWNjZXB0LWxhbmd1YWdlIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX0xBTkdVQUdFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzRdKQotLyogImFjY2VwdC1yYW5nZXMiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9BQ0NFUFRfUkFOR0VTX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzVdKQotLyogImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpbiI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0FDQ0VTU19DT05UUk9MX0FMTE9XX09SSUdJTl9FTVBUWSBcCi0gICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzZdKQotLyogImFnZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0FHRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3XSkKLS8qICJhbGxvdyI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0FMTE9XX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzhdKQotLyogIjphdXRob3JpdHkiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9BVVRIT1JJVFlfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbOV0pCi0vKiAiYXV0aG9yaXphdGlvbiI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0FVVEhPUklaQVRJT05fRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMTBdKQotLyogImNhY2hlLWNvbnRyb2wiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9DQUNIRV9DT05UUk9MX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzExXSkKLS8qICJjb250ZW50LWRpc3Bvc2l0aW9uIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fQ09OVEVOVF9ESVNQT1NJVElPTl9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsxMl0pCi0vKiAiY29udGVudC1lbmNvZGluZyI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0NPTlRFTlRfRU5DT0RJTkdfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMTNdKQotLyogImNvbnRlbnQtbGFuZ3VhZ2UiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9DT05URU5UX0xBTkdVQUdFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzE0XSkKLS8qICJjb250ZW50LWxlbmd0aCI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0NPTlRFTlRfTEVOR1RIX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzE1XSkKLS8qICJjb250ZW50LWxvY2F0aW9uIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fQ09OVEVOVF9MT0NBVElPTl9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsxNl0pCi0vKiAiY29udGVudC1yYW5nZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0NPTlRFTlRfUkFOR0VfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMTddKQotLyogImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9ncnBjIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9DT05URU5UX1RZUEVfQVBQTElDQVRJT05fU0xBU0hfR1JQQyBcCi0gICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzE4XSkKLS8qICJjb250ZW50LXR5cGUiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9DT05URU5UX1RZUEVfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMTldKQotLyogImNvb2tpZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0NPT0tJRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyMF0pCi0vKiAiZGF0ZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0RBVEVfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjFdKQotLyogImV0YWciOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9FVEFHX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzIyXSkKLS8qICJleHBlY3QiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9FWFBFQ1RfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjNdKQotLyogImV4cGlyZXMiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9FWFBJUkVTX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzI0XSkKLS8qICJmcm9tIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fRlJPTV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyNV0pCi0vKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciOiAiZGVmbGF0ZSIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fR1JQQ19BQ0NFUFRfRU5DT0RJTkdfREVGTEFURSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyNl0pCi0vKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciOiAiZGVmbGF0ZSxnemlwIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0FDQ0VQVF9FTkNPRElOR19ERUZMQVRFX0NPTU1BX0daSVAgXAotICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyN10pCi0vKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciOiAiZ3ppcCIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fR1JQQ19BQ0NFUFRfRU5DT0RJTkdfR1pJUCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVsyOF0pCi0vKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciOiAiaWRlbnRpdHkiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfQUNDRVBUX0VOQ09ESU5HX0lERU5USVRZIFwKLSAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMjldKQotLyogImdycGMtYWNjZXB0LWVuY29kaW5nIjogImlkZW50aXR5LGRlZmxhdGUiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfQUNDRVBUX0VOQ09ESU5HX0lERU5USVRZX0NPTU1BX0RFRkxBVEUgXAotICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVszMF0pCi0vKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciOiAiaWRlbnRpdHksZGVmbGF0ZSxnemlwIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0FDQ0VQVF9FTkNPRElOR19JREVOVElUWV9DT01NQV9ERUZMQVRFX0NPTU1BX0daSVAgXAotICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVszMV0pCi0vKiAiZ3JwYy1hY2NlcHQtZW5jb2RpbmciOiAiaWRlbnRpdHksZ3ppcCIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fR1JQQ19BQ0NFUFRfRU5DT0RJTkdfSURFTlRJVFlfQ09NTUFfR1pJUCBcCi0gICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzMyXSkKLS8qICJncnBjLWVuY29kaW5nIjogImRlZmxhdGUiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfRU5DT0RJTkdfREVGTEFURSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVszM10pCi0vKiAiZ3JwYy1lbmNvZGluZyI6ICJnemlwIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9HUlBDX0VOQ09ESU5HX0daSVAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzRdKQotLyogImdycGMtZW5jb2RpbmciOiAiaWRlbnRpdHkiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfRU5DT0RJTkdfSURFTlRJVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzVdKQotLyogImdycGMtc3RhdHVzIjogIjAiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzZdKQotLyogImdycGMtc3RhdHVzIjogIjEiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzEgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzddKQotLyogImdycGMtc3RhdHVzIjogIjIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0dSUENfU1RBVFVTXzIgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbMzhdKQotLyogImhvc3QiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9IT1NUX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzM5XSkKLS8qICJpZi1tYXRjaCI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0lGX01BVENIX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzQwXSkKLS8qICJpZi1tb2RpZmllZC1zaW5jZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0lGX01PRElGSUVEX1NJTkNFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzQxXSkKLS8qICJpZi1ub25lLW1hdGNoIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fSUZfTk9ORV9NQVRDSF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0Ml0pCi0vKiAiaWYtcmFuZ2UiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9JRl9SQU5HRV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0M10pCi0vKiAiaWYtdW5tb2RpZmllZC1zaW5jZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX0lGX1VOTU9ESUZJRURfU0lOQ0VfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNDRdKQotLyogImxhc3QtbW9kaWZpZWQiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9MQVNUX01PRElGSUVEX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzQ1XSkKLS8qICJsaW5rIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fTElOS19FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0Nl0pCi0vKiAibG9jYXRpb24iOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9MT0NBVElPTl9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0N10pCi0vKiAibWF4LWZvcndhcmRzIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fTUFYX0ZPUldBUkRTX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzQ4XSkKLS8qICI6bWV0aG9kIjogIkdFVCIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fTUVUSE9EX0dFVCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs0OV0pCi0vKiAiOm1ldGhvZCI6ICJQT1NUIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9NRVRIT0RfUE9TVCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1MF0pCi0vKiAiOnBhdGgiOiAiLyIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fUEFUSF9TTEFTSCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1MV0pCi0vKiAiOnBhdGgiOiAiL2luZGV4Lmh0bWwiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1BBVEhfU0xBU0hfSU5ERVhfRE9UX0hUTUwgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTJdKQotLyogInByb3h5LWF1dGhlbnRpY2F0ZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1BST1hZX0FVVEhFTlRJQ0FURV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1M10pCi0vKiAicHJveHktYXV0aG9yaXphdGlvbiI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1BST1hZX0FVVEhPUklaQVRJT05fRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTRdKQotLyogInJhbmdlIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fUkFOR0VfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNTVdKQotLyogInJlZmVyZXIiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9SRUZFUkVSX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzU2XSkKLS8qICJyZWZyZXNoIjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fUkVGUkVTSF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1N10pCi0vKiAicmV0cnktYWZ0ZXIiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9SRVRSWV9BRlRFUl9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1OF0pCi0vKiAiOnNjaGVtZSI6ICJncnBjIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9TQ0hFTUVfR1JQQyAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs1OV0pCi0vKiAiOnNjaGVtZSI6ICJodHRwIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9TQ0hFTUVfSFRUUCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2MF0pCi0vKiAiOnNjaGVtZSI6ICJodHRwcyIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fU0NIRU1FX0hUVFBTICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzYxXSkKLS8qICJzZXJ2ZXIiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9TRVJWRVJfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNjJdKQotLyogInNldC1jb29raWUiOiAiIiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9TRVRfQ09PS0lFX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzYzXSkKLS8qICI6c3RhdHVzIjogIjIwMCIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fU1RBVFVTXzIwMCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2NF0pCi0vKiAiOnN0YXR1cyI6ICIyMDQiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1NUQVRVU18yMDQgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNjVdKQotLyogIjpzdGF0dXMiOiAiMjA2IiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9TVEFUVVNfMjA2ICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzY2XSkKLS8qICI6c3RhdHVzIjogIjMwNCIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fU1RBVFVTXzMwNCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs2N10pCi0vKiAiOnN0YXR1cyI6ICI0MDAiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1NUQVRVU180MDAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNjhdKQotLyogIjpzdGF0dXMiOiAiNDA0IiAqLwotI2RlZmluZSBHUlBDX01ERUxFTV9TVEFUVVNfNDA0ICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzY5XSkKLS8qICI6c3RhdHVzIjogIjUwMCIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fU1RBVFVTXzUwMCAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3MF0pCi0vKiAic3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1NUUklDVF9UUkFOU1BPUlRfU0VDVVJJVFlfRU1QVFkgXAotICAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3MV0pCi0vKiAidGUiOiAidHJhaWxlcnMiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1RFX1RSQUlMRVJTICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzcyXSkKLS8qICJ0cmFuc2Zlci1lbmNvZGluZyI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1RSQU5TRkVSX0VOQ09ESU5HX0VNUFRZICgmZ3JwY19zdGF0aWNfbWRlbGVtX3RhYmxlWzczXSkKLS8qICJ1c2VyLWFnZW50IjogIiIgKi8KLSNkZWZpbmUgR1JQQ19NREVMRU1fVVNFUl9BR0VOVF9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3NF0pCi0vKiAidmFyeSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1ZBUllfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNzVdKQotLyogInZpYSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1ZJQV9FTVBUWSAoJmdycGNfc3RhdGljX21kZWxlbV90YWJsZVs3Nl0pCi0vKiAid3d3LWF1dGhlbnRpY2F0ZSI6ICIiICovCi0jZGVmaW5lIEdSUENfTURFTEVNX1dXV19BVVRIRU5USUNBVEVfRU1QVFkgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbNzddKQotCi1leHRlcm4gY29uc3QgdWludDhfdAotICAgIGdycGNfc3RhdGljX21ldGFkYXRhX2VsZW1faW5kaWNlc1tHUlBDX1NUQVRJQ19NREVMRU1fQ09VTlQgKiAyXTsKLWV4dGVybiBjb25zdCBjaGFyICpjb25zdCBncnBjX3N0YXRpY19tZXRhZGF0YV9zdHJpbmdzW0dSUENfU1RBVElDX01EU1RSX0NPVU5UXTsKLWV4dGVybiBjb25zdCB1aW50OF90IGdycGNfc3RhdGljX2FjY2VwdF9lbmNvZGluZ19tZXRhZGF0YVs4XTsKLSNkZWZpbmUgR1JQQ19NREVMRU1fQUNDRVBUX0VOQ09ESU5HX0ZPUl9BTEdPUklUSE1TKGFsZ3MpIFwKLSAgKCZncnBjX3N0YXRpY19tZGVsZW1fdGFibGVbZ3JwY19zdGF0aWNfYWNjZXB0X2VuY29kaW5nX21ldGFkYXRhWyhhbGdzKV1dKQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfU1RBVElDX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuYyBiL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NTVmYS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYXRtLmg+Ci0jaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIgotCi0jaWZkZWYgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcKLXZvaWQgZ3JwY19zdHJlYW1fcmVmKGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgY29uc3QgY2hhciAqcmVhc29uKSB7Ci0gIGdwcl9hdG0gdmFsID0gZ3ByX2F0bV9ub19iYXJyaWVyX2xvYWQoJnJlZmNvdW50LT5yZWZzLmNvdW50KTsKLSAgZ3ByX2xvZyhHUFJfREVCVUcsICIlcyAlcDolcCAgIFJFRiAlZC0+JWQgJXMiLCByZWZjb3VudC0+b2JqZWN0X3R5cGUsCi0gICAgICAgICAgcmVmY291bnQsIHJlZmNvdW50LT5kZXN0cm95LmNiX2FyZywgdmFsLCB2YWwgKyAxLCByZWFzb24pOwotI2Vsc2UKLXZvaWQgZ3JwY19zdHJlYW1fcmVmKGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCkgewotI2VuZGlmCi0gIGdwcl9yZWZfbm9uX3plcm8oJnJlZmNvdW50LT5yZWZzKTsKLX0KLQotI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCi12b2lkIGdycGNfc3RyZWFtX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3N0cmVhbV9yZWZjb3VudCAqcmVmY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikgewotICBncHJfYXRtIHZhbCA9IGdwcl9hdG1fbm9fYmFycmllcl9sb2FkKCZyZWZjb3VudC0+cmVmcy5jb3VudCk7Ci0gIGdwcl9sb2coR1BSX0RFQlVHLCAiJXMgJXA6JXAgVU5SRUYgJWQtPiVkICVzIiwgcmVmY291bnQtPm9iamVjdF90eXBlLAotICAgICAgICAgIHJlZmNvdW50LCByZWZjb3VudC0+ZGVzdHJveS5jYl9hcmcsIHZhbCwgdmFsIC0gMSwgcmVhc29uKTsKLSNlbHNlCi12b2lkIGdycGNfc3RyZWFtX3VucmVmKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbV9yZWZjb3VudCAqcmVmY291bnQpIHsKLSNlbmRpZgotICBpZiAoZ3ByX3VucmVmKCZyZWZjb3VudC0+cmVmcykpIHsKLSAgICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsICZyZWZjb3VudC0+ZGVzdHJveSwgdHJ1ZSwgTlVMTCk7Ci0gIH0KLX0KLQotI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCi12b2lkIGdycGNfc3RyZWFtX3JlZl9pbml0KGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgaW50IGluaXRpYWxfcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdF90eXBlKSB7Ci0gIHJlZmNvdW50LT5vYmplY3RfdHlwZSA9IG9iamVjdF90eXBlOwotI2Vsc2UKLXZvaWQgZ3JwY19zdHJlYW1fcmVmX2luaXQoZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50LCBpbnQgaW5pdGlhbF9yZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX2lvbWdyX2NiX2Z1bmMgY2IsIHZvaWQgKmNiX2FyZykgewotI2VuZGlmCi0gIGdwcl9yZWZfaW5pdCgmcmVmY291bnQtPnJlZnMsIGluaXRpYWxfcmVmcyk7Ci0gIGdycGNfY2xvc3VyZV9pbml0KCZyZWZjb3VudC0+ZGVzdHJveSwgY2IsIGNiX2FyZyk7Ci19Ci0KLXNpemVfdCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fc2l6ZShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KSB7Ci0gIHJldHVybiB0cmFuc3BvcnQtPnZ0YWJsZS0+c2l6ZW9mX3N0cmVhbTsKLX0KLQotdm9pZCBncnBjX3RyYW5zcG9ydF9kZXN0cm95KGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpIHsKLSAgdHJhbnNwb3J0LT52dGFibGUtPmRlc3Ryb3koZXhlY19jdHgsIHRyYW5zcG9ydCk7Ci19Ci0KLWludCBncnBjX3RyYW5zcG9ydF9pbml0X3N0cmVhbShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBncnBjX3N0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZXJ2ZXJfZGF0YSkgewotICByZXR1cm4gdHJhbnNwb3J0LT52dGFibGUtPmluaXRfc3RyZWFtKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIHN0cmVhbSwgcmVmY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2RhdGEpOwotfQotCi12b2lkIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKSB7Ci0gIHRyYW5zcG9ydC0+dnRhYmxlLT5wZXJmb3JtX3N0cmVhbV9vcChleGVjX2N0eCwgdHJhbnNwb3J0LCBzdHJlYW0sIG9wKTsKLX0KLQotdm9pZCBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKSB7Ci0gIHRyYW5zcG9ydC0+dnRhYmxlLT5wZXJmb3JtX29wKGV4ZWNfY3R4LCB0cmFuc3BvcnQsIG9wKTsKLX0KLQotdm9pZCBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3JwY19zdHJlYW0gKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KSB7Ci0gIHRyYW5zcG9ydC0+dnRhYmxlLT5zZXRfcG9sbHNldChleGVjX2N0eCwgdHJhbnNwb3J0LCBzdHJlYW0sIHBvbGxzZXQpOwotfQotCi12b2lkIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3lfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtKSB7Ci0gIHRyYW5zcG9ydC0+dnRhYmxlLT5kZXN0cm95X3N0cmVhbShleGVjX2N0eCwgdHJhbnNwb3J0LCBzdHJlYW0pOwotfQotCi1jaGFyICpncnBjX3RyYW5zcG9ydF9nZXRfcGVlcihncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpIHsKLSAgcmV0dXJuIHRyYW5zcG9ydC0+dnRhYmxlLT5nZXRfcGVlcihleGVjX2N0eCwgdHJhbnNwb3J0KTsKLX0KLQotdm9pZCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZSgKLSAgICBncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCkgewotICBncnBjX2V4ZWNfY3R4X2VucXVldWUoZXhlY19jdHgsIG9wLT5yZWN2X21lc3NhZ2VfcmVhZHksIGZhbHNlLCBOVUxMKTsKLSAgZ3JwY19leGVjX2N0eF9lbnF1ZXVlKGV4ZWNfY3R4LCBvcC0+cmVjdl9pbml0aWFsX21ldGFkYXRhX3JlYWR5LCBmYWxzZSwgTlVMTCk7Ci0gIGdycGNfZXhlY19jdHhfZW5xdWV1ZShleGVjX2N0eCwgb3AtPm9uX2NvbXBsZXRlLCBmYWxzZSwgTlVMTCk7Ci19Ci0KLXZvaWQgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2FkZF9jYW5jZWxsYXRpb24oZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpIHsKLSAgR1BSX0FTU0VSVChzdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0spOwotICBpZiAob3AtPmNhbmNlbF93aXRoX3N0YXR1cyA9PSBHUlBDX1NUQVRVU19PSykgewotICAgIG9wLT5jYW5jZWxfd2l0aF9zdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLSAgaWYgKG9wLT5jbG9zZV93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgewotICAgIG9wLT5jbG9zZV93aXRoX3N0YXR1cyA9IEdSUENfU1RBVFVTX09LOwotICAgIGlmIChvcC0+b3B0aW9uYWxfY2xvc2VfbWVzc2FnZSAhPSBOVUxMKSB7Ci0gICAgICBncHJfc2xpY2VfdW5yZWYoKm9wLT5vcHRpb25hbF9jbG9zZV9tZXNzYWdlKTsKLSAgICAgIG9wLT5vcHRpb25hbF9jbG9zZV9tZXNzYWdlID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBncHJfc2xpY2UgbWVzc2FnZTsKLSAgZ3JwY19jbG9zdXJlICp0aGVuX2NhbGw7Ci0gIGdycGNfY2xvc3VyZSBjbG9zdXJlOwotfSBjbG9zZV9tZXNzYWdlX2RhdGE7Ci0KLXN0YXRpYyB2b2lkIGZyZWVfbWVzc2FnZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgdm9pZCAqcCwgYm9vbCBpb21ncl9zdWNjZXNzKSB7Ci0gIGNsb3NlX21lc3NhZ2VfZGF0YSAqY21kID0gcDsKLSAgZ3ByX3NsaWNlX3VucmVmKGNtZC0+bWVzc2FnZSk7Ci0gIGlmIChjbWQtPnRoZW5fY2FsbCAhPSBOVUxMKSB7Ci0gICAgY21kLT50aGVuX2NhbGwtPmNiKGV4ZWNfY3R4LCBjbWQtPnRoZW5fY2FsbC0+Y2JfYXJnLCBpb21ncl9zdWNjZXNzKTsKLSAgfQotICBncHJfZnJlZShjbWQpOwotfQotCi12b2lkIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9hZGRfY2xvc2UoZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKm9wdGlvbmFsX21lc3NhZ2UpIHsKLSAgY2xvc2VfbWVzc2FnZV9kYXRhICpjbWQ7Ci0gIEdQUl9BU1NFUlQoc3RhdHVzICE9IEdSUENfU1RBVFVTX09LKTsKLSAgaWYgKG9wLT5jYW5jZWxfd2l0aF9zdGF0dXMgIT0gR1JQQ19TVEFUVVNfT0sgfHwKLSAgICAgIG9wLT5jbG9zZV93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgewotICAgIGlmIChvcHRpb25hbF9tZXNzYWdlKSB7Ci0gICAgICBncHJfc2xpY2VfdW5yZWYoKm9wdGlvbmFsX21lc3NhZ2UpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG9wdGlvbmFsX21lc3NhZ2UpIHsKLSAgICBjbWQgPSBncHJfbWFsbG9jKHNpemVvZigqY21kKSk7Ci0gICAgY21kLT5tZXNzYWdlID0gKm9wdGlvbmFsX21lc3NhZ2U7Ci0gICAgY21kLT50aGVuX2NhbGwgPSBvcC0+b25fY29tcGxldGU7Ci0gICAgZ3JwY19jbG9zdXJlX2luaXQoJmNtZC0+Y2xvc3VyZSwgZnJlZV9tZXNzYWdlLCBjbWQpOwotICAgIG9wLT5vbl9jb21wbGV0ZSA9ICZjbWQtPmNsb3N1cmU7Ci0gICAgb3AtPm9wdGlvbmFsX2Nsb3NlX21lc3NhZ2UgPSAmY21kLT5tZXNzYWdlOwotICB9Ci0gIG9wLT5jbG9zZV93aXRoX3N0YXR1cyA9IHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCBiL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzZTU2Zi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFJBTlNQT1JUX1RSQU5TUE9SVF9ICi0jZGVmaW5lIEdSUENfQ09SRV9UUkFOU1BPUlRfVFJBTlNQT1JUX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb250ZXh0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi10eXBlZGVmIHN0cnVjdCBncnBjX3RyYW5zcG9ydCBncnBjX3RyYW5zcG9ydDsKLQotLyogZ3JwY19zdHJlYW0gZG9lc24ndCBhY3R1YWxseSBleGlzdC4gSXQncyB1c2VkIGFzIGEgdHlwZXNhZmUKLSAgIG9wYXF1ZSBwb2ludGVyIGZvciB3aGF0ZXZlciBkYXRhIHRoZSB0cmFuc3BvcnQgd2FudHMgdG8gdHJhY2sKLSAgIGZvciBhIHN0cmVhbS4gKi8KLXR5cGVkZWYgc3RydWN0IGdycGNfc3RyZWFtIGdycGNfc3RyZWFtOwotCi0vKiNkZWZpbmUgR1JQQ19TVFJFQU1fUkVGQ09VTlRfREVCVUcqLwotCi10eXBlZGVmIHN0cnVjdCBncnBjX3N0cmVhbV9yZWZjb3VudCB7Ci0gIGdwcl9yZWZjb3VudCByZWZzOwotICBncnBjX2Nsb3N1cmUgZGVzdHJveTsKLSNpZmRlZiBHUlBDX1NUUkVBTV9SRUZDT1VOVF9ERUJVRwotICBjb25zdCBjaGFyICpvYmplY3RfdHlwZTsKLSNlbmRpZgotfSBncnBjX3N0cmVhbV9yZWZjb3VudDsKLQotI2lmZGVmIEdSUENfU1RSRUFNX1JFRkNPVU5UX0RFQlVHCi12b2lkIGdycGNfc3RyZWFtX3JlZl9pbml0KGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgaW50IGluaXRpYWxfcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdF90eXBlKTsKLXZvaWQgZ3JwY19zdHJlYW1fcmVmKGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgY29uc3QgY2hhciAqcmVhc29uKTsKLXZvaWQgZ3JwY19zdHJlYW1fdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKLSNkZWZpbmUgR1JQQ19TVFJFQU1fUkVGX0lOSVQocmMsIGlyLCBjYiwgY2JfYXJnLCBvYmp0eXBlKSBcCi0gIGdycGNfc3RyZWFtX3JlZl9pbml0KHJjLCBpciwgY2IsIGNiX2FyZywgb2JqdHlwZSkKLSNlbHNlCi12b2lkIGdycGNfc3RyZWFtX3JlZl9pbml0KGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwgaW50IGluaXRpYWxfcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19pb21ncl9jYl9mdW5jIGNiLCB2b2lkICpjYl9hcmcpOwotdm9pZCBncnBjX3N0cmVhbV9yZWYoZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50KTsKLXZvaWQgZ3JwY19zdHJlYW1fdW5yZWYoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCk7Ci0jZGVmaW5lIEdSUENfU1RSRUFNX1JFRl9JTklUKHJjLCBpciwgY2IsIGNiX2FyZywgb2JqdHlwZSkgXAotICBncnBjX3N0cmVhbV9yZWZfaW5pdChyYywgaXIsIGNiLCBjYl9hcmcpCi0jZW5kaWYKLQotLyogVHJhbnNwb3J0IHN0cmVhbSBvcDogYSBzZXQgb2Ygb3BlcmF0aW9ucyB0byBwZXJmb3JtIG9uIGEgdHJhbnNwb3J0Ci0gICBhZ2FpbnN0IGEgc2luZ2xlIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wIHsKLSAgLyoqIFNlbmQgaW5pdGlhbCBtZXRhZGF0YSB0byB0aGUgcGVlciwgZnJvbSB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgYmF0Y2guICovCi0gIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNlbmRfaW5pdGlhbF9tZXRhZGF0YTsKLQotICAvKiogU2VuZCB0cmFpbGluZyBtZXRhZGF0YSB0byB0aGUgcGVlciwgZnJvbSB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgYmF0Y2guICovCi0gIGdycGNfbWV0YWRhdGFfYmF0Y2ggKnNlbmRfdHJhaWxpbmdfbWV0YWRhdGE7Ci0KLSAgLyoqIFNlbmQgbWVzc2FnZSBkYXRhIHRvIHRoZSBwZWVyLCBmcm9tIHRoZSBwcm92aWRlZCBieXRlIHN0cmVhbS4gKi8KLSAgZ3JwY19ieXRlX3N0cmVhbSAqc2VuZF9tZXNzYWdlOwotCi0gIC8qKiBSZWNlaXZlIGluaXRpYWwgbWV0YWRhdGEgZnJvbSB0aGUgc3RyZWFtLCBpbnRvIHByb3ZpZGVkIG1ldGFkYXRhIGJhdGNoLiAqLwotICBncnBjX21ldGFkYXRhX2JhdGNoICpyZWN2X2luaXRpYWxfbWV0YWRhdGE7Ci0gIC8qKiBTaG91bGQgYmUgZW5xdWV1ZWQgd2hlbiBpbml0aWFsIG1ldGFkYXRhIGlzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KLSAgZ3JwY19jbG9zdXJlICpyZWN2X2luaXRpYWxfbWV0YWRhdGFfcmVhZHk7Ci0KLSAgLyoqIFJlY2VpdmUgbWVzc2FnZSBkYXRhIGZyb20gdGhlIHN0cmVhbSwgaW50byBwcm92aWRlZCBieXRlIHN0cmVhbS4gKi8KLSAgZ3JwY19ieXRlX3N0cmVhbSAqKnJlY3ZfbWVzc2FnZTsKLSAgLyoqIFNob3VsZCBiZSBlbnF1ZXVlZCB3aGVuIG9uZSBtZXNzYWdlIGlzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KLSAgZ3JwY19jbG9zdXJlICpyZWN2X21lc3NhZ2VfcmVhZHk7Ci0KLSAgLyoqIFJlY2VpdmUgdHJhaWxpbmcgbWV0YWRhdGEgZnJvbSB0aGUgc3RyZWFtLCBpbnRvIHByb3ZpZGVkIG1ldGFkYXRhIGJhdGNoLgotICAgKi8KLSAgZ3JwY19tZXRhZGF0YV9iYXRjaCAqcmVjdl90cmFpbGluZ19tZXRhZGF0YTsKLQotICAvKiogU2hvdWxkIGJlIGVucXVldWVkIHdoZW4gYWxsIHJlcXVlc3RlZCBvcGVyYXRpb25zIChleGNsdWRpbmcgcmVjdl9tZXNzYWdlCi0gICAgICBhbmQgcmVjdl9pbml0aWFsX21ldGFkYXRhIHdoaWNoIGhhdmUgdGhlaXIgb3duIGNsb3N1cmVzKSBpbiBhIGdpdmVuIGJhdGNoCi0gICAgICBoYXZlIGJlZW4gY29tcGxldGVkLiAqLwotICBncnBjX2Nsb3N1cmUgKm9uX2NvbXBsZXRlOwotCi0gIC8qKiBJZiAhPSBHUlBDX1NUQVRVU19PSywgY2FuY2VsIHRoaXMgc3RyZWFtICovCi0gIGdycGNfc3RhdHVzX2NvZGUgY2FuY2VsX3dpdGhfc3RhdHVzOwotCi0gIC8qKiBJZiAhPSBHUlBDX1NUQVRVU19PSywgc2VuZCBncnBjLXN0YXR1cywgZ3JwYy1tZXNzYWdlLCBhbmQgY2xvc2UgdGhpcwotICAgICAgc3RyZWFtIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KLSAgZ3JwY19zdGF0dXNfY29kZSBjbG9zZV93aXRoX3N0YXR1czsKLSAgZ3ByX3NsaWNlICpvcHRpb25hbF9jbG9zZV9tZXNzYWdlOwotCi0gIC8qIEluZGV4ZXMgY29ycmVzcG9uZCB0byBncnBjX2NvbnRleHRfaW5kZXggZW51bSB2YWx1ZXMgKi8KLSAgZ3JwY19jYWxsX2NvbnRleHRfZWxlbWVudCAqY29udGV4dDsKLX0gZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wOwotCi0vKiogVHJhbnNwb3J0IG9wOiBhIHNldCBvZiBvcGVyYXRpb25zIHRvIHBlcmZvcm0gb24gYSB0cmFuc3BvcnQgYXMgYSB3aG9sZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190cmFuc3BvcnRfb3AgewotICAvKiogQ2FsbGVkIHdoZW4gcHJvY2Vzc2luZyBvZiB0aGlzIG9wIGlzIGRvbmUuICovCi0gIGdycGNfY2xvc3VyZSAqb25fY29uc3VtZWQ7Ci0gIC8qKiBjb25uZWN0aXZpdHkgbW9uaXRvcmluZyAtIHNldCBjb25uZWN0aXZpdHlfc3RhdGUgdG8gTlVMTCB0byB1bnN1YnNjcmliZSAqLwotICBncnBjX2Nsb3N1cmUgKm9uX2Nvbm5lY3Rpdml0eV9zdGF0ZV9jaGFuZ2U7Ci0gIGdycGNfY29ubmVjdGl2aXR5X3N0YXRlICpjb25uZWN0aXZpdHlfc3RhdGU7Ci0gIC8qKiBzaG91bGQgdGhlIHRyYW5zcG9ydCBiZSBkaXNjb25uZWN0ZWQgKi8KLSAgaW50IGRpc2Nvbm5lY3Q7Ci0gIC8qKiBzaG91bGQgd2Ugc2VuZCBhIGdvYXdheT8KLSAgICAgIGFmdGVyIGEgZ29hd2F5IGlzIHNlbnQsIG9uY2UgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIGNhbGxzIG9uCi0gICAgICB0aGUgdHJhbnNwb3J0LCB0aGUgdHJhbnNwb3J0IHNob3VsZCBkaXNjb25uZWN0ICovCi0gIGludCBzZW5kX2dvYXdheTsKLSAgLyoqIHdoYXQgc2hvdWxkIHRoZSBnb2F3YXkgY29udGFpbj8gKi8KLSAgZ3JwY19zdGF0dXNfY29kZSBnb2F3YXlfc3RhdHVzOwotICBncHJfc2xpY2UgKmdvYXdheV9tZXNzYWdlOwotICAvKiogc2V0IHRoZSBjYWxsYmFjayBmb3IgYWNjZXB0aW5nIG5ldyBzdHJlYW1zOwotICAgICAgdGhpcyBpcyBhIHBlcm1hbmVudCBjYWxsYmFjaywgdW5saWtlIHRoZSBvdGhlciBvbmUtc2hvdCBjbG9zdXJlcy4KLSAgICAgIElmIHRydWUsIHRoZSBjYWxsYmFjayBpcyBzZXQgdG8gc2V0X2FjY2VwdF9zdHJlYW1fZm4sIHdpdGggaXRzCi0gICAgICB1c2VyX2RhdGEgYXJndW1lbnQgc2V0IHRvIHNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YSAqLwotICBib29sIHNldF9hY2NlcHRfc3RyZWFtOwotICB2b2lkICgqc2V0X2FjY2VwdF9zdHJlYW1fZm4pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzZXJ2ZXJfZGF0YSk7Ci0gIHZvaWQgKnNldF9hY2NlcHRfc3RyZWFtX3VzZXJfZGF0YTsKLSAgLyoqIGFkZCB0aGlzIHRyYW5zcG9ydCB0byBhIHBvbGxzZXQgKi8KLSAgZ3JwY19wb2xsc2V0ICpiaW5kX3BvbGxzZXQ7Ci0gIC8qKiBhZGQgdGhpcyB0cmFuc3BvcnQgdG8gYSBwb2xsc2V0X3NldCAqLwotICBncnBjX3BvbGxzZXRfc2V0ICpiaW5kX3BvbGxzZXRfc2V0OwotICAvKiogc2VuZCBhIHBpbmcsIGNhbGwgdGhpcyBiYWNrIGlmIG5vdCBOVUxMICovCi0gIGdycGNfY2xvc3VyZSAqc2VuZF9waW5nOwotfSBncnBjX3RyYW5zcG9ydF9vcDsKLQotLyogUmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBzdG9yZSBhIGdycGNfc3RyZWFtIGZvciB0aGlzCi0gICB0cmFuc3BvcnQgKi8KLXNpemVfdCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fc2l6ZShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotLyogSW5pdGlhbGl6ZSB0cmFuc3BvcnQgZGF0YSBmb3IgYSBzdHJlYW0uCi0KLSAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbnkgb3RoZXIgKHRyYW5zcG9ydC1kZWZpbmVkKSB2YWx1ZSBmb3IgZmFpbHVyZS4KLQotICAgQXJndW1lbnRzOgotICAgICB0cmFuc3BvcnQgICAtIHRoZSB0cmFuc3BvcnQgb24gd2hpY2ggdG8gY3JlYXRlIHRoaXMgc3RyZWFtCi0gICAgIHN0cmVhbSAgICAgIC0gYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIGluaXRpYWxpemUKLSAgICAgc2VydmVyX2RhdGEgLSBlaXRoZXIgTlVMTCBmb3IgYSBjbGllbnQgaW5pdGlhdGVkIHN0cmVhbSwgb3IgYSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgZnJvbSB0aGUgYWNjZXB0X3N0cmVhbSBjYWxsYmFjayBmdW5jdGlvbiAqLwotaW50IGdycGNfdHJhbnNwb3J0X2luaXRfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdycGNfc3RyZWFtICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW1fcmVmY291bnQgKnJlZmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKTsKLQotdm9pZCBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldChncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3JwY19zdHJlYW0gKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19wb2xsc2V0ICpwb2xsc2V0KTsKLQotLyogRGVzdHJveSB0cmFuc3BvcnQgZGF0YSBmb3IgYSBzdHJlYW0uCi0KLSAgIFJlcXVpcmVzOiBhIHJlY3ZfYmF0Y2ggd2l0aCBmaW5hbF9zdGF0ZSA9PSBHUlBDX1NUUkVBTV9DTE9TRUQgaGFzIGJlZW4KLSAgIHJlY2VpdmVkIGJ5IHRoZSB1cC1sYXllci4gTXVzdCBub3QgYmUgY2FsbGVkIGluIHRoZSBzYW1lIGNhbGwgc3RhY2sgYXMKLSAgIHJlY3ZfZnJhbWUuCi0KLSAgIEFyZ3VtZW50czoKLSAgICAgdHJhbnNwb3J0IC0gdGhlIHRyYW5zcG9ydCBvbiB3aGljaCB0byBjcmVhdGUgdGhpcyBzdHJlYW0KLSAgICAgc3RyZWFtICAgIC0gdGhlIGdycGNfc3RyZWFtIHRvIGRlc3Ryb3kgKG1lbW9yeSBpcyBzdGlsbCBvd25lZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgY2FsbGVyLCBidXQgYW55IGNoaWxkIG1lbW9yeSBtdXN0IGJlIGNsZWFuZWQgdXApICovCi12b2lkIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3lfc3RyZWFtKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtKTsKLQotdm9pZCBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3BfZmluaXNoX3dpdGhfZmFpbHVyZShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCk7Ci0KLXZvaWQgZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX2FkZF9jYW5jZWxsYXRpb24oZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdGF0dXNfY29kZSBzdGF0dXMpOwotCi12b2lkIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcF9hZGRfY2xvc2UoZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHJfc2xpY2UgKm9wdGlvbmFsX21lc3NhZ2UpOwotCi1jaGFyICpncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Bfc3RyaW5nKGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOwotCi0vKiBTZW5kIGEgYmF0Y2ggb2Ygb3BlcmF0aW9ucyBvbiBhIHRyYW5zcG9ydAotCi0gICBUYWtlcyBvd25lcnNoaXAgb2YgYW55IG9iamVjdHMgY29udGFpbmVkIGluIG9wcy4KLQotICAgQXJndW1lbnRzOgotICAgICB0cmFuc3BvcnQgLSB0aGUgdHJhbnNwb3J0IG9uIHdoaWNoIHRvIGluaXRpYXRlIHRoZSBzdHJlYW0KLSAgICAgc3RyZWFtICAgIC0gdGhlIHN0cmVhbSBvbiB3aGljaCB0byBzZW5kIHRoZSBvcGVyYXRpb25zLiBUaGlzIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgbm9uLU5VTEwgYW5kIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIHNhbWUgdHJhbnNwb3J0LgotICAgICBvcCAgICAgICAgLSBhIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCBzcGVjaWZ5aW5nIHRoZSBvcCB0byBwZXJmb3JtICovCi12b2lkIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fc3RyZWFtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3AgKm9wKTsKLQotdm9pZCBncnBjX3RyYW5zcG9ydF9wZXJmb3JtX29wKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190cmFuc3BvcnRfb3AgKm9wKTsKLQotLyogU2VuZCBhIHBpbmcgb24gYSB0cmFuc3BvcnQKLQotICAgQ2FsbHMgY2Igd2l0aCB1c2VyIGRhdGEgd2hlbiBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiAqLwotdm9pZCBncnBjX3RyYW5zcG9ydF9waW5nKGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdycGNfY2xvc3VyZSAqY2IpOwotCi0vKiBBZHZpc2UgcGVlciBvZiBwZW5kaW5nIGNvbm5lY3Rpb24gdGVybWluYXRpb24uICovCi12b2lkIGdycGNfdHJhbnNwb3J0X2dvYXdheShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBncnBjX3N0YXR1c19jb2RlIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwcl9zbGljZSBkZWJ1Z19kYXRhKTsKLQotLyogQ2xvc2UgYSB0cmFuc3BvcnQuIEFib3J0cyBhbGwgb3BlbiBzdHJlYW1zLiAqLwotdm9pZCBncnBjX3RyYW5zcG9ydF9jbG9zZShncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotLyogRGVzdHJveSB0aGUgdHJhbnNwb3J0ICovCi12b2lkIGdycGNfdHJhbnNwb3J0X2Rlc3Ryb3koZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICp0cmFuc3BvcnQpOwotCi0vKiBHZXQgdGhlIHRyYW5zcG9ydHMgcGVlciAqLwotY2hhciAqZ3JwY190cmFuc3BvcnRfZ2V0X3BlZXIoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UUkFOU1BPUlRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIGIvc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZWNjNGQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIEdSUENfQ09SRV9UUkFOU1BPUlRfVFJBTlNQT1JUX0lNUExfSAotI2RlZmluZSBHUlBDX0NPUkVfVFJBTlNQT1JUX1RSQU5TUE9SVF9JTVBMX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgZ3JwY190cmFuc3BvcnRfdnRhYmxlIHsKLSAgLyogTWVtb3J5IHJlcXVpcmVkIGZvciBhIHNpbmdsZSBzdHJlYW0gZWxlbWVudCAtIHRoaXMgaXMgYWxsb2NhdGVkIGJ5IHVwcGVyCi0gICAgIGxheWVycyBhbmQgaW5pdGlhbGl6ZWQgYnkgdGhlIHRyYW5zcG9ydCAqLwotICBzaXplX3Qgc2l6ZW9mX3N0cmVhbTsgLyogPSBzaXplb2YodHJhbnNwb3J0IHN0cmVhbSkgKi8KLQotICAvKiBuYW1lIG9mIHRoaXMgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogaW1wbGVtZW50YXRpb24gb2YgZ3JwY190cmFuc3BvcnRfaW5pdF9zdHJlYW0gKi8KLSAgaW50ICgqaW5pdF9zdHJlYW0pKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RyZWFtICpzdHJlYW0sIGdycGNfc3RyZWFtX3JlZmNvdW50ICpyZWZjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNlcnZlcl9kYXRhKTsKLQotICAvKiBpbXBsZW1lbnRhdGlvbiBvZiBncnBjX3RyYW5zcG9ydF9zZXRfcG9sbHNldCAqLwotICB2b2lkICgqc2V0X3BvbGxzZXQpKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICBncnBjX3N0cmVhbSAqc3RyZWFtLCBncnBjX3BvbGxzZXQgKnBvbGxzZXQpOwotCi0gIC8qIGltcGxlbWVudGF0aW9uIG9mIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fc3RyZWFtX29wICovCi0gIHZvaWQgKCpwZXJmb3JtX3N0cmVhbV9vcCkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdycGNfc3RyZWFtICpzdHJlYW0sIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApOwotCi0gIC8qIGltcGxlbWVudGF0aW9uIG9mIGdycGNfdHJhbnNwb3J0X3BlcmZvcm1fb3AgKi8KLSAgdm9pZCAoKnBlcmZvcm1fb3ApKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCBncnBjX3RyYW5zcG9ydCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgIGdycGNfdHJhbnNwb3J0X29wICpvcCk7Ci0KLSAgLyogaW1wbGVtZW50YXRpb24gb2YgZ3JwY190cmFuc3BvcnRfZGVzdHJveV9zdHJlYW0gKi8KLSAgdm9pZCAoKmRlc3Ryb3lfc3RyZWFtKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY19zdHJlYW0gKnN0cmVhbSk7Ci0KLSAgLyogaW1wbGVtZW50YXRpb24gb2YgZ3JwY190cmFuc3BvcnRfZGVzdHJveSAqLwotICB2b2lkICgqZGVzdHJveSkoZ3JwY19leGVjX2N0eCAqZXhlY19jdHgsIGdycGNfdHJhbnNwb3J0ICpzZWxmKTsKLQotICAvKiBpbXBsZW1lbnRhdGlvbiBvZiBncnBjX3RyYW5zcG9ydF9nZXRfcGVlciAqLwotICBjaGFyICooKmdldF9wZWVyKShncnBjX2V4ZWNfY3R4ICpleGVjX2N0eCwgZ3JwY190cmFuc3BvcnQgKnNlbGYpOwotfSBncnBjX3RyYW5zcG9ydF92dGFibGU7Ci0KLS8qIGFuIGluc3RhbmNlIG9mIGEgZ3JwYyB0cmFuc3BvcnQgKi8KLXN0cnVjdCBncnBjX3RyYW5zcG9ydCB7Ci0gIC8qIHBvaW50ZXIgdG8gYSB2dGFibGUgZGVmaW5pbmcgb3BlcmF0aW9ucyBvbiB0aGlzIHRyYW5zcG9ydCAqLwotICBjb25zdCBncnBjX3RyYW5zcG9ydF92dGFibGUgKnZ0YWJsZTsKLX07Ci0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFJBTlNQT1JUX1RSQU5TUE9SVF9JTVBMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMgYi9zcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUzNDEyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgaGVyZSB0byBmYWNpbGl0YXRlIGRlYnVnZ2luZyAtIHRoZXkgcHJvZHVjZSBzdHJpbmcKLSAgIHJlcHJlc2VudGF0aW9ucyBvZiB2YXJpb3VzIHRyYW5zcG9ydCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotc3RhdGljIHZvaWQgcHV0X21ldGFkYXRhKGdwcl9zdHJ2ZWMgKmIsIGdycGNfbWRlbGVtICptZCkgewotICBncHJfc3RydmVjX2FkZChiLCBncHJfc3RyZHVwKCJrZXk9IikpOwotICBncHJfc3RydmVjX2FkZChiLAotICAgICAgICAgICAgICAgICBncHJfZHVtcF9zbGljZShtZC0+a2V5LT5zbGljZSwgR1BSX0RVTVBfSEVYIHwgR1BSX0RVTVBfQVNDSUkpKTsKLQotICBncHJfc3RydmVjX2FkZChiLCBncHJfc3RyZHVwKCIgdmFsdWU9IikpOwotICBncHJfc3RydmVjX2FkZCgKLSAgICAgIGIsIGdwcl9kdW1wX3NsaWNlKG1kLT52YWx1ZS0+c2xpY2UsIEdQUl9EVU1QX0hFWCB8IEdQUl9EVU1QX0FTQ0lJKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dF9tZXRhZGF0YV9saXN0KGdwcl9zdHJ2ZWMgKmIsIGdycGNfbWV0YWRhdGFfYmF0Y2ggbWQpIHsKLSAgZ3JwY19saW5rZWRfbWRlbGVtICptOwotICBmb3IgKG0gPSBtZC5saXN0LmhlYWQ7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpIHsKLSAgICBpZiAobSAhPSBtZC5saXN0LmhlYWQpIGdwcl9zdHJ2ZWNfYWRkKGIsIGdwcl9zdHJkdXAoIiwgIikpOwotICAgIHB1dF9tZXRhZGF0YShiLCBtLT5tZCk7Ci0gIH0KLSAgaWYgKGdwcl90aW1lX2NtcChtZC5kZWFkbGluZSwgZ3ByX2luZl9mdXR1cmUobWQuZGVhZGxpbmUuY2xvY2tfdHlwZSkpICE9IDApIHsKLSAgICBjaGFyICp0bXA7Ci0gICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICIgZGVhZGxpbmU9JWxsZC4lMDlkIiwgKGxvbmcgbG9uZyltZC5kZWFkbGluZS50dl9zZWMsCi0gICAgICAgICAgICAgICAgIChpbnQpbWQuZGVhZGxpbmUudHZfbnNlYyk7Ci0gICAgZ3ByX3N0cnZlY19hZGQoYiwgdG1wKTsKLSAgfQotfQotCi1jaGFyICpncnBjX3RyYW5zcG9ydF9zdHJlYW1fb3Bfc3RyaW5nKGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgY2hhciAqdG1wOwotICBjaGFyICpvdXQ7Ci0gIGludCBmaXJzdCA9IDE7Ci0KLSAgZ3ByX3N0cnZlYyBiOwotICBncHJfc3RydmVjX2luaXQoJmIpOwotCi0gIGlmIChvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBpZiAoIWZpcnN0KSBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiICIpKTsKLSAgICBmaXJzdCA9IDA7Ci0gICAgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIlNFTkRfSU5JVElBTF9NRVRBREFUQXsiKSk7Ci0gICAgcHV0X21ldGFkYXRhX2xpc3QoJmIsICpvcC0+c2VuZF9pbml0aWFsX21ldGFkYXRhKTsKLSAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgifSIpKTsKLSAgfQotCi0gIGlmIChvcC0+c2VuZF9tZXNzYWdlICE9IE5VTEwpIHsKLSAgICBpZiAoIWZpcnN0KSBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiICIpKTsKLSAgICBmaXJzdCA9IDA7Ci0gICAgZ3ByX2FzcHJpbnRmKCZ0bXAsICJTRU5EX01FU1NBR0U6ZmxhZ3M9MHglMDh4Omxlbj0lZCIsCi0gICAgICAgICAgICAgICAgIG9wLT5zZW5kX21lc3NhZ2UtPmZsYWdzLCBvcC0+c2VuZF9tZXNzYWdlLT5sZW5ndGgpOwotICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCB0bXApOwotICB9Ci0KLSAgaWYgKG9wLT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBpZiAoIWZpcnN0KSBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiICIpKTsKLSAgICBmaXJzdCA9IDA7Ci0gICAgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIlNFTkRfVFJBSUxJTkdfTUVUQURBVEF7IikpOwotICAgIHB1dF9tZXRhZGF0YV9saXN0KCZiLCAqb3AtPnNlbmRfdHJhaWxpbmdfbWV0YWRhdGEpOwotICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCJ9IikpOwotICB9Ci0KLSAgaWYgKG9wLT5yZWN2X2luaXRpYWxfbWV0YWRhdGEgIT0gTlVMTCkgewotICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOwotICAgIGZpcnN0ID0gMDsKLSAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiUkVDVl9JTklUSUFMX01FVEFEQVRBIikpOwotICB9Ci0KLSAgaWYgKG9wLT5yZWN2X21lc3NhZ2UgIT0gTlVMTCkgewotICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOwotICAgIGZpcnN0ID0gMDsKLSAgICBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiUkVDVl9NRVNTQUdFIikpOwotICB9Ci0KLSAgaWYgKG9wLT5yZWN2X3RyYWlsaW5nX21ldGFkYXRhICE9IE5VTEwpIHsKLSAgICBpZiAoIWZpcnN0KSBncHJfc3RydmVjX2FkZCgmYiwgZ3ByX3N0cmR1cCgiICIpKTsKLSAgICBmaXJzdCA9IDA7Ci0gICAgZ3ByX3N0cnZlY19hZGQoJmIsIGdwcl9zdHJkdXAoIlJFQ1ZfVFJBSUxJTkdfTUVUQURBVEEiKSk7Ci0gIH0KLQotICBpZiAob3AtPmNhbmNlbF93aXRoX3N0YXR1cyAhPSBHUlBDX1NUQVRVU19PSykgewotICAgIGlmICghZmlyc3QpIGdwcl9zdHJ2ZWNfYWRkKCZiLCBncHJfc3RyZHVwKCIgIikpOwotICAgIGZpcnN0ID0gMDsKLSAgICBncHJfYXNwcmludGYoJnRtcCwgIkNBTkNFTDolZCIsIG9wLT5jYW5jZWxfd2l0aF9zdGF0dXMpOwotICAgIGdwcl9zdHJ2ZWNfYWRkKCZiLCB0bXApOwotICB9Ci0KLSAgb3V0ID0gZ3ByX3N0cnZlY19mbGF0dGVuKCZiLCBOVUxMKTsKLSAgZ3ByX3N0cnZlY19kZXN0cm95KCZiKTsKLQotICByZXR1cm4gb3V0OwotfQotCi12b2lkIGdycGNfY2FsbF9sb2dfb3AoY2hhciAqZmlsZSwgaW50IGxpbmUsIGdwcl9sb2dfc2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgZ3JwY19jYWxsX2VsZW1lbnQgKmVsZW0sIGdycGNfdHJhbnNwb3J0X3N0cmVhbV9vcCAqb3ApIHsKLSAgY2hhciAqc3RyID0gZ3JwY190cmFuc3BvcnRfc3RyZWFtX29wX3N0cmluZyhvcCk7Ci0gIGdwcl9sb2coZmlsZSwgbGluZSwgc2V2ZXJpdHksICJPUFslczolcF06ICVzIiwgZWxlbS0+ZmlsdGVyLT5uYW1lLCBlbGVtLCBzdHIpOwotICBncHJfZnJlZShzdHIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMgYi9zcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMDZmNy4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiCi0KLS8qIC0tLSBDb25zdGFudHMuIC0tLSovCi0jZGVmaW5lIFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFIDQKLSNkZWZpbmUgVFNJX0ZBS0VfRlJBTUVfSU5JVElBTF9BTExPQ0FURURfU0laRSA2NAotI2RlZmluZSBUU0lfRkFLRV9ERUZBVUxUX0ZSQU1FX1NJWkUgMTYzODQKLQotLyogLS0tIFN0cnVjdHVyZSBkZWZpbml0aW9ucy4gLS0tKi8KLQotLyogYSBmcmFtZSBpcyBlbmNvZGVkIGxpa2UgdGhpczoKLSAgIHwgc2l6ZSB8ICAgICBkYXRhICAgIHwKLSAgIHdoZXJlIHRoZSBzaXplIGZpZWxkIHZhbHVlIGlzIHRoZSBzaXplIG9mIHRoZSBzaXplIGZpZWxkIHBsdXMgdGhlIHNpemUgb2YKLSAgIHRoZSBkYXRhIGVuY29kZWQgaW4gbGl0dGxlIGVuZGlhbiBvbiA0IGJ5dGVzLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgc2l6ZV90IHNpemU7Ci0gIHNpemVfdCBhbGxvY2F0ZWRfc2l6ZTsKLSAgc2l6ZV90IG9mZnNldDsKLSAgaW50IG5lZWRzX2RyYWluaW5nOwotfSB0c2lfZmFrZV9mcmFtZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgVFNJX0ZBS0VfQ0xJRU5UX0lOSVQgPSAwLAotICBUU0lfRkFLRV9TRVJWRVJfSU5JVCA9IDEsCi0gIFRTSV9GQUtFX0NMSUVOVF9GSU5JU0hFRCA9IDIsCi0gIFRTSV9GQUtFX1NFUlZFUl9GSU5JU0hFRCA9IDMsCi0gIFRTSV9GQUtFX0hBTkRTSEFLRV9NRVNTQUdFX01BWCA9IDQKLX0gdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdHNpX2hhbmRzaGFrZXIgYmFzZTsKLSAgaW50IGlzX2NsaWVudDsKLSAgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2UgbmV4dF9tZXNzYWdlX3RvX3NlbmQ7Ci0gIGludCBuZWVkc19pbmNvbWluZ19tZXNzYWdlOwotICB0c2lfZmFrZV9mcmFtZSBpbmNvbWluZzsKLSAgdHNpX2Zha2VfZnJhbWUgb3V0Z29pbmc7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0OwotfSB0c2lfZmFrZV9oYW5kc2hha2VyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRzaV9mcmFtZV9wcm90ZWN0b3IgYmFzZTsKLSAgdHNpX2Zha2VfZnJhbWUgcHJvdGVjdF9mcmFtZTsKLSAgdHNpX2Zha2VfZnJhbWUgdW5wcm90ZWN0X2ZyYW1lOwotICBzaXplX3QgbWF4X2ZyYW1lX3NpemU7Ci19IHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvcjsKLQotLyogLS0tIFV0aWxzLiAtLS0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2Vfc3RyaW5nc1tdID0gewotICAgICJDTElFTlRfSU5JVCIsICJTRVJWRVJfSU5JVCIsICJDTElFTlRfRklOSVNIRUQiLCAiU0VSVkVSX0ZJTklTSEVEIn07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoaW50IG1zZykgewotICBpZiAobXNnIDwgMCB8fCBtc2cgPj0gVFNJX0ZBS0VfSEFORFNIQUtFX01FU1NBR0VfTUFYKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIG1lc3NhZ2UgJWQiLCBtc2cpOwotICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gIH0KLSAgcmV0dXJuIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlX3N0cmluZ3NbbXNnXTsKLX0KLQotc3RhdGljIHRzaV9yZXN1bHQgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2VfZnJvbV9zdHJpbmcoCi0gICAgY29uc3QgY2hhciAqbXNnX3N0cmluZywgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2UgKm1zZykgewotICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZSBpOwotICBmb3IgKGkgPSAwOyBpIDwgVFNJX0ZBS0VfSEFORFNIQUtFX01FU1NBR0VfTUFYOyBpKyspIHsKLSAgICBpZiAoc3RybmNtcChtc2dfc3RyaW5nLCB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV9zdHJpbmdzW2ldLAotICAgICAgICAgICAgICAgIHN0cmxlbih0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV9zdHJpbmdzW2ldKSkgPT0gMCkgewotICAgICAgKm1zZyA9IGk7Ci0gICAgICByZXR1cm4gVFNJX09LOwotICAgIH0KLSAgfQotICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgaGFuZHNoYWtlIG1lc3NhZ2UuIik7Ci0gIHJldHVybiBUU0lfREFUQV9DT1JSVVBURUQ7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBsb2FkMzJfbGl0dGxlX2VuZGlhbihjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpIHsKLSAgcmV0dXJuICgodWludDMyX3QpKGJ1ZlswXSkgfCAodWludDMyX3QpKGJ1ZlsxXSA8PCA4KSB8Ci0gICAgICAgICAgKHVpbnQzMl90KShidWZbMl0gPDwgMTYpIHwgKHVpbnQzMl90KShidWZbM10gPDwgMjQpKTsKLX0KLQotc3RhdGljIHZvaWQgc3RvcmUzMl9saXR0bGVfZW5kaWFuKHVpbnQzMl90IHZhbHVlLCB1bnNpZ25lZCBjaGFyICpidWYpIHsKLSAgYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKLSAgYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotICBidWZbMF0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlKSYweEZGKTsKLX0KLQotc3RhdGljIHZvaWQgdHNpX2Zha2VfZnJhbWVfcmVzZXQodHNpX2Zha2VfZnJhbWUgKmZyYW1lLCBpbnQgbmVlZHNfZHJhaW5pbmcpIHsKLSAgZnJhbWUtPm9mZnNldCA9IDA7Ci0gIGZyYW1lLT5uZWVkc19kcmFpbmluZyA9IG5lZWRzX2RyYWluaW5nOwotICBpZiAoIW5lZWRzX2RyYWluaW5nKSBmcmFtZS0+c2l6ZSA9IDA7Ci19Ci0KLS8qIFJldHVybnMgMSBpZiBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZS4gKi8KLXN0YXRpYyBpbnQgdHNpX2Zha2VfZnJhbWVfZW5zdXJlX3NpemUodHNpX2Zha2VfZnJhbWUgKmZyYW1lKSB7Ci0gIGlmIChmcmFtZS0+ZGF0YSA9PSBOVUxMKSB7Ci0gICAgZnJhbWUtPmFsbG9jYXRlZF9zaXplID0gZnJhbWUtPnNpemU7Ci0gICAgZnJhbWUtPmRhdGEgPSBtYWxsb2MoZnJhbWUtPmFsbG9jYXRlZF9zaXplKTsKLSAgICBpZiAoZnJhbWUtPmRhdGEgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIH0gZWxzZSBpZiAoZnJhbWUtPnNpemUgPiBmcmFtZS0+YWxsb2NhdGVkX3NpemUpIHsKLSAgICB1bnNpZ25lZCBjaGFyICpuZXdfZGF0YSA9IHJlYWxsb2MoZnJhbWUtPmRhdGEsIGZyYW1lLT5zaXplKTsKLSAgICBpZiAobmV3X2RhdGEgPT0gTlVMTCkgewotICAgICAgZnJlZShmcmFtZS0+ZGF0YSk7Ci0gICAgICBmcmFtZS0+ZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZnJhbWUtPmRhdGEgPSBuZXdfZGF0YTsKLSAgICBmcmFtZS0+YWxsb2NhdGVkX3NpemUgPSBmcmFtZS0+c2l6ZTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLyogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgZnJhbWUtPm5lZWRzX2ZyYW1pbmcgaXMgbm90IDAuICAqLwotc3RhdGljIHRzaV9yZXN1bHQgZmlsbF9mcmFtZV9mcm9tX2J5dGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluY29taW5nX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqaW5jb21pbmdfYnl0ZXNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUpIHsKLSAgc2l6ZV90IGF2YWlsYWJsZV9zaXplID0gKmluY29taW5nX2J5dGVzX3NpemU7Ci0gIHNpemVfdCB0b19yZWFkX3NpemUgPSAwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlc19jdXJzb3IgPSBpbmNvbWluZ19ieXRlczsKLQotICBpZiAoZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICBpZiAoZnJhbWUtPmRhdGEgPT0gTlVMTCkgewotICAgIGZyYW1lLT5hbGxvY2F0ZWRfc2l6ZSA9IFRTSV9GQUtFX0ZSQU1FX0lOSVRJQUxfQUxMT0NBVEVEX1NJWkU7Ci0gICAgZnJhbWUtPmRhdGEgPSBtYWxsb2MoZnJhbWUtPmFsbG9jYXRlZF9zaXplKTsKLSAgICBpZiAoZnJhbWUtPmRhdGEgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOwotICB9Ci0KLSAgaWYgKGZyYW1lLT5vZmZzZXQgPCBUU0lfRkFLRV9GUkFNRV9IRUFERVJfU0laRSkgewotICAgIHRvX3JlYWRfc2l6ZSA9IFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFIC0gZnJhbWUtPm9mZnNldDsKLSAgICBpZiAodG9fcmVhZF9zaXplID4gYXZhaWxhYmxlX3NpemUpIHsKLSAgICAgIC8qIEp1c3QgZmlsbCB3aGF0IHdlIGNhbiBhbmQgZXhpdC4gKi8KLSAgICAgIG1lbWNweShmcmFtZS0+ZGF0YSArIGZyYW1lLT5vZmZzZXQsIGJ5dGVzX2N1cnNvciwgYXZhaWxhYmxlX3NpemUpOwotICAgICAgYnl0ZXNfY3Vyc29yICs9IGF2YWlsYWJsZV9zaXplOwotICAgICAgZnJhbWUtPm9mZnNldCArPSBhdmFpbGFibGVfc2l6ZTsKLSAgICAgICppbmNvbWluZ19ieXRlc19zaXplID0gKHNpemVfdCkoYnl0ZXNfY3Vyc29yIC0gaW5jb21pbmdfYnl0ZXMpOwotICAgICAgcmV0dXJuIFRTSV9JTkNPTVBMRVRFX0RBVEE7Ci0gICAgfQotICAgIG1lbWNweShmcmFtZS0+ZGF0YSArIGZyYW1lLT5vZmZzZXQsIGJ5dGVzX2N1cnNvciwgdG9fcmVhZF9zaXplKTsKLSAgICBieXRlc19jdXJzb3IgKz0gdG9fcmVhZF9zaXplOwotICAgIGZyYW1lLT5vZmZzZXQgKz0gdG9fcmVhZF9zaXplOwotICAgIGF2YWlsYWJsZV9zaXplIC09IHRvX3JlYWRfc2l6ZTsKLSAgICBmcmFtZS0+c2l6ZSA9IGxvYWQzMl9saXR0bGVfZW5kaWFuKGZyYW1lLT5kYXRhKTsKLSAgICBpZiAoIXRzaV9mYWtlX2ZyYW1lX2Vuc3VyZV9zaXplKGZyYW1lKSkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOwotICB9Ci0KLSAgdG9fcmVhZF9zaXplID0gZnJhbWUtPnNpemUgLSBmcmFtZS0+b2Zmc2V0OwotICBpZiAodG9fcmVhZF9zaXplID4gYXZhaWxhYmxlX3NpemUpIHsKLSAgICBtZW1jcHkoZnJhbWUtPmRhdGEgKyBmcmFtZS0+b2Zmc2V0LCBieXRlc19jdXJzb3IsIGF2YWlsYWJsZV9zaXplKTsKLSAgICBmcmFtZS0+b2Zmc2V0ICs9IGF2YWlsYWJsZV9zaXplOwotICAgIGJ5dGVzX2N1cnNvciArPSBhdmFpbGFibGVfc2l6ZTsKLSAgICAqaW5jb21pbmdfYnl0ZXNfc2l6ZSA9IChzaXplX3QpKGJ5dGVzX2N1cnNvciAtIGluY29taW5nX2J5dGVzKTsKLSAgICByZXR1cm4gVFNJX0lOQ09NUExFVEVfREFUQTsKLSAgfQotICBtZW1jcHkoZnJhbWUtPmRhdGEgKyBmcmFtZS0+b2Zmc2V0LCBieXRlc19jdXJzb3IsIHRvX3JlYWRfc2l6ZSk7Ci0gIGJ5dGVzX2N1cnNvciArPSB0b19yZWFkX3NpemU7Ci0gICppbmNvbWluZ19ieXRlc19zaXplID0gKHNpemVfdCkoYnl0ZXNfY3Vyc29yIC0gaW5jb21pbmdfYnl0ZXMpOwotICB0c2lfZmFrZV9mcmFtZV9yZXNldChmcmFtZSwgMSAvKiBuZWVkc19kcmFpbmluZyAqLyk7Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLS8qIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGZyYW1lLT5uZWVkc19mcmFtaW5nIGlzIDAuICAqLwotc3RhdGljIHRzaV9yZXN1bHQgZHJhaW5fZnJhbWVfdG9fYnl0ZXModW5zaWduZWQgY2hhciAqb3V0Z29pbmdfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dGdvaW5nX2J5dGVzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUpIHsKLSAgc2l6ZV90IHRvX3dyaXRlX3NpemUgPSBmcmFtZS0+c2l6ZSAtIGZyYW1lLT5vZmZzZXQ7Ci0gIGlmICghZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICBpZiAoKm91dGdvaW5nX2J5dGVzX3NpemUgPCB0b193cml0ZV9zaXplKSB7Ci0gICAgbWVtY3B5KG91dGdvaW5nX2J5dGVzLCBmcmFtZS0+ZGF0YSArIGZyYW1lLT5vZmZzZXQsICpvdXRnb2luZ19ieXRlc19zaXplKTsKLSAgICBmcmFtZS0+b2Zmc2V0ICs9ICpvdXRnb2luZ19ieXRlc19zaXplOwotICAgIHJldHVybiBUU0lfSU5DT01QTEVURV9EQVRBOwotICB9Ci0gIG1lbWNweShvdXRnb2luZ19ieXRlcywgZnJhbWUtPmRhdGEgKyBmcmFtZS0+b2Zmc2V0LCB0b193cml0ZV9zaXplKTsKLSAgKm91dGdvaW5nX2J5dGVzX3NpemUgPSB0b193cml0ZV9zaXplOwotICB0c2lfZmFrZV9mcmFtZV9yZXNldChmcmFtZSwgMCAvKiBuZWVkc19kcmFpbmluZyAqLyk7Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLXN0YXRpYyB0c2lfcmVzdWx0IGJ5dGVzX3RvX2ZyYW1lKHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBzaXplX3QgYnl0ZXNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9mYWtlX2ZyYW1lICpmcmFtZSkgewotICBmcmFtZS0+b2Zmc2V0ID0gMDsKLSAgZnJhbWUtPnNpemUgPSBieXRlc19zaXplICsgVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkU7Ci0gIGlmICghdHNpX2Zha2VfZnJhbWVfZW5zdXJlX3NpemUoZnJhbWUpKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gIHN0b3JlMzJfbGl0dGxlX2VuZGlhbigodWludDMyX3QpZnJhbWUtPnNpemUsIGZyYW1lLT5kYXRhKTsKLSAgbWVtY3B5KGZyYW1lLT5kYXRhICsgVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkUsIGJ5dGVzLCBieXRlc19zaXplKTsKLSAgdHNpX2Zha2VfZnJhbWVfcmVzZXQoZnJhbWUsIDEgLyogbmVlZHMgZHJhaW5pbmcgKi8pOwotICByZXR1cm4gVFNJX09LOwotfQotCi1zdGF0aWMgdm9pZCB0c2lfZmFrZV9mcmFtZV9kZXN0cnVjdCh0c2lfZmFrZV9mcmFtZSAqZnJhbWUpIHsKLSAgaWYgKGZyYW1lLT5kYXRhICE9IE5VTEwpIGZyZWUoZnJhbWUtPmRhdGEpOwotfQotCi0vKiAtLS0gdHNpX2ZyYW1lX3Byb3RlY3RvciBtZXRob2RzIGltcGxlbWVudGF0aW9uLiAtLS0qLwotCi1zdGF0aWMgdHNpX3Jlc3VsdCBmYWtlX3Byb3RlY3Rvcl9wcm90ZWN0KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOwotICB1bnNpZ25lZCBjaGFyIGZyYW1lX2hlYWRlcltUU0lfRkFLRV9GUkFNRV9IRUFERVJfU0laRV07Ci0gIHRzaV9mYWtlX2ZyYW1lICpmcmFtZSA9ICZpbXBsLT5wcm90ZWN0X2ZyYW1lOwotICBzaXplX3Qgc2F2ZWRfb3V0cHV0X3NpemUgPSAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZTsKLSAgc2l6ZV90IGRyYWluZWRfc2l6ZSA9IDA7Ci0gIHNpemVfdCAqbnVtX2J5dGVzX3dyaXR0ZW4gPSBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplOwotICAqbnVtX2J5dGVzX3dyaXR0ZW4gPSAwOwotCi0gIC8qIFRyeSB0byBkcmFpbiBmaXJzdC4gKi8KLSAgaWYgKGZyYW1lLT5uZWVkc19kcmFpbmluZykgewotICAgIGRyYWluZWRfc2l6ZSA9IHNhdmVkX291dHB1dF9zaXplIC0gKm51bV9ieXRlc193cml0dGVuOwotICAgIHJlc3VsdCA9Ci0gICAgICAgIGRyYWluX2ZyYW1lX3RvX2J5dGVzKHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7Ci0gICAgKm51bV9ieXRlc193cml0dGVuICs9IGRyYWluZWRfc2l6ZTsKLSAgICBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcyArPSBkcmFpbmVkX3NpemU7Ci0gICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICAgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgewotICAgICAgICAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9IDA7Ci0gICAgICAgIHJlc3VsdCA9IFRTSV9PSzsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0KLSAgLyogTm93IHByb2Nlc3MgdGhlIHVucHJvdGVjdGVkX2J5dGVzLiAqLwotICBpZiAoZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICBpZiAoZnJhbWUtPnNpemUgPT0gMCkgewotICAgIC8qIE5ldyBmcmFtZSwgY3JlYXRlIGEgaGVhZGVyLiAqLwotICAgIHNpemVfdCB3cml0dGVuX2luX2ZyYW1lX3NpemUgPSAwOwotICAgIHN0b3JlMzJfbGl0dGxlX2VuZGlhbigodWludDMyX3QpaW1wbC0+bWF4X2ZyYW1lX3NpemUsIGZyYW1lX2hlYWRlcik7Ci0gICAgd3JpdHRlbl9pbl9mcmFtZV9zaXplID0gVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkU7Ci0gICAgcmVzdWx0ID0gZmlsbF9mcmFtZV9mcm9tX2J5dGVzKGZyYW1lX2hlYWRlciwgJndyaXR0ZW5faW5fZnJhbWVfc2l6ZSwgZnJhbWUpOwotICAgIGlmIChyZXN1bHQgIT0gVFNJX0lOQ09NUExFVEVfREFUQSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJmaWxsX2ZyYW1lX2Zyb21fYnl0ZXMgcmV0dXJuZWQgJXMiLAotICAgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIHJlc3VsdCA9Ci0gICAgICBmaWxsX2ZyYW1lX2Zyb21fYnl0ZXModW5wcm90ZWN0ZWRfYnl0ZXMsIHVucHJvdGVjdGVkX2J5dGVzX3NpemUsIGZyYW1lKTsKLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICBpZiAocmVzdWx0ID09IFRTSV9JTkNPTVBMRVRFX0RBVEEpIHJlc3VsdCA9IFRTSV9PSzsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyogVHJ5IHRvIGRyYWluIGFnYWluLiAqLwotICBpZiAoIWZyYW1lLT5uZWVkc19kcmFpbmluZykgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgaWYgKGZyYW1lLT5vZmZzZXQgIT0gMCkgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgZHJhaW5lZF9zaXplID0gc2F2ZWRfb3V0cHV0X3NpemUgLSAqbnVtX2J5dGVzX3dyaXR0ZW47Ci0gIHJlc3VsdCA9IGRyYWluX2ZyYW1lX3RvX2J5dGVzKHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7Ci0gICpudW1fYnl0ZXNfd3JpdHRlbiArPSBkcmFpbmVkX3NpemU7Ci0gIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgcmVzdWx0ID0gVFNJX09LOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdHNpX3Jlc3VsdCBmYWtlX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoKAotICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgIHNpemVfdCAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSwgc2l6ZV90ICpzdGlsbF9wZW5kaW5nX3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOwotICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUgPSAmaW1wbC0+cHJvdGVjdF9mcmFtZTsKLSAgaWYgKCFmcmFtZS0+bmVlZHNfZHJhaW5pbmcpIHsKLSAgICAvKiBDcmVhdGUgYSBzaG9ydCBmcmFtZS4gKi8KLSAgICBmcmFtZS0+c2l6ZSA9IGZyYW1lLT5vZmZzZXQ7Ci0gICAgZnJhbWUtPm9mZnNldCA9IDA7Ci0gICAgZnJhbWUtPm5lZWRzX2RyYWluaW5nID0gMTsKLSAgICBzdG9yZTMyX2xpdHRsZV9lbmRpYW4oKHVpbnQzMl90KWZyYW1lLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YSk7IC8qIE92ZXJ3cml0ZSBoZWFkZXIuICovCi0gIH0KLSAgcmVzdWx0ID0gZHJhaW5fZnJhbWVfdG9fYnl0ZXMocHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUsIGZyYW1lKTsKLSAgaWYgKHJlc3VsdCA9PSBUU0lfSU5DT01QTEVURV9EQVRBKSByZXN1bHQgPSBUU0lfT0s7Ci0gICpzdGlsbF9wZW5kaW5nX3NpemUgPSBmcmFtZS0+c2l6ZSAtIGZyYW1lLT5vZmZzZXQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB0c2lfcmVzdWx0IGZha2VfcHJvdGVjdG9yX3VucHJvdGVjdCgKLSAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzLAotICAgIHNpemVfdCAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplLCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKLSAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOwotICB0c2lfZmFrZV9mcmFtZSAqZnJhbWUgPSAmaW1wbC0+dW5wcm90ZWN0X2ZyYW1lOwotICBzaXplX3Qgc2F2ZWRfb3V0cHV0X3NpemUgPSAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZTsKLSAgc2l6ZV90IGRyYWluZWRfc2l6ZSA9IDA7Ci0gIHNpemVfdCAqbnVtX2J5dGVzX3dyaXR0ZW4gPSB1bnByb3RlY3RlZF9ieXRlc19zaXplOwotICAqbnVtX2J5dGVzX3dyaXR0ZW4gPSAwOwotCi0gIC8qIFRyeSB0byBkcmFpbiBmaXJzdC4gKi8KLSAgaWYgKGZyYW1lLT5uZWVkc19kcmFpbmluZykgewotICAgIC8qIEdvIHBhc3QgdGhlIGhlYWRlciBpZiBuZWVkZWQuICovCi0gICAgaWYgKGZyYW1lLT5vZmZzZXQgPT0gMCkgZnJhbWUtPm9mZnNldCA9IFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFOwotICAgIGRyYWluZWRfc2l6ZSA9IHNhdmVkX291dHB1dF9zaXplIC0gKm51bV9ieXRlc193cml0dGVuOwotICAgIHJlc3VsdCA9IGRyYWluX2ZyYW1lX3RvX2J5dGVzKHVucHJvdGVjdGVkX2J5dGVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7Ci0gICAgdW5wcm90ZWN0ZWRfYnl0ZXMgKz0gZHJhaW5lZF9zaXplOwotICAgICpudW1fYnl0ZXNfd3JpdHRlbiArPSBkcmFpbmVkX3NpemU7Ci0gICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICAgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgewotICAgICAgICAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplID0gMDsKLSAgICAgICAgcmVzdWx0ID0gVFNJX09LOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICAvKiBOb3cgcHJvY2VzcyB0aGUgcHJvdGVjdGVkX2J5dGVzLiAqLwotICBpZiAoZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICByZXN1bHQgPSBmaWxsX2ZyYW1lX2Zyb21fYnl0ZXMocHJvdGVjdGVkX2ZyYW1lc19ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSwgZnJhbWUpOwotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgcmVzdWx0ID0gVFNJX09LOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKiBUcnkgdG8gZHJhaW4gYWdhaW4uICovCi0gIGlmICghZnJhbWUtPm5lZWRzX2RyYWluaW5nKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICBpZiAoZnJhbWUtPm9mZnNldCAhPSAwKSByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICBmcmFtZS0+b2Zmc2V0ID0gVFNJX0ZBS0VfRlJBTUVfSEVBREVSX1NJWkU7IC8qIEdvIHBhc3QgdGhlIGhlYWRlci4gKi8KLSAgZHJhaW5lZF9zaXplID0gc2F2ZWRfb3V0cHV0X3NpemUgLSAqbnVtX2J5dGVzX3dyaXR0ZW47Ci0gIHJlc3VsdCA9IGRyYWluX2ZyYW1lX3RvX2J5dGVzKHVucHJvdGVjdGVkX2J5dGVzLCAmZHJhaW5lZF9zaXplLCBmcmFtZSk7Ci0gICpudW1fYnl0ZXNfd3JpdHRlbiArPSBkcmFpbmVkX3NpemU7Ci0gIGlmIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSkgcmVzdWx0ID0gVFNJX09LOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBmYWtlX3Byb3RlY3Rvcl9kZXN0cm95KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYpIHsKLSAgdHNpX2Zha2VfZnJhbWVfcHJvdGVjdG9yICppbXBsID0gKHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvciAqKXNlbGY7Ci0gIHRzaV9mYWtlX2ZyYW1lX2Rlc3RydWN0KCZpbXBsLT5wcm90ZWN0X2ZyYW1lKTsKLSAgdHNpX2Zha2VfZnJhbWVfZGVzdHJ1Y3QoJmltcGwtPnVucHJvdGVjdF9mcmFtZSk7Ci0gIGZyZWUoc2VsZik7Ci19Ci0KLXN0YXRpYyBjb25zdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZSBmcmFtZV9wcm90ZWN0b3JfdnRhYmxlID0gewotICAgIGZha2VfcHJvdGVjdG9yX3Byb3RlY3QsIGZha2VfcHJvdGVjdG9yX3Byb3RlY3RfZmx1c2gsCi0gICAgZmFrZV9wcm90ZWN0b3JfdW5wcm90ZWN0LCBmYWtlX3Byb3RlY3Rvcl9kZXN0cm95LAotfTsKLQotLyogLS0tIHRzaV9oYW5kc2hha2VyIG1ldGhvZHMgaW1wbGVtZW50YXRpb24uIC0tLSovCi0KLXN0YXRpYyB0c2lfcmVzdWx0IGZha2VfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKAotICAgIHRzaV9oYW5kc2hha2VyICpzZWxmLCB1bnNpZ25lZCBjaGFyICpieXRlcywgc2l6ZV90ICpieXRlc19zaXplKSB7Ci0gIHRzaV9mYWtlX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX2Zha2VfaGFuZHNoYWtlciAqKXNlbGY7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICBpZiAoaW1wbC0+bmVlZHNfaW5jb21pbmdfbWVzc2FnZSB8fCBpbXBsLT5yZXN1bHQgPT0gVFNJX09LKSB7Ci0gICAgKmJ5dGVzX3NpemUgPSAwOwotICAgIHJldHVybiBUU0lfT0s7Ci0gIH0KLSAgaWYgKCFpbXBsLT5vdXRnb2luZy5uZWVkc19kcmFpbmluZykgewotICAgIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlIG5leHRfbWVzc2FnZV90b19zZW5kID0KLSAgICAgICAgaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQgKyAyOwotICAgIGNvbnN0IGNoYXIgKm1zZ19zdHJpbmcgPQotICAgICAgICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQpOwotICAgIHJlc3VsdCA9IGJ5dGVzX3RvX2ZyYW1lKCh1bnNpZ25lZCBjaGFyICopbXNnX3N0cmluZywgc3RybGVuKG1zZ19zdHJpbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbXBsLT5vdXRnb2luZyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKG5leHRfbWVzc2FnZV90b19zZW5kID4gVFNJX0ZBS0VfSEFORFNIQUtFX01FU1NBR0VfTUFYKSB7Ci0gICAgICBuZXh0X21lc3NhZ2VfdG9fc2VuZCA9IFRTSV9GQUtFX0hBTkRTSEFLRV9NRVNTQUdFX01BWDsKLSAgICB9Ci0gICAgaWYgKHRzaV90cmFjaW5nX2VuYWJsZWQpIHsKLSAgICAgIGdwcl9sb2coR1BSX0lORk8sICIlcyBwcmVwYXJlZCAlcy4iLAotICAgICAgICAgICAgICBpbXBsLT5pc19jbGllbnQgPyAiQ2xpZW50IiA6ICJTZXJ2ZXIiLAotICAgICAgICAgICAgICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQpKTsKLSAgICB9Ci0gICAgaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQgPSBuZXh0X21lc3NhZ2VfdG9fc2VuZDsKLSAgfQotICByZXN1bHQgPSBkcmFpbl9mcmFtZV90b19ieXRlcyhieXRlcywgYnl0ZXNfc2l6ZSwgJmltcGwtPm91dGdvaW5nKTsKLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7Ci0gIGlmICghaW1wbC0+aXNfY2xpZW50ICYmCi0gICAgICBpbXBsLT5uZXh0X21lc3NhZ2VfdG9fc2VuZCA9PSBUU0lfRkFLRV9IQU5EU0hBS0VfTUVTU0FHRV9NQVgpIHsKLSAgICAvKiBXZSdyZSBkb25lLiAqLwotICAgIGlmICh0c2lfdHJhY2luZ19lbmFibGVkKSB7Ci0gICAgICBncHJfbG9nKEdQUl9JTkZPLCAiU2VydmVyIGlzIGRvbmUuIik7Ci0gICAgfQotICAgIGltcGwtPnJlc3VsdCA9IFRTSV9PSzsKLSAgfSBlbHNlIHsKLSAgICBpbXBsLT5uZWVkc19pbmNvbWluZ19tZXNzYWdlID0gMTsKLSAgfQotICByZXR1cm4gVFNJX09LOwotfQotCi1zdGF0aWMgdHNpX3Jlc3VsdCBmYWtlX2hhbmRzaGFrZXJfcHJvY2Vzc19ieXRlc19mcm9tX3BlZXIoCi0gICAgdHNpX2hhbmRzaGFrZXIgKnNlbGYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBzaXplX3QgKmJ5dGVzX3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHRzaV9mYWtlX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX2Zha2VfaGFuZHNoYWtlciAqKXNlbGY7Ci0gIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlIGV4cGVjdGVkX21zZyA9IGltcGwtPm5leHRfbWVzc2FnZV90b19zZW5kIC0gMTsKLSAgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2UgcmVjZWl2ZWRfbXNnOwotCi0gIGlmICghaW1wbC0+bmVlZHNfaW5jb21pbmdfbWVzc2FnZSB8fCBpbXBsLT5yZXN1bHQgPT0gVFNJX09LKSB7Ci0gICAgKmJ5dGVzX3NpemUgPSAwOwotICAgIHJldHVybiBUU0lfT0s7Ci0gIH0KLSAgcmVzdWx0ID0gZmlsbF9mcmFtZV9mcm9tX2J5dGVzKGJ5dGVzLCBieXRlc19zaXplLCAmaW1wbC0+aW5jb21pbmcpOwotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgcmV0dXJuIHJlc3VsdDsKLQotICAvKiBXZSBub3cgaGF2ZSBhIGNvbXBsZXRlIGZyYW1lLiAqLwotICByZXN1bHQgPSB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV9mcm9tX3N0cmluZygKLSAgICAgIChjb25zdCBjaGFyICopaW1wbC0+aW5jb21pbmcuZGF0YSArIFRTSV9GQUtFX0ZSQU1FX0hFQURFUl9TSVpFLAotICAgICAgJnJlY2VpdmVkX21zZyk7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgaW1wbC0+cmVzdWx0ID0gcmVzdWx0OwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgaWYgKHJlY2VpdmVkX21zZyAhPSBleHBlY3RlZF9tc2cpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkludmFsaWQgcmVjZWl2ZWQgbWVzc2FnZSAoJXMgaW5zdGVhZCBvZiAlcykiLAotICAgICAgICAgICAgdHNpX2Zha2VfaGFuZHNoYWtlX21lc3NhZ2VfdG9fc3RyaW5nKHJlY2VpdmVkX21zZyksCi0gICAgICAgICAgICB0c2lfZmFrZV9oYW5kc2hha2VfbWVzc2FnZV90b19zdHJpbmcoZXhwZWN0ZWRfbXNnKSk7Ci0gIH0KLSAgaWYgKHRzaV90cmFjaW5nX2VuYWJsZWQpIHsKLSAgICBncHJfbG9nKEdQUl9JTkZPLCAiJXMgcmVjZWl2ZWQgJXMuIiwgaW1wbC0+aXNfY2xpZW50ID8gIkNsaWVudCIgOiAiU2VydmVyIiwKLSAgICAgICAgICAgIHRzaV9mYWtlX2hhbmRzaGFrZV9tZXNzYWdlX3RvX3N0cmluZyhyZWNlaXZlZF9tc2cpKTsKLSAgfQotICB0c2lfZmFrZV9mcmFtZV9yZXNldCgmaW1wbC0+aW5jb21pbmcsIDAgLyogbmVlZHNfZHJhaW5pbmcgKi8pOwotICBpbXBsLT5uZWVkc19pbmNvbWluZ19tZXNzYWdlID0gMDsKLSAgaWYgKGltcGwtPm5leHRfbWVzc2FnZV90b19zZW5kID09IFRTSV9GQUtFX0hBTkRTSEFLRV9NRVNTQUdFX01BWCkgewotICAgIC8qIFdlJ3JlIGRvbmUuICovCi0gICAgaWYgKHRzaV90cmFjaW5nX2VuYWJsZWQpIHsKLSAgICAgIGdwcl9sb2coR1BSX0lORk8sICIlcyBpcyBkb25lLiIsIGltcGwtPmlzX2NsaWVudCA/ICJDbGllbnQiIDogIlNlcnZlciIpOwotICAgIH0KLSAgICBpbXBsLT5yZXN1bHQgPSBUU0lfT0s7Ci0gIH0KLSAgcmV0dXJuIFRTSV9PSzsKLX0KLQotc3RhdGljIHRzaV9yZXN1bHQgZmFrZV9oYW5kc2hha2VyX2dldF9yZXN1bHQodHNpX2hhbmRzaGFrZXIgKnNlbGYpIHsKLSAgdHNpX2Zha2VfaGFuZHNoYWtlciAqaW1wbCA9ICh0c2lfZmFrZV9oYW5kc2hha2VyICopc2VsZjsKLSAgcmV0dXJuIGltcGwtPnJlc3VsdDsKLX0KLQotc3RhdGljIHRzaV9yZXN1bHQgZmFrZV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgKnBlZXIpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSB0c2lfY29uc3RydWN0X3BlZXIoMSwgcGVlcik7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OwotICByZXN1bHQgPSB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5X2Zyb21fY3N0cmluZygKLSAgICAgIFRTSV9DRVJUSUZJQ0FURV9UWVBFX1BFRVJfUFJPUEVSVFksIFRTSV9GQUtFX0NFUlRJRklDQVRFX1RZUEUsCi0gICAgICAmcGVlci0+cHJvcGVydGllc1swXSk7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB0c2lfcGVlcl9kZXN0cnVjdChwZWVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHRzaV9yZXN1bHQgZmFrZV9oYW5kc2hha2VyX2NyZWF0ZV9mcmFtZV9wcm90ZWN0b3IoCi0gICAgdHNpX2hhbmRzaGFrZXIgKnNlbGYsIHNpemVfdCAqbWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplLAotICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKipwcm90ZWN0b3IpIHsKLSAgKnByb3RlY3RvciA9IHRzaV9jcmVhdGVfZmFrZV9wcm90ZWN0b3IobWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplKTsKLSAgaWYgKCpwcm90ZWN0b3IgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOwotICByZXR1cm4gVFNJX09LOwotfQotCi1zdGF0aWMgdm9pZCBmYWtlX2hhbmRzaGFrZXJfZGVzdHJveSh0c2lfaGFuZHNoYWtlciAqc2VsZikgewotICB0c2lfZmFrZV9oYW5kc2hha2VyICppbXBsID0gKHRzaV9mYWtlX2hhbmRzaGFrZXIgKilzZWxmOwotICB0c2lfZmFrZV9mcmFtZV9kZXN0cnVjdCgmaW1wbC0+aW5jb21pbmcpOwotICB0c2lfZmFrZV9mcmFtZV9kZXN0cnVjdCgmaW1wbC0+b3V0Z29pbmcpOwotICBmcmVlKHNlbGYpOwotfQotCi1zdGF0aWMgY29uc3QgdHNpX2hhbmRzaGFrZXJfdnRhYmxlIGhhbmRzaGFrZXJfdnRhYmxlID0gewotICAgIGZha2VfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyLAotICAgIGZha2VfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlciwKLSAgICBmYWtlX2hhbmRzaGFrZXJfZ2V0X3Jlc3VsdCwKLSAgICBmYWtlX2hhbmRzaGFrZXJfZXh0cmFjdF9wZWVyLAotICAgIGZha2VfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yLAotICAgIGZha2VfaGFuZHNoYWtlcl9kZXN0cm95LAotfTsKLQotdHNpX2hhbmRzaGFrZXIgKnRzaV9jcmVhdGVfZmFrZV9oYW5kc2hha2VyKGludCBpc19jbGllbnQpIHsKLSAgdHNpX2Zha2VfaGFuZHNoYWtlciAqaW1wbCA9IGNhbGxvYygxLCBzaXplb2YodHNpX2Zha2VfaGFuZHNoYWtlcikpOwotICBpbXBsLT5iYXNlLnZ0YWJsZSA9ICZoYW5kc2hha2VyX3Z0YWJsZTsKLSAgaW1wbC0+aXNfY2xpZW50ID0gaXNfY2xpZW50OwotICBpbXBsLT5yZXN1bHQgPSBUU0lfSEFORFNIQUtFX0lOX1BST0dSRVNTOwotICBpZiAoaXNfY2xpZW50KSB7Ci0gICAgaW1wbC0+bmVlZHNfaW5jb21pbmdfbWVzc2FnZSA9IDA7Ci0gICAgaW1wbC0+bmV4dF9tZXNzYWdlX3RvX3NlbmQgPSBUU0lfRkFLRV9DTElFTlRfSU5JVDsKLSAgfSBlbHNlIHsKLSAgICBpbXBsLT5uZWVkc19pbmNvbWluZ19tZXNzYWdlID0gMTsKLSAgICBpbXBsLT5uZXh0X21lc3NhZ2VfdG9fc2VuZCA9IFRTSV9GQUtFX1NFUlZFUl9JTklUOwotICB9Ci0gIHJldHVybiAmaW1wbC0+YmFzZTsKLX0KLQotdHNpX2ZyYW1lX3Byb3RlY3RvciAqdHNpX2NyZWF0ZV9mYWtlX3Byb3RlY3RvcigKLSAgICBzaXplX3QgKm1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSkgewotICB0c2lfZmFrZV9mcmFtZV9wcm90ZWN0b3IgKmltcGwgPSBjYWxsb2MoMSwgc2l6ZW9mKHRzaV9mYWtlX2ZyYW1lX3Byb3RlY3RvcikpOwotICBpZiAoaW1wbCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgaW1wbC0+bWF4X2ZyYW1lX3NpemUgPSAobWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFNJX0ZBS0VfREVGQVVMVF9GUkFNRV9TSVpFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKm1heF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZTsKLSAgaW1wbC0+YmFzZS52dGFibGUgPSAmZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZTsKLSAgcmV0dXJuICZpbXBsLT5iYXNlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmggYi9zcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4ZTU5Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RTSV9GQUtFX1RSQU5TUE9SVF9TRUNVUklUWV9ICi0jZGVmaW5lIEdSUENfQ09SRV9UU0lfRkFLRV9UUkFOU1BPUlRfU0VDVVJJVFlfSAotCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBWYWx1ZSBmb3IgdGhlIFRTSV9DRVJUSUZJQ0FURV9UWVBFX1BFRVJfUFJPUEVSVFkgcHJvcGVydHkgZm9yIEZBS0UgY2VydHMuICovCi0jZGVmaW5lIFRTSV9GQUtFX0NFUlRJRklDQVRFX1RZUEUgIkZBS0UiCi0KLS8qIENyZWF0ZXMgYSBmYWtlIGhhbmRzaGFrZXIgdGhhdCB3aWxsIGNyZWF0ZSBhIGZha2UgZnJhbWUgcHJvdGVjdG9yLgotCi0gICBObyBjcnlwdG9ncmFwaHkgaXMgcGVyZm9ybWVkIGluIHRoZXNlIG9iamVjdHMuIFRoZXkganVzdCBzaW11bGF0ZSBoYW5kc2hha2UKLSAgIG1lc3NhZ2VzIGdvaW5nIGJhY2sgYW5kIGZvcnRoIGZvciB0aGUgaGFuZHNoYWtlciBhbmQgZG8gc29tZSBmcmFtaW5nIG9uCi0gICBjbGVhcnRleHQgZGF0YSBmb3IgdGhlIHByb3RlY3Rvci4gICovCi10c2lfaGFuZHNoYWtlciAqdHNpX2NyZWF0ZV9mYWtlX2hhbmRzaGFrZXIoaW50IGlzX2NsaWVudCk7Ci0KLS8qIENyZWF0ZXMgYSBwcm90ZWN0b3IgZGlyZWN0bHkgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSBoYW5kc2hha2UgcGhhc2UuICovCi10c2lfZnJhbWVfcHJvdGVjdG9yICp0c2lfY3JlYXRlX2Zha2VfcHJvdGVjdG9yKAotICAgIHNpemVfdCAqbWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UU0lfRkFLRV9UUkFOU1BPUlRfU0VDVVJJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyBiL3NyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjU4MjYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzYgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCi0KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIFRPRE8oamJvZXVmKTogcmVmYWN0b3IgaW5ldF9udG9wIGludG8gYSBwb3J0YWJpbGl0eSBoZWFkZXIuICovCi0jaWZkZWYgR1BSX1dJTlNPQ0tfU09DS0VUCi0jaW5jbHVkZSA8d3MydGNwaXAuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KLSNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgotI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+IC8qIEZvciBPUEVOU1NMX2ZyZWUgKi8KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS9zc2xfdHlwZXMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiCi0KLS8qIC0tLSBDb25zdGFudHMuIC0tLSovCi0KLSNkZWZpbmUgVFNJX1NTTF9NQVhfUFJPVEVDVEVEX0ZSQU1FX1NJWkVfVVBQRVJfQk9VTkQgMTYzODQKLSNkZWZpbmUgVFNJX1NTTF9NQVhfUFJPVEVDVEVEX0ZSQU1FX1NJWkVfTE9XRVJfQk9VTkQgMTAyNAotCi0vKiBQdXR0aW5nIGEgbWFjcm8gbGlrZSB0aGlzIGFuZCBsaXR0ZXJpbmcgdGhlIHNvdXJjZSBmaWxlIHdpdGggI2lmIGlzIHJlYWxseQotICAgYmFkIHByYWN0aWNlLgotICAgVE9ETyhqYm9ldWYpOiByZWZhY3RvciBhbGwgdGhlICNpZiAvICNlbmRpZiBpbiBhIHNlcGFyYXRlIG1vZHVsZS4gKi8KLSNpZm5kZWYgVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUCi0jZGVmaW5lIFRTSV9PUEVOU1NMX0FMUE5fU1VQUE9SVCAxCi0jZW5kaWYKLQotLyogVE9ETyhqYm9ldWYpOiBJIGhhdmUgbm90IGZvdW5kIGEgd2F5IHRvIGdldCB0aGlzIG51bWJlciBkeW5hbWljYWxseSBmcm9tIHRoZQotICAgU1NMIHN0cnVjdHVyZS4gVGhpcyBpcyB3aGF0IHdlIHdvdWxkIHVsdGltYXRlbHkgd2FudCB0aG91Z2guLi4gKi8KLSNkZWZpbmUgVFNJX1NTTF9NQVhfUFJPVEVDVElPTl9PVkVSSEVBRCAxMDAKLQotLyogLS0tIFN0cnVjdHVyZSBkZWZpbml0aW9ucy4gLS0tKi8KLQotc3RydWN0IHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5IHsKLSAgdHNpX3Jlc3VsdCAoKmNyZWF0ZV9oYW5kc2hha2VyKSh0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9oYW5kc2hha2VyICoqaGFuZHNoYWtlcik7Ci0gIHZvaWQgKCpkZXN0cm95KSh0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZik7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5IGJhc2U7Ci0gIFNTTF9DVFggKnNzbF9jb250ZXh0OwotICB1bnNpZ25lZCBjaGFyICphbHBuX3Byb3RvY29sX2xpc3Q7Ci0gIHNpemVfdCBhbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoOwotfSB0c2lfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3Rvcnk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgYmFzZTsKLQotICAvKiBTZXZlcmFsIGNvbnRleHRzIHRvIHN1cHBvcnQgU05JLgotICAgICBUaGUgdHNpX3BlZXIgYXJyYXkgY29udGFpbnMgdGhlIHN1YmplY3QgbmFtZXMgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZXMKLSAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0cyBhdCB0aGUgc2FtZSBpbmRleC4gICovCi0gIFNTTF9DVFggKipzc2xfY29udGV4dHM7Ci0gIHRzaV9wZWVyICpzc2xfY29udGV4dF94NTA5X3N1YmplY3RfbmFtZXM7Ci0gIHNpemVfdCBzc2xfY29udGV4dF9jb3VudDsKLSAgdW5zaWduZWQgY2hhciAqYWxwbl9wcm90b2NvbF9saXN0OwotICBzaXplX3QgYWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aDsKLX0gdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRzaV9oYW5kc2hha2VyIGJhc2U7Ci0gIFNTTCAqc3NsOwotICBCSU8gKmludG9fc3NsOwotICBCSU8gKmZyb21fc3NsOwotICB0c2lfcmVzdWx0IHJlc3VsdDsKLX0gdHNpX3NzbF9oYW5kc2hha2VyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRzaV9mcmFtZV9wcm90ZWN0b3IgYmFzZTsKLSAgU1NMICpzc2w7Ci0gIEJJTyAqaW50b19zc2w7Ci0gIEJJTyAqZnJvbV9zc2w7Ci0gIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgc2l6ZV90IGJ1ZmZlcl9zaXplOwotICBzaXplX3QgYnVmZmVyX29mZnNldDsKLX0gdHNpX3NzbF9mcmFtZV9wcm90ZWN0b3I7Ci0KLS8qIC0tLSBMaWJyYXJ5IEluaXRpYWxpemF0aW9uLiAtLS0qLwotCi1zdGF0aWMgZ3ByX29uY2UgaW5pdF9vcGVuc3NsX29uY2UgPSBHUFJfT05DRV9JTklUOwotc3RhdGljIGdwcl9tdSAqb3BlbnNzbF9tdXRleGVzID0gTlVMTDsKLQotc3RhdGljIHZvaWQgb3BlbnNzbF9sb2NraW5nX2NiKGludCBtb2RlLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIHsKLSAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgewotICAgIGdwcl9tdV9sb2NrKCZvcGVuc3NsX211dGV4ZXNbdHlwZV0pOwotICB9IGVsc2UgewotICAgIGdwcl9tdV91bmxvY2soJm9wZW5zc2xfbXV0ZXhlc1t0eXBlXSk7Ci0gIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3BlbnNzbF90aHJlYWRfaWRfY2Iodm9pZCkgewotICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZ3ByX3RoZF9jdXJyZW50aWQoKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9vcGVuc3NsKHZvaWQpIHsKLSAgaW50IGk7Ci0gIGludCBudW1fbG9ja3M7Ci0gIFNTTF9saWJyYXJ5X2luaXQoKTsKLSAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOwotICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOwotICBudW1fbG9ja3MgPSBDUllQVE9fbnVtX2xvY2tzKCk7Ci0gIEdQUl9BU1NFUlQobnVtX2xvY2tzID4gMCk7Ci0gIG9wZW5zc2xfbXV0ZXhlcyA9IG1hbGxvYygoc2l6ZV90KW51bV9sb2NrcyAqIHNpemVvZihncHJfbXUpKTsKLSAgR1BSX0FTU0VSVChvcGVuc3NsX211dGV4ZXMgIT0gTlVMTCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykgewotICAgIGdwcl9tdV9pbml0KCZvcGVuc3NsX211dGV4ZXNbaV0pOwotICB9Ci0gIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhvcGVuc3NsX2xvY2tpbmdfY2IpOwotICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKG9wZW5zc2xfdGhyZWFkX2lkX2NiKTsKLX0KLQotLyogLS0tIFNzbCB1dGlscy4gLS0tKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9lcnJvcl9zdHJpbmcoaW50IGVycm9yKSB7Ci0gIHN3aXRjaCAoZXJyb3IpIHsKLSAgICBjYXNlIFNTTF9FUlJPUl9OT05FOgotICAgICAgcmV0dXJuICJTU0xfRVJST1JfTk9ORSI7Ci0gICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46Ci0gICAgICByZXR1cm4gIlNTTF9FUlJPUl9aRVJPX1JFVFVSTiI7Ci0gICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgotICAgICAgcmV0dXJuICJTU0xfRVJST1JfV0FOVF9SRUFEIjsKLSAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgotICAgICAgcmV0dXJuICJTU0xfRVJST1JfV0FOVF9XUklURSI7Ci0gICAgY2FzZSBTU0xfRVJST1JfV0FOVF9DT05ORUNUOgotICAgICAgcmV0dXJuICJTU0xfRVJST1JfV0FOVF9DT05ORUNUIjsKLSAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX0FDQ0VQVDoKLSAgICAgIHJldHVybiAiU1NMX0VSUk9SX1dBTlRfQUNDRVBUIjsKLSAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgotICAgICAgcmV0dXJuICJTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCI7Ci0gICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKLSAgICAgIHJldHVybiAiU1NMX0VSUk9SX1NZU0NBTEwiOwotICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKLSAgICAgIHJldHVybiAiU1NMX0VSUk9SX1NTTCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBlcnJvciI7Ci0gIH0KLX0KLQotLyogVE9ETyhqYm9ldWYpOiBSZW1vdmUgd2hlbiB3ZSBhcmUgcGFzdCB0aGUgZGVidWdnaW5nIHBoYXNlIHdpdGggdGhpcyBjb2RlLiAqLwotc3RhdGljIHZvaWQgc3NsX2xvZ193aGVyZV9pbmZvKGNvbnN0IFNTTCAqc3NsLCBpbnQgd2hlcmUsIGludCBmbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZykgewotICBpZiAoKHdoZXJlICYgZmxhZykgJiYgdHNpX3RyYWNpbmdfZW5hYmxlZCkgewotICAgIGdwcl9sb2coR1BSX0lORk8sICIlMjAuMjBzIC0gJTMwLjMwcyAgLSAlNS4xMHMiLCBtc2csCi0gICAgICAgICAgICBTU0xfc3RhdGVfc3RyaW5nX2xvbmcoc3NsKSwgU1NMX3N0YXRlX3N0cmluZyhzc2wpKTsKLSAgfQotfQotCi0vKiBVc2VkIGZvciBkZWJ1Z2dpbmcuIFRPRE8oamJvZXVmKTogUmVtb3ZlIHdoZW4gY29kZSBpcyBtYXR1cmUgZW5vdWdoLiAqLwotc3RhdGljIHZvaWQgc3NsX2luZm9fY2FsbGJhY2soY29uc3QgU1NMICpzc2wsIGludCB3aGVyZSwgaW50IHJldCkgewotICBpZiAocmV0ID09IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgInNzbF9pbmZvX2NhbGxiYWNrOiBlcnJvciBvY2N1cmVkLlxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3NsX2xvZ193aGVyZV9pbmZvKHNzbCwgd2hlcmUsIFNTTF9DQl9MT09QLCAiTE9PUCIpOwotICBzc2xfbG9nX3doZXJlX2luZm8oc3NsLCB3aGVyZSwgU1NMX0NCX0hBTkRTSEFLRV9TVEFSVCwgIkhBTkRTSEFLRSBTVEFSVCIpOwotICBzc2xfbG9nX3doZXJlX2luZm8oc3NsLCB3aGVyZSwgU1NMX0NCX0hBTkRTSEFLRV9ET05FLCAiSEFORFNIQUtFIERPTkUiKTsKLX0KLQotLyogUmV0dXJucyAxIGlmIG5hbWUgbG9va3MgbGlrZSBhbiBJUCBhZGRyZXNzLCAwIG90aGVyd2lzZS4KLSAgIFRoaXMgaXMgYSB2ZXJ5IHJvdWdoIGhldXJpc3RpYywgYW5kIG9ubHkgaGFuZGxlcyBJUHY2IGluIGhleGFkZWNpbWFsIGZvcm0uICovCi1zdGF0aWMgaW50IGxvb2tzX2xpa2VfaXBfYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lKSB7Ci0gIHNpemVfdCBpOwotICBzaXplX3QgZG90X2NvdW50ID0gMDsKLSAgc2l6ZV90IG51bV9zaXplID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihuYW1lKTsgaSsrKSB7Ci0gICAgaWYgKG5hbWVbaV0gPT0gJzonKSB7Ci0gICAgICAvKiBJUHY2IEFkZHJlc3MgaW4gaGV4YWRlY2ltYWwgZm9ybSwgOiBpcyBub3QgYWxsb3dlZCBpbiBETlMgbmFtZXMuICovCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKG5hbWVbaV0gPj0gJzAnICYmIG5hbWVbaV0gPD0gJzknKSB7Ci0gICAgICBpZiAobnVtX3NpemUgPiAzKSByZXR1cm4gMDsKLSAgICAgIG51bV9zaXplKys7Ci0gICAgfSBlbHNlIGlmIChuYW1lW2ldID09ICcuJykgewotICAgICAgaWYgKGRvdF9jb3VudCA+IDMgfHwgbnVtX3NpemUgPT0gMCkgcmV0dXJuIDA7Ci0gICAgICBkb3RfY291bnQrKzsKLSAgICAgIG51bV9zaXplID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIGlmIChkb3RfY291bnQgPCAzIHx8IG51bV9zaXplID09IDApIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLyogR2V0cyB0aGUgc3ViamVjdCBDTiBmcm9tIGFuIFg1MDkgY2VydC4gKi8KLXN0YXRpYyB0c2lfcmVzdWx0IHNzbF9nZXRfeDUwOV9jb21tb25fbmFtZShYNTA5ICpjZXJ0LCB1bnNpZ25lZCBjaGFyICoqdXRmOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnV0Zjhfc2l6ZSkgewotICBpbnQgY29tbW9uX25hbWVfaW5kZXggPSAtMTsKLSAgWDUwOV9OQU1FX0VOVFJZICpjb21tb25fbmFtZV9lbnRyeSA9IE5VTEw7Ci0gIEFTTjFfU1RSSU5HICpjb21tb25fbmFtZV9hc24xID0gTlVMTDsKLSAgWDUwOV9OQU1FICpzdWJqZWN0X25hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCk7Ci0gIGludCB1dGY4X3JldHVybmVkX3NpemUgPSAwOwotICBpZiAoc3ViamVjdF9uYW1lID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgc3ViamVjdCBuYW1lIGZyb20gY2VydGlmaWNhdGUuIik7Ci0gICAgcmV0dXJuIFRTSV9OT1RfRk9VTkQ7Ci0gIH0KLSAgY29tbW9uX25hbWVfaW5kZXggPQotICAgICAgWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQoc3ViamVjdF9uYW1lLCBOSURfY29tbW9uTmFtZSwgLTEpOwotICBpZiAoY29tbW9uX25hbWVfaW5kZXggPT0gLTEpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGNvbW1vbiBuYW1lIG9mIHN1YmplY3QgZnJvbSBjZXJ0aWZpY2F0ZS4iKTsKLSAgICByZXR1cm4gVFNJX05PVF9GT1VORDsKLSAgfQotICBjb21tb25fbmFtZV9lbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkoc3ViamVjdF9uYW1lLCBjb21tb25fbmFtZV9pbmRleCk7Ci0gIGlmIChjb21tb25fbmFtZV9lbnRyeSA9PSBOVUxMKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgZ2V0IGNvbW1vbiBuYW1lIGVudHJ5IGZyb20gY2VydGlmaWNhdGUuIik7Ci0gICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgfQotICBjb21tb25fbmFtZV9hc24xID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGNvbW1vbl9uYW1lX2VudHJ5KTsKLSAgaWYgKGNvbW1vbl9uYW1lX2FzbjEgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgY29tbW9uIG5hbWUgZW50cnkgYXNuMSBmcm9tIGNlcnRpZmljYXRlLiIpOwotICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gIH0KLSAgdXRmOF9yZXR1cm5lZF9zaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCh1dGY4LCBjb21tb25fbmFtZV9hc24xKTsKLSAgaWYgKHV0ZjhfcmV0dXJuZWRfc2l6ZSA8IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBleHRyYWN0IHV0ZjggZnJvbSBhc24xIHN0cmluZy4iKTsKLSAgICByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gIH0KLSAgKnV0Zjhfc2l6ZSA9IChzaXplX3QpdXRmOF9yZXR1cm5lZF9zaXplOwotICByZXR1cm4gVFNJX09LOwotfQotCi0vKiBHZXRzIHRoZSBzdWJqZWN0IENOIG9mIGFuIFg1MDkgY2VydCBhcyBhIHRzaV9wZWVyX3Byb3BlcnR5LiAqLwotc3RhdGljIHRzaV9yZXN1bHQgcGVlcl9wcm9wZXJ0eV9mcm9tX3g1MDlfY29tbW9uX25hbWUoCi0gICAgWDUwOSAqY2VydCwgdHNpX3BlZXJfcHJvcGVydHkgKnByb3BlcnR5KSB7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbW1vbl9uYW1lOwotICBzaXplX3QgY29tbW9uX25hbWVfc2l6ZTsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPQotICAgICAgc3NsX2dldF94NTA5X2NvbW1vbl9uYW1lKGNlcnQsICZjb21tb25fbmFtZSwgJmNvbW1vbl9uYW1lX3NpemUpOwotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgIGlmIChyZXN1bHQgPT0gVFNJX05PVF9GT1VORCkgewotICAgICAgY29tbW9uX25hbWUgPSBOVUxMOwotICAgICAgY29tbW9uX25hbWVfc2l6ZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIHJlc3VsdCA9IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHkoCi0gICAgICBUU0lfWDUwOV9TVUJKRUNUX0NPTU1PTl9OQU1FX1BFRVJfUFJPUEVSVFksCi0gICAgICBjb21tb25fbmFtZSA9PSBOVUxMID8gIiIgOiAoY29uc3QgY2hhciAqKWNvbW1vbl9uYW1lLCBjb21tb25fbmFtZV9zaXplLAotICAgICAgcHJvcGVydHkpOwotICBPUEVOU1NMX2ZyZWUoY29tbW9uX25hbWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBHZXRzIHRoZSBYNTA5IGNlcnQgaW4gUEVNIGZvcm1hdCBhcyBhIHRzaV9wZWVyX3Byb3BlcnR5LiAqLwotc3RhdGljIHRzaV9yZXN1bHQgYWRkX3BlbV9jZXJ0aWZpY2F0ZShYNTA5ICpjZXJ0LCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpIHsKLSAgQklPICpiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKLSAgaWYgKCFQRU1fd3JpdGVfYmlvX1g1MDkoYmlvLCBjZXJ0KSkgewotICAgIEJJT19mcmVlKGJpbyk7Ci0gICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgfQotICBjaGFyICpjb250ZW50czsKLSAgbG9uZyBsZW4gPSBCSU9fZ2V0X21lbV9kYXRhKGJpbywgJmNvbnRlbnRzKTsKLSAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgQklPX2ZyZWUoYmlvKTsKLSAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICB9Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gdHNpX2NvbnN0cnVjdF9zdHJpbmdfcGVlcl9wcm9wZXJ0eSgKLSAgICAgIFRTSV9YNTA5X1BFTV9DRVJUX1BST1BFUlRZLCAoY29uc3QgY2hhciAqKWNvbnRlbnRzLCAoc2l6ZV90KWxlbiwKLSAgICAgIHByb3BlcnR5KTsKLSAgQklPX2ZyZWUoYmlvKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogR2V0cyB0aGUgc3ViamVjdCBTQU5zIGZyb20gYW4gWDUwOSBjZXJ0IGFzIGEgdHNpX3BlZXJfcHJvcGVydHkuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBhZGRfc3ViamVjdF9hbHRfbmFtZXNfcHJvcGVydGllc190b19wZWVyKAotICAgIHRzaV9wZWVyICpwZWVyLCBHRU5FUkFMX05BTUVTICpzdWJqZWN0X2FsdF9uYW1lcywKLSAgICBzaXplX3Qgc3ViamVjdF9hbHRfbmFtZV9jb3VudCkgewotICBzaXplX3QgaTsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0KLSAgLyogUmVzZXQgZm9yIEROUyBlbnRyaWVzIGZpbHRlcmluZy4gKi8KLSAgcGVlci0+cHJvcGVydHlfY291bnQgLT0gc3ViamVjdF9hbHRfbmFtZV9jb3VudDsKLQotICBmb3IgKGkgPSAwOyBpIDwgc3ViamVjdF9hbHRfbmFtZV9jb3VudDsgaSsrKSB7Ci0gICAgR0VORVJBTF9OQU1FICpzdWJqZWN0X2FsdF9uYW1lID0KLSAgICAgICAgc2tfR0VORVJBTF9OQU1FX3ZhbHVlKHN1YmplY3RfYWx0X25hbWVzLCBUU0lfU0laRV9BU19TSVpFKGkpKTsKLSAgICAvKiBGaWx0ZXIgb3V0IHRoZSBub24tZG5zIGVudHJpZXMgbmFtZXMuICovCi0gICAgaWYgKHN1YmplY3RfYWx0X25hbWUtPnR5cGUgPT0gR0VOX0ROUykgewotICAgICAgdW5zaWduZWQgY2hhciAqbmFtZSA9IE5VTEw7Ci0gICAgICBpbnQgbmFtZV9zaXplOwotICAgICAgbmFtZV9zaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmbmFtZSwgc3ViamVjdF9hbHRfbmFtZS0+ZC5kTlNOYW1lKTsKLSAgICAgIGlmIChuYW1lX3NpemUgPCAwKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGdldCB1dGY4IGZyb20gYXNuMSBzdHJpbmcuIik7Ci0gICAgICAgIHJlc3VsdCA9IFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5KAotICAgICAgICAgIFRTSV9YNTA5X1NVQkpFQ1RfQUxURVJOQVRJVkVfTkFNRV9QRUVSX1BST1BFUlRZLCAoY29uc3QgY2hhciAqKW5hbWUsCi0gICAgICAgICAgKHNpemVfdCluYW1lX3NpemUsICZwZWVyLT5wcm9wZXJ0aWVzW3BlZXItPnByb3BlcnR5X2NvdW50KytdKTsKLSAgICAgIE9QRU5TU0xfZnJlZShuYW1lKTsKLSAgICB9IGVsc2UgaWYgKHN1YmplY3RfYWx0X25hbWUtPnR5cGUgPT0gR0VOX0lQQUREKSB7Ci0gICAgICBjaGFyIG50b3BfYnVmW0lORVQ2X0FERFJTVFJMRU5dOwotICAgICAgaW50IGFmOwotCi0gICAgICBpZiAoc3ViamVjdF9hbHRfbmFtZS0+ZC5pUEFkZHJlc3MtPmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgIGFmID0gQUZfSU5FVDsKLSAgICAgIH0gZWxzZSBpZiAoc3ViamVjdF9hbHRfbmFtZS0+ZC5pUEFkZHJlc3MtPmxlbmd0aCA9PSAxNikgewotICAgICAgICBhZiA9IEFGX0lORVQ2OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJTQU4gSVAgQWRkcmVzcyBjb250YWluZWQgaW52YWxpZCBJUCIpOwotICAgICAgICByZXN1bHQgPSBUU0lfSU5URVJOQUxfRVJST1I7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGluZXRfbnRvcChhZiwgc3ViamVjdF9hbHRfbmFtZS0+ZC5pUEFkZHJlc3MtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b3BfYnVmLCBJTkVUNl9BRERSU1RSTEVOKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgZ2V0IElQIHN0cmluZyBmcm9tIGFzbjEgb2N0ZXQuIik7Ci0gICAgICAgIHJlc3VsdCA9IFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHlfZnJvbV9jc3RyaW5nKAotICAgICAgICAgIFRTSV9YNTA5X1NVQkpFQ1RfQUxURVJOQVRJVkVfTkFNRV9QRUVSX1BST1BFUlRZLCBuYW1lLAotICAgICAgICAgICZwZWVyLT5wcm9wZXJ0aWVzW3BlZXItPnByb3BlcnR5X2NvdW50KytdKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBlZXIncyBYNTA5IGNlcnQgYXMgYSB0c2lfcGVlciBvYmplY3QuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBwZWVyX2Zyb21feDUwOShYNTA5ICpjZXJ0LCBpbnQgaW5jbHVkZV9jZXJ0aWZpY2F0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX3BlZXIgKnBlZXIpIHsKLSAgLyogVE9ETyhqYm9ldWYpOiBNYXliZSBhZGQgbW9yZSBwcm9wZXJ0aWVzLiAqLwotICBHRU5FUkFMX05BTUVTICpzdWJqZWN0X2FsdF9uYW1lcyA9Ci0gICAgICBYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCAwLCAwKTsKLSAgaW50IHN1YmplY3RfYWx0X25hbWVfY291bnQgPSAoc3ViamVjdF9hbHRfbmFtZXMgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaW50KXNrX0dFTkVSQUxfTkFNRV9udW0oc3ViamVjdF9hbHRfbmFtZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgc2l6ZV90IHByb3BlcnR5X2NvdW50OwotICB0c2lfcmVzdWx0IHJlc3VsdDsKLSAgR1BSX0FTU0VSVChzdWJqZWN0X2FsdF9uYW1lX2NvdW50ID49IDApOwotICBwcm9wZXJ0eV9jb3VudCA9IChpbmNsdWRlX2NlcnRpZmljYXRlX3R5cGUgPyAoc2l6ZV90KTEgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgMiAvKiBjb21tb24gbmFtZSwgY2VydGlmaWNhdGUgKi8gKwotICAgICAgICAgICAgICAgICAgIChzaXplX3Qpc3ViamVjdF9hbHRfbmFtZV9jb3VudDsKLSAgcmVzdWx0ID0gdHNpX2NvbnN0cnVjdF9wZWVyKHByb3BlcnR5X2NvdW50LCBwZWVyKTsKLSAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7Ci0gIGRvIHsKLSAgICBpZiAoaW5jbHVkZV9jZXJ0aWZpY2F0ZV90eXBlKSB7Ci0gICAgICByZXN1bHQgPSB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5X2Zyb21fY3N0cmluZygKLSAgICAgICAgICBUU0lfQ0VSVElGSUNBVEVfVFlQRV9QRUVSX1BST1BFUlRZLCBUU0lfWDUwOV9DRVJUSUZJQ0FURV9UWVBFLAotICAgICAgICAgICZwZWVyLT5wcm9wZXJ0aWVzWzBdKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKLSAgICB9Ci0gICAgcmVzdWx0ID0gcGVlcl9wcm9wZXJ0eV9mcm9tX3g1MDlfY29tbW9uX25hbWUoCi0gICAgICAgIGNlcnQsICZwZWVyLT5wcm9wZXJ0aWVzW2luY2x1ZGVfY2VydGlmaWNhdGVfdHlwZSA/IDEgOiAwXSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOwotCi0gICAgcmVzdWx0ID0gYWRkX3BlbV9jZXJ0aWZpY2F0ZSgKLSAgICAgICAgY2VydCwgJnBlZXItPnByb3BlcnRpZXNbaW5jbHVkZV9jZXJ0aWZpY2F0ZV90eXBlID8gMiA6IDFdKTsKLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7Ci0KLSAgICBpZiAoc3ViamVjdF9hbHRfbmFtZV9jb3VudCAhPSAwKSB7Ci0gICAgICByZXN1bHQgPSBhZGRfc3ViamVjdF9hbHRfbmFtZXNfcHJvcGVydGllc190b19wZWVyKAotICAgICAgICAgIHBlZXIsIHN1YmplY3RfYWx0X25hbWVzLCAoc2l6ZV90KXN1YmplY3RfYWx0X25hbWVfY291bnQpOwotICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoMCk7Ci0KLSAgaWYgKHN1YmplY3RfYWx0X25hbWVzICE9IE5VTEwpIHsKLSAgICBza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoc3ViamVjdF9hbHRfbmFtZXMsIEdFTkVSQUxfTkFNRV9mcmVlKTsKLSAgfQotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgdHNpX3BlZXJfZGVzdHJ1Y3QocGVlcik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIExvZ3MgdGhlIFNTTCBlcnJvciBzdGFjay4gKi8KLXN0YXRpYyB2b2lkIGxvZ19zc2xfZXJyb3Jfc3RhY2sodm9pZCkgewotICB1bnNpZ25lZCBsb25nIGVycjsKLSAgd2hpbGUgKChlcnIgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKLSAgICBjaGFyIGRldGFpbHNbMjU2XTsKLSAgICBFUlJfZXJyb3Jfc3RyaW5nX24oKHVpbnQzMl90KWVyciwgZGV0YWlscywgc2l6ZW9mKGRldGFpbHMpKTsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIiVzIiwgZGV0YWlscyk7Ci0gIH0KLX0KLQotLyogUGVyZm9ybXMgYW4gU1NMX3JlYWQgYW5kIGhhbmRsZSBlcnJvcnMuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBkb19zc2xfcmVhZChTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqdW5wcm90ZWN0ZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKLSAgaW50IHJlYWRfZnJvbV9zc2w7Ci0gIEdQUl9BU1NFUlQoKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgPD0gSU5UX01BWCk7Ci0gIHJlYWRfZnJvbV9zc2wgPQotICAgICAgU1NMX3JlYWQoc3NsLCB1bnByb3RlY3RlZF9ieXRlcywgKGludCkqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7Ci0gIGlmIChyZWFkX2Zyb21fc3NsID09IDApIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNTTF9yZWFkIHJldHVybmVkIDAgdW5leHBlY3RlZGx5LiIpOwotICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gIH0KLSAgaWYgKHJlYWRfZnJvbV9zc2wgPCAwKSB7Ci0gICAgcmVhZF9mcm9tX3NzbCA9IFNTTF9nZXRfZXJyb3Ioc3NsLCByZWFkX2Zyb21fc3NsKTsKLSAgICBzd2l0Y2ggKHJlYWRfZnJvbV9zc2wpIHsKLSAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKLSAgICAgICAgLyogV2UgbmVlZCBtb3JlIGRhdGEgdG8gZmluaXNoIHRoZSBmcmFtZS4gKi8KLSAgICAgICAgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgPSAwOwotICAgICAgICByZXR1cm4gVFNJX09LOwotICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKLSAgICAgICAgZ3ByX2xvZygKLSAgICAgICAgICAgIEdQUl9FUlJPUiwKLSAgICAgICAgICAgICJQZWVyIHRyaWVkIHRvIHJlbmVnb3RpYXRlIFNTTCBjb25uZWN0aW9uLiBUaGlzIGlzIHVuc3VwcG9ydGVkLiIpOwotICAgICAgICByZXR1cm4gVFNJX1VOSU1QTEVNRU5URUQ7Ci0gICAgICBjYXNlIFNTTF9FUlJPUl9TU0w6Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ29ycnVwdGlvbiBkZXRlY3RlZC4iKTsKLSAgICAgICAgbG9nX3NzbF9lcnJvcl9zdGFjaygpOwotICAgICAgICByZXR1cm4gVFNJX0RBVEFfQ09SUlVQVEVEOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJTU0xfcmVhZCBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAotICAgICAgICAgICAgICAgIHNzbF9lcnJvcl9zdHJpbmcocmVhZF9mcm9tX3NzbCkpOwotICAgICAgICByZXR1cm4gVFNJX1BST1RPQ09MX0ZBSUxVUkU7Ci0gICAgfQotICB9Ci0gICp1bnByb3RlY3RlZF9ieXRlc19zaXplID0gKHNpemVfdClyZWFkX2Zyb21fc3NsOwotICByZXR1cm4gVFNJX09LOwotfQotCi0vKiBQZXJmb3JtcyBhbiBTU0xfd3JpdGUgYW5kIGhhbmRsZSBlcnJvcnMuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBkb19zc2xfd3JpdGUoU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnByb3RlY3RlZF9ieXRlc19zaXplKSB7Ci0gIGludCBzc2xfd3JpdGVfcmVzdWx0OwotICBHUFJfQVNTRVJUKHVucHJvdGVjdGVkX2J5dGVzX3NpemUgPD0gSU5UX01BWCk7Ci0gIHNzbF93cml0ZV9yZXN1bHQgPQotICAgICAgU1NMX3dyaXRlKHNzbCwgdW5wcm90ZWN0ZWRfYnl0ZXMsIChpbnQpdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7Ci0gIGlmIChzc2xfd3JpdGVfcmVzdWx0IDwgMCkgewotICAgIHNzbF93cml0ZV9yZXN1bHQgPSBTU0xfZ2V0X2Vycm9yKHNzbCwgc3NsX3dyaXRlX3Jlc3VsdCk7Ci0gICAgaWYgKHNzbF93cml0ZV9yZXN1bHQgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsCi0gICAgICAgICAgICAgICJQZWVyIHRyaWVkIHRvIHJlbmVnb3RpYXRlIFNTTCBjb25uZWN0aW9uLiBUaGlzIGlzIHVuc3VwcG9ydGVkLiIpOwotICAgICAgcmV0dXJuIFRTSV9VTklNUExFTUVOVEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNTTF93cml0ZSBmYWlsZWQgd2l0aCBlcnJvciAlcy4iLAotICAgICAgICAgICAgICBzc2xfZXJyb3Jfc3RyaW5nKHNzbF93cml0ZV9yZXN1bHQpKTsKLSAgICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gICAgfQotICB9Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLS8qIExvYWRzIGFuIGluLW1lbW9yeSBQRU0gY2VydGlmaWNhdGUgY2hhaW4gaW50byB0aGUgU1NMIGNvbnRleHQuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBzc2xfY3R4X3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbigKLSAgICBTU0xfQ1RYICpjb250ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fY2VydF9jaGFpbiwKLSAgICBzaXplX3QgcGVtX2NlcnRfY2hhaW5fc2l6ZSkgewotICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKLSAgWDUwOSAqY2VydGlmaWNhdGUgPSBOVUxMOwotICBCSU8gKnBlbTsKLSAgR1BSX0FTU0VSVChwZW1fY2VydF9jaGFpbl9zaXplIDw9IElOVF9NQVgpOwotICBwZW0gPSBCSU9fbmV3X21lbV9idWYoKHZvaWQgKilwZW1fY2VydF9jaGFpbiwgKGludClwZW1fY2VydF9jaGFpbl9zaXplKTsKLSAgaWYgKHBlbSA9PSBOVUxMKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0KLSAgZG8gewotICAgIGNlcnRpZmljYXRlID0gUEVNX3JlYWRfYmlvX1g1MDlfQVVYKHBlbSwgTlVMTCwgTlVMTCwgIiIpOwotICAgIGlmIChjZXJ0aWZpY2F0ZSA9PSBOVUxMKSB7Ci0gICAgICByZXN1bHQgPSBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGNvbnRleHQsIGNlcnRpZmljYXRlKSkgewotICAgICAgcmVzdWx0ID0gVFNJX0lOVkFMSURfQVJHVU1FTlQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIFg1MDkgKmNlcnRpZmljYXRlX2F1dGhvcml0eSA9IFBFTV9yZWFkX2Jpb19YNTA5KHBlbSwgTlVMTCwgTlVMTCwgIiIpOwotICAgICAgaWYgKGNlcnRpZmljYXRlX2F1dGhvcml0eSA9PSBOVUxMKSB7Ci0gICAgICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICAgICAgICBicmVhazsgLyogRG9uZSByZWFkaW5nLiAqLwotICAgICAgfQotICAgICAgaWYgKCFTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KGNvbnRleHQsIGNlcnRpZmljYXRlX2F1dGhvcml0eSkpIHsKLSAgICAgICAgWDUwOV9mcmVlKGNlcnRpZmljYXRlX2F1dGhvcml0eSk7Ci0gICAgICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gZnJlZSBjZXJ0aWZpY2F0ZV9hdXRob3JpdHkgYXMgaXRzIG93bmVyc2hpcCBoYXMgYmVlbgotICAgICAgICAgdHJhbnNmZXJlZCB0byB0aGUgY29udGV4dC4gVGhhdCBpcyBub3QgdGhlIGNhc2UgZm9yIGNlcnRpZmljYXRlIHRob3VnaC4KLSAgICAgICAqLwotICAgIH0KLSAgfSB3aGlsZSAoMCk7Ci0KLSAgaWYgKGNlcnRpZmljYXRlICE9IE5VTEwpIFg1MDlfZnJlZShjZXJ0aWZpY2F0ZSk7Ci0gIEJJT19mcmVlKHBlbSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIExvYWRzIGFuIGluLW1lbW9yeSBQRU0gcHJpdmF0ZSBrZXkgaW50byB0aGUgU1NMIGNvbnRleHQuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBzc2xfY3R4X3VzZV9wcml2YXRlX2tleShTU0xfQ1RYICpjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW1fa2V5X3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIEVWUF9QS0VZICpwcml2YXRlX2tleSA9IE5VTEw7Ci0gIEJJTyAqcGVtOwotICBHUFJfQVNTRVJUKHBlbV9rZXlfc2l6ZSA8PSBJTlRfTUFYKTsKLSAgcGVtID0gQklPX25ld19tZW1fYnVmKCh2b2lkICopcGVtX2tleSwgKGludClwZW1fa2V5X3NpemUpOwotICBpZiAocGVtID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgZG8gewotICAgIHByaXZhdGVfa2V5ID0gUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkocGVtLCBOVUxMLCBOVUxMLCAiIik7Ci0gICAgaWYgKHByaXZhdGVfa2V5ID09IE5VTEwpIHsKLSAgICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleShjb250ZXh0LCBwcml2YXRlX2tleSkpIHsKLSAgICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlICgwKTsKLSAgaWYgKHByaXZhdGVfa2V5ICE9IE5VTEwpIEVWUF9QS0VZX2ZyZWUocHJpdmF0ZV9rZXkpOwotICBCSU9fZnJlZShwZW0pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBMb2FkcyBpbi1tZW1vcnkgUEVNIHZlcmlmaWNhdGlvbiBjZXJ0cyBpbnRvIHRoZSBTU0wgY29udGV4dCBhbmQgb3B0aW9uYWxseQotICAgcmV0dXJucyB0aGUgdmVyaWZpY2F0aW9uIGNlcnQgbmFtZXMgKHJvb3RfbmFtZXMgY2FuIGJlIE5VTEwpLiAqLwotc3RhdGljIHRzaV9yZXN1bHQgc3NsX2N0eF9sb2FkX3ZlcmlmaWNhdGlvbl9jZXJ0cygKLSAgICBTU0xfQ1RYICpjb250ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fcm9vdHMsIHNpemVfdCBwZW1fcm9vdHNfc2l6ZSwKLSAgICBTVEFDS19PRihYNTA5X05BTUUpICogKnJvb3RfbmFtZXMpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHNpemVfdCBudW1fcm9vdHMgPSAwOwotICBYNTA5ICpyb290ID0gTlVMTDsKLSAgWDUwOV9OQU1FICpyb290X25hbWUgPSBOVUxMOwotICBCSU8gKnBlbTsKLSAgWDUwOV9TVE9SRSAqcm9vdF9zdG9yZTsKLSAgR1BSX0FTU0VSVChwZW1fcm9vdHNfc2l6ZSA8PSBJTlRfTUFYKTsKLSAgcGVtID0gQklPX25ld19tZW1fYnVmKCh2b2lkICopcGVtX3Jvb3RzLCAoaW50KXBlbV9yb290c19zaXplKTsKLSAgcm9vdF9zdG9yZSA9IFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoY29udGV4dCk7Ci0gIGlmIChyb290X3N0b3JlID09IE5VTEwpIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgaWYgKHBlbSA9PSBOVUxMKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gIGlmIChyb290X25hbWVzICE9IE5VTEwpIHsKLSAgICAqcm9vdF9uYW1lcyA9IHNrX1g1MDlfTkFNRV9uZXdfbnVsbCgpOwotICAgIGlmICgqcm9vdF9uYW1lcyA9PSBOVUxMKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gIH0KLQotICB3aGlsZSAoMSkgewotICAgIHJvb3QgPSBQRU1fcmVhZF9iaW9fWDUwOV9BVVgocGVtLCBOVUxMLCBOVUxMLCAiIik7Ci0gICAgaWYgKHJvb3QgPT0gTlVMTCkgewotICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7Ci0gICAgICBicmVhazsgLyogV2UncmUgYXQgdGhlIGVuZCBvZiBzdHJlYW0uICovCi0gICAgfQotICAgIGlmIChyb290X25hbWVzICE9IE5VTEwpIHsKLSAgICAgIHJvb3RfbmFtZSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShyb290KTsKLSAgICAgIGlmIChyb290X25hbWUgPT0gTlVMTCkgewotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgbmFtZSBmcm9tIHJvb3QgY2VydGlmaWNhdGUuIik7Ci0gICAgICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJvb3RfbmFtZSA9IFg1MDlfTkFNRV9kdXAocm9vdF9uYW1lKTsKLSAgICAgIGlmIChyb290X25hbWUgPT0gTlVMTCkgewotICAgICAgICByZXN1bHQgPSBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBza19YNTA5X05BTUVfcHVzaCgqcm9vdF9uYW1lcywgcm9vdF9uYW1lKTsKLSAgICAgIHJvb3RfbmFtZSA9IE5VTEw7Ci0gICAgfQotICAgIGlmICghWDUwOV9TVE9SRV9hZGRfY2VydChyb290X3N0b3JlLCByb290KSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgYWRkIHJvb3QgY2VydGlmaWNhdGUgdG8gc3NsIGNvbnRleHQuIik7Ci0gICAgICByZXN1bHQgPSBUU0lfSU5URVJOQUxfRVJST1I7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgWDUwOV9mcmVlKHJvb3QpOwotICAgIG51bV9yb290cysrOwotICB9Ci0KLSAgaWYgKG51bV9yb290cyA9PSAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3QgbG9hZCBhbnkgcm9vdCBjZXJ0aWZpY2F0ZS4iKTsKLSAgICByZXN1bHQgPSBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotCi0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgaWYgKHJvb3QgIT0gTlVMTCkgWDUwOV9mcmVlKHJvb3QpOwotICAgIGlmIChyb290X25hbWVzICE9IE5VTEwpIHsKLSAgICAgIHNrX1g1MDlfTkFNRV9wb3BfZnJlZSgqcm9vdF9uYW1lcywgWDUwOV9OQU1FX2ZyZWUpOwotICAgICAgKnJvb3RfbmFtZXMgPSBOVUxMOwotICAgICAgaWYgKHJvb3RfbmFtZSAhPSBOVUxMKSBYNTA5X05BTUVfZnJlZShyb290X25hbWUpOwotICAgIH0KLSAgfQotICBCSU9fZnJlZShwZW0pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBQb3B1bGF0ZXMgdGhlIFNTTCBjb250ZXh0IHdpdGggYSBwcml2YXRlIGtleSBhbmQgYSBjZXJ0IGNoYWluLCBhbmQgc2V0cyB0aGUKLSAgIGNpcGhlciBsaXN0IGFuZCB0aGUgZXBoZW1lcmFsIEVDREgga2V5LiAqLwotc3RhdGljIHRzaV9yZXN1bHQgcG9wdWxhdGVfc3NsX2NvbnRleHQoCi0gICAgU1NMX0NUWCAqY29udGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX3ByaXZhdGVfa2V5LAotICAgIHNpemVfdCBwZW1fcHJpdmF0ZV9rZXlfc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcGVtX2NlcnRpZmljYXRlX2NoYWluLAotICAgIHNpemVfdCBwZW1fY2VydGlmaWNhdGVfY2hhaW5fc2l6ZSwgY29uc3QgY2hhciAqY2lwaGVyX2xpc3QpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIGlmIChwZW1fY2VydGlmaWNhdGVfY2hhaW4gIT0gTlVMTCkgewotICAgIHJlc3VsdCA9IHNzbF9jdHhfdXNlX2NlcnRpZmljYXRlX2NoYWluKGNvbnRleHQsIHBlbV9jZXJ0aWZpY2F0ZV9jaGFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fY2VydGlmaWNhdGVfY2hhaW5fc2l6ZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBjZXJ0IGNoYWluIGZpbGUuIik7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotICBpZiAocGVtX3ByaXZhdGVfa2V5ICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPQotICAgICAgICBzc2xfY3R4X3VzZV9wcml2YXRlX2tleShjb250ZXh0LCBwZW1fcHJpdmF0ZV9rZXksIHBlbV9wcml2YXRlX2tleV9zaXplKTsKLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSyB8fCAhU1NMX0NUWF9jaGVja19wcml2YXRlX2tleShjb250ZXh0KSkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHByaXZhdGUga2V5LiIpOwotICAgICAgcmV0dXJuIHJlc3VsdCAhPSBUU0lfT0sgPyByZXN1bHQgOiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgICB9Ci0gIH0KLSAgaWYgKChjaXBoZXJfbGlzdCAhPSBOVUxMKSAmJiAhU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY29udGV4dCwgY2lwaGVyX2xpc3QpKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIGNpcGhlciBsaXN0OiAlcy4iLCBjaXBoZXJfbGlzdCk7Ci0gICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICB9Ci0gIHsKLSAgICBFQ19LRVkgKmVjZGggPSBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoTklEX1g5XzYyX3ByaW1lMjU2djEpOwotICAgIGlmICghU1NMX0NUWF9zZXRfdG1wX2VjZGgoY29udGV4dCwgZWNkaCkpIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IHNldCBlcGhlbWVyYWwgRUNESCBrZXkuIik7Ci0gICAgICBFQ19LRVlfZnJlZShlY2RoKTsKLSAgICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gICAgfQotICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29udGV4dCwgU1NMX09QX1NJTkdMRV9FQ0RIX1VTRSk7Ci0gICAgRUNfS0VZX2ZyZWUoZWNkaCk7Ci0gIH0KLSAgcmV0dXJuIFRTSV9PSzsKLX0KLQotLyogRXh0cmFjdHMgdGhlIENOIGFuZCB0aGUgU0FOcyBmcm9tIGFuIFg1MDkgY2VydCBhcyBhIHBlZXIgb2JqZWN0LiAqLwotc3RhdGljIHRzaV9yZXN1bHQgZXh0cmFjdF94NTA5X3N1YmplY3RfbmFtZXNfZnJvbV9wZW1fY2VydCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fY2VydCwgc2l6ZV90IHBlbV9jZXJ0X3NpemUsIHRzaV9wZWVyICpwZWVyKSB7Ci0gIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICBYNTA5ICpjZXJ0ID0gTlVMTDsKLSAgQklPICpwZW07Ci0gIEdQUl9BU1NFUlQocGVtX2NlcnRfc2l6ZSA8PSBJTlRfTUFYKTsKLSAgcGVtID0gQklPX25ld19tZW1fYnVmKCh2b2lkICopcGVtX2NlcnQsIChpbnQpcGVtX2NlcnRfc2l6ZSk7Ci0gIGlmIChwZW0gPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOwotCi0gIGNlcnQgPSBQRU1fcmVhZF9iaW9fWDUwOShwZW0sIE5VTEwsIE5VTEwsICIiKTsKLSAgaWYgKGNlcnQgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBjZXJ0aWZpY2F0ZSIpOwotICAgIHJlc3VsdCA9IFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA9IHBlZXJfZnJvbV94NTA5KGNlcnQsIDAsIHBlZXIpOwotICB9Ci0gIGlmIChjZXJ0ICE9IE5VTEwpIFg1MDlfZnJlZShjZXJ0KTsKLSAgQklPX2ZyZWUocGVtKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogQnVpbGRzIHRoZSBhbHBuIHByb3RvY29sIG5hbWUgbGlzdCBhY2NvcmRpbmcgdG8gcmZjIDczMDEuICovCi1zdGF0aWMgdHNpX3Jlc3VsdCBidWlsZF9hbHBuX3Byb3RvY29sX25hbWVfbGlzdCgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqYWxwbl9wcm90b2NvbHMsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxwbl9wcm90b2NvbHNfbGVuZ3RocywgdWludDE2X3QgbnVtX2FscG5fcHJvdG9jb2xzLAotICAgIHVuc2lnbmVkIGNoYXIgKipwcm90b2NvbF9uYW1lX2xpc3QsIHNpemVfdCAqcHJvdG9jb2xfbmFtZV9saXN0X2xlbmd0aCkgewotICB1aW50MTZfdCBpOwotICB1bnNpZ25lZCBjaGFyICpjdXJyZW50OwotICAqcHJvdG9jb2xfbmFtZV9saXN0ID0gTlVMTDsKLSAgKnByb3RvY29sX25hbWVfbGlzdF9sZW5ndGggPSAwOwotICBpZiAobnVtX2FscG5fcHJvdG9jb2xzID09IDApIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9hbHBuX3Byb3RvY29sczsgaSsrKSB7Ci0gICAgaWYgKGFscG5fcHJvdG9jb2xzX2xlbmd0aHNbaV0gPT0gMCkgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIDAtbGVuZ3RoIHByb3RvY29sIG5hbWUuIik7Ci0gICAgICByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7Ci0gICAgfQotICAgICpwcm90b2NvbF9uYW1lX2xpc3RfbGVuZ3RoICs9IChzaXplX3QpYWxwbl9wcm90b2NvbHNfbGVuZ3Roc1tpXSArIDE7Ci0gIH0KLSAgKnByb3RvY29sX25hbWVfbGlzdCA9IG1hbGxvYygqcHJvdG9jb2xfbmFtZV9saXN0X2xlbmd0aCk7Ci0gIGlmICgqcHJvdG9jb2xfbmFtZV9saXN0ID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgY3VycmVudCA9ICpwcm90b2NvbF9uYW1lX2xpc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fYWxwbl9wcm90b2NvbHM7IGkrKykgewotICAgICooY3VycmVudCsrKSA9IGFscG5fcHJvdG9jb2xzX2xlbmd0aHNbaV07Ci0gICAgbWVtY3B5KGN1cnJlbnQsIGFscG5fcHJvdG9jb2xzW2ldLCBhbHBuX3Byb3RvY29sc19sZW5ndGhzW2ldKTsKLSAgICBjdXJyZW50ICs9IGFscG5fcHJvdG9jb2xzX2xlbmd0aHNbaV07Ci0gIH0KLSAgLyogU2FmZXR5IGNoZWNrLiAqLwotICBpZiAoKGN1cnJlbnQgPCAqcHJvdG9jb2xfbmFtZV9saXN0KSB8fAotICAgICAgKCh1aW50cHRyX3QpKGN1cnJlbnQgLSAqcHJvdG9jb2xfbmFtZV9saXN0KSAhPQotICAgICAgICpwcm90b2NvbF9uYW1lX2xpc3RfbGVuZ3RoKSkgewotICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gIH0KLSAgcmV0dXJuIFRTSV9PSzsKLX0KLQotLyogLS0tIHRzaV9mcmFtZV9wcm90ZWN0b3IgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbi4gLS0tKi8KLQotc3RhdGljIHRzaV9yZXN1bHQgc3NsX3Byb3RlY3Rvcl9wcm90ZWN0KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdW5wcm90ZWN0ZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp1bnByb3RlY3RlZF9ieXRlc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSkgewotICB0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvciAqaW1wbCA9ICh0c2lfc3NsX2ZyYW1lX3Byb3RlY3RvciAqKXNlbGY7Ci0gIGludCByZWFkX2Zyb21fc3NsOwotICBzaXplX3QgYXZhaWxhYmxlOwotICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKLQotICAvKiBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBzb21lIHBlbmRpbmcgZGF0YSBpbiB0aGUgU1NMIEJJTy4gKi8KLSAgaW50IHBlbmRpbmdfaW5fc3NsID0gKGludClCSU9fcGVuZGluZyhpbXBsLT5mcm9tX3NzbCk7Ci0gIGlmIChwZW5kaW5nX2luX3NzbCA+IDApIHsKLSAgICAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9IDA7Ci0gICAgR1BSX0FTU0VSVCgqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSA8PSBJTlRfTUFYKTsKLSAgICByZWFkX2Zyb21fc3NsID0gQklPX3JlYWQoaW1wbC0+ZnJvbV9zc2wsIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKTsKLSAgICBpZiAocmVhZF9mcm9tX3NzbCA8IDApIHsKLSAgICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgICAiQ291bGQgbm90IHJlYWQgZnJvbSBCSU8gZXZlbiB0aG91Z2ggc29tZSBkYXRhIGlzIHBlbmRpbmciKTsKLSAgICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gICAgfQotICAgICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplID0gKHNpemVfdClyZWFkX2Zyb21fc3NsOwotICAgIHJldHVybiBUU0lfT0s7Ci0gIH0KLQotICAvKiBOb3cgc2VlIGlmIHdlIGNhbiBzZW5kIGEgY29tcGxldGUgZnJhbWUuICovCi0gIGF2YWlsYWJsZSA9IGltcGwtPmJ1ZmZlcl9zaXplIC0gaW1wbC0+YnVmZmVyX29mZnNldDsKLSAgaWYgKGF2YWlsYWJsZSA+ICp1bnByb3RlY3RlZF9ieXRlc19zaXplKSB7Ci0gICAgLyogSWYgd2UgY2Fubm90LCBqdXN0IGNvcHkgdGhlIGRhdGEgaW4gb3VyIGludGVybmFsIGJ1ZmZlci4gKi8KLSAgICBtZW1jcHkoaW1wbC0+YnVmZmVyICsgaW1wbC0+YnVmZmVyX29mZnNldCwgdW5wcm90ZWN0ZWRfYnl0ZXMsCi0gICAgICAgICAgICp1bnByb3RlY3RlZF9ieXRlc19zaXplKTsKLSAgICBpbXBsLT5idWZmZXJfb2Zmc2V0ICs9ICp1bnByb3RlY3RlZF9ieXRlc19zaXplOwotICAgICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplID0gMDsKLSAgICByZXR1cm4gVFNJX09LOwotICB9Ci0KLSAgLyogSWYgd2UgY2FuLCBwcmVwYXJlIHRoZSBidWZmZXIsIHNlbmQgaXQgdG8gU1NMX3dyaXRlIGFuZCByZWFkLiAqLwotICBtZW1jcHkoaW1wbC0+YnVmZmVyICsgaW1wbC0+YnVmZmVyX29mZnNldCwgdW5wcm90ZWN0ZWRfYnl0ZXMsIGF2YWlsYWJsZSk7Ci0gIHJlc3VsdCA9IGRvX3NzbF93cml0ZShpbXBsLT5zc2wsIGltcGwtPmJ1ZmZlciwgaW1wbC0+YnVmZmVyX3NpemUpOwotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgcmV0dXJuIHJlc3VsdDsKLQotICBHUFJfQVNTRVJUKCpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplIDw9IElOVF9NQVgpOwotICByZWFkX2Zyb21fc3NsID0gQklPX3JlYWQoaW1wbC0+ZnJvbV9zc2wsIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSk7Ci0gIGlmIChyZWFkX2Zyb21fc3NsIDwgMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgZnJvbSBCSU8gYWZ0ZXIgU1NMX3dyaXRlLiIpOwotICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gIH0KLSAgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPSAoc2l6ZV90KXJlYWRfZnJvbV9zc2w7Ci0gICp1bnByb3RlY3RlZF9ieXRlc19zaXplID0gYXZhaWxhYmxlOwotICBpbXBsLT5idWZmZXJfb2Zmc2V0ID0gMDsKLSAgcmV0dXJuIFRTSV9PSzsKLX0KLQotc3RhdGljIHRzaV9yZXN1bHQgc3NsX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoKAotICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgIHNpemVfdCAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSwgc2l6ZV90ICpzdGlsbF9wZW5kaW5nX3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yICppbXBsID0gKHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yICopc2VsZjsKLSAgaW50IHJlYWRfZnJvbV9zc2wgPSAwOwotICBpbnQgcGVuZGluZzsKLQotICBpZiAoaW1wbC0+YnVmZmVyX29mZnNldCAhPSAwKSB7Ci0gICAgcmVzdWx0ID0gZG9fc3NsX3dyaXRlKGltcGwtPnNzbCwgaW1wbC0+YnVmZmVyLCBpbXBsLT5idWZmZXJfb2Zmc2V0KTsKLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgcmV0dXJuIHJlc3VsdDsKLSAgICBpbXBsLT5idWZmZXJfb2Zmc2V0ID0gMDsKLSAgfQotCi0gIHBlbmRpbmcgPSAoaW50KUJJT19wZW5kaW5nKGltcGwtPmZyb21fc3NsKTsKLSAgR1BSX0FTU0VSVChwZW5kaW5nID49IDApOwotICAqc3RpbGxfcGVuZGluZ19zaXplID0gKHNpemVfdClwZW5kaW5nOwotICBpZiAoKnN0aWxsX3BlbmRpbmdfc2l6ZSA9PSAwKSByZXR1cm4gVFNJX09LOwotCi0gIEdQUl9BU1NFUlQoKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPD0gSU5UX01BWCk7Ci0gIHJlYWRfZnJvbV9zc2wgPSBCSU9fcmVhZChpbXBsLT5mcm9tX3NzbCwgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKTsKLSAgaWYgKHJlYWRfZnJvbV9zc2wgPD0gMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgZnJvbSBCSU8gYWZ0ZXIgU1NMX3dyaXRlLiIpOwotICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gIH0KLSAgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPSAoc2l6ZV90KXJlYWRfZnJvbV9zc2w7Ci0gIHBlbmRpbmcgPSAoaW50KUJJT19wZW5kaW5nKGltcGwtPmZyb21fc3NsKTsKLSAgR1BSX0FTU0VSVChwZW5kaW5nID49IDApOwotICAqc3RpbGxfcGVuZGluZ19zaXplID0gKHNpemVfdClwZW5kaW5nOwotICByZXR1cm4gVFNJX09LOwotfQotCi1zdGF0aWMgdHNpX3Jlc3VsdCBzc2xfcHJvdGVjdG9yX3VucHJvdGVjdCgKLSAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzLAotICAgIHNpemVfdCAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplLCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKLSAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIGludCB3cml0dGVuX2ludG9fc3NsID0gMDsKLSAgc2l6ZV90IG91dHB1dF9ieXRlc19zaXplID0gKnVucHJvdGVjdGVkX2J5dGVzX3NpemU7Ci0gIHNpemVfdCBvdXRwdXRfYnl0ZXNfb2Zmc2V0ID0gMDsKLSAgdHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKmltcGwgPSAodHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOwotCi0gIC8qIEZpcnN0LCB0cnkgdG8gcmVhZCByZW1haW5pbmcgZGF0YSBmcm9tIHNzbC4gKi8KLSAgcmVzdWx0ID0gZG9fc3NsX3JlYWQoaW1wbC0+c3NsLCB1bnByb3RlY3RlZF9ieXRlcywgdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OwotICBpZiAoKnVucHJvdGVjdGVkX2J5dGVzX3NpemUgPT0gb3V0cHV0X2J5dGVzX3NpemUpIHsKLSAgICAvKiBXZSBoYXZlIHJlYWQgZXZlcnl0aGluZyB3ZSBjb3VsZCBhbmQgY2Fubm90IHByb2Nlc3MgYW55IG1vcmUgaW5wdXQuICovCi0gICAgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSA9IDA7Ci0gICAgcmV0dXJuIFRTSV9PSzsKLSAgfQotICBvdXRwdXRfYnl0ZXNfb2Zmc2V0ID0gKnVucHJvdGVjdGVkX2J5dGVzX3NpemU7Ci0gIHVucHJvdGVjdGVkX2J5dGVzICs9IG91dHB1dF9ieXRlc19vZmZzZXQ7Ci0gICp1bnByb3RlY3RlZF9ieXRlc19zaXplID0gb3V0cHV0X2J5dGVzX3NpemUgLSBvdXRwdXRfYnl0ZXNfb2Zmc2V0OwotCi0gIC8qIFRoZW4sIHRyeSB0byB3cml0ZSBzb21lIGRhdGEgdG8gc3NsLiAqLwotICBHUFJfQVNTRVJUKCpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUgPD0gSU5UX01BWCk7Ci0gIHdyaXR0ZW5faW50b19zc2wgPSBCSU9fd3JpdGUoaW1wbC0+aW50b19zc2wsIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplKTsKLSAgaWYgKHdyaXR0ZW5faW50b19zc2wgPCAwKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJTZW5kaW5nIHByb3RlY3RlZCBmcmFtZSB0byBzc2wgZmFpbGVkIHdpdGggJWQiLAotICAgICAgICAgICAgd3JpdHRlbl9pbnRvX3NzbCk7Ci0gICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgfQotICAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplID0gKHNpemVfdCl3cml0dGVuX2ludG9fc3NsOwotCi0gIC8qIE5vdyB0cnkgdG8gcmVhZCBzb21lIGRhdGEgYWdhaW4uICovCi0gIHJlc3VsdCA9IGRvX3NzbF9yZWFkKGltcGwtPnNzbCwgdW5wcm90ZWN0ZWRfYnl0ZXMsIHVucHJvdGVjdGVkX2J5dGVzX3NpemUpOwotICBpZiAocmVzdWx0ID09IFRTSV9PSykgewotICAgIC8qIERvbid0IGZvcmdldCB0byBvdXRwdXQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAqLwotICAgICp1bnByb3RlY3RlZF9ieXRlc19zaXplICs9IG91dHB1dF9ieXRlc19vZmZzZXQ7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgc3NsX3Byb3RlY3Rvcl9kZXN0cm95KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYpIHsKLSAgdHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKmltcGwgPSAodHNpX3NzbF9mcmFtZV9wcm90ZWN0b3IgKilzZWxmOwotICBpZiAoaW1wbC0+YnVmZmVyICE9IE5VTEwpIGZyZWUoaW1wbC0+YnVmZmVyKTsKLSAgaWYgKGltcGwtPnNzbCAhPSBOVUxMKSBTU0xfZnJlZShpbXBsLT5zc2wpOwotICBmcmVlKHNlbGYpOwotfQotCi1zdGF0aWMgY29uc3QgdHNpX2ZyYW1lX3Byb3RlY3Rvcl92dGFibGUgZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZSA9IHsKLSAgICBzc2xfcHJvdGVjdG9yX3Byb3RlY3QsIHNzbF9wcm90ZWN0b3JfcHJvdGVjdF9mbHVzaCwgc3NsX3Byb3RlY3Rvcl91bnByb3RlY3QsCi0gICAgc3NsX3Byb3RlY3Rvcl9kZXN0cm95LAotfTsKLQotLyogLS0tIHRzaV9oYW5kc2hha2VyIG1ldGhvZHMgaW1wbGVtZW50YXRpb24uIC0tLSovCi0KLXN0YXRpYyB0c2lfcmVzdWx0IHNzbF9oYW5kc2hha2VyX2dldF9ieXRlc190b19zZW5kX3RvX3BlZXIodHNpX2hhbmRzaGFrZXIgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpIHsKLSAgdHNpX3NzbF9oYW5kc2hha2VyICppbXBsID0gKHRzaV9zc2xfaGFuZHNoYWtlciAqKXNlbGY7Ci0gIGludCBieXRlc19yZWFkX2Zyb21fc3NsID0gMDsKLSAgaWYgKGJ5dGVzID09IE5VTEwgfHwgYnl0ZXNfc2l6ZSA9PSBOVUxMIHx8ICpieXRlc19zaXplID09IDAgfHwKLSAgICAgICpieXRlc19zaXplID4gSU5UX01BWCkgewotICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotICBHUFJfQVNTRVJUKCpieXRlc19zaXplIDw9IElOVF9NQVgpOwotICBieXRlc19yZWFkX2Zyb21fc3NsID0gQklPX3JlYWQoaW1wbC0+ZnJvbV9zc2wsIGJ5dGVzLCAoaW50KSpieXRlc19zaXplKTsKLSAgaWYgKGJ5dGVzX3JlYWRfZnJvbV9zc2wgPCAwKSB7Ci0gICAgKmJ5dGVzX3NpemUgPSAwOwotICAgIGlmICghQklPX3Nob3VsZF9yZXRyeShpbXBsLT5mcm9tX3NzbCkpIHsKLSAgICAgIGltcGwtPnJlc3VsdCA9IFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgICAgIHJldHVybiBpbXBsLT5yZXN1bHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBUU0lfT0s7Ci0gICAgfQotICB9Ci0gICpieXRlc19zaXplID0gKHNpemVfdClieXRlc19yZWFkX2Zyb21fc3NsOwotICByZXR1cm4gQklPX3BlbmRpbmcoaW1wbC0+ZnJvbV9zc2wpID09IDAgPyBUU0lfT0sgOiBUU0lfSU5DT01QTEVURV9EQVRBOwotfQotCi1zdGF0aWMgdHNpX3Jlc3VsdCBzc2xfaGFuZHNoYWtlcl9nZXRfcmVzdWx0KHRzaV9oYW5kc2hha2VyICpzZWxmKSB7Ci0gIHRzaV9zc2xfaGFuZHNoYWtlciAqaW1wbCA9ICh0c2lfc3NsX2hhbmRzaGFrZXIgKilzZWxmOwotICBpZiAoKGltcGwtPnJlc3VsdCA9PSBUU0lfSEFORFNIQUtFX0lOX1BST0dSRVNTKSAmJgotICAgICAgU1NMX2lzX2luaXRfZmluaXNoZWQoaW1wbC0+c3NsKSkgewotICAgIGltcGwtPnJlc3VsdCA9IFRTSV9PSzsKLSAgfQotICByZXR1cm4gaW1wbC0+cmVzdWx0OwotfQotCi1zdGF0aWMgdHNpX3Jlc3VsdCBzc2xfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlcigKLSAgICB0c2lfaGFuZHNoYWtlciAqc2VsZiwgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIHNpemVfdCAqYnl0ZXNfc2l6ZSkgewotICB0c2lfc3NsX2hhbmRzaGFrZXIgKmltcGwgPSAodHNpX3NzbF9oYW5kc2hha2VyICopc2VsZjsKLSAgaW50IGJ5dGVzX3dyaXR0ZW5faW50b19zc2xfc2l6ZSA9IDA7Ci0gIGlmIChieXRlcyA9PSBOVUxMIHx8IGJ5dGVzX3NpemUgPT0gMCB8fCAqYnl0ZXNfc2l6ZSA+IElOVF9NQVgpIHsKLSAgICByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7Ci0gIH0KLSAgR1BSX0FTU0VSVCgqYnl0ZXNfc2l6ZSA8PSBJTlRfTUFYKTsKLSAgYnl0ZXNfd3JpdHRlbl9pbnRvX3NzbF9zaXplID0KLSAgICAgIEJJT193cml0ZShpbXBsLT5pbnRvX3NzbCwgYnl0ZXMsIChpbnQpKmJ5dGVzX3NpemUpOwotICBpZiAoYnl0ZXNfd3JpdHRlbl9pbnRvX3NzbF9zaXplIDwgMCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IHdyaXRlIHRvIG1lbW9yeSBCSU8uIik7Ci0gICAgaW1wbC0+cmVzdWx0ID0gVFNJX0lOVEVSTkFMX0VSUk9SOwotICAgIHJldHVybiBpbXBsLT5yZXN1bHQ7Ci0gIH0KLSAgKmJ5dGVzX3NpemUgPSAoc2l6ZV90KWJ5dGVzX3dyaXR0ZW5faW50b19zc2xfc2l6ZTsKLQotICBpZiAoIXRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKHNlbGYpKSB7Ci0gICAgaW1wbC0+cmVzdWx0ID0gVFNJX09LOwotICAgIHJldHVybiBpbXBsLT5yZXN1bHQ7Ci0gIH0gZWxzZSB7Ci0gICAgLyogR2V0IHJlYWR5IHRvIGdldCBzb21lIGJ5dGVzIGZyb20gU1NMLiAqLwotICAgIGludCBzc2xfcmVzdWx0ID0gU1NMX2RvX2hhbmRzaGFrZShpbXBsLT5zc2wpOwotICAgIHNzbF9yZXN1bHQgPSBTU0xfZ2V0X2Vycm9yKGltcGwtPnNzbCwgc3NsX3Jlc3VsdCk7Ci0gICAgc3dpdGNoIChzc2xfcmVzdWx0KSB7Ci0gICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6Ci0gICAgICAgIGlmIChCSU9fcGVuZGluZyhpbXBsLT5mcm9tX3NzbCkgPT0gMCkgewotICAgICAgICAgIC8qIFdlIG5lZWQgbW9yZSBkYXRhLiAqLwotICAgICAgICAgIHJldHVybiBUU0lfSU5DT01QTEVURV9EQVRBOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBUU0lfT0s7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgU1NMX0VSUk9SX05PTkU6Ci0gICAgICAgIHJldHVybiBUU0lfT0s7Ci0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGNoYXIgZXJyX3N0clsyNTZdOwotICAgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCBlcnJfc3RyLCBzaXplb2YoZXJyX3N0cikpOwotICAgICAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkhhbmRzaGFrZSBmYWlsZWQgd2l0aCBmYXRhbCBlcnJvciAlczogJXMuIiwKLSAgICAgICAgICAgICAgICBzc2xfZXJyb3Jfc3RyaW5nKHNzbF9yZXN1bHQpLCBlcnJfc3RyKTsKLSAgICAgICAgaW1wbC0+cmVzdWx0ID0gVFNJX1BST1RPQ09MX0ZBSUxVUkU7Ci0gICAgICAgIHJldHVybiBpbXBsLT5yZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB0c2lfcmVzdWx0IHNzbF9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfcGVlciAqcGVlcikgewotICB0c2lfcmVzdWx0IHJlc3VsdCA9IFRTSV9PSzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxwbl9zZWxlY3RlZCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBhbHBuX3NlbGVjdGVkX2xlbjsKLSAgdHNpX3NzbF9oYW5kc2hha2VyICppbXBsID0gKHRzaV9zc2xfaGFuZHNoYWtlciAqKXNlbGY7Ci0gIFg1MDkgKnBlZXJfY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShpbXBsLT5zc2wpOwotICBpZiAocGVlcl9jZXJ0ICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPSBwZWVyX2Zyb21feDUwOShwZWVyX2NlcnQsIDEsIHBlZXIpOwotICAgIFg1MDlfZnJlZShwZWVyX2NlcnQpOwotICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OwotICB9Ci0jaWYgVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUCi0gIFNTTF9nZXQwX2FscG5fc2VsZWN0ZWQoaW1wbC0+c3NsLCAmYWxwbl9zZWxlY3RlZCwgJmFscG5fc2VsZWN0ZWRfbGVuKTsKLSNlbmRpZiAvKiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQgKi8KLSAgaWYgKGFscG5fc2VsZWN0ZWQgPT0gTlVMTCkgewotICAgIC8qIFRyeSBucG4uICovCi0gICAgU1NMX2dldDBfbmV4dF9wcm90b19uZWdvdGlhdGVkKGltcGwtPnNzbCwgJmFscG5fc2VsZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBuX3NlbGVjdGVkX2xlbik7Ci0gIH0KLSAgaWYgKGFscG5fc2VsZWN0ZWQgIT0gTlVMTCkgewotICAgIHNpemVfdCBpOwotICAgIHRzaV9wZWVyX3Byb3BlcnR5ICpuZXdfcHJvcGVydGllcyA9Ci0gICAgICAgIGNhbGxvYygxLCBzaXplb2YodHNpX3BlZXJfcHJvcGVydHkpICogKHBlZXItPnByb3BlcnR5X2NvdW50ICsgMSkpOwotICAgIGlmIChuZXdfcHJvcGVydGllcyA9PSBOVUxMKSByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBlZXItPnByb3BlcnR5X2NvdW50OyBpKyspIHsKLSAgICAgIG5ld19wcm9wZXJ0aWVzW2ldID0gcGVlci0+cHJvcGVydGllc1tpXTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gdHNpX2NvbnN0cnVjdF9zdHJpbmdfcGVlcl9wcm9wZXJ0eSgKLSAgICAgICAgVFNJX1NTTF9BTFBOX1NFTEVDVEVEX1BST1RPQ09MLCAoY29uc3QgY2hhciAqKWFscG5fc2VsZWN0ZWQsCi0gICAgICAgIGFscG5fc2VsZWN0ZWRfbGVuLCAmbmV3X3Byb3BlcnRpZXNbcGVlci0+cHJvcGVydHlfY291bnRdKTsKLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgICAgZnJlZShuZXdfcHJvcGVydGllcyk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBpZiAocGVlci0+cHJvcGVydGllcyAhPSBOVUxMKSBmcmVlKHBlZXItPnByb3BlcnRpZXMpOwotICAgIHBlZXItPnByb3BlcnR5X2NvdW50Kys7Ci0gICAgcGVlci0+cHJvcGVydGllcyA9IG5ld19wcm9wZXJ0aWVzOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB0c2lfcmVzdWx0IHNzbF9oYW5kc2hha2VyX2NyZWF0ZV9mcmFtZV9wcm90ZWN0b3IoCi0gICAgdHNpX2hhbmRzaGFrZXIgKnNlbGYsIHNpemVfdCAqbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSwKLSAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICoqcHJvdGVjdG9yKSB7Ci0gIHNpemVfdCBhY3R1YWxfbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSA9Ci0gICAgICBUU0lfU1NMX01BWF9QUk9URUNURURfRlJBTUVfU0laRV9VUFBFUl9CT1VORDsKLSAgdHNpX3NzbF9oYW5kc2hha2VyICppbXBsID0gKHRzaV9zc2xfaGFuZHNoYWtlciAqKXNlbGY7Ci0gIHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yICpwcm90ZWN0b3JfaW1wbCA9Ci0gICAgICBjYWxsb2MoMSwgc2l6ZW9mKHRzaV9zc2xfZnJhbWVfcHJvdGVjdG9yKSk7Ci0gIGlmIChwcm90ZWN0b3JfaW1wbCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOwotICB9Ci0KLSAgaWYgKG1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemUgIT0gTlVMTCkgewotICAgIGlmICgqbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSA+Ci0gICAgICAgIFRTSV9TU0xfTUFYX1BST1RFQ1RFRF9GUkFNRV9TSVpFX1VQUEVSX0JPVU5EKSB7Ci0gICAgICAqbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSA9Ci0gICAgICAgICAgVFNJX1NTTF9NQVhfUFJPVEVDVEVEX0ZSQU1FX1NJWkVfVVBQRVJfQk9VTkQ7Ci0gICAgfSBlbHNlIGlmICgqbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSA8Ci0gICAgICAgICAgICAgICBUU0lfU1NMX01BWF9QUk9URUNURURfRlJBTUVfU0laRV9MT1dFUl9CT1VORCkgewotICAgICAgKm1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemUgPQotICAgICAgICAgIFRTSV9TU0xfTUFYX1BST1RFQ1RFRF9GUkFNRV9TSVpFX0xPV0VSX0JPVU5EOwotICAgIH0KLSAgICBhY3R1YWxfbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSA9ICptYXhfb3V0cHV0X3Byb3RlY3RlZF9mcmFtZV9zaXplOwotICB9Ci0gIHByb3RlY3Rvcl9pbXBsLT5idWZmZXJfc2l6ZSA9Ci0gICAgICBhY3R1YWxfbWF4X291dHB1dF9wcm90ZWN0ZWRfZnJhbWVfc2l6ZSAtIFRTSV9TU0xfTUFYX1BST1RFQ1RJT05fT1ZFUkhFQUQ7Ci0gIHByb3RlY3Rvcl9pbXBsLT5idWZmZXIgPSBtYWxsb2MocHJvdGVjdG9yX2ltcGwtPmJ1ZmZlcl9zaXplKTsKLSAgaWYgKHByb3RlY3Rvcl9pbXBsLT5idWZmZXIgPT0gTlVMTCkgewotICAgIGdwcl9sb2coR1BSX0VSUk9SLAotICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZWQgYnVmZmVyIGZvciB0c2lfc3NsX2ZyYW1lX3Byb3RlY3Rvci4iKTsKLSAgICBmcmVlKHByb3RlY3Rvcl9pbXBsKTsKLSAgICByZXR1cm4gVFNJX0lOVEVSTkFMX0VSUk9SOwotICB9Ci0KLSAgLyogVHJhbnNmZXIgb3duZXJzaGlwIG9mIHNzbCB0byB0aGUgZnJhbWUgcHJvdGVjdG9yLiBJdCBpcyBPSyBhcyB0aGUgY2FsbGVyCi0gICAqIGNhbm5vdCBjYWxsIGFueXRoaW5nIGVsc2UgYnV0IGRlc3Ryb3kgb24gdGhlIGhhbmRzaGFrZXIgYWZ0ZXIgdGhpcyBjYWxsLiAqLwotICBwcm90ZWN0b3JfaW1wbC0+c3NsID0gaW1wbC0+c3NsOwotICBpbXBsLT5zc2wgPSBOVUxMOwotICBwcm90ZWN0b3JfaW1wbC0+aW50b19zc2wgPSBpbXBsLT5pbnRvX3NzbDsKLSAgcHJvdGVjdG9yX2ltcGwtPmZyb21fc3NsID0gaW1wbC0+ZnJvbV9zc2w7Ci0KLSAgcHJvdGVjdG9yX2ltcGwtPmJhc2UudnRhYmxlID0gJmZyYW1lX3Byb3RlY3Rvcl92dGFibGU7Ci0gICpwcm90ZWN0b3IgPSAmcHJvdGVjdG9yX2ltcGwtPmJhc2U7Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzbF9oYW5kc2hha2VyX2Rlc3Ryb3kodHNpX2hhbmRzaGFrZXIgKnNlbGYpIHsKLSAgdHNpX3NzbF9oYW5kc2hha2VyICppbXBsID0gKHRzaV9zc2xfaGFuZHNoYWtlciAqKXNlbGY7Ci0gIFNTTF9mcmVlKGltcGwtPnNzbCk7IC8qIFRoZSBCSU8gb2JqZWN0cyBhcmUgb3duZWQgYnkgc3NsICovCi0gIGZyZWUoaW1wbCk7Ci19Ci0KLXN0YXRpYyBjb25zdCB0c2lfaGFuZHNoYWtlcl92dGFibGUgaGFuZHNoYWtlcl92dGFibGUgPSB7Ci0gICAgc3NsX2hhbmRzaGFrZXJfZ2V0X2J5dGVzX3RvX3NlbmRfdG9fcGVlciwKLSAgICBzc2xfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlciwKLSAgICBzc2xfaGFuZHNoYWtlcl9nZXRfcmVzdWx0LAotICAgIHNzbF9oYW5kc2hha2VyX2V4dHJhY3RfcGVlciwKLSAgICBzc2xfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yLAotICAgIHNzbF9oYW5kc2hha2VyX2Rlc3Ryb3ksCi19OwotCi0vKiAtLS0gdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgY29tbW9uIG1ldGhvZHMuIC0tLSAqLwotCi10c2lfcmVzdWx0IHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2NyZWF0ZV9oYW5kc2hha2VyKAotICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpzZWxmLCBjb25zdCBjaGFyICpzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uLAotICAgIHRzaV9oYW5kc2hha2VyICoqaGFuZHNoYWtlcikgewotICBpZiAoc2VsZiA9PSBOVUxMIHx8IGhhbmRzaGFrZXIgPT0gTlVMTCkgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICByZXR1cm4gc2VsZi0+Y3JlYXRlX2hhbmRzaGFrZXIoc2VsZiwgc2VydmVyX25hbWVfaW5kaWNhdGlvbiwgaGFuZHNoYWtlcik7Ci19Ci0KLXZvaWQgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveSh0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZikgewotICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm47Ci0gIHNlbGYtPmRlc3Ryb3koc2VsZik7Ci19Ci0KLXN0YXRpYyB0c2lfcmVzdWx0IGNyZWF0ZV90c2lfc3NsX2hhbmRzaGFrZXIoU1NMX0NUWCAqY3R4LCBpbnQgaXNfY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXJ2ZXJfbmFtZV9pbmRpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfaGFuZHNoYWtlciAqKmhhbmRzaGFrZXIpIHsKLSAgU1NMICpzc2wgPSBTU0xfbmV3KGN0eCk7Ci0gIEJJTyAqaW50b19zc2wgPSBOVUxMOwotICBCSU8gKmZyb21fc3NsID0gTlVMTDsKLSAgdHNpX3NzbF9oYW5kc2hha2VyICppbXBsID0gTlVMTDsKLSAgKmhhbmRzaGFrZXIgPSBOVUxMOwotICBpZiAoY3R4ID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIlNTTCBDb250ZXh0IGlzIG51bGwuIFNob3VsZCBuZXZlciBoYXBwZW4uIik7Ci0gICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgfQotICBpZiAoc3NsID09IE5VTEwpIHsKLSAgICByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gIH0KLSAgU1NMX3NldF9pbmZvX2NhbGxiYWNrKHNzbCwgc3NsX2luZm9fY2FsbGJhY2spOwotCi0gIGludG9fc3NsID0gQklPX25ldyhCSU9fc19tZW0oKSk7Ci0gIGZyb21fc3NsID0gQklPX25ldyhCSU9fc19tZW0oKSk7Ci0gIGlmIChpbnRvX3NzbCA9PSBOVUxMIHx8IGZyb21fc3NsID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkJJT19uZXcgZmFpbGVkLiIpOwotICAgIFNTTF9mcmVlKHNzbCk7Ci0gICAgaWYgKGludG9fc3NsICE9IE5VTEwpIEJJT19mcmVlKGludG9fc3NsKTsKLSAgICBpZiAoZnJvbV9zc2wgIT0gTlVMTCkgQklPX2ZyZWUoaW50b19zc2wpOwotICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgfQotICBTU0xfc2V0X2Jpbyhzc2wsIGludG9fc3NsLCBmcm9tX3NzbCk7Ci0gIGlmIChpc19jbGllbnQpIHsKLSAgICBpbnQgc3NsX3Jlc3VsdDsKLSAgICBTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoc3NsKTsKLSAgICBpZiAoc2VydmVyX25hbWVfaW5kaWNhdGlvbiAhPSBOVUxMKSB7Ci0gICAgICBpZiAoIVNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzc2wsIHNlcnZlcl9uYW1lX2luZGljYXRpb24pKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uICVzLiIsCi0gICAgICAgICAgICAgICAgc2VydmVyX25hbWVfaW5kaWNhdGlvbik7Ci0gICAgICAgIFNTTF9mcmVlKHNzbCk7Ci0gICAgICAgIHJldHVybiBUU0lfSU5URVJOQUxfRVJST1I7Ci0gICAgICB9Ci0gICAgfQotICAgIHNzbF9yZXN1bHQgPSBTU0xfZG9faGFuZHNoYWtlKHNzbCk7Ci0gICAgc3NsX3Jlc3VsdCA9IFNTTF9nZXRfZXJyb3Ioc3NsLCBzc2xfcmVzdWx0KTsKLSAgICBpZiAoc3NsX3Jlc3VsdCAhPSBTU0xfRVJST1JfV0FOVF9SRUFEKSB7Ci0gICAgICBncHJfbG9nKEdQUl9FUlJPUiwKLSAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXJyb3IgcmVjZWl2ZWQgZnJvbSBmaXJzdCBTU0xfZG9faGFuZHNoYWtlIGNhbGw6ICVzIiwKLSAgICAgICAgICAgICAgc3NsX2Vycm9yX3N0cmluZyhzc2xfcmVzdWx0KSk7Ci0gICAgICBTU0xfZnJlZShzc2wpOwotICAgICAgcmV0dXJuIFRTSV9JTlRFUk5BTF9FUlJPUjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgU1NMX3NldF9hY2NlcHRfc3RhdGUoc3NsKTsKLSAgfQotCi0gIGltcGwgPSBjYWxsb2MoMSwgc2l6ZW9mKHRzaV9zc2xfaGFuZHNoYWtlcikpOwotICBpZiAoaW1wbCA9PSBOVUxMKSB7Ci0gICAgU1NMX2ZyZWUoc3NsKTsKLSAgICByZXR1cm4gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gIH0KLSAgaW1wbC0+c3NsID0gc3NsOwotICBpbXBsLT5pbnRvX3NzbCA9IGludG9fc3NsOwotICBpbXBsLT5mcm9tX3NzbCA9IGZyb21fc3NsOwotICBpbXBsLT5yZXN1bHQgPSBUU0lfSEFORFNIQUtFX0lOX1BST0dSRVNTOwotICBpbXBsLT5iYXNlLnZ0YWJsZSA9ICZoYW5kc2hha2VyX3Z0YWJsZTsKLSAgKmhhbmRzaGFrZXIgPSAmaW1wbC0+YmFzZTsKLSAgcmV0dXJuIFRTSV9PSzsKLX0KLQotc3RhdGljIGludCBzZWxlY3RfcHJvdG9jb2xfbGlzdChjb25zdCB1bnNpZ25lZCBjaGFyICoqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNsaWVudF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2xpZW50X2xpc3RfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXJ2ZXJfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlcnZlcl9saXN0X2xlbikgewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpjbGllbnRfY3VycmVudCA9IGNsaWVudF9saXN0OwotICB3aGlsZSAoKHVuc2lnbmVkIGludCkoY2xpZW50X2N1cnJlbnQgLSBjbGllbnRfbGlzdCkgPCBjbGllbnRfbGlzdF9sZW4pIHsKLSAgICB1bnNpZ25lZCBjaGFyIGNsaWVudF9jdXJyZW50X2xlbiA9ICooY2xpZW50X2N1cnJlbnQrKyk7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VydmVyX2N1cnJlbnQgPSBzZXJ2ZXJfbGlzdDsKLSAgICB3aGlsZSAoKHNlcnZlcl9jdXJyZW50ID49IHNlcnZlcl9saXN0KSAmJgotICAgICAgICAgICAodWludHB0cl90KShzZXJ2ZXJfY3VycmVudCAtIHNlcnZlcl9saXN0KSA8IHNlcnZlcl9saXN0X2xlbikgewotICAgICAgdW5zaWduZWQgY2hhciBzZXJ2ZXJfY3VycmVudF9sZW4gPSAqKHNlcnZlcl9jdXJyZW50KyspOwotICAgICAgaWYgKChjbGllbnRfY3VycmVudF9sZW4gPT0gc2VydmVyX2N1cnJlbnRfbGVuKSAmJgotICAgICAgICAgICFtZW1jbXAoY2xpZW50X2N1cnJlbnQsIHNlcnZlcl9jdXJyZW50LCBzZXJ2ZXJfY3VycmVudF9sZW4pKSB7Ci0gICAgICAgICpvdXQgPSBzZXJ2ZXJfY3VycmVudDsKLSAgICAgICAgKm91dGxlbiA9IHNlcnZlcl9jdXJyZW50X2xlbjsKLSAgICAgICAgcmV0dXJuIFNTTF9UTFNFWFRfRVJSX09LOwotICAgICAgfQotICAgICAgc2VydmVyX2N1cnJlbnQgKz0gc2VydmVyX2N1cnJlbnRfbGVuOwotICAgIH0KLSAgICBjbGllbnRfY3VycmVudCArPSBjbGllbnRfY3VycmVudF9sZW47Ci0gIH0KLSAgcmV0dXJuIFNTTF9UTFNFWFRfRVJSX05PQUNLOwotfQotCi0vKiAtLS0gdHNpX3NzbF9fY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSBtZXRob2RzIGltcGxlbWVudGF0aW9uLiAtLS0gKi8KLQotc3RhdGljIHRzaV9yZXN1bHQgc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXIoCi0gICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYsIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lX2luZGljYXRpb24sCi0gICAgdHNpX2hhbmRzaGFrZXIgKipoYW5kc2hha2VyKSB7Ci0gIHRzaV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSAqaW1wbCA9Ci0gICAgICAodHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5ICopc2VsZjsKLSAgcmV0dXJuIGNyZWF0ZV90c2lfc3NsX2hhbmRzaGFrZXIoaW1wbC0+c3NsX2NvbnRleHQsIDEsIHNlcnZlcl9uYW1lX2luZGljYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZXIpOwotfQotCi1zdGF0aWMgdm9pZCBzc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KAotICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICpzZWxmKSB7Ci0gIHRzaV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSAqaW1wbCA9Ci0gICAgICAodHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5ICopc2VsZjsKLSAgaWYgKGltcGwtPnNzbF9jb250ZXh0ICE9IE5VTEwpIFNTTF9DVFhfZnJlZShpbXBsLT5zc2xfY29udGV4dCk7Ci0gIGlmIChpbXBsLT5hbHBuX3Byb3RvY29sX2xpc3QgIT0gTlVMTCkgZnJlZShpbXBsLT5hbHBuX3Byb3RvY29sX2xpc3QpOwotICBmcmVlKGltcGwpOwotfQotCi1zdGF0aWMgaW50IGNsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnlfbnBuX2NhbGxiYWNrKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICoqb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykgewotICB0c2lfc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnkgKmZhY3RvcnkgPQotICAgICAgKHRzaV9zc2xfY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeSAqKWFyZzsKLSAgcmV0dXJuIHNlbGVjdF9wcm90b2NvbF9saXN0KChjb25zdCB1bnNpZ25lZCBjaGFyICoqKW91dCwgb3V0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+YWxwbl9wcm90b2NvbF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aCwgaW4sIGlubGVuKTsKLX0KLQotLyogLS0tIHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSBtZXRob2RzIGltcGxlbWVudGF0aW9uLiAtLS0gKi8KLQotc3RhdGljIHRzaV9yZXN1bHQgc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXIoCi0gICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYsIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lX2luZGljYXRpb24sCi0gICAgdHNpX2hhbmRzaGFrZXIgKipoYW5kc2hha2VyKSB7Ci0gIHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSAqaW1wbCA9Ci0gICAgICAodHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICopc2VsZjsKLSAgaWYgKGltcGwtPnNzbF9jb250ZXh0X2NvdW50ID09IDAgfHwgc2VydmVyX25hbWVfaW5kaWNhdGlvbiAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICB9Ci0gIC8qIENyZWF0ZSB0aGUgaGFuZHNoYWtlciB3aXRoIHRoZSBmaXJzdCBjb250ZXh0LiBXZSB3aWxsIHN3aXRjaCBpZiBuZWVkZWQKLSAgICAgYmVjYXVzZSBvZiBTTkkgaW4gc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3Rvcnlfc2VydmVybmFtZV9jYWxsYmFjay4gICovCi0gIHJldHVybiBjcmVhdGVfdHNpX3NzbF9oYW5kc2hha2VyKGltcGwtPnNzbF9jb250ZXh0c1swXSwgMCwgTlVMTCwgaGFuZHNoYWtlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koCi0gICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYpIHsKLSAgdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0KLSAgICAgICh0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKilzZWxmOwotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGltcGwtPnNzbF9jb250ZXh0X2NvdW50OyBpKyspIHsKLSAgICBpZiAoaW1wbC0+c3NsX2NvbnRleHRzW2ldICE9IE5VTEwpIHsKLSAgICAgIFNTTF9DVFhfZnJlZShpbXBsLT5zc2xfY29udGV4dHNbaV0pOwotICAgICAgdHNpX3BlZXJfZGVzdHJ1Y3QoJmltcGwtPnNzbF9jb250ZXh0X3g1MDlfc3ViamVjdF9uYW1lc1tpXSk7Ci0gICAgfQotICB9Ci0gIGlmIChpbXBsLT5zc2xfY29udGV4dHMgIT0gTlVMTCkgZnJlZShpbXBsLT5zc2xfY29udGV4dHMpOwotICBpZiAoaW1wbC0+c3NsX2NvbnRleHRfeDUwOV9zdWJqZWN0X25hbWVzICE9IE5VTEwpIHsKLSAgICBmcmVlKGltcGwtPnNzbF9jb250ZXh0X3g1MDlfc3ViamVjdF9uYW1lcyk7Ci0gIH0KLSAgaWYgKGltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCAhPSBOVUxMKSBmcmVlKGltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCk7Ci0gIGZyZWUoaW1wbCk7Ci19Ci0KLXN0YXRpYyBpbnQgZG9lc19lbnRyeV9tYXRjaF9uYW1lKGNvbnN0IGNoYXIgKmVudHJ5LCBzaXplX3QgZW50cnlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgewotICBjb25zdCBjaGFyICpkb3Q7Ci0gIGNvbnN0IGNoYXIgKm5hbWVfc3ViZG9tYWluID0gTlVMTDsKLSAgc2l6ZV90IG5hbWVfbGVuZ3RoID0gc3RybGVuKG5hbWUpOwotICBzaXplX3QgbmFtZV9zdWJkb21haW5fbGVuZ3RoOwotICBpZiAoZW50cnlfbGVuZ3RoID09IDApIHJldHVybiAwOwotCi0gIC8qIFRha2UgY2FyZSBvZiAnLicgdGVybWluYXRpb25zLiAqLwotICBpZiAobmFtZVtuYW1lX2xlbmd0aCAtIDFdID09ICcuJykgewotICAgIG5hbWVfbGVuZ3RoLS07Ci0gIH0KLSAgaWYgKGVudHJ5W2VudHJ5X2xlbmd0aCAtIDFdID09ICcuJykgewotICAgIGVudHJ5X2xlbmd0aC0tOwotICAgIGlmIChlbnRyeV9sZW5ndGggPT0gMCkgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoKG5hbWVfbGVuZ3RoID09IGVudHJ5X2xlbmd0aCkgJiYKLSAgICAgIHN0cm5jbXAobmFtZSwgZW50cnksIGVudHJ5X2xlbmd0aCkgPT0gMCkgewotICAgIHJldHVybiAxOyAvKiBQZXJmZWN0IG1hdGNoLiAqLwotICB9Ci0gIGlmIChlbnRyeVswXSAhPSAnKicpIHJldHVybiAwOwotCi0gIC8qIFdpbGRjaGFyIHN1YmRvbWFpbiBtYXRjaGluZy4gKi8KLSAgaWYgKGVudHJ5X2xlbmd0aCA8IDMgfHwgZW50cnlbMV0gIT0gJy4nKSB7IC8qIEF0IGxlYXN0ICoueCAqLwotICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCB3aWxkY2hhciBlbnRyeS4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBuYW1lX3N1YmRvbWFpbiA9IHN0cmNocihuYW1lLCAnLicpOwotICBpZiAobmFtZV9zdWJkb21haW4gPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIG5hbWVfc3ViZG9tYWluX2xlbmd0aCA9IHN0cmxlbihuYW1lX3N1YmRvbWFpbik7Ci0gIGlmIChuYW1lX3N1YmRvbWFpbl9sZW5ndGggPCAyKSByZXR1cm4gMDsKLSAgbmFtZV9zdWJkb21haW4rKzsgLyogU3RhcnRzIGFmdGVyIHRoZSBkb3QuICovCi0gIG5hbWVfc3ViZG9tYWluX2xlbmd0aC0tOwotICBlbnRyeSArPSAyOyAvKiBSZW1vdmUgKi4gKi8KLSAgZW50cnlfbGVuZ3RoIC09IDI7Ci0gIGRvdCA9IHN0cmNocihuYW1lX3N1YmRvbWFpbiwgJy4nKTsKLSAgaWYgKChkb3QgPT0gTlVMTCkgfHwgKGRvdCA9PSAmbmFtZV9zdWJkb21haW5bbmFtZV9zdWJkb21haW5fbGVuZ3RoIC0gMV0pKSB7Ci0gICAgZ3ByX2xvZyhHUFJfRVJST1IsICJJbnZhbGlkIHRvcGxldmVsIHN1YmRvbWFpbjogJXMiLCBuYW1lX3N1YmRvbWFpbik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG5hbWVfc3ViZG9tYWluW25hbWVfc3ViZG9tYWluX2xlbmd0aCAtIDFdID09ICcuJykgewotICAgIG5hbWVfc3ViZG9tYWluX2xlbmd0aC0tOwotICB9Ci0gIHJldHVybiAoKGVudHJ5X2xlbmd0aCA+IDApICYmIChuYW1lX3N1YmRvbWFpbl9sZW5ndGggPT0gZW50cnlfbGVuZ3RoKSAmJgotICAgICAgICAgIHN0cm5jbXAoZW50cnksIG5hbWVfc3ViZG9tYWluLCBlbnRyeV9sZW5ndGgpID09IDApOwotfQotCi1zdGF0aWMgaW50IHNzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5X3NlcnZlcm5hbWVfY2FsbGJhY2soU1NMICpzc2wsIGludCAqYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSB7Ci0gIHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSAqaW1wbCA9Ci0gICAgICAodHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICopYXJnOwotICBzaXplX3QgaSA9IDA7Ci0gIGNvbnN0IGNoYXIgKnNlcnZlcm5hbWUgPSBTU0xfZ2V0X3NlcnZlcm5hbWUoc3NsLCBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKTsKLSAgaWYgKHNlcnZlcm5hbWUgPT0gTlVMTCB8fCBzdHJsZW4oc2VydmVybmFtZSkgPT0gMCkgewotICAgIHJldHVybiBTU0xfVExTRVhUX0VSUl9OT0FDSzsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBpbXBsLT5zc2xfY29udGV4dF9jb3VudDsgaSsrKSB7Ci0gICAgaWYgKHRzaV9zc2xfcGVlcl9tYXRjaGVzX25hbWUoJmltcGwtPnNzbF9jb250ZXh0X3g1MDlfc3ViamVjdF9uYW1lc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lKSkgewotICAgICAgU1NMX3NldF9TU0xfQ1RYKHNzbCwgaW1wbC0+c3NsX2NvbnRleHRzW2ldKTsKLSAgICAgIHJldHVybiBTU0xfVExTRVhUX0VSUl9PSzsKLSAgICB9Ci0gIH0KLSAgZ3ByX2xvZyhHUFJfRVJST1IsICJObyBtYXRjaCBmb3VuZCBmb3Igc2VydmVyIG5hbWU6ICVzLiIsIHNlcnZlcm5hbWUpOwotICByZXR1cm4gU1NMX1RMU0VYVF9FUlJfQUxFUlRfV0FSTklORzsKLX0KLQotI2lmIFRTSV9PUEVOU1NMX0FMUE5fU1VQUE9SVAotc3RhdGljIGludCBzZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5X2FscG5fY2FsbGJhY2soCi0gICAgU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipvdXQsIHVuc2lnbmVkIGNoYXIgKm91dGxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlubGVuLCB2b2lkICphcmcpIHsKLSAgdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICpmYWN0b3J5ID0KLSAgICAgICh0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKilhcmc7Ci0gIHJldHVybiBzZWxlY3RfcHJvdG9jb2xfbGlzdChvdXQsIG91dGxlbiwgaW4sIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+YWxwbl9wcm90b2NvbF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aCk7Ci19Ci0jZW5kaWYgLyogVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUICovCi0KLXN0YXRpYyBpbnQgc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9ucG5fYWR2ZXJ0aXNlZF9jYWxsYmFjaygKLSAgICBTU0wgKnNzbCwgY29uc3QgdW5zaWduZWQgY2hhciAqKm91dCwgdW5zaWduZWQgaW50ICpvdXRsZW4sIHZvaWQgKmFyZykgewotICB0c2lfc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnkgKmZhY3RvcnkgPQotICAgICAgKHRzaV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSAqKWFyZzsKLSAgKm91dCA9IGZhY3RvcnktPmFscG5fcHJvdG9jb2xfbGlzdDsKLSAgR1BSX0FTU0VSVChmYWN0b3J5LT5hbHBuX3Byb3RvY29sX2xpc3RfbGVuZ3RoIDw9IFVJTlRfTUFYKTsKLSAgKm91dGxlbiA9ICh1bnNpZ25lZCBpbnQpZmFjdG9yeS0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aDsKLSAgcmV0dXJuIFNTTF9UTFNFWFRfRVJSX09LOwotfQotCi0vKiAtLS0gdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgY29uc3RydWN0b3JzLiAtLS0gKi8KLQotdHNpX3Jlc3VsdCB0c2lfY3JlYXRlX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9wcml2YXRlX2tleSwgc2l6ZV90IHBlbV9wcml2YXRlX2tleV9zaXplLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9jZXJ0X2NoYWluLCBzaXplX3QgcGVtX2NlcnRfY2hhaW5fc2l6ZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fcm9vdF9jZXJ0cywgc2l6ZV90IHBlbV9yb290X2NlcnRzX3NpemUsCi0gICAgY29uc3QgY2hhciAqY2lwaGVyX2xpc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphbHBuX3Byb3RvY29scywKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphbHBuX3Byb3RvY29sc19sZW5ndGhzLCB1aW50MTZfdCBudW1fYWxwbl9wcm90b2NvbHMsCi0gICAgdHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKipmYWN0b3J5KSB7Ci0gIFNTTF9DVFggKnNzbF9jb250ZXh0ID0gTlVMTDsKLSAgdHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0gTlVMTDsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0KLSAgZ3ByX29uY2VfaW5pdCgmaW5pdF9vcGVuc3NsX29uY2UsIGluaXRfb3BlbnNzbCk7Ci0KLSAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICAqZmFjdG9yeSA9IE5VTEw7Ci0gIGlmIChwZW1fcm9vdF9jZXJ0cyA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7Ci0KLSAgc3NsX2NvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKLSAgaWYgKHNzbF9jb250ZXh0ID09IE5VTEwpIHsKLSAgICBncHJfbG9nKEdQUl9FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgc3NsIGNvbnRleHQuIik7Ci0gICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICB9Ci0KLSAgaW1wbCA9IGNhbGxvYygxLCBzaXplb2YodHNpX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5KSk7Ci0gIGlmIChpbXBsID09IE5VTEwpIHsKLSAgICBTU0xfQ1RYX2ZyZWUoc3NsX2NvbnRleHQpOwotICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgfQotICBpbXBsLT5zc2xfY29udGV4dCA9IHNzbF9jb250ZXh0OwotCi0gIGRvIHsKLSAgICByZXN1bHQgPQotICAgICAgICBwb3B1bGF0ZV9zc2xfY29udGV4dChzc2xfY29udGV4dCwgcGVtX3ByaXZhdGVfa2V5LCBwZW1fcHJpdmF0ZV9rZXlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVtX2NlcnRfY2hhaW4sIHBlbV9jZXJ0X2NoYWluX3NpemUsIGNpcGhlcl9saXN0KTsKLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7Ci0gICAgcmVzdWx0ID0gc3NsX2N0eF9sb2FkX3ZlcmlmaWNhdGlvbl9jZXJ0cyhzc2xfY29udGV4dCwgcGVtX3Jvb3RfY2VydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fcm9vdF9jZXJ0c19zaXplLCBOVUxMKTsKLSAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDYW5ub3QgbG9hZCBzZXJ2ZXIgcm9vdCBjZXJ0aWZpY2F0ZXMuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobnVtX2FscG5fcHJvdG9jb2xzICE9IDApIHsKLSAgICAgIHJlc3VsdCA9IGJ1aWxkX2FscG5fcHJvdG9jb2xfbmFtZV9saXN0KAotICAgICAgICAgIGFscG5fcHJvdG9jb2xzLCBhbHBuX3Byb3RvY29sc19sZW5ndGhzLCBudW1fYWxwbl9wcm90b2NvbHMsCi0gICAgICAgICAgJmltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCwgJmltcGwtPmFscG5fcHJvdG9jb2xfbGlzdF9sZW5ndGgpOwotICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJCdWlsZGluZyBhbHBuIGxpc3QgZmFpbGVkIHdpdGggZXJyb3IgJXMuIiwKLSAgICAgICAgICAgICAgICB0c2lfcmVzdWx0X3RvX3N0cmluZyhyZXN1bHQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jaWYgVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUCi0gICAgICBHUFJfQVNTRVJUKGltcGwtPmFscG5fcHJvdG9jb2xfbGlzdF9sZW5ndGggPCBVSU5UX01BWCk7Ci0gICAgICBpZiAoU1NMX0NUWF9zZXRfYWxwbl9wcm90b3MoCi0gICAgICAgICAgICAgIHNzbF9jb250ZXh0LCBpbXBsLT5hbHBuX3Byb3RvY29sX2xpc3QsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpaW1wbC0+YWxwbl9wcm90b2NvbF9saXN0X2xlbmd0aCkpIHsKLSAgICAgICAgZ3ByX2xvZyhHUFJfRVJST1IsICJDb3VsZCBub3Qgc2V0IGFscG4gcHJvdG9jb2wgbGlzdCB0byBjb250ZXh0LiIpOwotICAgICAgICByZXN1bHQgPSBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLyogVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUICovCi0gICAgICBTU0xfQ1RYX3NldF9uZXh0X3Byb3RvX3NlbGVjdF9jYigKLSAgICAgICAgICBzc2xfY29udGV4dCwgY2xpZW50X2hhbmRzaGFrZXJfZmFjdG9yeV9ucG5fY2FsbGJhY2ssIGltcGwpOwotICAgIH0KLSAgfSB3aGlsZSAoMCk7Ci0gIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveSgmaW1wbC0+YmFzZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICBTU0xfQ1RYX3NldF92ZXJpZnkoc3NsX2NvbnRleHQsIFNTTF9WRVJJRllfUEVFUiwgTlVMTCk7Ci0gIC8qIFRPRE8oamJvZXVmKTogQWRkIHJldm9jYXRpb24gdmVyaWZpY2F0aW9uLiAqLwotCi0gIGltcGwtPmJhc2UuY3JlYXRlX2hhbmRzaGFrZXIgPQotICAgICAgc3NsX2NsaWVudF9oYW5kc2hha2VyX2ZhY3RvcnlfY3JlYXRlX2hhbmRzaGFrZXI7Ci0gIGltcGwtPmJhc2UuZGVzdHJveSA9IHNzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3k7Ci0gICpmYWN0b3J5ID0gJmltcGwtPmJhc2U7Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLXRzaV9yZXN1bHQgdHNpX2NyZWF0ZV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcGVtX3ByaXZhdGVfa2V5cywKLSAgICBjb25zdCBzaXplX3QgKnBlbV9wcml2YXRlX2tleXNfc2l6ZXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZW1fY2VydF9jaGFpbnMsCi0gICAgY29uc3Qgc2l6ZV90ICpwZW1fY2VydF9jaGFpbnNfc2l6ZXMsIHNpemVfdCBrZXlfY2VydF9wYWlyX2NvdW50LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9jbGllbnRfcm9vdF9jZXJ0cywKLSAgICBzaXplX3QgcGVtX2NsaWVudF9yb290X2NlcnRzX3NpemUsIGludCBmb3JjZV9jbGllbnRfYXV0aCwKLSAgICBjb25zdCBjaGFyICpjaXBoZXJfbGlzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqKmFscG5fcHJvdG9jb2xzLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xzX2xlbmd0aHMsIHVpbnQxNl90IG51bV9hbHBuX3Byb3RvY29scywKLSAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqKmZhY3RvcnkpIHsKLSAgdHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5ICppbXBsID0gTlVMTDsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gIHNpemVfdCBpID0gMDsKLQotICBncHJfb25jZV9pbml0KCZpbml0X29wZW5zc2xfb25jZSwgaW5pdF9vcGVuc3NsKTsKLQotICBpZiAoZmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7Ci0gICpmYWN0b3J5ID0gTlVMTDsKLSAgaWYgKGtleV9jZXJ0X3BhaXJfY291bnQgPT0gMCB8fCBwZW1fcHJpdmF0ZV9rZXlzID09IE5VTEwgfHwKLSAgICAgIHBlbV9jZXJ0X2NoYWlucyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICB9Ci0KLSAgaW1wbCA9IGNhbGxvYygxLCBzaXplb2YodHNpX3NzbF9zZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5KSk7Ci0gIGlmIChpbXBsID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgaW1wbC0+YmFzZS5jcmVhdGVfaGFuZHNoYWtlciA9Ci0gICAgICBzc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeV9jcmVhdGVfaGFuZHNoYWtlcjsKLSAgaW1wbC0+YmFzZS5kZXN0cm95ID0gc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnlfZGVzdHJveTsKLSAgaW1wbC0+c3NsX2NvbnRleHRzID0gY2FsbG9jKGtleV9jZXJ0X3BhaXJfY291bnQsIHNpemVvZihTU0xfQ1RYICopKTsKLSAgaW1wbC0+c3NsX2NvbnRleHRfeDUwOV9zdWJqZWN0X25hbWVzID0KLSAgICAgIGNhbGxvYyhrZXlfY2VydF9wYWlyX2NvdW50LCBzaXplb2YodHNpX3BlZXIpKTsKLSAgaWYgKGltcGwtPnNzbF9jb250ZXh0cyA9PSBOVUxMIHx8Ci0gICAgICBpbXBsLT5zc2xfY29udGV4dF94NTA5X3N1YmplY3RfbmFtZXMgPT0gTlVMTCkgewotICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3koJmltcGwtPmJhc2UpOwotICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgfQotICBpbXBsLT5zc2xfY29udGV4dF9jb3VudCA9IGtleV9jZXJ0X3BhaXJfY291bnQ7Ci0KLSAgaWYgKG51bV9hbHBuX3Byb3RvY29scyA+IDApIHsKLSAgICByZXN1bHQgPSBidWlsZF9hbHBuX3Byb3RvY29sX25hbWVfbGlzdCgKLSAgICAgICAgYWxwbl9wcm90b2NvbHMsIGFscG5fcHJvdG9jb2xzX2xlbmd0aHMsIG51bV9hbHBuX3Byb3RvY29scywKLSAgICAgICAgJmltcGwtPmFscG5fcHJvdG9jb2xfbGlzdCwgJmltcGwtPmFscG5fcHJvdG9jb2xfbGlzdF9sZW5ndGgpOwotICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KCZpbXBsLT5iYXNlKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IGtleV9jZXJ0X3BhaXJfY291bnQ7IGkrKykgewotICAgIGRvIHsKLSAgICAgIGltcGwtPnNzbF9jb250ZXh0c1tpXSA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOwotICAgICAgaWYgKGltcGwtPnNzbF9jb250ZXh0c1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBzc2wgY29udGV4dC4iKTsKLSAgICAgICAgcmVzdWx0ID0gVFNJX09VVF9PRl9SRVNPVVJDRVM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmVzdWx0ID0gcG9wdWxhdGVfc3NsX2NvbnRleHQoCi0gICAgICAgICAgaW1wbC0+c3NsX2NvbnRleHRzW2ldLCBwZW1fcHJpdmF0ZV9rZXlzW2ldLCBwZW1fcHJpdmF0ZV9rZXlzX3NpemVzW2ldLAotICAgICAgICAgIHBlbV9jZXJ0X2NoYWluc1tpXSwgcGVtX2NlcnRfY2hhaW5zX3NpemVzW2ldLCBjaXBoZXJfbGlzdCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7Ci0KLSAgICAgIGlmIChwZW1fY2xpZW50X3Jvb3RfY2VydHMgIT0gTlVMTCkgewotICAgICAgICBpbnQgZmxhZ3MgPSBTU0xfVkVSSUZZX1BFRVI7Ci0gICAgICAgIFNUQUNLX09GKFg1MDlfTkFNRSkgKnJvb3RfbmFtZXMgPSBOVUxMOwotICAgICAgICByZXN1bHQgPSBzc2xfY3R4X2xvYWRfdmVyaWZpY2F0aW9uX2NlcnRzKAotICAgICAgICAgICAgaW1wbC0+c3NsX2NvbnRleHRzW2ldLCBwZW1fY2xpZW50X3Jvb3RfY2VydHMsCi0gICAgICAgICAgICBwZW1fY2xpZW50X3Jvb3RfY2VydHNfc2l6ZSwgJnJvb3RfbmFtZXMpOwotICAgICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgewotICAgICAgICAgIGdwcl9sb2coR1BSX0VSUk9SLCAiSW52YWxpZCB2ZXJpZmljYXRpb24gY2VydHMuIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3QoaW1wbC0+c3NsX2NvbnRleHRzW2ldLCByb290X25hbWVzKTsKLSAgICAgICAgaWYgKGZvcmNlX2NsaWVudF9hdXRoKSBmbGFncyB8PSBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUOwotICAgICAgICBTU0xfQ1RYX3NldF92ZXJpZnkoaW1wbC0+c3NsX2NvbnRleHRzW2ldLCBmbGFncywgTlVMTCk7Ci0gICAgICAgIC8qIFRPRE8oamJvZXVmKTogQWRkIHJldm9jYXRpb24gdmVyaWZpY2F0aW9uLiAqLwotICAgICAgfQotCi0gICAgICByZXN1bHQgPSBleHRyYWN0X3g1MDlfc3ViamVjdF9uYW1lc19mcm9tX3BlbV9jZXJ0KAotICAgICAgICAgIHBlbV9jZXJ0X2NoYWluc1tpXSwgcGVtX2NlcnRfY2hhaW5zX3NpemVzW2ldLAotICAgICAgICAgICZpbXBsLT5zc2xfY29udGV4dF94NTA5X3N1YmplY3RfbmFtZXNbaV0pOwotICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOwotCi0gICAgICBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjaygKLSAgICAgICAgICBpbXBsLT5zc2xfY29udGV4dHNbaV0sCi0gICAgICAgICAgc3NsX3NlcnZlcl9oYW5kc2hha2VyX2ZhY3Rvcnlfc2VydmVybmFtZV9jYWxsYmFjayk7Ci0gICAgICBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoaW1wbC0+c3NsX2NvbnRleHRzW2ldLCBpbXBsKTsKLSNpZiBUU0lfT1BFTlNTTF9BTFBOX1NVUFBPUlQKLSAgICAgIFNTTF9DVFhfc2V0X2FscG5fc2VsZWN0X2NiKGltcGwtPnNzbF9jb250ZXh0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9oYW5kc2hha2VyX2ZhY3RvcnlfYWxwbl9jYWxsYmFjaywgaW1wbCk7Ci0jZW5kaWYgLyogVFNJX09QRU5TU0xfQUxQTl9TVVBQT1JUICovCi0gICAgICBTU0xfQ1RYX3NldF9uZXh0X3Byb3Rvc19hZHZlcnRpc2VkX2NiKAotICAgICAgICAgIGltcGwtPnNzbF9jb250ZXh0c1tpXSwKLSAgICAgICAgICBzZXJ2ZXJfaGFuZHNoYWtlcl9mYWN0b3J5X25wbl9hZHZlcnRpc2VkX2NhbGxiYWNrLCBpbXBsKTsKLSAgICB9IHdoaWxlICgwKTsKLQotICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSB7Ci0gICAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9kZXN0cm95KCZpbXBsLT5iYXNlKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gICpmYWN0b3J5ID0gJmltcGwtPmJhc2U7Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLS8qIC0tLSB0c2lfc3NsIHV0aWxzLiAtLS0gKi8KLQotaW50IHRzaV9zc2xfcGVlcl9tYXRjaGVzX25hbWUoY29uc3QgdHNpX3BlZXIgKnBlZXIsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgc2l6ZV90IGkgPSAwOwotICBzaXplX3Qgc2FuX2NvdW50ID0gMDsKLSAgY29uc3QgdHNpX3BlZXJfcHJvcGVydHkgKmNuX3Byb3BlcnR5ID0gTlVMTDsKLSAgaW50IGxpa2VfaXAgPSBsb29rc19saWtlX2lwX2FkZHJlc3MobmFtZSk7Ci0KLSAgLyogQ2hlY2sgdGhlIFNBTiBmaXJzdC4gKi8KLSAgZm9yIChpID0gMDsgaSA8IHBlZXItPnByb3BlcnR5X2NvdW50OyBpKyspIHsKLSAgICBjb25zdCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkgPSAmcGVlci0+cHJvcGVydGllc1tpXTsKLSAgICBpZiAocHJvcGVydHktPm5hbWUgPT0gTlVMTCkgY29udGludWU7Ci0gICAgaWYgKHN0cmNtcChwcm9wZXJ0eS0+bmFtZSwKLSAgICAgICAgICAgICAgIFRTSV9YNTA5X1NVQkpFQ1RfQUxURVJOQVRJVkVfTkFNRV9QRUVSX1BST1BFUlRZKSA9PSAwKSB7Ci0gICAgICBzYW5fY291bnQrKzsKLQotICAgICAgaWYgKCFsaWtlX2lwICYmIGRvZXNfZW50cnlfbWF0Y2hfbmFtZShwcm9wZXJ0eS0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHktPnZhbHVlLmxlbmd0aCwgbmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9IGVsc2UgaWYgKGxpa2VfaXAgJiYKLSAgICAgICAgICAgICAgICAgc3RybmNtcChuYW1lLCBwcm9wZXJ0eS0+dmFsdWUuZGF0YSwgcHJvcGVydHktPnZhbHVlLmxlbmd0aCkgPT0KLSAgICAgICAgICAgICAgICAgICAgIDAgJiYKLSAgICAgICAgICAgICAgICAgc3RybGVuKG5hbWUpID09IHByb3BlcnR5LT52YWx1ZS5sZW5ndGgpIHsKLSAgICAgICAgLyogSVAgQWRkcmVzc2VzIGFyZSBleGFjdCBtYXRjaGVzIG9ubHkuICovCi0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3RyY21wKHByb3BlcnR5LT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFRTSV9YNTA5X1NVQkpFQ1RfQ09NTU9OX05BTUVfUEVFUl9QUk9QRVJUWSkgPT0gMCkgewotICAgICAgY25fcHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiB0aGVyZSdzIG5vIFNBTiwgdHJ5IHRoZSBDTiwgYnV0IG9ubHkgaWYgaXRzIG5vdCBsaWtlIGFuIElQIEFkZHJlc3MgKi8KLSAgaWYgKHNhbl9jb3VudCA9PSAwICYmIGNuX3Byb3BlcnR5ICE9IE5VTEwgJiYgIWxpa2VfaXApIHsKLSAgICBpZiAoZG9lc19lbnRyeV9tYXRjaF9uYW1lKGNuX3Byb3BlcnR5LT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25fcHJvcGVydHktPnZhbHVlLmxlbmd0aCwgbmFtZSkpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOyAvKiBOb3QgZm91bmQuICovCi19CmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIGIvc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyZjVjNi4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RTSV9TU0xfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RTSV9TU0xfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVmFsdWUgZm9yIHRoZSBUU0lfQ0VSVElGSUNBVEVfVFlQRV9QRUVSX1BST1BFUlRZIHByb3BlcnR5IGZvciBYNTA5IGNlcnRzLiAqLwotI2RlZmluZSBUU0lfWDUwOV9DRVJUSUZJQ0FURV9UWVBFICJYNTA5IgotCi0vKiBUaGlzIHByb3BlcnR5IGlzIG9mIHR5cGUgVFNJX1BFRVJfUFJPUEVSVFlfU1RSSU5HLiAgKi8KLSNkZWZpbmUgVFNJX1g1MDlfU1VCSkVDVF9DT01NT05fTkFNRV9QRUVSX1BST1BFUlRZICJ4NTA5X3N1YmplY3RfY29tbW9uX25hbWUiCi0jZGVmaW5lIFRTSV9YNTA5X1NVQkpFQ1RfQUxURVJOQVRJVkVfTkFNRV9QRUVSX1BST1BFUlRZIFwKLSAgIng1MDlfc3ViamVjdF9hbHRlcm5hdGl2ZV9uYW1lIgotCi0jZGVmaW5lIFRTSV9YNTA5X1BFTV9DRVJUX1BST1BFUlRZICJ4NTA5X3BlbV9jZXJ0IgotCi0jZGVmaW5lIFRTSV9TU0xfQUxQTl9TRUxFQ1RFRF9QUk9UT0NPTCAic3NsX2FscG5fc2VsZWN0ZWRfcHJvdG9jb2wiCi0KLS8qIC0tLSB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSBvYmplY3QgLS0tCi0KLSAgIFRoaXMgb2JqZWN0IGNyZWF0ZXMgdHNpX2hhbmRzaGFrZXIgb2JqZWN0cyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUKLSAgIFRMUyAxLjIgc3BlY2lmaWNpYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeTsKLQotLyogQ3JlYXRlcyBhIGNsaWVudCBoYW5kc2hha2VyIGZhY3RvcnkuCi0gICAtIHBlbV9wcml2YXRlX2tleSBpcyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFBFTSBlbmNvZGluZyBvZiB0aGUgY2xpZW50J3MKLSAgICAgcHJpdmF0ZSBrZXkuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBOVUxMIGlmIHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBhCi0gICAgIHByaXZhdGUga2V5LgotICAgLSBwZW1fcHJpdmF0ZV9rZXlfc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCi0gICAtIHBlbV9jZXJ0X2NoYWluIGlzIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgUEVNIGVuY29kaW5nIG9mIHRoZSBjbGllbnQncwotICAgICBjZXJ0aWZpY2F0ZSBjaGFpbi4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIE5VTEwgaWYgdGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlCi0gICAgIGEgY2VydGlmaWNhdGUgY2hhaW4uCi0gICAtIHBlbV9jZXJ0X2NoYWluX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgYnVmZmVyLgotICAgLSBwZW1fcm9vdHNfY2VydCBpcyB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFBFTSBlbmNvZGluZyBvZiB0aGUgc2VydmVyCi0gICAgIHJvb3QgY2VydGlmaWNhdGVzLiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgTlVMTC4KLSAgIC0gcGVtX3Jvb3RzX2NlcnRfc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCi0gICAtIGNpcGhlcl9zdWl0ZXMgY29udGFpbnMgYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgY2lwaGVycyB0aGF0IHRoZSBjbGllbnQKLSAgICAgc3VwcG9ydHMuIFRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXMgZGVzY3JpYmVkIGluOgotICAgICBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMvY2lwaGVycy5odG1sLgotICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIE5VTEwgdG8gdXNlIHRoZSBkZWZhdWx0IHNldCBvZiBjaXBoZXJzLgotICAgICBUT0RPKGpib2V1Zik6IFJldmlzaXQgdGhlIGZvcm1hdCBvZiB0aGlzIHBhcmFtZXRlci4KLSAgIC0gYWxwbl9wcm90b2NvbHMgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvdG9jb2wgbmFtZXMgdGhhdCB0aGUKLSAgICAgaGFuZHNoYWtlcnMgY3JlYXRlZCB3aXRoIHRoaXMgZmFjdG9yeSBzdXBwb3J0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4KLSAgIC0gYWxwbl9wcm90b2NvbHNfbGVuZ3RocyBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBsZW5ndGhzIG9mIHRoZSBhbHBuCi0gICAgIHByb3RvY29scyBzcGVjaWZpZWQgaW4gYWxwbl9wcm90b2NvbHMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBOVUxMLgotICAgLSBudW1fYWxwbl9wcm90b2NvbHMgaXMgdGhlIG51bWJlciBvZiBhbHBuIHByb3RvY29scyBhbmQgYXNzb2NpYXRlZCBsZW5ndGhzCi0gICAgIHNwZWNpZmllZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgMCwgdGhlIG90aGVyIGFscG4gcGFyYW1ldGVycyBtdXN0IGJlIE5VTEwuCi0gICAtIGZhY3RvcnkgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZhY3RvcnkgcG9pbnRlciB0byBiZSBjcmVhdGVkLgotCi0gICAtIFRoaXMgbWV0aG9kIHJldHVybnMgVFNJX09LIG9uIHN1Y2Nlc3Mgb3IgVFNJX0lOVkFMSURfUEFSQU1FVEVSIGluIHRoZSBjYXNlCi0gICAgIHdoZXJlIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuICAqLwotdHNpX3Jlc3VsdCB0c2lfY3JlYXRlX3NzbF9jbGllbnRfaGFuZHNoYWtlcl9mYWN0b3J5KAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9wcml2YXRlX2tleSwgc2l6ZV90IHBlbV9wcml2YXRlX2tleV9zaXplLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9jZXJ0X2NoYWluLCBzaXplX3QgcGVtX2NlcnRfY2hhaW5fc2l6ZSwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwZW1fcm9vdF9jZXJ0cywgc2l6ZV90IHBlbV9yb290X2NlcnRzX3NpemUsCi0gICAgY29uc3QgY2hhciAqY2lwaGVyX3N1aXRlcywgY29uc3QgdW5zaWduZWQgY2hhciAqKmFscG5fcHJvdG9jb2xzLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFscG5fcHJvdG9jb2xzX2xlbmd0aHMsIHVpbnQxNl90IG51bV9hbHBuX3Byb3RvY29scywKLSAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqKmZhY3RvcnkpOwotCi0vKiBDcmVhdGVzIGEgc2VydmVyIGhhbmRzaGFrZXIgZmFjdG9yeS4KLSAgIC0gdmVyc2lvbiBpbmRpY2F0ZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiB0byB1c2UuCi0gICAtIHBlbV9wcml2YXRlX2tleXMgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgUEVNIGVuY29kaW5nIG9mIHRoZSBzZXJ2ZXIncwotICAgICBwcml2YXRlIGtleXMuICBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgTlVMTC4gVGhlIHNpemUgb2YgdGhlIGFycmF5IGlzCi0gICAgIGdpdmVuIGJ5IHRoZSBrZXlfY2VydF9wYWlyX2NvdW50IHBhcmFtZXRlci4KLSAgIC0gcGVtX3ByaXZhdGVfa2V5c19zaXplcyBpcyB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgc2l6ZXMgb2YgdGhlIGFzc29jaWF0ZWQKLSAgICAgYnVmZmVycy4KLSAgIC0gcGVtX2NlcnRfY2hhaW5zIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIFBFTSBlbmNvZGluZyBvZiB0aGUgc2VydmVyJ3MKLSAgICAgY2VydCBjaGFpbnMuICBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgTlVMTC4gVGhlIHNpemUgb2YgdGhlIGFycmF5IGlzCi0gICAgIGdpdmVuIGJ5IHRoZSBrZXlfY2VydF9wYWlyX2NvdW50IHBhcmFtZXRlci4KLSAgIC0gcGVtX2NlcnRfY2hhaW5zX3NpemVzIGlzIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBzaXplcyBvZiB0aGUgYXNzb2NpYXRlZAotICAgICBidWZmZXJzLgotICAgLSBrZXlfY2VydF9wYWlyX2NvdW50IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBwcml2YXRlX2tleV9maWxlcwotICAgICBhbmQgY2VydF9jaGFpbl9maWxlcyBwYXJhbWV0ZXJzLgotICAgLSBwZW1fY2xpZW50X3Jvb3RzIGlzIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgUEVNIGVuY29kaW5nIG9mIHRoZSBjbGllbnQKLSAgICAgcm9vdCBjZXJ0aWZpY2F0ZXMuIFRoaXMgcGFyYW1ldGVyIG1heSBiZSBOVUxMIGluIHdoaWNoIGNhc2UgdGhlIHNlcnZlciB3aWxsCi0gICAgIG5vdCBhdXRoZW50aWNhdGUgdGhlIGNsaWVudC4gSWYgbm90IE5VTEwsIHRoZSBmb3JjZV9jbGllbnRfYXV0aCBwYXJhbWV0ZXIKLSAgICAgc3BlY2lmaWVzIGlmIHRoZSBzZXJ2ZXIgd2lsbCBhY2NlcHQgb25seSBhdXRoZW50aWNhdGVkIGNsaWVudHMgb3IgYm90aAotICAgICBhdXRoZW50aWNhdGVkIGFuZCBub24tYXV0aGVudGljYXRlZCBjbGllbnRzLgotICAgLSBwZW1fY2xpZW50X3Jvb3RfY2VydHNfc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCi0gICAtIGZvcmNlX2NsaWVudF9hdXRoLCBpZiBzZXQgdG8gbm9uLXplcm8gd2lsbCBmb3JjZSB0aGUgY2xpZW50IHRvIGF1dGhlbnRpY2F0ZQotICAgICB3aXRoIGFuIFNTTCBjZXJ0LiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBwZW1fY2xpZW50X3Jvb3RfY2VydHMKLSAgICAgaXMgTlVMTCBvciBwZW1fY2xpZW50X3Jvb3RzX2NlcnRzX3NpemUgaXMgMAotICAgLSBjaXBoZXJfc3VpdGVzIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIGNpcGhlcnMgdGhhdCB0aGUgc2VydmVyCi0gICAgIHN1cHBvcnRzLiBUaGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzIGRlc2NyaWJlZCBpbjoKLSAgICAgaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9hcHBzL2NpcGhlcnMuaHRtbC4KLSAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCBzZXQgb2YgY2lwaGVycy4KLSAgICAgVE9ETyhqYm9ldWYpOiBSZXZpc2l0IHRoZSBmb3JtYXQgb2YgdGhpcyBwYXJhbWV0ZXIuCi0gICAtIGFscG5fcHJvdG9jb2xzIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3RvY29sIG5hbWVzIHRoYXQgdGhlCi0gICAgIGhhbmRzaGFrZXJzIGNyZWF0ZWQgd2l0aCB0aGlzIGZhY3Rvcnkgc3VwcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIE5VTEwuCi0gICAtIGFscG5fcHJvdG9jb2xzX2xlbmd0aHMgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbGVuZ3RocyBvZiB0aGUgYWxwbgotICAgICBwcm90b2NvbHMgc3BlY2lmaWVkIGluIGFscG5fcHJvdG9jb2xzLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4KLSAgIC0gbnVtX2FscG5fcHJvdG9jb2xzIGlzIHRoZSBudW1iZXIgb2YgYWxwbiBwcm90b2NvbHMgYW5kIGFzc29jaWF0ZWQgbGVuZ3RocwotICAgICBzcGVjaWZpZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIDAsIHRoZSBvdGhlciBhbHBuIHBhcmFtZXRlcnMgbXVzdCBiZSBOVUxMLgotICAgLSBmYWN0b3J5IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmYWN0b3J5IHBvaW50ZXIgdG8gYmUgY3JlYXRlZC4KLQotICAgLSBUaGlzIG1ldGhvZCByZXR1cm5zIFRTSV9PSyBvbiBzdWNjZXNzIG9yIFRTSV9JTlZBTElEX1BBUkFNRVRFUiBpbiB0aGUgY2FzZQotICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLiAgKi8KLXRzaV9yZXN1bHQgdHNpX2NyZWF0ZV9zc2xfc2VydmVyX2hhbmRzaGFrZXJfZmFjdG9yeSgKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcGVtX3ByaXZhdGVfa2V5cywKLSAgICBjb25zdCBzaXplX3QgKnBlbV9wcml2YXRlX2tleXNfc2l6ZXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZW1fY2VydF9jaGFpbnMsCi0gICAgY29uc3Qgc2l6ZV90ICpwZW1fY2VydF9jaGFpbnNfc2l6ZXMsIHNpemVfdCBrZXlfY2VydF9wYWlyX2NvdW50LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBlbV9jbGllbnRfcm9vdF9jZXJ0cywKLSAgICBzaXplX3QgcGVtX2NsaWVudF9yb290X2NlcnRzX3NpemUsIGludCBmb3JjZV9jbGllbnRfYXV0aCwKLSAgICBjb25zdCBjaGFyICpjaXBoZXJfc3VpdGVzLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqYWxwbl9wcm90b2NvbHMsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWxwbl9wcm90b2NvbHNfbGVuZ3RocywgdWludDE2X3QgbnVtX2FscG5fcHJvdG9jb2xzLAotICAgIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5ICoqZmFjdG9yeSk7Ci0KLS8qIENyZWF0ZXMgYSBoYW5kc2hha2VyLgotICAtIHNlbGYgaXMgdGhlIGZhY3RvcnkgZnJvbSB3aGljaCB0aGUgaGFuZHNoYWtlciB3aWxsIGJlIGNyZWF0ZWQuCi0gIC0gc2VydmVyX25hbWVfaW5kaWNhdGlvbiBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZlciB0aGUgY2xpZW50IGlzCi0gICAgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gd2hpY2ggd2lsbCBiZSByZWxheWVkIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIFNOSQotICAgIGV4dGVuc2lvbi4KLSAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIE5VTEwgZm9yIGEgc2VydmVyIGhhbmRzaGFrZXIgZmFjdG9yeS4KLSAgLSBoYW5kaHNoYWtlciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgaGFuZHNoYWtlciBwb2ludGVyIHRvIGJlIGNyZWF0ZWQuCi0KLSAgLSBUaGlzIG1ldGhvZCByZXR1cm5zIFRTSV9PSyBvbiBzdWNjZXNzIG9yIFRTSV9JTlZBTElEX1BBUkFNRVRFUiBpbiB0aGUgY2FzZQotICAgIHdoZXJlIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuICAqLwotdHNpX3Jlc3VsdCB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeV9jcmVhdGVfaGFuZHNoYWtlcigKLSAgICB0c2lfc3NsX2hhbmRzaGFrZXJfZmFjdG9yeSAqc2VsZiwgY29uc3QgY2hhciAqc2VydmVyX25hbWVfaW5kaWNhdGlvbiwKLSAgICB0c2lfaGFuZHNoYWtlciAqKmhhbmRzaGFrZXIpOwotCi0vKiBEZXN0cm95cyB0aGUgaGFuZHNoYWtlciBmYWN0b3J5LiBXQVJOSU5HOiBpdCBpcyB1bnNhZmUgdG8gZGVzdHJveSBhIGZhY3RvcnkKLSAgIHdoaWxlIGhhbmRzaGFrZXJzIGNyZWF0ZWQgd2l0aCB0aGlzIGZhY3RvcnkgYXJlIHN0aWxsIGluIHVzZS4gICovCi12b2lkIHRzaV9zc2xfaGFuZHNoYWtlcl9mYWN0b3J5X2Rlc3Ryb3kodHNpX3NzbF9oYW5kc2hha2VyX2ZhY3RvcnkgKnNlbGYpOwotCi0vKiBVdGlsIHRoYXQgY2hlY2tzIHRoYXQgYW4gc3NsIHBlZXIgbWF0Y2hlcyBhIHNwZWNpZmljIG5hbWUuCi0gICBTdGlsbCBUT0RPKGpib2V1Zik6Ci0gICAtIGhhbmRsZSBtaXhlZCBjYXNlLgotICAgLSBoYW5kbGUgJWVuY29kZWQgY2hhcnMuCi0gICAtIGhhbmRsZSBwdWJsaWMgc3VmZml4IHdpbGRjaGFyIG1vcmUgc3RyaWN0bHkgKGUuZy4gKi5jby51aykgKi8KLWludCB0c2lfc3NsX3BlZXJfbWF0Y2hlc19uYW1lKGNvbnN0IHRzaV9wZWVyICpwZWVyLCBjb25zdCBjaGFyICpuYW1lKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UU0lfU1NMX1RSQU5TUE9SVF9TRUNVUklUWV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvc3NsX3R5cGVzLmggYi9zcmMvY29yZS90c2kvc3NsX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTg1ZmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvcmUvdHNpL3NzbF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFNJX1NTTF9UWVBFU19ICi0jZGVmaW5lIEdSUENfQ09SRV9UU0lfU1NMX1RZUEVTX0gKLQotLyogQSBjb2xsZWN0aW9uIG9mIG1hY3JvcyB0byBjYXN0IGJldHdlZW4gdmFyaW91cyBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlCi0gKiB1c2VkIGRpZmZlcmVudGx5IGJldHdlZW4gQm9yaW5nU1NMIGFuZCBPcGVuU1NMOgotICogVFNJX0lOVF9BU19TSVpFKHgpOiAgY29udmVydCAnaW50IHgnIHRvIGEgbGVuZ3RoIHBhcmFtZXRlciBmb3IgYW4gT3BlblNTTAotICogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KLSAqIFRTSV9TSVpFX0FTX1NJWkUoeCk6IGNvbnZlcnQgJ3NpemVfdCB4JyB0byBhIGxlbmd0aCBwYXJhbWV0ZXIgZm9yIGFuIE9wZW5TU0wKLSAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCi0gKi8KLQotI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+Ci0KLSNpZmRlZiBPUEVOU1NMX0lTX0JPUklOR1NTTAotI2RlZmluZSBUU0lfSU5UX0FTX1NJWkUoeCkgKChzaXplX3QpKHgpKQotI2RlZmluZSBUU0lfU0laRV9BU19TSVpFKHgpICh4KQotI2Vsc2UKLSNkZWZpbmUgVFNJX0lOVF9BU19TSVpFKHgpICh4KQotI2RlZmluZSBUU0lfU0laRV9BU19TSVpFKHgpICgoaW50KSh4KSkKLSNlbmRpZgotCi0jZW5kaWYgLyogR1JQQ19DT1JFX1RTSV9TU0xfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIGIvc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjIxOWE1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiAtLS0gVHJhY2luZy4gLS0tICovCi0KLWludCB0c2lfdHJhY2luZ19lbmFibGVkID0gMDsKLQotLyogLS0tIFV0aWxzLiAtLS0gKi8KLQotY2hhciAqdHNpX3N0cmR1cChjb25zdCBjaGFyICpzcmMpIHsKLSAgY2hhciAqZHN0OwotICBzaXplX3QgbGVuOwotICBpZiAoIXNyYykgcmV0dXJuIE5VTEw7Ci0gIGxlbiA9IHN0cmxlbihzcmMpICsgMTsKLSAgZHN0ID0gbWFsbG9jKGxlbik7Ci0gIGlmICghZHN0KSByZXR1cm4gTlVMTDsKLSAgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotICByZXR1cm4gZHN0OwotfQotCi0vKiAtLS0gdHNpX3Jlc3VsdCBjb21tb24gaW1wbGVtZW50YXRpb24uIC0tLSAqLwotCi1jb25zdCBjaGFyICp0c2lfcmVzdWx0X3RvX3N0cmluZyh0c2lfcmVzdWx0IHJlc3VsdCkgewotICBzd2l0Y2ggKHJlc3VsdCkgewotICAgIGNhc2UgVFNJX09LOgotICAgICAgcmV0dXJuICJUU0lfT0siOwotICAgIGNhc2UgVFNJX1VOS05PV05fRVJST1I6Ci0gICAgICByZXR1cm4gIlRTSV9VTktOT1dOX0VSUk9SIjsKLSAgICBjYXNlIFRTSV9JTlZBTElEX0FSR1VNRU5UOgotICAgICAgcmV0dXJuICJUU0lfSU5WQUxJRF9BUkdVTUVOVCI7Ci0gICAgY2FzZSBUU0lfUEVSTUlTU0lPTl9ERU5JRUQ6Ci0gICAgICByZXR1cm4gIlRTSV9QRVJNSVNTSU9OX0RFTklFRCI7Ci0gICAgY2FzZSBUU0lfSU5DT01QTEVURV9EQVRBOgotICAgICAgcmV0dXJuICJUU0lfSU5DT01QTEVURV9EQVRBIjsKLSAgICBjYXNlIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOgotICAgICAgcmV0dXJuICJUU0lfRkFJTEVEX1BSRUNPTkRJVElPTiI7Ci0gICAgY2FzZSBUU0lfVU5JTVBMRU1FTlRFRDoKLSAgICAgIHJldHVybiAiVFNJX1VOSU1QTEVNRU5URUQiOwotICAgIGNhc2UgVFNJX0lOVEVSTkFMX0VSUk9SOgotICAgICAgcmV0dXJuICJUU0lfSU5URVJOQUxfRVJST1IiOwotICAgIGNhc2UgVFNJX0RBVEFfQ09SUlVQVEVEOgotICAgICAgcmV0dXJuICJUU0lfREFUQV9DT1JSVVBURUQiOwotICAgIGNhc2UgVFNJX05PVF9GT1VORDoKLSAgICAgIHJldHVybiAiVFNJX05PVF9GT1VORCI7Ci0gICAgY2FzZSBUU0lfUFJPVE9DT0xfRkFJTFVSRToKLSAgICAgIHJldHVybiAiVFNJX1BST1RPQ09MX0ZBSUxVUkUiOwotICAgIGNhc2UgVFNJX0hBTkRTSEFLRV9JTl9QUk9HUkVTUzoKLSAgICAgIHJldHVybiAiVFNJX0hBTkRTSEFLRV9JTl9QUk9HUkVTUyI7Ci0gICAgY2FzZSBUU0lfT1VUX09GX1JFU09VUkNFUzoKLSAgICAgIHJldHVybiAiVFNJX09VVF9PRl9SRVNPVVJDRVMiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04iOwotICB9Ci19Ci0KLS8qIC0tLSB0c2lfZnJhbWVfcHJvdGVjdG9yIGNvbW1vbiBpbXBsZW1lbnRhdGlvbi4gLS0tCi0KLSAgIENhbGxzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGFmdGVyIHN0YXRlL2lucHV0IHZhbGlkYXRpb24uICovCi0KLXRzaV9yZXN1bHQgdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKSB7Ci0gIGlmIChzZWxmID09IE5VTEwgfHwgdW5wcm90ZWN0ZWRfYnl0ZXMgPT0gTlVMTCB8fAotICAgICAgdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSA9PSBOVUxMIHx8IHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzID09IE5VTEwgfHwKLSAgICAgIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgPT0gTlVMTCkgewotICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotICByZXR1cm4gc2VsZi0+dnRhYmxlLT5wcm90ZWN0KHNlbGYsIHVucHJvdGVjdGVkX2J5dGVzLCB1bnByb3RlY3RlZF9ieXRlc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUpOwotfQotCi10c2lfcmVzdWx0IHRzaV9mcmFtZV9wcm90ZWN0b3JfcHJvdGVjdF9mbHVzaCgKLSAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLCB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcywKLSAgICBzaXplX3QgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUsIHNpemVfdCAqc3RpbGxfcGVuZGluZ19zaXplKSB7Ci0gIGlmIChzZWxmID09IE5VTEwgfHwgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMgPT0gTlVMTCB8fAotICAgICAgcHJvdGVjdGVkX291dHB1dF9mcmFtZXMgPT0gTlVMTCB8fCBzdGlsbF9wZW5kaW5nX3NpemUgPT0gTlVMTCkgewotICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotICByZXR1cm4gc2VsZi0+dnRhYmxlLT5wcm90ZWN0X2ZsdXNoKHNlbGYsIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGxfcGVuZGluZ19zaXplKTsKLX0KLQotdHNpX3Jlc3VsdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3VucHJvdGVjdCgKLSAgICB0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzLAotICAgIHNpemVfdCAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplLCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKLSAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUpIHsKLSAgaWYgKHNlbGYgPT0gTlVMTCB8fCBwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzID09IE5VTEwgfHwKLSAgICAgIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSA9PSBOVUxMIHx8IHVucHJvdGVjdGVkX2J5dGVzID09IE5VTEwgfHwKLSAgICAgIHVucHJvdGVjdGVkX2J5dGVzX3NpemUgPT0gTlVMTCkgewotICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotICByZXR1cm4gc2VsZi0+dnRhYmxlLT51bnByb3RlY3Qoc2VsZiwgcHJvdGVjdGVkX2ZyYW1lc19ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXNfc2l6ZSwgdW5wcm90ZWN0ZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnByb3RlY3RlZF9ieXRlc19zaXplKTsKLX0KLQotdm9pZCB0c2lfZnJhbWVfcHJvdGVjdG9yX2Rlc3Ryb3kodHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZikgewotICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm47Ci0gIHNlbGYtPnZ0YWJsZS0+ZGVzdHJveShzZWxmKTsKLX0KLQotLyogLS0tIHRzaV9oYW5kc2hha2VyIGNvbW1vbiBpbXBsZW1lbnRhdGlvbi4gLS0tCi0KLSAgIENhbGxzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGFmdGVyIHN0YXRlL2lucHV0IHZhbGlkYXRpb24uICovCi0KLXRzaV9yZXN1bHQgdHNpX2hhbmRzaGFrZXJfZ2V0X2J5dGVzX3RvX3NlbmRfdG9fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpIHsKLSAgaWYgKHNlbGYgPT0gTlVMTCB8fCBieXRlcyA9PSBOVUxMIHx8IGJ5dGVzX3NpemUgPT0gTlVMTCkgewotICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotICBpZiAoc2VsZi0+ZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQpIHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTjsKLSAgcmV0dXJuIHNlbGYtPnZ0YWJsZS0+Z2V0X2J5dGVzX3RvX3NlbmRfdG9fcGVlcihzZWxmLCBieXRlcywgYnl0ZXNfc2l6ZSk7Ci19Ci0KLXRzaV9yZXN1bHQgdHNpX2hhbmRzaGFrZXJfcHJvY2Vzc19ieXRlc19mcm9tX3BlZXIodHNpX2hhbmRzaGFrZXIgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpIHsKLSAgaWYgKHNlbGYgPT0gTlVMTCB8fCBieXRlcyA9PSBOVUxMIHx8IGJ5dGVzX3NpemUgPT0gTlVMTCkgewotICAgIHJldHVybiBUU0lfSU5WQUxJRF9BUkdVTUVOVDsKLSAgfQotICBpZiAoc2VsZi0+ZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQpIHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTjsKLSAgcmV0dXJuIHNlbGYtPnZ0YWJsZS0+cHJvY2Vzc19ieXRlc19mcm9tX3BlZXIoc2VsZiwgYnl0ZXMsIGJ5dGVzX3NpemUpOwotfQotCi10c2lfcmVzdWx0IHRzaV9oYW5kc2hha2VyX2dldF9yZXN1bHQodHNpX2hhbmRzaGFrZXIgKnNlbGYpIHsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICBpZiAoc2VsZi0+ZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQpIHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTjsKLSAgcmV0dXJuIHNlbGYtPnZ0YWJsZS0+Z2V0X3Jlc3VsdChzZWxmKTsKLX0KLQotdHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9leHRyYWN0X3BlZXIodHNpX2hhbmRzaGFrZXIgKnNlbGYsIHRzaV9wZWVyICpwZWVyKSB7Ci0gIGlmIChzZWxmID09IE5VTEwgfHwgcGVlciA9PSBOVUxMKSByZXR1cm4gVFNJX0lOVkFMSURfQVJHVU1FTlQ7Ci0gIG1lbXNldChwZWVyLCAwLCBzaXplb2YodHNpX3BlZXIpKTsKLSAgaWYgKHNlbGYtPmZyYW1lX3Byb3RlY3Rvcl9jcmVhdGVkKSByZXR1cm4gVFNJX0ZBSUxFRF9QUkVDT05ESVRJT047Ci0gIGlmICh0c2lfaGFuZHNoYWtlcl9nZXRfcmVzdWx0KHNlbGYpICE9IFRTSV9PSykgewotICAgIHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTjsKLSAgfQotICByZXR1cm4gc2VsZi0+dnRhYmxlLT5leHRyYWN0X3BlZXIoc2VsZiwgcGVlcik7Ci19Ci0KLXRzaV9yZXN1bHQgdHNpX2hhbmRzaGFrZXJfY3JlYXRlX2ZyYW1lX3Byb3RlY3RvcigKLSAgICB0c2lfaGFuZHNoYWtlciAqc2VsZiwgc2l6ZV90ICptYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUsCi0gICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqKnByb3RlY3RvcikgewotICB0c2lfcmVzdWx0IHJlc3VsdDsKLSAgaWYgKHNlbGYgPT0gTlVMTCB8fCBwcm90ZWN0b3IgPT0gTlVMTCkgcmV0dXJuIFRTSV9JTlZBTElEX0FSR1VNRU5UOwotICBpZiAoc2VsZi0+ZnJhbWVfcHJvdGVjdG9yX2NyZWF0ZWQpIHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTjsKLSAgaWYgKHRzaV9oYW5kc2hha2VyX2dldF9yZXN1bHQoc2VsZikgIT0gVFNJX09LKSB7Ci0gICAgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OOwotICB9Ci0gIHJlc3VsdCA9IHNlbGYtPnZ0YWJsZS0+Y3JlYXRlX2ZyYW1lX3Byb3RlY3RvcihzZWxmLCBtYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0b3IpOwotICBpZiAocmVzdWx0ID09IFRTSV9PSykgewotICAgIHNlbGYtPmZyYW1lX3Byb3RlY3Rvcl9jcmVhdGVkID0gMTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHRzaV9oYW5kc2hha2VyX2Rlc3Ryb3kodHNpX2hhbmRzaGFrZXIgKnNlbGYpIHsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuOwotICBzZWxmLT52dGFibGUtPmRlc3Ryb3koc2VsZik7Ci19Ci0KLS8qIC0tLSB0c2lfcGVlciBpbXBsZW1lbnRhdGlvbi4gLS0tICovCi0KLXRzaV9wZWVyX3Byb3BlcnR5IHRzaV9pbml0X3BlZXJfcHJvcGVydHkodm9pZCkgewotICB0c2lfcGVlcl9wcm9wZXJ0eSBwcm9wZXJ0eTsKLSAgbWVtc2V0KCZwcm9wZXJ0eSwgMCwgc2l6ZW9mKHRzaV9wZWVyX3Byb3BlcnR5KSk7Ci0gIHJldHVybiBwcm9wZXJ0eTsKLX0KLQotc3RhdGljIHZvaWQgdHNpX3BlZXJfZGVzdHJveV9saXN0X3Byb3BlcnR5KHRzaV9wZWVyX3Byb3BlcnR5ICpjaGlsZHJlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2hpbGRfY291bnQpIHsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaGlsZF9jb3VudDsgaSsrKSB7Ci0gICAgdHNpX3BlZXJfcHJvcGVydHlfZGVzdHJ1Y3QoJmNoaWxkcmVuW2ldKTsKLSAgfQotICBmcmVlKGNoaWxkcmVuKTsKLX0KLQotdm9pZCB0c2lfcGVlcl9wcm9wZXJ0eV9kZXN0cnVjdCh0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpIHsKLSAgaWYgKHByb3BlcnR5LT5uYW1lICE9IE5VTEwpIHsKLSAgICBmcmVlKHByb3BlcnR5LT5uYW1lKTsKLSAgfQotICBpZiAocHJvcGVydHktPnZhbHVlLmRhdGEgIT0gTlVMTCkgewotICAgIGZyZWUocHJvcGVydHktPnZhbHVlLmRhdGEpOwotICB9Ci0gICpwcm9wZXJ0eSA9IHRzaV9pbml0X3BlZXJfcHJvcGVydHkoKTsgLyogUmVzZXQgZXZlcnl0aGluZyB0byAwLiAqLwotfQotCi12b2lkIHRzaV9wZWVyX2Rlc3RydWN0KHRzaV9wZWVyICpzZWxmKSB7Ci0gIGlmIChzZWxmID09IE5VTEwpIHJldHVybjsKLSAgaWYgKHNlbGYtPnByb3BlcnRpZXMgIT0gTlVMTCkgewotICAgIHRzaV9wZWVyX2Rlc3Ryb3lfbGlzdF9wcm9wZXJ0eShzZWxmLT5wcm9wZXJ0aWVzLCBzZWxmLT5wcm9wZXJ0eV9jb3VudCk7Ci0gICAgc2VsZi0+cHJvcGVydGllcyA9IE5VTEw7Ci0gIH0KLSAgc2VsZi0+cHJvcGVydHlfY291bnQgPSAwOwotfQotCi10c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3RfYWxsb2NhdGVkX3N0cmluZ19wZWVyX3Byb3BlcnR5KAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB2YWx1ZV9sZW5ndGgsIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSkgewotICAqcHJvcGVydHkgPSB0c2lfaW5pdF9wZWVyX3Byb3BlcnR5KCk7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICBwcm9wZXJ0eS0+bmFtZSA9IHRzaV9zdHJkdXAobmFtZSk7Ci0gICAgaWYgKHByb3BlcnR5LT5uYW1lID09IE5VTEwpIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgfQotICBpZiAodmFsdWVfbGVuZ3RoID4gMCkgewotICAgIHByb3BlcnR5LT52YWx1ZS5kYXRhID0gY2FsbG9jKDEsIHZhbHVlX2xlbmd0aCk7Ci0gICAgaWYgKHByb3BlcnR5LT52YWx1ZS5kYXRhID09IE5VTEwpIHsKLSAgICAgIHRzaV9wZWVyX3Byb3BlcnR5X2Rlc3RydWN0KHByb3BlcnR5KTsKLSAgICAgIHJldHVybiBUU0lfT1VUX09GX1JFU09VUkNFUzsKLSAgICB9Ci0gICAgcHJvcGVydHktPnZhbHVlLmxlbmd0aCA9IHZhbHVlX2xlbmd0aDsKLSAgfQotICByZXR1cm4gVFNJX09LOwotfQotCi10c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHlfZnJvbV9jc3RyaW5nKAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpIHsKLSAgcmV0dXJuIHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHkobmFtZSwgdmFsdWUsIHN0cmxlbih2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLX0KLQotdHNpX3Jlc3VsdCB0c2lfY29uc3RydWN0X3N0cmluZ19wZWVyX3Byb3BlcnR5KGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhbHVlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpIHsKLSAgdHNpX3Jlc3VsdCByZXN1bHQgPSB0c2lfY29uc3RydWN0X2FsbG9jYXRlZF9zdHJpbmdfcGVlcl9wcm9wZXJ0eSgKLSAgICAgIG5hbWUsIHZhbHVlX2xlbmd0aCwgcHJvcGVydHkpOwotICBpZiAocmVzdWx0ICE9IFRTSV9PSykgcmV0dXJuIHJlc3VsdDsKLSAgaWYgKHZhbHVlX2xlbmd0aCA+IDApIHsKLSAgICBtZW1jcHkocHJvcGVydHktPnZhbHVlLmRhdGEsIHZhbHVlLCB2YWx1ZV9sZW5ndGgpOwotICB9Ci0gIHJldHVybiBUU0lfT0s7Ci19Ci0KLXRzaV9yZXN1bHQgdHNpX2NvbnN0cnVjdF9wZWVyKHNpemVfdCBwcm9wZXJ0eV9jb3VudCwgdHNpX3BlZXIgKnBlZXIpIHsKLSAgbWVtc2V0KHBlZXIsIDAsIHNpemVvZih0c2lfcGVlcikpOwotICBpZiAocHJvcGVydHlfY291bnQgPiAwKSB7Ci0gICAgcGVlci0+cHJvcGVydGllcyA9IGNhbGxvYyhwcm9wZXJ0eV9jb3VudCwgc2l6ZW9mKHRzaV9wZWVyX3Byb3BlcnR5KSk7Ci0gICAgaWYgKHBlZXItPnByb3BlcnRpZXMgPT0gTlVMTCkgcmV0dXJuIFRTSV9PVVRfT0ZfUkVTT1VSQ0VTOwotICAgIHBlZXItPnByb3BlcnR5X2NvdW50ID0gcHJvcGVydHlfY291bnQ7Ci0gIH0KLSAgcmV0dXJuIFRTSV9PSzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCBiL3NyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjMDM3MS4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBHUlBDX0NPUkVfVFNJX1RSQU5TUE9SVF9TRUNVUklUWV9ICi0jZGVmaW5lIEdSUENfQ09SRV9UU0lfVFJBTlNQT1JUX1NFQ1VSSVRZX0gKLQotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotZXh0ZXJuIGludCB0c2lfdHJhY2luZ19lbmFibGVkOwotCi0vKiBCYXNlIGZvciB0c2lfZnJhbWVfcHJvdGVjdG9yIGltcGxlbWVudGF0aW9ucy4KLSAgIFNlZSB0cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmggZm9yIGRvY3VtZW50YXRpb24uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRzaV9yZXN1bHQgKCpwcm90ZWN0KSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdW5wcm90ZWN0ZWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVucHJvdGVjdGVkX2J5dGVzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXNfc2l6ZSk7Ci0gIHRzaV9yZXN1bHQgKCpwcm90ZWN0X2ZsdXNoKSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnN0aWxsX3BlbmRpbmdfc2l6ZSk7Ci0gIHRzaV9yZXN1bHQgKCp1bnByb3RlY3QpKHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp1bnByb3RlY3RlZF9ieXRlc19zaXplKTsKLSAgdm9pZCAoKmRlc3Ryb3kpKHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYpOwotfSB0c2lfZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZTsKLQotc3RydWN0IHRzaV9mcmFtZV9wcm90ZWN0b3IgewotICBjb25zdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Z0YWJsZSAqdnRhYmxlOwotfTsKLQotLyogQmFzZSBmb3IgdHNpX2hhbmRzaGFrZXIgaW1wbGVtZW50YXRpb25zLgotICAgU2VlIHRyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCBmb3IgZG9jdW1lbnRhdGlvbi4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdHNpX3Jlc3VsdCAoKmdldF9ieXRlc190b19zZW5kX3RvX3BlZXIpKHRzaV9oYW5kc2hha2VyICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpOwotICB0c2lfcmVzdWx0ICgqcHJvY2Vzc19ieXRlc19mcm9tX3BlZXIpKHRzaV9oYW5kc2hha2VyICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNfc2l6ZSk7Ci0gIHRzaV9yZXN1bHQgKCpnZXRfcmVzdWx0KSh0c2lfaGFuZHNoYWtlciAqc2VsZik7Ci0gIHRzaV9yZXN1bHQgKCpleHRyYWN0X3BlZXIpKHRzaV9oYW5kc2hha2VyICpzZWxmLCB0c2lfcGVlciAqcGVlcik7Ci0gIHRzaV9yZXN1bHQgKCpjcmVhdGVfZnJhbWVfcHJvdGVjdG9yKSh0c2lfaGFuZHNoYWtlciAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbWF4X3Byb3RlY3RlZF9mcmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqKnByb3RlY3Rvcik7Ci0gIHZvaWQgKCpkZXN0cm95KSh0c2lfaGFuZHNoYWtlciAqc2VsZik7Ci19IHRzaV9oYW5kc2hha2VyX3Z0YWJsZTsKLQotc3RydWN0IHRzaV9oYW5kc2hha2VyIHsKLSAgY29uc3QgdHNpX2hhbmRzaGFrZXJfdnRhYmxlICp2dGFibGU7Ci0gIGludCBmcmFtZV9wcm90ZWN0b3JfY3JlYXRlZDsKLX07Ci0KLS8qIFBlZXIgYW5kIHByb3BlcnR5IGNvbnN0cnVjdGlvbi9kZXN0cnVjdGlvbiBmdW5jdGlvbnMuICovCi10c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3RfcGVlcihzaXplX3QgcHJvcGVydHlfY291bnQsIHRzaV9wZWVyICpwZWVyKTsKLXRzaV9wZWVyX3Byb3BlcnR5IHRzaV9pbml0X3BlZXJfcHJvcGVydHkodm9pZCk7Ci12b2lkIHRzaV9wZWVyX3Byb3BlcnR5X2Rlc3RydWN0KHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSk7Ci10c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHkoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFsdWVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSk7Ci10c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3RfYWxsb2NhdGVkX3N0cmluZ19wZWVyX3Byb3BlcnR5KAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB2YWx1ZV9sZW5ndGgsIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0eSk7Ci10c2lfcmVzdWx0IHRzaV9jb25zdHJ1Y3Rfc3RyaW5nX3BlZXJfcHJvcGVydHlfZnJvbV9jc3RyaW5nKAotICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCB0c2lfcGVlcl9wcm9wZXJ0eSAqcHJvcGVydHkpOwotCi0vKiBVdGlscy4gKi8KLWNoYXIgKnRzaV9zdHJkdXAoY29uc3QgY2hhciAqc3JjKTsgLyogU2FkbHksIG5vIHN0cmR1cCBpbiBDODkuICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBHUlBDX0NPUkVfVFNJX1RSQU5TUE9SVF9TRUNVUklUWV9IICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIGIvc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MDE4MC4uMDAwMDAwMAotLS0gYS9zcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgR1JQQ19DT1JFX1RTSV9UUkFOU1BPUlRfU0VDVVJJVFlfSU5URVJGQUNFX0gKLSNkZWZpbmUgR1JQQ19DT1JFX1RTSV9UUkFOU1BPUlRfU0VDVVJJVFlfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIC0tLSB0c2kgcmVzdWx0IC0tLSAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgVFNJX09LID0gMCwKLSAgVFNJX1VOS05PV05fRVJST1IgPSAxLAotICBUU0lfSU5WQUxJRF9BUkdVTUVOVCA9IDIsCi0gIFRTSV9QRVJNSVNTSU9OX0RFTklFRCA9IDMsCi0gIFRTSV9JTkNPTVBMRVRFX0RBVEEgPSA0LAotICBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTiA9IDUsCi0gIFRTSV9VTklNUExFTUVOVEVEID0gNiwKLSAgVFNJX0lOVEVSTkFMX0VSUk9SID0gNywKLSAgVFNJX0RBVEFfQ09SUlVQVEVEID0gOCwKLSAgVFNJX05PVF9GT1VORCA9IDksCi0gIFRTSV9QUk9UT0NPTF9GQUlMVVJFID0gMTAsCi0gIFRTSV9IQU5EU0hBS0VfSU5fUFJPR1JFU1MgPSAxMSwKLSAgVFNJX09VVF9PRl9SRVNPVVJDRVMgPSAxMgotfSB0c2lfcmVzdWx0OwotCi1jb25zdCBjaGFyICp0c2lfcmVzdWx0X3RvX3N0cmluZyh0c2lfcmVzdWx0IHJlc3VsdCk7Ci0KLS8qIC0tLSB0c2kgdHJhY2luZyAtLS0gKi8KLQotLyogU2V0IHRoaXMgZWFybHkgdG8gYXZvaWQgcmFjZXMgKi8KLWV4dGVybiBpbnQgdHNpX3RyYWNpbmdfZW5hYmxlZDsKLQotLyogLS0tIHRzaV9mcmFtZV9wcm90ZWN0b3Igb2JqZWN0IC0tLQotCi0gIFRoaXMgb2JqZWN0IHByb3RlY3RzIGFuZCB1bnByb3RlY3RzIGJ1ZmZlcnMgb25jZSB0aGUgaGFuZHNoYWtlIGlzIGRvbmUuCi0gIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG9iamVjdCBtdXN0IGJlIHRocmVhZCBjb21wYXRpYmxlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdHNpX2ZyYW1lX3Byb3RlY3RvciB0c2lfZnJhbWVfcHJvdGVjdG9yOwotCi0vKiBPdXRwdXRzIHByb3RlY3RlZCBmcmFtZXMuCi0gICAtIHVucHJvdGVjdGVkX2J5dGVzIGlzIGFuIGlucHV0IG9ubHkgcGFyYW1ldGVyIGFuZCBwb2ludHMgdG8gdGhlIGRhdGEKLSAgICAgdG8gYmUgcHJvdGVjdGVkLgotICAgLSB1bnByb3RlY3RlZF9ieXRlc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgY2FsbGVyIHRvCi0gICAgIHNwZWNpZnkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiB1bnByb3RlY3RlZF9ieXRlcy4gVGhlIG91dHB1dAotICAgICB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGR1cmluZyB0aGUgY2FsbC4KLSAgIC0gcHJvdGVjdGVkX291dHB1dF9mcmFtZXMgcG9pbnRzIHRvIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIHRoYXQKLSAgICAgd2lsbCBiZSB3cml0dGVuLgotICAgLSBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAgICAgY2FsbGVyIHRvIHNwZWNpZnkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcy4KLSAgICAgQXMgYW4gb3V0cHV0LCB0aGlzIHZhbHVlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAtIFRoaXMgbWV0aG9kIHJldHVybnMgVFNJX09LIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBhIHNwZWNpZmljIGVycm9yIGNvZGUgaW4KLSAgICAgY2FzZSBvZiBmYWlsdXJlLiBOb3RlIHRoYXQgZXZlbiBpZiBhbGwgdGhlIGlucHV0IHVucHJvdGVjdGVkIGJ5dGVzIGFyZQotICAgICBjb25zdW1lZCwgdGhleSBtYXkgbm90IGhhdmUgYmVlbiBwcm9jZXNzZWQgaW50byB0aGUgcmV0dXJuZWQgcHJvdGVjdGVkCi0gICAgIG91dHB1dCBmcmFtZXMuIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgdGhlIHByb3RlY3RfZmx1c2ggbWV0aG9kCi0gICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHByb3RlY3RlZCBieXRlcyBidWZmZXJlZCBpbiB0aGUKLSAgICAgcHJvdGVjdG9yLgotCi0gICBBIHR5cGljYWwgd2F5IHRvIGNhbGwgdGhpcyBtZXRob2Qgd291bGQgYmU6Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgdW5zaWduZWQgY2hhciBwcm90ZWN0ZWRfYnVmZmVyWzQwOTZdOwotICAgc2l6ZV90IHByb3RlY3RlZF9idWZmZXJfc2l6ZSA9IHNpemVvZihwcm90ZWN0ZWRfYnVmZmVyKTsKLSAgIHRzaV9yZXN1bHQgcmVzdWx0ID0gVFNJX09LOwotICAgd2hpbGUgKG1lc3NhZ2Vfc2l6ZSA+IDApIHsKLSAgICAgc2l6ZV90IHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kID0gcHJvdGVjdGVkX2J1ZmZlcl9zaXplOwotICAgICBzaXplX3QgcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSA9IG1lc3NhZ2Vfc2l6ZTsKLSAgICAgcmVzdWx0ID0gdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0KHByb3RlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQpOwotICAgICBpZiAocmVzdWx0ICE9IFRTSV9PSykgYnJlYWs7Ci0gICAgIHNlbmRfYnl0ZXNfdG9fcGVlcihwcm90ZWN0ZWRfYnVmZmVyLCBwcm90ZWN0ZWRfYnVmZmVyX3NpemVfdG9fc2VuZCk7Ci0gICAgIG1lc3NhZ2VfYnl0ZXMgKz0gcHJvY2Vzc2VkX21lc3NhZ2Vfc2l6ZTsKLSAgICAgbWVzc2FnZV9zaXplIC09IHByb2Nlc3NlZF9tZXNzYWdlX3NpemU7Ci0KLSAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIGZsdXNoLgotICAgICBpZiAobWVzc2FnZV9zaXplID09IDApIHsKLSAgICAgICBzaXplX3Qgc3RpbGxfcGVuZGluZ19zaXplOwotICAgICAgIGRvIHsKLSAgICAgICAgIHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kID0gcHJvdGVjdGVkX2J1ZmZlcl9zaXplOwotICAgICAgICAgcmVzdWx0ID0gdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0X2ZsdXNoKAotICAgICAgICAgICAgIHByb3RlY3RvciwgcHJvdGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAmcHJvdGVjdGVkX2J1ZmZlcl9zaXplX3RvX3NlbmQsICZzdGlsbF9wZW5kaW5nX3NpemUpOwotICAgICAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIGJyZWFrOwotICAgICAgICAgc2VuZF9ieXRlc190b19wZWVyKHByb3RlY3RlZF9idWZmZXIsIHByb3RlY3RlZF9idWZmZXJfc2l6ZV90b19zZW5kKTsKLSAgICAgICB9IHdoaWxlIChzdGlsbF9wZW5kaW5nX3NpemUgPiAwKTsKLSAgICAgfQotICAgfQotCi0gICBpZiAocmVzdWx0ICE9IFRTSV9PSykgSGFuZGxlRXJyb3IocmVzdWx0KTsKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KLXRzaV9yZXN1bHQgdHNpX2ZyYW1lX3Byb3RlY3Rvcl9wcm90ZWN0KHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1bnByb3RlY3RlZF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplKTsKLQotLyogSW5kaWNhdGVzIHRoYXQgd2UgbmVlZCB0byBmbHVzaCB0aGUgYnl0ZXMgYnVmZmVyZWQgaW4gdGhlIHByb3RlY3RvciBhbmQgZ2V0Ci0gICB0aGUgcmVzdWx0aW5nIGZyYW1lLgotICAgLSBwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lcyBwb2ludHMgdG8gYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgdGhhdAotICAgICB3aWxsIGJlIHdyaXR0ZW4uCi0gICAtIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzX3NpemUgaXMgYW4gaW5wdXQvb3V0cHV0IHBhcmFtZXRlciB1c2VkIGJ5IHRoZQotICAgICBjYWxsZXIgdG8gc3BlY2lmeSBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHByb3RlY3RlZF9vdXRwdXRfZnJhbWVzLgotICAgLSBzdGlsbF9wZW5kaW5nX2J5dGVzIGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBmbHVzaGVkIGZyb20gdGhlIHByb3RlY3Rvci4qLwotdHNpX3Jlc3VsdCB0c2lfZnJhbWVfcHJvdGVjdG9yX3Byb3RlY3RfZmx1c2goCi0gICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqc2VsZiwgdW5zaWduZWQgY2hhciAqcHJvdGVjdGVkX291dHB1dF9mcmFtZXMsCi0gICAgc2l6ZV90ICpwcm90ZWN0ZWRfb3V0cHV0X2ZyYW1lc19zaXplLCBzaXplX3QgKnN0aWxsX3BlbmRpbmdfc2l6ZSk7Ci0KLS8qIE91dHB1dHMgdW5wcm90ZWN0ZWQgYnl0ZXMuCi0gICAtIHByb3RlY3RlZF9mcmFtZXNfYnl0ZXMgaXMgYW4gaW5wdXQgb25seSBwYXJhbWV0ZXIgYW5kIHBvaW50cyB0byB0aGUKLSAgICAgcHJvdGVjdGVkIGZyYW1lcyB0byBiZSB1bnByb3RlY3RlZC4KLSAgIC0gcHJvdGVjdGVkX2ZyYW1lc19ieXRlc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBvbmx5IHBhcmFtZXRlciB1c2VkIGJ5IHRoZQotICAgICBjYWxsZXIgdG8gc3BlY2lmeSBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHByb3RlY3RlZF9ieXRlcy4gVGhlCi0gICAgIG91dHB1dCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGR1cmluZyB0aGUgY2FsbC4KLSAgICAgSW1wbGVtZW50YXRpb25zIHdpbGwgYnVmZmVyIHVwIHRvIGEgZnJhbWUgb2YgcHJvdGVjdGVkIGRhdGEuCi0gICAtIHVucHJvdGVjdGVkX2J5dGVzIHBvaW50cyB0byBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciB0aGF0IHdpbGwgYmUKLSAgICAgd3JpdHRlbi4KLSAgIC0gdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSBpcyBhbiBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyIHVzZWQgYnkgdGhlIGNhbGxlciB0bwotICAgICBzcGVjaWZ5IGhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdW5wcm90ZWN0ZWRfYnl0ZXMuIFRoaXMKLSAgICAgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgbW9zdCBtYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUgbWludXMgb3ZlcmhlYWQKLSAgICAgd2hpY2ggbWVhbnMgdGhhdCBtYXhfcHJvdGVjdGVkX2ZyYW1lX3NpemUgaXMgYSBzYWZlIGJldC4gVGhlIG91dHB1dCB2YWx1ZQotICAgICBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCi0gICAgIElmICp1bnByb3RlY3RlZF9ieXRlc19zaXplIGlzIHVuY2hhbmdlZCwgdGhlcmUgbWF5IGJlIG1vcmUgZGF0YSByZW1haW5pbmcKLSAgICAgdG8gdW5wcm90ZWN0LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLgotCi0gICAtIFRoaXMgbWV0aG9kIHJldHVybnMgVFNJX09LIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gU3VjY2VzcyBpbmNsdWRlcyBjYXNlcyB3aGVyZQotICAgICB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgdG8gb3V0cHV0IGEgZnJhbWUgaW4gd2hpY2ggY2FzZQotICAgICB1bnByb3RlY3RlZF9ieXRlc19zaXplIHdpbGwgYmUgc2V0IHRvIDAgYW5kIGNhc2VzIHdoZXJlIHRoZSBpbnRlcm5hbCBidWZmZXIKLSAgICAgbmVlZHMgdG8gYmUgcmVhZCBiZWZvcmUgbmV3IHByb3RlY3RlZCBkYXRhIGNhbiBiZSBwcm9jZXNzZWQgaW4gd2hpY2ggY2FzZQotICAgICBwcm90ZWN0ZWRfZnJhbWVzX3NpemUgd2lsbCBiZSBzZXQgdG8gMC4gICovCi10c2lfcmVzdWx0IHRzaV9mcmFtZV9wcm90ZWN0b3JfdW5wcm90ZWN0KAotICAgIHRzaV9mcmFtZV9wcm90ZWN0b3IgKnNlbGYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3RlY3RlZF9mcmFtZXNfYnl0ZXMsCi0gICAgc2l6ZV90ICpwcm90ZWN0ZWRfZnJhbWVzX2J5dGVzX3NpemUsIHVuc2lnbmVkIGNoYXIgKnVucHJvdGVjdGVkX2J5dGVzLAotICAgIHNpemVfdCAqdW5wcm90ZWN0ZWRfYnl0ZXNfc2l6ZSk7Ci0KLS8qIERlc3Ryb3lzIHRoZSB0c2lfZnJhbWVfcHJvdGVjdG9yIG9iamVjdC4gICovCi12b2lkIHRzaV9mcmFtZV9wcm90ZWN0b3JfZGVzdHJveSh0c2lfZnJhbWVfcHJvdGVjdG9yICpzZWxmKTsKLQotLyogLS0tIHRzaV9wZWVyIG9iamVjdHMgLS0tCi0KLSAgIHRzaV9wZWVyIG9iamVjdHMgYXJlIGEgc2V0IG9mIHByb3BlcnRpZXMuIFRoZSBwZWVyIG93bnMgdGhlIHByb3BlcnRpZXMuICAqLwotCi0vKiBUaGlzIHByb3BlcnR5IGlzIG9mIHR5cGUgVFNJX1BFRVJfUFJPUEVSVFlfU1RSSU5HLiAgKi8KLSNkZWZpbmUgVFNJX0NFUlRJRklDQVRFX1RZUEVfUEVFUl9QUk9QRVJUWSAiY2VydGlmaWNhdGVfdHlwZSIKLQotLyogUHJvcGVydHkgdmFsdWVzIG1heSBjb250YWluIE5VTEwgY2hhcmFjdGVycyBqdXN0IGxpa2UgQysrIHN0cmluZ3MuCi0gICBUaGUgbGVuZ3RoIGZpZWxkIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gKi8KLXR5cGVkZWYgc3RydWN0IHRzaV9wZWVyX3Byb3BlcnR5IHsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IHsKLSAgICBjaGFyICpkYXRhOwotICAgIHNpemVfdCBsZW5ndGg7Ci0gIH0gdmFsdWU7Ci19IHRzaV9wZWVyX3Byb3BlcnR5OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHRzaV9wZWVyX3Byb3BlcnR5ICpwcm9wZXJ0aWVzOwotICBzaXplX3QgcHJvcGVydHlfY291bnQ7Ci19IHRzaV9wZWVyOwotCi0vKiBEZXN0cnVjdHMgdGhlIHRzaV9wZWVyIG9iamVjdC4gKi8KLXZvaWQgdHNpX3BlZXJfZGVzdHJ1Y3QodHNpX3BlZXIgKnNlbGYpOwotCi0vKiAtLS0gdHNpX2hhbmRzaGFrZXIgb2JqZWN0cyAtLS0tCi0KLSAgIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG9iamVjdCBtdXN0IGJlIHRocmVhZCBjb21wYXRpYmxlLgotCi0gICBBIHR5cGljYWwgdXNhZ2Ugb2YgdGhpcyBvYmplY3Qgd291bGQgYmU6Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgdHNpX3Jlc3VsdCByZXN1bHQgPSBUU0lfT0s7Ci0gICB1bnNpZ25lZCBjaGFyIGJ1Zls0MDk2XTsKLSAgIHNpemVfdCBidWZfb2Zmc2V0OwotICAgc2l6ZV90IGJ1Zl9zaXplOwotICAgd2hpbGUgKDEpIHsKLSAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc2VuZCBzb21lIGJ5dGVzIHRvIHRoZSBwZWVyLgotICAgICBkbyB7Ci0gICAgICAgc2l6ZV90IGJ1Zl9zaXplX3RvX3NlbmQgPSBzaXplb2YoYnVmKTsKLSAgICAgICByZXN1bHQgPSB0c2lfaGFuZHNoYWtlcl9nZXRfYnl0ZXNfdG9fc2VuZF90b19wZWVyKGhhbmRzaGFrZXIsIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfc2l6ZV90b19zZW5kKTsKLSAgICAgICBpZiAoYnVmX3NpemVfdG9fc2VuZCA+IDApIHNlbmRfYnl0ZXNfdG9fcGVlcihidWYsIGJ1Zl9zaXplX3RvX3NlbmQpOwotICAgICB9IHdoaWxlIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSk7Ci0gICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OwotICAgICBpZiAoIXRzaV9oYW5kc2hha2VyX2lzX2luX3Byb2dyZXNzKGhhbmRzaGFrZXIpKSBicmVhazsKLQotICAgICBkbyB7Ci0gICAgICAgLy8gUmVhZCBieXRlcyBmcm9tIHRoZSBwZWVyLgotICAgICAgIGJ1Zl9zaXplID0gc2l6ZW9mKGJ1Zik7Ci0gICAgICAgYnVmX29mZnNldCA9IDA7Ci0gICAgICAgcmVhZF9ieXRlc19mcm9tX3BlZXIoYnVmLCAmYnVmX3NpemUpOwotICAgICAgIGlmIChidWZfc2l6ZSA9PSAwKSBicmVhazsKLQotICAgICAgIC8vIFByb2Nlc3MgdGhlIGJ5dGVzIGZyb20gdGhlIHBlZXIuIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhcyB0aGVzZSBieXRlcwotICAgICAgIC8vIG1heSBjb250YWluIG5vbi1oYW5kc2hha2UgZGF0YSAocHJvdGVjdGVkIGRhdGEpLiBJZiB0aGlzIGlzIHRoZSBjYXNlLAotICAgICAgIC8vIHdlIHdpbGwgZXhpdCBmcm9tIHRoZSBsb29wIHdpdGggYnVmX3NpemUgPiAwLgotICAgICAgIHNpemVfdCBjb25zdW1lZF9ieV9oYW5kc2hha2VyID0gYnVmX3NpemU7Ci0gICAgICAgcmVzdWx0ID0gdHNpX2hhbmRzaGFrZXJfcHJvY2Vzc19ieXRlc19mcm9tX3BlZXIoCi0gICAgICAgICAgIGhhbmRzaGFrZXIsIGJ1ZiwgJmNvbnN1bWVkX2J5X2hhbmRzaGFrZXIpOwotICAgICAgIGJ1Zl9zaXplIC09IGNvbnN1bWVkX2J5X2hhbmRzaGFrZXI7Ci0gICAgICAgYnVmX29mZnNldCArPSBjb25zdW1lZF9ieV9oYW5kc2hha2VyOwotICAgICB9IHdoaWxlIChyZXN1bHQgPT0gVFNJX0lOQ09NUExFVEVfREFUQSk7Ci0KLSAgICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7Ci0gICAgIGlmICghdHNpX2hhbmRzaGFrZXJfaXNfaW5fcHJvZ3Jlc3MoaGFuZHNoYWtlcikpIGJyZWFrOwotICAgfQotCi0gICAvLyBDaGVjayB0aGUgUGVlci4KLSAgIHRzaV9wZWVyIHBlZXI7Ci0gICBkbyB7Ci0gICAgIHJlc3VsdCA9IHRzaV9oYW5kc2hha2VyX2V4dHJhY3RfcGVlcihoYW5kc2hha2VyLCAmcGVlcik7Ci0gICAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSBicmVhazsKLSAgICAgcmVzdWx0ID0gY2hlY2tfcGVlcigmcGVlcik7Ci0gICB9IHdoaWxlICgwKTsKLSAgIHRzaV9wZWVyX2Rlc3RydWN0KCZwZWVyKTsKLSAgIGlmIChyZXN1bHQgIT0gVFNJX09LKSByZXR1cm4gcmVzdWx0OwotCi0gICAvLyBDcmVhdGUgdGhlIHByb3RlY3Rvci4KLSAgIHRzaV9mcmFtZV9wcm90ZWN0b3IqIHByb3RlY3RvciA9IE5VTEw7Ci0gICByZXN1bHQgPSB0c2lfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yKGhhbmRzaGFrZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0b3IpOwotICAgaWYgKHJlc3VsdCAhPSBUU0lfT0spIHJldHVybiByZXN1bHQ7Ci0KLSAgIC8vIERvIG5vdCBmb3JnZXQgdG8gdW5wcm90ZWN0IG91dHN0YW5kaW5nIGRhdGEgaWYgYW55LgotICAgaWYgKGJ1Zl9zaXplID4gMCkgewotICAgICByZXN1bHQgPSB0c2lfZnJhbWVfcHJvdGVjdG9yX3VucHJvdGVjdChwcm90ZWN0b3IsIGJ1ZiArIGJ1Zl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCAuLi4sIC4uLik7Ci0gICAgIC4uLi4KLSAgIH0KLSAgIC4uLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KLXR5cGVkZWYgc3RydWN0IHRzaV9oYW5kc2hha2VyIHRzaV9oYW5kc2hha2VyOwotCi0vKiBHZXRzIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBzZW50IHRvIHRoZSBwZWVyLgotICAgLSBieXRlcyBpcyB0aGUgYnVmZmVyIHRoYXQgd2lsbCBiZSB3cml0dGVuIHdpdGggdGhlIGRhdGEgdG8gYmUgc2VudCB0byB0aGUKLSAgICAgcGVlci4KLSAgIC0gYnl0ZXNfc2l6ZSBpcyBhbiBpbnB1dC9vdXRwdXQgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNhcGFjaXR5IG9mIHRoZQotICAgICBieXRlcyBwYXJhbWV0ZXIgYXMgaW5wdXQgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBhcyBvdXRwdXQuCi0gICBSZXR1cm5zIFRTSV9PSyBpZiBhbGwgdGhlIGRhdGEgdG8gc2VuZCB0byB0aGUgcGVlciBoYXMgYmVlbiB3cml0dGVuIG9yIGlmCi0gICBub3RoaW5nIGhhcyB0byBiZSBzZW50IHRvIHRoZSBwZWVyIChpbiB3aGljaCBiYXNlIGJ5dGVzX3NpemUgb3V0cHV0cyB0byAwKSwKLSAgIG90aGVyd2lzZSByZXR1cm5zIFRTSV9JTkNPTVBMRVRFX0RBVEEgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhpcyBtZXRob2QKLSAgIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbiB0byBnZXQgYWxsIHRoZSBieXRlcyB0byBzZW5kIHRvIHRoZSBwZWVyICh0aGVyZQotICAgd2FzIG1vcmUgZGF0YSB0byB3cml0ZSB0aGFuIHRoZSBzcGVjaWZpZWQgYnl0ZXNfc2l6ZSkuIEluIGNhc2Ugb2YgYSBmYXRhbAotICAgZXJyb3IgaW4gdGhlIGhhbmRzaGFrZSwgYW5vdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIHJldHVybmVkLiAgKi8KLXRzaV9yZXN1bHQgdHNpX2hhbmRzaGFrZXJfZ2V0X2J5dGVzX3RvX3NlbmRfdG9fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzX3NpemUpOwotCi0vKiBQcm9jZXNzZXMgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlci4KLSAgIC0gYnl0ZXMgaXMgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhLgotICAgLSBieXRlc19zaXplIGlzIGFuIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhcwotICAgICBpbnB1dCBhbmQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcyBvdXRwdXQuCi0gICBSZXR1cm4gVFNJX09LIGlmIHRoZSBoYW5kc2hha2UgaGFzIGFsbCB0aGUgZGF0YSBpdCBuZWVkcyB0byBwcm9jZXNzLAotICAgb3RoZXJ3aXNlIHJldHVybiBUU0lfSU5DT01QTEVURV9EQVRBIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgbWV0aG9kCi0gICBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdG8gY29tcGxldGUgdGhlIGRhdGEgbmVlZGVkIGZvciBwcm9jZXNzaW5nLiBJbgotICAgY2FzZSBvZiBhIGZhdGFsIGVycm9yIGluIHRoZSBoYW5kc2hha2UsIGFub3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcwotICAgcmV0dXJuZWQuICAqLwotdHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9wcm9jZXNzX2J5dGVzX2Zyb21fcGVlcih0c2lfaGFuZHNoYWtlciAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNfc2l6ZSk7Ci0KLS8qIEdldHMgdGhlIHJlc3VsdCBvZiB0aGUgaGFuZHNoYWtlci4KLSAgIFJldHVybnMgVFNJX09LIGlmIHRoZSBoYW5zaGFrZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGVyZSBoYXMgYmVlbiBubwotICAgZXJyb3JzLiBSZXR1cm5zIFRTSV9IQU5EU0hBS0VfSU5fUFJPR1JFU1MgaWYgdGhlIGhhbmRzaGFrZXIgaXMgbm90IGRvbmUgeWV0Ci0gICBidXQgbm8gZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQgc28gZmFyLiBPdGhlcndpc2UgdGhlIGhhbmRzaGFrZXIgZmFpbGVkCi0gICB3aXRoIHRoZSByZXR1cm5lZCBlcnJvci4gICovCi10c2lfcmVzdWx0IHRzaV9oYW5kc2hha2VyX2dldF9yZXN1bHQodHNpX2hhbmRzaGFrZXIgKnNlbGYpOwotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIGhhbmRzaGFrZSBpcyBpbiBwcm9ncmVzcywgMCBvdGhlcndpc2UuICAqLwotI2RlZmluZSB0c2lfaGFuZHNoYWtlcl9pc19pbl9wcm9ncmVzcyhoKSBcCi0gICh0c2lfaGFuZHNoYWtlcl9nZXRfcmVzdWx0KChoKSkgPT0gVFNJX0hBTkRTSEFLRV9JTl9QUk9HUkVTUykKLQotLyogVGhpcyBtZXRob2QgbWF5IHJldHVybiBUU0lfRkFJTEVEX1BSRUNPTkRJVElPTiBpZgotICAgdHNpX2hhbmRzaGFrZXJfaXNfaW5fcHJvZ3Jlc3MgcmV0dXJucyAxLCBpdCByZXR1cm5zIFRTSV9PSyBvdGhlcndpc2UKLSAgIGFzc3VtaW5nIHRoZSBoYW5kc2hha2VyIGlzIG5vdCBpbiBhIGZhdGFsIGVycm9yIHN0YXRlLgotICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVzdHJ1Y3RpbmcgdGhlIHBlZXIuICAqLwotdHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9leHRyYWN0X3BlZXIodHNpX2hhbmRzaGFrZXIgKnNlbGYsIHRzaV9wZWVyICpwZWVyKTsKLQotLyogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHRzaV9mcmFtZV9wcm90ZWN0b3Igb2JqZWN0IGFmdGVyIHRoZSBoYW5kc2hha2UgcGhhc2UKLSAgIGlzIGRvbmUuIEFmdGVyIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHksIHRoZSBvbmx5IG1ldGhvZAotICAgdGhhdCBjYW4gYmUgY2FsbGVkIG9uIHRoaXMgb2JqZWN0IGlzIERlc3Ryb3kuCi0gICAtIG1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemUgaXMgYW4gaW5wdXQvb3V0cHV0IHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZQotICAgICBkZXNpcmVkIG1heCBvdXRwdXQgcHJvdGVjdGVkIGZyYW1lIHNpemUgYXMgaW5wdXQgYW5kIG91dHB1dGluZyB0aGUgYWN0dWFsCi0gICAgIG1heCBvdXRwdXQgZnJhbWUgc2l6ZSBhcyB0aGUgb3V0cHV0LiBQYXNzaW5nIE5VTEwgaXMgT0sgYW5kIHdpbGwgcmVzdWx0IGluCi0gICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBjaG9vc2luZyB0aGUgZGVmYXVsdCBtYXhpbXVtIHByb3RlY3RlZCBmcmFtZSBzaXplLiBOb3RlCi0gICAgIHRoYXQgdGhpcyBzaXplIG9ubHkgYXBwbGllcyB0byBvdXRnb2luZyBmcmFtZXMgKGdlbmVyYXRlZCB3aXRoCi0gICAgIHRzaV9mcmFtZV9wcm90ZWN0b3JfcHJvdGVjdCkgYW5kIG5vdCBpbmNvbWluZyBmcmFtZXMgKGlucHV0IG9mCi0gICAgIHRzaV9mcmFtZV9wcm90ZWN0b3JfdW5wcm90ZWN0KS4KLSAgIC0gcHJvdGVjdG9yIGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgcG9pbnRpbmcgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKLSAgICAgdHNpX2ZyYW1lX3Byb3RlY3RvciBvYmplY3QuCi0gICBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIFRTSV9GQUlMRURfUFJFQ09ORElUSU9OIGlmCi0gICB0c2lfaGFuZHNoYWtlcl9pc19pbl9wcm9ncmVzcyByZXR1cm5zIDEsIGl0IHJldHVybnMgVFNJX09LIG90aGVyd2lzZSBhc3N1bWluZwotICAgdGhlIGhhbmRzaGFrZXIgaXMgbm90IGluIGEgZmF0YWwgZXJyb3Igc3RhdGUuCi0gICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZXN0cm95aW5nIHRoZSBwcm90ZWN0b3IuICAqLwotdHNpX3Jlc3VsdCB0c2lfaGFuZHNoYWtlcl9jcmVhdGVfZnJhbWVfcHJvdGVjdG9yKAotICAgIHRzaV9oYW5kc2hha2VyICpzZWxmLCBzaXplX3QgKm1heF9vdXRwdXRfcHJvdGVjdGVkX2ZyYW1lX3NpemUsCi0gICAgdHNpX2ZyYW1lX3Byb3RlY3RvciAqKnByb3RlY3Rvcik7Ci0KLS8qIFRoaXMgbWV0aG9kIHJlbGVhc2VzIHRoZSB0c2lfaGFuZHNoYWtlciBvYmplY3QuIEFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKLSAgIG5vIG90aGVyIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIHRoZSBvYmplY3QuICAqLwotdm9pZCB0c2lfaGFuZHNoYWtlcl9kZXN0cm95KHRzaV9oYW5kc2hha2VyICpzZWxmKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdSUENfQ09SRV9UU0lfVFJBTlNQT1JUX1NFQ1VSSVRZX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9zcmMvY3BwL2NsaWVudC9jaGFubmVsLmNjIGIvc3JjL2NwcC9jbGllbnQvY2hhbm5lbC5jYwppbmRleCBhZTIwMzkyLi5mMTc0Njc2IDEwMDY0NAotLS0gYS9zcmMvY3BwL2NsaWVudC9jaGFubmVsLmNjCisrKyBiL3NyYy9jcHAvY2xpZW50L2NoYW5uZWwuY2MKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxncnBjL2dycGMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCiAKIG5hbWVzcGFjZSBncnBjIHsKIApkaWZmIC0tZ2l0IGEvc3JjL2NwcC9jbGllbnQvY2xpZW50X2NvbnRleHQuY2MgYi9zcmMvY3BwL2NsaWVudC9jbGllbnRfY29udGV4dC5jYwppbmRleCBkYjYzNmE1Li5kZThiMmRiIDEwMDY0NAotLS0gYS9zcmMvY3BwL2NsaWVudC9jbGllbnRfY29udGV4dC5jYworKysgYi9zcmMvY3BwL2NsaWVudC9jbGllbnRfY29udGV4dC5jYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKICNpbmNsdWRlICJzcmMvY3BwL2NvbW1vbi9jcmVhdGVfYXV0aF9jb250ZXh0LmgiCiAKIG5hbWVzcGFjZSBncnBjIHsKZGlmZiAtLWdpdCBhL3NyYy9jcHAvY29tbW9uL2NoYW5uZWxfYXJndW1lbnRzLmNjIGIvc3JjL2NwcC9jb21tb24vY2hhbm5lbF9hcmd1bWVudHMuY2MKaW5kZXggZDdmYWE1ZS4uM2JkYjQzOSAxMDA2NDQKLS0tIGEvc3JjL2NwcC9jb21tb24vY2hhbm5lbF9hcmd1bWVudHMuY2MKKysrIGIvc3JjL2NwcC9jb21tb24vY2hhbm5lbF9hcmd1bWVudHMuY2MKQEAgLTM2LDcgKzM2LDcgQEAKIAogI2luY2x1ZGUgPGdycGMvaW1wbC9jb2RlZ2VuL2dycGNfdHlwZXMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKIAogbmFtZXNwYWNlIGdycGMgewogCmRpZmYgLS1naXQgYS9zcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uY2MgYi9zcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uY2MKaW5kZXggNDVlOWUyNy4uMzNhOGY3NSAxMDA2NDQKLS0tIGEvc3JjL2NwcC9jb21tb24vY29yZV9jb2RlZ2VuLmNjCisrKyBiL3NyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5jYwpAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZV9idWZmZXIuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgogCiBuYW1lc3BhY2UgewogCmRpZmYgLS1naXQgYS9zcmMvY3BwL2NvbW1vbi9zZWN1cmVfY2hhbm5lbF9hcmd1bWVudHMuY2MgYi9zcmMvY3BwL2NvbW1vbi9zZWN1cmVfY2hhbm5lbF9hcmd1bWVudHMuY2MKaW5kZXggZTE3ZDNiNS4uODJlMDJmMCAxMDA2NDQKLS0tIGEvc3JjL2NwcC9jb21tb24vc2VjdXJlX2NoYW5uZWxfYXJndW1lbnRzLmNjCisrKyBiL3NyYy9jcHAvY29tbW9uL3NlY3VyZV9jaGFubmVsX2FyZ3VtZW50cy5jYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxncnBjKysvc3VwcG9ydC9jaGFubmVsX2FyZ3VtZW50cy5oPgogCiAjaW5jbHVkZSA8Z3JwYy9ncnBjX3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKIAogbmFtZXNwYWNlIGdycGMgewogCmRpZmYgLS1naXQgYS9zcmMvY3BwL3NlcnZlci9zZXJ2ZXIuY2MgYi9zcmMvY3BwL3NlcnZlci9zZXJ2ZXIuY2MKaW5kZXggNmQzMWE2MC4uN2U1ZjU1NyAxMDA2NDQKLS0tIGEvc3JjL2NwcC9zZXJ2ZXIvc2VydmVyLmNjCisrKyBiL3NyYy9jcHAvc2VydmVyL3NlcnZlci5jYwpAQCAtNDksNyArNDksNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIgogI2luY2x1ZGUgInNyYy9jcHAvc2VydmVyL3RocmVhZF9wb29sX2ludGVyZmFjZS5oIgogCiBuYW1lc3BhY2UgZ3JwYyB7CmRpZmYgLS1naXQgYS9zcmMvY3BwL3NlcnZlci9zZXJ2ZXJfY29udGV4dC5jYyBiL3NyYy9jcHAvc2VydmVyL3NlcnZlcl9jb250ZXh0LmNjCmluZGV4IDVkMTJjZTIuLjA0MjI2NTAgMTAwNjQ0Ci0tLSBhL3NyYy9jcHAvc2VydmVyL3NlcnZlcl9jb250ZXh0LmNjCisrKyBiL3NyYy9jcHAvc2VydmVyL3NlcnZlcl9jb250ZXh0LmNjCkBAIC00Miw4ICs0Miw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiCiAjaW5jbHVkZSAic3JjL2NwcC9jb21tb24vY3JlYXRlX2F1dGhfY29udGV4dC5oIgogCiBuYW1lc3BhY2UgZ3JwYyB7CmRpZmYgLS1naXQgYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL0JlbmNobWFya1NlcnZpY2VJbXBsLmNzIGIvc3JjL2NzaGFycC9HcnBjLkludGVncmF0aW9uVGVzdGluZy9CZW5jaG1hcmtTZXJ2aWNlSW1wbC5jcwppbmRleCA0N2ExNTIyLi4xZWRlZWRhIDEwMDY0NAotLS0gYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL0JlbmNobWFya1NlcnZpY2VJbXBsLmNzCisrKyBiL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvQmVuY2htYXJrU2VydmljZUltcGwuY3MKQEAgLTEsNiArMSw2IEBACiAjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKIAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisvLyBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ2LDE2ICs0NiwxMyBAQAogICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgcHVibGljIGNsYXNzIEJlbmNobWFya1NlcnZpY2VJbXBsIDogQmVuY2htYXJrU2VydmljZS5JQmVuY2htYXJrU2VydmljZQogICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgcmVzcG9uc2VTaXplOwotCi0gICAgICAgIHB1YmxpYyBCZW5jaG1hcmtTZXJ2aWNlSW1wbChpbnQgcmVzcG9uc2VTaXplKQorICAgICAgICBwdWJsaWMgQmVuY2htYXJrU2VydmljZUltcGwoKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlc3BvbnNlU2l6ZSA9IHJlc3BvbnNlU2l6ZTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBUYXNrPFNpbXBsZVJlc3BvbnNlPiBVbmFyeUNhbGwoU2ltcGxlUmVxdWVzdCByZXF1ZXN0LCBTZXJ2ZXJDYWxsQ29udGV4dCBjb250ZXh0KQogICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2ltcGxlUmVzcG9uc2UgeyBQYXlsb2FkID0gQ3JlYXRlWmVyb3NQYXlsb2FkKHJlc3BvbnNlU2l6ZSkgfTsKKyAgICAgICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaW1wbGVSZXNwb25zZSB7IFBheWxvYWQgPSBDcmVhdGVaZXJvc1BheWxvYWQocmVxdWVzdC5SZXNwb25zZVNpemUpIH07CiAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHJlc3BvbnNlKTsKICAgICAgICAgfQogCkBAIC02Myw3ICs2MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGF3YWl0IHJlcXVlc3RTdHJlYW0uRm9yRWFjaEFzeW5jKGFzeW5jIHJlcXVlc3QgPT4KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2ltcGxlUmVzcG9uc2UgeyBQYXlsb2FkID0gQ3JlYXRlWmVyb3NQYXlsb2FkKHJlc3BvbnNlU2l6ZSkgfTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgU2ltcGxlUmVzcG9uc2UgeyBQYXlsb2FkID0gQ3JlYXRlWmVyb3NQYXlsb2FkKHJlcXVlc3QuUmVzcG9uc2VTaXplKSB9OwogICAgICAgICAgICAgICAgIGF3YWl0IHJlc3BvbnNlU3RyZWFtLldyaXRlQXN5bmMocmVzcG9uc2UpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvQ2xpZW50UnVubmVycy5jcyBiL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvQ2xpZW50UnVubmVycy5jcwppbmRleCBjNDAxNjAxLi5lNmRjMjMyIDEwMDY0NAotLS0gYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL0NsaWVudFJ1bm5lcnMuY3MKKysrIGIvc3JjL2NzaGFycC9HcnBjLkludGVncmF0aW9uVGVzdGluZy9DbGllbnRSdW5uZXJzLmNzCkBAIC00MSw2ICs0MSw3IEBACiB1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwogdXNpbmcgR29vZ2xlLlByb3RvYnVmOwogdXNpbmcgR3JwYy5Db3JlOwordXNpbmcgR3JwYy5Db3JlLkxvZ2dpbmc7CiB1c2luZyBHcnBjLkNvcmUuVXRpbHM7CiB1c2luZyBOVW5pdC5GcmFtZXdvcms7CiB1c2luZyBHcnBjLlRlc3Rpbmc7CkBAIC01MCw0MiArNTEsNjUgQEAKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIEhlbHBlciBtZXRob2RzIHRvIHN0YXJ0IGNsaWVudCBydW5uZXJzIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRSdW5uZXJzCisgICAgcHVibGljIGNsYXNzIENsaWVudFJ1bm5lcnMKICAgICB7CisgICAgICAgIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IEdycGNFbnZpcm9ubWVudC5Mb2dnZXIuRm9yVHlwZTxDbGllbnRSdW5uZXJzPigpOworCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIENyZWF0ZXMgYSBzdGFydGVkIGNsaWVudCBydW5uZXIuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgSUNsaWVudFJ1bm5lciBDcmVhdGVTdGFydGVkKENsaWVudENvbmZpZyBjb25maWcpCiAgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5EZWJ1ZygiQ2xpZW50Q29uZmlnOiB7MH0iLCBjb25maWcpOwogICAgICAgICAgICAgc3RyaW5nIHRhcmdldCA9IGNvbmZpZy5TZXJ2ZXJUYXJnZXRzLlNpbmdsZSgpOwotICAgICAgICAgICAgR3JwY1ByZWNvbmRpdGlvbnMuQ2hlY2tBcmd1bWVudChjb25maWcuTG9hZFBhcmFtcy5Mb2FkQ2FzZSA9PSBMb2FkUGFyYW1zLkxvYWRPbmVvZkNhc2UuQ2xvc2VkTG9vcCk7CisgICAgICAgICAgICBHcnBjUHJlY29uZGl0aW9ucy5DaGVja0FyZ3VtZW50KGNvbmZpZy5Mb2FkUGFyYW1zLkxvYWRDYXNlID09IExvYWRQYXJhbXMuTG9hZE9uZW9mQ2FzZS5DbG9zZWRMb29wLAorICAgICAgICAgICAgICAgICJPbmx5IGNsb3NlZCBsb29wIHNjZW5hcmlvIHN1cHBvcnRlZCBmb3IgQyMiKTsKKyAgICAgICAgICAgIEdycGNQcmVjb25kaXRpb25zLkNoZWNrQXJndW1lbnQoY29uZmlnLkNsaWVudENoYW5uZWxzID09IDEsICJDbGllbnRDb25maWcuQ2xpZW50Q2hhbm5lbHMgbmVlZHMgdG8gYmUgMSIpOworCisgICAgICAgICAgICBpZiAoY29uZmlnLk91dHN0YW5kaW5nUnBjc1BlckNoYW5uZWwgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuV2FybmluZygiQ2xpZW50Q29uZmlnLk91dHN0YW5kaW5nUnBjc1BlckNoYW5uZWwgaXMgbm90IHN1cHBvcnRlZCBmb3IgQyMuIElnbm9yaW5nIHRoZSB2YWx1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbmZpZy5Bc3luY0NsaWVudFRocmVhZHMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuV2FybmluZygiQ2xpZW50Q29uZmlnLkFzeW5jQ2xpZW50VGhyZWFkcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBDIy4gSWdub3JpbmcgdGhlIHZhbHVlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29uZmlnLkNvcmVMaW1pdCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKCJDbGllbnRDb25maWcuQ29yZUxpbWl0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEMjLiBJZ25vcmluZyB0aGUgdmFsdWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWcuQ29yZUxpc3QuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKCJDbGllbnRDb25maWcuQ29yZUxpc3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgQyMuIElnbm9yaW5nIHRoZSB2YWx1ZSIpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2YXIgY3JlZGVudGlhbHMgPSBjb25maWcuU2VjdXJpdHlQYXJhbXMgIT0gbnVsbCA/IFRlc3RDcmVkZW50aWFscy5DcmVhdGVTc2xDcmVkZW50aWFscygpIDogQ2hhbm5lbENyZWRlbnRpYWxzLkluc2VjdXJlOwotICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgQ2hhbm5lbCh0YXJnZXQsIGNyZWRlbnRpYWxzKTsKLQotICAgICAgICAgICAgc3dpdGNoIChjb25maWcuUnBjVHlwZSkKKyAgICAgICAgICAgIExpc3Q8Q2hhbm5lbE9wdGlvbj4gY2hhbm5lbE9wdGlvbnMgPSBudWxsOworICAgICAgICAgICAgaWYgKGNvbmZpZy5TZWN1cml0eVBhcmFtcyAhPSBudWxsICYmIGNvbmZpZy5TZWN1cml0eVBhcmFtcy5TZXJ2ZXJIb3N0T3ZlcnJpZGUgIT0gIiIpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBScGNUeXBlLlVOQVJZOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNVbmFyeUNsaWVudFJ1bm5lcihjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlBheWxvYWRDb25maWcuU2ltcGxlUGFyYW1zLlJlcVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuSGlzdG9ncmFtUGFyYW1zKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgUnBjVHlwZS5TVFJFQU1JTkc6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBScGNUeXBlLiIpOworICAgICAgICAgICAgICAgIGNoYW5uZWxPcHRpb25zID0gbmV3IExpc3Q8Q2hhbm5lbE9wdGlvbj4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDaGFubmVsT3B0aW9uKENoYW5uZWxPcHRpb25zLlNzbFRhcmdldE5hbWVPdmVycmlkZSwgY29uZmlnLlNlY3VyaXR5UGFyYW1zLlNlcnZlckhvc3RPdmVycmlkZSkKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgQ2hhbm5lbCh0YXJnZXQsIGNyZWRlbnRpYWxzLCBjaGFubmVsT3B0aW9ucyk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50UnVubmVySW1wbChjaGFubmVsLAorICAgICAgICAgICAgICAgIGNvbmZpZy5DbGllbnRUeXBlLAorICAgICAgICAgICAgICAgIGNvbmZpZy5ScGNUeXBlLAorICAgICAgICAgICAgICAgIGNvbmZpZy5QYXlsb2FkQ29uZmlnLAorICAgICAgICAgICAgICAgIGNvbmZpZy5IaXN0b2dyYW1QYXJhbXMpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDbGllbnQgdGhhdCBzdGFydHMgc3luY2hyb25vdXMgdW5hcnkgY2FsbHMgaW4gYSBjbG9zZWQgbG9vcC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBTeW5jVW5hcnlDbGllbnRSdW5uZXIgOiBJQ2xpZW50UnVubmVyCisgICAgcHVibGljIGNsYXNzIENsaWVudFJ1bm5lckltcGwgOiBJQ2xpZW50UnVubmVyCiAgICAgewogICAgICAgICBjb25zdCBkb3VibGUgU2Vjb25kc1RvTmFub3MgPSAxZTk7CiAKICAgICAgICAgcmVhZG9ubHkgQ2hhbm5lbCBjaGFubmVsOwotICAgICAgICByZWFkb25seSBpbnQgcGF5bG9hZFNpemU7CisgICAgICAgIHJlYWRvbmx5IENsaWVudFR5cGUgY2xpZW50VHlwZTsKKyAgICAgICAgcmVhZG9ubHkgUnBjVHlwZSBycGNUeXBlOworICAgICAgICByZWFkb25seSBQYXlsb2FkQ29uZmlnIHBheWxvYWRDb25maWc7CiAgICAgICAgIHJlYWRvbmx5IEhpc3RvZ3JhbSBoaXN0b2dyYW07CiAKICAgICAgICAgcmVhZG9ubHkgQmVuY2htYXJrU2VydmljZS5JQmVuY2htYXJrU2VydmljZUNsaWVudCBjbGllbnQ7CkBAIC05MywxNSArMTE3LDE5IEBACiAgICAgICAgIHJlYWRvbmx5IENhbmNlbGxhdGlvblRva2VuU291cmNlIHN0b3BwZWRDdHM7CiAgICAgICAgIHJlYWRvbmx5IFdhbGxDbG9ja1N0b3B3YXRjaCB3YWxsQ2xvY2tTdG9wd2F0Y2ggPSBuZXcgV2FsbENsb2NrU3RvcHdhdGNoKCk7CiAgICAgICAgIAotICAgICAgICBwdWJsaWMgU3luY1VuYXJ5Q2xpZW50UnVubmVyKENoYW5uZWwgY2hhbm5lbCwgaW50IHBheWxvYWRTaXplLCBIaXN0b2dyYW1QYXJhbXMgaGlzdG9ncmFtUGFyYW1zKQorICAgICAgICBwdWJsaWMgQ2xpZW50UnVubmVySW1wbChDaGFubmVsIGNoYW5uZWwsIENsaWVudFR5cGUgY2xpZW50VHlwZSwgUnBjVHlwZSBycGNUeXBlLCBQYXlsb2FkQ29uZmlnIHBheWxvYWRDb25maWcsIEhpc3RvZ3JhbVBhcmFtcyBoaXN0b2dyYW1QYXJhbXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IEdycGNQcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChjaGFubmVsKTsKLSAgICAgICAgICAgIHRoaXMucGF5bG9hZFNpemUgPSBwYXlsb2FkU2l6ZTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VHlwZSA9IGNsaWVudFR5cGU7CisgICAgICAgICAgICB0aGlzLnJwY1R5cGUgPSBycGNUeXBlOworICAgICAgICAgICAgdGhpcy5wYXlsb2FkQ29uZmlnID0gcGF5bG9hZENvbmZpZzsKICAgICAgICAgICAgIHRoaXMuaGlzdG9ncmFtID0gbmV3IEhpc3RvZ3JhbShoaXN0b2dyYW1QYXJhbXMuUmVzb2x1dGlvbiwgaGlzdG9ncmFtUGFyYW1zLk1heFBvc3NpYmxlKTsKIAogICAgICAgICAgICAgdGhpcy5zdG9wcGVkQ3RzID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCk7CiAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IEJlbmNobWFya1NlcnZpY2UuTmV3Q2xpZW50KGNoYW5uZWwpOwotICAgICAgICAgICAgdGhpcy5ydW5uZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KFJ1biwgVGFza0NyZWF0aW9uT3B0aW9ucy5Mb25nUnVubmluZyk7CisKKyAgICAgICAgICAgIHZhciB0aHJlYWRCb2R5ID0gR2V0VGhyZWFkQm9keSgpOworICAgICAgICAgICAgdGhpcy5ydW5uZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KHRocmVhZEJvZHksIFRhc2tDcmVhdGlvbk9wdGlvbnMuTG9uZ1J1bm5pbmcpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIENsaWVudFN0YXRzIEdldFN0YXRzKGJvb2wgcmVzZXQpCkBAIC0xMjYsMTIgKzE1NCw5IEBACiAgICAgICAgICAgICBhd2FpdCBjaGFubmVsLlNodXRkb3duQXN5bmMoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBSdW4oKQorICAgICAgICBwcml2YXRlIHZvaWQgUnVuQ2xvc2VkTG9vcFVuYXJ5KCkKICAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgU2ltcGxlUmVxdWVzdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBheWxvYWQgPSBDcmVhdGVaZXJvc1BheWxvYWQocGF5bG9hZFNpemUpCi0gICAgICAgICAgICB9OworICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBDcmVhdGVTaW1wbGVSZXF1ZXN0KCk7CiAgICAgICAgICAgICB2YXIgc3RvcHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOwogCiAgICAgICAgICAgICB3aGlsZSAoIXN0b3BwZWRDdHMuVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCkBAIC0xNDUsNiArMTcwLDEyNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJ1bkNsb3NlZExvb3BVbmFyeUFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBDcmVhdGVTaW1wbGVSZXF1ZXN0KCk7CisgICAgICAgICAgICB2YXIgc3RvcHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOworCisgICAgICAgICAgICB3aGlsZSAoIXN0b3BwZWRDdHMuVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcHdhdGNoLlJlc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuVW5hcnlDYWxsQXN5bmMocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgc3RvcHdhdGNoLlN0b3AoKTsKKworICAgICAgICAgICAgICAgIC8vIHNwZWMgcmVxdWlyZXMgZGF0YSBwb2ludCBpbiBuYW5vc2Vjb25kcy4KKyAgICAgICAgICAgICAgICBoaXN0b2dyYW0uQWRkT2JzZXJ2YXRpb24oc3RvcHdhdGNoLkVsYXBzZWQuVG90YWxTZWNvbmRzICogU2Vjb25kc1RvTmFub3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJ1bkNsb3NlZExvb3BTdHJlYW1pbmdBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gQ3JlYXRlU2ltcGxlUmVxdWVzdCgpOworICAgICAgICAgICAgdmFyIHN0b3B3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBjYWxsID0gY2xpZW50LlN0cmVhbWluZ0NhbGwoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3BwZWRDdHMuVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdG9wd2F0Y2guUmVzdGFydCgpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWxsLlJlcXVlc3RTdHJlYW0uV3JpdGVBc3luYyhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FsbC5SZXNwb25zZVN0cmVhbS5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgICAgICBzdG9wd2F0Y2guU3RvcCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNwZWMgcmVxdWlyZXMgZGF0YSBwb2ludCBpbiBuYW5vc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtLkFkZE9ic2VydmF0aW9uKHN0b3B3YXRjaC5FbGFwc2VkLlRvdGFsU2Vjb25kcyAqIFNlY29uZHNUb05hbm9zKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaW5pc2ggdGhlIHN0cmVhbWluZyBjYWxsCisgICAgICAgICAgICAgICAgYXdhaXQgY2FsbC5SZXF1ZXN0U3RyZWFtLkNvbXBsZXRlQXN5bmMoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhd2FpdCBjYWxsLlJlc3BvbnNlU3RyZWFtLk1vdmVOZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJ1bkdlbmVyaWNDbG9zZWRMb29wU3RyZWFtaW5nQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IENyZWF0ZUJ5dGVCdWZmZXJSZXF1ZXN0KCk7CisgICAgICAgICAgICB2YXIgc3RvcHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpOworCisgICAgICAgICAgICB2YXIgY2FsbERldGFpbHMgPSBuZXcgQ2FsbEludm9jYXRpb25EZXRhaWxzPGJ5dGVbXSwgYnl0ZVtdPihjaGFubmVsLCBHZW5lcmljU2VydmljZS5TdHJlYW1pbmdDYWxsTWV0aG9kLCBuZXcgQ2FsbE9wdGlvbnMoKSk7CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgY2FsbCA9IENhbGxzLkFzeW5jRHVwbGV4U3RyZWFtaW5nQ2FsbChjYWxsRGV0YWlscykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wcGVkQ3RzLlRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcHdhdGNoLlJlc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FsbC5SZXF1ZXN0U3RyZWFtLldyaXRlQXN5bmMocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNhbGwuUmVzcG9uc2VTdHJlYW0uTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcHdhdGNoLlN0b3AoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzcGVjIHJlcXVpcmVzIGRhdGEgcG9pbnQgaW4gbmFub3NlY29uZHMuCisgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbS5BZGRPYnNlcnZhdGlvbihzdG9wd2F0Y2guRWxhcHNlZC5Ub3RhbFNlY29uZHMgKiBTZWNvbmRzVG9OYW5vcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmluaXNoIHRoZSBzdHJlYW1pbmcgY2FsbAorICAgICAgICAgICAgICAgIGF3YWl0IGNhbGwuUmVxdWVzdFN0cmVhbS5Db21wbGV0ZUFzeW5jKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoYXdhaXQgY2FsbC5SZXNwb25zZVN0cmVhbS5Nb3ZlTmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQWN0aW9uIEdldFRocmVhZEJvZHkoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGF5bG9hZENvbmZpZy5QYXlsb2FkQ2FzZSA9PSBQYXlsb2FkQ29uZmlnLlBheWxvYWRPbmVvZkNhc2UuQnl0ZWJ1ZlBhcmFtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHcnBjUHJlY29uZGl0aW9ucy5DaGVja0FyZ3VtZW50KGNsaWVudFR5cGUgPT0gQ2xpZW50VHlwZS5BU1lOQ19DTElFTlQsICJHZW5lcmljIGNsaWVudCBvbmx5IHN1cHBvcnRzIGFzeW5jIEFQSSIpOworICAgICAgICAgICAgICAgIEdycGNQcmVjb25kaXRpb25zLkNoZWNrQXJndW1lbnQocnBjVHlwZSA9PSBScGNUeXBlLlNUUkVBTUlORywgIkdlbmVyaWMgY2xpZW50IG9ubHkgc3VwcG9ydHMgc3RyZWFtaW5nIGNhbGxzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSdW5HZW5lcmljQ2xvc2VkTG9vcFN0cmVhbWluZ0FzeW5jKCkuV2FpdCgpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdycGNQcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChwYXlsb2FkQ29uZmlnLlNpbXBsZVBhcmFtcyk7CisgICAgICAgICAgICBpZiAoY2xpZW50VHlwZSA9PSBDbGllbnRUeXBlLlNZTkNfQ0xJRU5UKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdycGNQcmVjb25kaXRpb25zLkNoZWNrQXJndW1lbnQocnBjVHlwZSA9PSBScGNUeXBlLlVOQVJZLCAiU3luYyBjbGllbnQgY2FuIG9ubHkgYmUgdXNlZCBmb3IgVW5hcnkgY2FsbHMgaW4gQyMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUnVuQ2xvc2VkTG9vcFVuYXJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBDbGllbnRUeXBlLkFTWU5DX0NMSUVOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJwY1R5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJwY1R5cGUuVU5BUlk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5DbG9zZWRMb29wVW5hcnlBc3luYygpLldhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUnBjVHlwZS5TVFJFQU1JTkc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5DbG9zZWRMb29wU3RyZWFtaW5nQXN5bmMoKS5XYWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2ltcGxlUmVxdWVzdCBDcmVhdGVTaW1wbGVSZXF1ZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgR3JwY1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHBheWxvYWRDb25maWcuU2ltcGxlUGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVxdWVzdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBheWxvYWQgPSBDcmVhdGVaZXJvc1BheWxvYWQocGF5bG9hZENvbmZpZy5TaW1wbGVQYXJhbXMuUmVxU2l6ZSksCisgICAgICAgICAgICAgICAgUmVzcG9uc2VTaXplID0gcGF5bG9hZENvbmZpZy5TaW1wbGVQYXJhbXMuUmVzcFNpemUKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBDcmVhdGVCeXRlQnVmZmVyUmVxdWVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVtwYXlsb2FkQ29uZmlnLkJ5dGVidWZQYXJhbXMuUmVxU2l6ZV07CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHN0YXRpYyBQYXlsb2FkIENyZWF0ZVplcm9zUGF5bG9hZChpbnQgc2l6ZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXlsb2FkIHsgQm9keSA9IEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbc2l6ZV0pIH07CmRpZmYgLS1naXQgYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL0dlbmVyaWNTZXJ2aWNlLmNzIGIvc3JjL2NzaGFycC9HcnBjLkludGVncmF0aW9uVGVzdGluZy9HZW5lcmljU2VydmljZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjEyODI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NzaGFycC9HcnBjLkludGVncmF0aW9uVGVzdGluZy9HZW5lcmljU2VydmljZS5jcwpAQCAtMCwwICsxLDcxIEBACisjcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKKworLy8gQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjZW5kcmVnaW9uCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgR29vZ2xlLlByb3RvYnVmOwordXNpbmcgR3JwYy5Db3JlOwordXNpbmcgR3JwYy5Db3JlLlV0aWxzOwordXNpbmcgTlVuaXQuRnJhbWV3b3JrOwordXNpbmcgR3JwYy5UZXN0aW5nOworCituYW1lc3BhY2UgR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFV0aWxpdHkgbWV0aG9kcyBmb3IgZGVmaW5pbmcgYW5kIGNhbGxpbmcgYSBzZXJ2aWNlIHRoYXQgZG9lc24ndCB1c2UgcHJvdG9idWZzCisgICAgLy8vIGZvciBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY1NlcnZpY2UKKyAgICB7CisgICAgICAgIHJlYWRvbmx5IHN0YXRpYyBNYXJzaGFsbGVyPGJ5dGVbXT4gQnl0ZUFycmF5TWFyc2hhbGxlciA9IG5ldyBNYXJzaGFsbGVyPGJ5dGVbXT4oKGIpID0+IGIsIChiKSA9PiBiKTsKKworICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGljIE1ldGhvZDxieXRlW10sIGJ5dGVbXT4gU3RyZWFtaW5nQ2FsbE1ldGhvZCA9IG5ldyBNZXRob2Q8Ynl0ZVtdLCBieXRlW10+KAorICAgICAgICAgICAgTWV0aG9kVHlwZS5EdXBsZXhTdHJlYW1pbmcsCisgICAgICAgICAgICAiZ3JwYy50ZXN0aW5nLkJlbmNobWFya1NlcnZpY2UiLAorICAgICAgICAgICAgIlN0cmVhbWluZ0NhbGwiLAorICAgICAgICAgICAgQnl0ZUFycmF5TWFyc2hhbGxlciwKKyAgICAgICAgICAgIEJ5dGVBcnJheU1hcnNoYWxsZXIKKyAgICAgICAgKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFNlcnZlclNlcnZpY2VEZWZpbml0aW9uIEJpbmRIYW5kbGVyKER1cGxleFN0cmVhbWluZ1NlcnZlck1ldGhvZDxieXRlW10sIGJ5dGVbXT4gaGFuZGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFNlcnZlclNlcnZpY2VEZWZpbml0aW9uLkNyZWF0ZUJ1aWxkZXIoU3RyZWFtaW5nQ2FsbE1ldGhvZC5TZXJ2aWNlTmFtZSkKKyAgICAgICAgICAgICAgICAuQWRkTWV0aG9kKFN0cmVhbWluZ0NhbGxNZXRob2QsIGhhbmRsZXIpLkJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nLmNzcHJvaiBiL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcuY3Nwcm9qCmluZGV4IDM3Mjk5MTMuLjRjMDQ5OTQgMTAwNjQ0Ci0tLSBhL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcuY3Nwcm9qCisrKyBiL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcuY3Nwcm9qCkBAIC0xMjAsNiArMTIwLDcgQEAKICAgICA8Q29tcGlsZSBJbmNsdWRlPSJXb3JrZXJTZXJ2aWNlSW1wbC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJRcHNXb3JrZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iV2FsbENsb2NrU3RvcHdhdGNoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkdlbmVyaWNTZXJ2aWNlLmNzIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CiAgIDxJdGVtR3JvdXA+CmRpZmYgLS1naXQgYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL1J1bm5lckNsaWVudFNlcnZlclRlc3QuY3MgYi9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL1J1bm5lckNsaWVudFNlcnZlclRlc3QuY3MKaW5kZXggMDZkNWVlOS4uYThjZjc1YiAxMDA2NDQKLS0tIGEvc3JjL2NzaGFycC9HcnBjLkludGVncmF0aW9uVGVzdGluZy9SdW5uZXJDbGllbnRTZXJ2ZXJUZXN0LmNzCisrKyBiL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvUnVubmVyQ2xpZW50U2VydmVyVGVzdC5jcwpAQCAtNTUsMTQgKzU1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdmFyIHNlcnZlckNvbmZpZyA9IG5ldyBTZXJ2ZXJDb25maWcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5BU1lOQ19TRVJWRVIsCi0gICAgICAgICAgICAgICAgUGF5bG9hZENvbmZpZyA9IG5ldyBQYXlsb2FkQ29uZmlnCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTaW1wbGVQYXJhbXMgPSBuZXcgU2ltcGxlUHJvdG9QYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUmVzcFNpemUgPSAxMDAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5BU1lOQ19TRVJWRVIKICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBzZXJ2ZXJSdW5uZXIgPSBTZXJ2ZXJSdW5uZXJzLkNyZWF0ZVN0YXJ0ZWQoc2VydmVyQ29uZmlnKTsKICAgICAgICAgfQpAQCAtODgsNyArODEsOCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGFyYW1zID0gbmV3IFNpbXBsZVByb3RvUGFyYW1zCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlcVNpemUgPSAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcVNpemUgPSAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNwU2l6ZSA9IDEwMAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBIaXN0b2dyYW1QYXJhbXMgPSBuZXcgSGlzdG9ncmFtUGFyYW1zCmRpZmYgLS1naXQgYS9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL1NlcnZlclJ1bm5lcnMuY3MgYi9zcmMvY3NoYXJwL0dycGMuSW50ZWdyYXRpb25UZXN0aW5nL1NlcnZlclJ1bm5lcnMuY3MKaW5kZXggNGE3MzY0NS4uYzMyNjM3OCAxMDA2NDQKLS0tIGEvc3JjL2NzaGFycC9HcnBjLkludGVncmF0aW9uVGVzdGluZy9TZXJ2ZXJSdW5uZXJzLmNzCisrKyBiL3NyYy9jc2hhcnAvR3JwYy5JbnRlZ3JhdGlvblRlc3RpbmcvU2VydmVyUnVubmVycy5jcwpAQCAtNDEsNiArNDEsNyBAQAogdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKIHVzaW5nIEdvb2dsZS5Qcm90b2J1ZjsKIHVzaW5nIEdycGMuQ29yZTsKK3VzaW5nIEdycGMuQ29yZS5Mb2dnaW5nOwogdXNpbmcgR3JwYy5Db3JlLlV0aWxzOwogdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwogdXNpbmcgR3JwYy5UZXN0aW5nOwpAQCAtNTAsMjcgKzUxLDc4IEBACiAgICAgLy8vIDxzdW1tYXJ5PgogICAgIC8vLyBIZWxwZXIgbWV0aG9kcyB0byBzdGFydCBzZXJ2ZXIgcnVubmVycyBmb3IgcGVyZm9ybWFuY2UgdGVzdGluZy4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVyUnVubmVycworICAgIHB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW5uZXJzCiAgICAgeworICAgICAgICBzdGF0aWMgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXIgPSBHcnBjRW52aXJvbm1lbnQuTG9nZ2VyLkZvclR5cGU8U2VydmVyUnVubmVycz4oKTsKKwogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBDcmVhdGVzIGEgc3RhcnRlZCBzZXJ2ZXIgcnVubmVyLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgc3RhdGljIElTZXJ2ZXJSdW5uZXIgQ3JlYXRlU3RhcnRlZChTZXJ2ZXJDb25maWcgY29uZmlnKQogICAgICAgICB7Ci0gICAgICAgICAgICBHcnBjUHJlY29uZGl0aW9ucy5DaGVja0FyZ3VtZW50KGNvbmZpZy5TZXJ2ZXJUeXBlID09IFNlcnZlclR5cGUuQVNZTkNfU0VSVkVSKTsKKyAgICAgICAgICAgIExvZ2dlci5EZWJ1ZygiU2VydmVyQ29uZmlnOiB7MH0iLCBjb25maWcpOwogICAgICAgICAgICAgdmFyIGNyZWRlbnRpYWxzID0gY29uZmlnLlNlY3VyaXR5UGFyYW1zICE9IG51bGwgPyBUZXN0Q3JlZGVudGlhbHMuQ3JlYXRlU3NsU2VydmVyQ3JlZGVudGlhbHMoKSA6IFNlcnZlckNyZWRlbnRpYWxzLkluc2VjdXJlOwogCi0gICAgICAgICAgICAvLyBUT0RPOiBxcHNfZHJpdmVyIG5lZWRzIHRvIHNldHVwIHBheWxvYWQgcHJvcGVybHkuLi4KLSAgICAgICAgICAgIGludCByZXNwb25zZVNpemUgPSBjb25maWcuUGF5bG9hZENvbmZpZyAhPSBudWxsID8gY29uZmlnLlBheWxvYWRDb25maWcuU2ltcGxlUGFyYW1zLlJlc3BTaXplIDogMDsKKyAgICAgICAgICAgIGlmIChjb25maWcuQXN5bmNTZXJ2ZXJUaHJlYWRzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoIlNlcnZlckNvbmZpZy5Bc3luY1NlcnZlclRocmVhZHMgaXMgbm90IHN1cHBvcnRlZCBmb3IgQyMuIElnbm9yaW5nIHRoZSB2YWx1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbmZpZy5Db3JlTGltaXQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuV2FybmluZygiU2VydmVyQ29uZmlnLkNvcmVMaW1pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDIy4gSWdub3JpbmcgdGhlIHZhbHVlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29uZmlnLkNvcmVMaXN0LkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuV2FybmluZygiU2VydmVyQ29uZmlnLkNvcmVMaXN0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEMjLiBJZ25vcmluZyB0aGUgdmFsdWUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VydmVyU2VydmljZURlZmluaXRpb24gc2VydmljZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29uZmlnLlNlcnZlclR5cGUgPT0gU2VydmVyVHlwZS5BU1lOQ19TRVJWRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR3JwY1ByZWNvbmRpdGlvbnMuQ2hlY2tBcmd1bWVudChjb25maWcuUGF5bG9hZENvbmZpZyA9PSBudWxsLAorICAgICAgICAgICAgICAgICAgICAiU2VydmVyQ29uZmlnLlBheWxvYWRDb25maWcgc2hvdWxkbid0IGJlIHNldCBmb3IgQmVuY2htYXJrU2VydmljZSBiYXNlZCBzZXJ2ZXIuIik7ICAgIAorICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBCZW5jaG1hcmtTZXJ2aWNlLkJpbmRTZXJ2aWNlKG5ldyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5TZXJ2ZXJUeXBlID09IFNlcnZlclR5cGUuQVNZTkNfR0VORVJJQ19TRVJWRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGdlbmVyaWNTZXJ2aWNlID0gbmV3IEdlbmVyaWNTZXJ2aWNlSW1wbChjb25maWcuUGF5bG9hZENvbmZpZy5CeXRlYnVmUGFyYW1zLlJlc3BTaXplKTsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlID0gR2VuZXJpY1NlcnZpY2UuQmluZEhhbmRsZXIoZ2VuZXJpY1NlcnZpY2UuU3RyZWFtaW5nQ2FsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBTZXJ2ZXJUeXBlIik7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBuZXcgU2VydmVyCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2VydmljZXMgPSB7IEJlbmNobWFya1NlcnZpY2UuQmluZFNlcnZpY2UobmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKHJlc3BvbnNlU2l6ZSkpIH0sCisgICAgICAgICAgICAgICAgU2VydmljZXMgPSB7IHNlcnZpY2UgfSwKICAgICAgICAgICAgICAgICBQb3J0cyA9IHsgbmV3IFNlcnZlclBvcnQoIls6Ol0iLCBjb25maWcuUG9ydCwgY3JlZGVudGlhbHMpIH0KICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHNlcnZlci5TdGFydCgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJSdW5uZXJJbXBsKHNlcnZlcik7CiAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEdlbmVyaWNTZXJ2aWNlSW1wbAorICAgICAgICB7CisgICAgICAgICAgICByZWFkb25seSBieXRlW10gcmVzcG9uc2U7CisKKyAgICAgICAgICAgIHB1YmxpYyBHZW5lcmljU2VydmljZUltcGwoaW50IHJlc3BvbnNlU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gbmV3IGJ5dGVbcmVzcG9uc2VTaXplXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIEdlbmVyaWMgc3RyZWFtaW5nIGNhbGwgaGFuZGxlci4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBTdHJlYW1pbmdDYWxsKElBc3luY1N0cmVhbVJlYWRlcjxieXRlW10+IHJlcXVlc3RTdHJlYW0sIElTZXJ2ZXJTdHJlYW1Xcml0ZXI8Ynl0ZVtdPiByZXNwb25zZVN0cmVhbSwgU2VydmVyQ2FsbENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCByZXF1ZXN0U3RyZWFtLkZvckVhY2hBc3luYyhhc3luYyByZXF1ZXN0ID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXNwb25zZVN0cmVhbS5Xcml0ZUFzeW5jKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vLyA8c3VtbWFyeT4KQEAgLTExOSw2ICsxNzEsNSBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gc2VydmVyLlNodXRkb3duQXN5bmMoKTsKICAgICAgICAgfQotICAgIH0KLSAgICAgICAgCisgICAgfSAgICAgICAgCiB9CmRpZmYgLS1naXQgYS9zcmMvY3NoYXJwL2V4dC9ncnBjX2NzaGFycF9leHQuYyBiL3NyYy9jc2hhcnAvZXh0L2dycGNfY3NoYXJwX2V4dC5jCmluZGV4IDFkZjc0YTAuLjY0MmRjOWUgMTAwNjQ0Ci0tLSBhL3NyYy9jc2hhcnAvZXh0L2dycGNfY3NoYXJwX2V4dC5jCisrKyBiL3NyYy9jc2hhcnAvZXh0L2dycGNfY3NoYXJwX2V4dC5jCkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogCiAjaW5jbHVkZSA8Z3JwYy9ieXRlX2J1ZmZlcl9yZWFkZXIuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgpkaWZmIC0tZ2l0IGEvc3JjL25vZGUvaW5kZXguanMgYi9zcmMvbm9kZS9pbmRleC5qcwppbmRleCAxYzE5NzcyLi42NTY3ZDU2IDEwMDY0NAotLS0gYS9zcmMvbm9kZS9pbmRleC5qcworKysgYi9zcmMvbm9kZS9pbmRleC5qcwpAQCAtODcsNiArODcsMTAgQEAKICAqICAgQnVmZmVycy4gRGVmYXVsdHMgdG8gZmFsc2UKICAqIC0gbG9uZ3NBc1N0cmluZ3M6IGRlc2VyaWFsaXplIGxvbmcgdmFsdWVzIGFzIHN0cmluZ3MgaW5zdGVhZCBvZiBvYmplY3RzLgogICogICBEZWZhdWx0cyB0byB0cnVlCisgKiAtIGRlcHJlY2F0ZWRBcmd1bWVudE9yZGVyOiBVc2UgdGhlIGJldGEgbWV0aG9kIGFyZ3VtZW50IG9yZGVyIGZvciBjbGllbnQKKyAqICAgbWV0aG9kcywgd2l0aCBvcHRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGNhbGxiYWNrLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAqICAgVGhpcyBvcHRpb24gaXMgb25seSBhIHRlbXBvcmFyeSBzdG9wZ2FwIG1lYXN1cmUgdG8gc21vb3RoIGFuIEFQSSBicmVha2FnZS4KKyAqICAgSXQgaXMgZGVwcmVjYXRlZCwgYW5kIG5ldyBjb2RlIHNob3VsZCBub3QgdXNlIGl0LgogICogQHBhcmFtIHtzdHJpbmd8e3Jvb3Q6IHN0cmluZywgZmlsZTogc3RyaW5nfX0gZmlsZW5hbWUgVGhlIGZpbGUgdG8gbG9hZAogICogQHBhcmFtIHtzdHJpbmc9fSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IHRvIGV4cGVjdC4gTXVzdCBiZSBlaXRoZXIgJ3Byb3RvJyBvcgogICogICAgICdqc29uJy4gRGVmYXVsdHMgdG8gJ3Byb3RvJwpkaWZmIC0tZ2l0IGEvc3JjL25vZGUvaW50ZXJvcC9pbnRlcm9wX2NsaWVudC5qcyBiL3NyYy9ub2RlL2ludGVyb3AvaW50ZXJvcF9jbGllbnQuanMKaW5kZXggNTYwMjAxMS4uYWMwZWRkYyAxMDA2NDQKLS0tIGEvc3JjL25vZGUvaW50ZXJvcC9pbnRlcm9wX2NsaWVudC5qcworKysgYi9zcmMvbm9kZS9pbnRlcm9wL2ludGVyb3BfY2xpZW50LmpzCkBAIC0yODYsNyArMjg2LDcgQEAKIGZ1bmN0aW9uIHRpbWVvdXRPblNsZWVwaW5nU2VydmVyKGNsaWVudCwgZG9uZSkgewogICB2YXIgZGVhZGxpbmUgPSBuZXcgRGF0ZSgpOwogICBkZWFkbGluZS5zZXRNaWxsaXNlY29uZHMoZGVhZGxpbmUuZ2V0TWlsbGlzZWNvbmRzKCkgKyAxKTsKLSAgdmFyIGNhbGwgPSBjbGllbnQuZnVsbER1cGxleENhbGwobnVsbCwge2RlYWRsaW5lOiBkZWFkbGluZX0pOworICB2YXIgY2FsbCA9IGNsaWVudC5mdWxsRHVwbGV4Q2FsbCh7ZGVhZGxpbmU6IGRlYWRsaW5lfSk7CiAgIGNhbGwud3JpdGUoewogICAgIHBheWxvYWQ6IHtib2R5OiB6ZXJvQnVmZmVyKDI3MTgyKX0KICAgfSk7CkBAIC0zMTYsMTAgKzMxNiwxMCBAQAogICAgICAgYm9keTogemVyb0J1ZmZlcigyNzE4MjgpCiAgICAgfQogICB9OwotICB2YXIgdW5hcnkgPSBjbGllbnQudW5hcnlDYWxsKGFyZywgZnVuY3Rpb24oZXJyLCByZXNwKSB7CisgIHZhciB1bmFyeSA9IGNsaWVudC51bmFyeUNhbGwoYXJnLCBtZXRhZGF0YSwgZnVuY3Rpb24oZXJyLCByZXNwKSB7CiAgICAgYXNzZXJ0LmlmRXJyb3IoZXJyKTsKICAgICBkb25lKCk7Ci0gIH0sIG1ldGFkYXRhKTsKKyAgfSk7CiAgIHVuYXJ5Lm9uKCdtZXRhZGF0YScsIGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICAgYXNzZXJ0LmRlZXBFcXVhbChtZXRhZGF0YS5nZXQoRUNIT19JTklUSUFMX0tFWSksCiAgICAgICAgICAgICAgICAgICAgICBbJ3Rlc3RfaW5pdGlhbF9tZXRhZGF0YV92YWx1ZSddKTsKQEAgLTQ1NSwxNCArNDU1LDE0IEBACiAgICAgICBjcmVkZW50aWFsID0gY3JlZGVudGlhbC5jcmVhdGVTY29wZWQoc2NvcGUpOwogICAgIH0KICAgICB2YXIgY3JlZHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUZyb21Hb29nbGVDcmVkZW50aWFsKGNyZWRlbnRpYWwpOwotICAgIGNsaWVudC51bmFyeUNhbGwoYXJnLCBmdW5jdGlvbihlcnIsIHJlc3ApIHsKKyAgICBjbGllbnQudW5hcnlDYWxsKGFyZywge2NyZWRlbnRpYWxzOiBjcmVkc30sIGZ1bmN0aW9uKGVyciwgcmVzcCkgewogICAgICAgYXNzZXJ0LmlmRXJyb3IoZXJyKTsKICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXNwLnVzZXJuYW1lLCBTRVJWSUNFX0FDQ09VTlRfRU1BSUwpOwogICAgICAgYXNzZXJ0KGV4dHJhLm9hdXRoX3Njb3BlLmluZGV4T2YocmVzcC5vYXV0aF9zY29wZSkgPiAtMSk7CiAgICAgICBpZiAoZG9uZSkgewogICAgICAgICBkb25lKCk7CiAgICAgICB9Ci0gICAgfSwgbnVsbCwge2NyZWRlbnRpYWxzOiBjcmVkc30pOworICAgIH0pOwogICB9KTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL25vZGUvc3JjL2NsaWVudC5qcyBiL3NyYy9ub2RlL3NyYy9jbGllbnQuanMKaW5kZXggMjQ1OWUyOC4uODIxNDIzNyAxMDA2NDQKLS0tIGEvc3JjL25vZGUvc3JjL2NsaWVudC5qcworKysgYi9zcmMvbm9kZS9zcmMvY2xpZW50LmpzCkBAIC01MCw2ICs1MCw3IEBACiAndXNlIHN0cmljdCc7CiAKIHZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7Cit2YXIgYXJndWVqcyA9IHJlcXVpcmUoJ2FyZ3VlanMnKTsKIAogdmFyIGdycGMgPSByZXF1aXJlKCcuL2dycGNfZXh0ZW5zaW9uJyk7CiAKQEAgLTM1MywyMSArMzU0LDIzIEBACiAgICAqIEB0aGlzIHtDbGllbnR9IENsaWVudCBvYmplY3QuIE11c3QgaGF2ZSBhIGNoYW5uZWwgbWVtYmVyLgogICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50IFRoZSBhcmd1bWVudCB0byB0aGUgY2FsbC4gU2hvdWxkIGJlIHNlcmlhbGl6YWJsZSB3aXRoCiAgICAqICAgICBzZXJpYWxpemUKLSAgICogQHBhcmFtIHtmdW5jdGlvbig/RXJyb3IsIHZhbHVlPSl9IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBmb3Igd2hlbiB0aGUKLSAgICogICAgIHJlc3BvbnNlIGlzIHJlY2VpdmVkCiAgICAqIEBwYXJhbSB7TWV0YWRhdGE9fSBtZXRhZGF0YSBNZXRhZGF0YSB0byBhZGQgdG8gdGhlIGNhbGwKICAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIE9wdGlvbnMgbWFwCisgICAqIEBwYXJhbSB7ZnVuY3Rpb24oP0Vycm9yLCB2YWx1ZT0pfSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZm9yIHdoZW4gdGhlCisgICAqICAgICByZXNwb25zZSBpcyByZWNlaXZlZAogICAgKiBAcmV0dXJuIHtFdmVudEVtaXR0ZXJ9IEFuIGV2ZW50IGVtaXR0ZXIgZm9yIHN0cmVhbSByZWxhdGVkIGV2ZW50cwogICAgKi8KLSAgZnVuY3Rpb24gbWFrZVVuYXJ5UmVxdWVzdChhcmd1bWVudCwgY2FsbGJhY2ssIG1ldGFkYXRhLCBvcHRpb25zKSB7CisgIGZ1bmN0aW9uIG1ha2VVbmFyeVJlcXVlc3QoYXJndW1lbnQsIG1ldGFkYXRhLCBvcHRpb25zLCBjYWxsYmFjaykgewogICAgIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi8KKyAgICAvKiBXaGlsZSB0aGUgYXJndW1lbnRzIGFyZSBsaXN0ZWQgaW4gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSwgdGhvc2UgdmFyaWFibGVzCisgICAgICogYXJlIG5vdCB1c2VkIGRpcmVjdGx5LiBJbnN0ZWFkLCBBcmd1ZUpTIHByb2Nlc3NlcyB0aGUgYXJndW1lbnRzCisgICAgICogb2JqZWN0LiBUaGlzIGFsbG93cyBmb3Igc2ltcGxlIGhhbmRsaW5nIG9mIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiB0aGUKKyAgICAgKiBtaWRkbGUgb2YgdGhlIGFyZ3VtZW50IGxpc3QsIGFuZCBhbHNvIHByb3ZpZGVzIHR5cGUgY2hlY2tpbmcuICovCisgICAgdmFyIGFyZ3MgPSBhcmd1ZWpzKHthcmd1bWVudDogbnVsbCwgbWV0YWRhdGE6IFtNZXRhZGF0YSwgbmV3IE1ldGFkYXRhKCldLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW09iamVjdF0sIGNhbGxiYWNrOiBGdW5jdGlvbn0sIGFyZ3VtZW50cyk7CiAgICAgdmFyIGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7Ci0gICAgdmFyIGNhbGwgPSBnZXRDYWxsKHRoaXMuJGNoYW5uZWwsIG1ldGhvZCwgb3B0aW9ucyk7Ci0gICAgaWYgKG1ldGFkYXRhID09PSBudWxsIHx8IG1ldGFkYXRhID09PSB1bmRlZmluZWQpIHsKLSAgICAgIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGEuY2xvbmUoKTsKLSAgICB9CisgICAgdmFyIGNhbGwgPSBnZXRDYWxsKHRoaXMuJGNoYW5uZWwsIG1ldGhvZCwgYXJncy5vcHRpb25zKTsKKyAgICBtZXRhZGF0YSA9IGFyZ3MubWV0YWRhdGEuY2xvbmUoKTsKICAgICBlbWl0dGVyLmNhbmNlbCA9IGZ1bmN0aW9uIGNhbmNlbCgpIHsKICAgICAgIGNhbGwuY2FuY2VsKCk7CiAgICAgfTsKQEAgLTM3NSw5ICszNzgsOSBAQAogICAgICAgcmV0dXJuIGNhbGwuZ2V0UGVlcigpOwogICAgIH07CiAgICAgdmFyIGNsaWVudF9iYXRjaCA9IHt9OwotICAgIHZhciBtZXNzYWdlID0gc2VyaWFsaXplKGFyZ3VtZW50KTsKLSAgICBpZiAob3B0aW9ucykgewotICAgICAgbWVzc2FnZS5ncnBjV3JpdGVGbGFncyA9IG9wdGlvbnMuZmxhZ3M7CisgICAgdmFyIG1lc3NhZ2UgPSBzZXJpYWxpemUoYXJncy5hcmd1bWVudCk7CisgICAgaWYgKGFyZ3Mub3B0aW9ucykgeworICAgICAgbWVzc2FnZS5ncnBjV3JpdGVGbGFncyA9IGFyZ3Mub3B0aW9ucy5mbGFnczsKICAgICB9CiAgICAgY2xpZW50X2JhdGNoW2dycGMub3BUeXBlLlNFTkRfSU5JVElBTF9NRVRBREFUQV0gPQogICAgICAgICBtZXRhZGF0YS5fZ2V0Q29yZVJlcHJlc2VudGF0aW9uKCk7CkBAIC0zOTUsNyArMzk4LDcgQEAKICAgICAgIGlmIChzdGF0dXMuY29kZSA9PT0gZ3JwYy5zdGF0dXMuT0spIHsKICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgIC8vIEdvdCBhIGJhdGNoIGVycm9yLCBidXQgT0sgc3RhdHVzLiBTb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAgICAgIGNhbGxiYWNrKGVycik7CisgICAgICAgICAgYXJncy5jYWxsYmFjayhlcnIpOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICB0cnkgewpAQCAtNDE0LDkgKzQxNyw5IEBACiAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKHN0YXR1cy5kZXRhaWxzKTsKICAgICAgICAgZXJyb3IuY29kZSA9IHN0YXR1cy5jb2RlOwogICAgICAgICBlcnJvci5tZXRhZGF0YSA9IHN0YXR1cy5tZXRhZGF0YTsKLSAgICAgICAgY2FsbGJhY2soZXJyb3IpOworICAgICAgICBhcmdzLmNhbGxiYWNrKGVycm9yKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhbGxiYWNrKG51bGwsIGRlc2VyaWFsaXplZCk7CisgICAgICAgIGFyZ3MuY2FsbGJhY2sobnVsbCwgZGVzZXJpYWxpemVkKTsKICAgICAgIH0KICAgICAgIGVtaXR0ZXIuZW1pdCgnc3RhdHVzJywgc3RhdHVzKTsKICAgICAgIGVtaXR0ZXIuZW1pdCgnbWV0YWRhdGEnLCBNZXRhZGF0YS5fZnJvbUNvcmVSZXByZXNlbnRhdGlvbigKQEAgLTQ0MCwyMSArNDQzLDIzIEBACiAgICAqIE1ha2UgYSBjbGllbnQgc3RyZWFtIHJlcXVlc3Qgd2l0aCB0aGlzIG1ldGhvZCBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCB3aXRoIHRoZQogICAgKiBnaXZlbiBjYWxsYmFjaywgZXRjLgogICAgKiBAdGhpcyB7Q2xpZW50fSBDbGllbnQgb2JqZWN0LiBNdXN0IGhhdmUgYSBjaGFubmVsIG1lbWJlci4KLSAgICogQHBhcmFtIHtmdW5jdGlvbig/RXJyb3IsIHZhbHVlPSl9IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBmb3Igd2hlbiB0aGUKLSAgICogICAgIHJlc3BvbnNlIGlzIHJlY2VpdmVkCiAgICAqIEBwYXJhbSB7TWV0YWRhdGE9fSBtZXRhZGF0YSBBcnJheSBvZiBtZXRhZGF0YSBrZXkvdmFsdWUgcGFpcnMgdG8gYWRkIHRvIHRoZQogICAgKiAgICAgY2FsbAogICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBtYXAKKyAgICogQHBhcmFtIHtmdW5jdGlvbig/RXJyb3IsIHZhbHVlPSl9IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBmb3Igd2hlbiB0aGUKKyAgICogICAgIHJlc3BvbnNlIGlzIHJlY2VpdmVkCiAgICAqIEByZXR1cm4ge0V2ZW50RW1pdHRlcn0gQW4gZXZlbnQgZW1pdHRlciBmb3Igc3RyZWFtIHJlbGF0ZWQgZXZlbnRzCiAgICAqLwotICBmdW5jdGlvbiBtYWtlQ2xpZW50U3RyZWFtUmVxdWVzdChjYWxsYmFjaywgbWV0YWRhdGEsIG9wdGlvbnMpIHsKKyAgZnVuY3Rpb24gbWFrZUNsaWVudFN0cmVhbVJlcXVlc3QobWV0YWRhdGEsIG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqLwotICAgIHZhciBjYWxsID0gZ2V0Q2FsbCh0aGlzLiRjaGFubmVsLCBtZXRob2QsIG9wdGlvbnMpOwotICAgIGlmIChtZXRhZGF0YSA9PT0gbnVsbCB8fCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhLmNsb25lKCk7Ci0gICAgfQorICAgIC8qIFdoaWxlIHRoZSBhcmd1bWVudHMgYXJlIGxpc3RlZCBpbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCB0aG9zZSB2YXJpYWJsZXMKKyAgICAgKiBhcmUgbm90IHVzZWQgZGlyZWN0bHkuIEluc3RlYWQsIEFyZ3VlSlMgcHJvY2Vzc2VzIHRoZSBhcmd1bWVudHMKKyAgICAgKiBvYmplY3QuIFRoaXMgYWxsb3dzIGZvciBzaW1wbGUgaGFuZGxpbmcgb2Ygb3B0aW9uYWwgYXJndW1lbnRzIGluIHRoZQorICAgICAqIG1pZGRsZSBvZiB0aGUgYXJndW1lbnQgbGlzdCwgYW5kIGFsc28gcHJvdmlkZXMgdHlwZSBjaGVja2luZy4gKi8KKyAgICB2YXIgYXJncyA9IGFyZ3VlanMoe21ldGFkYXRhOiBbTWV0YWRhdGEsIG5ldyBNZXRhZGF0YSgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtPYmplY3RdLCBjYWxsYmFjazogRnVuY3Rpb259LCBhcmd1bWVudHMpOworICAgIHZhciBjYWxsID0gZ2V0Q2FsbCh0aGlzLiRjaGFubmVsLCBtZXRob2QsIGFyZ3Mub3B0aW9ucyk7CisgICAgbWV0YWRhdGEgPSBhcmdzLm1ldGFkYXRhLmNsb25lKCk7CiAgICAgdmFyIHN0cmVhbSA9IG5ldyBDbGllbnRXcml0YWJsZVN0cmVhbShjYWxsLCBzZXJpYWxpemUpOwogICAgIHZhciBtZXRhZGF0YV9iYXRjaCA9IHt9OwogICAgIG1ldGFkYXRhX2JhdGNoW2dycGMub3BUeXBlLlNFTkRfSU5JVElBTF9NRVRBREFUQV0gPQpAQCAtNDgxLDcgKzQ4Niw3IEBACiAgICAgICBpZiAoc3RhdHVzLmNvZGUgPT09IGdycGMuc3RhdHVzLk9LKSB7CiAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAvLyBHb3QgYSBiYXRjaCBlcnJvciwgYnV0IE9LIHN0YXR1cy4gU29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICAgICAgICBjYWxsYmFjayhlcnIpOworICAgICAgICAgIGFyZ3MuY2FsbGJhY2soZXJyKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdHJ5IHsKQEAgLTUwMCw5ICs1MDUsOSBAQAogICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMuZGV0YWlscyk7CiAgICAgICAgIGVycm9yLmNvZGUgPSBzdGF0dXMuY29kZTsKICAgICAgICAgZXJyb3IubWV0YWRhdGEgPSBzdGF0dXMubWV0YWRhdGE7Ci0gICAgICAgIGNhbGxiYWNrKGVycm9yKTsKKyAgICAgICAgYXJncy5jYWxsYmFjayhlcnJvcik7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjYWxsYmFjayhudWxsLCBkZXNlcmlhbGl6ZWQpOworICAgICAgICBhcmdzLmNhbGxiYWNrKG51bGwsIGRlc2VyaWFsaXplZCk7CiAgICAgICB9CiAgICAgICBzdHJlYW0uZW1pdCgnc3RhdHVzJywgc3RhdHVzKTsKICAgICB9KTsKQEAgLTUzMywxNyArNTM4LDE4IEBACiAgICAqLwogICBmdW5jdGlvbiBtYWtlU2VydmVyU3RyZWFtUmVxdWVzdChhcmd1bWVudCwgbWV0YWRhdGEsIG9wdGlvbnMpIHsKICAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovCi0gICAgdmFyIGNhbGwgPSBnZXRDYWxsKHRoaXMuJGNoYW5uZWwsIG1ldGhvZCwgb3B0aW9ucyk7Ci0gICAgaWYgKG1ldGFkYXRhID09PSBudWxsIHx8IG1ldGFkYXRhID09PSB1bmRlZmluZWQpIHsKLSAgICAgIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGEuY2xvbmUoKTsKLSAgICB9CisgICAgLyogV2hpbGUgdGhlIGFyZ3VtZW50cyBhcmUgbGlzdGVkIGluIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUsIHRob3NlIHZhcmlhYmxlcworICAgICAqIGFyZSBub3QgdXNlZCBkaXJlY3RseS4gSW5zdGVhZCwgQXJndWVKUyBwcm9jZXNzZXMgdGhlIGFyZ3VtZW50cworICAgICAqIG9iamVjdC4gKi8KKyAgICB2YXIgYXJncyA9IGFyZ3VlanMoe2FyZ3VtZW50OiBudWxsLCBtZXRhZGF0YTogW01ldGFkYXRhLCBuZXcgTWV0YWRhdGEoKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbT2JqZWN0XX0sIGFyZ3VtZW50cyk7CisgICAgdmFyIGNhbGwgPSBnZXRDYWxsKHRoaXMuJGNoYW5uZWwsIG1ldGhvZCwgYXJncy5vcHRpb25zKTsKKyAgICBtZXRhZGF0YSA9IGFyZ3MubWV0YWRhdGEuY2xvbmUoKTsKICAgICB2YXIgc3RyZWFtID0gbmV3IENsaWVudFJlYWRhYmxlU3RyZWFtKGNhbGwsIGRlc2VyaWFsaXplKTsKICAgICB2YXIgc3RhcnRfYmF0Y2ggPSB7fTsKLSAgICB2YXIgbWVzc2FnZSA9IHNlcmlhbGl6ZShhcmd1bWVudCk7Ci0gICAgaWYgKG9wdGlvbnMpIHsKLSAgICAgIG1lc3NhZ2UuZ3JwY1dyaXRlRmxhZ3MgPSBvcHRpb25zLmZsYWdzOworICAgIHZhciBtZXNzYWdlID0gc2VyaWFsaXplKGFyZ3MuYXJndW1lbnQpOworICAgIGlmIChhcmdzLm9wdGlvbnMpIHsKKyAgICAgIG1lc3NhZ2UuZ3JwY1dyaXRlRmxhZ3MgPSBhcmdzLm9wdGlvbnMuZmxhZ3M7CiAgICAgfQogICAgIHN0YXJ0X2JhdGNoW2dycGMub3BUeXBlLlNFTkRfSU5JVElBTF9NRVRBREFUQV0gPQogICAgICAgICBtZXRhZGF0YS5fZ2V0Q29yZVJlcHJlc2VudGF0aW9uKCk7CkBAIC01OTUsMTIgKzYwMSwxMyBAQAogICAgKi8KICAgZnVuY3Rpb24gbWFrZUJpZGlTdHJlYW1SZXF1ZXN0KG1ldGFkYXRhLCBvcHRpb25zKSB7CiAgICAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqLwotICAgIHZhciBjYWxsID0gZ2V0Q2FsbCh0aGlzLiRjaGFubmVsLCBtZXRob2QsIG9wdGlvbnMpOwotICAgIGlmIChtZXRhZGF0YSA9PT0gbnVsbCB8fCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhLmNsb25lKCk7Ci0gICAgfQorICAgIC8qIFdoaWxlIHRoZSBhcmd1bWVudHMgYXJlIGxpc3RlZCBpbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCB0aG9zZSB2YXJpYWJsZXMKKyAgICAgKiBhcmUgbm90IHVzZWQgZGlyZWN0bHkuIEluc3RlYWQsIEFyZ3VlSlMgcHJvY2Vzc2VzIHRoZSBhcmd1bWVudHMKKyAgICAgKiBvYmplY3QuICovCisgICAgdmFyIGFyZ3MgPSBhcmd1ZWpzKHttZXRhZGF0YTogW01ldGFkYXRhLCBuZXcgTWV0YWRhdGEoKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbT2JqZWN0XX0sIGFyZ3VtZW50cyk7CisgICAgdmFyIGNhbGwgPSBnZXRDYWxsKHRoaXMuJGNoYW5uZWwsIG1ldGhvZCwgYXJncy5vcHRpb25zKTsKKyAgICBtZXRhZGF0YSA9IGFyZ3MubWV0YWRhdGEuY2xvbmUoKTsKICAgICB2YXIgc3RyZWFtID0gbmV3IENsaWVudER1cGxleFN0cmVhbShjYWxsLCBzZXJpYWxpemUsIGRlc2VyaWFsaXplKTsKICAgICB2YXIgc3RhcnRfYmF0Y2ggPSB7fTsKICAgICBzdGFydF9iYXRjaFtncnBjLm9wVHlwZS5TRU5EX0lOSVRJQUxfTUVUQURBVEFdID0KQEAgLTY0Myw2ICs2NTAsNDAgQEAKICAgYmlkaTogbWFrZUJpZGlTdHJlYW1SZXF1ZXN0RnVuY3Rpb24KIH07CiAKK2Z1bmN0aW9uIGdldERlZmF1bHRWYWx1ZXMobWV0YWRhdGEsIG9wdGlvbnMpIHsKKyAgdmFyIHJlcyA9IHt9OworICByZXMubWV0YWRhdGEgPSBtZXRhZGF0YSB8fCBuZXcgTWV0YWRhdGEoKTsKKyAgcmVzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIE1hcCB3aXRoIHdyYXBwZXJzIGZvciBlYWNoIHR5cGUgb2YgcmVxdWVzdGVyIGZ1bmN0aW9uIHRvIG1ha2UgaXQgdXNlIHRoZSBvbGQKKyAqIGFyZ3VtZW50IG9yZGVyIHdpdGggb3B0aW9uYWwgYXJndW1lbnRzIGFmdGVyIHRoZSBjYWxsYmFjay4KKyAqLwordmFyIGRlcHJlY2F0ZWRfcmVxdWVzdF93cmFwID0geworICB1bmFyeTogZnVuY3Rpb24obWFrZVVuYXJ5UmVxdWVzdCkgeworICAgIHJldHVybiBmdW5jdGlvbiBtYWtlV3JhcHBlZFVuYXJ5UmVxdWVzdChhcmd1bWVudCwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLCBvcHRpb25zKSB7CisgICAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovCisgICAgICB2YXIgb3B0X2FyZ3MgPSBnZXREZWZhdWx0VmFsdWVzKG1ldGFkYXRhLCBtZXRhZGF0YSk7CisgICAgICByZXR1cm4gbWFrZVVuYXJ5UmVxdWVzdC5jYWxsKHRoaXMsIGFyZ3VtZW50LCBvcHRfYXJncy5tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2FyZ3Mub3B0aW9ucywgY2FsbGJhY2spOworICAgIH07CisgIH0sCisgIGNsaWVudF9zdHJlYW06IGZ1bmN0aW9uKG1ha2VTZXJ2ZXJTdHJlYW1SZXF1ZXN0KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uIG1ha2VXcmFwcGVkQ2xpZW50U3RyZWFtUmVxdWVzdChjYWxsYmFjaywgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKSB7CisgICAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovCisgICAgICB2YXIgb3B0X2FyZ3MgPSBnZXREZWZhdWx0VmFsdWVzKG1ldGFkYXRhLCBvcHRpb25zKTsKKyAgICAgIHJldHVybiBtYWtlU2VydmVyU3RyZWFtUmVxdWVzdC5jYWxsKHRoaXMsIG9wdF9hcmdzLm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2FyZ3Mub3B0aW9ucywgY2FsbGJhY2spOworICAgIH07CisgIH0sCisgIHNlcnZlcl9zdHJlYW06IF8uaWRlbnRpdHksCisgIGJpZGk6IF8uaWRlbnRpdHkKK307CisKIC8qKgogICogQ3JlYXRlcyBhIGNvbnN0cnVjdG9yIGZvciBhIGNsaWVudCB3aXRoIHRoZSBnaXZlbiBtZXRob2RzLiBUaGUgbWV0aG9kcyBvYmplY3QKICAqIG1hcHMgbWV0aG9kIG5hbWUgdG8gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOgpAQCAtNjU0LDkgKzY5NSwxOSBAQAogICogcmVzcG9uc2VEZXNlcmlhbGl6ZTogZnVuY3Rpb24gdG8gZGVzZXJpYWxpemUgcmVzcG9uc2Ugb2JqZWN0cwogICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgQW4gb2JqZWN0IG1hcHBpbmcgbWV0aG9kIG5hbWVzIHRvIG1ldGhvZCBhdHRyaWJ1dGVzCiAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlCisgKiBAcGFyYW0ge09iamVjdH0gY2xhc3Nfb3B0aW9ucyBBbiBvcHRpb25zIG9iamVjdC4gQ3VycmVudGx5IG9ubHkgdXNlcyB0aGUga2V5CisgKiAgICAgZGVwcmVjYXRlZEFyZ3VtZW50T3JkZXIsIGEgYm9vbGVhbiB0aGF0IEluZGljYXRlcyB0aGF0IHRoZSBvbGQgYXJndW1lbnQKKyAqICAgICBvcmRlciBzaG91bGQgYmUgdXNlZCBmb3IgbWV0aG9kcywgd2l0aCBvcHRpb25hbCBhcmd1bWVudHMgYXQgdGhlIGVuZAorICogICAgIGluc3RlYWQgb2YgdGhlIGNhbGxiYWNrIGF0IHRoZSBlbmQuIERlZmF1bHRzIHRvIGZhbHNlLiBUaGlzIG9wdGlvbiBpcworICogICAgIG9ubHkgYSB0ZW1wb3Jhcnkgc3RvcGdhcCBtZWFzdXJlIHRvIHNtb290aCBhbiBBUEkgYnJlYWthZ2UuCisgKiAgICAgSXQgaXMgZGVwcmVjYXRlZCwgYW5kIG5ldyBjb2RlIHNob3VsZCBub3QgdXNlIGl0LgogICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpfSBOZXcgY2xpZW50IGNvbnN0cnVjdG9yCiAgKi8KLWV4cG9ydHMubWFrZUNsaWVudENvbnN0cnVjdG9yID0gZnVuY3Rpb24obWV0aG9kcywgc2VydmljZU5hbWUpIHsKK2V4cG9ydHMubWFrZUNsaWVudENvbnN0cnVjdG9yID0gZnVuY3Rpb24obWV0aG9kcywgc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX29wdGlvbnMpIHsKKyAgaWYgKCFjbGFzc19vcHRpb25zKSB7CisgICAgY2xhc3Nfb3B0aW9ucyA9IHt9OworICB9CiAgIC8qKgogICAgKiBDcmVhdGUgYSBjbGllbnQgd2l0aCB0aGUgZ2l2ZW4gbWV0aG9kcwogICAgKiBAY29uc3RydWN0b3IKQEAgLTcwMyw4ICs3NTQsMTMgQEAKICAgICB9CiAgICAgdmFyIHNlcmlhbGl6ZSA9IGF0dHJzLnJlcXVlc3RTZXJpYWxpemU7CiAgICAgdmFyIGRlc2VyaWFsaXplID0gYXR0cnMucmVzcG9uc2VEZXNlcmlhbGl6ZTsKLSAgICBDbGllbnQucHJvdG90eXBlW25hbWVdID0gcmVxdWVzdGVyX21ha2Vyc1ttZXRob2RfdHlwZV0oCisgICAgdmFyIG1ldGhvZF9mdW5jID0gcmVxdWVzdGVyX21ha2Vyc1ttZXRob2RfdHlwZV0oCiAgICAgICAgIGF0dHJzLnBhdGgsIHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUpOworICAgIGlmIChjbGFzc19vcHRpb25zLmRlcHJlY2F0ZWRBcmd1bWVudE9yZGVyKSB7CisgICAgICBDbGllbnQucHJvdG90eXBlW25hbWVdID0gZGVwcmVjYXRlZF9yZXF1ZXN0X3dyYXAobWV0aG9kX2Z1bmMpOworICAgIH0gZWxzZSB7CisgICAgICBDbGllbnQucHJvdG90eXBlW25hbWVdID0gbWV0aG9kX2Z1bmM7CisgICAgfQogICAgIC8vIEFzc29jaWF0ZSBhbGwgcHJvdmlkZWQgYXR0cmlidXRlcyB3aXRoIHRoZSBtZXRob2QKICAgICBfLmFzc2lnbihDbGllbnQucHJvdG90eXBlW25hbWVdLCBhdHRycyk7CiAgIH0pOwpAQCAtNzYxLDggKzgxNywxMyBAQAogZXhwb3J0cy5tYWtlUHJvdG9idWZDbGllbnRDb25zdHJ1Y3RvciA9ICBmdW5jdGlvbihzZXJ2aWNlLCBvcHRpb25zKSB7CiAgIHZhciBtZXRob2RfYXR0cnMgPSBjb21tb24uZ2V0UHJvdG9idWZTZXJ2aWNlQXR0cnMoc2VydmljZSwgc2VydmljZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOworICB2YXIgZGVwcmVjYXRlZEFyZ3VtZW50T3JkZXIgPSBmYWxzZTsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBkZXByZWNhdGVkQXJndW1lbnRPcmRlciA9IG9wdGlvbnMuZGVwcmVjYXRlZEFyZ3VtZW50T3JkZXI7CisgIH0KICAgdmFyIENsaWVudCA9IGV4cG9ydHMubWFrZUNsaWVudENvbnN0cnVjdG9yKAotICAgICAgbWV0aG9kX2F0dHJzLCBjb21tb24uZnVsbHlRdWFsaWZpZWROYW1lKHNlcnZpY2UpKTsKKyAgICAgIG1ldGhvZF9hdHRycywgY29tbW9uLmZ1bGx5UXVhbGlmaWVkTmFtZShzZXJ2aWNlKSwKKyAgICAgIGRlcHJlY2F0ZWRBcmd1bWVudE9yZGVyKTsKICAgQ2xpZW50LnNlcnZpY2UgPSBzZXJ2aWNlOwogICBDbGllbnQuc2VydmljZS5ncnBjX29wdGlvbnMgPSBvcHRpb25zOwogICByZXR1cm4gQ2xpZW50OwpkaWZmIC0tZ2l0IGEvc3JjL25vZGUvdGVzdC9jcmVkZW50aWFsc190ZXN0LmpzIGIvc3JjL25vZGUvdGVzdC9jcmVkZW50aWFsc190ZXN0LmpzCmluZGV4IDI5NDYwMGMuLjczZWFkZmEgMTAwNjQ0Ci0tLSBhL3NyYy9ub2RlL3Rlc3QvY3JlZGVudGlhbHNfdGVzdC5qcworKysgYi9zcmMvbm9kZS90ZXN0L2NyZWRlbnRpYWxzX3Rlc3QuanMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zOTgsMTggKzM5OCwyMCBAQAogICAgICAgICAgIG1ldGFkYXRhVXBkYXRlcik7CiAgICAgfSk7CiAgICAgaXQoJ1Nob3VsZCB1cGRhdGUgbWV0YWRhdGEgb24gYSB1bmFyeSBjYWxsJywgZnVuY3Rpb24oZG9uZSkgewotICAgICAgdmFyIGNhbGwgPSBjbGllbnQudW5hcnkoe30sIGZ1bmN0aW9uKGVyciwgZGF0YSkgewotICAgICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOwotICAgICAgfSwgbnVsbCwge2NyZWRlbnRpYWxzOiB1cGRhdGVyX2NyZWRzfSk7CisgICAgICB2YXIgY2FsbCA9IGNsaWVudC51bmFyeSh7fSwge2NyZWRlbnRpYWxzOiB1cGRhdGVyX2NyZWRzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICBjYWxsLm9uKCdtZXRhZGF0YScsIGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwobWV0YWRhdGEuZ2V0KCdwbHVnaW5fa2V5JyksIFsncGx1Z2luX3ZhbHVlJ10pOwogICAgICAgICBkb25lKCk7CiAgICAgICB9KTsKICAgICB9KTsKICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBtZXRhZGF0YSBvbiBhIGNsaWVudCBzdHJlYW1pbmcgY2FsbCcsIGZ1bmN0aW9uKGRvbmUpIHsKLSAgICAgIHZhciBjYWxsID0gY2xpZW50LmNsaWVudFN0cmVhbShmdW5jdGlvbihlcnIsIGRhdGEpIHsKLSAgICAgICAgYXNzZXJ0LmlmRXJyb3IoZXJyKTsKLSAgICAgIH0sIG51bGwsIHtjcmVkZW50aWFsczogdXBkYXRlcl9jcmVkc30pOworICAgICAgdmFyIGNhbGwgPSBjbGllbnQuY2xpZW50U3RyZWFtKHtjcmVkZW50aWFsczogdXBkYXRlcl9jcmVkc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgY2FsbC5vbignbWV0YWRhdGEnLCBmdW5jdGlvbihtZXRhZGF0YSkgewogICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKG1ldGFkYXRhLmdldCgncGx1Z2luX2tleScpLCBbJ3BsdWdpbl92YWx1ZSddKTsKICAgICAgICAgZG9uZSgpOwpAQCAtNDE3LDcgKzQxOSw3IEBACiAgICAgICBjYWxsLmVuZCgpOwogICAgIH0pOwogICAgIGl0KCdzaG91bGQgdXBkYXRlIG1ldGFkYXRhIG9uIGEgc2VydmVyIHN0cmVhbWluZyBjYWxsJywgZnVuY3Rpb24oZG9uZSkgewotICAgICAgdmFyIGNhbGwgPSBjbGllbnQuc2VydmVyU3RyZWFtKHt9LCBudWxsLCB7Y3JlZGVudGlhbHM6IHVwZGF0ZXJfY3JlZHN9KTsKKyAgICAgIHZhciBjYWxsID0gY2xpZW50LnNlcnZlclN0cmVhbSh7fSwge2NyZWRlbnRpYWxzOiB1cGRhdGVyX2NyZWRzfSk7CiAgICAgICBjYWxsLm9uKCdkYXRhJywgZnVuY3Rpb24oKSB7fSk7CiAgICAgICBjYWxsLm9uKCdtZXRhZGF0YScsIGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwobWV0YWRhdGEuZ2V0KCdwbHVnaW5fa2V5JyksIFsncGx1Z2luX3ZhbHVlJ10pOwpAQCAtNDI1LDcgKzQyNyw3IEBACiAgICAgICB9KTsKICAgICB9KTsKICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBtZXRhZGF0YSBvbiBhIGJpZGkgc3RyZWFtaW5nIGNhbGwnLCBmdW5jdGlvbihkb25lKSB7Ci0gICAgICB2YXIgY2FsbCA9IGNsaWVudC5iaWRpU3RyZWFtKG51bGwsIHtjcmVkZW50aWFsczogdXBkYXRlcl9jcmVkc30pOworICAgICAgdmFyIGNhbGwgPSBjbGllbnQuYmlkaVN0cmVhbSh7Y3JlZGVudGlhbHM6IHVwZGF0ZXJfY3JlZHN9KTsKICAgICAgIGNhbGwub24oJ2RhdGEnLCBmdW5jdGlvbigpIHt9KTsKICAgICAgIGNhbGwub24oJ21ldGFkYXRhJywgZnVuY3Rpb24obWV0YWRhdGEpIHsKICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtZXRhZGF0YS5nZXQoJ3BsdWdpbl9rZXknKSwgWydwbHVnaW5fdmFsdWUnXSk7CkBAIC00NDMsOSArNDQ1LDEwIEBACiAgICAgICAgICAgYWx0TWV0YWRhdGFVcGRhdGVyKTsKICAgICAgIHZhciBjb21iaW5lZF91cGRhdGVyID0gZ3JwYy5jcmVkZW50aWFscy5jb21iaW5lQ2FsbENyZWRlbnRpYWxzKAogICAgICAgICAgIHVwZGF0ZXJfY3JlZHMsIGFsdF91cGRhdGVyX2NyZWRzKTsKLSAgICAgIHZhciBjYWxsID0gY2xpZW50LnVuYXJ5KHt9LCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKLSAgICAgICAgYXNzZXJ0LmlmRXJyb3IoZXJyKTsKLSAgICAgIH0sIG51bGwsIHtjcmVkZW50aWFsczogY29tYmluZWRfdXBkYXRlcn0pOworICAgICAgdmFyIGNhbGwgPSBjbGllbnQudW5hcnkoe30sIHtjcmVkZW50aWFsczogY29tYmluZWRfdXBkYXRlcn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnIsIGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0LmlmRXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgY2FsbC5vbignbWV0YWRhdGEnLCBmdW5jdGlvbihtZXRhZGF0YSkgewogICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKG1ldGFkYXRhLmdldCgncGx1Z2luX2tleScpLCBbJ3BsdWdpbl92YWx1ZSddKTsKICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtZXRhZGF0YS5nZXQoJ290aGVyX3BsdWdpbl9rZXknKSwKZGlmZiAtLWdpdCBhL3NyYy9ub2RlL3Rlc3Qvc3VyZmFjZV90ZXN0LmpzIGIvc3JjL25vZGUvdGVzdC9zdXJmYWNlX3Rlc3QuanMKaW5kZXggZWRiZmMwYS4uNWE3MDRlZSAxMDA2NDQKLS0tIGEvc3JjL25vZGUvdGVzdC9zdXJmYWNlX3Rlc3QuanMKKysrIGIvc3JjL25vZGUvdGVzdC9zdXJmYWNlX3Rlc3QuanMKQEAgLTQwNCwxOCArNDA0LDE4IEBACiAgICAgc2VydmVyLmZvcmNlU2h1dGRvd24oKTsKICAgfSk7CiAgIGl0KCd3aXRoIHVuYXJ5IGNhbGwnLCBmdW5jdGlvbihkb25lKSB7Ci0gICAgdmFyIGNhbGwgPSBjbGllbnQudW5hcnkoe30sIGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICAgIHZhciBjYWxsID0gY2xpZW50LnVuYXJ5KHt9LCBtZXRhZGF0YSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CiAgICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOwotICAgIH0sIG1ldGFkYXRhKTsKKyAgICB9KTsKICAgICBjYWxsLm9uKCdtZXRhZGF0YScsIGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKG1ldGFkYXRhLmdldCgna2V5JyksIFsndmFsdWUnXSk7CiAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogICBpdCgnd2l0aCBjbGllbnQgc3RyZWFtIGNhbGwnLCBmdW5jdGlvbihkb25lKSB7Ci0gICAgdmFyIGNhbGwgPSBjbGllbnQuY2xpZW50U3RyZWFtKGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICAgIHZhciBjYWxsID0gY2xpZW50LmNsaWVudFN0cmVhbShtZXRhZGF0YSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CiAgICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOwotICAgIH0sIG1ldGFkYXRhKTsKKyAgICB9KTsKICAgICBjYWxsLm9uKCdtZXRhZGF0YScsIGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKG1ldGFkYXRhLmdldCgna2V5JyksIFsndmFsdWUnXSk7CiAgICAgICBkb25lKCk7CkBAIC00NDEsOCArNDQxLDggQEAKICAgfSk7CiAgIGl0KCdzaG93cyB0aGUgY29ycmVjdCB1c2VyLWFnZW50IHN0cmluZycsIGZ1bmN0aW9uKGRvbmUpIHsKICAgICB2YXIgdmVyc2lvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247Ci0gICAgdmFyIGNhbGwgPSBjbGllbnQudW5hcnkoe30sIGZ1bmN0aW9uKGVyciwgZGF0YSkgeyBhc3NlcnQuaWZFcnJvcihlcnIpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKTsKKyAgICB2YXIgY2FsbCA9IGNsaWVudC51bmFyeSh7fSwgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCBkYXRhKSB7IGFzc2VydC5pZkVycm9yKGVycik7IH0pOwogICAgIGNhbGwub24oJ21ldGFkYXRhJywgZnVuY3Rpb24obWV0YWRhdGEpIHsKICAgICAgIGFzc2VydChfLnN0YXJ0c1dpdGgobWV0YWRhdGEuZ2V0KCd1c2VyLWFnZW50JylbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdncnBjLW5vZGUvJyArIHZlcnNpb24pKTsKQEAgLTQ1Miw4ICs0NTIsOCBAQAogICBpdCgncHJvcGVybHkgaGFuZGxlcyBkdXBsaWNhdGUgdmFsdWVzJywgZnVuY3Rpb24oZG9uZSkgewogICAgIHZhciBkdXBfbWV0YWRhdGEgPSBtZXRhZGF0YS5jbG9uZSgpOwogICAgIGR1cF9tZXRhZGF0YS5hZGQoJ2tleScsICd2YWx1ZTInKTsKLSAgICB2YXIgY2FsbCA9IGNsaWVudC51bmFyeSh7fSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7YXNzZXJ0LmlmRXJyb3IoZXJyKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBfbWV0YWRhdGEpOworICAgIHZhciBjYWxsID0gY2xpZW50LnVuYXJ5KHt9LCBkdXBfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oZXJyLCBkYXRhKSB7YXNzZXJ0LmlmRXJyb3IoZXJyKTsgfSk7CiAgICAgY2FsbC5vbignbWV0YWRhdGEnLCBmdW5jdGlvbihyZXNwX21ldGFkYXRhKSB7CiAgICAgICAvLyBUd28gYXJyYXlzIGFyZSBlcXVhbCBpZmYgdGhlaXIgc3ltbWV0cmljIGRpZmZlcmVuY2UgaXMgZW1wdHkKICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXy54b3IoZHVwX21ldGFkYXRhLmdldCgna2V5JyksIHJlc3BfbWV0YWRhdGEuZ2V0KCdrZXknKSksCkBAIC05NTQsNyArOTU0LDcgQEAKICAgICAgIGRvbmUgPSBtdWx0aURvbmUoZG9uZSwgMik7CiAgICAgICB2YXIgY2FsbDsKICAgICAgIHByb3h5X2ltcGwudW5hcnkgPSBmdW5jdGlvbihwYXJlbnQsIGNhbGxiYWNrKSB7Ci0gICAgICAgIGNsaWVudC51bmFyeShwYXJlbnQucmVxdWVzdCwgZnVuY3Rpb24oZXJyLCB2YWx1ZSkgeworICAgICAgICBjbGllbnQudW5hcnkocGFyZW50LnJlcXVlc3QsIHtwYXJlbnQ6IHBhcmVudH0sIGZ1bmN0aW9uKGVyciwgdmFsdWUpIHsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgYXNzZXJ0KGVycik7CiAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXJyLmNvZGUsIGdycGMuc3RhdHVzLkNBTkNFTExFRCk7CkBAIC05NjIsNyArOTYyLDcgQEAKICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdmFsdWUpOwogICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgIH0KLSAgICAgICAgfSwgbnVsbCwge3BhcmVudDogcGFyZW50fSk7CisgICAgICAgIH0pOwogICAgICAgICBjYWxsLmNhbmNlbCgpOwogICAgICAgfTsKICAgICAgIHByb3h5LmFkZFByb3RvU2VydmljZSh0ZXN0X3NlcnZpY2UsIHByb3h5X2ltcGwpOwpAQCAtOTc2LDcgKzk3Niw3IEBACiAgICAgICBkb25lID0gbXVsdGlEb25lKGRvbmUsIDIpOwogICAgICAgdmFyIGNhbGw7CiAgICAgICBwcm94eV9pbXBsLmNsaWVudFN0cmVhbSA9IGZ1bmN0aW9uKHBhcmVudCwgY2FsbGJhY2spIHsKLSAgICAgICAgY2xpZW50LmNsaWVudFN0cmVhbShmdW5jdGlvbihlcnIsIHZhbHVlKSB7CisgICAgICAgIGNsaWVudC5jbGllbnRTdHJlYW0oe3BhcmVudDogcGFyZW50fSwgZnVuY3Rpb24oZXJyLCB2YWx1ZSkgewogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnQoZXJyKTsKICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlcnIuY29kZSwgZ3JwYy5zdGF0dXMuQ0FOQ0VMTEVEKTsKQEAgLTk4NCw3ICs5ODQsNyBAQAogICAgICAgICAgICAgY2FsbGJhY2soZXJyLCB2YWx1ZSk7CiAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgfQotICAgICAgICB9LCBudWxsLCB7cGFyZW50OiBwYXJlbnR9KTsKKyAgICAgICAgfSk7CiAgICAgICAgIGNhbGwuY2FuY2VsKCk7CiAgICAgICB9OwogICAgICAgcHJveHkuYWRkUHJvdG9TZXJ2aWNlKHRlc3Rfc2VydmljZSwgcHJveHlfaW1wbCk7CkBAIC05OTgsOCArOTk4LDcgQEAKICAgICAgIGRvbmUgPSBtdWx0aURvbmUoZG9uZSwgMik7CiAgICAgICB2YXIgY2FsbDsKICAgICAgIHByb3h5X2ltcGwuc2VydmVyU3RyZWFtID0gZnVuY3Rpb24ocGFyZW50KSB7Ci0gICAgICAgIHZhciBjaGlsZCA9IGNsaWVudC5zZXJ2ZXJTdHJlYW0ocGFyZW50LnJlcXVlc3QsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcmVudDogcGFyZW50fSk7CisgICAgICAgIHZhciBjaGlsZCA9IGNsaWVudC5zZXJ2ZXJTdHJlYW0ocGFyZW50LnJlcXVlc3QsIHtwYXJlbnQ6IHBhcmVudH0pOwogICAgICAgICBjaGlsZC5vbignZGF0YScsIGZ1bmN0aW9uKCkge30pOwogICAgICAgICBjaGlsZC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICBhc3NlcnQoZXJyKTsKQEAgLTEwMjMsNyArMTAyMiw3IEBACiAgICAgICBkb25lID0gbXVsdGlEb25lKGRvbmUsIDIpOwogICAgICAgdmFyIGNhbGw7CiAgICAgICBwcm94eV9pbXBsLmJpZGlTdHJlYW0gPSBmdW5jdGlvbihwYXJlbnQpIHsKLSAgICAgICAgdmFyIGNoaWxkID0gY2xpZW50LmJpZGlTdHJlYW0obnVsbCwge3BhcmVudDogcGFyZW50fSk7CisgICAgICAgIHZhciBjaGlsZCA9IGNsaWVudC5iaWRpU3RyZWFtKHtwYXJlbnQ6IHBhcmVudH0pOwogICAgICAgICBjaGlsZC5vbignZGF0YScsIGZ1bmN0aW9uKCkge30pOwogICAgICAgICBjaGlsZC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICBhc3NlcnQoZXJyKTsKQEAgLTEwNTEsNyArMTA1MCw4IEBACiAgICAgaXQoJ1dpdGggYSBjbGllbnQgc3RyZWFtIGNhbGwnLCBmdW5jdGlvbihkb25lKSB7CiAgICAgICBkb25lID0gbXVsdGlEb25lKGRvbmUsIDIpOwogICAgICAgcHJveHlfaW1wbC5jbGllbnRTdHJlYW0gPSBmdW5jdGlvbihwYXJlbnQsIGNhbGxiYWNrKSB7Ci0gICAgICAgIGNsaWVudC5jbGllbnRTdHJlYW0oZnVuY3Rpb24oZXJyLCB2YWx1ZSkgeworICAgICAgICB2YXIgb3B0aW9ucyA9IHtwYXJlbnQ6IHBhcmVudCwgcHJvcGFnYXRlX2ZsYWdzOiBkZWFkbGluZV9mbGFnc307CisgICAgICAgIGNsaWVudC5jbGllbnRTdHJlYW0ob3B0aW9ucywgZnVuY3Rpb24oZXJyLCB2YWx1ZSkgewogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnQoZXJyKTsKICAgICAgICAgICAgIGFzc2VydChlcnIuY29kZSA9PT0gZ3JwYy5zdGF0dXMuREVBRExJTkVfRVhDRUVERUQgfHwKQEAgLTEwNjAsNyArMTA2MCw3IEBACiAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHZhbHVlKTsKICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICB9Ci0gICAgICAgIH0sIG51bGwsIHtwYXJlbnQ6IHBhcmVudCwgcHJvcGFnYXRlX2ZsYWdzOiBkZWFkbGluZV9mbGFnc30pOworICAgICAgICB9KTsKICAgICAgIH07CiAgICAgICBwcm94eS5hZGRQcm90b1NlcnZpY2UodGVzdF9zZXJ2aWNlLCBwcm94eV9pbXBsKTsKICAgICAgIHZhciBwcm94eV9wb3J0ID0gcHJveHkuYmluZCgnbG9jYWxob3N0OjAnLCBzZXJ2ZXJfaW5zZWN1cmVfY3JlZHMpOwpAQCAtMTA2OSwxNSArMTA2OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVJbnNlY3VyZSgpKTsKICAgICAgIHZhciBkZWFkbGluZSA9IG5ldyBEYXRlKCk7CiAgICAgICBkZWFkbGluZS5zZXRTZWNvbmRzKGRlYWRsaW5lLmdldFNlY29uZHMoKSArIDEpOwotICAgICAgcHJveHlfY2xpZW50LmNsaWVudFN0cmVhbShmdW5jdGlvbihlcnIsIHZhbHVlKSB7CisgICAgICBwcm94eV9jbGllbnQuY2xpZW50U3RyZWFtKHtkZWFkbGluZTogZGVhZGxpbmV9LCBmdW5jdGlvbihlcnIsIHZhbHVlKSB7CiAgICAgICAgIGRvbmUoKTsKLSAgICAgIH0sIG51bGwsIHtkZWFkbGluZTogZGVhZGxpbmV9KTsKKyAgICAgIH0pOwogICAgIH0pOwogICAgIGl0KCdXaXRoIGEgYmlkaSBzdHJlYW0gY2FsbCcsIGZ1bmN0aW9uKGRvbmUpIHsKICAgICAgIGRvbmUgPSBtdWx0aURvbmUoZG9uZSwgMik7CiAgICAgICBwcm94eV9pbXBsLmJpZGlTdHJlYW0gPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgICAgICAgdmFyIGNoaWxkID0gY2xpZW50LmJpZGlTdHJlYW0oCi0gICAgICAgICAgICBudWxsLCB7cGFyZW50OiBwYXJlbnQsIHByb3BhZ2F0ZV9mbGFnczogZGVhZGxpbmVfZmxhZ3N9KTsKKyAgICAgICAgICAgIHtwYXJlbnQ6IHBhcmVudCwgcHJvcGFnYXRlX2ZsYWdzOiBkZWFkbGluZV9mbGFnc30pOwogICAgICAgICBjaGlsZC5vbignZGF0YScsIGZ1bmN0aW9uKCkge30pOwogICAgICAgICBjaGlsZC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICBhc3NlcnQoZXJyKTsKQEAgLTEwOTMsNyArMTA5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCkpOwogICAgICAgdmFyIGRlYWRsaW5lID0gbmV3IERhdGUoKTsKICAgICAgIGRlYWRsaW5lLnNldFNlY29uZHMoZGVhZGxpbmUuZ2V0U2Vjb25kcygpICsgMSk7Ci0gICAgICB2YXIgY2FsbCA9IHByb3h5X2NsaWVudC5iaWRpU3RyZWFtKG51bGwsIHtkZWFkbGluZTogZGVhZGxpbmV9KTsKKyAgICAgIHZhciBjYWxsID0gcHJveHlfY2xpZW50LmJpZGlTdHJlYW0oe2RlYWRsaW5lOiBkZWFkbGluZX0pOwogICAgICAgY2FsbC5vbignZGF0YScsIGZ1bmN0aW9uKCkge30pOwogICAgICAgY2FsbC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgZG9uZSgpOwpkaWZmIC0tZ2l0IGEvc3JjL29iamVjdGl2ZS1jL0dSUENDbGllbnQvcHJpdmF0ZS9HUlBDUmVhY2hhYmlsaXR5RmxhZ05hbWVzLnhtYWNyby5oIGIvc3JjL29iamVjdGl2ZS1jL0dSUENDbGllbnQvcHJpdmF0ZS9HUlBDUmVhY2hhYmlsaXR5RmxhZ05hbWVzLnhtYWNyby5oCmluZGV4IDAyODcxZDUuLjRiOTI1MDQgMTAwNjQ0Ci0tLSBhL3NyYy9vYmplY3RpdmUtYy9HUlBDQ2xpZW50L3ByaXZhdGUvR1JQQ1JlYWNoYWJpbGl0eUZsYWdOYW1lcy54bWFjcm8uaAorKysgYi9zcmMvb2JqZWN0aXZlLWMvR1JQQ0NsaWVudC9wcml2YXRlL0dSUENSZWFjaGFiaWxpdHlGbGFnTmFtZXMueG1hY3JvLmgKQEAgLTU0LDcgKzU0LDkgQEAKICAgICAgICBHUlBDX1hNQUNST19JVEVNLgogI2VuZGlmCiAKKyNpZiBUQVJHRVRfT1NfSVBIT05FCiBHUlBDX1hNQUNST19JVEVNKGlzQ2VsbCwgSXNXV0FOKQorI2VuZGlmCiBHUlBDX1hNQUNST19JVEVNKHJlYWNoYWJsZSwgUmVhY2hhYmxlKQogR1JQQ19YTUFDUk9fSVRFTSh0cmFuc2llbnRDb25uZWN0aW9uLCBUcmFuc2llbnRDb25uZWN0aW9uKQogR1JQQ19YTUFDUk9fSVRFTShjb25uZWN0aW9uUmVxdWlyZWQsIENvbm5lY3Rpb25SZXF1aXJlZCkKZGlmZiAtLWdpdCBhL3NyYy9weXRob24vZ3JwY2lvL2dycGNfY29yZV9kZXBlbmRlbmNpZXMucHkgYi9zcmMvcHl0aG9uL2dycGNpby9ncnBjX2NvcmVfZGVwZW5kZW5jaWVzLnB5CmluZGV4IDI3Y2Q4ZDYuLjNjNTdhZDcgMTAwNjQ0Ci0tLSBhL3NyYy9weXRob24vZ3JwY2lvL2dycGNfY29yZV9kZXBlbmRlbmNpZXMucHkKKysrIGIvc3JjL3B5dGhvbi9ncnBjaW8vZ3JwY19jb3JlX2RlcGVuZGVuY2llcy5weQpAQCAtMzAsMjExICszMCwyMTEgQEAKICMgQVVUTy1HRU5FUkFURUQgRlJPTSBgJFJFUE9fUk9PVC90ZW1wbGF0ZXMvc3JjL3B5dGhvbi9ncnBjaW8vZ3JwY19jb3JlX2RlcGVuZGVuY2llcy5weS50ZW1wbGF0ZWAhISEKIAogQ09SRV9TT1VSQ0VfRklMRVMgPSBbCi0gICdzcmMvY29yZS9wcm9maWxpbmcvYmFzaWNfdGltZXJzLmMnLAotICAnc3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvYXZsLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9jcHVfaXBob25lLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvY3B1X3dpbmRvd3MuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9lbnZfd2luMzIuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L2xvZy5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L2xvZ19saW51eC5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L211cm11cl9oYXNoLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC90aGQuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jJywKLSAgJ3NyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L3RpbWVfd2luMzIuYycsCi0gICdzcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMnLAotICAnc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jJywKLSAgJ3NyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYycsCi0gICdzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYycsCi0gICdzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uYycsCi0gICdzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jJywKLSAgJ3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jJywKLSAgJ3NyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmMnLAotICAnc3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jJywKLSAgJ3NyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMnLAotICAnc3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jJywKLSAgJ3NyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMnLAotICAnc3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuYycsCi0gICdzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMnLAotICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMnLAotICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMnLAotICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMnLAotICAnc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYycsCi0gICdzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jJywKLSAgJ3NyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jJywKLSAgJ3NyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jJywKLSAgJ3NyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYycsCi0gICdzcmMvY29yZS9kZWJ1Zy90cmFjZS5jJywKLSAgJ3NyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuYycsCi0gICdzcmMvY29yZS9odHRwL2h0dHBjbGkuYycsCi0gICdzcmMvY29yZS9odHRwL3BhcnNlci5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuYycsCi0gICdzcmMvY29yZS9pb21nci9lbmRwb2ludC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYycsCi0gICdzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYycsCi0gICdzcmMvY29yZS9pb21nci9leGVjX2N0eC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguYycsCi0gICdzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuYycsCi0gICdzcmMvY29yZS9pb21nci9pb21nci5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYycsCi0gICdzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYycsCi0gICdzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF93aW5kb3dzLmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3RpbWVyLmMnLAotICAnc3JjL2NvcmUvaW9tZ3IvdGltZXJfaGVhcC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYycsCi0gICdzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYycsCi0gICdzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jJywKLSAgJ3NyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYycsCi0gICdzcmMvY29yZS9qc29uL2pzb24uYycsCi0gICdzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmMnLAotICAnc3JjL2NvcmUvanNvbi9qc29uX3N0cmluZy5jJywKLSAgJ3NyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYycsCi0gICdzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2FsYXJtLmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2NhbGwuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2NhbGxfZGV0YWlscy5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9pbml0LmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2Uvc2VydmVyX2NodHRwMi5jJywKLSAgJ3NyYy9jb3JlL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL3ZlcnNpb24uYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3NldHRpbmdzLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jJywKLSAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbGlzdHMuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jJywKLSAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvd3JpdGluZy5jJywKLSAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5jJywKLSAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5jJywKLSAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jJywKLSAgJ3NyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYycsCi0gICdzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmMnLAotICAnc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYycsCi0gICdzcmMvY29yZS9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMnLAotICAnc3JjL2NvcmUvc2VjdXJpdHkvYjY0LmMnLAotICAnc3JjL2NvcmUvc2VjdXJpdHkvY2xpZW50X2F1dGhfZmlsdGVyLmMnLAotICAnc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuYycsCi0gICdzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jJywKLSAgJ3NyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMnLAotICAnc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYycsCi0gICdzcmMvY29yZS9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jJywKLSAgJ3NyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5jJywKLSAgJ3NyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uYycsCi0gICdzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYycsCi0gICdzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuYycsCi0gICdzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYycsCi0gICdzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMnLAotICAnc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX2F1dGhfZmlsdGVyLmMnLAotICAnc3JjL2NvcmUvc2VjdXJpdHkvc2VydmVyX3NlY3VyZV9jaHR0cDIuYycsCi0gICdzcmMvY29yZS9zdXJmYWNlL2luaXRfc2VjdXJlLmMnLAotICAnc3JjL2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYycsCi0gICdzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYycsCi0gICdzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jJywKLSAgJ3NyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYycsCi0gICdzcmMvY29yZS9jZW5zdXMvY29udGV4dC5jJywKLSAgJ3NyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMnLAotICAnc3JjL2NvcmUvY2Vuc3VzL21sb2cuYycsCi0gICdzcmMvY29yZS9jZW5zdXMvb3BlcmF0aW9uLmMnLAotICAnc3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jJywKLSAgJ3NyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMnLAorICAnc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYycsCisgICdzcmMvY29yZS9saWIvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvYWxsb2MuYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfbGludXguYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9saW51eC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hpc3RvZ3JhbS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF93aW4zMi5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3Rsc19wdGhyZWFkLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYycsCisgICdzcmMvY29yZS9saWIvc3VwcG9ydC93cmFwX21lbWNweS5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9pbnNlY3VyZS9jaGFubmVsX2NyZWF0ZS5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYycsCisgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvc2VjdXJlL3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYycsCisgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuYycsCisgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYycsCisgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYycsCisgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9saXN0cy5jJywKKyAgJ3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYycsCisgICdzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmMnLAorICAnc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYycsCisgICdzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYycsCisgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfY29udGV4dC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYycsCisgICdzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMnLAorICAnc3JjL2NvcmUvbGliL2NlbnN1cy9pbml0aWFsaXplLmMnLAorICAnc3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMnLAorICAnc3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYycsCisgICdzcmMvY29yZS9saWIvY2Vuc3VzL3BsYWNlaG9sZGVycy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jZW5zdXMvdHJhY2luZy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suYycsCisgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYycsCisgICdzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMnLAorICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMnLAorICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMnLAorICAnc3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMnLAorICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMnLAorICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMnLAorICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMnLAorICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYycsCisgICdzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMnLAorICAnc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYycsCisgICdzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMnLAorICAnc3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMnLAorICAnc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci90aW1lci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYycsCisgICdzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMnLAorICAnc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb24uYycsCisgICdzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jJywKKyAgJ3NyYy9jb3JlL2xpYi9qc29uL2pzb25fc3RyaW5nLmMnLAorICAnc3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuYycsCisgICdzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMnLAorICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmMnLAorICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMnLAorICAnc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYycsCisgICdzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYycsCisgICdzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfZGV0YWlscy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuYycsCisgICdzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmMnLAorICAnc3JjL2NvcmUvbGliL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYycsCisgICdzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYycsCisgICdzcmMvY29yZS9saWIvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jJywKKyAgJ3NyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYycsCisgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMnLAorICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYycsCisgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMnLAorICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jJywKKyAgJ3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmMnLAorICAnc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuYycsCisgICdzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYycsCisgICdzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMnLAorICAnc3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMnLAorICAnc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYycsCiAgICd0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmMnLAogICAndGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5jJywKICAgJ3RoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuYycsCmRpZmYgLS1naXQgYS9zcmMvcHl0aG9uL2dycGNpby9wcmVjb21waWxlZC5weSBiL3NyYy9weXRob24vZ3JwY2lvL3ByZWNvbXBpbGVkLnB5CmluZGV4IGQzNDI1MGIuLmFlZWIyNzUgMTAwNjQ0Ci0tLSBhL3NyYy9weXRob24vZ3JwY2lvL3ByZWNvbXBpbGVkLnB5CisrKyBiL3NyYy9weXRob24vZ3JwY2lvL3ByZWNvbXBpbGVkLnB5CkBAIC05MSw2ICs5MSw5IEBACiAKIAogZGVmIHVwZGF0ZV9zZXR1cF9hcmd1bWVudHMoc2V0dXBfYXJndW1lbnRzKToKKyAgaWYgbm90IFVTRV9QUkVDT01QSUxFRF9CSU5BUklFUzoKKyAgICBzeXMuc3RkZXJyLndyaXRlKCdub3QgdXNpbmcgcHJlY29tcGlsZWQgZXh0ZW5zaW9uJykKKyAgICByZXR1cm4KICAgdXJsID0gJ3t9L3t9LnNvJy5mb3JtYXQoQklOQVJJRVNfUkVQT1NJVE9SWSwgX3RhZ2dlZF9leHRfbmFtZSgnY3lncnBjJykpCiAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKFBZVEhPTl9TVEVNLCAnZ3JwYy9fY3l0aG9uL2N5Z3JwYy5zbycpCiAgIHRyeToKZGlmZiAtLWdpdCBhL3NyYy9ydWJ5L2V4dC9ncnBjL3JiX2J5dGVfYnVmZmVyLmMgYi9zcmMvcnVieS9leHQvZ3JwYy9yYl9ieXRlX2J1ZmZlci5jCmluZGV4IGRiN2NhYzMuLjliNjE3ZTEgMTAwNjQ0Ci0tLSBhL3NyYy9ydWJ5L2V4dC9ncnBjL3JiX2J5dGVfYnVmZmVyLmMKKysrIGIvc3JjL3J1YnkvZXh0L2dycGMvcmJfYnl0ZV9idWZmZXIuYwpAQCAtNTAsMjEgKzUwLDE4IEBACiB9CiAKIFZBTFVFIGdycGNfcmJfYnl0ZV9idWZmZXJfdG9fcyhncnBjX2J5dGVfYnVmZmVyICpidWZmZXIpIHsKLSAgc2l6ZV90IGxlbmd0aCA9IDA7Ci0gIGNoYXIgKnN0cmluZyA9IE5VTEw7Ci0gIHNpemVfdCBvZmZzZXQgPSAwOworICBWQUxVRSByYl9zdHJpbmc7CiAgIGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyIHJlYWRlcjsKICAgZ3ByX3NsaWNlIG5leHQ7CiAgIGlmIChidWZmZXIgPT0gTlVMTCkgewogICAgIHJldHVybiBRbmlsOwotCiAgIH0KLSAgbGVuZ3RoID0gZ3JwY19ieXRlX2J1ZmZlcl9sZW5ndGgoYnVmZmVyKTsKLSAgc3RyaW5nID0geG1hbGxvYyhsZW5ndGggKyAxKTsKKyAgcmJfc3RyaW5nID0gcmJfc3RyX2J1Zl9uZXcoZ3JwY19ieXRlX2J1ZmZlcl9sZW5ndGgoYnVmZmVyKSk7CiAgIGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX2luaXQoJnJlYWRlciwgYnVmZmVyKTsKICAgd2hpbGUgKGdycGNfYnl0ZV9idWZmZXJfcmVhZGVyX25leHQoJnJlYWRlciwgJm5leHQpICE9IDApIHsKLSAgICBtZW1jcHkoc3RyaW5nICsgb2Zmc2V0LCBHUFJfU0xJQ0VfU1RBUlRfUFRSKG5leHQpLCBHUFJfU0xJQ0VfTEVOR1RIKG5leHQpKTsKLSAgICBvZmZzZXQgKz0gR1BSX1NMSUNFX0xFTkdUSChuZXh0KTsKKyAgICByYl9zdHJfY2F0KHJiX3N0cmluZywgKGNvbnN0IGNoYXIgKikgR1BSX1NMSUNFX1NUQVJUX1BUUihuZXh0KSwKKyAgICAgICAgICAgICAgIEdQUl9TTElDRV9MRU5HVEgobmV4dCkpOworICAgIGdwcl9zbGljZV91bnJlZihuZXh0KTsKICAgfQotICByZXR1cm4gcmJfc3RyX25ldyhzdHJpbmcsIGxlbmd0aCk7CisgIHJldHVybiByYl9zdHJpbmc7CiB9CmRpZmYgLS1naXQgYS9zcmMvcnVieS9leHQvZ3JwYy9yYl9jYWxsLmMgYi9zcmMvcnVieS9leHQvZ3JwYy9yYl9jYWxsLmMKaW5kZXggY2QwYWE2YS4uYjA4MjllZiAxMDA2NDQKLS0tIGEvc3JjL3J1YnkvZXh0L2dycGMvcmJfY2FsbC5jCisrKyBiL3NyYy9ydWJ5L2V4dC9ncnBjL3JiX2NhbGwuYwpAQCAtNTUxLDEzICs1NTEsMjYgQEAKIC8qIGdycGNfcnVuX2JhdGNoX3N0YWNrX2NsZWFudXAgZW5zdXJlcyB0aGUgcnVuX2JhdGNoX3N0YWNrIGlzIHByb3Blcmx5CiAgKiBjbGVhbmVkIHVwICovCiBzdGF0aWMgdm9pZCBncnBjX3J1bl9iYXRjaF9zdGFja19jbGVhbnVwKHJ1bl9iYXRjaF9zdGFjayAqc3QpIHsKKyAgc2l6ZV90IGkgPSAwOworCiAgIGdycGNfbWV0YWRhdGFfYXJyYXlfZGVzdHJveSgmc3QtPnNlbmRfbWV0YWRhdGEpOwogICBncnBjX21ldGFkYXRhX2FycmF5X2Rlc3Ryb3koJnN0LT5zZW5kX3RyYWlsaW5nX21ldGFkYXRhKTsKICAgZ3JwY19tZXRhZGF0YV9hcnJheV9kZXN0cm95KCZzdC0+cmVjdl9tZXRhZGF0YSk7CiAgIGdycGNfbWV0YWRhdGFfYXJyYXlfZGVzdHJveSgmc3QtPnJlY3ZfdHJhaWxpbmdfbWV0YWRhdGEpOworCiAgIGlmIChzdC0+cmVjdl9zdGF0dXNfZGV0YWlscyAhPSBOVUxMKSB7CiAgICAgZ3ByX2ZyZWUoc3QtPnJlY3Zfc3RhdHVzX2RldGFpbHMpOwogICB9CisKKyAgaWYgKHN0LT5yZWN2X21lc3NhZ2UgIT0gTlVMTCkgeworICAgIGdycGNfYnl0ZV9idWZmZXJfZGVzdHJveShzdC0+cmVjdl9tZXNzYWdlKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzdC0+b3BfbnVtOyBpKyspIHsKKyAgICBpZiAoc3QtPm9wc1tpXS5vcCA9PSBHUlBDX09QX1NFTkRfTUVTU0FHRSkgeworICAgICAgZ3JwY19ieXRlX2J1ZmZlcl9kZXN0cm95KHN0LT5vcHNbaV0uZGF0YS5zZW5kX21lc3NhZ2UpOworICAgIH0KKyAgfQogfQogCiAvKiBncnBjX3J1bl9iYXRjaF9zdGFja19maWxsX29wcyBmaWxscyB0aGUgcnVuX2JhdGNoX3N0YWNrIG9wcyBhcnJheSBmcm9tCkBAIC02NDMsNyArNjU2LDYgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEdSUENfT1BfU0VORF9NRVNTQUdFOgogICAgICAgICByYl9zdHJ1Y3RfYXNldChyZXN1bHQsIHN5bV9zZW5kX21lc3NhZ2UsIFF0cnVlKTsKLSAgICAgICAgZ3JwY19ieXRlX2J1ZmZlcl9kZXN0cm95KHN0LT5vcHNbaV0uZGF0YS5zZW5kX21lc3NhZ2UpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgR1JQQ19PUF9TRU5EX0NMT1NFX0ZST01fQ0xJRU5UOgogICAgICAgICByYl9zdHJ1Y3RfYXNldChyZXN1bHQsIHN5bV9zZW5kX2Nsb3NlLCBRdHJ1ZSk7CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvQlVJTEQudGVtcGxhdGUgYi90ZW1wbGF0ZXMvQlVJTEQudGVtcGxhdGUKaW5kZXggNTRkYzY5Ny4uMjNhNjU2YyAxMDA2NDQKLS0tIGEvdGVtcGxhdGVzL0JVSUxELnRlbXBsYXRlCisrKyBiL3RlbXBsYXRlcy9CVUlMRC50ZW1wbGF0ZQpAQCAtNDksNyArNDksOSBAQAogICAgICAgXQogICAgIGlmIHRhcmdldF9kaWN0LmdldCgnYnVpbGQnLCBOb25lKSA9PSAncHJvdG9jJzoKICAgICAgIGRlcHMuYXBwZW5kKCIvL2V4dGVybmFsOnByb3RvYnVmX2NvbXBpbGVyIikKLSAgICBpZiB0YXJnZXRfZGljdFsnbmFtZSddID09ICdncnBjKytfdW5zZWN1cmUnIG9yIHRhcmdldF9kaWN0WyduYW1lJ10gPT0gJ2dycGMrKyc6CisgICAgaWYgKHRhcmdldF9kaWN0WyduYW1lJ10gPT0gJ2dycGMrK191bnNlY3VyZScgb3IKKyAgICAgICAgdGFyZ2V0X2RpY3RbJ25hbWUnXSA9PSAnZ3JwYysrJyBvcgorICAgICAgICB0YXJnZXRfZGljdFsnbmFtZSddID09ICdncnBjKytfY29kZWdlbl9saWInKToKICAgICAgIGRlcHMuYXBwZW5kKCIvL2V4dGVybmFsOnByb3RvYnVmX2NsaWIiKQogICAgIGVsaWYgdGFyZ2V0X2RpY3RbJ25hbWUnXSA9PSAnZ3JwYyc6CiAgICAgICBkZXBzLmFwcGVuZCgiLy9leHRlcm5hbDp6bGliIikKQEAgLTYwLDcgKzYyLDcgQEAKICAgICAgICAgZGVwcy5hcHBlbmQoJzolcycgJSAoZCkpCiAgICAgcmV0dXJuIGRlcHMKICAgJT4KLSAgCisKICAgJSBmb3IgbGliIGluIGxpYnM6CiAgICUgaWYgbGliLmJ1aWxkIGluICgiYWxsIiwgInByb3RvYyIpOgogICAke2NjX2xpYnJhcnkobGliKX0KQEAgLTgwLDEzICs4MiwxOSBAQAogICAlIGVuZGZvcgogICAKICAgPCVkZWYgbmFtZT0iY2NfbGlicmFyeShsaWIpIj4KKyAgPCUKKyAgICBsaWJfaGRycyA9IGxpYi5nZXQoImhlYWRlcnMiLCBbXSkKKyAgICBoZHJzID0gW2ggZm9yIGggaW4gbGliX2hkcnMgaWYgbm90IGguc3RhcnRzd2l0aCgndGhpcmRfcGFydHkvbmFub3BiJyldCisgICAgc3JjcyA9IFtzIGZvciBzIGluIGxpYi5zcmMgaWYgbm90IHMuc3RhcnRzd2l0aCgndGhpcmRfcGFydHkvbmFub3BiJyldCisgICAgdXNlc19uYW5vcGIgPSBsZW4obGliX2hkcnMpICE9IGxlbihoZHJzKSBvciBsZW4oc3JjcykgIT0gbGVuKGxpYi5zcmMpCisgICU+CiAgIGNjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICIke2xpYi5uYW1lfSIsCiAgICAgc3JjcyA9IFsKLSAgJSBmb3IgaGRyIGluIGxpYi5nZXQoImhlYWRlcnMiLCBbXSk6CisgICUgZm9yIGhkciBpbiBoZHJzOgogICAgICAgIiR7aGRyfSIsCiAgICUgZW5kZm9yCi0gICUgZm9yIHNyYyBpbiBsaWIuc3JjOgorICAlIGZvciBzcmMgaW4gc3JjczoKICAgICAgICIke3NyY30iLAogICAlIGVuZGZvcgogICAgIF0sCkBAIC0xMDMsNiArMTExLDkgQEAKICAgJSBmb3IgZGVwIGluIGdldF9kZXBzKGxpYik6CiAgICAgICAiJHtkZXB9IiwKICAgJSBlbmRmb3IKKyAgJSBpZiB1c2VzX25hbm9wYjoKKyAgICAgICIvL2V4dGVybmFsOm5hbm9wYiIsCisgICUgZW5kaWYKICAgICBdLAogICAlIGlmIGxpYi5uYW1lIGluICgiZ3JwYyIsICJncnBjX3Vuc2VjdXJlIik6CiAgICAgY29wdHMgPSBbCkBAIC0xMTMsMTAgKzEyNCwxNiBAQAogICA8LyVkZWY+CiAgIAogICA8JWRlZiBuYW1lPSJvYmpjX2xpYnJhcnkobGliKSI+CisgIDwlCisgICAgbGliX2hkcnMgPSBsaWIuZ2V0KCJoZWFkZXJzIiwgW10pCisgICAgaGRycyA9IFtoIGZvciBoIGluIGxpYl9oZHJzIGlmIG5vdCBoLnN0YXJ0c3dpdGgoJ3RoaXJkX3BhcnR5L25hbm9wYicpXQorICAgIHNyY3MgPSBbcyBmb3IgcyBpbiBsaWIuc3JjIGlmIG5vdCBzLnN0YXJ0c3dpdGgoJ3RoaXJkX3BhcnR5L25hbm9wYicpXQorICAgIHVzZXNfbmFub3BiID0gbGVuKGxpYl9oZHJzKSAhPSBsZW4oaGRycykgb3IgbGVuKHNyY3MpICE9IGxlbihsaWIuc3JjKQorICAlPgogICBvYmpjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICIke2xpYi5uYW1lfV9vYmpjIiwKICAgICBzcmNzID0gWwotICAlIGZvciBzcmMgaW4gbGliLnNyYzoKKyAgJSBmb3Igc3JjIGluIHNyY3M6CiAgICAgICAiJHtzcmN9IiwKICAgJSBlbmRmb3IKICAgICBdLApAQCAtMTI0LDcgKzE0MSw3IEBACiAgICUgZm9yIGhkciBpbiBsaWIuZ2V0KCJwdWJsaWNfaGVhZGVycyIsIFtdKToKICAgICAgICIke2hkcn0iLAogICAlIGVuZGZvcgotICAlIGZvciBoZHIgaW4gbGliLmdldCgiaGVhZGVycyIsIFtdKToKKyAgJSBmb3IgaGRyIGluIGhkcnM6CiAgICAgICAiJHtoZHJ9IiwKICAgJSBlbmRmb3IKICAgICBdLApAQCAtMTM5LDYgKzE1Niw5IEBACiAgICUgaWYgbGliLmdldCgnc2VjdXJlJywgRmFsc2UpOgogICAgICAgIi8vZXh0ZXJuYWw6bGlic3NsX29iamMiLAogICAlIGVuZGlmCisgICUgaWYgdXNlc19uYW5vcGI6CisgICAgICAiLy9leHRlcm5hbDpuYW5vcGIiLAorICAlIGVuZGlmCiAgICAgXSwKICAgJSBpZiBsaWIuZ2V0KCJiYXNlbGliIiwgZmFsc2UpOgogICAgIHNka19keWxpYnMgPSBbImxpYnoiXSwKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9NYWtlZmlsZS50ZW1wbGF0ZSBiL3RlbXBsYXRlcy9NYWtlZmlsZS50ZW1wbGF0ZQppbmRleCBjNTRjMTQ2Li41N2ZjMTQ2IDEwMDY0NAotLS0gYS90ZW1wbGF0ZXMvTWFrZWZpbGUudGVtcGxhdGUKKysrIGIvdGVtcGxhdGVzL01ha2VmaWxlLnRlbXBsYXRlCkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogICAgJChMSUJESVIpLyQoQ09ORklHKS9saWIke2RlcH0uYVwKICAgJSBlbmRmb3IKIAotICAlIGlmIHRndC5sYW5ndWFnZSA9PSAiYysrIiBvciB0Z3QuYm9yaW5nc3NsOgorICAlIGlmIHRndC5sYW5ndWFnZSA9PSAiYysrIiBvciB0Z3QuYm9yaW5nc3NsIG9yIHRndC5idWlsZCA9PSAnZnV6emVyJzoKICAgIyMgQysrIHRhcmdldHMgc3BlY2lmaWNpZXMuCiAgICUgaWYgdGd0LmJ1aWxkID09ICdwcm90b2MnOgogICAJJChFKSAiW0hPU1RMRF0gIExpbmtpbmcgJEAiCkBAIC0xNzkxLDYgKzE3OTEsOSBAQAogICAlIGVsaWYgdGd0Lmxhbmd1YWdlID09ICdjKysnIGFuZCB0Z3QuYnVpbGQgPT0gJ2JlbmNobWFyayc6CiAgICAkKEdURVNUX0xJQilcCiAgICUgZW5kaWYKKyAgJSBpZiB0Z3QuYnVpbGQgPT0gJ2Z1enplcic6CisgICAtbEZ1enplclwKKyAgJSBlbmRpZgogICAgLW8gJChCSU5ESVIpLyQoQ09ORklHKS8ke3RndC5uYW1lfQogICAlIGlmIHRndC5idWlsZCA9PSAncHJvdG9jJyBvciB0Z3QubGFuZ3VhZ2UgPT0gJ2MrKyc6CiAKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9wYWNrYWdlLmpzb24udGVtcGxhdGUgYi90ZW1wbGF0ZXMvcGFja2FnZS5qc29uLnRlbXBsYXRlCmluZGV4IDk5ZTgyODcuLjkwODU3NDAgMTAwNjQ0Ci0tLSBhL3RlbXBsYXRlcy9wYWNrYWdlLmpzb24udGVtcGxhdGUKKysrIGIvdGVtcGxhdGVzL3BhY2thZ2UuanNvbi50ZW1wbGF0ZQpAQCAtMjksNiArMjksNyBAQAogICAgIH0sCiAgICAgImJ1bmRsZWREZXBlbmRlbmNpZXMiOiBbIm5vZGUtcHJlLWd5cCJdLAogICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAiYXJndWVqcyI6ICJeMC4yLjMiLAogICAgICAgImxvZGFzaCI6ICJeMy45LjMiLAogICAgICAgIm5hbiI6ICJeMi4wLjAiLAogICAgICAgInByb3RvYnVmanMiOiAiXjQuMC4wIgpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL3NyYy9jb3JlL3N1cmZhY2UvdmVyc2lvbi5jLnRlbXBsYXRlIGIvdGVtcGxhdGVzL3NyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYy50ZW1wbGF0ZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVtcGxhdGVzL3NyYy9jb3JlL3N1cmZhY2UvdmVyc2lvbi5jLnRlbXBsYXRlCnJlbmFtZSB0byB0ZW1wbGF0ZXMvc3JjL2NvcmUvbGliL3N1cmZhY2UvdmVyc2lvbi5jLnRlbXBsYXRlCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdG9vbHMvZG9ja2VyZmlsZS9jbGFuZ191cGRhdGUuaW5jbHVkZSBiL3RlbXBsYXRlcy90b29scy9kb2NrZXJmaWxlL2NsYW5nX3VwZGF0ZS5pbmNsdWRlCmluZGV4IDgzYWIzZTAuLjRmODI3YzggMTAwNjQ0Ci0tLSBhL3RlbXBsYXRlcy90b29scy9kb2NrZXJmaWxlL2NsYW5nX3VwZGF0ZS5pbmNsdWRlCisrKyBiL3RlbXBsYXRlcy90b29scy9kb2NrZXJmaWxlL2NsYW5nX3VwZGF0ZS5pbmNsdWRlCkBAIC0xLDUgKzEsNSBAQAogIz09PT09PT09PT09PT09PT09Ci0jIFVwZGF0ZSBjbGFuZyB0byBhIHZlcnNpb24gd2l0aCBpbXByb3ZlZCB0c2FuCisjIFVwZGF0ZSBjbGFuZyB0byBhIHZlcnNpb24gd2l0aCBpbXByb3ZlZCB0c2FuIGFuZCBmdXp6aW5nIGNhcGFiaWxpdGllcwogCiBSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSBpbnN0YWxsIHB5dGhvbiBjbWFrZSAmJiBhcHQtZ2V0IGNsZWFuCiAKQEAgLTI5LDQgKzI5LDQgQEAKICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpTVFJJTkc9L3VzciAkeydcXCd9CiAgIC1ETExWTV9UQVJHRVRTX1RPX0JVSUxEOlNUUklORz1YODYgJHsnXFwnfQogICAuLi9sbHZtCi1SVU4gbWFrZSAtQyBsbHZtLWJ1aWxkICYmIG1ha2UgLUMgbGx2bS1idWlsZCBpbnN0YWxsICYmIHJtIC1yZiBsbHZtLWJ1aWxkCitSVU4gbWFrZSAtQyBsbHZtLWJ1aWxkIC1qIDEyICYmIG1ha2UgLUMgbGx2bS1idWlsZCBpbnN0YWxsICYmIHJtIC1yZiBsbHZtLWJ1aWxkCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdG9vbHMvZG9ja2VyZmlsZS9nY3BfYXBpX2xpYnJhcmllcy5pbmNsdWRlIGIvdGVtcGxhdGVzL3Rvb2xzL2RvY2tlcmZpbGUvZ2NwX2FwaV9saWJyYXJpZXMuaW5jbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjliMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL3Rvb2xzL2RvY2tlcmZpbGUvZ2NwX2FwaV9saWJyYXJpZXMuaW5jbHVkZQpAQCAtMCwwICsxLDQgQEAKKyMgR29vZ2xlIENsb3VkIHBsYXRmb3JtIEFQSSBsaWJyYXJpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgcHl0aG9uLXBpcCAmJiBhcHQtZ2V0IGNsZWFuCitSVU4gcGlwIGluc3RhbGwgLS11cGdyYWRlIGdvb2dsZS1hcGktcHl0aG9uLWNsaWVudAorCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdG9vbHMvZG9ja2VyZmlsZS9ncnBjX2ludGVyb3Bfc3RyZXNzX2N4eC9Eb2NrZXJmaWxlLnRlbXBsYXRlIGIvdGVtcGxhdGVzL3Rvb2xzL2RvY2tlcmZpbGUvZ3JwY19pbnRlcm9wX3N0cmVzc19jeHgvRG9ja2VyZmlsZS50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTA0OWQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL3Rvb2xzL2RvY2tlcmZpbGUvZ3JwY19pbnRlcm9wX3N0cmVzc19jeHgvRG9ja2VyZmlsZS50ZW1wbGF0ZQpAQCAtMCwwICsxLDQwIEBACislWUFNTCAxLjIKKy0tLSB8CisgICMgQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAgIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAjCisgICMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICAjIG1ldDoKKyAgIworICAjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgICMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAjIGRpc3RyaWJ1dGlvbi4KKyAgIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAgIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAjCisgICMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgICMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAgIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgICMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgICMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgICMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICAjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgIAorICBGUk9NIGRlYmlhbjpqZXNzaWUKKyAgCisgIDwlaW5jbHVkZSBmaWxlPSIuLi9hcHRfZ2V0X2Jhc2ljLmluY2x1ZGUiLz4KKyAgPCVpbmNsdWRlIGZpbGU9Ii4uL2NjYWNoZV9zZXR1cC5pbmNsdWRlIi8+CisgIDwlaW5jbHVkZSBmaWxlPSIuLi9jeHhfZGVwcy5pbmNsdWRlIi8+CisgIDwlaW5jbHVkZSBmaWxlPSIuLi9nY3BfYXBpX2xpYnJhcmllcy5pbmNsdWRlIi8+CisgIDwlaW5jbHVkZSBmaWxlPSIuLi9jbGFuZ191cGRhdGUuaW5jbHVkZSIvPgorICAjIERlZmluZSB0aGUgZGVmYXVsdCBjb21tYW5kLgorICBDTUQgWyJiYXNoIl0KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy90b29scy9kb2NrZXJmaWxlL3Rlc3QvZnV6emVyL0RvY2tlcmZpbGUudGVtcGxhdGUgYi90ZW1wbGF0ZXMvdG9vbHMvZG9ja2VyZmlsZS90ZXN0L2Z1enplci9Eb2NrZXJmaWxlLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWJlMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvdG9vbHMvZG9ja2VyZmlsZS90ZXN0L2Z1enplci9Eb2NrZXJmaWxlLnRlbXBsYXRlCkBAIC0wLDAgKzEsNDMgQEAKKyVZQU1MIDEuMgorLS0tIHwKKyAgIyBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICMKKyAgIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgICMgbWV0OgorICAjCisgICMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAgIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgICMgZGlzdHJpYnV0aW9uLgorICAjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICAjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICMKKyAgIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICAjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICAjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAgIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAgIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAgIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgICMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgICMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICBGUk9NIGRlYmlhbjpqZXNzaWUKKworICA8JWluY2x1ZGUgZmlsZT0iLi4vLi4vYXB0X2dldF9iYXNpYy5pbmNsdWRlIi8+CisgIDwlaW5jbHVkZSBmaWxlPSIuLi8uLi9jeHhfZGVwcy5pbmNsdWRlIi8+CisgIDwlaW5jbHVkZSBmaWxlPSIuLi8uLi9jbGFuZ191cGRhdGUuaW5jbHVkZSIvPgorICA8JWluY2x1ZGUgZmlsZT0iLi4vLi4vcnVuX3Rlc3RzX2FkZG9ucy5pbmNsdWRlIi8+CisgIFJVTiBjbGFuZysrIC1jIC1nIC1PMiAtc3RkPWMrKzExIGxsdm0vbGliL0Z1enplci8qLmNwcCAtSUZ1enplcgorICBSVU4gYXIgcnV2IGxpYkZ1enplci5hIEZ1enplcioubworICBSVU4gbXYgbGliRnV6emVyLmEgL3Vzci9saWIKKyAgUlVOIHJtIC1mIEZ1enplcioubworICAjIERlZmluZSB0aGUgZGVmYXVsdCBjb21tYW5kLgorICBDTUQgWyJiYXNoIl0KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy90b29scy9mdXp6ZXIvcnVubmVycy50ZW1wbGF0ZSBiL3RlbXBsYXRlcy90b29scy9mdXp6ZXIvcnVubmVycy50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgxYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL3Rvb2xzL2Z1enplci9ydW5uZXJzLnRlbXBsYXRlCkBAIC0wLDAgKzEsNDQgQEAKKyVZQU1MIDEuMgorLS0tCitmb3JlYWNoOiB0YXJnZXRzCitjb25kOiBzZWxlY3RlZC5idWlsZCA9PSAnZnV6emVyJworb3V0cHV0X25hbWU6ICR7c2VsZWN0ZWQubmFtZX0uc2gKK3RlbXBsYXRlOiB8CisgICMhL2Jpbi9iYXNoCisgICMgQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisgICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgIworICAjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAgIyBtZXQ6CisgICMKKyAgIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICAjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgIyBkaXN0cmlidXRpb24uCisgICMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgICMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgIworICAjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICAjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgICMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgICMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICAjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICAjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICAjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAgIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAjCisKKyAgZmxhZ3M9Ii1tYXhfdG90YWxfdGltZT0zNjAwIC1qb2JzPTMgLXdvcmtlcnM9MyIKKyAgaWYgWyAiJGNvbmZpZyIgPT0gImFzYW4tdHJhY2UtY21wIiBdCisgIHRoZW4KKyAgICBmbGFncz0iLXVzZV90cmFjZXM9MSAkZmxhZ3MiCisgIGZpCisKKyAgYmlucy8kY29uZmlnLyR7c2VsZWN0ZWQubmFtZX0gJGZsYWdzIGZ1enplcl9vdXRwdXQgJHsnICcuam9pbihzZWxlY3RlZC5jb3JwdXNfZGlycyl9CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdnNwcm9qZWN0cy9idWlsZHRlc3RzX2Muc2xuLnRlbXBsYXRlIGIvdGVtcGxhdGVzL3ZzcHJvamVjdHMvYnVpbGR0ZXN0c19jLnNsbi50ZW1wbGF0ZQppbmRleCBhOTg1ZmVhLi4yMTMxMmFiIDEwMDY0NAotLS0gYS90ZW1wbGF0ZXMvdnNwcm9qZWN0cy9idWlsZHRlc3RzX2Muc2xuLnRlbXBsYXRlCisrKyBiL3RlbXBsYXRlcy92c3Byb2plY3RzL2J1aWxkdGVzdHNfYy5zbG4udGVtcGxhdGUKQEAgLTIsNiArMiw2IEBACiAtLS0gfAogICA8JW5hbWVzcGFjZSBmaWxlPSJzbG5fZGVmcy5pbmNsdWRlIiBpbXBvcnQ9Imdlbl9zb2x1dGlvbiIvPlwKICAgPCUKLSAgc29sdXRpb25fcHJvamVjdHMgPSBbcCBmb3IgcCBpbiB2c3Byb2plY3RzIGlmIHAuYnVpbGQgIT0gJ3Byb3RvYycgYW5kIHAubGFuZ3VhZ2UgPT0gJ2MnIGFuZCBub3QgcC5ib3Jpbmdzc2wgYW5kIG5vdCBwLnpsaWJdCisgIHNvbHV0aW9uX3Byb2plY3RzID0gW3AgZm9yIHAgaW4gdnNwcm9qZWN0cyBpZiBwLmJ1aWxkIG5vdCBpbiBbJ3Byb3RvYycsICdmdXp6ZXInXSBhbmQgcC5sYW5ndWFnZSA9PSAnYycgYW5kIG5vdCBwLmJvcmluZ3NzbCBhbmQgbm90IHAuemxpYl0KICAgJT5cCiAgICR7Z2VuX3NvbHV0aW9uKHNvbHV0aW9uX3Byb2plY3RzLCB1c2VfZGxscz0neWVzJyl9CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdnNwcm9qZWN0cy9ncnBjLnNsbi50ZW1wbGF0ZSBiL3RlbXBsYXRlcy92c3Byb2plY3RzL2dycGMuc2xuLnRlbXBsYXRlCmluZGV4IGRiYmIyYzIuLmRlZDk4MzggMTAwNjQ0Ci0tLSBhL3RlbXBsYXRlcy92c3Byb2plY3RzL2dycGMuc2xuLnRlbXBsYXRlCisrKyBiL3RlbXBsYXRlcy92c3Byb2plY3RzL2dycGMuc2xuLnRlbXBsYXRlCkBAIC0yLDYgKzIsNiBAQAogLS0tIHwKICAgPCVuYW1lc3BhY2UgZmlsZT0ic2xuX2RlZnMuaW5jbHVkZSIgaW1wb3J0PSJnZW5fc29sdXRpb24iLz5cCiAgIDwlCi0gIHNvbHV0aW9uX3Byb2plY3RzID0gW3AgZm9yIHAgaW4gdnNwcm9qZWN0cyBpZiBwLmJ1aWxkIG5vdCBpbiBbJ3Byb3RvYycsICd0ZXN0J10gYW5kIHAubGFuZ3VhZ2UgaW4gWydjJywgJ2MrKyddIGFuZCBwLnZzX3Byb2pfZGlyID09ICcuJyBhbmQgbm90IChwLmJ1aWxkID09ICdwcml2YXRlJyBhbmQgcC5sYW5ndWFnZSA9PSAnYysrJyldCisgIHNvbHV0aW9uX3Byb2plY3RzID0gW3AgZm9yIHAgaW4gdnNwcm9qZWN0cyBpZiBwLmJ1aWxkIG5vdCBpbiBbJ3Byb3RvYycsICd0ZXN0JywgJ2Z1enplciddIGFuZCBwLmxhbmd1YWdlIGluIFsnYycsICdjKysnXSBhbmQgcC52c19wcm9qX2RpciA9PSAnLicgYW5kIG5vdCAocC5idWlsZCA9PSAncHJpdmF0ZScgYW5kIHAubGFuZ3VhZ2UgPT0gJ2MrKycpXQogICAlPlwKICAgJHtnZW5fc29sdXRpb24oc29sdXRpb25fcHJvamVjdHMsIHVzZV9kbGxzPSd5ZXMnKX0KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy92c3Byb2plY3RzL3ZjeHByb2oudGVtcGxhdGUgYi90ZW1wbGF0ZXMvdnNwcm9qZWN0cy92Y3hwcm9qLnRlbXBsYXRlCmluZGV4IGVjZjExM2IuLjBiYjIwOGYgMTAwNjQ0Ci0tLSBhL3RlbXBsYXRlcy92c3Byb2plY3RzL3ZjeHByb2oudGVtcGxhdGUKKysrIGIvdGVtcGxhdGVzL3ZzcHJvamVjdHMvdmN4cHJvai50ZW1wbGF0ZQpAQCAtMiwxMiArMiwxNCBAQAogLS0tCiBmb3JlYWNoOiB2c3Byb2plY3RzCiBvdXRwdXRfbmFtZTogJHtzZWxlY3RlZC52c19wcm9qX2Rpcn0vJHtzZWxlY3RlZC5uYW1lfS8ke3NlbGVjdGVkLm5hbWV9LnZjeHByb2oKK2NvbmQ6IHNlbGVjdGVkLmJ1aWxkIG5vdCBpbiBbJ2Z1enplciddCiB0ZW1wbGF0ZTogfAogICA8JW5hbWVzcGFjZSBmaWxlPSJ2Y3hwcm9qX2RlZnMuaW5jbHVkZSIgaW1wb3J0PSJnZW5fcHJvamVjdCIvPlwKICAgJHtnZW5fcHJvamVjdChzZWxlY3RlZC5uYW1lLCB2c3Byb2plY3RzKX0KIC0tLQogZm9yZWFjaDogdnNwcm9qZWN0cwogb3V0cHV0X25hbWU6ICR7c2VsZWN0ZWQudnNfcHJval9kaXJ9LyR7c2VsZWN0ZWQubmFtZX0vJHtzZWxlY3RlZC5uYW1lfS52Y3hwcm9qLmZpbHRlcnMKK2NvbmQ6IHNlbGVjdGVkLmJ1aWxkIG5vdCBpbiBbJ2Z1enplciddCiB0ZW1wbGF0ZTogfAogICA8JW5hbWVzcGFjZSBmaWxlPSJ2Y3hwcm9qLmZpbHRlcnNfZGVmcy5pbmNsdWRlIiBpbXBvcnQ9Imdlbl9maWx0ZXJzIi8+XAogICAke2dlbl9maWx0ZXJzKHNlbGVjdGVkLm5hbWUsIHZzcHJvamVjdHMpfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5jIGIvdGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5jCmluZGV4IGM3MTMwZjkuLjdmZDdhMDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfY2xpZW50L2JhZF9jbGllbnQuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC9iYWRfY2xpZW50LmMKQEAgLTMzLDEzICszMywxMyBAQAogCiAjaW5jbHVkZSAidGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5oIgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvYmFkcmVxLmMgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9iYWRyZXEuYwppbmRleCA5NWQ0NmQ1Li5mZDNkMTNmIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9iYWRyZXEuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9iYWRyZXEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKICNkZWZpbmUgUEZYX1NUUiAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9jb25uZWN0aW9uX3ByZWZpeC5jIGIvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvY29ubmVjdGlvbl9wcmVmaXguYwppbmRleCAwMDBlY2NhLi44NzgyNmFmIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9jb25uZWN0aW9uX3ByZWZpeC5jCisrKyBiL3Rlc3QvY29yZS9iYWRfY2xpZW50L3Rlc3RzL2Nvbm5lY3Rpb25fcHJlZml4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5oIgogCiBzdGF0aWMgdm9pZCB2ZXJpZmllcihncnBjX3NlcnZlciAqc2VydmVyLCBncnBjX2NvbXBsZXRpb25fcXVldWUgKmNxLApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvaGVhZGVycy5jIGIvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvaGVhZGVycy5jCmluZGV4IDRlY2RiNjQuLmY2NmYxNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfY2xpZW50L3Rlc3RzL2hlYWRlcnMuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9oZWFkZXJzLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5oIgogCiAjZGVmaW5lIFBGWF9TVFIgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvaW5pdGlhbF9zZXR0aW5nc19mcmFtZS5jIGIvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvaW5pdGlhbF9zZXR0aW5nc19mcmFtZS5jCmluZGV4IDIxMDQ4OTIuLmIzMDNmMDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfY2xpZW50L3Rlc3RzL2luaXRpYWxfc2V0dGluZ3NfZnJhbWUuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9pbml0aWFsX3NldHRpbmdzX2ZyYW1lLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5oIgogCiAjZGVmaW5lIFBGWF9TVFIgIlBSSSAqIEhUVFAvMi4wXHJcblxyXG5TTVxyXG5cclxuIgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvc2VydmVyX3JlZ2lzdGVyZWRfbWV0aG9kLmMgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9zZXJ2ZXJfcmVnaXN0ZXJlZF9tZXRob2QuYwppbmRleCBkMjgwODA0Li5jMzU0NTdjIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9zZXJ2ZXJfcmVnaXN0ZXJlZF9tZXRob2QuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9zZXJ2ZXJfcmVnaXN0ZXJlZF9tZXRob2QuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKICNkZWZpbmUgUEZYX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvc2ltcGxlX3JlcXVlc3QuYyBiL3Rlc3QvY29yZS9iYWRfY2xpZW50L3Rlc3RzL3NpbXBsZV9yZXF1ZXN0LmMKaW5kZXggZTUzNWJlMS4uNmNiNDRlZSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvc2ltcGxlX3JlcXVlc3QuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy9zaW1wbGVfcmVxdWVzdC5jCkBAIC0zNSw3ICszNSw3IEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKIAogI2RlZmluZSBQRlhfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvdW5rbm93bl9mcmFtZS5jIGIvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvdW5rbm93bl9mcmFtZS5jCmluZGV4IDcyOWE2ZDkuLjQ0ZDFlMzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfY2xpZW50L3Rlc3RzL3Vua25vd25fZnJhbWUuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy91bmtub3duX2ZyYW1lLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2JhZF9jbGllbnQvYmFkX2NsaWVudC5oIgogCiAjZGVmaW5lIFBGWF9TVFIgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2JhZF9jbGllbnQvdGVzdHMvd2luZG93X292ZXJmbG93LmMgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy93aW5kb3dfb3ZlcmZsb3cuYwppbmRleCBhOTExN2RlLi5iNmQwMTAxIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy93aW5kb3dfb3ZlcmZsb3cuYworKysgYi90ZXN0L2NvcmUvYmFkX2NsaWVudC90ZXN0cy93aW5kb3dfb3ZlcmZsb3cuYwpAQCAtMzcsNyArMzcsNyBAQAogCiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgogCiAjZGVmaW5lIFBGWF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICJQUkkgKiBIVFRQLzIuMFxyXG5cclxuU01cclxuXHJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvYmFkX3NzbC9iYWRfc3NsX3Rlc3QuYyBiL3Rlc3QvY29yZS9iYWRfc3NsL2JhZF9zc2xfdGVzdC5jCmluZGV4IGUyYmFiZmEuLjAxM2I4ZWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfc3NsL2JhZF9zc2xfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9iYWRfc3NsL2JhZF9zc2xfdGVzdC5jCkBAIC00MSw4ICs0MSw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdWJwcm9jZXNzLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvYmFkX3NzbC9zZXJ2ZXJzL2FscG4uYyBiL3Rlc3QvY29yZS9iYWRfc3NsL3NlcnZlcnMvYWxwbi5jCmluZGV4IGM4Y2M4M2IuLjMyMjVmZDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfc3NsL3NlcnZlcnMvYWxwbi5jCisrKyBiL3Rlc3QvY29yZS9iYWRfc3NsL3NlcnZlcnMvYWxwbi5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2JhZF9zc2wvc2VydmVyX2NvbW1vbi5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2RhdGEvc3NsX3Rlc3RfZGF0YS5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvYmFkX3NzbC9zZXJ2ZXJzL2NlcnQuYyBiL3Rlc3QvY29yZS9iYWRfc3NsL3NlcnZlcnMvY2VydC5jCmluZGV4IDRlZGVmNTAuLjczMDc2ODIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9iYWRfc3NsL3NlcnZlcnMvY2VydC5jCisrKyBiL3Rlc3QvY29yZS9iYWRfc3NsL3NlcnZlcnMvY2VydC5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmgiCiAKICNpbmNsdWRlICJ0ZXN0L2NvcmUvYmFkX3NzbC9zZXJ2ZXJfY29tbW9uLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZGF0YS9zc2xfdGVzdF9kYXRhLmgiCkBAIC01Niw5ICs1NiwxMSBAQAogCiAgIGdycGNfaW5pdCgpOwogCi0gIGNlcnRfc2xpY2UgPSBncHJfbG9hZF9maWxlKCJzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIucGVtIiwgMSwgJm9rKTsKKyAgY2VydF9zbGljZSA9CisgICAgICBncHJfbG9hZF9maWxlKCJzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvYmFkc2VydmVyLnBlbSIsIDEsICZvayk7CiAgIEdQUl9BU1NFUlQob2spOwotICBrZXlfc2xpY2UgPSBncHJfbG9hZF9maWxlKCJzcmMvY29yZS90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIua2V5IiwgMSwgJm9rKTsKKyAga2V5X3NsaWNlID0KKyAgICAgIGdwcl9sb2FkX2ZpbGUoInNyYy9jb3JlL2xpYi90c2kvdGVzdF9jcmVkcy9iYWRzZXJ2ZXIua2V5IiwgMSwgJm9rKTsKICAgR1BSX0FTU0VSVChvayk7CiAgIHBlbV9rZXlfY2VydF9wYWlyLnByaXZhdGVfa2V5ID0gKGNvbnN0IGNoYXIgKilHUFJfU0xJQ0VfU1RBUlRfUFRSKGtleV9zbGljZSk7CiAgIHBlbV9rZXlfY2VydF9wYWlyLmNlcnRfY2hhaW4gPSAoY29uc3QgY2hhciAqKUdQUl9TTElDRV9TVEFSVF9QVFIoY2VydF9zbGljZSk7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2Vuc3VzL21sb2dfdGVzdC5jIGIvdGVzdC9jb3JlL2NlbnN1cy9tbG9nX3Rlc3QuYwppbmRleCAwMDBhYzczLi5hMWZhZGMyIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvY2Vuc3VzL21sb2dfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9jZW5zdXMvbWxvZ190ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2NlbnN1cy9tbG9nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmgiCiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2NwdS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzX3Rlc3QuYyBiL3Rlc3QvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJnc190ZXN0LmMKaW5kZXggMGI3NGRlZS4uMzUyZGZhMCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3NfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgogCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja190ZXN0LmMgYi90ZXN0L2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX3Rlc3QuYwppbmRleCBjNGMyODhkLi40OWU5YzdlIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzX3Rlc3QuYyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzX3Rlc3QuYwppbmRleCA5MWZhNjNlLi5iYzcwNDBkIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llc190ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXNfdGVzdC5jCkBAIC00MSwxMyArNDEsMTMgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgpAQCAtODczLDYgKzg3Myw3IEBACiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBncnBjX2V4ZWNfY3R4IGV4ZWNfY3R4ID0gR1JQQ19FWEVDX0NUWF9JTklUOwogICB0ZXN0X3NwZWMgKnNwZWM7CiAgIHNpemVfdCBpOwogICBjb25zdCBzaXplX3QgTlVNX0lURVJTID0gMTA7CkBAIC04ODIsOSArODgzLDkgQEAKICAgZ3JwY19pbml0KCk7CiAgIGdycGNfbGJfcm91bmRfcm9iaW5fdHJhY2UgPSAxOwogCi0gIEdQUl9BU1NFUlQoZ3JwY19sYl9wb2xpY3lfY3JlYXRlKCJ0aGlzLWxiLXBvbGljeS1kb2VzLW5vdC1leGlzdCIsIE5VTEwpID09Ci0gICAgICAgICAgICAgTlVMTCk7Ci0gIEdQUl9BU1NFUlQoZ3JwY19sYl9wb2xpY3lfY3JlYXRlKE5VTEwsIE5VTEwpID09IE5VTEwpOworICBHUFJfQVNTRVJUKGdycGNfbGJfcG9saWN5X2NyZWF0ZSgmZXhlY19jdHgsICJ0aGlzLWxiLXBvbGljeS1kb2VzLW5vdC1leGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IE5VTEwpOworICBHUFJfQVNTRVJUKGdycGNfbGJfcG9saWN5X2NyZWF0ZSgmZXhlY19jdHgsIE5VTEwsIE5VTEwpID09IE5VTEwpOwogCiAgIHNwZWMgPSB0ZXN0X3NwZWNfY3JlYXRlKE5VTV9JVEVSUywgTlVNX1NFUlZFUlMpOwogICAvKiBldmVyeXRoaW5nIGlzIGZpbmUsIGFsbCBzZXJ2ZXJzIHN0YXkgdXAgdGhlIHdob2xlIHRpbWUgYW5kIGxpZmUncyBwZWFjaHkgKi8KQEAgLTkzNiw2ICs5MzcsNyBAQAogICB0ZXN0X3BlbmRpbmdfY2FsbHMoNCk7CiAgIHRlc3RfcGluZygpOwogCisgIGdycGNfZXhlY19jdHhfZmluaXNoKCZleGVjX2N0eCk7CiAgIGdycGNfc2h1dGRvd24oKTsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyX2Nvbm5lY3Rpdml0eV90ZXN0LmMgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyX2Nvbm5lY3Rpdml0eV90ZXN0LmMKaW5kZXggNzVkMWViNi4uZGM2YTYxNCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlcl9jb25uZWN0aXZpdHlfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXJfY29ubmVjdGl2aXR5X3Rlc3QuYwpAQCAtMzEsMTUgKzMxLDE1IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIHZvaWQgc3ViY2hhbm5lbF9mYWN0b3J5X3JlZihncnBjX3N1YmNoYW5uZWxfZmFjdG9yeSAqc2N2KSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlcl90ZXN0LmMgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyX3Rlc3QuYwppbmRleCAzOGU3NmQ1Li42YzdhNmIyIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyX3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMxLDEzICszMSwxMyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiBzdGF0aWMgdm9pZCBzdWJjaGFubmVsX2ZhY3RvcnlfcmVmKGdycGNfc3ViY2hhbm5lbF9mYWN0b3J5ICpzY3YpIHt9CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXJfdGVzdC5jIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyX3Rlc3QuYwppbmRleCA4ODU2Yzg1Li5mYWZkZGZkIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXJfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlcl90ZXN0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSwxMyArMzEsMTMgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKIHN0YXRpYyB2b2lkIHN1YmNoYW5uZWxfZmFjdG9yeV9yZWYoZ3JwY19zdWJjaGFubmVsX2ZhY3RvcnkgKnNjdikge30KZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX3Rlc3QuYyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3NldF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nX3Rlc3QuYwppbmRleCAzY2YyNjdmLi43ZmQ5MmEwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy9zZXRfaW5pdGlhbF9jb25uZWN0X3N0cmluZ190ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvc2V0X2luaXRpYWxfY29ubmVjdF9zdHJpbmdfdGVzdC5jCkBAIC0zOCwxMCArMzgsMTAgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3NsaWNlLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF90Y3Bfc2VydmVyLmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzA0MmRjNDUxMmZhM2QzOTFjNTE3MGNmM2FhNjFlNmE2MzhmODQzNDIgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzA0MmRjNDUxMmZhM2QzOTFjNTE3MGNmM2FhNjFlNmE2MzhmODQzNDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3YTZkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMDQyZGM0NTEyZmEzZDM5MWM1MTcwY2YzYWE2MWU2YTYzOGY4NDM0MgpAQCAtMCwwICsxIEBACitpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8wZTliYmU5NzVmMjAyN2U4YzM5Yzg5Zjg1ZjY2NzUzMDM2OGU3ZDExIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8wZTliYmU5NzVmMjAyN2U4YzM5Yzg5Zjg1ZjY2NzUzMDM2OGU3ZDExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NmI4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzBlOWJiZTk3NWYyMDI3ZThjMzljODlmODVmNjY3NTMwMzY4ZTdkMTEKQEAgLTAsMCArMSBAQAorOmlpadA/K24haWoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzE0YjU3YmNiZjFlMTdiMWRiMWRlNDkxZWYyYmEzNzY4ZjcwNGI3ZGMgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzE0YjU3YmNiZjFlMTdiMWRiMWRlNDkxZWYyYmEzNzY4ZjcwNGI3ZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzNmU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMTRiNTdiY2JmMWUxN2IxZGIxZGU0OTFlZjJiYTM3NjhmNzA0YjdkYwpAQCAtMCwwICsxIEBACis6h2k/PW5pSV8hJzvxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8xNzk0MzEwNjcxYTA2MGVlYWQ2ZTVlZTY2YWM5NzhhMThlYzdlODRmIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8xNzk0MzEwNjcxYTA2MGVlYWQ2ZTVlZTY2YWM5NzhhMThlYzdlODRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGM0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzE3OTQzMTA2NzFhMDYwZWVhZDZlNWVlNjZhYzk3OGExOGVjN2U4NGYKQEAgLTAsMCArMSwyIEBACit+aXBpcH42OjoxCit2OtA6MQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8xZDMwYjJhNzlhZmJhZjI4MjhmZjQyYjlhOTY0N2U5NDJiYTFhYjgwIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8xZDMwYjJhNzlhZmJhZjI4MjhmZjQyYjlhOTY0N2U5NDJiYTFhYjgwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWFjMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzFkMzBiMmE3OWFmYmFmMjgyOGZmNDJiOWE5NjQ3ZTk0MmJhMWFiODAKQEAgLTAsMCArMSBAQAorOmlsMFAvOD9uISRpOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMWZjZjVkOWMzMzNiNzA1OTZjZjViYTA0ZDFmN2FmZmRmNDQ1Yjk3MSBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMWZjZjVkOWMzMzNiNzA1OTZjZjViYTA0ZDFmN2FmZmRmNDQ1Yjk3MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ2OWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8xZmNmNWQ5YzMzM2I3MDU5NmNmNWJhMDRkMWY3YWZmZGY0NDViOTcxCkBAIC0wLDAgKzEsMyBAQAoraWlQKnY6OjpwaXB+Njo6OjAKK3Y6OjoxMQorCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzIzMTYyYzhhODkzNmUyMGIxOTU0MDRjMjEzMzdlZTczNGQwMmE2YmMgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzIzMTYyYzhhODkzNmUyMGIxOTU0MDRjMjEzMzdlZTczNGQwMmE2YmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5MDIzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMjMxNjJjOGE4OTM2ZTIwYjE5NTQwNGMyMTMzN2VlNzM0ZDAyYTZiYwpAQCAtMCwwICsxIEBACis6aWkvaT9uISVpKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMjNmMzE5OGI4MTVjYTYwYmRhZGNhYWU2ODJiOWY5NjVkZGEzODdmMSBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMjNmMzE5OGI4MTVjYTYwYmRhZGNhYWU2ODJiOWY5NjVkZGEzODdmMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmRjM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8yM2YzMTk4YjgxNWNhNjBiZGFkY2FhZTY4MmI5Zjk2NWRkYTM4N2YxCkBAIC0wLDAgKzEgQEAKK3VuaTo6Lmk/bighaXBSNi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzJlZjM4OTNiNDNmMWY2MGI3N2I1OWNlMDZhNmJjZTk4MTVkNzhlYWYgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzJlZjM4OTNiNDNmMWY2MGI3N2I1OWNlMDZhNmJjZTk4MTVkNzhlYWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3NjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMmVmMzg5M2I0M2YxZjYwYjc3YjU5Y2UwNmE2YmNlOTgxNWQ3OGVhZgpAQCAtMCwwICsxLDIgQEAKKzovaT9uIWlwdjY6Li86OmFiYy4qCisKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMzU2YzNjMTI5ZTIwM2I1Yzc0NTUwYjQyMDk3NjRkNzRiOWNhZWZjZSBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvMzU2YzNjMTI5ZTIwM2I1Yzc0NTUwYjQyMDk3NjRkNzRiOWNhZWZjZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFlMjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8zNTZjM2MxMjllMjAzYjVjNzQ1NTBiNDIwOTc2NGQ3NGI5Y2FlZmNlCkBAIC0wLDAgKzEgQEAKK3VuaXg6Ly9paTojdjZpP24hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8zYjU4ODYwZjM0NTFkM2U3YWFkOTk2OTBhOGQzOTc4MmNhNTExNmZjIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy8zYjU4ODYwZjM0NTFkM2U3YWFkOTk2OTBhOGQzOTc4MmNhNTExNmZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWIyMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzNiNTg4NjBmMzQ1MWQzZTdhYWQ5OTY5MGE4ZDM5NzgyY2E1MTE2ZmMKQEAgLTAsMCArMSw0IEBACitpOmk/bmlwfiYyLi86OjphYmlwaXB+NmMuKgorCis6OjEKK3Y60DoxCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzQ3YjUyMjg0MDQ0NTFmYzlkNDA3MWZhNjkxOTI1MTRiYjRjZTMzYzEgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzQ3YjUyMjg0MDQ0NTFmYzlkNDA3MWZhNjkxOTI1MTRiYjRjZTMzYzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNTJlMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvNDdiNTIyODQwNDQ1MWZjOWQ0MDcxZmE2OTE5MjUxNGJiNGNlMzNjMQpAQCAtMCwwICsxIEBACis6aWlQL2k/biEnaSoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzYzNmM1NjA2ZmMyMzcxM2ExYmFlODhjODg5OWMwNTQxY2ZhZDRmZDggYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzYzNmM1NjA2ZmMyMzcxM2ExYmFlODhjODg5OWMwNTQxY2ZhZDRmZDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjNDkzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvNjM2YzU2MDZmYzIzNzEzYTFiYWU4OGM4ODk5YzA1NDFjZmFkNGZkOApAQCAtMCwwICsxLDQgQEAKKzppP24haXB+ZjI6Li86OmFiaXBpcH42Yy4qCisKKzo6MQordjrQOjEKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvNjNmZTQ5M2IyNzBiMTc0MjZkNzdhMjdjYmYzYWJhYzViMmMyNzk0YSBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvNjNmZTQ5M2IyNzBiMTc0MjZkNzdhMjdjYmYzYWJhYzViMmMyNzk0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk1MzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy82M2ZlNDkzYjI3MGIxNzQyNmQ3N2EyN2NiZjNhYmFjNWIyYzI3OTRhCkBAIC0wLDAgKzEgQEAKKzqHaT89bmlJISc78QpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvNjU1MzAwYTkwMmI2MjY2MjI5NmE4ZTQ2YmZiMDRmYmNiMDcxODJjYiBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvNjU1MzAwYTkwMmI2MjY2MjI5NmE4ZTQ2YmZiMDRmYmNiMDcxODJjYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFjYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy82NTUzMDBhOTAyYjYyNjYyMjk2YThlNDZiZmIwNGZiY2IwNzE4MmNiCkBAIC0wLDAgKzEgQEAKK3VuaXg6Ly9paTpwdjZpP24hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy82YjcwOTc5YTcwYTAzOGZmNjYwN2Q2Y2Y4NTQ4NWVlOTViYWY1OGU2IGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy82YjcwOTc5YTcwYTAzOGZmNjYwN2Q2Y2Y4NTQ4NWVlOTViYWY1OGU2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2JkNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzZiNzA5NzlhNzBhMDM4ZmY2NjA3ZDZjZjg1NDg1ZWU5NWJhZjU4ZTYKQEAgLTAsMCArMSBAQAordW5pOjovaT9uIWlwUjYvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy83MzE0YWIzNTQ1YTc1MzVhMjZlMGU4YWFkNjdjYWVhNTUzNGQ2OGIxIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy83MzE0YWIzNTQ1YTc1MzVhMjZlMGU4YWFkNjdjYWVhNTUzNGQ2OGIxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2NmNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzczMTRhYjM1NDVhNzUzNWEyNmUwZThhYWQ2N2NhZWE1NTM0ZDY4YjEKQEAgLTAsMCArMSwyIEBACitpcGlwfjY6OjoxCit2Ojo6MQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy84ODRkY2FlZTI5MDhmZmU1ZjEyYjY1YjhlYmE4MTAxNjA5OWM0MjY2IGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy84ODRkY2FlZTI5MDhmZmU1ZjEyYjY1YjhlYmE4MTAxNjA5OWM0MjY2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZWNjN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzg4NGRjYWVlMjkwOGZmZTVmMTJiNjViOGViYTgxMDE2MDk5YzQyNjYKQEAgLTAsMCArMSBAQAoraXAqdjo6OjEKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvOTZjOGQyNjZiN2RjMDM3Mjg4ZWYzMDVjOTk2NjA4MjcwZjcyZTdmYiBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvOTZjOGQyNjZiN2RjMDM3Mjg4ZWYzMDVjOTk2NjA4MjcwZjcyZTdmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmIzOTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy85NmM4ZDI2NmI3ZGMwMzcyODhlZjMwNWM5OTY2MDgyNzBmNzJlN2ZiCkBAIC0wLDAgKzEsMiBAQAorOi9pL24haXB2Njo6Oi9hLmIuYzEKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy85NzU1MzZjNzFhZGU0ODAwNDE1YTdlOWMyZjFiNDVjMzVhNmQ1ZWE4IGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy85NzU1MzZjNzFhZGU0ODAwNDE1YTdlOWMyZjFiNDVjMzVhNmQ1ZWE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTUyMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzLzk3NTUzNmM3MWFkZTQ4MDA0MTVhN2U5YzJmMWI0NWMzNWE2ZDVlYTgKQEAgLTAsMCArMSBAQAoraWxQLmk7P24hI2khOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvOTk3NTBhYTY3ZDMwYmVhZWE4YWY1NjVjODI5ZDQ5OTlhYThjYjkxYiBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvOTk3NTBhYTY3ZDMwYmVhZWE4YWY1NjVjODI5ZDQ5OTlhYThjYjkxYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDYxZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy85OTc1MGFhNjdkMzBiZWFlYThhZjU2NWM4MjlkNDk5OWFhOGNiOTFiCkBAIC0wLDAgKzEgQEAKK3VuaXg6Oi9pP24haXB2Ni8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2ExZjBmOWI3NWJiMzU0ZWIwNjNkN2NiYTRmY2ZhMmQwYjg4ZDYzZGUgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2ExZjBmOWI3NWJiMzU0ZWIwNjNkN2NiYTRmY2ZhMmQwYjg4ZDYzZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2ZTYzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvYTFmMGY5Yjc1YmIzNTRlYjA2M2Q3Y2JhNGZjZmEyZDBiODhkNjNkZQpAQCAtMCwwICsxIEBACis6omlsUC9pO24hI2k6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9hMjk2ZWIzZDFkNDM2ZWQ3ZGY3MTk1YjEwYWEzYzRkZTM4OTZmOThkIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9hMjk2ZWIzZDFkNDM2ZWQ3ZGY3MTk1YjEwYWEzYzRkZTM4OTZmOThkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjJmODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2EyOTZlYjNkMWQ0MzZlZDdkZjcxOTViMTBhYTNjNGRlMzg5NmY5OGQKQEAgLTAsMCArMSBAQAordStuaTo6L2k/biFpcFIzLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvYThiOGU2NjA1MGI0MjRmMWI4YzA3ZDQ2Zjg2ODE5OWZiN2Y2MGUzOCBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvYThiOGU2NjA1MGI0MjRmMWI4YzA3ZDQ2Zjg2ODE5OWZiN2Y2MGUzOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ExMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9hOGI4ZTY2MDUwYjQyNGYxYjhjMDdkNDZmODY4MTk5ZmI3ZjYwZTM4CkBAIC0wLDAgKzEgQEAKK3VuaTo6cGk6bWlQLz9uaS4hKFJpPyk4L24hJ2kqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9hZjU1YmFmOGM4ODU1ZTU2M2JlZmRmMWVlZmJjYmQ0NmM1ZGRiOGQyIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9hZjU1YmFmOGM4ODU1ZTU2M2JlZmRmMWVlZmJjYmQ0NmM1ZGRiOGQyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDE5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2FmNTViYWY4Yzg4NTVlNTYzYmVmZGYxZWVmYmNiZDQ2YzVkZGI4ZDIKQEAgLTAsMCArMSBAQAordW5pOjouaSFpbjovaS9uIWlwdjaeOj8ocFI7OjovYS4yYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvYjNjMGJmNjZjMmJmNWQyNGVmMWRhZjRjYzVhOWQ2ZDViZDBlOGJmZCBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvYjNjMGJmNjZjMmJmNWQyNGVmMWRhZjRjYzVhOWQ2ZDViZDBlOGJmZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTEyMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9iM2MwYmY2NmMyYmY1ZDI0ZWYxZGFmNGNjNWE5ZDZkNWJkMGU4YmZkCkBAIC0wLDAgKzEgQEAKKzppaS9paWxQLmk7P24/biEjaSE7ISUqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9jZWI0ZTIyNjRiYTdhOGQ1YmU0N2QyNzZiMzdlYzA5NDg5ZTAwMjQ1IGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9jZWI0ZTIyNjRiYTdhOGQ1YmU0N2QyNzZiMzdlYzA5NDg5ZTAwMjQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjU1MjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2NlYjRlMjI2NGJhN2E4ZDViZTQ3ZDI3NmIzN2VjMDk0ODllMDAyNDUKQEAgLTAsMCArMSBAQAorOodpP1AtbmlJISdp8QpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvY2Y0Mzk1OTU4ZjViZmI0NmZkNmY1MzVhMzk2NTdkMDE2Yzc1MTE0YyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvY2Y0Mzk1OTU4ZjViZmI0NmZkNmY1MzVhMzk2NTdkMDE2Yzc1MTE0YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzY1NjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9jZjQzOTU5NThmNWJmYjQ2ZmQ2ZjUzNWEzOTY1N2QwMTZjNzUxMTRjCkBAIC0wLDAgKzEgQEAKK3VuaXg6Ly9pcHY2Ojo6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9kNDY2NjgzNzJiN2UyMDE1NGE4OTQwOWE3NDMwYTI4ZTY0MmFmZGNhIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9kNDY2NjgzNzJiN2UyMDE1NGE4OTQwOWE3NDMwYTI4ZTY0MmFmZGNhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NThmYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2Q0NjY2ODM3MmI3ZTIwMTU0YTg5NDA5YTc0MzBhMjhlNjQyYWZkY2EKQEAgLTAsMCArMSBAQAorOmlsUC9pP24hI2k6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9kNmZlNzQxMmEwYTFkMWM3MzMxNjAyNDZmM2ZhNDI1ZjRmOTc2ODJhIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9kNmZlNzQxMmEwYTFkMWM3MzMxNjAyNDZmM2ZhNDI1ZjRmOTc2ODJhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzdiNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2Q2ZmU3NDEyYTBhMWQxYzczMzE2MDI0NmYzZmE0MjVmNGY5NzY4MmEKQEAgLTAsMCArMSBAQAorOmlsUC9pP24sISNpOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZG5zLnR4dCBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZG5zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdlMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9kbnMudHh0CkBAIC0wLDAgKzEgQEAKK2RuczoxMC4yLjEuMQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9lYTAyZDlmZWE5YmFkNWI4OWNmMzUzYTAxNjkyMzhmNTg0MTc3ZTcxIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9lYTAyZDlmZWE5YmFkNWI4OWNmMzUzYTAxNjkyMzhmNTg0MTc3ZTcxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjVhMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2VhMDJkOWZlYTliYWQ1Yjg5Y2YzNTNhMDE2OTIzOGY1ODQxNzdlNzEKQEAgLTAsMCArMSw0IEBACitpOmk/biFpcH5mMi46Lzo6YWJpcGlwfjZjLioKKworOjoxCit2OtA6MQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9lYzQ3MzFkZGRmOTRlZDNlYTkyYWU0ZDVhNzFmMTQ1YWI2ZTNmNmVlIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9lYzQ3MzFkZGRmOTRlZDNlYTkyYWU0ZDVhNzFmMTQ1YWI2ZTNmNmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzkzZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2VjNDczMWRkZGY5NGVkM2VhOTJhZTRkNWE3MWYxNDVhYjZlM2Y2ZWUKQEAgLTAsMCArMSBAQAoraWktaT9uISUqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9lZDJmNzg2NDZmMTlmYzQ3ZGQ4NWZmMDg3N2MyMzJiNzE5MTNlY2UyIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9lZDJmNzg2NDZmMTlmYzQ3ZGQ4NWZmMDg3N2MyMzJiNzE5MTNlY2UyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDY1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2VkMmY3ODY0NmYxOWZjNDdkZDg1ZmYwODc3YzIzMmI3MTkxM2VjZTIKQEAgLTAsMCArMSBAQAorOmlpL2k/biElKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZjY4ODlmNGE2MzUwZmVhMTU5NmEzYWRlYTVjZGFjMDJiZDVkMWZmMyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZjY4ODlmNGE2MzUwZmVhMTU5NmEzYWRlYTVjZGFjMDJiZDVkMWZmMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjE1MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mNjg4OWY0YTYzNTBmZWExNTk2YTNhZGVhNWNkYWMwMmJkNWQxZmYzCkBAIC0wLDAgKzEsMiBAQAorOmlwaXB+Njo6OjEKK3ZpaS86OjppdW5peDo/bi8xL2lwdjYhJQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZjZmM2JkMDMwZjBkMzIxZWZlN2M1MWNhM2YwNTdkZTIzNTA5YWY2NyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZjZmM2JkMDMwZjBkMzIxZWZlN2M1MWNhM2YwNTdkZTIzNTA5YWY2NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDM0ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mNmYzYmQwMzBmMGQzMjFlZmU3YzUxY2EzZjA1N2RlMjM1MDlhZjY3CkBAIC0wLDAgKzEgQEAKKzppaVAvaT9uIWkqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mOTc1OThjZmYwMzMwNmFmM2M3MDQwMDYwOGZlYzQ3MjY4YjUwNzVkIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mOTc1OThjZmYwMzMwNmFmM2M3MDQwMDYwOGZlYzQ3MjY4YjUwNzVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDk0NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2Y5NzU5OGNmZjAzMzA2YWYzYzcwNDAwNjA4ZmVjNDcyNjhiNTA3NWQKQEAgLTAsMCArMSwyIEBACit1bml4Oi8vaXB2Njo6Oi9hLmIuYzEKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mOWUxZWMxZmM2NDJiNTc1YmM5OTU1NjE4YjcwNjU3NDdmNTZiMTAxIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mOWUxZWMxZmM2NDJiNTc1YmM5OTU1NjE4YjcwNjU3NDdmNTZiMTAxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODlhNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2Y5ZTFlYzFmYzY0MmI1NzViYzk5NTU2MThiNzA2NTc0N2Y1NmIxMDEKQEAgLTAsMCArMSBAQAorOmlsUC5pOz9uISNpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZmUwNjMwYTNhZWVkMmVjNmY0NzRmMzYyZTRjODM5NDc4MjkwZDVjNCBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvZmUwNjMwYTNhZWVkMmVjNmY0NzRmMzYyZTRjODM5NDc4MjkwZDVjNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmVlZmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9mZTA2MzBhM2FlZWQyZWM2ZjQ3NGYzNjJlNGM4Mzk0NzgyOTBkNWM0CkBAIC0wLDAgKzEgQEAKKzptaVAvaT8pbiEnaSoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2lwdjQudHh0IGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9pcHY0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI5NDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9pcHY0LnR4dApAQCAtMCwwICsxIEBACitpcHY0OjEwLjIuMS4xCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfY29ycHVzL2lwdjYudHh0IGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9pcHY2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY5MzJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy9pcHY2LnR4dApAQCAtMCwwICsxIEBACitpcHY2Ojo6MQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cy91bml4LnR4dCBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvdW5peC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwOTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9jb3JwdXMvdW5peC50eHQKQEAgLTAsMCArMSBAQAordW5peDovLy9hLmIuYwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2Z1enplcl90ZXN0LmMgYi90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfZnV6emVyX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0NmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2Z1enplcl90ZXN0LmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CisKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiCisKK2ludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGNoYXIgKnMgPSBncHJfbWFsbG9jKHNpemUgKyAxKTsKKyAgbWVtY3B5KHMsIGRhdGEsIHNpemUpOworICBzW3NpemVdID0gMDsKKworICBncnBjX3VyaSAqeDsKKyAgaWYgKCh4ID0gZ3JwY191cmlfcGFyc2UocywgMSkpKSB7CisgICAgZ3JwY191cmlfZGVzdHJveSh4KTsKKyAgfQorICBncHJfZnJlZShzKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyX3Rlc3QuYyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXJfdGVzdC5jCmluZGV4IGRmMTJkNmIuLmM3Zjc3MjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXJfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXJfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fdGVzdC5jIGIvdGVzdC9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV90ZXN0LmMKaW5kZXggN2RlN2UxMS4uOTM3ZWI2NiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV90ZXN0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIHZvaWQgdGVzdF9hbGdvcml0aG1fbWVzaCh2b2lkKSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzc190ZXN0LmMgYi90ZXN0L2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzc190ZXN0LmMKaW5kZXggNmQzZDE2MS4uMzc4YmFkYyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3NfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzX3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3NsaWNlX3NwbGl0dGVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmMKaW5kZXggMzY4N2Y3Yy4uYmFmOGU4ZSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5jCkBAIC00NCw4ICs0NCw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIgogCiAjZGVmaW5lIFJPT1RfRVhQRUNUQVRJT04gMTAwMAogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9kdWFsc3RhY2tfc29ja2V0X3Rlc3QuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2R1YWxzdGFja19zb2NrZXRfdGVzdC5jCmluZGV4IDc3NTg5YTcuLjc1MDFkZjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2R1YWxzdGFja19zb2NrZXRfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2R1YWxzdGFja19zb2NrZXRfdGVzdC5jCkBAIC0zOSw5ICszOSw5IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9jZW5zdXMuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2NlbnN1cy5jCmluZGV4IDRkODlhOGYuLjlkMDkxZDUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2NlbnN1cy5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2NlbnN1cy5jCkBAIC00MSwxMyArNDEsMTMgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfY29tcHJlc3MuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2NvbXByZXNzLmMKaW5kZXggMTlhMjQ5NS4uOGQ4ZDVlNyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfY29tcHJlc3MuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9jb21wcmVzcy5jCkBAIC00MSwxMyArNDEsMTMgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZmFrZXNlYy5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZmFrZXNlYy5jCmluZGV4IDhiZThlMzUuLjczODY2OTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Zha2VzZWMuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mYWtlc2VjLmMKQEAgLTM5LDggKzM5LDggQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9kYXRhL3NzbF90ZXN0X2RhdGEuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Z1bGwrcGlwZS5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbCtwaXBlLmMKaW5kZXggZjJkNzJmMC4uZTIzODAyMyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbCtwaXBlLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbCtwaXBlLmMKQEAgLTQxLDEzICs0MSwxMyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Z1bGwrcG9sbCtwaXBlLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsK3BvbGwrcGlwZS5jCmluZGV4IDY4MjU5OGYuLjY4ODY4NmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Z1bGwrcG9sbCtwaXBlLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbCtwb2xsK3BpcGUuYwpAQCAtNDIsMTQgKzQyLDE0IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbCtwb2xsLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsK3BvbGwuYwppbmRleCA1YTBiMmVmLi40YmIxZjgwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsK3BvbGwuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsK3BvbGwuYwpAQCAtNDIsMTMgKzQyLDEzIEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsK3RyYWNlLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsK3RyYWNlLmMKaW5kZXggYzg0YmQ3Mi4uZjFiNGM1ZCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbCt0cmFjZS5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Z1bGwrdHJhY2UuYwpAQCAtNDEsMTMgKzQxLDEzIEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Z1bGwuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX2Z1bGwuYwppbmRleCBjNTZkMmZjLi5jZDg4ZWQyIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9mdWxsLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfZnVsbC5jCkBAIC00MSwxMiArNDEsMTIgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX29hdXRoMi5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfb2F1dGgyLmMKaW5kZXggMjc5MDYxYi4uZWUxODhjYyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfb2F1dGgyLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfb2F1dGgyLmMKQEAgLTM5LDkgKzM5LDkgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2RhdGEvc3NsX3Rlc3RfZGF0YS5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfcHJveHkuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3Byb3h5LmMKaW5kZXggMWU5YWE2Mi4uMjk5ZTQ0ZSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfcHJveHkuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9wcm94eS5jCkBAIC00MSwxMiArNDEsMTIgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvcHJveHkuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NvY2twYWlyK3RyYWNlLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zb2NrcGFpcit0cmFjZS5jCmluZGV4IDMzMDY4NzIuLjVmYzhiMzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NvY2twYWlyK3RyYWNlLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfc29ja3BhaXIrdHJhY2UuYwpAQCAtNDAsMTcgKzQwLDE3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NvY2twYWlyLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zb2NrcGFpci5jCmluZGV4IGQ2NGM4NWEuLjczOWU1NTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NvY2twYWlyLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfc29ja3BhaXIuYwpAQCAtNDAsMTYgKzQwLDE2IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGhkLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zb2NrcGFpcl8xYnl0ZS5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfc29ja3BhaXJfMWJ5dGUuYwppbmRleCA2NzE4MGE1Li5mNTMxMmNhIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zb2NrcGFpcl8xYnl0ZS5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NvY2twYWlyXzFieXRlLmMKQEAgLTQwLDE2ICs0MCwxNiBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfc3NsK3BvbGwuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbCtwb2xsLmMKaW5kZXggNGMzYmM2NC4uZTkzYjQzNiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfc3NsK3BvbGwuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zc2wrcG9sbC5jCkBAIC00MCwxMiArNDAsMTIgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZGF0YS9zc2xfdGVzdF9kYXRhLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zc2wuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbC5jCmluZGV4IDZhNGU4ZGMuLmZlY2QwM2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbC5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbC5jCkBAIC00MCwxMSArNDAsMTEgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZGF0YS9zc2xfdGVzdF9kYXRhLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl9zc2xfcHJveHkuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbF9wcm94eS5jCmluZGV4IGY1ZmNiOTEuLmJmYmM3MzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbF9wcm94eS5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3NzbF9wcm94eS5jCkBAIC00MCwxMSArNDAsMTEgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZGF0YS9zc2xfdGVzdF9kYXRhLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvcHJveHkuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl91ZHMrcG9sbC5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvZml4dHVyZXMvaDJfdWRzK3BvbGwuYwppbmRleCBjM2E4NTVmLi4zOWFlMzRhIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl91ZHMrcG9sbC5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3Vkcytwb2xsLmMKQEAgLTQ1LDE0ICs0NSwxNCBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC9maXh0dXJlcy9oMl91ZHMuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3Vkcy5jCmluZGV4IDMyMjhjMDUuLmNjMGQ2YmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3Vkcy5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL2ZpeHR1cmVzL2gyX3Vkcy5jCkBAIC00NCwxMyArNDQsMTMgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvYmFkX2hvc3RuYW1lLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9iYWRfaG9zdG5hbWUuYwppbmRleCBmZTdhMjc1Li5lOGMwN2FjIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9iYWRfaG9zdG5hbWUuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9iYWRfaG9zdG5hbWUuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKIGVudW0geyBUSU1FT1VUID0gMjAwMDAwIH07CkBAIC0xNTIsNyArMTUyLDcgQEAKICAgY3FfZXhwZWN0X2NvbXBsZXRpb24oY3F2LCB0YWcoMSksIDEpOwogICBjcV92ZXJpZnkoY3F2KTsKIAotICBHUFJfQVNTRVJUKHN0YXR1cyA9PSBHUlBDX1NUQVRVU19JTlZBTElEX0FSR1VNRU5UKTsKKyAgR1BSX0FTU0VSVChzdGF0dXMgPT0gR1JQQ19TVEFUVVNfSU5URVJOQUwpOwogCiAgIGdwcl9mcmVlKGRldGFpbHMpOwogICBncnBjX21ldGFkYXRhX2FycmF5X2Rlc3Ryb3koJmluaXRpYWxfbWV0YWRhdGFfcmVjdik7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9jYWxsX2NyZWRzLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9jYWxsX2NyZWRzLmMKaW5kZXggNDE3ZjdlOC4uZjc0OWE2MCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvY2FsbF9jcmVkcy5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2NhbGxfY3JlZHMuYwpAQCAtNDIsOCArNDIsOCBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgaWFtX3Rva2VuW10gPSAidG9rZW4iOwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvY2FuY2VsX3dpdGhfc3RhdHVzLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9jYW5jZWxfd2l0aF9zdGF0dXMuYwppbmRleCAxMzViZGYwLi5lNWExNTU2IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9jYW5jZWxfd2l0aF9zdGF0dXMuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9jYW5jZWxfd2l0aF9zdGF0dXMuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKIGVudW0geyBUSU1FT1VUID0gMjAwMDAwIH07CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9jb21wcmVzc2VkX3BheWxvYWQuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2NvbXByZXNzZWRfcGF5bG9hZC5jCmluZGV4IGM5MDkyZTMuLjljMjU4ODUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2NvbXByZXNzZWRfcGF5bG9hZC5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2NvbXByZXNzZWRfcGF5bG9hZC5jCkBAIC00Myw5ICs0Myw5IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKIAogZW51bSB7IFRJTUVPVVQgPSAyMDAwMDAgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2RlZmF1bHRfaG9zdC5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvZGVmYXVsdF9ob3N0LmMKaW5kZXggNTQ1NTQyOC4uNTc2ZDgxZSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvZGVmYXVsdF9ob3N0LmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvZGVmYXVsdF9ob3N0LmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5oIgogCiBlbnVtIHsgVElNRU9VVCA9IDIwMDAwMCB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvZW1wdHlfYmF0Y2guYyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2VtcHR5X2JhdGNoLmMKaW5kZXggNTNiNWNhNS4uN2Y1NjMxMyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvZW1wdHlfYmF0Y2guYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9lbXB0eV9iYXRjaC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKIAogZW51bSB7IFRJTUVPVVQgPSAyMDAwMDAgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2hpZ2hfaW5pdGlhbF9zZXFuby5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvaGlnaF9pbml0aWFsX3NlcW5vLmMKaW5kZXggNzIwMDc4Mi4uMjE5NmZiZCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvaGlnaF9pbml0aWFsX3NlcW5vLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvaGlnaF9pbml0aWFsX3NlcW5vLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKIAogZW51bSB7IFRJTUVPVVQgPSAyMDAwMDAgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2hwYWNrX3NpemUuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL2hwYWNrX3NpemUuYwppbmRleCAxODkxMzE4Li4yNzc0ZTUwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9ocGFja19zaXplLmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvaHBhY2tfc2l6ZS5jCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKIHN0YXRpYyB2b2lkICp0YWcoaW50cHRyX3QgdCkgeyByZXR1cm4gKHZvaWQgKil0OyB9CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9uZWdhdGl2ZV9kZWFkbGluZS5jIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvbmVnYXRpdmVfZGVhZGxpbmUuYwppbmRleCA1ZGU4MmM5Li5lNTAzMWFmIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9uZWdhdGl2ZV9kZWFkbGluZS5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL25lZ2F0aXZlX2RlYWRsaW5lLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5oIgogCiBlbnVtIHsgVElNRU9VVCA9IDIwMDAwMCB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvcmVnaXN0ZXJlZF9jYWxsLmMgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9yZWdpc3RlcmVkX2NhbGwuYwppbmRleCA0MDUxZGVkLi4wOWY0NTJmIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9yZWdpc3RlcmVkX2NhbGwuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9yZWdpc3RlcmVkX2NhbGwuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKIGVudW0geyBUSU1FT1VUID0gMjAwMDAwIH07CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9yZXF1ZXN0X3dpdGhfZmxhZ3MuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3JlcXVlc3Rfd2l0aF9mbGFncy5jCmluZGV4IGY0ODAwMDkuLjQzMzYyMmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3JlcXVlc3Rfd2l0aF9mbGFncy5jCisrKyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3JlcXVlc3Rfd2l0aF9mbGFncy5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5oIgogCiBlbnVtIHsgVElNRU9VVCA9IDIwMDAwMCB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvc2VydmVyX2ZpbmlzaGVzX3JlcXVlc3QuYyBiL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3NlcnZlcl9maW5pc2hlc19yZXF1ZXN0LmMKaW5kZXggYTdkMTY2MS4uZDNhYzJkNSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvc2VydmVyX2ZpbmlzaGVzX3JlcXVlc3QuYworKysgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9zZXJ2ZXJfZmluaXNoZXNfcmVxdWVzdC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvY3FfdmVyaWZpZXIuaCIKIAogZW51bSB7IFRJTUVPVVQgPSAyMDAwMDAgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3NpbXBsZV9yZXF1ZXN0LmMgYi90ZXN0L2NvcmUvZW5kMmVuZC90ZXN0cy9zaW1wbGVfcmVxdWVzdC5jCmluZGV4IGE4ZWQ3OTMuLmJjNjM0ZWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9lbmQyZW5kL3Rlc3RzL3NpbXBsZV9yZXF1ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2VuZDJlbmQvdGVzdHMvc2ltcGxlX3JlcXVlc3QuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9lbmQyZW5kL2NxX3ZlcmlmaWVyLmgiCiAKIGVudW0geyBUSU1FT1VUID0gMjAwMDAwIH07CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZmxpbmcvY2xpZW50LmMgYi90ZXN0L2NvcmUvZmxpbmcvY2xpZW50LmMKaW5kZXggYjM2YWVmMy4uNmE0ZWIxYyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2ZsaW5nL2NsaWVudC5jCisrKyBiL3Rlc3QvY29yZS9mbGluZy9jbGllbnQuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9ncnBjX3Byb2ZpbGVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2ZsaW5nL2ZsaW5nX3N0cmVhbV90ZXN0LmMgYi90ZXN0L2NvcmUvZmxpbmcvZmxpbmdfc3RyZWFtX3Rlc3QuYwppbmRleCBmZjNkOTE5Li4yODA3NTA0IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZmxpbmcvZmxpbmdfc3RyZWFtX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvZmxpbmcvZmxpbmdfc3RyZWFtX3Rlc3QuYwpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9ob3N0X3BvcnQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZmxpbmcvZmxpbmdfdGVzdC5jIGIvdGVzdC9jb3JlL2ZsaW5nL2ZsaW5nX3Rlc3QuYwppbmRleCA0ZTE2YjdmLi40NjQ1NmEyIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvZmxpbmcvZmxpbmdfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9mbGluZy9mbGluZ190ZXN0LmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N1YnByb2Nlc3MuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvZmxpbmcvc2VydmVyLmMgYi90ZXN0L2NvcmUvZmxpbmcvc2VydmVyLmMKaW5kZXggNDJiZTIwZS4uNGZlZjIxZiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2ZsaW5nL3NlcnZlci5jCisrKyBiL3Rlc3QvY29yZS9mbGluZy9zZXJ2ZXIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvaG9zdF9wb3J0Lmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2VuZDJlbmQvZGF0YS9zc2xfdGVzdF9kYXRhLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvZ3JwY19wcm9maWxlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8wMjk5Y2EyNTgwZTQzOThkMTcwYzRhMzM2ZTBjMzNlYjJjZDlkNDI3IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzAyOTljYTI1ODBlNDM5OGQxNzBjNGEzMzZlMGMzM2ViMmNkOWQ0MjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ZmFjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8wMjk5Y2EyNTgwZTQzOThkMTcwYzRhMzM2ZTBjMzNlYjJjZDlkNDI3CkBAIC0wLDAgKzEsMiBAQAorSFRUUC8xLjEghTIwMCBPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMDVlNjEzODUzZDY0YTk2NjllYTNjZjQxYjBkZTc3N2RjMjQ5MzFiYSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8wNWU2MTM4NTNkNjRhOTY2OWVhM2NmNDFiMGRlNzc3ZGMyNDkzMWJhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmFmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMDVlNjEzODUzZDY0YTk2NjllYTNjZjQxYjBkZTc3N2RjMjQ5MzFiYQpAQCAtMCwwICsxLDIgQEAKK0hUVFAvMS4xIDgpIHASTUtIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzA2OTM1MjUxOGExZDFiYWEwNWYzMTdjNjc3ZDI3NWNlZmRhMmFjOTcgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMDY5MzUyNTE4YTFkMWJhYTA1ZjMxN2M2NzdkMjc1Y2VmZGEyYWM5NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMxZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzA2OTM1MjUxOGExZDFiYWEwNWYzMTdjNjc3ZDI3NWNlZmRhMmFjOTcKQEAgLTAsMCArMSwyIEBACitIVFRQLzEuMSA4MCkgT0tIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzA5MjU1MjdjOTM1OGIxZTEwZWMwZjAzODdjZDk5ZjM1MjA0ZDlhMzQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMDkyNTUyN2M5MzU4YjFlMTBlYzBmMDM4N2NkOTlmMzUyMDRkOWEzNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk2N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzA5MjU1MjdjOTM1OGIxZTEwZWMwZjAzODdjZDk5ZjM1MjA0ZDlhMzQKQEAgLTAsMCArMSwyIEBACiuESFRULzIxLiAyMDAgSFQhVFAvMU9LSC4xSFRUUCAyMDAgT0tIDQordEhULy8xVDBQLjF5IDIwMDEuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzBjNWI3YzI1Njk0MTBiNTI2NjA1ZTMwODMwOWE3ZjM2NTc0ZTUzMGQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMGM1YjdjMjU2OTQxMGI1MjY2MDVlMzA4MzA5YTdmMzY1NzRlNTMwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzllNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzBjNWI3YzI1Njk0MTBiNTI2NjA1ZTMwODMwOWE3ZjM2NTc0ZTUzMGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzBlZjNkMGE4NDM2MGJiNWFkNjYyNzRmMTIyNmY1Y2IyNzNlY2RiY2YgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMGVmM2QwYTg0MzYwYmI1YWQ2NjI3NGYxMjI2ZjVjYjI3M2VjZGJjZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk3OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzBlZjNkMGE4NDM2MGJiNWFkNjYyNzRmMTIyNmY1Y2IyNzNlY2RiY2YKQEAgLTAsMCArMSwzIEBACitIVFRQLzEuMSAyMDAgT0tIDQordEhUVFAvMDEuMDIxICBPZXMsSA0KK3RlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8xZTEyNzNmOTAxODdmZGY1ZGYzNjI1NzY0MjQ1NjEwZjg2YWY2YWE0IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzFlMTI3M2Y5MDE4N2ZkZjVkZjM2MjU3NjQyNDU2MTBmODZhZjZhYTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczODJiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8xZTEyNzNmOTAxODdmZGY1ZGYzNjI1NzY0MjQ1NjEwZjg2YWY2YWE0CkBAIC0wLDAgKzEsMyBAQAorSFRUUC8xLjEgMjAwIE9LSEhUVFCJLzEuMjAwIE9LSA0KKw0KK3RIVEhUVFAvMCAyMFQ6dGVzLzAxLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8xZmJjNTdkMTE4ZjM3MzMyODdlOWE5ZDgwOGJiODk0N2IzMjYwZTU1IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzFmYmM1N2QxMThmMzczMzI4N2U5YTlkODA4YmI4OTQ3YjMyNjBlNTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViODI2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8xZmJjNTdkMTE4ZjM3MzMyODdlOWE5ZDgwOGJiODk0N2IzMjYwZTU1CkBAIC0wLDAgKzEsMyBAQAorSkhUVC8yMS4gMugwIEhUVFAvMS4xIDIwMCBPS0hIVFRQiS8xLjIwMCBPS0gNCisNCit0SFRIVEhUSkhUVFBUClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzI0NzU2YzM5NmJjNzI4OTRmZDcyMDA5MmJiNmY5YzAzZTY2YjQ2OWYgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMjQ3NTZjMzk2YmM3Mjg5NGZkNzIwMDkyYmI2ZjljMDNlNjZiNDY5ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjJlMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzI0NzU2YzM5NmJjNzI4OTRmZDcyMDA5MmJiNmY5YzAzZTY2YjQ2OWYKQEAgLTAsMCArMSwyIEBACitKSFRULzIxLiAyMDCcSFRULzBPS0guMSBIVFRQLzIwMCBPS0gNCit0SDEuVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yNzZkZWY0MTMxMTkzMzQyMWFlN2E5ZWU0MmU5MDZjODViNmE0ZDNmIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzI3NmRlZjQxMzExOTMzNDIxYWU3YTllZTQyZTkwNmM4NWI2YTRkM2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiMDRiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yNzZkZWY0MTMxMTkzMzQyMWFlN2E5ZWU0MmU5MDZjODViNmE0ZDNmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yOWRhYTc1NDMyMzgxOTM3ZmQwMDVjYjI1ZTMxNGUzMjhkZTZlOWY5IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzI5ZGFhNzU0MzIzODE5MzdmZDAwNWNiMjVlMzE0ZTMyOGRlNmU5ZjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlNzBiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yOWRhYTc1NDMyMzgxOTM3ZmQwMDVjYjI1ZTMxNGUzMjhkZTZlOWY5CkBAIC0wLDAgKzEsMiBAQAorSkhUVLkyMS4gMjAwHEhUVC8wT0tIMSBIVFRQLzEwMCBPS0gNCit0SDEuVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yYTc1MjA0YmM0OTIwODRhZDg1MzY4MmY4ZGUzZmIxMzdkNTkwN2JjIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzJhNzUyMDRiYzQ5MjA4NGFkODUzNjgyZjhkZTNmYjEzN2Q1OTA3YmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2YjAwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yYTc1MjA0YmM0OTIwODRhZDg1MzY4MmY4ZGUzZmIxMzdkNTkwN2JjCkBAIC0wLDAgKzEsMiBAQAorR0VUIC8gSFRUSFRUUC8xLjEgMjAwIE9LSA0KK3QxMEgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMmQzNGJhMjQ5Yjc1NWE4ODA1MjVjZjUzYzY2NTYzM2E1ZTM1OTMwNSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8yZDM0YmEyNDliNzU1YTg4MDUyNWNmNTNjNjY1NjMzYTVlMzU5MzA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MzVmNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMmQzNGJhMjQ5Yjc1NWE4ODA1MjVjZjUzYzY2NTYzM2E1ZTM1OTMwNQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzNmNGVhMGM3ZWEyN2MzN2Q4Zjk1Y2ZhNjRkMjgyMzcwZWZkYWZkMiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zM2Y0ZWEwYzdlYTI3YzM3ZDhmOTVjZmE2NGQyODIzNzBlZmRhZmQyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZThkZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzNmNGVhMGM3ZWEyN2MzN2Q4Zjk1Y2ZhNjRkMjgyMzcwZWZkYWZkMgpAQCAtMCwwICsxLDIgQEAKK0hUVFAvMSo5eSAyMDAgT0ttDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzM1NTU0NjE3ZWE2NDE4YmQ0MzE2MWZlOWEyYzMzN2VkODJkN2VjNWIgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzU1NTQ2MTdlYTY0MThiZDQzMTYxZmU5YTJjMzM3ZWQ4MmQ3ZWM1YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VmYTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzM1NTU0NjE3ZWE2NDE4YmQ0MzE2MWZlOWEyYzMzN2VkODJkN2VjNWIKQEAgLTAsMCArMSw0IEBACitKSFRULzIxLiAyMDAgSFRUUC8wT0tILjEgMjAwIE9LSA0KK3RIVFRQLzAxLjAyMSAgT2VzLEgNCit0DQordApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zNWYwYzU2MTI5N2NmYzg0MGRkYWVlYmI5ZmM2MTA5MWY0ZWFkZWNlIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzM1ZjBjNTYxMjk3Y2ZjODQwZGRhZWViYjlmYzYxMDkxZjRlYWRlY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmNDNlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zNWYwYzU2MTI5N2NmYzg0MGRkYWVlYmI5ZmM2MTA5MWY0ZWFkZWNlCkBAIC0wLDAgKzEsMiBAQAorSFRUUC8xLjl5IDIwMCBPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzk1MzY4ODg2NmNjYjNiNGYzNzFmMWE4NTg1NzBkNmFmZGI2NDUyZCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zOTUzNjg4ODY2Y2NiM2I0ZjM3MWYxYTg1ODU3MGQ2YWZkYjY0NTJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWYxZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzk1MzY4ODg2NmNjYjNiNGYzNzFmMWE4NTg1NzBkNmFmZGI2NDUyZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzliMTljNDFiYTUzN2YzNzUxMWVmZjc3Mjc3MzM3MTVkYjQzMmU3NiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zOWIxOWM0MWJhNTM3ZjM3NTExZWZmNzcyNzczMzcxNWRiNDMyZTc2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmE0NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvMzliMTljNDFiYTUzN2YzNzUxMWVmZjc3Mjc3MzM3MTVkYjQzMmU3NgpAQCAtMCwwICsxLDIgQEAKK0hUVFAvMS4xIDAwMCBPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvM2UzYzQ3NTZkNWU0MGI1YWEyNTA5NTRjYmFjODZiODI2ZTcwYTdhYyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zZTNjNDc1NmQ1ZTQwYjVhYTI1MDk1NGNiYWM4NmI4MjZlNzBhN2FjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjdiNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvM2UzYzQ3NTZkNWU0MGI1YWEyNTA5NTRjYmFjODZiODI2ZTcwYTdhYwpAQCAtMCwwICsxLDMgQEAKK0hUVFAvMS4xIDIwMCBPS0gNCit0SFRUUC8wMS4wMjEgOiBPZXMsSA0KK3RlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zZjAzMjY1OTIxMTIwYzZmZmE2MWI5NDRlMjEzZTA2MmE1NTM4ZDRiIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzNmMDMyNjU5MjExMjBjNmZmYTYxYjk0NGUyMTNlMDYyYTU1MzhkNGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmOTAwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zZjAzMjY1OTIxMTIwYzZmZmE2MWI5NDRlMjEzZTA2MmE1NTM4ZDRiCkBAIC0wLDAgKzEsMiBAQAorQFRUUC8xLjF5IDAwMv9PS0gNCit2ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvM2ZiMDM0ZTY2ZWU1NDk0YTY3YWNhZTFiNGU2ZmY2NGJhOTJhMjA0NiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy8zZmIwMzRlNjZlZTU0OTRhNjdhY2FlMWI0ZTZmZjY0YmE5MmEyMDQ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjAyNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvM2ZiMDM0ZTY2ZWU1NDk0YTY3YWNhZTFiNGU2ZmY2NGJhOTJhMjA0NgpAQCAtMCwwICsxLDIgQEAKK0hUVFAvMS4xeSAyMDAgT0tIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzQ2NjA1OWVkMDdhMGQ1NWQ2YWQ1ZTUyMmM3ZDM2N2NiZjI3OGVhZjkgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNDY2MDU5ZWQwN2EwZDU1ZDZhZDVlNTIyYzdkMzY3Y2JmMjc4ZWFmOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTk2YjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzQ2NjA1OWVkMDdhMGQ1NWQ2YWQ1ZTUyMmM3ZDM2N2NiZjI3OGVhZjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzQ4NzcyNWViMzg1MTFjNzlhOTM0MGJmNDU2MGExNDExMDYxZmE2ZmEgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNDg3NzI1ZWIzODUxMWM3OWE5MzQwYmY0NTYwYTE0MTEwNjFmYTZmYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTljNGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzQ4NzcyNWViMzg1MTFjNzlhOTM0MGJmNDU2MGExNDExMDYxZmE2ZmEKQEAgLTAsMCArMSwyIEBACitIVFRQLzAxLjAyMSAgTyxIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzQ4YjliMjA1Y2FlOGFjMjE1MTJhM2YyNmY0OWZkNTNlMjFlZTEzYzUgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNDhiOWIyMDVjYWU4YWMyMTUxMmEzZjI2ZjQ5ZmQ1M2UyMWVlMTNjNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWM3Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzQ4YjliMjA1Y2FlOGFjMjE1MTJhM2YyNmY0OWZkNTNlMjFlZTEzYzUKQEAgLTAsMCArMSwyIEBACitJVFRQLzExIIUyME8gSEsNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNGIxZjFmNzlhMGJmYTNmOTQyNDc5ZGQ1ZjhlZGI1OWE3YzI1N2M1NSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy80YjFmMWY3OWEwYmZhM2Y5NDI0NzlkZDVmOGVkYjU5YTdjMjU3YzU1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDFjOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNGIxZjFmNzlhMGJmYTNmOTQyNDc5ZGQ1ZjhlZGI1OWE3YzI1N2M1NQpAQCAtMCwwICsxLDIgQEAKK0hUVFAvMS4xIDIwMCBPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNTAyOGM1NmE1MTE2YTE4NmI3MzQzZmY1OTU2N2I0NzM0N2EwNzk2ZCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy81MDI4YzU2YTUxMTZhMTg2YjczNDNmZjU5NTY3YjQ3MzQ3YTA3OTZkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmM0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNTAyOGM1NmE1MTE2YTE4NmI3MzQzZmY1OTU2N2I0NzM0N2EwNzk2ZApAQCAtMCwwICsxLDMgQEAKK0hUVFAvMS4xIDIwMCBPS0gNCisJIEhURFAvMDEuMDIxIDogT2VzLEgNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNTMzZjYyYjNmNDk1Y2U3MDRiYWJmM2VlOGQ4NDBmMTk2YTcxNGRmZiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy81MzNmNjJiM2Y0OTVjZTcwNGJhYmYzZWU4ZDg0MGYxOTZhNzE0ZGZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTNjZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNTMzZjYyYjNmNDk1Y2U3MDRiYWJmM2VlOGQ4NDBmMTk2YTcxNGRmZgpAQCAtMCwwICsxLDQgQEAKK0pIVFQvMjEuIDIwMCBIVFRQLzFPS0guMSAyMDAgT0tIDQordEhUVFAvMDEuMDIxICBPZXMsSA0KK3QNCit0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzU4OTJjYmIyODQ3NzFmYzk3NjFjYWFlMzdiMTljZDZlMjdkYmMxMDQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNTg5MmNiYjI4NDc3MWZjOTc2MWNhYWUzN2IxOWNkNmUyN2RiYzEwNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU1NTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzU4OTJjYmIyODQ3NzFmYzk3NjFjYWFlMzdiMTljZDZlMjdkYmMxMDQKQEAgLTAsMCArMSwyIEBACitKz0hUVFCJLzEuMjAwOk9LSEhU4y8yMS4gMugwIEhUVFAvDQorMS4xIDIwMBQgT0tISFR0VFCJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzVhZWFiNmU0ZjdjMmExYzA5ZDRhYzBkYmRiM2JlYWM0ODkzNjA3ZWUgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNWFlYWI2ZTRmN2MyYTFjMDlkNGFjMGRiZGIzYmVhYzQ4OTM2MDdlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdlMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzVhZWFiNmU0ZjdjMmExYzA5ZDRhYzBkYmRiM2JlYWM0ODkzNjA3ZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzViNjI5MmJkZjAwOWIwZGFlY2JjOTBiODVjY2EzMGE4OGMzNmVlYzUgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNWI2MjkyYmRmMDA5YjBkYWVjYmM5MGI4NWNjYTMwYTg4YzM2ZWVjNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE1YWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzViNjI5MmJkZjAwOWIwZGFlY2JjOTBiODVjY2EzMGE4OGMzNmVlYzUKQEAgLTAsMCArMSwyIEBACitIVFRQLzEuIDIwMCBPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNWMxNjU5Yjc3Njc4YjQxZmFhNGZhMTNkZjc3NzJkYWUzMjM4ZDFjMCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy81YzE2NTliNzc2NzhiNDFmYWE0ZmExM2RmNzc3MmRhZTMyMzhkMWMwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDcwOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNWMxNjU5Yjc3Njc4YjQxZmFhNGZhMTNkZjc3NzJkYWUzMjM4ZDFjMApAQCAtMCwwICsxLDIgQEAKK0BUVFAvMS4xeaAwMCdKSFRUUC8xLjEgKzAw/0/vSCBIVFRQLw0KK3ZlMS4xIDIwMHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNWM4MWY2MTYyMWUyOWVjOWM2YTY0YWMzYWY5YjNiMjE2MTQxNjE4ZSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy81YzgxZjYxNjIxZTI5ZWM5YzZhNjRhYzNhZjliM2IyMTYxNDE2MThlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDBkZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNWM4MWY2MTYyMWUyOWVjOWM2YTY0YWMzYWY5YjNiMjE2MTQxNjE4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNjU3MzY4ZGY1MTJjYTYyOTRiOWRmMTZhZGY5MzVhM2YzNzRhOGJlMiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy82NTczNjhkZjUxMmNhNjI5NGI5ZGYxNmFkZjkzNWEzZjM3NGE4YmUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTRmNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvNjU3MzY4ZGY1MTJjYTYyOTRiOWRmMTZhZGY5MzVhM2YzNzRhOGJlMgpAQCAtMCwwICsxLDMgQEAKK0hUVAorLzEuMSAyMDEgT0tIDQorZGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzdmYzQ1MjAwOTQ5MDJjZTJjNzYwZDcwZWFhZDViNjc0ZDI4MTczMzcgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvN2ZjNDUyMDA5NDkwMmNlMmM3NjBkNzBlYWFkNWI2NzRkMjgxNzMzNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM0ODFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzdmYzQ1MjAwOTQ5MDJjZTJjNzYwZDcwZWFhZDViNjc0ZDI4MTczMzcKQEAgLTAsMCArMSw1IEBACitKSFRUUC8xLkdFVCAvIEhUVFAvMS4wCisxIDIwMCBPS0gNCisKKwordApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy84MWY1OWExMmI0NThlYzM2MDQwMzVjYjk2MjE2NWM2MDRkMTM1NWU2IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzgxZjU5YTEyYjQ1OGVjMzYwNDAzNWNiOTYyMTY1YzYwNGQxMzU1ZTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyMjNjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy84MWY1OWExMmI0NThlYzM2MDQwMzVjYjk2MjE2NWM2MDRkMTM1NWU2CkBAIC0wLDAgKzEsMiBAQAorSFRUUC8xLjEgOHApIClNS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvOGY0MWM1MGU4OGVlOGMxN2VjYWQzZDQxZDYzZDM4ZmIxMmFjYTBiOSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy84ZjQxYzUwZTg4ZWU4YzE3ZWNhZDNkNDFkNjNkMzhmYjEyYWNhMGI5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTJjNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvOGY0MWM1MGU4OGVlOGMxN2VjYWQzZDQxZDYzZDM4ZmIxMmFjYTBiOQpAQCAtMCwwICsxLDQgQEAKK0hUVFAvMS4xIDIwMCBPS0gNCit0SFRIVFRQLzEuIDIwVFAvMDEuMDIwKDogT2VzLEgwIE9LSA0KKw0KK3R0ZXNlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85N2MxNmRlN2ZlM2MzOTBhMmU2YzA5ZmY1YzI4ZjE3ZDVjNjc1NDJjIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzk3YzE2ZGU3ZmUzYzM5MGEyZTZjMDlmZjVjMjhmMTdkNWM2NzU0MmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2MjUzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85N2MxNmRlN2ZlM2MzOTBhMmU2YzA5ZmY1YzI4ZjE3ZDVjNjc1NDJjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85N2U0NDk5ZDQ1MGM5NTY2MGRlODY3NDdmNTI3ZTY3MGYyMDEyNTQ4IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzk3ZTQ0OTlkNDUwYzk1NjYwZGU4Njc0N2Y1MjdlNjcwZjIwMTI1NDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5MjdmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85N2U0NDk5ZDQ1MGM5NTY2MGRlODY3NDdmNTI3ZTY3MGYyMDEyNTQ4CkBAIC0wLDAgKzEsMyBAQAorSFRISFRUYFRUCisvMS4xIDIwMSBQKi9PS0gNCitkZXMxLjEgMlQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvOWE5OTY4NTcxOTZlMDk5OGExMjc4OTk0YTliYWIzZDM1NTI2ZTdmMSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85YTk5Njg1NzE5NmUwOTk4YTEyNzg5OTRhOWJhYjNkMzU1MjZlN2YxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjJjMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvOWE5OTY4NTcxOTZlMDk5OGExMjc4OTk0YTliYWIzZDM1NTI2ZTdmMQpAQCAtMCwwICsxLDIgQEAKK0BUVFAvMS4xeaAwMDL/T0tIDQordmVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzliN2UwMDA0OWVjMzU2ZWNkODRiMTc0N2U0ZTE5NDExNDAxMzlhZTggYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvOWI3ZTAwMDQ5ZWMzNTZlY2Q4NGIxNzQ3ZTRlMTk0MTE0MDEzOWFlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzliN2UwMDA0OWVjMzU2ZWNkODRiMTc0N2U0ZTE5NDExNDAxMzlhZTgKQEAgLTAsMCArMSwzIEBACiuESFRULzIxLiAyMDAgSFRUUC8xLjEgSFQhVFAvMU9LSC4xSFRUUCAyMDAgT0tIDQordEhULzovODAgT0tIDQorMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85ZjBjMzhlYzQ1NWNjMzYzMzY5YjM2NzRhMmQzMmJjMjFjMjA2ZGUxIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzLzlmMGMzOGVjNDU1Y2MzNjMzNjliMzY3NGEyZDMyYmMyMWMyMDZkZTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhMDdkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy85ZjBjMzhlYzQ1NWNjMzYzMzY5YjM2NzRhMmQzMmJjMjFjMjA2ZGUxCkBAIC0wLDAgKzEsNSBAQAorSkhUVFAvMT5HRVQgLyBIVFRQLzIuMAorMSAyMDAgT0tIDQorCisKK3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvYTFkYzdiYzIzNWU0NmViMjFkOTEwODRkN2I1MmQ1ZmY5ZjQ1ZGY4NSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9hMWRjN2JjMjM1ZTQ2ZWIyMWQ5MTA4NGQ3YjUyZDVmZjlmNDVkZjg1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTViYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvYTFkYzdiYzIzNWU0NmViMjFkOTEwODRkN2I1MmQ1ZmY5ZjQ1ZGY4NQpAQCAtMCwwICsxLDMgQEAKK4RIVFQvMjEuIDIwMCBIVFRQLzEuMSBIVCFUUC8xT0tILjFIVFRQIDIwMCBPS0gNCit0SFQvLzgwKSBPS0gNCisxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2FhM2JiYjg3NmVhZmE4YWQ4Y2E0ZmYyZWFiYzZkZDk0MzQxZDI0NDEgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvYWEzYmJiODc2ZWFmYThhZDhjYTRmZjJlYWJjNmRkOTQzNDFkMjQ0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc0NDlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2FhM2JiYjg3NmVhZmE4YWQ4Y2E0ZmYyZWFiYzZkZDk0MzQxZDI0NDEKQEAgLTAsMCArMSwyIEBACitIVFRQLzEuMSA4MO4gT0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvYjA0ZmVhNWMwNDFjNzA3ZGIwYWQ5YzA5YTgxNjcyNTU3YjUyY2M0NyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9iMDRmZWE1YzA0MWM3MDdkYjBhZDljMDlhODE2NzI1NTdiNTJjYzQ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTA1YmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvYjA0ZmVhNWMwNDFjNzA3ZGIwYWQ5YzA5YTgxNjcyNTU3YjUyY2M0NwpAQCAtMCwwICsxLDIgQEAKK0pIVFRQLzEuMSAyMDAgT0tIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2M0YWNmZjhhYTJmZjg4NmYzNTQzOWY3MjYyNWQwNTAwMjk5MGM5NDAgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvYzRhY2ZmOGFhMmZmODg2ZjM1NDM5ZjcyNjI1ZDA1MDAyOTkwYzk0MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM5ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2M0YWNmZjhhYTJmZjg4NmYzNTQzOWY3MjYyNWQwNTAwMjk5MGM5NDAKQEAgLTAsMCArMSw0IEBACitKSFRULzIxLiAyMDAgSFRUUC8yT0tILjEgMjAwIE9LSA0KK3RIVFRQLzAxLjAyMSAgT2VzLEgNCit0DQordApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9jNTVjZTk5OTViMDAyZTg4YTEwMmFlMjg5MWE3MWU4YmFjYjM0NmM4IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2M1NWNlOTk5NWIwMDJlODhhMTAyYWUyODkxYTcxZThiYWNiMzQ2YzgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwNGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9jNTVjZTk5OTViMDAyZTg4YTEwMmFlMjg5MWE3MWU4YmFjYjM0NmM4CkBAIC0wLDAgKzEsMiBAQAorSFRUUC8xLjEgNzY3KSBPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvY2E1YTBjMDBiODk2OTMxMGFjYjczZDE1YWQwZDBjNjAyZjFiZDBjMiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9jYTVhMGMwMGI4OTY5MzEwYWNiNzNkMTVhZDBkMGM2MDJmMWJkMGMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2JiYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvY2E1YTBjMDBiODk2OTMxMGFjYjczZDE1YWQwZDBjNjAyZjFiZDBjMgpAQCAtMCwwICsxLDMgQEAKK0hKSFRISFRUYFRUCisvMS4xIDIwMSBQKkhIVFQCL1QxL09LSA0KK2RlczEuMSAyLjFUIDIwVDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvY2NlNzM0ZjFiMjYzZGU2OTk0Zjc5NTBlMGRmN2JmMGM4MTQ0OWY3MCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9jY2U3MzRmMWIyNjNkZTY5OTRmNzk1MGUwZGY3YmYwYzgxNDQ5ZjcwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWEwOWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvY2NlNzM0ZjFiMjYzZGU2OTk0Zjc5NTBlMGRmN2JmMGM4MTQ0OWY3MApAQCAtMCwwICsxLDMgQEAKK0pIVFQvMjEuIDIwMCBIVFRQSFRUUC8xLjEgODDuIE9ILzFPS0guMCAyMDAgT0tIDQordEhUVFAvMA0KK3RlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2Q0YzNlNGNmNWQwMzU1OTY0MzNjMzBlYWFiYmQyYjI5MjVmNGI0NTMgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZDRjM2U0Y2Y1ZDAzNTU5NjQzM2MzMGVhYWJiZDJiMjkyNWY0YjQ1MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTMzZDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2Q0YzNlNGNmNWQwMzU1OTY0MzNjMzBlYWFiYmQyYjI5MjVmNGI0NTMKQEAgLTAsMCArMSwzIEBACitIVFRQLzEuMSAyMDAgT0tIDQorIEhUVFAvMDEuMDIxIDogT2VzLEgNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZDUxZjdmY2MwODlmMjY5YzdhZmVjYWFjYTUxOTY2YmFiNWZkZTYyOSBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9kNTFmN2ZjYzA4OWYyNjljN2FmZWNhYWNhNTE5NjZiYWI1ZmRlNjI5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWE1OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZDUxZjdmY2MwODlmMjY5YzdhZmVjYWFjYTUxOTY2YmFiNWZkZTYyOQpAQCAtMCwwICsxLDIgQEAKK89IVFRQiS8xLjIwMDpPS0gNCit0ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZDkzNmRhZDcxYzEyOWNmNjU5MDk3ZGMzZGI2NDU1MGM0ZGQ0NjdmNCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9kOTM2ZGFkNzFjMTI5Y2Y2NTkwOTdkYzNkYjY0NTUwYzRkZDQ2N2Y0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjkxODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZDkzNmRhZDcxYzEyOWNmNjU5MDk3ZGMzZGI2NDU1MGM0ZGQ0NjdmNApAQCAtMCwwICsxLDIgQEAKK0hUVFCJLzEuMjAwIE9LSA0KK3RlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9lMjc1YjA0NjZhOGZiOGQ5ZTBlMTU4NTZlMzQzZGRjNzExMmFlNjZiIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2UyNzViMDQ2NmE4ZmI4ZDllMGUxNTg1NmUzNDNkZGM3MTEyYWU2NmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmYzA5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9lMjc1YjA0NjZhOGZiOGQ5ZTBlMTU4NTZlMzQzZGRjNzExMmFlNjZiCkBAIC0wLDAgKzEsMyBAQAorSkhUVC8yMS4gMjAwIEhUVFJIVFRQLzEuMSAw7iBPTC8xT0tILjAgMjAwIE9LSA0KK3RIVFRQLzANCit0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9lNWMzNjRiMjA1ODU1YTI5OTFjZTA3NDgyYWViYjJhM2E2MTQ3MDg5IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2U1YzM2NGIyMDU4NTVhMjk5MWNlMDc0ODJhZWJiMmEzYTYxNDcwODkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiNWY2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9lNWMzNjRiMjA1ODU1YTI5OTFjZTA3NDgyYWViYjJhM2E2MTQ3MDg5CkBAIC0wLDAgKzEsMiBAQAorVFRIUIkvMS4yMDAgT0tIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2VlMjA3N2UwOGMzY2ZjY2Q5YmQ4MmFkYjU3NGFjNGZjN2Q0MjlhZmIgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZWUyMDc3ZTA4YzNjZmNjZDliZDgyYWRiNTc0YWM0ZmM3ZDQyOWFmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIzNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2VlMjA3N2UwOGMzY2ZjY2Q5YmQ4MmFkYjU3NGFjNGZjN2Q0MjlhZmIKQEAgLTAsMCArMSwyIEBACitJVEhUVFRQSFQvMTIghTJTIEhUS1AvMS4xIDc2NykgT0tIDQordGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2ZjNWQ0YjkxMTdiYTllODczODgxNzRhZWU0ZjQ5NzBiZGZlOGQwNjYgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZmM1ZDRiOTExN2JhOWU4NzM4ODE3NGFlZTRmNDk3MGJkZmU4ZDA2NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmYxYTNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL2ZjNWQ0YjkxMTdiYTllODczODgxNzRhZWU0ZjQ5NzBiZGZlOGQwNjYKQEAgLTAsMCArMSBAQAorSEgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZmRlYjJjN2RhYTllNzcwNGY2N2UxNDExMDYzODRlNmRkMDA0MmMwYiBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9mZGViMmM3ZGFhOWU3NzA0ZjY3ZTE0MTEwNjM4NGU2ZGQwMDQyYzBiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjNkMzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvZmRlYjJjN2RhYTllNzcwNGY2N2UxNDExMDYzODRlNmRkMDA0MmMwYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVxdWVzdDEudHh0IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3JlcXVlc3QxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmE3NTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3JlcXVlc3QxLnR4dApAQCAtMCwwICsxLDMgQEAKK0dFVCAvIEhUVFAvMS4wCisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3JlcXVlc3QyLnR4dCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXF1ZXN0Mi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3YTI4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXF1ZXN0Mi50eHQKQEAgLTAsMCArMSwzIEBACitHRVQgLyBIVFRQLzEuMAorQ29udGVudC1MZW5ndGg6IDEyOAorCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVxdWVzdDMudHh0IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3JlcXVlc3QzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWE3NWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3JlcXVlc3QzLnR4dApAQCAtMCwwICsxLDMgQEAKK0dFVCAvIEhUVFAvMS4xCitDb250ZW50LUxlbmd0aDogMTI4CisKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXF1ZXN0NC50eHQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVxdWVzdDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2Y2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVxdWVzdDQudHh0CkBAIC0wLDAgKzEsMyBAQAorR0VUIC9mb28uYmFyIEhUVFAvMS4xCitDb250ZW50LUxlbmd0aDogMTI4CisKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXF1ZXN0NS50eHQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVxdWVzdDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZmIyNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVxdWVzdDUudHh0CkBAIC0wLDAgKzEsMyBAQAorUE9TVCAvIEhUVFAvMS4wCisKK2FzZGxma2phZHNmbDtha2Rqc2Zhc2RmCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2UxLnR4dCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXNwb25zZTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzEzOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2UxLnR4dApAQCAtMCwwICsxLDQgQEAKK0hUVFAvMS4xIDIwMCBPSwordGVzdDogaGVsbG8KKworYWJjZApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3Jlc3BvbnNlMi50eHQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2UyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjg2NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3Jlc3BvbnNlMi50eHQKQEAgLTAsMCArMSw0IEBACitIVFRQLzAuOSAyMDAgT0sKK3Rlc3Q6IGhlbGxvCisKK2FiY2QKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXNwb25zZTMudHh0IGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3Jlc3BvbnNlMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1YjA0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXNwb25zZTMudHh0CkBAIC0wLDAgKzEsNSBAQAorSFRUUC8wLjkgMjAwIE9LCit0ZXN0OiBoZWxsbworY29udGVudC1sZW5ndGg6IDEwMjM4NDM5OAorCithYmNkCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2U0LnR4dCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXNwb25zZTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzdiMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2U0LnR4dApAQCAtMCwwICsxLDIgQEAKK0hUVFAvMS4xIDQwNCBOb3QgRm91bmQKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3Jlc3BvbnNlNS50eHQgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2U1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjMwNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3Jlc3BvbnNlNS50eHQKQEAgLTAsMCArMSw1IEBACitIVFRQLzAuOSAyMDAgT0sKK3Rlc3Q6IGhlbGxvCitjb250ZW50LWxlbmd0aDogNAorCithYmNkCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2U2LnR4dCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy9yZXNwb25zZTYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2I2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvaHR0cC9jb3JwdXMvcmVzcG9uc2U2LnR4dApAQCAtMCwwICsxLDUgQEAKK0hUVFAvMC45IDIwMCBPSwordGVzdDogaGVsbG8KK2NvbnRlbnQtbGVuZ3RoOiA2CisKK2FiY2QKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2NvcnB1cy90b29sb25nLnR4dCBiL3Rlc3QvY29yZS9odHRwL2NvcnB1cy90b29sb25nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlkNWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2h0dHAvY29ycHVzL3Rvb2xvbmcudHh0CkBAIC0wLDAgKzEsMiBAQAorR0VUIC8gSFRUUC8xLjEKK2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYTogYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3RfdGVzdC5jIGIvdGVzdC9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3RfdGVzdC5jCmluZGV4IDVlMmI3MDkuLmE2NzY0MjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0X3Rlc3QuYworKysgYi90ZXN0L2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdF90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL2Z1enplci5jIGIvdGVzdC9jb3JlL2h0dHAvZnV6emVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiODQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9odHRwL2Z1enplci5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmgiCisKK2ludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGdycGNfaHR0cF9wYXJzZXIgcGFyc2VyOworICBncnBjX2h0dHBfcGFyc2VyX2luaXQoJnBhcnNlcik7CisgIGdwcl9zbGljZSBzbGljZSA9IGdwcl9zbGljZV9mcm9tX2NvcGllZF9idWZmZXIoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgZ3JwY19odHRwX3BhcnNlcl9wYXJzZSgmcGFyc2VyLCBzbGljZSk7CisgIGdycGNfaHR0cF9wYXJzZXJfZW9mKCZwYXJzZXIpOworICBncHJfc2xpY2VfdW5yZWYoc2xpY2UpOworICBncnBjX2h0dHBfcGFyc2VyX2Rlc3Ryb3koJnBhcnNlcik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvaHR0cGNsaV90ZXN0LmMgYi90ZXN0L2NvcmUvaHR0cC9odHRwY2xpX3Rlc3QuYwppbmRleCBiZGI3YTAyLi4xZmRiY2QwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvaHR0cC9odHRwY2xpX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvaHR0cC9odHRwY2xpX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3VicHJvY2Vzcy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2h0dHAvaHR0cHNjbGlfdGVzdC5jIGIvdGVzdC9jb3JlL2h0dHAvaHR0cHNjbGlfdGVzdC5jCmluZGV4IDIxODQ1YjYuLjcxZGIzZTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9odHRwL2h0dHBzY2xpX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvaHR0cC9odHRwc2NsaV90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N1YnByb2Nlc3MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL3BhcnNlcl90ZXN0LmMgYi90ZXN0L2NvcmUvaHR0cC9wYXJzZXJfdGVzdC5jCmluZGV4IDMzOGEzMDEuLjE0OTkxOWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9odHRwL3BhcnNlcl90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2h0dHAvcGFyc2VyX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9wYXJzZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuaCIKIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTc4LDYgKzE3OCwzNyBAQAogICBncHJfZnJlZShzbGljZXMpOwogfQogCitzdGF0aWMgY29uc3QgdWludDhfdCBmYWlsZWRfdGVzdDFbXSA9IHsKKyAgICAweDllLCAweDQ4LCAweDU0LCAweDU0LCAweDUwLCAweDJmLCAweDMxLCAweDJlLCAweDMwLCAweDRhLAorICAgIDB4NDgsIDB4NTQsIDB4NTQsIDB4MzAsIDB4MzIsIDB4MTYsIDB4YSwgIDB4MmYsIDB4NDgsIDB4MjAsCisgICAgMHgzMSwgMHgyZSwgMHgzMSwgMHgyMCwgMHgzMiwgMHgzMCwgMHgzMSwgMHg1NCwgMHg1NCwgMHhiOSwKKyAgICAweDMyLCAweDMxLCAweDJlLCAweDIwLCAweDMyLCAweDMwLCAweDIwLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCB1aW50OF90ICpkYXRhOworICBzaXplX3QgbGVuZ3RoOworfSBmYWlsZWRfdGVzdDsKKworI2RlZmluZSBGQUlMRURfVEVTVChuYW1lKSBcCisgIHsgI25hbWUsIG5hbWUsIHNpemVvZihuYW1lKSB9CisKK2ZhaWxlZF90ZXN0IGZhaWxlZF90ZXN0c1tdID0geworICAgIEZBSUxFRF9URVNUKGZhaWxlZF90ZXN0MSksCit9OworCitzdGF0aWMgdm9pZCB0ZXN0X2RvZXNudF9jcmFzaChmYWlsZWRfdGVzdCB0KSB7CisgIGdwcl9sb2coR1BSX0RFQlVHLCAiUnVuIHByZXZpb3VzbHkgZmFpbGVkIHRlc3Q6ICVzIiwgdC5uYW1lKTsKKyAgZ3JwY19odHRwX3BhcnNlciBwOworICBncnBjX2h0dHBfcGFyc2VyX2luaXQoJnApOworICBncHJfc2xpY2Ugc2xpY2UgPQorICAgICAgZ3ByX3NsaWNlX2Zyb21fY29waWVkX2J1ZmZlcigoY29uc3QgY2hhciAqKXQuZGF0YSwgdC5sZW5ndGgpOworICBncnBjX2h0dHBfcGFyc2VyX3BhcnNlKCZwLCBzbGljZSk7CisgIGdwcl9zbGljZV91bnJlZihzbGljZSk7CisgIGdycGNfaHR0cF9wYXJzZXJfZGVzdHJveSgmcCk7Cit9CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICBzaXplX3QgaTsKICAgY29uc3QgZ3JwY19zbGljZV9zcGxpdF9tb2RlIHNwbGl0X21vZGVzW10gPSB7R1JQQ19TTElDRV9TUExJVF9JREVOVElUWSwKQEAgLTE4Niw2ICsyMTcsMTAgQEAKIAogICBncnBjX3Rlc3RfaW5pdChhcmdjLCBhcmd2KTsKIAorICBmb3IgKGkgPSAwOyBpIDwgR1BSX0FSUkFZX1NJWkUoZmFpbGVkX3Rlc3RzKTsgaSsrKSB7CisgICAgdGVzdF9kb2VzbnRfY3Jhc2goZmFpbGVkX3Rlc3RzW2ldKTsKKyAgfQorCiAgIGZvciAoaSA9IDA7IGkgPCBHUFJfQVJSQVlfU0laRShzcGxpdF9tb2Rlcyk7IGkrKykgewogICAgIHRlc3Rfc3VjY2VlZHMoc3BsaXRfbW9kZXNbaV0sCiAgICAgICAgICAgICAgICAgICAiSFRUUC8xLjAgMjAwIE9LXHJcbiIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9odHRwL3Rlc3Rfc2VydmVyLnB5IGIvdGVzdC9jb3JlL2h0dHAvdGVzdF9zZXJ2ZXIucHkKaW5kZXggZWNkZTQ5NC4uOWY4ZDA1MiAxMDA3NTUKLS0tIGEvdGVzdC9jb3JlL2h0dHAvdGVzdF9zZXJ2ZXIucHkKKysrIGIvdGVzdC9jb3JlL2h0dHAvdGVzdF9zZXJ2ZXIucHkKQEAgLTM2LDggKzM2LDggQEAKIGltcG9ydCBzc2wKIGltcG9ydCBzeXMKIAotX1BFTSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJy4uLy4uLy4uJywgJ3NyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL3NlcnZlcjEucGVtJykpCi1fS0VZID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnLi4vLi4vLi4nLCAnc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS5rZXknKSkKK19QRU0gPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICcuLi8uLi8uLicsICdzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS5wZW0nKSkKK19LRVkgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICcuLi8uLi8uLicsICdzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvc2VydmVyMS5rZXknKSkKIHByaW50IF9QRU0KIG9wZW4oX1BFTSkuY2xvc2UoKQogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl90ZXN0LmMgYi90ZXN0L2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl90ZXN0LmMKaW5kZXggYzNhOTEwOC4uYTkxYTlhNyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Rlc3QuYwpAQCAtMzEsMTQgKzMxLDE0IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgiCiAKICNpbmNsdWRlIDxncnBjL2dycGMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL2lvbWdyL2VuZHBvaW50X3Rlc3RzLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2lvbWdyL2VuZHBvaW50X3Rlc3RzLmggYi90ZXN0L2NvcmUvaW9tZ3IvZW5kcG9pbnRfdGVzdHMuaAppbmRleCA4ZWE0N2UzLi5jNzU0MmEwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvaW9tZ3IvZW5kcG9pbnRfdGVzdHMuaAorKysgYi90ZXN0L2NvcmUvaW9tZ3IvZW5kcG9pbnRfdGVzdHMuaApAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgogCiB0eXBlZGVmIHN0cnVjdCBncnBjX2VuZHBvaW50X3Rlc3RfY29uZmlnIGdycGNfZW5kcG9pbnRfdGVzdF9jb25maWc7CiB0eXBlZGVmIHN0cnVjdCBncnBjX2VuZHBvaW50X3Rlc3RfZml4dHVyZSBncnBjX2VuZHBvaW50X3Rlc3RfZml4dHVyZTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9pb21nci9mZF9jb25zZXJ2YXRpb25fcG9zaXhfdGVzdC5jIGIvdGVzdC9jb3JlL2lvbWdyL2ZkX2NvbnNlcnZhdGlvbl9wb3NpeF90ZXN0LmMKaW5kZXggYzM4ZjUwOS4uYWFlOTRlNyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2lvbWdyL2ZkX2NvbnNlcnZhdGlvbl9wb3NpeF90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2lvbWdyL2ZkX2NvbnNlcnZhdGlvbl9wb3NpeF90ZXN0LmMKQEAgLTM1LDggKzM1LDggQEAKIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3IvZmRfcG9zaXhfdGVzdC5jIGIvdGVzdC9jb3JlL2lvbWdyL2ZkX3Bvc2l4X3Rlc3QuYwppbmRleCA5OTY4OWViLi4yMDNlMWUzIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvaW9tZ3IvZmRfcG9zaXhfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci9mZF9wb3NpeF90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N5bmMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIGdwcl9tdSAqZ19tdTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfdGVzdC5jIGIvdGVzdC9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc190ZXN0LmMKaW5kZXggYjJhMDk5Ny4uN2FlYzkxYSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc190ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc190ZXN0LmMKQEAgLTMxLDExICszMSwxMSBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiBzdGF0aWMgZ3ByX3RpbWVzcGVjIHRlc3RfZGVhZGxpbmUodm9pZCkgewpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzX3Rlc3QuYyBiL3Rlc3QvY29yZS9pb21nci9zb2NrYWRkcl91dGlsc190ZXN0LmMKaW5kZXggYTdiNTdjMS4uMTliZWU5YSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHNfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Rlc3QuYyBiL3Rlc3QvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfdGVzdC5jCmluZGV4IDU4YzNmYmMuLjgyMzhhOWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzIsNyArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeF90ZXN0LmMgYi90ZXN0L2NvcmUvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeF90ZXN0LmMKaW5kZXggNzQ2ZGZkOC4uZDc5OGJmMiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXhfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4X3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmgiCiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KQEAgLTQ0LDkgKzQ0LDkgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIGdycGNfcG9sbHNldF9zZXQgKmdfcG9sbHNldF9zZXQ7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3IvdGNwX3Bvc2l4X3Rlc3QuYyBiL3Rlc3QvY29yZS9pb21nci90Y3BfcG9zaXhfdGVzdC5jCmluZGV4IDQzNTE2NDIuLjc5ZjE4YzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9pb21nci90Y3BfcG9zaXhfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci90Y3BfcG9zaXhfdGVzdC5jCkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgiCiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeF90ZXN0LmMgYi90ZXN0L2NvcmUvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeF90ZXN0LmMKaW5kZXggNzkzMzQ2OC4uY2RlMTQ3ZCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXhfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4X3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiCiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KQEAgLTQ1LDggKzQ1LDggQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzX3Rlc3QuYyBiL3Rlc3QvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzX3Rlc3QuYwppbmRleCBjYjAwNmQxLi5hNDlkODk5IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0c190ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHNfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiCiAKICNpbmNsdWRlIDxtYXRoLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9pb21nci90aW1lcl9oZWFwX3Rlc3QuYyBiL3Rlc3QvY29yZS9pb21nci90aW1lcl9oZWFwX3Rlc3QuYwppbmRleCBkZDIzYTk5Li5kMjMwYzgzIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvaW9tZ3IvdGltZXJfaGVhcF90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2lvbWdyL3RpbWVyX2hlYXBfdGVzdC5jCkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuaCIKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2lvbWdyL3RpbWVyX2xpc3RfdGVzdC5jIGIvdGVzdC9jb3JlL2lvbWdyL3RpbWVyX2xpc3RfdGVzdC5jCmluZGV4IDk1NWJmNDQuLjAzMzNhNzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9pb21nci90aW1lcl9saXN0X3Rlc3QuYworKysgYi90ZXN0L2NvcmUvaW9tZ3IvdGltZXJfbGlzdF90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXJfdGVzdC5jIGIvdGVzdC9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXJfdGVzdC5jCmluZGV4IDA0MmU5MzYuLjBjNTVlZjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9pb21nci91ZHBfc2VydmVyX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvaW9tZ3IvdWRwX3NlcnZlcl90ZXN0LmMKQEAgLTMxLDEzICszMSwxMyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmgiCiAjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Rlc3QuYyBiL3Rlc3QvY29yZS9pb21nci93b3JrcXVldWVfdGVzdC5jCmluZGV4IDhhMWZhZjYuLjJkOWI1ZDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9pb21nci93b3JrcXVldWVfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9pb21nci93b3JrcXVldWVfdGVzdC5jCkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgiCiAKICNpbmNsdWRlIDxncnBjL2dycGMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wMDZkNTUyZTk1MmM0MmI1MzQwYmFhZWI4NWMyY2I4MGM4MWU3OGRkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzAwNmQ1NTJlOTUyYzQyYjUzNDBiYWFlYjg1YzJjYjgwYzgxZTc4ZGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMDY0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wMDZkNTUyZTk1MmM0MmI1MzQwYmFhZWI4NWMyY2I4MGM4MWU3OGRkCkBAIC0wLDAgKzEgQEAKKzFlgTkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMDA3ZWI5ODVjNDRiNjA4OWEzNDk5NWE3ZDllYmYzNDlmMWMyYmYxOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wMDdlYjk4NWM0NGI2MDg5YTM0OTk1YTdkOWViZjM0OWYxYzJiZjE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZmZhNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMDA3ZWI5ODVjNDRiNjA4OWEzNDk5NWE3ZDllYmYzNDlmMWMyYmYxOApAQCAtMCwwICsxIEBACit7fTNbClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzAzYjc0YTA4ZjIzNzM0NjkxNTEyY2IxMmQwYjM4ZDE4OWE4ZGY5MDUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMDNiNzRhMDhmMjM3MzQ2OTE1MTJjYjEyZDBiMzhkMTg5YThkZjkwNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZlM2YzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzAzYjc0YTA4ZjIzNzM0NjkxNTEyY2IxMmQwYjM4ZDE4OWE4ZGY5MDUKQEAgLTAsMCArMSBAQAorMC42OTkxIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wNDk1NjkzYWYwNzMyNWZiMGQ1MmVhZmQyZDRjNGQ4MDJjNjQ1N2M2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzA0OTU2OTNhZjA3MzI1ZmIwZDUyZWFmZDJkNGM0ZDgwMmM2NDU3YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3NTJlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wNDk1NjkzYWYwNzMyNWZiMGQ1MmVhZmQyZDRjNGQ4MDJjNjQ1N2M2CkBAIC0wLDAgKzEgQEAKKzAuODMyODIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMDU0NTRhYjAxNWNmNzRlOWMzZTg1NzRkOTk1NTE3ZTA1ZGQ1Njc1MSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wNTQ1NGFiMDE1Y2Y3NGU5YzNlODU3NGQ5OTU1MTdlMDVkZDU2NzUxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzdjNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMDU0NTRhYjAxNWNmNzRlOWMzZTg1NzRkOTk1NTE3ZTA1ZGQ1Njc1MQpAQCAtMCwwICsxIEBACisyMS41OTW7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzA3MTZkOTcwOGQzMjFmZmI2YTAwODE4NjE0Nzc5ZTc3OTkyNTM2NWMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMDcxNmQ5NzA4ZDMyMWZmYjZhMDA4MTg2MTQ3NzllNzc5OTI1MzY1YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJhZmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzA3MTZkOTcwOGQzMjFmZmI2YTAwODE4NjE0Nzc5ZTc3OTkyNTM2NWMKQEAgLTAsMCArMSBAQAorMTcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGE5YjM1MjJhOGU3MTFlM2JkNTNlMmMyZWI5ZDI4YjM0YTAwM2FjYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wYTliMzUyMmE4ZTcxMWUzYmQ1M2UyYzJlYjlkMjhiMzRhMDAzYWNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDllYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGE5YjM1MjJhOGU3MTFlM2JkNTNlMmMyZWI5ZDI4YjM0YTAwM2FjYwpAQCAtMCwwICsxIEBACitbMi4xZQkiiMOBNzk2O10zKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wYWRlN2MyY2Y5N2Y3NWQwMDk5NzVmNGQ3MjBkMWZhNmMxOWY0ODk3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzBhZGU3YzJjZjk3Zjc1ZDAwOTk3NWY0ZDcyMGQxZmE2YzE5ZjQ4OTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExYzgyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wYWRlN2MyY2Y5N2Y3NWQwMDk5NzVmNGQ3MjBkMWZhNmMxOWY0ODk3CkBAIC0wLDAgKzEgQEAKKzkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGIxZmNmMGFjMDdlMWU1MGNmZTI3MzE2YzdlMWM4Y2M5OTdmMTMxOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wYjFmY2YwYWMwN2UxZTUwY2ZlMjczMTZjN2UxYzhjYzk5N2YxMzE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmQ2MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGIxZmNmMGFjMDdlMWU1MGNmZTI3MzE2YzdlMWM4Y2M5OTdmMTMxOApAQCAtMCwwICsxIEBACit7Iic1RTg4NSwhXHUwNjVFewpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wYmMxMzU0ODM1NmQwODAwOTcwM2QzNWU5YzhkNzQzOTczNjdiZGZiIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzBiYzEzNTQ4MzU2ZDA4MDA5NzAzZDM1ZTljOGQ3NDM5NzM2N2JkZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyMzkxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wYmMxMzU0ODM1NmQwODAwOTcwM2QzNWU5YzhkNzQzOTczNjdiZGZiCkBAIC0wLDAgKzEgQEAKK251LCo6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzBlYTlhMTYwYzU3ZjJjNzA1ZGNlMDM3MTk2ZTM2MGJmOWJlNzM5YzUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGVhOWExNjBjNTdmMmM3MDVkY2UwMzcxOTZlMzYwYmY5YmU3MzljNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTI4OTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzBlYTlhMTYwYzU3ZjJjNzA1ZGNlMDM3MTk2ZTM2MGJmOWJlNzM5YzUKQEAgLTAsMCArMSBAQAorZicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGYyMGQ5YzQ2OTkxYzBlOTc0MTllMmNjYTA3YzczODlmMWQ2YmRmOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wZjIwZDljNDY5OTFjMGU5NzQxOWUyY2NhMDdjNzM4OWYxZDZiZGY4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTZmYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMGYyMGQ5YzQ2OTkxYzBlOTc0MTllMmNjYTA3YzczODlmMWQ2YmRmOApAQCAtMCwwICsxIEBACisxZQkiiMOBOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wZjJlMmU2MzQ2ZjcwYzQxOTMwMGI2NjEyNTE3NTRkNTBmN2NhOGVhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzBmMmUyZTYzNDZmNzBjNDE5MzAwYjY2MTI1MTc1NGQ1MGY3Y2E4ZWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyOWY1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8wZjJlMmU2MzQ2ZjcwYzQxOTMwMGI2NjEyNTE3NTRkNTBmN2NhOGVhCkBAIC0wLDAgKzEgQEAKK1syLjE5ODIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTA4YjMxMGZhY2MxYTE5MzgzM2ZjMjk3MWZkODMwODFmNzc1ZWEwYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMDhiMzEwZmFjYzFhMTkzODMzZmMyOTcxZmQ4MzA4MWY3NzVlYTBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmU0NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTA4YjMxMGZhY2MxYTE5MzgzM2ZjMjk3MWZkODMwODFmNzc1ZWEwYwpAQCAtMCwwICsxIEBACitmYWxzZSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTA4ZTViY2Q2OWIxOWFkMGRmNzQzNjQxMDg1MTYzYjg0ZjM3NmZlOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMDhlNWJjZDY5YjE5YWQwZGY3NDM2NDEwODUxNjNiODRmMzc2ZmU4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NzNjYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTA4ZTViY2Q2OWIxOWFkMGRmNzQzNjQxMDg1MTYzYjg0ZjM3NmZlOApAQCAtMCwwICsxLDIgQEAKK1t7CisiiMMiICKIwyIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTBlM2VjZDU2MjQ0NjUwMjBmZGYwNjYyYTY3ZTBmMDg4NTUzNmNhZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMGUzZWNkNTYyNDQ2NTAyMGZkZjA2NjJhNjdlMGYwODg1NTM2Y2FlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzA2MDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTBlM2VjZDU2MjQ0NjUwMjBmZGYwNjYyYTY3ZTBmMDg4NTUzNmNhZQpAQCAtMCwwICsxIEBACit7IiI6MCwoIdMnKFwnIQ8pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzExM2M4Yzk3Y2JiMGEyYjYxNzZkNzVlYWE5YWM5YmFhYTdjY2RkY2MgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTEzYzhjOTdjYmIwYTJiNjE3NmQ3NWVhYTlhYzliYWFhN2NjZGRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA0MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzExM2M4Yzk3Y2JiMGEyYjYxNzZkNzVlYWE5YWM5YmFhYTdjY2RkY2MKQEAgLTAsMCArMSBAQAorMbkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTE0NzlkOTM2ZGQwMDY0MTBhNTk0NmI2MDgxYTk0ZDU3M2JmOGVmZCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMTQ3OWQ5MzZkZDAwNjQxMGE1OTQ2YjYwODFhOTRkNTczYmY4ZWZkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Y2Y3NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTE0NzlkOTM2ZGQwMDY0MTBhNTk0NmI2MDgxYTk0ZDU3M2JmOGVmZApAQCAtMCwwICsxIEBACit0crk4MiAnQVxFNTc7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMWFhMDkxMTg5Yjc4ZDFjYzM1YzdmZjQ5MDdhYzE2YTczYWJhNTQ3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzExYWEwOTExODliNzhkMWNjMzVjN2ZmNDkwN2FjMTZhNzNhYmE1NDcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4ODgyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMWFhMDkxMTg5Yjc4ZDFjYzM1YzdmZjQ5MDdhYzE2YTczYWJhNTQ3CkBAIC0wLDAgKzEgQEAKK1s5MjgxLjI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzEyMjc5MDdiMmVlNWE5NDkyYTg5MGJlZWQ1NTMzMmU0NTYwODM0YzggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTIyNzkwN2IyZWU1YTk0OTJhODkwYmVlZDU1MzMyZTQ1NjA4MzRjOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDM1MjcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzEyMjc5MDdiMmVlNWE5NDkyYTg5MGJlZWQ1NTMzMmU0NTYwODM0YzgKQEAgLTAsMCArMSBAQAorMn01ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzEzNGQ2NTEzMDk0N2VjNjljZjhkZjg0ODM0MjRiNDVlOTljZjA0ZTMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTM0ZDY1MTMwOTQ3ZWM2OWNmOGRmODQ4MzQyNGI0NWU5OWNmMDRlMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJhOWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzEzNGQ2NTEzMDk0N2VjNjljZjhkZjg0ODM0MjRiNDVlOTljZjA0ZTMKQEAgLTAsMCArMSBAQAorMC4yOTk1IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMzU4NDUwNWNhYTg5MmQ5NDk4MmE5NjhiYmM0MzkxZWJjZmUwZDA2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzEzNTg0NTA1Y2FhODkyZDk0OTgyYTk2OGJiYzQzOTFlYmNmZTBkMDYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiNjI4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMzU4NDUwNWNhYTg5MmQ5NDk4MmE5NjhiYmM0MzkxZWJjZmUwZDA2CkBAIC0wLDAgKzEgQEAKK3siJywhXHVBPooKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTM3ZjU1NGVlMGY2YjkwM2FjYjgxYWI0ZTFmOThjMTFmZTkyYjAwOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xMzdmNTU0ZWUwZjZiOTAzYWNiODFhYjRlMWY5OGMxMWZlOTJiMDA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTM3ZjU1NGVlMGY2YjkwM2FjYjgxYWI0ZTFmOThjMTFmZTkyYjAwOApAQCAtMCwwICsxIEBACit7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTQwMWVhMDNlYzc4YjhmMjBkYzdiZTk1MjU1NTAwNGQ3MTQ3ZjBmNSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xNDAxZWEwM2VjNzhiOGYyMGRjN2JlOTUyNTU1MDA0ZDcxNDdmMGY1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWZlMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTQwMWVhMDNlYzc4YjhmMjBkYzdiZTk1MjU1NTAwNGQ3MTQ3ZjBmNQpAQCAtMCwwICsxIEBACisiiMN7KYghClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzE0MWQ0NWE1OWIwNzNhZWVjNDQ0M2NkN2JjZjIwZjc4MzNkZGJjOTUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTQxZDQ1YTU5YjA3M2FlZWM0NDQzY2Q3YmNmMjBmNzgzM2RkYmM5NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmU2OGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzE0MWQ0NWE1OWIwNzNhZWVjNDQ0M2NkN2JjZjIwZjc4MzNkZGJjOTUKQEAgLTAsMCArMSBAQAorIicnLCFcdTY1OEV7MTI4MDMxOjspOogpIcM1Kr4/J8qzsyEhKiHgKTohKuA6OikhOTpcdWRiRDg2JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xNWM5YzEyODRjMjdjODg5MzU1OWUxNWM5YjJhNTBjYmQ1YmJiNTZmIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzE1YzljMTI4NGMyN2M4ODkzNTU5ZTE1YzliMmE1MGNiZDViYmI1NmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhOTU1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xNWM5YzEyODRjMjdjODg5MzU1OWUxNWM5YjJhNTBjYmQ1YmJiNTZmCkBAIC0wLDAgKzEgQEAKK1syLCKIwyF7KSE6IiyIwwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xNWQxYTZjZGE0OGVmNTY5YjM2OGEwYzQ2Mjc0MzViYzJjODBhOTg4IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzE1ZDFhNmNkYTQ4ZWY1NjliMzY4YTBjNDYyNzQzNWJjMmM4MGE5ODgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxN2E5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xNWQxYTZjZGE0OGVmNTY5YjM2OGEwYzQ2Mjc0MzViYzJjODBhOTg4CkBAIC0wLDAgKzEgQEAKKwkiiMMgIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xN2EyOWYyYWM2ZGY3NzQ1ODVkNzcxMzA5MWIyOTk3Mjk3MzgwMzBjIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzE3YTI5ZjJhYzZkZjc3NDU4NWQ3NzEzMDkxYjI5OTcyOTczODAzMGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMmE2MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTdhMjlmMmFjNmRmNzc0NTg1ZDc3MTMwOTFiMjk5NzI5NzM4MDMwYwpAQCAtMCwwICsxIEBACitbEikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTdiODE1ZjFmNzJjYjY0NDgxYmM0MDI2M2U5MWNlMDYzMDQwZjczOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xN2I4MTVmMWY3MmNiNjQ0ODFiYzQwMjYzZTkxY2UwNjMwNDBmNzM5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjIxOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTdiODE1ZjFmNzJjYjY0NDgxYmM0MDI2M2U5MWNlMDYzMDQwZjczOQpAQCAtMCwwICsxIEBACitbdHIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTgyZDU3NDAzZDJjOTczYTM5NDA1NTAxN2QzNWI3NjIxYWEwYWEwNSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xODJkNTc0MDNkMmM5NzNhMzk0MDU1MDE3ZDM1Yjc2MjFhYTBhYTA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGY1NWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTgyZDU3NDAzZDJjOTczYTM5NDA1NTAxN2QzNWI3NjIxYWEwYWEwNQpAQCAtMCwwICsxIEBACitudWxsKjoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTkwZmJlMmRhNDQ4ZjZiZGVjMDcwNmM1MzAxYWQxMzM2M2FlM2FkOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xOTBmYmUyZGE0NDhmNmJkZWMwNzA2YzUzMDFhZDEzMzYzYWUzYWQ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTQ0YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMTkwZmJlMmRhNDQ4ZjZiZGVjMDcwNmM1MzAxYWQxMzM2M2FlM2FkOQpAQCAtMCwwICsxIEBACisxZSsyMTg3gTU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xYjA0NWEyNGI4ZjFmMWZkNmU4MjM0ZDUwMTk5NTJlZTc3MTNhOGI3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFiMDQ1YTI0YjhmMWYxZmQ2ZTgyMzRkNTAxOTk1MmVlNzcxM2E4YjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhYzU0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xYjA0NWEyNGI4ZjFmMWZkNmU4MjM0ZDUwMTk5NTJlZTc3MTNhOGI3CkBAIC0wLDAgKzEgQEAKK1w1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFiNjQ1Mzg5MjQ3M2E0NjdkMDczNzJkNDVlYjA1YWJjMjAzMTY0N2EgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMWI2NDUzODkyNDczYTQ2N2QwNzM3MmQ0NWViMDVhYmMyMDMxNjQ3YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBkODdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFiNjQ1Mzg5MjQ3M2E0NjdkMDczNzJkNDVlYjA1YWJjMjAzMTY0N2EKQEAgLTAsMCArMSBAQAorNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xYzY0NjNhYTJkYWJjYjRmYWRjOGU1NDQxZDhiNDE4NTM1ZTc2OGFmIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFjNjQ2M2FhMmRhYmNiNGZhZGM4ZTU0NDFkOGI0MTg1MzVlNzY4YWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhMWIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xYzY0NjNhYTJkYWJjYjRmYWRjOGU1NDQxZDhiNDE4NTM1ZTc2OGFmCkBAIC0wLDAgKzEgQEAKKzB7OogpIcMiKr4/J8qzsyEhKiHgKTohKuA6OjpcdWRiRDiIKcMhOnshYCE/YL6+IT8nISptLCcpO4UnYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZGVhOTViNTA1MGI3NjYyNzRlZjgwODQ3NTA1YzBlNGY0N2YzZWJiIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFkZWE5NWI1MDUwYjc2NjI3NGVmODA4NDc1MDVjMGU0ZjQ3ZjNlYmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzN2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZGVhOTViNTA1MGI3NjYyNzRlZjgwODQ3NTA1YzBlNGY0N2YzZWJiCkBAIC0wLDAgKzEgQEAKKzEzZTGBOTA1NjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMWRmMDc1NGQzZTc5NzBiM2FmZTU0OWIxMWNhMTI4ZGNkMGQ0ODMyYiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZGYwNzU0ZDNlNzk3MGIzYWZlNTQ5YjExY2ExMjhkY2QwZDQ4MzJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOWRmODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMWRmMDc1NGQzZTc5NzBiM2FmZTU0OWIxMWNhMTI4ZGNkMGQ0ODMyYgpAQCAtMCwwICsxIEBACit7Iic1RTg4NSwhXHUwMDBFewpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZGZlMjY3YjYyM2IyMGNkOTdjNmU4OTY5ZDhiOTE0OGFmOWY0YTJjIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFkZmUyNjdiNjIzYjIwY2Q5N2M2ZTg5NjlkOGI5MTQ4YWY5ZjRhMmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwMTBhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZGZlMjY3YjYyM2IyMGNkOTdjNmU4OTY5ZDhiOTE0OGFmOWY0YTJjCkBAIC0wLDAgKzEgQEAKKzYoMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZTVjMmYzNjdmMDJlNDdhOGMxNjBjZGExY2Q5ZDkxZGVjYmFjNDQxIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzFlNWMyZjM2N2YwMmU0N2E4YzE2MGNkYTFjZDlkOTFkZWNiYWM0NDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyZjBiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8xZTVjMmYzNjdmMDJlNDdhOGMxNjBjZGExY2Q5ZDkxZGVjYmFjNDQxCkBAIC0wLDAgKzEgQEAKK1sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjBlZmRiYTEzY2E3YTM2NTdkMDcxYjNkNTY5OTdhYTNiMDgzMDY4YSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yMGVmZGJhMTNjYTdhMzY1N2QwNzFiM2Q1Njk5N2FhM2IwODMwNjhhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTRiZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjBlZmRiYTEzY2E3YTM2NTdkMDcxYjNkNTY5OTdhYTNiMDgzMDY4YQpAQCAtMCwwICsxIEBACisiiMN7KSE6Kl0pwyE6eyIqvj++Oz9YyrOzJyEhygpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yMTVhOTU2MTY4Zjc3NDIxMjUzZTk0N2MyNDM2MzcxZDU2YWE3ZWExIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzIxNWE5NTYxNjhmNzc0MjEyNTNlOTQ3YzI0MzYzNzFkNTZhYTdlYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhZWVkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yMTVhOTU2MTY4Zjc3NDIxMjUzZTk0N2MyNDM2MzcxZDU2YWE3ZWExCkBAIC0wLDAgKzEgQEAKK2ZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzIxNzRiOWFiNmJmNGY3YzIxZmUxZWQ1Njk1N2YxNzc2ZWY2MTE5NTkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjE3NGI5YWI2YmY0ZjdjMjFmZTFlZDU2OTU3ZjE3NzZlZjYxMTk1OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjMyNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzIxNzRiOWFiNmJmNGY3YzIxZmUxZWQ1Njk1N2YxNzc2ZWY2MTE5NTkKQEAgLTAsMCArMSBAQAorMTNlNSEwMTiBNjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjMyZjRiY2VkNDA3NTU0NWJiMTQ2OWQ1YzIzNjBmMDgzZWM3ZWM2NSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yMzJmNGJjZWQ0MDc1NTQ1YmIxNDY5ZDVjMjM2MGYwODNlYzdlYzY1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTRlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjMyZjRiY2VkNDA3NTU0NWJiMTQ2OWQ1YzIzNjBmMDgzZWM3ZWM2NQpAQCAtMCwwICsxIEBACit7IicsIVx1NjVFODg1MHsyMzEyOyk6iCkhwyIqvj8nyrOzISEqIeApOiEq4Do6OCE5Olx1ZGJEODYnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI2YWNhNDFlZThmMTk5ZTdjMGM3Y2YzMWQ5Nzk5NTI1NzFjNTNmYzkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjZhY2E0MWVlOGYxOTllN2MwYzdjZjMxZDk3OTk1MjU3MWM1M2ZjOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZmZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI2YWNhNDFlZThmMTk5ZTdjMGM3Y2YzMWQ5Nzk5NTI1NzFjNTNmYzkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI3ZDg0MjEwNjM2ZTllODM3ODZiZTllOWI5NmI2OWY3MGI3NDNiODYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjdkODQyMTA2MzZlOWU4Mzc4NmJlOWU5Yjk2YjY5ZjcwYjc0M2I4NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDFiZDAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI3ZDg0MjEwNjM2ZTllODM3ODZiZTllOWI5NmI2OWY3MGI3NDNiODYKQEAgLTAsMCArMSBAQAoreyInLCFcdSeKClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI3ZGE0MjZhNTg4MzY2MmQxOWVhNzhmMzA2ZDdhOTkyYmU1MmY4MjcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjdkYTQyNmE1ODgzNjYyZDE5ZWE3OGYzMDZkN2E5OTJiZTUyZjgyNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTczNzNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI3ZGE0MjZhNTg4MzY2MmQxOWVhNzhmMzA2ZDdhOTkyYmU1MmY4MjcKQEAgLTAsMCArMSwyIEBACisyDQorUDL3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI5NmRjZGE2ZjdlNjk3OWU2OGRkZWY3Y2JjMTIwNmEzNTUwODRhZDMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjk2ZGNkYTZmN2U2OTc5ZTY4ZGRlZjdjYmMxMjA2YTM1NTA4NGFkMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEwMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzI5NmRjZGE2ZjdlNjk3OWU2OGRkZWY3Y2JjMTIwNmEzNTUwODRhZDMKQEAgLTAsMCArMSBAQAorLIjDIiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjliMDhjMDNjYTVhNjg1MWZhNDYwNGE5ODRjYjdmZjQ0NDMzYTVhNSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yOWIwOGMwM2NhNWE2ODUxZmE0NjA0YTk4NGNiN2ZmNDQ0MzNhNWE1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWM2YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMjliMDhjMDNjYTVhNjg1MWZhNDYwNGE5ODRjYjdmZjQ0NDMzYTVhNQpAQCAtMCwwICsxIEBACiszXTUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmEzZDk2NGVjNDUyN2FkOWYwMjEyOWZjYmYwODdiNjdhNmVhNjQ0NCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yYTNkOTY0ZWM0NTI3YWQ5ZjAyMTI5ZmNiZjA4N2I2N2E2ZWE2NDQ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTcyM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmEzZDk2NGVjNDUyN2FkOWYwMjEyOWZjYmYwODdiNjdhNmVhNjQ0NApAQCAtMCwwICsxIEBACistdzknwTYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmIwNDk3NDE0OTgxNWIxNDNhZmIxN2FmNDM4OGQ3NTEyMTdlNTRlYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yYjA0OTc0MTQ5ODE1YjE0M2FmYjE3YWY0Mzg4ZDc1MTIxN2U1NGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGZiNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmIwNDk3NDE0OTgxNWIxNDNhZmIxN2FmNDM4OGQ3NTEyMTdlNTRlYwpAQCAtMCwwICsxIEBACis4MzJFNDY7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yYjNiMWFkOTUyZTNhY2I1NjZlMzJhODRlMmQ1MDNhY2RlMTNlYjUzIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJiM2IxYWQ5NTJlM2FjYjU2NmUzMmE4NGUyZDUwM2FjZGUxM2ViNTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZTJkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yYjNiMWFkOTUyZTNhY2I1NjZlMzJhODRlMmQ1MDNhY2RlMTNlYjUzCkBAIC0wLDAgKzEgQEAKKzMxZTikNYE2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yY2MzMDFhNmVkN2YwMWUyY2QzMzlmMDJiZDBmZGEyMGMyMjdhMTdlIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJjYzMwMWE2ZWQ3ZjAxZTJjZDMzOWYwMmJkMGZkYTIwYzIyN2ExN2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1N2ZkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yY2MzMDFhNmVkN2YwMWUyY2QzMzlmMDJiZDBmZGEyMGMyMjdhMTdlCkBAIC0wLDAgKzEgQEAKKzgyNUUxMzJ9KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZDNkNWI5Mjc1NTUzNDMwYjRjZmE2ODExNDA5OTEyMGFkNzgwOWVlIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJkM2Q1YjkyNzU1NTM0MzBiNGNmYTY4MTE0MDk5MTIwYWQ3ODA5ZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ZTNmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZDNkNWI5Mjc1NTUzNDMwYjRjZmE2ODExNDA5OTEyMGFkNzgwOWVlCkBAIC0wLDAgKzEgQEAKK1s0KgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZDVkYmY0MDNlMGMxMmUyZmUyMWIwNGNhM2RhZmYxNzFjMDI4YWI3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJkNWRiZjQwM2UwYzEyZTJmZTIxYjA0Y2EzZGFmZjE3MWMwMjhhYjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiYmRmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZDVkYmY0MDNlMGMxMmUyZmUyMWIwNGNhM2RhZmYxNzFjMDI4YWI3CkBAIC0wLDAgKzEgQEAKKyIiOTE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJkN2M3NjliZWQ2MjAwNDI3MDAzNGI5NzZiMWQ5NDBhNTY4NjEwNmIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmQ3Yzc2OWJlZDYyMDA0MjcwMDM0Yjk3NmIxZDk0MGE1Njg2MTA2YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTJiNDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJkN2M3NjliZWQ2MjAwNDI3MDAzNGI5NzZiMWQ5NDBhNTY4NjEwNmIKQEAgLTAsMCArMSBAQAoreyInLCFcdTY1RTg4NTB7MjMxMjspOimIISo/J77K0bOzISGqIcApOioh4Do6OCE5Olx1ZGJENlxcJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZGIxMjAyMzFlZWExMmQ5Y2RjNmEwMGYzMDgzOWIzY2VmMjA0NmJlIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJkYjEyMDIzMWVlYTEyZDljZGM2YTAwZjMwODM5YjNjZWYyMDQ2YmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmYjZlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZGIxMjAyMzFlZWExMmQ5Y2RjNmEwMGYzMDgzOWIzY2VmMjA0NmJlCkBAIC0wLDAgKzEgQEAKKzAuMCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmRiNjEwZTFhMjMwNDA5YTIwNWNmMjJmYmFkMzM0OGE1NGNiZTcwMyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZGI2MTBlMWEyMzA0MDlhMjA1Y2YyMmZiYWQzMzQ4YTU0Y2JlNzAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDFkOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmRiNjEwZTFhMjMwNDA5YTIwNWNmMjJmYmFkMzM0OGE1NGNiZTcwMwpAQCAtMCwwICsxIEBACitmYeUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmRmMWRkMmUyZjVkNTdlN2Q5ZDRlNjBhNzU2YTg2ZTYwMzU3MzIyNSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZGYxZGQyZTJmNWQ1N2U3ZDlkNGU2MGE3NTZhODZlNjAzNTczMjI1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MGY0MDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmRmMWRkMmUyZjVkNTdlN2Q5ZDRlNjBhNzU2YTg2ZTYwMzU3MzIyNQpAQCAtMCwwICsxIEBACiswLjkhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJlMzJmYWFjZDNlYTQ0NjFlYzdhYWNlMjk3YjRiZTY5MDRkOWEzODkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmUzMmZhYWNkM2VhNDQ2MWVjN2FhY2UyOTdiNGJlNjkwNGQ5YTM4OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMyM2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzJlMzJmYWFjZDNlYTQ0NjFlYzdhYWNlMjk3YjRiZTY5MDRkOWEzODkKQEAgLTAsMCArMSBAQAorW1siiMN7KSE6Kr47PyfKs7MhISoh4Ck6ISrgOjo6XHUxLnkyZGIpOIjDIYc6eyFgIS43Oz8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmU3NTZkOTE3NTlkN2U3NGY1Yjc3NmMwZDJhMTkzNTI5MmY1NzZkMSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZTc1NmQ5MTc1OWQ3ZTc0ZjViNzc2YzBkMmExOTM1MjkyZjU3NmQxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2Q5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmU3NTZkOTE3NTlkN2U3NGY1Yjc3NmMwZDJhMTkzNTI5MmY1NzZkMQpAQCAtMCwwICsxIEBACisiiMN7KSE6Kr47PyfKs7MhISoh4Ck6ISrgOjpkXHI6OCkpiMMhWzEuhzk3OnsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmYwOWIyNGY5ZjVmYTBhZjJjMjliNjA0YjRiMGY5N2ZhNjE2Mzg5NSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8yZjA5YjI0ZjlmNWZhMGFmMmMyOWI2MDRiNGIwZjk3ZmE2MTYzODk1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZThlN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMmYwOWIyNGY5ZjVmYTBhZjJjMjliNjA0YjRiMGY5N2ZhNjE2Mzg5NQpAQCAtMCwwICsxIEBACisgOYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzAyN2Q5MDEzNjExNjJiMzhmY2FmMTdmOTdiYTdkOTY0NmUzMjQ5NSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zMDI3ZDkwMTM2MTE2MmIzOGZjYWYxN2Y5N2JhN2Q5NjQ2ZTMyNDk1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzJiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzAyN2Q5MDEzNjExNjJiMzhmY2FmMTdmOTdiYTdkOTY0NmUzMjQ5NQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzBkNDQ2N2VjYjc3MWVjZTllZDZjNzhhNDZhZGMyOTkwNzJkOWRiOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zMGQ0NDY3ZWNiNzcxZWNlOWVkNmM3OGE0NmFkYzI5OTA3MmQ5ZGI5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTZmYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzBkNDQ2N2VjYjc3MWVjZTllZDZjNzhhNDZhZGMyOTkwNzJkOWRiOQpAQCAtMCwwICsxIEBACis0LjkhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzMxMTA0OGJiZjRjNGJiYWJjZGU3MzYwN2Q3ZTc2OTE1Y2VlOTMxMmUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzExMDQ4YmJmNGM0YmJhYmNkZTczNjA3ZDdlNzY5MTVjZWU5MzEyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQ1M2U5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzMxMTA0OGJiZjRjNGJiYWJjZGU3MzYwN2Q3ZTc2OTE1Y2VlOTMxMmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzMyM2I0ODk2OWQ3YmY5YTUwYWFjZjA5MTJmMWI1Y2IwMjExOWUyYWIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzIzYjQ4OTY5ZDdiZjlhNTBhYWNmMDkxMmYxYjVjYjAyMTE5ZTJhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTU4YTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzMyM2I0ODk2OWQ3YmY5YTUwYWFjZjA5MTJmMWI1Y2IwMjExOWUyYWIKQEAgLTAsMCArMSBAQAorIicsIVx1NjVFODg1MHsyMzEyOyk6iCkhwyIqvj8nyrOzISEqIeApOiEq4Do6KSE5Olx1ZGJEODYnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzMzNDAwYTI0MmJhZWI1YzQ2ZGRiMTU3OGMyOGIxMGQzMmE5YzNjZDMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzM0MDBhMjQyYmFlYjVjNDZkZGIxNTc4YzI4YjEwZDMyYTljM2NkMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI5M2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzMzNDAwYTI0MmJhZWI1YzQ2ZGRiMTU3OGMyOGIxMGQzMmE5YzNjZDMKQEAgLTAsMCArMSBAQAoreyInLCFccnU2NUU4ODUwezIzMTI7KTqIKSHDIiq+eyInLCF1NjVFPyc4yjg1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM1NmExOTJiNzkxM2IwNGM1NDU3NGQxOGMyOGQ0NmU2Mzk1NDI4YWIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzU2YTE5MmI3OTEzYjA0YzU0NTc0ZDE4YzI4ZDQ2ZTYzOTU0MjhhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM1NmExOTJiNzkxM2IwNGM1NDU3NGQxOGMyOGQ0NmU2Mzk1NDI4YWIKQEAgLTAsMCArMSBAQAorMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zNWU5OTVjMTA3YTcxY2FlYjgzM2JiM2I3OWY5ZjU0NzgxYjMzZmExIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM1ZTk5NWMxMDdhNzFjYWViODMzYmIzYjc5ZjlmNTQ3ODFiMzNmYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3YTk2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zNWU5OTVjMTA3YTcxY2FlYjgzM2JiM2I3OWY5ZjU0NzgxYjMzZmExCkBAIC0wLDAgKzEgQEAKKzczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM3Mzc2OWMxNWMxNDU0NzJjOGVjM2JkZGU4ZmM4NGU4NWVjNzkyMTEgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzczNzY5YzE1YzE0NTQ3MmM4ZWMzYmRkZThmYzg0ZTg1ZWM3OTIxMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM0MDYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM3Mzc2OWMxNWMxNDU0NzJjOGVjM2JkZGU4ZmM4NGU4NWVjNzkyMTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM3OTVkOTExOTcwYTFmZDg0MTZiOTM2NDkwNTFiNDE4OTQ4ZTNlZGYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzc5NWQ5MTE5NzBhMWZkODQxNmI5MzY0OTA1MWI0MTg5NDhlM2VkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGYzNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM3OTVkOTExOTcwYTFmZDg0MTZiOTM2NDkwNTFiNDE4OTQ4ZTNlZGYKQEAgLTAsMCArMSBAQAorW1syLjc2O10zKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zN2QzMzMzZTFlMmEzODRjM2JhMTRhNTI2ODJjYTI5ZjA2MWQxYWM3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM3ZDMzMzNlMWUyYTM4NGMzYmExNGE1MjY4MmNhMjlmMDYxZDFhYzcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3ZTEzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zN2QzMzMzZTFlMmEzODRjM2JhMTRhNTI2ODJjYTI5ZjA2MWQxYWM3CkBAIC0wLDAgKzEgQEAKK3siISghXHUnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM4Y2QzM2JiMzkwNDQ1ZTM1YjY1MTQwMjRiMTMxNzkwMmNiN2JhMWIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvMzhjZDMzYmIzOTA0NDVlMzViNjUxNDAyNGIxMzE3OTAyY2I3YmExYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMxMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzM4Y2QzM2JiMzkwNDQ1ZTM1YjY1MTQwMjRiMTMxNzkwMmNiN2JhMWIKQEAgLTAsMCArMSBAQAorIojDIXspIToiLIjDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNhOTBjNjg4ZjQ0NDQ3YTc4ZWZjMTExODcyYjA2MWEwMDFmMDRkMmIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2E5MGM2ODhmNDQ0NDdhNzhlZmMxMTE4NzJiMDYxYTAwMWYwNGQyYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjcyOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNhOTBjNjg4ZjQ0NDQ3YTc4ZWZjMTExODcyYjA2MWEwMDFmMDRkMmIKQEAgLTAsMCArMSBAQAorMTgxZTMygTU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zYjFlN2I1NmFkNDQ2NWQxMjZlYTk5NGQzNGQyMGRjZWNiYjNhNTBhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNiMWU3YjU2YWQ0NDY1ZDEyNmVhOTk0ZDM0ZDIwZGNlY2JiM2E1MGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyOWUwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zYjFlN2I1NmFkNDQ2NWQxMjZlYTk5NGQzNGQyMGRjZWNiYjNhNTBhCkBAIC0wLDAgKzEgQEAKKzVFODgyMzkyKTspClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNjMGE4ZDZjMzFlZGFjYTEyNDcxNDYyNGViNjRjYjhlYzBjYmFiMTMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2MwYThkNmMzMWVkYWNhMTI0NzE0NjI0ZWI2NGNiOGVjMGNiYWIxMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRiOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNjMGE4ZDZjMzFlZGFjYTEyNDcxNDYyNGViNjRjYjhlYzBjYmFiMTMKQEAgLTAsMCArMSBAQAoreyIqXTrDIXspvj8nyrOzISEqIeApOiEq4Do6Olx1ZGJEOIgpIXvDOnshYCE/YL6+IiihClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNjYzBjOWFkY2YzODgyZjAxNDA5YzcwMzkxYzNjZDMwNTg4ZWYzNGMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2NjMGM5YWRjZjM4ODJmMDE0MDljNzAzOTFjM2NkMzA1ODhlZjM0YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYzYzhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNjYzBjOWFkY2YzODgyZjAxNDA5YzcwMzkxYzNjZDMwNTg4ZWYzNGMKQEAgLTAsMCArMSBAQAorW3sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2QwZDk4NzhiODEyY2U0NjM0OTYyYmEzZGQ3NTVjMDk1MzU1MDIwMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zZDBkOTg3OGI4MTJjZTQ2MzQ5NjJiYTNkZDc1NWMwOTUzNTUwMjAwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTNmMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2QwZDk4NzhiODEyY2U0NjM0OTYyYmEzZGQ3NTVjMDk1MzU1MDIwMApAQCAtMCwwICsxIEBACitbdHJ1WygwLjE5MztdNCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2Q0ZDU4ODdhMmZjZGM1ZGQzNjBiOGE2Zjg5ZGJjZTY1MDBkODU4MCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy8zZDRkNTg4N2EyZmNkYzVkZDM2MGI4YTZmODlkYmNlNjUwMGQ4NTgwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjQ2OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2Q0ZDU4ODdhMmZjZGM1ZGQzNjBiOGE2Zjg5ZGJjZTY1MDBkODU4MApAQCAtMCwwICsxIEBACisiJycsIVx1NjU4RXsxMjgwMzE6Oyk6iCkhwzUqvj8nyrOzISEqIeApOiEq4Do6KSE5Olx1ZGJEOCAnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNlZmI1YjdmZjk0YzViOWQ0MTFjOTNkYTlhNzBlMWNjNTQ3ZjRjNTkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvM2VmYjViN2ZmOTRjNWI5ZDQxMWM5M2RhOWE3MGUxY2M1NDdmNGM1OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGEwODJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzNlZmI1YjdmZjk0YzViOWQ0MTFjOTNkYTlhNzBlMWNjNTQ3ZjRjNTkKQEAgLTAsMCArMSBAQAorMTNlMoE5MDU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MjFiN2U4ZWE4NmUzYzA3NDc0YWYxNmFiM2NjZWY1NWQxODU3MjA1IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQyMWI3ZThlYTg2ZTNjMDc0NzRhZjE2YWIzY2NlZjU1ZDE4NTcyMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NDcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MjFiN2U4ZWE4NmUzYzA3NDc0YWYxNmFiM2NjZWY1NWQxODU3MjA1CkBAIC0wLDAgKzEsMiBAQAorWzIuMQorJ3siiCLDiMMiIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MjhkMDUxZTQzN2RkMjYwZjJhMmY3ZWQ5MjBkOTczNGNhMzRkYzkwIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQyOGQwNTFlNDM3ZGQyNjBmMmEyZjdlZDkyMGQ5NzM0Y2EzNGRjOTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1MGQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MjhkMDUxZTQzN2RkMjYwZjJhMmY3ZWQ5MjBkOTczNGNhMzRkYzkwCkBAIC0wLDAgKzEgQEAKK1syLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MmFkYzI4MTU3OGZmYjFiODY4NGI3OGI0N2FhNDBhMTZkMTBiNmU3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQyYWRjMjgxNTc4ZmZiMWI4Njg0Yjc4YjQ3YWE0MGExNmQxMGI2ZTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMTcwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MmFkYzI4MTU3OGZmYjFiODY4NGI3OGI0N2FhNDBhMTZkMTBiNmU3CkBAIC0wLDAgKzEgQEAKKzM2MywKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDM2MjBlY2QyZTJmZDU4ZmU1NjUwZGEyZTk3ODNmOTgwZjI5ZWMwNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80MzYyMGVjZDJlMmZkNThmZTU2NTBkYTJlOTc4M2Y5ODBmMjllYzA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTgwMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDM2MjBlY2QyZTJmZDU4ZmU1NjUwZGEyZTk3ODNmOTgwZjI5ZWMwNwpAQCAtMCwwICsxIEBACisxM2UxMDmBNTYwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQzYjFmZmNkYTQ5NDc3YWRiMTYzMjgyMjIwMjYzMTk5MGVkM2EyNjkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDNiMWZmY2RhNDk0NzdhZGIxNjMyODIyMjAyNjMxOTkwZWQzYTI2OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRiMWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQzYjFmZmNkYTQ5NDc3YWRiMTYzMjgyMjIwMjYzMTk5MGVkM2EyNjkKQEAgLTAsMCArMSBAQAorMWUrMiwxiMMieApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80NTI3OWY4NWJmMmY1MzNhNjI5MDczY2FmODk0MDMwMDYyNzlmYWIyIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ1Mjc5Zjg1YmYyZjUzM2E2MjkwNzNjYWY4OTQwMzAwNjI3OWZhYjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkM2Q3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80NTI3OWY4NWJmMmY1MzNhNjI5MDczY2FmODk0MDMwMDYyNzlmYWIyCkBAIC0wLDAgKzEsMiBAQAoreworNjIwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ1NWQ5YmI1OTdmMDhiZjY5ODQ1NDE1N2VjZDg2NjQ3YjVkZWM0ZTAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDU1ZDliYjU5N2YwOGJmNjk4NDU0MTU3ZWNkODY2NDdiNWRlYzRlMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTYwMWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ1NWQ5YmI1OTdmMDhiZjY5ODQ1NDE1N2VjZDg2NjQ3YjVkZWM0ZTAKQEAgLTAsMCArMSBAQAorMC4zMjgyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ1NjFlYjVjN2U0M2NhZTA0OGMwNmFhYWFkM2Q1ZjUyMThiMzc2ZTkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDU2MWViNWM3ZTQzY2FlMDQ4YzA2YWFhYWQzZDVmNTIxOGIzNzZlOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRkMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ1NjFlYjVjN2U0M2NhZTA0OGMwNmFhYWFkM2Q1ZjUyMThiMzc2ZTkKQEAgLTAsMCArMSBAQAorZmFsMCUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ2NDE3YjAwMWVlYjg3YzMyYjY0MjQ5OWZkNWUxNjkwZDVkODhjN2YgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDY0MTdiMDAxZWViODdjMzJiNjQyNDk5ZmQ1ZTE2OTBkNWQ4OGM3ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg0ODQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ2NDE3YjAwMWVlYjg3YzMyYjY0MjQ5OWZkNWUxNjkwZDVkODhjN2YKQEAgLTAsMCArMSBAQAorODI1RX0zMjEpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ2OGFmMDQwMDI0ZTk2ZTk4NzhlZjMzY2M1Mjc1NWM1ZTdmNWNiZDUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDY4YWYwNDAwMjRlOTZlOTg3OGVmMzNjYzUyNzU1YzVlN2Y1Y2JkNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWZmMWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ2OGFmMDQwMDI0ZTk2ZTk4NzhlZjMzY2M1Mjc1NWM1ZTdmNWNiZDUKQEAgLTAsMCArMSBAQAorMC43MjQ3OTgzNGU7MC7cM+85OTMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ2OWU1ZWQyNTQ3ZTllNTVhOTZlOTZlYjgzMmM2MTU2MzFlM2I1NzYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDY5ZTVlZDI1NDdlOWU1NWE5NmU5NmViODMyYzYxNTYzMWUzYjU3NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U3Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ2OWU1ZWQyNTQ3ZTllNTVhOTZlOTZlYjgzMmM2MTU2MzFlM2I1NzYKQEAgLTAsMCArMSBAQAorW10pwyE6eyIqvj8nyrOzISEqIeApOiEq4Do6Olx1ZGJEOIgpe8MhOnshYCE/YL6+IiihClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ3MmIwN2I5ZmNmMmMyNDUxZTg3ODFlOTQ0YmY1Zjc3Y2Q4NDU3YzggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDcyYjA3YjlmY2YyYzI0NTFlODc4MWU5NDRiZjVmNzdjZDg0NTdjOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTA0NWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzQ3MmIwN2I5ZmNmMmMyNDUxZTg3ODFlOTQ0YmY1Zjc3Y2Q4NDU3YzgKQEAgLTAsMCArMSBAQAorMjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDg2ZGE4YWZmMDQwODNjNWUwZmUxMTJlNzMzZjJhZTUxMGUzMTJhMSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ODZkYThhZmYwNDA4M2M1ZTBmZTExMmU3MzNmMmFlNTEwZTMxMmExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZmNjNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDg2ZGE4YWZmMDQwODNjNWUwZmUxMTJlNzMzZjJhZTUxMGUzMTJhMQpAQCAtMCwwICsxIEBACit0cnW5ODIgJ0FcRTYwOykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDg4YTVlZDY0MWUzNDBhZTUxOTkyZTA0Y2U2NTkwYmRlYzU4NzIxOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ODhhNWVkNjQxZTM0MGFlNTE5OTJlMDRjZTY1OTBiZGVjNTg3MjE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjY3MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNDg4YTVlZDY0MWUzNDBhZTUxOTkyZTA0Y2U2NTkwYmRlYzU4NzIxOApAQCAtMCwwICsxIEBACiswLjEpuQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80YTBhMTkyMThlMDgyYTM0M2ExYjE3ZTUzMzM0MDlhZjlkOThmMGY1IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRhMGExOTIxOGUwODJhMzQzYTFiMTdlNTMzMzQwOWFmOWQ5OGYwZjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxYWUzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80YTBhMTkyMThlMDgyYTM0M2ExYjE3ZTUzMzM0MDlhZjlkOThmMGY1CkBAIC0wLDAgKzEgQEAKK2YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGE2NjQ0YTFhM2Q1MjE4ZjRiYmQ2MDIyMGNhYjc5YzBiN2JlZjQ1ZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80YTY2NDRhMWEzZDUyMThmNGJiZDYwMjIwY2FiNzljMGI3YmVmNDVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjRjYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGE2NjQ0YTFhM2Q1MjE4ZjRiYmQ2MDIyMGNhYjc5YzBiN2JlZjQ1ZQpAQCAtMCwwICsxIEBACitbMjEuODIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGIzOWQ0YjhhOWEwNGI5NDY5ZThmZTQwMTYzMjIzMjdmZTU0MDg4MiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80YjM5ZDRiOGE5YTA0Yjk0NjllOGZlNDAxNjMyMjMyN2ZlNTQwODgyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzFkMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGIzOWQ0YjhhOWEwNGI5NDY5ZThmZTQwMTYzMjIzMjdmZTU0MDg4MgpAQCAtMCwwICsxIEBACiszRTg7NCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGJiMDI5NGUxNDk0NmZiMWY2NDIxMzM4NDA5N2E2NzZkM2VmOTRmMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80YmIwMjk0ZTE0OTQ2ZmIxZjY0MjEzMzg0MDk3YTY3NmQzZWY5NGYwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTJkYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGJiMDI5NGUxNDk0NmZiMWY2NDIxMzM4NDA5N2E2NzZkM2VmOTRmMApAQCAtMCwwICsxIEBACiszNjMJCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGNkNjZkZmFiYmQ5NjRmOGM2YzQ0MTRiMDdjZGI0NWRhZTY5MmUxOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80Y2Q2NmRmYWJiZDk2NGY4YzZjNDQxNGIwN2NkYjQ1ZGFlNjkyZTE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGNkNjZkZmFiYmQ5NjRmOGM2YzQ0MTRiMDdjZGI0NWRhZTY5MmUxOQpAQCAtMCwwICsxIEBACis5MQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZDEzNGJjMDcyMjEyYWNlMmRmMzg1ZGFlMTQzMTM5ZGE3NGVjMGVmIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRkMTM0YmMwNzIyMTJhY2UyZGYzODVkYWUxNDMxMzlkYTc0ZWMwZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiZjQzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZDEzNGJjMDcyMjEyYWNlMmRmMzg1ZGFlMTQzMTM5ZGE3NGVjMGVmCkBAIC0wLDAgKzEgQEAKKzI0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRlZmEzNTIyMWIyMDg4ZTc4NTA0OGQwZmY4ZmQ5OWIwM2Q1MzE2ZmMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGVmYTM1MjIxYjIwODhlNzg1MDQ4ZDBmZjhmZDk5YjAzZDUzMTZmYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2YyMjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRlZmEzNTIyMWIyMDg4ZTc4NTA0OGQwZmY4ZmQ5OWIwM2Q1MzE2ZmMKQEAgLTAsMCArMSBAQAorMC4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRmYTJhNGE1YTJmN2RjNGRkYmRlY2FlM2VlODVjNzg3ODE3YjRjZjggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGZhMmE0YTVhMmY3ZGM0ZGRiZGVjYWUzZWU4NWM3ODc4MTdiNGNmOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2VmNDNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRmYTJhNGE1YTJmN2RjNGRkYmRlY2FlM2VlODVjNzg3ODE3YjRjZjgKQEAgLTAsMCArMSBAQAorODEzZTEyODU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZmVkNGJmMmRjNjI1OWQ5ZGU1NGU5ZmE3ZGI0ZmQ1YTYxZjI1MzVlIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRmZWQ0YmYyZGM2MjU5ZDlkZTU0ZTlmYTdkYjRmZDVhNjFmMjUzNWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljYjk0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZmVkNGJmMmRjNjI1OWQ5ZGU1NGU5ZmE3ZGI0ZmQ1YTYxZjI1MzVlCkBAIC0wLDAgKzEgQEAKKzI1MzFFMTE3dCkqNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZmY4MDBkZTA4NjNhZGI1ODUxZmEyNjkzNTE1OWFhNTNiMTFjYmE3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzRmZjgwMGRlMDg2M2FkYjU4NTFmYTI2OTM1MTU5YWE1M2IxMWNiYTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkM2QyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZmY4MDBkZTA4NjNhZGI1ODUxZmEyNjkzNTE1OWFhNTNiMTFjYmE3CkBAIC0wLDAgKzEgQEAKKzAuODI1MTAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGZmOTlhMDMwNTE4YTEzMjc0OGM0NGJjMWQ4MzYwMThlNWI4MmNkMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy80ZmY5OWEwMzA1MThhMTMyNzQ4YzQ0YmMxZDgzNjAxOGU1YjgyY2QwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTk0NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNGZmOTlhMDMwNTE4YTEzMjc0OGM0NGJjMWQ4MzYwMThlNWI4MmNkMApAQCAtMCwwICsxIEBACit7IipdOsMheym+PyfKKZMgOioh4Ck6ISrgOjo6XHVkYjgxXHVEZUExMl0pIXvDOnshYCE/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzUzMWM4N2I5NzcyZTU0ZTNlMTgzZWY3MjlmMGE3ZDVhMGQ1ODRmNDYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTMxYzg3Yjk3NzJlNTRlM2UxODNlZjcyOWYwYTdkNWEwZDU4NGY0NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGYxYmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzUzMWM4N2I5NzcyZTU0ZTNlMTgzZWY3MjlmMGE3ZDVhMGQ1ODRmNDYKQEAgLTAsMCArMSBAQAoreyInLCFcdTY1RTg4NTB7MjMxMjspOogpISo/J77Ks7MhIaoh4Ck6ISrgOjo4ITk6XHVkYkQ4NicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTM0ZDY2ZTdiMDcwOWQxZTc2OTJmYWFlOWU3ZjcyOTljOTJiYmE0YiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81MzRkNjZlN2IwNzA5ZDFlNzY5MmZhYWU5ZTdmNzI5OWM5MmJiYTRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjNmYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTM0ZDY2ZTdiMDcwOWQxZTc2OTJmYWFlOWU3ZjcyOTljOTJiYmE0YgpAQCAtMCwwICsxIEBACitbWzIuMTkzXTQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU0ODc3NWY5ZDdkMTMzMzlkYmEzMDAxZjgyMzhiODRlOWE0NTc1MzMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTQ4Nzc1ZjlkN2QxMzMzOWRiYTMwMDFmODIzOGI4NGU5YTQ1NzUzMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVkNmQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU0ODc3NWY5ZDdkMTMzMzlkYmEzMDAxZjgyMzhiODRlOWE0NTc1MzMKQEAgLTAsMCArMSBAQAorWzEuOTc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU0ZWMzYjJkOGE5YjdhNmQ4MjA0NzEyZWIxYjkwZGE3MDNjZjhhNzkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTRlYzNiMmQ4YTliN2E2ZDgyMDQ3MTJlYjFiOTBkYTcwM2NmOGE3OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk4NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU0ZWMzYjJkOGE5YjdhNmQ4MjA0NzEyZWIxYjkwZGE3MDNjZjhhNzkKQEAgLTAsMCArMSBAQAorIojDeykhOiq+Oz9YyrOzISEqIeApOiEq4Do6Olx1ZMNiKYg4IYc6eyFgISpgvr4hPychKm0sJyk7hSdgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU1MmNmZTFkODk1OGU2ZDAwM2VjOGU4ODNjNDk4M2RkNjdlZjI1NWUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTUyY2ZlMWQ4OTU4ZTZkMDAzZWM4ZTg4M2M0OTgzZGQ2N2VmMjU1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE4MzcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU1MmNmZTFkODk1OGU2ZDAwM2VjOGU4ODNjNDk4M2RkNjdlZjI1NWUKQEAgLTAsMCArMSBAQAorbnUjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU1ZjBjNjFkMDk2YTA4NTA2MDc2NDg5ZGVkM2I4NjhkYjQwODY3NzAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTVmMGM2MWQwOTZhMDg1MDYwNzY0ODlkZWQzYjg2OGRiNDA4Njc3MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjViNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU1ZjBjNjFkMDk2YTA4NTA2MDc2NDg5ZGVkM2I4NjhkYjQwODY3NzAKQEAgLTAsMCArMSBAQAorMC4yXUcpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU2ZTVmMzVlM2QwOGI0ZTE3ZTM1NThjYWNkZGY5ZTVlZDEzYTAxNTkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTZlNWYzNWUzZDA4YjRlMTdlMzU1OGNhY2RkZjllNWVkMTNhMDE1OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYwZmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU2ZTVmMzVlM2QwOGI0ZTE3ZTM1NThjYWNkZGY5ZTVlZDEzYTAxNTkKQEAgLTAsMCArMSBAQAorW1tbeyKIw3spIToqvjs/J8qzsyEhKiHgKTohKuA6OjpcdTEyMTk4LnkyZGIpOIjDITM7IciHOgQhYCEuNzs/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU4MGIwM2M0OWZiYTAyYmI4ZTM5OTUwMGViNjZmMmZmMDQ4MmIyMmEgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTgwYjAzYzQ5ZmJhMDJiYjhlMzk5NTAwZWI2NmYyZmYwNDgyYjIyYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzIzZTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU4MGIwM2M0OWZiYTAyYmI4ZTM5OTUwMGViNjZmMmZmMDQ4MmIyMmEKQEAgLTAsMCArMSBAQAorMl1HKXkzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU4NTI2NDNmYmJjZjkyYjAxODEzMjdiNjliNDg3NGM2YmE2ZmE5ZjQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTg1MjY0M2ZiYmNmOTJiMDE4MTMyN2I2OWI0ODc0YzZiYTZmYTlmNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJjN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU4NTI2NDNmYmJjZjkyYjAxODEzMjdiNjliNDg3NGM2YmE2ZmE5ZjQKQEAgLTAsMCArMSBAQAoreyInIVx1M0A6igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81OGY0OTdlNWVmYWY5ZjY5MDgwZjllZWY2M2IwYjlkYWJjZmRiYzBkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU4ZjQ5N2U1ZWZhZjlmNjkwODBmOWVlZjYzYjBiOWRhYmNmZGJjMGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkNzIyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81OGY0OTdlNWVmYWY5ZjY5MDgwZjllZWY2M2IwYjlkYWJjZmRiYzBkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81OTEyOWFhY2ZiNmNlYmJlMmM1MmYzMGVmMzQyNDIwOWY3MjUyZTgyIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU5MTI5YWFjZmI2Y2ViYmUyYzUyZjMwZWYzNDI0MjA5ZjcyNTJlODIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjYmNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81OTEyOWFhY2ZiNmNlYmJlMmM1MmYzMGVmMzQyNDIwOWY3MjUyZTgyCkBAIC0wLDAgKzEgQEAKKzY2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU5OGEyODdhM2U1NmNhYWUyM2VkNjNhYmM5NWQ1ZjM0NTcxNjVlZWYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNTk4YTI4N2EzZTU2Y2FhZTIzZWQ2M2FiYzk1ZDVmMzQ1NzE2NWVlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNkYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzU5OGEyODdhM2U1NmNhYWUyM2VkNjNhYmM5NWQ1ZjM0NTcxNjVlZWYKQEAgLTAsMCArMSBAQAorODFlNjEyNTM4MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81YTM3YTI2ZGQyNDgyMjI2ZjUzNGY3OWQzMjFkMjhlN2E2MTVhYjcyIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVhMzdhMjZkZDI0ODIyMjZmNTM0Zjc5ZDMyMWQyOGU3YTYxNWFiNzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMTFmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81YTM3YTI2ZGQyNDgyMjI2ZjUzNGY3OWQzMjFkMjhlN2E2MTVhYjcyCkBAIC0wLDAgKzEgQEAKK1swLjk1OV0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVhNzEwZGNkNGM3OGNhMWE3NGNlYjlmYmZiMDExZjdhYzg2YTVmN2IgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWE3MTBkY2Q0Yzc4Y2ExYTc0Y2ViOWZiZmIwMTFmN2FjODZhNWY3YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNkMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVhNzEwZGNkNGM3OGNhMWE3NGNlYjlmYmZiMDExZjdhYzg2YTVmN2IKQEAgLTAsMCArMSBAQAorW1t7fUczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVhZTdiODdmNTM3N2Q1ZmZjMTZmZDNmNjliNGE0YWE3YmU4YjExODQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWFlN2I4N2Y1Mzc3ZDVmZmMxNmZkM2Y2OWI0YTRhYTdiZThiMTE4NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWMxMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVhZTdiODdmNTM3N2Q1ZmZjMTZmZDNmNjliNGE0YWE3YmU4YjExODQKQEAgLTAsMCArMSwyIEBACit7CisiiCLDiMMiIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81YjNmZTg2ZDVhMzA5YTZiYTc0NTg4MWJkMjIwZmUxMTAwYjI3MWNlIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzViM2ZlODZkNWEzMDlhNmJhNzQ1ODgxYmQyMjBmZTExMDBiMjcxY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0NWViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81YjNmZTg2ZDVhMzA5YTZiYTc0NTg4MWJkMjIwZmUxMTAwYjI3MWNlCkBAIC0wLDAgKzEgQEAKK3RydWU4MiAnQU5FMigwOykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWMzOGI3ZGExMTNhYjQ1MzVkYmMyMjc3N2NlOGExNDgwYzFjOWQxZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81YzM4YjdkYTExM2FiNDUzNWRiYzIyNzc3Y2U4YTE0ODBjMWM5ZDFlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzU3NDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWMzOGI3ZGExMTNhYjQ1MzVkYmMyMjc3N2NlOGExNDgwYzFjOWQxZQpAQCAtMCwwICsxIEBACit7IichJ1x1M0I6igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81Y2E2YzQ1YThkMmUxMWM3ODI4MDZkZjQzZTc2NjhiZWI0YWJhOGY1IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVjYTZjNDVhOGQyZTExYzc4MjgwNmRmNDNlNzY2OGJlYjRhYmE4ZjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3MzZmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81Y2E2YzQ1YThkMmUxMWM3ODI4MDZkZjQzZTc2NjhiZWI0YWJhOGY1CkBAIC0wLDAgKzEgQEAKK251bI0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWRhN2I1NDMzMTMzMzlmODRmZDUyZTk2YmFjZjNhNzMzNjhhMWQyYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZGE3YjU0MzMxMzMzOWY4NGZkNTJlOTZiYWNmM2E3MzM2OGExZDJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNDRiM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWRhN2I1NDMzMTMzMzlmODRmZDUyZTk2YmFjZjNhNzMzNjhhMWQyYwpAQCAtMCwwICsxIEBACitdKcMhOnsiKr4/J8qzsyEhKiHgKTohKuA6OjpcdWRiRDiIKcMhOnshYCE/YL6+IT8nISptLCcpO4UnYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZTEyYWU5MTE3NjY4YmNjMjI4MzI2NDBjYzYyNjMxNTk0MGFlYmE4IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVlMTJhZTkxMTc2NjhiY2MyMjgzMjY0MGNjNjI2MzE1OTQwYWViYTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4MjAxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZTEyYWU5MTE3NjY4YmNjMjI4MzI2NDBjYzYyNjMxNTk0MGFlYmE4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZTM5NzQzOWEyNjgwZWQ4MjdjNDY3MDQ5NjljNjcxMWRhYmJkYTg0IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVlMzk3NDM5YTI2ODBlZDgyN2M0NjcwNDk2OWM2NzExZGFiYmRhODQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlMWY4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZTM5NzQzOWEyNjgwZWQ4MjdjNDY3MDQ5NjljNjcxMWRhYmJkYTg0CkBAIC0wLDAgKzEgQEAKKyIhIVxcJycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWU2MjlkZmI4Yjc1MzNjN2MyZDE3M2Q0YzNkNTg3Yzg4MTEyY2MyOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZTYyOWRmYjhiNzUzM2M3YzJkMTczZDRjM2Q1ODdjODgxMTJjYzI5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Yjk4NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWU2MjlkZmI4Yjc1MzNjN2MyZDE3M2Q0YzNkNTg3Yzg4MTEyY2MyOQpAQCAtMCwwICsxIEBACisxZTIxODiBNTYwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVlNzg1YzdjMjY4MTM1NzdmM2UzMGVmOGY3ZTM3YWIyYTlmZmUzOWMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWU3ODVjN2MyNjgxMzU3N2YzZTMwZWY4ZjdlMzdhYjJhOWZmZTM5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRhZDUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVlNzg1YzdjMjY4MTM1NzdmM2UzMGVmOGY3ZTM3YWIyYTlmZmUzOWMKQEAgLTAsMCArMSBAQAoreyIiOjAsfWYnK0d7KTEzKKchKCcnXCEPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVmMzM5NGY1MDU4ODIyY2MwNDRiOTI2NTQ4Mzc2MjU4OTcxNzY0ODAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWYzMzk0ZjUwNTg4MjJjYzA0NGI5MjY1NDgzNzYyNTg5NzE3NjQ4MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQ2MGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzVmMzM5NGY1MDU4ODIyY2MwNDRiOTI2NTQ4Mzc2MjU4OTcxNzY0ODAKQEAgLTAsMCArMSBAQAorODEzZTE2MjI0Mjc5MTNlMTA5OYE1NjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWZiOWJjYmJiMzBhMzc3MjA5ZWFiMDU0MWQxNDRlNDRlNzE1MDhkNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy81ZmI5YmNiYmIzMGEzNzcyMDllYWIwNTQxZDE0NGU0NGU3MTUwOGQ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2M4MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNWZiOWJjYmJiMzBhMzc3MjA5ZWFiMDU0MWQxNDRlNDRlNzE1MDhkNwpAQCAtMCwwICsxIEBACissMCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjAwODIxM2E2MWQwNmI0MzgyYjIyMzc2ODUzMGMzNDUyOTY4YjdiMyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82MDA4MjEzYTYxZDA2YjQzODJiMjIzNzY4NTMwYzM0NTI5NjhiN2IzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjgxMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjAwODIxM2E2MWQwNmI0MzgyYjIyMzc2ODUzMGMzNDUyOTY4YjdiMwpAQCAtMCwwICsxIEBACit7IicsIXU2NUU4ODUwezIzMTI7KTqIKSEqPye+yrOzIaoh4Ck6ISrA4Do6NCE5Olx1ZEQ4NicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjBiYTRiMmRhYTRlZDRkMDcwZmVjMDY2ODdlMjQ5ZTBlNmY5ZWU0NSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82MGJhNGIyZGFhNGVkNGQwNzBmZWMwNjY4N2UyNDllMGU2ZjllZTQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzUwYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjBiYTRiMmRhYTRlZDRkMDcwZmVjMDY2ODdlMjQ5ZTBlNmY5ZWU0NQpAQCAtMCwwICsxIEBACit7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzYyNWVkNjRjMzBjOGFiMmYwYjNiYzc1NjkwZjlmYWE0MjcwZjAwNDEgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjI1ZWQ2NGMzMGM4YWIyZjBiM2JjNzU2OTBmOWZhYTQyNzBmMDA0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTMyMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzYyNWVkNjRjMzBjOGFiMmYwYjNiYzc1NjkwZjlmYWE0MjcwZjAwNDEKQEAgLTAsMCArMSBAQAorIojDeykhOiq+Oz8nyrOzISEqIeApOiEq4Do6ZFxiOjgpKYjDIVsxLoc5Nzp7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzYzMTRjMmIzMDRkMDRkYzAxMDhhOTVkMjlhOTM1MTVlODVlMmIwYjAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjMxNGMyYjMwNGQwNGRjMDEwOGE5NWQyOWE5MzUxNWU4NWUyYjBiMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTgxZDliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzYzMTRjMmIzMDRkMDRkYzAxMDhhOTVkMjlhOTM1MTVlODVlMmIwYjAKQEAgLTAsMCArMSBAQAoreyIqXTrDIXspvj8nyrOzIDoqIeApOiEq4Do6Olx1ZGJEOFx1KSF7wzp7IWAhP2C+viIpKKEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjQ2MmQ4MDc5ZDJlYTkyMTYxN2U3ZDA3M2I4NWNmYWI3MDY4MDBkMyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82NDYyZDgwNzlkMmVhOTIxNjE3ZTdkMDczYjg1Y2ZhYjcwNjgwMGQzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2QyMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjQ2MmQ4MDc5ZDJlYTkyMTYxN2U3ZDA3M2I4NWNmYWI3MDY4MDBkMwpAQCAtMCwwICsxIEBACitudWxsjbMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjQ3NDM4MzI4Mjc4OGU1NTZhYTg2ZjU3ZmM4NjUwMTM3YWQyNjRkMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82NDc0MzgzMjgyNzg4ZTU1NmFhODZmNTdmYzg2NTAxMzdhZDI2NGQwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTBmNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjQ3NDM4MzI4Mjc4OGU1NTZhYTg2ZjU3ZmM4NjUwMTM3YWQyNjRkMApAQCAtMCwwICsxIEBACit7IiEhXC8hIQ9cJycnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzY0OGMzZjU4ZWNjOGZiNGI4Yzc3OWU2YjExMDA2YWI1YjE5ODZkYWQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjQ4YzNmNThlY2M4ZmI0YjhjNzc5ZTZiMTEwMDZhYjViMTk4NmRhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlhOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzY0OGMzZjU4ZWNjOGZiNGI4Yzc3OWU2YjExMDA2YWI1YjE5ODZkYWQKQEAgLTAsMCArMSBAQAorMjEuNDk4IgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82NjMyOGUwM2EyY2NkNWU1NGRhYjIzYjgxNjE4Mjc4NmU2ZjUxOGI2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzY2MzI4ZTAzYTJjY2Q1ZTU0ZGFiMjNiODE2MTgyNzg2ZTZmNTE4YjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3MDE2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82NjMyOGUwM2EyY2NkNWU1NGRhYjIzYjgxNjE4Mjc4NmU2ZjUxOGI2CkBAIC0wLDAgKzEgQEAKK1t7IojDXHQ1eykhOioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjgzZTkwNDViYzk1ZTBjYjVmYzE2ZWM2NGIxMTg0MzM0NzViYTU1OSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82ODNlOTA0NWJjOTVlMGNiNWZjMTZlYzY0YjExODQzMzQ3NWJhNTU5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWVjZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjgzZTkwNDViYzk1ZTBjYjVmYzE2ZWM2NGIxMTg0MzM0NzViYTU1OQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjg5ZjEzNjgwZjQ2ODIzMDNjOGFhNjgyOGI2Nzk1NTk1OWRjOTY2OSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82ODlmMTM2ODBmNDY4MjMwM2M4YWE2ODI4YjY3OTU1OTU5ZGM5NjY5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWM4OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjg5ZjEzNjgwZjQ2ODIzMDNjOGFhNjgyOGI2Nzk1NTk1OWRjOTY2OQpAQCAtMCwwICsxIEBACitbIipdOsMheym+PyfKs7MhISoh4Ck6ISrgOjo6XHVkY0Q4iCl7wyE6eyFgIT9gvr4iKKEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjhjNmJhN2YwNjAyYTU0MTBkMWZhM2M1ZGUyNGZlMjY0NDM2Yjk5MyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82OGM2YmE3ZjA2MDJhNTQxMGQxZmEzYzVkZTI0ZmUyNjQ0MzZiOTkzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzU1NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjhjNmJhN2YwNjAyYTU0MTBkMWZhM2M1ZGUyNGZlMjY0NDM2Yjk5MwpAQCAtMCwwICsxIEBACit7fSxbClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzY5OWNhZmRlODBiMWUxNzc3MzA2Zjc4MTE4NmQxMjUzZjAxOGFiMjMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjk5Y2FmZGU4MGIxZTE3NzczMDZmNzgxMTg2ZDEyNTNmMDE4YWIyMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE0ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzY5OWNhZmRlODBiMWUxNzc3MzA2Zjc4MTE4NmQxMjUzZjAxOGFiMjMKQEAgLTAsMCArMSBAQAorWzJ9NXsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjlhYjA1M2I1OWUyMzVmZDZhZjI0NmM1MTgwZjE1YmQ5NTI5NTExMyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82OWFiMDUzYjU5ZTIzNWZkNmFmMjQ2YzUxODBmMTViZDk1Mjk1MTEzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGY1YTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjlhYjA1M2I1OWUyMzVmZDZhZjI0NmM1MTgwZjE1YmQ5NTI5NTExMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjlhZmExMjUxMGIyZTY1M2IwYWY3YzcwMzA4MzI2NDdiMmQ2M2MzNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82OWFmYTEyNTEwYjJlNjUzYjBhZjdjNzAzMDgzMjY0N2IyZDYzYzM3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDUxMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNjlhZmExMjUxMGIyZTY1M2IwYWY3YzcwMzA4MzI2NDdiMmQ2M2MzNwpAQCAtMCwwICsxIEBACisiiMMsIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82Yjc1ODU3Zjg2YmU1YzUxYjIxYTk3ZjRhNjFlNjllOGJiNmNkNjk4IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZiNzU4NTdmODZiZTVjNTFiMjFhOTdmNGE2MWU2OWU4YmI2Y2Q2OTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwYWJmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82Yjc1ODU3Zjg2YmU1YzUxYjIxYTk3ZjRhNjFlNjllOGJiNmNkNjk4CkBAIC0wLDAgKzEgQEAKKzMxMDU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82Yzc1ZTcxZWNkZTlmMDczYTdiYWQ4OWY0ODMxYzhjZGUwYmMxODMwIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZjNzVlNzFlY2RlOWYwNzNhN2JhZDg5ZjQ4MzFjOGNkZTBiYzE4MzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkOGZhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82Yzc1ZTcxZWNkZTlmMDczYTdiYWQ4OWY0ODMxYzhjZGUwYmMxODMwCkBAIC0wLDAgKzEgQEAKKzkJMyfBNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82Y2U1MTcwZGM0ZjJlZWUzYjMxYTg3NWI2YTQxZjI0NDQ5NTlmM2RkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZjZTUxNzBkYzRmMmVlZTNiMzFhODc1YjZhNDFmMjQ0NDk1OWYzZGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxYWFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82Y2U1MTcwZGM0ZjJlZWUzYjMxYTg3NWI2YTQxZjI0NDQ5NTlmM2RkCkBAIC0wLDAgKzEgQEAKKzB9NTQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNmQyODU5NDM2ZmJiZWU2MzdmMGE1OTgxY2E4MmU4Zjg4YTFkMGQyOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82ZDI4NTk0MzZmYmJlZTYzN2YwYTU5ODFjYTgyZThmODhhMWQwZDI4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDdjMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNmQyODU5NDM2ZmJiZWU2MzdmMGE1OTgxY2E4MmU4Zjg4YTFkMGQyOApAQCAtMCwwICsxIEBACitbdHJbWzAuMTkzO100KgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82ZDYzZTM5ZjU2ZDFkNTM3YmFiOWMyODMwMzAzY2FiYWIzY2Q5MDM1IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZkNjNlMzlmNTZkMWQ1MzdiYWI5YzI4MzAzMDNjYWJhYjNjZDkwMzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1MTM4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82ZDYzZTM5ZjU2ZDFkNTM3YmFiOWMyODMwMzAzY2FiYWIzY2Q5MDM1CkBAIC0wLDAgKzEgQEAKK3siIjp9K0d7MTKnKCEoJydcIQ8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNmUwNWEwYTI0MGZlMjk3NGUxNDUyN2JiZTM5MGQyOTQ1NjQxNTZlMiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy82ZTA1YTBhMjQwZmUyOTc0ZTE0NTI3YmJlMzkwZDI5NDU2NDE1NmUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjM2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNmUwNWEwYTI0MGZlMjk3NGUxNDUyN2JiZTM5MGQyOTQ1NjQxNTZlMgpAQCAtMCwwICsxIEBACitbMi4xOTgxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZlNmM5ZDMwMWFkYjBmMGRkZmZkNzljZGYzNDI2YTJkZTk5YmFkNDggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNmU2YzlkMzAxYWRiMGYwZGRmZmQ3OWNkZjM0MjZhMmRlOTliYWQ0OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjNjNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZlNmM5ZDMwMWFkYjBmMGRkZmZkNzljZGYzNDI2YTJkZTk5YmFkNDgKQEAgLTAsMCArMSwyIEBACit7CisiiMMiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZlOTg5ZWRmNzI1ZWM2NDg0OTM3NzY4MWNlMDI2NDFjM2QxODcwZTggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNmU5ODllZGY3MjVlYzY0ODQ5Mzc3NjgxY2UwMjY0MWMzZDE4NzBlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWNiNjRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzZlOTg5ZWRmNzI1ZWM2NDg0OTM3NzY4MWNlMDI2NDFjM2QxODcwZTgKQEAgLTAsMCArMSBAQAorMn1HKXkzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzcwMTQyZjY2NDc1YWUyZmIzMzcyMmQ4ZDQ3NTBmMzg2ZWNmZWZlN2IgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNzAxNDJmNjY0NzVhZTJmYjMzNzIyZDhkNDc1MGYzODZlY2ZlZmU3YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTViMTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzcwMTQyZjY2NDc1YWUyZmIzMzcyMmQ4ZDQ3NTBmMzg2ZWNmZWZlN2IKQEAgLTAsMCArMSBAQAorMi4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzcxOWVkYmU2NjdjZTI3MjlhYzc4YTIyZGFjMjkyNjNjOTExNDQwMjkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNzE5ZWRiZTY2N2NlMjcyOWFjNzhhMjJkYWMyOTI2M2M5MTE0NDAyOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NiY2EzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzcxOWVkYmU2NjdjZTI3MjlhYzc4YTIyZGFjMjkyNjNjOTExNDQwMjkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzcxZjk5Y2EyYmRhNmVmMmUxNWI5NjU0NzlhNzk1ODdmOWQ3OTRiZTAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNzFmOTljYTJiZGE2ZWYyZTE1Yjk2NTQ3OWE3OTU4N2Y5ZDc5NGJlMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQ0OWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzcxZjk5Y2EyYmRhNmVmMmUxNWI5NjU0NzlhNzk1ODdmOWQ3OTRiZTAKQEAgLTAsMCArMSBAQAorODM0RTspClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzc3MTRhMWEzMjg3MjQ0MmEyZWFmZjQ3MjY4NWYzZWE2OTQ1MWE3MzIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNzcxNGExYTMyODcyNDQyYTJlYWZmNDcyNjg1ZjNlYTY5NDUxYTczMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2E4MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzc3MTRhMWEzMjg3MjQ0MmEyZWFmZjQ3MjY4NWYzZWE2OTQ1MWE3MzIKQEAgLTAsMCArMSBAQAorODMyNEU2ODU7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83NzE5YTFjNzgyYTFiYTkxYzAzMWE2ODJhMGEyZjg2NTgyMDlhZGJmIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzc3MTlhMWM3ODJhMWJhOTFjMDMxYTY4MmEwYTJmODY1ODIwOWFkYmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5ZTkwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83NzE5YTFjNzgyYTFiYTkxYzAzMWE2ODJhMGEyZjg2NTgyMDlhZGJmCkBAIC0wLDAgKzEgQEAKKzI5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzc3ZGU2OGRhZWNkODIzYmFiYmI1OGVkYjFjOGUxNGQ3MTA2ZTgzYmIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvNzdkZTY4ZGFlY2Q4MjNiYWJiYjU4ZWRiMWM4ZTE0ZDcxMDZlODNiYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQwZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzc3ZGU2OGRhZWNkODIzYmFiYmI1OGVkYjFjOGUxNGQ3MTA2ZTgzYmIKQEAgLTAsMCArMSBAQAorMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83OTU3ZGM5YWFjMzFlNmE2NzgzZmIzYTZlZTA3MzY4OGZlZDZjZjlkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzc5NTdkYzlhYWMzMWU2YTY3ODNmYjNhNmVlMDczNjg4ZmVkNmNmOWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0MTBhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83OTU3ZGM5YWFjMzFlNmE2NzgzZmIzYTZlZTA3MzY4OGZlZDZjZjlkCkBAIC0wLDAgKzEgQEAKK2ZhbFsyLjE5ODIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2FlODkzY2JiZjliMTFmZjQxMTY0MGI4MDk4NWNlNjE4OTA3NTU5YyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83YWU4OTNjYmJmOWIxMWZmNDExNjQwYjgwOTg1Y2U2MTg5MDc1NTljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDYwNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2FlODkzY2JiZjliMTFmZjQxMTY0MGI4MDk4NWNlNjE4OTA3NTU5YwpAQCAtMCwwICsxIEBACitbMC4yOV05NSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2IyMGFjNTA5NTQwNjNlM2FkMDA4MTNhY2FiNGE5OGIyYmZkYjg1OCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83YjIwYWM1MDk1NDA2M2UzYWQwMDgxM2FjYWI0YTk4YjJiZmRiODU4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZmJjMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2IyMGFjNTA5NTQwNjNlM2FkMDA4MTNhY2FiNGE5OGIyYmZkYjg1OApAQCAtMCwwICsxIEBACitbMi4xOTgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2I2MjczMTQ1ZmIwOTBkZTFjNjE2MzU4NmY4ODRhMWRhNGI1Y2ZiZiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83YjYyNzMxNDVmYjA5MGRlMWM2MTYzNTg2Zjg4NGExZGE0YjVjZmJmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzVhNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2I2MjczMTQ1ZmIwOTBkZTFjNjE2MzU4NmY4ODRhMWRhNGI1Y2ZiZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2NmODRiNWE3ODI4MWU2YzZiNWE5ODg0MTEwZjNkYmM2YTQwZTMxMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83Y2Y4NGI1YTc4MjgxZTZjNmI1YTk4ODQxMTBmM2RiYzZhNDBlMzEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDlhODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvN2NmODRiNWE3ODI4MWU2YzZiNWE5ODg0MTEwZjNkYmM2YTQwZTMxMApAQCAtMCwwICsxLDIgQEAKK3sKKyKIWzIiOn01iMNbIn01ESIiewpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83ZWYxM2I4M2U2YmRlNTgyZDkwMDBiZTA0M2U3MjljZDMyMjFjMTUwIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzdlZjEzYjgzZTZiZGU1ODJkOTAwMGJlMDQzZTcyOWNkMzIyMWMxNTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2OTA1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy83ZWYxM2I4M2U2YmRlNTgyZDkwMDBiZTA0M2U3MjljZDMyMjFjMTUwCkBAIC0wLDAgKzEgQEAKK3siIiBcIScoXCchDwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84MjA1OWUyNTA5MDRiNDc4ZjY1ZGFhMGU2NDdjMTY0N2JhNmQ2YTNkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzgyMDU5ZTI1MDkwNGI0NzhmNjVkYWEwZTY0N2MxNjQ3YmE2ZDZhM2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxMmZhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84MjA1OWUyNTA5MDRiNDc4ZjY1ZGFhMGU2NDdjMTY0N2JhNmQ2YTNkCkBAIC0wLDAgKzEgQEAKKzIxLjU5NrsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODIwN2ZkZjRiZDMwMmQ2YjZiMTg5NDk5MGIzNTM5NDRhODcxNmFhNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84MjA3ZmRmNGJkMzAyZDZiNmIxODk0OTkwYjM1Mzk0NGE4NzE2YWE3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzNlMzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODIwN2ZkZjRiZDMwMmQ2YjZiMTg5NDk5MGIzNTM5NDRhODcxNmFhNwpAQCAtMCwwICsxIEBACit7IipdOsMheym+PyfKKZMgOioh4Ck6ISrgOjo6XHVkYjgxXHVEODNlMTJdKSF7wzp7IWAhPwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84MzFhNDlhZDgxYjU5MDI1YzI0MWFjOWU1OGJkODg0NjNmZDc5OGViIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzgzMWE0OWFkODFiNTkwMjVjMjQxYWM5ZTU4YmQ4ODQ2M2ZkNzk4ZWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0Mjg3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84MzFhNDlhZDgxYjU5MDI1YzI0MWFjOWU1OGJkODg0NjNmZDc5OGViCkBAIC0wLDAgKzEgQEAKKzVFODg1MHsyMzEyOyk6iCkhwyIqvj8nyrOzISEqIeApOiEq4Do6OCE5Olx1ZGJEOIgpwyE6eyFgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg0NTgyYzFkYmUwMjY0NzUzMTlkZjE0YzE5OTY3ZDFkZDBiZjc1MWYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODQ1ODJjMWRiZTAyNjQ3NTMxOWRmMTRjMTk5NjdkMWRkMGJmNzUxZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjUwOWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg0NTgyYzFkYmUwMjY0NzUzMTlkZjE0YzE5OTY3ZDFkZDBiZjc1MWYKQEAgLTAsMCArMSBAQAorNTYwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg2MGQ0YWQwYjdjMDI2ZDFmY2Y1MTkzMmI1ZTQ2NTAwYmU3ODYwYTYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODYwZDRhZDBiN2MwMjZkMWZjZjUxOTMyYjVlNDY1MDBiZTc4NjBhNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFlYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg2MGQ0YWQwYjdjMDI2ZDFmY2Y1MTkzMmI1ZTQ2NTAwYmU3ODYwYTYKQEAgLTAsMCArMSwyIEBACiszCispClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg2NWM3Y2YzNmE0ZjQ0OTlhNjI0MmU1MWI3N2I1OGI4NjhhNzQ0N2IgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODY1YzdjZjM2YTRmNDQ5OWE2MjQyZTUxYjc3YjU4Yjg2OGE3NDQ3YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzhjN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg2NWM3Y2YzNmE0ZjQ0OTlhNjI0MmU1MWI3N2I1OGI4NjhhNzQ0N2IKQEAgLTAsMCArMSBAQAorIjkhW1xiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg3YTJiODBmOTI3MjU4MzUxN2MwMjA3YWYxNzZmYzQwZWE1NTAyMmMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODdhMmI4MGY5MjcyNTgzNTE3YzAyMDdhZjE3NmZjNDBlYTU1MDIyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmE1MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg3YTJiODBmOTI3MjU4MzUxN2MwMjA3YWYxNzZmYzQwZWE1NTAyMmMKQEAgLTAsMCArMSBAQAorMC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODg3MzA5ZDA0OGJlZWY4M2FkM2VhYmYyYTc5YTY0YTM4OWFiMWM5ZiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ODczMDlkMDQ4YmVlZjgzYWQzZWFiZjJhNzlhNjRhMzg5YWIxYzlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGI0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODg3MzA5ZDA0OGJlZWY4M2FkM2VhYmYyYTc5YTY0YTM4OWFiMWM5ZgpAQCAtMCwwICsxIEBACisyNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84OGQ4OTg2MGNjYWYyMWU1ZjBmMDAyMzAzYTJjZDg1M2VjYmIyYWNiIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg4ZDg5ODYwY2NhZjIxZTVmMGYwMDIzMDNhMmNkODUzZWNiYjJhY2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmZmNhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84OGQ4OTg2MGNjYWYyMWU1ZjBmMDAyMzAzYTJjZDg1M2VjYmIyYWNiCkBAIC0wLDAgKzEgQEAKK3siIjp7fStHJyghJyhcJyEPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg4ZjY1ODQwMGIxODcwZGRmMDgxZmIwMzAyMGMzMDk4YjBiMWUwODMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODhmNjU4NDAwYjE4NzBkZGYwODFmYjAzMDIwYzMwOThiMGIxZTA4MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRjNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzg4ZjY1ODQwMGIxODcwZGRmMDgxZmIwMzAyMGMzMDk4YjBiMWUwODMKQEAgLTAsMCArMSBAQAorW1tdKcMhOnsiKr4/J8qzsyEhKiHgKTohKuA6OjpcdWRiRHs4iCl7wyE6eyFgIT9gvr4iKKEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODhmOGIwOTg0YmIyZjA4MTkxOGFkODgzYzhmMGZmYWNiNWE4ZmYwYSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84OGY4YjA5ODRiYjJmMDgxOTE4YWQ4ODNjOGYwZmZhY2I1YThmZjBhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzk0MWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODhmOGIwOTg0YmIyZjA4MTkxOGFkODgzYzhmMGZmYWNiNWE4ZmYwYQpAQCAtMCwwICsxLDIgQEAKKzIKK48KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODkzMDQ5NTM0OTVmMDYwYzdhYmQzNTg0ZDgzY2IxYzhlNmQ2NjUzYiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84OTMwNDk1MzQ5NWYwNjBjN2FiZDM1ODRkODNjYjFjOGU2ZDY2NTNiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODZjYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvODkzMDQ5NTM0OTVmMDYwYzdhYmQzNTg0ZDgzY2IxYzhlNmQ2NjUzYgpAQCAtMCwwICsxIEBACitbW1siiMN7KSE6Kr47PyfKs7MhISoh4CldKcMhOns6ISrgOjo6XCJ1MTIqMb4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGE1ZjZkYzY4NzNlM2ZkNTFmZDg2Njg1NGQ4NTI1OGY4YWE4M2EwMiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84YTVmNmRjNjg3M2UzZmQ1MWZkODY2ODU0ZDg1MjU4ZjhhYTgzYTAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1N2FkZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGE1ZjZkYzY4NzNlM2ZkNTFmZDg2Njg1NGQ4NTI1OGY4YWE4M2EwMgpAQCAtMCwwICsxLDIgQEAKK3sKKyKIIjqIwyIiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhhODcyNjEyNzdjMTU2NjdlMjk1N2RkNTJjNWRiNjc1N2ViYzhlODggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGE4NzI2MTI3N2MxNTY2N2UyOTU3ZGQ1MmM1ZGI2NzU3ZWJjOGU4OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDdlZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhhODcyNjEyNzdjMTU2NjdlMjk1N2RkNTJjNWRiNjc1N2ViYzhlODgKQEAgLTAsMCArMSBAQAordCKIw3spIToqvjs/WMqzsyEhKiHgKTohKuA6OjpcClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhhYTYxZDhiZDI2MDk0MjUyMWJiMWJhODJjZDRjY2UyMzI0ZmRiZWUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGFhNjFkOGJkMjYwOTQyNTIxYmIxYmE4MmNkNGNjZTIzMjRmZGJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzkzZGUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhhYTYxZDhiZDI2MDk0MjUyMWJiMWJhODJjZDRjY2UyMzI0ZmRiZWUKQEAgLTAsMCArMSBAQAorZmFsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhkODg3NDQzOTU2OTgyNGUzNzFhMDI4NDQ2MDQ0MDE3NWNkYjhhMjcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGQ4ODc0NDM5NTY5ODI0ZTM3MWEwMjg0NDYwNDQwMTc1Y2RiOGEyNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk2NGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhkODg3NDQzOTU2OTgyNGUzNzFhMDI4NDQ2MDQ0MDE3NWNkYjhhMjcKQEAgLTAsMCArMSBAQAorNUU4ODIzMTI7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ZTZmZWM4YTA1YjI0ZjIyMWI2ZTk0ZmRmZTIwNWU1YmY3NzA5YTJjIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlNmZlYzhhMDViMjRmMjIxYjZlOTRmZGZlMjA1ZTViZjc3MDlhMmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0NmIyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ZTZmZWM4YTA1YjI0ZjIyMWI2ZTk0ZmRmZTIwNWU1YmY3NzA5YTJjCkBAIC0wLDAgKzEgQEAKK1t7IltdKcMhOnsmKr6Iw1xmNXspIT8nyrOzISEqIeApOiGW4Do6Olx1YkQ4Oogpa8MhOnshYCE/YL6+IigqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlN2ZkYTc3NjQ0ZmY5MTU3OGQyNTI0M2ZhZDUxYTNjZDZkNjA4NjAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGU3ZmRhNzc2NDRmZjkxNTc4ZDI1MjQzZmFkNTFhM2NkNmQ2MDg2MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhjMGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlN2ZkYTc3NjQ0ZmY5MTU3OGQyNTI0M2ZhZDUxYTNjZDZkNjA4NjAKQEAgLTAsMCArMSBAQAorWzIuMTk4MjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGVhNjI5NWZmODJiYjExOWFjZDQ0YTkxYjQ2M2IxOWZlZGFmYjIyNiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ZWE2Mjk1ZmY4MmJiMTE5YWNkNDRhOTFiNDYzYjE5ZmVkYWZiMjI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2RjOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGVhNjI5NWZmODJiYjExOWFjZDQ0YTkxYjQ2M2IxOWZlZGFmYjIyNgpAQCAtMCwwICsxIEBACitbWzIuNrs3XTMqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlZTUxY2FhYTJjMmY0ZWUyZTViNGI3ZWY1YTg5ZGI3ZGYxMDY4ZDcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGVlNTFjYWFhMmMyZjRlZTJlNWI0YjdlZjVhODlkYjdkZjEwNjhkNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIyNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlZTUxY2FhYTJjMmY0ZWUyZTViNGI3ZWY1YTg5ZGI3ZGYxMDY4ZDcKQEAgLTAsMCArMSBAQAorOTIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGVmNGRkOWYyZDBmOWQ3NzBjOTM3ZDlhNDM0MTNkMjRkZjgzZjA5YiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ZWY0ZGQ5ZjJkMGY5ZDc3MGM5MzdkOWE0MzQxM2QyNGRmODNmMDliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGVmNGRkOWYyZDBmOWQ3NzBjOTM3ZDlhNDM0MTNkMjRkZjgzZjA5YgpAQCAtMCwwICsxIEBACitbeyKIw1xmNXspIToqXSl7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlZmQ4NmZiNzhhNTZhNTE0NWVkNzczOWRjYjAwYzc4NTgxYzUzNzUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGVmZDg2ZmI3OGE1NmE1MTQ1ZWQ3NzM5ZGNiMDBjNzg1ODFjNTM3NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY2NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhlZmQ4NmZiNzhhNTZhNTE0NWVkNzczOWRjYjAwYzc4NTgxYzUzNzUKQEAgLTAsMCArMSBAQAordApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ZjBiYTc2MmMyZmVkMGZjOTkzZmViOTE5NDg5MDJhYzM5N2IwOTE5IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhmMGJhNzYyYzJmZWQwZmM5OTNmZWI5MTk0ODkwMmFjMzk3YjA5MTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNmRmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy84ZjBiYTc2MmMyZmVkMGZjOTkzZmViOTE5NDg5MDJhYzM5N2IwOTE5CkBAIC0wLDAgKzEgQEAKK1siKjrDIXspvj8nyrOzISoqIeApOiEq4Do6Olx1ZGJEOCyIClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhmZTgxZTQ1MDY5NGNhYzFlYjRjNGE1Yzk2NmZmYmM1NmFkZTM1MTMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOGZlODFlNDUwNjk0Y2FjMWViNGM0YTVjOTY2ZmZiYzU2YWRlMzUxMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNjMDQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzhmZTgxZTQ1MDY5NGNhYzFlYjRjNGE1Yzk2NmZmYmM1NmFkZTM1MTMKQEAgLTAsMCArMSBAQAorMC4yNDk33CAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTAyYmEzY2RhMTg4MzgwMTU5NGI2ZTFiNDUyNzkwY2M1Mzk0OGZkYSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85MDJiYTNjZGExODgzODAxNTk0YjZlMWI0NTI3OTBjYzUzOTQ4ZmRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTMwMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTAyYmEzY2RhMTg4MzgwMTU5NGI2ZTFiNDUyNzkwY2M1Mzk0OGZkYQpAQCAtMCwwICsxIEBACis3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkxMGExNTI4YjI4ZWJjNmZmMmYyYTRmZWRiMDEzYzg2ZGU0MTAzZTIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTEwYTE1MjhiMjhlYmM2ZmYyZjJhNGZlZGIwMTNjODZkZTQxMDNlMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzViYzUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkxMGExNTI4YjI4ZWJjNmZmMmYyYTRmZWRiMDEzYzg2ZGU0MTAzZTIKQEAgLTAsMCArMSBAQAorODE2MkUyNTE3Oyk2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkyMDQ5YmYzZDhhMGVjOTNjMmQxNjMzNjMxYzAwODJlNjZjYTY5ZTcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTIwNDliZjNkOGEwZWM5M2MyZDE2MzM2MzFjMDA4MmU2NmNhNjllNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGUwMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkyMDQ5YmYzZDhhMGVjOTNjMmQxNjMzNjMxYzAwODJlNjZjYTY5ZTcKQEAgLTAsMCArMSwyIEBACiswCiuPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkyMGEzYzMxOGYzMTI3YjljMzBhYjAyYTA3NzU1NWM3ZGZiYjZlZGIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTIwYTNjMzE4ZjMxMjdiOWMzMGFiMDJhMDc3NTU1YzdkZmJiNmVkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTdhNjJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkyMGEzYzMxOGYzMTI3YjljMzBhYjAyYTA3NzU1NWM3ZGZiYjZlZGIKQEAgLTAsMCArMSBAQAorW1tbIojDeykhOiq+Oz8nyrOzISEqIeApOiEq4Do6Olx1MTIxOTgueTJkYik4iMMhMzshhzp7IWAhLjc7PwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85MjVmYzA1ZGQ2NjFhZWI0YTc3NmRjYmM1ZGYzZGNiMmNlZmFmMGE2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkyNWZjMDVkZDY2MWFlYjRhNzc2ZGNiYzVkZjNkY2IyY2VmYWYwYTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0MjVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85MjVmYzA1ZGQ2NjFhZWI0YTc3NmRjYmM1ZGYzZGNiMmNlZmFmMGE2CkBAIC0wLDAgKzEgQEAKK3t9K0cnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkzNjdiYTY1YWZmZDViZjdhYWJmNzljMjhlNzgzY2M1ZDkzNTE4ZTggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTM2N2JhNjVhZmZkNWJmN2FhYmY3OWMyOGU3ODNjYzVkOTM1MThlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTljMWFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkzNjdiYTY1YWZmZDViZjdhYWJmNzljMjhlNzgzY2M1ZDkzNTE4ZTgKQEAgLTAsMCArMSBAQAorWzIuMTFFMDIJIojBgTk2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85MzlmNTA0OWIxZWVmYjkxY2NiZDNmY2VjYWVkOGNiMjFlYTZiMjg1IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzkzOWY1MDQ5YjFlZWZiOTFjY2JkM2ZjZWNhZWQ4Y2IyMWVhNmIyODUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZDM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85MzlmNTA0OWIxZWVmYjkxY2NiZDNmY2VjYWVkOGNiMjFlYTZiMjg1CkBAIC0wLDAgKzEgQEAKKyIhXCcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTQwNWMyYjAwZWFhNTUyNmY3MWNjNzg5MTRkYmQzZWNhZjA5M2I2ZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NDA1YzJiMDBlYWE1NTI2ZjcxY2M3ODkxNGRiZDNlY2FmMDkzYjZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTY2MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTQwNWMyYjAwZWFhNTUyNmY3MWNjNzg5MTRkYmQzZWNhZjA5M2I2ZQpAQCAtMCwwICsxIEBACisiOSFbXCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTRkMzU5ODc1MTU2OWQyYTViZTI1OGU1OTY2NWNiYmYwNjkyZGZiZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NGQzNTk4NzUxNTY5ZDJhNWJlMjU4ZTU5NjY1Y2JiZjA2OTJkZmJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzljZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTRkMzU5ODc1MTU2OWQyYTViZTI1OGU1OTY2NWNiYmYwNjkyZGZiZQpAQCAtMCwwICsxIEBACisiJywhXHU2NUU4ODUwezIzMTI7KTqIKSEqPye+yrMwLrMhIaohwCk6KiHgOjs4ITk6XHVkYkQ4XHVEZTI1fzAnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk0Zjk2ZDk1ZDAxZTk4ZmQyZjA0Y2UyNmMwOTEzZTVmOWE4ODJmYjQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTRmOTZkOTVkMDFlOThmZDJmMDRjZTI2YzA5MTNlNWY5YTg4MmZiNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGUyY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk0Zjk2ZDk1ZDAxZTk4ZmQyZjA0Y2UyNmMwOTEzZTVmOWE4ODJmYjQKQEAgLTAsMCArMSBAQAorNTghOQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NWI1NGE4NGRiNzVhYmFiNDAxZDI4MmZkYjA0NDQwYTg3OWE5NzA4IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk1YjU0YTg0ZGI3NWFiYWI0MDFkMjgyZmRiMDQ0NDBhODc5YTk3MDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MTc0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NWI1NGE4NGRiNzVhYmFiNDAxZDI4MmZkYjA0NDQwYTg3OWE5NzA4CkBAIC0wLDAgKzEgQEAKK3tdM1sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTYxODkyMDJlNTg3ZWM5NTFkNTc5NWRhM2UwMzA2MmYyZmI1ZDcwOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NjE4OTIwMmU1ODdlYzk1MWQ1Nzk1ZGEzZTAzMDYyZjJmYjVkNzA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMmZhN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTYxODkyMDJlNTg3ZWM5NTFkNTc5NWRhM2UwMzA2MmYyZmI1ZDcwOApAQCAtMCwwICsxIEBACit7IiggXFwhpygnIQ8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTcxMTcwMzQyODcwNGNlMjgyN2E3MTllZGRiOWQ1NGJlMjNhMGNiNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NzExNzAzNDI4NzA0Y2UyODI3YTcxOWVkZGI5ZDU0YmUyM2EwY2I3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjkzZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTcxMTcwMzQyODcwNGNlMjgyN2E3MTllZGRiOWQ1NGJlMjNhMGNiNwpAQCAtMCwwICsxIEBACit7IicsIVx1NjVFODg1MHsyMzEyOyk6iCkhKj8nvsqzsyEhqiHgKTohKuA6OjghOTpcdWRiRDgsNicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTczNDU5N2U5NmVlYmU5OWIyMjQzMTIxYTUxZDE3OGEzMzhlYzQ2ZiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NzM0NTk3ZTk2ZWViZTk5YjIyNDMxMjFhNTFkMTc4YTMzOGVjNDZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDMzNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTczNDU5N2U5NmVlYmU5OWIyMjQzMTIxYTUxZDE3OGEzMzhlYzQ2ZgpAQCAtMCwwICsxIEBACis4MTYyRS0xMzswLjMyKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NzQ3Yzg1YTk1MTAwMTFiZjg3YzIzYTgwYjAyOWI5ZjJkMDRjMzdkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk3NDdjODVhOTUxMDAxMWJmODdjMjNhODBiMDI5YjlmMmQwNGMzN2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0YzkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85NzQ3Yzg1YTk1MTAwMTFiZjg3YzIzYTgwYjAyOWI5ZjJkMDRjMzdkCkBAIC0wLDAgKzEgQEAKK1swLjM2MjksOTUgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk3ZDE3MGUxNTUwZWVlNGFmYzBhZjA2NWI3OGNkYTMwMmE5NzY3NGMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTdkMTcwZTE1NTBlZWU0YWZjMGFmMDY1Yjc4Y2RhMzAyYTk3Njc0YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM3YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk3ZDE3MGUxNTUwZWVlNGFmYzBhZjA2NWI3OGNkYTMwMmE5NzY3NGMKQEAgLTAsMCArMSBAQAorW10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOThlMDJlN2ZjOTY0NzllOGQxMGZmMmNjNzYxMGJlNzcyZTJkNmZiYSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85OGUwMmU3ZmM5NjQ3OWU4ZDEwZmYyY2M3NjEwYmU3NzJlMmQ2ZmJhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzBmYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOThlMDJlN2ZjOTY0NzllOGQxMGZmMmNjNzYxMGJlNzcyZTJkNmZiYQpAQCAtMCwwICsxIEBACitbW3siXC81bohbeyshOioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTk2MTU2YjE5MWI2MTllZmY3OWIyZmNiYjc1OTg1MThhMDliMDZiYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85OTYxNTZiMTkxYjYxOWVmZjc5YjJmY2JiNzU5ODUxOGEwOWIwNmJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjU4MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTk2MTU2YjE5MWI2MTllZmY3OWIyZmNiYjc1OTg1MThhMDliMDZiYwpAQCAtMCwwICsxIEBACisyLjE0OTggClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk5NjY3ZmNmYTZkNTgzYTc0MmZiNTQ1MDUyN2ZjODZkZmI3OGViYmYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOTk2NjdmY2ZhNmQ1ODNhNzQyZmI1NDUwNTI3ZmM4NmRmYjc4ZWJiZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFhZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzk5NjY3ZmNmYTZkNTgzYTc0MmZiNTQ1MDUyN2ZjODZkZmI3OGViYmYKQEAgLTAsMCArMSBAQAorW3siiMN7KSE6Kl0pwyE6eyIqvj++Oz9YyrOzJyEhygpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85YjFlYWQyZGJlZWIxYTNlOWE3YmViY2Y2OTY0YzNjZmJjN2U4ODY3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzliMWVhZDJkYmVlYjFhM2U5YTdiZWJjZjY5NjRjM2NmYmM3ZTg4NjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmODk1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85YjFlYWQyZGJlZWIxYTNlOWE3YmViY2Y2OTY0YzNjZmJjN2U4ODY3CkBAIC0wLDAgKzEgQEAKK3QgXCcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWI3NjY5ZTIwMTU3NGJmYjk3OWQ1NjExMDUzOWE5MGRhNWFjYTJjMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85Yjc2NjllMjAxNTc0YmZiOTc5ZDU2MTEwNTM5YTkwZGE1YWNhMmMwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjNkNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWI3NjY5ZTIwMTU3NGJmYjk3OWQ1NjExMDUzOWE5MGRhNWFjYTJjMApAQCAtMCwwICsxIEBACit7IiIhIVwnISEPXCcnJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85YzI0YjQ1NmFmM2NiNTFhMWZmMjc4MGMyZDljYmRkN2Q5M2Y2Yzc2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzljMjRiNDU2YWYzY2I1MWExZmYyNzgwYzJkOWNiZGQ3ZDkzZjZjNzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmMDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85YzI0YjQ1NmFmM2NiNTFhMWZmMjc4MGMyZDljYmRkN2Q5M2Y2Yzc2CkBAIC0wLDAgKzEgQEAKK251/io6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlkMDQ0MWYyM2FlN2Q1YTNhNWIxMTQwNDk3ODY4ZWU2ZWVhYjY1NmIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWQwNDQxZjIzYWU3ZDVhM2E1YjExNDA0OTc4NjhlZTZlZWFiNjU2YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDg2MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlkMDQ0MWYyM2FlN2Q1YTNhNWIxMTQwNDk3ODY4ZWU2ZWVhYjY1NmIKQEAgLTAsMCArMSwyIEBACit7CisiiMMCClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlkODkwYmQzMTM5YThmOWE0NGQ0MzVmZjhlZGZiZWI1YjA3MmRlZDAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWQ4OTBiZDMxMzlhOGY5YTQ0ZDQzNWZmOGVkZmJlYjViMDcyZGVkMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhiZGUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlkODkwYmQzMTM5YThmOWE0NGQ0MzVmZjhlZGZiZWI1YjA3MmRlZDAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzllNmE1NWI2YjQ1NjNlNjUyYTIzYmU5ZDYyM2NhNTA1NWMzNTY5NDAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWU2YTU1YjZiNDU2M2U2NTJhMjNiZTlkNjIzY2E1MDU1YzM1Njk0MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJmMTdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzllNmE1NWI2YjQ1NjNlNjUyYTIzYmU5ZDYyM2NhNTA1NWMzNTY5NDAKQEAgLTAsMCArMSBAQAorMTgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWVjODg0MjBlZjA0MDg2NDJmNjkzMDk5NmUzNWY1YjlmMThlYzg4YyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85ZWM4ODQyMGVmMDQwODY0MmY2OTMwOTk2ZTM1ZjViOWYxOGVjODhjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmVlYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWVjODg0MjBlZjA0MDg2NDJmNjkzMDk5NmUzNWY1YjlmMThlYzg4YwpAQCAtMCwwICsxIEBACisiiMMiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzllZGQwNjdjNTY5MzE1ZDVlOTNiMGQxNGM3ZWFjOWZhNmQ4MWQzY2QgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWVkZDA2N2M1NjkzMTVkNWU5M2IwZDE0YzdlYWM5ZmE2ZDgxZDNjZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQwYTExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzllZGQwNjdjNTY5MzE1ZDVlOTNiMGQxNGM3ZWFjOWZhNmQ4MWQzY2QKQEAgLTAsMCArMSBAQAorWzAuMzYyOSxdOTUgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlmYmRhNGY3MTQwNDNkOTc1Mzg5YjUzNmI0NDk3YzZkNzEzNDUyZTUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvOWZiZGE0ZjcxNDA0M2Q5NzUzODliNTM2YjQ0OTdjNmQ3MTM0NTJlNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDJjYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlmYmRhNGY3MTQwNDNkOTc1Mzg5YjUzNmI0NDk3YzZkNzEzNDUyZTUKQEAgLTAsMCArMSBAQAorWzIuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85ZmM4Y2I4YWIzYjA1ZTMwNmU1ZTgxZDlkOTQ5ZTY5ZjkzMTI0NGVhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzLzlmYzhjYjhhYjNiMDVlMzA2ZTVlODFkOWQ5NDllNjlmOTMxMjQ0ZWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1YjFjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy85ZmM4Y2I4YWIzYjA1ZTMwNmU1ZTgxZDlkOTQ5ZTY5ZjkzMTI0NGVhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMDJiODU3ZjJlZmY3M2U4ZTE4OGYzNTUyOWRkOTFmODE0NGIyM2I5IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EwMmI4NTdmMmVmZjczZThlMTg4ZjM1NTI5ZGQ5MWY4MTQ0YjIzYjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5OTgzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMDJiODU3ZjJlZmY3M2U4ZTE4OGYzNTUyOWRkOTFmODE0NGIyM2I5CkBAIC0wLDAgKzEgQEAKKzI5NQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMDYwZDViZmQxMjM1Y2JiZTRiY2VjZjMzMmZhM2IwM2JjMjI4MmUzIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EwNjBkNWJmZDEyMzVjYmJlNGJjZWNmMzMyZmEzYjAzYmMyMjgyZTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlYjM4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMDYwZDViZmQxMjM1Y2JiZTRiY2VjZjMzMmZhM2IwM2JjMjI4MmUzCkBAIC0wLDAgKzEgQEAKKzgzMjRFNyIhO1wnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EwOTMxZmFlMWQ0M2U3ODg3YzFjYWJkZTgzZmRmYzUyZWFlZWRiYTggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTA5MzFmYWUxZDQzZTc4ODdjMWNhYmRlODNmZGZjNTJlYWVlZGJhOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUwYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EwOTMxZmFlMWQ0M2U3ODg3YzFjYWJkZTgzZmRmYzUyZWFlZWRiYTgKQEAgLTAsMCArMSBAQAorIicsIVx1NjVFODg1MHsyMzEyOyk6iCkhKj8nvsqzsyEhqiHAKToqIeA6OjghOTpcdWRiRDhcdScKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTFhYmU4YTc4NTAzMGQ0NzVhNzM1MDQzOGZkMjNhMDVjMzgyYzExMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMWFiZThhNzg1MDMwZDQ3NWE3MzUwNDM4ZmQyM2EwNWMzODJjMTEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNGU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTFhYmU4YTc4NTAzMGQ0NzVhNzM1MDQzOGZkMjNhMDVjMzgyYzExMApAQCAtMCwwICsxLDIgQEAKK1t7CisiiMMiIDoiiMMheykhOiIsfSKIiMM7IgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMWZiODYyOTNlYWM5NTBjMmI0ZjUxODJkOWU0YjVkOWUwOTgyZWY2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2ExZmI4NjI5M2VhYzk1MGMyYjRmNTE4MmQ5ZTRiNWQ5ZTA5ODJlZjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiMWRkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMWZiODYyOTNlYWM5NTBjMmI0ZjUxODJkOWU0YjVkOWUwOTgyZWY2CkBAIC0wLDAgKzEgQEAKKzFlKzIsWzJ9MYg1e8MiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EyZDRlM2Q2ZjViYTQzYzkxOTlkNWQyMDExNjc4ZjgyY2ZkNTVhZmMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTJkNGUzZDZmNWJhNDNjOTE5OWQ1ZDIwMTE2NzhmODJjZmQ1NWFmYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQyMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EyZDRlM2Q2ZjViYTQzYzkxOTlkNWQyMDExNjc4ZjgyY2ZkNTVhZmMKQEAgLTAsMCArMSBAQAorW3siiFxcdDV7KSE6KgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMzk2NTNjYjNkOTdjNThjNDQwMTMxOTdmNGQ3NTU3NTc3NzAwMTc3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2EzOTY1M2NiM2Q5N2M1OGM0NDAxMzE5N2Y0ZDc1NTc1Nzc3MDAxNzcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NjdjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hMzk2NTNjYjNkOTdjNThjNDQwMTMxOTdmNGQ3NTU3NTc3NzAwMTc3CkBAIC0wLDAgKzEgQEAKK1t0cnVlWygwLjE5MztdNCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTRjNzRhZDU2YWUwZTk0ZTk2MTAxYThmMmNlOWIxZTU4OGRmNWU0NCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hNGM3NGFkNTZhZTBlOTRlOTYxMDFhOGYyY2U5YjFlNTg4ZGY1ZTQ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTkzNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTRjNzRhZDU2YWUwZTk0ZTk2MTAxYThmMmNlOWIxZTU4OGRmNWU0NApAQCAtMCwwICsxIEBACit7XSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTZiMzRiMDZiMDBlOTIyNmYyYmQ5NjE0ODNmOWRhODFkOGRlOTlhOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hNmIzNGIwNmIwMGU5MjI2ZjJiZDk2MTQ4M2Y5ZGE4MWQ4ZGU5OWE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmJlZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTZiMzRiMDZiMDBlOTIyNmYyYmQ5NjE0ODNmOWRhODFkOGRlOTlhOApAQCAtMCwwICsxIEBACit7IipdOsMheym+PyfKs7MgOiEp4CEqOirgOjo6XHVkYkQ4XFwpeyF1wzp7IWAhP2C+viIpKKEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTcyYzNiOWNjNzFlYjdmMGUwZTRkYWJjZDJkY2QyYjk5N2YyMWMwNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hNzJjM2I5Y2M3MWViN2YwZTBlNGRhYmNkMmRjZDJiOTk3ZjIxYzA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjIzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTcyYzNiOWNjNzFlYjdmMGUwZTRkYWJjZDJkY2QyYjk5N2YyMWMwNwpAQCAtMCwwICsxIEBACiswLjkgfUczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E3NDlkMjRiYWM1NWJjMTk0NjVhY2M5MmIxMjI0NGM1NmNhMGYyMGQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTc0OWQyNGJhYzU1YmMxOTQ2NWFjYzkyYjEyMjQ0YzU2Y2EwZjIwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmM2YWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E3NDlkMjRiYWM1NWJjMTk0NjVhY2M5MmIxMjI0NGM1NmNhMGYyMGQKQEAgLTAsMCArMSBAQAorfUczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E3ODAwOWZmOGIzZjRkNzIyZWUwZWI4NDc5NWU4NTdlNzRhNThhZWEgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTc4MDA5ZmY4YjNmNGQ3MjJlZTBlYjg0Nzk1ZTg1N2U3NGE1OGFlYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE3NThlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E3ODAwOWZmOGIzZjRkNzIyZWUwZWI4NDc5NWU4NTdlNzRhNThhZWEKQEAgLTAsMCArMSBAQAorMzgzNjI3OEUzNDQ7MkU7KSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTdhZTRiMTY2Nzc4MDZkNzhkMDAxNmMyNzZiNjcyMmViYThlZWYzYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hN2FlNGIxNjY3NzgwNmQ3OGQwMDE2YzI3NmI2NzIyZWJhOGVlZjNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjkxNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTdhZTRiMTY2Nzc4MDZkNzhkMDAxNmMyNzZiNjcyMmViYThlZWYzYwpAQCAtMCwwICsxIEBACiswLjcyNDc5MC7cMzI5OTYgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hODA2ZjQzZGQ0OGUzNWU3NWMyNzgxNGMxM2EyYTk2YzEyNDQ5YmQxIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E4MDZmNDNkZDQ4ZTM1ZTc1YzI3ODE0YzEzYTJhOTZjMTI0NDliZDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MjVkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hODA2ZjQzZGQ0OGUzNWU3NWMyNzgxNGMxM2EyYTk2YzEyNDQ5YmQxCkBAIC0wLDAgKzEgQEAKK1syLjE0OTEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTkwYTg1ODAxM2Y5MGQyYTk0ZTBkNjJhNzE1NmZmZDY4NDhiZjIzOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hOTBhODU4MDEzZjkwZDJhOTRlMGQ2MmE3MTU2ZmZkNjg0OGJmMjM4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjYzN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTkwYTg1ODAxM2Y5MGQyYTk0ZTBkNjJhNzE1NmZmZDY4NDhiZjIzOApAQCAtMCwwICsxIEBACitbeyKIw1xuNXspIToqXSl7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E5NGJmYmZlMTZkMDI2YjUyZDdmNzNjZjc4ZmRmN2Q2YTZjNWM1OGIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTk0YmZiZmUxNmQwMjZiNTJkN2Y3M2NmNzhmZGY3ZDZhNmM1YzU4YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njc4ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E5NGJmYmZlMTZkMDI2YjUyZDdmNzNjZjc4ZmRmN2Q2YTZjNWM1OGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E5NzE4ZjAyOWQxMWE5MzM1ZWY1OTZjYmQ0Mjc5NGRlNWIwYjE4YjUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYTk3MThmMDI5ZDExYTkzMzVlZjU5NmNiZDQyNzk0ZGU1YjBiMThiNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE5NjliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2E5NzE4ZjAyOWQxMWE5MzM1ZWY1OTZjYmQ0Mjc5NGRlNWIwYjE4YjUKQEAgLTAsMCArMSBAQAorMC45IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hYTZlMDhhNDg4ZDFlZDAwYWE1MWYyMGMyNDc3ZmM4OWU3YjBhODUyIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2FhNmUwOGE0ODhkMWVkMDBhYTUxZjIwYzI0NzdmYzg5ZTdiMGE4NTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NGFjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hYTZlMDhhNDg4ZDFlZDAwYWE1MWYyMGMyNDc3ZmM4OWU3YjBhODUyCkBAIC0wLDAgKzEsMiBAQAorW3sKKyKIwyIgOiKIwyIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWFhMDM4NTEzYzE5MmZlYzUwMWU0ZTczMDIxNTY4NzJjZTJmZGUzNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hYWEwMzg1MTNjMTkyZmVjNTAxZTRlNzMwMjE1Njg3MmNlMmZkZTM3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTljMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWFhMDM4NTEzYzE5MmZlYzUwMWU0ZTczMDIxNTY4NzJjZTJmZGUzNwpAQCAtMCwwICsxLDIgQEAKKy0yOgorcH01ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2FjMjY4NmMwOTVhNWExYzkyYTFkNDIwOWE2YzI4Nzc3ODcyMGM4NmQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWMyNjg2YzA5NWE1YTFjOTJhMWQ0MjA5YTZjMjg3Nzc4NzIwYzg2ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJmMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2FjMjY4NmMwOTVhNWExYzkyYTFkNDIwOWE2YzI4Nzc3ODcyMGM4NmQKQEAgLTAsMCArMSBAQAorWzIuMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hYzM0NzhkNjlhM2M4MWZhNjJlNjBmNWMzNjk2MTY1YTRlNWU2YWM0IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2FjMzQ3OGQ2OWEzYzgxZmE2MmU2MGY1YzM2OTYxNjVhNGU1ZTZhYzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxMzY4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hYzM0NzhkNjlhM2M4MWZhNjJlNjBmNWMzNjk2MTY1YTRlNWU2YWM0CkBAIC0wLDAgKzEgQEAKKzUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWM5MjMxZGE0MDgyNDMwYWZlOGY0ZDQwMTI3ODE0YzYxMzY0OGQ4ZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hYzkyMzFkYTQwODI0MzBhZmU4ZjRkNDAxMjc4MTRjNjEzNjQ4ZDhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWE2YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWM5MjMxZGE0MDgyNDMwYWZlOGY0ZDQwMTI3ODE0YzYxMzY0OGQ4ZQpAQCAtMCwwICsxIEBACisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2FkYzgzYjE5ZTc5MzQ5MWIxYzZlYTBmZDhiNDZjZDlmMzJlNTkyZmMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWRjODNiMTllNzkzNDkxYjFjNmVhMGZkOGI0NmNkOWYzMmU1OTJmYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2FkYzgzYjE5ZTc5MzQ5MWIxYzZlYTBmZDhiNDZjZDlmMzJlNTkyZmMKQEAgLTAsMCArMSBAQAorCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWZmMjVlNTY5YmQ4YzkzMTU3ZTA4Y2QxOGViY2Q4OTY0MzhlMzRjOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hZmYyNWU1NjliZDhjOTMxNTdlMDhjZDE4ZWJjZDg5NjQzOGUzNGM5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDI0MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWZmMjVlNTY5YmQ4YzkzMTU3ZTA4Y2QxOGViY2Q4OTY0MzhlMzRjOQpAQCAtMCwwICsxIEBACit7IiggXCEnKFwnIQ8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWZmY2VkODE2OGVjODAxZGU4OWRlYWM2NjNmNzA4ZjBjOTZjZjFhNCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9hZmZjZWQ4MTY4ZWM4MDFkZTg5ZGVhYzY2M2Y3MDhmMGM5NmNmMWE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzlmYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYWZmY2VkODE2OGVjODAxZGU4OWRlYWM2NjNmNzA4ZjBjOTZjZjFhNApAQCAtMCwwICsxIEBACit0OTIgXCc4NjJFNTE3OykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjAxNWRmYzJmNjJiNjQwZDdjMjVhZGFiN2IzOGM1ZmNiNWNiNjRjOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iMDE1ZGZjMmY2MmI2NDBkN2MyNWFkYWI3YjM4YzVmY2I1Y2I2NGM4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmZlZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjAxNWRmYzJmNjJiNjQwZDdjMjVhZGFiN2IzOGM1ZmNiNWNiNjRjOApAQCAtMCwwICsxIEBACis1OEUrszR5OzApiAkpIcMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjAyMWRkN2NkOThiNjMwOTI2ODVlYTA5MmRmMGRjMDFjOGY2MzMzNCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iMDIxZGQ3Y2Q5OGI2MzA5MjY4NWVhMDkyZGYwZGMwMWM4ZjYzMzM0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzg5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjAyMWRkN2NkOThiNjMwOTI2ODVlYTA5MmRmMGRjMDFjOGY2MzMzNApAQCAtMCwwICsxIEBACit7IipdOsMheym+PyfKs7MgOioh4Ck6ISrgOjo6XHVkYkQ4XHU4MTNlMTIpIXvDOnshYCE/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2IxNzQ4NWI4YmRlYzg4MDliMzgxOWE4Mzc1M2NhODkzODcxZGY0MDMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjE3NDg1YjhiZGVjODgwOWIzODE5YTgzNzUzY2E4OTM4NzFkZjQwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzVhZDUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2IxNzQ4NWI4YmRlYzg4MDliMzgxOWE4Mzc1M2NhODkzODcxZGY0MDMKQEAgLTAsMCArMSBAQAorMCzTKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iMzJlZjUxZWNhOWM2YzY1OGU2ZmI3NWZkZjk2YmJiYTA2NjQwNGU3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2IzMmVmNTFlY2E5YzZjNjU4ZTZmYjc1ZmRmOTZiYmJhMDY2NDA0ZTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4Mzc2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iMzJlZjUxZWNhOWM2YzY1OGU2ZmI3NWZkZjk2YmJiYTA2NjQwNGU3CkBAIC0wLDAgKzEgQEAKK2ZhbHMlKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iM2YwYzdmNmJiNzYzYWYxYmU5MWQ5ZTc0ZWFiZmViMTk5ZGMxZjFmIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2IzZjBjN2Y2YmI3NjNhZjFiZTkxZDllNzRlYWJmZWIxOTlkYzFmMWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjMmJmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iM2YwYzdmNmJiNzYzYWYxYmU5MWQ5ZTc0ZWFiZmViMTk5ZGMxZjFmCkBAIC0wLDAgKzEgQEAKKzE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I0NWExNjM1ZWM1MjZiY2M4OTBmOWQ3MzU5NzY3MDRlNTE2YzVmMTkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjQ1YTE2MzVlYzUyNmJjYzg5MGY5ZDczNTk3NjcwNGU1MTZjNWYxOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYzOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I0NWExNjM1ZWM1MjZiY2M4OTBmOWQ3MzU5NzY3MDRlNTE2YzVmMTkKQEAgLTAsMCArMSBAQAoreyIiOighJyhcJyEPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I1MGNlNTFhN2JhYTI4Y2QyOThlYmQwNWI0YTNiOWI3MGY5ZDQzNzAgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjUwY2U1MWE3YmFhMjhjZDI5OGViZDA1YjRhM2I5YjcwZjlkNDM3MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjlhMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I1MGNlNTFhN2JhYTI4Y2QyOThlYmQwNWI0YTNiOWI3MGY5ZDQzNzAKQEAgLTAsMCArMSBAQAorODMyODM0RTRFOzY7KSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjUxMjY3MjE4MTJiOTI1NDI2YjMwZDI4M2QyYmI4YjY5NjlmMjMwYSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iNTEyNjcyMTgxMmI5MjU0MjZiMzBkMjgzZDJiYjhiNjk2OWYyMzBhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDc3MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjUxMjY3MjE4MTJiOTI1NDI2YjMwZDI4M2QyYmI4YjY5NjlmMjMwYQpAQCAtMCwwICsxIEBACis1RTkJMyfBOCkyMzI7KTYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjU3YWY5NDNhM2VlNDExYmZmZWFhMzg3MmVlYzljNmZiMDE1NjlhNCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iNTdhZjk0M2EzZWU0MTFiZmZlYWEzODcyZWVjOWM2ZmIwMTU2OWE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTcwZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjU3YWY5NDNhM2VlNDExYmZmZWFhMzg3MmVlYzljNmZiMDE1NjlhNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjVhYmY2ZmQyMmVkMGY4NTI3ODFkZTM1ZDA0MzA1OWQwZjg2ZjNjZCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iNWFiZjZmZDIyZWQwZjg1Mjc4MWRlMzVkMDQzMDU5ZDBmODZmM2NkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjQxNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjVhYmY2ZmQyMmVkMGY4NTI3ODFkZTM1ZDA0MzA1OWQwZjg2ZjNjZApAQCAtMCwwICsxIEBACiswLGYnKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iNjU4OWZjNmFiMGRjODJjZjEyMDk5ZDFjMmQ0MGFiOTk0ZTg0MTBjIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I2NTg5ZmM2YWIwZGM4MmNmMTIwOTlkMWMyZDQwYWI5OTRlODQxMGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyNzA4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iNjU4OWZjNmFiMGRjODJjZjEyMDk5ZDFjMmQ0MGFiOTk0ZTg0MTBjCkBAIC0wLDAgKzEgQEAKKzAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjZmMTkyMzhkMmIwNGM1Yjg2YTE3MzY5MDkzZGFmZGEzNGYzMzJlNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iNmYxOTIzOGQyYjA0YzViODZhMTczNjkwOTNkYWZkYTM0ZjMzMmU3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWVkYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjZmMTkyMzhkMmIwNGM1Yjg2YTE3MzY5MDkzZGFmZGEzNGYzMzJlNwpAQCAtMCwwICsxLDIgQEAKKyIpCivoIojDeykhOiq+OyEnyrOzISEqIeApOiEqIojDeykhOipdKeAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjg1OGNiMjgyNjE3ZmIwOTU2ZDk2MDIxNWM4ZTg0ZDFjY2Y5MDljNiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iODU4Y2IyODI2MTdmYjA5NTZkOTYwMjE1YzhlODRkMWNjZjkwOWM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTllY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjg1OGNiMjgyNjE3ZmIwOTU2ZDk2MDIxNWM4ZTg0ZDFjY2Y5MDljNgpAQCAtMCwwICsxIEBACisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I5YzM4ZmFkMDljODBkYjc3ODFmZWZiZTUxMDM5NzUyZGU1NzVlY2MgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYjljMzhmYWQwOWM4MGRiNzc4MWZlZmJlNTEwMzk3NTJkZTU3NWVjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZkM2JjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2I5YzM4ZmFkMDljODBkYjc3ODFmZWZiZTUxMDM5NzUyZGU1NzVlY2MKQEAgLTAsMCArMSBAQAorM2U0NSEwMTiBNjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmI0MDdjODk5MjgwMDQ0NDIwMWRjY2ZlNzQ0ZGFjNDljMDI5NWZkZSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iYjQwN2M4OTkyODAwNDQ0MjAxZGNjZmU3NDRkYWM0OWMwMjk1ZmRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODRhNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmI0MDdjODk5MjgwMDQ0NDIwMWRjY2ZlNzQ0ZGFjNDljMDI5NWZkZQpAQCAtMCwwICsxIEBACit7IiEoIVx0JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iYzMzNTczNGY3MzUwMmI5MmQyYmQzNTg3MjU5Y2U5MTU5ODVmMGVlIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2JjMzM1NzM0ZjczNTAyYjkyZDJiZDM1ODcyNTljZTkxNTk4NWYwZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjZTZjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iYzMzNTczNGY3MzUwMmI5MmQyYmQzNTg3MjU5Y2U5MTU5ODVmMGVlCkBAIC0wLDAgKzEgQEAKKzAuNjk5NSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmQxMTNjMmM4YTIzMjhlMzY3NGM2ODBjN2NmZjgyOWE2YzhhYjkyNCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iZDExM2MyYzhhMjMyOGUzNjc0YzY4MGM3Y2ZmODI5YTZjOGFiOTI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODk0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmQxMTNjMmM4YTIzMjhlMzY3NGM2ODBjN2NmZjgyOWE2YzhhYjkyNApAQCAtMCwwICsxIEBACitbMi4xMDsyO64KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmUwNTFkNTgwMTVkNGFmMTk3N2E1ZGZkMTRlZjNmZDA3MGVjYzlkMiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iZTA1MWQ1ODAxNWQ0YWYxOTc3YTVkZmQxNGVmM2ZkMDcwZWNjOWQyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmFlMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmUwNTFkNTgwMTVkNGFmMTk3N2E1ZGZkMTRlZjNmZDA3MGVjYzlkMgpAQCAtMCwwICsxIEBACis5IQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iZTQ2MWEwY2QxZmRhMDUyYTY5YzNmZDk0ZjhjZjVmNmY4NmFmYTM0IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2JlNDYxYTBjZDFmZGEwNTJhNjljM2ZkOTRmOGNmNWY2Zjg2YWZhMzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhOTA2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iZTQ2MWEwY2QxZmRhMDUyYTY5YzNmZDk0ZjhjZjVmNmY4NmFmYTM0CkBAIC0wLDAgKzEgQEAKKzg0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2JlZjUyNDUwMmY4ZGJiYzQ1YWY3MTdlY2UwMWVjODhlZGQ3ZjkwM2IgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYmVmNTI0NTAyZjhkYmJjNDVhZjcxN2VjZTAxZWM4OGVkZDdmOTAzYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQyYjEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2JlZjUyNDUwMmY4ZGJiYzQ1YWY3MTdlY2UwMWVjODhlZGQ3ZjkwM2IKQEAgLTAsMCArMSBAQAorMTNlMTA4gTU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iZjIxYTllOGZiYzVhMzg0NmZiMDViNGZhMDg1OWUwOTE3YjIyMDJmIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2JmMjFhOWU4ZmJjNWEzODQ2ZmIwNWI0ZmEwODU5ZTA5MTdiMjIwMmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9iZjIxYTllOGZiYzVhMzg0NmZiMDViNGZhMDg1OWUwOTE3YjIyMDJmCkBAIC0wLDAgKzEgQEAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MwYjZhOTA4MzJiNzhlZDVmNmQxMjlkMzY0MGM2MTI1NDA1MjdjODUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzBiNmE5MDgzMmI3OGVkNWY2ZDEyOWQzNjQwYzYxMjU0MDUyN2M4NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNjZmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MwYjZhOTA4MzJiNzhlZDVmNmQxMjlkMzY0MGM2MTI1NDA1MjdjODUKQEAgLTAsMCArMSBAQAoreyInIVx1M8I6igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jMThkMzE1ZjBkMzU4NDliMmFhZTRhNDdjYWI0NjA4MjA0Yjg1ZDc2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MxOGQzMTVmMGQzNTg0OWIyYWFlNGE0N2NhYjQ2MDgyMDRiODVkNzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4MmM1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jMThkMzE1ZjBkMzU4NDliMmFhZTRhNDdjYWI0NjA4MjA0Yjg1ZDc2CkBAIC0wLDAgKzEsMiBAQAorW3siKQor6CKIw3spIToqvjshJ8qzsyEhKiHgKTohKiKIw3spIToqXSngClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MyNTdmZDZiYzllNTI1NGE3MzMzNzhhYjRkZGQzOTYyOWM0YTMwNjkgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzI1N2ZkNmJjOWU1MjU0YTczMzM3OGFiNGRkZDM5NjI5YzRhMzA2OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQwYTVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MyNTdmZDZiYzllNTI1NGE3MzMzNzhhYjRkZGQzOTYyOWM0YTMwNjkKQEAgLTAsMCArMSBAQAorMTNlMTI4gTU2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jMmJmN2Y0OWQ4ZjJlMTNhNjBhZjQ0NzNiM2IzNDUxYjY1YjNhYTlhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MyYmY3ZjQ5ZDhmMmUxM2E2MGFmNDQ3M2IzYjM0NTFiNjViM2FhOWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5ZTRhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jMmJmN2Y0OWQ4ZjJlMTNhNjBhZjQ0NzNiM2IzNDUxYjY1YjNhYTlhCkBAIC0wLDAgKzEgQEAKKzFlKzIxODiBNTYwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MzMDg1MTdhY2Y2ZjcwODg2MzRkNDkxYTE2MDgyNDBmODNhM2FjOTUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzMwODUxN2FjZjZmNzA4ODYzNGQ0OTFhMTYwODI0MGY4M2EzYWM5NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU2NDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2MzMDg1MTdhY2Y2ZjcwODg2MzRkNDkxYTE2MDgyNDBmODNhM2FjOTUKQEAgLTAsMCArMSBAQAorMC40Mhk33CQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzNiYWRkNzFlZjhhNTFiOTdjZTkzY2JmZTk5ZjY3NzgwNDhmMjEyOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jM2JhZGQ3MWVmOGE1MWI5N2NlOTNjYmZlOTlmNjc3ODA0OGYyMTI4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTBlMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzNiYWRkNzFlZjhhNTFiOTdjZTkzY2JmZTk5ZjY3NzgwNDhmMjEyOApAQCAtMCwwICsxIEBACiszKApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jNDgyYTYzMjcwMmFlN2Y1MzJkMTI2ZTcwMTQ5ZGRhNGZhZGMzY2Q3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M0ODJhNjMyNzAyYWU3ZjUzMmQxMjZlNzAxNDlkZGE0ZmFkYzNjZDcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0MTM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jNDgyYTYzMjcwMmFlN2Y1MzJkMTI2ZTcwMTQ5ZGRhNGZhZGMzY2Q3CkBAIC0wLDAgKzEgQEAKKzAuMjk5NiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzU0MWJiODZlNTViOThlMDgzYjE0MTExNDA2NmY5YzE3ZDg1MzM3NCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jNTQxYmI4NmU1NWI5OGUwODNiMTQxMTE0MDY2ZjljMTdkODUzMzc0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjI5ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzU0MWJiODZlNTViOThlMDgzYjE0MTExNDA2NmY5YzE3ZDg1MzM3NApAQCAtMCwwICsxIEBACitbW1siiMN7KSE6Kr47PyfKs7MhISoh4Ck6ISrgOjo6XHUwNjA5OS55MmRiKTiIwyEzOyGHOnshYCEuNzs/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M1YjUwYjkwMTViNmFhZWRkN2ViMTA3N2IxMjA0ODU4ZjgzN2I1M2MgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzViNTBiOTAxNWI2YWFlZGQ3ZWIxMDc3YjEyMDQ4NThmODM3YjUzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIyNmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M1YjUwYjkwMTViNmFhZWRkN2ViMTA3N2IxMjA0ODU4ZjgzN2I1M2MKQEAgLTAsMCArMSBAQAorIicsIVx1NjVFODg1MHsyMzEyOyk6iCkhKj8nvsqzMC6zISGqIcApOioh4Do6OCE5Olx1ZGJEOFx1ODI1MTAnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M2MmVmMGRiZDEzNTBkYTllYTVhMzJlNTY2NzJkMzg1ODM3NjQzZTcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzYyZWYwZGJkMTM1MGRhOWVhNWEzMmU1NjY3MmQzODU4Mzc2NDNlNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FjNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M2MmVmMGRiZDEzNTBkYTllYTVhMzJlNTY2NzJkMzg1ODM3NjQzZTcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M3YTM0ZDZkNDllMWRhMWNjZDQ5MDM1MGMyZGYzYTE2OGVkMDlhZTggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzdhMzRkNmQ0OWUxZGExY2NkNDkwMzUwYzJkZjNhMTY4ZWQwOWFlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDA2ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M3YTM0ZDZkNDllMWRhMWNjZDQ5MDM1MGMyZGYzYTE2OGVkMDlhZTgKQEAgLTAsMCArMSwzIEBACit7CisiiFsyIjp7fQorNYnDWyIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzg4YzRiZWM4ZDQ0MGM1NmQzZWE3YWJjZTM5Mjc2ZjA5MjdkYmUwYSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jODhjNGJlYzhkNDQwYzU2ZDNlYTdhYmNlMzkyNzZmMDkyN2RiZTBhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDIxMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzg4YzRiZWM4ZDQ0MGM1NmQzZWE3YWJjZTM5Mjc2ZjA5MjdkYmUwYQpAQCAtMCwwICsxIEBACiszMygKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzkyZjE0N2JmYzAzNDAwM2FjNDJlZDllNjJhMTZjODQxMDJhYjQxNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jOTJmMTQ3YmZjMDM0MDAzYWM0MmVkOWU2MmExNmM4NDEwMmFiNDE3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWU0YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzkyZjE0N2JmYzAzNDAwM2FjNDJlZDllNjJhMTZjODQxMDJhYjQxNwpAQCAtMCwwICsxIEBACitbWzIuMTkzLF00iMMiKigiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M5NmIwZmU2MDM0NjY4ZWRmMzdlZjBmNWYzOTFkNTEwNzk1M2RjMDYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvYzk2YjBmZTYwMzQ2NjhlZGYzN2VmMGY1ZjM5MWQ1MTA3OTUzZGMwNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzViYzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2M5NmIwZmU2MDM0NjY4ZWRmMzdlZjBmNWYzOTFkNTEwNzk1M2RjMDYKQEAgLTAsMCArMSBAQAorODE2MkU1MTc7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jYWM3NGFhNWQ3YWFiN2ZjZTAyNTNmMDBjMWEwMjU5ODBjMWY5YjdhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NhYzc0YWE1ZDdhYWI3ZmNlMDI1M2YwMGMxYTAyNTk4MGMxZjliN2EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjOGIyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jYWM3NGFhNWQ3YWFiN2ZjZTAyNTNmMDBjMWEwMjU5ODBjMWY5YjdhCkBAIC0wLDAgKzEgQEAKKyBcJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jYWVhMGEwZTZkODcwOGNmNjgyZWFhNDQ2YzM0NGRhNTZhN2Q1NTE1IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NhZWEwYTBlNmQ4NzA4Y2Y2ODJlYWE0NDZjMzQ0ZGE1NmE3ZDU1MTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3ZDg1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jYWVhMGEwZTZkODcwOGNmNjgyZWFhNDQ2YzM0NGRhNTZhN2Q1NTE1CkBAIC0wLDAgKzEgQEAKKyIhMn1HIVwEJycpeTMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2M4YTNkZDI2NzhkNGI0MDBhZDYzMGY0MDIwMTJiODk0ZTg0MWIwNSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jYzhhM2RkMjY3OGQ0YjQwMGFkNjMwZjQwMjAxMmI4OTRlODQxYjA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTVmODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2M4YTNkZDI2NzhkNGI0MDBhZDYzMGY0MDIwMTJiODk0ZTg0MWIwNQpAQCAtMCwwICsxIEBACisiOSFbXGYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2Q4NTFiZWM3YWRhZDUyZjc5Nzc3ZmI5MzQ3ZDVmZDJmOTQ4NmFhNyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZDg1MWJlYzdhZGFkNTJmNzk3NzdmYjkzNDdkNWZkMmY5NDg2YWE3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGIxZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2Q4NTFiZWM3YWRhZDUyZjc5Nzc3ZmI5MzQ3ZDVmZDJmOTQ4NmFhNwpAQCAtMCwwICsxIEBACit7IicsIQFcdUAnOooKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2UzODk5YjYyYmEzZWZlMDBlYjMxZGRhZDI4NjFmZmUxNmEzMGQwNiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZTM4OTliNjJiYTNlZmUwMGViMzFkZGFkMjg2MWZmZTE2YTMwZDA2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmQ4MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2UzODk5YjYyYmEzZWZlMDBlYjMxZGRhZDI4NjFmZmUxNmEzMGQwNgpAQCAtMCwwICsxIEBACitbW1siiMN7KSE6Kr47PyfKs7MhISoh4Ck6ISrgOjo6XFwwNjA5OS55MmRiKTiIwyEzOyGHOnshYCEuNzs/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NlOGI3NmZkY2RiZjFjOTUxYWZjMmIxMTViZTlhY2M4YTYzNThiMzIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2U4Yjc2ZmRjZGJmMWM5NTFhZmMyYjExNWJlOWFjYzhhNjM1OGIzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNkMDdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NlOGI3NmZkY2RiZjFjOTUxYWZjMmIxMTViZTlhY2M4YTYzNThiMzIKQEAgLTAsMCArMSBAQAorODMyNEU1MTI7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZWM4N2I2Nzg3MWZjN2E1OTY1MmJjMzU0NmZiYmI2OGU0ZDMxZTI4IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NlYzg3YjY3ODcxZmM3YTU5NjUyYmMzNTQ2ZmJiYjY4ZTRkMzFlMjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMWNmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZWM4N2I2Nzg3MWZjN2E1OTY1MmJjMzU0NmZiYmI2OGU0ZDMxZTI4CkBAIC0wLDAgKzEsMiBAQAorW3sKKyKIwyIgOiKIwyF7KSE6IiwiiIjDwyIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2YzMjQwNjExMTkwODU0NGU1MDRjODQ3MzExNDdmMDcyY2RmMmZiZCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZjMyNDA2MTExOTA4NTQ0ZTUwNGM4NDczMTE0N2YwNzJjZGYyZmJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDFlZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2YzMjQwNjExMTkwODU0NGU1MDRjODQ3MzExNDdmMDcyY2RmMmZiZApAQCAtMCwwICsxIEBACis2MjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2YzNWRjNzZiZjlhMjA1MjYzNmMxZWNjOTI5NDIxNjE4MzBkY2RjMyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZjM1ZGM3NmJmOWEyMDUyNjM2YzFlY2M5Mjk0MjE2MTgzMGRjZGMzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDE0MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2YzNWRjNzZiZjlhMjA1MjYzNmMxZWNjOTI5NDIxNjE4MzBkY2RjMwpAQCAtMCwwICsxIEBACisJM8E2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NmNmE1ZTZiZmU0ZjE1YjQzZTQxMWRkMjc4MmUxMGYxNjcwYzk3NjcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2Y2YTVlNmJmZTRmMTViNDNlNDExZGQyNzgyZTEwZjE2NzBjOTc2NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGMwZDEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NmNmE1ZTZiZmU0ZjE1YjQzZTQxMWRkMjc4MmUxMGYxNjcwYzk3NjcKQEAgLTAsMCArMSBAQAorMzAuNUU4OyE0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZmM0NTYxNmY1ZjBlN2MyNWRmOTFmNjk4NGZmNWY2ZjE2NDhiZWFiIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NmYzQ1NjE2ZjVmMGU3YzI1ZGY5MWY2OTg0ZmY1ZjZmMTY0OGJlYWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjlhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZmM0NTYxNmY1ZjBlN2MyNWRmOTFmNjk4NGZmNWY2ZjE2NDhiZWFiCkBAIC0wLDAgKzEgQEAKK3siJywhXHU2NUU4ODUwezIzMTI7KTqIKSEqPye+yrOzISGqIcApOioh4Do6OCE5Olx1ZGJEOFw2JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZmY4OTFlNTg1OGFlNjhkMDhlY2M4NDcwY2E2YTY4Yzk0MzhiZmEzIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NmZjg5MWU1ODU4YWU2OGQwOGVjYzg0NzBjYTZhNjhjOTQzOGJmYTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmMzllYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZmY4OTFlNTg1OGFlNjhkMDhlY2M4NDcwY2E2YTY4Yzk0MzhiZmEzCkBAIC0wLDAgKzEgQEAKK3siKl06yyF7Kb4/J8qzsyAhKiHgKTohKuA6OjpcdWRiRDggISkhe8M6eyFgIT9gvr4iKKEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2ZmZjRlOWQwOGNiYTgxYjY2M2RkMTk5OTcxMDAwODM0Mjg1MWUxOSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jZmZmNGU5ZDA4Y2JhODFiNjYzZGQxOTk5NzEwMDA4MzQyODUxZTE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGQ1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvY2ZmZjRlOWQwOGNiYTgxYjY2M2RkMTk5OTcxMDAwODM0Mjg1MWUxOQpAQCAtMCwwICsxIEBACitudWwqOgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jcmFzaC1mMjE4NjdmZThiNmRmMGI1NGMxM2UyZTZlNjEzZGNlODcxZWNmMGYwIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2NyYXNoLWYyMTg2N2ZlOGI2ZGYwYjU0YzEzZTJlNmU2MTNkY2U4NzFlY2YwZjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzYmNmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9jcmFzaC1mMjE4NjdmZThiNmRmMGI1NGMxM2UyZTZlNjEzZGNlODcxZWNmMGYwCkBAIC0wLDAgKzEgQEAKK4gpwyE6eyIqvj8nyrOzISEqIeApOiEq4Do6Olx1ZGJEOIgpwyE6eyFgIT9gvr4hPychKm0sJyk7hSdgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2QxZGIwM2M2MjZmYjE2YzNiOWNkNDRjYzM4Y2Y0MGViZDM1NWExOTQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZDFkYjAzYzYyNmZiMTZjM2I5Y2Q0NGNjMzhjZjQwZWJkMzU1YTE5NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjkyYjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2QxZGIwM2M2MjZmYjE2YzNiOWNkNDRjYzM4Y2Y0MGViZDM1NWExOTQKQEAgLTAsMCArMSBAQAorODMyNEU2ODQ7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kODVjYTA1MWRhNzg0YzA0NDE4OThjNWFmZmJmMTFhMmFlOGY1NmJjIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Q4NWNhMDUxZGE3ODRjMDQ0MTg5OGM1YWZmYmYxMWEyYWU4ZjU2YmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxZjI1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kODVjYTA1MWRhNzg0YzA0NDE4OThjNWFmZmJmMTFhMmFlOGY1NmJjCkBAIC0wLDAgKzEgQEAKK1tbWyKIw3spIToqvjs/J8qzsyEhKiHgKTohKuA6OjpcdTAwNDkueTJkYik4iMMhMzshhzdgIXs6IS47PwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kYTAzZjUzNmNlYWY2MDk5NzJhYTJhNjk5Njg3Y2M2ZjczYWMwZGNkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RhMDNmNTM2Y2VhZjYwOTk3MmFhMmE2OTk2ODdjYzZmNzNhYzBkY2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlZmE3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kYTAzZjUzNmNlYWY2MDk5NzJhYTJhNjk5Njg3Y2M2ZjczYWMwZGNkCkBAIC0wLDAgKzEgQEAKKyI3IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kYTRiOTIzN2JhY2NjZGYxOWMwNzYwY2FiN2FlYzRhODM1OTAxMGIwIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RhNGI5MjM3YmFjY2NkZjE5YzA3NjBjYWI3YWVjNGE4MzU5MDEwYjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyNjNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kYTRiOTIzN2JhY2NjZGYxOWMwNzYwY2FiN2FlYzRhODM1OTAxMGIwCkBAIC0wLDAgKzEgQEAKKzIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZGNjNDVlNDA1MjA4ZDdhMmRiMzNkMGI1YjlkYTJhMmYxYjAzNDk1NyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kY2M0NWU0MDUyMDhkN2EyZGIzM2QwYjViOWRhMmEyZjFiMDM0OTU3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNThjMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZGNjNDVlNDA1MjA4ZDdhMmRiMzNkMGI1YjlkYTJhMmYxYjAzNDk1NwpAQCAtMCwwICsxIEBACiswLjUhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RjYzYwZDNhYWExZmM0ZDAwMjAxYTM1MTIyODRmY2I3OWI1YjY4ZWYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZGNjNjBkM2FhYTFmYzRkMDAyMDFhMzUxMjI4NGZjYjc5YjViNjhlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTE1YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RjYzYwZDNhYWExZmM0ZDAwMjAxYTM1MTIyODRmY2I3OWI1YjY4ZWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RkMDU2N2FlNTdiZjNjYzg1ODkxYTFjYTk4OGMyOTQ1ZDkxODY2NzggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZGQwNTY3YWU1N2JmM2NjODU4OTFhMWNhOTg4YzI5NDVkOTE4NjY3OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA1ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RkMDU2N2FlNTdiZjNjYzg1ODkxYTFjYTk4OGMyOTQ1ZDkxODY2NzgKQEAgLTAsMCArMSBAQAorIicsIVx1NjVFODg1MHsyMzEyOyk6iCkhKj8nvsqzMC6zISGqIcApOioh4Do6OCE5Olx1ZGJEOFx1RDgyNX8wJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kZDg5MGE1YTMyZTlmMDQ4OWM2Yzc3Njk1ZjIxNTUwNDFmMDBmYzlhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2RkODkwYTVhMzJlOWYwNDg5YzZjNzc2OTVmMjE1NTA0MWYwMGZjOWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkNzA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kZDg5MGE1YTMyZTlmMDQ4OWM2Yzc3Njk1ZjIxNTUwNDFmMDBmYzlhCkBAIC0wLDAgKzEgQEAKK3siISFcJycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZGY4OGUyYmFmN2I3NmZmYjJlOTRiOWRhNTdmZDhkMTM3ZjQ0YjFlZiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9kZjg4ZTJiYWY3Yjc2ZmZiMmU5NGI5ZGE1N2ZkOGQxMzdmNDRiMWVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjFlZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZGY4OGUyYmFmN2I3NmZmYjJlOTRiOWRhNTdmZDhkMTM3ZjQ0YjFlZgpAQCAtMCwwICsxIEBACisiiMN7KSE6Kr47PyfKs7MhISoh4Ck6ISrgOjo6XClkYik4iMMhhzp7IWAhP2C+viEnPychKm0sJyk7hSdgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UwMGVlMzc4YzNmNmUwYjNjZDg5YmQ2ZTc1MTc0NzhkMDkzZjczZGQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTAwZWUzNzhjM2Y2ZTBiM2NkODliZDZlNzUxNzQ3OGQwOTNmNzNkZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjljNmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UwMGVlMzc4YzNmNmUwYjNjZDg5YmQ2ZTc1MTc0NzhkMDkzZjczZGQKQEAgLTAsMCArMSBAQAorODM0ZTspClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UwYzEyNGU5MGQwNjhlMmE3MGEzZTE0ODA1Mjg2OTAzMzQ1M2VjNTggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTBjMTI0ZTkwZDA2OGUyYTcwYTNlMTQ4MDUyODY5MDMzNDUzZWM1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDUzNDNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UwYzEyNGU5MGQwNjhlMmE3MGEzZTE0ODA1Mjg2OTAzMzQ1M2VjNTgKQEAgLTAsMCArMSBAQAorMjdlN6QyOjYwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UwZDg3YjFmM2U1NGU1YWRjNWMyMjA1ZjllMTQ3NzI4MjJhMjU3NjYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTBkODdiMWYzZTU0ZTVhZGM1YzIyMDVmOWUxNDc3MjgyMmEyNTc2NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M2YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UwZDg3YjFmM2U1NGU1YWRjNWMyMjA1ZjllMTQ3NzI4MjJhMjU3NjYKQEAgLTAsMCArMSBAQAorW3siiMNcNXspIToqXSl7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UxMTk5ZGY2NDk2OTdjNTcwZGI1ZDZiMmVhMDlkNzU1ZWRkZDMyYjcgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTExOTlkZjY0OTY5N2M1NzBkYjVkNmIyZWEwOWQ3NTVlZGRkMzJiNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGFjNTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UxMTk5ZGY2NDk2OTdjNTcwZGI1ZDZiMmVhMDlkNzU1ZWRkZDMyYjcKQEAgLTAsMCArMSBAQAorW1swLjE5MztdNCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTIzNWY2ZjJhOGI2YTIyMTE3ZjFiYWE5MzJmYjZjNjk3OTllMTEzNiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lMjM1ZjZmMmE4YjZhMjIxMTdmMWJhYTkzMmZiNmM2OTc5OWUxMTM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjJkOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTIzNWY2ZjJhOGI2YTIyMTE3ZjFiYWE5MzJmYjZjNjk3OTllMTEzNgpAQCAtMCwwICsxIEBACitbMS4xOTc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UzYTY1NDA1NWE4NjdhZTYyZDhlNjhmYTJjNDEwMjI4YWM1NWNiNmQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTNhNjU0MDU1YTg2N2FlNjJkOGU2OGZhMmM0MTAyMjhhYzU1Y2I2ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhmZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UzYTY1NDA1NWE4NjdhZTYyZDhlNjhmYTJjNDEwMjI4YWM1NWNiNmQKQEAgLTAsMCArMSBAQAorIiEhD1wnJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lM2M2ODBhYWM0NmI5YzQ2MzkyZTNiMmM0M2VjZGNjMTU0N2YyMDIzIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UzYzY4MGFhYzQ2YjljNDYzOTJlM2IyYzQzZWNkY2MxNTQ3ZjIwMjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lM2M2ODBhYWM0NmI5YzQ2MzkyZTNiMmM0M2VjZGNjMTU0N2YyMDIzCkBAIC0wLDAgKzEgQEAKK1t9RzMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTNkMTM0YjM1Y2MyNWE0ODYxZDkwMDIzYzk1OTg4ZWM2MTAzZGRkNSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lM2QxMzRiMzVjYzI1YTQ4NjFkOTAwMjNjOTU5ODhlYzYxMDNkZGQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjI4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTNkMTM0YjM1Y2MyNWE0ODYxZDkwMDIzYzk1OTg4ZWM2MTAzZGRkNQpAQCAtMCwwICsxIEBACisiiMN7KSE6Kr47ISfKs7MhISoh4Ck6ISrgOho6XHVkYik4iMMhhzp7YCE/YL6+IT8nISptLCcpO4UnYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lM2ZmNjVkZTRiMTYyMjMxNWMzYjM0YjdhNWUzOWJmZmIyNzU0ODlkIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2UzZmY2NWRlNGIxNjIyMzE1YzNiMzRiN2E1ZTM5YmZmYjI3NTQ4OWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4OGRiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lM2ZmNjVkZTRiMTYyMjMxNWMzYjM0YjdhNWUzOWJmZmIyNzU0ODlkCkBAIC0wLDAgKzEgQEAKK1syLjE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U0YTQwODVjYzMxNDc2ZjVkZTkwNDc0MjI4NTFkOGNjZjg2MzM5ZGYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTRhNDA4NWNjMzE0NzZmNWRlOTA0NzQyMjg1MWQ4Y2NmODYzMzlkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjczYjZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U0YTQwODVjYzMxNDc2ZjVkZTkwNDc0MjI4NTFkOGNjZjg2MzM5ZGYKQEAgLTAsMCArMSBAQAoreyInLCFcdUAnOooKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTRlM2M2OWRhMjAwYWY5MzJjOGE3OWZhMDU1ZDdhZWVhMjhlYjFkMSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lNGUzYzY5ZGEyMDBhZjkzMmM4YTc5ZmEwNTVkN2FlZWEyOGViMWQxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzFkYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTRlM2M2OWRhMjAwYWY5MzJjOGE3OWZhMDU1ZDdhZWVhMjhlYjFkMQpAQCAtMCwwICsxIEBACitbMi4iiMMheykhOiIsiMMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTZjM2RkNjMwNDI4ZmQ1NDgzNDE3MmI4ZmQyNzM1ZmVkOTQxNmRhNCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lNmMzZGQ2MzA0MjhmZDU0ODM0MTcyYjhmZDI3MzVmZWQ5NDE2ZGE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODJkZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTZjM2RkNjMwNDI4ZmQ1NDgzNDE3MmI4ZmQyNzM1ZmVkOTQxNmRhNApAQCAtMCwwICsxIEBACis2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lNzFlYjM3ZmNhMjA3MDUyMWUxZTA3YzUwM2MyYmNkNjQ0NWIzNWVhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U3MWViMzdmY2EyMDcwNTIxZTFlMDdjNTAzYzJiY2Q2NDQ1YjM1ZWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNjYyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lNzFlYjM3ZmNhMjA3MDUyMWUxZTA3YzUwM2MyYmNkNjQ0NWIzNWVhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lNzYwZTZlMjJhZThjZDFlYTc4ZmUyOGI1ZWIxZjNkN2I1ZmRjNTM2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U3NjBlNmUyMmFlOGNkMWVhNzhmZTI4YjVlYjFmM2Q3YjVmZGM1MzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3NDdjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lNzYwZTZlMjJhZThjZDFlYTc4ZmUyOGI1ZWIxZjNkN2I1ZmRjNTM2CkBAIC0wLDAgKzEgQEAKK3s6iCkhwyIqvj8nyrOzISEqIeApOiEq4Do6Olx1ZGJEOIgpwyE6eyFgIT9gvr4hPychKm0sJyk7hSdgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U5NWZmMTE0MjExOGEyY2E1Yjg0OTM1NjEyYThhNjRkNTUzNjBlNjQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTk1ZmYxMTQyMTE4YTJjYTViODQ5MzU2MTJhOGE2NGQ1NTM2MGU2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYThiYmNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U5NWZmMTE0MjExOGEyY2E1Yjg0OTM1NjEyYThhNjRkNTUzNjBlNjQKQEAgLTAsMCArMSBAQAorIojDeykhOiq+Oz8nyrOzISEqIeApOiEq4Do6Olx1ZGIpOIjDIYc6eyFgIT9gvr4hPychKm0sJyk7hSdgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U5YzVlMmM2NzkzMDUxMzk0MTc1M2MyZDU0NTkxYzcwOThjODJmNmMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZTljNWUyYzY3OTMwNTEzOTQxNzUzYzJkNTQ1OTFjNzA5OGM4MmY2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk5MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2U5YzVlMmM2NzkzMDUxMzk0MTc1M2MyZDU0NTkxYzcwOThjODJmNmMKQEAgLTAsMCArMSBAQAorWzNdNCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZWIyNjA3MGQxN2ZmYTkwODIwNDkxMmU3NWNiNDMxMzgzNTA0MjAzOCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lYjI2MDcwZDE3ZmZhOTA4MjA0OTEyZTc1Y2I0MzEzODM1MDQyMDM4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjI5MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZWIyNjA3MGQxN2ZmYTkwODIwNDkxMmU3NWNiNDMxMzgzNTA0MjAzOApAQCAtMCwwICsxIEBACitbIipdOsMheym+PyfKs7MhISoh4Ck6ISrgOjo6XHVkYkQ4iCl7wyE6eyFgIT9gvr4iKKEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZWJjNmFlZTQ5ZTVhZTU3NzIyZGY4NmU3ZmEzM2M0MjBmMDQ1YTQ0OSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lYmM2YWVlNDllNWFlNTc3MjJkZjg2ZTdmYTMzYzQyMGYwNDVhNDQ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNThiOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZWJjNmFlZTQ5ZTVhZTU3NzIyZGY4NmU3ZmEzM2M0MjBmMDQ1YTQ0OQpAQCAtMCwwICsxIEBACiswMygKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZWQxZGMxMWQ3MTNlNzQ4N2RlMThjZTgzMTdiNjI5MTY5NTkyMDZkMCBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lZDFkYzExZDcxM2U3NDg3ZGUxOGNlODMxN2I2MjkxNjk1OTIwNmQwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTUzNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZWQxZGMxMWQ3MTNlNzQ4N2RlMThjZTgzMTdiNjI5MTY5NTkyMDZkMApAQCAtMCwwICsxIEBACis4MzI0RTY7KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lZGUzZjY2MTA2YWNkNzc5NmRhOGIzOTQyZDAyOWZlMjEzMDU4Mjg2IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2VkZTNmNjYxMDZhY2Q3Nzk2ZGE4YjM5NDJkMDI5ZmUyMTMwNTgyODYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljZWE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lZGUzZjY2MTA2YWNkNzc5NmRhOGIzOTQyZDAyOWZlMjEzMDU4Mjg2CkBAIC0wLDAgKzEgQEAKKzU4MzRFMHkpOymICSkhwwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lZWQ3YmQyMjBjZDUxMWI2ZDQyY2U2NTUzMDE5MjY2YTIyYTNkNTZhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2VlZDdiZDIyMGNkNTExYjZkNDJjZTY1NTMwMTkyNjZhMjJhM2Q1NmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmODZiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9lZWQ3YmQyMjBjZDUxMWI2ZDQyY2U2NTUzMDE5MjY2YTIyYTNkNTZhCkBAIC0wLDAgKzEgQEAKKzAsMAkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjA5MDkzMjE2Mjc1NmI3OThiMWEwNTBiMDVlM2QzNmEzNDM3YzRmYyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mMDkwOTMyMTYyNzU2Yjc5OGIxYTA1MGIwNWUzZDM2YTM0MzdjNGZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Zjk4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjA5MDkzMjE2Mjc1NmI3OThiMWEwNTBiMDVlM2QzNmEzNDM3YzRmYwpAQCAtMCwwICsxIEBACiszNjcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjE5MDVlYWE4NGJhNmEzNTkzZWM2YWMwNDg2YTViNDI4OTNjMDFmMSBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mMTkwNWVhYTg0YmE2YTM1OTNlYzZhYzA0ODZhNWI0Mjg5M2MwMWYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWE3YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjE5MDVlYWE4NGJhNmEzNTkzZWM2YWMwNDg2YTViNDI4OTNjMDFmMQpAQCAtMCwwICsxIEBACis1MHs6iCkhwyIqvj8nyrOzISEqIeApOiEq4Do6OCE5Olx1ZGJEOIgpwyE6eyFgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y0NjM1ZmJiZjc2NWVhZDgxYTI2MWNhMTUyZGYwMjYyMmUxODJkMmMgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjQ2MzVmYmJmNzY1ZWFkODFhMjYxY2ExNTJkZjAyNjIyZTE4MmQyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGUwZjJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y0NjM1ZmJiZjc2NWVhZDgxYTI2MWNhMTUyZGYwMjYyMmUxODJkMmMKQEAgLTAsMCArMSBAQAorIjE5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y0NmVlYjEwMjBjN2M0MTUzZTc0MmE1MGJjMjRjMmM2OTM5ZGFiMWUgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjQ2ZWViMTAyMGM3YzQxNTNlNzQyYTUwYmMyNGMyYzY5MzlkYWIxZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBhMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y0NmVlYjEwMjBjN2M0MTUzZTc0MmE1MGJjMjRjMmM2OTM5ZGFiMWUKQEAgLTAsMCArMSBAQAorMzYzCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjQ3MzQ1MTYxMDc4MzUyMWQ1MWJjMDhjZGQ5MjBkZGQ5N2Y4YTcxZiBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mNDczNDUxNjEwNzgzNTIxZDUxYmMwOGNkZDkyMGRkZDk3ZjhhNzFmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2M1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjQ3MzQ1MTYxMDc4MzUyMWQ1MWJjMDhjZGQ5MjBkZGQ5N2Y4YTcxZgpAQCAtMCwwICsxIEBACit7IipdOsMheym+PyfKs7MgISoh4Ck6ISrgOjo6XHVkYkQ4XCEpIXvDOnshYCE/YL6+IiihClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y2M2FhNTk5NjAwZjZlN2Q2NDhjNDI4NzkwNWUxNmU4ZTZlNDc5ZmQgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjYzYWE1OTk2MDBmNmU3ZDY0OGM0Mjg3OTA1ZTE2ZThlNmU0NzlmZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY4MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y2M2FhNTk5NjAwZjZlN2Q2NDhjNDI4NzkwNWUxNmU4ZTZlNDc5ZmQKQEAgLTAsMCArMSBAQAorIojDeykhOiJdKcMhOnsiKr4/J8qzsyEhKiHgKTohKuA6Ojpcvjs/J8qzdWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjY2N2RjZjFjMDZlODdkYjJkYzQ5ZDg2ZWExYzI4NWU3OTZmOGY4YyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mNjY3ZGNmMWMwNmU4N2RiMmRjNDlkODZlYTFjMjg1ZTc5NmY4ZjhjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGZiZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjY2N2RjZjFjMDZlODdkYjJkYzQ5ZDg2ZWExYzI4NWU3OTZmOGY4YwpAQCAtMCwwICsxIEBACis4MTNlMTI0MjgwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y4ZDBmODU5NzVlNDliOTU5Nzk5Y2M1Mjg0NzExMGNjOTQwYjlkYjEgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjhkMGY4NTk3NWU0OWI5NTk3OTljYzUyODQ3MTEwY2M5NDBiOWRiMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdmNTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y4ZDBmODU5NzVlNDliOTU5Nzk5Y2M1Mjg0NzExMGNjOTQwYjlkYjEKQEAgLTAsMCArMSBAQAorNjA0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y5MmM0N2UzNWRhNDJkNzlhNDhiZWZmNTRiOTNjZDI4ZjU1ZjA1ZmIgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjkyYzQ3ZTM1ZGE0MmQ3OWE0OGJlZmY1NGI5M2NkMjhmNTVmMDVmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ0YmEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y5MmM0N2UzNWRhNDJkNzlhNDhiZWZmNTRiOTNjZDI4ZjU1ZjA1ZmIKQEAgLTAsMCArMSBAQAorMWU5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y5YTMzYmI4YmQ3OGQ4NjlmYmFmYTQwMmQ5YmU1ODk0MGNlMmMzMTggYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZjlhMzNiYjhiZDc4ZDg2OWZiYWZhNDAyZDliZTU4OTQwY2UyYzMxOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmNiOWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2Y5YTMzYmI4YmQ3OGQ4NjlmYmFmYTQwMmQ5YmU1ODk0MGNlMmMzMTgKQEAgLTAsMCArMSBAQAorMUUJIojBgTk2MApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mYmY2ZjMxNTZjMWJkNGJiNzAxODM5YmMwZTI2NTMzYmRjY2QxYzlhIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2ZiZjZmMzE1NmMxYmQ0YmI3MDE4MzliYzBlMjY1MzNiZGNjZDFjOWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwZjFkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mYmY2ZjMxNTZjMWJkNGJiNzAxODM5YmMwZTI2NTMzYmRjY2QxYzlhCkBAIC0wLDAgKzEgQEAKKzAsZmElKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mZTJlZjQ5NWExMTUyNTYxNTcyOTQ5Nzg0YzE2YmYyM2FiYjI4MDU3IGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2ZlMmVmNDk1YTExNTI1NjE1NzI5NDk3ODRjMTZiZjIzYWJiMjgwNTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNGVmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mZTJlZjQ5NWExMTUyNTYxNTcyOTQ5Nzg0YzE2YmYyM2FiYjI4MDU3CkBAIC0wLDAgKzEgQEAKKzQ2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL2ZlNWRiYmNlYTVjZTdlMjk4OGI4YzY5YmNmZGZkZTg5MDRhYWJjMWYgYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvZmU1ZGJiY2VhNWNlN2UyOTg4YjhjNjliY2ZkZmRlODkwNGFhYmMxZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDExNjBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2ZlNWRiYmNlYTVjZTdlMjk4OGI4YzY5YmNmZGZkZTg5MDRhYWJjMWYKQEAgLTAsMCArMSBAQAorOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mZjhmYjM0NjAzYzdmNzcyNzY4ZDYxNTA0OTU0NTUzZTZiZWQxNzNjIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL2ZmOGZiMzQ2MDNjN2Y3NzI3NjhkNjE1MDQ5NTQ1NTNlNmJlZDE3M2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4NmFiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy9mZjhmYjM0NjAzYzdmNzcyNzY4ZDYxNTA0OTU0NTUzZTZiZWQxNzNjCkBAIC0wLDAgKzEgQEAKK24nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3QxLmpzb24gYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvdGVzdDEuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzkzY2QwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3QxLmpzb24KQEAgLTAsMCArMSBAQAoreyJmb28iOiJiYXIifQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3QyLmpzb24gYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvdGVzdDIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBjOTZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3QyLmpzb24KQEAgLTAsMCArMSBAQAorImZvbyIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0My5qc29uIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3QzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkYjliYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0My5qc29uCkBAIC0wLDAgKzEgQEAKK1sxLDIsMyw0XQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q0Lmpzb24gYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvdGVzdDQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNmY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q0Lmpzb24KQEAgLTAsMCArMSBAQAorMWU5NDM5MjMKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0NS5qc29uIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q1Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmMWQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0NS5qc29uCkBAIC0wLDAgKzEgQEAKKzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q2Lmpzb24gYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvdGVzdDYuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JhNzdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q2Lmpzb24KQEAgLTAsMCArMSBAQAordHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q3Lmpzb24gYi90ZXN0L2NvcmUvanNvbi9jb3JwdXMvdGVzdDcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTA4ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q3Lmpzb24KQEAgLTAsMCArMSBAQAorZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0OC5qc29uIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q4Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3NjViZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0OC5qc29uCkBAIC0wLDAgKzEgQEAKK251bGwKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0OS5qc29uIGIvdGVzdC9jb3JlL2pzb24vY29ycHVzL3Rlc3Q5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmYWJhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2NvcnB1cy90ZXN0OS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYWxwaGEiOm51bGwsImJldGEiOmZhbHNlLCJnYW1tYSI6Mi4zLCJ4eXoiOiJhYmMiLCJuZWdhdGl2ZSI6LTEzM30KZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2Z1enplci5jIGIvdGVzdC9jb3JlL2pzb24vZnV6emVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmODllNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS9qc29uL2Z1enplci5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbi5oIgorCitpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBjaGFyICpzID0gZ3ByX21hbGxvYyhzaXplKTsKKyAgbWVtY3B5KHMsIGRhdGEsIHNpemUpOworICBncnBjX2pzb24gKng7CisgIGlmICgoeCA9IGdycGNfanNvbl9wYXJzZV9zdHJpbmdfd2l0aF9sZW4ocywgc2l6ZSkpKSB7CisgICAgZ3JwY19qc29uX2Rlc3Ryb3koeCk7CisgIH0KKyAgZ3ByX2ZyZWUocyk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vanNvbl9yZXdyaXRlLmMgYi90ZXN0L2NvcmUvanNvbi9qc29uX3Jld3JpdGUuYwppbmRleCAwYzYxNWE5Li40MTA5MGRiIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvanNvbi9qc29uX3Jld3JpdGUuYworKysgYi90ZXN0L2NvcmUvanNvbi9qc29uX3Jld3JpdGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM4LDggKzM4LDggQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvY21kbGluZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oIgogCiB0eXBlZGVmIHN0cnVjdCBqc29uX3dyaXRlcl91c2VyZGF0YSB7IEZJTEUgKm91dDsgfSBqc29uX3dyaXRlcl91c2VyZGF0YTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vanNvbl9yZXdyaXRlX3Rlc3QuYyBiL3Rlc3QvY29yZS9qc29uL2pzb25fcmV3cml0ZV90ZXN0LmMKaW5kZXggMTkxNmQ0Yi4uMzNmYzk4ZSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL2pzb24vanNvbl9yZXdyaXRlX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvanNvbi9qc29uX3Jld3JpdGVfdGVzdC5jCkBAIC0zOSw4ICszOSw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCIKIAogdHlwZWRlZiBzdHJ1Y3QganNvbl93cml0ZXJfdXNlcmRhdGEgeyBGSUxFICpjbXA7IH0ganNvbl93cml0ZXJfdXNlcmRhdGE7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9qc29uL2pzb25fc3RyZWFtX2Vycm9yX3Rlc3QuYyBiL3Rlc3QvY29yZS9qc29uL2pzb25fc3RyZWFtX2Vycm9yX3Rlc3QuYwppbmRleCAzYjA3ZmNkLi42MzBlMWIwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvanNvbi9qc29uX3N0cmVhbV9lcnJvcl90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL2pzb24vanNvbl9zdHJlYW1fZXJyb3JfdGVzdC5jCkBAIC0zOSw4ICszOSw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKLSNpbmNsdWRlICJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uX3dyaXRlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCIKIAogc3RhdGljIGludCBnX3N0cmluZ19jbGVhcl9vbmNlID0gMDsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL2pzb24vanNvbl90ZXN0LmMgYi90ZXN0L2NvcmUvanNvbi9qc29uX3Rlc3QuYwppbmRleCBlOWI4MWUyLi4xM2VlNWJiIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvanNvbi9qc29uX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvanNvbi9qc29uX3Rlc3QuYwpAQCAtMzcsOCArMzcsOCBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvanNvbi9qc29uLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCkBAIC02NCw2ICs2NCw3IEBACiAgICAgLyogVGVzdGluZyBVVEYtOCBjaGFyYWN0ZXIgIvCdhJ4iLCBVKzExRDFFLiAqLwogICAgIHsiXCJceGYwXHg5ZFx4ODRceDllXCIiLCAiXCJcXHVkODM0XFx1ZGQxZVwiIn0sCiAgICAgeyJcIlxcdWQ4MzRcXHVkZDFlXCIiLCAiXCJcXHVkODM0XFx1ZGQxZVwiIn0sCisgICAgeyJ7XCJcXHVkODM0XFx1ZGQxZVwiOjB9IiwgIntcIlxcdWQ4MzRcXHVkZDFlXCI6MH0ifSwKICAgICAvKiBUZXN0aW5nIG5lc3RlZCBlbXB0eSBjb250YWluZXJzLiAqLwogICAgIHsKICAgICAgICAgIiBbIFsgXSAsIHsgfSAsIFsgXSBdICIsICJbW10se30sW11dIiwKQEAgLTg1LDIwICs4NiwzMSBAQAogICAgIC8qIFRlc3RpbmcgcGxhaW4gaW52YWxpZCB0aGluZ3MsIGV4ZXJjaXNpbmcgdGhlIHN0YXRlIG1hY2hpbmUuICovCiAgICAgeyJcXCIsIE5VTEx9LAogICAgIHsibnUgbGwiLCBOVUxMfSwKKyAgICB7IntcImZvb1wiOiBiYXJ9IiwgTlVMTH0sCisgICAgeyJ7XCJmb29cIjogYmFyXCJ4XCJ9IiwgTlVMTH0sCiAgICAgeyJmYWxzIiwgTlVMTH0sCiAgICAgLyogVGVzdGluZyB1bnRlcm1pbmF0ZWQgc3RyaW5nLiAqLwogICAgIHsiXCJcXHgiLCBOVUxMfSwKICAgICAvKiBUZXN0aW5nIGludmFsaWQgVVRGLTE2IG51bWJlci4gKi8KICAgICB7IlwiXFx1MTIzeCIsIE5VTEx9LAorICAgIHsie1wiXFx1MTIzeCIsIE5VTEx9LAogICAgIC8qIFRlc3RpbmcgaW1iYWxhbmNlZCBzdXJyb2dhdGUgcGFpcnMuICovCiAgICAgeyJcIlxcdWQ4MzRmIiwgTlVMTH0sCisgICAgeyJ7XCJcXHVkODM0ZlwiOjB9IiwgTlVMTH0sCiAgICAgeyJcIlxcdWQ4MzRcXG4iLCBOVUxMfSwKKyAgICB7IntcIlxcdWQ4MzRcXG5cIjowfSIsIE5VTEx9LAogICAgIHsiXCJcXHVkZDFlZiIsIE5VTEx9LAorICAgIHsie1wiXFx1ZGQxZWZcIjowfSIsIE5VTEx9LAogICAgIHsiXCJcXHVkODM0XFx1ZDgzNFwiIiwgTlVMTH0sCisgICAgeyJ7XCJcXHVkODM0XFx1ZDgzNFwiXCI6MH0iLCBOVUxMfSwKICAgICB7IlwiXFx1ZDgzNFxcdTEyMzRcIiIsIE5VTEx9LAorICAgIHsie1wiXFx1ZDgzNFxcdTEyMzRcIlwiOjB9IiwgTlVMTH0sCiAgICAgeyJcIlxcdWQ4MzRdXCIiLCBOVUxMfSwKKyAgICB7IntcIlxcdWQ4MzRdXCJcIjowfSIsIE5VTEx9LAogICAgIHsiXCJcXHVkODM0IFwiIiwgTlVMTH0sCisgICAgeyJ7XCJcXHVkODM0IFwiXCI6MH0iLCBOVUxMfSwKICAgICB7IlwiXFx1ZDgzNFxcXFxcIiIsIE5VTEx9LAorICAgIHsie1wiXFx1ZDgzNFxcXFxcIlwiOjB9IiwgTlVMTH0sCiAgICAgLyogVGVzdGluZyBlbWJlZGRlZCBpbnZhbGlkIHdoaXRlY2hhcnMuICovCiAgICAgeyJcIlxuXCIiLCBOVUxMfSwKICAgICB7IlwiXHRcIiIsIE5VTEx9LApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL25ldHdvcmtfYmVuY2htYXJrcy9sb3dfbGV2ZWxfcGluZ19wb25nLmMgYi90ZXN0L2NvcmUvbmV0d29ya19iZW5jaG1hcmtzL2xvd19sZXZlbF9waW5nX3BvbmcuYwppbmRleCA3ZWQzMzcyLi5iOGM2OTU0IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvbmV0d29ya19iZW5jaG1hcmtzL2xvd19sZXZlbF9waW5nX3BvbmcuYworKysgYi90ZXN0L2NvcmUvbmV0d29ya19iZW5jaG1hcmtzL2xvd19sZXZlbF9waW5nX3BvbmcuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiCiAKIHR5cGVkZWYgc3RydWN0IGZkX3BhaXIgewogICBpbnQgcmVhZF9mZDsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9wcm9maWxpbmcvdGltZXJzX3Rlc3QuYyBiL3Rlc3QvY29yZS9wcm9maWxpbmcvdGltZXJzX3Rlc3QuYwppbmRleCA3MDcwZmU0Li5hMzgzMTE5IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvcHJvZmlsaW5nL3RpbWVyc190ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3Byb2ZpbGluZy90aW1lcnNfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvcHJvZmlsaW5nL3RpbWVycy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L2F1dGhfY29udGV4dF90ZXN0LmMgYi90ZXN0L2NvcmUvc2VjdXJpdHkvYXV0aF9jb250ZXh0X3Rlc3QuYwppbmRleCBkMDkxYzdlLi44NGQyYWZiIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc2VjdXJpdHkvYXV0aF9jb250ZXh0X3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvYXV0aF9jb250ZXh0X3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMzLDggKzMzLDggQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L2I2NF90ZXN0LmMgYi90ZXN0L2NvcmUvc2VjdXJpdHkvYjY0X3Rlc3QuYwppbmRleCA3NzI1MTRlLi5hYjE1ZGYyIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc2VjdXJpdHkvYjY0X3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvYjY0X3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zZWN1cml0eS9jcmVhdGVfand0LmMgYi90ZXN0L2NvcmUvc2VjdXJpdHkvY3JlYXRlX2p3dC5jCmluZGV4IDRjMGNmNDMuLjM0MTZkZTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zZWN1cml0eS9jcmVhdGVfand0LmMKKysrIGIvdGVzdC9jb3JlL3NlY3VyaXR5L2NyZWF0ZV9qd3QuYwpAQCAtMzQsOSArMzQsOSBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmgiCiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvY21kbGluZS5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Rlc3QuYyBiL3Rlc3QvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc190ZXN0LmMKaW5kZXggM2E2Yjk2OS4uZTc0MWUzNiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfdGVzdC5jCkBAIC0zMyw3ICszMyw3IEBACiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKIAogI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC00NCwxMSArNDQsMTEgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogLyogLS0gTW9jayBjaGFubmVsIGNyZWRlbnRpYWxzLiAtLSAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L2ZldGNoX29hdXRoMi5jIGIvdGVzdC9jb3JlL3NlY3VyaXR5L2ZldGNoX29hdXRoMi5jCmluZGV4IDg3YjU0ZjEuLjFmNGUxODAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zZWN1cml0eS9mZXRjaF9vYXV0aDIuYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvZmV0Y2hfb2F1dGgyLmMKQEAgLTQyLDggKzQyLDggQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oIgogI2luY2x1ZGUgInRlc3QvY29yZS9zZWN1cml0eS9vYXV0aDJfdXRpbHMuaCIKIAogc3RhdGljIGdycGNfY2FsbF9jcmVkZW50aWFscyAqY3JlYXRlX3JlZnJlc2hfdG9rZW5fY3JlZHMoCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbl90ZXN0LmMgYi90ZXN0L2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbl90ZXN0LmMKaW5kZXggNGQ4MGMxNi4uNDYwZDUyOSAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW5fdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvanNvbl90b2tlbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiCiAKICNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNDEsOCArNDEsOCBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2pzb24vanNvbi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2I2NC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9qc29uL2pzb24uaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogLyogVGhpcyBKU09OIGtleSB3YXMgZ2VuZXJhdGVkIHdpdGggdGhlIEdDRSBjb25zb2xlIGFuZCByZXZva2VkIGltbWVkaWF0ZWx5LgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllcl90ZXN0LmMgYi90ZXN0L2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyX3Rlc3QuYwppbmRleCBkMmY4ZDFkLi5jNTdmNGQ3IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyX3Rlc3QuYwpAQCAtMzEsMTMgKzMxLDEzIEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgiCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2I2NC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L29hdXRoMl91dGlscy5jIGIvdGVzdC9jb3JlL3NlY3VyaXR5L29hdXRoMl91dGlscy5jCmluZGV4IDliNzBhZmYuLjUyMjU5ZTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zZWN1cml0eS9vYXV0aDJfdXRpbHMuYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvb2F1dGgyX3V0aWxzLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBncHJfbXUgKm11OwpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L29hdXRoMl91dGlscy5oIGIvdGVzdC9jb3JlL3NlY3VyaXR5L29hdXRoMl91dGlscy5oCmluZGV4IGIzNWZlNzkuLjU5MzBmNDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zZWN1cml0eS9vYXV0aDJfdXRpbHMuaAorKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvb2F1dGgyX3V0aWxzLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNCw3ICszNCw3IEBACiAjaWZuZGVmIEdSUENfVEVTVF9DT1JFX1NFQ1VSSVRZX09BVVRIMl9VVElMU19ICiAjZGVmaW5lIEdSUENfVEVTVF9DT1JFX1NFQ1VSSVRZX09BVVRIMl9VVElMU19ICiAKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3NlY3VyaXR5L3ByaW50X2dvb2dsZV9kZWZhdWx0X2NyZWRzX3Rva2VuLmMgYi90ZXN0L2NvcmUvc2VjdXJpdHkvcHJpbnRfZ29vZ2xlX2RlZmF1bHRfY3JlZHNfdG9rZW4uYwppbmRleCAwOTY3M2YzLi40OTgxMmY3IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc2VjdXJpdHkvcHJpbnRfZ29vZ2xlX2RlZmF1bHRfY3JlZHNfdG9rZW4uYworKysgYi90ZXN0L2NvcmUvc2VjdXJpdHkvcHJpbnRfZ29vZ2xlX2RlZmF1bHRfY3JlZHNfdG9rZW4uYwpAQCAtNDIsOCArNDIsOCBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgZ3ByX211ICptdTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnRfdGVzdC5jIGIvdGVzdC9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludF90ZXN0LmMKaW5kZXggMGU4YzM4YS4uZjY4ODRlYyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludF90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludF90ZXN0LmMKQEAgLTM5LDEwICszOSwxMCBAQAogI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90c2kvZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIGdwcl9tdSAqZ19tdTsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3JfdGVzdC5jIGIvdGVzdC9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvcl90ZXN0LmMKaW5kZXggMzFhNTZlYS4uYjA4MDM0MyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvcl90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvcl90ZXN0LmMKQEAgLTQwLDEzICs0MCwxMyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIGludCBjaGVja190cmFuc3BvcnRfc2VjdXJpdHlfdHlwZShjb25zdCBncnBjX2F1dGhfY29udGV4dCAqY3R4KSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc2VjdXJpdHkvdmVyaWZ5X2p3dC5jIGIvdGVzdC9jb3JlL3NlY3VyaXR5L3ZlcmlmeV9qd3QuYwppbmRleCBlYjg2NTg5Li5jMDhlMDNkIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc2VjdXJpdHkvdmVyaWZ5X2p3dC5jCisrKyBiL3Rlc3QvY29yZS9zZWN1cml0eS92ZXJpZnlfand0LmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oIgogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIGdycGNfcG9sbHNldCAqcG9sbHNldDsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2dfdGVzdHMuYyBiL3Rlc3QvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2dfdGVzdHMuYwppbmRleCA3Y2JiMGMwLi5mZWY4ZTllIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfbG9nX3Rlc3RzLmMKKysrIGIvdGVzdC9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2xvZ190ZXN0cy5jCkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19sb2cuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfbG9nLmgiCiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2NwdS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvcG9ydF9wbGF0Zm9ybS5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3N0dWJfdGVzdC5jIGIvdGVzdC9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3N0dWJfdGVzdC5jCmluZGV4IGU3MzRhMzQuLmRmNWQyNWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19zdHViX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfc3R1Yl90ZXN0LmMKQEAgLTM2LDggKzM2LDggQEAKIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKIC8qIFRlc3RzIGNlbnN1cyBub29wIHN0dWJzIGluIGEgc2ltdWxhdGVkIHJwYyBmbG93ICovCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3RhdGlzdGljcy9oYXNoX3RhYmxlX3Rlc3QuYyBiL3Rlc3QvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGVfdGVzdC5jCmluZGV4IDdmZjViYjcuLjkwM2QyOTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGVfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdGF0aXN0aWNzL2hhc2hfdGFibGVfdGVzdC5jCkBAIC0zNSwxMyArMzUsMTMgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2hhc2hfdGFibGUuaCIKIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogc3RhdGljIHVpbnQ2NF90IGhhc2g2NChjb25zdCB2b2lkICprKSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3RhdGlzdGljcy9ycGNfc3RhdHNfdGVzdC5jIGIvdGVzdC9jb3JlL3N0YXRpc3RpY3MvcnBjX3N0YXRzX3Rlc3QuYwppbmRleCAzZWNlM2NhLi5kYzJmNzBiIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc3RhdGlzdGljcy9ycGNfc3RhdHNfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdGF0aXN0aWNzL3JwY19zdGF0c190ZXN0LmMKQEAgLTM5LDkgKzM5LDkgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfdHJhY2luZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiAvKiBFbnN1cmUgYWxsIHBvc3NpYmxlIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBjYWxsZWQgd2l0aG91dCBjYXVzaW5nIHByb2JsZW0gKi8KZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdGF0aXN0aWNzL3RyYWNlX3Rlc3QuYyBiL3Rlc3QvY29yZS9zdGF0aXN0aWNzL3RyYWNlX3Rlc3QuYwppbmRleCAyYzY0ZTg5Li4yY2MzZGRkIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc3RhdGlzdGljcy90cmFjZV90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N0YXRpc3RpY3MvdHJhY2VfdGVzdC5jCkBAIC00MSw5ICs0MSw5IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RoZC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3VzZWZ1bC5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c190cmFjaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3RyYWNpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiAvKiBFbnN1cmUgYWxsIHBvc3NpYmxlIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBjYWxsZWQgd2l0aG91dCBjYXVzaW5nIHByb2JsZW0gKi8KZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0c190ZXN0LmMgYi90ZXN0L2NvcmUvc3RhdGlzdGljcy93aW5kb3dfc3RhdHNfdGVzdC5jCmluZGV4IDllZDdlZTEuLmVkMGQ3YmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdGF0aXN0aWNzL3dpbmRvd19zdGF0c190ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N0YXRpc3RpY3Mvd2luZG93X3N0YXRzX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy93aW5kb3dfc3RhdHMuaCIKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdXBwb3J0L2JhY2tvZmZfdGVzdC5jIGIvdGVzdC9jb3JlL3N1cHBvcnQvYmFja29mZl90ZXN0LmMKaW5kZXggODcwYjYwYi4uMTNjYmE3ZCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3N1cHBvcnQvYmFja29mZl90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N1cHBvcnQvYmFja29mZl90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvYmFja29mZi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCIKIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3N1cHBvcnQvZW52X3Rlc3QuYyBiL3Rlc3QvY29yZS9zdXBwb3J0L2Vudl90ZXN0LmMKaW5kZXggNjlhZWJjYy4uMWFiODZkNiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3N1cHBvcnQvZW52X3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc3VwcG9ydC9lbnZfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzcsOCArMzcsOCBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiAjZGVmaW5lIExPR19URVNUX05BTUUoeCkgZ3ByX2xvZyhHUFJfSU5GTywgIiVzIiwgeCkKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdXBwb3J0L2xvYWRfZmlsZV90ZXN0LmMgYi90ZXN0L2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGVfdGVzdC5jCmluZGV4IGExNGZkYzYuLjZiYzdiOTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdXBwb3J0L2xvYWRfZmlsZV90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N1cHBvcnQvbG9hZF9maWxlX3Rlc3QuYwpAQCAtMzgsOSArMzgsOSBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc2xpY2UuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogI2RlZmluZSBMT0dfVEVTVF9OQU1FKHgpIGdwcl9sb2coR1BSX0lORk8sICIlcyIsIHgpCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaF90ZXN0LmMgYi90ZXN0L2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaF90ZXN0LmMKaW5kZXggNTYyYjk1Ni4uYzkzZWZiNCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2hfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdXBwb3J0L211cm11cl9oYXNoX3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWVfdGVzdC5jIGIvdGVzdC9jb3JlL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWVfdGVzdC5jCmluZGV4IDBmNDllNmYuLjEzYzhmM2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZV90ZXN0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCIKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3VwcG9ydC9zdHJpbmdfdGVzdC5jIGIvdGVzdC9jb3JlL3N1cHBvcnQvc3RyaW5nX3Rlc3QuYwppbmRleCBjMWQwZjEyLi5lNWU0NzRkIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc3VwcG9ydC9zdHJpbmdfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdXBwb3J0L3N0cmluZ190ZXN0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkZGVmLmg+CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXJfdGVzdC5jIGIvdGVzdC9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyX3Rlc3QuYwppbmRleCBjOGFhY2RiLi42MjliY2U5IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXJfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlcl90ZXN0LmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKLSNpbmNsdWRlICJzcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZV90ZXN0LmMgYi90ZXN0L2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZV90ZXN0LmMKaW5kZXggMDQ0ZTc2Ni4uZDVkN2QxYyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGVfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdXJmYWNlL2NoYW5uZWxfY3JlYXRlX3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCiB2b2lkIHRlc3RfdW5rbm93bl9zY2hlbWVfdGFyZ2V0KHZvaWQpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWVfdGVzdC5jIGIvdGVzdC9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZV90ZXN0LmMKaW5kZXggNGY1MzRkZS4uZmE5YjM2MyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZV90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZV90ZXN0LmMKQEAgLTMxLDE0ICszMSwxNCBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIgogCiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aGQuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9pb21nci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKICNkZWZpbmUgTE9HX1RFU1QoeCkgZ3ByX2xvZyhHUFJfSU5GTywgIiVzIiwgeCkKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50X3Rlc3QuYyBiL3Rlc3QvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50X3Rlc3QuYwppbmRleCA3OWU1M2NiLi4zMTBhYTAwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudF90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnRfdGVzdC5jCkBAIC0zNiwxMCArMzYsMTAgQEAKICNpbmNsdWRlIDxncnBjL2dycGMuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvYWxsb2MuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9jcV92ZXJpZmllci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZV90ZXN0LmMgYi90ZXN0L2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGVfdGVzdC5jCmluZGV4IGYzZTVmZWYuLjVjOTUzOTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdXJmYWNlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZV90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3N1cmZhY2Uvc2VjdXJlX2NoYW5uZWxfY3JlYXRlX3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM2LDEwICszNiwxMCBAQAogI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgogI2luY2x1ZGUgPGdycGMvZ3JwY19zZWN1cml0eS5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogdm9pZCB0ZXN0X3Vua25vd25fc2NoZW1lX3RhcmdldCh2b2lkKSB7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyX3Rlc3QuYyBiL3Rlc3QvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDJfdGVzdC5jCmluZGV4IDg0YjM0NWIuLjE0ZWIxZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDJfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDJfdGVzdC5jCkBAIC0zNyw4ICszNyw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2hvc3RfcG9ydC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuX3Rlc3QuYyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG5fdGVzdC5jCmluZGV4IDlhN2Q1ZWYuLjEzNTA5YzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG5fdGVzdC5jCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG5fdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uaCIKIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXJfdGVzdC5jIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXJfdGVzdC5jCmluZGV4IDgxNWIwM2MuLjU2Yjg2ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlcl90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8Z3JwYy9ncnBjLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAKIHN0YXRpYyBpbnQgYWxsX29rID0gMTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlcl90ZXN0LmMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyX3Rlc3QuYwppbmRleCBmNWRlMDg3Li44MThjZTA5IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyX3Rlc3QuYwpAQCAtMzEsMTYgKzMxLDE2IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wYXJzZV9oZXhzdHJpbmcuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9zbGljZV9zcGxpdHRlci5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzAxNDFmY2RkYzk4MDdlZTA5MzMxM2IyMjU2ZjEzMDZmYmJkYzZjZGEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzAxNDFmY2RkYzk4MDdlZTA5MzMxM2IyMjU2ZjEzMDZmYmJkYzZjZGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiMTI1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDE0MWZjZGRjOTgwN2VlMDkzMzEzYjIyNTZmMTMwNmZiYmRjNmNkYQpAQCAtMCwwICsxIEBACisoP6QfpKQf26Tb8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDI1NTA1MGE5Y2NiMjVmNDZkNmMxYmY2YTVhOGE0YzBjNzYzNTU5OSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDI1NTA1MGE5Y2NiMjVmNDZkNmMxYmY2YTVhOGE0YzBjNzYzNTU5OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjhhNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wMjU1MDUwYTljY2IyNWY0NmQ2YzFiZjZhNWE4YTRjMGM3NjM1NTk5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDMyMGE5OTVhOGM3NmM2NGM4YTBlMDI5N2Y2MzJiNzZkOWJjOTJkNiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDMyMGE5OTVhOGM3NmM2NGM4YTBlMDI5N2Y2MzJiNzZkOWJjOTJkNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWEzNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wMzIwYTk5NWE4Yzc2YzY0YzhhMGUwMjk3ZjYzMmI3NmQ5YmM5MmQ2CkBAIC0wLDAgKzEgQEAKK6QfIYPb8KQfIYO22/AqYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDQyMDkxYWVhYzRjYzI1NTUwNmI5NmZhMTFjNzM1NGU2OTlmZGU3NiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDQyMDkxYWVhYzRjYzI1NTUwNmI5NmZhMTFjNzM1NGU2OTlmZGU3NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY1ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wNDIwOTFhZWFjNGNjMjU1NTA2Yjk2ZmExMWM3MzU0ZTY5OWZkZTc2CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluOz8wYyEoB/BLCfBbTiGLY1s6pBAH8KQPLVwZIfVHISk6WyghIaQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA2OTZlN2JmNzgzN2Q5OGRlMDFjOTE1ZDNjOWQ4MGU1ZDIxYjMwZDIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA2OTZlN2JmNzgzN2Q5OGRlMDFjOTE1ZDNjOWQ4MGU1ZDIxYjMwZDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5MzZmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDY5NmU3YmY3ODM3ZDk4ZGUwMWM5MTVkM2M5ZDgwZTVkMjFiMzBkMgpAQCAtMCwwICsxIEBACisQB/BbKC1iaW4hCfAoIVwJPyqgpK5ACBAHOvBbBgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDY5OTVjMmYzZjAxYzdlYzUwNTQ3NDE1ZGMzMjRjNjQwMzBiN2EzZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDY5OTVjMmYzZjAxYzdlYzUwNTQ3NDE1ZGMzMjRjNjQwMzBiN2EzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIwZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wNjk5NWMyZjNmMDFjN2VjNTA1NDc0MTVkYzMyNGM2NDAzMGI3YTNlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDZmN2NlNzY5ZmUwNzgwNGZjODQyNDYyZDRiZThjMWFhMmJhODJjMiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDZmN2NlNzY5ZmUwNzgwNGZjODQyNDYyZDRiZThjMWFhMmJhODJjMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWRjOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wNmY3Y2U3NjlmZTA3ODA0ZmM4NDI0NjJkNGJlOGMxYWEyYmE4MmMyCkBAIC0wLDAgKzEgQEAKK66ApIgoY2MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA3ODFiMDU1Yzg1YWI4ZmJkMGEzZDAwODBhMzJlMzk0YWY4NzYxYzQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA3ODFiMDU1Yzg1YWI4ZmJkMGEzZDAwODBhMzJlMzk0YWY4NzYxYzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiMWU4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDc4MWIwNTVjODVhYjhmYmQwYTNkMDA4MGEzMmUzOTRhZjg3NjFjNApAQCAtMCwwICsxIEBACiukHyGD2/DwpB8hg9vw8GMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA4MGUxZjE5ZTYwNjFjNWJjYWMzMWFkZDIwOTVmODdmNmNlNDYxMjkgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA4MGUxZjE5ZTYwNjFjNWJjYWMzMWFkZDIwOTVmODdmNmNlNDYxMjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MGQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDgwZTFmMTllNjA2MWM1YmNhYzMxYWRkMjA5NWY4N2Y2Y2U0NjEyOQpAQCAtMCwwICsxIEBACis7PydjB/BbKCEJ8FtOIVwJIeVH/SEqKCEJIeVH/UEpKCEp7SG8KinlR/1JKSjZOymKClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wODI4MTY5YmE4MjE1MmE4OTA3ZjEwMDFlM2Q5ODgwNDM5N2Q0NjEwIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wODI4MTY5YmE4MjE1MmE4OTA3ZjEwMDFlM2Q5ODgwNDM5N2Q0NjEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzc4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA4MjgxNjliYTgyMTUyYTg5MDdmMTAwMWUzZDk4ODA0Mzk3ZDQ2MTAKQEAgLTAsMCArMSBAQAorpB+k2/Ah8AljYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA4ZmZjNGE0MTYwZTlmZTZmMzIyYzI4ODcwYTg5YTQxZmQ5YzM3ZDcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA4ZmZjNGE0MTYwZTlmZTZmMzIyYzI4ODcwYTg5YTQxZmQ5YzM3ZDcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjODgwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDhmZmM0YTQxNjBlOWZlNmYzMjJjMjg4NzBhODlhNDFmZDljMzdkNwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA5MGE3YTc1ODg5OGE2ZTdjOTEwOGI3ZThhMWNiOWNkYTM4M2U3MDcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA5MGE3YTc1ODg5OGE2ZTdjOTEwOGI3ZThhMWNiOWNkYTM4M2U3MDcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmNTk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDkwYTdhNzU4ODk4YTZlN2M5MTA4YjdlOGExY2I5Y2RhMzgzZTcwNwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiaW4JISE/pB/b8CEQB/B7KC1iaW7wCSFcCSHlH+kbOz9H7VsoKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA5NDA2NjM3Mjk1MDFiNzUwYTE4NTQyZTEwNDFjYzI2Mzg1YzYxNDggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzA5NDA2NjM3Mjk1MDFiNzUwYTE4NTQyZTEwNDFjYzI2Mzg1YzYxNDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5Mjg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMDk0MDY2MzcyOTUwMWI3NTBhMTg1NDJlMTA0MWNjMjYzODVjNjE0OApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbovkY1vyKSgnLWJpLgkqKSE/pB/b4iEQB/B7KC1iaVxuIQkhCfDlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYTEwYmQxNDBjNmM1ZmIxMDlhMDgxNmNhMDYxNzM5Njg4YTZkYjlhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYTEwYmQxNDBjNmM1ZmIxMDlhMDgxNmNhMDYxNzM5Njg4YTZkYjlhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTY5OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBhMTBiZDE0MGM2YzVmYjEwOWEwODE2Y2EwNjE3Mzk2ODhhNmRiOWEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYTRkM2ZkYTAyY2RjYjdhZGFkMWRhYTgwZDY1NzgwYzljOGQxNDY0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYTRkM2ZkYTAyY2RjYjdhZGFkMWRhYTgwZDY1NzgwYzljOGQxNDY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWY1OGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBhNGQzZmRhMDJjZGNiN2FkYWQxZGFhODBkNjU3ODBjOWM4ZDE0NjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYWQ4MTI4MzJlZmEzM2UwODY4NzRmYmYzNDk2NjY0ZDNmMWI0ZGJlIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYWQ4MTI4MzJlZmEzM2UwODY4NzRmYmYzNDk2NjY0ZDNmMWI0ZGJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZWM3ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBhZDgxMjgzMmVmYTMzZTA4Njg3NGZiZjM0OTY2NjRkM2YxYjRkYmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYzk5OTZkNGZlZjg3YmFjZDdhMDAxZTk5YTUxNWIzYmEzZDU3ODhmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wYzk5OTZkNGZlZjg3YmFjZDdhMDAxZTk5YTUxNWIzYmEzZDU3ODhmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWE4OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBjOTk5NmQ0ZmVmODdiYWNkN2EwMDFlOTlhNTE1YjNiYTNkNTc4OGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZDYyMTAyMDg4MzFmZTU1OTUxYWY1NmNkZWVlM2Q1NGE5MWE1MzYxIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZDYyMTAyMDg4MzFmZTU1OTUxYWY1NmNkZWVlM2Q1NGE5MWE1MzYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWZkMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBkNjIxMDIwODgzMWZlNTU5NTFhZjU2Y2RlZWUzZDU0YTkxYTUzNjEKQEAgLTAsMCArMSBAQAorZhMhKCEhCWlb0SHlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZDc4NDk2NWIyMjYyZGY3ZWQ3YTFlYjU3YjkyYTcxOGNjNzZiZGU4IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZDc4NDk2NWIyMjYyZGY3ZWQ3YTFlYjU3YjkyYTcxOGNjNzZiZGU4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODA3N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBkNzg0OTY1YjIyNjJkZjdlZDdhMWViNTdiOTJhNzE4Y2M3NmJkZTgKQEAgLTAsMCArMSBAQAorpB/KIfAJYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBkYzllNDFlZWRmMzVjY2VkZjRlMmIwZDIzMGVhZDdjNGQ3MmZkYjIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBkYzllNDFlZWRmMzVjY2VkZjRlMmIwZDIzMGVhZDdjNGQ3MmZkYjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxOTE2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMGRjOWU0MWVlZGYzNWNjZWRmNGUyYjBkMjMwZWFkN2M0ZDcyZmRiMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBkZDQ3MGM4OTM5ZWQ1MzVkZTZiMzZmN2I3YmZiNjhhZWFjZTQ5M2UgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBkZDQ3MGM4OTM5ZWQ1MzVkZTZiMzZmN2I3YmZiNjhhZWFjZTQ5M2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3Y2JkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMGRkNDcwYzg5MzllZDUzNWRlNmIzNmY3YjdiZmI2OGFlYWNlNDkzZQpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoJy1iaAkqISE/pB/b4iEQB/B7KC1iaVxuIQkhCfDlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZTYxZTQ3MWZhNmQzNDA1ZGFlZjQyNzZlZTAwY2Y1ZmMxODlmMzc4IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZTYxZTQ3MWZhNmQzNDA1ZGFlZjQyNzZlZTAwY2Y1ZmMxODlmMzc4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzgzN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBlNjFlNDcxZmE2ZDM0MDVkYWVmNDI3NmVlMDBjZjVmYzE4OWYzNzgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZTkxOTZmOTUxODc0ZWRiYjVlZDA5ODczOWVhNWM4YjZjMDc1MWMyIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8wZTkxOTZmOTUxODc0ZWRiYjVlZDA5ODczOWVhNWM4YjZjMDc1MWMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2VmOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzBlOTE5NmY5NTE4NzRlZGJiNWVkMDk4NzM5ZWE1YzhiNmMwNzUxYzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xMTQ0MmQ5M2E1NTRiOWU3ZjlhYjAyNzgyYmJmOTQ0M2JmNmUxZGRjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xMTQ0MmQ5M2E1NTRiOWU3ZjlhYjAyNzgyYmJmOTQ0M2JmNmUxZGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWIxMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzExNDQyZDkzYTU1NGI5ZTdmOWFiMDI3ODJiYmY5NDQzYmY2ZTFkZGMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xMTgzM2I3OTVkMDRlZGE1YTNhZjU2ZWY3YjNjM2EyNmE4ZWUzNDQ0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xMTgzM2I3OTVkMDRlZGE1YTNhZjU2ZWY3YjNjM2EyNmE4ZWUzNDQ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGEwNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzExODMzYjc5NWQwNGVkYTVhM2FmNTZlZjdiM2MzYTI2YThlZTM0NDQKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LKVsnKC1jYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5R/pGzs/R+06WygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMTQxMjcyMzE2MzgyYjBmM2U5ZWM4NDFjNzM1Yjg0ZTdhYTUxN2MzZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMTQxMjcyMzE2MzgyYjBmM2U5ZWM4NDFjNzM1Yjg0ZTdhYTUxN2MzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzA2YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xNDEyNzIzMTYzODJiMGYzZTllYzg0MWM3MzViODRlN2FhNTE3YzNlCkBAIC0wLDAgKzEgQEAKKzs/MGMhKAfwSwnwW04hXBkh9UchWyghIQkh5Uf9QSkoISntISrlR4C+/UEpKdkrqYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE1YWU0MzM2OTc5OGU0OGMzOTZkZmU3ZDUzYTIxODc4Yjk2ZTY2YzggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE1YWU0MzM2OTc5OGU0OGMzOTZkZmU3ZDUzYTIxODc4Yjk2ZTY2YzgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjMjE3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMTVhZTQzMzY5Nzk4ZTQ4YzM5NmRmZTdkNTNhMjE4NzhiOTZlNjZjOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE2NmJmMTg0M2MyMjlkMzRhMjg4MGQyMzRkZDE2NmMyN2JkYzExZmQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE2NmJmMTg0M2MyMjlkMzRhMjg4MGQyMzRkZDE2NmMyN2JkYzExZmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmZGQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMTY2YmYxODQzYzIyOWQzNGEyODgwZDIzNGRkMTY2YzI3YmRjMTFmZApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbovtpC1bYychKaQQYmkHClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xNzllOGFjNzYzYjQwNTFhOTUzYTM4YjZiM2IxZjFlMWY2Y2M2YzllIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xNzllOGFjNzYzYjQwNTFhOTUzYTM4YjZiM2IxZjFlMWY2Y2M2YzllCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzZlOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE3OWU4YWM3NjNiNDA1MWE5NTNhMzhiNmIzYjFmMWUxZjZjYzZjOWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xN2ZhZjBiYThhNDkxYTgzNWQzNTk3N2E5MDA3YjkwYWI3ZDMwZDJhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xN2ZhZjBiYThhNDkxYTgzNWQzNTk3N2E5MDA3YjkwYWI3ZDMwZDJhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzA5NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE3ZmFmMGJhOGE0OTFhODM1ZDM1OTc3YTkwMDdiOTBhYjdkMzBkMmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xODhmNmNmMjQ3MGU5NWIyMjgzNDFkZTMwNWVmODM5YjI3ZjAxYTVjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xODhmNmNmMjQ3MGU5NWIyMjgzNDFkZTMwNWVmODM5YjI3ZjAxYTVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWE0NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzE4OGY2Y2YyNDcwZTk1YjIyODM0MWRlMzA1ZWY4MzliMjdmMDFhNWMKQEAgLTAsMCArMSBAQAorOz8wYwfwWyghCfBbTiFcCSHlR/0hWyghIQkh5Uf9QSkoISntIbwqKeVH/UEpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzFhYjNlNTJhZGFjZTMzNWQwMmUyYjUxMzBlYjRmN2M5MThhZGQ3ZmQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzFhYjNlNTJhZGFjZTMzNWQwMmUyYjUxMzBlYjRmN2M5MThhZGQ3ZmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0ZTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMWFiM2U1MmFkYWNlMzM1ZDAyZTJiNTEzMGViNGY3YzkxOGFkZDdmZApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWycpKC0nYmluCSEhP6Qf2/AhEAfweygtYmFu8AkhXAkhKOUf6RuWOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xYjUxNTA1MTQzNjRlMmMxN2Y1YTRlZGFjMWI3YWY5OWI5MzZmNTVhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xYjUxNTA1MTQzNjRlMmMxN2Y1YTRlZGFjMWI3YWY5OWI5MzZmNTVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMmY1YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzFiNTE1MDUxNDM2NGUyYzE3ZjVhNGVkYWMxYjdhZjk5YjkzNmY1NWEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZThiZWZiOThjYmFiYTA1OWQ2NzcxYWJkMTY4MGUxOTQ4NGU3NzIzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZThiZWZiOThjYmFiYTA1OWQ2NzcxYWJkMTY4MGUxOTQ4NGU3NzIzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTBjZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzFlOGJlZmI5OGNiYWJhMDU5ZDY3NzFhYmQxNjgwZTE5NDg0ZTc3MjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZTliOTYyOTY5YzM1OWJjMmZmNzY2NzA0YzhjYThlMjVmNWVjY2ZjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZTliOTYyOTY5YzM1OWJjMmZmNzY2NzA0YzhjYThlMjVmNWVjY2ZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGE5MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzFlOWI5NjI5NjljMzU5YmMyZmY3NjY3MDRjOGNhOGUyNWY1ZWNjZmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZjgwYWYxMDRhY2Y0MWI5MTJiZjRhNDhmYjkzODI2N2UzNzE4NzE5IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZjgwYWYxMDRhY2Y0MWI5MTJiZjRhNDhmYjkzODI2N2UzNzE4NzE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGFiNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzFmODBhZjEwNGFjZjQxYjkxMmJmNGE0OGZiOTM4MjY3ZTM3MTg3MTkKQEAgLTAsMCArMSBAQAorPyquQAg6WwcQ8Ab4YwkoISFc/jvwASF+CR/b5UekD6Tb8P0h0GFtpApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMWZjYzRhZmQ2ZjQ4ZTgzZDYxZWE3NDk3MGRmM2NhOWRjZDhlYzI5MSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMWZjYzRhZmQ2ZjQ4ZTgzZDYxZWE3NDk3MGRmM2NhOWRjZDhlYzI5MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIyZDBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8xZmNjNGFmZDZmNDhlODNkNjFlYTc0OTcwZGYzY2E5ZGNkOGVjMjkxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjEzYTczNGNjZGI4MTNiMThhZDlmMmRkOTliN2Y5OTY3ZWUxNDYwYiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjEzYTczNGNjZGI4MTNiMThhZDlmMmRkOTliN2Y5OTY3ZWUxNDYwYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGFiOWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yMTNhNzM0Y2NkYjgxM2IxOGFkOWYyZGQ5OWI3Zjk5NjdlZTE0NjBiCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui5lbKSgnLWJpbgkhIT+kH9vwIRAH8HsoLWJpXG4hCSEJ8OUf6Rs7P0ftOlsoKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzIxNTE5NDVmNDM5OTFjMjdlMTIzYzQ1ZGM3MmI5Mzc1MmE0N2U2NWYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzIxNTE5NDVmNDM5OTFjMjdlMTIzYzQ1ZGM3MmI5Mzc1MmE0N2U2NWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNWQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjE1MTk0NWY0Mzk5MWMyN2UxMjNjNDVkYzcyYjkzNzUyYTQ3ZTY1ZgpAQCAtMCwwICsxIEBACisQB/BbKC1iaW4hCfAoIVwJIeVH/TpbKCEn8FsoISEJ8FsoKiEJIeUh/UflR/1BKSgTWygJISHlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yMTU0NWQ5OThjMjdhNWExNTcyYTg5YTU1MjkzNzc1MjQzMmIxYzE0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yMTU0NWQ5OThjMjdhNWExNTcyYTg5YTU1MjkzNzc1MjQzMmIxYzE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjdkODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzIxNTQ1ZDk5OGMyN2E1YTE1NzJhODlhNTUyOTM3NzUyNDMyYjFjMTQKQEAgLTAsMCArMSBAQAorKqQQB/CkDy1i6W4nH4MnYylb8GkoYm4tIT+kH9vwIQnwKCFcYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjNjNzQ0M2ZhMWFiNzEzZTdjMzRlYzUwMjIyYjFiOGNjZWFlZGM2NSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjNjNzQ0M2ZhMWFiNzEzZTdjMzRlYzUwMjIyYjFiOGNjZWFlZGM2NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIyZjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yM2M3NDQzZmExYWI3MTNlN2MzNGVjNTAyMjJiMWI4Y2NlYWVkYzY1CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluiy1bYycoKWJpbgkhIT+kH9vwITsH8HsoLWJpbvAJIVwJIZgf6Rs7P0ftOlsoKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI0NDViYjJjNjc3OTcxMmRjOWUxNGMwMWZlY2I3MTAzZjg3MzI4NTggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI0NDViYjJjNjc3OTcxMmRjOWUxNGMwMWZlY2I3MTAzZjg3MzI4NTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExMmM0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjQ0NWJiMmM2Nzc5NzEyZGM5ZTE0YzAxZmVjYjcxMDNmODczMjg1OApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI0NGIwYTIwNTAwZTMxZDNjNTM4NDE4ODAwZGI4MTZiMDdmNGQyMTAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI0NGIwYTIwNTAwZTMxZDNjNTM4NDE4ODAwZGI4MTZiMDdmNGQyMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4ZDU1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjQ0YjBhMjA1MDBlMzFkM2M1Mzg0MTg4MDBkYjgxNmIwN2Y0ZDIxMApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiaW4JMSE/pB/b8CE7EAcq8HsoLWJpbvAJIVwJIeUf6Rs7P0ftOlsoKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI0NjFiOWZhNmI1YmM0YjY0MjRkZWM1YjlhMThkNGVjN2MzMDkxMTIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI0NjFiOWZhNmI1YmM0YjY0MjRkZWM1YjlhMThkNGVjN2MzMDkxMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkMWRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjQ2MWI5ZmE2YjViYzRiNjQyNGRlYzViOWExOGQ0ZWM3YzMwOTExMgpAQCAtMCwwICsxIEBACis/KqCkrkAIEAc68FsG+GMJKDv+ISFc8Akhfgkf2+VH/SHwY206JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjRlYzJmM2UxN2QzODUwNTY0Nzg4ZjNmZWQxN2E1YzU4NmM0NDY1OCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjRlYzJmM2UxN2QzODUwNTY0Nzg4ZjNmZWQxN2E1YzU4NmM0NDY1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZhNzQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNGVjMmYzZTE3ZDM4NTA1NjQ3ODhmM2ZlZDE3YTVjNTg2YzQ0NjU4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjUzN2I4ZDZiOTAyYjhkZmM2ZTE3ZjE5NGNmN2QwNWRkZWNmNzRjZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMjUzN2I4ZDZiOTAyYjhkZmM2ZTE3ZjE5NGNmN2QwNWRkZWNmNzRjZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGNlZTRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNTM3YjhkNmI5MDJiOGRmYzZlMTdmMTk0Y2Y3ZDA1ZGRlY2Y3NGNmCkBAIC0wLDAgKzEgQEAKK6QfIYPb8NCkHyGDOltv8PBjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNTNhZDAxYWNlYTRiNzAzOGVkYzNmMmE4YzRhMGMwZjVjNGRjZDA1IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNTNhZDAxYWNlYTRiNzAzOGVkYzNmMmE4YzRhMGMwZjVjNGRjZDA1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWRhYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI1M2FkMDFhY2VhNGI3MDM4ZWRjM2YyYThjNGEwYzBmNWM0ZGNkMDUKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1spKC0nYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5TfpGzs/R+0oWyghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNTZkMGJiZGJlZDIyZjU4NjdhNmY1MDNiZjA4MjAxMWU2MWVlMTJiIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNTZkMGJiZGJlZDIyZjU4NjdhNmY1MDNiZjA4MjAxMWU2MWVlMTJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDY5YjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI1NmQwYmJkYmVkMjJmNTg2N2E2ZjUwM2JmMDgyMDExZTYxZWUxMmIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNmYwZTg4YWRiZDhmOGNkZjc3ODEzMWEzNWIzM2VjZjg3MTFmYTQ5IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yNmYwZTg4YWRiZDhmOGNkZjc3ODEzMWEzNWIzM2VjZjg3MTFmYTQ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODU3NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzI2ZjBlODhhZGJkOGY4Y2RmNzc4MTMxYTM1YjMzZWNmODcxMWZhNDkKQEAgLTAsMCArMSBAQAorpHCD2/DwpB8hg9snKfBjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yZTVkZDhmYjlkMmEzMWZhZDlkNjgxZWRhNjk3ZDA4NWI2NDdiNTdjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yZTVkZDhmYjlkMmEzMWZhZDlkNjgxZWRhNjk3ZDA4NWI2NDdiNTdjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWQ3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzJlNWRkOGZiOWQyYTMxZmFkOWQ2ODFlZGE2OTdkMDg1YjY0N2I1N2MKQEAgLTAsMCArMSBAQAorpB8hg/DxpB8hg9vwsfBjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yZmRmZDJhYmYzMGM2MzZlYzhjODQxZjFhYzI2NTk0ZTI1NjY0ZjBmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8yZmRmZDJhYmYzMGM2MzZlYzhjODQxZjFhYzI2NTk0ZTI1NjY0ZjBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzI3YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzJmZGZkMmFiZjMwYzYzNmVjOGM4NDFmMWFjMjY1OTRlMjU2NjRmMGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zMTFkYWM1MDkyZTM2MTM0ZDM0OTBmOThhYTQyMDc0MjVlMGVlOTQxIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zMTFkYWM1MDkyZTM2MTM0ZDM0OTBmOThhYTQyMDc0MjVlMGVlOTQxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTAwZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzMxMWRhYzUwOTJlMzYxMzRkMzQ5MGY5OGFhNDIwNzQyNWUwZWU5NDEKQEAgLTAsMCArMSBAQAorEAfwWyghCfBbKCFcCSHlR/06WyghIRNbKAkh5Uf9QSkoISntIbgqISEJKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzIwZmU2MjI0YTViNjkxYzA0MjVlMzRiNmIxNGU4YzZmZTlmOTYyMCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzIwZmU2MjI0YTViNjkxYzA0MjVlMzRiNmIxNGU4YzZmZTlmOTYyMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzA2MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zMjBmZTYyMjRhNWI2OTFjMDQyNWUzNGI2YjE0ZThjNmZlOWY5NjIwCkBAIC0wLDAgKzEgQEAKKyqgpK5ACBAH8Fs6BvhjCTg7J/4hIVzwCSF+CR/bREf9IfBrbScKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzMyNTVmMWM3NDQxYTcxNTBkYzNjMzMwMjJiZmJlOGM5NTZjN2I3YjEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzMyNTVmMWM3NDQxYTcxNTBkYzNjMzMwMjJiZmJlOGM5NTZjN2I3YjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjMDkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzI1NWYxYzc0NDFhNzE1MGRjM2MzMzAyMmJmYmU4Yzk1NmM3YjdiMQpAQCAtMCwwICsxIEBACis7PydjB/BbKCEJ8FtOIVwJIeVF/SEqKCEhCSHlR/1BKSghKe0hvCop5Uf9SSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzNiYzlkYjEwNGViNzI4OTFmYjA5NmYzNGNiYWMxOTFiM2Y5OTE4ZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzNiYzlkYjEwNGViNzI4OTFmYjA5NmYzNGNiYWMxOTFiM2Y5OTE4ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWY1OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zM2JjOWRiMTA0ZWI3Mjg5MWZiMDk2ZjM0Y2JhYzE5MWIzZjk5MThkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzQyZmYxZGI3MGE3NjE2YjRlZjc2YzAzYTQyODAyYzY3MDJjMThjYiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzQyZmYxZGI3MGE3NjE2YjRlZjc2YzAzYTQyODAyYzY3MDJjMThjYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkyMTkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zNDJmZjFkYjcwYTc2MTZiNGVmNzZjMDNhNDI4MDJjNjcwMmMxOGNiCkBAIC0wLDAgKzEgQEAKKykHOjshnMon0tgpKjt9dik3Sc8hpCk7HpYtTSqx5OIhJ2QqQ3UYDquRWCQwDik68yo7OuTdOzsoKTs6Xe/mQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzQ0YzAxMWRmOTkyY2NmYzBlYzY4MmMxNGExY2IyZDc5NTk5OThjNyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzQ0YzAxMWRmOTkyY2NmYzBlYzY4MmMxNGExY2IyZDc5NTk5OThjNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhZjdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zNDRjMDExZGY5OTJjY2ZjMGVjNjgyYzE0YTFjYjJkNzk1OTk5OGM3CkBAIC0wLDAgKzEgQEAKKzukpBAH8KQPLWJpbotjKlsppA+kpCgQB/AKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzM1Nzc1ZWZiOWQwZDY4ZmEwNzk4N2I5YTg0OTM0Mzg5YjUyOGU0MzYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzM1Nzc1ZWZiOWQwZDY4ZmEwNzk4N2I5YTg0OTM0Mzg5YjUyOGU0MzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyMDQwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzU3NzVlZmI5ZDBkNjhmYTA3OTg3YjlhODQ5MzQzODliNTI4ZTQzNgpAQCAtMCwwICsxIEBACis/pB/T8CHc8AljJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzY1MDE2OGRiNmZlMTE1ZmIxZTczZWVkNGI3NmNkMjI0ZDk3N2QwMSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzY1MDE2OGRiNmZlMTE1ZmIxZTczZWVkNGI3NmNkMjI0ZDk3N2QwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTUwN2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zNjUwMTY4ZGI2ZmUxMTVmYjFlNzNlZWQ0Yjc2Y2QyMjRkOTc3ZDAxCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2MpKC0nYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5R/pGzs/R+06WygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzgyMjhiZjk4Y2RiNTBmZDNmYTgzMGJhNWE5ZDRjNzM5OTA2M2RmZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzgyMjhiZjk4Y2RiNTBmZDNmYTgzMGJhNWE5ZDRjNzM5OTA2M2RmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRiNjYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zODIyOGJmOThjZGI1MGZkM2ZhODMwYmE1YTlkNGM3Mzk5MDYzZGZmCkBAIC0wLDAgKzEgQEAKKyqgpK5ACBAHOvBbKPhjCSg7/iEhXAkhY+VH/ToKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzM4NzE3YmVlOTAxMTUxYjIyYTEwYmViMTJjNjYyM2NjYzg0NGQzYzIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzM4NzE3YmVlOTAxMTUxYjIyYTEwYmViMTJjNjYyM2NjYzg0NGQzYzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0YjIyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvMzg3MTdiZWU5MDExNTFiMjJhMTBiZWIxMmM2NjIzY2NjODQ0ZDNjMgpAQCAtMCwwICsxIEBACis7Py4QB/BbKC1iaW4hCfAoIaRcCSHlR/06WyghJ/BbKCEnYwfwIQnwY1sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNhNGJiNDI3YTg1YmRjNWJmNjZhYzcxZGIwNzNjOTllMGRjOWY4ODEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNhNGJiNDI3YTg1YmRjNWJmNjZhYzcxZGIwNzNjOTllMGRjOWY4ODEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0MDBhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2E0YmI0MjdhODViZGM1YmY2NmFjNzFkYjA3M2M5OWUwZGM5Zjg4MQpAQCAtMCwwICsxIEBACiukEAfwWygnIQnwKCFcCSHlR/06KCEn8FsoISEJpB9b8CHwCWPwWyghIR8JIeVH/SHlR/0nQSkoE1soCSchIeUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNhYjQ4NjIxZDliOGYwNzUzNjkwOTlhOGVjNzUxN2JkMjNmZDZlNzAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNhYjQ4NjIxZDliOGYwNzUzNjkwOTlhOGVjNzUxN2JkMjNmZDZlNzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0M2U2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2FiNDg2MjFkOWI4ZjA3NTM2OTA5OWE4ZWM3NTE3YmQyM2ZkNmU3MApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiaW4JQSEhP6Qf2/AhEAdie/BpLShu8AkhXAkh5R/pGzs/R+0hITpbKChc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2FlYzhkOTMxMTEzMGRmYmI2NTg0ZmU2ZTYxOTU3OWMyMTk5MmI1ZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2FlYzhkOTMxMTEzMGRmYmI2NTg0ZmU2ZTYxOTU3OWMyMTk5MmI1ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDViOGIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYWVjOGQ5MzExMTMwZGZiYjY1ODRmZTZlNjE5NTc5YzIxOTkyYjVmCkBAIC0wLDAgKzEgQEAKK6QPpNvwpIMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNiMTQ4MzdmMjI5MDVkY2IwNGY5M2FlZDJhYTY5YmY5NTkyNGZiOWQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNiMTQ4MzdmMjI5MDVkY2IwNGY5M2FlZDJhYTY5YmY5NTkyNGZiOWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYWYwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2IxNDgzN2YyMjkwNWRjYjA0ZjkzYWVkMmFhNjliZjk1OTI0ZmI5ZApAQCAtMCwwICsxIEBACitmEyohKIEhIQlpW9EhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYmU2M2MxNjM4MDU5MjdlMDRmZDdmODRkOTYxMjJjNDgyNDBlNjAxIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYmU2M2MxNjM4MDU5MjdlMDRmZDdmODRkOTYxMjJjNDgyNDBlNjAxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDlhODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNiZTYzYzE2MzgwNTkyN2UwNGZkN2Y4NGQ5NjEyMmM0ODI0MGU2MDEKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LpB/KIfAJYylbJycoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYmYyZTM0OTc0N2MwZjUzOTE4MWUwZDQwODRhNWZlNTA2ODExYTllIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYmYyZTM0OTc0N2MwZjUzOTE4MWUwZDQwODRhNWZlNTA2ODExYTllCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTdhOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNiZjJlMzQ5NzQ3YzBmNTM5MTgxZTBkNDA4NGE1ZmU1MDY4MTFhOWUKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW4/8ItjWykoLSdiaW4JISE/ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYzVhZjRkNzNlOTRkMGU4YWQ1NjY2YjZhY2IzNDBmOTI5MDMxZTk1IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zYzVhZjRkNzNlOTRkMGU4YWQ1NjY2YjZhY2IzNDBmOTI5MDMxZTk1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjQ0NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNjNWFmNGQ3M2U5NGQwZThhZDU2NjZiNmFjYjM0MGY5MjkwMzFlOTUKQEAgLTAsMCArMSBAQAorpB9jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zZDJiMjUzNDZhOTY3MWQ4M2JkMDgyZDE3MGE0NWVlZDczOWJhZTZiIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zZDJiMjUzNDZhOTY3MWQ4M2JkMDgyZDE3MGE0NWVlZDczOWJhZTZiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmYxMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNkMmIyNTM0NmE5NjcxZDgzYmQwODJkMTcwYTQ1ZWVkNzM5YmFlNmIKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1uQKaQoKqQHO1soJ6TwISgtDglif25pJyEhL6QfCdvwIR8oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zZGU3Yjg2MGMzZmJhMmJjNTU3MDdmZDY4NzVkY2UyNzZmMmYyNDliIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zZGU3Yjg2MGMzZmJhMmJjNTU3MDdmZDY4NzVkY2UyNzZmMmYyNDliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODc1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzNkZTdiODYwYzNmYmEyYmM1NTcwN2ZkNjg3NWRjZTI3NmYyZjI0OWIKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1spKC0nYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5R/pGzs/R+06WygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2UyMDA0ZmY5ZjQwZTM5OGUwZjQxMTM4YTI1YThiNjZlM2Q4NDNkOSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2UyMDA0ZmY5ZjQwZTM5OGUwZjQxMTM4YTI1YThiNjZlM2Q4NDNkOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGY2YzdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zZTIwMDRmZjlmNDBlMzk4ZTBmNDExMzhhMjVhOGI2NmUzZDg0M2Q5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2Y4OTgzZTQ1NzAzM2NjODU5OTdjMzU2OTM1YmE5YzIxNDYwZTg2YiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvM2Y4OTgzZTQ1NzAzM2NjODU5OTdjMzU2OTM1YmE5YzIxNDYwZTg2YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzUwZjVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy8zZjg5ODNlNDU3MDMzY2M4NTk5N2MzNTY5MzViYTljMjE0NjBlODZiCkBAIC0wLDAgKzEgQEAKKy46pGMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQxMDU2NjkwODZkODNhMjBmOGQ5OTEwODg1NTNiYTA4MjAyNDc4Y2QgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQxMDU2NjkwODZkODNhMjBmOGQ5OTEwODg1NTNiYTA4MjAyNDc4Y2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyYWYxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDEwNTY2OTA4NmQ4M2EyMGY4ZDk5MTA4ODU1M2JhMDgyMDI0NzhjZApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpboukH9vwIWNbKSgnLWJsCSohIT+kH9viIRAH8PB7KC1iaW5cCWMhJwkhCfAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQxODA2MTkzMTZlZWY3OTEyZDFjZjUyZmZlODU4OTcyNDJlMWFlODggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQxODA2MTkzMTZlZWY3OTEyZDFjZjUyZmZlODU4OTcyNDJlMWFlODgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmYmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDE4MDYxOTMxNmVlZjc5MTJkMWNmNTJmZmU4NTg5NzI0MmUxYWU4OApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiaW4JIyE/pB/b8CEQB/B7KC1iaW7wCSFcCSHlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MjAyOTFkNzEzOWQ5MjQ2ZGU3NDc3MzlmZDk4MTAyNDM0YTc0MmRkIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MjAyOTFkNzEzOWQ5MjQ2ZGU3NDc3MzlmZDk4MTAyNDM0YTc0MmRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjZhMjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQyMDI5MWQ3MTM5ZDkyNDZkZTc0NzczOWZkOTgxMDI0MzRhNzQyZGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MjU2NDM3ZmM1ODk3YzBjZDVkNzU1ODE2ZTRlNjhjN2JlMzI2ODQ5IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MjU2NDM3ZmM1ODk3YzBjZDVkNzU1ODE2ZTRlNjhjN2JlMzI2ODQ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWJlMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQyNTY0MzdmYzU4OTdjMGNkNWQ3NTU4MTZlNGU2OGM3YmUzMjY4NDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MmIyNWE1NDEzYzUzNjQ3OGEzZTYzZGE1YWRlZjQyNTBiYWJmMmY0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MmIyNWE1NDEzYzUzNjQ3OGEzZTYzZGE1YWRlZjQyNTBiYWJmMmY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTZjYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQyYjI1YTU0MTNjNTM2NDc4YTNlNjNkYTVhZGVmNDI1MGJhYmYyZjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MmJlZjQ0YWU3NTFhNDVjNjcxZDlkYTViMTIzMWQyYWM3NDdhNDhkIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MmJlZjQ0YWU3NTFhNDVjNjcxZDlkYTViMTIzMWQyYWM3NDdhNDhkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzQ4NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQyYmVmNDRhZTc1MWE0NWM2NzFkOWRhNWIxMjMxZDJhYzc0N2E0OGQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MzhjM2M5MDQ1YzNjZjc5MTBhY2VlYzM0Zjc3YjQ3YTcwY2E0YWJkIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80MzhjM2M5MDQ1YzNjZjc5MTBhY2VlYzM0Zjc3YjQ3YTcwY2E0YWJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDBkYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQzOGMzYzkwNDVjM2NmNzkxMGFjZWVjMzRmNzdiNDdhNzBjYTRhYmQKQEAgLTAsMCArMSBAQAorEAfwWygtYmluIQnwKCEJIeVH/TpbKAghJ/BbKKQhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80M2FmOTZiNGY2NWVkMGFjZTcyMzY0MjdmMmY4ODMzYzQ4MzU5ODllIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80M2FmOTZiNGY2NWVkMGFjZTcyMzY0MjdmMmY4ODMzYzQ4MzU5ODllCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDUyYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQzYWY5NmI0ZjY1ZWQwYWNlNzIzNjQyN2YyZjg4MzNjNDgzNTk4OWUKQEAgLTAsMCArMSBAQAorpB8hg9sqpBAH8KQPLWJpbqQPpPDw2/BjYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ0YzYxMTliYjkxYTQ1MmQ2MTI4Y2UwZWEwZDYyOTM4ODAwNzc5ZWEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ0YzYxMTliYjkxYTQ1MmQ2MTI4Y2UwZWEwZDYyOTM4ODAwNzc5ZWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5NGFkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDRjNjExOWJiOTFhNDUyZDYxMjhjZTBlYTBkNjI5Mzg4MDA3NzllYQpAQCAtMCwwICsxIEBACis7PzBjISgH8EsJ8FtOIVwZIeVHIVsoISEJIeVH/UEpKCEp7SEq5UeAvv1BKSjZO4oKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ2ZDU5NTMzMTY4OWFlMDFkNzdhZmYzODc3NDdhOThmZjM0ODAwOTYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ2ZDU5NTMzMTY4OWFlMDFkNzdhZmYzODc3NDdhOThmZjM0ODAwOTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiNzYyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDZkNTk1MzMxNjg5YWUwMWQ3N2FmZjM4Nzc0N2E5OGZmMzQ4MDA5NgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ3MWEzMDdiODFkYzM3NDU5MDg3ZDQxNTMyNzQxYzVjOWQ3YmE4MzYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ3MWEzMDdiODFkYzM3NDU5MDg3ZDQxNTMyNzQxYzVjOWQ3YmE4MzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwN2ZjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDcxYTMwN2I4MWRjMzc0NTkwODdkNDE1MzI3NDFjNWM5ZDdiYTgzNgpAQCAtMCwwICsxIEBACiukDn8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ4OTAwYjRhNTU1NzUzMDkyMmNlNDVjMTVhZDBkM2IwYTMzNzUyMGQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ4OTAwYjRhNTU1NzUzMDkyMmNlNDVjMTVhZDBkM2IwYTMzNzUyMGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5ZDAzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDg5MDBiNGE1NTU3NTMwOTIyY2U0NWMxNWFkMGQzYjBhMzM3NTIwZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ4YmNjZTJjNjQ4N2IxODcwNmVmMGM2MDljYTM5YzQ1NjIxNWJhYzggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzQ4YmNjZTJjNjQ4N2IxODcwNmVmMGM2MDljYTM5YzQ1NjIxNWJhYzgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhNWExMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDhiY2NlMmM2NDg3YjE4NzA2ZWYwYzYwOWNhMzljNDU2MjE1YmFjOApAQCAtMCwwICsxIEBACiukHwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDkwMjdiYmQzZjNmM2NhZmEzMTU4NDNjOGZlODI4MGY4Njk4NTI3MyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDkwMjdiYmQzZjNmM2NhZmEzMTU4NDNjOGZlODI4MGY4Njk4NTI3MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM5MGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80OTAyN2JiZDNmM2YzY2FmYTMxNTg0M2M4ZmU4MjgwZjg2OTg1MjczCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDk5Mzc2YzVlMjkxZGEyZjljMjU5OTlhYmY0OTYwZmFiNWE5MmVjOCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNDk5Mzc2YzVlMjkxZGEyZjljMjU5OTlhYmY0OTYwZmFiNWE5MmVjOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNlYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80OTkzNzZjNWUyOTFkYTJmOWMyNTk5OWFiZjQ5NjBmYWI1YTkyZWM4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGEzYjdjZTBjZGYyMTc5NjNhMGI2OTI3NjllNWQ2ZjRiZWZlNzNiOCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGEzYjdjZTBjZGYyMTc5NjNhMGI2OTI3NjllNWQ2ZjRiZWZlNzNiOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjkzYzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80YTNiN2NlMGNkZjIxNzk2M2EwYjY5Mjc2OWU1ZDZmNGJlZmU3M2I4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGEzZmRiOTZiYzhjODBmMTk5MmYwZjcyZjk2M2Y4NDg1NmNiYWRlOCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGEzZmRiOTZiYzhjODBmMTk5MmYwZjcyZjk2M2Y4NDg1NmNiYWRlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY2YjZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80YTNmZGI5NmJjOGM4MGYxOTkyZjBmNzJmOTYzZjg0ODU2Y2JhZGU4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGFhZTgwZTA1NzkzZDdhZGI0MmE3ZTZlOGE1MjgzYjY3NzMxODc3NyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGFhZTgwZTA1NzkzZDdhZGI0MmE3ZTZlOGE1MjgzYjY3NzMxODc3NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzhiZGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80YWFlODBlMDU3OTNkN2FkYjQyYTdlNmU4YTUyODNiNjc3MzE4Nzc3CkBAIC0wLDAgKzEgQEAKKyhCpAE6P/AfYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGM3YTAzNGQzYTNiNGYyOWQ5OWNhZjAyMWEwZTliYmI4OTcwNmMyZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGM3YTAzNGQzYTNiNGYyOWQ5OWNhZjAyMWEwZTliYmI4OTcwNmMyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzhlY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80YzdhMDM0ZDNhM2I0ZjI5ZDk5Y2FmMDIxYTBlOWJiYjg5NzA2YzJlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGNlOGE0M2ZiMTdhMDc1NjI3MTYwODEyYWQyNmMyNTIxMGQ4YTgyZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNGNlOGE0M2ZiMTdhMDc1NjI3MTYwODEyYWQyNmMyNTIxMGQ4YTgyZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTNjNjFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy80Y2U4YTQzZmIxN2EwNzU2MjcxNjA4MTJhZDI2YzI1MjEwZDhhODJkCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2MpKC0nKmluCSEhP6Qf2/AhIRAH8HsoLWJpbvAJIVxIIR/l6Rs7P0ftOlsoKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUwMzJhNzVhOThjZDE0ZDRkYWI3NWMxYzVlMmNkOTgxYWJiMTlkY2YgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUwMzJhNzVhOThjZDE0ZDRkYWI3NWMxYzVlMmNkOTgxYWJiMTlkY2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhMDZhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTAzMmE3NWE5OGNkMTRkNGRhYjc1YzFjNWUyY2Q5ODFhYmIxOWRjZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUwYjNmNGI2YWVkOTdmNDQyNDk2ZDI3ZjNiNDMxNWExOGJhNzZkNWYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUwYjNmNGI2YWVkOTdmNDQyNDk2ZDI3ZjNiNDMxNWExOGJhNzZkNWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlOGY5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTBiM2Y0YjZhZWQ5N2Y0NDI0OTZkMjdmM2I0MzE1YTE4YmE3NmQ1ZgpAQCAtMCwwICsxIEBACis7Oz8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUxMDY0Yjg4YTk4NjU4ZDQ4YTBkYTdmMTU0NWMyZDEyOTNhZDk1MzggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUxMDY0Yjg4YTk4NjU4ZDQ4YTBkYTdmMTU0NWMyZDEyOTNhZDk1MzgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwOGFmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTEwNjRiODhhOTg2NThkNDhhMGRhN2YxNTQ1YzJkMTI5M2FkOTUzOApAQCAtMCwwICsxIEBACisqpBAH8KQPLWJpbqQPpNsnKD+kB/A7WygnpPAhCR8oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81MTc1MmYxMmQ1OWZhZGFhYTBkYzcyZTYzNzA2MTJiODRlZTE1NTViIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81MTc1MmYxMmQ1OWZhZGFhYTBkYzcyZTYzNzA2MTJiODRlZTE1NTViCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2MwMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUxNzUyZjEyZDU5ZmFkYWFhMGRjNzJlNjM3MDYxMmI4NGVlMTU1NWIKQEAgLTAsMCArMSBAQAorKqCkrkAIEAc68Fso+GMJKDv+ISFcJyFj5Uf9OgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTFlZmY2ZmNiZmUxYTUxY2ViM2Y1ZjIxNDBjMDFlZWE4OWI0MzEzZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTFlZmY2ZmNiZmUxYTUxY2ViM2Y1ZjIxNDBjMDFlZWE4OWI0MzEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxMThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81MWVmZjZmY2JmZTFhNTFjZWIzZjVmMjE0MGMwMWVlYTg5YjQzMTNkCkBAIC0wLDAgKzEgQEAKK6QfpNvw8INjYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUxZjY1ZjY4MWNmM2ExMjE4ZDgzYWQ1ODY0MmMwNmRlYWVhODYyMTAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUxZjY1ZjY4MWNmM2ExMjE4ZDgzYWQ1ODY0MmMwNmRlYWVhODYyMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzNjkyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTFmNjVmNjgxY2YzYTEyMThkODNhZDU4NjQyYzA2ZGVhZWE4NjIxMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUyMTgwOTkwM2QzNmRiODBiMWNjZDcwN2YzNTQzNjFmMmJmMDUwNzUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUyMTgwOTkwM2QzNmRiODBiMWNjZDcwN2YzNTQzNjFmMmJmMDUwNzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NThlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTIxODA5OTAzZDM2ZGI4MGIxY2NkNzA3ZjM1NDM2MWYyYmYwNTA3NQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUyZmU4ZjBlMWZhMjcwZWExNmY2NmM5M2YyZmZhYjI2NWNlMDU5ZTggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUyZmU4ZjBlMWZhMjcwZWExNmY2NmM5M2YyZmZhYjI2NWNlMDU5ZTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlYzVkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTJmZThmMGUxZmEyNzBlYTE2ZjY2YzkzZjJmZmFiMjY1Y2UwNTllOApAQCAtMCwwICsxIEBACis7PydjB/BbKCEJ8FtOIVwJYuUzR/0hKighIQlC5Uf9QSkoISntIWQqKeVH/UkpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUzZGU4N2FlOTRhY2RjOGU1OGEzNjk0NTljMTJhMzI0MGYxMjk0ZmUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzUzZGU4N2FlOTRhY2RjOGU1OGEzNjk0NTljMTJhMzI0MGYxMjk0ZmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhZGE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTNkZTg3YWU5NGFjZGM4ZTU4YTM2OTQ1OWMxMmEzMjQwZjEyOTRmZQpAQCAtMCwwICsxIEBACis/KqCkrkAIEPA6B1sG+GMJKDv+ISFc8Akhfgkf2+VH/SHwY206JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTRhMmIzOTkzYzM0ODM3NDVmNjMxNGM4NzBhMDM4YThlNThmOTdhNyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTRhMmIzOTkzYzM0ODM3NDVmNjMxNGM4NzBhMDM4YThlNThmOTdhNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzljODEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81NGEyYjM5OTNjMzQ4Mzc0NWY2MzE0Yzg3MGEwMzhhOGU1OGY5N2E3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTVkNjBjMmU1MDQwYTM4YmU4Y2E0MWRlNjNlMTM3ZTNmZWY4OTJhNCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTVkNjBjMmU1MDQwYTM4YmU4Y2E0MWRlNjNlMTM3ZTNmZWY4OTJhNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ3MjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81NWQ2MGMyZTUwNDBhMzhiZThjYTQxZGU2M2UxMzdlM2ZlZjg5MmE0CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKCopP6CkrkAIEAc6ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81NjUzYzQ0YTViNTIwYmRmMmJkYzU5OWI3OTY2ZjFkN2M0NDk1MGIzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81NjUzYzQ0YTViNTIwYmRmMmJkYzU5OWI3OTY2ZjFkN2M0NDk1MGIzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2YxYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU2NTNjNDRhNWI1MjBiZGYyYmRjNTk5Yjc5NjZmMWQ3YzQ0OTUwYjMKQEAgLTAsMCArMSBAQAorpH8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU4MzhiNWE2ODMyMjllYmI2ZTYyNzdlMjgxMDg2M2U2NDJiOGFmYzIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU4MzhiNWE2ODMyMjllYmI2ZTYyNzdlMjgxMDg2M2U2NDJiOGFmYzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmYzU5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTgzOGI1YTY4MzIyOWViYjZlNjI3N2UyODEwODYzZTY0MmI4YWZjMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU4OGQyMjU3ODQ4OTFhYzg4ZTMwYWM2ZWI1NjUxZDYzZmFjMzQwODMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU4OGQyMjU3ODQ4OTFhYzg4ZTMwYWM2ZWI1NjUxZDYzZmFjMzQwODMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjMWRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNTg4ZDIyNTc4NDg5MWFjODhlMzBhYzZlYjU2NTFkNjNmYWMzNDA4MwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpboshY1spKC0nYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5R/pGzs/R+06WygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNThkNTFjMjFhMjBiNjU0OTU2N2EwYWI4ZmVlMjlkMTYyZGQzZmM1YSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNThkNTFjMjFhMjBiNjU0OTU2N2EwYWI4ZmVlMjlkMTYyZGQzZmM1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2UxMTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81OGQ1MWMyMWEyMGI2NTQ5NTY3YTBhYjhmZWUyOWQxNjJkZDNmYzVhCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKSg7LScnYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5R/pGzs6P+3lWygoITshXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU4ZjEwMzZkOGZmODU1ODQxZWMyNWIzYzMzZTg1YThmZWMwZDk0YjcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzU4ZjEwMzZkOGZmODU1ODQxZWMyNWIzYzMzZTg1YThmZWMwZDk0YjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjNDE2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNThmMTAzNmQ4ZmY4NTU4NDFlYzI1YjNjMzNlODVhOGZlYzBkOTRiNwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWyktJ2JpbgkxIT+kH9vwITsnEAcq8HsoLWJpbvAJIVwJIeUf6Rs7P0ftOlsoKCEhTPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzVhOTlkZjQyZmI3YmJhZmEyZDU1NzE0ZWUyMzViMWM0Njc3NmIyYWQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzVhOTlkZjQyZmI3YmJhZmEyZDU1NzE0ZWUyMzViMWM0Njc3NmIyYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YzA2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWE5OWRmNDJmYjdiYmFmYTJkNTU3MTRlZTIzNWIxYzQ2Nzc2YjJhZApAQCAtMCwwICsxIEBACiukH1vwIfAJYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzViNDI3OTM1NTA2OTliMmMwMTViZWQ2NzdjZmNkZGMwNTJmNzM1MTMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzViNDI3OTM1NTA2OTliMmMwMTViZWQ2NzdjZmNkZGMwNTJmNzM1MTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0ZTY4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWI0Mjc5MzU1MDY5OWIyYzAxNWJlZDY3N2NmY2RkYzA1MmY3MzUxMwpAQCAtMCwwICsxIEBACiukcIPb8PCkHyGD2/Ap8GMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzViOGNhNzJiYTAwMjMxYzM4YjE5ZjU4MjEyN2U2YTE0NmViYTQyODIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzViOGNhNzJiYTAwMjMxYzM4YjE5ZjU4MjEyN2U2YTE0NmViYTQyODIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0OWQxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWI4Y2E3MmJhMDAyMzFjMzhiMTlmNTgyMTI3ZTZhMTQ2ZWJhNDI4MgpAQCAtMCwwICsxIEBACis7PydjB/BbKCEJ8FtOIVwJIeVH/SEqKCEJIdTlR/1BKSghKe0hvCop5Uf9SSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWJhYTEzZGM5NWRhMDVlN2JhMDJiYmU5NTgzZWEyNDUxN2EyOWExYSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWJhYTEzZGM5NWRhMDVlN2JhMDJiYmU5NTgzZWEyNDUxN2EyOWExYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjVhODg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81YmFhMTNkYzk1ZGEwNWU3YmEwMmJiZTk1ODNlYTI0NTE3YTI5YTFhCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui6TwW2MnISmkEGJpFwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWJhYjYxZWI1MzE3NjQ0OWUyNWMyYzgyZjE3MmI4MmNiMTNmZmI5ZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWJhYjYxZWI1MzE3NjQ0OWUyNWMyYzgyZjE3MmI4MmNiMTNmZmI5ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc1OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81YmFiNjFlYjUzMTc2NDQ5ZTI1YzJjODJmMTcyYjgyY2IxM2ZmYjlkCkBAIC0wLDAgKzEgQEAKKz8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzVjNmY2YjZmN2YzZTdiNDM1ZjA2MGFiYjczYzIwZDJiNzczYTdmNTYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzVjNmY2YjZmN2YzZTdiNDM1ZjA2MGFiYjczYzIwZDJiNzczYTdmNTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMzE1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWM2ZjZiNmY3ZjNlN2I0MzVmMDYwYWJiNzNjMjBkMmI3NzNhN2Y1NgpAQCAtMCwwICsxIEBACis7PzBjISgH8EsJ8FtOIVwZIeVHIVsoISEJIeVH/UEpKCEp7SEq5UeAvkEpKNk7igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWM5ZmQ5Y2M3MTAwZmVhZWVhZDFlMGU0NTIwMTk0NWE2ZTc2ZmQ4NSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWM5ZmQ5Y2M3MTAwZmVhZWVhZDFlMGU0NTIwMTk0NWE2ZTc2ZmQ4NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzg0ODFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81YzlmZDljYzcxMDBmZWFlZWFkMWUwZTQ1MjAxOTQ1YTZlNzZmZDg1CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWZmNDljOWVkYzczNjE3OTdhOTUxNTg1ZjNlMTgwMjIyYzhkZDk1ZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNWZmNDljOWVkYzczNjE3OTdhOTUxNTg1ZjNlMTgwMjIyYzhkZDk1ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNlNWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy81ZmY0OWM5ZWRjNzM2MTc5N2E5NTE1ODVmM2UxODAyMjJjOGRkOTVkCkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQBzrwWyj4YwkoO/4hIVzwCSFjCR/l20f9IfBjbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82MTI5OTU0OTQyZTI2YzJhOWVjMDcxYjY2NTk2NzU3NDU2MTNjZjNjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82MTI5OTU0OTQyZTI2YzJhOWVjMDcxYjY2NTk2NzU3NDU2MTNjZjNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTUzOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzYxMjk5NTQ5NDJlMjZjMmE5ZWMwNzFiNjY1OTY3NTc0NTYxM2NmM2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82MWZhNjliNmI1MWIwZWQ5MTkxNGZlNDg3NzkxNzNmOGQyNmExZDU0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82MWZhNjliNmI1MWIwZWQ5MTkxNGZlNDg3NzkxNzNmOGQyNmExZDU0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTlkNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzYxZmE2OWI2YjUxYjBlZDkxOTE0ZmU0ODc3OTE3M2Y4ZDI2YTFkNTQKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1spKC0nYmluCTshIT+kH9vwIRAH8HsoLWJpbvAJIVwJIeUf6Rs7P0ftWygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjM2MmFjNjFjZmI2ZTk2NGFmZjc4ZjNjZDY0ODQ3NWRmZDVmZDRlOSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjM2MmFjNjFjZmI2ZTk2NGFmZjc4ZjNjZDY0ODQ3NWRmZDVmZDRlOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFmNTRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82MzYyYWM2MWNmYjZlOTY0YWZmNzhmM2NkNjQ4NDc1ZGZkNWZkNGU5CkBAIC0wLDAgKzEgQEAKKzs/J2MH8FsoIQnwW04hXAli5TNH/SEqKCEhCULlR/1BKSghKe0hvCop5Uf9SSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjQ0ZGViYTUxYzc5YjZlYmQ0NzBiZDQzNjc0NTI5NDEwNDVkMTEyYSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjQ0ZGViYTUxYzc5YjZlYmQ0NzBiZDQzNjc0NTI5NDEwNDVkMTEyYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU3MzMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NDRkZWJhNTFjNzliNmViZDQ3MGJkNDM2NzQ1Mjk0MTA0NWQxMTJhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjRiZWFlOThlMjI3Njc0OWIxMzNlNjM2OGM5ZTBmMTlhNzllYmE5NiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjRiZWFlOThlMjI3Njc0OWIxMzNlNjM2OGM5ZTBmMTlhNzllYmE5NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWE3YjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NGJlYWU5OGUyMjc2NzQ5YjEzM2U2MzY4YzllMGYxOWE3OWViYTk2CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKaQoLQ4JYn9uaSchIS+kH9vwIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjRkN2FkZDkxOTIzMDFmZDg3ODg1NGRjOTZmOWZhOTA1M2YwMzk5MiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjRkN2FkZDkxOTIzMDFmZDg3ODg1NGRjOTZmOWZhOTA1M2YwMzk5MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjAzZWIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NGQ3YWRkOTE5MjMwMWZkODc4ODU0ZGM5NmY5ZmE5MDUzZjAzOTkyCkBAIC0wLDAgKzEgQEAKK6QfIYPb8PBjYydfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NTU2NmRmNjVlOGY1NTQyOGI2NjcyY2MzNTFkZjQxNGZhOGY5MzZjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NTU2NmRmNjVlOGY1NTQyOGI2NjcyY2MzNTFkZjQxNGZhOGY5MzZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzNlOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY1NTY2ZGY2NWU4ZjU1NDI4YjY2NzJjYzM1MWRmNDE0ZmE4ZjkzNmMKQEAgLTAsMCArMSBAQAorJ/BbKCEhCfBbKCEhCSHlR/0h5Uf9QSkoISntIbwp2To7h4oqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NWJiNzAzYWYzNWQ1YWZiODI0Y2Q2OGM0MWQ3YTFhZWIzODQ4ZDM1IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NWJiNzAzYWYzNWQ1YWZiODI0Y2Q2OGM0MWQ3YTFhZWIzODQ4ZDM1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzQyOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY1YmI3MDNhZjM1ZDVhZmI4MjRjZDY4YzQxZDdhMWFlYjM4NDhkMzUKQEAgLTAsMCArMSBAQAorW/Ah8AknKCFbKCEhCSHlR/0h5Uf9QSkoISntIbwp2To7h4oqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NmM1MzdiZjU5Y2IzNjY3YzAzN2IzNTE3YmUzZDMxMjQ1YzlkYThhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NmM1MzdiZjU5Y2IzNjY3YzAzN2IzNTE3YmUzZDMxMjQ1YzlkYThhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2YzZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY2YzUzN2JmNTljYjM2NjdjMDM3YjM1MTdiZTNkMzEyNDVjOWRhOGEKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1spKC0nYmluKSMhP6Qf2/AhEAfweygtYmlu8AkhXCHlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NmY1NzZiYWViMGM5NDM1YTU2ZWI3Mzc1ZGFkYzViNWQ2MzBlZDg3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82NmY1NzZiYWViMGM5NDM1YTU2ZWI3Mzc1ZGFkYzViNWQ2MzBlZDg3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YThjYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY2ZjU3NmJhZWIwYzk0MzVhNTZlYjczNzVkYWRjNWI1ZDYzMGVkODcKQEAgLTAsMCArMSBAQAorPyqgpK5QCBAHroCkiDrwWwb4Ywk4O/4hIVzwCSF+KAkf20RH/SHwbWM6YycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY3YjRjZWM1MTgzNjU5YWVhZTBmNWJjNzFiM2FkZjA1NDJhMTE4MjggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY3YjRjZWM1MTgzNjU5YWVhZTBmNWJjNzFiM2FkZjA1NDJhMTE4MjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkN2E5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjdiNGNlYzUxODM2NTlhZWFlMGY1YmM3MWIzYWRmMDU0MmExMTgyOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY4Yzk0NzIxZWRhMmY2MjQ4MWJmZjlmMWQxODNkZjcwNDk4ZDBjNWIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY4Yzk0NzIxZWRhMmY2MjQ4MWJmZjlmMWQxODNkZjcwNDk4ZDBjNWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlOGY2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjhjOTQ3MjFlZGEyZjYyNDgxYmZmOWYxZDE4M2RmNzA0OThkMGM1YgpAQCAtMCwwICsxIEBACiukpBAH8KQPLWIhboukLVtjJyEppBBiaQcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY4ZWU4MTY5YTY1ZDU4ZWRiOWZjMWM3NTJlYTgxZGZlYzM4MzIwM2MgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzY4ZWU4MTY5YTY1ZDU4ZWRiOWZjMWM3NTJlYTgxZGZlYzM4MzIwM2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiNmUyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNjhlZTgxNjlhNjVkNThlZGI5ZmMxYzc1MmVhODFkZmVjMzgzMjAzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzZiMjAzZDQ5YmJiYTZlZTc0ZGVmMGQzNWMyMjY2ZTA2YWQzYzQ1ZDkgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzZiMjAzZDQ5YmJiYTZlZTc0ZGVmMGQzNWMyMjY2ZTA2YWQzYzQ1ZDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1NDBhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNmIyMDNkNDliYmJhNmVlNzRkZWYwZDM1YzIyNjZlMDZhZDNjNDVkOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzZkNTgwZjI4ZDc4NWMwYmY4N2FjMzUxYTMxYTg5Mjg5NDQ5ZmVhZGIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzZkNTgwZjI4ZDc4NWMwYmY4N2FjMzUxYTMxYTg5Mjg5NDQ5ZmVhZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjOThhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNmQ1ODBmMjhkNzg1YzBiZjg3YWMzNTFhMzFhODkyODk0NDlmZWFkYgpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWymoLS4nYmkqCSEhKD+kH9sh8CEQBzrwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82ZjIzMWRlYzc1OWViMjEwNWUwOTI2M2Q1M2UxNzFkZTE5YTkyYzc0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy82ZjIzMWRlYzc1OWViMjEwNWUwOTI2M2Q1M2UxNzFkZTE5YTkyYzc0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjk1NWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzZmMjMxZGVjNzU5ZWIyMTA1ZTA5MjYzZDUzZTE3MWRlMTlhOTJjNzQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83MGZmNjYyMWEwOWU0ZjY0MTUzOGNiMWIyN2U4YjM4MmIyZjU2YTk0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83MGZmNjYyMWEwOWU0ZjY0MTUzOGNiMWIyN2U4YjM4MmIyZjU2YTk0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjM2M0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzcwZmY2NjIxYTA5ZTRmNjQxNTM4Y2IxYjI3ZThiMzgyYjJmNTZhOTQKQEAgLTAsMCArMSBAQAorpB8hg9sqpBAH8KQPLWJpbqQPpvDw2/BjYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzcxOTgxYjU1ZjI3YTFlYjYyNzRlZGEyNDcwNDhmYTJjNTk3ZjUwMDQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzcxOTgxYjU1ZjI3YTFlYjYyNzRlZGEyNDcwNDhmYTJjNTk3ZjUwMDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3YjJhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzE5ODFiNTVmMjdhMWViNjI3NGVkYTI0NzA0OGZhMmM1OTdmNTAwNApAQCAtMCwwICsxIEBACis7PydjB/BbKCEJ8FtOIVwJIeVH/SEqKCEJIeVH/UEpKCEh7SG8KCop5Uf9SSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzFjMmIwYmViZjdmMGU5MTZlNGFiN2ViMzZkNDdjY2NhMmI5MTAxYyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzFjMmIwYmViZjdmMGU5MTZlNGFiN2ViMzZkNDdjY2NhMmI5MTAxYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc4Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83MWMyYjBiZWJmN2YwZTkxNmU0YWI3ZWIzNmQ0N2NjY2EyYjkxMDFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzQ2MTBlMjc4YTViOTBhYTEyY2UxYmVhZjIyMmM0MzA2YjAyZWQ0MyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzQ2MTBlMjc4YTViOTBhYTEyY2UxYmVhZjIyMmM0MzA2YjAyZWQ0MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODdmMjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83NDYxMGUyNzhhNWI5MGFhMTJjZTFiZWFmMjIyYzQzMDZiMDJlZDQzCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbaaQoLQcOfydiaW4JISE/pB/b8CEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc0OGVlOTgxN2ViYTU2ZWM5OTM4NjAxYTBlMzgwYzc0YmFkNDU2M2YgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc0OGVlOTgxN2ViYTU2ZWM5OTM4NjAxYTBlMzgwYzc0YmFkNDU2M2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhN2M2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzQ4ZWU5ODE3ZWJhNTZlYzk5Mzg2MDFhMGUzODBjNzRiYWQ0NTYzZgpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoJy1iaW4JISE/pB/b8CEQB/B7KC1iaVxuIQkhCfDlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83NzI3ZTNlZWIyYTQ4YzQ2YmY1YTY3OGMzMDBmZjhhMzhiOGZmZTNhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83NzI3ZTNlZWIyYTQ4YzQ2YmY1YTY3OGMzMDBmZjhhMzhiOGZmZTNhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2M1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc3MjdlM2VlYjJhNDhjNDZiZjVhNjc4YzMwMGZmOGEzOGI4ZmZlM2EKQEAgLTAsMCArMSBAQAorPyqgpK5QCBAHroCkiDrwWwb4Ywk4O/4hIVzwCSF+KAkf20RH/SHwY21jOmMnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83ODE3NmQ4MGMxZDc0YzRiMWI4MjBkMzg2YWU0ODNhYzRkMWQ5MmI3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83ODE3NmQ4MGMxZDc0YzRiMWI4MjBkMzg2YWU0ODNhYzRkMWQ5MmI3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZGM4NWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc4MTc2ZDgwYzFkNzRjNGIxYjgyMGQzODZhZTQ4M2FjNGQxZDkyYjcKQEAgLTAsMCArMSBAQAorKD+kH5vwIQljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83ODlhYmI1NzE1NjNhNjc5NTIyMDA0NmY3NmI3Y2YwYWRlOTA3NDNjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83ODlhYmI1NzE1NjNhNjc5NTIyMDA0NmY3NmI3Y2YwYWRlOTA3NDNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDFjNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc4OWFiYjU3MTU2M2E2Nzk1MjIwMDQ2Zjc2YjdjZjBhZGU5MDc0M2MKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1spKC0uJ2JpbgkhIT+kH9vwIRAHOvAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc4ZjVmZjQwZTU1NTRhYTljMzFiNDVmNzlhN2FlOTY5OWY5M2U3ZmQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzc4ZjVmZjQwZTU1NTRhYTljMzFiNDVmNzlhN2FlOTY5OWY5M2U3ZmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkNDM5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvNzhmNWZmNDBlNTU1NGFhOWMzMWI0NWY3OWE3YWU5Njk5ZjkzZTdmZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzdhMjhmYzJlOWM3MmQ1MWQyOWU4N2VlZDYzZWQ0MDVjOTc3OWI1ZTEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzdhMjhmYzJlOWM3MmQ1MWQyOWU4N2VlZDYzZWQ0MDVjOTc3OWI1ZTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1Njk1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2EyOGZjMmU5YzcyZDUxZDI5ZTg3ZWVkNjNlZDQwNWM5Nzc5YjVlMQpAQCAtMCwwICsxIEBACiukD6Tb8PCDgGNjJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2E0MjA4M2JlMjFkY2U3Zjk2ZWRlZjFmM2IzYjJmZWEwYmNhZWIzZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2E0MjA4M2JlMjFkY2U3Zjk2ZWRlZjFmM2IzYjJmZWEwYmNhZWIzZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JhN2FhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83YTQyMDgzYmUyMWRjZTdmOTZlZGVmMWYzYjNiMmZlYTBiY2FlYjNmCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKSgtJ2JpbgmrIT+kH9vwITsQByrweygtYmlu8AkhXAkh5R/pGzs/R+06WygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2E1MTI3NWIxMWVjYjFlZmVjOTI1MTM5MDUzMTY4MWM4ZDZmMjQ4MSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2E1MTI3NWIxMWVjYjFlZmVjOTI1MTM5MDUzMTY4MWM4ZDZmMjQ4MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTI5Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83YTUxMjc1YjExZWNiMWVmZWM5MjUxMzkwNTMxNjgxYzhkNmYyNDgxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2I5NjgyY2Q3YTM5ODQ2OThmNmVhYzAzNGM1OWMwZjkxYjRmYjgzZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2I5NjgyY2Q3YTM5ODQ2OThmNmVhYzAzNGM1OWMwZjkxYjRmYjgzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjQxM2JlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83Yjk2ODJjZDdhMzk4NDY5OGY2ZWFjMDM0YzU5YzBmOTFiNGZiODNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2JhNzIzOWEyOWQ2MTgzOTYwZTM5ODZhYmM4ZjE5Y2ZiNTQ4YjkwNSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2JhNzIzOWEyOWQ2MTgzOTYwZTM5ODZhYmM4ZjE5Y2ZiNTQ4YjkwNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg1YTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy83YmE3MjM5YTI5ZDYxODM5NjBlMzk4NmFiYzhmMTljZmI1NDhiOTA1CkBAIC0wLDAgKzEgQEAKK6QfIYPb8PBjYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzdkM2IzZDVmMjNkMGVkZTlmN2U1ZGJkMTExNWRiNThjOGE1NGEyMTMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzdkM2IzZDVmMjNkMGVkZTlmN2U1ZGJkMTExNWRiNThjOGE1NGEyMTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxYTE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvN2QzYjNkNWYyM2QwZWRlOWY3ZTVkYmQxMTE1ZGI1OGM4YTU0YTIxMwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWymoLSdiaW4JJyEhP6Tb8CEQB/B7Oz8wYyEoLWIoaW7wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84MDM1YzgxYzk1ZGVkZmMyN2MzNjQ5MDY0Zjk4ZjQ5ZTNlNzJjMjFmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84MDM1YzgxYzk1ZGVkZmMyN2MzNjQ5MDY0Zjk4ZjQ5ZTNlNzJjMjFmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzdkZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwMzVjODFjOTVkZWRmYzI3YzM2NDkwNjRmOThmNDllM2U3MmMyMWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84MDRlMTA1Mjg0MmNlNGQ0NGI5Yzc3NWFkZTJiMThmY2I4Y2U3YmNmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84MDRlMTA1Mjg0MmNlNGQ0NGI5Yzc3NWFkZTJiMThmY2I4Y2U3YmNmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTYwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNGUxMDUyODQyY2U0ZDQ0YjljNzc1YWRlMmIxOGZjYjhjZTdiY2YKQEAgLTAsMCArMSBAQAorpKQQB/CkHy1iaW6LpC1bYychKaYQYmkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNTE0Yjg1OTMzZWE5YmRkMzQ2MjU5NWY5NDljNWFmMjQ0MDliODcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNTE0Yjg1OTMzZWE5YmRkMzQ2MjU5NWY5NDljNWFmMjQ0MDliODcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMDMzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODA1MTRiODU5MzNlYTliZGQzNDYyNTk1Zjk0OWM1YWYyNDQwOWI4NwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWymkJw8oraTb8CfwKINjaW4JISEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNTdjMzJiOGJkMjhhNWVjMjEwNWQ2MmYyYWJlOGNmNjljOWY1ZmMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNTdjMzJiOGJkMjhhNWVjMjEwNWQ2MmYyYWJlOGNmNjljOWY1ZmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4NDM1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODA1N2MzMmI4YmQyOGE1ZWMyMTA1ZDYyZjJhYmU4Y2Y2OWM5ZjVmYwpAQCAtMCwwICsxIEBACitmEyEoISFjJwlpW9Eh8FsoISEJ8FsoISEJIeVI/SFbKCEhCSHlR/3lQSkoISntIbwqKeVH/UEpKNkhKYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNmEzYmQ0ZTA3OGQ5MWFkZWFjZWRmZDNlNDdlZjhhZTIyOTI0NGEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwNmEzYmQ0ZTA3OGQ5MWFkZWFjZWRmZDNlNDdlZjhhZTIyOTI0NGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2MGUwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODA2YTNiZDRlMDc4ZDkxYWRlYWNlZGZkM2U0N2VmOGFlMjI5MjQ0YQpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWyk6pA8oLaTb8CfwYoNjaW4JISEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwOTA0NDRmOTgyMThlNjVmZjk1OTQ3ODlmZjIyYmJlYTNjMDQ5N2MgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwOTA0NDRmOTgyMThlNjVmZjk1OTQ3ODlmZjIyYmJlYTNjMDQ5N2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2NjNhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODA5MDQ0NGY5ODIxOGU2NWZmOTU5NDc4OWZmMjJiYmVhM2MwNDk3YwpAQCAtMCwwICsxIEBACivVH/Bjqgnb8CcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwZTUxNjY5Mjk1NWQ1ZjIyNDcwNmYyNjhlMjQ3ODU4ODU4ZTE2ZDggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgwZTUxNjY5Mjk1NWQ1ZjIyNDcwNmYyNjhlMjQ3ODU4ODU4ZTE2ZDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyMzQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODBlNTE2NjkyOTU1ZDVmMjI0NzA2ZjI2OGUyNDc4NTg4NThlMTZkOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgxMGExMzcyZmE5NzM4MDI2NWY1NTI5YzUwNDNhZTk2ZjAwN2Y1YmIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgxMGExMzcyZmE5NzM4MDI2NWY1NTI5YzUwNDNhZTk2ZjAwN2Y1YmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhM2FlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODEwYTEzNzJmYTk3MzgwMjY1ZjU1MjljNTA0M2FlOTZmMDA3ZjViYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgxMjc1OTdkM2MxNDZiMmE4OTU3OWU0NGRhZWY5ZDAzYTBmOTQxZWMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgxMjc1OTdkM2MxNDZiMmE4OTU3OWU0NGRhZWY5ZDAzYTBmOTQxZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3MDM1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODEyNzU5N2QzYzE0NmIyYTg5NTc5ZTQ0ZGFlZjlkMDNhMGY5NDFlYwpAQCAtMCwwICsxIEBACisqQK6koAgQBzrwWyj4YwkoO/4hIVwJIWPlpEf9On8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgyZWQ1NzFmODkyMmNhYTU3MmQxM2I0Y2M5YjVjNWZhYmFmYWFkZTkgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgyZWQ1NzFmODkyMmNhYTU3MmQxM2I0Y2M5YjVjNWZhYmFmYWFkZTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiOTU5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODJlZDU3MWY4OTIyY2FhNTcyZDEzYjRjYzliNWM1ZmFiYWZhYWRlOQpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiaW4JISE/pCEf8NsQB/B7KPZi6W7wCSEJXCHlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84MzI4ZTg2MTc4ODAwZjg3YTNiZjZmODA3NDk5ODRmNDViMGNkMGU4IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84MzI4ZTg2MTc4ODAwZjg3YTNiZjZmODA3NDk5ODRmNDViMGNkMGU4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzgzMjhlODYxNzg4MDBmODdhM2JmNmY4MDc0OTk4NGY0NWIwY2QwZTgKQEAgLTAsMCArMSBAQAorKD8qpCEH8KQPaGVtZYOkBycHKCek8CFjCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODQ0NDFlZmQ3ZDhiZGIwY2UyZmFjMjhmMjE4ZDNkNWQ0ZDc3ZjFkNCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODQ0NDFlZmQ3ZDhiZGIwY2UyZmFjMjhmMjE4ZDNkNWQ0ZDc3ZjFkNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFiODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84NDQ0MWVmZDdkOGJkYjBjZTJmYWMyOGYyMThkM2Q1ZDRkNzdmMWQ0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODRjYmY3MGY0NWE2NGQ1YTAxZDFjOTYzNjdiNmQ2MTYwMTM0ZjFhZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODRjYmY3MGY0NWE2NGQ1YTAxZDFjOTYzNjdiNmQ2MTYwMTM0ZjFhZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWY0YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84NGNiZjcwZjQ1YTY0ZDVhMDFkMWM5NjM2N2I2ZDYxNjAxMzRmMWFkCkBAIC0wLDAgKzEgQEAKKzs/MGMhKAfwSwnwW04hXBkh9UchWyghIQkh5Uf9QSkoISntISrlR4C+/UEpKNkrKYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg1ZWIwZjQ1MDJhNTFlNjQ2ZGFiNGFlMDhlYWJkOTA2MTNjZGY4ZTEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg1ZWIwZjQ1MDJhNTFlNjQ2ZGFiNGFlMDhlYWJkOTA2MTNjZGY4ZTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkZTUyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODVlYjBmNDUwMmE1MWU2NDZkYWI0YWUwOGVhYmQ5MDYxM2NkZjhlMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg2MDgwZjMzZTRlYWUyMWIzNzg2M2MyNTNjZTYxZWFhMTMwMjFhOTcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg2MDgwZjMzZTRlYWUyMWIzNzg2M2MyNTNjZTYxZWFhMTMwMjFhOTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1YzdhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODYwODBmMzNlNGVhZTIxYjM3ODYzYzI1M2NlNjFlYWExMzAyMWE5NwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg2MmUzY2NmNjAxZWUwZjdmYmQ4YjIzZTY4MTFmZDUwNDg1YTExOGYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg2MmUzY2NmNjAxZWUwZjdmYmQ4YjIzZTY4MTFmZDUwNDg1YTExOGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlNzIyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODYyZTNjY2Y2MDFlZTBmN2ZiZDhiMjNlNjgxMWZkNTA0ODVhMTE4ZgpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiaW4JISE/Tx/b8CEQB/B7KC1iCVxuaSHwCSHlH+kbOz9H7VsoKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg2YmFlMDU5YjE4YWY4YWUyNjNlNWFlMDAyMmI2N2RhMGNmYzBmYmUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg2YmFlMDU5YjE4YWY4YWUyNjNlNWFlMDAyMmI2N2RhMGNmYzBmYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4ZjJhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODZiYWUwNTliMThhZjhhZTI2M2U1YWUwMDIyYjY3ZGEwY2ZjMGZiZQpAQCAtMCwwICsxIEBACiuk/wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODcwZjljYzRiZDg5YzZjMDRjNmE1MWNlYWUxZWZhODYzNDYyN2NkNiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODcwZjljYzRiZDg5YzZjMDRjNmE1MWNlYWUxZWZhODYzNDYyN2NkNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM1Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84NzBmOWNjNGJkODljNmMwNGM2YTUxY2VhZTFlZmE4NjM0NjI3Y2Q2CkBAIC0wLDAgKzEgQEAKKz8qrkAIOlsHEPAG+GMJKCEhXP478AEhfgkf2+VH/SHQYW06JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODc2MmE1MjNjZGI3OGQyMzQ0ZDU1M2ZhNTJhMjI5YmQ2M2M0NGU1MSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvODc2MmE1MjNjZGI3OGQyMzQ0ZDU1M2ZhNTJhMjI5YmQ2M2M0NGU1MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJmMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84NzYyYTUyM2NkYjc4ZDIzNDRkNTUzZmE1MmEyMjliZDYzYzQ0ZTUxCkBAIC0wLDAgKzEgQEAKKx+kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84OTQyMTE1NzFmOTE1M2MzYzJlYTQxMDI1NDFkYWM2OWJlOGFhYTljIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84OTQyMTE1NzFmOTE1M2MzYzJlYTQxMDI1NDFkYWM2OWJlOGFhYTljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDAzZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg5NDIxMTU3MWY5MTUzYzNjMmVhNDEwMjU0MWRhYzY5YmU4YWFhOWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84OTRlOWI3ODMyYzUyYWNiMDRiZmE5OTRlZjUzYzcxMDVkOGRiMjA2IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84OTRlOWI3ODMyYzUyYWNiMDRiZmE5OTRlZjUzYzcxMDVkOGRiMjA2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOGJmYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzg5NGU5Yjc4MzJjNTJhY2IwNGJmYTk5NGVmNTNjNzEwNWQ4ZGIyMDYKQEAgLTAsMCArMSBAQAorPyquQAg6WwcQ8Ab4YwkoISFc/jvwASF+CR/b5Uf9IdBhbScKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhiMGUxMjk3OGI4ZTJlZWNmNjIzNDZlNDM4ZTQ3ZDA5OTM4NDU2OTMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhiMGUxMjk3OGI4ZTJlZWNmNjIzNDZlNDM4ZTQ3ZDA5OTM4NDU2OTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiNTkyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOGIwZTEyOTc4YjhlMmVlY2Y2MjM0NmU0MzhlNDdkMDk5Mzg0NTY5MwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoID+kLSdiaW4JISE/pDoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhiM2ZhMGJkNGYyODllZmY2YTA0YTUyMDVlMDRiYWFlYWZiZGY2MzcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhiM2ZhMGJkNGYyODllZmY2YTA0YTUyMDVlMDRiYWFlYWZiZGY2MzcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczZGFhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOGIzZmEwYmQ0ZjI4OWVmZjZhMDRhNTIwNWUwNGJhYWVhZmJkZjYzNwpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbosoKVtjLSdiaW4JISE/pB/b8CEQB/B7KC1iaW7wCSFcCSHlH+kbOz9H7TpbKCgjIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZDFkZWVkZDFlNDYzZjhjOTUxMjlhNmY4MzljMzgwYTdjODNhYjA0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZDFkZWVkZDFlNDYzZjhjOTUxMjlhNmY4MzljMzgwYTdjODNhYjA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTQzYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhkMWRlZWRkMWU0NjNmOGM5NTEyOWE2ZjgzOWMzODBhN2M4M2FiMDQKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LYypbKaQPKC2k2/An8GKDY2luCSEhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZDFlMDI5YmQ3MjM4MWUzODJjODdlNjFiNGM1YTk3NDFkODBkNjQ0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZDFlMDI5YmQ3MjM4MWUzODJjODdlNjFiNGM1YTk3NDFkODBkNjQ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTFmM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhkMWUwMjliZDcyMzgxZTM4MmM4N2U2MWI0YzVhOTc0MWQ4MGQ2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZGQxOTgzODg5YjY2MzIyMjhkNDg5N2MzNjVhMWU2MTI0ZDEwMWUxIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZGQxOTgzODg5YjY2MzIyMjhkNDg5N2MzNjVhMWU2MTI0ZDEwMWUxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTgyMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhkZDE5ODM4ODliNjYzMjIyOGQ0ODk3YzM2NWExZTYxMjRkMTAxZTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZGZjMjE4MzY5MTM4NTQzMmY5Mjk1N2NmZjBiMjUzOGU1YTBlYmZhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZGZjMjE4MzY5MTM4NTQzMmY5Mjk1N2NmZjBiMjUzOGU1YTBlYmZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTUyYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhkZmMyMTgzNjkxMzg1NDMyZjkyOTU3Y2ZmMGIyNTM4ZTVhMGViZmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZWI5Yjg2YjRmMGFhNzliOGVmODRiNDRlMWZiMDMwOTRlN2JiNDI2IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZWI5Yjg2YjRmMGFhNzliOGVmODRiNDRlMWZiMDMwOTRlN2JiNDI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODc1NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhlYjliODZiNGYwYWE3OWI4ZWY4NGI0NGUxZmIwMzA5NGU3YmI0MjYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZWM1NDBjMzZkYTM4MTRlOTNkYTc2NWJmMmZmMDgyNWI1OWMxYmQwIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZWM1NDBjMzZkYTM4MTRlOTNkYTc2NWJmMmZmMDgyNWI1OWMxYmQwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOGUxMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhlYzU0MGMzNmRhMzgxNGU5M2RhNzY1YmYyZmYwODI1YjU5YzFiZDAKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW5jWykoLSdiaW4JISE/pB/b8CEQB/B7KC1iaW7wCSFcCSHln+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZjFiZWMzMmY0YjhlNjQwNjJmNTQwNWEwOTY1NDNlNjFkNzcxMDc2IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZjFiZWMzMmY0YjhlNjQwNjJmNTQwNWEwOTY1NDNlNjFkNzcxMDc2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTlmYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhmMWJlYzMyZjRiOGU2NDA2MmY1NDA1YTA5NjU0M2U2MWQ3NzEwNzYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZjNlNDhjNDlkMDc5NDkwOWY2ZThlNjFlNWE0MzEyZWRmNDg0YzMzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZjNlNDhjNDlkMDc5NDkwOWY2ZThlNjFlNWE0MzEyZWRmNDg0YzMzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzhiNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhmM2U0OGM0OWQwNzk0OTA5ZjZlOGU2MWU1YTQzMTJlZGY0ODRjMzMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZmJiZjNjMGVhYTI1YjY0ZDBhOTdhOGVlMDgwMDY1MzllNjQ5MTk5IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy84ZmJiZjNjMGVhYTI1YjY0ZDBhOTdhOGVlMDgwMDY1MzllNjQ5MTk5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMmVlNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzhmYmJmM2MwZWFhMjViNjRkMGE5N2E4ZWUwODAwNjUzOWU2NDkxOTkKQEAgLTAsMCArMSBAQAorpGMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkwN2QwMDIxZDQyZDBmZGM4NjdmZDAyZDM2MDljZGNlMTNjOGEwNTUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkwN2QwMDIxZDQyZDBmZGM4NjdmZDAyZDM2MDljZGNlMTNjOGEwNTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZjBmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTA3ZDAwMjFkNDJkMGZkYzg2N2ZkMDJkMzYwOWNkY2UxM2M4YTA1NQpAQCAtMCwwICsxIEBACiuuB/BbKICkLWJkaW4hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MTk1MTFjMjE3YTM0MjdjMjJjYWQ0YTcxYWFlMzFhNmNkNDdiMTkzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MTk1MTFjMjE3YTM0MjdjMjJjYWQ0YTcxYWFlMzFhNmNkNDdiMTkzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWVmMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkxOTUxMWMyMTdhMzQyN2MyMmNhZDRhNzFhYWUzMWE2Y2Q0N2IxOTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MjY3YzgxYzMyODNkYTgxOTNjMTk4ZGUwNWUwNWZhMzA2MzFhNDUzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MjY3YzgxYzMyODNkYTgxOTNjMTk4ZGUwNWUwNWZhMzA2MzFhNDUzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTUxZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkyNjdjODFjMzI4M2RhODE5M2MxOThkZTA1ZTA1ZmEzMDYzMWE0NTMKQEAgLTAsMCArMSBAQAorPyqgpK5ACBAHOvBbBvhjCSghIVz+O/AJIX4JH9vlR/0h0GNtOicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkyZTgwOTk3YTQyMzdkNzZmMTBiNzBkYWUyODcwYjcyNTVjOTc0MzUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkyZTgwOTk3YTQyMzdkNzZmMTBiNzBkYWUyODcwYjcyNTVjOTc0MzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxNzZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTJlODA5OTdhNDIzN2Q3NmYxMGI3MGRhZTI4NzBiNzI1NWM5NzQzNQpAQCAtMCwwICsxIEBACis/KqCkrkAIEAc68FsobmMJKDv+ITtc8AkhYwkf2+VH/SHwY206JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTM1MzIyZGI3NmY1ZDRjNzRjMmRjNjhmYzQ2MzE5MTViOGUyNDMyMyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTM1MzIyZGI3NmY1ZDRjNzRjMmRjNjhmYzQ2MzE5MTViOGUyNDMyMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY1OGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MzUzMjJkYjc2ZjVkNGM3NGMyZGM2OGZjNDYzMTkxNWI4ZTI0MzIzCkBAIC0wLDAgKzEgQEAKK6QPpNvwpDGDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MzlmMjYyN2VmNjI2M2QwMTc2NTY2ZGUyNjdmZjNlYjkxMGU2YTYwIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85MzlmMjYyN2VmNjI2M2QwMTc2NTY2ZGUyNjdmZjNlYjkxMGU2YTYwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZmRmNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzkzOWYyNjI3ZWY2MjYzZDAxNzY1NjZkZTI2N2ZmM2ViOTEwZTZhNjAKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LKVsnKD1jYmluCWEhP6Qf2/AhEAfweygtYmlupPAfpNsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk0YWRlYTZhMGQ5YTQ0YmVlNmY1ZTg4YWRjZWU1N2JlOWU5ZTM1OTcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk0YWRlYTZhMGQ5YTQ0YmVlNmY1ZTg4YWRjZWU1N2JlOWU5ZTM1OTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlMjlhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTRhZGVhNmEwZDlhNDRiZWU2ZjVlODhhZGNlZTU3YmU5ZTllMzU5NwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk0ZGNiZTBkMzM1MmJkOWIyMzAwOTZiOGRjZTljNmQ4ZDYzZjlkNTEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk0ZGNiZTBkMzM1MmJkOWIyMzAwOTZiOGRjZTljNmQ4ZDYzZjlkNTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5YzBkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTRkY2JlMGQzMzUyYmQ5YjIzMDA5NmI4ZGNlOWM2ZDhkNjNmOWQ1MQpAQCAtMCwwICsxIEBACisoPzikpKQfH9sh19vwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NWRhZDczOGY2MGUzZTVlYjBmMWNkYWZkOTFhZDQ2MWY0NDE4ZThmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NWRhZDczOGY2MGUzZTVlYjBmMWNkYWZkOTFhZDQ2MWY0NDE4ZThmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDAyZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk1ZGFkNzM4ZjYwZTNlNWViMGYxY2RhZmQ5MWFkNDYxZjQ0MThlOGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NjBjMGEyMWM5ZTVjMWE2MWI5M2IzNGRhMzE4OWIwZGUxYzI2NGRmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NjBjMGEyMWM5ZTVjMWE2MWI5M2IzNGRhMzE4OWIwZGUxYzI2NGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjVlMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk2MGMwYTIxYzllNWMxYTYxYjkzYjM0ZGEzMTg5YjBkZTFjMjY0ZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NjkwMzUxMmIxZjFkZWMwODIwNjEyM2YwMjRiNjJkMGUzMWNkNGRjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NjkwMzUxMmIxZjFkZWMwODIwNjEyM2YwMjRiNjJkMGUzMWNkNGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzcxYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk2OTAzNTEyYjFmMWRlYzA4MjA2MTIzZjAyNGI2MmQwZTMxY2Q0ZGMKQEAgLTAsMCArMSBAQAorEGMH8FsoIQnwWyghXAkh5Uf9IVsoISEJIeVH/UEpKCEp7SG4KinlR/1BKSjZOymKClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NmE4OWMwMDVlOGQ5OTkyZTM0Y2MxNDliMGJlMDk2YWQwMDUxNDQ2IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85NmE4OWMwMDVlOGQ5OTkyZTM0Y2MxNDliMGJlMDk2YWQwMDUxNDQ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzJkNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk2YTg5YzAwNWU4ZDk5OTJlMzRjYzE0OWIwYmUwOTZhZDAwNTE0NDYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85N2RiOGE2NmRkNTEzZWVhNDdhNWEyNTExNTUwOGY0ZTU5OTg0ODU0IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85N2RiOGE2NmRkNTEzZWVhNDdhNWEyNTExNTUwOGY0ZTU5OTg0ODU0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWY1NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk3ZGI4YTY2ZGQ1MTNlZWE0N2E1YTI1MTE1NTA4ZjRlNTk5ODQ4NTQKQEAgLTAsMCArMSBAQAorpCgeKqCkrkAIEDrwB1soP6QHOzooJ6TwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85OGYyY2I4NGFkODk1NTBjZjU2ZWU1NGUxMWYxNDQ4YWU3Mjg3MjQ3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85OGYyY2I4NGFkODk1NTBjZjU2ZWU1NGUxMWYxNDQ4YWU3Mjg3MjQ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjgxNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk4ZjJjYjg0YWQ4OTU1MGNmNTZlZTU0ZTExZjE0NDhhZTcyODcyNDcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85OTM0OTc0MjJhNTliN2Y5ZjBmNmRiOGM4NjczMzliNWM5ZTRjOTc4IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85OTM0OTc0MjJhNTliN2Y5ZjBmNmRiOGM4NjczMzliNWM5ZTRjOTc4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDI4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk5MzQ5NzQyMmE1OWI3ZjlmMGY2ZGI4Yzg2NzMzOWI1YzllNGM5NzgKQEAgLTAsMCArMSBAQAorpKQQB6TwDy1iaW6LY1spzhBACK4/KqSgBzoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk5OTgyMWUzNzUwYTdmMmM5ZGI2NjNkMmQxMDBiNDQwNGMyMjUwNDAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzk5OTgyMWUzNzUwYTdmMmM5ZGI2NjNkMmQxMDBiNDQwNGMyMjUwNDAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmYzc2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTk5ODIxZTM3NTBhN2YyYzlkYjY2M2QyZDEwMGI0NDA0YzIyNTA0MApAQCAtMCwwICsxIEBACisTWyghIQkhW/Ah5QpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTliMmVkODNiZTQwY2FiNDMxZDE5NDBlOGRlMmRjM2ViZmU5MzUyZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTliMmVkODNiZTQwY2FiNDMxZDE5NDBlOGRlMmRjM2ViZmU5MzUyZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhhMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85OWIyZWQ4M2JlNDBjYWI0MzFkMTk0MGU4ZGUyZGMzZWJmZTkzNTJmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTllODg4YjczNzJiMjkyNTZkYmVmZDQ3Njg1NWZmNzM1ODRjYzAwZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOTllODg4YjczNzJiMjkyNTZkYmVmZDQ3Njg1NWZmNzM1ODRjYzAwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTczYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85OWU4ODhiNzM3MmIyOTI1NmRiZWZkNDc2ODU1ZmY3MzU4NGNjMDBmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWIxODA4N2RlYjNjZmFmYTFiOTY0YWE2NWQ4ZWU5ODBiYzYxNDA0ZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWIxODA4N2RlYjNjZmFmYTFiOTY0YWE2NWQ4ZWU5ODBiYzYxNDA0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhkMGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85YjE4MDg3ZGViM2NmYWZhMWI5NjRhYTY1ZDhlZTk4MGJjNjE0MDRlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWIzYzc0NWVhM2UzMTM5MDlhMjI4YTA3YjQ5YWFlMTEwYjAyYWU0YSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWIzYzc0NWVhM2UzMTM5MDlhMjI4YTA3YjQ5YWFlMTEwYjAyYWU0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg1NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85YjNjNzQ1ZWEzZTMxMzkwOWEyMjhhMDdiNDlhYWUxMTBiMDJhZTRhCkBAIC0wLDAgKzEgQEAKK6Rwg9vw8KQfIYNb8GMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzliZTFjZTBiYTc3NzU4OTI4ZmY1ZTljNDUxMzliMTYyNGNiZTljMmQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzliZTFjZTBiYTc3NzU4OTI4ZmY1ZTljNDUxMzliMTYyNGNiZTljMmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYjc2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWJlMWNlMGJhNzc3NTg5MjhmZjVlOWM0NTEzOWIxNjI0Y2JlOWMyZApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpboukLVtjJyEppBBiaQcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzljNzAzMTQxZWZkNjllYjhmMzJhNTgxMzNjODAzNWZiNTg1ZTBmNGMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzljNzAzMTQxZWZkNjllYjhmMzJhNTgxMzNjODAzNWZiNTg1ZTBmNGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkNTUxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWM3MDMxNDFlZmQ2OWViOGYzMmE1ODEzM2M4MDM1ZmI1ODVlMGY0YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzljN2Y3Nzk4MTY3NzQ5OWYwNDI2YTBmZmI1Y2I3OWQ1ZmU1NWRjYjIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzljN2Y3Nzk4MTY3NzQ5OWYwNDI2YTBmZmI1Y2I3OWQ1ZmU1NWRjYjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjNjdiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWM3Zjc3OTgxNjc3NDk5ZjA0MjZhMGZmYjVjYjc5ZDVmZTU1ZGNiMgpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWykoLSdiKW4JIyE/pB/b8CEQB/B7KC1iaW7wCSFcCSHlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85Y2E1OWU2Y2FkYWE1YmU5YWYzMGRmZTU2MjBkMWJjZDcwZjQ0MmU1IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85Y2E1OWU2Y2FkYWE1YmU5YWYzMGRmZTU2MjBkMWJjZDcwZjQ0MmU1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTVhNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzljYTU5ZTZjYWRhYTViZTlhZjMwZGZlNTYyMGQxYmNkNzBmNDQyZTUKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LYypbKaQTWygopC0P2/An8GIhg2NpbgkhIQkhIVvwIeUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzlkMTM5ODM1ZDkxNDc0ZThkODM2MWQ2NTY5OGEzMWI4YjM4YzRmN2IgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzlkMTM5ODM1ZDkxNDc0ZThkODM2MWQ2NTY5OGEzMWI4YjM4YzRmN2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4MTU1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWQxMzk4MzVkOTE0NzRlOGQ4MzYxZDY1Njk4YTMxYjhiMzhjNGY3YgpAQCAtMCwwICsxIEBACis/pB/b8CHwpKSQB/AJYyekDy1iaW6LpPJbYychKaQQYmkXClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85ZTIxNzk1NjRhOTllOTZlMTc5Yzk2ZjI4ODAyYTBhMjc1OWI1ODFjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85ZTIxNzk1NjRhOTllOTZlMTc5Yzk2ZjI4ODAyYTBhMjc1OWI1ODFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGY3MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzllMjE3OTU2NGE5OWU5NmUxNzljOTZmMjg4MDJhMGEyNzU5YjU4MWMKQEAgLTAsMCArMSBAQAorKCqgpK5ACBA68AdbKD+kBztbKCek8CEJHyj4YwkoO/4hIVwJIWNy5Uf9OgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWU1NmJiM2I2OGQyZTI2MTdjYjJkMmYwZjM5NDFmN2ZjODMyZTQ2MiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWU1NmJiM2I2OGQyZTI2MTdjYjJkMmYwZjM5NDFmN2ZjODMyZTQ2MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzQ0MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85ZTU2YmIzYjY4ZDJlMjYxN2NiMmQyZjBmMzk0MWY3ZmM4MzJlNDYyCkBAIC0wLDAgKzEgQEAKK2Mn8FsoISEJ8FsoISEJIeVH/SFbKCEhCSHlR/1BKSghKe0hvCop5Uf9QSko2SEpigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWYzMThiMmMyZmY5Y2Y0NjE1YmQwNmJhMTNiZGQwODZiNGFkMDhjNiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvOWYzMThiMmMyZmY5Y2Y0NjE1YmQwNmJhMTNiZGQwODZiNGFkMDhjNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE2YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85ZjMxOGIyYzJmZjljZjQ2MTViZDA2YmExM2JkZDA4NmI0YWQwOGM2CkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgYBzrwWwb4YwkoISFc/jvwASF+CR/b5Uf9IdBpbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85ZjhkOTBiMTQ4MDk4OWZjNDZlYTJmMWM2NmNmNjg3NjM4OTk0NTg3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy85ZjhkOTBiMTQ4MDk4OWZjNDZlYTJmMWM2NmNmNjg3NjM4OTk0NTg3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjU1YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzLzlmOGQ5MGIxNDgwOTg5ZmM0NmVhMmYxYzY2Y2Y2ODc2Mzg5OTQ1ODcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hMDlkYjU3MTVmMGJjMzg3OWEwZTE4ZTRkYjVhNmI1NjQwYjI1NGEzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hMDlkYjU3MTVmMGJjMzg3OWEwZTE4ZTRkYjVhNmI1NjQwYjI1NGEzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZmY1ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2EwOWRiNTcxNWYwYmMzODc5YTBlMThlNGRiNWE2YjU2NDBiMjU0YTMKQEAgLTAsMCArMSBAQAorOz8wYyEoB/JLCfBbTtRcCSHlRyFbKCEhCSHlR/1BKSghKe0hKuW8R4D9QSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYTBjNTlhMDkwODE4YmNhMjlkNzZjY2Y5ODQzZjdlMmZhZjMzMGRkZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYTBjNTlhMDkwODE4YmNhMjlkNzZjY2Y5ODQzZjdlMmZhZjMzMGRkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmEzMTZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hMGM1OWEwOTA4MThiY2EyOWQ3NmNjZjk4NDNmN2UyZmFmMzMwZGRmCkBAIC0wLDAgKzEgQEAKKyqkEAfwpA8tYmlupA+k2/AKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2ExY2YxMDQ3OGU1ZTAxYTBkOTUxYzc0M2EzZGQ0NWFhNWZjNDA5ZjIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2ExY2YxMDQ3OGU1ZTAxYTBkOTUxYzc0M2EzZGQ0NWFhNWZjNDA5ZjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjY2U1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYTFjZjEwNDc4ZTVlMDFhMGQ5NTFjNzQzYTNkZDQ1YWE1ZmM0MDlmMgpAQCAtMCwwICsxIEBACiukHyGD3/DwpB8hg9ukH+QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2EyMmMwZjAzZjhjMDA1YTQ2MTJhOWRjYmNkNmE2NDMzMzRjMzVkMmYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2EyMmMwZjAzZjhjMDA1YTQ2MTJhOWRjYmNkNmE2NDMzMzRjMzVkMmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyOGFhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYTIyYzBmMDNmOGMwMDVhNDYxMmE5ZGNiY2Q2YTY0MzMzNGMzNWQyZgpAQCAtMCwwICsxIEBACis7PzBjISgH8EsJ8FtO1FwJIeVHIVsoISEJIeVH/UEpKCEp7SEq5bxHgP1BKSjZOymKClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hMzE1NGI4ZWQyNmIzNDYxZjJiMDkxYzczMmRhMDBiNjNjZThiZWQzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hMzE1NGI4ZWQyNmIzNDYxZjJiMDkxYzczMmRhMDBiNjNjZThiZWQzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTRlNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2EzMTU0YjhlZDI2YjM0NjFmMmIwOTFjNzMyZGEwMGI2M2NlOGJlZDMKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LpC1bYyf5KaQQYmkHClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hODRhMWVkMWEyNGU3NTNhMjdhZGZkM2JhODA2ZjA2ZmM0NGY4OTlmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hODRhMWVkMWEyNGU3NTNhMjdhZGZkM2JhODA2ZjA2ZmM0NGY4OTlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWE1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2E4NGExZWQxYTI0ZTc1M2EyN2FkZmQzYmE4MDZmMDZmYzQ0Zjg5OWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hODcxZTdjZTY2YWZkNGY1NzcwMmNkMTI5OWRlMDZjZDA4OTk1NTYxIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hODcxZTdjZTY2YWZkNGY1NzcwMmNkMTI5OWRlMDZjZDA4OTk1NTYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Mjk1YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2E4NzFlN2NlNjZhZmQ0ZjU3NzAyY2QxMjk5ZGUwNmNkMDg5OTU1NjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hOGRjNzM2ZWE5NjQ1ODZiN2RjYmYyYmMwNjVlYzQ2NzVkMWRhYmEzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hOGRjNzM2ZWE5NjQ1ODZiN2RjYmYyYmMwNjVlYzQ2NzVkMWRhYmEzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWFmNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2E4ZGM3MzZlYTk2NDU4NmI3ZGNiZjJiYzA2NWVjNDY3NWQxZGFiYTMKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1sppCgtDn8nYmluCSEhP6Qf2/AhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hOTFhODM1ODM2YzcyMjE3ODI0ZjBiNjM0OTFkOWI2MjMxMzA1MDJhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hOTFhODM1ODM2YzcyMjE3ODI0ZjBiNjM0OTFkOWI2MjMxMzA1MDJhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWRkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2E5MWE4MzU4MzZjNzIyMTc4MjRmMGI2MzQ5MWQ5YjYyMzEzMDUwMmEKQEAgLTAsMCArMSBAQAorPyqgpK5ACBAHOvBbKPhjCSg7/iEhXPAJIWMJH9vlR/0h8GNtOicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FiOTdjMWY2MDMzZGM3ZDk2ZjY5YjllMTQ2MWZkNTk0YzE2ZjRlYmYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FiOTdjMWY2MDMzZGM3ZDk2ZjY5YjllMTQ2MWZkNTk0YzE2ZjRlYmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1OWNiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWI5N2MxZjYwMzNkYzdkOTZmNjliOWUxNDYxZmQ1OTRjMTZmNGViZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FjOGE4YzIzYWNkOGMyOTBhMTFkYzc4MjhmN2YzOTc5NTdmYTY0MDAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FjOGE4YzIzYWNkOGMyOTBhMTFkYzc4MjhmN2YzOTc5NTdmYTY0MDAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5ODVmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWM4YThjMjNhY2Q4YzI5MGExMWRjNzgyOGY3ZjM5Nzk1N2ZhNjQwMApAQCAtMCwwICsxIEBACis/KqCmrkAIEAc68FsG+GMJKCEhXP478AEhfgkfR/0h0GltOicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FjOTRiMjc4OGY1MjUyZjllMmU4NTAyYzdjNzVlMDRiZWY0YzBiNzYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FjOTRiMjc4OGY1MjUyZjllMmU4NTAyYzdjNzVlMDRiZWY0YzBiNzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjYzU3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWM5NGIyNzg4ZjUyNTJmOWUyZTg1MDJjN2M3NWUwNGJlZjRjMGI3NgpAQCAtMCwwICsxIEBACiukPwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWQwM2I0ZjU4NDcwYzQzZGI2NTkzYTM1YmU0ODk4OTQ4NmQ3NTRmOSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWQwM2I0ZjU4NDcwYzQzZGI2NTkzYTM1YmU0ODk4OTQ4NmQ3NTRmOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjkxMDAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hZDAzYjRmNTg0NzBjNDNkYjY1OTNhMzViZTQ4OTg5NDg2ZDc1NGY5CkBAIC0wLDAgKzEgQEAKK6Rwg9vw8KQfIYPb8PBjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hZjQxN2M4M2U4MzFhOTZmZGExYmRkZTk5YTFhZjY1MDllZjJkZjNkIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hZjQxN2M4M2U4MzFhOTZmZGExYmRkZTk5YTFhZjY1MDllZjJkZjNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTcxNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2FmNDE3YzgzZTgzMWE5NmZkYTFiZGRlOTlhMWFmNjUwOWVmMmRmM2QKQEAgLTAsMCArMSBAQAorKD+kH6SkH9vb8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWZmZDI5MmNkMmNlMzMwNmI0NjUxY2M3ZWMwZWMwNTI0Y2JiYWUzZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYWZmZDI5MmNkMmNlMzMwNmI0NjUxY2M3ZWMwZWMwNTI0Y2JiYWUzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWExYjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9hZmZkMjkyY2QyY2UzMzA2YjQ2NTFjYzdlYzBlYzA1MjRjYmJhZTNkCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA+jYmlui+RjW/IpJy1iaS4JKikhP6Qf2+IQB/B7KC1iaVxuIQkhCfDlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iMDU4N2U2ZTMxOWY0YjU2ZDg3N2U3ZWQ0NmJjN2RhOWIxZTcyNDljIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iMDU4N2U2ZTMxOWY0YjU2ZDg3N2U3ZWQ0NmJjN2RhOWIxZTcyNDljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjEwNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2IwNTg3ZTZlMzE5ZjRiNTZkODc3ZTdlZDQ2YmM3ZGE5YjFlNzI0OWMKQEAgLTAsMCArMSBAQAorpCkHOjshnMon0tgpKjt9dik3Sc8hpCk7HpYtTSqx5OIhJ2QqQ3UYDquRWCQwDik68yo7OuTdOzsoKTs6Xe/mQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjE2NmFhNjZiNWIzYWQxNzhiYzM4YWVlNTc2ODIyNmM4YWRjMDgyZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjE2NmFhNjZiNWIzYWQxNzhiYzM4YWVlNTc2ODIyNmM4YWRjMDgyZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTFlNjUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iMTY2YWE2NmI1YjNhZDE3OGJjMzhhZWU1NzY4MjI2YzhhZGMwODJmCkBAIC0wLDAgKzEgQEAKK6Rwg9vwpB8hg9vwYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjFhZGUwNTcxMjYyYzZlNWYxZDcyZjZkMjVlYmI1MTNkMjA1NWJjOSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjFhZGUwNTcxMjYyYzZlNWYxZDcyZjZkMjVlYmI1MTNkMjA1NWJjOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA3M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iMWFkZTA1NzEyNjJjNmU1ZjFkNzJmNmQyNWViYjUxM2QyMDU1YmM5CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKSgnLWJpLgkqISE/pB/b4iEQB/B7KC1iaVxuIQkhCfDlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iMjQ0YzY5MDE1N2ZmMjFkMDczOTQwZWY4Yzc3ZDE4OThmMzdjZjhlIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iMjQ0YzY5MDE1N2ZmMjFkMDczOTQwZWY4Yzc3ZDE4OThmMzdjZjhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzY3MGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2IyNDRjNjkwMTU3ZmYyMWQwNzM5NDBlZjhjNzdkMTg5OGYzN2NmOGUKQEAgLTAsMCArMSBAQAorpB+k2/DwCWNjJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjUyMzA5MWVlNGYxN2QyMGY1MWY5YjVjZjgyMjkzNDY1Y2Y2MTc4MCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjUyMzA5MWVlNGYxN2QyMGY1MWY5YjVjZjgyMjkzNDY1Y2Y2MTc4MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY2ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iNTIzMDkxZWU0ZjE3ZDIwZjUxZjliNWNmODIyOTM0NjVjZjYxNzgwCkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQ8DoHWwb4YwkoO/4hIVzwCSN+CR/b5XL9IfBjbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iN2Q0ZDQ5YWMyYzUzMGViODQ0NGE0NDlmZWI2ODllZTUwZmQyMTBkIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iN2Q0ZDQ5YWMyYzUzMGViODQ0NGE0NDlmZWI2ODllZTUwZmQyMTBkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2JjY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2I3ZDRkNDlhYzJjNTMwZWI4NDQ0YTQ0OWZlYjY4OWVlNTBmZDIxMGQKQEAgLTAsMCArMSBAQAorOz8nYwfwWyghCfBbTiFcCSPlR/0hKighIQkh5Uf9QSkoISntIbwqKeVH/UkpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2I4NTVjMTYxMTIxYmZhMjljNmZiMjJkM2MwMjM2ZmFlNGFmNjk4NGUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2I4NTVjMTYxMTIxYmZhMjljNmZiMjJkM2MwMjM2ZmFlNGFmNjk4NGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0ODU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYjg1NWMxNjExMjFiZmEyOWM2ZmIyMmQzYzAyMzZmYWU0YWY2OTg0ZQpAQCAtMCwwICsxIEBACis7PzBjISgH8EsJ8FtOIVwZO+VHIVsoISEJIeVH/UEpKCEp7SEq5UeAvkEpKNk7igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYmNhYTcxYWJmMjNiMmU1MTMwZTBjYzQ2NDc1NWZlNzY5YmY0YWFhNyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYmNhYTcxYWJmMjNiMmU1MTMwZTBjYzQ2NDc1NWZlNzY5YmY0YWFhNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQ4N2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iY2FhNzFhYmYyM2IyZTUxMzBlMGNjNDY0NzU1ZmU3NjliZjRhYWE3CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui4ljWymkKC0OfydiaW4JISE/pB/b8CEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JjZjQ2ODRjZTA5N2ZhYTdlOWQ5OWI2ZTkzY2MyZGUyNGY1N2FlZTMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JjZjQ2ODRjZTA5N2ZhYTdlOWQ5OWI2ZTkzY2MyZGUyNGY1N2FlZTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3ZmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYmNmNDY4NGNlMDk3ZmFhN2U5ZDk5YjZlOTNjYzJkZTI0ZjU3YWVlMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JkY2E2NTA0ZDJlZTc5MjVmNjJlMTc2MzU1YmI0ODEzNDQ3NzIwNzUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JkY2E2NTA0ZDJlZTc5MjVmNjJlMTc2MzU1YmI0ODEzNDQ3NzIwNzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0YmUzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYmRjYTY1MDRkMmVlNzkyNWY2MmUxNzYzNTViYjQ4MTM0NDc3MjA3NQpAQCAtMCwwICsxIEBACis7PydjB/BbKCEJ8FtOIVwJIeVH/SEqKCEhCSHlR/1BKSghKe0hvCop5Uf9SSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYmViMjA4ZmQ4Njc1YmE3ZGUyZWNiMTI5OThkMmQ2MjhkNTc5Y2E3YyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYmViMjA4ZmQ4Njc1YmE3ZGUyZWNiMTI5OThkMmQ2MjhkNTc5Y2E3YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRlNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZWIyMDhmZDg2NzViYTdkZTJlY2IxMjk5OGQyZDYyOGQ1NzljYTdjCkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQBzrwWwb4Ywk4O/4hIVzwCSF+CR/bREf9IfBjbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZjBjOTg2ODlhYjgxZmMzMjc4NzAyMzMwMGNhZjlhNDE3NTU4M2RjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZjBjOTg2ODlhYjgxZmMzMjc4NzAyMzMwMGNhZjlhNDE3NTU4M2RjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMGNiZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JmMGM5ODY4OWFiODFmYzMyNzg3MDIzMzAwY2FmOWE0MTc1NTgzZGMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZjQ3OWU5N2IzOWI2OTdlNzE1NjYzZGU2YTFlNzhkZDU4ZDY0MTIyIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZjQ3OWU5N2IzOWI2OTdlNzE1NjYzZGU2YTFlNzhkZDU4ZDY0MTIyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmI3YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JmNDc5ZTk3YjM5YjY5N2U3MTU2NjNkZTZhMWU3OGRkNThkNjQxMjIKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LYypbKaQopC0P2/An8GKDY2luCSEhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZjgyNmM5NmJlOTRkMWI0MmVlYTA2NjZmNzIzOWNjNWY2OTlhMzc1IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9iZjgyNmM5NmJlOTRkMWI0MmVlYTA2NjZmNzIzOWNjNWY2OTlhMzc1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjc5YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2JmODI2Yzk2YmU5NGQxYjQyZWVhMDY2NmY3MjM5Y2M1ZjY5OWEzNzUKQEAgLTAsMCArMSBAQAorEAfwWygtYmlupKQQB/CkDy1iaW6LY1spKC0nYmluCSEhP6Qf2/AhEAfweygtYmlu8CEJ8CgJISEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2MxNzY1MGQxOWFlNGE0OGFiYjM2NzM5YzgzZDg5Nzk0NTNmNTcwNWYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2MxNzY1MGQxOWFlNGE0OGFiYjM2NzM5YzgzZDg5Nzk0NTNmNTcwNWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyZDdkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzE3NjUwZDE5YWU0YTQ4YWJiMzY3MzljODNkODk3OTQ1M2Y1NzA1ZgpAQCAtMCwwICsxIEBACis7PzBjISgH8EsJ8FtOIVwJIeVHIVsoISEJIeVH/UEpKCEp7SEq5bxHgP1BKSjZOymKClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jMWU1MzA3ZDg4ZmVkYTJjM2IxNWZjMjIxY2JhOTJiY2Y0MTYyMmJmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jMWU1MzA3ZDg4ZmVkYTJjM2IxNWZjMjIxY2JhOTJiY2Y0MTYyMmJmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTMyNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2MxZTUzMDdkODhmZWRhMmMzYjE1ZmMyMjFjYmE5MmJjZjQxNjIyYmYKQEAgLTAsMCArMSBAQAorKD8qpBAH8KQPLWJpboOkBztbKCek8CFjCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzI0OWY0MDhjNTUyYTA0MDhlYWIzZmUxZDFjYmVjYTk1Y2Q1MzdjMSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzI0OWY0MDhjNTUyYTA0MDhlYWIzZmUxZDFjYmVjYTk1Y2Q1MzdjMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmY1MThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jMjQ5ZjQwOGM1NTJhMDQwOGVhYjNmZTFkMWNiZWNhOTVjZDUzN2MxCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKSgtYqSkEAfwpA8tYmlui2NbKSgnLWJpLgkqISE/pB/b4gpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzI2YjQ2MGFlYmM5MDgyYzUxOTUzOTA2OWY3ZTA2MDA0Mjk4OTY5NiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzI2YjQ2MGFlYmM5MDgyYzUxOTUzOTA2OWY3ZTA2MDA0Mjk4OTY5NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzljYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jMjZiNDYwYWViYzkwODJjNTE5NTM5MDY5ZjdlMDYwMDQyOTg5Njk2CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2NbKSgtJ2JuaQkhJT+kH9vwIRAH8HsoLWJpbvAJIVwh5R/pGzs/R1soKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2MyZWFlNzFkYWFkMGQzNTYxYWI0ZDA5YjhiODUzNzJiOGQ3OTBiYzEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2MyZWFlNzFkYWFkMGQzNTYxYWI0ZDA5YjhiODUzNzJiOGQ3OTBiYzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwYjc0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzJlYWU3MWRhYWQwZDM1NjFhYjRkMDliOGI4NTM3MmI4ZDc5MGJjMQpAQCAtMCwwICsxIEBACis7PzBjIScH8EsJ8FtOIVwZIeVHIVsoISEJIeVH/UEpKCEp7SEq5UeAvkEpKNk7igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzM3ZmRhOGQwMmU5OTEzMmExZGU5OWY5NTk1OTZjNzg0YWI4YTUzYyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzM3ZmRhOGQwMmU5OTEzMmExZGU5OWY5NTk1OTZjNzg0YWI4YTUzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ2OGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jMzdmZGE4ZDAyZTk5MTMyYTFkZTk5Zjk1OTU5NmM3ODRhYjhhNTNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzQ4MzY3NjAzNzdhNzA5MWZiMjBmNGFmYTljNzEyODc1NzkyYjlhNyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzQ4MzY3NjAzNzdhNzA5MWZiMjBmNGFmYTljNzEyODc1NzkyYjlhNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDNkNjNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jNDgzNjc2MDM3N2E3MDkxZmIyMGY0YWZhOWM3MTI4NzU3OTJiOWE3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzQ4Y2FhZDU5NzE3NjQwNGY3NzZkNTMyZDRiYWY5ZmFmNzY1NWVlMiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzQ4Y2FhZDU5NzE3NjQwNGY3NzZkNTMyZDRiYWY5ZmFmNzY1NWVlMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc5MTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jNDhjYWFkNTk3MTc2NDA0Zjc3NmQ1MzJkNGJhZjlmYWY3NjU1ZWUyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzRlZmYwZjU5OTg2ZmM1YWIwOWQ1YmQ5NWYzOTQyOTJmMjg4MjY1OSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzRlZmYwZjU5OTg2ZmM1YWIwOWQ1YmQ5NWYzOTQyOTJmMjg4MjY1OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjcwNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jNGVmZjBmNTk5ODZmYzVhYjA5ZDViZDk1ZjM5NDI5MmYyODgyNjU5CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluKWNbKS0nYmluCTGkpBAhP6Qf2/AhBwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzVmYzIwODZkMTY3YzhjM2E3ZDllYzc3OGRiNjljNWZhMTRhNTlmZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzVmYzIwODZkMTY3YzhjM2E3ZDllYzc3OGRiNjljNWZhMTRhNTlmZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI4MzMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jNWZjMjA4NmQxNjdjOGMzYTdkOWVjNzc4ZGI2OWM1ZmExNGE1OWZlCkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgYBzrwXwb4YwkoISFc/jvwASF+CSEf2+VH/SHQO206JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzYwMDg3N2NlNTQ3MTY2ZWIxYjlkODNhZmJlMTI4ZDk4NzY3ZjhhMyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzYwMDg3N2NlNTQ3MTY2ZWIxYjlkODNhZmJlMTI4ZDk4NzY3ZjhhMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI2MjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jNjAwODc3Y2U1NDcxNjZlYjFiOWQ4M2FmYmUxMjhkOTg3NjdmOGEzCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlug2MpLWJpCShuJyEhP6Qf2yHwEAfweygtYmlu8AkhXAkh5R/pGzs/R+06WygoISFc8ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzZhOThmZGFmNmRlNzhlNTllMWExNDlhNDNmM2U0MjIyMmQ2NTBiNyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzZhOThmZGFmNmRlNzhlNTllMWExNDlhNDNmM2U0MjIyMmQ2NTBiNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNhZDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jNmE5OGZkYWY2ZGU3OGU1OWUxYTE0OWE0M2YzZTQyMjIyZDY1MGI3CkBAIC0wLDAgKzEgQEAKKz8qoKyuQAgQ8DoHWwb4YwkoO/4hXCHwCSF+CR/bLWJpbuVH/SHwY206JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzhkMjJmN2ZiNGYzN2YyZDhjYzc5NTNmYTJkNTk5ZDM4ZDg5OWFlYyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzhkMjJmN2ZiNGYzN2YyZDhjYzc5NTNmYTJkNTk5ZDM4ZDg5OWFlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRhYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jOGQyMmY3ZmI0ZjM3ZjJkOGNjNzk1M2ZhMmQ1OTlkMzhkODk5YWVjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzkwOTUxYzE5YjI0YmFjODQyOTZlM2VjMzJjZGVhZmU5OWU5OWNmYiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvYzkwOTUxYzE5YjI0YmFjODQyOTZlM2VjMzJjZGVhZmU5OWU5OWNmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNjMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jOTA5NTFjMTliMjRiYWM4NDI5NmUzZWMzMmNkZWFmZTk5ZTk5Y2ZiCkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQBzrwWwb4YwkoISFc/jvwASF+CR/b5Uf9IdBhbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jOTVmZjJhMTcyNjI2ZWZiNTBlOTRhYTY3ODFmZWJhNjA5ODIwMDc2IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jOTVmZjJhMTcyNjI2ZWZiNTBlOTRhYTY3ODFmZWJhNjA5ODIwMDc2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTA0YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2M5NWZmMmExNzI2MjZlZmI1MGU5NGFhNjc4MWZlYmE2MDk4MjAwNzYKQEAgLTAsMCArMSBAQAorEAfwWygtYmluIQnwKCFcCSHlR/2kHyE6WyghJ/BbKCEhCfAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NhNmM1NTdhZmI5YzU3MWRlNjJlOWI2NWNhNjQ2OWE2MTMzNzYwZGEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NhNmM1NTdhZmI5YzU3MWRlNjJlOWI2NWNhNjQ2OWE2MTMzNzYwZGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5NWJlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2E2YzU1N2FmYjljNTcxZGU2MmU5YjY1Y2E2NDY5YTYxMzM3NjBkYQpAQCAtMCwwICsxIEBACis/IWPwCR/ffScKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NiMmQwZmIyM2Y2NmM5NjhhZjJlODBkNTlmNzFkNGMxYWVkOTZmYmQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NiMmQwZmIyM2Y2NmM5NjhhZjJlODBkNTlmNzFkNGMxYWVkOTZmYmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiYjMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2IyZDBmYjIzZjY2Yzk2OGFmMmU4MGQ1OWY3MWQ0YzFhZWQ5NmZiZApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWymkDygtpNvwJ/Big2NpbgkhIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2M2MGE2NDJjYzIwMzdhZDNjNDU5YTU3MzgxYjhmNjVkOGQ3YWEzNSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2M2MGE2NDJjYzIwMzdhZDNjNDU5YTU3MzgxYjhmNjVkOGQ3YWEzNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQzODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jYzYwYTY0MmNjMjAzN2FkM2M0NTlhNTczODFiOGY2NWQ4ZDdhYTM1CkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQBzrwWwb44wk0O/4hIVzwCSF+CR/bREf98GNtOicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NjZDNiOGFhMjZjNTJmNmQ5YzYwN2MyNmViZGY2MjExNDJhZmY3NDUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NjZDNiOGFhMjZjNTJmNmQ5YzYwN2MyNmViZGY2MjExNDJhZmY3NDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5NzJhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2NkM2I4YWEyNmM1MmY2ZDljNjA3YzI2ZWJkZjYyMTE0MmFmZjc0NQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NjZGZkMTM1NDk5N2ViMTE3YmQ3NmI3NTQ0MGE3ZTRmZjIwYmY1NjQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NjZGZkMTM1NDk5N2ViMTE3YmQ3NmI3NTQ0MGE3ZTRmZjIwYmY1NjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4YTllNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2NkZmQxMzU0OTk3ZWIxMTdiZDc2Yjc1NDQwYTdlNGZmMjBiZjU2NApAQCAtMCwwICsxIEBACisrpKQQB/CkDy1iaW4LOWNbKSgtYqSkEAfwpApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2Q3YTdiOGYwOGMxODllOTVhZTNlMmVhNDRiOTAxNTAwMGU4MjNmMyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2Q3YTdiOGYwOGMxODllOTVhZTNlMmVhNDRiOTAxNTAwMGU4MjNmMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDYzY2NiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jZDdhN2I4ZjA4YzE4OWU5NWFlM2UyZWE0NGI5MDE1MDAwZTgyM2YzCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluiyNaKaQoLaQOYqQJEAfwpA8tYmluP/CLY1spKC1/bmknJ2JpbiEhCSEvpCE/HyfwIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2UwNTY3OGQ4MTJhNWY4YWU4ZTExNTkzODQxMDExNmNlOTE2OTQ1NiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2UwNTY3OGQ4MTJhNWY4YWU4ZTExNTkzODQxMDExNmNlOTE2OTQ1NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FmMzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jZTA1Njc4ZDgxMmE1ZjhhZThlMTE1OTM4NDEwMTE2Y2U5MTY5NDU2CkBAIC0wLDAgKzEgQEAKKzs/MGMhKAfwSwnwW04hXBkh5UchWyghIQkh5Uf9QSkoISntISrlR4C+/UEpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NlNmI2NDJiODEzNzNmMDViYWEyYTZmZTZlOWQ1ZDEzODcwNDYyODUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NlNmI2NDJiODEzNzNmMDViYWEyYTZmZTZlOWQ1ZDEzODcwNDYyODUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxMTI2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2U2YjY0MmI4MTM3M2YwNWJhYTJhNmZlNmU5ZDVkMTM4NzA0NjI4NQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NmODRkMDZlNGRkZGI5OTdhNzlhNDFmOWI2MTIyYmY2MjBiYmRiNGIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2NmODRkMDZlNGRkZGI5OTdhNzlhNDFmOWI2MTIyYmY2MjBiYmRiNGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwYzk0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2Y4NGQwNmU0ZGRkYjk5N2E3OWE0MWY5YjYxMjJiZjYyMGJiZGI0YgpAQCAtMCwwICsxIEBACis7PydjB/BbKSEJ8FtOIdwJYuU0R/0hKighIQlC5Uf9QSkhKe0hvCop5Uf9SSko2TspigpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2ZiY2MzZThjZDY1YWE4YjY1NDY4ODE0NWFkZTM0Yjg3ODk0NjhhNiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvY2ZiY2MzZThjZDY1YWE4YjY1NDY4ODE0NWFkZTM0Yjg3ODk0NjhhNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDdmZjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9jZmJjYzNlOGNkNjVhYThiNjU0Njg4MTQ1YWRlMzRiODc4OTQ2OGE2CkBAIC0wLDAgKzEgQEAKKyc/MGMhKAfwSwnwW04hXBkh5UchWyghIQkh5UcpQf0oISnlISrlR4BBviko2Ts7igpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDAwMDUwMmYzMmNhNTYyMGQ3NzQ1ZjM5ZmY2YmUzYjU0N2UyNmE2ZCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDAwMDUwMmYzMmNhNTYyMGQ3NzQ1ZjM5ZmY2YmUzYjU0N2UyNmE2ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDIyZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kMDAwNTAyZjMyY2E1NjIwZDc3NDVmMzlmZjZiZTNiNTQ3ZTI2YTZkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDEzMWY4M2VlNzM0NTBmZjQ1NTY1ZDBjNjM4YmU3ZDhiZWViMzBkOSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDEzMWY4M2VlNzM0NTBmZjQ1NTY1ZDBjNjM4YmU3ZDhiZWViMzBkOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQwNGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kMTMxZjgzZWU3MzQ1MGZmNDU1NjVkMGM2MzhiZTdkOGJlZWIzMGQ5CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluiymgpFsnKD1jYmluCWEhP+Qf2/AhEPB7KC1iaW6k8B+kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kMjgxN2I4OWQ3YWFhN2ZhODgwYzA3N2IxYTY3MTY4ZWMyZjRmMGY3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kMjgxN2I4OWQ3YWFhN2ZhODgwYzA3N2IxYTY3MTY4ZWMyZjRmMGY3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2QyODE3Yjg5ZDdhYWE3ZmE4ODBjMDc3YjFhNjcxNjhlYzJmNGYwZjcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kM2NjZDcwMzlkZDM0YmFlZjQ2NWM0Yjc4YmFhN2EzMDMxMmE4ZjA3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kM2NjZDcwMzlkZDM0YmFlZjQ2NWM0Yjc4YmFhN2EzMDMxMmE4ZjA3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Y2I3ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2QzY2NkNzAzOWRkMzRiYWVmNDY1YzRiNzhiYWE3YTMwMzEyYThmMDcKQEAgLTAsMCArMSBAQAorPyqgpK5ACBAHOvBbKPhjCSgz/iEhXPAJIWMJKNvlR/0h8GNtOicKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Q0Y2ZhZjNiNTliMjJiNjU0ZDdhZjgwZWU2NzE1Y2U1MDE1YmZkYzAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Q0Y2ZhZjNiNTliMjJiNjU0ZDdhZjgwZWU2NzE1Y2U1MDE1YmZkYzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4YjgwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDRjZmFmM2I1OWIyMmI2NTRkN2FmODBlZTY3MTVjZTUwMTViZmRjMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Q1NjcwODI3YzhlOGQ0Yzk1YWMwZjczOGMwNzkwYzE5OTE2YzAzMzYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Q1NjcwODI3YzhlOGQ0Yzk1YWMwZjczOGMwNzkwYzE5OTE2YzAzMzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5MDZjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDU2NzA4MjdjOGU4ZDRjOTVhYzBmNzM4YzA3OTBjMTk5MTZjMDMzNgpAQCAtMCwwICsxIEBACisqpBAH8KQPLWJpbqQPpKS4EAfwD6Qt2ycoP6QH8DtbKApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDU5ZDdlOTQ4NjNmMWVkODljYWNmYmFhYmY3YmM1OTk0NjAzNmM4ZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDU5ZDdlOTQ4NjNmMWVkODljYWNmYmFhYmY3YmM1OTk0NjAzNmM4ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDkyOWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kNTlkN2U5NDg2M2YxZWQ4OWNhY2ZiYWFiZjdiYzU5OTQ2MDM2YzhmCkBAIC0wLDAgKzEgQEAKKyqkEAfwpA8tYmlugygfgCdb8GkoYm4tIT+gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kNzZkMGM3ZjI0YWUzY2MzZjUzMGQ1MzA2YjhkY2MxNTI5MGM3ZmYyIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kNzZkMGM3ZjI0YWUzY2MzZjUzMGQ1MzA2YjhkY2MxNTI5MGM3ZmYyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxY2MwZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Q3NmQwYzdmMjRhZTNjYzNmNTMwZDUzMDZiOGRjYzE1MjkwYzdmZjIKQEAgLTAsMCArMSBAQAorpB/klwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDhiMTVlOWU1NTVhZDk5MDBiYTRiZThjYzlmODdiZWY3NTcyNWIyNCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZDhiMTVlOWU1NTVhZDk5MDBiYTRiZThjYzlmODdiZWY3NTcyNWIyNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQwYzgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kOGIxNWU5ZTU1NWFkOTkwMGJhNGJlOGNjOWY4N2JlZjc1NzI1YjI0CkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQBzrwWwb4YwkoISFc/jvwASF+CR/b5Uf9IdBpbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kOTc0OGFiZDU0MDgxMGMyNDQ5YzNkZDM5YTBlYmI2Mjc1NGU1MjBmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kOTc0OGFiZDU0MDgxMGMyNDQ5YzNkZDM5YTBlYmI2Mjc1NGU1MjBmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTA4M2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Q5NzQ4YWJkNTQwODEwYzI0NDljM2RkMzlhMGViYjYyNzU0ZTUyMGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kYTlmYzgyMWYwYzFlMDA3MjhiMTM5YjM2MjY5YmMzZDIxYzBhOGNjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kYTlmYzgyMWYwYzFlMDA3MjhiMTM5YjM2MjY5YmMzZDIxYzBhOGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTJiYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RhOWZjODIxZjBjMWUwMDcyOGIxMzliMzYyNjliYzNkMjFjMGE4Y2MKQEAgLTAsMCArMSBAQAorpKQQB/CkD3JiaW6LY1spKC0nYmluCSEhP6Qf2/AhEAfweygtYmlu8AkhXAkh5R/pGzs/R1soKCEhXPAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RjZDFiZDk0YWQ5N2I0ZTY3ZmQ3ZTEyZmYxYmY3YzAzOWViMTdmNjYgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RjZDFiZDk0YWQ5N2I0ZTY3ZmQ3ZTEyZmYxYmY3YzAzOWViMTdmNjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5YmY2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZGNkMWJkOTRhZDk3YjRlNjdmZDdlMTJmZjFiZjdjMDM5ZWIxN2Y2NgpAQCAtMCwwICsxIEBACiukpNspgPDwjmNjJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZGQzYmE5YjEzOWUxMzMyNGZjNzZjZDYyYWY4NGIwMGNhOGI4NzIwNSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZGQzYmE5YjEzOWUxMzMyNGZjNzZjZDYyYWY4NGIwMGNhOGI4NzIwNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQ3ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZDNiYTliMTM5ZTEzMzI0ZmM3NmNkNjJhZjg0YjAwY2E4Yjg3MjA1CkBAIC0wLDAgKzEgQEAKK6Rwg9vw8KQfIYPLVPAqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZTBhOWRjZTBlYTRlNGJmZGNiMTNmNzg4YWU3MjhiZjk3OWZlZDI1IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZTBhOWRjZTBlYTRlNGJmZGNiMTNmNzg4YWU3MjhiZjk3OWZlZDI1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RlMGE5ZGNlMGVhNGU0YmZkY2IxM2Y3ODhhZTcyOGJmOTc5ZmVkMjUKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LI1oppCgfLaSkEAcJDmLwpA8tYmluP/CLY1spKC1/bmknJ2JpbiE7CSEvpCE/HyfwIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZGViNmY5YTkzMGQ5YjMxNTg2ZWRlMTlmZDhmZDNjYWFlMGU1YjFmMiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZGViNmY5YTkzMGQ5YjMxNTg2ZWRlMTlmZDhmZDNjYWFlMGU1YjFmMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ViNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZWI2ZjlhOTMwZDliMzE1ODZlZGUxOWZkOGZkM2NhYWUwZTViMWYyCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluiylbJyg7LWNiaW4JISE/pB/b8CEQB/B7KC1iaW7wCSFcCSHlH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZWU5NWUwMjgwYjcwNjgxZWRkZmI2OGUzYjQxODEyNmM1NjYxZTE4IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZWU5NWUwMjgwYjcwNjgxZWRkZmI2OGUzYjQxODEyNmM1NjYxZTE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2QxNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RlZTk1ZTAyODBiNzA2ODFlZGRmYjY4ZTNiNDE4MTI2YzU2NjFlMTgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZjAxMjAzZWRmYTJkZmU5ZTEwOGRkZGU3ODZhZTQ4MjM1NjI0ZmVmIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZjAxMjAzZWRmYTJkZmU5ZTEwOGRkZGU3ODZhZTQ4MjM1NjI0ZmVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NTIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RmMDEyMDNlZGZhMmRmZTllMTA4ZGRkZTc4NmFlNDgyMzU2MjRmZWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZjBhZGJlMjUyMzUwOGU5YWZiNDJhNThkOThjMjY1NzcxMGQ2MDMzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9kZjBhZGJlMjUyMzUwOGU5YWZiNDJhNThkOThjMjY1NzcxMGQ2MDMzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjdhOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2RmMGFkYmUyNTIzNTA4ZTlhZmI0MmE1OGQ5OGMyNjU3NzEwZDYwMzMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMDVmY2JhMWIyMmY2NThjOGJkNmYzYzMzMGIyYjNjOWZhZWJmOTc3IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMDVmY2JhMWIyMmY2NThjOGJkNmYzYzMzMGIyYjNjOWZhZWJmOTc3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzExODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2UwNWZjYmExYjIyZjY1OGM4YmQ2ZjNjMzMwYjJiM2M5ZmFlYmY5NzcKQEAgLTAsMCArMSBAQAorEAfwWygtYGlupKQQB/CkDy3eaW6LY1spKDonYmluCSEhKT+kH9vwIRAH8HsoOi1iaW7wIQnwKAkhIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTE0NWNhYTc1ZDczZTNkODE5YTljYjRiNjIxN2YxZjUzMTEyZjNmOCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTE0NWNhYTc1ZDczZTNkODE5YTljYjRiNjIxN2YxZjUzMTEyZjNmOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU3NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMTQ1Y2FhNzVkNzNlM2Q4MTlhOWNiNGI2MjE3ZjFmNTMxMTJmM2Y4CkBAIC0wLDAgKzEgQEAKK6QfIYPf8KQfIYPbpBAH8KQfpA8tYmlug2NbLSdi5Dpu8AkhP6Qf2/AhKCFc8AljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMWQ4NmMwMDk0NjU3Mzg2MTk3ZDE5MTg1NWI1NjQ1YWMxZGQ1OTM2IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMWQ4NmMwMDk0NjU3Mzg2MTk3ZDE5MTg1NWI1NjQ1YWMxZGQ1OTM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTU3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2UxZDg2YzAwOTQ2NTczODYxOTdkMTkxODU1YjU2NDVhYzFkZDU5MzYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMjVhZGY4ZGU0NGY1OTc4ZDAwYjdlOGM1MmFlZTg5YzVjZDFmZTkzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMjVhZGY4ZGU0NGY1OTc4ZDAwYjdlOGM1MmFlZTg5YzVjZDFmZTkzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTJhOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2UyNWFkZjhkZTQ0ZjU5NzhkMDBiN2U4YzUyYWVlODljNWNkMWZlOTMKQEAgLTAsMCArMSBAQAorP6Qf2/Ah8AljJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTI5ZjA1MTYyZTNkOTZkNTU0OWY5NmFhNGE1NGM4Njg1MzViMjg0NyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTI5ZjA1MTYyZTNkOTZkNTU0OWY5NmFhNGE1NGM4Njg1MzViMjg0NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBjNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lMjlmMDUxNjJlM2Q5NmQ1NTQ5Zjk2YWE0YTU0Yzg2ODUzNWIyODQ3CkBAIC0wLDAgKzEgQEAKK6QPpNvw8INjYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2UzYTk3MGFjODYzNmQyOWRhM2RlZDMyOGI4NzZlZDM1NTBjYjMyMDkgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2UzYTk3MGFjODYzNmQyOWRhM2RlZDMyOGI4NzZlZDM1NTBjYjMyMDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4OTgzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTNhOTcwYWM4NjM2ZDI5ZGEzZGVkMzI4Yjg3NmVkMzU1MGNiMzIwOQpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbostW2MqKCliaW4JISE/pB/b8CE7B/B7KC1iaW7wCSFcCSEqH+kbOz9H7TpbKCghIVzwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lM2NmZGM4NjIxODdiNGVjMjhiZDRmYjJjZWQ1MDk0YmI1YjA5OTA5IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lM2NmZGM4NjIxODdiNGVjMjhiZDRmYjJjZWQ1MDk0YmI1YjA5OTA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2UzY2ZkYzg2MjE4N2I0ZWMyOGJkNGZiMmNlZDUwOTRiYjViMDk5MDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lNGNlNTIwMDdkMDAxODA2ZmM5MzY4YjYyYzEyNGRmYzU2ZTg0NzFjIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lNGNlNTIwMDdkMDAxODA2ZmM5MzY4YjYyYzEyNGRmYzU2ZTg0NzFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZGU3YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U0Y2U1MjAwN2QwMDE4MDZmYzkzNjhiNjJjMTI0ZGZjNTZlODQ3MWMKQEAgLTAsMCArMSBAQAorKQc6OyGcyifS2CkqO312LTdJzyGkKRseli1NKrHk4iEnZCpDdRgOq1gkMA4pOvMqOzrk3Ts7KCk7Ol3v5kAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U1MjE3M2YwYmMzMzI1NjI5MDQ2ZTg1ZTJkYzQxYWNjNmJhN2QxYzMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U1MjE3M2YwYmMzMzI1NjI5MDQ2ZTg1ZTJkYzQxYWNjNmJhN2QxYzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmNDc1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTUyMTczZjBiYzMzMjU2MjkwNDZlODVlMmRjNDFhY2M2YmE3ZDFjMwpAQCAtMCwwICsxIEBACiukpBAH8KQfLWJpbmMoWymkKKQtD9sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U2NTg5MDA2ZTNiZGE0YzU3MjQ3YWQ2NmZjZDczYWMwMGVlMmNiZTIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U2NTg5MDA2ZTNiZGE0YzU3MjQ3YWQ2NmZjZDczYWMwMGVlMmNiZTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0ZTA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTY1ODkwMDZlM2JkYTRjNTcyNDdhZDY2ZmNkNzNhYzAwZWUyY2JlMgpAQCAtMCwwICsxIEBACis7J2MH8FsoIQnwW04hXIch5Uf9ISooIQkh5Uf9QSkoISntIbwqKeVH/UkpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U2ZmFiNzU3MmZiMmExYzZlMTA3YjZmODNjZmZkMTAzYTIzM2QwMjEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U2ZmFiNzU3MmZiMmExYzZlMTA3YjZmODNjZmZkMTAzYTIzM2QwMjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwYTU3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTZmYWI3NTcyZmIyYTFjNmUxMDdiNmY4M2NmZmQxMDNhMjMzZDAyMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U3OTBmNWQzMTI5NTdkYmZkMjBhYmRlZmU0YjE3MzU3NzlmZjk2ODkgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U3OTBmNWQzMTI5NTdkYmZkMjBhYmRlZmU0YjE3MzU3NzlmZjk2ODkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxODc3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTc5MGY1ZDMxMjk1N2RiZmQyMGFiZGVmZTRiMTczNTc3OWZmOTY4OQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U4ODA5MDE3YTRjZjZjMWU4MGE5M2Y2NjExNjZlYWQ5NjFmMjZiYjQgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U4ODA5MDE3YTRjZjZjMWU4MGE5M2Y2NjExNjZlYWQ5NjFmMjZiYjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlMzljNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTg4MDkwMTdhNGNmNmMxZTgwYTkzZjY2MTE2NmVhZDk2MWYyNmJiNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U5NzMzZTk3M2MzM2IzOGMyMDg3YjdmMWRlYjM2Njg4YjNiMTQyNTkgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2U5NzMzZTk3M2MzM2IzOGMyMDg3YjdmMWRlYjM2Njg4YjNiMTQyNTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3YTM2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZTk3MzNlOTczYzMzYjM4YzIwODdiN2YxZGViMzY2ODhiM2IxNDI1OQpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjKlsppA8oKqCkrkAIEDrwB1soP6QHO1soJ6TwKC2k2yEJ8CfwH2IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VhODEzNDc2OTg1NWQ1NzRmNjY3M2JmMDMwMWViMmUyNDYzMmM2ZWIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VhODEzNDc2OTg1NWQ1NzRmNjY3M2JmMDMwMWViMmUyNDYzMmM2ZWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExNmE3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWE4MTM0NzY5ODU1ZDU3NGY2NjczYmYwMzAxZWIyZTI0NjMyYzZlYgpAQCAtMCwwICsxIEBACisQB/BbKC1iaW6kpBAH8KQtYmlui2NbKSgtJ2JpbgkhIT+kH9vwIRAH8HsoLWJpbvAhCfAoCSEhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lYjQ4OTUzNmU0ZTU1ODlhOTNhMTdjZDM2NjY5NDc1YjhmMmE1ZTFiIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lYjQ4OTUzNmU0ZTU1ODlhOTNhMTdjZDM2NjY5NDc1YjhmMmE1ZTFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTk0MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2ViNDg5NTM2ZTRlNTU4OWE5M2ExN2NkMzY2Njk0NzViOGYyYTVlMWIKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LI1oppCgtpA4JYqQQB/CkDy1iaW4/8ItjWykoLX9uaScnYmluISEJIS+kIT8f2/AhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lYjQ4ZWJkNGQwMWU1NjIzZGQxNmFlNjE5MzhiMzMzM2ZhYjNjZTc4IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lYjQ4ZWJkNGQwMWU1NjIzZGQxNmFlNjE5MzhiMzMzM2ZhYjNjZTc4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MjgxN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2ViNDhlYmQ0ZDAxZTU2MjNkZDE2YWU2MTkzOGIzMzMzZmFiM2NlNzgKQEAgLTAsMCArMSBAQAorpB+k2/Dw3GNjJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWI2Y2E3NjI0Mzg0MjM5YzdmN2UwZDgzZWRiN2NjMzM0Yjc5MjZkNyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWI2Y2E3NjI0Mzg0MjM5YzdmN2UwZDgzZWRiN2NjMzM0Yjc5MjZkNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY4ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lYjZjYTc2MjQzODQyMzljN2Y3ZTBkODNlZGI3Y2MzMzRiNzkyNmQ3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWM5NDU3YWQ0MWVkNzQ1ZWE5Mzc3ZmZkYjE2YWQwOWY5ODFkYWE3ZiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWM5NDU3YWQ0MWVkNzQ1ZWE5Mzc3ZmZkYjE2YWQwOWY5ODFkYWE3ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE1ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lYzk0NTdhZDQxZWQ3NDVlYTkzNzdmZmRiMTZhZDA5Zjk4MWRhYTdmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWRmZjUyNTZhMmQ2MGQwZTUxY2FlZjI1ZGMxZDZmMTY0M2RhZDZkNSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWRmZjUyNTZhMmQ2MGQwZTUxY2FlZjI1ZGMxZDZmMTY0M2RhZDZkNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWY2NjJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lZGZmNTI1NmEyZDYwZDBlNTFjYWVmMjVkYzFkNmYxNjQzZGFkNmQ1CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWU0ZDljNWQyMjUxMmRhNDI3MjZmNDcyMTNmZjU2NDA0ZDFkODFkMSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWU0ZDljNWQyMjUxMmRhNDI3MjZmNDcyMTNmZjU2NDA0ZDFkODFkMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQ1ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lZTRkOWM1ZDIyNTEyZGE0MjcyNmY0NzIxM2ZmNTY0MDRkMWQ4MWQxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWVmMmYzMGI1ZTJlY2Q5OGViZWZiMTJkNTdhYmE4YjRhZDUyZDkwNCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWVmMmYzMGI1ZTJlY2Q5OGViZWZiMTJkNTdhYmE4YjRhZDUyZDkwNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI3YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lZWYyZjMwYjVlMmVjZDk4ZWJlZmIxMmQ1N2FiYThiNGFkNTJkOTA0CkBAIC0wLDAgKzEgQEAKKz/wCR/bIfBjbScKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmMjM5MTFkZTFhMjdkMDNkMmQ0OTgzY2ExNTI3ZTE3ZDZhNzA5MmIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmMjM5MTFkZTFhMjdkMDNkMmQ0OTgzY2ExNTI3ZTE3ZDZhNzA5MmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNTEyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWYyMzkxMWRlMWEyN2QwM2QyZDQ5ODNjYTE1MjdlMTdkNmE3MDkyYgpAQCAtMCwwICsxIEBACiswYyfwWyghCfBbKCFcCSHlR/0hWyghIQkh5Uf9QSkoISntIbwqKeVH/UEpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmNWI3ZmM2MmEyZGFlY2YxZThmOTI4YjFmYTNlYmQwMjg0MTNhNDEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmNWI3ZmM2MmEyZGFlY2YxZThmOTI4YjFmYTNlYmQwMjg0MTNhNDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjNmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWY1YjdmYzYyYTJkYWVjZjFlOGY5MjhiMWZhM2ViZDAyODQxM2E0MQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmNzE4MjU4Y2ExODcwMTk4ZTkxYTJmYmMxZWFhOTBiNjIwNjczZmIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmNzE4MjU4Y2ExODcwMTk4ZTkxYTJmYmMxZWFhOTBiNjIwNjczZmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwMWQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWY3MTgyNThjYTE4NzAxOThlOTFhMmZiYzFlYWE5MGI2MjA2NzNmYgpAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWymyKC0nYmlupApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWZiNDZkZWIzN2E3OGY0MWRkNzYwZjZiNzIwM2IyMDk1NmViMTE0ZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWZiNDZkZWIzN2E3OGY0MWRkNzYwZjZiNzIwM2IyMDk1NmViMTE0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNjMjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9lZmI0NmRlYjM3YTc4ZjQxZGQ3NjBmNmI3MjAzYjIwOTU2ZWIxMTRlCkBAIC0wLDAgKzEgQEAKKzs/MGMhKAfwSwnwE07UXAkh5UchWyghIQkh5Uf9QSkoOintISrlvEeA/UEpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmZGQ2ODI0YmQyNDU2ZTNlNDA4ZTBlODQzNjljNGZhM2FhMTRmNDEgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmZGQ2ODI0YmQyNDU2ZTNlNDA4ZTBlODQzNjljNGZhM2FhMTRmNDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNmM2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWZkZDY4MjRiZDI0NTZlM2U0MDhlMGU4NDM2OWM0ZmEzYWExNGY0MQpAQCAtMCwwICsxIEBACiswYwfwWyghCfBbKCFcCSHlR/0hWyghIQkh5Uf9QSkoISntIbwqKeVH/UEpKNk7KYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmZWMwNDBhNWRlMTk2OWRmNWUzN2U0YmM1MGEwYThmMGRlMzQxZDggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2VmZWMwNDBhNWRlMTk2OWRmNWUzN2U0YmM1MGEwYThmMGRlMzQxZDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMWMwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZWZlYzA0MGE1ZGUxOTY5ZGY1ZTM3ZTRiYzUwYTBhOGYwZGUzNDFkOApAQCAtMCwwICsxIEBACisoP6Q6H5vwIQljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mMWUzMDQ2NGMyNGRjMWQ3Y2VjN2VjMWRkMmFkZWM4NTEyMjMyYjQzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mMWUzMDQ2NGMyNGRjMWQ3Y2VjN2VjMWRkMmFkZWM4NTEyMjMyYjQzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTdlNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2YxZTMwNDY0YzI0ZGMxZDdjZWM3ZWMxZGQyYWRlYzg1MTIyMzJiNDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mMjdhNjE3YjkzNjgxNDQ3Njc3MGEzYjMxYTVhZmI4MGQwZjNiNDIzIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mMjdhNjE3YjkzNjgxNDQ3Njc3MGEzYjMxYTVhZmI4MGQwZjNiNDIzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmFjNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2YyN2E2MTdiOTM2ODE0NDc2NzcwYTNiMzFhNWFmYjgwZDBmM2I0MjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mM2YwZDk5YWMyOTYyZjhmZGRiMjVjNjVmYjRjOGM2ZWI2MzUxOGE5IGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mM2YwZDk5YWMyOTYyZjhmZGRiMjVjNjVmYjRjOGM2ZWI2MzUxOGE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGQxNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2YzZjBkOTlhYzI5NjJmOGZkZGIyNWM2NWZiNGM4YzZlYjYzNTE4YTkKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iaW6LY1spKD8qoKSuQAgQBzoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y0NjI4MDg0Y2Y0NmYxMzliYWJiODg2YTc4MmI0YWI1OTc3ZDVkMmUgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y0NjI4MDg0Y2Y0NmYxMzliYWJiODg2YTc4MmI0YWI1OTc3ZDVkMmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNmRlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjQ2MjgwODRjZjQ2ZjEzOWJhYmI4ODZhNzgyYjRhYjU5NzdkNWQyZQpAQCAtMCwwICsxIEBACisoP6QHO1soJ6TwIQkfKApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjQ3NTNlODg4MWU0YjNjNzFmMjcyODE0OWJlN2QwNGNjNjQ4ZjZhNiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjQ3NTNlODg4MWU0YjNjNzFmMjcyODE0OWJlN2QwNGNjNjQ4ZjZhNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhkMjkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mNDc1M2U4ODgxZTRiM2M3MWYyNzI4MTQ5YmU3ZDA0Y2M2NDhmNmE2CkBAIC0wLDAgKzEgQEAKKz8qoKSuQAgQB1pu8DooYwkoO/4hKGMfIQk7XAnb5Ef9IfBjbTonClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mNGQ2ZmY2MzVhZTRmZGE0OTcyMjFkYTRiZmEzZTU5M2RmNTlhNDRlIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mNGQ2ZmY2MzVhZTRmZGE0OTcyMjFkYTRiZmEzZTU5M2RmNTlhNDRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Yzg0MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y0ZDZmZjYzNWFlNGZkYTQ5NzIyMWRhNGJmYTNlNTkzZGY1OWE0NGUKQEAgLTAsMCArMSBAQAorpKQQB/CkDy1iKW6LY1spKDoqoKSuQAgxBzoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y1MmY0ZDUxYWFhZWQwZjljM2EyMDkzNmNmNWVmZDI1ZDA2OTJmNjcgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y1MmY0ZDUxYWFhZWQwZjljM2EyMDkzNmNmNWVmZDI1ZDA2OTJmNjcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiN2JlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjUyZjRkNTFhYWFlZDBmOWMzYTIwOTM2Y2Y1ZWZkMjVkMDY5MmY2NwpAQCAtMCwwICsxIEBACiukcIPb8PCkHyGD2/BU8CoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y3Y2YzMDcyNGFiNzQwOTE4ZWVlNmU0YTZiNjY1OGFlM2Q3NzA2ZTggYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y3Y2YzMDcyNGFiNzQwOTE4ZWVlNmU0YTZiNjY1OGFlM2Q3NzA2ZTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5ZTRhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjdjZjMwNzI0YWI3NDA5MThlZWU2ZTRhNmI2NjU4YWUzZDc3MDZlOApAQCAtMCwwICsxIEBACiukCGMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y4MjM4MjhmZmQyYTYwZWZlZTM2ZjFkZTUyY2IwZjAyNGFjNWI0YmIgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y4MjM4MjhmZmQyYTYwZWZlZTM2ZjFkZTUyY2IwZjAyNGFjNWI0YmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlZTY4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjgyMzgyOGZmZDJhNjBlZmVlMzZmMWRlNTJjYjBmMDI0YWM1YjRiYgpAQCAtMCwwICsxIEBACiukH9vwIfAJYycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y4NzYwNzYxYmQ1YWI3YjQ3Mzc2YmZiYzVhNDRlMTZiMmQ1Y2E4MDAgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2Y4NzYwNzYxYmQ1YWI3YjQ3Mzc2YmZiYzVhNDRlMTZiMmQ1Y2E4MDAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3YzI0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZjg3NjA3NjFiZDVhYjdiNDczNzZiZmJjNWE0NGUxNmIyZDVjYTgwMApAQCAtMCwwICsxIEBACiukpBAH8KQPLWJpbotjWycnKC0nYmluCSEhP6QfpAhj2/AhEApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmIxNTA0MmMyNjg2MjUwODllZjZjOGFhM2Q4YTZmMTJkMWQwMmM3NCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmIxNTA0MmMyNjg2MjUwODllZjZjOGFhM2Q4YTZmMTJkMWQwMmM3NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y4NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mYjE1MDQyYzI2ODYyNTA4OWVmNmM4YWEzZDhhNmYxMmQxZDAyYzc0CkBAIC0wLDAgKzEgQEAKKxAH8FsoIQnwKCFcCSHlR/06WyghJ/BbKCEhCfBbKCEhCSHlR/0h5Uf9QSkoE1soCSEh5QpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmMzZGQ0MjkyZDY4ODRhNzcwMTk5NTk2ZjVlOWNiYzFlODY5ZTVmYiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmMzZGQ0MjkyZDY4ODRhNzcwMTk5NTk2ZjVlOWNiYzFlODY5ZTVmYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ5MGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mYzNkZDQyOTJkNjg4NGE3NzAxOTk1OTZmNWU5Y2JjMWU4NjllNWZiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmQzNGVjOTBmZThmOTIxOGZkMjVjM2VhYzE1MWFlYzk5OGNmZjZkOCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmQzNGVjOTBmZThmOTIxOGZkMjVjM2VhYzE1MWFlYzk5OGNmZjZkOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAwNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mZDM0ZWM5MGZlOGY5MjE4ZmQyNWMzZWFjMTUxYWVjOTk4Y2ZmNmQ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmRmNTQ4Y2RlOTgxZmFiNGZiMTdiZDYzYTEyNGI3NWVkZGM1YzgzNiBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmRmNTQ4Y2RlOTgxZmFiNGZiMTdiZDYzYTEyNGI3NWVkZGM1YzgzNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FlNWNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mZGY1NDhjZGU5ODFmYWI0ZmIxN2JkNjNhMTI0Yjc1ZWRkYzVjODM2CkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmluix/KIfAJYyg/pClbJx+b8CEJYycoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mZTQ3ZmIxOGIwNjRlMjY0NzljM2MzMTQwMDgyYmQwMTA2NWU4OTdhIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mZTQ3ZmIxOGIwNjRlMjY0NzljM2MzMTQwMDgyYmQwMTA2NWU4OTdhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDg0NGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfY29ycHVzL2ZlNDdmYjE4YjA2NGUyNjQ3OWMzYzMxNDAwODJiZDAxMDY1ZTg5N2EKQEAgLTAsMCArMSBAQAorKD8/gTtbKKQoJz+kBwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmYyMDk3NzM0YmQ3YmI4NDUxYWVjZTEzYzkzMzZjNDYyNDczNTE3MCBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmYyMDk3NzM0YmQ3YmI4NDUxYWVjZTEzYzkzMzZjNDYyNDczNTE3MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUzMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mZjIwOTc3MzRiZDdiYjg0NTFhZWNlMTNjOTMzNmM0NjI0NzM1MTcwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmY3ZDZmZjA2MGU2MzM1NTcwMWIyZTY1NWM4MDI5MDIzMzg0OTdkZSBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9jb3JwdXMvZmY3ZDZmZjA2MGU2MzM1NTcwMWIyZTY1NWM4MDI5MDIzMzg0OTdkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMzN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cy9mZjdkNmZmMDYwZTYzMzU1NzAxYjJlNjU1YzgwMjkwMjMzODQ5N2RlCkBAIC0wLDAgKzEgQEAKK6SkEAfwpA8tYmlui2OXKlsppA8oLaTb8CfwIWKDY2luCTshIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdC5jIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3N2ZhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdycGMvZ3JwYy5oPgorI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9hbGxvYy5oPgorCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oIgorCitzdGF0aWMgdm9pZCBvbmhkcih2b2lkICp1ZCwgZ3JwY19tZGVsZW0gKm1kKSB7IEdSUENfTURFTEVNX1VOUkVGKG1kKTsgfQorCitpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBncnBjX3Rlc3Rfb25seV9zZXRfbWV0YWRhdGFfaGFzaF9zZWVkKDApOworICBncnBjX2luaXQoKTsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyIHBhcnNlcjsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX2luaXQoJnBhcnNlcik7CisgIHBhcnNlci5vbl9oZWFkZXIgPSBvbmhkcjsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX3BhcnNlKCZwYXJzZXIsIGRhdGEsIGRhdGEgKyBzaXplKTsKKyAgZ3JwY19jaHR0cDJfaHBhY2tfcGFyc2VyX2Rlc3Ryb3koJnBhcnNlcik7CisgIGdycGNfc2h1dGRvd24oKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfdGVzdC5jIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX3Rlc3QuYwppbmRleCA0NDU2ZTE5Li4xZWM0Nzk3IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl90ZXN0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCIKIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZV90ZXN0LmMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZV90ZXN0LmMKaW5kZXggNGMwZmEyZS4uNmEyZGFkZiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGVfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3N0cmluZ191dGlsLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKICNkZWZpbmUgTE9HX1RFU1QoeCkgZ3ByX2xvZyhHUFJfSU5GTywgIiVzIiwgeCkKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uX3Rlc3QuYyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uX3Rlc3QuYwppbmRleCBlMjcyOWEwLi44ZjM5ZmYzIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbl90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb25fdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9sb2cuaD4KICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwX3Rlc3QuYyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXBfdGVzdC5jCmluZGV4IDUyN2QyZmUuLmM1MTQ4MTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXBfdGVzdC5jCisrKyBiL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXBfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+CiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZ190ZXN0LmMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nX3Rlc3QuYwppbmRleCBiN2RkNjBlLi43Y2M2OThlIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nX3Rlc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC91c2VmdWwuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKICNkZWZpbmUgTE9HX1RFU1QoeCkgZ3ByX2xvZyhHUFJfSU5GTywgIiVzIiwgeCkKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludF90ZXN0LmMgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnRfdGVzdC5jCmluZGV4IGYwNjExNmEuLjg1YzZjODQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludF90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50X3Rlc3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIgogCiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zbGljZS5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGVfdGVzdC5jIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGVfdGVzdC5jCmluZGV4IDRiMmQwYWEuLmIzMTBkNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlX3Rlc3QuYworKysgYi90ZXN0L2NvcmUvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZV90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfdGVzdC5jIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV90ZXN0LmMKaW5kZXggOTI4ZmJhNy4uODM2YjUwMyAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV90ZXN0LmMKKysrIGIvdGVzdC9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV90ZXN0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw3ICszMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCkBAIC00MCw4ICs0MCw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuaCIKIAogI2RlZmluZSBMT0dfVEVTVCh4KSBncHJfbG9nKEdQUl9JTkZPLCAiJXMiLCB4KQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfdGVzdC5jIGIvdGVzdC9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfdGVzdC5jCmluZGV4IDY2N2QzZjAuLjQ5YjViOGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X3Rlc3QuYworKysgYi90ZXN0L2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV90ZXN0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTQyLDkgKzQyLDkgQEAKIAogI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL3Rlc3QvY29yZS91dGlsL3BvcnRfcG9zaXguYyBiL3Rlc3QvY29yZS91dGlsL3BvcnRfcG9zaXguYwppbmRleCBkMjExMDE2Li5mZWE3ZTUyIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdXRpbC9wb3J0X3Bvc2l4LmMKKysrIGIvdGVzdC9jb3JlL3V0aWwvcG9ydF9wb3NpeC5jCkBAIC00OSw4ICs0OSw4IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zdHJpbmdfdXRpbC5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydF9zZXJ2ZXJfY2xpZW50LmgiCiAKICNkZWZpbmUgTlVNX1JBTkRPTV9QT1JUU19UT19QSUNLIDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3V0aWwvcG9ydF9zZXJ2ZXJfY2xpZW50LmMgYi90ZXN0L2NvcmUvdXRpbC9wb3J0X3NlcnZlcl9jbGllbnQuYwppbmRleCBjN2I5ZDYzLi5lYTAxYjQ2IDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdXRpbC9wb3J0X3NlcnZlcl9jbGllbnQuYworKysgYi90ZXN0L2NvcmUvdXRpbC9wb3J0X3NlcnZlcl9jbGllbnQuYwpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgZnJlZXJlcSB7CiAgIGdwcl9tdSAqbXU7CmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdXRpbC9wb3J0X3dpbmRvd3MuYyBiL3Rlc3QvY29yZS91dGlsL3BvcnRfd2luZG93cy5jCmluZGV4IDRjYmVkYzAuLjA4MTc4MmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29yZS91dGlsL3BvcnRfd2luZG93cy5jCisrKyBiL3Rlc3QvY29yZS91dGlsL3BvcnRfd2luZG93cy5jCkBAIC00Niw5ICs0Niw5IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2FsbG9jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0X3NlcnZlcl9jbGllbnQuaCIKIAogI2RlZmluZSBOVU1fUkFORE9NX1BPUlRTX1RPX1BJQ0sgMTAwCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdXRpbC9yZWNvbm5lY3Rfc2VydmVyLmMgYi90ZXN0L2NvcmUvdXRpbC9yZWNvbm5lY3Rfc2VydmVyLmMKaW5kZXggNTcyMjVhYS4uMGU3YTQ4NiAxMDA2NDQKLS0tIGEvdGVzdC9jb3JlL3V0aWwvcmVjb25uZWN0X3NlcnZlci5jCisrKyBiL3Rlc3QvY29yZS91dGlsL3JlY29ubmVjdF9zZXJ2ZXIuYwpAQCAtNDAsOSArNDAsOSBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfdGNwX3NlcnZlci5oIgogCmRpZmYgLS1naXQgYS90ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5jIGIvdGVzdC9jb3JlL3V0aWwvdGVzdF9jb25maWcuYwppbmRleCBmNDA4MDQ4Li43ZmZhYTZmIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5jCisrKyBiL3Rlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmMKQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogCiBkb3VibGUgZ19maXh0dXJlX3Nsb3dkb3duX2ZhY3RvciA9IDEuMDsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3V0aWwvdGVzdF90Y3Bfc2VydmVyLmMgYi90ZXN0L2NvcmUvdXRpbC90ZXN0X3RjcF9zZXJ2ZXIuYwppbmRleCBhYjM3OTQ0Li43NzAzZWMwIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdXRpbC90ZXN0X3RjcF9zZXJ2ZXIuYworKysgYi90ZXN0L2NvcmUvdXRpbC90ZXN0X3RjcF9zZXJ2ZXIuYwpAQCAtNDAsOSArNDAsOSBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC9zeW5jLmg+CiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiCi0jaW5jbHVkZSAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogCiBzdGF0aWMgdm9pZCBvbl9zZXJ2ZXJfZGVzdHJveWVkKGdycGNfZXhlY19jdHggKmV4ZWNfY3R4LCB2b2lkICpkYXRhLApkaWZmIC0tZ2l0IGEvdGVzdC9jb3JlL3V0aWwvdGVzdF90Y3Bfc2VydmVyLmggYi90ZXN0L2NvcmUvdXRpbC90ZXN0X3RjcF9zZXJ2ZXIuaAppbmRleCAxNWZjYjRmLi43ZDEwMjVmIDEwMDY0NAotLS0gYS90ZXN0L2NvcmUvdXRpbC90ZXN0X3RjcF9zZXJ2ZXIuaAorKysgYi90ZXN0L2NvcmUvdXRpbC90ZXN0X3RjcF9zZXJ2ZXIuaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBHUlBDX1RFU1RfQ09SRV9VVElMX1RFU1RfVENQX1NFUlZFUl9ICiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIgogCiB0eXBlZGVmIHN0cnVjdCB0ZXN0X3RjcF9zZXJ2ZXIgewogICBncnBjX3RjcF9zZXJ2ZXIgKnRjcF9zZXJ2ZXI7CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9jb21tb24vYXV0aF9wcm9wZXJ0eV9pdGVyYXRvcl90ZXN0LmNjIGIvdGVzdC9jcHAvY29tbW9uL2F1dGhfcHJvcGVydHlfaXRlcmF0b3JfdGVzdC5jYwppbmRleCA0YzZkZDYwLi40YjVjZjAyIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9jb21tb24vYXV0aF9wcm9wZXJ0eV9pdGVyYXRvcl90ZXN0LmNjCisrKyBiL3Rlc3QvY3BwL2NvbW1vbi9hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yX3Rlc3QuY2MKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlICJ0ZXN0L2NwcC91dGlsL3N0cmluZ19yZWZfaGVscGVyLmgiCiAKIGV4dGVybiAiQyIgewotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIgogfQogCiB1c2luZyA6OmdycGM6OnRlc3Rpbmc6OlRvU3RyaW5nOwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvY29tbW9uL3NlY3VyZV9hdXRoX2NvbnRleHRfdGVzdC5jYyBiL3Rlc3QvY3BwL2NvbW1vbi9zZWN1cmVfYXV0aF9jb250ZXh0X3Rlc3QuY2MKaW5kZXggMTIzZDQ5NC4uYzQyMTkxMCAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvY29tbW9uL3NlY3VyZV9hdXRoX2NvbnRleHRfdGVzdC5jYworKysgYi90ZXN0L2NwcC9jb21tb24vc2VjdXJlX2F1dGhfY29udGV4dF90ZXN0LmNjCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAidGVzdC9jcHAvdXRpbC9zdHJpbmdfcmVmX2hlbHBlci5oIgogCiBleHRlcm4gIkMiIHsKLSNpbmNsdWRlICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIKIH0KIAogdXNpbmcgZ3JwYzo6dGVzdGluZzo6VG9TdHJpbmc7CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9lbmQyZW5kL2FzeW5jX2VuZDJlbmRfdGVzdC5jYyBiL3Rlc3QvY3BwL2VuZDJlbmQvYXN5bmNfZW5kMmVuZF90ZXN0LmNjCmluZGV4IGRjOGMyYmIuLmQ4YWE0YzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL2VuZDJlbmQvYXN5bmNfZW5kMmVuZF90ZXN0LmNjCisrKyBiL3Rlc3QvY3BwL2VuZDJlbmQvYXN5bmNfZW5kMmVuZF90ZXN0LmNjCkBAIC01Myw3ICs1Myw3IEBACiAjaW5jbHVkZSAidGVzdC9jcHAvdXRpbC9zdHJpbmdfcmVmX2hlbHBlci5oIgogCiAjaWZkZWYgR1BSX1BPU0lYX1NPQ0tFVAotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgogI2VuZGlmCiAKIHVzaW5nIGdycGM6OnRlc3Rpbmc6OkVjaG9SZXF1ZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvZW5kMmVuZC9lbmQyZW5kX3Rlc3QuY2MgYi90ZXN0L2NwcC9lbmQyZW5kL2VuZDJlbmRfdGVzdC5jYwppbmRleCA0NzU5ODE4Li5mZjM4OGMwIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9lbmQyZW5kL2VuZDJlbmRfdGVzdC5jYworKysgYi90ZXN0L2NwcC9lbmQyZW5kL2VuZDJlbmRfdGVzdC5jYwpAQCAtNDgsNyArNDgsNyBAQAogI2luY2x1ZGUgPGdycGMvc3VwcG9ydC90aW1lLmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiCiAjaW5jbHVkZSAic3JjL3Byb3RvL2dycGMvdGVzdGluZy9kdXBsaWNhdGUvZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5oIgogI2luY2x1ZGUgInNyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5ncnBjLnBiLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvZW5kMmVuZC9zaHV0ZG93bl90ZXN0LmNjIGIvdGVzdC9jcHAvZW5kMmVuZC9zaHV0ZG93bl90ZXN0LmNjCmluZGV4IGRiYmRhM2EuLjYyYmI2YjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL2VuZDJlbmQvc2h1dGRvd25fdGVzdC5jYworKysgYi90ZXN0L2NwcC9lbmQyZW5kL3NodXRkb3duX3Rlc3QuY2MKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3luYy5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIgogI2luY2x1ZGUgInNyYy9wcm90by9ncnBjL3Rlc3RpbmcvZWNoby5ncnBjLnBiLmgiCiAjaW5jbHVkZSAidGVzdC9jb3JlL3V0aWwvcG9ydC5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3Rlc3RfY29uZmlnLmgiCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9lbmQyZW5kL3RocmVhZF9zdHJlc3NfdGVzdC5jYyBiL3Rlc3QvY3BwL2VuZDJlbmQvdGhyZWFkX3N0cmVzc190ZXN0LmNjCmluZGV4IDExNGQ3MTUuLjNmNzVhMGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL2VuZDJlbmQvdGhyZWFkX3N0cmVzc190ZXN0LmNjCisrKyBiL3Rlc3QvY3BwL2VuZDJlbmQvdGhyZWFkX3N0cmVzc190ZXN0LmNjCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L3RpbWUuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIKICNpbmNsdWRlICJzcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2R1cGxpY2F0ZS9lY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmgiCiAjaW5jbHVkZSAic3JjL3Byb3RvL2dycGMvdGVzdGluZy9lY2hvLmdycGMucGIuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCkBAIC01OCw2ICs1OCw3IEBACiBjb25zdCBpbnQga051bVRocmVhZHMgPSAxMDA7ICAvLyBOdW1iZXIgb2YgdGhyZWFkcwogY29uc3QgaW50IGtOdW1Bc3luY1NlbmRUaHJlYWRzID0gMjsKIGNvbnN0IGludCBrTnVtQXN5bmNSZWNlaXZlVGhyZWFkcyA9IDUwOworY29uc3QgaW50IGtOdW1Bc3luY1NlcnZlclRocmVhZHMgPSA1MDsKIGNvbnN0IGludCBrTnVtUnBjcyA9IDEwMDA7ICAvLyBOdW1iZXIgb2YgUlBDcyBwZXIgdGhyZWFkCiAKIG5hbWVzcGFjZSBncnBjIHsKQEAgLTE3NCwyMyArMTc1LDEyIEBACiAgIH0KIH07CiAKK3RlbXBsYXRlIDxjbGFzcyBTZXJ2aWNlPgogY2xhc3MgQ29tbW9uU3RyZXNzVGVzdCB7CiAgcHVibGljOgogICBDb21tb25TdHJlc3NUZXN0KCkgOiBrTWF4TWVzc2FnZVNpemVfKDgxOTIpIHt9Ci0gIHZvaWQgU2V0VXAoKSB7Ci0gICAgaW50IHBvcnQgPSBncnBjX3BpY2tfdW51c2VkX3BvcnRfb3JfZGllKCk7Ci0gICAgc2VydmVyX2FkZHJlc3NfIDw8ICJsb2NhbGhvc3Q6IiA8PCBwb3J0OwotICAgIC8vIFNldHVwIHNlcnZlcgotICAgIFNlcnZlckJ1aWxkZXIgYnVpbGRlcjsKLSAgICBidWlsZGVyLkFkZExpc3RlbmluZ1BvcnQoc2VydmVyX2FkZHJlc3NfLnN0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlY3VyZVNlcnZlckNyZWRlbnRpYWxzKCkpOwotICAgIGJ1aWxkZXIuUmVnaXN0ZXJTZXJ2aWNlKCZzZXJ2aWNlXyk7Ci0gICAgYnVpbGRlci5TZXRNYXhNZXNzYWdlU2l6ZSgKLSAgICAgICAga01heE1lc3NhZ2VTaXplXyk7ICAvLyBGb3IgdGVzdGluZyBtYXggbWVzc2FnZSBzaXplLgotICAgIGJ1aWxkZXIuUmVnaXN0ZXJTZXJ2aWNlKCZkdXBfcGtnX3NlcnZpY2VfKTsKLSAgICBzZXJ2ZXJfID0gYnVpbGRlci5CdWlsZEFuZFN0YXJ0KCk7Ci0gIH0KLSAgdm9pZCBUZWFyRG93bigpIHsgc2VydmVyXy0+U2h1dGRvd24oKTsgfQorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpID0gMDsKICAgdm9pZCBSZXNldFN0dWIoKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPENoYW5uZWw+IGNoYW5uZWwgPQogICAgICAgICBDcmVhdGVDaGFubmVsKHNlcnZlcl9hZGRyZXNzXy5zdHIoKSwgSW5zZWN1cmVDaGFubmVsQ3JlZGVudGlhbHMoKSk7CkBAIC0xOTgsMTUgKzE4OCwxMzcgQEAKICAgfQogICBncnBjOjp0ZXN0aW5nOjpFY2hvVGVzdFNlcnZpY2U6OlN0dWIqIEdldFN0dWIoKSB7IHJldHVybiBzdHViXy5nZXQoKTsgfQogCisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwU3RhcnQoU2VydmVyQnVpbGRlciogYnVpbGRlciwgU2VydmljZSogc2VydmljZSkgeworICAgIGludCBwb3J0ID0gZ3JwY19waWNrX3VudXNlZF9wb3J0X29yX2RpZSgpOworICAgIHNlcnZlcl9hZGRyZXNzXyA8PCAibG9jYWxob3N0OiIgPDwgcG9ydDsKKyAgICAvLyBTZXR1cCBzZXJ2ZXIKKyAgICBidWlsZGVyLT5BZGRMaXN0ZW5pbmdQb3J0KHNlcnZlcl9hZGRyZXNzXy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VjdXJlU2VydmVyQ3JlZGVudGlhbHMoKSk7CisgICAgYnVpbGRlci0+UmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2UpOworICAgIGJ1aWxkZXItPlNldE1heE1lc3NhZ2VTaXplKAorICAgICAgICBrTWF4TWVzc2FnZVNpemVfKTsgIC8vIEZvciB0ZXN0aW5nIG1heCBtZXNzYWdlIHNpemUuCisgICAgYnVpbGRlci0+UmVnaXN0ZXJTZXJ2aWNlKCZkdXBfcGtnX3NlcnZpY2VfKTsKKyAgfQorICB2b2lkIFNldFVwRW5kKFNlcnZlckJ1aWxkZXIqIGJ1aWxkZXIpIHsgc2VydmVyXyA9IGJ1aWxkZXItPkJ1aWxkQW5kU3RhcnQoKTsgfQorICB2b2lkIFRlYXJEb3duU3RhcnQoKSB7IHNlcnZlcl8tPlNodXRkb3duKCk7IH0KKyAgdm9pZCBUZWFyRG93bkVuZCgpIHt9CisKICBwcml2YXRlOgogICBzdGQ6OnVuaXF1ZV9wdHI8Z3JwYzo6dGVzdGluZzo6RWNob1Rlc3RTZXJ2aWNlOjpTdHViPiBzdHViXzsKICAgc3RkOjp1bmlxdWVfcHRyPFNlcnZlcj4gc2VydmVyXzsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNlcnZlcl9hZGRyZXNzXzsKICAgY29uc3QgaW50IGtNYXhNZXNzYWdlU2l6ZV87Ci0gIFRlc3RTZXJ2aWNlSW1wbCBzZXJ2aWNlXzsKICAgVGVzdFNlcnZpY2VJbXBsRHVwUGtnIGR1cF9wa2dfc2VydmljZV87CiB9OwogCitjbGFzcyBDb21tb25TdHJlc3NUZXN0U3luY1NlcnZlciA6IHB1YmxpYyBDb21tb25TdHJlc3NUZXN0PFRlc3RTZXJ2aWNlSW1wbD4geworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIEdSUENfT1ZFUlJJREUgeworICAgIFNlcnZlckJ1aWxkZXIgYnVpbGRlcjsKKyAgICBTZXRVcFN0YXJ0KCZidWlsZGVyLCAmc2VydmljZV8pOworICAgIFNldFVwRW5kKCZidWlsZGVyKTsKKyAgfQorICB2b2lkIFRlYXJEb3duKCkgR1JQQ19PVkVSUklERSB7CisgICAgVGVhckRvd25TdGFydCgpOworICAgIFRlYXJEb3duRW5kKCk7CisgIH0KKworIHByaXZhdGU6CisgIFRlc3RTZXJ2aWNlSW1wbCBzZXJ2aWNlXzsKK307CisKK2NsYXNzIENvbW1vblN0cmVzc1Rlc3RBc3luY1NlcnZlcgorICAgIDogcHVibGljIENvbW1vblN0cmVzc1Rlc3Q8OjpncnBjOjp0ZXN0aW5nOjpFY2hvVGVzdFNlcnZpY2U6OkFzeW5jU2VydmljZT4geworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIEdSUENfT1ZFUlJJREUgeworICAgIHNodXR0aW5nX2Rvd25fID0gZmFsc2U7CisgICAgU2VydmVyQnVpbGRlciBidWlsZGVyOworICAgIFNldFVwU3RhcnQoJmJ1aWxkZXIsICZzZXJ2aWNlXyk7CisgICAgY3FfID0gYnVpbGRlci5BZGRDb21wbGV0aW9uUXVldWUoKTsKKyAgICBTZXRVcEVuZCgmYnVpbGRlcik7CisgICAgY29udGV4dHNfID0gbmV3IENvbnRleHRba051bUFzeW5jU2VydmVyVGhyZWFkcyAqIDEwMF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQXN5bmNTZXJ2ZXJUaHJlYWRzICogMTAwOyBpKyspIHsKKyAgICAgIFJlZnJlc2hDb250ZXh0KGkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1Bc3luY1NlcnZlclRocmVhZHM7IGkrKykgeworICAgICAgc2VydmVyX3RocmVhZHNfLnB1c2hfYmFjaygKKyAgICAgICAgICBuZXcgc3RkOjp0aHJlYWQoJkNvbW1vblN0cmVzc1Rlc3RBc3luY1NlcnZlcjo6UHJvY2Vzc1JwY3MsIHRoaXMpKTsKKyAgICB9CisgIH0KKyAgdm9pZCBUZWFyRG93bigpIEdSUENfT1ZFUlJJREUgeworICAgIHsKKyAgICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBsKG11Xyk7CisgICAgICBUZWFyRG93blN0YXJ0KCk7CisgICAgICBzaHV0dGluZ19kb3duXyA9IHRydWU7CisgICAgICBjcV8tPlNodXRkb3duKCk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQXN5bmNTZXJ2ZXJUaHJlYWRzOyBpKyspIHsKKyAgICAgIHNlcnZlcl90aHJlYWRzX1tpXS0+am9pbigpOworICAgICAgZGVsZXRlIHNlcnZlcl90aHJlYWRzX1tpXTsKKyAgICB9CisKKyAgICB2b2lkKiBpZ25vcmVkX3RhZzsKKyAgICBib29sIGlnbm9yZWRfb2s7CisgICAgd2hpbGUgKGNxXy0+TmV4dCgmaWdub3JlZF90YWcsICZpZ25vcmVkX29rKSkKKyAgICAgIDsKKyAgICBUZWFyRG93bkVuZCgpOworICAgIGRlbGV0ZVtdIGNvbnRleHRzXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBQcm9jZXNzUnBjcygpIHsKKyAgICB2b2lkKiB0YWc7CisgICAgYm9vbCBvazsKKyAgICB3aGlsZSAoY3FfLT5OZXh0KCZ0YWcsICZvaykpIHsKKyAgICAgIGlmIChvaykgeworICAgICAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4ocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4odGFnKSk7CisgICAgICAgIHN3aXRjaCAoY29udGV4dHNfW2ldLnN0YXRlKSB7CisgICAgICAgICAgY2FzZSBDb250ZXh0OjpSRUFEWTogeworICAgICAgICAgICAgY29udGV4dHNfW2ldLnN0YXRlID0gQ29udGV4dDo6RE9ORTsKKyAgICAgICAgICAgIEVjaG9SZXNwb25zZSBzZW5kX3Jlc3BvbnNlOworICAgICAgICAgICAgc2VuZF9yZXNwb25zZS5zZXRfbWVzc2FnZShjb250ZXh0c19baV0ucmVjdl9yZXF1ZXN0Lm1lc3NhZ2UoKSk7CisgICAgICAgICAgICBjb250ZXh0c19baV0ucmVzcG9uc2Vfd3JpdGVyLT5GaW5pc2goc2VuZF9yZXNwb25zZSwgU3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQ29udGV4dDo6RE9ORToKKyAgICAgICAgICAgIFJlZnJlc2hDb250ZXh0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBSZWZyZXNoQ29udGV4dChpbnQgaSkgeworICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBsKG11Xyk7CisgICAgaWYgKCFzaHV0dGluZ19kb3duXykgeworICAgICAgY29udGV4dHNfW2ldLnN0YXRlID0gQ29udGV4dDo6UkVBRFk7CisgICAgICBjb250ZXh0c19baV0uc3J2X2N0eC5yZXNldChuZXcgU2VydmVyQ29udGV4dCk7CisgICAgICBjb250ZXh0c19baV0ucmVzcG9uc2Vfd3JpdGVyLnJlc2V0KAorICAgICAgICAgIG5ldyBncnBjOjpTZXJ2ZXJBc3luY1Jlc3BvbnNlV3JpdGVyPEVjaG9SZXNwb25zZT4oCisgICAgICAgICAgICAgIGNvbnRleHRzX1tpXS5zcnZfY3R4LmdldCgpKSk7CisgICAgICBzZXJ2aWNlXy5SZXF1ZXN0RWNobyhjb250ZXh0c19baV0uc3J2X2N0eC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0c19baV0ucmVjdl9yZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHNfW2ldLnJlc3BvbnNlX3dyaXRlci5nZXQoKSwgY3FfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3FfLmdldCgpLCAodm9pZCopKGludHB0cl90KWkpOworICAgIH0KKyAgfQorICBzdHJ1Y3QgQ29udGV4dCB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFNlcnZlckNvbnRleHQ+IHNydl9jdHg7CisgICAgc3RkOjp1bmlxdWVfcHRyPGdycGM6OlNlcnZlckFzeW5jUmVzcG9uc2VXcml0ZXI8RWNob1Jlc3BvbnNlPj4KKyAgICAgICAgcmVzcG9uc2Vfd3JpdGVyOworICAgIEVjaG9SZXF1ZXN0IHJlY3ZfcmVxdWVzdDsKKyAgICBlbnVtIHsgUkVBRFksIERPTkUgfSBzdGF0ZTsKKyAgfSAqIGNvbnRleHRzXzsKKyAgOjpncnBjOjp0ZXN0aW5nOjpFY2hvVGVzdFNlcnZpY2U6OkFzeW5jU2VydmljZSBzZXJ2aWNlXzsKKyAgc3RkOjp1bmlxdWVfcHRyPFNlcnZlckNvbXBsZXRpb25RdWV1ZT4gY3FfOworICBib29sIHNodXR0aW5nX2Rvd25fOworICBtdXRleCBtdV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkKj4gc2VydmVyX3RocmVhZHNfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIENvbW1vbj4KIGNsYXNzIEVuZDJlbmRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiAgcHJvdGVjdGVkOgogICBFbmQyZW5kVGVzdCgpIHt9CkBAIC0yMTQsNyArMzI2LDcgQEAKICAgdm9pZCBUZWFyRG93bigpIEdSUENfT1ZFUlJJREUgeyBjb21tb25fLlRlYXJEb3duKCk7IH0KICAgdm9pZCBSZXNldFN0dWIoKSB7IGNvbW1vbl8uUmVzZXRTdHViKCk7IH0KIAotICBDb21tb25TdHJlc3NUZXN0IGNvbW1vbl87CisgIENvbW1vbiBjb21tb25fOwogfTsKIAogc3RhdGljIHZvaWQgU2VuZFJwYyhncnBjOjp0ZXN0aW5nOjpFY2hvVGVzdFNlcnZpY2U6OlN0dWIqIHN0dWIsIGludCBudW1fcnBjcykgewpAQCAtMjMwLDExICszNDIsMTYgQEAKICAgfQogfQogCi1URVNUX0YoRW5kMmVuZFRlc3QsIFRocmVhZFN0cmVzcykgewotICBjb21tb25fLlJlc2V0U3R1YigpOwordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPENvbW1vblN0cmVzc1Rlc3RTeW5jU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblN0cmVzc1Rlc3RBc3luY1NlcnZlcj4KKyAgICBDb21tb25UeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShFbmQyZW5kVGVzdCwgQ29tbW9uVHlwZXMpOworVFlQRURfVEVTVChFbmQyZW5kVGVzdCwgVGhyZWFkU3RyZXNzKSB7CisgIHRoaXMtPmNvbW1vbl8uUmVzZXRTdHViKCk7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkKj4gdGhyZWFkczsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtVGhyZWFkczsgKytpKSB7Ci0gICAgdGhyZWFkcy5wdXNoX2JhY2sobmV3IHN0ZDo6dGhyZWFkKFNlbmRScGMsIGNvbW1vbl8uR2V0U3R1YigpLCBrTnVtUnBjcykpOworICAgIHRocmVhZHMucHVzaF9iYWNrKAorICAgICAgICBuZXcgc3RkOjp0aHJlYWQoU2VuZFJwYywgdGhpcy0+Y29tbW9uXy5HZXRTdHViKCksIGtOdW1ScGNzKSk7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtVGhyZWFkczsgKytpKSB7CiAgICAgdGhyZWFkc1tpXS0+am9pbigpOwpAQCAtMjQyLDYgKzM1OSw3IEBACiAgIH0KIH0KIAordGVtcGxhdGUgPGNsYXNzIENvbW1vbj4KIGNsYXNzIEFzeW5jQ2xpZW50RW5kMmVuZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKICBwcm90ZWN0ZWQ6CiAgIEFzeW5jQ2xpZW50RW5kMmVuZFRlc3QoKSA6IHJwY3Nfb3V0c3RhbmRpbmdfKDApIHt9CkBAIC0zMDksMzEgKzQyNywzMyBAQAogICAgIH0KICAgfQogCi0gIENvbW1vblN0cmVzc1Rlc3QgY29tbW9uXzsKKyAgQ29tbW9uIGNvbW1vbl87CiAgIENvbXBsZXRpb25RdWV1ZSBjcV87CiAgIG11dGV4IG11XzsKICAgY29uZGl0aW9uX3ZhcmlhYmxlIGN2XzsKICAgaW50IHJwY3Nfb3V0c3RhbmRpbmdfOwogfTsKIAotVEVTVF9GKEFzeW5jQ2xpZW50RW5kMmVuZFRlc3QsIFRocmVhZFN0cmVzcykgewotICBjb21tb25fLlJlc2V0U3R1YigpOworVFlQRURfVEVTVF9DQVNFKEFzeW5jQ2xpZW50RW5kMmVuZFRlc3QsIENvbW1vblR5cGVzKTsKK1RZUEVEX1RFU1QoQXN5bmNDbGllbnRFbmQyZW5kVGVzdCwgVGhyZWFkU3RyZXNzKSB7CisgIHRoaXMtPmNvbW1vbl8uUmVzZXRTdHViKCk7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkICo+IHNlbmRfdGhyZWFkcywgY29tcGxldGlvbl90aHJlYWRzOwogICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1Bc3luY1JlY2VpdmVUaHJlYWRzOyArK2kpIHsKICAgICBjb21wbGV0aW9uX3RocmVhZHMucHVzaF9iYWNrKG5ldyBzdGQ6OnRocmVhZCgKLSAgICAgICAgJkFzeW5jQ2xpZW50RW5kMmVuZFRlc3RfVGhyZWFkU3RyZXNzX1Rlc3Q6OkFzeW5jQ29tcGxldGVScGMsIHRoaXMpKTsKKyAgICAgICAgJkFzeW5jQ2xpZW50RW5kMmVuZFRlc3RfVGhyZWFkU3RyZXNzX1Rlc3Q8VHlwZVBhcmFtPjo6QXN5bmNDb21wbGV0ZVJwYywKKyAgICAgICAgdGhpcykpOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFzeW5jU2VuZFRocmVhZHM7ICsraSkgewotICAgIHNlbmRfdGhyZWFkcy5wdXNoX2JhY2soCi0gICAgICAgIG5ldyBzdGQ6OnRocmVhZCgmQXN5bmNDbGllbnRFbmQyZW5kVGVzdF9UaHJlYWRTdHJlc3NfVGVzdDo6QXN5bmNTZW5kUnBjLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywga051bVJwY3MpKTsKKyAgICBzZW5kX3RocmVhZHMucHVzaF9iYWNrKG5ldyBzdGQ6OnRocmVhZCgKKyAgICAgICAgJkFzeW5jQ2xpZW50RW5kMmVuZFRlc3RfVGhyZWFkU3RyZXNzX1Rlc3Q8VHlwZVBhcmFtPjo6QXN5bmNTZW5kUnBjLAorICAgICAgICB0aGlzLCBrTnVtUnBjcykpOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFzeW5jU2VuZFRocmVhZHM7ICsraSkgewogICAgIHNlbmRfdGhyZWFkc1tpXS0+am9pbigpOwogICAgIGRlbGV0ZSBzZW5kX3RocmVhZHNbaV07CiAgIH0KIAotICBXYWl0KCk7CisgIHRoaXMtPldhaXQoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQXN5bmNSZWNlaXZlVGhyZWFkczsgKytpKSB7CiAgICAgY29tcGxldGlvbl90aHJlYWRzW2ldLT5qb2luKCk7CiAgICAgZGVsZXRlIGNvbXBsZXRpb25fdGhyZWFkc1tpXTsKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL2VuZDJlbmQvem9va2VlcGVyX3Rlc3QuY2MgYi90ZXN0L2NwcC9lbmQyZW5kL3pvb2tlZXBlcl90ZXN0LmNjCmluZGV4IGJiZjFiMGUuLmYxYjZhYzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL2VuZDJlbmQvem9va2VlcGVyX3Rlc3QuY2MKKysrIGIvdGVzdC9jcHAvZW5kMmVuZC96b29rZWVwZXJfdGVzdC5jYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8em9va2VlcGVyL3pvb2tlZXBlci5oPgogCi0jaW5jbHVkZSAic3JjL2NvcmUvc3VwcG9ydC9lbnYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnYuaCIKICNpbmNsdWRlICJzcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL2VjaG8uZ3JwYy5wYi5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvZ3JwY2xiL2dycGNsYl9hcGlfdGVzdC5jYyBiL3Rlc3QvY3BwL2dycGNsYi9ncnBjbGJfYXBpX3Rlc3QuY2MKaW5kZXggYmQ0ODg1Zi4uYmM4MjE5YyAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvZ3JwY2xiL2dycGNsYl9hcGlfdGVzdC5jYworKysgYi90ZXN0L2NwcC9ncnBjbGIvZ3JwY2xiX2FwaV90ZXN0LmNjCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIKICNpbmNsdWRlICJzcmMvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiICAvLyBDKysgdmVyc2lvbgogCiBuYW1lc3BhY2UgZ3JwYyB7CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9pbnRlcm9wL2NsaWVudF9oZWxwZXIuaCBiL3Rlc3QvY3BwL2ludGVyb3AvY2xpZW50X2hlbHBlci5oCmluZGV4IDBmNzc0NzQuLjA3OTA0NjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL2ludGVyb3AvY2xpZW50X2hlbHBlci5oCisrKyBiL3Rlc3QvY3BwL2ludGVyb3AvY2xpZW50X2hlbHBlci5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzgsNyArMzgsNyBAQAogCiAjaW5jbHVkZSA8Z3JwYysrL2NoYW5uZWwuaD4KIAotI2luY2x1ZGUgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIgogCiBuYW1lc3BhY2UgZ3JwYyB7CiBuYW1lc3BhY2UgdGVzdGluZyB7CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9pbnRlcm9wL2ludGVyb3BfY2xpZW50LmNjIGIvdGVzdC9jcHAvaW50ZXJvcC9pbnRlcm9wX2NsaWVudC5jYwppbmRleCA1MTRkNGZhLi4yZmNkOWYzIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9pbnRlcm9wL2ludGVyb3BfY2xpZW50LmNjCisrKyBiL3Rlc3QvY3BwL2ludGVyb3AvaW50ZXJvcF9jbGllbnQuY2MKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvc3RyaW5nX3V0aWwuaD4KICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdXNlZnVsLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmgiCiAjaW5jbHVkZSAic3JjL3Byb3RvL2dycGMvdGVzdGluZy9lbXB0eS5ncnBjLnBiLmgiCiAjaW5jbHVkZSAic3JjL3Byb3RvL2dycGMvdGVzdGluZy9tZXNzYWdlcy5ncnBjLnBiLmgiCiAjaW5jbHVkZSAic3JjL3Byb3RvL2dycGMvdGVzdGluZy90ZXN0LmdycGMucGIuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL2ludGVyb3AvaW50ZXJvcF90ZXN0LmNjIGIvdGVzdC9jcHAvaW50ZXJvcC9pbnRlcm9wX3Rlc3QuY2MKaW5kZXggZjBmY2NmNC4uZjFmYjNjOSAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvaW50ZXJvcC9pbnRlcm9wX3Rlc3QuY2MKKysrIGIvdGVzdC9jcHAvaW50ZXJvcC9pbnRlcm9wX3Rlc3QuY2MKQEAgLTUxLDggKzUxLDggQEAKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC9wb3J0LmgiCiAKIGV4dGVybiAiQyIgewotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgotI2luY2x1ZGUgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZy5oIgogfQogCiBpbnQgdGVzdF9jbGllbnQoY29uc3QgY2hhciogcm9vdCwgY29uc3QgY2hhciogaG9zdCwgaW50IHBvcnQpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL2ludGVyb3Avc2VydmVyX2hlbHBlci5jYyBiL3Rlc3QvY3BwL2ludGVyb3Avc2VydmVyX2hlbHBlci5jYwppbmRleCA5YTI4NDA5Li45N2MzOWM0IDEwMDY0NAotLS0gYS90ZXN0L2NwcC9pbnRlcm9wL3NlcnZlcl9oZWxwZXIuY2MKKysrIGIvdGVzdC9jcHAvaW50ZXJvcC9zZXJ2ZXJfaGVscGVyLmNjCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KICNpbmNsdWRlIDxncnBjKysvc2VjdXJpdHkvc2VydmVyX2NyZWRlbnRpYWxzLmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvZW5kMmVuZC9kYXRhL3NzbF90ZXN0X2RhdGEuaCIKIAogREVDTEFSRV9ib29sKHVzZV90bHMpOwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcXBzL2NsaWVudF9zeW5jLmNjIGIvdGVzdC9jcHAvcXBzL2NsaWVudF9zeW5jLmNjCmluZGV4IDQyODRlMDcuLmExNDg5ZDggMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3Fwcy9jbGllbnRfc3luYy5jYworKysgYi90ZXN0L2NwcC9xcHMvY2xpZW50X3N5bmMuY2MKQEAgLTUzLDcgKzUzLDcgQEAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvdGltZS5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiCisjaW5jbHVkZSAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIKICNpbmNsdWRlICJzcmMvcHJvdG8vZ3JwYy90ZXN0aW5nL3NlcnZpY2VzLmdycGMucGIuaCIKICNpbmNsdWRlICJ0ZXN0L2NwcC9xcHMvY2xpZW50LmgiCiAjaW5jbHVkZSAidGVzdC9jcHAvcXBzL2hpc3RvZ3JhbS5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcXBzL2RyaXZlci5jYyBiL3Rlc3QvY3BwL3Fwcy9kcml2ZXIuY2MKaW5kZXggNmMwNTc5OS4uNmNjYTdkZSAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvcXBzL2RyaXZlci5jYworKysgYi90ZXN0L2NwcC9xcHMvZHJpdmVyLmNjCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8Z3JwYy9zdXBwb3J0L2xvZy5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJzcmMvY29yZS9zdXBwb3J0L2Vudi5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIgogI2luY2x1ZGUgInNyYy9wcm90by9ncnBjL3Rlc3Rpbmcvc2VydmljZXMuZ3JwYy5wYi5oIgogI2luY2x1ZGUgInRlc3QvY29yZS91dGlsL3BvcnQuaCIKICNpbmNsdWRlICJ0ZXN0L2NvcmUvdXRpbC90ZXN0X2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcXBzL3Fwc190ZXN0X3dpdGhfcG9sbC5jYyBiL3Rlc3QvY3BwL3Fwcy9xcHNfdGVzdF93aXRoX3BvbGwuY2MKaW5kZXggODM0MGE2My4uNjQ3YWFhYyAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvcXBzL3Fwc190ZXN0X3dpdGhfcG9sbC5jYworKysgYi90ZXN0L2NwcC9xcHMvcXBzX3Rlc3Rfd2l0aF9wb2xsLmNjCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSAidGVzdC9jcHAvdXRpbC9iZW5jaG1hcmtfY29uZmlnLmgiCiAKIGV4dGVybiAiQyIgewotI2luY2x1ZGUgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIKKyNpbmNsdWRlICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIgogfQogCiBuYW1lc3BhY2UgZ3JwYyB7CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWIvbm9kZS9ydW5fZGlzdHJpYl90ZXN0LnNoIGIvdGVzdC9kaXN0cmliL25vZGUvcnVuX2Rpc3RyaWJfdGVzdC5zaAppbmRleCA5YjhmMTU3Li4xM2E0MmZjIDEwMDc1NQotLS0gYS90ZXN0L2Rpc3RyaWIvbm9kZS9ydW5fZGlzdHJpYl90ZXN0LnNoCisrKyBiL3Rlc3QvZGlzdHJpYi9ub2RlL3J1bl9kaXN0cmliX3Rlc3Quc2gKQEAgLTI4LDIzICsyOCwzMSBAQAogIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAorZnVuY3Rpb24gZmluaXNoKCkgeworICBydj0kPworICBraWxsICRTVEFUSUNfUElEIHx8IHRydWUKKyAgY3VybCAibG9jYWxob3N0OjMyNzY3L2Ryb3AvJFNUQVRJQ19QT1JUIiB8fCB0cnVlCisgIGV4aXQgJHJ2Cit9CisKK3RyYXAgZmluaXNoIEVYSVQKKwogTk9ERV9WRVJTSU9OPSQxCiBzb3VyY2Ugfi8ubnZtL252bS5zaAotc2V0IC1leAogCiBjZCAkKGRpcm5hbWUgJDApCiAKIG52bSBpbnN0YWxsICROT0RFX1ZFUlNJT04KK3NldCAtZXgKIAogbnBtIGluc3RhbGwgLWcgbm9kZS1zdGF0aWMKIAotIyBLaWxsIG9mZiBleGlzdGluZyBzdGF0aWMgc2VydmVycwota2lsbCAtOSAkKHBzIGF1eCB8IGdyZXAgJ1tuXW9kZSAuKnN0YXRpYycgfCBhd2sgJ3twcmludCAkMn0nKSB8fCB0cnVlCi0KIFNUQVRJQ19TRVJWRVI9MTI3LjAuMC4xCi1TVEFUSUNfUE9SVD04MDgwCisjIElmIHBvcnRfc2VydmVyIGlzIHJ1bm5pbmcsIGdldCBwb3J0IGZyb20gdGhhdC4gT3RoZXJ3aXNlLCBhc3N1bWUgd2UncmUgaW4KKyMgZG9ja2VyIGFuZCB1c2UgODA4MAorU1RBVElDX1BPUlQ9JChjdXJsICdsb2NhbGhvc3Q6MzI3NjcvZ2V0JyB8fCBlY2hvICc4MDgwJykKIAotIyBTZXJ2ZXMgdGhlIGlucHV0X2FydGlmYWN0cyBkaXJlY3Rvcnkgc3RhdGljYWxseSBhdCBsb2NhbGhvc3Q6ODA4MAorIyBTZXJ2ZXMgdGhlIGlucHV0X2FydGlmYWN0cyBkaXJlY3Rvcnkgc3RhdGljYWxseSBhdCBsb2NhbGhvc3Q6CiBzdGF0aWMgIiRFWFRFUk5BTF9HSVRfUk9PVC9pbnB1dF9hcnRpZmFjdHMiIC1hICRTVEFUSUNfU0VSVkVSIC1wICRTVEFUSUNfUE9SVCAmCiBTVEFUSUNfUElEPSQhCiAKQEAgLTUyLDYgKzYwLDQgQEAKIAogbnBtIGluc3RhbGwgLS11bnNhZmUtcGVybSAkU1RBVElDX1VSTC9ncnBjLnRneiAtLWdycGNfbm9kZV9iaW5hcnlfaG9zdF9taXJyb3I9JFNUQVRJQ19VUkwKIAota2lsbCAtOSAkU1RBVElDX1BJRAotCiAuL2Rpc3RyaWJfdGVzdC5qcwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGRnZW4vcGx1Z2lucy9leHBhbmRfZmlsZWdyb3Vwcy5weSBiL3Rvb2xzL2J1aWxkZ2VuL3BsdWdpbnMvZXhwYW5kX2ZpbGVncm91cHMucHkKaW5kZXggMTU2YmRjNC4uYzQwMTQzZSAxMDA3NTUKLS0tIGEvdG9vbHMvYnVpbGRnZW4vcGx1Z2lucy9leHBhbmRfZmlsZWdyb3Vwcy5weQorKysgYi90b29scy9idWlsZGdlbi9wbHVnaW5zL2V4cGFuZF9maWxlZ3JvdXBzLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyMgQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMKICMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00Miw2ICs0Miw5IEBACiAgIHJldHVybiBGYWxzZQogCiAKK0ZJTEVHUk9VUF9MSVNUUyA9IFsnc3JjJywgJ2hlYWRlcnMnLCAncHVibGljX2hlYWRlcnMnXQorCisKIGRlZiBtYWtvX3BsdWdpbihkaWN0aW9uYXJ5KToKICAgIiIiVGhlIGV4cG9ydGVkIHBsdWdpbiBjb2RlIGZvciBleHBhbmRfZmlsZWdyb3Vwcy4KIApAQCAtNTQsMjEgKzU3LDQ0IEBACiAgIGZpbGVncm91cHNfbGlzdCA9IGRpY3Rpb25hcnkuZ2V0KCdmaWxlZ3JvdXBzJykKICAgZmlsZWdyb3VwcyA9IHt9CiAKLSAgZm9yIGZnIGluIGZpbGVncm91cHNfbGlzdDoKLSAgICBmaWxlZ3JvdXBzW2ZnWyduYW1lJ11dID0gZmcKKyAgdG9kbyA9IGZpbGVncm91cHNfbGlzdFs6XQorICBza2lwcyA9IDAKKworICB3aGlsZSB0b2RvOgorICAgIGFzc2VydCBza2lwcyAhPSBsZW4odG9kbyksICJpbmZpbml0ZSBsb29wIGluIGZpbGVncm91cCB1c2VzIGNsYXVzZXMiCisgICAgIyB0YWtlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0b2RvIGxpc3QKKyAgICBjdXIgPSB0b2RvWzBdCisgICAgdG9kbyA9IHRvZG9bMTpdCisgICAgIyBjaGVjayBhbGwgdXNlcyBmaWxlZ3JvdXBzIGFyZSBwcmVzZW50IChpZiBubywgc2tpcCBhbmQgY29tZSBiYWNrIGxhdGVyKQorICAgIHNraXAgPSBGYWxzZQorICAgIGZvciB1c2VzIGluIGN1ci5nZXQoJ3VzZXMnLCBbXSk6CisgICAgICBpZiB1c2VzIG5vdCBpbiBmaWxlZ3JvdXBzOgorICAgICAgICBza2lwID0gVHJ1ZQorICAgIGlmIHNraXA6CisgICAgICBza2lwcyArPSAxCisgICAgICB0b2RvLmFwcGVuZChjdXIpCisgICAgZWxzZToKKyAgICAgIHNraXBzID0gMAorICAgICAgZm9yIHVzZXMgaW4gY3VyLmdldCgndXNlcycsIFtdKToKKyAgICAgICAgZm9yIGxzdCBpbiBGSUxFR1JPVVBfTElTVFM6CisgICAgICAgICAgdmFscyA9IGN1ci5nZXQobHN0LCBbXSkKKyAgICAgICAgICB2YWxzLmV4dGVuZChmaWxlZ3JvdXBzW3VzZXNdLmdldChsc3QsIFtdKSkKKyAgICAgICAgICBjdXJbbHN0XSA9IHZhbHMKKyAgICAgIGZpbGVncm91cHNbY3VyWyduYW1lJ11dID0gY3VyCisKKyAgIyB0aGUgYWJvdmUgZXhwYW5zaW9uIGNhbiBpbnRyb2R1Y2UgZHVwbGljYXRlIGZpbGVuYW1lczogY29udHJhY3QgdGhlbSBoZXJlCisgIGZvciBmZyBpbiBmaWxlZ3JvdXBzLml0ZXJ2YWx1ZXMoKToKKyAgICBmb3IgbHN0IGluIEZJTEVHUk9VUF9MSVNUUzoKKyAgICAgIGZnW2xzdF0gPSBzb3J0ZWQobGlzdChzZXQoZmcuZ2V0KGxzdCwgW10pKSkpCiAKICAgZm9yIGxpYiBpbiBsaWJzOgogICAgIGZvciBmZ19uYW1lIGluIGxpYi5nZXQoJ2ZpbGVncm91cHMnLCBbXSk6CiAgICAgICBmZyA9IGZpbGVncm91cHNbZmdfbmFtZV0KIAotICAgICAgc3JjID0gbGliLmdldCgnc3JjJywgW10pCi0gICAgICBzcmMuZXh0ZW5kKGZnLmdldCgnc3JjJywgW10pKQotICAgICAgbGliWydzcmMnXSA9IHNyYworICAgICAgZm9yIGxzdCBpbiBGSUxFR1JPVVBfTElTVFM6CisgICAgICAgIHZhbHMgPSBsaWIuZ2V0KGxzdCwgW10pCisgICAgICAgIHZhbHMuZXh0ZW5kKGZnLmdldChsc3QsIFtdKSkKKyAgICAgICAgbGliW2xzdF0gPSB2YWxzCiAKLSAgICAgIGhlYWRlcnMgPSBsaWIuZ2V0KCdoZWFkZXJzJywgW10pCi0gICAgICBoZWFkZXJzLmV4dGVuZChmZy5nZXQoJ2hlYWRlcnMnLCBbXSkpCi0gICAgICBsaWJbJ2hlYWRlcnMnXSA9IGhlYWRlcnMKLQotICAgICAgcHVibGljX2hlYWRlcnMgPSBsaWIuZ2V0KCdwdWJsaWNfaGVhZGVycycsIFtdKQotICAgICAgcHVibGljX2hlYWRlcnMuZXh0ZW5kKGZnLmdldCgncHVibGljX2hlYWRlcnMnLCBbXSkpCi0gICAgICBsaWJbJ3B1YmxpY19oZWFkZXJzJ10gPSBwdWJsaWNfaGVhZGVycworICAgIGZvciBsc3QgaW4gRklMRUdST1VQX0xJU1RTOgorICAgICAgbGliW2xzdF0gPSBzb3J0ZWQobGlzdChzZXQobGliLmdldChsc3QsIFtdKSkpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9ocGFja190YWJsZXMuYyBiL3Rvb2xzL2NvZGVnZW4vY29yZS9nZW5faHBhY2tfdGFibGVzLmMKaW5kZXggYmFlNGU0Yy4uY2IyYjg5YSAxMDA2NDQKLS0tIGEvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9ocGFja190YWJsZXMuYworKysgYi90b29scy9jb2RlZ2VuL2NvcmUvZ2VuX2hwYWNrX3RhYmxlcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzMsMTMgKzMzLDEzIEBACiAKIC8qIGdlbmVyYXRlcyBjb25zdGFudCB0YWJsZXMgZm9yIGhwYWNrLmMgKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpbmNsdWRlIDxncnBjL3N1cHBvcnQvbG9nLmg+Ci0jaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5oIgorI2luY2x1ZGUgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIgogCiAvKgogICogZmlyc3QgYnl0ZSBMVVQgZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9sb2FkX2JhbGFuY2luZ19wcm90by5zaCBiL3Rvb2xzL2NvZGVnZW4vY29yZS9nZW5fbG9hZF9iYWxhbmNpbmdfcHJvdG8uc2gKaW5kZXggZmI2YTQ2OC4uNmE1MzYzZSAxMDA3NTUKLS0tIGEvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9sb2FkX2JhbGFuY2luZ19wcm90by5zaAorKysgYi90b29scy9jb2RlZ2VuL2NvcmUvZ2VuX2xvYWRfYmFsYW5jaW5nX3Byb3RvLnNoCkBAIC04Miw3ICs4Miw3IEBACiAKIHJlYWRvbmx5IEdSUENfUk9PVD0kUFdECiAKLU9VVFBVVF9ESVI9IiRHUlBDX1JPT1Qvc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MCIKK09VVFBVVF9ESVI9IiRHUlBDX1JPT1Qvc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAiCiBpZiBbICQjIC1lcSAyIF07IHRoZW4KICAgbWtkaXIgLXAgIiQyIgogICBpZiBbICQ/ICE9IDAgXTsgdGhlbgpAQCAtMTIyLDcgKzEyMiw3IEBACiAiJChiYXNlbmFtZSAkMSkiCiAKIHJlYWRvbmx5IFBST1RPX0JBU0VOQU1FPSQoYmFzZW5hbWUgJDEgLnByb3RvKQotc2VkIC1pICJzOiRQUk9UT19CQVNFTkFNRS5wYi5oOnNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvJFBST1RPX0JBU0VOQU1FLnBiLmg6ZyIgXAorc2VkIC1pICJzOiRQUk9UT19CQVNFTkFNRS5wYi5oOnNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwLyRQUk9UT19CQVNFTkFNRS5wYi5oOmciIFwKICAgICAiJE9VVFBVVF9ESVIvJFBST1RPX0JBU0VOQU1FLnBiLmMiCiAKICMgcHJlcGVuZCBjb3B5cmlnaHQKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvZGVnZW4vY29yZS9nZW5fc3RhdGljX21ldGFkYXRhLnB5IGIvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9zdGF0aWNfbWV0YWRhdGEucHkKaW5kZXggNTkzYmFlYy4uNzBkNDE0MSAxMDA3NTUKLS0tIGEvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9zdGF0aWNfbWV0YWRhdGEucHkKKysrIGIvdG9vbHMvY29kZWdlbi9jb3JlL2dlbl9zdGF0aWNfbWV0YWRhdGEucHkKQEAgLTIxNSw5ICsyMTUsOSBAQAogICAgIEMgPSBvcGVuKCcvZGV2L251bGwnLCAndycpCiBlbHNlOgogICBIID0gb3Blbihvcy5wYXRoLmpvaW4oCi0gICAgICBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnLi4vLi4vLi4vc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oJyksICd3JykKKyAgICAgIG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICcuLi8uLi8uLi9zcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oJyksICd3JykKICAgQyA9IG9wZW4ob3MucGF0aC5qb2luKAotICAgICAgb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJy4uLy4uLy4uL3NyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYycpLCAndycpCisgICAgICBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCAnLi4vLi4vLi4vc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYycpLCAndycpCiAKICMgY29weS1wYXN0ZSBjb3B5cmlnaHQgbm90aWNlIGZyb20gdGhpcyBmaWxlCiB3aXRoIG9wZW4oc3lzLmFyZ3ZbMF0pIGFzIG15X3NvdXJjZToKQEAgLTI0NywxMCArMjQ3LDEwIEBACiBwcmludCA+PkgsICcjaWZuZGVmIEdSUENfSU5URVJOQUxfQ09SRV9UUkFOU1BPUlRfU1RBVElDX01FVEFEQVRBX0gnCiBwcmludCA+PkgsICcjZGVmaW5lIEdSUENfSU5URVJOQUxfQ09SRV9UUkFOU1BPUlRfU1RBVElDX01FVEFEQVRBX0gnCiBwcmludCA+PkgKLXByaW50ID4+SCwgJyNpbmNsdWRlICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuaCInCitwcmludCA+PkgsICcjaW5jbHVkZSAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIicKIHByaW50ID4+SAogCi1wcmludCA+PkMsICcjaW5jbHVkZSAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIicKK3ByaW50ID4+QywgJyNpbmNsdWRlICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIicKIHByaW50ID4+QwogCiBwcmludCA+PkgsICcjZGVmaW5lIEdSUENfU1RBVElDX01EU1RSX0NPVU5UICVkJyAlIGxlbihhbGxfc3RycykKQEAgLTMwOSw0ICszMDksMyBAQAogCiBILmNsb3NlKCkKIEMuY2xvc2UoKQotCmRpZmYgLS1naXQgYS90b29scy9kaXN0cmliL2NoZWNrX2luY2x1ZGVfZ3VhcmRzLnB5IGIvdG9vbHMvZGlzdHJpYi9jaGVja19pbmNsdWRlX2d1YXJkcy5weQppbmRleCA5NzdmNDBlLi40NjNlMzE2IDEwMDc1NQotLS0gYS90b29scy9kaXN0cmliL2NoZWNrX2luY2x1ZGVfZ3VhcmRzLnB5CisrKyBiL3Rvb2xzL2Rpc3RyaWIvY2hlY2tfaW5jbHVkZV9ndWFyZHMucHkKQEAgLTE2Nyw3ICsxNjcsNyBAQAogYXJncyA9IGFyZ3AucGFyc2VfYXJncygpCiAKIEtOT1dOX0JBRCA9IHNldChbCi0gICAgJ3NyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oJywKKyAgICAnc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oJywKIF0pCiAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvZGlzdHJpYi9jaGVja19uYW5vcGJfb3V0cHV0LnNoIGIvdG9vbHMvZGlzdHJpYi9jaGVja19uYW5vcGJfb3V0cHV0LnNoCmluZGV4IDUxYzRkNzUuLmUwYTYwOTQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2Rpc3RyaWIvY2hlY2tfbmFub3BiX291dHB1dC5zaAorKysgYi90b29scy9kaXN0cmliL2NoZWNrX25hbm9wYl9vdXRwdXQuc2gKQEAgLTYwLDcgKzYwLDcgQEAKICAgJE5BTk9QQl9UTVBfT1VUUFVUCiAKICMgY29tcGFyZSBvdXRwdXRzIHRvIGNoZWNrZWQgY29tcGlsZWQgY29kZQotaWYgISBkaWZmIC1yICROQU5PUEJfVE1QX09VVFBVVCBzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwOyB0aGVuCi0gIGVjaG8gIk91dHB1dHMgZGlmZmVyOiAkTkFOT1BCX1RNUF9PVVRQVVQgdnMgc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MCIKK2lmICEgZGlmZiAtciAkTkFOT1BCX1RNUF9PVVRQVVQgc3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjA7IHRoZW4KKyAgZWNobyAiT3V0cHV0cyBkaWZmZXI6ICROQU5PUEJfVE1QX09VVFBVVCB2cyBzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MCIKICAgZXhpdCAyCiBmaQpkaWZmIC0tZ2l0IGEvdG9vbHMvZG9ja2VyZmlsZS9ncnBjX2ludGVyb3Bfc3RyZXNzX2N4eC9Eb2NrZXJmaWxlIGIvdG9vbHMvZG9ja2VyZmlsZS9ncnBjX2ludGVyb3Bfc3RyZXNzX2N4eC9Eb2NrZXJmaWxlCmluZGV4IDQxMjNjYzEuLjU1NmEyNmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RvY2tlcmZpbGUvZ3JwY19pbnRlcm9wX3N0cmVzc19jeHgvRG9ja2VyZmlsZQorKysgYi90b29scy9kb2NrZXJmaWxlL2dycGNfaW50ZXJvcF9zdHJlc3NfY3h4L0RvY2tlcmZpbGUKQEAgLTI3LDEyICsyNyw5IEBACiAjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCi0jIEEgd29yay1pbi1wcm9ncmVzcyBEb2NrZXJmaWxlIHRoYXQgYWxsb3dzIHJ1bm5pbmcgZ1JQQyB0ZXN0IHN1aXRlcwotIyBpbnNpZGUgYSBkb2NrZXIgY29udGFpbmVyLgotCiBGUk9NIGRlYmlhbjpqZXNzaWUKIAotIyBJbnN0YWxsIEdpdC4KKyMgSW5zdGFsbCBHaXQgYW5kIGJhc2ljIHBhY2thZ2VzLgogUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBcCiAgIGF1dG9jb25mIFwKICAgYXV0b3Rvb2xzLWRldiBcCkBAIC00MywxMyArNDAsMTYgQEAKICAgZ2NjIFwKICAgZ2NjLW11bHRpbGliIFwKICAgZ2l0IFwKKyAgZ29sYW5nIFwKICAgZ3lwIFwKKyAgbGNvdiBcCiAgIGxpYmM2IFwKICAgbGliYzYtZGJnIFwKICAgbGliYzYtZGV2IFwKICAgbGliZ3Rlc3QtZGV2IFwKICAgbGlidG9vbCBcCiAgIG1ha2UgXAorICBwZXJsIFwKICAgc3RyYWNlIFwKICAgcHl0aG9uLWRldiBcCiAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKQEAgLTU5LDcgKzU5LDkgQEAKICAgd2dldCBcCiAgIHppcCAmJiBhcHQtZ2V0IGNsZWFuCiAKLVJVTiBlYXN5X2luc3RhbGwgLVUgcGlwCisjPT09PT09PT09PT09PT09PQorIyBCdWlsZCBwcm9maWxpbmcKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgdGltZSAmJiBhcHQtZ2V0IGNsZWFuCiAKICMgUHJlcGFyZSBjY2FjaGUKIFJVTiBsbiAtcyAvdXNyL2Jpbi9jY2FjaGUgL3Vzci9sb2NhbC9iaW4vZ2NjCkBAIC02OSwxMiArNzEsNDcgQEAKIFJVTiBsbiAtcyAvdXNyL2Jpbi9jY2FjaGUgL3Vzci9sb2NhbC9iaW4vY2xhbmcKIFJVTiBsbiAtcyAvdXNyL2Jpbi9jY2FjaGUgL3Vzci9sb2NhbC9iaW4vY2xhbmcrKwogCi0jIyMjIyMjIyMjIyMjIyMjIyMKKyM9PT09PT09PT09PT09PT09PQogIyBDKysgZGVwZW5kZW5jaWVzCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSBpbnN0YWxsIGxpYmdmbGFncy1kZXYgbGliZ3Rlc3QtZGV2IGxpYmMrKy1kZXYgY2xhbmcKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IC15IGluc3RhbGwgbGliZ2ZsYWdzLWRldiBsaWJndGVzdC1kZXYgbGliYysrLWRldiBjbGFuZyAmJiBhcHQtZ2V0IGNsZWFuCiAKLSMgR29vZ2xlIENsb3VkIHBsYXRmb3JtIEFQSSBsaWJyYXJpZXMgKGZvciBCaWdRdWVyeSkKKyMgR29vZ2xlIENsb3VkIHBsYXRmb3JtIEFQSSBsaWJyYXJpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgcHl0aG9uLXBpcCAmJiBhcHQtZ2V0IGNsZWFuCiBSVU4gcGlwIGluc3RhbGwgLS11cGdyYWRlIGdvb2dsZS1hcGktcHl0aG9uLWNsaWVudAogCisKKyM9PT09PT09PT09PT09PT09PQorIyBVcGRhdGUgY2xhbmcgdG8gYSB2ZXJzaW9uIHdpdGggaW1wcm92ZWQgdHNhbiBhbmQgZnV6emluZyBjYXBhYmlsaXRpZXMKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgLXkgaW5zdGFsbCBweXRob24gY21ha2UgJiYgYXB0LWdldCBjbGVhbgorCitSVU4gZ2l0IGNsb25lIC1uIC1iIHJlbGVhc2VfMzggaHR0cDovL2xsdm0ub3JnL2dpdC9sbHZtLmdpdCAmJiBcCisgIGNkIGxsdm0gJiYgZ2l0IGNoZWNrb3V0IGFkNTc1MDMgJiYgY2QgLi4KK1JVTiBnaXQgY2xvbmUgLW4gLWIgcmVsZWFzZV8zOCBodHRwOi8vbGx2bS5vcmcvZ2l0L2NsYW5nLmdpdCAmJiBcCisgIGNkIGNsYW5nICYmIGdpdCBjaGVja291dCBhZDJjNTZlICYmIGNkIC4uCitSVU4gZ2l0IGNsb25lIC1uIC1iIHJlbGVhc2VfMzggaHR0cDovL2xsdm0ub3JnL2dpdC9jb21waWxlci1ydC5naXQgJiYgXAorICBjZCBjb21waWxlci1ydCAmJiBnaXQgY2hlY2tvdXQgMzE3NjkyMiAmJiBjZCAuLgorUlVOIGdpdCBjbG9uZSAtbiAtYiByZWxlYXNlXzM4IFwKKyAgaHR0cDovL2xsdm0ub3JnL2dpdC9jbGFuZy10b29scy1leHRyYS5naXQgJiYgY2QgY2xhbmctdG9vbHMtZXh0cmEgJiYgXAorICBnaXQgY2hlY2tvdXQgYzI4ODUyNSAmJiBjZCAuLgorUlVOIGdpdCBjbG9uZSAtbiAtYiByZWxlYXNlXzM4IGh0dHA6Ly9sbHZtLm9yZy9naXQvbGliY3h4LmdpdCAmJiBcCisgIGNkIGxpYmN4eCAmJiBnaXQgY2hlY2tvdXQgZmRhMzU0OSAgJiYgY2QgLi4KK1JVTiBnaXQgY2xvbmUgLW4gLWIgcmVsZWFzZV8zOCBodHRwOi8vbGx2bS5vcmcvZ2l0L2xpYmN4eGFiaS5naXQgJiYgXAorICBjZCBsaWJjeHhhYmkgJiYgZ2l0IGNoZWNrb3V0IDhkNGU1MWQgJiYgY2QgLi4KKworUlVOIG12IGNsYW5nIGxsdm0vdG9vbHMKK1JVTiBtdiBjb21waWxlci1ydCBsbHZtL3Byb2plY3RzCitSVU4gbXYgY2xhbmctdG9vbHMtZXh0cmEgbGx2bS90b29scy9jbGFuZy90b29scworUlVOIG12IGxpYmN4eCBsbHZtL3Byb2plY3RzCitSVU4gbXYgbGliY3h4YWJpIGxsdm0vcHJvamVjdHMKKworUlVOIG1rZGlyIGxsdm0tYnVpbGQKK1JVTiBjZCBsbHZtLWJ1aWxkICYmIGNtYWtlIFwKKyAgLURDTUFLRV9CVUlMRF9UWVBFOlNUUklORz1SZWxlYXNlIFwKKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpTVFJJTkc9L3VzciBcCisgIC1ETExWTV9UQVJHRVRTX1RPX0JVSUxEOlNUUklORz1YODYgXAorICAuLi9sbHZtCitSVU4gbWFrZSAtQyBsbHZtLWJ1aWxkIC1qIDEyICYmIG1ha2UgLUMgbGx2bS1idWlsZCBpbnN0YWxsICYmIHJtIC1yZiBsbHZtLWJ1aWxkCisKICMgRGVmaW5lIHRoZSBkZWZhdWx0IGNvbW1hbmQuCiBDTUQgWyJiYXNoIl0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RvY2tlcmZpbGUvZ3JwY19pbnRlcm9wX3N0cmVzc19jeHgvYnVpbGRfaW50ZXJvcF9zdHJlc3Muc2ggYi90b29scy9kb2NrZXJmaWxlL2dycGNfaW50ZXJvcF9zdHJlc3NfY3h4L2J1aWxkX2ludGVyb3Bfc3RyZXNzLnNoCmluZGV4IDM5MmJkZmMuLjQ3MGRiNGMgMTAwNzU1Ci0tLSBhL3Rvb2xzL2RvY2tlcmZpbGUvZ3JwY19pbnRlcm9wX3N0cmVzc19jeHgvYnVpbGRfaW50ZXJvcF9zdHJlc3Muc2gKKysrIGIvdG9vbHMvZG9ja2VyZmlsZS9ncnBjX2ludGVyb3Bfc3RyZXNzX2N4eC9idWlsZF9pbnRlcm9wX3N0cmVzcy5zaApAQCAtNDEsNSArNDEsNyBAQAogCiBtYWtlIGluc3RhbGwtY2VydHMKIAorQlVJTERfVFlQRT0ke0JVSUxEX1RZUEU6PW9wdH0KKwogIyBidWlsZCBDKysgaW50ZXJvcCBzdHJlc3MgY2xpZW50LCBpbnRlcm9wIGNsaWVudCBhbmQgc2VydmVyCi1tYWtlIHN0cmVzc190ZXN0IG1ldHJpY3NfY2xpZW50IGludGVyb3BfY2xpZW50IGludGVyb3Bfc2VydmVyCittYWtlIENPTkZJRz0kQlVJTERfVFlQRSBzdHJlc3NfdGVzdCBtZXRyaWNzX2NsaWVudCBpbnRlcm9wX2NsaWVudCBpbnRlcm9wX3NlcnZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZG9ja2VyZmlsZS90ZXN0L2N4eF9qZXNzaWVfeDY0L0RvY2tlcmZpbGUgYi90b29scy9kb2NrZXJmaWxlL3Rlc3QvY3h4X2plc3NpZV94NjQvRG9ja2VyZmlsZQppbmRleCBiODQ4ZjIzLi42YzdhZWNlIDEwMDY0NAotLS0gYS90b29scy9kb2NrZXJmaWxlL3Rlc3QvY3h4X2plc3NpZV94NjQvRG9ja2VyZmlsZQorKysgYi90b29scy9kb2NrZXJmaWxlL3Rlc3QvY3h4X2plc3NpZV94NjQvRG9ja2VyZmlsZQpAQCAtNjgsNyArNjgsNyBAQAogUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgLXkgaW5zdGFsbCBsaWJnZmxhZ3MtZGV2IGxpYmd0ZXN0LWRldiBsaWJjKystZGV2IGNsYW5nICYmIGFwdC1nZXQgY2xlYW4KIAogIz09PT09PT09PT09PT09PT09Ci0jIFVwZGF0ZSBjbGFuZyB0byBhIHZlcnNpb24gd2l0aCBpbXByb3ZlZCB0c2FuCisjIFVwZGF0ZSBjbGFuZyB0byBhIHZlcnNpb24gd2l0aCBpbXByb3ZlZCB0c2FuIGFuZCBmdXp6aW5nIGNhcGFiaWxpdGllcwogCiBSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSBpbnN0YWxsIHB5dGhvbiBjbWFrZSAmJiBhcHQtZ2V0IGNsZWFuCiAKQEAgLTk4LDcgKzk4LDcgQEAKICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpTVFJJTkc9L3VzciBcCiAgIC1ETExWTV9UQVJHRVRTX1RPX0JVSUxEOlNUUklORz1YODYgXAogICAuLi9sbHZtCi1SVU4gbWFrZSAtQyBsbHZtLWJ1aWxkICYmIG1ha2UgLUMgbGx2bS1idWlsZCBpbnN0YWxsICYmIHJtIC1yZiBsbHZtLWJ1aWxkCitSVU4gbWFrZSAtQyBsbHZtLWJ1aWxkIC1qIDEyICYmIG1ha2UgLUMgbGx2bS1idWlsZCBpbnN0YWxsICYmIHJtIC1yZiBsbHZtLWJ1aWxkCiAKICMgUHJlcGFyZSBjY2FjaGUKIFJVTiBsbiAtcyAvdXNyL2Jpbi9jY2FjaGUgL3Vzci9sb2NhbC9iaW4vZ2NjCmRpZmYgLS1naXQgYS90b29scy9kb2NrZXJmaWxlL3Rlc3QvZnV6emVyL0RvY2tlcmZpbGUgYi90b29scy9kb2NrZXJmaWxlL3Rlc3QvZnV6emVyL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzNWMwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RvY2tlcmZpbGUvdGVzdC9mdXp6ZXIvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDEyMyBAQAorIyBDb3B5cmlnaHQgMjAxNS0yMDE2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworRlJPTSBkZWJpYW46amVzc2llCisKKyMgSW5zdGFsbCBHaXQgYW5kIGJhc2ljIHBhY2thZ2VzLgorUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBcCisgIGF1dG9jb25mIFwKKyAgYXV0b3Rvb2xzLWRldiBcCisgIGJ1aWxkLWVzc2VudGlhbCBcCisgIGJ6aXAyIFwKKyAgY2NhY2hlIFwKKyAgY3VybCBcCisgIGdjYyBcCisgIGdjYy1tdWx0aWxpYiBcCisgIGdpdCBcCisgIGdvbGFuZyBcCisgIGd5cCBcCisgIGxjb3YgXAorICBsaWJjNiBcCisgIGxpYmM2LWRiZyBcCisgIGxpYmM2LWRldiBcCisgIGxpYmd0ZXN0LWRldiBcCisgIGxpYnRvb2wgXAorICBtYWtlIFwKKyAgcGVybCBcCisgIHN0cmFjZSBcCisgIHB5dGhvbi1kZXYgXAorICBweXRob24tc2V0dXB0b29scyBcCisgIHB5dGhvbi15YW1sIFwKKyAgdGVsbmV0IFwKKyAgdW56aXAgXAorICB3Z2V0IFwKKyAgemlwICYmIGFwdC1nZXQgY2xlYW4KKworIz09PT09PT09PT09PT09PT0KKyMgQnVpbGQgcHJvZmlsaW5nCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IHRpbWUgJiYgYXB0LWdldCBjbGVhbgorCisjPT09PT09PT09PT09PT09PT0KKyMgQysrIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgLXkgaW5zdGFsbCBsaWJnZmxhZ3MtZGV2IGxpYmd0ZXN0LWRldiBsaWJjKystZGV2IGNsYW5nICYmIGFwdC1nZXQgY2xlYW4KKworIz09PT09PT09PT09PT09PT09CisjIFVwZGF0ZSBjbGFuZyB0byBhIHZlcnNpb24gd2l0aCBpbXByb3ZlZCB0c2FuIGFuZCBmdXp6aW5nIGNhcGFiaWxpdGllcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSBpbnN0YWxsIHB5dGhvbiBjbWFrZSAmJiBhcHQtZ2V0IGNsZWFuCisKK1JVTiBnaXQgY2xvbmUgLW4gLWIgcmVsZWFzZV8zOCBodHRwOi8vbGx2bS5vcmcvZ2l0L2xsdm0uZ2l0ICYmIFwKKyAgY2QgbGx2bSAmJiBnaXQgY2hlY2tvdXQgYWQ1NzUwMyAmJiBjZCAuLgorUlVOIGdpdCBjbG9uZSAtbiAtYiByZWxlYXNlXzM4IGh0dHA6Ly9sbHZtLm9yZy9naXQvY2xhbmcuZ2l0ICYmIFwKKyAgY2QgY2xhbmcgJiYgZ2l0IGNoZWNrb3V0IGFkMmM1NmUgJiYgY2QgLi4KK1JVTiBnaXQgY2xvbmUgLW4gLWIgcmVsZWFzZV8zOCBodHRwOi8vbGx2bS5vcmcvZ2l0L2NvbXBpbGVyLXJ0LmdpdCAmJiBcCisgIGNkIGNvbXBpbGVyLXJ0ICYmIGdpdCBjaGVja291dCAzMTc2OTIyICYmIGNkIC4uCitSVU4gZ2l0IGNsb25lIC1uIC1iIHJlbGVhc2VfMzggXAorICBodHRwOi8vbGx2bS5vcmcvZ2l0L2NsYW5nLXRvb2xzLWV4dHJhLmdpdCAmJiBjZCBjbGFuZy10b29scy1leHRyYSAmJiBcCisgIGdpdCBjaGVja291dCBjMjg4NTI1ICYmIGNkIC4uCitSVU4gZ2l0IGNsb25lIC1uIC1iIHJlbGVhc2VfMzggaHR0cDovL2xsdm0ub3JnL2dpdC9saWJjeHguZ2l0ICYmIFwKKyAgY2QgbGliY3h4ICYmIGdpdCBjaGVja291dCBmZGEzNTQ5ICAmJiBjZCAuLgorUlVOIGdpdCBjbG9uZSAtbiAtYiByZWxlYXNlXzM4IGh0dHA6Ly9sbHZtLm9yZy9naXQvbGliY3h4YWJpLmdpdCAmJiBcCisgIGNkIGxpYmN4eGFiaSAmJiBnaXQgY2hlY2tvdXQgOGQ0ZTUxZCAmJiBjZCAuLgorCitSVU4gbXYgY2xhbmcgbGx2bS90b29scworUlVOIG12IGNvbXBpbGVyLXJ0IGxsdm0vcHJvamVjdHMKK1JVTiBtdiBjbGFuZy10b29scy1leHRyYSBsbHZtL3Rvb2xzL2NsYW5nL3Rvb2xzCitSVU4gbXYgbGliY3h4IGxsdm0vcHJvamVjdHMKK1JVTiBtdiBsaWJjeHhhYmkgbGx2bS9wcm9qZWN0cworCitSVU4gbWtkaXIgbGx2bS1idWlsZAorUlVOIGNkIGxsdm0tYnVpbGQgJiYgY21ha2UgXAorICAtRENNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPVJlbGVhc2UgXAorICAtRENNQUtFX0lOU1RBTExfUFJFRklYOlNUUklORz0vdXNyIFwKKyAgLURMTFZNX1RBUkdFVFNfVE9fQlVJTEQ6U1RSSU5HPVg4NiBcCisgIC4uL2xsdm0KK1JVTiBtYWtlIC1DIGxsdm0tYnVpbGQgLWogMTIgJiYgbWFrZSAtQyBsbHZtLWJ1aWxkIGluc3RhbGwgJiYgcm0gLXJmIGxsdm0tYnVpbGQKKworIyBQcmVwYXJlIGNjYWNoZQorUlVOIGxuIC1zIC91c3IvYmluL2NjYWNoZSAvdXNyL2xvY2FsL2Jpbi9nY2MKK1JVTiBsbiAtcyAvdXNyL2Jpbi9jY2FjaGUgL3Vzci9sb2NhbC9iaW4vZysrCitSVU4gbG4gLXMgL3Vzci9iaW4vY2NhY2hlIC91c3IvbG9jYWwvYmluL2NjCitSVU4gbG4gLXMgL3Vzci9iaW4vY2NhY2hlIC91c3IvbG9jYWwvYmluL2MrKworUlVOIGxuIC1zIC91c3IvYmluL2NjYWNoZSAvdXNyL2xvY2FsL2Jpbi9jbGFuZworUlVOIGxuIC1zIC91c3IvYmluL2NjYWNoZSAvdXNyL2xvY2FsL2Jpbi9jbGFuZysrCisKKyM9PT09PT09PT09PT09PT09PT09PT09CisjIFpvb2tlZXBlciBkZXBlbmRlbmNpZXMKKyMgVE9ETyhqdGF0dGVybXVzY2gpOiBpcyB6b29rZWVwZXIgc3RpbGwgbmVlZGVkPworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBsaWJ6b29rZWVwZXItbXQtZGV2CisKK1JVTiBta2RpciAvdmFyL2xvY2FsL2plbmtpbnMKKworUlVOIGNsYW5nKysgLWMgLWcgLU8yIC1zdGQ9YysrMTEgbGx2bS9saWIvRnV6emVyLyouY3BwIC1JRnV6emVyCitSVU4gYXIgcnV2IGxpYkZ1enplci5hIEZ1enplcioubworUlVOIG12IGxpYkZ1enplci5hIC91c3IvbGliCitSVU4gcm0gLWYgRnV6emVyKi5vCisjIERlZmluZSB0aGUgZGVmYXVsdCBjb21tYW5kLgorQ01EIFsiYmFzaCJdCmRpZmYgLS1naXQgYS90b29scy9kb3h5Z2VuL0RveHlmaWxlLmMrKyBiL3Rvb2xzL2RveHlnZW4vRG94eWZpbGUuYysrCmluZGV4IDI1MzI2MmMuLmZlNzk2MmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RveHlnZW4vRG94eWZpbGUuYysrCisrKyBiL3Rvb2xzL2RveHlnZW4vRG94eWZpbGUuYysrCkBAIC03NzAsNiArNzcwLDM3IEBACiBpbmNsdWRlL2dycGMrKy9ncnBjKysuaCBcCiBpbmNsdWRlL2dycGMrKy9pbXBsL2NhbGwuaCBcCiBpbmNsdWRlL2dycGMrKy9pbXBsL2NsaWVudF91bmFyeV9jYWxsLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2FzeW5jX3N0cmVhbS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGwuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2FsbF9ob29rLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF9jb250ZXh0LmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF91bmFyeV9jYWxsLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29tcGxldGlvbl9xdWV1ZV90YWcuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29uZmlnLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb3JlX2NvZGVnZW5faW50ZXJmYWNlLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2dycGNfbGlicmFyeS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3Byb3RvX3V0aWxzLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3JwY19tZXRob2QuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlY3VyaXR5L2F1dGhfY29udGV4dC5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJpYWxpemF0aW9uX3RyYWl0cy5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfaW50ZXJmYWNlLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZpY2VfdHlwZS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdHJpbmdfcmVmLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfY3h4MTEuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi90aW1lLmggXAogaW5jbHVkZS9ncnBjKysvaW1wbC9ncnBjX2xpYnJhcnkuaCBcCiBpbmNsdWRlL2dycGMrKy9pbXBsL21ldGhvZF9oYW5kbGVyX2ltcGwuaCBcCiBpbmNsdWRlL2dycGMrKy9pbXBsL3Byb3RvX3V0aWxzLmggXApAQCAtODAzLDM4ICs4MzQsNyBAQAogaW5jbHVkZS9ncnBjKysvc3VwcG9ydC9zdHJpbmdfcmVmLmggXAogaW5jbHVkZS9ncnBjKysvc3VwcG9ydC9zdHViX29wdGlvbnMuaCBcCiBpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N5bmNfc3RyZWFtLmggXAotaW5jbHVkZS9ncnBjKysvc3VwcG9ydC90aW1lLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2FzeW5jX3N0cmVhbS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGwuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2FsbF9ob29rLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF9jb250ZXh0LmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF91bmFyeV9jYWxsLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29tcGxldGlvbl9xdWV1ZV90YWcuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29uZmlnLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb3JlX2NvZGVnZW5faW50ZXJmYWNlLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2dycGNfbGlicmFyeS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3Byb3RvX3V0aWxzLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3JwY19tZXRob2QuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlY3VyaXR5L2F1dGhfY29udGV4dC5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJpYWxpemF0aW9uX3RyYWl0cy5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfaW50ZXJmYWNlLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZpY2VfdHlwZS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdHJpbmdfcmVmLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfY3h4MTEuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi90aW1lLmgKK2luY2x1ZGUvZ3JwYysrL3N1cHBvcnQvdGltZS5oCiAKICMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKICMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL2RveHlnZW4vRG94eWZpbGUuYysrLmludGVybmFsIGIvdG9vbHMvZG94eWdlbi9Eb3h5ZmlsZS5jKysuaW50ZXJuYWwKaW5kZXggMTM0YjE2Zi4uMzBiZjdiZiAxMDA2NDQKLS0tIGEvdG9vbHMvZG94eWdlbi9Eb3h5ZmlsZS5jKysuaW50ZXJuYWwKKysrIGIvdG9vbHMvZG94eWdlbi9Eb3h5ZmlsZS5jKysuaW50ZXJuYWwKQEAgLTc3MCw2ICs3NzAsMzcgQEAKIGluY2x1ZGUvZ3JwYysrL2dycGMrKy5oIFwKIGluY2x1ZGUvZ3JwYysrL2ltcGwvY2FsbC5oIFwKIGluY2x1ZGUvZ3JwYysrL2ltcGwvY2xpZW50X3VuYXJ5X2NhbGwuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vYXN5bmNfc3RyZWFtLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2FzeW5jX3VuYXJ5X2NhbGwuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2FsbC5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jYWxsX2hvb2suaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2hhbm5lbF9pbnRlcmZhY2UuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X2NvbnRleHQuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2xpZW50X3VuYXJ5X2NhbGwuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29tcGxldGlvbl9xdWV1ZS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb21wbGV0aW9uX3F1ZXVlX3RhZy5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb25maWcuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29uZmlnX3Byb3RvYnVmLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvcmVfY29kZWdlbl9pbnRlcmZhY2UuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vZ3JwY19saWJyYXJ5LmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL21ldGhvZF9oYW5kbGVyX2ltcGwuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcHJvdG9fdXRpbHMuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX21ldGhvZC5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9ycGNfc2VydmljZV9tZXRob2QuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VjdXJpdHkvYXV0aF9jb250ZXh0LmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcmlhbGl6YXRpb25fdHJhaXRzLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZlcl9jb250ZXh0LmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZlcl9pbnRlcmZhY2UuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc2VydmljZV90eXBlLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0YXR1cy5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0cmluZ19yZWYuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3R1Yl9vcHRpb25zLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmMuaCBcCitpbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19jeHgxMS5oIFwKK2luY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX25vX2N4eDExLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfc3RyZWFtLmggXAoraW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiBpbmNsdWRlL2dycGMrKy9pbXBsL2dycGNfbGlicmFyeS5oIFwKIGluY2x1ZGUvZ3JwYysrL2ltcGwvbWV0aG9kX2hhbmRsZXJfaW1wbC5oIFwKIGluY2x1ZGUvZ3JwYysrL2ltcGwvcHJvdG9fdXRpbHMuaCBcCkBAIC04MDQsNTIgKzgzNSwxNCBAQAogaW5jbHVkZS9ncnBjKysvc3VwcG9ydC9zdHViX29wdGlvbnMuaCBcCiBpbmNsdWRlL2dycGMrKy9zdXBwb3J0L3N5bmNfc3RyZWFtLmggXAogaW5jbHVkZS9ncnBjKysvc3VwcG9ydC90aW1lLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2FzeW5jX3N0cmVhbS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9hc3luY191bmFyeV9jYWxsLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NhbGwuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY2FsbF9ob29rLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NoYW5uZWxfaW50ZXJmYWNlLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF9jb250ZXh0LmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NsaWVudF91bmFyeV9jYWxsLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbXBsZXRpb25fcXVldWUuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29tcGxldGlvbl9xdWV1ZV90YWcuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vY29uZmlnLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2NvbmZpZ19wcm90b2J1Zi5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9jb3JlX2NvZGVnZW5faW50ZXJmYWNlLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL2dycGNfbGlicmFyeS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9tZXRob2RfaGFuZGxlcl9pbXBsLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3Byb3RvX3V0aWxzLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3JwY19tZXRob2QuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vcnBjX3NlcnZpY2VfbWV0aG9kLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlY3VyaXR5L2F1dGhfY29udGV4dC5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJpYWxpemF0aW9uX3RyYWl0cy5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfY29udGV4dC5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zZXJ2ZXJfaW50ZXJmYWNlLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3NlcnZpY2VfdHlwZS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdGF0dXMuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zdHJpbmdfcmVmLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N0dWJfb3B0aW9ucy5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jLmggXAotaW5jbHVkZS9ncnBjKysvaW1wbC9jb2RlZ2VuL3N5bmNfY3h4MTEuaCBcCi1pbmNsdWRlL2dycGMrKy9pbXBsL2NvZGVnZW4vc3luY19ub19jeHgxMS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi9zeW5jX3N0cmVhbS5oIFwKLWluY2x1ZGUvZ3JwYysrL2ltcGwvY29kZWdlbi90aW1lLmggXAorc3JjL2NwcC9jbGllbnQvY3JlYXRlX2NoYW5uZWxfaW50ZXJuYWwuaCBcCiBzcmMvY3BwL2NsaWVudC9zZWN1cmVfY3JlZGVudGlhbHMuaCBcCiBzcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uaCBcCi1zcmMvY3BwL2NvbW1vbi9zZWN1cmVfYXV0aF9jb250ZXh0LmggXAotc3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5oIFwKLXNyYy9jcHAvY2xpZW50L2NyZWF0ZV9jaGFubmVsX2ludGVybmFsLmggXAotc3JjL2NwcC9jb21tb24vY29yZV9jb2RlZ2VuLmggXAogc3JjL2NwcC9jb21tb24vY3JlYXRlX2F1dGhfY29udGV4dC5oIFwKK3NyYy9jcHAvY29tbW9uL3NlY3VyZV9hdXRoX2NvbnRleHQuaCBcCiBzcmMvY3BwL3NlcnZlci9keW5hbWljX3RocmVhZF9wb29sLmggXAorc3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5oIFwKIHNyYy9jcHAvc2VydmVyL3RocmVhZF9wb29sX2ludGVyZmFjZS5oIFwKLXNyYy9jcHAvY2xpZW50L3NlY3VyZV9jcmVkZW50aWFscy5jYyBcCi1zcmMvY3BwL2NvbW1vbi9hdXRoX3Byb3BlcnR5X2l0ZXJhdG9yLmNjIFwKLXNyYy9jcHAvY29tbW9uL3NlY3VyZV9hdXRoX2NvbnRleHQuY2MgXAotc3JjL2NwcC9jb21tb24vc2VjdXJlX2NoYW5uZWxfYXJndW1lbnRzLmNjIFwKLXNyYy9jcHAvY29tbW9uL3NlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIFwKLXNyYy9jcHAvc2VydmVyL3NlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MgXAogc3JjL2NwcC9jbGllbnQvY2hhbm5lbC5jYyBcCiBzcmMvY3BwL2NsaWVudC9jbGllbnRfY29udGV4dC5jYyBcCiBzcmMvY3BwL2NsaWVudC9jcmVhdGVfY2hhbm5lbC5jYyBcCkBAIC04NTcsMTQgKzg1MCwyMSBAQAogc3JjL2NwcC9jbGllbnQvY3JlZGVudGlhbHMuY2MgXAogc3JjL2NwcC9jbGllbnQvZ2VuZXJpY19zdHViLmNjIFwKIHNyYy9jcHAvY2xpZW50L2luc2VjdXJlX2NyZWRlbnRpYWxzLmNjIFwKK3NyYy9jcHAvY2xpZW50L3NlY3VyZV9jcmVkZW50aWFscy5jYyBcCitzcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjIFwKK3NyYy9jcHAvY29tbW9uL2F1dGhfcHJvcGVydHlfaXRlcmF0b3IuY2MgXAogc3JjL2NwcC9jb21tb24vY2hhbm5lbF9hcmd1bWVudHMuY2MgXAogc3JjL2NwcC9jb21tb24vY29tcGxldGlvbl9xdWV1ZS5jYyBcCiBzcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uY2MgXAogc3JjL2NwcC9jb21tb24vcnBjX21ldGhvZC5jYyBcCitzcmMvY3BwL2NvbW1vbi9zZWN1cmVfYXV0aF9jb250ZXh0LmNjIFwKK3NyYy9jcHAvY29tbW9uL3NlY3VyZV9jaGFubmVsX2FyZ3VtZW50cy5jYyBcCitzcmMvY3BwL2NvbW1vbi9zZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyBcCiBzcmMvY3BwL3NlcnZlci9hc3luY19nZW5lcmljX3NlcnZpY2UuY2MgXAogc3JjL2NwcC9zZXJ2ZXIvY3JlYXRlX2RlZmF1bHRfdGhyZWFkX3Bvb2wuY2MgXAogc3JjL2NwcC9zZXJ2ZXIvZHluYW1pY190aHJlYWRfcG9vbC5jYyBcCiBzcmMvY3BwL3NlcnZlci9pbnNlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MgXAorc3JjL2NwcC9zZXJ2ZXIvc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5jYyBcCiBzcmMvY3BwL3NlcnZlci9zZXJ2ZXIuY2MgXAogc3JjL2NwcC9zZXJ2ZXIvc2VydmVyX2J1aWxkZXIuY2MgXAogc3JjL2NwcC9zZXJ2ZXIvc2VydmVyX2NvbnRleHQuY2MgXApAQCAtODczLDggKzg3Myw3IEBACiBzcmMvY3BwL3V0aWwvc2xpY2UuY2MgXAogc3JjL2NwcC91dGlsL3N0YXR1cy5jYyBcCiBzcmMvY3BwL3V0aWwvc3RyaW5nX3JlZi5jYyBcCi1zcmMvY3BwL3V0aWwvdGltZS5jYyBcCi1zcmMvY3BwL2NvZGVnZW4vY29kZWdlbl9pbml0LmNjCitzcmMvY3BwL3V0aWwvdGltZS5jYwogCiAjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCiAjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZy4gRG94eWdlbiB1c2VzCmRpZmYgLS1naXQgYS90b29scy9kb3h5Z2VuL0RveHlmaWxlLmNvcmUgYi90b29scy9kb3h5Z2VuL0RveHlmaWxlLmNvcmUKaW5kZXggZTMyNmFkYy4uNTVmNGZmZSAxMDA2NDQKLS0tIGEvdG9vbHMvZG94eWdlbi9Eb3h5ZmlsZS5jb3JlCisrKyBiL3Rvb2xzL2RveHlnZW4vRG94eWZpbGUuY29yZQpAQCAtNzYwLDE5ICs3NjAsMzMgQEAKICMgc3BhY2VzLgogIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCiAKLUlOUFVUICAgICAgICAgICAgICAgICAgPSBpbmNsdWRlL2dycGMvZ3JwY19zZWN1cml0eS5oIFwKLWluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlci5oIFwKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXIuaCBcCiBpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXJfcmVhZGVyLmggXAoraW5jbHVkZS9ncnBjL2NlbnN1cy5oIFwKIGluY2x1ZGUvZ3JwYy9jb21wcmVzc2lvbi5oIFwKIGluY2x1ZGUvZ3JwYy9ncnBjLmggXAotaW5jbHVkZS9ncnBjL3N0YXR1cy5oIFwKK2luY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmggXAogaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ieXRlX2J1ZmZlci5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaCBcCiBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vZ3JwY190eXBlcy5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmggXAotaW5jbHVkZS9ncnBjL2NlbnN1cy5oIFwKK2luY2x1ZGUvZ3JwYy9zdGF0dXMuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oIFwKK2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIFwKK2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiBpbmNsdWRlL2dycGMvc3VwcG9ydC9hbGxvYy5oIFwKIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bS5oIFwKIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bV9nY2NfYXRvbWljLmggXApAQCAtODAwLDIxICs4MTQsNyBAQAogaW5jbHVkZS9ncnBjL3N1cHBvcnQvdGxzX2djYy5oIFwKIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19tc3ZjLmggXAogaW5jbHVkZS9ncnBjL3N1cHBvcnQvdGxzX3B0aHJlYWQuaCBcCi1pbmNsdWRlL2dycGMvc3VwcG9ydC91c2VmdWwuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaAoraW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmgKIAogIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcwogIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcwpkaWZmIC0tZ2l0IGEvdG9vbHMvZG94eWdlbi9Eb3h5ZmlsZS5jb3JlLmludGVybmFsIGIvdG9vbHMvZG94eWdlbi9Eb3h5ZmlsZS5jb3JlLmludGVybmFsCmluZGV4IDUwNDRlZDIuLmJiNzE3N2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RveHlnZW4vRG94eWZpbGUuY29yZS5pbnRlcm5hbAorKysgYi90b29scy9kb3h5Z2VuL0RveHlmaWxlLmNvcmUuaW50ZXJuYWwKQEAgLTc2MCwzMjQgKzc2MCwzMzggQEAKICMgc3BhY2VzLgogIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCiAKLUlOUFVUICAgICAgICAgICAgICAgICAgPSBpbmNsdWRlL2dycGMvZ3JwY19zZWN1cml0eS5oIFwKLWluY2x1ZGUvZ3JwYy9ieXRlX2J1ZmZlci5oIFwKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXIuaCBcCiBpbmNsdWRlL2dycGMvYnl0ZV9idWZmZXJfcmVhZGVyLmggXAoraW5jbHVkZS9ncnBjL2NlbnN1cy5oIFwKIGluY2x1ZGUvZ3JwYy9jb21wcmVzc2lvbi5oIFwKIGluY2x1ZGUvZ3JwYy9ncnBjLmggXAotaW5jbHVkZS9ncnBjL3N0YXR1cy5oIFwKK2luY2x1ZGUvZ3JwYy9ncnBjX3NlY3VyaXR5LmggXAogaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9ieXRlX2J1ZmZlci5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vY29tcHJlc3Npb25fdHlwZXMuaCBcCiBpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vZ3JwY190eXBlcy5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIFwKIGluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmggXAotaW5jbHVkZS9ncnBjL2NlbnN1cy5oIFwKLXNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oIFwKLXNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5oIFwKLXNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmggXAotc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmggXAotc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCBcCi1zcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmggXAotc3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCBcCi1zcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmggXAotc3JjL2NvcmUvY2hhbm5lbC9jb250ZXh0LmggXAotc3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCBcCi1zcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIFwKLXNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmggXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmggXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmggXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmggXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIFwKLXNyYy9jb3JlL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIFwKLXNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCBcCi1zcmMvY29yZS9kZWJ1Zy90cmFjZS5oIFwKLXNyYy9jb3JlL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCBcCi1zcmMvY29yZS9odHRwL2h0dHBjbGkuaCBcCi1zcmMvY29yZS9odHRwL3BhcnNlci5oIFwKLXNyYy9jb3JlL2lvbWdyL2Nsb3N1cmUuaCBcCi1zcmMvY29yZS9pb21nci9lbmRwb2ludC5oIFwKLXNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCBcCi1zcmMvY29yZS9pb21nci9leGVjX2N0eC5oIFwKLXNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmggXAotc3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCBcCi1zcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCBcCi1zcmMvY29yZS9pb21nci9pb21nci5oIFwKLXNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmggXAotc3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaCBcCi1zcmMvY29yZS9pb21nci9wb2xsc2V0LmggXAotc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIFwKLXNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmggXAotc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCBcCi1zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmggXAotc3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmggXAotc3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmggXAotc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCBcCi1zcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oIFwKLXNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmggXAotc3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCBcCi1zcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCBcCi1zcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIFwKLXNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCBcCi1zcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCBcCi1zcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmggXAotc3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuaCBcCi1zcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmggXAotc3JjL2NvcmUvaW9tZ3IvdGltZXIuaCBcCi1zcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmggXAotc3JjL2NvcmUvaW9tZ3IvdWRwX3NlcnZlci5oIFwKLXNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIFwKLXNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmggXAotc3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmggXAotc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlLmggXAotc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmggXAotc3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCBcCi1zcmMvY29yZS9qc29uL2pzb24uaCBcCi1zcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmggXAotc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5oIFwKLXNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCBcCi1zcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCBcCi1zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCBcCi1zcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCBcCi1zcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIFwKLXNyYy9jb3JlL3N1cmZhY2UvY2FsbC5oIFwKLXNyYy9jb3JlL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCBcCi1zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCBcCi1zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIFwKLXNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmggXAotc3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmggXAotc3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCBcCi1zcmMvY29yZS9zdXJmYWNlL2luaXQuaCBcCi1zcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmggXAotc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuaCBcCi1zcmMvY29yZS9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCBcCi1zcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCBcCi1zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uaCBcCi1zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHR0cDJfZXJyb3JzLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaCBcCi1zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCBcCi1zcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmggXAotc3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCBcCi1zcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCBcCi1zcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCBcCi1zcmMvY29yZS9zZWN1cml0eS9iNjQuaCBcCi1zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIFwKLXNyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5oIFwKLXNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaCBcCi1zcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCBcCi1zcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCBcCi1zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCBcCi1zcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmggXAotc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmggXAotc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCBcCi1zcmMvY29yZS90c2kvc3NsX3R5cGVzLmggXAotc3JjL2NvcmUvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5oIFwKLXNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmggXAotc3JjL2NvcmUvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmggXAotc3JjL2NvcmUvY2Vuc3VzL21sb2cuaCBcCi1zcmMvY29yZS9jZW5zdXMvcnBjX21ldHJpY19pZC5oIFwKK2luY2x1ZGUvZ3JwYy9zdGF0dXMuaCBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9iaW5fZW5jb2Rlci5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuaCBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuaCBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcnN0X3N0cmVhbS5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuaCBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2h0dHAyX2Vycm9ycy5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmggXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuaCBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmggXAorc3JjL2NvcmUvbGliL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIFwKK3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuaCBcCitzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmggXAorc3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmggXAorc3JjL2NvcmUvbGliL2NlbnN1cy9ycGNfbWV0cmljX2lkLmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIFwKK3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIFwKK3NyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCBcCitzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmggXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmggXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmggXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmggXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmggXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmggXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIFwKK3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCBcCitzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIFwKK3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIFwKK3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmggXAorc3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5oIFwKK3NyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmggXAorc3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXQuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCBcCitzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCBcCitzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCBcCitzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCBcCitzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCBcCitzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXIuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCBcCitzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIFwKK3NyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWUuaCBcCitzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmggXAorc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmggXAorc3JjL2NvcmUvbGliL2pzb24vanNvbi5oIFwKK3NyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmggXAorc3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCBcCitzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oIFwKK3NyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmggXAorc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFscy5oIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuaCBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvanNvbl90b2tlbi5oIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9qd3RfdmVyaWZpZXIuaCBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmggXAorc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5oIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmggXAorc3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIFwKK3NyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmggXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmggXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmggXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmggXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuaCBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5oIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCBcCitzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmggXAorc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCBcCitzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmggXAorc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIFwKK3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmggXAorc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCBcCitzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmggXAorc3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIFwKK3NyYy9jb3JlL2xpYi90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIFwKK3NyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmggXAorc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCBcCitzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCBcCiB0aGlyZF9wYXJ0eS9uYW5vcGIvcGIuaCBcCiB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmggXAogdGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5oIFwKIHRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuaCBcCi1zcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMgXAotc3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmMgXAotc3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmMgXAotc3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyBcCi1zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyBcCi1zcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIFwKLXNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyBcCi1zcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jIFwKLXNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyBcCi1zcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jIFwKLXNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMgXAotc3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jIFwKLXNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMgXAotc3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguYyBcCi1zcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyBcCi1zcmMvY29yZS9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyBcCi1zcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmMgXAotc3JjL2NvcmUvZGVidWcvdHJhY2UuYyBcCi1zcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMgXAotc3JjL2NvcmUvaHR0cC9odHRwY2xpLmMgXAotc3JjL2NvcmUvaHR0cC9wYXJzZXIuYyBcCi1zcmMvY29yZS9pb21nci9jbG9zdXJlLmMgXAotc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuYyBcCi1zcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMgXAotc3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMgXAotc3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguYyBcCi1zcmMvY29yZS9pb21nci9leGVjdXRvci5jIFwKLXNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmMgXAotc3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmMgXAotc3JjL2NvcmUvaW9tZ3IvaW9tZ3IuYyBcCi1zcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyBcCi1zcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyBcCi1zcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguYyBcCi1zcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyBcCi1zcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBcCi1zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3NfcG9zaXguYyBcCi1zcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIFwKLXNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMgXAotc3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jIFwKLXNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmMgXAotc3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIFwKLXNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYyBcCi1zcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyBcCi1zcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5jIFwKLXNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyBcCi1zcmMvY29yZS9pb21nci90aW1lci5jIFwKLXNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYyBcCi1zcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmMgXAotc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgXAotc3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyBcCi1zcmMvY29yZS9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jIFwKLXNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyBcCi1zcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jIFwKLXNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIFwKLXNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMgXAotc3JjL2NvcmUvanNvbi9qc29uLmMgXAotc3JjL2NvcmUvanNvbi9qc29uX3JlYWRlci5jIFwKLXNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyBcCi1zcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmMgXAotc3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jIFwKLXNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIFwKLXNyYy9jb3JlL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9jYWxsLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9jYWxsX2RldGFpbHMuYyBcCi1zcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIFwKLXNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYyBcCi1zcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5jIFwKLXNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyBcCi1zcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyBcCi1zcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIFwKLXNyYy9jb3JlL3N1cmZhY2UvaW5pdC5jIFwKLXNyYy9jb3JlL3N1cmZhY2UvbGFtZV9jbGllbnQuYyBcCi1zcmMvY29yZS9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMgXAotc3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYyBcCi1zcmMvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDIuYyBcCi1zcmMvY29yZS9zdXJmYWNlL3ZhbGlkYXRlX21ldGFkYXRhLmMgXAotc3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuYyBcCi1zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdGF0dXNfY29udmVyc2lvbi5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX2xpc3RzLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuYyBcCi1zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3dyaXRpbmcuYyBcCi1zcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYyBcCi1zcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYyBcCi1zcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYyBcCi1zcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmMgXAotc3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIFwKLXNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfb3Bfc3RyaW5nLmMgXAotc3JjL2NvcmUvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIFwKLXNyYy9jb3JlL3NlY3VyaXR5L2I2NC5jIFwKLXNyYy9jb3JlL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jIFwKLXNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMgXAotc3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyBcCi1zcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc19wb3NpeC5jIFwKLXNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3dpbjMyLmMgXAotc3JjL2NvcmUvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyBcCi1zcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuYyBcCi1zcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmMgXAotc3JjL2NvcmUvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMgXAotc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMgXAotc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMgXAotc3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jIFwKLXNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9hdXRoX2ZpbHRlci5jIFwKLXNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMgXAotc3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jIFwKLXNyYy9jb3JlL3N1cmZhY2Uvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMgXAotc3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMgXAotc3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCi1zcmMvY29yZS90c2kvdHJhbnNwb3J0X3NlY3VyaXR5LmMgXAotc3JjL2NvcmUvY2Vuc3VzL2NvbnRleHQuYyBcCi1zcmMvY29yZS9jZW5zdXMvaW5pdGlhbGl6ZS5jIFwKLXNyYy9jb3JlL2NlbnN1cy9tbG9nLmMgXAotc3JjL2NvcmUvY2Vuc3VzL29wZXJhdGlvbi5jIFwKLXNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyBcCi1zcmMvY29yZS9jZW5zdXMvdHJhY2luZy5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9pbnNlY3VyZS9jaGFubmVsX2NyZWF0ZS5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9zZWN1cmUvc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYyBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9zZXJ2ZXIvc2VjdXJlL3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2FscG4uYyBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuYyBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYyBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfd2luZG93X3VwZGF0ZS5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9wYXJzaW5nLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9saXN0cy5jIFwKK3NyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3RpbWVvdXRfZW5jb2RpbmcuYyBcCitzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmMgXAorc3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYyBcCitzcmMvY29yZS9saWIvY2Vuc3VzL2NvbnRleHQuYyBcCitzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfY29udGV4dC5jIFwKK3NyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYyBcCitzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmMgXAorc3JjL2NvcmUvbGliL2NlbnN1cy9pbml0aWFsaXplLmMgXAorc3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMgXAorc3JjL2NvcmUvbGliL2NlbnN1cy9vcGVyYXRpb24uYyBcCitzcmMvY29yZS9saWIvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIFwKK3NyYy9jb3JlL2xpYi9jZW5zdXMvdHJhY2luZy5jIFwKK3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIFwKK3NyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyBcCitzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyBcCitzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5jIFwKK3NyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jIFwKK3NyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmMgXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmMgXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMgXAorc3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMgXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMgXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5jIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMgXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5jIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmMgXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIFwKK3NyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyBcCitzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMgXAorc3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIFwKK3NyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyBcCitzcmMvY29yZS9saWIvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIFwKK3NyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5jIFwKK3NyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMgXAorc3JjL2NvcmUvbGliL2h0dHAvaHR0cGNsaS5jIFwKK3NyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMgXAorc3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3dpbmRvd3MuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYyBcCitzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci90aW1lci5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuYyBcCitzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeF9ub29wLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyBcCitzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuYyBcCitzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5jIFwKK3NyYy9jb3JlL2xpYi9qc29uL2pzb24uYyBcCitzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5jIFwKK3NyYy9jb3JlL2xpYi9qc29uL2pzb25fc3RyaW5nLmMgXAorc3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuYyBcCitzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMgXAorc3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5jIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfcG9zaXguYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvaGFuZHNoYWtlLmMgXAorc3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMgXAorc3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyZV9lbmRwb2ludC5jIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuYyBcCitzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jIFwKK3NyYy9jb3JlL2xpYi9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyLmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXJfcmVhZGVyLmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuYyBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3NlY3VyZS5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmMgXAorc3JjL2NvcmUvbGliL3N1cmZhY2UvbWV0YWRhdGFfYXJyYXkuYyBcCitzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyBcCitzcmMvY29yZS9saWIvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jIFwKK3NyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYyBcCitzcmMvY29yZS9saWIvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMgXAorc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYyBcCitzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmMgXAorc3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIFwKK3NyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmMgXAorc3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuYyBcCitzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyBcCitzcmMvY29yZS9saWIvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMgXAorc3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMgXAorc3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyBcCiB0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmMgXAogdGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5jIFwKIHRoaXJkX3BhcnR5L25hbm9wYi9wYl9lbmNvZGUuYyBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2FsbG9jLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG0uaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2NfYXRvbWljLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9hdG1fZ2NjX3N5bmMuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV93aW4zMi5oIFwKK2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vbG9nLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9wb3J0X3BsYXRmb3JtLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZS5oIFwKK2luY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc2xpY2VfYnVmZmVyLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jLmggXAoraW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zeW5jX2dlbmVyaWMuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfcG9zaXguaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfd2luMzIuaCBcCitpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3RpbWUuaCBcCiBpbmNsdWRlL2dycGMvc3VwcG9ydC9hbGxvYy5oIFwKIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bS5oIFwKIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L2F0bV9nY2NfYXRvbWljLmggXApAQCAtMTEwNiw3NiArMTEyMCw2MiBAQAogaW5jbHVkZS9ncnBjL3N1cHBvcnQvdGxzX21zdmMuaCBcCiBpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfcHRocmVhZC5oIFwKIGluY2x1ZGUvZ3JwYy9zdXBwb3J0L3VzZWZ1bC5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYWxsb2MuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bS5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX2djY19hdG9taWMuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL2F0bV9nY2Nfc3luYy5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vYXRtX3dpbjMyLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9sb2cuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3BvcnRfcGxhdGZvcm0uaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3NsaWNlLmggXAotaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zbGljZV9idWZmZXIuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmMuaCBcCi1pbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3N5bmNfZ2VuZXJpYy5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY19wb3NpeC5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3luY193aW4zMi5oIFwKLWluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vdGltZS5oIFwKLXNyYy9jb3JlL3Byb2ZpbGluZy90aW1lcnMuaCBcCi1zcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaCBcCi1zcmMvY29yZS9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmggXAotc3JjL2NvcmUvc3VwcG9ydC9lbnYuaCBcCi1zcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIFwKLXNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCBcCi1zcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmggXAotc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCBcCi1zcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5oIFwKLXNyYy9jb3JlL3N1cHBvcnQvdGhkX2ludGVybmFsLmggXAotc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCBcCi1zcmMvY29yZS9zdXBwb3J0L3RtcGZpbGUuaCBcCi1zcmMvY29yZS9wcm9maWxpbmcvYmFzaWNfdGltZXJzLmMgXAotc3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9hbGxvYy5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvYXZsLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9jbWRsaW5lLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9jcHVfaXBob25lLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9jcHVfbGludXguYyBcCi1zcmMvY29yZS9zdXBwb3J0L2NwdV9wb3NpeC5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvY3B1X3dpbmRvd3MuYyBcCi1zcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvZW52X3Bvc2l4LmMgXAotc3JjL2NvcmUvc3VwcG9ydC9lbnZfd2luMzIuYyBcCi1zcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvaG9zdF9wb3J0LmMgXAotc3JjL2NvcmUvc3VwcG9ydC9sb2FkX2ZpbGUuYyBcCi1zcmMvY29yZS9zdXBwb3J0L2xvZy5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyBcCi1zcmMvY29yZS9zdXBwb3J0L2xvZ19saW51eC5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvbG9nX3Bvc2l4LmMgXAotc3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYyBcCi1zcmMvY29yZS9zdXBwb3J0L211cm11cl9oYXNoLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9zbGljZS5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfcG9zaXguYyBcCi1zcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc193aW5kb3dzLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9zeW5jLmMgXAotc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMgXAotc3JjL2NvcmUvc3VwcG9ydC9zeW5jX3dpbjMyLmMgXAotc3JjL2NvcmUvc3VwcG9ydC90aGQuYyBcCi1zcmMvY29yZS9zdXBwb3J0L3RoZF9wb3NpeC5jIFwKLXNyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMgXAotc3JjL2NvcmUvc3VwcG9ydC90aW1lLmMgXAotc3JjL2NvcmUvc3VwcG9ydC90aW1lX3Bvc2l4LmMgXAotc3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyBcCi1zcmMvY29yZS9zdXBwb3J0L3RpbWVfd2luMzIuYyBcCi1zcmMvY29yZS9zdXBwb3J0L3Rsc19wdGhyZWFkLmMgXAotc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMgXAotc3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3dpbjMyLmMgXAotc3JjL2NvcmUvc3VwcG9ydC93cmFwX21lbWNweS5jCitzcmMvY29yZS9saWIvcHJvZmlsaW5nL3RpbWVycy5oIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5oIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmggXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RhY2tfbG9ja2ZyZWUuaCBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCBcCitzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCBcCitzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCBcCitzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmggXAorc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9iYXNpY190aW1lcnMuYyBcCitzcmMvY29yZS9saWIvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvYWxsb2MuYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvY21kbGluZS5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9pcGhvbmUuYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfbGludXguYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfcG9zaXguYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfd2luZG93cy5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9saW51eC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl9wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hpc3RvZ3JhbS5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2hvc3RfcG9ydC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZy5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX2xpbnV4LmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZS5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlX2J1ZmZlci5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3N5bmMuYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC9zeW5jX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF93aW4zMi5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWUuYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3Rsc19wdGhyZWFkLmMgXAorc3JjL2NvcmUvbGliL3N1cHBvcnQvdG1wZmlsZV9wb3NpeC5jIFwKK3NyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyBcCitzcmMvY29yZS9saWIvc3VwcG9ydC93cmFwX21lbWNweS5jCiAKICMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKICMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL2Z1enplci9idWlsZF9hbmRfcnVuX2Z1enplci5zaCBiL3Rvb2xzL2Z1enplci9idWlsZF9hbmRfcnVuX2Z1enplci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYmU2ODg4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZnV6emVyL2J1aWxkX2FuZF9ydW5fZnV6emVyLnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDE2LCBHb29nbGUgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKworc2V0IC1leAorCitjZCAkKGRpcm5hbWUgJDApLy4uLy4uCittYWtlIENPTkZJRz0kY29uZmlnICQxIC1qMworbWtkaXIgLXAgZnV6emVyX291dHB1dAorLiB0b29scy9mdXp6ZXIvcnVubmVycy8kMS5zaApkaWZmIC0tZ2l0IGEvdG9vbHMvZnV6emVyL3J1bm5lcnMvaHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0LnNoIGIvdG9vbHMvZnV6emVyL3J1bm5lcnMvaHBhY2tfcGFyc2VyX2Z1enplcl90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWNmNmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mdXp6ZXIvcnVubmVycy9ocGFja19wYXJzZXJfZnV6emVyX3Rlc3Quc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworCitmbGFncz0iLW1heF90b3RhbF90aW1lPTM2MDAgLWpvYnM9MyAtd29ya2Vycz0zIgoraWYgWyAiJGNvbmZpZyIgPT0gImFzYW4tdHJhY2UtY21wIiBdCit0aGVuCisgIGZsYWdzPSItdXNlX3RyYWNlcz0xICRmbGFncyIKK2ZpCisKK2JpbnMvJGNvbmZpZy9ocGFja19wYXJzZXJfZnV6emVyX3Rlc3QgJGZsYWdzIGZ1enplcl9vdXRwdXQgdGVzdC9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyX2NvcnB1cwpkaWZmIC0tZ2l0IGEvdG9vbHMvZnV6emVyL3J1bm5lcnMvaHR0cF9mdXp6ZXJfdGVzdC5zaCBiL3Rvb2xzL2Z1enplci9ydW5uZXJzL2h0dHBfZnV6emVyX3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhZGFkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Z1enplci9ydW5uZXJzL2h0dHBfZnV6emVyX3Rlc3Quc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworCitmbGFncz0iLW1heF90b3RhbF90aW1lPTM2MDAgLWpvYnM9MyAtd29ya2Vycz0zIgoraWYgWyAiJGNvbmZpZyIgPT0gImFzYW4tdHJhY2UtY21wIiBdCit0aGVuCisgIGZsYWdzPSItdXNlX3RyYWNlcz0xICRmbGFncyIKK2ZpCisKK2JpbnMvJGNvbmZpZy9odHRwX2Z1enplcl90ZXN0ICRmbGFncyBmdXp6ZXJfb3V0cHV0IHRlc3QvY29yZS9odHRwL2NvcnB1cwpkaWZmIC0tZ2l0IGEvdG9vbHMvZnV6emVyL3J1bm5lcnMvanNvbl9mdXp6ZXJfdGVzdC5zaCBiL3Rvb2xzL2Z1enplci9ydW5uZXJzL2pzb25fZnV6emVyX3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1Y2JhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Z1enplci9ydW5uZXJzL2pzb25fZnV6emVyX3Rlc3Quc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworCitmbGFncz0iLW1heF90b3RhbF90aW1lPTM2MDAgLWpvYnM9MyAtd29ya2Vycz0zIgoraWYgWyAiJGNvbmZpZyIgPT0gImFzYW4tdHJhY2UtY21wIiBdCit0aGVuCisgIGZsYWdzPSItdXNlX3RyYWNlcz0xICRmbGFncyIKK2ZpCisKK2JpbnMvJGNvbmZpZy9qc29uX2Z1enplcl90ZXN0ICRmbGFncyBmdXp6ZXJfb3V0cHV0IHRlc3QvY29yZS9qc29uL2NvcnB1cwpkaWZmIC0tZ2l0IGEvdG9vbHMvZnV6emVyL3J1bm5lcnMvdXJpX2Z1enplcl90ZXN0LnNoIGIvdG9vbHMvZnV6emVyL3J1bm5lcnMvdXJpX2Z1enplcl90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjIwZDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mdXp6ZXIvcnVubmVycy91cmlfZnV6emVyX3Rlc3Quc2gKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTYsIEdvb2dsZSBJbmMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworCitmbGFncz0iLW1heF90b3RhbF90aW1lPTM2MDAgLWpvYnM9MyAtd29ya2Vycz0zIgoraWYgWyAiJGNvbmZpZyIgPT0gImFzYW4tdHJhY2UtY21wIiBdCit0aGVuCisgIGZsYWdzPSItdXNlX3RyYWNlcz0xICRmbGFncyIKK2ZpCisKK2JpbnMvJGNvbmZpZy91cmlfZnV6emVyX3Rlc3QgJGZsYWdzIGZ1enplcl9vdXRwdXQgdGVzdC9jb3JlL2NsaWVudF9jb25maWcvdXJpX2NvcnB1cwpkaWZmIC0tZ2l0IGEvdG9vbHMvZ2NlL2NyZWF0ZV9pbnRlcm9wX3dvcmtlci5zaCBiL3Rvb2xzL2djZS9jcmVhdGVfaW50ZXJvcF93b3JrZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2M0OWM2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2djZS9jcmVhdGVfaW50ZXJvcF93b3JrZXIuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgQ3JlYXRlcyBhbiBpbnRlcm9wIHdvcmtlciBvbiBHQ0UuCisjIElNUE9SVEFOVDogQWZ0ZXIgdGhpcyBzY3JpcHQgZmluaXNoZXMsIHRoZXJlIGFyZSBzdGlsbCBzb21lIG1hbnVhbAorIyBzdGVwcyBuZWVkZWQgdGhlcmUgYXJlIGhhcmQgdG8gYXV0b21hdGl6ZS4KKyMgU2VlIGdvL2dycGMtamVua2lucy1zZXR1cCBmb3IgZm9sbG93dXAgaW5zdHJ1Y3Rpb25zLgorCitzZXQgLWV4CisKK2NkICQoZGlybmFtZSAkMCkKKworQ0xPVURfUFJPSkVDVD1ncnBjLXRlc3RpbmcKK1pPTkU9dXMtZWFzdDEtYSAgIyBjYW5hcnkgZ2F0ZXdheSBpcyByZWFjaGFibGUgZnJvbSB0aGlzIHpvbmUKKworSU5TVEFOQ0VfTkFNRT0iJHsxOi1ncnBjLWNhbmFyeS1pbnRlcm9wMn0iCisKK2djbG91ZCBjb21wdXRlIGluc3RhbmNlcyBjcmVhdGUgJElOU1RBTkNFX05BTUUgXAorICAgIC0tcHJvamVjdD0iJENMT1VEX1BST0pFQ1QiIFwKKyAgICAtLXpvbmUgIiRaT05FIiBcCisgICAgLS1tYWNoaW5lLXR5cGUgbjEtc3RhbmRhcmQtMTYgXAorICAgIC0taW1hZ2UgdWJ1bnR1LTE1LTEwIFwKKyAgICAtLWJvb3QtZGlzay1zaXplIDEwMDAgXAorICAgIC0tc2NvcGVzIGh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgveGFwaS56b28KKworZWNobyAnQ3JlYXRlZCBHQ0UgaW5zdGFuY2UsIHdhaXRpbmcgNjAgc2Vjb25kcyBmb3IgaXQgdG8gY29tZSBvbmxpbmUuJworc2xlZXAgNjAKKworZ2Nsb3VkIGNvbXB1dGUgY29weS1maWxlcyBcCisgICAgLS1wcm9qZWN0PSIkQ0xPVURfUFJPSkVDVCIgXAorICAgIC0tem9uZSAiJFpPTkUiIFwKKyAgICBqZW5raW5zX21hc3Rlci5wdWIgbGludXhfd29ya2VyX2luaXQuc2ggJHtJTlNUQU5DRV9OQU1FfTp+CisKK2djbG91ZCBjb21wdXRlIHNzaCBcCisgICAgLS1wcm9qZWN0PSIkQ0xPVURfUFJPSkVDVCIgXAorICAgIC0tem9uZSAiJFpPTkUiIFwKKyAgICAkSU5TVEFOQ0VfTkFNRSAtLWNvbW1hbmQgIi4vbGludXhfd29ya2VyX2luaXQuc2giCmRpZmYgLS1naXQgYS90b29scy9nb3VyY2UvZ291cmNlLnNoIGIvdG9vbHMvZ291cmNlL2dvdXJjZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNjdhMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZ291cmNlL2dvdXJjZS5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2dvdXJjZSAtYyA0IC1zIDAuMSAtLW1heC1maWxlLWxhZyAwLjA1IC0tbWF4LWZpbGVzIDAgLWUgMC4wMSAtLWhpZGUgZmlsZW5hbWVzLGRpcm5hbWVzIC0tZmlsZS1maWx0ZXIgJ2RvYy9yZWZ8dnNwcm9qZWN0cy92Y3hwcm9qJyAkKgpkaWZmIC0tZ2l0IGEvdG9vbHMvaHR0cDJfaW50ZXJvcC9odHRwMmludGVyb3BfdGVzdC5nbyBiL3Rvb2xzL2h0dHAyX2ludGVyb3AvaHR0cDJpbnRlcm9wX3Rlc3QuZ28KaW5kZXggZmIzMTRkYS4uMzA1MTI1ZiAxMDA2NDQKLS0tIGEvdG9vbHMvaHR0cDJfaW50ZXJvcC9odHRwMmludGVyb3BfdGVzdC5nbworKysgYi90b29scy9odHRwMl9pbnRlcm9wL2h0dHAyaW50ZXJvcF90ZXN0LmdvCkBAIC00OSw3ICs0OSw3IEBACiAKIAlpZiBjdHguVXNlVGVzdENhIHsKIAkJLy8gSXQgd291bGQgYmUgb2RkIGlmIHVzZVRlc3RDYSB3YXMgdHJ1ZSwgYnV0IG5vdCB1c2VUbHMuICBtZWgKLQkJY2VydERhdGEsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoInNyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NhLnBlbSIpCisJCWNlcnREYXRhLCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKCJzcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvY2EucGVtIikKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQl0LkZhdGFsKGVycikKIAkJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvamVua2lucy9idWlsZF9pbnRlcm9wX3N0cmVzc19pbWFnZS5zaCBiL3Rvb2xzL2plbmtpbnMvYnVpbGRfaW50ZXJvcF9zdHJlc3NfaW1hZ2Uuc2gKaW5kZXggNTAxZGM1Yi4uYjVkYmNjNSAxMDA3NTUKLS0tIGEvdG9vbHMvamVua2lucy9idWlsZF9pbnRlcm9wX3N0cmVzc19pbWFnZS5zaAorKysgYi90b29scy9qZW5raW5zL2J1aWxkX2ludGVyb3Bfc3RyZXNzX2ltYWdlLnNoCkBAIC0zNCwxMCArMzQsMTIgQEAKIHNldCAteAogCiAjIFBhcmFtczoKLSMgIElOVEVST1BfSU1BR0UgLSBuYW1lIG9mIHRhZyBvZiB0aGUgZmluYWwgaW50ZXJvcCBpbWFnZQorIyAgSU5URVJPUF9JTUFHRSAtIE5hbWUgb2YgdGFnIG9mIHRoZSBmaW5hbCBpbnRlcm9wIGltYWdlCiAjICBJTlRFUk9QX0lNQUdFX1RBRyAtIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSBjcmVhdGVkIGltYWdlIHdpbGwgYmUgdGFnZ2VkIHVzaW5nCiAjICAgIHRoZSBjb21tYW5kOiAnZG9ja2VyIHRhZyAkSU5URVJPUF9JTUFHRSAkSU5URVJPUF9JTUFHRV9SRVBPU0lUT1JZX1RBRycKLSMgIEJBU0VfTkFNRSAtIGJhc2UgbmFtZSB1c2VkIHRvIGxvY2F0ZSB0aGUgYmFzZSBEb2NrZXJmaWxlIGFuZCBidWlsZCBzY3JpcHQKKyMgIEJBU0VfTkFNRSAtIEJhc2UgbmFtZSB1c2VkIHRvIGxvY2F0ZSB0aGUgYmFzZSBEb2NrZXJmaWxlIGFuZCBidWlsZCBzY3JpcHQKKyMgIEJVSUxEX1RZUEUgLSBUaGUgJ0NPTkZJRycgdmFyaWFibGUgcGFzc2VkIHRvIHRoZSAnbWFrZScgY29tbWFuZCAoZXhhbXBsZToKKyMgIGFzYW4sIHRzYW4uIERlZmF1bHQgdmFsdWU6IG9wdCkuCiAjICBUVFlfRkxBRyAtIG9wdGlvbmFsIC10IGZsYWcgdG8gbWFrZSBkb2NrZXIgYWxsb2NhdGUgdHR5CiAjICBCVUlMRF9JTlRFUk9QX0RPQ0tFUl9FWFRSQV9BUkdTIC0gb3B0aW9uYWwgYXJncyB0byBiZSBwYXNzZWQgdG8gdGhlCiAjICAgIGRvY2tlciBydW4gY29tbWFuZApAQCAtNzEsNiArNzMsNyBAQAogKGRvY2tlciBydW4gXAogICAtZSBDQ0FDSEVfRElSPS90bXAvY2NhY2hlIFwKICAgLWUgVEhJU19JU19SRUFMTFlfTkVFREVEPSdzZWUgaHR0cHM6Ly9naXRodWIuY29tL2RvY2tlci9kb2NrZXIvaXNzdWVzLzE0MjAzIGZvciB3aHkgZG9ja2VyIGlzIGF3ZnVsJyBcCisgIC1lIEJVSUxEX1RZUEU9JHtCVUlMRF9UWVBFOj1vcHR9IFwKICAgLWkgJFRUWV9GTEFHIFwKICAgJE1PVU5UX0FSR1MgXAogICAkQlVJTERfSU5URVJPUF9ET0NLRVJfRVhUUkFfQVJHUyBcCmRpZmYgLS1naXQgYS90b29scy9qZW5raW5zL2RvY2tlcl9ydW5fdGVzdHMuc2ggYi90b29scy9qZW5raW5zL2RvY2tlcl9ydW5fdGVzdHMuc2gKaW5kZXggOGQ2YzQyYy4uOTBhMmJkOCAxMDA3NTUKLS0tIGEvdG9vbHMvamVua2lucy9kb2NrZXJfcnVuX3Rlc3RzLnNoCisrKyBiL3Rvb2xzL2plbmtpbnMvZG9ja2VyX3J1bl90ZXN0cy5zaApAQCAtMzQsNyArMzQsNyBAQAogc2V0IC1lCiAKIGV4cG9ydCBDT05GSUc9JGNvbmZpZwotZXhwb3J0IEFTQU5fU1lNQk9MSVpFUl9QQVRIPS91c3IvYmluL2xsdm0tc3ltYm9saXplci0zLjUKK2V4cG9ydCBBU0FOX1NZTUJPTElaRVJfUEFUSD0vdXNyL2Jpbi9sbHZtLXN5bWJvbGl6ZXIKIAogIyBFbnN1cmUgdGhhdCBwcm9ncmFtcyBkZXBlbmRpbmcgb24gY3VycmVudC11c2VyLW93bmVyc2hpcCBvZiBjYWNoZSBkaXJlY3RvcmllcwogIyBhcmUgc2F0aXNmaWVkIChpdCdzIGJlaW5nIG1vdW50ZWQgZnJvbSBvdXRzaWRlIHRoZSBpbWFnZSkuCmRpZmYgLS1naXQgYS90b29scy9qZW5raW5zL3J1bl9mdXp6ZXIuc2ggYi90b29scy9qZW5raW5zL3J1bl9mdXp6ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q2ZGE5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2plbmtpbnMvcnVuX2Z1enplci5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgMjAxNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisjIEJ1aWxkcyBhbmQgcnVucyBhIGZ1enplciAoc3BlY2lmaWVkIGJ5IHRoZSBmaXJzdCBjb21tYW5kIGxpbmUgYXJndW1lbnQpCisKK3NldCAtZXgKKworZXhwb3J0IFJVTl9DT01NQU5EPSJ0b29scy9mdXp6ZXIvYnVpbGRfYW5kX3J1bl9mdXp6ZXIuc2ggJDEiCitleHBvcnQgRE9DS0VSX1JVTl9TQ1JJUFQ9dG9vbHMvamVua2lucy9kb2NrZXJfcnVuLnNoCitleHBvcnQgRE9DS0VSRklMRV9ESVI9dG9vbHMvZG9ja2VyZmlsZS90ZXN0L2Z1enplcgorZXhwb3J0IE9VVFBVVF9ESVI9ZnV6emVyX291dHB1dAorCit0b29scy9qZW5raW5zL2J1aWxkX2FuZF9ydW5fZG9ja2VyLnNoIFwKKyAgLWUgUlVOX0NPTU1BTkQ9IiRSVU5fQ09NTUFORCIgXAorICAtZSBPVVRQVVRfRElSPSIkT1VUUFVUX0RJUiIgXAorICAtZSBjb25maWc9IiRjb25maWciCmRpZmYgLS1naXQgYS90b29scy9ydW5fdGVzdHMvYnVpbGRfYXJ0aWZhY3Rfbm9kZS5zaCBiL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9hcnRpZmFjdF9ub2RlLnNoCmluZGV4IDZhYTQ4MjQuLmVmMzQ3NmEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9hcnRpZmFjdF9ub2RlLnNoCisrKyBiL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9hcnRpZmFjdF9ub2RlLnNoCkBAIC0zMCw5ICszMCw5IEBACiAKIE5PREVfVEFSR0VUX0FSQ0g9JDEKIHNvdXJjZSB+Ly5udm0vbnZtLnNoCi1zZXQgLWV4CiAKIG52bSB1c2UgNAorc2V0IC1leAogCiBjZCAkKGRpcm5hbWUgJDApLy4uLy4uCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9hcnRpZmFjdF9weXRob24uc2ggYi90b29scy9ydW5fdGVzdHMvYnVpbGRfYXJ0aWZhY3RfcHl0aG9uLnNoCmluZGV4IDdiYTA0ZDcuLjFmMjNmOWYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9hcnRpZmFjdF9weXRob24uc2gKKysrIGIvdG9vbHMvcnVuX3Rlc3RzL2J1aWxkX2FydGlmYWN0X3B5dGhvbi5zaApAQCAtMzUsMTUgKzM1LDE4IEBACiBpZiBbICIkU0tJUF9QSVBfSU5TVEFMTCIgPT0gIiIgXQogdGhlbgogICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgc2l4Ci0gIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBzZXR1cHRvb2xzCisgICMgVGhlcmUncyBhIGJ1ZyBpbiBuZXdlciB2ZXJzaW9ucyBvZiBzZXR1cHRvb2xzIChzZWUKKyAgIyBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy81MDMvcGtnX3Jlc291cmNlc192ZW5kb3JwYWNrYWdpbmdyZXF1aXJlbWVudHNpKQorICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgJ3NldHVwdG9vbHM9PTE4JwogICBwaXAgaW5zdGFsbCAtcnJlcXVpcmVtZW50cy50eHQKIGZpCiAKK2V4cG9ydCBHUlBDX1BZVEhPTl9VU0VfQ1VTVE9NX0JESVNUPTAKK2V4cG9ydCBHUlBDX1BZVEhPTl9CVUlMRF9XSVRIX0NZVEhPTj0xCisKICMgQnVpbGQgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gZmlyc3QgYmVjYXVzZSBNQU5JRkVTVC5pbiBjYW5ub3Qgb3ZlcnJpZGUKICMgZXhjbHVzaW9uIG9mIGJ1aWx0IHNoYXJlZCBvYmplY3RzIGFtb25nIHBhY2thZ2UgcmVzb3VyY2VzIChmb3Igc29tZQogIyBpbmV4cGxpY2FibGUgcmVhc29uKS4KLUdSUENfUFlUSE9OX1VTRV9DVVNUT01fQkRJU1Q9MCAgXAotR1JQQ19QWVRIT05fQlVJTERfV0lUSF9DWVRIT049MSBcCiAke1NFVEFSQ0hfQ01EfSBweXRob24gc2V0dXAucHkgIFwKICAgICBzZGlzdAogCkBAIC01MSwxNSArNTQsMTEgQEAKICMgYW5kIHRodXMgb3VnaHQgdG8gYmUgcnVuIGluIGEgc2hlbGwgY29tbWFuZCBzZXBhcmF0ZSBvZiBvdGhlcnMuIEZ1cnRoZXIsIGl0CiAjIHRyYXNoZXMgdGhlIGFjdHVhbCBiZGlzdF93aGVlbCBvdXRwdXQsIHNvIGl0IHNob3VsZCBiZSBydW4gZmlyc3Qgc28gdGhhdAogIyBiZGlzdF93aGVlbCBtYXkgYmUgcnVuIHVubW9sZXN0ZWQuCi1HUlBDX1BZVEhPTl9VU0VfQ1VTVE9NX0JESVNUPTAgIFwKLUdSUENfUFlUSE9OX0JVSUxEX1dJVEhfQ1lUSE9OPTEgXAogJHtTRVRBUkNIX0NNRH0gcHl0aG9uIHNldHVwLnB5ICBcCiAgICAgYnVpbGRfdGFnZ2VkX2V4dAogCiAjIFdoZWVsIGhhcyBhIGJ1ZyB3aGVyZSBkaXJlY3RvcmllcyBkb24ndCBnZXQgZXhjbHVkZWQuCiAjIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsL2lzc3Vlcy85OS9jYW5ub3QtZXhjbHVkZS1kaXJlY3RvcnkKLUdSUENfUFlUSE9OX1VTRV9DVVNUT01fQkRJU1Q9MCAgXAotR1JQQ19QWVRIT05fQlVJTERfV0lUSF9DWVRIT049MSBcCiAke1NFVEFSQ0hfQ01EfSBweXRob24gc2V0dXAucHkgIFwKICAgICBiZGlzdF93aGVlbAogCmRpZmYgLS1naXQgYS90b29scy9ydW5fdGVzdHMvYnVpbGRfbm9kZS5zaCBiL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9ub2RlLnNoCmluZGV4IDljNGFmMDcuLmNiZTBlMzEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9ub2RlLnNoCisrKyBiL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9ub2RlLnNoCkBAIC0zMSw5ICszMSw5IEBACiAKIE5PREVfVkVSU0lPTj0kMQogc291cmNlIH4vLm52bS9udm0uc2gKLXNldCAtZXgKIAogbnZtIHVzZSAkTk9ERV9WRVJTSU9OCitzZXQgLWV4CiAKIENPTkZJRz0ke0NPTkZJRzotb3B0fQogCmRpZmYgLS1naXQgYS90b29scy9ydW5fdGVzdHMvYnVpbGRfcGFja2FnZV9ub2RlLnNoIGIvdG9vbHMvcnVuX3Rlc3RzL2J1aWxkX3BhY2thZ2Vfbm9kZS5zaAppbmRleCBhY2E5MGEzLi41NDBjODI2IDEwMDc1NQotLS0gYS90b29scy9ydW5fdGVzdHMvYnVpbGRfcGFja2FnZV9ub2RlLnNoCisrKyBiL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9wYWNrYWdlX25vZGUuc2gKQEAgLTI5LDkgKzI5LDkgQEAKICMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogc291cmNlIH4vLm52bS9udm0uc2gKLXNldCAtZXgKIAogbnZtIHVzZSA0CitzZXQgLWV4CiAKIGNkICQoZGlybmFtZSAkMCkvLi4vLi4KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuX3Rlc3RzL2J1aWxkX3B5dGhvbi5zaCBiL3Rvb2xzL3J1bl90ZXN0cy9idWlsZF9weXRob24uc2gKaW5kZXggNzlhMTQ4Zi4uZmU4NDMwMCAxMDA3NTUKLS0tIGEvdG9vbHMvcnVuX3Rlc3RzL2J1aWxkX3B5dGhvbi5zaAorKysgYi90b29scy9ydW5fdGVzdHMvYnVpbGRfcHl0aG9uLnNoCkBAIC00MCw2ICs0MCw3IEBACiBleHBvcnQgQ0ZMQUdTPSItSSRST09UL2luY2x1ZGUgLXN0ZD1nbnU5OSIKIGV4cG9ydCBMREZMQUdTPSItTCRST09UL2xpYnMvJENPTkZJRyIKIGV4cG9ydCBHUlBDX1BZVEhPTl9CVUlMRF9XSVRIX0NZVEhPTj0xCitleHBvcnQgR1JQQ19QWVRIT05fVVNFX1BSRUNPTVBJTEVEX0JJTkFSSUVTPTAKIAogaWYgWyAiJENPTkZJRyIgPSAiZ2NvdiIgXQogdGhlbgpkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuX3Rlc3RzL2NvbmZpZ3MuanNvbiBiL3Rvb2xzL3J1bl90ZXN0cy9jb25maWdzLmpzb24KaW5kZXggYTg1ODE3MC4uMzI1ZTlhYSAxMDA2NDQKLS0tIGEvdG9vbHMvcnVuX3Rlc3RzL2NvbmZpZ3MuanNvbgorKysgYi90b29scy9ydW5fdGVzdHMvY29uZmlncy5qc29uCkBAIC0zLDYgKzMsMTQgQEAKICAgICAiY29uZmlnIjogIm9wdCIKICAgfSwgCiAgIHsKKyAgICAiY29uZmlnIjogImFzYW4tdHJhY2UtY21wIiwgCisgICAgImVudmlyb24iOiB7CisgICAgICAiQVNBTl9PUFRJT05TIjogImRldGVjdF9sZWFrcz0xOmNvbG9yPWFsd2F5cyIsIAorICAgICAgIkxTQU5fT1BUSU9OUyI6ICJzdXBwcmVzc2lvbnM9dG9vbHMvbHNhbl9zdXBwcmVzc2lvbnMudHh0OnJlcG9ydF9vYmplY3RzPTEiCisgICAgfSwgCisgICAgInRpbWVvdXRfbXVsdGlwbGllciI6IDMKKyAgfSwgCisgIHsKICAgICAiY29uZmlnIjogImRiZyIKICAgfSwgCiAgIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3J1bl90ZXN0cy9wcmVfYnVpbGRfbm9kZS5zaCBiL3Rvb2xzL3J1bl90ZXN0cy9wcmVfYnVpbGRfbm9kZS5zaAppbmRleCAxMWY0NmQ2Li4xZjU1ZGYwIDEwMDc1NQotLS0gYS90b29scy9ydW5fdGVzdHMvcHJlX2J1aWxkX25vZGUuc2gKKysrIGIvdG9vbHMvcnVuX3Rlc3RzL3ByZV9idWlsZF9ub2RlLnNoCkBAIC0zMSw5ICszMSw5IEBACiAKIE5PREVfVkVSU0lPTj0kMQogc291cmNlIH4vLm52bS9udm0uc2gKLXNldCAtZXgKIAogbnZtIHVzZSAkTk9ERV9WRVJTSU9OCitzZXQgLWV4CiAKIGV4cG9ydCBHUlBDX0NPTkZJRz0ke0NPTkZJRzotb3B0fQogCmRpZmYgLS1naXQgYS90b29scy9ydW5fdGVzdHMvcnVuX25vZGUuc2ggYi90b29scy9ydW5fdGVzdHMvcnVuX25vZGUuc2gKaW5kZXggZDMzODkwMC4uYjk0ZGMzZSAxMDA3NTUKLS0tIGEvdG9vbHMvcnVuX3Rlc3RzL3J1bl9ub2RlLnNoCisrKyBiL3Rvb2xzL3J1bl90ZXN0cy9ydW5fbm9kZS5zaApAQCAtMzAsOSArMzAsOSBAQAogCiBOT0RFX1ZFUlNJT049JDEKIHNvdXJjZSB+Ly5udm0vbnZtLnNoCi1zZXQgLWV4CiAKIG52bSB1c2UgJE5PREVfVkVSU0lPTgorc2V0IC1leAogCiBDT05GSUc9JHtDT05GSUc6LW9wdH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuX3Rlc3RzL3J1bl9weXRob24uc2ggYi90b29scy9ydW5fdGVzdHMvcnVuX3B5dGhvbi5zaAppbmRleCBkNGI3MjUwLi5lM2JlMTRlIDEwMDc1NQotLS0gYS90b29scy9ydW5fdGVzdHMvcnVuX3B5dGhvbi5zaAorKysgYi90b29scy9ydW5fdGVzdHMvcnVuX3B5dGhvbi5zaApAQCAtNDAsNiArNDAsNyBAQAogZXhwb3J0IENGTEFHUz0iLUkkUk9PVC9pbmNsdWRlIC1zdGQ9Yzg5IgogZXhwb3J0IExERkxBR1M9Ii1MJFJPT1QvbGlicy8kQ09ORklHIgogZXhwb3J0IEdSUENfUFlUSE9OX0JVSUxEX1dJVEhfQ1lUSE9OPTEKK2V4cG9ydCBHUlBDX1BZVEhPTl9VU0VfUFJFQ09NUElMRURfQklOQVJJRVM9MAogCiBpZiBbICIkQ09ORklHIiA9ICJnY292IiBdCiB0aGVuCmRpZmYgLS1naXQgYS90b29scy9ydW5fdGVzdHMvcnVuX3Rlc3RzLnB5IGIvdG9vbHMvcnVuX3Rlc3RzL3J1bl90ZXN0cy5weQppbmRleCBkYzExYzBiLi43MWJiN2IxIDEwMDc1NQotLS0gYS90b29scy9ydW5fdGVzdHMvcnVuX3Rlc3RzLnB5CisrKyBiL3Rvb2xzL3J1bl90ZXN0cy9ydW5fdGVzdHMucHkKQEAgLTEyMCw3ICsxMjAsMTIgQEAKIAogZGVmIF9jaGVja19jb21waWxlcihjb21waWxlciwgc3VwcG9ydGVkX2NvbXBpbGVycyk6CiAgIGlmIGNvbXBpbGVyIG5vdCBpbiBzdXBwb3J0ZWRfY29tcGlsZXJzOgotICAgIHJhaXNlIEV4Y2VwdGlvbignQ29tcGlsZXIgJXMgbm90IHN1cHBvcnRlZC4nICUgY29tcGlsZXIpCisgICAgcmFpc2UgRXhjZXB0aW9uKCdDb21waWxlciAlcyBub3Qgc3VwcG9ydGVkIChvbiB0aGlzIHBsYXRmb3JtKS4nICUgY29tcGlsZXIpCisKKworZGVmIF9jaGVja19hcmNoKGFyY2gsIHN1cHBvcnRlZF9hcmNocyk6CisgIGlmIGFyY2ggbm90IGluIHN1cHBvcnRlZF9hcmNoczoKKyAgICByYWlzZSBFeGNlcHRpb24oJ0FyY2hpdGVjdHVyZSAlcyBub3Qgc3VwcG9ydGVkLicgJSBhcmNoKQogCiAKIGRlZiBfaXNfdXNlX2RvY2tlcl9jaGlsZCgpOgpAQCAtMTgzLDcgKzE4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRuYW1lPSclczolcycgJSAoYmluYXJ5LCB0ZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfY29zdD10YXJnZXRbJ2NwdV9jb3N0J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbj17J0dSUENfREVGQVVMVF9TU0xfUk9PVFNfRklMRV9QQVRIJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUk9PVCArICcvc3JjL2NvcmUvdHNpL3Rlc3RfY3JlZHMvY2EucGVtJ30pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ST09UICsgJy9zcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvY2EucGVtJ30pKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGNtZGxpbmUgPSBbYmluYXJ5XSArIHRhcmdldFsnYXJncyddCiAgICAgICAgICAgb3V0LmFwcGVuZChzZWxmLmNvbmZpZy5qb2Jfc3BlYyhjbWRsaW5lLCBbYmluYXJ5XSwKQEAgLTE5MSw3ICsxOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X2Nvc3Q9dGFyZ2V0WydjcHVfY29zdCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxha3k9dGFyZ2V0LmdldCgnZmxha3knLCBGYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9uPXsnR1JQQ19ERUZBVUxUX1NTTF9ST09UU19GSUxFX1BBVEgnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JPT1QgKyAnL3NyYy9jb3JlL3RzaS90ZXN0X2NyZWRzL2NhLnBlbSd9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ST09UICsgJy9zcmMvY29yZS9saWIvdHNpL3Rlc3RfY3JlZHMvY2EucGVtJ30pKQogICAgICAgZWxpZiBzZWxmLmFyZ3MucmVnZXggPT0gJy4qJyBvciBzZWxmLnBsYXRmb3JtID09ICd3aW5kb3dzJzoKICAgICAgICAgcHJpbnQgJ1xuV0FSTklORzogYmluYXJ5IG5vdCBmb3VuZCwgc2tpcHBpbmcnLCBiaW5hcnkKICAgICByZXR1cm4gc29ydGVkKG91dCkKQEAgLTQ2NCw3ICs0NjksMjAgQEAKICAgZGVmIGNvbmZpZ3VyZShzZWxmLCBjb25maWcsIGFyZ3MpOgogICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgc2VsZi5hcmdzID0gYXJncwotICAgIF9jaGVja19jb21waWxlcihzZWxmLmFyZ3MuY29tcGlsZXIsIFsnZGVmYXVsdCddKQorICAgIGlmIHNlbGYucGxhdGZvcm0gPT0gJ3dpbmRvd3MnOgorICAgICAgIyBFeHBsaWNpdGx5IGNob29zaW5nIGJldHdlZW4geDg2IGFuZCB4NjQgYXJjaCBkb2Vzbid0IHdvcmsgeWV0CisgICAgICBfY2hlY2tfYXJjaChzZWxmLmFyZ3MuYXJjaCwgWydkZWZhdWx0J10pCisgICAgICBzZWxmLl9tYWtlX29wdGlvbnMgPSBbX3dpbmRvd3NfdG9vbHNldF9vcHRpb24oc2VsZi5hcmdzLmNvbXBpbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd2luZG93c19hcmNoX29wdGlvbihzZWxmLmFyZ3MuYXJjaCldCisgICAgZWxzZToKKyAgICAgIF9jaGVja19jb21waWxlcihzZWxmLmFyZ3MuY29tcGlsZXIsIFsnZGVmYXVsdCddKQorICAgICAgaWYgc2VsZi5wbGF0Zm9ybSA9PSAnbWFjJzoKKyAgICAgICAgIyBPbiBNYWMsIG9mZmljaWFsIGRpc3RyaWJ1dGlvbiBvZiBtb25vIGlzIDMyYml0LgorICAgICAgICAjIFRPRE8oanRhdHRlcm11c2NoKTogRU1CRURfWkxJQj10cnVlIGN1cnJlbnRseSBicmVha3MgdGhlIG1hYyBidWlsZAorICAgICAgICBzZWxmLl9tYWtlX29wdGlvbnMgPSBbJ0VNQkVEX09QRU5TU0w9dHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTPS1tMzInLCAnTERGTEFHUz0tbTMyJ10KKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuX21ha2Vfb3B0aW9ucyA9IFsnRU1CRURfT1BFTlNTTD10cnVlJywgJ0VNQkVEX1pMSUI9dHJ1ZSddCiAKICAgZGVmIHRlc3Rfc3BlY3Moc2VsZik6CiAgICAgd2l0aCBvcGVuKCdzcmMvY3NoYXJwL3Rlc3RzLmpzb24nKSBhcyBmOgpAQCAtNTExLDIzICs1MjksMTYgQEAKICAgICAgIHJldHVybiBbWyd0b29scy9ydW5fdGVzdHMvcHJlX2J1aWxkX2NzaGFycC5zaCddXQogCiAgIGRlZiBtYWtlX3RhcmdldHMoc2VsZik6Ci0gICAgIyBGb3IgV2luZG93cywgdGhpcyB0YXJnZXQgZG9lc24ndCByZWFsbHkgYnVpbGQgYW55dGhpbmcsCi0gICAgIyBldmVyeXRoaW5nIGlzIGJ1aWxkIGJ5IGJ1aWxkYWxsIHNjcmlwdCBsYXRlci4KLSAgICBpZiBzZWxmLnBsYXRmb3JtID09ICd3aW5kb3dzJzoKLSAgICAgIHJldHVybiBbXQotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gWydncnBjX2NzaGFycF9leHQnXQorICAgIHJldHVybiBbJ2dycGNfY3NoYXJwX2V4dCddCiAKICAgZGVmIG1ha2Vfb3B0aW9ucyhzZWxmKToKLSAgICBpZiBzZWxmLnBsYXRmb3JtID09ICdtYWMnOgotICAgICAgIyBPbiBNYWMsIG9mZmljaWFsIGRpc3RyaWJ1dGlvbiBvZiBtb25vIGlzIDMyYml0LgotICAgICAgcmV0dXJuIFsnQ0ZMQUdTPS1hcmNoIGkzODYnLCAnTERGTEFHUz0tYXJjaCBpMzg2J10KLSAgICBlbHNlOgotICAgICAgcmV0dXJuIFtdCisgICAgcmV0dXJuIHNlbGYuX21ha2Vfb3B0aW9uczsKIAogICBkZWYgYnVpbGRfc3RlcHMoc2VsZik6CiAgICAgaWYgc2VsZi5wbGF0Zm9ybSA9PSAnd2luZG93cyc6Ci0gICAgICByZXR1cm4gW1snc3JjXFxjc2hhcnBcXGJ1aWxkYWxsLmJhdCddXQorICAgICAgcmV0dXJuIFtbX3dpbmRvd3NfYnVpbGRfYmF0KHNlbGYuYXJncy5jb21waWxlciksCisgICAgICAgICAgICAgICAnc3JjL2NzaGFycC9HcnBjLnNsbicsCisgICAgICAgICAgICAgICAnL3A6Q29uZmlndXJhdGlvbj0lcycgJSBfTVNCVUlMRF9DT05GSUdbc2VsZi5jb25maWcuYnVpbGRfY29uZmlnXV1dCiAgICAgZWxzZToKICAgICAgIHJldHVybiBbWyd0b29scy9ydW5fdGVzdHMvYnVpbGRfY3NoYXJwLnNoJ11dCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3J1bl90ZXN0cy9zYW5pdHkvY2hlY2tfc291cmNlc19hbmRfaGVhZGVycy5weSBiL3Rvb2xzL3J1bl90ZXN0cy9zYW5pdHkvY2hlY2tfc291cmNlc19hbmRfaGVhZGVycy5weQppbmRleCA0NGRjNDliLi5iNWY3OTEyIDEwMDc1NQotLS0gYS90b29scy9ydW5fdGVzdHMvc2FuaXR5L2NoZWNrX3NvdXJjZXNfYW5kX2hlYWRlcnMucHkKKysrIGIvdG9vbHMvcnVuX3Rlc3RzL3Nhbml0eS9jaGVja19zb3VyY2VzX2FuZF9oZWFkZXJzLnB5CkBAIC01NSw3ICs1NSw3IEBACiAgIGZvciBkZXAgaW4gdGFyZ2V0WydkZXBzJ106CiAgICAgaWYgdGFyZ2V0X2hhc19oZWFkZXIoZ2V0X3RhcmdldChkZXApLCBuYW1lKToKICAgICAgIHJldHVybiBUcnVlCi0gIGlmIG5hbWUgPT0gJ3NyYy9jb3JlL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5oJzoKKyAgaWYgbmFtZSA9PSAnc3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3Byb2Jlcy5oJzoKICAgICByZXR1cm4gVHJ1ZQogICByZXR1cm4gRmFsc2UKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuX3Rlc3RzL3NvdXJjZXNfYW5kX2hlYWRlcnMuanNvbiBiL3Rvb2xzL3J1bl90ZXN0cy9zb3VyY2VzX2FuZF9oZWFkZXJzLmpzb24KaW5kZXggMDZkYzZkMC4uZDdjOTgzOSAxMDA2NDQKLS0tIGEvdG9vbHMvcnVuX3Rlc3RzL3NvdXJjZXNfYW5kX2hlYWRlcnMuanNvbgorKysgYi90b29scy9ydW5fdGVzdHMvc291cmNlc19hbmRfaGVhZGVycy5qc29uCkBAIC04OTEsNiArODkxLDIyIEBACiAgICAgXSwgCiAgICAgImhlYWRlcnMiOiBbXSwgCiAgICAgImxhbmd1YWdlIjogImMiLCAKKyAgICAibmFtZSI6ICJocGFja19wYXJzZXJfZnV6emVyX3Rlc3QiLCAKKyAgICAic3JjIjogWworICAgICAgInRlc3QvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlcl9mdXp6ZXJfdGVzdC5jIgorICAgIF0sIAorICAgICJ0aGlyZF9wYXJ0eSI6IGZhbHNlLCAKKyAgICAidHlwZSI6ICJ0YXJnZXQiCisgIH0sIAorICB7CisgICAgImRlcHMiOiBbCisgICAgICAiZ3ByIiwgCisgICAgICAiZ3ByX3Rlc3RfdXRpbCIsIAorICAgICAgImdycGMiLCAKKyAgICAgICJncnBjX3Rlc3RfdXRpbCIKKyAgICBdLCAKKyAgICAiaGVhZGVycyI6IFtdLCAKKyAgICAibGFuZ3VhZ2UiOiAiYyIsIAogICAgICJuYW1lIjogImhwYWNrX3BhcnNlcl90ZXN0IiwgCiAgICAgInNyYyI6IFsKICAgICAgICJ0ZXN0L2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXJfdGVzdC5jIgpAQCAtOTIzLDYgKzkzOSwyMiBAQAogICAgIF0sIAogICAgICJoZWFkZXJzIjogW10sIAogICAgICJsYW5ndWFnZSI6ICJjIiwgCisgICAgIm5hbWUiOiAiaHR0cF9mdXp6ZXJfdGVzdCIsIAorICAgICJzcmMiOiBbCisgICAgICAidGVzdC9jb3JlL2h0dHAvZnV6emVyLmMiCisgICAgXSwgCisgICAgInRoaXJkX3BhcnR5IjogZmFsc2UsIAorICAgICJ0eXBlIjogInRhcmdldCIKKyAgfSwgCisgIHsKKyAgICAiZGVwcyI6IFsKKyAgICAgICJncHIiLCAKKyAgICAgICJncHJfdGVzdF91dGlsIiwgCisgICAgICAiZ3JwYyIsIAorICAgICAgImdycGNfdGVzdF91dGlsIgorICAgIF0sIAorICAgICJoZWFkZXJzIjogW10sIAorICAgICJsYW5ndWFnZSI6ICJjIiwgCiAgICAgIm5hbWUiOiAiaHR0cF9wYXJzZXJfdGVzdCIsIAogICAgICJzcmMiOiBbCiAgICAgICAidGVzdC9jb3JlL2h0dHAvcGFyc2VyX3Rlc3QuYyIKQEAgLTEwMTMsNiArMTA0NSwyMiBAQAogICB7CiAgICAgImRlcHMiOiBbCiAgICAgICAiZ3ByIiwgCisgICAgICAiZ3ByX3Rlc3RfdXRpbCIsIAorICAgICAgImdycGMiLCAKKyAgICAgICJncnBjX3Rlc3RfdXRpbCIKKyAgICBdLCAKKyAgICAiaGVhZGVycyI6IFtdLCAKKyAgICAibGFuZ3VhZ2UiOiAiYyIsIAorICAgICJuYW1lIjogImpzb25fZnV6emVyX3Rlc3QiLCAKKyAgICAic3JjIjogWworICAgICAgInRlc3QvY29yZS9qc29uL2Z1enplci5jIgorICAgIF0sIAorICAgICJ0aGlyZF9wYXJ0eSI6IGZhbHNlLCAKKyAgICAidHlwZSI6ICJ0YXJnZXQiCisgIH0sIAorICB7CisgICAgImRlcHMiOiBbCisgICAgICAiZ3ByIiwgCiAgICAgICAiZ3JwYyIKICAgICBdLCAKICAgICAiaGVhZGVycyI6IFtdLCAKQEAgLTE1NDQsNiArMTU5MiwyMiBAQAogICAgIF0sIAogICAgICJoZWFkZXJzIjogW10sIAogICAgICJsYW5ndWFnZSI6ICJjIiwgCisgICAgIm5hbWUiOiAidXJpX2Z1enplcl90ZXN0IiwgCisgICAgInNyYyI6IFsKKyAgICAgICJ0ZXN0L2NvcmUvY2xpZW50X2NvbmZpZy91cmlfZnV6emVyX3Rlc3QuYyIKKyAgICBdLCAKKyAgICAidGhpcmRfcGFydHkiOiBmYWxzZSwgCisgICAgInR5cGUiOiAidGFyZ2V0IgorICB9LCAKKyAgeworICAgICJkZXBzIjogWworICAgICAgImdwciIsIAorICAgICAgImdwcl90ZXN0X3V0aWwiLCAKKyAgICAgICJncnBjIiwgCisgICAgICAiZ3JwY190ZXN0X3V0aWwiCisgICAgXSwgCisgICAgImhlYWRlcnMiOiBbXSwgCisgICAgImxhbmd1YWdlIjogImMiLCAKICAgICAibmFtZSI6ICJ1cmlfcGFyc2VyX3Rlc3QiLCAKICAgICAic3JjIjogWwogICAgICAgInRlc3QvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXJfdGVzdC5jIgpAQCAtMzc3MiwxOCArMzgzNiwxOCBAQAogICAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L3Rsc19tc3ZjLmgiLCAKICAgICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfcHRocmVhZC5oIiwgCiAgICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvdXNlZnVsLmgiLCAKLSAgICAgICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9tdXJtdXJfaGFzaC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oIgorICAgICAgInNyYy9jb3JlL2xpYi9wcm9maWxpbmcvdGltZXJzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9iYWNrb2ZmLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9ibG9ja19hbm5vdGF0ZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2FkX2ZpbGUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L211cm11cl9oYXNoLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90bXBmaWxlLmgiCiAgICAgXSwgCiAgICAgImxhbmd1YWdlIjogImMiLCAKICAgICAibmFtZSI6ICJncHIiLCAKQEAgLTM4MzAsNjIgKzM4OTQsNjIgQEAKICAgICAgICJpbmNsdWRlL2dycGMvc3VwcG9ydC90bHNfbXN2Yy5oIiwgCiAgICAgICAiaW5jbHVkZS9ncnBjL3N1cHBvcnQvdGxzX3B0aHJlYWQuaCIsIAogICAgICAgImluY2x1ZGUvZ3JwYy9zdXBwb3J0L3VzZWZ1bC5oIiwgCi0gICAgICAic3JjL2NvcmUvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIiwgCi0gICAgICAic3JjL2NvcmUvcHJvZmlsaW5nL3N0YXBfdGltZXJzLmMiLCAKLSAgICAgICJzcmMvY29yZS9wcm9maWxpbmcvdGltZXJzLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2FsbG9jLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2F2bC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9iYWNrb2ZmLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2JhY2tvZmYuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvYmxvY2tfYW5ub3RhdGUuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvY21kbGluZS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9jcHVfaXBob25lLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2NwdV9saW51eC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9jcHVfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvY3B1X3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvZW52LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2Vudl9saW51eC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9lbnZfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvZW52X3dpbjMyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2hpc3RvZ3JhbS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9ob3N0X3BvcnQuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvbG9hZF9maWxlLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2xvYWRfZmlsZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2cuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvbG9nX2FuZHJvaWQuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvbG9nX2xpbnV4LmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L2xvZ19wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9sb2dfd2luMzIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvbXVybXVyX2hhc2guaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvc2xpY2UuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvc2xpY2VfYnVmZmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZy5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmcuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvc3RyaW5nX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3N0cmluZ193aW4zMi5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvc3VicHJvY2Vzc19wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9zdWJwcm9jZXNzX3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvc3luYy5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC9zeW5jX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3N5bmNfd2luMzIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdGhkLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3RoZF9pbnRlcm5hbC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC90aGRfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdGhkX3dpbjMyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3RpbWUuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZV9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdGltZV9wcmVjaXNlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3RpbWVfd2luMzIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvdG1wZmlsZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VwcG9ydC90bXBmaWxlX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cHBvcnQvd3JhcF9tZW1jcHkuYyIKKyAgICAgICJzcmMvY29yZS9saWIvcHJvZmlsaW5nL2Jhc2ljX3RpbWVycy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy9zdGFwX3RpbWVycy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3Byb2ZpbGluZy90aW1lcnMuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2FsbG9jLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9hdmwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2JhY2tvZmYuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Jsb2NrX2Fubm90YXRlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jbWRsaW5lLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfaXBob25lLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9jcHVfbGludXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2NwdV9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvY3B1X3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvZW52X2xpbnV4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9lbnZfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2Vudl93aW4zMi5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvaGlzdG9ncmFtLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9ob3N0X3BvcnQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvYWRfZmlsZS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9hZF9maWxlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2cuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19hbmRyb2lkLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9sb2dfbGludXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L2xvZ19wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbG9nX3dpbjMyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9tdXJtdXJfaGFzaC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvbXVybXVyX2hhc2guaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3NsaWNlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zbGljZV9idWZmZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0YWNrX2xvY2tmcmVlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdGFja19sb2NrZnJlZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N0cmluZ19wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3RyaW5nX3dpbjMyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC9zdHJpbmdfd2luMzIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3NfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3N1YnByb2Nlc3Nfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luYy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY19wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvc3luY193aW4zMi5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aGRfaW50ZXJuYWwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RoZF9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGhkX3dpbjMyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VwcG9ydC90aW1lX3ByZWNpc2UuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RpbWVfcHJlY2lzZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGltZV93aW4zMi5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cHBvcnQvdGxzX3B0aHJlYWQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3RtcGZpbGVfd2luMzIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXBwb3J0L3dyYXBfbWVtY3B5LmMiCiAgICAgXSwgCiAgICAgInRoaXJkX3BhcnR5IjogZmFsc2UsIAogICAgICJ0eXBlIjogImxpYiIKQEAgLTM5MjQsMTQzICszOTg4LDE0MyBAQAogICAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIiwgCiAgICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zdGF0dXMuaCIsIAogICAgICAgImluY2x1ZGUvZ3JwYy9zdGF0dXMuaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9tbG9nLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvcnBjX21ldHJpY19pZC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NvbnRleHQuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9yb3VuZF9yb2Jpbi5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsIAotICAgICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsIAotICAgICAgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL2h0dHBjbGkuaCIsIAotICAgICAgInNyYy9jb3JlL2h0dHAvcGFyc2VyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnRfcGFpci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb21nci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX2NsaWVudC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb24uaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9iNjQuaCIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9oYW5kc2hha2UuaCIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2pzb25fdG9rZW4uaCIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb25uZWN0b3IuaCIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIsIAotICAgICAgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS9zc2xfdHlwZXMuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2dvYXdheS5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3BpbmcuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3BhcnNlci5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbmNvbWluZ19tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ludGVybmFsLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RhdHVzX2NvbnZlcnNpb24uaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdHJlYW1fbWFwLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX3BsdWdpbi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jbGllbnRfY2hhbm5lbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29udGV4dC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX2NvbW1vbi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYXV0aF9maWx0ZXJzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvYjY0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9oYW5kc2hha2UuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvaW5pdC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGEuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHNpL3NzbF90eXBlcy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIiwgCiAgICAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiLmgiLCAKICAgICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfY29tbW9uLmgiLCAKICAgICAgICJ0aGlyZF9wYXJ0eS9uYW5vcGIvcGJfZGVjb2RlLmgiLCAKQEAgLTQwODIsMzA0ICs0MTQ2LDMwNCBAQAogICAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vcHJvcGFnYXRpb25fYml0cy5oIiwgCiAgICAgICAiaW5jbHVkZS9ncnBjL2ltcGwvY29kZWdlbi9zdGF0dXMuaCIsIAogICAgICAgImluY2x1ZGUvZ3JwYy9zdGF0dXMuaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9hZ2dyZWdhdGlvbi5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL2NvbnRleHQuYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfZmlsdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX3BsdWdpbi5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL2luaXRpYWxpemUuYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9tbG9nLmMiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL29wZXJhdGlvbi5jIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy90cmFjaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY29tcHJlc3NfZmlsdGVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jb250ZXh0LmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfZmFjdG9yeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfZmFjdG9yeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy91cmlfcGFyc2VyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9hbGdvcml0aG1fbWV0YWRhdGEuaCIsIAotICAgICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwgCi0gICAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5jIiwgCi0gICAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vbWVzc2FnZV9jb21wcmVzcy5oIiwgCi0gICAgICAic3JjL2NvcmUvZGVidWcvdHJhY2UuYyIsIAotICAgICAgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmgiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmMiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL2h0dHBjbGkuYyIsIAotICAgICAgInNyYy9jb3JlL2h0dHAvaHR0cGNsaS5oIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9wYXJzZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2h0dHAvcGFyc2VyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9jbG9zdXJlLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY19jdHguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9leGVjdXRvci5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2ZkX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb2NwX3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb21nci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfaW50ZXJuYWwuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3Jfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3BfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90aW1lci5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyX2hlYXAuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX2V2ZW50ZmQuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvanNvbi9qc29uLmMiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb24uaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl9jb21tb24uaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl9yZWFkZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl9zdHJpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbl93cml0ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIiwgCi0gICAgICAic3JjL2NvcmUvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9hdXRoX2ZpbHRlcnMuaCIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2I2NC5jIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvYjY0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9jbGllbnRfYXV0aF9maWx0ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFscy5oIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvY3JlZGVudGlhbHNfbWV0YWRhdGEuYyIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9jcmVkZW50aWFsc193aW4zMi5jIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2hhbmRzaGFrZS5jIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvaGFuZHNoYWtlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmMiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9qc29uX3Rva2VuLmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9qd3RfdmVyaWZpZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L2p3dF92ZXJpZmllci5oIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cmVfZW5kcG9pbnQuaCIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwgCi0gICAgICAic3JjL2NvcmUvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmMiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9zZWN1cml0eV9jb250ZXh0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3NlY3VyaXR5L3NlcnZlcl9zZWN1cmVfY2h0dHAyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIsIAotICAgICAgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX3JwY19zdGF0cy5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9hbGFybS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9hcGlfdHJhY2UuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGwuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfbG9nX2JhdGNoLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2NyZWF0ZS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX2luaXQuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9ldmVudF9zdHJpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2luaXQuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvaW5pdC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0X3NlY3VyZS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9zZWN1cmVfY2hhbm5lbF9jcmVhdGUuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXJfY2h0dHAyLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvdmVyc2lvbi5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2J5dGVfc3RyZWFtLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2Jpbl9lbmNvZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2RhdGEuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZ29hd2F5LmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3BpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9yc3Rfc3RyZWFtLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX2VuY29kZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfcGFyc2VyLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3RhYmxlLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h0dHAyX2Vycm9ycy5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odWZmc3ltcy5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbmNvbWluZ19tZXRhZGF0YS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9pbnRlcm5hbC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9wYXJzaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0YXR1c19jb252ZXJzaW9uLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9saXN0cy5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9zdHJlYW1fbWFwLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdGltZW91dF9lbmNvZGluZy5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi92YXJpbnQuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvd3JpdGluZy5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGEuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC90cmFuc3BvcnRfaW1wbC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9vcF9zdHJpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHNpL2Zha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiLCAKLSAgICAgICJzcmMvY29yZS90c2kvc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS9zc2xfdHlwZXMuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuYyIsIAotICAgICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAotICAgICAgInNyYy9jb3JlL3RzaS90cmFuc3BvcnRfc2VjdXJpdHlfaW50ZXJmYWNlLmgiCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvY2xpZW50L2luc2VjdXJlL2NoYW5uZWxfY3JlYXRlLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi9jbGllbnQvc2VjdXJlL3NlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3NlcnZlci9zZWN1cmUvc2VydmVyX3NlY3VyZV9jaHR0cDIuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX2xpc3RzLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvYWdncmVnYXRpb24uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvb3BlcmF0aW9uLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2h0dHAvcGFyc2VyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvY2xvc3VyZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXJfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWNfY3R4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjdXRvci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvY3Bfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9pbnRlcm5hbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3Jlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl93aW4zMi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19jb21tb25fcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfbGludXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXJfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXJfaGVhcC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci91ZHBfc2VydmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfZXZlbnRmZC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ub3NwZWNpYWwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcGlwZS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbi5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9jb21tb24uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9zdHJpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3dyaXRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2F1dGhfZmlsdGVycy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2I2NC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NsaWVudF9hdXRoX2ZpbHRlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHMuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9jcmVkZW50aWFsc19tZXRhZGF0YS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2NyZWRlbnRpYWxzX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvY3JlZGVudGlhbHNfd2luMzIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9nb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2hhbmRzaGFrZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L2pzb25fdG9rZW4uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9qc29uX3Rva2VuLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvand0X3ZlcmlmaWVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJlX2VuZHBvaW50LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29ubmVjdG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc2VjdXJpdHkvc2VjdXJpdHlfY29udGV4dC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3NlY3VyaXR5L3NlY3VyaXR5X2NvbnRleHQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zZWN1cml0eS9zZXJ2ZXJfYXV0aF9maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FsYXJtLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYnl0ZV9idWZmZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyX3JlYWRlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9kZXRhaWxzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfY29ubmVjdGl2aXR5LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9waW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY29tcGxldGlvbl9xdWV1ZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXRfc2VjdXJlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS9mYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS9zc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHNpL3NzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90c2kvc3NsX3R5cGVzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHNpL3RyYW5zcG9ydF9zZWN1cml0eS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RzaS90cmFuc3BvcnRfc2VjdXJpdHkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90c2kvdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIgogICAgIF0sIAogICAgICJ0aGlyZF9wYXJ0eSI6IGZhbHNlLCAKICAgICAidHlwZSI6ICJsaWIiCkBAIC00NTUyLDEyOSArNDYxNiwxMjkgQEAKICAgICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsIAogICAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLCAKICAgICAgICJpbmNsdWRlL2dycGMvc3RhdHVzLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvYWdncmVnYXRpb24uaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL3JwY19tZXRyaWNfaWQuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jb25uZWN0ZWRfY2hhbm5lbC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jb250ZXh0LmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jbGllbnRfY29uZmlnLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3BpY2tfZmlyc3QuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9mYWN0b3J5LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfaW5kZXguaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLCAKLSAgICAgICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmgiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL3BhcnNlci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9leGVjdXRvci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzcy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl91dGlscy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9jbGllbnQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3NlcnZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvanNvbi9qc29uLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIsIAotICAgICAgInNyYy9jb3JlL3N0YXRpc3RpY3MvY2Vuc3VzX2ludGVyZmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2xhbWVfY2xpZW50LmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9zdXJmYWNlX3RyYWNlLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYWxwbi5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9iaW5fZW5jb2Rlci5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfc2V0dGluZ3MuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfd2luZG93X3VwZGF0ZS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja190YWJsZS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9odHRwMl9lcnJvcnMuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHVmZnN5bXMuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW5jb21pbmdfbWV0YWRhdGEuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaW50ZXJuYWwuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0LmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWUuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9kYXRhLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZ29hd2F5LmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19lbmNvZGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfcGFyc2VyLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfdGFibGUuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odHRwMl9lcnJvcnMuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW50ZXJuYWwuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdmFyaW50LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2FnZ3JlZ2F0aW9uLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfZmlsdGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL2dycGNfcGx1Z2luLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvcnBjX21ldHJpY19pZC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyX3JlZ2lzdHJ5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9odHRwL2h0dHBjbGkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZmRfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb2NwX3dpbmRvd3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfd2luMzIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrZXRfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb24uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fY29tbW9uLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3JlYWRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19pbnRlcmZhY2UuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2FwaV90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF90ZXN0X29ubHkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ldmVudF9zdHJpbmcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2luaXQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2xhbWVfY2xpZW50LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3N1cmZhY2VfdHJhY2UuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L21ldGFkYXRhX2JhdGNoLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIsIAogICAgICAgInRoaXJkX3BhcnR5L25hbm9wYi9wYi5oIiwgCiAgICAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2NvbW1vbi5oIiwgCiAgICAgICAidGhpcmRfcGFydHkvbmFub3BiL3BiX2RlY29kZS5oIiwgCkBAIC00Njk1LDI3MCArNDc1OSwyNzAgQEAKICAgICAgICJpbmNsdWRlL2dycGMvaW1wbC9jb2RlZ2VuL3Byb3BhZ2F0aW9uX2JpdHMuaCIsIAogICAgICAgImluY2x1ZGUvZ3JwYy9pbXBsL2NvZGVnZW4vc3RhdHVzLmgiLCAKICAgICAgICJpbmNsdWRlL2dycGMvc3RhdHVzLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvYWdncmVnYXRpb24uaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9jb250ZXh0LmMiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19jb250ZXh0LmMiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9ncnBjX2ZpbHRlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL2dycGNfcGx1Z2luLmMiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvZ3JwY19wbHVnaW4uaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9pbml0aWFsaXplLmMiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvbWxvZy5jIiwgCi0gICAgICAic3JjL2NvcmUvY2Vuc3VzL21sb2cuaCIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9vcGVyYXRpb24uYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9wbGFjZWhvbGRlcnMuYyIsIAotICAgICAgInNyYy9jb3JlL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgiLCAKLSAgICAgICJzcmMvY29yZS9jZW5zdXMvdHJhY2luZy5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX2FyZ3MuYyIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NoYW5uZWxfc3RhY2suYyIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFjay5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY2hhbm5lbF9zdGFja19idWlsZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmMiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvY29udGV4dC5oIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvaHR0cF9jbGllbnRfZmlsdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jaGFubmVsL2h0dHBfc2VydmVyX2ZpbHRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NoYW5uZWwvc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2hhbm5lbC9zdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY2xpZW50X2NvbmZpZy5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9jb25uZWN0b3IuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2RlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvbG9hZF9iYWxhbmNlcl9hcGkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9waWNrX2ZpcnN0LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvbGJfcG9saWN5X3JlZ2lzdHJ5LmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVyX2ZhY3RvcnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL2Ruc19yZXNvbHZlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvZG5zX3Jlc29sdmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvc29ja2FkZHJfcmVzb2x2ZXIuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbC5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuaCIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIiwgCi0gICAgICAic3JjL2NvcmUvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2luZGV4LmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3VyaV9wYXJzZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwgCi0gICAgICAic3JjL2NvcmUvY29tcHJlc3Npb24vYWxnb3JpdGhtX21ldGFkYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS9jb21wcmVzc2lvbi9jb21wcmVzc2lvbl9hbGdvcml0aG0uYyIsIAotICAgICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyIsIAotICAgICAgInNyYy9jb3JlL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuaCIsIAotICAgICAgInNyYy9jb3JlL2RlYnVnL3RyYWNlLmMiLCAKLSAgICAgICJzcmMvY29yZS9kZWJ1Zy90cmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5jIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9mb3JtYXRfcmVxdWVzdC5oIiwgCi0gICAgICAic3JjL2NvcmUvaHR0cC9odHRwY2xpLmMiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL2h0dHBjbGkuaCIsIAotICAgICAgInNyYy9jb3JlL2h0dHAvcGFyc2VyLmMiLCAKLSAgICAgICJzcmMvY29yZS9odHRwL3BhcnNlci5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvY2xvc3VyZS5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZW5kcG9pbnQuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2VuZHBvaW50LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9lbmRwb2ludF9wYWlyX3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2V4ZWNfY3R4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9leGVjX2N0eC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZXhlY3V0b3IuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2V4ZWN1dG9yLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9mZF9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvZmRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvY3Bfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb21nci5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3IuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9pb21ncl9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvaW9tZ3JfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXQuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3BvbGxzZXRfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9yZXNvbHZlX2FkZHJlc3MuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3Jlc29sdmVfYWRkcmVzc19wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl9wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2thZGRyX3V0aWxzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrYWRkcl93aW4zMi5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3V0aWxzX2xpbnV4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci9zb2NrZXRfdXRpbHNfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3NvY2tldF93aW5kb3dzLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3BfY2xpZW50X3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGNwX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3Bfc2VydmVyX3dpbmRvd3MuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RjcF93aW5kb3dzLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90Y3Bfd2luZG93cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGltZV9hdmVyYWdlZF9zdGF0cy5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdGltZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3RpbWVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci90aW1lcl9oZWFwLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci91ZHBfc2VydmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3VuaXhfc29ja2V0c19wb3NpeC5oIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3IvdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfbm9zcGVjaWFsLmMiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93YWtldXBfZmRfcGlwZS5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dha2V1cF9mZF9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd2FrZXVwX2ZkX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWUuaCIsIAotICAgICAgInNyYy9jb3JlL2lvbWdyL3dvcmtxdWV1ZV9wb3NpeC5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3Bvc2l4LmgiLCAKLSAgICAgICJzcmMvY29yZS9pb21nci93b3JrcXVldWVfd2luZG93cy5jIiwgCi0gICAgICAic3JjL2NvcmUvaW9tZ3Ivd29ya3F1ZXVlX3dpbmRvd3MuaCIsIAotICAgICAgInNyYy9jb3JlL2pzb24vanNvbi5jIiwgCi0gICAgICAic3JjL2NvcmUvanNvbi9qc29uLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fY29tbW9uLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fcmVhZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fc3RyaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmMiLCAKLSAgICAgICJzcmMvY29yZS9qc29uL2pzb25fd3JpdGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9wcm90by9ncnBjL2xiL3YwL2xvYWRfYmFsYW5jZXIucGIuYyIsIAotICAgICAgInNyYy9jb3JlL3Byb3RvL2dycGMvbGIvdjAvbG9hZF9iYWxhbmNlci5wYi5oIiwgCi0gICAgICAic3JjL2NvcmUvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdGF0aXN0aWNzL2NlbnN1c19ycGNfc3RhdHMuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvYWxhcm0uYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvYXBpX3RyYWNlLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2FwaV90cmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlci5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2FsbC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsX2xvZ19iYXRjaC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jYWxsX3Rlc3Rfb25seS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWwuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jb25uZWN0aXZpdHkuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9jcmVhdGUuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfaW5pdC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jaGFubmVsX3BpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NoYW5uZWxfc3RhY2tfdHlwZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9jb21wbGV0aW9uX3F1ZXVlLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2V2ZW50X3N0cmluZy5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9pbml0LmMiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL2luaXQuaCIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2UvaW5pdF91bnNlY3VyZS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9sYW1lX2NsaWVudC5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9tZXRhZGF0YV9hcnJheS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS9zZXJ2ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2Uvc2VydmVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9zdXJmYWNlL3NlcnZlcl9jaHR0cDIuYyIsIAotICAgICAgInNyYy9jb3JlL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS92YWxpZGF0ZV9tZXRhZGF0YS5jIiwgCi0gICAgICAic3JjL2NvcmUvc3VyZmFjZS92ZXJzaW9uLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9ieXRlX3N0cmVhbS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9hbHBuLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2FscG4uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvYmluX2VuY29kZXIuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWUuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfZGF0YS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9kYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX2dvYXdheS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9nb2F3YXkuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcGluZy5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9waW5nLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3JzdF9zdHJlYW0uYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvZnJhbWVfcnN0X3N0cmVhbS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV9zZXR0aW5ncy5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9mcmFtZV93aW5kb3dfdXBkYXRlLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ZyYW1lX3dpbmRvd191cGRhdGUuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfZW5jb2Rlci5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19lbmNvZGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2hwYWNrX3BhcnNlci5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi9ocGFja19wYXJzZXIuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHBhY2tfdGFibGUuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvaHR0cDJfZXJyb3JzLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2h1ZmZzeW1zLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2luY29taW5nX21ldGFkYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL2ludGVybmFsLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3BhcnNpbmcuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RhdHVzX2NvbnZlcnNpb24uaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX2xpc3RzLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3N0cmVhbV9tYXAuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvc3RyZWFtX21hcC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi90aW1lb3V0X2VuY29kaW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3RpbWVvdXRfZW5jb2RpbmcuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jaHR0cDIvdmFyaW50LmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyL3ZhcmludC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMi93cml0aW5nLmMiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L2NodHRwMl90cmFuc3BvcnQuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9jb25uZWN0aXZpdHlfc3RhdGUuaCIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L21ldGFkYXRhLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvbWV0YWRhdGFfYmF0Y2guYyIsIAotICAgICAgInNyYy9jb3JlL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3N0YXRpY19tZXRhZGF0YS5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydC5oIiwgCi0gICAgICAic3JjL2NvcmUvdHJhbnNwb3J0L3RyYW5zcG9ydF9pbXBsLmgiLCAKLSAgICAgICJzcmMvY29yZS90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIgorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL2NsaWVudC9pbnNlY3VyZS9jaGFubmVsX2NyZWF0ZS5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvc2VydmVyL2luc2VjdXJlL3NlcnZlcl9jaHR0cDIuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9hbHBuLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYWxwbi5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2Jpbl9lbmNvZGVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvYmluX2VuY29kZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9jaHR0cDJfdHJhbnNwb3J0LmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvY2h0dHAyX3RyYW5zcG9ydC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfZGF0YS5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX2RhdGEuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9nb2F3YXkuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9waW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfcGluZy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3JzdF9zdHJlYW0uYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9yc3Rfc3RyZWFtLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvZnJhbWVfc2V0dGluZ3MuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV9zZXR0aW5ncy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2ZyYW1lX3dpbmRvd191cGRhdGUuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9mcmFtZV93aW5kb3dfdXBkYXRlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHBhY2tfZW5jb2Rlci5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX2VuY29kZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja19wYXJzZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9ocGFja190YWJsZS5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2hwYWNrX3RhYmxlLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHR0cDJfZXJyb3JzLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaHVmZnN5bXMuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9odWZmc3ltcy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L2luY29taW5nX21ldGFkYXRhLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvaW5jb21pbmdfbWV0YWRhdGEuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9pbnRlcm5hbC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3BhcnNpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC9zdGF0dXNfY29udmVyc2lvbi5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0YXR1c19jb252ZXJzaW9uLmgiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX2xpc3RzLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvc3RyZWFtX21hcC5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3N0cmVhbV9tYXAuaCIsIAorICAgICAgInNyYy9jb3JlL2V4dC90cmFuc3BvcnQvY2h0dHAyL3RyYW5zcG9ydC90aW1lb3V0X2VuY29kaW5nLmMiLCAKKyAgICAgICJzcmMvY29yZS9leHQvdHJhbnNwb3J0L2NodHRwMi90cmFuc3BvcnQvdGltZW91dF9lbmNvZGluZy5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5jIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3ZhcmludC5oIiwgCisgICAgICAic3JjL2NvcmUvZXh0L3RyYW5zcG9ydC9jaHR0cDIvdHJhbnNwb3J0L3dyaXRpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvYWdncmVnYXRpb24uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvY29udGV4dC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ncnBjX2NvbnRleHQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvZ3JwY19wbHVnaW4uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvaW5pdGlhbGl6ZS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9tbG9nLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL21sb2cuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jZW5zdXMvb3BlcmF0aW9uLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3BsYWNlaG9sZGVycy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NlbnN1cy9ycGNfbWV0cmljX2lkLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2Vuc3VzL3RyYWNpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfYXJncy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2hhbm5lbF9hcmdzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jaGFubmVsX3N0YWNrX2J1aWxkZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NoYW5uZWxfc3RhY2tfYnVpbGRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY2xpZW50X2NoYW5uZWwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NsaWVudF9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb21wcmVzc19maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2NvbXByZXNzX2ZpbHRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvY29ubmVjdGVkX2NoYW5uZWwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2Nvbm5lY3RlZF9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9jb250ZXh0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX2NsaWVudF9maWx0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL2h0dHBfY2xpZW50X2ZpbHRlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NoYW5uZWwvaHR0cF9zZXJ2ZXJfZmlsdGVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2hhbm5lbC9odHRwX3NlcnZlcl9maWx0ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jaGFubmVsL3N1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2NsaWVudF9jb25maWcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2Nvbm5lY3Rvci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvY29ubmVjdG9yLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9kZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2luaXRpYWxfY29ubmVjdF9zdHJpbmcuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL2xvYWRfYmFsYW5jZXJfYXBpLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY2llcy9sb2FkX2JhbGFuY2VyX2FwaS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcGlja19maXJzdC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWNpZXMvcm91bmRfcm9iaW4uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljaWVzL3JvdW5kX3JvYmluLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3kuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvbGJfcG9saWN5X2ZhY3RvcnkuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9mYWN0b3J5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9sYl9wb2xpY3lfcmVnaXN0cnkuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL2xiX3BvbGljeV9yZWdpc3RyeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9mYWN0b3J5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcl9yZWdpc3RyeS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJfcmVnaXN0cnkuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9kbnNfcmVzb2x2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy9zb2NrYWRkcl9yZXNvbHZlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3NvY2thZGRyX3Jlc29sdmVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9zdWJjaGFubmVsX2ZhY3RvcnkuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3N1YmNoYW5uZWxfZmFjdG9yeS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvc3ViY2hhbm5lbF9pbmRleC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NsaWVudF9jb25maWcvdXJpX3BhcnNlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2FsZ29yaXRobV9tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uX2FsZ29yaXRobS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2NvbXByZXNzaW9uL21lc3NhZ2VfY29tcHJlc3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jb21wcmVzc2lvbi9tZXNzYWdlX2NvbXByZXNzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvZGVidWcvdHJhY2UuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9kZWJ1Zy90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2h0dHAvZm9ybWF0X3JlcXVlc3QuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9odHRwL2Zvcm1hdF9yZXF1ZXN0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9odHRwY2xpLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaHR0cC9wYXJzZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9odHRwL3BhcnNlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2Nsb3N1cmUuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9jbG9zdXJlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnQuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2VuZHBvaW50X3BhaXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9lbmRwb2ludF9wYWlyX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY19jdHguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9leGVjX2N0eC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2V4ZWN1dG9yLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvZXhlY3V0b3IuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9mZF9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2ZkX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9jcF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3IuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21nci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX2ludGVybmFsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvaW9tZ3JfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9pb21ncl9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL2lvbWdyX3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF9zZXRfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3BvbGxzZXRfc2V0X3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9wb2xsc2V0X3NldF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcG9sbHNldF93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvcmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3Bvc2l4LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2FkZHJfdXRpbHMuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci9zb2NrYWRkcl91dGlscy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2thZGRyX3dpbjMyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19saW51eC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF91dGlsc19wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3NvY2tldF93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivc29ja2V0X3dpbmRvd3MuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3BfY2xpZW50LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX2NsaWVudF9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9jbGllbnRfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9wb3NpeC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RjcF9zZXJ2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfc2VydmVyX3Bvc2l4LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3NlcnZlcl93aW5kb3dzLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGNwX3dpbmRvd3MuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90Y3Bfd2luZG93cy5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVfYXZlcmFnZWRfc3RhdHMuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdGltZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3RpbWVyX2hlYXAuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci90aW1lcl9oZWFwLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3IvdWRwX3NlcnZlci5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3VkcF9zZXJ2ZXIuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci91bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9ldmVudGZkLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX25vc3BlY2lhbC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dha2V1cF9mZF9waXBlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvaW9tZ3Ivd2FrZXVwX2ZkX3BpcGUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93YWtldXBfZmRfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfcG9zaXguaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9pb21nci93b3JrcXVldWVfd2luZG93cy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2lvbWdyL3dvcmtxdWV1ZV93aW5kb3dzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX2NvbW1vbi5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl9yZWFkZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fcmVhZGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvanNvbi9qc29uX3N0cmluZy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL2pzb24vanNvbl93cml0ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9qc29uL2pzb25fd3JpdGVyLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvcHJvdG8vZ3JwYy9sYi92MC9sb2FkX2JhbGFuY2VyLnBiLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfaW50ZXJmYWNlLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3RhdGlzdGljcy9jZW5zdXNfcnBjX3N0YXRzLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hbGFybS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvYXBpX3RyYWNlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9hcGlfdHJhY2UuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2J5dGVfYnVmZmVyLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9ieXRlX2J1ZmZlcl9yZWFkZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfZGV0YWlscy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2FsbF9sb2dfYmF0Y2guYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NhbGxfdGVzdF9vbmx5LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2Nvbm5lY3Rpdml0eS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9pbml0LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX2luaXQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NoYW5uZWxfcGluZy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvY2hhbm5lbF9zdGFja190eXBlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9jaGFubmVsX3N0YWNrX3R5cGUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2NvbXBsZXRpb25fcXVldWUuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL2V2ZW50X3N0cmluZy5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvZXZlbnRfc3RyaW5nLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0LmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9pbml0X3Vuc2VjdXJlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9sYW1lX2NsaWVudC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvbGFtZV9jbGllbnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL21ldGFkYXRhX2FycmF5LmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvc3VyZmFjZS9zZXJ2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3NlcnZlci5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2Uvc3VyZmFjZV90cmFjZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3N1cmZhY2UvdmFsaWRhdGVfbWV0YWRhdGEuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9zdXJmYWNlL3ZlcnNpb24uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvYnl0ZV9zdHJlYW0uaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvY29ubmVjdGl2aXR5X3N0YXRlLmMiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L2Nvbm5lY3Rpdml0eV9zdGF0ZS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YS5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9tZXRhZGF0YV9iYXRjaC5oIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC9zdGF0aWNfbWV0YWRhdGEuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvc3RhdGljX21ldGFkYXRhLmgiLCAKKyAgICAgICJzcmMvY29yZS9saWIvdHJhbnNwb3J0L3RyYW5zcG9ydC5jIiwgCisgICAgICAic3JjL2NvcmUvbGliL3RyYW5zcG9ydC90cmFuc3BvcnQuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X2ltcGwuaCIsIAorICAgICAgInNyYy9jb3JlL2xpYi90cmFuc3BvcnQvdHJhbnNwb3J0X29wX3N0cmluZy5jIgogICAgIF0sIAogICAgICJ0aGlyZF9wYXJ0eSI6IGZhbHNlLCAKICAgICAidHlwZSI6ICJsaWIiCkBAIC00OTcwLDE0ICs1MDM0LDE0IEBACiAgICAgXSwgCiAgICAgImhlYWRlcnMiOiBbCiAgICAgICAiaW5jbHVkZS9ncnBjL2dycGNfem9va2VlcGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaCIKKyAgICAgICJzcmMvY29yZS9saWIvY2xpZW50X2NvbmZpZy9yZXNvbHZlcnMvem9va2VlcGVyX3Jlc29sdmVyLmgiCiAgICAgXSwgCiAgICAgImxhbmd1YWdlIjogImMiLCAKICAgICAibmFtZSI6ICJncnBjX3pvb2tlZXBlciIsIAogICAgICJzcmMiOiBbCiAgICAgICAiaW5jbHVkZS9ncnBjL2dycGNfem9va2VlcGVyLmgiLCAKLSAgICAgICJzcmMvY29yZS9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYyIsIAotICAgICAgInNyYy9jb3JlL2NsaWVudF9jb25maWcvcmVzb2x2ZXJzL3pvb2tlZXBlcl9yZXNvbHZlci5oIgorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuYyIsIAorICAgICAgInNyYy9jb3JlL2xpYi9jbGllbnRfY29uZmlnL3Jlc29sdmVycy96b29rZWVwZXJfcmVzb2x2ZXIuaCIKICAgICBdLCAKICAgICAidGhpcmRfcGFydHkiOiBmYWxzZSwgCiAgICAgInR5cGUiOiAibGliIgpAQCAtNTEwNCw3ICs1MTY4LDYgQEAKICAgICAgICJzcmMvY3BwL2NsaWVudC9jcmVhdGVfY2hhbm5lbF9pbnRlcm5hbC5oIiwgCiAgICAgICAic3JjL2NwcC9jbGllbnQvc2VjdXJlX2NyZWRlbnRpYWxzLmgiLCAKICAgICAgICJzcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uaCIsIAotICAgICAgInNyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5oIiwgCiAgICAgICAic3JjL2NwcC9jb21tb24vY3JlYXRlX2F1dGhfY29udGV4dC5oIiwgCiAgICAgICAic3JjL2NwcC9jb21tb24vc2VjdXJlX2F1dGhfY29udGV4dC5oIiwgCiAgICAgICAic3JjL2NwcC9zZXJ2ZXIvZHluYW1pY190aHJlYWRfcG9vbC5oIiwgCkBAIC01MjA1LDcgKzUyNjgsNiBAQAogICAgICAgInNyYy9jcHAvY29tbW9uL2NvbXBsZXRpb25fcXVldWUuY2MiLCAKICAgICAgICJzcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uY2MiLCAKICAgICAgICJzcmMvY3BwL2NvbW1vbi9jb3JlX2NvZGVnZW4uaCIsIAotICAgICAgInNyYy9jcHAvY29tbW9uL2NvcmVfY29kZWdlbi5oIiwgCiAgICAgICAic3JjL2NwcC9jb21tb24vY3JlYXRlX2F1dGhfY29udGV4dC5oIiwgCiAgICAgICAic3JjL2NwcC9jb21tb24vcnBjX21ldGhvZC5jYyIsIAogICAgICAgInNyYy9jcHAvY29tbW9uL3NlY3VyZV9hdXRoX2NvbnRleHQuY2MiLCAKZGlmZiAtLWdpdCBhL3Rvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9SRUFETUUubWQgYi90b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvUkVBRE1FLm1kCmluZGV4IDFhNDhlOTAuLjg0Zjk3MTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9SRUFETUUubWQKKysrIGIvdG9vbHMvcnVuX3Rlc3RzL3N0cmVzc190ZXN0L1JFQURNRS5tZApAQCAtNjcsOCArNjcsMTAgQEAKICAgLSBgPGdycGNfcm9vdF9kaXI+JCB0b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvcnVuX3N0cmVzc190ZXN0c19vbl9na2UucHkgLS1oZWxwYA0KIA0KID4gKipFeGFtcGxlKioNCi0+IGAkIHRvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9ydW5fc3RyZXNzX3Rlc3RzX29uX2drZS5weSAtLXByb2plY3RfaWQ9c3JlZS1nY2UgLS10ZXN0X2R1cmF0aW9uX3NlY3M9MTgwIC0tbnVtX2NsaWVudHM9NWANCis+IGBgYGJhc2gNCis+ICQgIyBDaGFuZ2UgdG8gdGhlIGdycGMgcm9vdCBkaXJlY3RvcnkNCis+ICQgY2QgJEdSUENfUk9PVA0KKz4gJCB0b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvcnVuX29uX2drZS5weSAtLXByb2plY3RfaWQ9c3JlZS1nY2UgLS1jb25maWdfZmlsZT10b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvY29uZmlncy9vcHQuanNvbg0KKz4gYGBgDQogDQotPiBMYXVuY2hlcyB0aGUgNSBpbnN0YW5jZXMgb2Ygc3RyZXNzIHRlc3QgY2xpZW50cywgMSBpbnN0YW5jZSBvZiBzdHJlc3MgdGVzdCBzZXJ2ZXIgYW5kIHJ1bnMgdGhlIHRlc3QgZm9yIDE4MCBzZWNvbmRzLiBUaGUgdGVzdCB3b3VsZCBiZSBydW4gb24gdGhlIGRlZmF1bHQgY29udGFpbmVyIGNsdXN0ZXIgKHRoYXQgeW91IGhhdmUgc2V0IGluIGBnY2xvdWRgKSBpbiB0aGUgcHJvamVjdCBgc3JlZS1nY2VgLg0KLQ0KLT4gTm90ZTogd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIHRoZSBhYmlsaXR5IHRvIGxhdW5jaCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNlcnZlci4gVGhpcyBjYW4gYmUgYWRkZWQgdmVyeSBlYXNpbHkgaW4gZnV0dXJlDQorPiBUaGUgYWJvdmUgcnVucyB0aGUgc3RyZXNzIHRlc3Qgb24gR0tFIHVuZGVyIHRoZSBwcm9qZWN0IGBzcmVlLWdjZWAgaW4gdGhlIGRlZmF1bHQgY2x1c3RlciAodGhhdCB5b3Ugc2V0IGJ5IGBnY2xvdWRgIGNvbW1hbmQgZWFybGllcikuIFRoZSB0ZXN0IHNldHRpbmdzIChsaWtlIG51bWJlciBvZiBjbGllbnQgaW5zdGFuY2VzLCBzZXJ2ZXJzLCB0aGUgcGFybWV0ZXJzIHRvIHBhc3MsIHRlc3QgY2FzZXMgZXRjKSBhcmUgYWxsIGxvYWRlZCBmcm9tIHRoZSBjb25maWcgZmlsZSBgJEdSUENfUk9PVC90b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3Qvb3B0Lmpzb25gDQpkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuX3Rlc3RzL3N0cmVzc190ZXN0L2NvbmZpZ3Mvb3B0LXRzYW4tYXNhbi5qc29uIGIvdG9vbHMvcnVuX3Rlc3RzL3N0cmVzc190ZXN0L2NvbmZpZ3Mvb3B0LXRzYW4tYXNhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzJkM2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvY29uZmlncy9vcHQtdHNhbi1hc2FuLmpzb24KQEAgLTAsMCArMSwxMzUgQEAKK3sKKyAgImRvY2tlckltYWdlcyI6IHsKKyAgICAiZ3JwY19zdHJlc3NfY3h4X29wdCIgOiB7CisgICAgICAiYnVpbGRTY3JpcHQiOiAidG9vbHMvamVua2lucy9idWlsZF9pbnRlcm9wX3N0cmVzc19pbWFnZS5zaCIsCisgICAgICAiZG9ja2VyRmlsZURpciI6ICJncnBjX2ludGVyb3Bfc3RyZXNzX2N4eCIsCisgICAgICAiYnVpbGRUeXBlIjogIm9wdCIKKyAgICB9LAorICAgICJncnBjX3N0cmVzc19jeHhfdHNhbiI6IHsKKyAgICAgICJidWlsZFNjcmlwdCI6ICJ0b29scy9qZW5raW5zL2J1aWxkX2ludGVyb3Bfc3RyZXNzX2ltYWdlLnNoIiwKKyAgICAgICJkb2NrZXJGaWxlRGlyIjogImdycGNfaW50ZXJvcF9zdHJlc3NfY3h4IiwKKyAgICAgICJidWlsZFR5cGUiOiAidHNhbiIKKyAgICB9LAorICAgICJncnBjX3N0cmVzc19jeHhfYXNhbiI6IHsKKyAgICAgICJidWlsZFNjcmlwdCI6ICJ0b29scy9qZW5raW5zL2J1aWxkX2ludGVyb3Bfc3RyZXNzX2ltYWdlLnNoIiwKKyAgICAgICJkb2NrZXJGaWxlRGlyIjogImdycGNfaW50ZXJvcF9zdHJlc3NfY3h4IiwKKyAgICAgICJidWlsZFR5cGUiOiAiYXNhbiIKKyAgICB9CisgIH0sCisKKyAgImNsaWVudFRlbXBsYXRlcyI6IHsKKyAgICAiYmFzZVRlbXBsYXRlcyI6IHsKKyAgICAgICJkZWZhdWx0IjogeworICAgICAgICAid3JhcHBlclNjcmlwdFBhdGgiOiAiL3Zhci9sb2NhbC9naXQvZ3JwYy90b29scy9nY3Avc3RyZXNzX3Rlc3QvcnVuX2NsaWVudC5weSIsCisgICAgICAgICJwb2xsSW50ZXJ2YWxTZWNzIjogNjAsCisgICAgICAgICJjbGllbnRBcmdzIjogeworICAgICAgICAgICJudW1fY2hhbm5lbHNfcGVyX3NlcnZlciI6NSwKKyAgICAgICAgICAibnVtX3N0dWJzX3Blcl9jaGFubmVsIjoxMCwKKyAgICAgICAgICAidGVzdF9jYXNlcyI6ICJlbXB0eV91bmFyeToxLGxhcmdlX3VuYXJ5OjEsY2xpZW50X3N0cmVhbWluZzoxLHNlcnZlcl9zdHJlYW1pbmc6MSxlbXB0eV9zdHJlYW06MSIsCisgICAgICAgICAgIm1ldHJpY3NfcG9ydCI6IDgwODEsCisgICAgICAgICAgIm1ldHJpY3NfY29sbGVjdGlvbl9pbnRlcnZhbF9zZWNzIjo2MAorICAgICAgICB9LAorICAgICAgICAibWV0cmljc1BvcnQiOiA4MDgxLAorICAgICAgICAibWV0cmljc0FyZ3MiOiB7CisgICAgICAgICAgIm1ldHJpY3Nfc2VydmVyX2FkZHJlc3MiOiAibG9jYWxob3N0OjgwODEiLAorICAgICAgICAgICJ0b3RhbF9vbmx5IjogInRydWUiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0ZW1wbGF0ZXMiOiB7CisgICAgICAiY3h4X2NsaWVudF9vcHQiOiB7CisgICAgICAgICJiYXNlVGVtcGxhdGUiOiAiZGVmYXVsdCIsCisgICAgICAgICJjbGllbnRJbWFnZVBhdGgiOiAiL3Zhci9sb2NhbC9naXQvZ3JwYy9iaW5zL29wdC9zdHJlc3NfdGVzdCIsCisgICAgICAgICJtZXRyaWNzQ2xpZW50SW1hZ2VQYXRoIjogIi92YXIvbG9jYWwvZ2l0L2dycGMvYmlucy9vcHQvbWV0cmljc19jbGllbnQiCisgICAgICB9LAorICAgICAgImN4eF9jbGllbnRfdHNhbiI6IHsKKyAgICAgICAgImJhc2VUZW1wbGF0ZSI6ICJkZWZhdWx0IiwKKyAgICAgICAgImNsaWVudEltYWdlUGF0aCI6ICIvdmFyL2xvY2FsL2dpdC9ncnBjL2JpbnMvdHNhbi9zdHJlc3NfdGVzdCIsCisgICAgICAgICJtZXRyaWNzQ2xpZW50SW1hZ2VQYXRoIjogIi92YXIvbG9jYWwvZ2l0L2dycGMvYmlucy90c2FuL21ldHJpY3NfY2xpZW50IgorICAgICAgfSwKKyAgICAiY3h4X2NsaWVudF9hc2FuIjogeworICAgICAgICAiYmFzZVRlbXBsYXRlIjogImRlZmF1bHQiLAorICAgICAgICAiY2xpZW50SW1hZ2VQYXRoIjogIi92YXIvbG9jYWwvZ2l0L2dycGMvYmlucy9hc2FuL3N0cmVzc190ZXN0IiwKKyAgICAgICAgIm1ldHJpY3NDbGllbnRJbWFnZVBhdGgiOiAiL3Zhci9sb2NhbC9naXQvZ3JwYy9iaW5zL2FzYW4vbWV0cmljc19jbGllbnQiCisgICAgICB9CisgICAgfQorICB9LAorCisgICJzZXJ2ZXJUZW1wbGF0ZXMiOiB7CisgICAgImJhc2VUZW1wbGF0ZXMiOnsKKyAgICAgICJkZWZhdWx0IjogeworICAgICAgICAid3JhcHBlclNjcmlwdFBhdGgiOiAiL3Zhci9sb2NhbC9naXQvZ3JwYy90b29scy9nY3Avc3RyZXNzX3Rlc3QvcnVuX3NlcnZlci5weSIsCisgICAgICAgICJzZXJ2ZXJQb3J0IjogODA4MCwKKyAgICAgICAgInNlcnZlckFyZ3MiOiB7CisgICAgICAgICAgInBvcnQiOiA4MDgwCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0ZW1wbGF0ZXMiOiB7CisgICAgICAiY3h4X3NlcnZlcl9vcHQiOiB7CisgICAgICAgICJiYXNlVGVtcGxhdGUiOiAiZGVmYXVsdCIsCisgICAgICAgICJzZXJ2ZXJJbWFnZVBhdGgiOiAiL3Zhci9sb2NhbC9naXQvZ3JwYy9iaW5zL29wdC9pbnRlcm9wX3NlcnZlciIKKyAgICAgIH0sCisgICAgICAiY3h4X3NlcnZlcl90c2FuIjogeworICAgICAgICAiYmFzZVRlbXBsYXRlIjogImRlZmF1bHQiLAorICAgICAgICAic2VydmVySW1hZ2VQYXRoIjogIi92YXIvbG9jYWwvZ2l0L2dycGMvYmlucy90c2FuL2ludGVyb3Bfc2VydmVyIgorICAgICAgfSwKKyAgICAiY3h4X3NlcnZlcl9hc2FuIjogeworICAgICAgICAiYmFzZVRlbXBsYXRlIjogImRlZmF1bHQiLAorICAgICAgICAic2VydmVySW1hZ2VQYXRoIjogIi92YXIvbG9jYWwvZ2l0L2dycGMvYmlucy9hc2FuL2ludGVyb3Bfc2VydmVyIgorICAgICAgfQorICAgIH0KKyAgfSwKKworICAidGVzdE1hdHJpeCI6IHsKKyAgICAic2VydmVyUG9kU3BlY3MiOiB7CisgICAgICAic3RyZXNzLXNlcnZlci1vcHQiOiB7CisgICAgICAgICJzZXJ2ZXJUZW1wbGF0ZSI6ICJjeHhfc2VydmVyX29wdCIsCisgICAgICAgICJkb2NrZXJJbWFnZSI6ICJncnBjX3N0cmVzc19jeHhfb3B0IiwKKyAgICAgICAgIm51bUluc3RhbmNlcyI6IDEKKyAgICAgIH0sCisgICAgICAic3RyZXNzLXNlcnZlci10c2FuIjogeworICAgICAgICAic2VydmVyVGVtcGxhdGUiOiAiY3h4X3NlcnZlcl90c2FuIiwKKyAgICAgICAgImRvY2tlckltYWdlIjogImdycGNfc3RyZXNzX2N4eF90c2FuIiwKKyAgICAgICAgIm51bUluc3RhbmNlcyI6IDEKKyAgICAgIH0sCisgICAgICAic3RyZXNzLXNlcnZlci1hc2FuIjogeworICAgICAgICAic2VydmVyVGVtcGxhdGUiOiAiY3h4X3NlcnZlcl9hc2FuIiwKKyAgICAgICAgImRvY2tlckltYWdlIjogImdycGNfc3RyZXNzX2N4eF9hc2FuIiwKKyAgICAgICAgIm51bUluc3RhbmNlcyI6IDEKKyAgICAgIH0KKyAgIH0sCisKKyAgICAiY2xpZW50UG9kU3BlY3MiOiB7CisgICAgICAic3RyZXNzLWNsaWVudC1vcHQiOiB7CisgICAgICAgICJjbGllbnRUZW1wbGF0ZSI6ICJjeHhfY2xpZW50X29wdCIsCisgICAgICAgICJkb2NrZXJJbWFnZSI6ICJncnBjX3N0cmVzc19jeHhfb3B0IiwKKyAgICAgICAgIm51bUluc3RhbmNlcyI6IDMsCisgICAgICAgICJzZXJ2ZXJQb2RTcGVjIjogInN0cmVzcy1zZXJ2ZXItb3B0IgorICAgICAgfSwKKyAgICAgICJzdHJlc3MtY2xpZW50LXRzYW4iOiB7CisgICAgICAgICJjbGllbnRUZW1wbGF0ZSI6ICJjeHhfY2xpZW50X3RzYW4iLAorICAgICAgICAiZG9ja2VySW1hZ2UiOiAiZ3JwY19zdHJlc3NfY3h4X3RzYW4iLAorICAgICAgICAibnVtSW5zdGFuY2VzIjogMywKKyAgICAgICAgInNlcnZlclBvZFNwZWMiOiAic3RyZXNzLXNlcnZlci10c2FuIgorICAgICAgfSwKKyAgICAgICJzdHJlc3MtY2xpZW50LWFzYW4iOiB7CisgICAgICAgICJjbGllbnRUZW1wbGF0ZSI6ICJjeHhfY2xpZW50X2FzYW4iLAorICAgICAgICAiZG9ja2VySW1hZ2UiOiAiZ3JwY19zdHJlc3NfY3h4X2FzYW4iLAorICAgICAgICAibnVtSW5zdGFuY2VzIjogMywKKyAgICAgICAgInNlcnZlclBvZFNwZWMiOiAic3RyZXNzLXNlcnZlci1hc2FuIgorICAgICAgfQorICAgIH0KKyAgfSwKKworICAiZ2xvYmFsU2V0dGluZ3MiOiB7CisgICAgImJ1aWxkRG9ja2VySW1hZ2VzIjogdHJ1ZSwKKyAgICAicG9sbEludGVydmFsU2VjcyI6IDYwLAorICAgICJ0ZXN0RHVyYXRpb25TZWNzIjogNzIwMCwKKyAgICAia3ViZXJuZXRlc1Byb3h5UG9ydCI6IDgwMDEsCisgICAgImRhdGFzZXRJZE5hbWVQcmVmaXgiOiAic3RyZXNzX3Rlc3Rfb3B0X3RzYW4iLAorICAgICJzdW1tYXJ5VGFibGVJZCI6ICJzdW1tYXJ5IiwKKyAgICAicXBzVGFibGVJZCI6ICJxcHMiLAorICAgICJwb2RXYXJtdXBTZWNzIjogNjAKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuX3Rlc3RzL3N0cmVzc190ZXN0L2NvbmZpZ3Mvb3B0Lmpzb24gYi90b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvY29uZmlncy9vcHQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmMwMjQwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcnVuX3Rlc3RzL3N0cmVzc190ZXN0L2NvbmZpZ3Mvb3B0Lmpzb24KQEAgLTAsMCArMSw4NiBAQAoreworICAiZG9ja2VySW1hZ2VzIjogeworICAgICJncnBjX3N0cmVzc19jeHhfb3B0IiA6IHsKKyAgICAgICJidWlsZFNjcmlwdCI6ICJ0b29scy9qZW5raW5zL2J1aWxkX2ludGVyb3Bfc3RyZXNzX2ltYWdlLnNoIiwKKyAgICAgICJkb2NrZXJGaWxlRGlyIjogImdycGNfaW50ZXJvcF9zdHJlc3NfY3h4IiwKKyAgICAgICJidWlsZFR5cGUiOiAib3B0IgorICAgIH0KKyAgfSwKKworICAiY2xpZW50VGVtcGxhdGVzIjogeworICAgICJiYXNlVGVtcGxhdGVzIjogeworICAgICAgImRlZmF1bHQiOiB7CisgICAgICAgICJ3cmFwcGVyU2NyaXB0UGF0aCI6ICIvdmFyL2xvY2FsL2dpdC9ncnBjL3Rvb2xzL2djcC9zdHJlc3NfdGVzdC9ydW5fY2xpZW50LnB5IiwKKyAgICAgICAgInBvbGxJbnRlcnZhbFNlY3MiOiA2MCwKKyAgICAgICAgImNsaWVudEFyZ3MiOiB7CisgICAgICAgICAgIm51bV9jaGFubmVsc19wZXJfc2VydmVyIjo1LAorICAgICAgICAgICJudW1fc3R1YnNfcGVyX2NoYW5uZWwiOjEwLAorICAgICAgICAgICJ0ZXN0X2Nhc2VzIjogImVtcHR5X3VuYXJ5OjEsbGFyZ2VfdW5hcnk6MSxjbGllbnRfc3RyZWFtaW5nOjEsc2VydmVyX3N0cmVhbWluZzoxLGVtcHR5X3N0cmVhbToxIiwKKyAgICAgICAgICAibWV0cmljc19wb3J0IjogODA4MSwKKyAgICAgICAgICAibWV0cmljc19jb2xsZWN0aW9uX2ludGVydmFsX3NlY3MiOjYwCisgICAgICAgIH0sCisgICAgICAgICJtZXRyaWNzUG9ydCI6IDgwODEsCisgICAgICAgICJtZXRyaWNzQXJncyI6IHsKKyAgICAgICAgICAibWV0cmljc19zZXJ2ZXJfYWRkcmVzcyI6ICJsb2NhbGhvc3Q6ODA4MSIsCisgICAgICAgICAgInRvdGFsX29ubHkiOiAidHJ1ZSIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRlbXBsYXRlcyI6IHsKKyAgICAgICJjeHhfY2xpZW50X29wdCI6IHsKKyAgICAgICAgImJhc2VUZW1wbGF0ZSI6ICJkZWZhdWx0IiwKKyAgICAgICAgImNsaWVudEltYWdlUGF0aCI6ICIvdmFyL2xvY2FsL2dpdC9ncnBjL2JpbnMvb3B0L3N0cmVzc190ZXN0IiwKKyAgICAgICAgIm1ldHJpY3NDbGllbnRJbWFnZVBhdGgiOiAiL3Zhci9sb2NhbC9naXQvZ3JwYy9iaW5zL29wdC9tZXRyaWNzX2NsaWVudCIKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgInNlcnZlclRlbXBsYXRlcyI6IHsKKyAgICAiYmFzZVRlbXBsYXRlcyI6eworICAgICAgImRlZmF1bHQiOiB7CisgICAgICAgICJ3cmFwcGVyU2NyaXB0UGF0aCI6ICIvdmFyL2xvY2FsL2dpdC9ncnBjL3Rvb2xzL2djcC9zdHJlc3NfdGVzdC9ydW5fc2VydmVyLnB5IiwKKyAgICAgICAgInNlcnZlclBvcnQiOiA4MDgwLAorICAgICAgICAic2VydmVyQXJncyI6IHsKKyAgICAgICAgICAicG9ydCI6IDgwODAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRlbXBsYXRlcyI6IHsKKyAgICAgICJjeHhfc2VydmVyX29wdCI6IHsKKyAgICAgICAgImJhc2VUZW1wbGF0ZSI6ICJkZWZhdWx0IiwKKyAgICAgICAgInNlcnZlckltYWdlUGF0aCI6ICIvdmFyL2xvY2FsL2dpdC9ncnBjL2JpbnMvb3B0L2ludGVyb3Bfc2VydmVyIgorICAgICAgfQorICAgIH0KKyAgfSwKKworICAidGVzdE1hdHJpeCI6IHsKKyAgICAic2VydmVyUG9kU3BlY3MiOiB7CisgICAgICAic3RyZXNzLXNlcnZlci1vcHQiOiB7CisgICAgICAgICJzZXJ2ZXJUZW1wbGF0ZSI6ICJjeHhfc2VydmVyX29wdCIsCisgICAgICAgICJkb2NrZXJJbWFnZSI6ICJncnBjX3N0cmVzc19jeHhfb3B0IiwKKyAgICAgICAgIm51bUluc3RhbmNlcyI6IDEKKyAgICAgIH0KKyAgICB9LAorCisgICAgImNsaWVudFBvZFNwZWNzIjogeworICAgICAgInN0cmVzcy1jbGllbnQtb3B0IjogeworICAgICAgICAiY2xpZW50VGVtcGxhdGUiOiAiY3h4X2NsaWVudF9vcHQiLAorICAgICAgICAiZG9ja2VySW1hZ2UiOiAiZ3JwY19zdHJlc3NfY3h4X29wdCIsCisgICAgICAgICJudW1JbnN0YW5jZXMiOiAxMCwKKyAgICAgICAgInNlcnZlclBvZFNwZWMiOiAic3RyZXNzLXNlcnZlci1vcHQiCisgICAgICB9CisgICAgfQorICB9LAorCisgICJnbG9iYWxTZXR0aW5ncyI6IHsKKyAgICAiYnVpbGREb2NrZXJJbWFnZXMiOiB0cnVlLAorICAgICJwb2xsSW50ZXJ2YWxTZWNzIjogMTAsCisgICAgInRlc3REdXJhdGlvblNlY3MiOiAxMjAsCisgICAgImt1YmVybmV0ZXNQcm94eVBvcnQiOiA4MDAxLAorICAgICJkYXRhc2V0SWROYW1lUHJlZml4IjogInN0cmVzc190ZXN0X29wdCIsCisgICAgInN1bW1hcnlUYWJsZUlkIjogInN1bW1hcnkiLAorICAgICJxcHNUYWJsZUlkIjogInFwcyIsCisgICAgInBvZFdhcm11cFNlY3MiOiA2MAorICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9ydW5fb25fZ2tlLnB5IGIvdG9vbHMvcnVuX3Rlc3RzL3N0cmVzc190ZXN0L3J1bl9vbl9na2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2E4MWMxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9ydW5fb25fZ2tlLnB5CkBAIC0wLDAgKzEsNjM2IEBACisjIS91c3IvYmluL2VudiBweXRob24yLjcKKyMgQ29weXJpZ2h0IDIwMTUtMjAxNiwgR29vZ2xlIEluYy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK3N0cmVzc190ZXN0X3V0aWxzX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oCisgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uLy4uL2djcC9zdHJlc3NfdGVzdCcpKQorc3lzLnBhdGguYXBwZW5kKHN0cmVzc190ZXN0X3V0aWxzX2RpcikKK2Zyb20gc3RyZXNzX3Rlc3RfdXRpbHMgaW1wb3J0IEJpZ1F1ZXJ5SGVscGVyCisKK2t1YmVybmV0ZXNfYXBpX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oCisgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uLy4uL2djcC91dGlscycpKQorc3lzLnBhdGguYXBwZW5kKGt1YmVybmV0ZXNfYXBpX2RpcikKKworaW1wb3J0IGt1YmVybmV0ZXNfYXBpCisKKworY2xhc3MgR2xvYmFsU2V0dGluZ3M6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGdjcF9wcm9qZWN0X2lkLCBidWlsZF9kb2NrZXJfaW1hZ2VzLAorICAgICAgICAgICAgICAgdGVzdF9wb2xsX2ludGVydmFsX3NlY3MsIHRlc3RfZHVyYXRpb25fc2VjcywKKyAgICAgICAgICAgICAgIGt1YmVybmV0ZXNfcHJveHlfcG9ydCwgZGF0YXNldF9pZF9wcmVmaXgsIHN1bW1hcnlfdGFibGVfaWQsCisgICAgICAgICAgICAgICBxcHNfdGFibGVfaWQsIHBvZF93YXJtdXBfc2Vjcyk6CisgICAgc2VsZi5nY3BfcHJvamVjdF9pZCA9IGdjcF9wcm9qZWN0X2lkCisgICAgc2VsZi5idWlsZF9kb2NrZXJfaW1hZ2VzID0gYnVpbGRfZG9ja2VyX2ltYWdlcworICAgIHNlbGYudGVzdF9wb2xsX2ludGVydmFsX3NlY3MgPSB0ZXN0X3BvbGxfaW50ZXJ2YWxfc2VjcworICAgIHNlbGYudGVzdF9kdXJhdGlvbl9zZWNzID0gdGVzdF9kdXJhdGlvbl9zZWNzCisgICAgc2VsZi5rdWJlcm5ldGVzX3Byb3h5X3BvcnQgPSBrdWJlcm5ldGVzX3Byb3h5X3BvcnQKKyAgICBzZWxmLmRhdGFzZXRfaWRfcHJlZml4ID0gZGF0YXNldF9pZF9wcmVmaXgKKyAgICBzZWxmLnN1bW1hcnlfdGFibGVfaWQgPSBzdW1tYXJ5X3RhYmxlX2lkCisgICAgc2VsZi5xcHNfdGFibGVfaWQgPSBxcHNfdGFibGVfaWQKKyAgICBzZWxmLnBvZF93YXJtdXBfc2VjcyA9IHBvZF93YXJtdXBfc2VjcworCisKK2NsYXNzIENsaWVudFRlbXBsYXRlOgorICAiIiIgQ29udGFpbnMgYWxsIHRoZSBjb21tb24gc2V0dGluZ3MgdGhhdCBhcmUgdXNlZCBieSBhIHN0cmVzcyBjbGllbnQgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGNsaWVudF9pbWFnZV9wYXRoLCBtZXRyaWNzX2NsaWVudF9pbWFnZV9wYXRoLAorICAgICAgICAgICAgICAgbWV0cmljc19wb3J0LCB3cmFwcGVyX3NjcmlwdF9wYXRoLCBwb2xsX2ludGVydmFsX3NlY3MsCisgICAgICAgICAgICAgICBjbGllbnRfYXJnc19kaWN0LCBtZXRyaWNzX2FyZ3NfZGljdCk6CisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuY2xpZW50X2ltYWdlX3BhdGggPSBjbGllbnRfaW1hZ2VfcGF0aAorICAgIHNlbGYubWV0cmljc19jbGllbnRfaW1hZ2VfcGF0aCA9IG1ldHJpY3NfY2xpZW50X2ltYWdlX3BhdGgKKyAgICBzZWxmLm1ldHJpY3NfcG9ydCA9IG1ldHJpY3NfcG9ydAorICAgIHNlbGYud3JhcHBlcl9zY3JpcHRfcGF0aCA9IHdyYXBwZXJfc2NyaXB0X3BhdGgKKyAgICBzZWxmLnBvbGxfaW50ZXJ2YWxfc2VjcyA9IHBvbGxfaW50ZXJ2YWxfc2VjcworICAgIHNlbGYuY2xpZW50X2FyZ3NfZGljdCA9IGNsaWVudF9hcmdzX2RpY3QKKyAgICBzZWxmLm1ldHJpY3NfYXJnc19kaWN0ID0gbWV0cmljc19hcmdzX2RpY3QKKworCitjbGFzcyBTZXJ2ZXJUZW1wbGF0ZToKKyAgIiIiIENvbnRhaW5zIGFsbCB0aGUgY29tbW9uIHNldHRpbmdzIHVzZWQgYnkgYSBzdHJlc3Mgc2VydmVyICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBzZXJ2ZXJfaW1hZ2VfcGF0aCwgd3JhcHBlcl9zY3JpcHRfcGF0aCwgc2VydmVyX3BvcnQsCisgICAgICAgICAgICAgICBzZXJ2ZXJfYXJnc19kaWN0KToKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5zZXJ2ZXJfaW1hZ2VfcGF0aCA9IHNlcnZlcl9pbWFnZV9wYXRoCisgICAgc2VsZi53cmFwcGVyX3NjcmlwdF9wYXRoID0gd3JhcHBlcl9zY3JpcHRfcGF0aAorICAgIHNlbGYuc2VydmVyX3BvcnQgPSBzZXJ2ZXJfcG9ydAorICAgIHNlbGYuc2VydmVyX2FyZ3NfZGljdCA9IHNlcnZlcl9hcmdzX2RpY3QKKworCitjbGFzcyBEb2NrZXJJbWFnZToKKyAgIiIiIFJlcHJlc2VudHMgcHJvcGVydGllcyBvZiBhIERvY2tlciBpbWFnZS4gUHJvdmlkZXMgbWV0aG9kcyB0byBidWlsZCB0aGUKKyAgaW1hZ2UgYW5kIHB1c2ggaXQgdG8gR0tFIHJlZ2lzdHJ5CisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBnY3BfcHJvamVjdF9pZCwgaW1hZ2VfbmFtZSwgYnVpbGRfc2NyaXB0X3BhdGgsCisgICAgICAgICAgICAgICBkb2NrZXJmaWxlX2RpciwgYnVpbGRfdHlwZSk6CisgICAgIiIiQXJnczoKKworICAgICAgaW1hZ2VfbmFtZTogVGhlIGRvY2tlciBpbWFnZSBuYW1lCisgICAgICB0YWdfbmFtZTogVGhlIGFkZGl0aW9uYWwgdGFnIG5hbWUuIFRoaXMgaXMgdGhlIG5hbWUgdXNlZCB3aGVuIHB1c2hpbmcgdGhlCisgICAgICAgIGRvY2tlciBpbWFnZSB0byBHS0UgcmVnaXN0cnkKKyAgICAgIGJ1aWxkX3NjcmlwdF9wYXRoOiBUaGUgcGF0aCB0byB0aGUgYnVpbGQgc2NyaXB0IHRoYXQgYnVpbGRzIHRoaXMgZG9ja2VyCisgICAgICBpbWFnZQorICAgICAgZG9ja2VyZmlsZV9kaXI6IFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdW5kZXIKKyAgICAgICc8Z3JwY19yb290Pi90b29scy9kb2NrZXJmaWxlJyB0aGF0IGNvbnRhaW5zIHRoZSBkb2NrZXJmaWxlCisgICAgIiIiCisgICAgc2VsZi5pbWFnZV9uYW1lID0gaW1hZ2VfbmFtZQorICAgIHNlbGYuZ2NwX3Byb2plY3RfaWQgPSBnY3BfcHJvamVjdF9pZAorICAgIHNlbGYuYnVpbGRfc2NyaXB0X3BhdGggPSBidWlsZF9zY3JpcHRfcGF0aAorICAgIHNlbGYuZG9ja2VyZmlsZV9kaXIgPSBkb2NrZXJmaWxlX2RpcgorICAgIHNlbGYuYnVpbGRfdHlwZSA9IGJ1aWxkX3R5cGUKKyAgICBzZWxmLnRhZ19uYW1lID0gc2VsZi5fbWFrZV90YWdfbmFtZShnY3BfcHJvamVjdF9pZCwgaW1hZ2VfbmFtZSkKKworICBkZWYgX21ha2VfdGFnX25hbWUoc2VsZiwgcHJvamVjdF9pZCwgaW1hZ2VfbmFtZSk6CisgICAgcmV0dXJuICdnY3IuaW8vJXMvJXMnICUgKHByb2plY3RfaWQsIGltYWdlX25hbWUpCisKKyAgZGVmIGJ1aWxkX2ltYWdlKHNlbGYpOgorICAgIHByaW50ICdCdWlsZGluZyBkb2NrZXIgaW1hZ2U6ICVzICh0YWc6ICVzKScgJSAoc2VsZi5pbWFnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YWdfbmFtZSkKKyAgICBvcy5lbnZpcm9uWydJTlRFUk9QX0lNQUdFJ10gPSBzZWxmLmltYWdlX25hbWUKKyAgICBvcy5lbnZpcm9uWydJTlRFUk9QX0lNQUdFX1JFUE9TSVRPUllfVEFHJ10gPSBzZWxmLnRhZ19uYW1lCisgICAgb3MuZW52aXJvblsnQkFTRV9OQU1FJ10gPSBzZWxmLmRvY2tlcmZpbGVfZGlyCisgICAgb3MuZW52aXJvblsnQlVJTERfVFlQRSddID0gc2VsZi5idWlsZF90eXBlCisgICAgcHJpbnQgJ0RFQlVHOiBwYXRoOiAnLCBzZWxmLmJ1aWxkX3NjcmlwdF9wYXRoCisgICAgaWYgc3VicHJvY2Vzcy5jYWxsKGFyZ3M9W3NlbGYuYnVpbGRfc2NyaXB0X3BhdGhdKSAhPSAwOgorICAgICAgcHJpbnQgJ0Vycm9yIGluIGJ1aWxkaW5nIHRoZSBEb2NrZXIgaW1hZ2UnCisgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBwdXNoX3RvX2drZV9yZWdpc3RyeShzZWxmKToKKyAgICBjbWQgPSBbJ2djbG91ZCcsICdkb2NrZXInLCAncHVzaCcsIHNlbGYudGFnX25hbWVdCisgICAgcHJpbnQgJ1B1c2hpbmcgJXMgdG8gdGhlIEdLRSByZWdpc3RyeS4uJyAlIHNlbGYudGFnX25hbWUKKyAgICBpZiBzdWJwcm9jZXNzLmNhbGwoYXJncz1jbWQpICE9IDA6CisgICAgICBwcmludCAnRXJyb3IgaW4gcHVzaGluZyB0aGUgaW1hZ2UgJXMgdG8gdGhlIEdLRSByZWdpc3RyeScgJSBzZWxmLnRhZ19uYW1lCisgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFNlcnZlclBvZFNwZWM6CisgICIiIiBDb250YWlucyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gbGF1bmNoIHNlcnZlciBwb2RzLiAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc2VydmVyX3RlbXBsYXRlLCBkb2NrZXJfaW1hZ2UsIG51bV9pbnN0YW5jZXMpOgorICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBzZWxmLnRlbXBsYXRlID0gc2VydmVyX3RlbXBsYXRlCisgICAgc2VsZi5kb2NrZXJfaW1hZ2UgPSBkb2NrZXJfaW1hZ2UKKyAgICBzZWxmLm51bV9pbnN0YW5jZXMgPSBudW1faW5zdGFuY2VzCisKKyAgZGVmIHBvZF9uYW1lcyhzZWxmKToKKyAgICAiIiIgUmV0dXJuIGEgbGlzdCBvZiBuYW1lcyBvZiBzZXJ2ZXIgcG9kcyB0byBjcmVhdGUuICIiIgorICAgIHJldHVybiBbJyVzLSVkJyAlIChzZWxmLm5hbWUsIGkpIGZvciBpIGluIHJhbmdlKDEsIHNlbGYubnVtX2luc3RhbmNlcyArIDEpXQorCisgIGRlZiBzZXJ2ZXJfYWRkcmVzc2VzKHNlbGYpOgorICAgICIiIiBSZXR1cm4gc3RyaW5nIG9mIHNlcnZlciBhZGRyZXNzZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgICAnPHNlcnZlcl9wb2RfbmFtZV8xPjo8c2VydmVyX3BvcnQ+LDxzZXJ2ZXJfcG9kX25hbWVfMj46PHNlcnZlcl9wb3J0Pi4uLicKKyAgICAiIiIKKyAgICByZXR1cm4gJywnLmpvaW4oWyclczolZCcgJSAocG9kX25hbWUsIHNlbGYudGVtcGxhdGUuc2VydmVyX3BvcnQpCisgICAgICAgICAgICAgICAgICAgICBmb3IgcG9kX25hbWUgaW4gc2VsZi5wb2RfbmFtZXMoKV0pCisKKworY2xhc3MgQ2xpZW50UG9kU3BlYzoKKyAgIiIiIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBsYXVuY2ggY2xpZW50IHBvZHMgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGNsaWVudF90ZW1wbGF0ZSwgZG9ja2VyX2ltYWdlLCBudW1faW5zdGFuY2VzLAorICAgICAgICAgICAgICAgc2VydmVyX2FkZHJlc3Nlcyk6CisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYudGVtcGxhdGUgPSBjbGllbnRfdGVtcGxhdGUKKyAgICBzZWxmLmRvY2tlcl9pbWFnZSA9IGRvY2tlcl9pbWFnZQorICAgIHNlbGYubnVtX2luc3RhbmNlcyA9IG51bV9pbnN0YW5jZXMKKyAgICBzZWxmLnNlcnZlcl9hZGRyZXNzZXMgPSBzZXJ2ZXJfYWRkcmVzc2VzCisKKyAgZGVmIHBvZF9uYW1lcyhzZWxmKToKKyAgICAiIiIgUmV0dXJuIGEgbGlzdCBvZiBuYW1lcyBvZiBjbGllbnQgcG9kcyB0byBjcmVhdGUgIiIiCisgICAgcmV0dXJuIFsnJXMtJWQnICUgKHNlbGYubmFtZSwgaSkgZm9yIGkgaW4gcmFuZ2UoMSwgc2VsZi5udW1faW5zdGFuY2VzICsgMSldCisKKyAgIyBUaGUgY2xpZW50IGFyZ3MgaW4gdGhlIHRlbXBsYXRlIGRvIG5vdCBoYXZlIHNlcnZlciBhZGRyZXNzZXMuIFRoaXMgZnVuY3Rpb24KKyAgIyBhZGRzIHRoZSBzZXJ2ZXIgYWRkcmVzc2VzIGFuZCByZXR1cm5zIHRoZSB1cGRhdGVkIGNsaWVudCBhcmdzCisgIGRlZiBnZXRfY2xpZW50X2FyZ3NfZGljdChzZWxmKToKKyAgICBhcmdzX2RpY3QgPSBzZWxmLnRlbXBsYXRlLmNsaWVudF9hcmdzX2RpY3QuY29weSgpCisgICAgYXJnc19kaWN0WydzZXJ2ZXJfYWRkcmVzc2VzJ10gPSBzZWxmLnNlcnZlcl9hZGRyZXNzZXMKKyAgICByZXR1cm4gYXJnc19kaWN0CisKKworY2xhc3MgR2tlOgorICAiIiIgQ2xhc3MgdGhhdCBoYXMgaGVscGVyIG1ldGhvZHMgdG8gaW50ZXJhY3Qgd2l0aCBHS0UgIiIiCisKKyAgY2xhc3MgS3ViZXJuZXRlc1Byb3h5OgorICAgICIiIkNsYXNzIHRvIHN0YXJ0IGEgcHJveHkgb24gbG9jYWxob3N0IHRvIHRhbGsgdG8gdGhlIEt1YmVybmV0ZXMgQVBJIHNlcnZlciIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQpOgorICAgICAgY21kID0gWydrdWJlY3RsJywgJ3Byb3h5JywgJy0tcG9ydD0lZCcgJSBwb3J0XQorICAgICAgc2VsZi5wID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzPWNtZCkKKyAgICAgIHRpbWUuc2xlZXAoMikKKyAgICAgIHByaW50ICdcblN0YXJ0ZWQga3ViZXJuZXRlcyBwcm94eSBvbiBwb3J0OiAlZCcgJSBwb3J0CisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgIGlmIHNlbGYucCBpcyBub3QgTm9uZToKKyAgICAgICAgcHJpbnQgJ1NodXR0aW5nIGRvd24gS3ViZXJuZXRlcyBwcm94eS4uJworICAgICAgICBzZWxmLnAua2lsbCgpCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2plY3RfaWQsIHJ1bl9pZCwgZGF0YXNldF9pZCwgc3VtbWFyeV90YWJsZV9pZCwKKyAgICAgICAgICAgICAgIHFwc190YWJsZV9pZCwga3ViZXJuZXRlc19wb3J0KToKKyAgICBzZWxmLnByb2plY3RfaWQgPSBwcm9qZWN0X2lkCisgICAgc2VsZi5ydW5faWQgPSBydW5faWQKKyAgICBzZWxmLmRhdGFzZXRfaWQgPSBkYXRhc2V0X2lkCisgICAgc2VsZi5zdW1tYXJ5X3RhYmxlX2lkID0gc3VtbWFyeV90YWJsZV9pZAorICAgIHNlbGYucXBzX3RhYmxlX2lkID0gcXBzX3RhYmxlX2lkCisKKyAgICAjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2Ugd291bGQgbGlrZSB0byBwYXNzIHRvIGV2ZXJ5IHBvZCAoYm90aCBjbGllbnQKKyAgICAjIGFuZCBzZXJ2ZXIpIGxhdW5jaGVkIGluIEdLRQorICAgIHNlbGYuZ2tlX2VudiA9IHsKKyAgICAgICAgJ1JVTl9JRCc6IHNlbGYucnVuX2lkLAorICAgICAgICAnR0NQX1BST0pFQ1RfSUQnOiBzZWxmLnByb2plY3RfaWQsCisgICAgICAgICdEQVRBU0VUX0lEJzogc2VsZi5kYXRhc2V0X2lkLAorICAgICAgICAnU1VNTUFSWV9UQUJMRV9JRCc6IHNlbGYuc3VtbWFyeV90YWJsZV9pZCwKKyAgICAgICAgJ1FQU19UQUJMRV9JRCc6IHNlbGYucXBzX3RhYmxlX2lkCisgICAgfQorCisgICAgc2VsZi5rdWJlcm5ldGVzX3BvcnQgPSBrdWJlcm5ldGVzX3BvcnQKKyAgICAjIFN0YXJ0IGt1YmVybmV0ZXMgcHJveHkKKyAgICBzZWxmLmt1YmVybmV0ZXNfcHJveHkgPSBHa2UuS3ViZXJuZXRlc1Byb3h5KGt1YmVybmV0ZXNfcG9ydCkKKworICBkZWYgX2FyZ3NfZGljdF90b19zdHIoc2VsZiwgYXJnc19kaWN0KToKKyAgICByZXR1cm4gJyAnLmpvaW4oJy0tJXM9JXMnICUgKGssIGFyZ3NfZGljdFtrXSkgZm9yIGsgaW4gYXJnc19kaWN0LmtleXMoKSkKKworICBkZWYgbGF1bmNoX3NlcnZlcnMoc2VsZiwgc2VydmVyX3BvZF9zcGVjKToKKyAgICBpc19zdWNjZXNzID0gVHJ1ZQorCisgICAgIyBUaGUgY29tbWFuZCB0byBydW4gaW5zaWRlIHRoZSBjb250YWluZXIgaXMgdGhlIHdyYXBwZXIgc2NyaXB0ICh3aGljaCB0aGVuCisgICAgIyBsYXVuY2hlcyB0aGUgYWN0dWFsIHNlcnZlcikKKyAgICBjb250YWluZXJfY21kID0gc2VydmVyX3BvZF9zcGVjLnRlbXBsYXRlLndyYXBwZXJfc2NyaXB0X3BhdGgKKworICAgICMgVGhlIHBhcmFtZXRlcnMgdG8gdGhlIHdyYXBwZXIgc2NyaXB0IChkZWZpbmVkIGluCisgICAgIyBzZXJ2ZXJfcG9kX3NwZWMudGVtcGxhdGUud3JhcHBlcl9zY3JpcHRfcGF0aCkgYXJlIGFyZSBpbmplY3RlZCBpbnRvIHRoZQorICAgICMgY29udGFpbmVyIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICBzZXJ2ZXJfZW52ID0gc2VsZi5na2VfZW52LmNvcHkoKQorICAgIHNlcnZlcl9lbnYudXBkYXRlKHsKKyAgICAgICAgJ1NUUkVTU19URVNUX0lNQUdFX1RZUEUnOiAnU0VSVkVSJywKKyAgICAgICAgJ1NUUkVTU19URVNUX0lNQUdFJzogc2VydmVyX3BvZF9zcGVjLnRlbXBsYXRlLnNlcnZlcl9pbWFnZV9wYXRoLAorICAgICAgICAnU1RSRVNTX1RFU1RfQVJHU19TVFInOiBzZWxmLl9hcmdzX2RpY3RfdG9fc3RyKAorICAgICAgICAgICAgc2VydmVyX3BvZF9zcGVjLnRlbXBsYXRlLnNlcnZlcl9hcmdzX2RpY3QpCisgICAgfSkKKworICAgIGZvciBwb2RfbmFtZSBpbiBzZXJ2ZXJfcG9kX3NwZWMucG9kX25hbWVzKCk6CisgICAgICBzZXJ2ZXJfZW52WydQT0RfTkFNRSddID0gcG9kX25hbWUKKyAgICAgIHByaW50ICdDcmVhdGluZyBzZXJ2ZXI6ICVzJyAlIHBvZF9uYW1lCisgICAgICBpc19zdWNjZXNzID0ga3ViZXJuZXRlc19hcGkuY3JlYXRlX3BvZF9hbmRfc2VydmljZSgKKyAgICAgICAgICAnbG9jYWxob3N0JywKKyAgICAgICAgICBzZWxmLmt1YmVybmV0ZXNfcG9ydCwKKyAgICAgICAgICAnZGVmYXVsdCcsICAjIFVzZSAnZGVmYXVsdCcgbmFtZXNwYWNlCisgICAgICAgICAgcG9kX25hbWUsCisgICAgICAgICAgc2VydmVyX3BvZF9zcGVjLmRvY2tlcl9pbWFnZS50YWdfbmFtZSwKKyAgICAgICAgICBbc2VydmVyX3BvZF9zcGVjLnRlbXBsYXRlLnNlcnZlcl9wb3J0XSwgICMgUG9ydHMgdG8gZXhwb3NlIG9uIHRoZSBwb2QKKyAgICAgICAgICBbY29udGFpbmVyX2NtZF0sCisgICAgICAgICAgW10sICAjIEFyZ3MgbGlzdCBpcyBlbXB0eSBzaW5jZSB3ZSBhcmUgcGFzc2luZyBhbGwgYXJncyB2aWEgZW52IHZhcmlhYmxlcworICAgICAgICAgIHNlcnZlcl9lbnYsCisgICAgICAgICAgVHJ1ZSAgIyBIZWFkbGVzcyA9IFRydWUgZm9yIHNlcnZlciB0byB0aGF0IEdLRSBjcmVhdGVzIGEgRE5TIHJlY29yZCBmb3IgcG9kX25hbWUKKyAgICAgICkKKyAgICAgIGlmIG5vdCBpc19zdWNjZXNzOgorICAgICAgICBwcmludCAnRXJyb3IgaW4gbGF1bmNoaW5nIHNlcnZlcjogJXMnICUgcG9kX25hbWUKKyAgICAgICAgYnJlYWsKKworICAgIGlmIGlzX3N1Y2Nlc3M6CisgICAgICBwcmludCAnU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2VydmVyKHMpJworCisgICAgcmV0dXJuIGlzX3N1Y2Nlc3MKKworICBkZWYgbGF1bmNoX2NsaWVudHMoc2VsZiwgY2xpZW50X3BvZF9zcGVjKToKKyAgICBpc19zdWNjZXNzID0gVHJ1ZQorCisgICAgIyBUaGUgY29tbWFuZCB0byBydW4gaW5zaWRlIHRoZSBjb250YWluZXIgaXMgdGhlIHdyYXBwZXIgc2NyaXB0ICh3aGljaCB0aGVuCisgICAgIyBsYXVuY2hlcyB0aGUgYWN0dWFsIHN0cmVzcyBjbGllbnQpCisgICAgY29udGFpbmVyX2NtZCA9IGNsaWVudF9wb2Rfc3BlYy50ZW1wbGF0ZS53cmFwcGVyX3NjcmlwdF9wYXRoCisKKyAgICAjIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZSB3cmFwcGVyIHNjcmlwdCAoZGVmaW5lZCBpbgorICAgICMgY2xpZW50X3BvZF9zcGVjLnRlbXBsYXRlLndyYXBwZXJfc2NyaXB0X3BhdGgpIGFyZSBhcmUgaW5qZWN0ZWQgaW50byB0aGUKKyAgICAjIGNvbnRhaW5lciB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgY2xpZW50X2VudiA9IHNlbGYuZ2tlX2Vudi5jb3B5KCkKKyAgICBjbGllbnRfZW52LnVwZGF0ZSh7CisgICAgICAgICdTVFJFU1NfVEVTVF9JTUFHRV9UWVBFJzogJ0NMSUVOVCcsCisgICAgICAgICdTVFJFU1NfVEVTVF9JTUFHRSc6IGNsaWVudF9wb2Rfc3BlYy50ZW1wbGF0ZS5jbGllbnRfaW1hZ2VfcGF0aCwKKyAgICAgICAgJ1NUUkVTU19URVNUX0FSR1NfU1RSJzogc2VsZi5fYXJnc19kaWN0X3RvX3N0cigKKyAgICAgICAgICAgIGNsaWVudF9wb2Rfc3BlYy5nZXRfY2xpZW50X2FyZ3NfZGljdCgpKSwKKyAgICAgICAgJ01FVFJJQ1NfQ0xJRU5UX0lNQUdFJzoKKyAgICAgICAgICAgIGNsaWVudF9wb2Rfc3BlYy50ZW1wbGF0ZS5tZXRyaWNzX2NsaWVudF9pbWFnZV9wYXRoLAorICAgICAgICAnTUVUUklDU19DTElFTlRfQVJHU19TVFInOiBzZWxmLl9hcmdzX2RpY3RfdG9fc3RyKAorICAgICAgICAgICAgY2xpZW50X3BvZF9zcGVjLnRlbXBsYXRlLm1ldHJpY3NfYXJnc19kaWN0KSwKKyAgICAgICAgJ1BPTExfSU5URVJWQUxfU0VDUyc6IHN0cihjbGllbnRfcG9kX3NwZWMudGVtcGxhdGUucG9sbF9pbnRlcnZhbF9zZWNzKQorICAgIH0pCisKKyAgICBmb3IgcG9kX25hbWUgaW4gY2xpZW50X3BvZF9zcGVjLnBvZF9uYW1lcygpOgorICAgICAgY2xpZW50X2VudlsnUE9EX05BTUUnXSA9IHBvZF9uYW1lCisgICAgICBwcmludCAnQ3JlYXRpbmcgY2xpZW50OiAlcycgJSBwb2RfbmFtZQorICAgICAgaXNfc3VjY2VzcyA9IGt1YmVybmV0ZXNfYXBpLmNyZWF0ZV9wb2RfYW5kX3NlcnZpY2UoCisgICAgICAgICAgJ2xvY2FsaG9zdCcsCisgICAgICAgICAgc2VsZi5rdWJlcm5ldGVzX3BvcnQsCisgICAgICAgICAgJ2RlZmF1bHQnLCAgIyBkZWZhdWx0IG5hbWVzcGFjZSwKKyAgICAgICAgICBwb2RfbmFtZSwKKyAgICAgICAgICBjbGllbnRfcG9kX3NwZWMuZG9ja2VyX2ltYWdlLnRhZ19uYW1lLAorICAgICAgICAgIFtjbGllbnRfcG9kX3NwZWMudGVtcGxhdGUubWV0cmljc19wb3J0XSwgICMgUG9ydHMgdG8gZXhwb3NlIG9uIHRoZSBwb2QKKyAgICAgICAgICBbY29udGFpbmVyX2NtZF0sCisgICAgICAgICAgW10sICAjIEVtcHR5IGFyZ3MgbGlzdCBzaW5jZSBhbGwgYXJncyBhcmUgcGFzc2VkIHZpYSBlbnYgdmFyaWFibGVzCisgICAgICAgICAgY2xpZW50X2VudiwKKyAgICAgICAgICBGYWxzZSAgIyBDbGllbnQgaXMgbm90IGEgaGVhZGxlc3Mgc2VydmljZS4KKyAgICAgICkKKworICAgICAgaWYgbm90IGlzX3N1Y2Nlc3M6CisgICAgICAgIHByaW50ICdFcnJvciBpbiBsYXVuY2hpbmcgY2xpZW50ICVzJyAlIHBvZF9uYW1lCisgICAgICAgIGJyZWFrCisKKyAgICBpZiBpc19zdWNjZXNzOgorICAgICAgcHJpbnQgJ1N1Y2Nlc3NmdWxseSBjcmVhdGVkIGFsbCBjbGllbnQocyknCisKKyAgICByZXR1cm4gaXNfc3VjY2VzcworCisgIGRlZiBfZGVsZXRlX3BvZHMoc2VsZiwgcG9kX25hbWVfbGlzdCk6CisgICAgaXNfc3VjY2VzcyA9IFRydWUKKyAgICBmb3IgcG9kX25hbWUgaW4gcG9kX25hbWVfbGlzdDoKKyAgICAgIHByaW50ICdEZWxldGluZyAlcycgJSBwb2RfbmFtZQorICAgICAgaXNfc3VjY2VzcyA9IGt1YmVybmV0ZXNfYXBpLmRlbGV0ZV9wb2RfYW5kX3NlcnZpY2UoCisgICAgICAgICAgJ2xvY2FsaG9zdCcsCisgICAgICAgICAgc2VsZi5rdWJlcm5ldGVzX3BvcnQsCisgICAgICAgICAgJ2RlZmF1bHQnLCAgIyBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAgICAgIHBvZF9uYW1lKQorCisgICAgICBpZiBub3QgaXNfc3VjY2VzczoKKyAgICAgICAgcHJpbnQgJ0Vycm9yIGluIGRlbGV0aW5nIHBvZCAlcycgJSBwb2RfbmFtZQorICAgICAgICBicmVhaworCisgICAgaWYgaXNfc3VjY2VzczoKKyAgICAgIHByaW50ICdTdWNjZXNzZnVsbHkgZGVsZXRlZCBhbGwgcG9kcycKKworICAgIHJldHVybiBpc19zdWNjZXNzCisKKyAgZGVmIGRlbGV0ZV9zZXJ2ZXJzKHNlbGYsIHNlcnZlcl9wb2Rfc3BlYyk6CisgICAgcmV0dXJuIHNlbGYuX2RlbGV0ZV9wb2RzKHNlcnZlcl9wb2Rfc3BlYy5wb2RfbmFtZXMoKSkKKworICBkZWYgZGVsZXRlX2NsaWVudHMoc2VsZiwgY2xpZW50X3BvZF9zcGVjKToKKyAgICByZXR1cm4gc2VsZi5fZGVsZXRlX3BvZHMoY2xpZW50X3BvZF9zcGVjLnBvZF9uYW1lcygpKQorCisKK2NsYXNzIENvbmZpZzoKKworICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnX2ZpbGVuYW1lLCBnY3BfcHJvamVjdF9pZCk6CisgICAgcHJpbnQgJ0xvYWRpbmcgY29uZmlndXJhdGlvbi4uLicKKyAgICBjb25maWdfZGljdCA9IHNlbGYuX2xvYWRfY29uZmlnKGNvbmZpZ19maWxlbmFtZSkKKworICAgIHNlbGYuZ2xvYmFsX3NldHRpbmdzID0gc2VsZi5fcGFyc2VfZ2xvYmFsX3NldHRpbmdzKGNvbmZpZ19kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjcF9wcm9qZWN0X2lkKQorICAgIHNlbGYuZG9ja2VyX2ltYWdlc19kaWN0ID0gc2VsZi5fcGFyc2VfZG9ja2VyX2ltYWdlcygKKyAgICAgICAgY29uZmlnX2RpY3QsIHNlbGYuZ2xvYmFsX3NldHRpbmdzLmdjcF9wcm9qZWN0X2lkKQorICAgIHNlbGYuY2xpZW50X3RlbXBsYXRlc19kaWN0ID0gc2VsZi5fcGFyc2VfY2xpZW50X3RlbXBsYXRlcyhjb25maWdfZGljdCkKKyAgICBzZWxmLnNlcnZlcl90ZW1wbGF0ZXNfZGljdCA9IHNlbGYuX3BhcnNlX3NlcnZlcl90ZW1wbGF0ZXMoY29uZmlnX2RpY3QpCisgICAgc2VsZi5zZXJ2ZXJfcG9kX3NwZWNzX2RpY3QgPSBzZWxmLl9wYXJzZV9zZXJ2ZXJfcG9kX3NwZWNzKAorICAgICAgICBjb25maWdfZGljdCwgc2VsZi5kb2NrZXJfaW1hZ2VzX2RpY3QsIHNlbGYuc2VydmVyX3RlbXBsYXRlc19kaWN0KQorICAgIHNlbGYuY2xpZW50X3BvZF9zcGVjc19kaWN0ID0gc2VsZi5fcGFyc2VfY2xpZW50X3BvZF9zcGVjcygKKyAgICAgICAgY29uZmlnX2RpY3QsIHNlbGYuZG9ja2VyX2ltYWdlc19kaWN0LCBzZWxmLmNsaWVudF90ZW1wbGF0ZXNfZGljdCwKKyAgICAgICAgc2VsZi5zZXJ2ZXJfcG9kX3NwZWNzX2RpY3QpCisgICAgcHJpbnQgJ0xvYWRlZCBDb25maWd1YXJhdGlvbi4nCisKKyAgZGVmIF9wYXJzZV9nbG9iYWxfc2V0dGluZ3Moc2VsZiwgY29uZmlnX2RpY3QsIGdjcF9wcm9qZWN0X2lkKToKKyAgICBnbG9iYWxfc2V0dGluZ3NfZGljdCA9IGNvbmZpZ19kaWN0WydnbG9iYWxTZXR0aW5ncyddCisgICAgcmV0dXJuIEdsb2JhbFNldHRpbmdzKGdjcF9wcm9qZWN0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfc2V0dGluZ3NfZGljdFsnYnVpbGREb2NrZXJJbWFnZXMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3NldHRpbmdzX2RpY3RbJ3BvbGxJbnRlcnZhbFNlY3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3NldHRpbmdzX2RpY3RbJ3Rlc3REdXJhdGlvblNlY3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3NldHRpbmdzX2RpY3RbJ2t1YmVybmV0ZXNQcm94eVBvcnQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3NldHRpbmdzX2RpY3RbJ2RhdGFzZXRJZE5hbWVQcmVmaXgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3NldHRpbmdzX2RpY3RbJ3N1bW1hcnlUYWJsZUlkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9zZXR0aW5nc19kaWN0WydxcHNUYWJsZUlkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9zZXR0aW5nc19kaWN0Wydwb2RXYXJtdXBTZWNzJ10pCisKKyAgZGVmIF9wYXJzZV9kb2NrZXJfaW1hZ2VzKHNlbGYsIGNvbmZpZ19kaWN0LCBnY3BfcHJvamVjdF9pZCk6CisgICAgIiIiUGFyc2VzIHRoZSAnZG9ja2VySW1hZ2VzJyBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBhbmQgcmV0dXJucyBhCisgICAgRGljdGlvbmFyeSBvZiAnRG9ja2VySW1hZ2UnIG9iamVjdHMga2V5ZWQgYnkgZG9ja2VyIGltYWdlIG5hbWVzIiIiCisgICAgZG9ja2VyX2ltYWdlc19kaWN0ID0ge30KKworICAgIGRvY2tlcl9jb25maWdfZGljdCA9IGNvbmZpZ19kaWN0Wydkb2NrZXJJbWFnZXMnXQorICAgIGZvciBpbWFnZV9uYW1lIGluIGRvY2tlcl9jb25maWdfZGljdC5rZXlzKCk6CisgICAgICBidWlsZF9zY3JpcHRfcGF0aCA9IGRvY2tlcl9jb25maWdfZGljdFtpbWFnZV9uYW1lXVsnYnVpbGRTY3JpcHQnXQorICAgICAgZG9ja2VyZmlsZV9kaXIgPSBkb2NrZXJfY29uZmlnX2RpY3RbaW1hZ2VfbmFtZV1bJ2RvY2tlckZpbGVEaXInXQorICAgICAgYnVpbGRfdHlwZSA9IGRvY2tlcl9jb25maWdfZGljdFtpbWFnZV9uYW1lXVsnYnVpbGRUeXBlJ10KKyAgICAgIGRvY2tlcl9pbWFnZXNfZGljdFtpbWFnZV9uYW1lXSA9IERvY2tlckltYWdlKGdjcF9wcm9qZWN0X2lkLCBpbWFnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfc2NyaXB0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NrZXJmaWxlX2RpciwgYnVpbGRfdHlwZSkKKyAgICByZXR1cm4gZG9ja2VyX2ltYWdlc19kaWN0CisKKyAgZGVmIF9wYXJzZV9jbGllbnRfdGVtcGxhdGVzKHNlbGYsIGNvbmZpZ19kaWN0KToKKyAgICAiIiJQYXJzZXMgdGhlICdjbGllbnRUZW1wbGF0ZXMnIHNlY3Rpb24gb2YgdGhlIGNvbmZpZyBmaWxlIGFuZCByZXR1cm5zIGEKKyAgICBEaWN0aW9uYXJ5IG9mICdDbGllbnRUZW1wbGF0ZScgb2JqZWN0cyBrZXllZCBieSBjbGllbnQgdGVtcGxhdGUgbmFtZXMuCisKKyAgICBOb3RlOiBUaGUgJ2Jhc2VUZW1wbGF0ZXMnIHN1YiBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBjb250YWlucyB0ZW1wbGF0ZXMKKyAgICB3aXRoIGRlZmF1bHQgdmFsdWVzICBhbmQgdGhlICd0ZW1wbGF0ZXMnIHN1YiBzZWN0aW9uIGNvbnRhaW5zIHRoZSBhY3R1YWwKKyAgICBjbGllbnQgdGVtcGxhdGVzICh3aGljaCByZWZlciB0byB0aGUgYmFzZSB0ZW1wbGF0ZSBuYW1lIHRvIHVzZSBmb3IgZGVmYXVsdAorICAgIHZhbHVlcykuCisgICAgIiIiCisgICAgY2xpZW50X3RlbXBsYXRlc19kaWN0ID0ge30KKworICAgIHRlbXBsYXRlc19kaWN0ID0gY29uZmlnX2RpY3RbJ2NsaWVudFRlbXBsYXRlcyddWyd0ZW1wbGF0ZXMnXQorICAgIGJhc2VfdGVtcGxhdGVzX2RpY3QgPSBjb25maWdfZGljdFsnY2xpZW50VGVtcGxhdGVzJ10uZ2V0KCdiYXNlVGVtcGxhdGVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSkKKyAgICBmb3IgdGVtcGxhdGVfbmFtZSBpbiB0ZW1wbGF0ZXNfZGljdC5rZXlzKCk6CisgICAgICAjIHRlbXBfZGljdCBpcyBhIHRlbXBvcmFyeSBkaWN0aW9uYXJ5IHRoYXQgbWVyZ2VzIGJhc2UgdGVtcGxhdGUgZGljdGlvbmFyeQorICAgICAgIyBhbmQgY2xpZW50IHRlbXBsYXRlIGRpY3Rpb25hcnkgKHdpdGggY2xpZW50IHRlbXBsYXRlIGRpY3Rpb25hcnkgdmFsdWVzCisgICAgICAjIG92ZXJyaWRpbmcgYmFzZSB0ZW1wbGF0ZSB2YWx1ZXMpCisgICAgICB0ZW1wX2RpY3QgPSB7fQorCisgICAgICBiYXNlX3RlbXBsYXRlX25hbWUgPSB0ZW1wbGF0ZXNfZGljdFt0ZW1wbGF0ZV9uYW1lXS5nZXQoJ2Jhc2VUZW1wbGF0ZScpCisgICAgICBpZiBub3QgYmFzZV90ZW1wbGF0ZV9uYW1lIGlzIE5vbmU6CisgICAgICAgIHRlbXBfZGljdCA9IGJhc2VfdGVtcGxhdGVzX2RpY3RbYmFzZV90ZW1wbGF0ZV9uYW1lXS5jb3B5KCkKKworICAgICAgdGVtcF9kaWN0LnVwZGF0ZSh0ZW1wbGF0ZXNfZGljdFt0ZW1wbGF0ZV9uYW1lXSkKKworICAgICAgIyBDcmVhdGUgYW5kIGFkZCBDbGllbnRUZW1wbGF0ZSBvYmplY3QgdG8gdGhlIGZpbmFsIGNsaWVudF90ZW1wbGF0ZXNfZGljdAorICAgICAgY2xpZW50X3RlbXBsYXRlc19kaWN0W3RlbXBsYXRlX25hbWVdID0gQ2xpZW50VGVtcGxhdGUoCisgICAgICAgICAgdGVtcGxhdGVfbmFtZSwgdGVtcF9kaWN0WydjbGllbnRJbWFnZVBhdGgnXSwKKyAgICAgICAgICB0ZW1wX2RpY3RbJ21ldHJpY3NDbGllbnRJbWFnZVBhdGgnXSwgdGVtcF9kaWN0WydtZXRyaWNzUG9ydCddLAorICAgICAgICAgIHRlbXBfZGljdFsnd3JhcHBlclNjcmlwdFBhdGgnXSwgdGVtcF9kaWN0Wydwb2xsSW50ZXJ2YWxTZWNzJ10sCisgICAgICAgICAgdGVtcF9kaWN0WydjbGllbnRBcmdzJ10uY29weSgpLCB0ZW1wX2RpY3RbJ21ldHJpY3NBcmdzJ10uY29weSgpKQorCisgICAgcmV0dXJuIGNsaWVudF90ZW1wbGF0ZXNfZGljdAorCisgIGRlZiBfcGFyc2Vfc2VydmVyX3RlbXBsYXRlcyhzZWxmLCBjb25maWdfZGljdCk6CisgICAgIiIiUGFyc2VzIHRoZSAnc2VydmVyVGVtcGxhdGVzJyBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBhbmQgcmV0dXJucyBhCisgICAgRGljdGlvbmFyeSBvZiAnc2VydmVyVGVtcGxhdGUnIG9iamVjdHMga2V5ZWQgYnkgc2VydmVyIHRlbXBsYXRlIG5hbWVzLgorCisgICAgTm90ZTogVGhlICdiYXNlVGVtcGxhdGVzJyBzdWIgc2VjdGlvbiBvZiB0aGUgY29uZmlnIGZpbGUgY29udGFpbnMgdGVtcGxhdGVzCisgICAgd2l0aCBkZWZhdWx0IHZhbHVlcyAgYW5kIHRoZSAndGVtcGxhdGVzJyBzdWIgc2VjdGlvbiBjb250YWlucyB0aGUgYWN0dWFsCisgICAgc2VydmVyIHRlbXBsYXRlcyAod2hpY2ggcmVmZXIgdG8gdGhlIGJhc2UgdGVtcGxhdGUgbmFtZSB0byB1c2UgZm9yIGRlZmF1bHQKKyAgICB2YWx1ZXMpLgorICAgICIiIgorICAgIHNlcnZlcl90ZW1wbGF0ZXNfZGljdCA9IHt9CisKKyAgICB0ZW1wbGF0ZXNfZGljdCA9IGNvbmZpZ19kaWN0WydzZXJ2ZXJUZW1wbGF0ZXMnXVsndGVtcGxhdGVzJ10KKyAgICBiYXNlX3RlbXBsYXRlc19kaWN0ID0gY29uZmlnX2RpY3RbJ3NlcnZlclRlbXBsYXRlcyddLmdldCgnYmFzZVRlbXBsYXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCisKKyAgICBmb3IgdGVtcGxhdGVfbmFtZSBpbiB0ZW1wbGF0ZXNfZGljdC5rZXlzKCk6CisgICAgICAjIHRlbXBfZGljdCBpcyBhIHRlbXBvcmFyeSBkaWN0aW9uYXJ5IHRoYXQgbWVyZ2VzIGJhc2UgdGVtcGxhdGUgZGljdGlvbmFyeQorICAgICAgIyBhbmQgc2VydmVyIHRlbXBsYXRlIGRpY3Rpb25hcnkgKHdpdGggc2VydmVyIHRlbXBsYXRlIGRpY3Rpb25hcnkgdmFsdWVzCisgICAgICAjIG92ZXJyaWRpbmcgYmFzZSB0ZW1wbGF0ZSB2YWx1ZXMpCisgICAgICB0ZW1wX2RpY3QgPSB7fQorCisgICAgICBiYXNlX3RlbXBsYXRlX25hbWUgPSB0ZW1wbGF0ZXNfZGljdFt0ZW1wbGF0ZV9uYW1lXS5nZXQoJ2Jhc2VUZW1wbGF0ZScpCisgICAgICBpZiBub3QgYmFzZV90ZW1wbGF0ZV9uYW1lIGlzIE5vbmU6CisgICAgICAgIHRlbXBfZGljdCA9IGJhc2VfdGVtcGxhdGVzX2RpY3RbYmFzZV90ZW1wbGF0ZV9uYW1lXS5jb3B5KCkKKworICAgICAgdGVtcF9kaWN0LnVwZGF0ZSh0ZW1wbGF0ZXNfZGljdFt0ZW1wbGF0ZV9uYW1lXSkKKworICAgICAgIyBDcmVhdGUgYW5kIGFkZCBTZXJ2ZXJUZW1wbGF0ZSBvYmplY3QgdG8gdGhlIGZpbmFsIHNlcnZlcl90ZW1wbGF0ZXNfZGljdAorICAgICAgc2VydmVyX3RlbXBsYXRlc19kaWN0W3RlbXBsYXRlX25hbWVdID0gU2VydmVyVGVtcGxhdGUoCisgICAgICAgICAgdGVtcGxhdGVfbmFtZSwgdGVtcF9kaWN0WydzZXJ2ZXJJbWFnZVBhdGgnXSwKKyAgICAgICAgICB0ZW1wX2RpY3RbJ3dyYXBwZXJTY3JpcHRQYXRoJ10sIHRlbXBfZGljdFsnc2VydmVyUG9ydCddLAorICAgICAgICAgIHRlbXBfZGljdFsnc2VydmVyQXJncyddLmNvcHkoKSkKKworICAgIHJldHVybiBzZXJ2ZXJfdGVtcGxhdGVzX2RpY3QKKworICBkZWYgX3BhcnNlX3NlcnZlcl9wb2Rfc3BlY3Moc2VsZiwgY29uZmlnX2RpY3QsIGRvY2tlcl9pbWFnZXNfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZXNfZGljdCk6CisgICAgIiIiUGFyc2VzIHRoZSAnc2VydmVyUG9kU3BlY3MnIHN1Yi1zZWN0aW9uICh1bmRlciAndGVzdE1hdHJpeCcgc2VjdGlvbikgb2YKKyAgICB0aGUgY29uZmlnIGZpbGUgYW5kIHJldHVybnMgYSBEaWN0aW9uYXJ5IG9mICdTZXJ2ZXJQb2RTcGVjJyBvYmplY3RzIGtleWVkCisgICAgYnkgc2VydmVyIHBvZCBzcGVjIG5hbWVzIiIiCisgICAgc2VydmVyX3BvZF9zcGVjc19kaWN0ID0ge30KKworICAgIHBvZF9zcGVjc19kaWN0ID0gY29uZmlnX2RpY3RbJ3Rlc3RNYXRyaXgnXS5nZXQoJ3NlcnZlclBvZFNwZWNzJywge30pCisKKyAgICBmb3IgcG9kX25hbWUgaW4gcG9kX3NwZWNzX2RpY3Qua2V5cygpOgorICAgICAgc2VydmVyX3RlbXBsYXRlX25hbWUgPSBwb2Rfc3BlY3NfZGljdFtwb2RfbmFtZV1bJ3NlcnZlclRlbXBsYXRlJ10KKyAgICAgIGRvY2tlcl9pbWFnZV9uYW1lID0gcG9kX3NwZWNzX2RpY3RbcG9kX25hbWVdWydkb2NrZXJJbWFnZSddCisgICAgICBudW1faW5zdGFuY2VzID0gcG9kX3NwZWNzX2RpY3RbcG9kX25hbWVdLmdldCgnbnVtSW5zdGFuY2VzJywgMSkKKworICAgICAgIyBDcmVhdGUgYW5kIGFkZCB0aGUgU2VydmVyUG9kU3BlYyBvYmplY3QgdG8gdGhlIGZpbmFsCisgICAgICAjIHNlcnZlcl9wb2Rfc3BlY3NfZGljdAorICAgICAgc2VydmVyX3BvZF9zcGVjc19kaWN0W3BvZF9uYW1lXSA9IFNlcnZlclBvZFNwZWMoCisgICAgICAgICAgcG9kX25hbWUsIHNlcnZlcl90ZW1wbGF0ZXNfZGljdFtzZXJ2ZXJfdGVtcGxhdGVfbmFtZV0sCisgICAgICAgICAgZG9ja2VyX2ltYWdlc19kaWN0W2RvY2tlcl9pbWFnZV9uYW1lXSwgbnVtX2luc3RhbmNlcykKKworICAgIHJldHVybiBzZXJ2ZXJfcG9kX3NwZWNzX2RpY3QKKworICBkZWYgX3BhcnNlX2NsaWVudF9wb2Rfc3BlY3Moc2VsZiwgY29uZmlnX2RpY3QsIGRvY2tlcl9pbWFnZXNfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF90ZW1wbGF0ZXNfZGljdCwgc2VydmVyX3BvZF9zcGVjc19kaWN0KToKKyAgICAiIiJQYXJzZXMgdGhlICdjbGllbnRQb2RTcGVjcycgc3ViLXNlY3Rpb24gKHVuZGVyICd0ZXN0TWF0cml4JyBzZWN0aW9uKSBvZgorICAgIHRoZSBjb25maWcgZmlsZSBhbmQgcmV0dXJucyBhIERpY3Rpb25hcnkgb2YgJ0NsaWVudFBvZFNwZWMnIG9iamVjdHMga2V5ZWQKKyAgICBieSBjbGllbnQgcG9kIHNwZWMgbmFtZXMiIiIKKyAgICBjbGllbnRfcG9kX3NwZWNzX2RpY3QgPSB7fQorCisgICAgcG9kX3NwZWNzX2RpY3QgPSBjb25maWdfZGljdFsndGVzdE1hdHJpeCddLmdldCgnY2xpZW50UG9kU3BlY3MnLCB7fSkKKyAgICBmb3IgcG9kX25hbWUgaW4gcG9kX3NwZWNzX2RpY3Qua2V5cygpOgorICAgICAgY2xpZW50X3RlbXBsYXRlX25hbWUgPSBwb2Rfc3BlY3NfZGljdFtwb2RfbmFtZV1bJ2NsaWVudFRlbXBsYXRlJ10KKyAgICAgIGRvY2tlcl9pbWFnZV9uYW1lID0gcG9kX3NwZWNzX2RpY3RbcG9kX25hbWVdWydkb2NrZXJJbWFnZSddCisgICAgICBudW1faW5zdGFuY2VzID0gcG9kX3NwZWNzX2RpY3RbcG9kX25hbWVdWydudW1JbnN0YW5jZXMnXQorCisgICAgICAjIEdldCB0aGUgc2VydmVyIGFkZHJlc3NlcyBmcm9tIHRoZSBzZXJ2ZXIgcG9kIHNwZWMgb2JqZWN0CisgICAgICBzZXJ2ZXJfcG9kX3NwZWNfbmFtZSA9IHBvZF9zcGVjc19kaWN0W3BvZF9uYW1lXVsnc2VydmVyUG9kU3BlYyddCisgICAgICBzZXJ2ZXJfYWRkcmVzc2VzID0gc2VydmVyX3BvZF9zcGVjc19kaWN0WworICAgICAgICAgIHNlcnZlcl9wb2Rfc3BlY19uYW1lXS5zZXJ2ZXJfYWRkcmVzc2VzKCkKKworICAgICAgY2xpZW50X3BvZF9zcGVjc19kaWN0W3BvZF9uYW1lXSA9IENsaWVudFBvZFNwZWMoCisgICAgICAgICAgcG9kX25hbWUsIGNsaWVudF90ZW1wbGF0ZXNfZGljdFtjbGllbnRfdGVtcGxhdGVfbmFtZV0sCisgICAgICAgICAgZG9ja2VyX2ltYWdlc19kaWN0W2RvY2tlcl9pbWFnZV9uYW1lXSwgbnVtX2luc3RhbmNlcywKKyAgICAgICAgICBzZXJ2ZXJfYWRkcmVzc2VzKQorCisgICAgcmV0dXJuIGNsaWVudF9wb2Rfc3BlY3NfZGljdAorCisgIGRlZiBfbG9hZF9jb25maWcoc2VsZiwgY29uZmlnX2ZpbGVuYW1lKToKKyAgICAiIiJPcGVucyB0aGUgY29uZmlnIGZpbGUgYW5kIGNvbnZlcnRzIHRoZSBKc29uIHRleHQgdG8gRGljdGlvbmFyeSIiIgorICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGNvbmZpZ19maWxlbmFtZSk6CisgICAgICByYWlzZSBFeGNlcHRpb24oJ0NvbmZpZyBvYmplY3RzIGV4cGVjdHMgYW4gYWJzb2x1dGUgZmlsZSBwYXRoLiAnCisgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZyBmaWxlIG5hbWUgcGFzc2VkOiAlcycgJSBjb25maWdfZmlsZW5hbWUpCisgICAgd2l0aCBvcGVuKGNvbmZpZ19maWxlbmFtZSkgYXMgY29uZmlnX2ZpbGU6CisgICAgICByZXR1cm4ganNvbi5sb2FkKGNvbmZpZ19maWxlKQorCisKK2RlZiBydW5fdGVzdHMoY29uZmlnKToKKyAgIiIiIFRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgbGF1bmNoZXMgdGhlIHN0cmVzcyB0ZXN0cyAiIiIKKyAgIyBCdWlsZCBkb2NrZXIgaW1hZ2VzIGFuZCBwdXNoIHRvIEdLRSByZWdpc3RyeQorICBpZiBjb25maWcuZ2xvYmFsX3NldHRpbmdzLmJ1aWxkX2RvY2tlcl9pbWFnZXM6CisgICAgZm9yIG5hbWUsIGRvY2tlcl9pbWFnZSBpbiBjb25maWcuZG9ja2VyX2ltYWdlc19kaWN0Lml0ZXJpdGVtcygpOgorICAgICAgaWYgbm90IChkb2NrZXJfaW1hZ2UuYnVpbGRfaW1hZ2UoKSBhbmQKKyAgICAgICAgICAgICAgZG9ja2VyX2ltYWdlLnB1c2hfdG9fZ2tlX3JlZ2lzdHJ5KCkpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAjIENyZWF0ZSBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBydW4gKE5vdGU6IFVzaW5nIHRpbWVzdGFtcCBpbnN0ZWFkIG9mIFVVSUQgdG8KKyAgIyBtYWtlIGl0IGVhc2llciB0byBkZWR1Y2UgdGhlIGRhdGUvdGltZSBvZiB0aGUgcnVuIGp1c3QgYnkgbG9va2luZyBhdCB0aGUgcnVuCisgICMgcnVuIGlkLiBUaGlzIGlzIHVzZWZ1bCBpbiBkZWJ1Z2dpbmcgd2hlbiBsb29raW5nIGF0IHJlY29yZHMgaW4gQmlxIHF1ZXJ5KQorICBydW5faWQgPSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVlfJW1fJWRfJUhfJU1fJVMnKQorICBkYXRhc2V0X2lkID0gJyVzXyVzJyAlIChjb25maWcuZ2xvYmFsX3NldHRpbmdzLmRhdGFzZXRfaWRfcHJlZml4LCBydW5faWQpCisKKyAgYnFfaGVscGVyID0gQmlnUXVlcnlIZWxwZXIocnVuX2lkLCAnJywgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nbG9iYWxfc2V0dGluZ3MuZ2NwX3Byb2plY3RfaWQsIGRhdGFzZXRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nbG9iYWxfc2V0dGluZ3Muc3VtbWFyeV90YWJsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdsb2JhbF9zZXR0aW5ncy5xcHNfdGFibGVfaWQpCisgIGJxX2hlbHBlci5pbml0aWFsaXplKCkKKworICBna2UgPSBHa2UoY29uZmlnLmdsb2JhbF9zZXR0aW5ncy5nY3BfcHJvamVjdF9pZCwgcnVuX2lkLCBkYXRhc2V0X2lkLAorICAgICAgICAgICAgY29uZmlnLmdsb2JhbF9zZXR0aW5ncy5zdW1tYXJ5X3RhYmxlX2lkLAorICAgICAgICAgICAgY29uZmlnLmdsb2JhbF9zZXR0aW5ncy5xcHNfdGFibGVfaWQsCisgICAgICAgICAgICBjb25maWcuZ2xvYmFsX3NldHRpbmdzLmt1YmVybmV0ZXNfcHJveHlfcG9ydCkKKworICBpc19zdWNjZXNzID0gVHJ1ZQorCisgIHRyeToKKyAgICBwcmludCAnTGF1bmNoaW5nIHNlcnZlcnMuLicKKyAgICBmb3IgbmFtZSwgc2VydmVyX3BvZF9zcGVjIGluIGNvbmZpZy5zZXJ2ZXJfcG9kX3NwZWNzX2RpY3QuaXRlcml0ZW1zKCk6CisgICAgICBpZiBub3QgZ2tlLmxhdW5jaF9zZXJ2ZXJzKHNlcnZlcl9wb2Rfc3BlYyk6CisgICAgICAgIGlzX3N1Y2Nlc3MgPSBGYWxzZSAgIyBpc19zdWNjZXNzIGlzIGNoZWNrZWQgaW4gdGhlICdmaW5hbGx5JyBibG9jaworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIHByaW50KCdMYXVuY2hlZCBzZXJ2ZXJzLiBXYWl0aW5nIGZvciAlZCBzZWNvbmRzIGZvciB0aGUgc2VydmVyIHBvZHMgdG8gYmUgJworICAgICAgICAgICdmdWxseSBvbmxpbmUnKSAlIGNvbmZpZy5nbG9iYWxfc2V0dGluZ3MucG9kX3dhcm11cF9zZWNzCisgICAgdGltZS5zbGVlcChjb25maWcuZ2xvYmFsX3NldHRpbmdzLnBvZF93YXJtdXBfc2VjcykKKworICAgIGZvciBuYW1lLCBjbGllbnRfcG9kX3NwZWMgaW4gY29uZmlnLmNsaWVudF9wb2Rfc3BlY3NfZGljdC5pdGVyaXRlbXMoKToKKyAgICAgIGlmIG5vdCBna2UubGF1bmNoX2NsaWVudHMoY2xpZW50X3BvZF9zcGVjKToKKyAgICAgICAgaXNfc3VjY2VzcyA9IEZhbHNlICAjIGlzX3N1Y2Nlc3MgaXMgY2hlY2tlZCBpbiB0aGUgJ2ZpbmFsbHknIGJsb2NrCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcHJpbnQoJ0xhdW5jaGVkIGFsbCBjbGllbnRzLiBXYWl0aW5nIGZvciAlZCBzZWNvbmRzIGZvciB0aGUgY2xpZW50IHBvZHMgdG8gJworICAgICAgICAgICdiZSBmdWxseSBvbmxpbmUnKSAlIGNvbmZpZy5nbG9iYWxfc2V0dGluZ3MucG9kX3dhcm11cF9zZWNzCisgICAgdGltZS5zbGVlcChjb25maWcuZ2xvYmFsX3NldHRpbmdzLnBvZF93YXJtdXBfc2VjcykKKworICAgIHN0YXJ0X3RpbWUgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorICAgIGVuZF90aW1lID0gc3RhcnRfdGltZSArIGRhdGV0aW1lLnRpbWVkZWx0YSgKKyAgICAgICAgc2Vjb25kcz1jb25maWcuZ2xvYmFsX3NldHRpbmdzLnRlc3RfZHVyYXRpb25fc2VjcykKKyAgICBwcmludCAnUnVubmluZyB0aGUgdGVzdCB1bnRpbCAlcycgJSBlbmRfdGltZS5pc29mb3JtYXQoKQorCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIGlmIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpID4gZW5kX3RpbWU6CisgICAgICAgIHByaW50ICdUZXN0IHdhcyBydW4gZm9yICVkIHNlY29uZHMnICUgY29uZmlnLmdsb2JhbF9zZXR0aW5ncy50ZXN0X2R1cmF0aW9uX3NlY3MKKyAgICAgICAgYnJlYWsKKworICAgICAgIyBDaGVjayBpZiBlaXRoZXIgc3RyZXNzIHNlcnZlciBvciBjbGllbnRzIGhhdmUgZmFpbGVkIChidHcsIHRoZSBicV9oZWxwZXIKKyAgICAgICMgbW9uaXRvcnMgYWxsIHRoZSByb3dzIGluIHRoZSBzdW1tYXJ5IHRhYmxlIGFuZCBjaGVja3MgaWYgYW55IG9mIHRoZW0KKyAgICAgICMgaGF2ZSBhIGZhaWx1cmUgc3RhdHVzKQorICAgICAgaWYgYnFfaGVscGVyLmNoZWNrX2lmX2FueV90ZXN0c19mYWlsZWQoKToKKyAgICAgICAgaXNfc3VjY2VzcyA9IEZhbHNlCisgICAgICAgIHByaW50ICdTb21lIHRlc3RzIGZhaWxlZC4nCisgICAgICAgIGJyZWFrICAjIERvbid0ICdyZXR1cm4nIGhlcmUuIFdlIHN0aWxsIHdhbnQgdG8gY2FsbCBicV9oZWxwZXIgdG8gcHJpbnQgcXBzL3N1bW1hcnkgdGFibGVzCisKKyAgICAgICMgVGVzdHMgcnVubmluZyBmaW5lLiBXYWl0IHVudGlsIG5leHQgcG9sbCB0aW1lIHRvIGNoZWNrIHRoZSBzdGF0dXMKKyAgICAgIHByaW50ICdTbGVlcGluZyBmb3IgJWQgc2Vjb25kcy4uJyAlIGNvbmZpZy5nbG9iYWxfc2V0dGluZ3MudGVzdF9wb2xsX2ludGVydmFsX3NlY3MKKyAgICAgIHRpbWUuc2xlZXAoY29uZmlnLmdsb2JhbF9zZXR0aW5ncy50ZXN0X3BvbGxfaW50ZXJ2YWxfc2VjcykKKworICAgICMgUHJpbnQgQmlxUXVlcnkgdGFibGVzCisgICAgYnFfaGVscGVyLnByaW50X3Fwc19yZWNvcmRzKCkKKyAgICBicV9oZWxwZXIucHJpbnRfc3VtbWFyeV9yZWNvcmRzKCkKKworICBmaW5hbGx5OgorICAgICMgSWYgdGhlcmUgd2FzIGEgdGVzdCBmYWlsdXJlLCB3ZSBzaG91bGQgbm90IGRlbGV0ZSB0aGUgcG9kcyBzaW5jZSB0aGV5CisgICAgIyB3b3VsZCBjb250YWluIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbiAobG9ncywgY29yZSBkdW1wcyBldGMpCisgICAgaWYgaXNfc3VjY2VzczoKKyAgICAgIGZvciBuYW1lLCBzZXJ2ZXJfcG9kX3NwZWMgaW4gY29uZmlnLnNlcnZlcl9wb2Rfc3BlY3NfZGljdC5pdGVyaXRlbXMoKToKKyAgICAgICAgZ2tlLmRlbGV0ZV9zZXJ2ZXJzKHNlcnZlcl9wb2Rfc3BlYykKKyAgICAgIGZvciBuYW1lLCBjbGllbnRfcG9kX3NwZWMgaW4gY29uZmlnLmNsaWVudF9wb2Rfc3BlY3NfZGljdC5pdGVyaXRlbXMoKToKKyAgICAgICAgZ2tlLmRlbGV0ZV9jbGllbnRzKGNsaWVudF9wb2Rfc3BlYykKKworICByZXR1cm4gaXNfc3VjY2VzcworCisKK2FyZ3AgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICBkZXNjcmlwdGlvbj0nTGF1bmNoIHN0cmVzcyB0ZXN0cyBpbiBHS0UnLAorICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5Bcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlcikKK2FyZ3AuYWRkX2FyZ3VtZW50KCctLWdjcF9wcm9qZWN0X2lkJywKKyAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgR29vZ2xlIENsb3VkIFBsYXRmb3JtIFByb2plY3QgSWQnKQorYXJncC5hZGRfYXJndW1lbnQoJy0tY29uZmlnX2ZpbGUnLAorICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHRlc3QgY29uZmlnIGZpbGUnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBhcmdzID0gYXJncC5wYXJzZV9hcmdzKCkKKworICBjb25maWdfZmlsZW5hbWUgPSBhcmdzLmNvbmZpZ19maWxlCisKKyAgIyBTaW5jZSB3ZSB3aWxsIGJlIGNoYW5naW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIGdycGMgcm9vdCBpbiB0aGUKKyAgIyBuZXh0IHN0ZXAsIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgY29uZmlnIGZpbGVuYW1lIHBhdGggaXMgYSByZWxhdGl2ZSBwYXRoCisgICMgKGkuZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpIGFuZCBpZiBzbywgY29udmVydCBpdAorICAjIHRvIGFib3N1bHRlIHBhdGgKKyAgaWYgbm90IG9zLnBhdGguaXNhYnMoY29uZmlnX2ZpbGVuYW1lKToKKyAgICBjb25maWdfZmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoY29uZmlnX2ZpbGVuYW1lKQorCisgIGNvbmZpZyA9IENvbmZpZyhjb25maWdfZmlsZW5hbWUsIGFyZ3MuZ2NwX3Byb2plY3RfaWQpCisKKyAgIyBDaGFuZ2UgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBncnBjIHJvb3QKKyAgIyAoVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBhbGwgcmVsYXRpdmUgZmlsZSBwYXRocyBpbiB0aGUgY29uZmlnIGZpbGUgYXJlCisgICMgc3VwcG9zZWQgdG8gaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIEdSUEMgcm9vdCkKKyAgZ3JwY19yb290ID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbigKKyAgICAgIG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICcuLi8uLi8uLicpKQorICBvcy5jaGRpcihncnBjX3Jvb3QpCisKKyAgcnVuX3Rlc3RzKGNvbmZpZykKZGlmZiAtLWdpdCBhL3Rvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9ydW5fc3RyZXNzX3Rlc3RzX29uX2drZS5weSBiL3Rvb2xzL3J1bl90ZXN0cy9zdHJlc3NfdGVzdC9ydW5fc3RyZXNzX3Rlc3RzX29uX2drZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM0ZWIxYS4uMDAwMDAwMAotLS0gYS90b29scy9ydW5fdGVzdHMvc3RyZXNzX3Rlc3QvcnVuX3N0cmVzc190ZXN0c19vbl9na2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NTYgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMi43Ci0jIENvcHlyaWdodCAyMDE1LTIwMTYsIEdvb2dsZSBJbmMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBvcwotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi0KLXN0cmVzc190ZXN0X3V0aWxzX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oCi0gICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uLy4uL2djcC9zdHJlc3NfdGVzdCcpKQotc3lzLnBhdGguYXBwZW5kKHN0cmVzc190ZXN0X3V0aWxzX2RpcikKLWZyb20gc3RyZXNzX3Rlc3RfdXRpbHMgaW1wb3J0IEJpZ1F1ZXJ5SGVscGVyCi0KLWt1YmVybmV0ZXNfYXBpX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oCi0gICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uLy4uL2djcC91dGlscycpKQotc3lzLnBhdGguYXBwZW5kKGt1YmVybmV0ZXNfYXBpX2RpcikKLQotaW1wb3J0IGt1YmVybmV0ZXNfYXBpCi0KLV9HUlBDX1JPT1QgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKAotICAgIG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICcuLi8uLi8uLicpKQotb3MuY2hkaXIoX0dSUENfUk9PVCkKLQotIyBudW0gb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgR0tFIGltYWdlIHRvIHN0YXJ0IGFuZCB3YXJtdXAKLV9HS0VfSU1BR0VfV0FSTVVQX1dBSVRfU0VDUyA9IDYwCi0KLV9TRVJWRVJfUE9EX05BTUUgPSAnc3RyZXNzLXNlcnZlcicKLV9DTElFTlRfUE9EX05BTUVfUFJFRklYID0gJ3N0cmVzcy1jbGllbnQnCi1fREFUQVNFVF9JRF9QUkVGSVggPSAnc3RyZXNzX3Rlc3QnCi1fU1VNTUFSWV9UQUJMRV9JRCA9ICdzdW1tYXJ5JwotX1FQU19UQUJMRV9JRCA9ICdxcHMnCi0KLV9ERUZBVUxUX0RPQ0tFUl9JTUFHRV9OQU1FID0gJ2dycGNfc3RyZXNzX3Rlc3QnCi0KLSMgVGhlIGRlZmF1bHQgcG9ydCBvbiB3aGljaCB0aGUga3ViZXJuZXRlcyBwcm94eSBzZXJ2ZXIgaXMgc3RhcnRlZCBvbiBsb2NhbGhvc3QKLSMgKGkuZSBrdWJlY3RsIHByb3h5IC0tcG9ydD08cG9ydD4pCi1fREVGQVVMVF9LVUJFUk5FVEVTX1BST1hZX1BPUlQgPSA4MDAxCi0KLSMgSG93IGZyZXF1ZW50bHkgc2hvdWxkIHRoZSBzdHJlc3MgY2xpZW50IHdyYXBwZXIgc2NyaXB0IChydW5uaW5nIGluc2lkZSBhIEdLRQotIyBjb250YWluZXIpIHBvbGwgdGhlIGhlYWx0aCBvZiB0aGUgc3RyZXNzIGNsaWVudCAoYWxzbyBydW5uaW5nIGluc2lkZSB0aGUgR0tFCi0jIGNvbnRhaW5lcikgYW5kIHVwbG9hZCBtZXRyaWNzIHRvIEJpZ1F1ZXJ5Ci1fREVGQVVMVF9TVFJFU1NfQ0xJRU5UX1BPTExfSU5URVJWQUxfU0VDUyA9IDYwCi0KLSMgVGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igc3RyZXNzIHRlc3Qgc2VydmVyIGFuZCBjbGllbnQKLV9ERUZBVUxUX1NUUkVTU19TRVJWRVJfUE9SVCA9IDgwODAKLV9ERUZBVUxUX01FVFJJQ1NfUE9SVCA9IDgwODEKLV9ERUZBVUxUX1RFU1RfQ0FTRVNfU1RSID0gJ2VtcHR5X3VuYXJ5OjEsbGFyZ2VfdW5hcnk6MSxjbGllbnRfc3RyZWFtaW5nOjEsc2VydmVyX3N0cmVhbWluZzoxLGVtcHR5X3N0cmVhbToxJwotX0RFRkFVTFRfTlVNX0NIQU5ORUxTX1BFUl9TRVJWRVIgPSA1Ci1fREVGQVVMVF9OVU1fU1RVQlNfUEVSX0NIQU5ORUwgPSAxMAotX0RFRkFVTFRfTUVUUklDU19DT0xMRUNUSU9OX0lOVEVSVkFMX1NFQ1MgPSAzMAotCi0jIE51bWJlciBvZiBzdHJlc3MgY2xpZW50IGluc3RhbmNlcyB0byBsYXVuY2gKLV9ERUZBVUxUX05VTV9DTElFTlRTID0gMwotCi0jIEhvdyBmcmVxdWVudGx5IHNob3VsZCB0aGlzIHRlc3QgbW9uaXRvciB0aGUgaGVhbHRoIG9mIFN0cmVzcyBjbGllbnRzIGFuZAotIyBTZXJ2ZXJzIHJ1bm5pbmcgaW4gR0tFCi1fREVGQVVMVF9URVNUX1BPTExfSU5URVJWQUxfU0VDUyA9IDYwCi0KLSMgRGVmYXVsdCBydW4gdGltZSBmb3IgdGhpcyB0ZXN0ICgyIGhvdXIpCi1fREVGQVVMVF9URVNUX0RVUkFUSU9OX1NFQ1MgPSA3MjAwCi0KLSMgVGhlIG51bWJlciBvZiBzZWNvbmRzIGl0IHdvdWxkIHRha2UgYSBHS0UgcG9kIHRvIHdhcm0gdXAgKGkuZSBnZXQgdG8gJ1J1bm5pbmcnCi0jIHN0YXRlIGZyb20gdGhlIHRpbWUgb2YgY3JlYXRpb24pLiBJZGVhbGx5IHRoaXMgaXMgc29tZXRoaW5nIHRoZSB0ZXN0IHNob3VsZAotIyBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBieSB1c2luZyBLdWJlcm5ldGVzIEFQSSB0byBwb2xsIHRoZSBwb2RzIHN0YXR1cy4KLV9ERUZBVUxUX0dLRV9XQVJNVVBfU0VDUyA9IDYwCi0KLQotY2xhc3MgS3ViZXJuZXRlc1Byb3h5OgotICAiIiIgQ2xhc3MgdG8gc3RhcnQgYSBwcm94eSBvbiBsb2NhbGhvc3QgdG8gdGhlIEt1YmVybmV0ZXMgQVBJIHNlcnZlciAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgYXBpX3BvcnQpOgotICAgIHNlbGYucG9ydCA9IGFwaV9wb3J0Ci0gICAgc2VsZi5wID0gTm9uZQotICAgIHNlbGYuc3RhcnRlZCA9IEZhbHNlCi0KLSAgZGVmIHN0YXJ0KHNlbGYpOgotICAgIGNtZCA9IFsna3ViZWN0bCcsICdwcm94eScsICctLXBvcnQ9JWQnICUgc2VsZi5wb3J0XQotICAgIHNlbGYucCA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncz1jbWQpCi0gICAgc2VsZi5zdGFydGVkID0gVHJ1ZQotICAgIHRpbWUuc2xlZXAoMikKLSAgICBwcmludCAnLi5TdGFydGVkJwotCi0gIGRlZiBnZXRfcG9ydChzZWxmKToKLSAgICByZXR1cm4gc2VsZi5wb3J0Ci0KLSAgZGVmIGlzX3N0YXJ0ZWQoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuc3RhcnRlZAotCi0gIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgIGlmIHNlbGYucCBpcyBub3QgTm9uZToKLSAgICAgIHByaW50ICdTaHV0dGluZyBkb3duIEt1YmVybmV0ZXMgcHJveHkuLicKLSAgICAgIHNlbGYucC5raWxsKCkKLQotCi1jbGFzcyBUZXN0U2V0dGluZ3M6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkX2RvY2tlcl9pbWFnZSwgdGVzdF9wb2xsX2ludGVydmFsX3NlY3MsCi0gICAgICAgICAgICAgICB0ZXN0X2R1cmF0aW9uX3NlY3MsIGt1YmVybmV0ZXNfcHJveHlfcG9ydCk6Ci0gICAgc2VsZi5idWlsZF9kb2NrZXJfaW1hZ2UgPSBidWlsZF9kb2NrZXJfaW1hZ2UKLSAgICBzZWxmLnRlc3RfcG9sbF9pbnRlcnZhbF9zZWNzID0gdGVzdF9wb2xsX2ludGVydmFsX3NlY3MKLSAgICBzZWxmLnRlc3RfZHVyYXRpb25fc2VjcyA9IHRlc3RfZHVyYXRpb25fc2VjcwotICAgIHNlbGYua3ViZXJuZXRlc19wcm94eV9wb3J0ID0ga3ViZXJuZXRlc19wcm94eV9wb3J0Ci0KLQotY2xhc3MgR2tlU2V0dGluZ3M6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2plY3RfaWQsIGRvY2tlcl9pbWFnZV9uYW1lKToKLSAgICBzZWxmLnByb2plY3RfaWQgPSBwcm9qZWN0X2lkCi0gICAgc2VsZi5kb2NrZXJfaW1hZ2VfbmFtZSA9IGRvY2tlcl9pbWFnZV9uYW1lCi0gICAgc2VsZi50YWdfbmFtZSA9ICdnY3IuaW8vJXMvJXMnICUgKHByb2plY3RfaWQsIGRvY2tlcl9pbWFnZV9uYW1lKQotCi0KLWNsYXNzIEJpZ1F1ZXJ5U2V0dGluZ3M6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHJ1bl9pZCwgZGF0YXNldF9pZCwgc3VtbWFyeV90YWJsZV9pZCwgcXBzX3RhYmxlX2lkKToKLSAgICBzZWxmLnJ1bl9pZCA9IHJ1bl9pZAotICAgIHNlbGYuZGF0YXNldF9pZCA9IGRhdGFzZXRfaWQKLSAgICBzZWxmLnN1bW1hcnlfdGFibGVfaWQgPSBzdW1tYXJ5X3RhYmxlX2lkCi0gICAgc2VsZi5xcHNfdGFibGVfaWQgPSBxcHNfdGFibGVfaWQKLQotCi1jbGFzcyBTdHJlc3NTZXJ2ZXJTZXR0aW5nczoKLQotICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX3BvZF9uYW1lLCBzZXJ2ZXJfcG9ydCk6Ci0gICAgc2VsZi5zZXJ2ZXJfcG9kX25hbWUgPSBzZXJ2ZXJfcG9kX25hbWUKLSAgICBzZWxmLnNlcnZlcl9wb3J0ID0gc2VydmVyX3BvcnQKLQotCi1jbGFzcyBTdHJlc3NDbGllbnRTZXR0aW5nczoKLQotICBkZWYgX19pbml0X18oc2VsZiwgbnVtX2NsaWVudHMsIGNsaWVudF9wb2RfbmFtZV9wcmVmaXgsIHNlcnZlcl9wb2RfbmFtZSwKLSAgICAgICAgICAgICAgIHNlcnZlcl9wb3J0LCBtZXRyaWNzX3BvcnQsIG1ldHJpY3NfY29sbGVjdGlvbl9pbnRlcnZhbF9zZWNzLAotICAgICAgICAgICAgICAgc3RyZXNzX2NsaWVudF9wb2xsX2ludGVydmFsX3NlY3MsIG51bV9jaGFubmVsc19wZXJfc2VydmVyLAotICAgICAgICAgICAgICAgbnVtX3N0dWJzX3Blcl9jaGFubmVsLCB0ZXN0X2Nhc2VzX3N0cik6Ci0gICAgc2VsZi5udW1fY2xpZW50cyA9IG51bV9jbGllbnRzCi0gICAgc2VsZi5jbGllbnRfcG9kX25hbWVfcHJlZml4ID0gY2xpZW50X3BvZF9uYW1lX3ByZWZpeAotICAgIHNlbGYuc2VydmVyX3BvZF9uYW1lID0gc2VydmVyX3BvZF9uYW1lCi0gICAgc2VsZi5zZXJ2ZXJfcG9ydCA9IHNlcnZlcl9wb3J0Ci0gICAgc2VsZi5tZXRyaWNzX3BvcnQgPSBtZXRyaWNzX3BvcnQKLSAgICBzZWxmLm1ldHJpY3NfY29sbGVjdGlvbl9pbnRlcnZhbF9zZWNzID0gbWV0cmljc19jb2xsZWN0aW9uX2ludGVydmFsX3NlY3MKLSAgICBzZWxmLnN0cmVzc19jbGllbnRfcG9sbF9pbnRlcnZhbF9zZWNzID0gc3RyZXNzX2NsaWVudF9wb2xsX2ludGVydmFsX3NlY3MKLSAgICBzZWxmLm51bV9jaGFubmVsc19wZXJfc2VydmVyID0gbnVtX2NoYW5uZWxzX3Blcl9zZXJ2ZXIKLSAgICBzZWxmLm51bV9zdHVic19wZXJfY2hhbm5lbCA9IG51bV9zdHVic19wZXJfY2hhbm5lbAotICAgIHNlbGYudGVzdF9jYXNlc19zdHIgPSB0ZXN0X2Nhc2VzX3N0cgotCi0gICAgIyA9PSBEZXJpdmVkIHByb3BlcnRpZXMgPT0KLSAgICAjIE5vdGU6IENsaWVudCBjYW4gYWNjZXB0IGEgbGlzdCBvZiBzZXJ2ZXIgYWRkcmVzc2VzIChhIGNvbW1hIHNlcGFyYXRlZCBsaXN0Ci0gICAgIyBvZiAnc2VydmVyX25hbWU6c2VydmVyX3BvcnQnKS4gSW4gdGhpcyBjYXNlLCB3ZSBvbmx5IGhhdmUgb25lIHNlcnZlcgotICAgICMgYWRkcmVzcyB0byBwYXNzCi0gICAgc2VsZi5zZXJ2ZXJfYWRkcmVzc2VzID0gJyVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWw6JWQnICUgKAotICAgICAgICBzZXJ2ZXJfcG9kX25hbWUsIHNlcnZlcl9wb3J0KQotICAgIHNlbGYuY2xpZW50X3BvZF9uYW1lc19saXN0ID0gWyclcy0lZCcgJSAoY2xpZW50X3BvZF9uYW1lX3ByZWZpeCwgaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBudW1fY2xpZW50cyArIDEpXQotCi0KLWRlZiBfYnVpbGRfZG9ja2VyX2ltYWdlKGltYWdlX25hbWUsIHRhZ19uYW1lKToKLSAgIiIiIEJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UgYW5kIGFkZCB0YWcgaXQgdG8gdGhlIEdLRSByZXBvc2l0b3J5ICIiIgotICBwcmludCAnQnVpbGRpbmcgZG9ja2VyIGltYWdlOiAlcycgJSBpbWFnZV9uYW1lCi0gIG9zLmVudmlyb25bJ0lOVEVST1BfSU1BR0UnXSA9IGltYWdlX25hbWUKLSAgb3MuZW52aXJvblsnSU5URVJPUF9JTUFHRV9SRVBPU0lUT1JZX1RBRyddID0gdGFnX25hbWUKLSAgIyBOb3RlIHRoYXQgJ0JBU0VfTkFNRScgSEFTIHRvIGJlICdncnBjX2ludGVyb3Bfc3RyZXNzX2N4eCcgc2luY2UgdGhlIHNjcmlwdAotICAjIGJ1aWxkX2ludGVyb3Bfc3RyZXNzX2ltYWdlLnNoIGludm9rZXMgdGhlIGZvbGxvd2luZyBzY3JpcHQ6Ci0gICMgICB0b29scy9kb2NrZXJmaWxlLyRCQVNFX05BTUUvYnVpbGRfaW50ZXJvcF9zdHJlc3Muc2gKLSAgb3MuZW52aXJvblsnQkFTRV9OQU1FJ10gPSAnZ3JwY19pbnRlcm9wX3N0cmVzc19jeHgnCi0gIGNtZCA9IFsndG9vbHMvamVua2lucy9idWlsZF9pbnRlcm9wX3N0cmVzc19pbWFnZS5zaCddCi0gIHJldGNvZGUgPSBzdWJwcm9jZXNzLmNhbGwoYXJncz1jbWQpCi0gIGlmIHJldGNvZGUgIT0gMDoKLSAgICBwcmludCAnRXJyb3IgaW4gYnVpbGRpbmcgZG9ja2VyIGltYWdlJwotICAgIHJldHVybiBGYWxzZQotICByZXR1cm4gVHJ1ZQotCi0KLWRlZiBfcHVzaF9kb2NrZXJfaW1hZ2VfdG9fZ2tlX3JlZ2lzdHJ5KGRvY2tlcl90YWdfbmFtZSk6Ci0gICIiIkV4ZWN1dGVzICdnY2xvdWQgZG9ja2VyIHB1c2ggPGRvY2tlcl90YWdfbmFtZT4nIHRvIHB1c2ggdGhlIGltYWdlIHRvIEdLRSByZWdpc3RyeSIiIgotICBjbWQgPSBbJ2djbG91ZCcsICdkb2NrZXInLCAncHVzaCcsIGRvY2tlcl90YWdfbmFtZV0KLSAgcHJpbnQgJ1B1c2hpbmcgJXMgdG8gR0tFIHJlZ2lzdHJ5Li4nICUgZG9ja2VyX3RhZ19uYW1lCi0gIHJldGNvZGUgPSBzdWJwcm9jZXNzLmNhbGwoYXJncz1jbWQpCi0gIGlmIHJldGNvZGUgIT0gMDoKLSAgICBwcmludCAnRXJyb3IgaW4gcHVzaGluZyBkb2NrZXIgaW1hZ2UgJXMgdG8gdGhlIEdLRSByZWdpc3RyeScgJSBkb2NrZXJfdGFnX25hbWUKLSAgICByZXR1cm4gRmFsc2UKLSAgcmV0dXJuIFRydWUKLQotCi1kZWYgX2xhdW5jaF9zZXJ2ZXIoZ2tlX3NldHRpbmdzLCBzdHJlc3Nfc2VydmVyX3NldHRpbmdzLCBicV9zZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICBrdWJlcm5ldGVzX3Byb3h5KToKLSAgIiIiIExhdW5jaGVzIGEgc3RyZXNzIHRlc3Qgc2VydmVyIGluc3RhbmNlIGluIEdLRSBjbHVzdGVyICIiIgotICBpZiBub3Qga3ViZXJuZXRlc19wcm94eS5pc19zdGFydGVkOgotICAgIHByaW50ICdLdWJlcm5ldGVzIHByb3h5IG11c3QgYmUgc3RhcnRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uJwotICAgIHJldHVybiBGYWxzZQotCi0gICMgVGhpcyBpcyB0aGUgd3JhcHBlciBzY3JpcHQgdGhhdCBpcyBydW4gaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBzY3JpcHQgcnVucwotICAjIHRoZSBhY3R1YWwgc3RyZXNzIHRlc3Qgc2VydmVyCi0gIHNlcnZlcl9jbWRfbGlzdCA9IFsnL3Zhci9sb2NhbC9naXQvZ3JwYy90b29scy9nY3Avc3RyZXNzX3Rlc3QvcnVuX3NlcnZlci5weSddCi0KLSAgIyBydW5fc2VydmVyLnB5IGRvZXMgbm90IHRha2UgYW55IGFyZ3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBUaGUgYXJncyBhcmUKLSAgIyBpbnN0ZWFkIHBhc3NlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIChzZWUgc2VydmVyX2VudiBiZWxvdykKLSAgc2VydmVyX2FyZ19saXN0ID0gW10KLQotICAjIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzY3JpcHQgcnVuX3NlcnZlci5weSBhcmUgaW5qZWN0ZWQgaW50byB0aGUgY29udGFpbmVyCi0gICMgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwotICBzZXJ2ZXJfZW52ID0gewotICAgICAgJ1NUUkVTU19URVNUX0lNQUdFX1RZUEUnOiAnU0VSVkVSJywKLSAgICAgICdTVFJFU1NfVEVTVF9JTUFHRSc6ICcvdmFyL2xvY2FsL2dpdC9ncnBjL2JpbnMvb3B0L2ludGVyb3Bfc2VydmVyJywKLSAgICAgICdTVFJFU1NfVEVTVF9BUkdTX1NUUic6ICctLXBvcnQ9JXMnICUgc3RyZXNzX3NlcnZlcl9zZXR0aW5ncy5zZXJ2ZXJfcG9ydCwKLSAgICAgICdSVU5fSUQnOiBicV9zZXR0aW5ncy5ydW5faWQsCi0gICAgICAnUE9EX05BTUUnOiBzdHJlc3Nfc2VydmVyX3NldHRpbmdzLnNlcnZlcl9wb2RfbmFtZSwKLSAgICAgICdHQ1BfUFJPSkVDVF9JRCc6IGdrZV9zZXR0aW5ncy5wcm9qZWN0X2lkLAotICAgICAgJ0RBVEFTRVRfSUQnOiBicV9zZXR0aW5ncy5kYXRhc2V0X2lkLAotICAgICAgJ1NVTU1BUllfVEFCTEVfSUQnOiBicV9zZXR0aW5ncy5zdW1tYXJ5X3RhYmxlX2lkLAotICAgICAgJ1FQU19UQUJMRV9JRCc6IGJxX3NldHRpbmdzLnFwc190YWJsZV9pZAotICB9Ci0KLSAgIyBMYXVuY2ggU2VydmVyCi0gIGlzX3N1Y2Nlc3MgPSBrdWJlcm5ldGVzX2FwaS5jcmVhdGVfcG9kX2FuZF9zZXJ2aWNlKAotICAgICAgJ2xvY2FsaG9zdCcsCi0gICAgICBrdWJlcm5ldGVzX3Byb3h5LmdldF9wb3J0KCksCi0gICAgICAnZGVmYXVsdCcsICAjIFVzZSAnZGVmYXVsdCcgbmFtZXNwYWNlCi0gICAgICBzdHJlc3Nfc2VydmVyX3NldHRpbmdzLnNlcnZlcl9wb2RfbmFtZSwKLSAgICAgIGdrZV9zZXR0aW5ncy50YWdfbmFtZSwKLSAgICAgIFtzdHJlc3Nfc2VydmVyX3NldHRpbmdzLnNlcnZlcl9wb3J0XSwgICMgUG9ydCB0aGF0IHNob3VsZCBiZSBleHBvc2VkCi0gICAgICBzZXJ2ZXJfY21kX2xpc3QsCi0gICAgICBzZXJ2ZXJfYXJnX2xpc3QsCi0gICAgICBzZXJ2ZXJfZW52LAotICAgICAgVHJ1ZSAgIyBIZWFkbGVzcyA9IFRydWUgZm9yIHNlcnZlci4gU2luY2Ugd2Ugd2FudCBETlMgcmVjb3JkcyB0byBiZSBjcmVhdGVkIGJ5IEdLRQotICApCi0KLSAgcmV0dXJuIGlzX3N1Y2Nlc3MKLQotCi1kZWYgX2xhdW5jaF9jbGllbnQoZ2tlX3NldHRpbmdzLCBzdHJlc3Nfc2VydmVyX3NldHRpbmdzLCBzdHJlc3NfY2xpZW50X3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgIGJxX3NldHRpbmdzLCBrdWJlcm5ldGVzX3Byb3h5KToKLSAgIiIiIExhdW5jaGVzIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBzdHJlc3MgdGVzdCBjbGllbnRzIG9uIEdLRSBjbHVzdGVyICIiIgotICBpZiBub3Qga3ViZXJuZXRlc19wcm94eS5pc19zdGFydGVkOgotICAgIHByaW50ICdLdWJlcm5ldGVzIHByb3h5IG11c3QgYmUgc3RhcnRlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uJwotICAgIHJldHVybiBGYWxzZQotCi0gIHN0cmVzc19jbGllbnRfYXJnX2xpc3QgPSBbCi0gICAgICAnLS1zZXJ2ZXJfYWRkcmVzc2VzPSVzJyAlIHN0cmVzc19jbGllbnRfc2V0dGluZ3Muc2VydmVyX2FkZHJlc3NlcywKLSAgICAgICctLXRlc3RfY2FzZXM9JXMnICUgc3RyZXNzX2NsaWVudF9zZXR0aW5ncy50ZXN0X2Nhc2VzX3N0ciwKLSAgICAgICctLW51bV9zdHVic19wZXJfY2hhbm5lbD0lZCcgJQotICAgICAgc3RyZXNzX2NsaWVudF9zZXR0aW5ncy5udW1fc3R1YnNfcGVyX2NoYW5uZWwKLSAgXQotCi0gICMgVGhpcyBpcyB0aGUgd3JhcHBlciBzY3JpcHQgdGhhdCBpcyBydW4gaW4gdGhlIGNvbnRhaW5lci4gVGhpcyBzY3JpcHQgcnVucwotICAjIHRoZSBhY3R1YWwgc3RyZXNzIGNsaWVudAotICBjbGllbnRfY21kX2xpc3QgPSBbJy92YXIvbG9jYWwvZ2l0L2dycGMvdG9vbHMvZ2NwL3N0cmVzc190ZXN0L3J1bl9jbGllbnQucHknXQotCi0gICMgcnVuX2NsaWVudC5weSB0YWtlcyBubyBhcmdzLiBBbGwgYXJncyBhcmUgcGFzc2VkIGFzIGVudiB2YXJpYWJsZXMgKHNlZQotICAjIGNsaWVudF9lbnYpCi0gIGNsaWVudF9hcmdfbGlzdCA9IFtdCi0KLSAgbWV0cmljc19zZXJ2ZXJfYWRkcmVzcyA9ICdsb2NhbGhvc3Q6JWQnICUgc3RyZXNzX2NsaWVudF9zZXR0aW5ncy5tZXRyaWNzX3BvcnQKLSAgbWV0cmljc19jbGllbnRfYXJnX2xpc3QgPSBbCi0gICAgICAnLS1tZXRyaWNzX3NlcnZlcl9hZGRyZXNzPSVzJyAlIG1ldHJpY3Nfc2VydmVyX2FkZHJlc3MsCi0gICAgICAnLS10b3RhbF9vbmx5PXRydWUnCi0gIF0KLQotICAjIFRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzY3JpcHQgcnVuX2NsaWVudC5weSBhcmUgaW5qZWN0ZWQgaW50byB0aGUgY29udGFpbmVyCi0gICMgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwotICBjbGllbnRfZW52ID0gewotICAgICAgJ1NUUkVTU19URVNUX0lNQUdFX1RZUEUnOiAnQ0xJRU5UJywKLSAgICAgICdTVFJFU1NfVEVTVF9JTUFHRSc6ICcvdmFyL2xvY2FsL2dpdC9ncnBjL2JpbnMvb3B0L3N0cmVzc190ZXN0JywKLSAgICAgICdTVFJFU1NfVEVTVF9BUkdTX1NUUic6ICcgJy5qb2luKHN0cmVzc19jbGllbnRfYXJnX2xpc3QpLAotICAgICAgJ01FVFJJQ1NfQ0xJRU5UX0lNQUdFJzogJy92YXIvbG9jYWwvZ2l0L2dycGMvYmlucy9vcHQvbWV0cmljc19jbGllbnQnLAotICAgICAgJ01FVFJJQ1NfQ0xJRU5UX0FSR1NfU1RSJzogJyAnLmpvaW4obWV0cmljc19jbGllbnRfYXJnX2xpc3QpLAotICAgICAgJ1JVTl9JRCc6IGJxX3NldHRpbmdzLnJ1bl9pZCwKLSAgICAgICdQT0xMX0lOVEVSVkFMX1NFQ1MnOgotICAgICAgICAgIHN0cihzdHJlc3NfY2xpZW50X3NldHRpbmdzLnN0cmVzc19jbGllbnRfcG9sbF9pbnRlcnZhbF9zZWNzKSwKLSAgICAgICdHQ1BfUFJPSkVDVF9JRCc6IGdrZV9zZXR0aW5ncy5wcm9qZWN0X2lkLAotICAgICAgJ0RBVEFTRVRfSUQnOiBicV9zZXR0aW5ncy5kYXRhc2V0X2lkLAotICAgICAgJ1NVTU1BUllfVEFCTEVfSUQnOiBicV9zZXR0aW5ncy5zdW1tYXJ5X3RhYmxlX2lkLAotICAgICAgJ1FQU19UQUJMRV9JRCc6IGJxX3NldHRpbmdzLnFwc190YWJsZV9pZAotICB9Ci0KLSAgZm9yIHBvZF9uYW1lIGluIHN0cmVzc19jbGllbnRfc2V0dGluZ3MuY2xpZW50X3BvZF9uYW1lc19saXN0OgotICAgIGNsaWVudF9lbnZbJ1BPRF9OQU1FJ10gPSBwb2RfbmFtZQotICAgIGlzX3N1Y2Nlc3MgPSBrdWJlcm5ldGVzX2FwaS5jcmVhdGVfcG9kX2FuZF9zZXJ2aWNlKAotICAgICAgICAnbG9jYWxob3N0JywgICMgU2luY2UgcHJveHkgaXMgcnVubmluZyBvbiBsb2NhbGhvc3QKLSAgICAgICAga3ViZXJuZXRlc19wcm94eS5nZXRfcG9ydCgpLAotICAgICAgICAnZGVmYXVsdCcsICAjIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIHBvZF9uYW1lLAotICAgICAgICBna2Vfc2V0dGluZ3MudGFnX25hbWUsCi0gICAgICAgIFtzdHJlc3NfY2xpZW50X3NldHRpbmdzLm1ldHJpY3NfcG9ydAotICAgICAgICBdLCAgIyBDbGllbnQgcG9kcyBleHBvc2UgbWV0cmljcyBwb3J0Ci0gICAgICAgIGNsaWVudF9jbWRfbGlzdCwKLSAgICAgICAgY2xpZW50X2FyZ19saXN0LAotICAgICAgICBjbGllbnRfZW52LAotICAgICAgICBGYWxzZSAgIyBDbGllbnQgaXMgbm90IGEgaGVhZGxlc3Mgc2VydmljZQotICAgICkKLSAgICBpZiBub3QgaXNfc3VjY2VzczoKLSAgICAgIHByaW50ICdFcnJvciBpbiBsYXVuY2hpbmcgY2xpZW50ICVzJyAlIHBvZF9uYW1lCi0gICAgICByZXR1cm4gRmFsc2UKLQotICByZXR1cm4gVHJ1ZQotCi0KLWRlZiBfbGF1bmNoX3NlcnZlcl9hbmRfY2xpZW50KGdrZV9zZXR0aW5ncywgc3RyZXNzX3NlcnZlcl9zZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVzc19jbGllbnRfc2V0dGluZ3MsIGJxX3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3ViZXJuZXRlc19wcm94eV9wb3J0KToKLSAgIyBTdGFydCBrdWJlcm5ldGVzIHByb3h5Ci0gIHByaW50ICdLdWJlcm5ldGVzIHByb3h5JwotICBrdWJlcm5ldGVzX3Byb3h5ID0gS3ViZXJuZXRlc1Byb3h5KGt1YmVybmV0ZXNfcHJveHlfcG9ydCkKLSAga3ViZXJuZXRlc19wcm94eS5zdGFydCgpCi0KLSAgcHJpbnQgJ0xhdW5jaGluZyBzZXJ2ZXIuLicKLSAgaXNfc3VjY2VzcyA9IF9sYXVuY2hfc2VydmVyKGdrZV9zZXR0aW5ncywgc3RyZXNzX3NlcnZlcl9zZXR0aW5ncywgYnFfc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdWJlcm5ldGVzX3Byb3h5KQotICBpZiBub3QgaXNfc3VjY2VzczoKLSAgICBwcmludCAnRXJyb3IgaW4gbGF1bmNoaW5nIHNlcnZlcicKLSAgICByZXR1cm4gRmFsc2UKLQotICAjIFNlcnZlciB0YWtlcyBhIHdoaWxlIHRvIHN0YXJ0LgotICAjIFRPRE8oc3JlZSkgVXNlIEt1YmVybmV0ZXMgQVBJIHRvIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgdGhlIHNlcnZlciBpbnN0ZWFkIG9mCi0gICMgc2xlZXBpbmcKLSAgcHJpbnQgJ1dhaXRpbmcgZm9yICVzIHNlY29uZHMgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQuLi4nICUgX0dLRV9JTUFHRV9XQVJNVVBfV0FJVF9TRUNTCi0gIHRpbWUuc2xlZXAoX0dLRV9JTUFHRV9XQVJNVVBfV0FJVF9TRUNTKQotCi0gICMgTGF1bmNoIGNsaWVudAotICBjbGllbnRfcG9kX25hbWVfcHJlZml4ID0gJ3N0cmVzcy1jbGllbnQnCi0gIGlzX3N1Y2Nlc3MgPSBfbGF1bmNoX2NsaWVudChna2Vfc2V0dGluZ3MsIHN0cmVzc19zZXJ2ZXJfc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlc3NfY2xpZW50X3NldHRpbmdzLCBicV9zZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1YmVybmV0ZXNfcHJveHkpCi0KLSAgaWYgbm90IGlzX3N1Y2Nlc3M6Ci0gICAgcHJpbnQgJ0Vycm9yIGluIGxhdW5jaGluZyBjbGllbnQocyknCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgcHJpbnQgJ1dhaXRpbmcgZm9yICVzIHNlY29uZHMgZm9yIHRoZSBjbGllbnQgaW1hZ2VzIHRvIHN0YXJ0Li4uJyAlIF9HS0VfSU1BR0VfV0FSTVVQX1dBSVRfU0VDUwotICB0aW1lLnNsZWVwKF9HS0VfSU1BR0VfV0FSTVVQX1dBSVRfU0VDUykKLSAgcmV0dXJuIFRydWUKLQotCi1kZWYgX2RlbGV0ZV9zZXJ2ZXJfYW5kX2NsaWVudChzdHJlc3Nfc2VydmVyX3NldHRpbmdzLCBzdHJlc3NfY2xpZW50X3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3ViZXJuZXRlc19wcm94eV9wb3J0KToKLSAga3ViZXJuZXRlc19wcm94eSA9IEt1YmVybmV0ZXNQcm94eShrdWJlcm5ldGVzX3Byb3h5X3BvcnQpCi0gIGt1YmVybmV0ZXNfcHJveHkuc3RhcnQoKQotCi0gICMgRGVsZXRlIGNsaWVudHMgZmlyc3QKLSAgaXNfc3VjY2VzcyA9IFRydWUKLSAgZm9yIHBvZF9uYW1lIGluIHN0cmVzc19jbGllbnRfc2V0dGluZ3MuY2xpZW50X3BvZF9uYW1lc19saXN0OgotICAgIGlzX3N1Y2Nlc3MgPSBrdWJlcm5ldGVzX2FwaS5kZWxldGVfcG9kX2FuZF9zZXJ2aWNlKAotICAgICAgICAnbG9jYWxob3N0Jywga3ViZXJuZXRlc19wcm94eV9wb3J0LCAnZGVmYXVsdCcsIHBvZF9uYW1lKQotICAgIGlmIG5vdCBpc19zdWNjZXNzOgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgIyBEZWxldGUgc2VydmVyCi0gIGlzX3N1Y2Nlc3MgPSBrdWJlcm5ldGVzX2FwaS5kZWxldGVfcG9kX2FuZF9zZXJ2aWNlKAotICAgICAgJ2xvY2FsaG9zdCcsIGt1YmVybmV0ZXNfcHJveHlfcG9ydCwgJ2RlZmF1bHQnLAotICAgICAgc3RyZXNzX3NlcnZlcl9zZXR0aW5ncy5zZXJ2ZXJfcG9kX25hbWUpCi0gIHJldHVybiBpc19zdWNjZXNzCi0KLQotZGVmIHJ1bl90ZXN0X21haW4odGVzdF9zZXR0aW5ncywgZ2tlX3NldHRpbmdzLCBzdHJlc3Nfc2VydmVyX3NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgc3RyZXNzX2NsaWVudF9jbGllbnRzKToKLSAgaXNfc3VjY2VzcyA9IFRydWUKLQotICBpZiB0ZXN0X3NldHRpbmdzLmJ1aWxkX2RvY2tlcl9pbWFnZToKLSAgICBpc19zdWNjZXNzID0gX2J1aWxkX2RvY2tlcl9pbWFnZShna2Vfc2V0dGluZ3MuZG9ja2VyX2ltYWdlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2tlX3NldHRpbmdzLnRhZ19uYW1lKQotICAgIGlmIG5vdCBpc19zdWNjZXNzOgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBpc19zdWNjZXNzID0gX3B1c2hfZG9ja2VyX2ltYWdlX3RvX2drZV9yZWdpc3RyeShna2Vfc2V0dGluZ3MudGFnX25hbWUpCi0gICAgaWYgbm90IGlzX3N1Y2Nlc3M6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICAjIENyZWF0ZSBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBydW4gKE5vdGU6IFVzaW5nIHRpbWVzdGFtcCBpbnN0ZWFkIG9mIFVVSUQgdG8KLSAgIyBtYWtlIGl0IGVhc2llciB0byBkZWR1Y2UgdGhlIGRhdGUvdGltZSBvZiB0aGUgcnVuIGp1c3QgYnkgbG9va2luZyBhdCB0aGUgcnVuCi0gICMgcnVuIGlkLiBUaGlzIGlzIHVzZWZ1bCBpbiBkZWJ1Z2dpbmcgd2hlbiBsb29raW5nIGF0IHJlY29yZHMgaW4gQmlxIHF1ZXJ5KQotICBydW5faWQgPSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVlfJW1fJWRfJUhfJU1fJVMnKQotICBkYXRhc2V0X2lkID0gJyVzXyVzJyAlIChfREFUQVNFVF9JRF9QUkVGSVgsIHJ1bl9pZCkKLQotICAjIEJpZyBRdWVyeSBzZXR0aW5ncyAoY29tbW9uIGZvciBib3RoIFN0cmVzcyBTZXJ2ZXIgYW5kIENsaWVudCkKLSAgYnFfc2V0dGluZ3MgPSBCaWdRdWVyeVNldHRpbmdzKHJ1bl9pZCwgZGF0YXNldF9pZCwgX1NVTU1BUllfVEFCTEVfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUVBTX1RBQkxFX0lEKQotCi0gIGJxX2hlbHBlciA9IEJpZ1F1ZXJ5SGVscGVyKHJ1bl9pZCwgJycsICcnLCBhcmdzLnByb2plY3RfaWQsIGRhdGFzZXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TVU1NQVJZX1RBQkxFX0lELCBfUVBTX1RBQkxFX0lEKQotICBicV9oZWxwZXIuaW5pdGlhbGl6ZSgpCi0KLSAgdHJ5OgotICAgIGlzX3N1Y2Nlc3MgPSBfbGF1bmNoX3NlcnZlcl9hbmRfY2xpZW50KGdrZV9zZXR0aW5ncywgc3RyZXNzX3NlcnZlcl9zZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlc3NfY2xpZW50X3NldHRpbmdzLCBicV9zZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3NldHRpbmdzLmt1YmVybmV0ZXNfcHJveHlfcG9ydCkKLSAgICBpZiBub3QgaXNfc3VjY2VzczoKLSAgICAgIHJldHVybiBGYWxzZQotCi0gICAgc3RhcnRfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCi0gICAgZW5kX3RpbWUgPSBzdGFydF90aW1lICsgZGF0ZXRpbWUudGltZWRlbHRhKAotICAgICAgICBzZWNvbmRzPXRlc3Rfc2V0dGluZ3MudGVzdF9kdXJhdGlvbl9zZWNzKQotICAgIHByaW50ICdSdW5uaW5nIHRoZSB0ZXN0IHVudGlsICVzJyAlIGVuZF90aW1lLmlzb2Zvcm1hdCgpCi0KLSAgICB3aGlsZSBUcnVlOgotICAgICAgaWYgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgPiBlbmRfdGltZToKLSAgICAgICAgcHJpbnQgJ1Rlc3Qgd2FzIHJ1biBmb3IgJWQgc2Vjb25kcycgJSB0ZXN0X3NldHRpbmdzLnRlc3RfZHVyYXRpb25fc2VjcwotICAgICAgICBicmVhawotCi0gICAgICAjIENoZWNrIGlmIGVpdGhlciBzdHJlc3Mgc2VydmVyIG9yIGNsaWVudHMgaGF2ZSBmYWlsZWQKLSAgICAgIGlmIGJxX2hlbHBlci5jaGVja19pZl9hbnlfdGVzdHNfZmFpbGVkKCk6Ci0gICAgICAgIGlzX3N1Y2Nlc3MgPSBGYWxzZQotICAgICAgICBwcmludCAnU29tZSB0ZXN0cyBmYWlsZWQuJwotICAgICAgICBicmVhawotCi0gICAgICAjIFRoaW5ncyBzZWVtIHRvIGJlIHJ1bm5pbmcgZmluZS4gV2FpdCB1bnRpbCBuZXh0IHBvbGwgdGltZSB0byBjaGVjayB0aGUKLSAgICAgICMgc3RhdHVzCi0gICAgICBwcmludCAnU2xlZXBpbmcgZm9yICVkIHNlY29uZHMuLicgJSB0ZXN0X3NldHRpbmdzLnRlc3RfcG9sbF9pbnRlcnZhbF9zZWNzCi0gICAgICB0aW1lLnNsZWVwKHRlc3Rfc2V0dGluZ3MudGVzdF9wb2xsX2ludGVydmFsX3NlY3MpCi0KLSAgICAjIFByaW50IEJpcVF1ZXJ5IHRhYmxlcwotICAgIGJxX2hlbHBlci5wcmludF9zdW1tYXJ5X3JlY29yZHMoKQotICAgIGJxX2hlbHBlci5wcmludF9xcHNfcmVjb3JkcygpCi0KLSAgZmluYWxseToKLSAgICAjIElmIGlzX3N1Y2Nlc3MgaXMgRmFsc2UgYXQgdGhpcyBwb2ludCwgaXQgbWVhbnMgdGhhdCB0aGUgc3RyZXNzIHRlc3RzIHdlcmUKLSAgICAjIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBmYWlsZWQgd2hpbGUgcnVubmluZyB0aGUgdGVzdHMuIEluIHRoaXMgY2FzZSB3ZQotICAgICMgZG8gc2hvdWxkIG5vdCBkZWxldGUgdGhlIHBvZHMgKHNpbmNlIHRoZXkgY29udGFpbiBhbGwgdGhlIGZhaWx1cmUKLSAgICAjIGluZm9ybWF0aW9uKQotICAgIGlmIGlzX3N1Y2Nlc3M6Ci0gICAgICBfZGVsZXRlX3NlcnZlcl9hbmRfY2xpZW50KHN0cmVzc19zZXJ2ZXJfc2V0dGluZ3MsIHN0cmVzc19jbGllbnRfc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2V0dGluZ3Mua3ViZXJuZXRlc19wcm94eV9wb3J0KQotCi0gIHJldHVybiBpc19zdWNjZXNzCi0KLQotYXJncCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAotICAgIGRlc2NyaXB0aW9uPSdMYXVuY2ggc3RyZXNzIHRlc3RzIGluIEdLRScsCi0gICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLkFyZ3VtZW50RGVmYXVsdHNIZWxwRm9ybWF0dGVyKQotYXJncC5hZGRfYXJndW1lbnQoJy0tcHJvamVjdF9pZCcsCi0gICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlLAotICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIEdvb2dsZSBDbG91ZCBQbGF0Zm9ybSBQcm9qZWN0IElkJykKLWFyZ3AuYWRkX2FyZ3VtZW50KCctLW51bV9jbGllbnRzJywKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MSwKLSAgICAgICAgICAgICAgICAgIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgaGVscD0nTnVtYmVyIG9mIGNsaWVudCBpbnN0YW5jZXMgdG8gc3RhcnQnKQotYXJncC5hZGRfYXJndW1lbnQoJy0tZG9ja2VyX2ltYWdlX25hbWUnLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD1fREVGQVVMVF9ET0NLRVJfSU1BR0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBuYW1lIG9mIHRoZSBkb2NrZXIgaW1hZ2UgY29udGFpbmluZyBzdHJlc3MgY2xpZW50ICcKLSAgICAgICAgICAgICAgICAgICdhbmQgc3RyZXNzIHNlcnZlcnMnKQotYXJncC5hZGRfYXJndW1lbnQoJy0tYnVpbGRfZG9ja2VyX2ltYWdlJywKLSAgICAgICAgICAgICAgICAgIGRlc3Q9J2J1aWxkX2RvY2tlcl9pbWFnZScsCi0gICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgaGVscD0nQnVpbGQgYSBkb2NrZXIgaW1hZ2UgYW5kIHB1c2ggdG8gR29vZ2xlIENvbnRhaW5lciAnCi0gICAgICAgICAgICAgICAgICAnUmVnaXN0cnknKQotYXJncC5hZGRfYXJndW1lbnQoJy0tZG9fbm90X2J1aWxkX2RvY2tlcl9pbWFnZScsCi0gICAgICAgICAgICAgICAgICBkZXN0PSdidWlsZF9kb2NrZXJfaW1hZ2UnLAotICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9mYWxzZScsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdEbyBub3QgYnVpbGQgYW5kIHB1c2ggZG9ja2VyIGltYWdlIHRvIEdvb2dsZSBDb250YWluZXIgJwotICAgICAgICAgICAgICAgICAgJ1JlZ2lzdHJ5JykKLWFyZ3Auc2V0X2RlZmF1bHRzKGJ1aWxkX2RvY2tlcl9pbWFnZT1UcnVlKQotCi1hcmdwLmFkZF9hcmd1bWVudCgnLS10ZXN0X3BvbGxfaW50ZXJ2YWxfc2VjcycsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PV9ERUZBVUxUX1RFU1RfUE9MTF9JTlRFUlZBTF9TRUNTLAotICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdIb3cgZnJlcXVlbnRseSBzaG91bGQgdGhpcyBzY3JpcHQgc2hvdWxkIG1vbml0b3IgdGhlICcKLSAgICAgICAgICAgICAgICAgICdoZWFsdGggb2Ygc3RyZXNzIGNsaWVudHMgYW5kIHNlcnZlcnMgcnVubmluZyBpbiB0aGUgR0tFICcKLSAgICAgICAgICAgICAgICAgICdjbHVzdGVyJykKLWFyZ3AuYWRkX2FyZ3VtZW50KCctLXRlc3RfZHVyYXRpb25fc2VjcycsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PV9ERUZBVUxUX1RFU1RfRFVSQVRJT05fU0VDUywKLSAgICAgICAgICAgICAgICAgIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgaGVscD0nSG93IGxvbmcgc2hvdWxkIHRoaXMgdGVzdCBiZSBydW4nKQotYXJncC5hZGRfYXJndW1lbnQoJy0ta3ViZXJuZXRlc19wcm94eV9wb3J0JywKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9X0RFRkFVTFRfS1VCRVJORVRFU19QUk9YWV9QT1JULAotICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcG9ydCBvbiB3aGljaCB0aGUga3ViZXJuZXRlcyBwcm94eSAob24gbG9jYWxob3N0KScKLSAgICAgICAgICAgICAgICAgICcgaXMgc3RhcnRlZCcpCi1hcmdwLmFkZF9hcmd1bWVudCgnLS1zdHJlc3Nfc2VydmVyX3BvcnQnLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD1fREVGQVVMVF9TVFJFU1NfU0VSVkVSX1BPUlQsCi0gICAgICAgICAgICAgICAgICB0eXBlPWludCwKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBwb3J0IG9uIHdoaWNoIHRoZSBzdHJlc3Mgc2VydmVyIChpbiBHS0UgJwotICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lcnMpIGxpc3RlbnMnKQotYXJncC5hZGRfYXJndW1lbnQoJy0tc3RyZXNzX2NsaWVudF9tZXRyaWNzX3BvcnQnLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD1fREVGQVVMVF9NRVRSSUNTX1BPUlQsCi0gICAgICAgICAgICAgICAgICB0eXBlPWludCwKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBwb3J0IG9uIHdoaWNoIHRoZSBzdHJlc3MgY2xpZW50cyAoaW4gR0tFICcKLSAgICAgICAgICAgICAgICAgICdjb250YWluZXJzKSBleHBvc2UgbWV0cmljcycpCi1hcmdwLmFkZF9hcmd1bWVudCgnLS1zdHJlc3NfY2xpZW50X3BvbGxfaW50ZXJ2YWxfc2VjcycsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PV9ERUZBVUxUX1NUUkVTU19DTElFTlRfUE9MTF9JTlRFUlZBTF9TRUNTLAotICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdIb3cgZnJlcXVlbnRseSBzaG91bGQgdGhlIHN0cmVzcyBjbGllbnQgd3JhcHBlciBzY3JpcHQnCi0gICAgICAgICAgICAgICAgICAnIHJ1bm5pbmcgaW5zaWRlIEdLRSBzaG91bGQgbW9uaXRvciBoZWFsdGggb2YgdGhlIGFjdHVhbCAnCi0gICAgICAgICAgICAgICAgICAnIHN0cmVzcyBjbGllbnQgcHJvY2VzcyBhbmQgdXBsb2FkIHRoZSBtZXRyaWNzIHRvIEJpZ1F1ZXJ5JykKLWFyZ3AuYWRkX2FyZ3VtZW50KCctLXN0cmVzc19jbGllbnRfbWV0cmljc19jb2xsZWN0aW9uX2ludGVydmFsX3NlY3MnLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD1fREVGQVVMVF9NRVRSSUNTX0NPTExFQ1RJT05fSU5URVJWQUxfU0VDUywKLSAgICAgICAgICAgICAgICAgIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgaGVscD0nSG93IGZyZXF1ZW50bHkgc2hvdWxkIG1ldHJpY3MgYmUgY29sbGVjdGVkIGluLW1lbW9yeSBvbicKLSAgICAgICAgICAgICAgICAgICcgdGhlIHN0cmVzcyBjbGllbnRzIChydW5uaW5nIGluc2lkZSBHS0UgY29udGFpbmVycykuIE5vdGUgJwotICAgICAgICAgICAgICAgICAgJ3RoYXQgdGhpcyBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIHVwbG9hZC10by1CaWdRdWVyeSAnCi0gICAgICAgICAgICAgICAgICAnZnJlcXVlbmN5LiBUaGUgbWV0cmljcyB1cGxvYWQgZnJlcXVlbmN5IGlzIGNvbnRyb2xsZWQgYnkgdGhlJwotICAgICAgICAgICAgICAgICAgJyAtLXN0cmVzc19jbGllbnRfcG9sbF9pbnRlcnZhbF9zZWNzIGZsYWcnKQotYXJncC5hZGRfYXJndW1lbnQoJy0tc3RyZXNzX2NsaWVudF9udW1fY2hhbm5lbHNfcGVyX3NlcnZlcicsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PV9ERUZBVUxUX05VTV9DSEFOTkVMU19QRVJfU0VSVkVSLAotICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGNyZWF0ZWQgdG8gZWFjaCBzZXJ2ZXIgZnJvbSBhICcKLSAgICAgICAgICAgICAgICAgICdzdHJlc3MgY2xpZW50JykKLWFyZ3AuYWRkX2FyZ3VtZW50KCctLXN0cmVzc19jbGllbnRfbnVtX3N0dWJzX3Blcl9jaGFubmVsJywKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9X0RFRkFVTFRfTlVNX1NUVUJTX1BFUl9DSEFOTkVMLAotICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgbnVtYmVyIG9mIHN0dWJzIGNyZWF0ZWQgcGVyIGNoYW5uZWwuIFRoaXMgbnVtYmVyICcKLSAgICAgICAgICAgICAgICAgICdpbmRpY2F0ZXMgdGhlIG1heCBudW1iZXIgb2YgUlBDcyB0aGF0IGNhbiBiZSBtYWRlIGluICcKLSAgICAgICAgICAgICAgICAgICdwYXJhbGxlbCBvbiBlYWNoIGNoYW5uZWwgYXQgYW55IGdpdmVuIHRpbWUnKQotYXJncC5hZGRfYXJndW1lbnQoJy0tc3RyZXNzX2NsaWVudF90ZXN0X2Nhc2VzJywKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9X0RFRkFVTFRfVEVTVF9DQVNFU19TVFIsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdMaXN0IG9mIHRlc3QgY2FzZXMgKHdpdGggd2VpZ2h0cykgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlJwotICAgICAgICAgICAgICAgICAgJyBzdHJlc3MgdGVzdCBjbGllbnQuIFRoZSBsaXN0IGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuJwotICAgICAgICAgICAgICAgICAgJyAgPHRlc3RjYXNlXzE6d18xLDx0ZXN0X2Nhc2UyOndfMj4uLjx0ZXN0Y2FzZV9uOndfbj5cbicKLSAgICAgICAgICAgICAgICAgICcgKE5vdGU6IFRoZSB3ZWlnaHRzIGRvIG5vdCBoYXZlIHRvIGFkZCB1cCB0byAxMDApJykKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgYXJncyA9IGFyZ3AucGFyc2VfYXJncygpCi0KLSAgdGVzdF9zZXR0aW5ncyA9IFRlc3RTZXR0aW5ncygKLSAgICAgIGFyZ3MuYnVpbGRfZG9ja2VyX2ltYWdlLCBhcmdzLnRlc3RfcG9sbF9pbnRlcnZhbF9zZWNzLAotICAgICAgYXJncy50ZXN0X2R1cmF0aW9uX3NlY3MsIGFyZ3Mua3ViZXJuZXRlc19wcm94eV9wb3J0KQotCi0gIGdrZV9zZXR0aW5ncyA9IEdrZVNldHRpbmdzKGFyZ3MucHJvamVjdF9pZCwgYXJncy5kb2NrZXJfaW1hZ2VfbmFtZSkKLQotICBzdHJlc3Nfc2VydmVyX3NldHRpbmdzID0gU3RyZXNzU2VydmVyU2V0dGluZ3MoX1NFUlZFUl9QT0RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RyZXNzX3NlcnZlcl9wb3J0KQotICBzdHJlc3NfY2xpZW50X3NldHRpbmdzID0gU3RyZXNzQ2xpZW50U2V0dGluZ3MoCi0gICAgICBhcmdzLm51bV9jbGllbnRzLCBfQ0xJRU5UX1BPRF9OQU1FX1BSRUZJWCwgX1NFUlZFUl9QT0RfTkFNRSwKLSAgICAgIGFyZ3Muc3RyZXNzX3NlcnZlcl9wb3J0LCBhcmdzLnN0cmVzc19jbGllbnRfbWV0cmljc19wb3J0LAotICAgICAgYXJncy5zdHJlc3NfY2xpZW50X21ldHJpY3NfY29sbGVjdGlvbl9pbnRlcnZhbF9zZWNzLAotICAgICAgYXJncy5zdHJlc3NfY2xpZW50X3BvbGxfaW50ZXJ2YWxfc2VjcywKLSAgICAgIGFyZ3Muc3RyZXNzX2NsaWVudF9udW1fY2hhbm5lbHNfcGVyX3NlcnZlciwKLSAgICAgIGFyZ3Muc3RyZXNzX2NsaWVudF9udW1fc3R1YnNfcGVyX2NoYW5uZWwsIGFyZ3Muc3RyZXNzX2NsaWVudF90ZXN0X2Nhc2VzKQotCi0gIHJ1bl90ZXN0X21haW4odGVzdF9zZXR0aW5ncywgZ2tlX3NldHRpbmdzLCBzdHJlc3Nfc2VydmVyX3NldHRpbmdzLAotICAgICAgICAgICAgICAgIHN0cmVzc19jbGllbnRfc2V0dGluZ3MpCmRpZmYgLS1naXQgYS92c3Byb2plY3RzL2J1aWxkX3ZzMjAxMC5iYXQgYi92c3Byb2plY3RzL2J1aWxkX3ZzMjAxMC5iYXQKaW5kZXggNjRiMGVkNS4uMWJjM2M4NiAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy9idWlsZF92czIwMTAuYmF0CisrKyBiL3ZzcHJvamVjdHMvYnVpbGRfdnMyMDEwLmJhdApAQCAtMSw1ICsxLDUgQEAKIEByZW0gQ29udmVuaWVuY2Ugd3JhcHBlciB0aGF0IHJ1bnMgc3BlY2lmaWVkIGdSUEMgdGFyZ2V0IHVzaW5nIG1zYnVpbGQKLUByZW0gVXNhZ2U6IGJ1aWxkLmJhdCBUQVJHRVRfTkFNRQorQHJlbSBVc2FnZTogYnVpbGRfdnMyMDEwLmJhdCBUQVJHRVRfTkFNRQogCiBzZXRsb2NhbAogQHJlbSBTZXQgVlMgdmFyaWFibGVzICh1c2VzIFZpc3VhbCBTdHVkaW8gMjAxMCkKZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvYnVpbGRfdnMyMDEzLmJhdCBiL3ZzcHJvamVjdHMvYnVpbGRfdnMyMDEzLmJhdAppbmRleCBiZTNjYWE5Li44MmMwYTNhIDEwMDY0NAotLS0gYS92c3Byb2plY3RzL2J1aWxkX3ZzMjAxMy5iYXQKKysrIGIvdnNwcm9qZWN0cy9idWlsZF92czIwMTMuYmF0CkBAIC0xLDUgKzEsNSBAQAogQHJlbSBDb252ZW5pZW5jZSB3cmFwcGVyIHRoYXQgcnVucyBzcGVjaWZpZWQgZ1JQQyB0YXJnZXQgdXNpbmcgbXNidWlsZAotQHJlbSBVc2FnZTogYnVpbGQuYmF0IFRBUkdFVF9OQU1FCitAcmVtIFVzYWdlOiBidWlsZF92czIwMTMuYmF0IFRBUkdFVF9OQU1FCiAKIHNldGxvY2FsCiBAcmVtIFNldCBWUyB2YXJpYWJsZXMgKHVzZXMgVmlzdWFsIFN0dWRpbyAyMDEzKQpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy9idWlsZF92czIwMTUuYmF0IGIvdnNwcm9qZWN0cy9idWlsZF92czIwMTUuYmF0CmluZGV4IDUwNDg1YTMuLmM2ZTFiNDMgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvYnVpbGRfdnMyMDE1LmJhdAorKysgYi92c3Byb2plY3RzL2J1aWxkX3ZzMjAxNS5iYXQKQEAgLTEsNSArMSw1IEBACiBAcmVtIENvbnZlbmllbmNlIHdyYXBwZXIgdGhhdCBydW5zIHNwZWNpZmllZCBnUlBDIHRhcmdldCB1c2luZyBtc2J1aWxkCi1AcmVtIFVzYWdlOiBidWlsZC5iYXQgVEFSR0VUX05BTUUKK0ByZW0gVXNhZ2U6IGJ1aWxkX3ZzMjAxNS5iYXQgVEFSR0VUX05BTUUKIAogc2V0bG9jYWwKIEByZW0gU2V0IFZTIHZhcmlhYmxlcyAodXNlcyBWaXN1YWwgU3R1ZGlvIDIwMTUpCmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovZ3ByL2dwci52Y3hwcm9qIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dwci9ncHIudmN4cHJvagppbmRleCA5MjgxZmEzLi44NzAyNDZjIDEwMDY0NAotLS0gYS92c3Byb2plY3RzL3ZjeHByb2ovZ3ByL2dwci52Y3hwcm9qCisrKyBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncHIvZ3ByLnZjeHByb2oKQEAgLTE0Nyw2ICsxNDcsMjAgQEAKICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogCiAgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGFsbG9jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX2F0b21pYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX3N5bmMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtX3dpbjMyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGxvZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxwb3J0X3BsYXRmb3JtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlX2J1ZmZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfZ2VuZXJpYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfd2luMzIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cdGltZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXHN1cHBvcnRcYWxsb2MuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xzdXBwb3J0XGF0bS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXHN1cHBvcnRcYXRtX2djY19hdG9taWMuaCIgLz4KQEAgLTE3NSwxMjMgKzE4OSwxMDkgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xzdXBwb3J0XHRsc19tc3ZjLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3VwcG9ydFx0bHNfcHRocmVhZC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXHN1cHBvcnRcdXNlZnVsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGFsbG9jLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX2F0b21pYy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX3N5bmMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtX3dpbjMyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGxvZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxwb3J0X3BsYXRmb3JtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlX2J1ZmZlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfZ2VuZXJpYy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jX3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfd2luMzIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cdGltZS5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHByb2ZpbGluZ1x0aW1lcnMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcYmFja29mZi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxibG9ja19hbm5vdGF0ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxlbnYuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbG9hZF9maWxlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XG11cm11cl9oYXNoLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHN0YWNrX2xvY2tmcmVlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHN0cmluZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdHJpbmdfd2luMzIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGhkX2ludGVybmFsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRpbWVfcHJlY2lzZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFx0bXBmaWxlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvZmlsaW5nXHRpbWVycy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcYmFja29mZi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcYmxvY2tfYW5ub3RhdGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGVudi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcbG9hZF9maWxlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxtdXJtdXJfaGFzaC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3RhY2tfbG9ja2ZyZWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0cmluZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3RyaW5nX3dpbjMyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx0aGRfaW50ZXJuYWwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRpbWVfcHJlY2lzZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdG1wZmlsZS5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHByb2ZpbGluZ1xiYXNpY190aW1lcnMuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvZmlsaW5nXGJhc2ljX3RpbWVycy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHByb2ZpbGluZ1xzdGFwX3RpbWVycy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxwcm9maWxpbmdcc3RhcF90aW1lcnMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGFsbG9jLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcYWxsb2MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGF2bC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGF2bC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcYmFja29mZi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGJhY2tvZmYuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGNtZGxpbmUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxjbWRsaW5lLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxjcHVfaXBob25lLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY3B1X2lwaG9uZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcY3B1X2xpbnV4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY3B1X2xpbnV4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxjcHVfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxjcHVfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGNwdV93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY3B1X3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGVudl9saW51eC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGVudl9saW51eC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcZW52X3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcZW52X3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxlbnZfd2luMzIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxlbnZfd2luMzIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGhpc3RvZ3JhbS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGhpc3RvZ3JhbS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcaG9zdF9wb3J0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcaG9zdF9wb3J0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxsb2FkX2ZpbGUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxsb2FkX2ZpbGUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGxvZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGxvZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbG9nX2FuZHJvaWQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxsb2dfYW5kcm9pZC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbG9nX2xpbnV4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcbG9nX2xpbnV4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxsb2dfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxsb2dfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGxvZ193aW4zMi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGxvZ193aW4zMi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbXVybXVyX2hhc2guYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxtdXJtdXJfaGFzaC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc2xpY2UuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxzbGljZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc2xpY2VfYnVmZmVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc2xpY2VfYnVmZmVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdGFja19sb2NrZnJlZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0YWNrX2xvY2tmcmVlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdHJpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxzdHJpbmcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHN0cmluZ19wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0cmluZ19wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3RyaW5nX3dpbjMyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3RyaW5nX3dpbjMyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdWJwcm9jZXNzX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3VicHJvY2Vzc19wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3VicHJvY2Vzc193aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3VicHJvY2Vzc193aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzeW5jLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3luYy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3luY19wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN5bmNfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHN5bmNfd2luMzIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxzeW5jX3dpbjMyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFx0aGQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx0aGQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRoZF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRoZF9wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGhkX3dpbjMyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGhkX3dpbjMyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFx0aW1lLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGltZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGltZV9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRpbWVfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRpbWVfcHJlY2lzZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRpbWVfcHJlY2lzZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGltZV93aW4zMi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRpbWVfd2luMzIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRsc19wdGhyZWFkLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGxzX3B0aHJlYWQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRtcGZpbGVfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx0bXBmaWxlX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFx0bXBmaWxlX3dpbjMyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdG1wZmlsZV93aW4zMi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcd3JhcF9tZW1jcHkuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx3cmFwX21lbWNweS5jIj4KICAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovZ3ByL2dwci52Y3hwcm9qLmZpbHRlcnMgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3ByL2dwci52Y3hwcm9qLmZpbHRlcnMKaW5kZXggYjg1MDYwZi4uYjkzMjQyMCAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dwci9ncHIudmN4cHJvai5maWx0ZXJzCisrKyBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncHIvZ3ByLnZjeHByb2ouZmlsdGVycwpAQCAtMSwxNDAgKzEsMTgyIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVccHJvZmlsaW5nXGJhc2ljX3RpbWVycy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVccHJvZmlsaW5nPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvZmlsaW5nXGJhc2ljX3RpbWVycy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHByb2ZpbGluZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVccHJvZmlsaW5nXHN0YXBfdGltZXJzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxwcm9maWxpbmc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxwcm9maWxpbmdcc3RhcF90aW1lcnMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxwcm9maWxpbmc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcYWxsb2MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGFsbG9jLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxhdmwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGF2bC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcYmFja29mZi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcYmFja29mZi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcY21kbGluZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY21kbGluZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcY3B1X2lwaG9uZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY3B1X2lwaG9uZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcY3B1X2xpbnV4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxjcHVfbGludXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGNwdV9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY3B1X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxjcHVfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcY3B1X3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGVudl9saW51eC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcZW52X2xpbnV4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxlbnZfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGVudl9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcZW52X3dpbjMyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxlbnZfd2luMzIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGhpc3RvZ3JhbS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcaGlzdG9ncmFtLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxob3N0X3BvcnQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGhvc3RfcG9ydC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbG9hZF9maWxlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxsb2FkX2ZpbGUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGxvZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcbG9nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxsb2dfYW5kcm9pZC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcbG9nX2FuZHJvaWQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XGxvZ19saW51eC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcbG9nX2xpbnV4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxsb2dfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGxvZ19wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbG9nX3dpbjMyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxsb2dfd2luMzIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XG11cm11cl9oYXNoLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxtdXJtdXJfaGFzaC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc2xpY2UuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHNsaWNlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzbGljZV9idWZmZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHNsaWNlX2J1ZmZlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3RhY2tfbG9ja2ZyZWUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0YWNrX2xvY2tmcmVlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdHJpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0cmluZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3RyaW5nX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxzdHJpbmdfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHN0cmluZ193aW4zMi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3RyaW5nX3dpbjMyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdWJwcm9jZXNzX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxzdWJwcm9jZXNzX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdWJwcm9jZXNzX3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN1YnByb2Nlc3Nfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3luYy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3luYy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3luY19wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3luY19wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3luY193aW4zMi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcc3luY193aW4zMi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGhkLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx0aGQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRoZF9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGhkX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFx0aGRfd2luMzIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRoZF93aW4zMi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGltZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGltZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGltZV9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGltZV9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdGltZV9wcmVjaXNlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx0aW1lX3ByZWNpc2UuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRpbWVfd2luMzIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRpbWVfd2luMzIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRsc19wdGhyZWFkLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFx0bHNfcHRocmVhZC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdG1wZmlsZV9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdG1wZmlsZV9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdG1wZmlsZV93aW4zMi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdG1wZmlsZV93aW4zMi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcd3JhcF9tZW1jcHkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHdyYXBfbWVtY3B5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYWxsb2MuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2NfYXRvbWljLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2Nfc3luYy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fd2luMzIuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cbG9nLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHBvcnRfcGxhdGZvcm0uaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2UuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2VfYnVmZmVyLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY19nZW5lcmljLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY193aW4zMi5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblx0aW1lLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3VwcG9ydFxhbGxvYy5oIj4KICAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTIxOSw4NSArMjYxLDQzIEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3VwcG9ydFx1c2VmdWwuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGFsbG9jLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX2F0b21pYy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX3N5bmMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtX3dpbjMyLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGxvZy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxwb3J0X3BsYXRmb3JtLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlX2J1ZmZlci5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfZ2VuZXJpYy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jX3Bvc2l4LmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfd2luMzIuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cdGltZS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHByb2ZpbGluZ1x0aW1lcnMuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHByb2ZpbGluZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHByb2ZpbGluZ1x0aW1lcnMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxwcm9maWxpbmc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcYmFja29mZi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcYmFja29mZi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcYmxvY2tfYW5ub3RhdGUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGJsb2NrX2Fubm90YXRlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxlbnYuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XGVudi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcbG9hZF9maWxlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxsb2FkX2ZpbGUuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XG11cm11cl9oYXNoLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxtdXJtdXJfaGFzaC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3RhY2tfbG9ja2ZyZWUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0YWNrX2xvY2tmcmVlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFxzdHJpbmcuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHN0cmluZy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcc3RyaW5nX3dpbjMyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXBwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VwcG9ydFxzdHJpbmdfd2luMzIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXBwb3J0XHRoZF9pbnRlcm5hbC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdGhkX2ludGVybmFsLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VwcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VwcG9ydFx0aW1lX3ByZWNpc2UuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cHBvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXBwb3J0XHRpbWVfcHJlY2lzZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cHBvcnRcdG1wZmlsZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VwcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cHBvcnRcdG1wZmlsZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgPC9JdGVtR3JvdXA+CiAKQEAgLTMyMywxMSArMzIzLDE0IEBACiAgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZSI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzVlMWJhYTctZGU3Ny1iZWIxLTk2NzUtOTQyMjYxNjQ4Zjc5fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHByb2ZpbGluZyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTNiNzA4NmMtOGM4YS02YmJmLWZiMTQtMWYxNjZiZjAxNDZhfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYiI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NTIwMzdiY2ItNTcxOS1hNTQ4LTIyNGQtODM0ZmJlNTY5MDQ1fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHN1cHBvcnQiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2JiMTE2ZjJhLWVhMmEtYzIzMy04MmRhLTBjNTRlM2NiZmVjMX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJccHJvZmlsaW5nIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiYTM4ZDc5ZC1kNWRlLWE4OWUtOWNhMi1jNTIzNWEwM2NhN2Z9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHN1cHBvcnQiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2E0ODEyMTU4LTdmYmEtOTU5ZS00ZTA5LTUwMTY3ZmUzOGRmOH08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+CiAgIDwvSXRlbUdyb3VwPgogPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrKy9ncnBjKysudmN4cHJvaiBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKysvZ3JwYysrLnZjeHByb2oKaW5kZXggZDI5ZTY4OS4uMmM2NDQyMSAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrKy9ncnBjKysudmN4cHJvagorKysgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrL2dycGMrKy52Y3hwcm9qCkBAIC0yNjgsNiArMjY4LDM3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xncnBjKysuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY2FsbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjbGllbnRfdW5hcnlfY2FsbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3N0cmVhbS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3VuYXJ5X2NhbGwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjYWxsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2FsbF9ob29rLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2hhbm5lbF9pbnRlcmZhY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfY29udGV4dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF91bmFyeV9jYWxsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbXBsZXRpb25fcXVldWVfdGFnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnX3Byb3RvYnVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGdycGNfbGlicmFyeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXG1ldGhvZF9oYW5kbGVyX2ltcGwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxwcm90b191dGlscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHJwY19tZXRob2QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfc2VydmljZV9tZXRob2QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZWN1cml0eVxhdXRoX2NvbnRleHQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJpYWxpemF0aW9uX3RyYWl0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZlcl9jb250ZXh0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmVyX2ludGVyZmFjZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZpY2VfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1c19jb2RlX2VudW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzdHJpbmdfcmVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3R1Yl9vcHRpb25zLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN5bmNfY3h4MTEuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19zdHJlYW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblx0aW1lLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGdycGNfbGlicmFyeS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxtZXRob2RfaGFuZGxlcl9pbXBsLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXHByb3RvX3V0aWxzLmgiIC8+CkBAIC0zMDIsNjIgKzMzMywxOCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcc3VwcG9ydFxzdHViX29wdGlvbnMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXHN1cHBvcnRcc3luY19zdHJlYW0uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXHN1cHBvcnRcdGltZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3N0cmVhbS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3VuYXJ5X2NhbGwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjYWxsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2FsbF9ob29rLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2hhbm5lbF9pbnRlcmZhY2UuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfY29udGV4dC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF91bmFyeV9jYWxsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbXBsZXRpb25fcXVldWVfdGFnLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnX3Byb3RvYnVmLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGdycGNfbGlicmFyeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXG1ldGhvZF9oYW5kbGVyX2ltcGwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxwcm90b191dGlscy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHJwY19tZXRob2QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfc2VydmljZV9tZXRob2QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZWN1cml0eVxhdXRoX2NvbnRleHQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJpYWxpemF0aW9uX3RyYWl0cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZlcl9jb250ZXh0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmVyX2ludGVyZmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZpY2VfdHlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1c19jb2RlX2VudW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzdHJpbmdfcmVmLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3R1Yl9vcHRpb25zLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luYy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN5bmNfY3h4MTEuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19zdHJlYW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblx0aW1lLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcY3JlYXRlX2NoYW5uZWxfaW50ZXJuYWwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XHNlY3VyZV9jcmVkZW50aWFscy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cY29yZV9jb2RlZ2VuLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfYXV0aF9jb250ZXh0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxzZWN1cmVfc2VydmVyX2NyZWRlbnRpYWxzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNsaWVudFxjcmVhdGVfY2hhbm5lbF9pbnRlcm5hbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cY29yZV9jb2RlZ2VuLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxjcmVhdGVfYXV0aF9jb250ZXh0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfYXV0aF9jb250ZXh0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxkeW5hbWljX3RocmVhZF9wb29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxzZWN1cmVfc2VydmVyX2NyZWRlbnRpYWxzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclx0aHJlYWRfcG9vbF9pbnRlcmZhY2UuaCIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNsaWVudFxzZWN1cmVfY3JlZGVudGlhbHMuY2MiPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cYXV0aF9wcm9wZXJ0eV9pdGVyYXRvci5jYyI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfYXV0aF9jb250ZXh0LmNjIj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHNlY3VyZV9jaGFubmVsX2FyZ3VtZW50cy5jYyI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxzZWN1cmVfc2VydmVyX2NyZWRlbnRpYWxzLmNjIj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGNoYW5uZWwuY2MiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcY2xpZW50X2NvbnRleHQuY2MiPgpAQCAtMzcyLDYgKzM1OSwxMiBAQAogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcaW5zZWN1cmVfY3JlZGVudGlhbHMuY2MiPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcc2VjdXJlX2NyZWRlbnRpYWxzLmNjIj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cYXV0aF9wcm9wZXJ0eV9pdGVyYXRvci5jYyI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxjaGFubmVsX2FyZ3VtZW50cy5jYyI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxjb21wbGV0aW9uX3F1ZXVlLmNjIj4KQEAgLTM4MCw2ICszNzMsMTIgQEAKICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHJwY19tZXRob2QuY2MiPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cc2VjdXJlX2F1dGhfY29udGV4dC5jYyI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfY2hhbm5lbF9hcmd1bWVudHMuY2MiPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cc2VjdXJlX2NyZWF0ZV9hdXRoX2NvbnRleHQuY2MiPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxzZXJ2ZXJcYXN5bmNfZ2VuZXJpY19zZXJ2aWNlLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcc2VydmVyXGNyZWF0ZV9kZWZhdWx0X3RocmVhZF9wb29sLmNjIj4KQEAgLTM4OCw2ICszODcsOCBAQAogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxzZXJ2ZXJcaW5zZWN1cmVfc2VydmVyX2NyZWRlbnRpYWxzLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcc2VydmVyXHNlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MiPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxzZXJ2ZXJcc2VydmVyLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcc2VydmVyXHNlcnZlcl9idWlsZGVyLmNjIj4KQEAgLTQwNiw4ICs0MDcsNiBAQAogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFx1dGlsXHRpbWUuY2MiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb2RlZ2VuXGNvZGVnZW5faW5pdC5jYyI+Ci0gICAgPC9DbENvbXBpbGU+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHZzcHJvamVjdHNcdmN4cHJvalwuXGdycGNcZ3JwYy52Y3hwcm9qIj4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKysvZ3JwYysrLnZjeHByb2ouZmlsdGVycyBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKysvZ3JwYysrLnZjeHByb2ouZmlsdGVycwppbmRleCBjOWIzYmI5Li4zNTQ2OGVhIDEwMDY0NAotLS0gYS92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrL2dycGMrKy52Y3hwcm9qLmZpbHRlcnMKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrKy9ncnBjKysudmN4cHJvai5maWx0ZXJzCkBAIC0xLDI0ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNsaWVudFxzZWN1cmVfY3JlZGVudGlhbHMuY2MiPgotICAgICAgPEZpbHRlcj5zcmNcY3BwXGNsaWVudDwvRmlsdGVyPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cYXV0aF9wcm9wZXJ0eV9pdGVyYXRvci5jYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfYXV0aF9jb250ZXh0LmNjIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHNlY3VyZV9jaGFubmVsX2FyZ3VtZW50cy5jYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxzZWN1cmVfc2VydmVyX2NyZWRlbnRpYWxzLmNjIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNwcFxzZXJ2ZXI8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGNoYW5uZWwuY2MiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXGNsaWVudDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtNDAsNiArMjIsMTUgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGluc2VjdXJlX2NyZWRlbnRpYWxzLmNjIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjbGllbnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XHNlY3VyZV9jcmVkZW50aWFscy5jYyI+CisgICAgICA8RmlsdGVyPnNyY1xjcHBcY2xpZW50PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvZGVnZW5cY29kZWdlbl9pbml0LmNjIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxhdXRoX3Byb3BlcnR5X2l0ZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXGNoYW5uZWxfYXJndW1lbnRzLmNjIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTUyLDYgKzQzLDE1IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxycGNfbWV0aG9kLmNjIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHNlY3VyZV9hdXRoX2NvbnRleHQuY2MiPgorICAgICAgPEZpbHRlcj5zcmNcY3BwXGNvbW1vbjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cc2VjdXJlX2NoYW5uZWxfYXJndW1lbnRzLmNjIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHNlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcc2VydmVyXGFzeW5jX2dlbmVyaWNfc2VydmljZS5jYyI+CiAgICAgICA8RmlsdGVyPnNyY1xjcHBcc2VydmVyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC02NCw2ICs2NCw5IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxpbnNlY3VyZV9zZXJ2ZXJfY3JlZGVudGlhbHMuY2MiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXHNlcnZlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxzZXJ2ZXJcc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5jYyI+CisgICAgICA8RmlsdGVyPnNyY1xjcHBcc2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxzZXJ2ZXIuY2MiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXHNlcnZlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtOTEsOSArOTQsNiBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFx1dGlsXHRpbWUuY2MiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXHV0aWw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgotICAgICAgPEZpbHRlcj5zcmNcY3BwXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xhbGFybS5oIj4KQEAgLTEyNiw2ICsxMjYsOTkgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY2xpZW50X3VuYXJ5X2NhbGwuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxhc3luY19zdHJlYW0uaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3VuYXJ5X2NhbGwuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGwuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGxfaG9vay5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2hhbm5lbF9pbnRlcmZhY2UuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF9jb250ZXh0LmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfdW5hcnlfY2FsbC5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZV90YWcuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnX3Byb3RvYnVmLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb3JlX2NvZGVnZW5faW50ZXJmYWNlLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxncnBjX2xpYnJhcnkuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXG1ldGhvZF9oYW5kbGVyX2ltcGwuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHByb3RvX3V0aWxzLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfbWV0aG9kLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfc2VydmljZV9tZXRob2QuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5XGF1dGhfY29udGV4dC5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VyaWFsaXphdGlvbl90cmFpdHMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZlcl9jb250ZXh0LmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2ZXJfaW50ZXJmYWNlLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2aWNlX3R5cGUuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RhdHVzX2NvZGVfZW51bS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RyaW5nX3JlZi5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3R1Yl9vcHRpb25zLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX2N4eDExLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX3N0cmVhbS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cdGltZS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGdycGNfbGlicmFyeS5oIj4KICAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtMjI4LDExNCArMzIxLDEyIEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xzdXBwb3J0XHRpbWUuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXHN1cHBvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxhc3luY19zdHJlYW0uaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3VuYXJ5X2NhbGwuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGwuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGxfaG9vay5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2hhbm5lbF9pbnRlcmZhY2UuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF9jb250ZXh0LmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfdW5hcnlfY2FsbC5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZV90YWcuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbmZpZy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnX3Byb3RvYnVmLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb3JlX2NvZGVnZW5faW50ZXJmYWNlLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxncnBjX2xpYnJhcnkuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXG1ldGhvZF9oYW5kbGVyX2ltcGwuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHByb3RvX3V0aWxzLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfbWV0aG9kLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfc2VydmljZV9tZXRob2QuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5XGF1dGhfY29udGV4dC5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5PC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VyaWFsaXphdGlvbl90cmFpdHMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZlcl9jb250ZXh0LmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2ZXJfaW50ZXJmYWNlLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2aWNlX3R5cGUuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RhdHVzX2NvZGVfZW51bS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RyaW5nX3JlZi5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3R1Yl9vcHRpb25zLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX2N4eDExLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX3N0cmVhbS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cdGltZS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcc2VjdXJlX2NyZWRlbnRpYWxzLmgiPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcY3JlYXRlX2NoYW5uZWxfaW50ZXJuYWwuaCI+CiAgICAgICA8RmlsdGVyPnNyY1xjcHBcY2xpZW50PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxjb3JlX2NvZGVnZW4uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxzZWN1cmVfYXV0aF9jb250ZXh0LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY3BwXGNvbW1vbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxzZXJ2ZXJcc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNwcFxzZXJ2ZXI8L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGNyZWF0ZV9jaGFubmVsX2ludGVybmFsLmgiPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcc2VjdXJlX2NyZWRlbnRpYWxzLmgiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXGNsaWVudDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cY29yZV9jb2RlZ2VuLmgiPgpAQCAtMzQ0LDkgKzMzNSwxNSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cY3JlYXRlX2F1dGhfY29udGV4dC5oIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHNlY3VyZV9hdXRoX2NvbnRleHQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclxkeW5hbWljX3RocmVhZF9wb29sLmgiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXHNlcnZlcjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxzZXJ2ZXJcc2VjdXJlX3NlcnZlcl9jcmVkZW50aWFscy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNwcFxzZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcc2VydmVyXHRocmVhZF9wb29sX2ludGVyZmFjZS5oIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxzZXJ2ZXI8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfY29kZWdlbl9saWIvZ3JwYysrX2NvZGVnZW5fbGliLnZjeHByb2ogYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrX2NvZGVnZW5fbGliL2dycGMrK19jb2RlZ2VuX2xpYi52Y3hwcm9qCmluZGV4IGRlMjUyNmIuLmZhNTZkMmEgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfY29kZWdlbl9saWIvZ3JwYysrX2NvZGVnZW5fbGliLnZjeHByb2oKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK19jb2RlZ2VuX2xpYi9ncnBjKytfY29kZWdlbl9saWIudmN4cHJvagpAQCAtMTQ3LDI2ICsxNDcsNiBAQAogICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CiAKICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYWxsb2MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2NfYXRvbWljLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2Nfc3luYy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fd2luMzIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cbG9nLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHBvcnRfcGxhdGZvcm0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2UuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2VfYnVmZmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY19nZW5lcmljLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY193aW4zMi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblx0aW1lLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGJ5dGVfYnVmZmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbXByZXNzaW9uX3R5cGVzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbm5lY3Rpdml0eV9zdGF0ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxncnBjX3R5cGVzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHByb3BhZ2F0aW9uX2JpdHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cYXN5bmNfc3RyZWFtLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cYXN5bmNfdW5hcnlfY2FsbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGwuaCIgLz4KQEAgLTE5OCw2ICsxNzgsMjYgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19zdHJlYW0uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblx0aW1lLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGFsbG9jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX2F0b21pYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fZ2NjX3N5bmMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtX3dpbjMyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGJ5dGVfYnVmZmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbXByZXNzaW9uX3R5cGVzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbm5lY3Rpdml0eV9zdGF0ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxncnBjX3R5cGVzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGxvZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxwb3J0X3BsYXRmb3JtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHByb3BhZ2F0aW9uX2JpdHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2VfYnVmZmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfZ2VuZXJpYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfd2luMzIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cdGltZS5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK19jb2RlZ2VuX2xpYi9ncnBjKytfY29kZWdlbl9saWIudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK19jb2RlZ2VuX2xpYi9ncnBjKytfY29kZWdlbl9saWIudmN4cHJvai5maWx0ZXJzCmluZGV4IDNjYzAwODIuLjMyNTllOTggMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfY29kZWdlbl9saWIvZ3JwYysrX2NvZGVnZW5fbGliLnZjeHByb2ouZmlsdGVycworKysgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrX2NvZGVnZW5fbGliL2dycGMrK19jb2RlZ2VuX2xpYi52Y3hwcm9qLmZpbHRlcnMKQEAgLTYsNjYgKzYsNiBAQAogICAgIDwvQ2xDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYWxsb2MuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2NfYXRvbWljLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2Nfc3luYy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fd2luMzIuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cbG9nLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHBvcnRfcGxhdGZvcm0uaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2UuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc2xpY2VfYnVmZmVyLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY19nZW5lcmljLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY193aW4zMi5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblx0aW1lLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGJ5dGVfYnVmZmVyLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbXByZXNzaW9uX3R5cGVzLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbm5lY3Rpdml0eV9zdGF0ZS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxncnBjX3R5cGVzLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHByb3BhZ2F0aW9uX2JpdHMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cYXN5bmNfc3RyZWFtLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTE1OSw2ICs5OSw2NiBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHRpbWUuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhbGxvYy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG0uaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtX2djY19hdG9taWMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYXRtX2djY19zeW5jLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV93aW4zMi5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxieXRlX2J1ZmZlci5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxjb21wcmVzc2lvbl90eXBlcy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxjb25uZWN0aXZpdHlfc3RhdGUuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cZ3JwY190eXBlcy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxsb2cuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5ccG9ydF9wbGF0Zm9ybS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxwcm9wYWdhdGlvbl9iaXRzLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHNsaWNlX2J1ZmZlci5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzdGF0dXMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luYy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jX2dlbmVyaWMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY19wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzeW5jX3dpbjMyLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHRpbWUuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgPC9JdGVtR3JvdXA+CiAKICAgPEl0ZW1Hcm91cD4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfdGVzdF91dGlsL2dycGMrK190ZXN0X3V0aWwudmN4cHJvaiBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfdGVzdF91dGlsL2dycGMrK190ZXN0X3V0aWwudmN4cHJvagppbmRleCAzMzg2MGFmLi4wYjQ0OThmIDEwMDY0NAotLS0gYS92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrX3Rlc3RfdXRpbC9ncnBjKytfdGVzdF91dGlsLnZjeHByb2oKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK190ZXN0X3V0aWwvZ3JwYysrX3Rlc3RfdXRpbC52Y3hwcm9qCkBAIC0xNTYsMTMgKzE1NiwxMyBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjcHBcdXRpbFx0ZXN0X2NyZWRlbnRpYWxzX3Byb3ZpZGVyLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xlY2hvX21lc3NhZ2VzLnBiLmNjIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcZHVwbGljYXRlXGVjaG9fZHVwbGljYXRlLnBiLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcZWNob19tZXNzYWdlcy5wYi5oIj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcZHVwbGljYXRlXGVjaG9fZHVwbGljYXRlLnBiLmgiPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xlY2hvX21lc3NhZ2VzLmdycGMucGIuY2MiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xkdXBsaWNhdGVcZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGVjaG9fbWVzc2FnZXMuZ3JwYy5wYi5oIj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcZHVwbGljYXRlXGVjaG9fZHVwbGljYXRlLmdycGMucGIuaCI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGVjaG8ucGIuY2MiPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTcyLDEzICsxNzIsMTMgQEAKICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcZWNoby5ncnBjLnBiLmgiPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xkdXBsaWNhdGVcZWNob19kdXBsaWNhdGUucGIuY2MiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xlY2hvX21lc3NhZ2VzLnBiLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcZHVwbGljYXRlXGVjaG9fZHVwbGljYXRlLnBiLmgiPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xlY2hvX21lc3NhZ2VzLnBiLmgiPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xkdXBsaWNhdGVcZWNob19kdXBsaWNhdGUuZ3JwYy5wYi5jYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGVjaG9fbWVzc2FnZXMuZ3JwYy5wYi5jYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGR1cGxpY2F0ZVxlY2hvX2R1cGxpY2F0ZS5ncnBjLnBiLmgiPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xlY2hvX21lc3NhZ2VzLmdycGMucGIuaCI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNwcFxlbmQyZW5kXHRlc3Rfc2VydmljZV9pbXBsLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfdGVzdF91dGlsL2dycGMrK190ZXN0X3V0aWwudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK190ZXN0X3V0aWwvZ3JwYysrX3Rlc3RfdXRpbC52Y3hwcm9qLmZpbHRlcnMKaW5kZXggYjM1YmExZi4uM2ExNmM2NSAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK190ZXN0X3V0aWwvZ3JwYysrX3Rlc3RfdXRpbC52Y3hwcm9qLmZpbHRlcnMKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK190ZXN0X3V0aWwvZ3JwYysrX3Rlc3RfdXRpbC52Y3hwcm9qLmZpbHRlcnMKQEAgLTEsMTQgKzEsMTQgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGVjaG9fbWVzc2FnZXMucHJvdG8iPgotICAgICAgPEZpbHRlcj5zcmNccHJvdG9cZ3JwY1x0ZXN0aW5nPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGR1cGxpY2F0ZVxlY2hvX2R1cGxpY2F0ZS5wcm90byI+CisgICAgICA8RmlsdGVyPnNyY1xwcm90b1xncnBjXHRlc3RpbmdcZHVwbGljYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGVjaG8ucHJvdG8iPgogICAgICAgPEZpbHRlcj5zcmNccHJvdG9cZ3JwY1x0ZXN0aW5nPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGR1cGxpY2F0ZVxlY2hvX2R1cGxpY2F0ZS5wcm90byI+Ci0gICAgICA8RmlsdGVyPnNyY1xwcm90b1xncnBjXHRlc3RpbmdcZHVwbGljYXRlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXGVjaG9fbWVzc2FnZXMucHJvdG8iPgorICAgICAgPEZpbHRlcj5zcmNccHJvdG9cZ3JwY1x0ZXN0aW5nPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNwcFxlbmQyZW5kXHRlc3Rfc2VydmljZV9pbXBsLmNjIj4KICAgICAgIDxGaWx0ZXI+dGVzdFxjcHBcZW5kMmVuZDwvRmlsdGVyPgpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK191bnNlY3VyZS9ncnBjKytfdW5zZWN1cmUudmN4cHJvaiBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfdW5zZWN1cmUvZ3JwYysrX3Vuc2VjdXJlLnZjeHByb2oKaW5kZXggM2QxYWVlMC4uNzQ1NWU4OCAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK191bnNlY3VyZS9ncnBjKytfdW5zZWN1cmUudmN4cHJvagorKysgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrX3Vuc2VjdXJlL2dycGMrK191bnNlY3VyZS52Y3hwcm9qCkBAIC0yNjgsNiArMjY4LDM3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xncnBjKysuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY2FsbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjbGllbnRfdW5hcnlfY2FsbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3N0cmVhbS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3VuYXJ5X2NhbGwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjYWxsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2FsbF9ob29rLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2hhbm5lbF9pbnRlcmZhY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfY29udGV4dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF91bmFyeV9jYWxsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbXBsZXRpb25fcXVldWVfdGFnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnX3Byb3RvYnVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGdycGNfbGlicmFyeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXG1ldGhvZF9oYW5kbGVyX2ltcGwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxwcm90b191dGlscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHJwY19tZXRob2QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfc2VydmljZV9tZXRob2QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZWN1cml0eVxhdXRoX2NvbnRleHQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJpYWxpemF0aW9uX3RyYWl0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZlcl9jb250ZXh0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmVyX2ludGVyZmFjZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZpY2VfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1c19jb2RlX2VudW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzdHJpbmdfcmVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3R1Yl9vcHRpb25zLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN5bmNfY3h4MTEuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19zdHJlYW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblx0aW1lLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGdycGNfbGlicmFyeS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxtZXRob2RfaGFuZGxlcl9pbXBsLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXHByb3RvX3V0aWxzLmgiIC8+CkBAIC0zMDIsMzcgKzMzMyw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xzdXBwb3J0XHN0dWJfb3B0aW9ucy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcc3VwcG9ydFxzeW5jX3N0cmVhbS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcc3VwcG9ydFx0aW1lLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cYXN5bmNfc3RyZWFtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cYXN5bmNfdW5hcnlfY2FsbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjYWxsX2hvb2suaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjaGFubmVsX2ludGVyZmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF9jb250ZXh0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2xpZW50X3VuYXJ5X2NhbGwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb21wbGV0aW9uX3F1ZXVlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZV90YWcuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb25maWcuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb25maWdfcHJvdG9idWYuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb3JlX2NvZGVnZW5faW50ZXJmYWNlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cZ3JwY19saWJyYXJ5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cbWV0aG9kX2hhbmRsZXJfaW1wbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHByb3RvX3V0aWxzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5ccnBjX21ldGhvZC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHJwY19zZXJ2aWNlX21ldGhvZC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5XGF1dGhfY29udGV4dC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcmlhbGl6YXRpb25fdHJhaXRzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmVyX2NvbnRleHQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2ZXJfaW50ZXJmYWNlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmljZV90eXBlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RhdHVzX2NvZGVfZW51bS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0cmluZ19yZWYuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzdHViX29wdGlvbnMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19jeHgxMS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN5bmNfbm9fY3h4MTEuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX3N0cmVhbS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHRpbWUuaCIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNsaWVudFxjcmVhdGVfY2hhbm5lbF9pbnRlcm5hbC5oIiAvPgpAQCAtMzQyLDggKzM0Miw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXHNlcnZlclx0aHJlYWRfcG9vbF9pbnRlcmZhY2UuaCIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxpbnNlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGNoYW5uZWwuY2MiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjbGllbnRcY2xpZW50X2NvbnRleHQuY2MiPgpAQCAtMzU4LDEyICszNTYsMTYgQEAKICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGluc2VjdXJlX2NyZWRlbnRpYWxzLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cY2hhbm5lbF9hcmd1bWVudHMuY2MiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25cY29tcGxldGlvbl9xdWV1ZS5jYyI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxjb3JlX2NvZGVnZW4uY2MiPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25caW5zZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxycGNfbWV0aG9kLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcc2VydmVyXGFzeW5jX2dlbmVyaWNfc2VydmljZS5jYyI+CkBAIC0zOTIsOCArMzk0LDYgQEAKICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcdXRpbFx0aW1lLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgotICAgIDwvQ2xDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx2c3Byb2plY3RzXHZjeHByb2pcLlxncHJcZ3ByLnZjeHByb2oiPgpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK191bnNlY3VyZS9ncnBjKytfdW5zZWN1cmUudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMrK191bnNlY3VyZS9ncnBjKytfdW5zZWN1cmUudmN4cHJvai5maWx0ZXJzCmluZGV4IDcwYTIzYmYuLmRkYTkwYjEgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjKytfdW5zZWN1cmUvZ3JwYysrX3Vuc2VjdXJlLnZjeHByb2ouZmlsdGVycworKysgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYysrX3Vuc2VjdXJlL2dycGMrK191bnNlY3VyZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTEsOSArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFxjb21tb25caW5zZWN1cmVfY3JlYXRlX2F1dGhfY29udGV4dC5jYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+Ci0gICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNsaWVudFxjaGFubmVsLmNjIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjbGllbnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTI1LDYgKzIyLDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGluc2VjdXJlX2NyZWRlbnRpYWxzLmNjIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjbGllbnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgorICAgICAgPEZpbHRlcj5zcmNcY3BwXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXGNoYW5uZWxfYXJndW1lbnRzLmNjIj4KICAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTM0LDYgKzM0LDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXGNvcmVfY29kZWdlbi5jYyI+CiAgICAgICA8RmlsdGVyPnNyY1xjcHBcY29tbW9uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY3BwXGNvbW1vblxpbnNlY3VyZV9jcmVhdGVfYXV0aF9jb250ZXh0LmNjIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNwcFxjb21tb248L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29tbW9uXHJwY19tZXRob2QuY2MiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXGNvbW1vbjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtNzYsOSArNzksNiBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNwcFx1dGlsXHRpbWUuY2MiPgogICAgICAgPEZpbHRlcj5zcmNcY3BwXHV0aWw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY29kZWdlblxjb2RlZ2VuX2luaXQuY2MiPgotICAgICAgPEZpbHRlcj5zcmNcY3BwXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xhbGFybS5oIj4KQEAgLTExMSw2ICsxMTEsOTkgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY2xpZW50X3VuYXJ5X2NhbGwuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxhc3luY19zdHJlYW0uaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGFzeW5jX3VuYXJ5X2NhbGwuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGwuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNhbGxfaG9vay5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2hhbm5lbF9pbnRlcmZhY2UuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNsaWVudF9jb250ZXh0LmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfdW5hcnlfY2FsbC5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29tcGxldGlvbl9xdWV1ZV90YWcuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29uZmlnX3Byb3RvYnVmLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb3JlX2NvZGVnZW5faW50ZXJmYWNlLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxncnBjX2xpYnJhcnkuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXG1ldGhvZF9oYW5kbGVyX2ltcGwuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHByb3RvX3V0aWxzLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfbWV0aG9kLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxycGNfc2VydmljZV9tZXRob2QuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5XGF1dGhfY29udGV4dC5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VyaWFsaXphdGlvbl90cmFpdHMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcnZlcl9jb250ZXh0LmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2ZXJfaW50ZXJmYWNlLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2aWNlX3R5cGUuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RhdHVzX2NvZGVfZW51bS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3RyaW5nX3JlZi5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3R1Yl9vcHRpb25zLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX2N4eDExLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX25vX2N4eDExLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzeW5jX3N0cmVhbS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cdGltZS5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGdycGNfbGlicmFyeS5oIj4KICAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtMjEzLDk5ICszMDYsNiBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcc3VwcG9ydFx0aW1lLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xzdXBwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cYXN5bmNfc3RyZWFtLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxhc3luY191bmFyeV9jYWxsLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjYWxsLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjYWxsX2hvb2suaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNoYW5uZWxfaW50ZXJmYWNlLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjbGllbnRfY29udGV4dC5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY2xpZW50X3VuYXJ5X2NhbGwuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbXBsZXRpb25fcXVldWUuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbXBsZXRpb25fcXVldWVfdGFnLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxjb25maWcuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXGNvbmZpZ19wcm90b2J1Zi5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cY29yZV9jb2RlZ2VuX2ludGVyZmFjZS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cZ3JwY19saWJyYXJ5LmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxtZXRob2RfaGFuZGxlcl9pbXBsLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxwcm90b191dGlscy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5ccnBjX21ldGhvZC5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5ccnBjX3NlcnZpY2VfbWV0aG9kLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZWN1cml0eVxhdXRoX2NvbnRleHQuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZWN1cml0eTwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHNlcmlhbGl6YXRpb25fdHJhaXRzLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzZXJ2ZXJfY29udGV4dC5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmVyX2ludGVyZmFjZS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc2VydmljZV90eXBlLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlblxzdGF0dXMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0YXR1c19jb2RlX2VudW0uaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0cmluZ19yZWYuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHN0dWJfb3B0aW9ucy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luYy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19jeHgxMS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19ub19jeHgxMS5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGMrK1xpbXBsXGNvZGVnZW5cc3luY19zdHJlYW0uaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjKytcaW1wbFxjb2RlZ2VuXHRpbWUuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYysrXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjcHBcY2xpZW50XGNyZWF0ZV9jaGFubmVsX2ludGVybmFsLmgiPgpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMvZ3JwYy52Y3hwcm9qIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMvZ3JwYy52Y3hwcm9qCmluZGV4IGViYzM2NzQuLmMyMGY4ZDcgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjL2dycGMudmN4cHJvagorKysgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwYy9ncnBjLnZjeHByb2oKQEAgLTI2Nyw0ODUgKzI2Nyw0ODUgQEAKICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogCiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcZ3JwY19zZWN1cml0eS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGJ5dGVfYnVmZmVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcYnl0ZV9idWZmZXJfcmVhZGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcY2Vuc3VzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcY29tcHJlc3Npb24uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xncnBjLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3RhdHVzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcZ3JwY19zZWN1cml0eS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxieXRlX2J1ZmZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxjb21wcmVzc2lvbl90eXBlcy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxjb25uZWN0aXZpdHlfc3RhdGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cZ3JwY190eXBlcy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxwcm9wYWdhdGlvbl9iaXRzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGNlbnN1cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXHN0YXR1cy5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX2ZpbHRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfcGx1Z2luLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfYXJncy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjaGFubmVsX3N0YWNrLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2tfYnVpbGRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29udGV4dC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcY2xpZW50X2NvbmZpZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xjb25uZWN0b3IuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xsb2FkX2JhbGFuY2VyX2FwaS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xwaWNrX2ZpcnN0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfZmFjdG9yeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfcmVnaXN0cnkuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJfZmFjdG9yeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xzb2NrYWRkcl9yZXNvbHZlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2luZGV4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNvbXByZXNzaW9uXGFsZ29yaXRobV9tZXRhZGF0YS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY29tcHJlc3Npb25cbWVzc2FnZV9jb21wcmVzcy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZGVidWdcdHJhY2UuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGh0dHBcZm9ybWF0X3JlcXVlc3QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGh0dHBcaHR0cGNsaS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxwYXJzZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGNsb3N1cmUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGVuZHBvaW50LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxlbmRwb2ludF9wYWlyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjX2N0eC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZXhlY3V0b3IuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGZkX3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb2NwX3dpbmRvd3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21ncl9pbnRlcm5hbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3JfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF9wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9zZXRfd2luZG93cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF93aW5kb3dzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxyZXNvbHZlX2FkZHJlc3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl9wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2FkZHJfdXRpbHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyX3dpbjMyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrZXRfdXRpbHNfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF93aW5kb3dzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3BfY2xpZW50LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3BfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9zZXJ2ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF93aW5kb3dzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZXJfaGVhcC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdWRwX3NlcnZlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdW5peF9zb2NrZXRzX3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcGlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd29ya3F1ZXVlX3dpbmRvd3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX2NvbW1vbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX3JlYWRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX3dyaXRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdGF0aXN0aWNzXGNlbnN1c19pbnRlcmZhY2UuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN0YXRpc3RpY3NcY2Vuc3VzX3JwY19zdGF0cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxhcGlfdHJhY2UuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2FsbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsX3Rlc3Rfb25seS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfaW5pdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX3N0YWNrX3R5cGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY29tcGxldGlvbl9xdWV1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxldmVudF9zdHJpbmcuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcaW5pdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxsYW1lX2NsaWVudC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZXJ2ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2Vcc3VyZmFjZV90cmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGFscG4uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcYmluX2VuY29kZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfZGF0YS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9nb2F3YXkuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfcGluZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9yc3Rfc3RyZWFtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3NldHRpbmdzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3dpbmRvd191cGRhdGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHBhY2tfZW5jb2Rlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19wYXJzZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHBhY2tfdGFibGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHR0cDJfZXJyb3JzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGh1ZmZzeW1zLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGluY29taW5nX21ldGFkYXRhLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGludGVybmFsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0YXR1c19jb252ZXJzaW9uLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0cmVhbV9tYXAuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcdGltZW91dF9lbmNvZGluZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx2YXJpbnQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJfdHJhbnNwb3J0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY29ubmVjdGl2aXR5X3N0YXRlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcbWV0YWRhdGEuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHRyYW5zcG9ydC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHRyYW5zcG9ydF9pbXBsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxhdXRoX2ZpbHRlcnMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGI2NC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcY3JlZGVudGlhbHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGhhbmRzaGFrZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcanNvbl90b2tlbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcand0X3ZlcmlmaWVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxzZWN1cmVfZW5kcG9pbnQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XHNlY3VyaXR5X2Nvbm5lY3Rvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VjdXJpdHlfY29udGV4dC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXGZha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0c2lcc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXHNzbF90eXBlcy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXHRyYW5zcG9ydF9zZWN1cml0eS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXHRyYW5zcG9ydF9zZWN1cml0eV9pbnRlcmZhY2UuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xhZ2dyZWdhdGlvbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXG1sb2cuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xycGNfbWV0cmljX2lkLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYWxwbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGJpbl9lbmNvZGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfZGF0YS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX2dvYXdheS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3BpbmcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9yc3Rfc3RyZWFtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfc2V0dGluZ3MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV93aW5kb3dfdXBkYXRlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfZW5jb2Rlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3BhcnNlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3RhYmxlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHR0cDJfZXJyb3JzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHVmZnN5bXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxpbmNvbWluZ19tZXRhZGF0YS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGludGVybmFsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RhdHVzX2NvbnZlcnNpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdHJlYW1fbWFwLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdGltZW91dF9lbmNvZGluZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHZhcmludC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xhZ2dyZWdhdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX2ZpbHRlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX3BsdWdpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xtbG9nLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXHJwY19tZXRyaWNfaWQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfYXJncy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFjay5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29tcHJlc3NfZmlsdGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb25uZWN0ZWRfY2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29udGV4dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcaHR0cF9jbGllbnRfZmlsdGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNvbm5lY3Rvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNcbG9hZF9iYWxhbmNlcl9hcGkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3kuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfcmVnaXN0cnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9mYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXGRuc19yZXNvbHZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXHNvY2thZGRyX3Jlc29sdmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2ZhY3RvcnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxhbGdvcml0aG1fbWV0YWRhdGEuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcZGVidWdcdHJhY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGZvcm1hdF9yZXF1ZXN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxodHRwY2xpLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxwYXJzZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxjbG9zdXJlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxlbmRwb2ludF9wYWlyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZXhlY19jdHguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjdXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGZkX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9jcF93aW5kb3dzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9tZ3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl9pbnRlcm5hbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfcG9zaXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3NldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXRfd2luZG93cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfd2luZG93cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHJlc29sdmVfYWRkcmVzcy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHJfcG9zaXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrYWRkcl91dGlscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyX3dpbjMyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3V0aWxzX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3NlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF93aW5kb3dzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZXJfaGVhcC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVkcF9zZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1bml4X3NvY2tldHNfcG9zaXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3YWtldXBfZmRfcGlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZV93aW5kb3dzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX2NvbW1vbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl9yZWFkZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fd3JpdGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcYXV0aF9maWx0ZXJzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcYjY0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcY3JlZGVudGlhbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxoYW5kc2hha2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxqc29uX3Rva2VuLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcand0X3ZlcmlmaWVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJlX2VuZHBvaW50LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJpdHlfY29ubmVjdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJpdHlfY29udGV4dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN0YXRpc3RpY3NcY2Vuc3VzX2ludGVyZmFjZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN0YXRpc3RpY3NcY2Vuc3VzX3JwY19zdGF0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYXBpX3RyYWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjYWxsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjYWxsX3Rlc3Rfb25seS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9pbml0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX3N0YWNrX3R5cGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNvbXBsZXRpb25fcXVldWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGV2ZW50X3N0cmluZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcaW5pdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcbGFtZV9jbGllbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2Vcc3VyZmFjZV90cmFjZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxieXRlX3N0cmVhbS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxjb25uZWN0aXZpdHlfc3RhdGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcbWV0YWRhdGEuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcbWV0YWRhdGFfYmF0Y2guaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcc3RhdGljX21ldGFkYXRhLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFx0cmFuc3BvcnRfaW1wbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRzaVxmYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRzaVxzc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHNpXHNzbF90eXBlcy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRzaVx0cmFuc3BvcnRfc2VjdXJpdHkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0c2lcdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGhpcmRfcGFydHlcbmFub3BiXHBiLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0aGlyZF9wYXJ0eVxuYW5vcGJccGJfY29tbW9uLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0aGlyZF9wYXJ0eVxuYW5vcGJccGJfZGVjb2RlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0aGlyZF9wYXJ0eVxuYW5vcGJccGJfZW5jb2RlLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfY29udGV4dC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXGNsaWVudFxpbnNlY3VyZVxjaGFubmVsX2NyZWF0ZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX2ZpbHRlci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXGNsaWVudFxzZWN1cmVcc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfcGx1Z2luLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcc2VydmVyXGluc2VjdXJlXHNlcnZlcl9jaHR0cDIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfYXJncy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHNlcnZlclxzZWN1cmVcc2VydmVyX3NlY3VyZV9jaHR0cDIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2suYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYWxwbi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGJpbl9lbmNvZGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxjaHR0cDJfdHJhbnNwb3J0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfZ29hd2F5LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfcGluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcaHR0cF9zZXJ2ZXJfZmlsdGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3JzdF9zdHJlYW0uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfc2V0dGluZ3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfd2luZG93X3VwZGF0ZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcY29ubmVjdG9yLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX2VuY29kZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGRlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxocGFja19wYXJzZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGluaXRpYWxfY29ubmVjdF9zdHJpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfdGFibGUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXGxvYWRfYmFsYW5jZXJfYXBpLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGh1ZmZzeW1zLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xwaWNrX2ZpcnN0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGluY29taW5nX21ldGFkYXRhLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xyb3VuZF9yb2Jpbi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxwYXJzaW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3kuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RhdHVzX2NvbnZlcnNpb24uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHN0cmVhbV9saXN0cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5X3JlZ2lzdHJ5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHN0cmVhbV9tYXAuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHRpbWVvdXRfZW5jb2RpbmcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyX2ZhY3RvcnkuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdmFyaW50LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx3cml0aW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xjb250ZXh0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcc29ja2FkZHJfcmVzb2x2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGdycGNfY29udGV4dC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19maWx0ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19wbHVnaW4uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGluaXRpYWxpemUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXG1sb2cuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjb21wcmVzc2lvblxjb21wcmVzc2lvbl9hbGdvcml0aG0uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXG9wZXJhdGlvbi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNvbXByZXNzaW9uXG1lc3NhZ2VfY29tcHJlc3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXHBsYWNlaG9sZGVycy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGRlYnVnXHRyYWNlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1x0cmFjaW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxmb3JtYXRfcmVxdWVzdC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfYXJncy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGh0dHBcaHR0cGNsaS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfc3RhY2suYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXHBhcnNlci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfc3RhY2tfYnVpbGRlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGNsb3N1cmUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGVuZHBvaW50LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29tcHJlc3NfZmlsdGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnRfcGFpcl9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNvbm5lY3RlZF9jaGFubmVsLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcaHR0cF9jbGllbnRfZmlsdGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZXhlY19jdHguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjdXRvci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxmZF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb2NwX3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xjb25uZWN0b3IuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21nci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGRlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyX3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xsb2FkX2JhbGFuY2VyX2FwaS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5X2ZhY3RvcnkuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5X3JlZ2lzdHJ5LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxyZXNvbHZlX2FkZHJlc3NfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9mYWN0b3J5LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccmVzb2x2ZV9hZGRyZXNzX3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyX3V0aWxzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXGRuc19yZXNvbHZlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19jb21tb25fcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcc29ja2FkZHJfcmVzb2x2ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrZXRfdXRpbHNfbGludXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3V0aWxzX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9mYWN0b3J5LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2luZGV4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX2NsaWVudF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3BfY2xpZW50X3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY29tcHJlc3Npb25cY29tcHJlc3Npb25fYWxnb3JpdGhtLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNvbXByZXNzaW9uXG1lc3NhZ2VfY29tcHJlc3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfc2VydmVyX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGRlYnVnXHRyYWNlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3NlcnZlcl93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGh0dHBcZm9ybWF0X3JlcXVlc3QuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfd2luZG93cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGh0dHBjbGkuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGh0dHBcaHR0cGNsaV9zZWN1cml0eV9jb25uZWN0b3IuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXHBhcnNlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRpbWVyX2hlYXAuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcY2xvc3VyZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHVkcF9zZXJ2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnRfcGFpcl9wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHVuaXhfc29ja2V0c19wb3NpeF9ub29wLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGVuZHBvaW50X3BhaXJfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9ldmVudGZkLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGV4ZWNfY3R4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX25vc3BlY2lhbC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjdXRvci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9waXBlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGZkX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvY3Bfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21nci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyX3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fcmVhZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl9zdHJpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fd3JpdGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxwcm90b1xncnBjXGxiXHYwXGxvYWRfYmFsYW5jZXIucGIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGFsYXJtLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGFwaV90cmFjZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGJ5dGVfYnVmZmVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHJlc29sdmVfYWRkcmVzc19wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYnl0ZV9idWZmZXJfcmVhZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHJlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyX3V0aWxzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsX2RldGFpbHMuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3V0aWxzX2NvbW1vbl9wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2FsbF9sb2dfYmF0Y2guYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3V0aWxzX2xpbnV4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9jb25uZWN0aXZpdHkuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfY3JlYXRlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9jbGllbnRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfaW5pdC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50X3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfcGluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfc3RhY2tfdHlwZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfc2VydmVyX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjb21wbGV0aW9uX3F1ZXVlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9zZXJ2ZXJfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcZXZlbnRfc3RyaW5nLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF93aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxpbml0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVfYXZlcmFnZWRfc3RhdHMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGxhbWVfY2xpZW50LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxtZXRhZGF0YV9hcnJheS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0aW1lcl9oZWFwLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZXJ2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdWRwX3NlcnZlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2Vcc2VydmVyX2NodHRwMi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1bml4X3NvY2tldHNfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHZhbGlkYXRlX21ldGFkYXRhLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVuaXhfc29ja2V0c19wb3NpeF9ub29wLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVx2ZXJzaW9uLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9ldmVudGZkLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9ub3NwZWNpYWwuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGFscG4uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX3BpcGUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGJpbl9lbmNvZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfZGF0YS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2dvYXdheS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfcGluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb24uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3JzdF9zdHJlYW0uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX3JlYWRlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfc2V0dGluZ3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX3N0cmluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfd2luZG93X3VwZGF0ZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fd3JpdGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19lbmNvZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHByb3RvXGdycGNcbGJcdjBcbG9hZF9iYWxhbmNlci5wYi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHBhY2tfcGFyc2VyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGI2NC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHBhY2tfdGFibGUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcY2xpZW50X2F1dGhfZmlsdGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxodWZmc3ltcy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxjcmVkZW50aWFscy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaW5jb21pbmdfbWV0YWRhdGEuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcY3JlZGVudGlhbHNfbWV0YWRhdGEuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHBhcnNpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcY3JlZGVudGlhbHNfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0YXR1c19jb252ZXJzaW9uLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGNyZWRlbnRpYWxzX3dpbjMyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxzdHJlYW1fbGlzdHMuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0cmVhbV9tYXAuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcaGFuZHNoYWtlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx0aW1lb3V0X2VuY29kaW5nLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGpzb25fdG9rZW4uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHZhcmludC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxqd3RfdmVyaWZpZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHdyaXRpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJlX2VuZHBvaW50LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMl90cmFuc3BvcnQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJpdHlfY29ubmVjdG9yLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNvbm5lY3Rpdml0eV9zdGF0ZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxzZWN1cml0eV9jb250ZXh0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XHNlcnZlcl9hdXRoX2ZpbHRlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGFsYXJtLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGFwaV90cmFjZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFx0cmFuc3BvcnQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxieXRlX2J1ZmZlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFx0cmFuc3BvcnRfb3Bfc3RyaW5nLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYnl0ZV9idWZmZXJfcmVhZGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxodHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGwuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxiNjQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjYWxsX2RldGFpbHMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxjbGllbnRfYXV0aF9maWx0ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjYWxsX2xvZ19iYXRjaC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGNyZWRlbnRpYWxzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGNyZWRlbnRpYWxzX21ldGFkYXRhLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9jb25uZWN0aXZpdHkuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxjcmVkZW50aWFsc19wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfaW5pdC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGNyZWRlbnRpYWxzX3dpbjMyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9waW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcZ29vZ2xlX2RlZmF1bHRfY3JlZGVudGlhbHMuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX3N0YWNrX3R5cGUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxoYW5kc2hha2UuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjb21wbGV0aW9uX3F1ZXVlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcanNvbl90b2tlbi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGV2ZW50X3N0cmluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGp3dF92ZXJpZmllci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxzZWN1cmVfZW5kcG9pbnQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxpbml0X3NlY3VyZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XHNlY3VyaXR5X2Nvbm5lY3Rvci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGxhbWVfY2xpZW50LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VjdXJpdHlfY29udGV4dC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXG1ldGFkYXRhX2FycmF5LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VydmVyX2F1dGhfZmlsdGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2Vcc2VydmVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VydmVyX3NlY3VyZV9jaHR0cDIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVx2YWxpZGF0ZV9tZXRhZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcaW5pdF9zZWN1cmUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVx2ZXJzaW9uLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZWN1cmVfY2hhbm5lbF9jcmVhdGUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXGZha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxjb25uZWN0aXZpdHlfc3RhdGUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0c2lcc3NsX3RyYW5zcG9ydF9zZWN1cml0eS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcbWV0YWRhdGEuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0c2lcdHJhbnNwb3J0X3NlY3VyaXR5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xjb250ZXh0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxzdGF0aWNfbWV0YWRhdGEuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcaW5pdGlhbGl6ZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcdHJhbnNwb3J0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXG1sb2cuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydF9vcF9zdHJpbmcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcb3BlcmF0aW9uLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRzaVxmYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xwbGFjZWhvbGRlcnMuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHNpXHNzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcdHJhY2luZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0c2lcdHJhbnNwb3J0X3NlY3VyaXR5LmMiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGhpcmRfcGFydHlcbmFub3BiXHBiX2NvbW1vbi5jIj4KICAgICA8L0NsQ29tcGlsZT4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjL2dycGMudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMvZ3JwYy52Y3hwcm9qLmZpbHRlcnMKaW5kZXggZTViZmYwZS4uZjAzYjIwNyAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMvZ3JwYy52Y3hwcm9qLmZpbHRlcnMKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGMvZ3JwYy52Y3hwcm9qLmZpbHRlcnMKQEAgLTEsNDg4ICsxLDQ4OCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX2NvbnRleHQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcY2xpZW50XGluc2VjdXJlXGNoYW5uZWxfY3JlYXRlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxjbGllbnRcaW5zZWN1cmU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX2ZpbHRlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxjbGllbnRcc2VjdXJlXHNlY3VyZV9jaGFubmVsX2NyZWF0ZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcY2xpZW50XHNlY3VyZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfcGx1Z2luLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHNlcnZlclxpbnNlY3VyZVxzZXJ2ZXJfY2h0dHAyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxzZXJ2ZXJcaW5zZWN1cmU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9hcmdzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxzZXJ2ZXJcc2VjdXJlXHNlcnZlcl9zZWN1cmVfY2h0dHAyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxzZXJ2ZXJcc2VjdXJlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2suYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxhbHBuLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYmluX2VuY29kZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGNodHRwMl90cmFuc3BvcnQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9kYXRhLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9nb2F3YXkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9waW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcaHR0cF9zZXJ2ZXJfZmlsdGVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfcnN0X3N0cmVhbS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9zZXR0aW5ncy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV93aW5kb3dfdXBkYXRlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcY29ubmVjdG9yLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfZW5jb2Rlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGRlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3BhcnNlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGluaXRpYWxfY29ubmVjdF9zdHJpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxocGFja190YWJsZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXGxvYWRfYmFsYW5jZXJfYXBpLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHVmZnN5bXMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xwaWNrX2ZpcnN0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaW5jb21pbmdfbWV0YWRhdGEuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xyb3VuZF9yb2Jpbi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHBhcnNpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3kuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdGF0dXNfY29udmVyc2lvbi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RyZWFtX2xpc3RzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5X3JlZ2lzdHJ5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RyZWFtX21hcC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdGltZW91dF9lbmNvZGluZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyX2ZhY3RvcnkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx2YXJpbnQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHdyaXRpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyczwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xjb250ZXh0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xzb2NrYWRkcl9yZXNvbHZlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19jb250ZXh0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9mYWN0b3J5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGdycGNfcGx1Z2luLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcaW5pdGlhbGl6ZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1x1cmlfcGFyc2VyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXG1sb2cuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNvbXByZXNzaW9uXGNvbXByZXNzaW9uX2FsZ29yaXRobS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY29tcHJlc3Npb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcb3BlcmF0aW9uLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjb21wcmVzc2lvbjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xwbGFjZWhvbGRlcnMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGRlYnVnXHRyYWNlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxkZWJ1ZzwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1x0cmFjaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXGZvcm1hdF9yZXF1ZXN0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxodHRwPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjaGFubmVsX2FyZ3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXGh0dHBjbGkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGh0dHA8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfc3RhY2suYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXHBhcnNlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaHR0cDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcY2xvc3VyZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNsaWVudF9jaGFubmVsLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxlbmRwb2ludF9wYWlyX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxlbmRwb2ludF9wYWlyX3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjX2N0eC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGh0dHBfc2VydmVyX2ZpbHRlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGV4ZWN1dG9yLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGZkX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcY2xpZW50X2NvbmZpZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvY3Bfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNvbm5lY3Rvci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3JfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xpbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3Jfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXGxvYWRfYmFsYW5jZXJfYXBpLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccGlja19maXJzdC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccm91bmRfcm9iaW4uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9zZXRfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfZmFjdG9yeS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfcmVnaXN0cnkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHJlc29sdmVfYWRkcmVzc19wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyX2ZhY3RvcnkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxyZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyX3JlZ2lzdHJ5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2FkZHJfdXRpbHMuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19jb21tb25fcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcc29ja2FkZHJfcmVzb2x2ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyczwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3V0aWxzX2xpbnV4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF93aW5kb3dzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9pbmRleC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9jbGllbnRfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1x1cmlfcGFyc2VyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX2NsaWVudF93aW5kb3dzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNvbXByZXNzaW9uXGNvbXByZXNzaW9uX2FsZ29yaXRobS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNvbXByZXNzaW9uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3BfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY29tcHJlc3Npb25cbWVzc2FnZV9jb21wcmVzcy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNvbXByZXNzaW9uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfc2VydmVyX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGRlYnVnXHRyYWNlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcZGVidWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9zZXJ2ZXJfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGZvcm1hdF9yZXF1ZXN0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaHR0cDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxodHRwY2xpLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaHR0cDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGh0dHBjbGlfc2VjdXJpdHlfY29ubmVjdG9yLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaHR0cDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxwYXJzZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxodHRwPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lcl9oZWFwLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGNsb3N1cmUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdWRwX3NlcnZlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxlbmRwb2ludC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnRfcGFpcl9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxlbmRwb2ludF9wYWlyX3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX2V2ZW50ZmQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZXhlY19jdHguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX25vc3BlY2lhbC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjdXRvci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcGlwZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxmZF9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9jcF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21nci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWVfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb24uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl9yZWFkZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfZXBvbGwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX3N0cmluZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcanNvbjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9wb2xsX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl93cml0ZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHByb3RvXGdycGNcbGJcdjBcbG9hZF9iYWxhbmNlci5wYi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVccHJvdG9cZ3JwY1xsYlx2MDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYWxhcm0uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3NldF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYXBpX3RyYWNlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYnl0ZV9idWZmZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxyZXNvbHZlX2FkZHJlc3NfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxieXRlX2J1ZmZlcl9yZWFkZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxyZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNhbGwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrYWRkcl91dGlscy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNhbGxfZGV0YWlscy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF91dGlsc19jb21tb25fcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsX2xvZ19iYXRjaC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF91dGlsc19saW51eC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfdXRpbHNfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX2Nvbm5lY3Rpdml0eS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9jcmVhdGUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9pbml0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX2NsaWVudF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9waW5nLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9zdGFja190eXBlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3NlcnZlcl9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNvbXBsZXRpb25fcXVldWUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfc2VydmVyX3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxldmVudF9zdHJpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGluaXQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcbGFtZV9jbGllbnQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0aW1lci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXG1ldGFkYXRhX2FycmF5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZXJfaGVhcC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHNlcnZlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVkcF9zZXJ2ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZXJ2ZXJfY2h0dHAyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdW5peF9zb2NrZXRzX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcdmFsaWRhdGVfbWV0YWRhdGEuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHZlcnNpb24uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3YWtldXBfZmRfZXZlbnRmZC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcYnl0ZV9zdHJlYW0uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9ub3NwZWNpYWwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxhbHBuLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX3BpcGUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxiaW5fZW5jb2Rlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2RhdGEuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9nb2F3YXkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3BpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb24uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3JzdF9zdHJlYW0uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fcmVhZGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcanNvbjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9zZXR0aW5ncy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl9zdHJpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3dpbmRvd191cGRhdGUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fd3JpdGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcanNvbjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19lbmNvZGVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19wYXJzZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxiNjQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja190YWJsZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGNsaWVudF9hdXRoX2ZpbHRlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHNlY3VyaXR5PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGh1ZmZzeW1zLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcY3JlZGVudGlhbHMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxpbmNvbWluZ19tZXRhZGF0YS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGNyZWRlbnRpYWxzX21ldGFkYXRhLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJccGFyc2luZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGNyZWRlbnRpYWxzX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RhdHVzX2NvbnZlcnNpb24uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxjcmVkZW50aWFsc193aW4zMi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHNlY3VyaXR5PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0cmVhbV9saXN0cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGdvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RyZWFtX21hcC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGhhbmRzaGFrZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHNlY3VyaXR5PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHRpbWVvdXRfZW5jb2RpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxqc29uX3Rva2VuLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcdmFyaW50LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcand0X3ZlcmlmaWVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcd3JpdGluZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XHNlY3VyZV9lbmRwb2ludC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHNlY3VyaXR5PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJpdHlfY29ubmVjdG9yLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjb25uZWN0aXZpdHlfc3RhdGUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XHNlY3VyaXR5X2NvbnRleHQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxzZXJ2ZXJfYXV0aF9maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhX2JhdGNoLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGFsYXJtLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxhcGlfdHJhY2UuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGJ5dGVfYnVmZmVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHRyYW5zcG9ydF9vcF9zdHJpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYnl0ZV9idWZmZXJfcmVhZGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxodHRwY2xpX3NlY3VyaXR5X2Nvbm5lY3Rvci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaHR0cDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2FsbC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGI2NC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGxfZGV0YWlscy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGNsaWVudF9hdXRoX2ZpbHRlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGxfbG9nX2JhdGNoLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcY3JlZGVudGlhbHMuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcY3JlZGVudGlhbHNfbWV0YWRhdGEuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX2Nvbm5lY3Rpdml0eS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGNyZWRlbnRpYWxzX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9pbml0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcY3JlZGVudGlhbHNfd2luMzIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX3BpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxnb29nbGVfZGVmYXVsdF9jcmVkZW50aWFscy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfc3RhY2tfdHlwZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGhhbmRzaGFrZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNvbXBsZXRpb25fcXVldWUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxqc29uX3Rva2VuLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcZXZlbnRfc3RyaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcand0X3ZlcmlmaWVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcaW5pdC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XHNlY3VyZV9lbmRwb2ludC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXRfc2VjdXJlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VjdXJpdHlfY29ubmVjdG9yLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcbGFtZV9jbGllbnQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxzZWN1cml0eV9jb250ZXh0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcbWV0YWRhdGFfYXJyYXkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxzZXJ2ZXJfYXV0aF9maWx0ZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxzZXJ2ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxzZXJ2ZXJfc2VjdXJlX2NodHRwMi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHZhbGlkYXRlX21ldGFkYXRhLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxpbml0X3NlY3VyZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcdmVyc2lvbi5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2Vcc2VjdXJlX2NoYW5uZWxfY3JlYXRlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0c2lcZmFrZV90cmFuc3BvcnRfc2VjdXJpdHkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRzaTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxjb25uZWN0aXZpdHlfc3RhdGUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRzaVxzc2xfdHJhbnNwb3J0X3NlY3VyaXR5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0c2k8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcbWV0YWRhdGEuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRzaVx0cmFuc3BvcnRfc2VjdXJpdHkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRzaTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGNvbnRleHQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxzdGF0aWNfbWV0YWRhdGEuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xpbml0aWFsaXplLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcdHJhbnNwb3J0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcbWxvZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydF9vcF9zdHJpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xvcGVyYXRpb24uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRzaVxmYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRzaTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXHBsYWNlaG9sZGVycy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHNpXHNzbF90cmFuc3BvcnRfc2VjdXJpdHkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0c2k8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1x0cmFjaW5nLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0c2lcdHJhbnNwb3J0X3NlY3VyaXR5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHNpPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0aGlyZF9wYXJ0eVxuYW5vcGJccGJfY29tbW9uLmMiPgogICAgICAgPEZpbHRlcj50aGlyZF9wYXJ0eVxuYW5vcGI8L0ZpbHRlcj4KQEAgLTQ5NSwyMiArNDk1LDIyIEBACiAgICAgPC9DbENvbXBpbGU+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGdycGNfc2VjdXJpdHkuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGJ5dGVfYnVmZmVyLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xieXRlX2J1ZmZlcl9yZWFkZXIuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGNlbnN1cy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcY29tcHJlc3Npb24uaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGdycGMuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXHN0YXR1cy5oIj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xncnBjX3NlY3VyaXR5LmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYnl0ZV9idWZmZXIuaCI+CkBAIC01MzEsNDIxICs1MzEsNDIxIEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN0YXR1cy5oIj4KICAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGNlbnN1cy5oIj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xzdGF0dXMuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX2ZpbHRlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYWxwbi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcZ3JwY19wbHVnaW4uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGJpbl9lbmNvZGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9hcmdzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2suaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2tfYnVpbGRlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX2RhdGEuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX2dvYXdheS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNvbXByZXNzX2ZpbHRlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3BpbmcuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb25uZWN0ZWRfY2hhbm5lbC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3JzdF9zdHJlYW0uaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb250ZXh0LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfc2V0dGluZ3MuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV93aW5kb3dfdXBkYXRlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfZW5jb2Rlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxocGFja19wYXJzZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xjbGllbnRfY29uZmlnLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfdGFibGUuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xjb25uZWN0b3IuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxodHRwMl9lcnJvcnMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xpbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHVmZnN5bXMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xsb2FkX2JhbGFuY2VyX2FwaS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGluY29taW5nX21ldGFkYXRhLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccGlja19maXJzdC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGludGVybmFsLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccm91bmRfcm9iaW4uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdGF0dXNfY29udmVyc2lvbi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHN0cmVhbV9tYXAuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfZmFjdG9yeS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHRpbWVvdXRfZW5jb2RpbmcuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfcmVnaXN0cnkuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx2YXJpbnQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xhZ2dyZWdhdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9mYWN0b3J5LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGdycGNfZmlsdGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyX3JlZ2lzdHJ5LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGdycGNfcGx1Z2luLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xkbnNfcmVzb2x2ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXG1sb2cuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXHNvY2thZGRyX3Jlc29sdmVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyczwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xycGNfbWV0cmljX2lkLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfYXJncy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9mYWN0b3J5LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjaGFubmVsX3N0YWNrLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2luZGV4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjaGFubmVsX3N0YWNrX2J1aWxkZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNsaWVudF9jaGFubmVsLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY29tcHJlc3Npb25cYWxnb3JpdGhtX21ldGFkYXRhLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjb21wcmVzc2lvbjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29tcHJlc3NfZmlsdGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY29tcHJlc3Npb25cbWVzc2FnZV9jb21wcmVzcy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY29tcHJlc3Npb248L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNvbm5lY3RlZF9jaGFubmVsLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZGVidWdcdHJhY2UuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGRlYnVnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb250ZXh0LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxmb3JtYXRfcmVxdWVzdC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaHR0cDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcaHR0cF9jbGllbnRfZmlsdGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxodHRwY2xpLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxodHRwPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXHBhcnNlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaHR0cDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGNsb3N1cmUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xjbGllbnRfY29uZmlnLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xjb25uZWN0b3IuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxlbmRwb2ludF9wYWlyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGV4ZWNfY3R4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNcbG9hZF9iYWxhbmNlcl9hcGkuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjdXRvci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxmZF9wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9jcF93aW5kb3dzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3IuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfZmFjdG9yeS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyX2ludGVybmFsLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5X3JlZ2lzdHJ5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3JfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9mYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyX3JlZ2lzdHJ5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9zZXQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXHNvY2thZGRyX3Jlc29sdmVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3dpbmRvd3MuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF93aW5kb3dzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9mYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccmVzb2x2ZV9hZGRyZXNzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9pbmRleC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcdXJpX3BhcnNlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyX3Bvc2l4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNvbXByZXNzaW9uXGFsZ29yaXRobV9tZXRhZGF0YS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNvbXByZXNzaW9uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl91dGlscy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY29tcHJlc3Npb248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyX3dpbjMyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGRlYnVnXHRyYWNlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcZGVidWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGZvcm1hdF9yZXF1ZXN0LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaHR0cDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxodHRwY2xpLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaHR0cDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX2NsaWVudC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXHBhcnNlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGh0dHA8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxjbG9zdXJlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9zZXJ2ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3dpbmRvd3MuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnRfcGFpci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lX2F2ZXJhZ2VkX3N0YXRzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGV4ZWNfY3R4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRpbWVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGV4ZWN1dG9yLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRpbWVyX2hlYXAuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZmRfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdWRwX3NlcnZlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb2NwX3dpbmRvd3MuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdW5peF9zb2NrZXRzX3Bvc2l4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9waXBlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyX2ludGVybmFsLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl9wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWVfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWVfd2luZG93cy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3NldC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb24uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3NldF9wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fY29tbW9uLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxqc29uPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXRfd2luZG93cy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fcmVhZGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxqc29uPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF93aW5kb3dzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl93cml0ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxyZXNvbHZlX2FkZHJlc3MuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxwcm90b1xncnBjXGxiXHYwPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3RhdGlzdGljc1xjZW5zdXNfaW50ZXJmYWNlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdGF0aXN0aWNzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHJfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3RhdGlzdGljc1xjZW5zdXNfcnBjX3N0YXRzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdGF0aXN0aWNzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHJfdXRpbHMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxhcGlfdHJhY2UuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrYWRkcl93aW4zMi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNhbGwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfdXRpbHNfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsX3Rlc3Rfb25seS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF93aW5kb3dzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9jbGllbnQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX2luaXQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX3N0YWNrX3R5cGUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfc2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY29tcGxldGlvbl9xdWV1ZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF93aW5kb3dzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcZXZlbnRfc3RyaW5nLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGluaXQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0aW1lci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGxhbWVfY2xpZW50LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZXJfaGVhcC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHNlcnZlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVkcF9zZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzdXJmYWNlX3RyYWNlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdW5peF9zb2NrZXRzX3Bvc2l4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxieXRlX3N0cmVhbS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX3BpcGUuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxhbHBuLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX3Bvc2l4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcYmluX2VuY29kZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWUuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2RhdGEuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfd2luZG93cy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2dvYXdheS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGpzb248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfcGluZy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl9jb21tb24uaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3JzdF9zdHJlYW0uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fcmVhZGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcanNvbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9zZXR0aW5ncy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl93cml0ZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3dpbmRvd191cGRhdGUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxwcm90b1xncnBjXGxiXHYwXGxvYWRfYmFsYW5jZXIucGIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxwcm90b1xncnBjXGxiXHYwPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX2VuY29kZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxhdXRoX2ZpbHRlcnMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19wYXJzZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxiNjQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja190YWJsZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XGNyZWRlbnRpYWxzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHR0cDJfZXJyb3JzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcaGFuZHNoYWtlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHVmZnN5bXMuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxqc29uX3Rva2VuLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaW5jb21pbmdfbWV0YWRhdGEuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzZWN1cml0eVxqd3RfdmVyaWZpZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxpbnRlcm5hbC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XHNlY3VyZV9lbmRwb2ludC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHNlY3VyaXR5PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0YXR1c19jb252ZXJzaW9uLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc2VjdXJpdHlcc2VjdXJpdHlfY29ubmVjdG9yLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc2VjdXJpdHk8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RyZWFtX21hcC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHNlY3VyaXR5XHNlY3VyaXR5X2NvbnRleHQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzZWN1cml0eTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx0aW1lb3V0X2VuY29kaW5nLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3RhdGlzdGljc1xjZW5zdXNfaW50ZXJmYWNlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3RhdGlzdGljczwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx2YXJpbnQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdGF0aXN0aWNzXGNlbnN1c19ycGNfc3RhdHMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdGF0aXN0aWNzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxhcGlfdHJhY2UuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY29ubmVjdGl2aXR5X3N0YXRlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGwuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcbWV0YWRhdGEuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2FsbF90ZXN0X29ubHkuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcbWV0YWRhdGFfYmF0Y2guaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxzdGF0aWNfbWV0YWRhdGEuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9pbml0LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHRyYW5zcG9ydC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX3N0YWNrX3R5cGUuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0X2ltcGwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY29tcGxldGlvbl9xdWV1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGF1dGhfZmlsdGVycy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGV2ZW50X3N0cmluZy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHNlY3VyaXR5XGI2NC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxjcmVkZW50aWFscy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGxhbWVfY2xpZW50LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcaGFuZHNoYWtlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2Vcc2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcanNvbl90b2tlbi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHN1cmZhY2VfdHJhY2UuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxqd3RfdmVyaWZpZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzZWN1cml0eVxzZWN1cmVfZW5kcG9pbnQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGNvbm5lY3Rpdml0eV9zdGF0ZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VjdXJpdHlfY29ubmVjdG9yLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzZWN1cml0eTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc2VjdXJpdHlcc2VjdXJpdHlfY29udGV4dC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcbWV0YWRhdGFfYmF0Y2guaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRzaVxmYWtlX3RyYW5zcG9ydF9zZWN1cml0eS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHNpPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXHNzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRzaTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFx0cmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRzaVxzc2xfdHlwZXMuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRzaTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFx0cmFuc3BvcnRfaW1wbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHNpXHRyYW5zcG9ydF9zZWN1cml0eS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHNpPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHNpXGZha2VfdHJhbnNwb3J0X3NlY3VyaXR5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHNpPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0c2lcdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHNpPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHNpXHNzbF90cmFuc3BvcnRfc2VjdXJpdHkuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0c2k8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xhZ2dyZWdhdGlvbi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHNpXHNzbF90eXBlcy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRzaTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXG1sb2cuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRzaVx0cmFuc3BvcnRfc2VjdXJpdHkuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlx0c2k8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xycGNfbWV0cmljX2lkLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0c2lcdHJhbnNwb3J0X3NlY3VyaXR5X2ludGVyZmFjZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRzaTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGhpcmRfcGFydHlcbmFub3BiXHBiLmgiPgogICAgICAgPEZpbHRlcj50aGlyZF9wYXJ0eVxuYW5vcGI8L0ZpbHRlcj4KQEAgLTk4MCw2NSArOTgwLDk1IEBACiAgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZSI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZWE3NDU2ODAtMjFlYS05YzVlLTY3OWItNjRkYzQwNTYyZDA4fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGNlbnN1cyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZmIzYWVmYzItODIwNS1iMGJmLTUyNWYtYWI1ZTMzOWY3Zjc2fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57M2YzMmE1OGYtMzk0Zi01ZjEzLTA2YWEtNmNjNTJjYzJkYWFmfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGNoYW5uZWwiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Q4OTdiNmMzLWM1NTUtMjM0ZS1hNTg5LWI0ZjAwODA2MzYxNX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlM2FiZmQwYS0wNjRlLTBmMmYtYzhlOC03YzVhN2U5ODE0MmF9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcY2xpZW50X2NvbmZpZyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZTcxZTY5MjgtYjFlMy0wNjE2LTA5NjEtMTUwNTM3MDQ1OGFifTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnthYzQyNjY3Yi1iYmJhLTM1NzEtMjBiYy03YTQyNDBlZjI2Y2F9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llcyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57YTNlY2E0ZDUtZjc2MC02MWE2LTcyNTEtNTU2YjgyOGM4YjQ0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXGNsaWVudCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZGJmZmViZTAtZWViYi01NzdkLTE4NjAtZWY2ODM3ZjRjZjUwfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2ZDk3YjhkOS0yYzE1LTkyN2EtODkyYS03MDlkMDczYzAyYWJ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcY2xpZW50XGluc2VjdXJlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0ZTY5OWIwMi1mYWU0LWRhYmQtYWZkMi0yZTQxYjA1YmVmMGV9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcY29tcHJlc3Npb24iPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezI2M2NiOTEzLWRmZTYtNDJhNC0wOTZiLWNhYzIzMWY3NjMwNX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxjbGllbnRcc2VjdXJlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlOThlZDI4ZS04ZGM1LTNiYjQtMjJhMi04ODkzODMxYTBhYjh9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcZGVidWciPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezFkYTdlZjhhLWEwNmQtNTQ5OS1iM2RlLTE5ZmVlNGE0MjE0ZH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxzZXJ2ZXIiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezFkMzZmZTE2LWIwMDQtNmJlZS1jNjYxLTMyODIzNGJiYjQ2OX08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxodHRwIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0MDRmZGI5ZS1hNjljLTgxZDQtMDM1Yi00NjVjODI2MTE1YTl9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcc2VydmVyXGluc2VjdXJlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlODUzOTg2My02MDI5LWNjYTQtNDRhOS01NDgxY2FjZjgxNDR9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcaW9tZ3IiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezFiYWYzODk0LWFmMzctZTY0Ny1iZGJjLTk1ZGMxN2VkMDA3M308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxzZXJ2ZXJcc2VjdXJlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswYWZhNTM5Zi04YzgzLWQ0YjktY2RlYS01NTAwOTFmMDk2Mzh9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcanNvbiI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZTY2NWNjMGUtYjk5NC1kN2M1LWNjMTgtMjAwNzM5MjAxOWYwfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NmYzNDI1NGUtZTY5Zi1jOWI0LTE1NmQtNTAyNGJhZGU1NDA4fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHByb3RvIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsxZmYwNDQ2Ni0wOTA1LThhNWQtZDZmNC03ZmYyZGY0YzEzYjV9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns1YjJkZWQzZi04NGE1LWY2YjQtMjA2MC0yODZjN2QxZGM5NDV9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVccHJvdG9cZ3JwYyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57N2M3YWQwYjMtYmY4NS01YmQzLWUwYzgtNGY1NDY4YThlMmU2fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxjZW5zdXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Y0MTA4ODg0LTk4YzMtYWMyZS1jNjY5LTgzY2Q0MTM0Mzk3NX08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxwcm90b1xncnBjXGxiIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnszZDUzM2RhZC04MTAwLWU4YTMtYjdjMy0xZmMxM2E0ZDYwZGF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXGNoYW5uZWwiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezE5MzFiMDQ0LTkwZjMtY2Q2OC1iNWY4LTIzYmU3N2NhOGVmY308L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxwcm90b1xncnBjXGxiXHYwIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswZmZjZjg2OC03NjE3LTVmZWQtYjZjZS0yMTYyZDlkMDkxNDh9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXGNsaWVudF9jb25maWciPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezJmMzI2MGRlLWJlNTctZDE4ZC02ODgyLTYxZDExNWJhYTE1OX08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxzZWN1cml0eSI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57MWQ4NTBhYzYtZTYzOS00ZWFiLTUzMzgtNGJhNDAyNzJmY2M5fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsxMThkMmJiNS0wODZmLTU0ZjMtMTFkZS0yNmQ3ZDdmNzNmOWR9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcc3RhdGlzdGljcyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57MGVmNDk4OTYtMjMxMy00YTNmLTFjZTItNzE2ZmEwZTVjNmNhfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVycyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YjlkOGRiNmMtMmM2OC0xYzkwLWZlNWUtMzdkYTkwZjQ3YWU2fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHN1cmZhY2UiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2FlYjE4ZTgyLTVkMjUtMGFhZC04YjAyLWEwYTM0NzAwNzNjZX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcY29tcHJlc3Npb24iPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2RhZGY3ZmU5LTNmMTUtZDQzMS1lNGY2LWY5ODdiMDkwNTM2Y308L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVx0cmFuc3BvcnQiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezE2OGZhMWIxLTFjMTgtZWI1NS05YTRkLTc0NmJjNThkZjJjMX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcZGVidWciPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezE5MTIyNzQyLTliOTItNWI2Ny05ZmI5LWU1NTJhYzYyY2E1ZH08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiOGI2MjNjMy1hMTY4LWEyYjEtMGQ1Zi1iNzBhMWYxY2Q4ZDJ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXGh0dHAiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2RhYjhmMDNhLTczZGUtOGNmYS04OGZiLTZlMDQ0MDJlZmI1NH08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVx0c2kiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezBiMGY5YWIxLWVmYTQtN2YwMy1lNDQ2LTZmYjliNTIyN2U4NH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcaW9tZ3IiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezU0NjhiYTM4LWI4YTMtODViMS0yMTZmLTQ4YTIzNjRlMThkZn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcanNvbiI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57Y2IyYjAwNzMtZjJhNy01YzYzLWQxODItODg3NGIyNGJkZjM2fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxwcm90byI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YjRiMTlmOWEtMTU3NS04YTIxLTBiY2EtNTM3NzQ2Zjg1OGI3fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxwcm90b1xncnBjIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntjYmM4Y2U2Ny00YTk3LWQ1MzMtOGRjMy1mOTQ5YzYzZTI3NzF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHByb3RvXGdycGNcbGIiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzMzUzMGFlLTQ0N2ItZWE4ZC0zNTMxLTk4ZjA1NTY5NjBiMH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzMzZjk0NGYtMzdkNC00MmZkLWFiYzMtNjFmMGQ0NDAwNDYyfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxzZWN1cml0eSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzQ2NjFkNjQtMzQ5Zi0wMWMxLTFiYTgtMDYwMmY5MDQ3NTk1fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxzdGF0aXN0aWNzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0ZGMzYzQ4Yi1lOTMxLWVkNDctZmZhMi1iNGVhM2E3OTU2ZWN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHN1cmZhY2UiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2EyMTk3MWZiLTMwNGYtZGEwOC1iMWIyLTdiZDhkZjhhYzM3M308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcdHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlOWQwZDNmYy1jMTAwLWYzZTYtODliOC02NDlmMjQxMTU1YmZ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHRzaSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTVhZDI4MTEtYzhkMC03YTQyLTJhNzMtYmFmMDNmY2JmNjk5fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KICAgICA8RmlsdGVyIEluY2x1ZGU9InRoaXJkX3BhcnR5Ij4KICAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnthYWFiMzBhNC0yYTE1LTczMmUtYzE0MS0zZmJjMGYwZjVhN2F9PC9VbmlxdWVJZGVudGlmaWVyPgpkaWZmIC0tZ2l0IGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfY29kZWdlbl9saWIvZ3JwY19jb2RlZ2VuX2xpYi52Y3hwcm9qIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfY29kZWdlbl9saWIvZ3JwY19jb2RlZ2VuX2xpYi52Y3hwcm9qCmluZGV4IGE2YTVhODUuLjdkN2E2MDkgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjX2NvZGVnZW5fbGliL2dycGNfY29kZWdlbl9saWIudmN4cHJvagorKysgYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwY19jb2RlZ2VuX2xpYi9ncnBjX2NvZGVnZW5fbGliLnZjeHByb2oKQEAgLTE1MiwyMSArMTUyLDIxIEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2NfYXRvbWljLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGF0bV9nY2Nfc3luYy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fd2luMzIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYnl0ZV9idWZmZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cY29tcHJlc3Npb25fdHlwZXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cY29ubmVjdGl2aXR5X3N0YXRlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGdycGNfdHlwZXMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cbG9nLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHBvcnRfcGxhdGZvcm0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5ccHJvcGFnYXRpb25fYml0cy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzbGljZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzbGljZV9idWZmZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY19nZW5lcmljLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmNfcG9zaXguaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3luY193aW4zMi5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblx0aW1lLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGJ5dGVfYnVmZmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbXByZXNzaW9uX3R5cGVzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbm5lY3Rpdml0eV9zdGF0ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxncnBjX3R5cGVzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHByb3BhZ2F0aW9uX2JpdHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdnNwcm9qZWN0c1xkdW1teS5jIj4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjX2NvZGVnZW5fbGliL2dycGNfY29kZWdlbl9saWIudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfY29kZWdlbl9saWIvZ3JwY19jb2RlZ2VuX2xpYi52Y3hwcm9qLmZpbHRlcnMKaW5kZXggYmUxZTYyMy4uODkxZGZmMCAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfY29kZWdlbl9saWIvZ3JwY19jb2RlZ2VuX2xpYi52Y3hwcm9qLmZpbHRlcnMKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfY29kZWdlbl9saWIvZ3JwY19jb2RlZ2VuX2xpYi52Y3hwcm9qLmZpbHRlcnMKQEAgLTE2LDE4ICsxNiwzNiBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxhdG1fd2luMzIuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYnl0ZV9idWZmZXIuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cY29tcHJlc3Npb25fdHlwZXMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cY29ubmVjdGl2aXR5X3N0YXRlLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGdycGNfdHlwZXMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cbG9nLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHBvcnRfcGxhdGZvcm0uaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5ccHJvcGFnYXRpb25fYml0cy5oIj4KKyAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzbGljZS5oIj4KICAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzbGljZV9idWZmZXIuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiPgorICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHN5bmMuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTQzLDI0ICs2MSw2IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHRpbWUuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cYnl0ZV9idWZmZXIuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cY29tcHJlc3Npb25fdHlwZXMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cY29ubmVjdGl2aXR5X3N0YXRlLmgiPgotICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGdycGNfdHlwZXMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5ccHJvcGFnYXRpb25fYml0cy5oIj4KLSAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzdGF0dXMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KICAgPC9JdGVtR3JvdXA+CiAKICAgPEl0ZW1Hcm91cD4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjX3Rlc3RfdXRpbC9ncnBjX3Rlc3RfdXRpbC52Y3hwcm9qIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdGVzdF91dGlsL2dycGNfdGVzdF91dGlsLnZjeHByb2oKaW5kZXggNDg3ZmZlMC4uNjY4ZjhhNSAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdGVzdF91dGlsL2dycGNfdGVzdF91dGlsLnZjeHByb2oKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdGVzdF91dGlsL2dycGNfdGVzdF91dGlsLnZjeHByb2oKQEAgLTE0NywxMSArMTQ3LDExIEBACiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KIAogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZGF0YVxzc2xfdGVzdF9kYXRhLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcc2VjdXJpdHlcb2F1dGgyX3V0aWxzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxjcV92ZXJpZmllci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZGF0YVxzc2xfdGVzdF9kYXRhLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxmaXh0dXJlc1xwcm94eS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGlvbWdyXGVuZHBvaW50X3Rlc3RzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcc2VjdXJpdHlcb2F1dGgyX3V0aWxzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcdXRpbFxncnBjX3Byb2ZpbGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcdXRpbFxwYXJzZV9oZXhzdHJpbmcuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVx1dGlsXHBvcnQuaCIgLz4KQEAgLTE1OSwyMCArMTU5LDIwIEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcdXRpbFxzbGljZV9zcGxpdHRlci5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXGNxX3ZlcmlmaWVyLmMiPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZGF0YVxzZXJ2ZXIxX2NlcnQuYyI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxkYXRhXHNlcnZlcjFfa2V5LmMiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZGF0YVx0ZXN0X3Jvb3RfY2VydC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxzZWN1cml0eVxvYXV0aDJfdXRpbHMuYyI+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxjcV92ZXJpZmllci5jIj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXGZpeHR1cmVzXHByb3h5LmMiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGlvbWdyXGVuZHBvaW50X3Rlc3RzLmMiPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXHNlY3VyaXR5XG9hdXRoMl91dGlscy5jIj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVx1dGlsXGdycGNfcHJvZmlsZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcdXRpbFxwYXJzZV9oZXhzdHJpbmcuYyI+CmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovZ3JwY190ZXN0X3V0aWwvZ3JwY190ZXN0X3V0aWwudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdGVzdF91dGlsL2dycGNfdGVzdF91dGlsLnZjeHByb2ouZmlsdGVycwppbmRleCA2OGM3NWU4Li43ZjI4NzZkIDEwMDY0NAotLS0gYS92c3Byb2plY3RzL3ZjeHByb2ovZ3JwY190ZXN0X3V0aWwvZ3JwY190ZXN0X3V0aWwudmN4cHJvai5maWx0ZXJzCisrKyBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjX3Rlc3RfdXRpbC9ncnBjX3Rlc3RfdXRpbC52Y3hwcm9qLmZpbHRlcnMKQEAgLTEsNiArMSw5IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcY3FfdmVyaWZpZXIuYyI+CisgICAgICA8RmlsdGVyPnRlc3RcY29yZVxlbmQyZW5kPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxkYXRhXHNlcnZlcjFfY2VydC5jIj4KICAgICAgIDxGaWx0ZXI+dGVzdFxjb3JlXGVuZDJlbmRcZGF0YTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTAsMTggKzEzLDE1IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxkYXRhXHRlc3Rfcm9vdF9jZXJ0LmMiPgogICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZFxkYXRhPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcc2VjdXJpdHlcb2F1dGgyX3V0aWxzLmMiPgotICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXGNxX3ZlcmlmaWVyLmMiPgotICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZDwvRmlsdGVyPgotICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZml4dHVyZXNccHJveHkuYyI+CiAgICAgICA8RmlsdGVyPnRlc3RcY29yZVxlbmQyZW5kXGZpeHR1cmVzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcaW9tZ3JcZW5kcG9pbnRfdGVzdHMuYyI+CiAgICAgICA8RmlsdGVyPnRlc3RcY29yZVxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXHNlY3VyaXR5XG9hdXRoMl91dGlscy5jIj4KKyAgICAgIDxGaWx0ZXI+dGVzdFxjb3JlXHNlY3VyaXR5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcdXRpbFxncnBjX3Byb2ZpbGVyLmMiPgogICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcdXRpbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtNDIsMjEgKzQyLDIxIEBACiAgICAgPC9DbENvbXBpbGU+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZGF0YVxzc2xfdGVzdF9kYXRhLmgiPgotICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZFxkYXRhPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcc2VjdXJpdHlcb2F1dGgyX3V0aWxzLmgiPgotICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KLSAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXGNxX3ZlcmlmaWVyLmgiPgogICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZGF0YVxzc2xfdGVzdF9kYXRhLmgiPgorICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZFxkYXRhPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxmaXh0dXJlc1xwcm94eS5oIj4KICAgICAgIDxGaWx0ZXI+dGVzdFxjb3JlXGVuZDJlbmRcZml4dHVyZXM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxpb21nclxlbmRwb2ludF90ZXN0cy5oIj4KICAgICAgIDxGaWx0ZXI+dGVzdFxjb3JlXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcc2VjdXJpdHlcb2F1dGgyX3V0aWxzLmgiPgorICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcc2VjdXJpdHk8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVx1dGlsXGdycGNfcHJvZmlsZXIuaCI+CiAgICAgICA8RmlsdGVyPnRlc3RcY29yZVx1dGlsPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovZ3JwY191bnNlY3VyZS9ncnBjX3Vuc2VjdXJlLnZjeHByb2ogYi92c3Byb2plY3RzL3ZjeHByb2ovZ3JwY191bnNlY3VyZS9ncnBjX3Vuc2VjdXJlLnZjeHByb2oKaW5kZXggNGYyMzM2YS4uZTg5Y2M4YSAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdW5zZWN1cmUvZ3JwY191bnNlY3VyZS52Y3hwcm9qCisrKyBiL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjX3Vuc2VjdXJlL2dycGNfdW5zZWN1cmUudmN4cHJvagpAQCAtMjYwLDQyOCArMjYwLDQyOCBAQAogICA8SXRlbUdyb3VwPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGJ5dGVfYnVmZmVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcYnl0ZV9idWZmZXJfcmVhZGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcY2Vuc3VzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcY29tcHJlc3Npb24uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xncnBjLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3RhdHVzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGJ5dGVfYnVmZmVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbXByZXNzaW9uX3R5cGVzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXGNvbm5lY3Rpdml0eV9zdGF0ZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxncnBjX3R5cGVzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcaW1wbFxjb2RlZ2VuXHByb3BhZ2F0aW9uX2JpdHMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW5cc3RhdHVzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcY2Vuc3VzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3RhdHVzLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfZmlsdGVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcZ3JwY19wbHVnaW4uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9hcmdzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2suaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNsaWVudF9jaGFubmVsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNvbXByZXNzX2ZpbHRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb25uZWN0ZWRfY2hhbm5lbC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb250ZXh0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGh0dHBfY2xpZW50X2ZpbHRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xjbGllbnRfY29uZmlnLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGNvbm5lY3Rvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xpbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXGxvYWRfYmFsYW5jZXJfYXBpLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccm91bmRfcm9iaW4uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9yZWdpc3RyeS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9mYWN0b3J5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyX3JlZ2lzdHJ5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xkbnNfcmVzb2x2ZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXHNvY2thZGRyX3Jlc29sdmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9mYWN0b3J5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcdXJpX3BhcnNlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY29tcHJlc3Npb25cYWxnb3JpdGhtX21ldGFkYXRhLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxkZWJ1Z1x0cmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxmb3JtYXRfcmVxdWVzdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxodHRwY2xpLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXHBhcnNlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcY2xvc3VyZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGVuZHBvaW50X3BhaXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGV4ZWNfY3R4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjdXRvci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZmRfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvY3Bfd2luZG93cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3IuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyX2ludGVybmFsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21ncl9wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9zZXQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF93aW5kb3dzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3dpbmRvd3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHJlc29sdmVfYWRkcmVzcy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2FkZHIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2thZGRyX3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl91dGlscy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2FkZHJfd2luMzIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9jbGllbnQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9wb3NpeC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3NlcnZlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3dpbmRvd3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRpbWVfYXZlcmFnZWRfc3RhdHMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRpbWVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lcl9oZWFwLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1ZHBfc2VydmVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9waXBlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcG9zaXguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd29ya3F1ZXVlX3Bvc2l4LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWVfd2luZG93cy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fY29tbW9uLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fcmVhZGVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fd3JpdGVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxwcm90b1xncnBjXGxiXHYwXGxvYWRfYmFsYW5jZXIucGIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN0YXRpc3RpY3NcY2Vuc3VzX2ludGVyZmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3RhdGlzdGljc1xjZW5zdXNfcnBjX3N0YXRzLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGFwaV90cmFjZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNhbGxfdGVzdF9vbmx5LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9pbml0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfc3RhY2tfdHlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjb21wbGV0aW9uX3F1ZXVlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGV2ZW50X3N0cmluZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxpbml0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGxhbWVfY2xpZW50LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHNlcnZlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzdXJmYWNlX3RyYWNlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcYnl0ZV9zdHJlYW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcYWxwbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxiaW5fZW5jb2Rlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9kYXRhLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2dvYXdheS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9waW5nLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3JzdF9zdHJlYW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfc2V0dGluZ3MuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfd2luZG93X3VwZGF0ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19lbmNvZGVyLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX3BhcnNlci5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja190YWJsZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxodHRwMl9lcnJvcnMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHVmZnN5bXMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaW5jb21pbmdfbWV0YWRhdGEuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaW50ZXJuYWwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RhdHVzX2NvbnZlcnNpb24uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RyZWFtX21hcC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx0aW1lb3V0X2VuY29kaW5nLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHZhcmludC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMl90cmFuc3BvcnQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjb25uZWN0aXZpdHlfc3RhdGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxtZXRhZGF0YS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhX2JhdGNoLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcc3RhdGljX21ldGFkYXRhLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0X2ltcGwuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xhZ2dyZWdhdGlvbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXG1sb2cuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xycGNfbWV0cmljX2lkLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYWxwbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGJpbl9lbmNvZGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfZGF0YS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX2dvYXdheS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3BpbmcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9yc3Rfc3RyZWFtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfc2V0dGluZ3MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV93aW5kb3dfdXBkYXRlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfZW5jb2Rlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3BhcnNlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3RhYmxlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHR0cDJfZXJyb3JzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHVmZnN5bXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxpbmNvbWluZ19tZXRhZGF0YS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGludGVybmFsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RhdHVzX2NvbnZlcnNpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdHJlYW1fbWFwLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdGltZW91dF9lbmNvZGluZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHZhcmludC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xhZ2dyZWdhdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX2ZpbHRlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX3BsdWdpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xtbG9nLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXHJwY19tZXRyaWNfaWQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfYXJncy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFjay5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29tcHJlc3NfZmlsdGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb25uZWN0ZWRfY2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29udGV4dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcaHR0cF9jbGllbnRfZmlsdGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNvbm5lY3Rvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNcbG9hZF9iYWxhbmNlcl9hcGkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3kuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfcmVnaXN0cnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9mYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXGRuc19yZXNvbHZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXHNvY2thZGRyX3Jlc29sdmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2ZhY3RvcnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxhbGdvcml0aG1fbWV0YWRhdGEuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcZGVidWdcdHJhY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGZvcm1hdF9yZXF1ZXN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxodHRwY2xpLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxwYXJzZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxjbG9zdXJlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxlbmRwb2ludF9wYWlyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZXhlY19jdHguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjdXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGZkX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9jcF93aW5kb3dzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9tZ3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl9pbnRlcm5hbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfcG9zaXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3NldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXRfd2luZG93cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfd2luZG93cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHJlc29sdmVfYWRkcmVzcy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHJfcG9zaXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrYWRkcl91dGlscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyX3dpbjMyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3V0aWxzX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3Bvc2l4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3NlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF93aW5kb3dzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZXJfaGVhcC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVkcF9zZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1bml4X3NvY2tldHNfcG9zaXguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3YWtldXBfZmRfcGlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZV93aW5kb3dzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX2NvbW1vbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl9yZWFkZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fd3JpdGVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3RhdGlzdGljc1xjZW5zdXNfaW50ZXJmYWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3RhdGlzdGljc1xjZW5zdXNfcnBjX3N0YXRzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxhcGlfdHJhY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGxfdGVzdF9vbmx5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX2luaXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfc3RhY2tfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY29tcGxldGlvbl9xdWV1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcZXZlbnRfc3RyaW5nLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxpbml0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxsYW1lX2NsaWVudC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2Vcc2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxzdXJmYWNlX3RyYWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGNvbm5lY3Rpdml0eV9zdGF0ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxzdGF0aWNfbWV0YWRhdGEuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcdHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydF9pbXBsLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0aGlyZF9wYXJ0eVxuYW5vcGJccGIuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRoaXJkX3BhcnR5XG5hbm9wYlxwYl9jb21tb24uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRoaXJkX3BhcnR5XG5hbm9wYlxwYl9kZWNvZGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRoaXJkX3BhcnR5XG5hbm9wYlxwYl9lbmNvZGUuaCIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGluaXRfdW5zZWN1cmUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxjbGllbnRcaW5zZWN1cmVcY2hhbm5lbF9jcmVhdGUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcZ3JwY19jb250ZXh0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcc2VydmVyXGluc2VjdXJlXHNlcnZlcl9jaHR0cDIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcZ3JwY19maWx0ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYWxwbi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX3BsdWdpbi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxiaW5fZW5jb2Rlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9hcmdzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGNodHRwMl90cmFuc3BvcnQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfc3RhY2suYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX2dvYXdheS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2xpZW50X2NoYW5uZWwuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfcGluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29tcHJlc3NfZmlsdGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3JzdF9zdHJlYW0uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNvbm5lY3RlZF9jaGFubmVsLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3NldHRpbmdzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfd2luZG93X3VwZGF0ZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcaHR0cF9zZXJ2ZXJfZmlsdGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX2VuY29kZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfcGFyc2VyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xjbGllbnRfY29uZmlnLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3RhYmxlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xjb25uZWN0b3IuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHVmZnN5bXMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGRlZmF1bHRfaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxpbmNvbWluZ19tZXRhZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxwYXJzaW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xsb2FkX2JhbGFuY2VyX2FwaS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdGF0dXNfY29udmVyc2lvbi5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccGlja19maXJzdC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdHJlYW1fbGlzdHMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XHN0cmVhbV9tYXAuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx0aW1lb3V0X2VuY29kaW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfZmFjdG9yeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx2YXJpbnQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9yZWdpc3RyeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx3cml0aW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcY29udGV4dC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJfZmFjdG9yeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19jb250ZXh0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19maWx0ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xkbnNfcmVzb2x2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGdycGNfcGx1Z2luLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcc29ja2FkZHJfcmVzb2x2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGluaXRpYWxpemUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXG1sb2cuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcb3BlcmF0aW9uLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2luZGV4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xwbGFjZWhvbGRlcnMuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXHRyYWNpbmcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjb21wcmVzc2lvblxjb21wcmVzc2lvbl9hbGdvcml0aG0uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjaGFubmVsX2FyZ3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFjay5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGRlYnVnXHRyYWNlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxmb3JtYXRfcmVxdWVzdC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNsaWVudF9jaGFubmVsLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxodHRwY2xpLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29tcHJlc3NfZmlsdGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxwYXJzZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb25uZWN0ZWRfY2hhbm5lbC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGNsb3N1cmUuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX2NsaWVudF9maWx0ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxlbmRwb2ludC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGh0dHBfc2VydmVyX2ZpbHRlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGVuZHBvaW50X3BhaXJfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxzdWJjaGFubmVsX2NhbGxfaG9sZGVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcY2xpZW50X2NvbmZpZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGV4ZWNfY3R4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcY29ubmVjdG9yLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZXhlY3V0b3IuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xkZWZhdWx0X2luaXRpYWxfY29ubmVjdF9zdHJpbmcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxmZF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGluaXRpYWxfY29ubmVjdF9zdHJpbmcuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb2NwX3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xsb2FkX2JhbGFuY2VyX2FwaS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccGlja19maXJzdC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccm91bmRfcm9iaW4uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21ncl93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5X2ZhY3RvcnkuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9yZWdpc3RyeS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJfZmFjdG9yeS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0X3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfd2luZG93cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xkbnNfcmVzb2x2ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxyZXNvbHZlX2FkZHJlc3NfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcc29ja2FkZHJfcmVzb2x2ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxyZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl91dGlscy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19jb21tb25fcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2luZGV4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3V0aWxzX2xpbnV4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcdXJpX3BhcnNlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxjb21wcmVzc2lvbl9hbGdvcml0aG0uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrZXRfd2luZG93cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxtZXNzYWdlX2NvbXByZXNzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX2NsaWVudF9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxkZWJ1Z1x0cmFjZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9jbGllbnRfd2luZG93cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGZvcm1hdF9yZXF1ZXN0LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGh0dHBcaHR0cGNsaS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9zZXJ2ZXJfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxwYXJzZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfc2VydmVyX3dpbmRvd3MuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcY2xvc3VyZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGVuZHBvaW50LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxlbmRwb2ludF9wYWlyX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZXJfaGVhcC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjX2N0eC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHVkcF9zZXJ2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZXhlY3V0b3IuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXguYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZmRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXhfbm9vcC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb2NwX3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfZXZlbnRmZC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21nci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9ub3NwZWNpYWwuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9tZ3JfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcGlwZS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl93aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX3Bvc2l4LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV93aW5kb3dzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb24uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fcmVhZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3dpbmRvd3MuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fc3RyaW5nLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl93cml0ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccmVzb2x2ZV9hZGRyZXNzX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHJlc29sdmVfYWRkcmVzc193aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxhbGFybS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrYWRkcl91dGlscy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYXBpX3RyYWNlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF91dGlsc19jb21tb25fcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGJ5dGVfYnVmZmVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF91dGlsc19saW51eC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYnl0ZV9idWZmZXJfcmVhZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2FsbC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2FsbF9kZXRhaWxzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9jbGllbnRfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNhbGxfbG9nX2JhdGNoLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9jbGllbnRfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfY29ubmVjdGl2aXR5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9zZXJ2ZXJfcG9zaXguYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfY3JlYXRlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF9zZXJ2ZXJfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9pbml0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRjcF93aW5kb3dzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX3BpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9zdGFja190eXBlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjb21wbGV0aW9uX3F1ZXVlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVyX2hlYXAuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGV2ZW50X3N0cmluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1ZHBfc2VydmVyLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxpbml0LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVuaXhfc29ja2V0c19wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcbGFtZV9jbGllbnQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXG1ldGFkYXRhX2FycmF5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9ldmVudGZkLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZXJ2ZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX25vc3BlY2lhbC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2Vcc2VydmVyX2NodHRwMi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3YWtldXBfZmRfcGlwZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcdmFsaWRhdGVfbWV0YWRhdGEuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX3Bvc2l4LmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVx2ZXJzaW9uLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxieXRlX3N0cmVhbS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfd2luZG93cy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcYWxwbi5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb24uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGJpbl9lbmNvZGVyLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl9yZWFkZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2RhdGEuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX3N0cmluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfZ29hd2F5LmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl93cml0ZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3BpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9yc3Rfc3RyZWFtLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYWxhcm0uYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3NldHRpbmdzLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYXBpX3RyYWNlLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV93aW5kb3dfdXBkYXRlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYnl0ZV9idWZmZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX2VuY29kZXIuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxieXRlX2J1ZmZlcl9yZWFkZXIuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX3BhcnNlci5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGwuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX3RhYmxlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2FsbF9kZXRhaWxzLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxodWZmc3ltcy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGxfbG9nX2JhdGNoLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxpbmNvbWluZ19tZXRhZGF0YS5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWwuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHBhcnNpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX2Nvbm5lY3Rpdml0eS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RhdHVzX2NvbnZlcnNpb24uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjaGFubmVsX2luaXQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHN0cmVhbV9saXN0cy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfcGluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RyZWFtX21hcC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfc3RhY2tfdHlwZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcdGltZW91dF9lbmNvZGluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNvbXBsZXRpb25fcXVldWUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHZhcmludC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGV2ZW50X3N0cmluZy5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcd3JpdGluZy5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXRfdW5zZWN1cmUuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY29ubmVjdGl2aXR5X3N0YXRlLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcbGFtZV9jbGllbnQuYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcbWV0YWRhdGEuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxtZXRhZGF0YV9hcnJheS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5jIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHNlcnZlci5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxzdGF0aWNfbWV0YWRhdGEuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVx2YWxpZGF0ZV9tZXRhZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFx0cmFuc3BvcnQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVx2ZXJzaW9uLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHRyYW5zcG9ydF9vcF9zdHJpbmcuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmMiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGNvbnRleHQuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGNvbm5lY3Rpdml0eV9zdGF0ZS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xpbml0aWFsaXplLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xtbG9nLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xvcGVyYXRpb24uYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xwbGFjZWhvbGRlcnMuYyI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydC5jIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1x0cmFjaW5nLmMiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFx0cmFuc3BvcnRfb3Bfc3RyaW5nLmMiPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGhpcmRfcGFydHlcbmFub3BiXHBiX2NvbW1vbi5jIj4KICAgICA8L0NsQ29tcGlsZT4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9ncnBjX3Vuc2VjdXJlL2dycGNfdW5zZWN1cmUudmN4cHJvai5maWx0ZXJzIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdW5zZWN1cmUvZ3JwY191bnNlY3VyZS52Y3hwcm9qLmZpbHRlcnMKaW5kZXggZTMxZWNlNy4uYzlmMWFkNiAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdW5zZWN1cmUvZ3JwY191bnNlY3VyZS52Y3hwcm9qLmZpbHRlcnMKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL2dycGNfdW5zZWN1cmUvZ3JwY191bnNlY3VyZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTEsNDI4ICsxLDQyOCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcaW5pdF91bnNlY3VyZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcY2xpZW50XGluc2VjdXJlXGNoYW5uZWxfY3JlYXRlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxjbGllbnRcaW5zZWN1cmU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX2NvbnRleHQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcc2VydmVyXGluc2VjdXJlXHNlcnZlcl9jaHR0cDIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHNlcnZlclxpbnNlY3VyZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfZmlsdGVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxhbHBuLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNlbnN1c1xncnBjX3BsdWdpbi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcYmluX2VuY29kZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjaGFubmVsX2FyZ3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxjaHR0cDJfdHJhbnNwb3J0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2hhbm5lbF9zdGFjay5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX2RhdGEuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjaGFubmVsX3N0YWNrX2J1aWxkZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9nb2F3YXkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3BpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9yc3Rfc3RyZWFtLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9zZXR0aW5ncy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGh0dHBfY2xpZW50X2ZpbHRlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3dpbmRvd191cGRhdGUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxocGFja19lbmNvZGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3BhcnNlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxocGFja190YWJsZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGNvbm5lY3Rvci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGh1ZmZzeW1zLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaW5jb21pbmdfbWV0YWRhdGEuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xpbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRccGFyc2luZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXGxvYWRfYmFsYW5jZXJfYXBpLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RhdHVzX2NvbnZlcnNpb24uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xwaWNrX2ZpcnN0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RyZWFtX2xpc3RzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNccm91bmRfcm9iaW4uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdHJlYW1fbWFwLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdGltZW91dF9lbmNvZGluZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdmFyaW50LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5X3JlZ2lzdHJ5LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcd3JpdGluZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2Vuc3VzXGNvbnRleHQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJfZmFjdG9yeS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX2NvbnRleHQuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJfcmVnaXN0cnkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXGRuc19yZXNvbHZlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcZ3JwY19wbHVnaW4uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXHNvY2thZGRyX3Jlc29sdmVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyczwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xpbml0aWFsaXplLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcbWxvZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2ZhY3RvcnkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcb3BlcmF0aW9uLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNccGxhY2Vob2xkZXJzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcdHJhY2luZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY29tcHJlc3Npb25cY29tcHJlc3Npb25fYWxnb3JpdGhtLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjb21wcmVzc2lvbjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9hcmdzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY29tcHJlc3Npb25cbWVzc2FnZV9jb21wcmVzcy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY29tcHJlc3Npb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfc3RhY2suYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxkZWJ1Z1x0cmFjZS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZGVidWc8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNoYW5uZWxfc3RhY2tfYnVpbGRlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGh0dHBcZm9ybWF0X3JlcXVlc3QuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGh0dHA8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNsaWVudF9jaGFubmVsLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxodHRwY2xpLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxodHRwPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxodHRwXHBhcnNlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaHR0cDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxjbG9zdXJlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcaHR0cF9jbGllbnRfZmlsdGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxodHRwX3NlcnZlcl9maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxlbmRwb2ludF9wYWlyX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcc3ViY2hhbm5lbF9jYWxsX2hvbGRlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGVuZHBvaW50X3BhaXJfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNsaWVudF9jb25maWcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjX2N0eC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGNvbm5lY3Rvci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGV4ZWN1dG9yLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcZGVmYXVsdF9pbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZmRfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xpbml0aWFsX2Nvbm5lY3Rfc3RyaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9jcF93aW5kb3dzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNcbG9hZF9iYWxhbmNlcl9hcGkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21nci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21ncl9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcaW9tZ3Jfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfbXVsdGlwb2xsZXJfd2l0aF9lcG9sbC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9mYWN0b3J5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JccG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX3BvbGxfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3lfcmVnaXN0cnkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyX2ZhY3RvcnkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF93aW5kb3dzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJfcmVnaXN0cnkuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHJlc29sdmVfYWRkcmVzc19wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xzb2NrYWRkcl9yZXNvbHZlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxyZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl91dGlscy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19jb21tb25fcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsX2luZGV4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3V0aWxzX2xpbnV4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcdXJpX3BhcnNlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF91dGlsc19wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxjb21wcmVzc2lvbl9hbGdvcml0aG0uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjb21wcmVzc2lvbjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY29tcHJlc3Npb25cbWVzc2FnZV9jb21wcmVzcy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNvbXByZXNzaW9uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3BfY2xpZW50X3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGRlYnVnXHRyYWNlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcZGVidWc8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9jbGllbnRfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxodHRwXGZvcm1hdF9yZXF1ZXN0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaHR0cDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGNwX3Bvc2l4LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGh0dHBcaHR0cGNsaS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGh0dHA8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9zZXJ2ZXJfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxwYXJzZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxodHRwPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfc2VydmVyX3dpbmRvd3MuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcY2xvc3VyZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxlbmRwb2ludC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lX2F2ZXJhZ2VkX3N0YXRzLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGVuZHBvaW50X3BhaXJfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZW5kcG9pbnRfcGFpcl93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRpbWVyX2hlYXAuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZXhlY19jdHguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdWRwX3NlcnZlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjdXRvci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx1bml4X3NvY2tldHNfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcZmRfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdW5peF9zb2NrZXRzX3Bvc2l4X25vb3AuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9jcF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9ldmVudGZkLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGlvbWdyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdha2V1cF9mZF9ub3NwZWNpYWwuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9tZ3JfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd2FrZXVwX2ZkX3BpcGUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9tZ3Jfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcG9zaXguYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9tdWx0aXBvbGxlcl93aXRoX2Vwb2xsLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHdvcmtxdWV1ZV9wb3NpeC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X211bHRpcG9sbGVyX3dpdGhfcG9sbF9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3b3JrcXVldWVfd2luZG93cy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcanNvbjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl9yZWFkZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3NldF93aW5kb3dzLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGpzb25canNvbl9zdHJpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGpzb248L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxwb2xsc2V0X3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX3dyaXRlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcanNvbjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHJlc29sdmVfYWRkcmVzc19wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxwcm90b1xncnBjXGxiXHYwXGxvYWRfYmFsYW5jZXIucGIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHByb3RvXGdycGNcbGJcdjA8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxyZXNvbHZlX2FkZHJlc3Nfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGFsYXJtLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHJfdXRpbHMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxhcGlfdHJhY2UuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfdXRpbHNfY29tbW9uX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYnl0ZV9idWZmZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfdXRpbHNfbGludXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxieXRlX2J1ZmZlcl9yZWFkZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfdXRpbHNfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsX2RldGFpbHMuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50X3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2FsbF9sb2dfYmF0Y2guYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50X3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9jb25uZWN0aXZpdHkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfc2VydmVyX3Bvc2l4LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9jcmVhdGUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfc2VydmVyX3dpbmRvd3MuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX2luaXQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWxfcGluZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVfYXZlcmFnZWRfc3RhdHMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjaGFubmVsX3N0YWNrX3R5cGUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0aW1lci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNvbXBsZXRpb25fcXVldWUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0aW1lcl9oZWFwLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcZXZlbnRfc3RyaW5nLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdWRwX3NlcnZlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGluaXQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1bml4X3NvY2tldHNfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxsYW1lX2NsaWVudC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVuaXhfc29ja2V0c19wb3NpeF9ub29wLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcbWV0YWRhdGFfYXJyYXkuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3YWtldXBfZmRfZXZlbnRmZC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHNlcnZlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9ub3NwZWNpYWwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZXJ2ZXJfY2h0dHAyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd2FrZXVwX2ZkX3BpcGUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVx2YWxpZGF0ZV9tZXRhZGF0YS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXHZlcnNpb24uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfcG9zaXguYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfd2luZG93cy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGFscG4uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb24uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGJpbl9lbmNvZGVyLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX3JlYWRlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGpzb248L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfZGF0YS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl9zdHJpbmcuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX2dvYXdheS5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGpzb25canNvbl93cml0ZXIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3BpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxwcm90b1xncnBjXGxiXHYwXGxvYWRfYmFsYW5jZXIucGIuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxwcm90b1xncnBjXGxiXHYwPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3JzdF9zdHJlYW0uYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGFsYXJtLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9zZXR0aW5ncy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYXBpX3RyYWNlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV93aW5kb3dfdXBkYXRlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxieXRlX2J1ZmZlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHBhY2tfZW5jb2Rlci5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcYnl0ZV9idWZmZXJfcmVhZGVyLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19wYXJzZXIuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX3RhYmxlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjYWxsX2RldGFpbHMuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGh1ZmZzeW1zLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjYWxsX2xvZ19iYXRjaC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaW5jb21pbmdfbWV0YWRhdGEuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWwuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXHBhcnNpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfY29ubmVjdGl2aXR5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxzdGF0dXNfY29udmVyc2lvbi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9pbml0LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxzdHJlYW1fbGlzdHMuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfcGluZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RyZWFtX21hcC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbF9zdGFja190eXBlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx0aW1lb3V0X2VuY29kaW5nLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxjb21wbGV0aW9uX3F1ZXVlLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx2YXJpbnQuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGV2ZW50X3N0cmluZy5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcd3JpdGluZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcaW5pdC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJfdHJhbnNwb3J0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXRfdW5zZWN1cmUuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY29ubmVjdGl2aXR5X3N0YXRlLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGxhbWVfY2xpZW50LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXG1ldGFkYXRhX2FycmF5LmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhX2JhdGNoLmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHNlcnZlci5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxzdGF0aWNfbWV0YWRhdGEuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcdmFsaWRhdGVfbWV0YWRhdGEuYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0LmMiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHZlcnNpb24uYyI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0X29wX3N0cmluZy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGJ5dGVfc3RyZWFtLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcY29udGV4dC5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGNvbm5lY3Rpdml0eV9zdGF0ZS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGluaXRpYWxpemUuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXG1sb2cuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXG9wZXJhdGlvbi5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXHBsYWNlaG9sZGVycy5jIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydC5jIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXHRyYWNpbmcuYyI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFx0cmFuc3BvcnRfb3Bfc3RyaW5nLmMiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0aGlyZF9wYXJ0eVxuYW5vcGJccGJfY29tbW9uLmMiPgogICAgICAgPEZpbHRlcj50aGlyZF9wYXJ0eVxuYW5vcGI8L0ZpbHRlcj4KQEAgLTQ0MSwxNSArNDQxLDE1IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcYnl0ZV9idWZmZXJfcmVhZGVyLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xjZW5zdXMuaCI+CisgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGNvbXByZXNzaW9uLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xncnBjLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xzdGF0dXMuaCI+Ci0gICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwYzwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxieXRlX2J1ZmZlci5oIj4KICAgICAgIDxGaWx0ZXI+aW5jbHVkZVxncnBjXGltcGxcY29kZWdlbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtNDY4LDM3OSArNDY4LDM3OSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5caW5jbHVkZVxncnBjXGltcGxcY29kZWdlblxzdGF0dXMuaCI+CiAgICAgICA8RmlsdGVyPmluY2x1ZGVcZ3JwY1xpbXBsXGNvZGVnZW48L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXGluY2x1ZGVcZ3JwY1xjZW5zdXMuaCI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxpbmNsdWRlXGdycGNcc3RhdHVzLmgiPgogICAgICAgPEZpbHRlcj5pbmNsdWRlXGdycGM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcZ3JwY19maWx0ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGFscG4uaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGdycGNfcGx1Z2luLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxiaW5fZW5jb2Rlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGNoYW5uZWxfYXJncy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGNodHRwMl90cmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjaGFubmVsX3N0YWNrLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWUuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjaGFubmVsX3N0YWNrX2J1aWxkZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9kYXRhLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY2xpZW50X2NoYW5uZWwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9nb2F3YXkuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxjb21wcmVzc19maWx0ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9waW5nLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29ubmVjdGVkX2NoYW5uZWwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNoYW5uZWw8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxmcmFtZV9yc3Rfc3RyZWFtLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcY29udGV4dC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGZyYW1lX3NldHRpbmdzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNoYW5uZWxcaHR0cF9jbGllbnRfZmlsdGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcZnJhbWVfd2luZG93X3VwZGF0ZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjaGFubmVsXGh0dHBfc2VydmVyX2ZpbHRlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2hhbm5lbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX2VuY29kZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2hhbm5lbFxzdWJjaGFubmVsX2NhbGxfaG9sZGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjaGFubmVsPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHBhY2tfcGFyc2VyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcY2xpZW50X2NvbmZpZy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGhwYWNrX3RhYmxlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcY29ubmVjdG9yLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcaHR0cDJfZXJyb3JzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcaW5pdGlhbF9jb25uZWN0X3N0cmluZy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0XGh1ZmZzeW1zLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXNcbG9hZF9iYWxhbmNlcl9hcGkuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxpbmNvbWluZ19tZXRhZGF0YS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHBpY2tfZmlyc3QuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxpbnRlcm5hbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXHJvdW5kX3JvYmluLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcc3RhdHVzX2NvbnZlcnNpb24uaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY3kuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFxzdHJlYW1fbWFwLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5X2ZhY3RvcnkuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHRyYW5zcG9ydFx0aW1lb3V0X2VuY29kaW5nLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcbGJfcG9saWN5X3JlZ2lzdHJ5LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnRcdmFyaW50LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNcYWdncmVnYXRpb24uaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjZW5zdXM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJfZmFjdG9yeS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX2ZpbHRlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xncnBjX3BsdWdpbi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnNcZG5zX3Jlc29sdmVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyczwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNlbnN1c1xtbG9nLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2Vuc3VzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xzb2NrYWRkcl9yZXNvbHZlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjZW5zdXNccnBjX21ldHJpY19pZC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNlbnN1czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xzdWJjaGFubmVsLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjaGFubmVsX2FyZ3MuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFjay5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbF9pbmRleC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY2hhbm5lbF9zdGFja19idWlsZGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2xpZW50X2NvbmZpZ1x1cmlfcGFyc2VyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjbGllbnRfY2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNvbXByZXNzaW9uXGFsZ29yaXRobV9tZXRhZGF0YS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY29tcHJlc3Npb248L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGNvbXByZXNzX2ZpbHRlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGNvbXByZXNzaW9uXG1lc3NhZ2VfY29tcHJlc3MuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNvbXByZXNzaW9uPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2hhbm5lbFxjb25uZWN0ZWRfY2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGRlYnVnXHRyYWNlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxkZWJ1ZzwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcY29udGV4dC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGh0dHBcZm9ybWF0X3JlcXVlc3QuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGh0dHA8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXGh0dHBfY2xpZW50X2ZpbHRlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNoYW5uZWw8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGh0dHBcaHR0cGNsaS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaHR0cDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNoYW5uZWxcaHR0cF9zZXJ2ZXJfZmlsdGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2hhbm5lbDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaHR0cFxwYXJzZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGh0dHA8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjaGFubmVsXHN1YmNoYW5uZWxfY2FsbF9ob2xkZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjaGFubmVsPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxjbG9zdXJlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcY2xpZW50X2NvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGVuZHBvaW50LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcY29ubmVjdG9yLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZW5kcG9pbnRfcGFpci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGluaXRpYWxfY29ubmVjdF9zdHJpbmcuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxleGVjX2N0eC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljaWVzXGxvYWRfYmFsYW5jZXJfYXBpLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZXhlY3V0b3IuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xwaWNrX2ZpcnN0LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llczwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcZmRfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llc1xyb3VuZF9yb2Jpbi5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWNpZXM8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvY3Bfd2luZG93cy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcbGJfcG9saWN5X2ZhY3RvcnkuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxpb21ncl9pbnRlcm5hbC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXGxiX3BvbGljeV9yZWdpc3RyeS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXGlvbWdyX3Bvc2l4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJfZmFjdG9yeS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcl9yZWdpc3RyeS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfc2V0LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzXGRuc19yZXNvbHZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF9wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHJlc29sdmVyc1xzb2NrYWRkcl9yZXNvbHZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdccmVzb2x2ZXJzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxwb2xsc2V0X3NldF93aW5kb3dzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGNsaWVudF9jb25maWdcc3ViY2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHBvbGxzZXRfd2luZG93cy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfZmFjdG9yeS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNsaWVudF9jb25maWc8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHJlc29sdmVfYWRkcmVzcy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHN1YmNoYW5uZWxfaW5kZXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnXHVyaV9wYXJzZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjbGllbnRfY29uZmlnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl9wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxjb21wcmVzc2lvblxhbGdvcml0aG1fbWV0YWRhdGEuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxjb21wcmVzc2lvbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcc29ja2FkZHJfdXRpbHMuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcY29tcHJlc3Npb25cbWVzc2FnZV9jb21wcmVzcy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGNvbXByZXNzaW9uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrYWRkcl93aW4zMi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxkZWJ1Z1x0cmFjZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGRlYnVnPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclxzb2NrZXRfdXRpbHNfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxmb3JtYXRfcmVxdWVzdC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGh0dHA8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHNvY2tldF93aW5kb3dzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGh0dHBcaHR0cGNsaS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGh0dHA8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF9jbGllbnQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaHR0cFxwYXJzZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxodHRwPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3BfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcY2xvc3VyZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0Y3Bfc2VydmVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGVuZHBvaW50LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHRjcF93aW5kb3dzLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGVuZHBvaW50X3BhaXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3JcdGltZV9hdmVyYWdlZF9zdGF0cy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjX2N0eC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxleGVjdXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx0aW1lcl9oZWFwLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXGZkX3Bvc2l4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHVkcF9zZXJ2ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9jcF93aW5kb3dzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGlvbWdyXHVuaXhfc29ja2V0c19wb3NpeC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21nci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcGlwZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcaW9tZ3I8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxpb21ncl9pbnRlcm5hbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxpb21nclx3YWtldXBfZmRfcG9zaXguaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcaW9tZ3JfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd29ya3F1ZXVlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd29ya3F1ZXVlX3Bvc2l4LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxpb21ncjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcaW9tZ3Jcd29ya3F1ZXVlX3dpbmRvd3MuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGlvbWdyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxqc29uPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccG9sbHNldF9zZXRfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX2NvbW1vbi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcanNvbjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfc2V0X3dpbmRvd3MuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcanNvblxqc29uX3JlYWRlci5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcanNvbjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHBvbGxzZXRfd2luZG93cy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxqc29uXGpzb25fd3JpdGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxqc29uPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JccmVzb2x2ZV9hZGRyZXNzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHByb3RvXGdycGNcbGJcdjBcbG9hZF9iYWxhbmNlci5wYi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVccHJvdG9cZ3JwY1xsYlx2MDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN0YXRpc3RpY3NcY2Vuc3VzX2ludGVyZmFjZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3RhdGlzdGljczwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyX3Bvc2l4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN0YXRpc3RpY3NcY2Vuc3VzX3JwY19zdGF0cy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3RhdGlzdGljczwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHNvY2thZGRyX3V0aWxzLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcYXBpX3RyYWNlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2FkZHJfd2luMzIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxjYWxsLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcc29ja2V0X3V0aWxzX3Bvc2l4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2FsbF90ZXN0X29ubHkuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclxzb2NrZXRfd2luZG93cy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNoYW5uZWwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3BfY2xpZW50LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9pbml0LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3Bvc2l4LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2VcY2hhbm5lbF9zdGFja190eXBlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGNwX3NlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGNvbXBsZXRpb25fcXVldWUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx0Y3Bfd2luZG93cy5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxzdXJmYWNlXGV2ZW50X3N0cmluZy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVfYXZlcmFnZWRfc3RhdHMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxpbml0LmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxzdXJmYWNlPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3JcdGltZXIuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxsYW1lX2NsaWVudC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHRpbWVyX2hlYXAuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcc3VyZmFjZVxzZXJ2ZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHN1cmZhY2U8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx1ZHBfc2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHN1cmZhY2Vcc3VyZmFjZV90cmFjZS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcc3VyZmFjZTwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHVuaXhfc29ja2V0c19wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcYnl0ZV9zdHJlYW0uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9waXBlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcYWxwbi5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXGlvbWdyXHdha2V1cF9mZF9wb3NpeC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGlvbWdyPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGJpbl9lbmNvZGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd29ya3F1ZXVlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcaW9tZ3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxpb21nclx3b3JrcXVldWVfcG9zaXguaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9kYXRhLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcaW9tZ3Jcd29ya3F1ZXVlX3dpbmRvd3MuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxpb21ncjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9nb2F3YXkuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb24uaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxqc29uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGZyYW1lX3BpbmcuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fY29tbW9uLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcanNvbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV9yc3Rfc3RyZWFtLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcanNvblxqc29uX3JlYWRlci5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXGpzb248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcZnJhbWVfc2V0dGluZ3MuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxqc29uXGpzb25fd3JpdGVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcanNvbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxmcmFtZV93aW5kb3dfdXBkYXRlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MFxsb2FkX2JhbGFuY2VyLnBiLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYlx2MDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19lbmNvZGVyLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3RhdGlzdGljc1xjZW5zdXNfaW50ZXJmYWNlLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3RhdGlzdGljczwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxocGFja19wYXJzZXIuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdGF0aXN0aWNzXGNlbnN1c19ycGNfc3RhdHMuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdGF0aXN0aWNzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGhwYWNrX3RhYmxlLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxhcGlfdHJhY2UuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyXGh0dHAyX2Vycm9ycy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2FsbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaHVmZnN5bXMuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNhbGxfdGVzdF9vbmx5LmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlxpbmNvbWluZ19tZXRhZGF0YS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcaW50ZXJuYWwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfaW5pdC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RhdHVzX2NvbnZlcnNpb24uaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGNoYW5uZWxfc3RhY2tfdHlwZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcc3RyZWFtX21hcC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcY29tcGxldGlvbl9xdWV1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDJcdGltZW91dF9lbmNvZGluZy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMjwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2VcZXZlbnRfc3RyaW5nLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMlx2YXJpbnQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydFxjaHR0cDI8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXGluaXQuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcY2h0dHAyX3RyYW5zcG9ydC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcc3VyZmFjZVxsYW1lX2NsaWVudC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHN1cmZhY2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXHRyYW5zcG9ydFxjb25uZWN0aXZpdHlfc3RhdGUuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHN1cmZhY2Vcc2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcc3VyZmFjZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XG1ldGFkYXRhLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVx0cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlxzdXJmYWNlXHN1cmZhY2VfdHJhY2UuaCI+CisgICAgICA8RmlsdGVyPnNyY1xjb3JlXGxpYlxzdXJmYWNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcbWV0YWRhdGFfYmF0Y2guaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxieXRlX3N0cmVhbS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHN0YXRpY19tZXRhZGF0YS5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XGNvbm5lY3Rpdml0eV9zdGF0ZS5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcdHJhbnNwb3J0XHRyYW5zcG9ydC5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcdHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XG1ldGFkYXRhLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVx0cmFuc3BvcnRcdHJhbnNwb3J0X2ltcGwuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXHRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFxtZXRhZGF0YV9iYXRjaC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXGFnZ3JlZ2F0aW9uLmgiPgotICAgICAgPEZpbHRlcj5zcmNcY29yZVxjZW5zdXM8L0ZpbHRlcj4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xjb3JlXGxpYlx0cmFuc3BvcnRcc3RhdGljX21ldGFkYXRhLmgiPgorICAgICAgPEZpbHRlcj5zcmNcY29yZVxsaWJcdHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxjZW5zdXNcbWxvZy5oIj4KLSAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcY2Vuc3VzPC9GaWx0ZXI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNcY29yZVxsaWJcdHJhbnNwb3J0XHRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcY2Vuc3VzXHJwY19tZXRyaWNfaWQuaCI+Ci0gICAgICA8RmlsdGVyPnNyY1xjb3JlXGNlbnN1czwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXGNvcmVcbGliXHRyYW5zcG9ydFx0cmFuc3BvcnRfaW1wbC5oIj4KKyAgICAgIDxGaWx0ZXI+c3JjXGNvcmVcbGliXHRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGhpcmRfcGFydHlcbmFub3BiXHBiLmgiPgogICAgICAgPEZpbHRlcj50aGlyZF9wYXJ0eVxuYW5vcGI8L0ZpbHRlcj4KQEAgLTg3NSw1OSArODc1LDgzIEBACiAgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZSI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ODg0OTEwNzctMzg2Yi0yMDM5LWQxNGMtMGM0MDEzNmI1ZjdhfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGNlbnN1cyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57YTc1OTZlZTItYWZlZS0zYTgyLTdlNmUtYmQ4YjhmOTA0ZTA0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ODJmODZlOGMtMDBhNC1mNTY2LWQyMzUtNjcwZmM2Mjk3OThkfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGNoYW5uZWwiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2NjMTAyYzRiLTY2ZmYtY2Y0Yy0yMjg4LWQ3NjMyN2UxYTE4M308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5NjdjODlmZS1jOTdjLTI3ZTItYWFjMC05YmE1ODU0Y2I1ZmF9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcY2xpZW50X2NvbmZpZyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDJiZDczNDAtMDJlZS00MzM3LWZmYTUtMGI2ZWNjN2NmNjBjfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns3MDI4MjlmMC0wOTllLTJhYjctNmI0NC1lZDdjZmYzZWMwODN9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llcyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57MzA4YWYwODYtNDZjNy1mYTY2LTkwMjEtMTliMWMzZDRhNmJkfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXGNsaWVudCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MGQ1ODllMTYtZTQ3MC00OTY4LTMxOGMtNzk2YWY1YTMzNjM3fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGNsaWVudF9jb25maWdccmVzb2x2ZXJzIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntkZDYxN2MyNC02ZjA3LWZkZmYtODBkNS1jODYxMGQ2ZjgxNWV9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcZXh0XHRyYW5zcG9ydFxjaHR0cDJcY2xpZW50XGluc2VjdXJlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnszNGRmZGM5Yi1hYjk3LTQ3ZjAtYzFlMS1iMmU3MzgxYzNkZTZ9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcY29tcHJlc3Npb24iPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezJlM2FjYTFkLTIyM2QtMTBhMS1iMjgyLTdmOWZjNjhlZTZmNX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlxzZXJ2ZXIiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezgxZmI1NWY0LTkyMTYtNDQxYi04Mzg5LWE3MTIwYmJjZDQ1ZX08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxkZWJ1ZyI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57NmQ4ZDU3NzQtNzI5MS01NTRkLWZhZmEtNTgzNDYzY2QzZmQ5fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGV4dFx0cmFuc3BvcnRcY2h0dHAyXHNlcnZlclxpbnNlY3VyZSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57M2Y1M2RjYjYtNzFkNy0yOGZmLTE3OTQtMjZhMDhlNDYwMWZlfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGh0dHAiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezQ2ZmFlZDhlLTVjZDQtOThiMC0wNWVkLWZmMmFjN2JjMmQ0Nn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxleHRcdHJhbnNwb3J0XGNodHRwMlx0cmFuc3BvcnQiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezQ1YjIwZjI4LTM3NmMtOWRlYS0xODAwLThhMDE5MzQxMTk0Nn08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxpb21nciI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57YTlkZjhiMjQtZWNlYS1mZjZkLTg5OTktZDhmYTU0Y2Q3MGJmfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYiI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OGJkNWI0NjEtYmZmOC02YWE4LWI1YTYtODVkYTI4MzRlYjhhfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGpzb24iPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezQ0M2ZmYzYxLTFiZWEtMjQ3Ny02ZTU0LTFkZGY4YzEzOTI2NH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcY2Vuc3VzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsxOTU4MmQ1YS1kYWI3LTlkYzEtYzdlOS1jYzE0N2ZkNTJlNWZ9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVccHJvdG8iPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezdmNGJiMjJhLTY1YmEtMGY4Zi02Mzg3LTY2YjFmNjY3N2E4MH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcY2hhbm5lbCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZmI5NjRmM2QtYTU5Yy1hN2JhLWZlZTUtNjA3MmRiYjk0YTdifTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHByb3RvXGdycGMiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezljMmJkMTY0LWMzMTctOGExMy01NjRkLTNiMjhiMGZkNzljZn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjljYTI5NzQtODllNC0xYTc0LTNlNGQtMGQ2M2UyZjc3NTY2fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHByb3RvXGdycGNcbGIiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezJiYWQ4ZTEwLTRmYzUtZDhiMy1lMDI2LTRhYmJkMGMyNWNkYX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xsYl9wb2xpY2llcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NmM3ZTM2ZDQtNjExNy1lMGNkLWM4ODYtYjllYjNjOTk0OTI3fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHByb3RvXGdycGNcbGJcdjAiPgotICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezQ0NzVjOGVkLWUwMWItODkwNi00N2QwLThhNTA0MTg5YzBkNX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcY2xpZW50X2NvbmZpZ1xyZXNvbHZlcnMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezJkOTU5ZWY5LTk3MDMtZGM5Mi1hNTZmLTlmZTEzNmRhZGZiOX08L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+Ci0gICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxzdGF0aXN0aWNzIj4KLSAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlMDg0MTY0Yy1hMDY5LTAwZTMtZGIzNS00ZTBiMWNkNmYwYjd9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXGNvbXByZXNzaW9uIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiODgwMDJlOS0xODVlLTRlNjQtNDlmNS0yZDg5ODljZTg3ZjZ9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcc3VyZmFjZSI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57NmNkMDEyN2UtYzI0Yi1kNDNjLTM4ZjUtMTk4ZGI4ZDQzMjJhfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxkZWJ1ZyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57N2YyMzc4OWQtZjE4YS0yYTJkLTYwZmUtYTg3ZGM2NTZmNTM5fTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXHRyYW5zcG9ydCI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjY4N2ZmOTgtZTM2ZS1jMGIxLTI3NTYtMWJjNzllZGVjNDA2fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxodHRwIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns3NDhjODA3OC0yMDI3LTg2NDEtZjQ4NS0xZDRjNjY0NjZlNzl9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgotICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcdHJhbnNwb3J0XGNodHRwMiI+Ci0gICAgICA8VW5pcXVlSWRlbnRpZmllcj57NWZjZDYyMDYtZjc3NC05YWU2LTRiODUtMzA1ZDZhNzIzODQzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxpb21nciI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YmIxYTFjZjItNjgyNC0wOGYwLWE5YmQtM2ZhZmNhZjEzMDQyfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxqc29uIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2ODFjZGFlYi1jNDdmLTg4NTMtZDk4NS1iZjEzYzI4NzM5NDd9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHByb3RvIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0YmZiZDZjNi1mNmE4LWM2YjMtNTE4Ni1iNzg4ZjRlMTFlMjN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHByb3RvXGdycGMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezYwZjNhYjdkLWVhNDQtMzQ4Zi02NzFlLTc3ZmRlYmJkMThiYn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJccHJvdG9cZ3JwY1xsYiI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YmNkMzM1MTAtMzJlNy1jMmZiLWUxMWQtYTM2NTVmOTdiYzg0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlxwcm90b1xncnBjXGxiXHYwIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiYjliOGM4MC05ZWZmLTVhYjYtNWIyOS1jMmQ1NGYwZmMxOTJ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic3JjXGNvcmVcbGliXHN0YXRpc3RpY3MiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2QwYWI2ZDU0LWFlMjUtZmM0OS0zNjU2LTkxZDlkYjU3MzY2YX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzcmNcY29yZVxsaWJcc3VyZmFjZSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NTA2ZGMzYjMtZDg4NC0yYjU5LTBkZmEtNTdlZDZhZmZhMmQzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNyY1xjb3JlXGxpYlx0cmFuc3BvcnQiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezZjMzM5NGQxLTI3ZTktMDAzZS0xOWVkLTgxMTZkMjEwZjdjY308L1VuaXF1ZUlkZW50aWZpZXI+CiAgICAgPC9GaWx0ZXI+CiAgICAgPEZpbHRlciBJbmNsdWRlPSJ0aGlyZF9wYXJ0eSI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDI1YzA1MWUtOGViYS0xMjViLTY3ZjktMTczZjk1MTc2ZWIyfTwvVW5pcXVlSWRlbnRpZmllcj4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai9xcHMvcXBzLnZjeHByb2ogYi92c3Byb2plY3RzL3ZjeHByb2ovcXBzL3Fwcy52Y3hwcm9qCmluZGV4IGE1N2I3NDAuLmQ0NTg2NjQgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai9xcHMvcXBzLnZjeHByb2oKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL3Fwcy9xcHMudmN4cHJvagpAQCAtMTYxLDYgKzE2MSwxNCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjcHBcdXRpbFxiZW5jaG1hcmtfY29uZmlnLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xjb250cm9sLnBiLmNjIj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5wYi5oIj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5ncnBjLnBiLmNjIj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5ncnBjLnBiLmgiPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xtZXNzYWdlcy5wYi5jYyI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXG1lc3NhZ2VzLnBiLmgiPgpAQCAtMTc3LDIxICsxODUsMTMgQEAKICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdccGF5bG9hZHMuZ3JwYy5wYi5oIj4KICAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3Rpbmdcc3RhdHMucGIuY2MiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xwZXJmX2RiLnBiLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3Rpbmdcc3RhdHMucGIuaCI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHBlcmZfZGIucGIuaCI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHN0YXRzLmdycGMucGIuY2MiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xwZXJmX2RiLmdycGMucGIuY2MiPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xzdGF0cy5ncnBjLnBiLmgiPgotICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xjb250cm9sLnBiLmNjIj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5wYi5oIj4KLSAgICA8L0NsSW5jbHVkZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5ncnBjLnBiLmNjIj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5ncnBjLnBiLmgiPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xwZXJmX2RiLmdycGMucGIuaCI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHNlcnZpY2VzLnBiLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTIwMSwxMyArMjAxLDEzIEBACiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHNlcnZpY2VzLmdycGMucGIuaCI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHBlcmZfZGIucGIuY2MiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xzdGF0cy5wYi5jYyI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHBlcmZfZGIucGIuaCI+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHN0YXRzLnBiLmgiPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xwZXJmX2RiLmdycGMucGIuY2MiPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xzdGF0cy5ncnBjLnBiLmNjIj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdccGVyZl9kYi5ncnBjLnBiLmgiPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xzdGF0cy5ncnBjLnBiLmgiPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjcHBccXBzXGNsaWVudF9hc3luYy5jYyI+CiAgICAgPC9DbENvbXBpbGU+CmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovcXBzL3Fwcy52Y3hwcm9qLmZpbHRlcnMgYi92c3Byb2plY3RzL3ZjeHByb2ovcXBzL3Fwcy52Y3hwcm9qLmZpbHRlcnMKaW5kZXggZWViOTU1NS4uYzNlYTYzZCAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL3Fwcy9xcHMudmN4cHJvai5maWx0ZXJzCisrKyBiL3ZzcHJvamVjdHMvdmN4cHJvai9xcHMvcXBzLnZjeHByb2ouZmlsdGVycwpAQCAtMSwyMiArMSwyMiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5wcm90byI+CisgICAgICA8RmlsdGVyPnNyY1xwcm90b1xncnBjXHRlc3Rpbmc8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcbWVzc2FnZXMucHJvdG8iPgogICAgICAgPEZpbHRlcj5zcmNccHJvdG9cZ3JwY1x0ZXN0aW5nPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHBheWxvYWRzLnByb3RvIj4KICAgICAgIDxGaWx0ZXI+c3JjXHByb3RvXGdycGNcdGVzdGluZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xzdGF0cy5wcm90byI+Ci0gICAgICA8RmlsdGVyPnNyY1xwcm90b1xncnBjXHRlc3Rpbmc8L0ZpbHRlcj4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3RpbmdcY29udHJvbC5wcm90byI+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHBlcmZfZGIucHJvdG8iPgogICAgICAgPEZpbHRlcj5zcmNccHJvdG9cZ3JwY1x0ZXN0aW5nPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlxzcmNccHJvdG9cZ3JwY1x0ZXN0aW5nXHNlcnZpY2VzLnByb3RvIj4KICAgICAgIDxGaWx0ZXI+c3JjXHByb3RvXGdycGNcdGVzdGluZzwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cc3JjXHByb3RvXGdycGNcdGVzdGluZ1xwZXJmX2RiLnByb3RvIj4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHNyY1xwcm90b1xncnBjXHRlc3Rpbmdcc3RhdHMucHJvdG8iPgogICAgICAgPEZpbHRlcj5zcmNccHJvdG9cZ3JwY1x0ZXN0aW5nPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNwcFxxcHNcY2xpZW50X2FzeW5jLmNjIj4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai90ZXN0L2VuZDJlbmQvdGVzdHMvZW5kMmVuZF9ub3NlY190ZXN0cy9lbmQyZW5kX25vc2VjX3Rlc3RzLnZjeHByb2ogYi92c3Byb2plY3RzL3ZjeHByb2ovdGVzdC9lbmQyZW5kL3Rlc3RzL2VuZDJlbmRfbm9zZWNfdGVzdHMvZW5kMmVuZF9ub3NlY190ZXN0cy52Y3hwcm9qCmluZGV4IDJmM2I1OTEuLjU2OGEwNTEgMTAwNjQ0Ci0tLSBhL3ZzcHJvamVjdHMvdmN4cHJvai90ZXN0L2VuZDJlbmQvdGVzdHMvZW5kMmVuZF9ub3NlY190ZXN0cy9lbmQyZW5kX25vc2VjX3Rlc3RzLnZjeHByb2oKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL3Rlc3QvZW5kMmVuZC90ZXN0cy9lbmQyZW5kX25vc2VjX3Rlc3RzL2VuZDJlbmRfbm9zZWNfdGVzdHMudmN4cHJvagpAQCAtMTQ3LDggKzE0Nyw4IEBACiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KIAogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcdGVzdHNcY2FuY2VsX3Rlc3RfaGVscGVycy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZW5kMmVuZF90ZXN0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcdGVzdHNcY2FuY2VsX3Rlc3RfaGVscGVycy5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXGVuZDJlbmRfbm9zZWNfdGVzdHMuYyI+CmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovdGVzdC9lbmQyZW5kL3Rlc3RzL2VuZDJlbmRfbm9zZWNfdGVzdHMvZW5kMmVuZF9ub3NlY190ZXN0cy52Y3hwcm9qLmZpbHRlcnMgYi92c3Byb2plY3RzL3ZjeHByb2ovdGVzdC9lbmQyZW5kL3Rlc3RzL2VuZDJlbmRfbm9zZWNfdGVzdHMvZW5kMmVuZF9ub3NlY190ZXN0cy52Y3hwcm9qLmZpbHRlcnMKaW5kZXggYzYzZWJlNy4uZWNjMjNlOCAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL3Rlc3QvZW5kMmVuZC90ZXN0cy9lbmQyZW5kX25vc2VjX3Rlc3RzL2VuZDJlbmRfbm9zZWNfdGVzdHMudmN4cHJvai5maWx0ZXJzCisrKyBiL3ZzcHJvamVjdHMvdmN4cHJvai90ZXN0L2VuZDJlbmQvdGVzdHMvZW5kMmVuZF9ub3NlY190ZXN0cy9lbmQyZW5kX25vc2VjX3Rlc3RzLnZjeHByb2ouZmlsdGVycwpAQCAtMTExLDEyICsxMTEsMTIgQEAKICAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFx0ZXN0c1xjYW5jZWxfdGVzdF9oZWxwZXJzLmgiPgotICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZFx0ZXN0czwvRmlsdGVyPgotICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZW5kMmVuZF90ZXN0cy5oIj4KICAgICAgIDxGaWx0ZXI+dGVzdFxjb3JlXGVuZDJlbmQ8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXHRlc3RzXGNhbmNlbF90ZXN0X2hlbHBlcnMuaCI+CisgICAgICA8RmlsdGVyPnRlc3RcY29yZVxlbmQyZW5kXHRlc3RzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgIDwvSXRlbUdyb3VwPgogCiAgIDxJdGVtR3JvdXA+CmRpZmYgLS1naXQgYS92c3Byb2plY3RzL3ZjeHByb2ovdGVzdC9lbmQyZW5kL3Rlc3RzL2VuZDJlbmRfdGVzdHMvZW5kMmVuZF90ZXN0cy52Y3hwcm9qIGIvdnNwcm9qZWN0cy92Y3hwcm9qL3Rlc3QvZW5kMmVuZC90ZXN0cy9lbmQyZW5kX3Rlc3RzL2VuZDJlbmRfdGVzdHMudmN4cHJvagppbmRleCBmM2IzMTFiLi4zZTAwOTJlZiAxMDA2NDQKLS0tIGEvdnNwcm9qZWN0cy92Y3hwcm9qL3Rlc3QvZW5kMmVuZC90ZXN0cy9lbmQyZW5kX3Rlc3RzL2VuZDJlbmRfdGVzdHMudmN4cHJvagorKysgYi92c3Byb2plY3RzL3ZjeHByb2ovdGVzdC9lbmQyZW5kL3Rlc3RzL2VuZDJlbmRfdGVzdHMvZW5kMmVuZF90ZXN0cy52Y3hwcm9qCkBAIC0xNDcsOCArMTQ3LDggQEAKICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogCiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFx0ZXN0c1xjYW5jZWxfdGVzdF9oZWxwZXJzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxlbmQyZW5kX3Rlc3RzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFx0ZXN0c1xjYW5jZWxfdGVzdF9oZWxwZXJzLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcZW5kMmVuZF90ZXN0cy5jIj4KZGlmZiAtLWdpdCBhL3ZzcHJvamVjdHMvdmN4cHJvai90ZXN0L2VuZDJlbmQvdGVzdHMvZW5kMmVuZF90ZXN0cy9lbmQyZW5kX3Rlc3RzLnZjeHByb2ouZmlsdGVycyBiL3ZzcHJvamVjdHMvdmN4cHJvai90ZXN0L2VuZDJlbmQvdGVzdHMvZW5kMmVuZF90ZXN0cy9lbmQyZW5kX3Rlc3RzLnZjeHByb2ouZmlsdGVycwppbmRleCBjMzAwNTRhLi5jM2FhYmM0IDEwMDY0NAotLS0gYS92c3Byb2plY3RzL3ZjeHByb2ovdGVzdC9lbmQyZW5kL3Rlc3RzL2VuZDJlbmRfdGVzdHMvZW5kMmVuZF90ZXN0cy52Y3hwcm9qLmZpbHRlcnMKKysrIGIvdnNwcm9qZWN0cy92Y3hwcm9qL3Rlc3QvZW5kMmVuZC90ZXN0cy9lbmQyZW5kX3Rlc3RzL2VuZDJlbmRfdGVzdHMudmN4cHJvai5maWx0ZXJzCkBAIC0xMTQsMTIgKzExNCwxMiBAQAogICAgIDwvQ2xDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IiQoU29sdXRpb25EaXIpXC4uXHRlc3RcY29yZVxlbmQyZW5kXHRlc3RzXGNhbmNlbF90ZXN0X2hlbHBlcnMuaCI+Ci0gICAgICA8RmlsdGVyPnRlc3RcY29yZVxlbmQyZW5kXHRlc3RzPC9GaWx0ZXI+Ci0gICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIkKFNvbHV0aW9uRGlyKVwuLlx0ZXN0XGNvcmVcZW5kMmVuZFxlbmQyZW5kX3Rlc3RzLmgiPgogICAgICAgPEZpbHRlcj50ZXN0XGNvcmVcZW5kMmVuZDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iJChTb2x1dGlvbkRpcilcLi5cdGVzdFxjb3JlXGVuZDJlbmRcdGVzdHNcY2FuY2VsX3Rlc3RfaGVscGVycy5oIj4KKyAgICAgIDxGaWx0ZXI+dGVzdFxjb3JlXGVuZDJlbmRcdGVzdHM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgPC9JdGVtR3JvdXA+CiAKICAgPEl0ZW1Hcm91cD4K